aboutsummaryrefslogtreecommitdiffstats
path: root/os_net_config/utils.py
diff options
context:
space:
mode:
authorSaravanan KR <skramaja@redhat.com>2016-09-14 15:55:26 +0530
committerSaravanan KR <skramaja@redhat.com>2016-09-20 11:29:50 +0530
commite2c2f29fd171a688cc5bc6a73cdf7fec38aedd67 (patch)
treecaefbd9da1142bb0cb93c4b8cbd3d93d5dfbbd49 /os_net_config/utils.py
parentc82cc955983065dba7b4d60858082150834ac356 (diff)
Add mac address to the DPDK mapping file
When using mapping file with mac address, mapping logic will try to fetch the mac address of the interface, which will fail. Storing the mac address also in the DPDK mapping file so that we can satisfy mapping logic. Closes-Bug: #1619330 Change-Id: I92ba7f589c8d848feb083f07c3f937b50aca388e
Diffstat (limited to 'os_net_config/utils.py')
-rw-r--r--os_net_config/utils.py29
1 files changed, 27 insertions, 2 deletions
diff --git a/os_net_config/utils.py b/os_net_config/utils.py
index 95325a3..af359d5 100644
--- a/os_net_config/utils.py
+++ b/os_net_config/utils.py
@@ -25,6 +25,14 @@ from oslo_concurrency import processutils
logger = logging.getLogger(__name__)
_SYS_CLASS_NET = '/sys/class/net'
+# File to contain the DPDK mapped nics, as nic name will not be available after
+# binding driver, which is required for correct nic numbering.
+# Format of the file (list mapped nic's details):
+# -
+# name: eth1
+# pci_address: 0000:02:00.0
+# mac_address: 01:02:03:04:05:06
+# driver: vfio-pci
_DPDK_MAPPING_FILE = '/var/lib/os-net-config/dpdk_mapping.yaml'
@@ -73,6 +81,12 @@ def interface_mac(name):
with open('/sys/class/net/%s/address' % name, 'r') as f:
return f.read().rstrip()
except IOError:
+ # If the interface is bound to a DPDK driver, get the mac address from
+ # the dpdk mapping file as /sys files will be removed after binding.
+ dpdk_mac_address = _get_dpdk_mac_address(name)
+ if dpdk_mac_address:
+ return dpdk_mac_address
+
logger.error("Unable to read mac address: %s" % name)
raise
@@ -176,6 +190,7 @@ def bind_dpdk_interfaces(ifname, driver, noop):
msg = "Failed to modprobe vfio-pci module"
raise OvsDpdkBindException(msg)
+ mac_address = interface_mac(ifname)
try:
out, err = processutils.execute('driverctl', 'set-override',
pci_address, driver)
@@ -183,7 +198,7 @@ def bind_dpdk_interfaces(ifname, driver, noop):
msg = "Failed to bind dpdk interface err - %s" % err
raise OvsDpdkBindException(msg)
else:
- _update_dpdk_map(ifname, pci_address, driver)
+ _update_dpdk_map(ifname, pci_address, mac_address, driver)
except processutils.ProcessExecutionError:
msg = "Failed to bind interface %s with dpdk" % ifname
@@ -219,19 +234,29 @@ def _get_pci_address(ifname, noop):
# way to identify the nic name after it is bound. So, the DPDK bound nic info
# is stored persistently in a file and is used to for nic numbering on
# subsequent runs of os-net-config.
-def _update_dpdk_map(ifname, pci_address, driver):
+def _update_dpdk_map(ifname, pci_address, mac_address, driver):
contents = get_file_data(_DPDK_MAPPING_FILE)
dpdk_map = yaml.load(contents) if contents else []
for item in dpdk_map:
if item['pci_address'] == pci_address:
item['name'] = ifname
+ item['mac_address'] = mac_address
item['driver'] = driver
break
else:
new_item = {}
new_item['pci_address'] = pci_address
new_item['name'] = ifname
+ new_item['mac_address'] = mac_address
new_item['driver'] = driver
dpdk_map.append(new_item)
write_yaml_config(_DPDK_MAPPING_FILE, dpdk_map)
+
+
+def _get_dpdk_mac_address(name):
+ contents = get_file_data(_DPDK_MAPPING_FILE)
+ dpdk_map = yaml.load(contents) if contents else []
+ for item in dpdk_map:
+ if item['name'] == name:
+ return item['mac_address']