nfs4: Let GenerateClientID take advantage of PeerAddress methods

This commit is contained in:
Pawel Dziepak
2012-08-16 02:52:15 +02:00
parent 376eef4a9b
commit a37a22884c
8 changed files with 86 additions and 103 deletions
@@ -28,22 +28,22 @@
bool bool
ServerAddress::operator==(const ServerAddress& address) PeerAddress::operator==(const PeerAddress& address)
{ {
return memcmp(&fAddress, &address.fAddress, sizeof(fAddress)) == 0 return memcmp(&fAddress, &address.fAddress, sizeof(fAddress)) == 0
&& fProtocol == address.fProtocol; && fProtocol == address.fProtocol;
} }
bool bool
ServerAddress::operator<(const ServerAddress& address) PeerAddress::operator<(const PeerAddress& address)
{ {
int compare = memcmp(&fAddress, &address.fAddress, sizeof(fAddress)); int compare = memcmp(&fAddress, &address.fAddress, sizeof(fAddress));
return compare < 0 || (compare == 0 && fProtocol < address.fProtocol); return compare < 0 || (compare == 0 && fProtocol < address.fProtocol);
} }
ServerAddress& PeerAddress&
ServerAddress::operator=(const ServerAddress& address) PeerAddress::operator=(const PeerAddress& address)
{ {
fAddress = address.fAddress; fAddress = address.fAddress;
fProtocol = address.fProtocol; fProtocol = address.fProtocol;
@@ -51,7 +51,7 @@ ServerAddress::operator=(const ServerAddress& address)
} }
ServerAddress::ServerAddress() PeerAddress::PeerAddress()
: :
fProtocol(0) fProtocol(0)
{ {
@@ -60,7 +60,7 @@ ServerAddress::ServerAddress()
const char* const char*
ServerAddress::ProtocolString() const PeerAddress::ProtocolString() const
{ {
static const char* tcpName = "tcp"; static const char* tcpName = "tcp";
static const char* udpName = "udp"; static const char* udpName = "udp";
@@ -78,7 +78,7 @@ ServerAddress::ProtocolString() const
char* char*
ServerAddress::UniversalAddress() const PeerAddress::UniversalAddress() const
{ {
const sockaddr* address = reinterpret_cast<const sockaddr*>(&fAddress); const sockaddr* address = reinterpret_cast<const sockaddr*>(&fAddress);
@@ -98,7 +98,7 @@ ServerAddress::UniversalAddress() const
socklen_t socklen_t
ServerAddress::AddressSize() const PeerAddress::AddressSize() const
{ {
switch (reinterpret_cast<const sockaddr*>(&fAddress)->sa_family) { switch (reinterpret_cast<const sockaddr*>(&fAddress)->sa_family) {
case AF_INET: case AF_INET:
@@ -112,7 +112,7 @@ ServerAddress::AddressSize() const
uint16 uint16
ServerAddress::Port() const PeerAddress::Port() const
{ {
uint16 port; uint16 port;
@@ -132,7 +132,7 @@ ServerAddress::Port() const
void void
ServerAddress::SetPort(uint16 port) PeerAddress::SetPort(uint16 port)
{ {
port = htons(port); port = htons(port);
@@ -148,7 +148,7 @@ ServerAddress::SetPort(uint16 port)
const void* const void*
ServerAddress::InAddr() const PeerAddress::InAddr() const
{ {
switch (reinterpret_cast<const sockaddr*>(&fAddress)->sa_family) { switch (reinterpret_cast<const sockaddr*>(&fAddress)->sa_family) {
case AF_INET: case AF_INET:
@@ -161,9 +161,22 @@ ServerAddress::InAddr() const
} }
size_t
PeerAddress::InAddrSize() const
{
switch (reinterpret_cast<const sockaddr*>(&fAddress)->sa_family) {
case AF_INET:
return sizeof(in_addr);
case AF_INET6:
return sizeof(in6_addr);
default:
return 0;
}
}
status_t status_t
ServerAddress::ResolveName(const char* name, ServerAddress* address) PeerAddress::ResolveName(const char* name, PeerAddress* address)
{ {
address->fProtocol = IPPROTO_TCP; address->fProtocol = IPPROTO_TCP;
@@ -210,39 +223,39 @@ ServerAddress::ResolveName(const char* name, ServerAddress* address)
} }
Connection::Connection(const ServerAddress& address) Connection::Connection(const PeerAddress& address)
: :
ConnectionBase(address) ConnectionBase(address)
{ {
} }
ConnectionListener::ConnectionListener(const ServerAddress& address) ConnectionListener::ConnectionListener(const PeerAddress& address)
: :
ConnectionBase(address) ConnectionBase(address)
{ {
} }
ConnectionBase::ConnectionBase(const ServerAddress& address) ConnectionBase::ConnectionBase(const PeerAddress& address)
: :
fWaitCancel(create_sem(0, NULL)), fWaitCancel(create_sem(0, NULL)),
fSocket(-1), fSocket(-1),
fServerAddress(address) fPeerAddress(address)
{ {
mutex_init(&fSocketLock, NULL); mutex_init(&fSocketLock, NULL);
} }
ConnectionStream::ConnectionStream(const ServerAddress& address) ConnectionStream::ConnectionStream(const PeerAddress& address)
: :
Connection(address) Connection(address)
{ {
} }
ConnectionPacket::ConnectionPacket(const ServerAddress& address) ConnectionPacket::ConnectionPacket(const PeerAddress& address)
: :
Connection(address) Connection(address)
{ {
@@ -259,9 +272,9 @@ ConnectionBase::~ConnectionBase()
status_t status_t
ConnectionBase::GetLocalAddress(ServerAddress* address) ConnectionBase::GetLocalAddress(PeerAddress* address)
{ {
address->fProtocol = fServerAddress.fProtocol; address->fProtocol = fPeerAddress.fProtocol;
socklen_t addressSize = sizeof(address->fAddress); socklen_t addressSize = sizeof(address->fAddress);
return getsockname(fSocket, (struct sockaddr*)&address->fAddress, return getsockname(fSocket, (struct sockaddr*)&address->fAddress,
@@ -443,7 +456,7 @@ ConnectionPacket::Receive(void** _buffer, uint32* _size)
Connection* Connection*
Connection::CreateObject(const ServerAddress& address) Connection::CreateObject(const PeerAddress& address)
{ {
switch (address.fProtocol) { switch (address.fProtocol) {
case IPPROTO_TCP: case IPPROTO_TCP:
@@ -457,7 +470,7 @@ Connection::CreateObject(const ServerAddress& address)
status_t status_t
Connection::Connect(Connection **_connection, const ServerAddress& address) Connection::Connect(Connection **_connection, const PeerAddress& address)
{ {
Connection* conn = CreateObject(address); Connection* conn = CreateObject(address);
if (conn == NULL) if (conn == NULL)
@@ -477,7 +490,7 @@ Connection::Connect(Connection **_connection, const ServerAddress& address)
status_t status_t
Connection::SetTo(Connection **_connection, int socket, Connection::SetTo(Connection **_connection, int socket,
const ServerAddress& address) const PeerAddress& address)
{ {
Connection* conn = CreateObject(address); Connection* conn = CreateObject(address);
if (conn == NULL) if (conn == NULL)
@@ -494,9 +507,9 @@ status_t
Connection::Connect() Connection::Connect()
{ {
const sockaddr& address = const sockaddr& address =
*reinterpret_cast<const sockaddr*>(&fServerAddress); *reinterpret_cast<const sockaddr*>(&fPeerAddress);
switch (fServerAddress.fProtocol) { switch (fPeerAddress.fProtocol) {
case IPPROTO_TCP: case IPPROTO_TCP:
fSocket = socket(address.sa_family, SOCK_STREAM, IPPROTO_TCP); fSocket = socket(address.sa_family, SOCK_STREAM, IPPROTO_TCP);
break; break;
@@ -619,7 +632,7 @@ ConnectionListener::Listen(ConnectionListener** listener, uint16 port)
return errno; return errno;
} }
ServerAddress address; PeerAddress address;
address.fProtocol = IPPROTO_TCP; address.fProtocol = IPPROTO_TCP;
memset(&address.fAddress, 0, sizeof(address.fAddress)); memset(&address.fAddress, 0, sizeof(address.fAddress));
@@ -663,7 +676,7 @@ ConnectionListener::AcceptConnection(Connection** connection)
if (sock < 0) if (sock < 0)
return errno; return errno;
ServerAddress address; PeerAddress address;
address.fProtocol = IPPROTO_TCP; address.fProtocol = IPPROTO_TCP;
address.fAddress = addr; address.fAddress = addr;
@@ -15,16 +15,16 @@
#include <SupportDefs.h> #include <SupportDefs.h>
struct ServerAddress { struct PeerAddress {
sockaddr_storage fAddress; sockaddr_storage fAddress;
int fProtocol; int fProtocol;
bool operator==(const ServerAddress& address); bool operator==(const PeerAddress& address);
bool operator<(const ServerAddress& address); bool operator<(const PeerAddress& address);
ServerAddress& operator=(const ServerAddress& address); PeerAddress& operator=(const PeerAddress& address);
ServerAddress(); PeerAddress();
const char* ProtocolString() const; const char* ProtocolString() const;
char* UniversalAddress() const; char* UniversalAddress() const;
@@ -35,17 +35,18 @@ struct ServerAddress {
uint16 Port() const; uint16 Port() const;
const void* InAddr() const; const void* InAddr() const;
size_t InAddrSize() const;
static status_t ResolveName(const char* name, static status_t ResolveName(const char* name,
ServerAddress* address); PeerAddress* address);
}; };
class ConnectionBase { class ConnectionBase {
public: public:
ConnectionBase(const ServerAddress& address); ConnectionBase(const PeerAddress& address);
virtual ~ConnectionBase(); virtual ~ConnectionBase();
status_t GetLocalAddress(ServerAddress* address); status_t GetLocalAddress(PeerAddress* address);
void Disconnect(); void Disconnect();
@@ -54,15 +55,15 @@ protected:
int fSocket; int fSocket;
mutex fSocketLock; mutex fSocketLock;
const ServerAddress fServerAddress; const PeerAddress fPeerAddress;
}; };
class Connection : public ConnectionBase { class Connection : public ConnectionBase {
public: public:
static status_t Connect(Connection **connection, static status_t Connect(Connection **connection,
const ServerAddress& address); const PeerAddress& address);
static status_t SetTo(Connection **connection, int socket, static status_t SetTo(Connection **connection, int socket,
const ServerAddress& address); const PeerAddress& address);
virtual status_t Send(const void* buffer, uint32 size) = 0; virtual status_t Send(const void* buffer, uint32 size) = 0;
virtual status_t Receive(void** buffer, uint32* size) = 0; virtual status_t Receive(void** buffer, uint32* size) = 0;
@@ -70,16 +71,16 @@ public:
status_t Reconnect(); status_t Reconnect();
protected: protected:
static Connection* CreateObject(const ServerAddress& address); static Connection* CreateObject(const PeerAddress& address);
Connection(const ServerAddress& address); Connection(const PeerAddress& address);
status_t Connect(); status_t Connect();
}; };
class ConnectionStream : public Connection { class ConnectionStream : public Connection {
public: public:
ConnectionStream(const ServerAddress& address); ConnectionStream(const PeerAddress& address);
virtual status_t Send(const void* buffer, uint32 size); virtual status_t Send(const void* buffer, uint32 size);
virtual status_t Receive(void** buffer, uint32* size); virtual status_t Receive(void** buffer, uint32* size);
@@ -87,7 +88,7 @@ public:
class ConnectionPacket : public Connection { class ConnectionPacket : public Connection {
public: public:
ConnectionPacket(const ServerAddress& address); ConnectionPacket(const PeerAddress& address);
virtual status_t Send(const void* buffer, uint32 size); virtual status_t Send(const void* buffer, uint32 size);
virtual status_t Receive(void** buffer, uint32* size); virtual status_t Receive(void** buffer, uint32* size);
@@ -100,7 +101,7 @@ public:
status_t AcceptConnection(Connection** connection); status_t AcceptConnection(Connection** connection);
protected: protected:
ConnectionListener(const ServerAddress& address); ConnectionListener(const PeerAddress& address);
}; };
#endif // CONNECTION_H #endif // CONNECTION_H
@@ -224,10 +224,10 @@ FileSystem::Migrate(const RPC::Server* serv)
reinterpret_cast<FSLocations*>(values[0].fData.fLocations); reinterpret_cast<FSLocations*>(values[0].fData.fLocations);
RPC::Server* server = fServer; RPC::Server* server = fServer;
ServerAddress addr = fServer->ID(); PeerAddress addr = fServer->ID();
for (uint32 i = 0; i < locs->fCount; i++) { for (uint32 i = 0; i < locs->fCount; i++) {
for (uint32 j = 0; j < locs->fLocations[i].fCount; j++) { for (uint32 j = 0; j < locs->fLocations[i].fCount; j++) {
if (ServerAddress::ResolveName(locs->fLocations[i].fLocations[j], if (PeerAddress::ResolveName(locs->fLocations[i].fLocations[j],
&addr) != B_OK) &addr) != B_OK)
continue; continue;
@@ -39,7 +39,7 @@ public:
status_t RegisterCallback(Callback* callback); status_t RegisterCallback(Callback* callback);
status_t UnregisterCallback(Callback* callback); status_t UnregisterCallback(Callback* callback);
inline ServerAddress LocalID(); inline PeerAddress LocalID();
protected: protected:
status_t StartServer(); status_t StartServer();
@@ -72,10 +72,10 @@ private:
}; };
inline ServerAddress inline PeerAddress
CallbackServer::LocalID() CallbackServer::LocalID()
{ {
ServerAddress address; PeerAddress address;
fListener->GetLocalAddress(&address); fListener->GetLocalAddress(&address);
return address; return address;
} }
@@ -73,7 +73,7 @@ RequestManager::FindRequest(uint32 xid)
} }
Server::Server(Connection* connection, ServerAddress* address) Server::Server(Connection* connection, PeerAddress* address)
: :
fConnection(connection), fConnection(connection),
fAddress(address), fAddress(address),
@@ -301,7 +301,7 @@ ServerManager::~ServerManager()
status_t status_t
ServerManager::Acquire(Server** _server, const ServerAddress& address, ServerManager::Acquire(Server** _server, const PeerAddress& address,
ProgramData* (*createPrivateData)(Server*)) ProgramData* (*createPrivateData)(Server*))
{ {
status_t result; status_t result;
@@ -372,7 +372,7 @@ ServerManager::Release(Server* server)
ServerNode* ServerNode*
ServerManager::_Find(const ServerAddress& address) ServerManager::_Find(const PeerAddress& address)
{ {
ServerNode* node = fRoot; ServerNode* node = fRoot;
while (node != NULL) { while (node != NULL) {
@@ -57,7 +57,7 @@ public:
class Server { class Server {
public: public:
Server(Connection* connection, Server(Connection* connection,
ServerAddress* address); PeerAddress* address);
virtual ~Server(); virtual ~Server();
status_t SendCall(Call* call, Reply** reply); status_t SendCall(Call* call, Reply** reply);
@@ -74,8 +74,8 @@ public:
status_t Repair(); status_t Repair();
inline const ServerAddress& ID() const; inline const PeerAddress& ID() const;
inline ServerAddress LocalID() const; inline PeerAddress LocalID() const;
inline ProgramData* PrivateData(); inline ProgramData* PrivateData();
inline void SetPrivateData(ProgramData* privateData); inline void SetPrivateData(ProgramData* privateData);
@@ -96,7 +96,7 @@ private:
RequestManager fRequests; RequestManager fRequests;
Connection* fConnection; Connection* fConnection;
const ServerAddress* fAddress; const PeerAddress* fAddress;
ProgramData* fPrivateData; ProgramData* fPrivateData;
@@ -125,17 +125,17 @@ Server::CancelCall(Request* request)
} }
inline const ServerAddress& inline const PeerAddress&
Server::ID() const Server::ID() const
{ {
return *fAddress; return *fAddress;
} }
inline ServerAddress inline PeerAddress
Server::LocalID() const Server::LocalID() const
{ {
ServerAddress addr; PeerAddress addr;
memset(&addr, 0, sizeof(addr)); memset(&addr, 0, sizeof(addr));
fConnection->GetLocalAddress(&addr); fConnection->GetLocalAddress(&addr);
return addr; return addr;
@@ -158,7 +158,7 @@ Server::SetPrivateData(ProgramData* privateData)
struct ServerNode { struct ServerNode {
ServerAddress fID; PeerAddress fID;
Server* fServer; Server* fServer;
int fRefCount; int fRefCount;
@@ -171,13 +171,13 @@ public:
ServerManager(); ServerManager();
~ServerManager(); ~ServerManager();
status_t Acquire(Server** _server, const ServerAddress& address, status_t Acquire(Server** _server, const PeerAddress& address,
ProgramData* (*createPrivateData)(Server*)); ProgramData* (*createPrivateData)(Server*));
void Release(Server* server); void Release(Server* server);
private: private:
ServerNode* _Find(const ServerAddress& address); ServerNode* _Find(const PeerAddress& address);
void _Delete(ServerNode* node); void _Delete(ServerNode* node);
ServerNode* _Insert(ServerNode* node); ServerNode* _Insert(ServerNode* node);
@@ -673,8 +673,8 @@ RequestBuilder::SetClientID(RPC::Server* server)
uint32 id = server->GetCallback()->ID(); uint32 id = server->GetCallback()->ID();
ServerAddress local = gRPCCallbackServer->LocalID(); PeerAddress local = gRPCCallbackServer->LocalID();
ServerAddress servAddr = server->LocalID(); PeerAddress servAddr = server->LocalID();
servAddr.SetPort(local.Port()); servAddr.SetPort(local.Port());
fRequest->Stream().AddString(local.ProtocolString()); fRequest->Stream().AddString(local.ProtocolString());
@@ -700,46 +700,15 @@ RequestBuilder::_GenerateClientId(XDR::WriteStream& stream,
char id[512] = "HAIKU:kernel:"; char id[512] = "HAIKU:kernel:";
int pos = strlen(id); int pos = strlen(id);
const sockaddr* remoteAddress = PeerAddress local = server->LocalID();
reinterpret_cast<const sockaddr*>(&server->ID().fAddress);
ServerAddress local = server->LocalID(); memcpy(id + pos, server->ID().InAddr(), server->ID().InAddrSize());
const sockaddr* localAddress = reinterpret_cast<sockaddr*>(&local.fAddress); pos += sizeof(server->ID().InAddrSize());
const sockaddr_in* address4;
const sockaddr_in6* address6;
switch (remoteAddress->sa_family) {
case AF_INET:
address4 = reinterpret_cast<const sockaddr_in*>(remoteAddress);
memcpy(id + pos, &address4->sin_addr, sizeof(address4->sin_addr)); memcpy(id + pos, local.InAddr(), local.InAddrSize());
pos += sizeof(address4->sin_addr); pos += sizeof(local.InAddrSize());
memcpy(id + pos, *(uint16*)(id + pos) = server->ID().Port();
&reinterpret_cast<const sockaddr_in*>(localAddress)->sin_addr,
sizeof(address4->sin_addr));
pos += sizeof(address4->sin_addr);
*(uint16*)(id + pos) = address4->sin_port;
break;
case AF_INET6:
address6 = reinterpret_cast<const sockaddr_in6*>(remoteAddress);
memcpy(id + pos, &address6->sin6_addr, sizeof(address6->sin6_addr));
pos += sizeof(address6->sin6_addr);
memcpy(id + pos,
&reinterpret_cast<const sockaddr_in6*>(localAddress)->sin6_addr,
sizeof(address6->sin6_addr));
pos += sizeof(address6->sin6_addr);
*(uint16*)(id + pos) = address6->sin6_port;
break;
default:
return B_BAD_VALUE;
}
pos += sizeof(uint16); pos += sizeof(uint16);
*(uint16*)(id + pos) = server->ID().fProtocol; *(uint16*)(id + pos) = server->ID().fProtocol;
@@ -45,7 +45,7 @@ CreateNFS4Server(RPC::Server* serv)
// TODO: IPv6 address will cause problems // TODO: IPv6 address will cause problems
static status_t static status_t
ParseArguments(const char* _args, ServerAddress* address, char* _path) ParseArguments(const char* _args, PeerAddress* address, char* _path)
{ {
if (_args == NULL) if (_args == NULL)
return B_BAD_VALUE; return B_BAD_VALUE;
@@ -58,7 +58,7 @@ ParseArguments(const char* _args, ServerAddress* address, char* _path)
} }
*path++ = '\0'; *path++ = '\0';
status_t result = ServerAddress::ResolveName(args, address); status_t result = PeerAddress::ResolveName(args, address);
if (result != B_OK) if (result != B_OK)
return result; return result;
@@ -82,7 +82,7 @@ nfs4_mount(fs_volume* volume, const char* device, uint32 flags,
return B_NO_MEMORY; return B_NO_MEMORY;
locker.Unlock(); locker.Unlock();
ServerAddress address; PeerAddress address;
char path[256]; char path[256];
result = ParseArguments(args, &address, path); result = ParseArguments(args, &address, path);
if (result != B_OK) if (result != B_OK)