From: Ben Pfaff Date: Tue, 28 Jul 2009 20:43:52 +0000 (-0700) Subject: netdev: Change netdev_get_in4() to return an error code. X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=6b9bd979007f5c9641ebec745cfed26b7fab645e;p=openvswitch netdev: Change netdev_get_in4() to return an error code. 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.) --- diff --git a/extras/ezio/ovs-switchui.c b/extras/ezio/ovs-switchui.c index 82019682..ad006fae 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 191ed516..b8e936d5 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; is_addr)) { *netdev_name = xstrdup(dev_list.names[i]); svec_destroy(&dev_list); diff --git a/lib/netdev.h b/lib/netdev.h index 6ce28ef6..0c7f1cc3 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,