added new helper ProtocolSocket. Moved some stuff together to achieve better inlining.
git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@20848 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
@@ -16,20 +16,13 @@
|
|||||||
class SocketAddress {
|
class SocketAddress {
|
||||||
public:
|
public:
|
||||||
SocketAddress(net_address_module_info *module, sockaddr *address)
|
SocketAddress(net_address_module_info *module, sockaddr *address)
|
||||||
: fModule(module), fAddress(NULL)
|
: fModule(module), fAddress(address) {}
|
||||||
{
|
|
||||||
SetAddressTo(address);
|
|
||||||
}
|
|
||||||
|
|
||||||
SocketAddress(net_address_module_info *module, sockaddr_storage *address)
|
SocketAddress(net_address_module_info *module, sockaddr_storage *address)
|
||||||
: fModule(module), fAddress(NULL)
|
: fModule(module), fAddress((sockaddr *)address) {}
|
||||||
{
|
|
||||||
SetAddressTo((sockaddr *)address);
|
|
||||||
}
|
|
||||||
|
|
||||||
SocketAddress(const SocketAddress &address)
|
SocketAddress(const SocketAddress &address)
|
||||||
: fModule(address.fModule), fAddress(address.fAddress)
|
: fModule(address.fModule), fAddress(address.fAddress) {}
|
||||||
{}
|
|
||||||
|
|
||||||
void SetAddressTo(sockaddr *address)
|
void SetAddressTo(sockaddr *address)
|
||||||
{
|
{
|
||||||
@@ -113,25 +106,17 @@ class ConstSocketAddress {
|
|||||||
public:
|
public:
|
||||||
ConstSocketAddress(net_address_module_info *module,
|
ConstSocketAddress(net_address_module_info *module,
|
||||||
const sockaddr *address)
|
const sockaddr *address)
|
||||||
: fModule(module), fAddress(NULL)
|
: fModule(module), fAddress(address) {}
|
||||||
{
|
|
||||||
SetAddressTo(address);
|
|
||||||
}
|
|
||||||
|
|
||||||
ConstSocketAddress(net_address_module_info *module,
|
ConstSocketAddress(net_address_module_info *module,
|
||||||
const sockaddr_storage *address)
|
const sockaddr_storage *address)
|
||||||
: fModule(module), fAddress(NULL)
|
: fModule(module), fAddress((sockaddr *)address) {}
|
||||||
{
|
|
||||||
SetAddressTo((sockaddr *)address);
|
|
||||||
}
|
|
||||||
|
|
||||||
ConstSocketAddress(const ConstSocketAddress &address)
|
ConstSocketAddress(const ConstSocketAddress &address)
|
||||||
: fModule(address.fModule), fAddress(address.fAddress)
|
: fModule(address.fModule), fAddress(address.fAddress) {}
|
||||||
{}
|
|
||||||
|
|
||||||
ConstSocketAddress(const SocketAddress &address)
|
ConstSocketAddress(const SocketAddress &address)
|
||||||
: fModule(address.Module()), fAddress(*address)
|
: fModule(address.Module()), fAddress(*address) {}
|
||||||
{}
|
|
||||||
|
|
||||||
void SetAddressTo(const sockaddr *address)
|
void SetAddressTo(const sockaddr *address)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -14,9 +14,12 @@
|
|||||||
#include <util/DoublyLinkedList.h>
|
#include <util/DoublyLinkedList.h>
|
||||||
|
|
||||||
#include <net_buffer.h>
|
#include <net_buffer.h>
|
||||||
|
#include <net_protocol.h>
|
||||||
#include <net_socket.h>
|
#include <net_socket.h>
|
||||||
#include <net_stack.h>
|
#include <net_stack.h>
|
||||||
|
|
||||||
|
#include <AddressUtilities.h>
|
||||||
|
|
||||||
class BenaphoreLocking {
|
class BenaphoreLocking {
|
||||||
public:
|
public:
|
||||||
typedef benaphore Type;
|
typedef benaphore Type;
|
||||||
@@ -40,9 +43,52 @@ public:
|
|||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
class ProtocolSocket {
|
||||||
|
public:
|
||||||
|
ProtocolSocket(net_socket *socket);
|
||||||
|
|
||||||
|
status_t Open();
|
||||||
|
|
||||||
|
SocketAddress LocalAddress()
|
||||||
|
{ return SocketAddress(fDomain->address_module, &fSocket->address); }
|
||||||
|
ConstSocketAddress LocalAddress() const
|
||||||
|
{ return ConstSocketAddress(fDomain->address_module, &fSocket->address); }
|
||||||
|
|
||||||
|
SocketAddress PeerAddress()
|
||||||
|
{ return SocketAddress(fDomain->address_module, &fSocket->peer); }
|
||||||
|
ConstSocketAddress PeerAddress() const
|
||||||
|
{ return ConstSocketAddress(fDomain->address_module, &fSocket->peer); }
|
||||||
|
|
||||||
|
net_domain *Domain() const { return fDomain; }
|
||||||
|
net_address_module_info *AddressModule() const
|
||||||
|
{ return fDomain->address_module; }
|
||||||
|
|
||||||
|
protected:
|
||||||
|
net_socket *fSocket;
|
||||||
|
net_domain *fDomain;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
inline ProtocolSocket::ProtocolSocket(net_socket *socket)
|
||||||
|
: fSocket(socket), fDomain(NULL) {}
|
||||||
|
|
||||||
|
|
||||||
|
inline status_t
|
||||||
|
ProtocolSocket::Open()
|
||||||
|
{
|
||||||
|
fDomain = fSocket->first_protocol->module->get_domain(
|
||||||
|
fSocket->first_protocol);
|
||||||
|
|
||||||
|
if (fDomain == NULL || fDomain->address_module == NULL)
|
||||||
|
return EAFNOSUPPORT;
|
||||||
|
|
||||||
|
return B_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
template<typename LockingBase = BenaphoreLocking,
|
template<typename LockingBase = BenaphoreLocking,
|
||||||
typename ModuleBundle = NetModuleBundleGetter>
|
typename ModuleBundle = NetModuleBundleGetter>
|
||||||
class DatagramSocket {
|
class DatagramSocket : public ProtocolSocket {
|
||||||
public:
|
public:
|
||||||
DatagramSocket(const char *name, net_socket *socket);
|
DatagramSocket(const char *name, net_socket *socket);
|
||||||
virtual ~DatagramSocket();
|
virtual ~DatagramSocket();
|
||||||
@@ -83,7 +129,6 @@ protected:
|
|||||||
typedef DoublyLinkedListCLink<net_buffer> NetBufferLink;
|
typedef DoublyLinkedListCLink<net_buffer> NetBufferLink;
|
||||||
typedef DoublyLinkedList<net_buffer, NetBufferLink> BufferList;
|
typedef DoublyLinkedList<net_buffer, NetBufferLink> BufferList;
|
||||||
|
|
||||||
net_socket *fSocket;
|
|
||||||
sem_id fNotify;
|
sem_id fNotify;
|
||||||
BufferList fBuffers;
|
BufferList fBuffers;
|
||||||
size_t fCurrentBytes;
|
size_t fCurrentBytes;
|
||||||
@@ -98,7 +143,7 @@ protected:
|
|||||||
|
|
||||||
DECL_DATAGRAM_SOCKET(inline)::DatagramSocket(const char *name,
|
DECL_DATAGRAM_SOCKET(inline)::DatagramSocket(const char *name,
|
||||||
net_socket *socket)
|
net_socket *socket)
|
||||||
: fSocket(socket), fCurrentBytes(0)
|
: ProtocolSocket(socket), fCurrentBytes(0)
|
||||||
{
|
{
|
||||||
status_t status = LockingBase::Init(&fLock, name);
|
status_t status = LockingBase::Init(&fLock, name);
|
||||||
if (status < B_OK)
|
if (status < B_OK)
|
||||||
|
|||||||
@@ -211,6 +211,7 @@ WaitList::Signal()
|
|||||||
|
|
||||||
TCPEndpoint::TCPEndpoint(net_socket *socket)
|
TCPEndpoint::TCPEndpoint(net_socket *socket)
|
||||||
:
|
:
|
||||||
|
ProtocolSocket(socket),
|
||||||
fManager(NULL),
|
fManager(NULL),
|
||||||
fReceiveList("tcp receive"),
|
fReceiveList("tcp receive"),
|
||||||
fSendList("tcp send"),
|
fSendList("tcp send"),
|
||||||
@@ -298,8 +299,9 @@ TCPEndpoint::Open()
|
|||||||
{
|
{
|
||||||
TRACE("Open()");
|
TRACE("Open()");
|
||||||
|
|
||||||
if (Domain() == NULL || AddressModule() == NULL)
|
status_t status = ProtocolSocket::Open();
|
||||||
return EAFNOSUPPORT;
|
if (status < B_OK)
|
||||||
|
return status;
|
||||||
|
|
||||||
fManager = create_endpoint_manager(Domain());
|
fManager = create_endpoint_manager(Domain());
|
||||||
if (fManager == NULL)
|
if (fManager == NULL)
|
||||||
|
|||||||
@@ -10,10 +10,12 @@
|
|||||||
#define TCP_ENDPOINT_H
|
#define TCP_ENDPOINT_H
|
||||||
|
|
||||||
|
|
||||||
#include "tcp.h"
|
|
||||||
#include "BufferQueue.h"
|
#include "BufferQueue.h"
|
||||||
|
#include "EndpointManager.h"
|
||||||
|
#include "tcp.h"
|
||||||
|
|
||||||
#include <AddressUtilities.h>
|
|
||||||
|
#include <ProtocolUtilities.h>
|
||||||
#include <net_protocol.h>
|
#include <net_protocol.h>
|
||||||
#include <net_stack.h>
|
#include <net_stack.h>
|
||||||
#include <util/AutoLock.h>
|
#include <util/AutoLock.h>
|
||||||
@@ -23,8 +25,6 @@
|
|||||||
#include <stddef.h>
|
#include <stddef.h>
|
||||||
|
|
||||||
|
|
||||||
class EndpointManager;
|
|
||||||
|
|
||||||
class WaitList {
|
class WaitList {
|
||||||
public:
|
public:
|
||||||
WaitList(const char *name);
|
WaitList(const char *name);
|
||||||
@@ -40,7 +40,7 @@ private:
|
|||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
class TCPEndpoint : public net_protocol {
|
class TCPEndpoint : public net_protocol, public ProtocolSocket {
|
||||||
public:
|
public:
|
||||||
TCPEndpoint(net_socket *socket);
|
TCPEndpoint(net_socket *socket);
|
||||||
~TCPEndpoint();
|
~TCPEndpoint();
|
||||||
@@ -69,16 +69,6 @@ class TCPEndpoint : public net_protocol {
|
|||||||
tcp_state State() const { return fState; }
|
tcp_state State() const { return fState; }
|
||||||
bool IsBound() const;
|
bool IsBound() const;
|
||||||
|
|
||||||
SocketAddress LocalAddress()
|
|
||||||
{ return SocketAddress(AddressModule(), &socket->address); }
|
|
||||||
ConstSocketAddress LocalAddress() const
|
|
||||||
{ return ConstSocketAddress(AddressModule(), &socket->address); }
|
|
||||||
|
|
||||||
SocketAddress PeerAddress()
|
|
||||||
{ return SocketAddress(AddressModule(), &socket->peer); }
|
|
||||||
ConstSocketAddress PeerAddress() const
|
|
||||||
{ return ConstSocketAddress(AddressModule(), &socket->peer); }
|
|
||||||
|
|
||||||
void DeleteSocket();
|
void DeleteSocket();
|
||||||
|
|
||||||
status_t DelayedAcknowledge();
|
status_t DelayedAcknowledge();
|
||||||
@@ -89,12 +79,6 @@ class TCPEndpoint : public net_protocol {
|
|||||||
int32 Spawn(TCPEndpoint *parent, tcp_segment_header& segment,
|
int32 Spawn(TCPEndpoint *parent, tcp_segment_header& segment,
|
||||||
net_buffer *buffer);
|
net_buffer *buffer);
|
||||||
|
|
||||||
net_domain *Domain() const
|
|
||||||
{ return socket->first_protocol->module->get_domain(
|
|
||||||
socket->first_protocol); }
|
|
||||||
net_address_module_info *AddressModule() const
|
|
||||||
{ return Domain()->address_module; }
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
friend class EndpointManager;
|
friend class EndpointManager;
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user