dpif-netdev: allow for proper destruction of netdev datapaths
authorGiuseppe Lettieri <g.lettieri@iet.unipi.it>
Wed, 9 May 2012 10:17:15 +0000 (12:17 +0200)
committerBen Pfaff <blp@nicira.com>
Wed, 16 May 2012 16:52:57 +0000 (09:52 -0700)
Until now, bridges with datapath_type=netdev did not destroy the datapath
when deleted. In particular, the tap device implementing the internal
interface was not close()d, and therefore the tap persists until
ovs-vswitchd exit()s.

This behaviour was caused by the missing callback for 'enumerate' in the
dpif-netdev class. Without this callback 'bridge_reconfigure' failed to
realize that there are datapaths with no bridge, and thus cannot destroy
them. Providing an 'enumerate' callback fixes this.

Signed-off-by: Giuseppe Lettieri <g.lettieri@iet.unipi.it>
Signed-off-by: Ben Pfaff <blp@nicira.com>
AUTHORS
lib/dpif-netdev.c

diff --git a/AUTHORS b/AUTHORS
index f488aedef63ba7e99ddbae0920085c76d2bce8f5..379b6ab070f1ad7b569ea6a21c49bd8759eada2e 100644 (file)
--- a/AUTHORS
+++ b/AUTHORS
@@ -24,6 +24,7 @@ Dominic Curran          dominic.curran@citrix.com
 Edward Tomasz NapieraƂa trasz@freebsd.org
 Ethan Jackson           ethan@nicira.com
 Gaetano Catalli         gaetano.catalli@gmail.com
+Giuseppe Lettieri       g.lettieri@iet.unipi.it
 Glen Gibb               grg@stanford.edu
 Gurucharan Shetty       gshetty@nicira.com
 Hao Zheng               hzheng@nicira.com
index a6c06fe9de91e4d7f0e61979a3f36c384708c2ed..fb0a863e3e3378177f6ad2b892d274faf7260945 100644 (file)
@@ -165,6 +165,17 @@ get_dp_netdev(const struct dpif *dpif)
     return dpif_netdev_cast(dpif)->dp;
 }
 
+static int
+dpif_netdev_enumerate(struct sset *all_dps)
+{
+    struct shash_node *node;
+
+    SHASH_FOR_EACH(node, &dp_netdevs) {
+        sset_add(all_dps, node->name);
+    }
+    return 0;
+}
+
 static struct dpif *
 create_dpif_netdev(struct dp_netdev *dp)
 {
@@ -1241,7 +1252,7 @@ dp_netdev_execute_actions(struct dp_netdev *dp,
 
 const struct dpif_class dpif_netdev_class = {
     "netdev",
-    NULL,                       /* enumerate */
+    dpif_netdev_enumerate,
     dpif_netdev_open,
     dpif_netdev_close,
     dpif_netdev_destroy,