tools/hotplug/Linux: Ensure tap devices receive a dummy MAC address.
authorIan Campbell <ian.campbell@citrix.com>
Fri, 10 Dec 2010 18:44:07 +0000 (18:44 +0000)
committerIan Campbell <ian.campbell@citrix.com>
Fri, 10 Dec 2010 18:44:07 +0000 (18:44 +0000)
If a tap device is not given an explicit MAC address it will generate
one randomly.

The behaviour of the Linux bridge is to pickup the lowest MAC address
of any port for use in for ARP, STP etc. If the tap device's randomly
generated MAC address happens to be the lowest then this can cause all
manner of strange networking glitches in both domain 0 and guests when
the bridge suddenly takes over from the previously used MAC address.

We choose FE:FF:FF:FF:FF:FF as it the numerically largest
non-broadcast address. This ensures that the physical NIC device's
port will have the lowest MAC address and therefore be the one picked
up by the bridge.

vif devices already have a MAC address of FE:FF:FF:FF:FF:FF set by
netback already but there is no harm in forcing it a second time in
the hotplug script.

tap devices are added by the "add" event and therefore we should call
setup_bridge_port then as well as for "online" which is caused by vif
devices.

Signed-off-by: Ian Campbell <ian.campbell@citrix.com>
Acked-by: Ian Jackson <ian.jackson@eu.citrix.com>
Signed-off-by: Ian Jackson <ian.jackson@eu.citrix.com>
tools/hotplug/Linux/vif-bridge
tools/hotplug/Linux/xen-network-common.sh

index 82ba6762021ae35f571eaf1ad7f4a3731615769e..b48e1276940d7cf6f0fcb77bbdd93153a72d4005 100644 (file)
@@ -91,6 +91,7 @@ case "$command" in
         ;;
 
     add)
+        setup_bridge_port "$dev"
         add_to_bridge "$bridge" "$dev"
         ;;
 esac
index 7014333df003f9e728fc1880672b708c58f54e04..3157a1061808ac1519960fa7a1b6782465fdfdaf 100644 (file)
@@ -86,6 +86,12 @@ setup_bridge_port() {
     # take interface down ...
     ip link set ${dev} down
 
+    # Initialise a dummy MAC address. We choose the numerically
+    # largest non-broadcast address to prevent the address getting
+    # stolen by an Ethernet bridge for STP purposes.
+    # (FE:FF:FF:FF:FF:FF)
+    ip link set ${dev} address fe:ff:ff:ff:ff:ff
+
     # ... and configure it
     ip addr flush ${dev}
 }