* Added methods to manipulate routes.
* Added AutoConfigure() method. * Implemented missing Index() method. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@39592 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
@@ -100,6 +100,15 @@ public:
|
|||||||
|
|
||||||
status_t GetHardwareAddress(BNetworkAddress& address);
|
status_t GetHardwareAddress(BNetworkAddress& address);
|
||||||
|
|
||||||
|
status_t AddRoute(const route_entry& route);
|
||||||
|
status_t AddDefaultRoute(const BNetworkAddress& gateway);
|
||||||
|
status_t RemoveRoute(const route_entry& route);
|
||||||
|
status_t RemoveRoute(int family,
|
||||||
|
const route_entry& route);
|
||||||
|
status_t RemoveDefaultRoute(int family);
|
||||||
|
|
||||||
|
status_t AutoConfigure(int family);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
char fName[IF_NAMESIZE];
|
char fName[IF_NAMESIZE];
|
||||||
BList fAddresses;
|
BList fAddresses;
|
||||||
|
|||||||
@@ -5,6 +5,7 @@ UsePrivateHeaders net shared ;
|
|||||||
UseHeaders [ FDirName $(HAIKU_TOP) src libs compat freebsd_network compat ]
|
UseHeaders [ FDirName $(HAIKU_TOP) src libs compat freebsd_network compat ]
|
||||||
: true ;
|
: true ;
|
||||||
UseHeaders [ FDirName $(HAIKU_TOP) src libs compat freebsd_wlan ] : true ;
|
UseHeaders [ FDirName $(HAIKU_TOP) src libs compat freebsd_wlan ] : true ;
|
||||||
|
UseHeaders [ FDirName $(HAIKU_TOP) src servers net ] : true ;
|
||||||
|
|
||||||
SharedLibrary libbnetapi.so :
|
SharedLibrary libbnetapi.so :
|
||||||
init.cpp
|
init.cpp
|
||||||
|
|||||||
@@ -11,6 +11,9 @@
|
|||||||
#include <sys/sockio.h>
|
#include <sys/sockio.h>
|
||||||
|
|
||||||
#include <AutoDeleter.h>
|
#include <AutoDeleter.h>
|
||||||
|
#include <Messenger.h>
|
||||||
|
|
||||||
|
#include <NetServer.h>
|
||||||
|
|
||||||
|
|
||||||
static int
|
static int
|
||||||
@@ -27,6 +30,22 @@ family_from_interface_address(const BNetworkInterfaceAddress& address)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static int
|
||||||
|
family_from_route(const route_entry& route)
|
||||||
|
{
|
||||||
|
if (route.destination != NULL && route.destination->sa_family != AF_UNSPEC)
|
||||||
|
return route.destination->sa_family;
|
||||||
|
if (route.mask != NULL && route.mask->sa_family != AF_UNSPEC)
|
||||||
|
return route.mask->sa_family;
|
||||||
|
if (route.gateway != NULL && route.gateway->sa_family != AF_UNSPEC)
|
||||||
|
return route.gateway->sa_family;
|
||||||
|
if (route.source != NULL && route.source->sa_family != AF_UNSPEC)
|
||||||
|
return route.source->sa_family;
|
||||||
|
|
||||||
|
return AF_UNSPEC;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
static status_t
|
static status_t
|
||||||
do_ifaliasreq(const char* name, int32 option, BNetworkInterfaceAddress& address,
|
do_ifaliasreq(const char* name, int32 option, BNetworkInterfaceAddress& address,
|
||||||
bool readBack = false)
|
bool readBack = false)
|
||||||
@@ -223,6 +242,17 @@ BNetworkInterface::Name() const
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
uint32
|
||||||
|
BNetworkInterface::Index() const
|
||||||
|
{
|
||||||
|
ifreq request;
|
||||||
|
if (do_request(AF_INET, request, Name(), SIOCGIFINDEX) != B_OK)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
return request.ifr_index;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
uint32
|
uint32
|
||||||
BNetworkInterface::Flags() const
|
BNetworkInterface::Flags() const
|
||||||
{
|
{
|
||||||
@@ -479,3 +509,80 @@ BNetworkInterface::GetHardwareAddress(BNetworkAddress& address)
|
|||||||
address.SetTo(request.ifr_addr);
|
address.SetTo(request.ifr_addr);
|
||||||
return B_OK;
|
return B_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
status_t
|
||||||
|
BNetworkInterface::AddRoute(const route_entry& route)
|
||||||
|
{
|
||||||
|
int family = family_from_route(route);
|
||||||
|
if (family == AF_UNSPEC)
|
||||||
|
return B_BAD_VALUE;
|
||||||
|
|
||||||
|
ifreq request;
|
||||||
|
request.ifr_route = route;
|
||||||
|
return do_request(family, request, Name(), SIOCADDRT);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
status_t
|
||||||
|
BNetworkInterface::AddDefaultRoute(const BNetworkAddress& gateway)
|
||||||
|
{
|
||||||
|
route_entry route;
|
||||||
|
memset(&route, 0, sizeof(route_entry));
|
||||||
|
route.flags = RTF_STATIC | RTF_DEFAULT | RTF_GATEWAY;
|
||||||
|
route.gateway = const_cast<sockaddr*>(&gateway.SockAddr());
|
||||||
|
|
||||||
|
return AddRoute(route);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
status_t
|
||||||
|
BNetworkInterface::RemoveRoute(const route_entry& route)
|
||||||
|
{
|
||||||
|
int family = family_from_route(route);
|
||||||
|
if (family == AF_UNSPEC)
|
||||||
|
return B_BAD_VALUE;
|
||||||
|
|
||||||
|
return RemoveRoute(family, route);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
status_t
|
||||||
|
BNetworkInterface::RemoveRoute(int family, const route_entry& route)
|
||||||
|
{
|
||||||
|
ifreq request;
|
||||||
|
request.ifr_route = route;
|
||||||
|
return do_request(family, request, Name(), SIOCDELRT);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
status_t
|
||||||
|
BNetworkInterface::RemoveDefaultRoute(int family)
|
||||||
|
{
|
||||||
|
route_entry route;
|
||||||
|
memset(&route, 0, sizeof(route_entry));
|
||||||
|
route.flags = RTF_STATIC | RTF_DEFAULT;
|
||||||
|
|
||||||
|
return RemoveRoute(family, route);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
status_t
|
||||||
|
BNetworkInterface::AutoConfigure(int family)
|
||||||
|
{
|
||||||
|
BMessage message(kMsgConfigureInterface);
|
||||||
|
message.AddString("device", Name());
|
||||||
|
|
||||||
|
BMessage address;
|
||||||
|
address.AddInt32("family", family);
|
||||||
|
address.AddBool("auto_config", true);
|
||||||
|
message.AddMessage("address", &address);
|
||||||
|
|
||||||
|
BMessenger networkServer(kNetServerSignature);
|
||||||
|
BMessage reply;
|
||||||
|
status_t status = networkServer.SendMessage(&message, &reply);
|
||||||
|
if (status == B_OK)
|
||||||
|
reply.FindInt32("status", &status);
|
||||||
|
|
||||||
|
return status;
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user