[haiku-commits] r40392 - haiku/trunk/src/tests/kits/net/preflet/InterfacesAddOn

  • From: kallisti5@xxxxxxxxxxx
  • To: haiku-commits@xxxxxxxxxxxxx
  • Date: Tue, 8 Feb 2011 18:47:39 +0100 (CET)

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;


Other related posts: