of setting the global net stack to a deleted value. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@27479 a95241bf-73f2-0310-859d-f6bbb57e9c96
142 lines
2.3 KiB
C++
142 lines
2.3 KiB
C++
/*
|
|
* Copyright 2005, Ingo Weinhold <[email protected]>.
|
|
* All rights reserved. Distributed under the terms of the MIT License.
|
|
*/
|
|
|
|
#include <boot/net/NetStack.h>
|
|
|
|
#include <new>
|
|
|
|
#include <stdio.h>
|
|
|
|
#include <boot/net/ARP.h>
|
|
#include <boot/net/Ethernet.h>
|
|
#include <boot/net/IP.h>
|
|
#include <boot/net/UDP.h>
|
|
|
|
|
|
// sNetStack
|
|
NetStack *NetStack::sNetStack = NULL;
|
|
|
|
// constructor
|
|
NetStack::NetStack()
|
|
: fEthernetInterface(NULL),
|
|
fEthernetService(NULL),
|
|
fARPService(NULL),
|
|
fIPService(NULL),
|
|
fUDPService(NULL)
|
|
{
|
|
}
|
|
|
|
// destructor
|
|
NetStack::~NetStack()
|
|
{
|
|
delete fUDPService;
|
|
delete fIPService;
|
|
delete fARPService;
|
|
delete fEthernetService;
|
|
delete fEthernetInterface;
|
|
}
|
|
|
|
// Init
|
|
status_t
|
|
NetStack::Init()
|
|
{
|
|
// create services
|
|
|
|
// ethernet service
|
|
fEthernetService = new(nothrow) EthernetService;
|
|
if (!fEthernetService)
|
|
return B_NO_MEMORY;
|
|
|
|
// ARP service
|
|
fARPService = new(nothrow) ARPService(fEthernetService);
|
|
if (!fARPService)
|
|
return B_NO_MEMORY;
|
|
status_t error = fARPService->Init();
|
|
if (error != B_OK)
|
|
return error;
|
|
|
|
// IP service
|
|
fIPService = new(nothrow) IPService(fEthernetService, fARPService);
|
|
if (!fIPService)
|
|
return B_NO_MEMORY;
|
|
error = fIPService->Init();
|
|
if (error != B_OK)
|
|
return error;
|
|
|
|
// UDP service
|
|
fUDPService = new(nothrow) UDPService(fIPService);
|
|
if (!fUDPService)
|
|
return B_NO_MEMORY;
|
|
error = fUDPService->Init();
|
|
if (error != B_OK)
|
|
return error;
|
|
|
|
return B_OK;
|
|
}
|
|
|
|
// CreateDefault
|
|
status_t
|
|
NetStack::CreateDefault()
|
|
{
|
|
if (sNetStack)
|
|
return B_OK;
|
|
|
|
NetStack *netStack = new(nothrow) NetStack;
|
|
if (!netStack)
|
|
return B_NO_MEMORY;
|
|
|
|
status_t error = netStack->Init();
|
|
if (error != B_OK) {
|
|
delete netStack;
|
|
return error;
|
|
}
|
|
|
|
sNetStack = netStack;
|
|
return B_OK;
|
|
}
|
|
|
|
// Default
|
|
NetStack *
|
|
NetStack::Default()
|
|
{
|
|
return sNetStack;
|
|
}
|
|
|
|
// AddEthernetInterface
|
|
status_t
|
|
NetStack::AddEthernetInterface(EthernetInterface *interface)
|
|
{
|
|
if (!interface)
|
|
return B_BAD_VALUE;
|
|
|
|
// we support only one network interface at the moment
|
|
if (fEthernetInterface)
|
|
return B_BAD_VALUE;
|
|
|
|
if (!fEthernetService)
|
|
return B_NO_INIT;
|
|
|
|
status_t error = fEthernetService->Init(interface);
|
|
if (error != B_OK)
|
|
return error;
|
|
|
|
fEthernetInterface = interface;
|
|
return B_OK;
|
|
}
|
|
|
|
|
|
// #pragma mark -
|
|
|
|
status_t
|
|
net_stack_init()
|
|
{
|
|
status_t error = NetStack::CreateDefault();
|
|
if (error != B_OK)
|
|
return error;
|
|
|
|
return platform_net_stack_init();
|
|
}
|
|
|