[ovs-dev] [PATCH] ofproto-dpif: Fetch ofport type from netdev.

Joe Stringer joestringer at nicira.com
Tue Feb 18 17:40:39 UTC 2014


Previously, we would prefer to get the type for an ofport from the
corresponding dpif_port, rather than from the netdev. This would cause
lookups for ports of "tap" type to report that they are of type
"system".

Each time we see a port of the wrong type in bridge_reconfigure(), we
remove it and add a port with the correct configuration. This would
always occur for tap ports, causing deletion and re-creation of all tap
ports each time the bridge was reconfigured. This patch fixes the
behaviour.

Bug #1196289.

Reported-by: James Schmidt <jschmidt at vmware.com>
Signed-off-by: Joe Stringer <joestringer at nicira.com>
---
 ofproto/ofproto-dpif.c |   37 +++++++++++++++++++++++--------------
 1 file changed, 23 insertions(+), 14 deletions(-)

diff --git a/ofproto/ofproto-dpif.c b/ofproto/ofproto-dpif.c
index 328b215..c378c97 100644
--- a/ofproto/ofproto-dpif.c
+++ b/ofproto/ofproto-dpif.c
@@ -2672,34 +2672,43 @@ port_query_by_name(const struct ofproto *ofproto_, const char *devname,
                    struct ofproto_port *ofproto_port)
 {
     struct ofproto_dpif *ofproto = ofproto_dpif_cast(ofproto_);
+    const char *netdev_type = netdev_get_type_from_name(devname);
     struct dpif_port dpif_port;
-    int error;
+    int error = 0;
 
     if (sset_contains(&ofproto->ghost_ports, devname)) {
-        const char *type = netdev_get_type_from_name(devname);
-
         /* We may be called before ofproto->up.port_by_name is populated with
          * the appropriate ofport.  For this reason, we must get the name and
          * type from the netdev layer directly. */
-        if (type) {
+        if (netdev_type) {
             const struct ofport *ofport;
 
             ofport = shash_find_data(&ofproto->up.port_by_name, devname);
             ofproto_port->ofp_port = ofport ? ofport->ofp_port : OFPP_NONE;
-            ofproto_port->name = xstrdup(devname);
-            ofproto_port->type = xstrdup(type);
-            return 0;
+        } else {
+            error = ENODEV;
         }
-        return ENODEV;
+        goto exit;
     }
 
-    if (!sset_contains(&ofproto->ports, devname)) {
-        return ENODEV;
+    if (sset_contains(&ofproto->ports, devname)) {
+        error = dpif_port_query_by_name(ofproto->backer->dpif,
+                                        devname, &dpif_port);
+        if (!error) {
+            ofproto_port_from_dpif_port(ofproto, ofproto_port, &dpif_port);
+            if (netdev_type) {
+                /* Prefer the netdev type over the dpif type. */
+                dpif_port_destroy(&dpif_port);
+            }
+        }
+    } else {
+        error = ENODEV;
     }
-    error = dpif_port_query_by_name(ofproto->backer->dpif,
-                                    devname, &dpif_port);
-    if (!error) {
-        ofproto_port_from_dpif_port(ofproto, ofproto_port, &dpif_port);
+
+exit:
+    if (!error && netdev_type) {
+        ofproto_port->name = xstrdup(devname);
+        ofproto_port->type = xstrdup(netdev_type);
     }
     return error;
 }
-- 
1.7.9.5




More information about the dev mailing list