Author: kallisti5 Date: 2011-02-08 18:47:39 +0100 (Tue, 08 Feb 2011) New Revision: 40392 Changeset: http://dev.haiku-os.org/changeset/40392 Modified: haiku/trunk/src/tests/kits/net/preflet/InterfacesAddOn/InterfacesListView.cpp haiku/trunk/src/tests/kits/net/preflet/InterfacesAddOn/InterfacesListView.h haiku/trunk/src/tests/kits/net/preflet/InterfacesAddOn/NetworkSettings.cpp haiku/trunk/src/tests/kits/net/preflet/InterfacesAddOn/NetworkSettings.h Log: Make NetworkSettings more friendly to network family (IPv4 and IPv6); Start using BNetworkAddress instead of BString for address storage; NetworkSettings will handle setting and reading current interface settings, please excuse the mess atm in NetworkSettings.h Modified: haiku/trunk/src/tests/kits/net/preflet/InterfacesAddOn/InterfacesListView.cpp =================================================================== --- haiku/trunk/src/tests/kits/net/preflet/InterfacesAddOn/InterfacesListView.cpp 2011-02-08 15:26:01 UTC (rev 40391) +++ haiku/trunk/src/tests/kits/net/preflet/InterfacesAddOn/InterfacesListView.cpp 2011-02-08 17:47:39 UTC (rev 40392) @@ -52,16 +52,6 @@ } -/* Takes the provided ip-style netmask and converts - * it to an unsigned int, then counts the binary 1's - */ -int -netmaskbitcount(const char* buf) -{ - return(PopCount(inet_addr(buf))); -} - - // #pragma mark - @@ -107,6 +97,9 @@ BBitmap* stateIcon(NULL); BString interfaceState; + BNetworkAddress addrIPv4 = fSettings->GetAddr(AF_INET); + BNetworkAddress addrIPv6 = fSettings->GetAddr(AF_INET6); + if (!list) return; @@ -133,7 +126,8 @@ } else if (!fInterface.HasLink()) { interfaceState << "no link"; stateIcon = fIconOffline; - } else if (!fSettings->IP() && fSettings->AutoConfigure()) { + } else if (addrIPv4.IsEmpty() && addrIPv6.IsEmpty() + && fSettings->AutoConfigure()) { interfaceState << "connecting" B_UTF8_ELLIPSIS; stateIcon = fIconPending; } else { @@ -179,19 +173,28 @@ list->DrawString(interfaceState, statePt); if (!fSettings->IsDisabled()) { + // Render IPv4 Address BString v4str("IPv4: "); - v4str << fSettings->IP(); - v4str << " /"; - v4str << netmaskbitcount(fSettings->Netmask()); - v4str << " ("; + + if (addrIPv4.IsEmpty()) + v4str << "none"; + else { + v4str << addrIPv4.ToString(); + } + if (fSettings->AutoConfigure()) - v4str << "DHCP"; + v4str << " (DHCP)"; else - v4str << "manual"; - v4str << ")"; + v4str << " (manual)"; + list->DrawString(v4str.String(), v4addrPt); - list->DrawString("IPv6: none (auto)", v6addrPt); + // Render IPv6 Address (if present) + if (!addrIPv6.IsEmpty()) { + BString v6str("IPv6: "); + v6str << addrIPv6.ToString(); + list->DrawString(v6str, v6addrPt); + } } owner->PopState(); Modified: haiku/trunk/src/tests/kits/net/preflet/InterfacesAddOn/InterfacesListView.h =================================================================== --- haiku/trunk/src/tests/kits/net/preflet/InterfacesAddOn/InterfacesListView.h 2011-02-08 15:26:01 UTC (rev 40391) +++ haiku/trunk/src/tests/kits/net/preflet/InterfacesAddOn/InterfacesListView.h 2011-02-08 17:47:39 UTC (rev 40392) @@ -27,29 +27,6 @@ #include "NetworkSettings.h" -/* GCC 3.4 and onward have a built-in "population count" - * feature that takes advantage of a cpu instruction - */ -// TODO : remove when access to BNetworkAddress is complete -#if __GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4) -# define PopCount(buffer) __builtin_popcount(buffer) -#else - /* On < GCC 3.4 we do it the old fashon way */ - int PopCount(unsigned buf) - { - buf = buf - ((buf >> 1) & 0x55555555); - buf = (buf & 0x33333333) + ((buf >> 2) & 0x33333333); - buf = (buf + (buf >> 4)) & 0x0F0F0F0F; - buf = buf + (buf >> 8); - buf = buf + (buf >> 16); - return buf & 0x0000003F; - } -#endif - - -int netmaskbitcount(const char* buf); - - class InterfaceListItem : public BListItem { public: InterfaceListItem(const char* name); Modified: haiku/trunk/src/tests/kits/net/preflet/InterfacesAddOn/NetworkSettings.cpp =================================================================== --- haiku/trunk/src/tests/kits/net/preflet/InterfacesAddOn/NetworkSettings.cpp 2011-02-08 15:26:01 UTC (rev 40391) +++ haiku/trunk/src/tests/kits/net/preflet/InterfacesAddOn/NetworkSettings.cpp 2011-02-08 17:47:39 UTC (rev 40392) @@ -1,11 +1,12 @@ /* - * Copyright 2004-2010 Haiku Inc. All rights reserved. + * Copyright 2004-2011 Haiku Inc. All rights reserved. * Distributed under the terms of the MIT License. * * Authors: * Andre Alves Garzia, andre@xxxxxxxxxxxxxxx * Axel Dörfler, axeld@xxxxxxxxxxxxxxxxx * Vegard Wærp, vegarwa@xxxxxxxxx + * Alexander von Gluck, kallisti5@xxxxxxxxxxx */ @@ -38,7 +39,8 @@ fDisabled(false), fNameServers(5, true) { - fSocket = socket(AF_INET, SOCK_DGRAM, 0); + fSocket4 = socket(AF_INET, SOCK_DGRAM, 0); + fSocket6 = socket(AF_INET6, SOCK_DGRAM, 0); fName = name; @@ -48,7 +50,8 @@ NetworkSettings::~NetworkSettings() { - close(fSocket); + close(fSocket4); + close(fSocket6); } @@ -71,45 +74,39 @@ void NetworkSettings::ReadConfiguration() { - ifreq request; - if (!_PrepareRequest(request)) + ifreq ifReq; + sockaddr_in* inetAddress = NULL; + + if (!_PrepareRequest(ifReq)) return; - BString text = "dummy"; - char address[32]; - sockaddr_in* inetAddress = NULL; - - // Obtain IP. - if (ioctl(fSocket, SIOCGIFADDR, &request, sizeof(request)) < 0) + // Obtain IPv4 address. + if (ioctl(fSocket4, SIOCGIFADDR, &ifReq, sizeof(ifReq)) < 0) return; + fIPv4Addr = *((sockaddr_in *)(&(ifReq.ifr_addr))); - inetAddress = (sockaddr_in*)&request.ifr_addr; - if (inet_ntop(AF_INET, &inetAddress->sin_addr, address, - sizeof(address)) == NULL) { + // Obtain IPv4 netmask + if (ioctl(fSocket4, SIOCGIFNETMASK, &ifReq, sizeof(ifReq)) < 0) return; - } + fIPv4Mask = *((sockaddr_in *)(&(ifReq.ifr_mask))); - fIP = address; - - // Obtain netmask. - if (ioctl(fSocket, SIOCGIFNETMASK, &request, sizeof(request)) < 0) + // Obtain IPv6 address. + if (ioctl(fSocket6, SIOCGIFADDR, &ifReq, sizeof(ifReq)) < 0) return; + fIPv6Addr = *((sockaddr_in6 *)(&(ifReq.ifr_addr))); - inetAddress = (sockaddr_in*)&request.ifr_mask; - if (inet_ntop(AF_INET, &inetAddress->sin_addr, address, - sizeof(address)) == NULL) { + // Obtain IPv6 netmask + if (ioctl(fSocket6, SIOCGIFNETMASK, &ifReq, sizeof(ifReq)) < 0) return; - } + fIPv6Mask = *((sockaddr_in6 *)(&(ifReq.ifr_mask))); - fNetmask = address; - // Obtain gateway - ifconf config; - config.ifc_len = sizeof(config.ifc_value); - if (ioctl(fSocket, SIOCGRTSIZE, &config, sizeof(struct ifconf)) < 0) + ifconf ifCfg; + ifCfg.ifc_len = sizeof(ifCfg.ifc_value); + if (ioctl(fSocket4, SIOCGRTSIZE, &ifCfg, sizeof(ifCfg)) < 0) return; - uint32 size = (uint32)config.ifc_value; + uint32 size = (uint32)ifCfg.ifc_value; if (size == 0) return; @@ -118,10 +115,10 @@ return; MemoryDeleter bufferDeleter(buffer); - config.ifc_len = size; - config.ifc_buf = buffer; + ifCfg.ifc_len = size; + ifCfg.ifc_buf = buffer; - if (ioctl(fSocket, SIOCGRTTABLE, &config, sizeof(struct ifconf)) < 0) + if (ioctl(fSocket4, SIOCGRTTABLE, &ifCfg, sizeof(ifCfg)) < 0) return; ifreq* interface = (ifreq*)buffer; @@ -148,8 +145,8 @@ } uint32 flags = 0; - if (ioctl(fSocket, SIOCGIFFLAGS, &request, sizeof(struct ifreq)) == 0) - flags = request.ifr_flags; + if (ioctl(fSocket4, SIOCGIFFLAGS, &ifReq, sizeof(ifReq)) == 0) + flags = ifReq.ifr_flags; fAuto = (flags & (IFF_AUTO_CONFIGURED | IFF_CONFIGURING)) != 0; fDisabled = (flags & IFF_UP) == 0; @@ -219,3 +216,44 @@ fDomain = state->dnsrch[0]; } } + + +BNetworkAddress +NetworkSettings::GetAddr(int family) +{ + if (family == AF_INET6) + return fIPv6Addr; + + return fIPv4Addr; +} + + +const char* +NetworkSettings::GetIP(int family) +{ + if (family == AF_INET6) + return fIPv6Addr.ToString(); + + return fIPv4Addr.ToString(); +} + + +const char* +NetworkSettings::GetNetmask(int family) +{ + if (family == AF_INET6) + return fIPv6Mask.ToString(); + + return fIPv4Mask.ToString(); +} + + +int32 +NetworkSettings::GetPrefixLen(int family) +{ + if (family == AF_INET6) + return fIPv6Mask.PrefixLength(); + + return fIPv4Mask.PrefixLength(); +} + Modified: haiku/trunk/src/tests/kits/net/preflet/InterfacesAddOn/NetworkSettings.h =================================================================== --- haiku/trunk/src/tests/kits/net/preflet/InterfacesAddOn/NetworkSettings.h 2011-02-08 15:26:01 UTC (rev 40391) +++ haiku/trunk/src/tests/kits/net/preflet/InterfacesAddOn/NetworkSettings.h 2011-02-08 17:47:39 UTC (rev 40392) @@ -10,6 +10,8 @@ #define SETTINGS_H +#include <NetworkDevice.h> +#include <NetworkInterface.h> #include <ObjectList.h> #include <String.h> @@ -19,24 +21,28 @@ NetworkSettings(const char* name); virtual ~NetworkSettings(); - void SetIP(const BString& ip) - { fIP = ip; } - void SetGateway(const BString& ip) - { fGateway = ip; } - void SetNetmask(const BString& ip) - { fNetmask = ip; } - void SetDomain(const BString& domain) - { fDomain = domain; } - void SetAutoConfigure(bool autoConfigure) - { fAuto = autoConfigure; } +// void SetIP(const BString& ip) +// { fIP = ip; } +// void SetGateway(const BString& ip) +// { fGateway = ip; } +// void SetNetmask(const BString& ip) +// { fNetmask = ip; } +// void SetDomain(const BString& domain) +// { fDomain = domain; } +// void SetAutoConfigure(bool autoConfigure) +// { fAuto = autoConfigure; } void SetDisabled(bool disabled) { fDisabled = disabled; } - void SetWirelessNetwork(const char* name) - { fWirelessNetwork.SetTo(name); } +// void SetWirelessNetwork(const char* name) +// { fWirelessNetwork.SetTo(name); } - const char* IP() { return fIP.String(); } + BNetworkAddress GetAddr(int family); + + const char* GetIP(int family); + const char* GetNetmask(int family); + int32 GetPrefixLen(int family); + const char* Gateway() { return fGateway.String(); } - const char* Netmask() { return fNetmask.String(); } const char* Name() { return fName.String(); } const char* Domain() { return fDomain.String(); } bool AutoConfigure() { return fAuto; } @@ -50,12 +56,17 @@ private: bool _PrepareRequest(struct ifreq& request); - BString fIP; + int fSocket4; + int fSocket6; + + BNetworkAddress fIPv4Addr; + BNetworkAddress fIPv4Mask; + BNetworkAddress fIPv6Addr; + BNetworkAddress fIPv6Mask; + BString fGateway; - BString fNetmask; BString fName; BString fDomain; - int fSocket; bool fAuto; bool fDisabled; BObjectList<BString> fNameServers;