[ovs-discuss] [abstract-netdev v2 05/21] netdev: Change netdev_get_in4() to return an error code.

Ben Pfaff blp at nicira.com
Tue Jul 28 21:13:31 UTC 2009


Until now, netdev_get_in4() and netdev_nodev_get_in4() have returned a
bool that represents success or failure.  This commit changes the return
value to an int that can indicate what kind of error occurred, which is
both more consistent with the rest of the netdev interfaces and more
meaningful, and updates all callers to the new interface.

(Currently netdev_get_in4() won't ever return an error, but other future
implementations might.)
---
 extras/ezio/ovs-switchui.c |    2 +-
 lib/netdev.c               |   16 ++++++++++------
 lib/netdev.h               |    4 ++--
 3 files changed, 13 insertions(+), 9 deletions(-)

diff --git a/extras/ezio/ovs-switchui.c b/extras/ezio/ovs-switchui.c
index 8201968..ad006fa 100644
--- a/extras/ezio/ovs-switchui.c
+++ b/extras/ezio/ovs-switchui.c
@@ -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) == 0;
             netdev_close(netdev);
             if (exclude) {
                 continue;
diff --git a/lib/netdev.c b/lib/netdev.c
index 191ed51..b8e936d 100644
--- a/lib/netdev.c
+++ b/lib/netdev.c
@@ -792,12 +792,14 @@ netdev_set_advertisements(struct netdev *netdev, uint32_t advertise)
 }
 
 /* If 'netdev' has an assigned IPv4 address, sets '*in4' to that address (if
- * 'in4' is non-null) and returns true.  Otherwise, returns false. */
-bool
+ * 'in4' is non-null) and returns 0.  Otherwise, returns a positive errno value
+ * and sets '*in4' to INADDR_ANY (0). */
+int
 netdev_nodev_get_in4(const char *netdev_name, struct in_addr *in4)
 {
     struct ifreq ifr;
     struct in_addr ip = { INADDR_ANY };
+    int error;
 
     init_netdev();
 
@@ -807,17 +809,19 @@ netdev_nodev_get_in4(const char *netdev_name, struct in_addr *in4)
     if (ioctl(af_inet_sock, SIOCGIFADDR, &ifr) == 0) {
         struct sockaddr_in *sin = (struct sockaddr_in *) &ifr.ifr_addr;
         ip = sin->sin_addr;
+        error = ip.s_addr != INADDR_ANY ? 0 : EADDRNOTAVAIL;
     } else {
         VLOG_DBG_RL(&rl, "%s: ioctl(SIOCGIFADDR) failed: %s",
                     netdev_name, strerror(errno));
+        error = errno;
     }
     if (in4) {
         *in4 = ip;
     }
-    return ip.s_addr != INADDR_ANY;
+    return error;
 }
 
-bool
+int
 netdev_get_in4(const struct netdev *netdev, struct in_addr *in4)
 {
     return netdev_nodev_get_in4(netdev->name, in4);
@@ -1322,7 +1326,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)
             && (dev_in4.s_addr == in4->s_addr)) {
         return true;
     }
@@ -1332,7 +1336,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)
                 && (dev_in4.s_addr == in4->s_addr)) {
             *netdev_name = xstrdup(dev_list.names[i]);
             svec_destroy(&dev_list);
diff --git a/lib/netdev.h b/lib/netdev.h
index 6ce28ef..0c7f1cc 100644
--- a/lib/netdev.h
+++ b/lib/netdev.h
@@ -91,7 +91,7 @@ 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_get_in4(const struct netdev *, struct in_addr *);
 int netdev_set_in4(struct netdev *, struct in_addr addr, struct in_addr mask);
 int netdev_add_router(struct in_addr router);
 bool netdev_get_in6(const struct netdev *, struct in6_addr *);
@@ -108,7 +108,7 @@ 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 *);
+int netdev_nodev_get_in4(const char *netdev_name, struct in_addr *);
 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, 
-- 
1.6.3.3





More information about the discuss mailing list