+# This is a list of drivers that do support VLAN tx or rx acceleration, but
+# to which the VLAN bug workaround should not be applied. This could be
+# because these are known-good drivers (that is, they do not have any of
+# the bugs that the workaround avoids) or because the VLAN bug workaround
+# will not work for them and may cause other problems.
+#
+# This is a very short list because few drivers have been tested.
+NO_VLAN_WORKAROUND_DRIVERS = (
+ "bonding",
+)
+def netdev_get_driver_name(netdev):
+ """Returns the name of the driver for network device 'netdev'"""
+ symlink = '%s/sys/class/net/%s/device/driver' % (root_prefix(), netdev)
+ try:
+ target = os.readlink(symlink)
+ except OSError, e:
+ log("%s: could not read netdev's driver name (%s)" % (netdev, e))
+ return None
+
+ slash = target.rfind('/')
+ if slash < 0:
+ log("target %s of symbolic link %s does not contain slash"
+ % (target, symlink))
+ return None
+
+ return target[slash + 1:]
+
+def netdev_get_features(netdev):
+ """Returns the features bitmap for the driver for 'netdev'.
+ The features bitmap is a set of NETIF_F_ flags supported by its driver."""
+ try:
+ features = open("%s/sys/class/net/%s/features" % (root_prefix(), netdev)).read().strip()
+ return int(features, 0)
+ except:
+ return 0 # interface prolly doesn't exist
+
+def netdev_has_vlan_accel(netdev):
+ """Returns True if 'netdev' supports VLAN acceleration, False otherwise."""
+ NETIF_F_HW_VLAN_TX = 128
+ NETIF_F_HW_VLAN_RX = 256
+ NETIF_F_VLAN = NETIF_F_HW_VLAN_TX | NETIF_F_HW_VLAN_RX
+ return (netdev_get_features(netdev) & NETIF_F_VLAN) != 0
+