vswitch: Don't choose Xen's FE:FF:FF:FF:FF:FF address as bridge MAC or DPID.
authorBen Pfaff <blp@nicira.com>
Thu, 19 Mar 2009 19:39:00 +0000 (12:39 -0700)
committerBen Pfaff <blp@nicira.com>
Thu, 19 Mar 2009 19:59:57 +0000 (12:59 -0700)
Xen uses FE:FF:FF:FF:FF:FF as the mac address for every virtual interface.
If we have a bridge that has just virtual interfaces, then this will end
up as the bridge's MAC address and thus the datapath ID also.  So, instead,
use the bridge's randomly chosen MAC address if this case comes up.

This is probably not the end of this issue, since we probably want the
DPID of such bridges to be predictable.  Need to figure out how to do that.

lib/packets.h
vswitchd/bridge.c

index 7f6bd42f6074e72637a4ab856dedbb0a811a11f1..0a0da381b6650e849236a4852db97ab0442cb896 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (c) 2008 The Board of Trustees of The Leland Stanford
+/* Copyright (c) 2008, 2009 The Board of Trustees of The Leland Stanford
  * Junior University
  * 
  * We are making the OpenFlow specification and associated documentation
 static const uint8_t eth_addr_broadcast[ETH_ADDR_LEN] UNUSED
     = { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff };
 
+/* This is the Ethernet address used by virtual interfaces under Xen. */
+static const uint8_t eth_addr_vif[ETH_ADDR_LEN] UNUSED
+    = { 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff };
+
 static inline bool eth_addr_is_broadcast(const uint8_t ea[6])
 {
     return (ea[0] & ea[1] & ea[2] & ea[3] & ea[4] & ea[5]) == 0xff;
 }
+static inline bool eth_addr_is_vif(const uint8_t ea[6])
+{
+    return ea[0] == 0xfe && (ea[1] & ea[2] & ea[3] & ea[4] & ea[5]) == 0xff;
+}
 static inline bool eth_addr_is_multicast(const uint8_t ea[6])
 {
     return ea[0] & 1;
index d7265cfd1c02328d17a1a544e5c9f309dcd192f2..ad62181ad2a07490b4ec72962453ef513549926a 100644 (file)
@@ -552,7 +552,7 @@ bridge_pick_local_hw_addr(struct bridge *br, uint8_t ea[ETH_ADDR_LEN])
             }
         }
     }
-    if (eth_addr_is_multicast(ea)) {
+    if (eth_addr_is_multicast(ea) || eth_addr_is_vif(ea)) {
         memcpy(ea, br->default_ea, ETH_ADDR_LEN);
         VLOG_WARN("bridge %s: using default bridge Ethernet "
                   "address "ETH_ADDR_FMT, br->name, ETH_ADDR_ARGS(ea));