From 97ef73e074307299dc5d2e6491d6b74f186ba327 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Axel=20D=C3=B6rfler?= Date: Thu, 12 Aug 2010 13:50:32 +0000 Subject: [PATCH] * Added convenience methods FindAddress(), and FindFirstAddress(). * Added BNetworkInterfaceAddress::Destination() as synonym for Broadcast() (depending on the configuration, it could be either one). * Media() will now return -1 in case of an error. * Added "const" where it makes sense. * Added convenience functions for AddAddress(), and RemoveAddress() that only take the actual address. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@38060 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- headers/os/net/NetworkInterface.h | 20 ++-- .../network/libnetapi/NetworkInterface.cpp | 91 +++++++++++++++++-- 2 files changed, 97 insertions(+), 14 deletions(-) diff --git a/headers/os/net/NetworkInterface.h b/headers/os/net/NetworkInterface.h index 31a7795a8f..431b71c183 100644 --- a/headers/os/net/NetworkInterface.h +++ b/headers/os/net/NetworkInterface.h @@ -21,20 +21,24 @@ public: BNetworkInterfaceAddress(); ~BNetworkInterfaceAddress(); - status_t SetTo(BNetworkInterface& interface, + status_t SetTo(const BNetworkInterface& interface, int32 index); - void SetAddress(BNetworkAddress& address); - void SetMask(BNetworkAddress& mask); - void SetBroadcast(BNetworkAddress& broadcast); + void SetAddress(const BNetworkAddress& address); + void SetMask(const BNetworkAddress& mask); + void SetBroadcast(const BNetworkAddress& broadcast); + void SetDestination( + const BNetworkAddress& destination); BNetworkAddress& Address() { return fAddress; } BNetworkAddress& Mask() { return fMask; } BNetworkAddress& Broadcast() { return fBroadcast; } + BNetworkAddress& Destination() { return fBroadcast; } const BNetworkAddress& Address() const { return fAddress; } const BNetworkAddress& Mask() const { return fMask; } const BNetworkAddress& Broadcast() const { return fBroadcast; } + const BNetworkAddress& Destination() const { return fBroadcast; } void SetFlags(uint32 flags); uint32 Flags() const { return fFlags; } @@ -67,7 +71,7 @@ public: uint32 Index() const; uint32 Flags() const; uint32 MTU() const; - uint32 Media() const; + int32 Media() const; uint32 Metric() const; uint32 Type() const; status_t GetStats(ifreq_stats& stats); @@ -75,19 +79,23 @@ public: status_t SetFlags(uint32 flags); status_t SetMTU(uint32 mtu); - status_t SetMedia(uint32 media); + status_t SetMedia(int32 media); status_t SetMetric(uint32 metric); int32 CountAddresses() const; status_t GetAddressAt(int32 index, BNetworkInterfaceAddress& address); + int32 FindAddress(const BNetworkAddress& address); + int32 FindFirstAddress(int family); status_t AddAddress( const BNetworkInterfaceAddress& address); + status_t AddAddress(const BNetworkAddress& address); status_t SetAddress( const BNetworkInterfaceAddress& address); status_t RemoveAddress( const BNetworkInterfaceAddress& address); + status_t RemoveAddress(const BNetworkAddress& address); status_t RemoveAddressAt(int32 index); status_t GetHardwareAddress(BNetworkAddress& address); diff --git a/src/kits/network/libnetapi/NetworkInterface.cpp b/src/kits/network/libnetapi/NetworkInterface.cpp index 7ab5bd3d10..67cb6177ca 100644 --- a/src/kits/network/libnetapi/NetworkInterface.cpp +++ b/src/kits/network/libnetapi/NetworkInterface.cpp @@ -81,7 +81,7 @@ do_request(ifreq& request, const char* name, int option) BNetworkInterfaceAddress::BNetworkInterfaceAddress() : - fIndex(0), + fIndex(-1), fFlags(0) { } @@ -93,7 +93,7 @@ BNetworkInterfaceAddress::~BNetworkInterfaceAddress() status_t -BNetworkInterfaceAddress::SetTo(BNetworkInterface& interface, int32 index) +BNetworkInterfaceAddress::SetTo(const BNetworkInterface& interface, int32 index) { fIndex = index; return do_ifaliasreq(interface.Name(), B_SOCKET_GET_ALIAS, *this, true); @@ -101,26 +101,33 @@ BNetworkInterfaceAddress::SetTo(BNetworkInterface& interface, int32 index) void -BNetworkInterfaceAddress::SetAddress(BNetworkAddress& address) +BNetworkInterfaceAddress::SetAddress(const BNetworkAddress& address) { fAddress = address; } void -BNetworkInterfaceAddress::SetMask(BNetworkAddress& mask) +BNetworkInterfaceAddress::SetMask(const BNetworkAddress& mask) { fMask = mask; } void -BNetworkInterfaceAddress::SetBroadcast(BNetworkAddress& broadcast) +BNetworkInterfaceAddress::SetBroadcast(const BNetworkAddress& broadcast) { fBroadcast = broadcast; } +void +BNetworkInterfaceAddress::SetDestination(const BNetworkAddress& destination) +{ + fBroadcast = destination; +} + + void BNetworkInterfaceAddress::SetFlags(uint32 flags) { @@ -220,12 +227,12 @@ BNetworkInterface::MTU() const } -uint32 +int32 BNetworkInterface::Media() const { ifreq request; if (do_request(request, Name(), SIOCGIFMEDIA) != B_OK) - return 0; + return -1; return request.ifr_media; } @@ -292,7 +299,7 @@ BNetworkInterface::SetMTU(uint32 mtu) status_t -BNetworkInterface::SetMedia(uint32 media) +BNetworkInterface::SetMedia(int32 media) { ifreq request; request.ifr_media = media; @@ -327,6 +334,54 @@ BNetworkInterface::GetAddressAt(int32 index, BNetworkInterfaceAddress& address) } +int32 +BNetworkInterface::FindAddress(const BNetworkAddress& address) +{ + int socket = ::socket(address.Family(), SOCK_DGRAM, 0); + if (socket < 0) + return errno; + + FileDescriptorCloser closer(socket); + + ifaliasreq request; + memset(&request, 0, sizeof(ifaliasreq)); + + strlcpy(request.ifra_name, Name(), IF_NAMESIZE); + request.ifra_index = -1; + memcpy(&request.ifra_addr, &address.SockAddr(), address.Length()); + + if (ioctl(socket, B_SOCKET_GET_ALIAS, &request, sizeof(struct ifaliasreq)) + < 0) + return errno; + + return request.ifra_index; +} + + +int32 +BNetworkInterface::FindFirstAddress(int family) +{ + int socket = ::socket(family, SOCK_DGRAM, 0); + if (socket < 0) + return errno; + + FileDescriptorCloser closer(socket); + + ifaliasreq request; + memset(&request, 0, sizeof(ifaliasreq)); + + strlcpy(request.ifra_name, Name(), IF_NAMESIZE); + request.ifra_index = -1; + request.ifra_addr.ss_family = AF_UNSPEC; + + if (ioctl(socket, B_SOCKET_GET_ALIAS, &request, sizeof(struct ifaliasreq)) + < 0) + return errno; + + return request.ifra_index; +} + + status_t BNetworkInterface::AddAddress(const BNetworkInterfaceAddress& address) { @@ -334,6 +389,16 @@ BNetworkInterface::AddAddress(const BNetworkInterfaceAddress& address) } +status_t +BNetworkInterface::AddAddress(const BNetworkAddress& local) +{ + BNetworkInterfaceAddress address; + address.SetAddress(local); + + return do_ifaliasreq(Name(), B_SOCKET_ADD_ALIAS, address); +} + + status_t BNetworkInterface::SetAddress(const BNetworkInterfaceAddress& address) { @@ -352,6 +417,16 @@ BNetworkInterface::RemoveAddress(const BNetworkInterfaceAddress& address) } +status_t +BNetworkInterface::RemoveAddress(const BNetworkAddress& address) +{ + ifreq request; + memcpy(&request.ifr_addr, &address.SockAddr(), address.Length()); + + return do_request(request, Name(), B_SOCKET_REMOVE_ALIAS); +} + + status_t BNetworkInterface::RemoveAddressAt(int32 index) {