Be more liberal about what constitutes a virtual interface MAC on Xen.
authorBen Pfaff <blp@nicira.com>
Tue, 31 Mar 2009 21:46:27 +0000 (14:46 -0700)
committerBen Pfaff <blp@nicira.com>
Tue, 31 Mar 2009 21:46:27 +0000 (14:46 -0700)
The xapi sources indicate that FE:FE:FE:FE:FE:FE can sometimes be used for
virtual interfaces, in addition to the usual FE:FF:FF:FF:FF:FF, so accept
that (and other similar variants) as well.

lib/packets.h

index 9c7ee9ce4f0b48c653d0254c1eb050a6525b7610..2d1e6d4982577a6ee8e66c0527abee32c36a4766 100644 (file)
 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;
 }
+
+/* Returns true if 'ea' is an Ethernet address used for virtual interfaces
+ * under XenServer.  Generally the actual Ethernet address is FE:FF:FF:FF:FF:FF
+ * but it can be FE:FE:FE:FE:FE:FE in some cases. */
 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;
+    return ea[0] == 0xfe && (ea[1] & ea[2] & ea[3] & ea[4] & ea[5]) >= 0xfe;
 }
+
 static inline bool eth_addr_is_multicast(const uint8_t ea[6])
 {
     return ea[0] & 1;