netdev: New function netdev_exists().
authorBen Pfaff <blp@nicira.com>
Thu, 23 Jul 2009 17:42:48 +0000 (10:42 -0700)
committerBen Pfaff <blp@nicira.com>
Thu, 30 Jul 2009 23:07:13 +0000 (16:07 -0700)
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
lib/netdev.h
vswitchd/ovs-brcompatd.c

index 8be1c80a28133f05561644809a63c8c8beb73727..903d14cf7fe458bbe1cc2fcf334b26d1dfa6077d 100644 (file)
@@ -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
index b37d0af61d4de048f22a2af0c9e745d4c3610337..01eebebe40544fd4ae03e1f9fe045997fe81eed8 100644 (file)
@@ -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 *);
index 2384f5cabe679ca600aa0d6a5b3308c5cf4f8a4b..ff82984648feec404dd7a59d06dec01fef875041 100644 (file)
@@ -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);