secchan: Remove mention of "-f" flag as being equivalent "--fail"
[openvswitch] / vswitchd / bridge.c
index a4a723ad5a0fd67b14890613a9fa36748e727ce8..ec8a1997e44419a8f18783251e0971bb32f54e54 100644 (file)
@@ -631,6 +631,18 @@ bridge_pick_local_hw_addr(struct bridge *br, uint8_t ea[ETH_ADDR_LEN],
         if (iface_ea_u64) {
             /* User specified explicitly. */
             eth_addr_from_uint64(iface_ea_u64, iface_ea);
+
+            /* Find the interface with this Ethernet address (if any) so that
+             * we can provide the correct devname to the caller. */
+            iface = NULL;
+            for (j = 0; j < port->n_ifaces; j++) {
+                struct iface *candidate = port->ifaces[j];
+                uint8_t candidate_ea[ETH_ADDR_LEN];
+                if (!netdev_nodev_get_etheraddr(candidate->name, candidate_ea)
+                    && eth_addr_equals(iface_ea, candidate_ea)) {
+                    iface = candidate;
+                }
+            }
         } else {
             /* Choose the interface whose MAC address will represent the port.
              * The Linux kernel bonding code always chooses the MAC address of
@@ -672,7 +684,7 @@ bridge_pick_local_hw_addr(struct bridge *br, uint8_t ea[ETH_ADDR_LEN],
             memcmp(iface_ea, ea, ETH_ADDR_LEN) < 0)
         {
             memcpy(ea, iface_ea, ETH_ADDR_LEN);
-            *devname = iface->name;
+            *devname = iface ? iface->name : NULL;
         }
     }
     if (eth_addr_is_multicast(ea) || eth_addr_is_vif(ea)) {
@@ -3009,8 +3021,17 @@ iface_create(struct port *port, const char *name)
     iface->tag = tag_create_random();
     iface->delay_expires = LLONG_MAX;
 
-    netdev_nodev_get_etheraddr(name, iface->mac);
-    netdev_nodev_get_carrier(name, &iface->enabled);
+    if (!cfg_get_bool(0, "iface.%s.internal", iface->name)) {
+        netdev_nodev_get_etheraddr(name, iface->mac);
+        netdev_nodev_get_carrier(name, &iface->enabled);
+    } else {
+        /* Internal interfaces are created later by the call to dpif_port_add()
+         * in bridge_reconfigure().  Until then, we can't obtain any
+         * information about them.  (There's no real value in doing so, anyway,
+         * because the 'mac' and 'enabled' values are only used for interfaces
+         * that are bond slaves, and it doesn't normally make sense to bond an
+         * internal interface.) */
+    }
 
     if (port->n_ifaces >= port->allocated_ifaces) {
         port->ifaces = x2nrealloc(port->ifaces, &port->allocated_ifaces,