Return netmask along with IP address when querying through netdev
authorJustin Pettit <jpettit@nicira.com>
Sat, 11 Jul 2009 00:21:43 +0000 (17:21 -0700)
committerJustin Pettit <jpettit@nicira.com>
Tue, 1 Sep 2009 21:48:34 +0000 (14:48 -0700)
The call netdev_get_in4() now allows the caller to also retrieve the
associated netmask.

extras/ezio/ovs-switchui.c
lib/netdev.c
lib/netdev.h

index 040bc70..e83367d 100644 (file)
@@ -2480,7 +2480,7 @@ choose_netdevs(struct svec *choices)
 
         retval = netdev_open(name, NETDEV_ETH_TYPE_NONE, &netdev);
         if (!retval) {
-            bool exclude = netdev_get_in4(netdev, NULL);
+            bool exclude = netdev_get_in4(netdev, NULL, NULL);
             netdev_close(netdev);
             if (exclude) {
                 continue;
index a43a3ca..07cfca4 100644 (file)
@@ -781,10 +781,12 @@ netdev_set_advertisements(struct netdev *netdev, uint32_t advertise)
     return do_ethtool(netdev, &ecmd, ETHTOOL_SSET, "ETHTOOL_SSET");
 }
 
-/* If 'netdev' has an assigned IPv4 address, sets '*in4' to that address (if
- * 'in4' is non-null) and returns true.  Otherwise, returns false. */
+/* If 'netdev' has an assigned IPv4 address, sets '*in4' to that address
+ * and '*mask' to the netmask (if they are non-null) and returns true.
+ * Otherwise, returns false. */
 bool
-netdev_nodev_get_in4(const char *netdev_name, struct in_addr *in4)
+netdev_nodev_get_in4(const char *netdev_name, struct in_addr *in4,
+                     struct in_addr *mask)
 {
     struct ifreq ifr;
     struct in_addr ip = { INADDR_ANY };
@@ -804,13 +806,25 @@ netdev_nodev_get_in4(const char *netdev_name, struct in_addr *in4)
     if (in4) {
         *in4 = ip;
     }
+
+    if (mask) {
+        if (ioctl(af_inet_sock, SIOCGIFNETMASK, &ifr) == 0) {
+            struct sockaddr_in *sin = (struct sockaddr_in *) &ifr.ifr_addr;
+            *mask = sin->sin_addr;
+        } else {
+            VLOG_DBG_RL(&rl, "%s: ioctl(SIOCGIFNETMASK) failed: %s",
+                        netdev_name, strerror(errno));
+        }
+    }
+
     return ip.s_addr != INADDR_ANY;
 }
 
 bool
-netdev_get_in4(const struct netdev *netdev, struct in_addr *in4)
+netdev_get_in4(const struct netdev *netdev, struct in_addr *in4, struct
+               in_addr *mask)
 {
-    return netdev_nodev_get_in4(netdev->name, in4);
+    return netdev_nodev_get_in4(netdev->name, in4, mask);
 }
 
 static void
@@ -1309,7 +1323,7 @@ netdev_find_dev_by_in4(const struct in_addr *in4, char **netdev_name)
     struct svec dev_list;
 
     /* Check the hint first. */
-    if (*netdev_name && (netdev_nodev_get_in4(*netdev_name, &dev_in4)) 
+    if (*netdev_name && (netdev_nodev_get_in4(*netdev_name, &dev_in4, NULL))
             && (dev_in4.s_addr == in4->s_addr)) {
         return true;
     }
@@ -1319,7 +1333,7 @@ netdev_find_dev_by_in4(const struct in_addr *in4, char **netdev_name)
     netdev_enumerate(&dev_list);
 
     for (i=0; i<dev_list.n; i++) {
-        if ((netdev_nodev_get_in4(dev_list.names[i], &dev_in4)) 
+        if ((netdev_nodev_get_in4(dev_list.names[i], &dev_in4, NULL))
                 && (dev_in4.s_addr == in4->s_addr)) {
             *netdev_name = xstrdup(dev_list.names[i]);
             svec_destroy(&dev_list);
index d8f1e09..9a55619 100644 (file)
@@ -90,8 +90,9 @@ int netdev_get_features(struct netdev *,
                         uint32_t *current, uint32_t *advertised,
                         uint32_t *supported, uint32_t *peer);
 int netdev_set_advertisements(struct netdev *, uint32_t advertise);
-bool netdev_get_in4(const struct netdev *, struct in_addr *);
-int netdev_set_in4(struct netdev *, struct in_addr addr, struct in_addr mask);
+bool netdev_get_in4(const struct netdev *, struct in_addr *addr,
+                    struct in_addr *mask);
+int netdev_set_in4(struct netdev *, struct in_addr in4, struct in_addr mask);
 int netdev_add_router(struct in_addr router);
 bool netdev_get_in6(const struct netdev *, struct in6_addr *);
 int netdev_get_flags(const struct netdev *, enum netdev_flags *);
@@ -107,7 +108,8 @@ int netdev_set_policing(struct netdev *, uint32_t kbits_rate,
 void netdev_enumerate(struct svec *);
 bool netdev_find_dev_by_in4(const struct in_addr *in4, char **netdev_name);
 int netdev_nodev_get_flags(const char *netdev_name, enum netdev_flags *);
-bool netdev_nodev_get_in4(const char *netdev_name, struct in_addr *);
+bool netdev_nodev_get_in4(const char *netdev_name, struct in_addr *in4,
+                          struct in_addr *mask);
 int netdev_nodev_set_etheraddr(const char *name, const uint8_t mac[6]);
 int netdev_nodev_get_etheraddr(const char *netdev_name, uint8_t mac[6]);
 int netdev_nodev_set_policing(const char *netdev_name, uint32_t kbits_rate,