From 5bfc0cd3c6210fb64b614664045ab240dbd44307 Mon Sep 17 00:00:00 2001 From: Ben Pfaff Date: Thu, 23 Jul 2009 10:42:48 -0700 Subject: [PATCH] netdev: New function netdev_exists(). This new function allows cleanup of code that was using netdev_nodev_get_flags() or ad-hoc methods to detect whether a network device with the given name exists. --- lib/netdev.c | 15 +++++++++++++++ lib/netdev.h | 2 ++ vswitchd/ovs-brcompatd.c | 35 ++--------------------------------- 3 files changed, 19 insertions(+), 33 deletions(-) diff --git a/lib/netdev.c b/lib/netdev.c index 8be1c80a..903d14cf 100644 --- a/lib/netdev.c +++ b/lib/netdev.c @@ -528,6 +528,21 @@ netdev_close(struct netdev *netdev) } } +/* Checks whether a network device named 'name' exists and returns true if so, + * false otherwise. */ +bool +netdev_exists(const char *name) +{ + struct stat s; + char *filename; + int error; + + filename = xasprintf("/sys/class/net/%s", name); + error = stat(filename, &s); + free(filename); + return !error; +} + /* Pads 'buffer' out with zero-bytes to the minimum valid length of an * Ethernet packet, if necessary. */ static void diff --git a/lib/netdev.h b/lib/netdev.h index b37d0af6..01eebebe 100644 --- a/lib/netdev.h +++ b/lib/netdev.h @@ -77,6 +77,8 @@ struct netdev; int netdev_open(const char *name, int ethertype, struct netdev **); void netdev_close(struct netdev *); +bool netdev_exists(const char *netdev_name); + int netdev_recv(struct netdev *, struct ofpbuf *); void netdev_recv_wait(struct netdev *); int netdev_drain(struct netdev *); diff --git a/vswitchd/ovs-brcompatd.c b/vswitchd/ovs-brcompatd.c index 2384f5ca..ff829846 100644 --- a/vswitchd/ovs-brcompatd.c +++ b/vswitchd/ovs-brcompatd.c @@ -286,7 +286,6 @@ static void prune_ports(void) { int i, j; - int error; struct svec bridges, delete; if (cfg_lock(NULL, 0)) { @@ -305,7 +304,6 @@ prune_ports(void) get_bridge_ifaces(br_name, &ifaces, -1); for (j = 0; j < ifaces.n; j++) { const char *iface_name = ifaces.names[j]; - enum netdev_flags flags; /* The local port and internal ports are created and destroyed by * ovs-vswitchd itself, so don't bother checking for them at all. @@ -316,14 +314,10 @@ prune_ports(void) continue; } - error = netdev_nodev_get_flags(iface_name, &flags); - if (error == ENODEV) { + if (!netdev_exists(iface_name)) { VLOG_INFO_RL(&rl, "removing dead interface %s from %s", iface_name, br_name); svec_add(&delete, iface_name); - } else if (error) { - VLOG_INFO_RL(&rl, "unknown error %d on interface %s from %s", - error, iface_name, br_name); } } svec_destroy(&ifaces); @@ -345,30 +339,6 @@ prune_ports(void) svec_destroy(&delete); } - -/* Checks whether a network device named 'name' exists and returns true if so, - * false otherwise. - * - * XXX it is possible that this doesn't entirely accomplish what we want in - * context, since ovs-vswitchd.conf may cause vswitchd to create or destroy - * network devices based on iface.*.internal settings. - * - * XXX may want to move this to lib/netdev. - * - * XXX why not just use netdev_nodev_get_flags() or similar function? */ -static bool -netdev_exists(const char *name) -{ - struct stat s; - char *filename; - int error; - - filename = xasprintf("/sys/class/net/%s", name); - error = stat(filename, &s); - free(filename); - return !error; -} - static int add_bridge(const char *br_name) { @@ -821,7 +791,6 @@ rtnl_recv_update(void) char br_name[IFNAMSIZ]; uint32_t br_idx = nl_attr_get_u32(attrs[IFLA_MASTER]); struct svec ports; - enum netdev_flags flags; if (!if_indextoname(br_idx, br_name)) { ofpbuf_delete(buf); @@ -835,7 +804,7 @@ rtnl_recv_update(void) return; } - if (netdev_nodev_get_flags(port_name, &flags) == ENODEV) { + if (!netdev_exists(port_name)) { /* Network device is really gone. */ VLOG_INFO("network device %s destroyed, " "removing from bridge %s", port_name, br_name); -- 2.30.2