bridge: Add iface to hash table before calling iface_is_internal().
authorJesse Gross <jesse@nicira.com>
Mon, 10 May 2010 20:34:41 +0000 (13:34 -0700)
committerJesse Gross <jesse@nicira.com>
Mon, 10 May 2010 20:38:21 +0000 (13:38 -0700)
When creating an interface we need to check whether it is internal.
However, the function iface_is_internal() does a lookup on the
interface name but we haven't added it to the hash table yet.  This
adds the interface to the table early on in iface_create.

NIC-78

vswitchd/bridge.c

index 74c7d57..354d4d8 100644 (file)
@@ -3613,6 +3613,8 @@ iface_create(struct port *port, const struct ovsrec_interface *if_cfg)
     iface->netdev = NULL;
     iface->cfg = if_cfg;
 
+    shash_add_assert(&br->iface_by_name, iface->name, iface);
+
     /* Attempt to create the network interface in case it doesn't exist yet. */
     if (!iface_is_internal(br, iface->name)) {
         error = set_up_iface(if_cfg, iface, true);
@@ -3620,14 +3622,13 @@ iface_create(struct port *port, const struct ovsrec_interface *if_cfg)
             VLOG_WARN("could not create iface %s: %s", iface->name,
                       strerror(error));
 
+            shash_find_and_delete_assert(&br->iface_by_name, iface->name);
             free(iface->name);
             free(iface);
             return NULL;
         }
     }
 
-    shash_add_assert(&br->iface_by_name, iface->name, iface);
-
     if (port->n_ifaces >= port->allocated_ifaces) {
         port->ifaces = x2nrealloc(port->ifaces, &port->allocated_ifaces,
                                   sizeof *port->ifaces);