import os
import getopt
import subprocess
+from glob import glob
from os.path import exists, abspath, dirname, basename
+from os.path import join as path_join
+
+if sys.version_info.major < 3:
+ print("WARNING: Python 2 is deprecated for use in DPDK, and will not work in future releases.", file=sys.stderr)
+ print("Please use Python 3 instead", file=sys.stderr)
# The PCI base class for all devices
network_class = {'Class': '02', 'Vendor': None, 'Device': None,
where DEVICE1, DEVICE2 etc, are specified via PCI "domain:bus:slot.func" syntax
or "bus:slot.func" syntax. For devices bound to Linux kernel drivers, they may
also be referred to by Linux interface name e.g. eth0, eth1, em0, em1, etc.
+If devices are specified using PCI <domain:>bus:device:func format, then
+shell wildcards and ranges may be used, e.g. 80:04.*, 80:04.[0-3]
Options:
--help, --usage:
To bind 0000:02:00.0 and 0000:02:00.1 to the ixgbe kernel driver
%(argv0)s -b ixgbe 02:00.0 02:00.1
+To bind all functions on device 0000:02:00 to ixgbe kernel driver
+ %(argv0)s -b ixgbe 02:00.*
+
""" % locals()) # replace items from local variables
for line in extra_info:
if len(line) == 0:
continue
- name, value = line.decode().split("\t", 1)
+ name, value = line.decode("utf8").split("\t", 1)
name = name.strip(":") + "_str"
device[name] = value
# check for a unix interface name
# Clear previous device's data
dev = {}
else:
- name, value = dev_line.decode().split("\t", 1)
+ name, value = dev_line.decode("utf8").split("\t", 1)
value_list = value.rsplit(' ', 1)
if len(value_list) > 1:
# String stored in <name>_str
strings.sort()
print("\n".join(strings)) # print one per line
-def show_device_status(devices_type, device_name):
+def show_device_status(devices_type, device_name, if_field=False):
global dpdk_drivers
kernel_drv = []
dpdk_drv = []
display_devices("%s devices using DPDK-compatible driver" % device_name,
dpdk_drv, "drv=%(Driver_str)s unused=%(Module_str)s")
if len(kernel_drv) != 0:
+ if_text = ""
+ if if_field:
+ if_text = "if=%(Interface)s "
display_devices("%s devices using kernel driver" % device_name, kernel_drv,
- "if=%(Interface)s drv=%(Driver_str)s "
+ if_text + "drv=%(Driver_str)s "
"unused=%(Module_str)s %(Active)s")
if len(no_drv) != 0:
display_devices("Other %s devices" % device_name, no_drv,
kernel driver or to no driver'''
if status_dev == "net" or status_dev == "all":
- show_device_status(network_devices, "Network")
+ show_device_status(network_devices, "Network", if_field=True)
if status_dev == "baseband" or status_dev == "all":
show_device_status(baseband_devices, "Baseband")
if status_dev == "misc" or status_dev == "all":
show_device_status(misc_devices, "Misc (rawdev)")
+
+def pci_glob(arg):
+ '''Returns a list containing either:
+ * List of PCI B:D:F matching arg, using shell wildcards e.g. 80:04.*
+ * Only the passed arg if matching list is empty'''
+ sysfs_path = "/sys/bus/pci/devices"
+ for _glob in [arg, '0000:' + arg]:
+ paths = [basename(path) for path in glob(path_join(sysfs_path, _glob))]
+ if paths:
+ return paths
+ return [arg]
+
+
def parse_args():
'''Parses the command-line arguments given by the user and takes the
appropriate action for each'''
else:
b_flag = arg
+ # resolve any PCI globs in the args
+ new_args = []
+ for arg in args:
+ new_args.extend(pci_glob(arg))
+ args = new_args
def do_arg_actions():
'''do the actual action requested by the user'''