vswitchd: Avoid segfault when local port is required but missing.
authorBen Pfaff <blp@nicira.com>
Mon, 7 Dec 2009 21:02:37 +0000 (13:02 -0800)
committerBen Pfaff <blp@nicira.com>
Mon, 7 Dec 2009 21:34:33 +0000 (13:34 -0800)
Connecting to a controller requires the vswitch to have a local port
(typically named the same as the bridge itself).  Before the introduction
of ovsdb ovs-vswitchd simply added the local port itself if it was missing.
This was not properly implemented with the ovsdb transition, and a segfault
resulted.  This commit avoids the segfault, although it should possibly
be improved to also add the local port, as before.

CC: Jeremy Stribling <strib@nicira.com>
vswitchd/bridge.c

index 2aeb3f76f8023b0c7ce7cb131147e2c0fc7aaeb0..205577738fe58e0b187b7a8539c6d50bd24d275d 100644 (file)
@@ -1232,14 +1232,21 @@ bridge_reconfigure_one(const struct ovsrec_open_vswitch *ovs_cfg,
                       br->name, name);
         }
     }
+
+    /* If we have a controller, then we need a local port.  Complain if the
+     * user didn't specify one.
+     *
+     * XXX perhaps we should synthesize a port ourselves in this case. */
     if (bridge_get_controller(ovs_cfg, br)) {
         char local_name[IF_NAMESIZE];
         int error;
 
         error = dpif_port_get_name(br->dpif, ODPP_LOCAL,
                                    local_name, sizeof local_name);
-        if (!error) {
-            shash_add_once(&new_ports, local_name, NULL);
+        if (!error && !shash_find(&new_ports, local_name)) {
+            VLOG_WARN("bridge %s: controller specified but no local port "
+                      "(port named %s) defined",
+                      br->name, local_name);
         }
     }