added buffer, datalink and socket module references to the stack module so we don't have to load them in each other module.

git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@20673 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
Hugo Santos
2007-04-13 03:06:36 +00:00
parent bfb45f717c
commit d438fa4c12
8 changed files with 67 additions and 117 deletions
+9 -14
View File
@@ -31,17 +31,16 @@ public:
extern net_stack_module_info *gStackModule; extern net_stack_module_info *gStackModule;
extern net_buffer_module_info *gBufferModule;
class NetModuleBundle { class NetModuleBundleGetter {
public: public:
static net_stack_module_info *Stack() { return gStackModule; } static net_stack_module_info *Stack() { return gStackModule; }
static net_buffer_module_info *Buffer() { return gBufferModule; } static net_buffer_module_info *Buffer() { return gStackModule->buffer_module; }
}; };
template<typename LockingBase = BenaphoreLocking, template<typename LockingBase = BenaphoreLocking,
typename ModuleBundle = NetModuleBundle> typename ModuleBundle = NetModuleBundleGetter>
class DatagramSocket { class DatagramSocket {
public: public:
DatagramSocket(const char *name, net_socket *socket); DatagramSocket(const char *name, net_socket *socket);
@@ -78,7 +77,6 @@ protected:
typedef DoublyLinkedListCLink<net_buffer> NetBufferLink; typedef DoublyLinkedListCLink<net_buffer> NetBufferLink;
typedef DoublyLinkedList<net_buffer, NetBufferLink> BufferList; typedef DoublyLinkedList<net_buffer, NetBufferLink> BufferList;
status_t fStatus;
net_socket *fSocket; net_socket *fSocket;
sem_id fNotify; sem_id fNotify;
BufferList fBuffers; BufferList fBuffers;
@@ -96,8 +94,10 @@ DECL_DATAGRAM_SOCKET(inline)::DatagramSocket(const char *name,
net_socket *socket) net_socket *socket)
: fSocket(socket), fCurrentBytes(0) : fSocket(socket), fCurrentBytes(0)
{ {
fStatus = LockingBase::Init(&fLock, name); status_t status = LockingBase::Init(&fLock, name);
if (fStatus >= B_OK) if (status < B_OK)
fNotify = status;
else
fNotify = create_sem(0, name); fNotify = create_sem(0, name);
} }
@@ -105,18 +105,13 @@ DECL_DATAGRAM_SOCKET(inline)::DatagramSocket(const char *name,
DECL_DATAGRAM_SOCKET(inline)::~DatagramSocket() DECL_DATAGRAM_SOCKET(inline)::~DatagramSocket()
{ {
_Clear(); _Clear();
delete_sem(fNotify);
if (fStatus >= B_OK) { LockingBase::Destroy(&fLock);
delete_sem(fNotify);
LockingBase::Destroy(&fLock);
}
} }
DECL_DATAGRAM_SOCKET(inline status_t)::InitCheck() const DECL_DATAGRAM_SOCKET(inline status_t)::InitCheck() const
{ {
if (fStatus < 0)
return fStatus;
return fNotify; return fNotify;
} }
+4
View File
@@ -55,6 +55,10 @@ struct net_device_monitor {
struct net_stack_module_info { struct net_stack_module_info {
module_info info; module_info info;
struct net_buffer_module_info *buffer_module;
struct net_datalink_module_info *datalink_module;
struct net_socket_module_info *socket_module;
status_t (*register_domain)(int family, const char *name, status_t (*register_domain)(int family, const char *name,
struct net_protocol_module_info *module, struct net_protocol_module_info *module,
struct net_address_module_info *addressModule, struct net_address_module_info *addressModule,
@@ -728,28 +728,25 @@ arp_init()
status_t status = get_module(NET_STACK_MODULE_NAME, (module_info **)&sStackModule); status_t status = get_module(NET_STACK_MODULE_NAME, (module_info **)&sStackModule);
if (status < B_OK) if (status < B_OK)
return status; return status;
status = get_module(NET_BUFFER_MODULE_NAME, (module_info **)&gBufferModule);
if (status < B_OK) gBufferModule = sStackModule->buffer_module;
goto err1;
status = benaphore_init(&sCacheLock, "arp cache"); status = benaphore_init(&sCacheLock, "arp cache");
if (status < B_OK) if (status < B_OK)
goto err2; goto err1;
sCache = hash_init(64, offsetof(struct arp_entry, next), sCache = hash_init(64, offsetof(struct arp_entry, next),
&arp_entry::Compare, &arp_entry::Hash); &arp_entry::Compare, &arp_entry::Hash);
if (sCache == NULL) { if (sCache == NULL) {
status = B_NO_MEMORY; status = B_NO_MEMORY;
goto err3; goto err2;
} }
register_generic_syscall(ARP_SYSCALLS, arp_control, 1, 0); register_generic_syscall(ARP_SYSCALLS, arp_control, 1, 0);
return B_OK; return B_OK;
err3:
benaphore_destroy(&sCacheLock);
err2: err2:
put_module(NET_BUFFER_MODULE_NAME); benaphore_destroy(&sCacheLock);
err1: err1:
put_module(NET_STACK_MODULE_NAME); put_module(NET_STACK_MODULE_NAME);
return status; return status;
@@ -761,7 +758,6 @@ arp_uninit()
{ {
unregister_generic_syscall(ARP_SYSCALLS, 1); unregister_generic_syscall(ARP_SYSCALLS, 1);
put_module(NET_BUFFER_MODULE_NAME);
put_module(NET_STACK_MODULE_NAME); put_module(NET_STACK_MODULE_NAME);
return B_OK; return B_OK;
} }
@@ -300,11 +300,8 @@ icmp_std_ops(int32 op, ...)
status_t status = get_module(NET_STACK_MODULE_NAME, (module_info **)&sStackModule); status_t status = get_module(NET_STACK_MODULE_NAME, (module_info **)&sStackModule);
if (status < B_OK) if (status < B_OK)
return status; return status;
status = get_module(NET_BUFFER_MODULE_NAME, (module_info **)&gBufferModule);
if (status < B_OK) { gBufferModule = sStackModule->buffer_module;
put_module(NET_STACK_MODULE_NAME);
return status;
}
sStackModule->register_domain_protocols(AF_INET, SOCK_DGRAM, IPPROTO_ICMP, sStackModule->register_domain_protocols(AF_INET, SOCK_DGRAM, IPPROTO_ICMP,
"network/protocols/icmp/v1", "network/protocols/icmp/v1",
@@ -317,7 +314,6 @@ icmp_std_ops(int32 op, ...)
} }
case B_MODULE_UNINIT: case B_MODULE_UNINIT:
put_module(NET_BUFFER_MODULE_NAME);
put_module(NET_STACK_MODULE_NAME); put_module(NET_STACK_MODULE_NAME);
return B_OK; return B_OK;
@@ -1117,31 +1117,28 @@ init_ipv4()
status_t status = get_module(NET_STACK_MODULE_NAME, (module_info **)&gStackModule); status_t status = get_module(NET_STACK_MODULE_NAME, (module_info **)&gStackModule);
if (status < B_OK) if (status < B_OK)
return status; return status;
status = get_module(NET_BUFFER_MODULE_NAME, (module_info **)&gBufferModule);
if (status < B_OK) gBufferModule = gStackModule->buffer_module;
goto err1; sDatalinkModule = gStackModule->datalink_module;
status = get_module(NET_DATALINK_MODULE_NAME, (module_info **)&sDatalinkModule);
if (status < B_OK)
goto err2;
sPacketID = (int32)system_time(); sPacketID = (int32)system_time();
status = benaphore_init(&sRawSocketsLock, "raw sockets"); status = benaphore_init(&sRawSocketsLock, "raw sockets");
if (status < B_OK) if (status < B_OK)
goto err3; goto err1;
status = benaphore_init(&sFragmentLock, "IPv4 Fragments"); status = benaphore_init(&sFragmentLock, "IPv4 Fragments");
if (status < B_OK) if (status < B_OK)
goto err4; goto err2;
status = benaphore_init(&sReceivingProtocolLock, "IPv4 receiving protocols"); status = benaphore_init(&sReceivingProtocolLock, "IPv4 receiving protocols");
if (status < B_OK) if (status < B_OK)
goto err5; goto err3;
sFragmentHash = hash_init(MAX_HASH_FRAGMENTS, FragmentPacket::NextOffset(), sFragmentHash = hash_init(MAX_HASH_FRAGMENTS, FragmentPacket::NextOffset(),
&FragmentPacket::Compare, &FragmentPacket::Hash); &FragmentPacket::Compare, &FragmentPacket::Hash);
if (sFragmentHash == NULL) if (sFragmentHash == NULL)
goto err6; goto err4;
new (&sRawSockets) RawSocketList; new (&sRawSockets) RawSocketList;
// static initializers do not work in the kernel, // static initializers do not work in the kernel,
@@ -1151,27 +1148,23 @@ init_ipv4()
status = gStackModule->register_domain_protocols(AF_INET, SOCK_RAW, 0, status = gStackModule->register_domain_protocols(AF_INET, SOCK_RAW, 0,
"network/protocols/ipv4/v1", NULL); "network/protocols/ipv4/v1", NULL);
if (status < B_OK) if (status < B_OK)
goto err7; goto err5;
status = gStackModule->register_domain(AF_INET, "internet", &gIPv4Module, status = gStackModule->register_domain(AF_INET, "internet", &gIPv4Module,
&gIPv4AddressModule, &sDomain); &gIPv4AddressModule, &sDomain);
if (status < B_OK) if (status < B_OK)
goto err7; goto err5;
return B_OK; return B_OK;
err7:
hash_uninit(sFragmentHash);
err6:
benaphore_destroy(&sReceivingProtocolLock);
err5: err5:
benaphore_destroy(&sFragmentLock); hash_uninit(sFragmentHash);
err4: err4:
benaphore_destroy(&sRawSocketsLock); benaphore_destroy(&sReceivingProtocolLock);
err3: err3:
put_module(NET_DATALINK_MODULE_NAME); benaphore_destroy(&sFragmentLock);
err2: err2:
put_module(NET_BUFFER_MODULE_NAME); benaphore_destroy(&sRawSocketsLock);
err1: err1:
put_module(NET_STACK_MODULE_NAME); put_module(NET_STACK_MODULE_NAME);
return status; return status;
@@ -1198,8 +1191,6 @@ uninit_ipv4()
benaphore_destroy(&sRawSocketsLock); benaphore_destroy(&sRawSocketsLock);
benaphore_destroy(&sReceivingProtocolLock); benaphore_destroy(&sReceivingProtocolLock);
put_module(NET_DATALINK_MODULE_NAME);
put_module(NET_BUFFER_MODULE_NAME);
put_module(NET_STACK_MODULE_NAME); put_module(NET_STACK_MODULE_NAME);
return B_OK; return B_OK;
} }
@@ -634,54 +634,43 @@ tcp_init()
status = get_module(NET_STACK_MODULE_NAME, (module_info **)&gStackModule); status = get_module(NET_STACK_MODULE_NAME, (module_info **)&gStackModule);
if (status < B_OK) if (status < B_OK)
return status; return status;
status = get_module(NET_BUFFER_MODULE_NAME, (module_info **)&gBufferModule);
if (status < B_OK) gBufferModule = gStackModule->buffer_module;
goto err1; gSocketModule = gStackModule->socket_module;
status = get_module(NET_SOCKET_MODULE_NAME, (module_info **)&gSocketModule); gDatalinkModule = gStackModule->datalink_module;
if (status < B_OK)
goto err2;
status = get_module(NET_DATALINK_MODULE_NAME, (module_info **)&gDatalinkModule);
if (status < B_OK)
goto err3;
gEndpointManager = new (std::nothrow) EndpointManager(); gEndpointManager = new (std::nothrow) EndpointManager();
if (gEndpointManager == NULL) { if (gEndpointManager == NULL) {
status = B_NO_MEMORY; status = B_NO_MEMORY;
goto err4; goto err1;
} }
status = gEndpointManager->InitCheck(); status = gEndpointManager->InitCheck();
if (status < B_OK) if (status < B_OK)
goto err5; goto err2;
status = gStackModule->register_domain_protocols(AF_INET, SOCK_STREAM, 0, status = gStackModule->register_domain_protocols(AF_INET, SOCK_STREAM, 0,
"network/protocols/tcp/v1", "network/protocols/tcp/v1",
"network/protocols/ipv4/v1", "network/protocols/ipv4/v1",
NULL); NULL);
if (status < B_OK) if (status < B_OK)
goto err5; goto err2;
status = gStackModule->register_domain_protocols(AF_INET, SOCK_STREAM, IPPROTO_TCP, status = gStackModule->register_domain_protocols(AF_INET, SOCK_STREAM, IPPROTO_TCP,
"network/protocols/tcp/v1", "network/protocols/tcp/v1",
"network/protocols/ipv4/v1", "network/protocols/ipv4/v1",
NULL); NULL);
if (status < B_OK) if (status < B_OK)
goto err5; goto err2;
status = gStackModule->register_domain_receiving_protocol(AF_INET, IPPROTO_TCP, status = gStackModule->register_domain_receiving_protocol(AF_INET, IPPROTO_TCP,
"network/protocols/tcp/v1"); "network/protocols/tcp/v1");
if (status < B_OK) if (status < B_OK)
goto err5; goto err2;
return B_OK; return B_OK;
err5:
delete gEndpointManager;
err4:
put_module(NET_DATALINK_MODULE_NAME);
err3:
put_module(NET_SOCKET_MODULE_NAME);
err2: err2:
put_module(NET_BUFFER_MODULE_NAME); delete gEndpointManager;
err1: err1:
put_module(NET_STACK_MODULE_NAME); put_module(NET_STACK_MODULE_NAME);
@@ -694,12 +683,7 @@ static status_t
tcp_uninit() tcp_uninit()
{ {
delete gEndpointManager; delete gEndpointManager;
put_module(NET_DATALINK_MODULE_NAME);
put_module(NET_SOCKET_MODULE_NAME);
put_module(NET_BUFFER_MODULE_NAME);
put_module(NET_STACK_MODULE_NAME); put_module(NET_STACK_MODULE_NAME);
return B_OK; return B_OK;
} }
@@ -178,8 +178,6 @@ public:
UdpEndpointManager(); UdpEndpointManager();
~UdpEndpointManager(); ~UdpEndpointManager();
status_t DemuxIncomingBuffer(net_domain *domain,
net_buffer *buffer);
status_t ReceiveData(net_buffer *buffer); status_t ReceiveData(net_buffer *buffer);
UdpDomainSupport *OpenEndpoint(UdpEndpoint *endpoint); UdpDomainSupport *OpenEndpoint(UdpEndpoint *endpoint);
@@ -203,7 +201,6 @@ static UdpEndpointManager *sUdpEndpointManager;
net_stack_module_info *gStackModule; net_stack_module_info *gStackModule;
net_buffer_module_info *gBufferModule; net_buffer_module_info *gBufferModule;
static net_datalink_module_info *sDatalinkModule;
// #pragma mark - // #pragma mark -
@@ -543,21 +540,6 @@ UdpEndpointManager::InitCheck() const
// #pragma mark - inbound // #pragma mark - inbound
status_t
UdpEndpointManager::DemuxIncomingBuffer(net_domain *domain, net_buffer *buffer)
{
UdpDomainSupport *domainSupport = _GetDomain(domain, false);
if (domainSupport == NULL) {
// we don't instantiate domain supports in the
// RX path as we are only interested in delivering
// data to existing sockets.
return B_BAD_VALUE;
}
return domainSupport->DemuxIncomingBuffer(buffer);
}
status_t status_t
UdpEndpointManager::ReceiveData(net_buffer *buffer) UdpEndpointManager::ReceiveData(net_buffer *buffer)
{ {
@@ -621,7 +603,15 @@ UdpEndpointManager::ReceiveData(net_buffer *buffer)
bufferHeader.Remove(); bufferHeader.Remove();
// remove UDP-header from buffer before passing it on // remove UDP-header from buffer before passing it on
status_t status = DemuxIncomingBuffer(domain, buffer); UdpDomainSupport *domainSupport = _GetDomain(domain, false);
if (domainSupport == NULL) {
// we don't instantiate domain supports in the
// RX path as we are only interested in delivering
// data to existing sockets.
return B_ERROR;
}
status_t status = domainSupport->DemuxIncomingBuffer(buffer);
if (status < B_OK) { if (status < B_OK) {
TRACE_EPM(" ReceiveData(): no endpoint."); TRACE_EPM(" ReceiveData(): no endpoint.");
// TODO: send ICMP-error // TODO: send ICMP-error
@@ -904,11 +894,11 @@ UdpEndpoint::SendData(net_buffer *buffer)
TRACE_EP("SendData(%p [%lu bytes])", buffer, buffer->size); TRACE_EP("SendData(%p [%lu bytes])", buffer, buffer->size);
net_route *route = NULL; net_route *route = NULL;
status_t status = sDatalinkModule->get_buffer_route(Domain(), buffer, status_t status = gStackModule->datalink_module->get_buffer_route(Domain(),
&route); buffer, &route);
if (status >= B_OK) { if (status >= B_OK) {
status = SendRoutedData(buffer, route); status = SendRoutedData(buffer, route);
sDatalinkModule->put_route(Domain(), route); gStackModule->datalink_module->put_route(Domain(), route);
} }
return status; return status;
@@ -1134,48 +1124,39 @@ init_udp()
status = get_module(NET_STACK_MODULE_NAME, (module_info **)&gStackModule); status = get_module(NET_STACK_MODULE_NAME, (module_info **)&gStackModule);
if (status < B_OK) if (status < B_OK)
return status; return status;
status = get_module(NET_BUFFER_MODULE_NAME, (module_info **)&gBufferModule); gBufferModule = gStackModule->buffer_module;
if (status < B_OK)
goto err1;
status = get_module(NET_DATALINK_MODULE_NAME, (module_info **)&sDatalinkModule);
if (status < B_OK)
goto err2;
sUdpEndpointManager = new (std::nothrow) UdpEndpointManager; sUdpEndpointManager = new (std::nothrow) UdpEndpointManager;
if (sUdpEndpointManager == NULL) { if (sUdpEndpointManager == NULL) {
status = ENOBUFS; status = ENOBUFS;
goto err3; goto err1;
} }
status = sUdpEndpointManager->InitCheck(); status = sUdpEndpointManager->InitCheck();
if (status != B_OK) if (status != B_OK)
goto err3; goto err1;
status = gStackModule->register_domain_protocols(AF_INET, SOCK_DGRAM, IPPROTO_IP, status = gStackModule->register_domain_protocols(AF_INET, SOCK_DGRAM, IPPROTO_IP,
"network/protocols/udp/v1", "network/protocols/udp/v1",
"network/protocols/ipv4/v1", "network/protocols/ipv4/v1",
NULL); NULL);
if (status < B_OK) if (status < B_OK)
goto err4; goto err2;
status = gStackModule->register_domain_protocols(AF_INET, SOCK_DGRAM, IPPROTO_UDP, status = gStackModule->register_domain_protocols(AF_INET, SOCK_DGRAM, IPPROTO_UDP,
"network/protocols/udp/v1", "network/protocols/udp/v1",
"network/protocols/ipv4/v1", "network/protocols/ipv4/v1",
NULL); NULL);
if (status < B_OK) if (status < B_OK)
goto err4; goto err2;
status = gStackModule->register_domain_receiving_protocol(AF_INET, IPPROTO_UDP, status = gStackModule->register_domain_receiving_protocol(AF_INET, IPPROTO_UDP,
"network/protocols/udp/v1"); "network/protocols/udp/v1");
if (status < B_OK) if (status < B_OK)
goto err4; goto err2;
return B_OK; return B_OK;
err4:
delete sUdpEndpointManager;
err3:
put_module(NET_DATALINK_MODULE_NAME);
err2: err2:
put_module(NET_BUFFER_MODULE_NAME); delete sUdpEndpointManager;
err1: err1:
put_module(NET_STACK_MODULE_NAME); put_module(NET_STACK_MODULE_NAME);
@@ -1189,8 +1170,6 @@ uninit_udp()
{ {
TRACE_EPM("uninit_udp()"); TRACE_EPM("uninit_udp()");
delete sUdpEndpointManager; delete sUdpEndpointManager;
put_module(NET_DATALINK_MODULE_NAME);
put_module(NET_BUFFER_MODULE_NAME);
put_module(NET_STACK_MODULE_NAME); put_module(NET_STACK_MODULE_NAME);
return B_OK; return B_OK;
} }
@@ -894,6 +894,11 @@ net_stack_module_info gNetStackModule = {
0, 0,
stack_std_ops stack_std_ops
}, },
&gNetBufferModule,
&gNetDatalinkModule,
&gNetSocketModule,
register_domain, register_domain,
unregister_domain, unregister_domain,
get_domain, get_domain,