From some reason Heat/Neutron is now creating
interfaces such that xe0 and xe1 are swapped.
xe0 fa:16:3e:38:c7:66 0000:00:05.0
xe1 fa:16:3e:2f:f3:e2 0000:00:03.0
this causes the DPDK port numbering to be swapped.
xe0 is DPDK port 1 because it has higher PCI address
xe1 is DPDK port 0 because it has lower PCI address.
The VNF is configured correctly because it uses DPDK port numbers,
whereas TRex was using interface list ordering.
Modify trex_cfg.yaml to use DPDK port ordering. This also
requires running generate_cfg() after setup() in instantiate()
+------------------------------------+-------------------+------------------------------+--------+
| Name | MAC Address | Fixed IP Addresses | Status |
+------------------------------------+-------------------+------------------------------+--------+
| vnf_0.yardstick-
af5ccb47-xe0-port | fa:16:3e:66:a5:e4 | ip_address='10.1.0.7', | ACTIVE |
| vnf_0.yardstick-
af5ccb47-mgmt-port | fa:16:3e:fa:98:fe | ip_address='10.0.1.10', | ACTIVE |
| tg_0.yardstick-
af5ccb47-xe1-port | fa:16:3e:2f:f3:e2 | ip_address='10.1.1.9', | ACTIVE |
| vnf_0.yardstick-
af5ccb47-xe1-port | fa:16:3e:f3:1d:f5 | ip_address='10.1.1.4', | ACTIVE |
| | fa:16:3e:e3:8c:65 | ip_address='10.0.1.1', | ACTIVE |
| | fa:16:3e:ff:d1:b7 | ip_address='11.191.14.110', | N/A |
| tg_0.yardstick-
af5ccb47-xe0-port | fa:16:3e:38:c7:66 | ip_address='10.1.0.8', | ACTIVE |
| | fa:16:3e:ff:53:5f | ip_address='11.191.14.101', | DOWN |
| | fa:16:3e:23:5d:2c | ip_address='10.0.1.2', | ACTIVE |
| tg_0.yardstick-
af5ccb47-mgmt-port | fa:16:3e:7a:df:4e | ip_address='10.0.1.5', | ACTIVE |
| | fa:16:3e:22:65:36 | ip_address='11.191.14.109', | N/A |
+------------------------------------+-------------------+------------------------------+--------+
/sys/devices/pci0000:00/0000:00:03.0/virtio0/net/ens3/address:fa:16:3e:2f:f3:e2
/sys/devices/pci0000:00/0000:00:05.0/virtio2/net/ens5/address:fa:16:3e:38:c7:66
Change-Id: Iaef2c7d9a5af7f45bd805a8ad6ee545ce0495cb1
Signed-off-by: Ross Brattain <ross.b.brattain@intel.com>
def instantiate(self, scenario_cfg, context_cfg):
self.scenario_helper.scenario_cfg = scenario_cfg
- self.resource_helper.generate_cfg()
self.resource_helper.setup()
+ # must generate_cfg after DPDK bind because we need port number
+ self.resource_helper.generate_cfg()
LOG.info("Starting %s server...", self.APP_NAME)
name = "{}-{}-{}".format(self.name, self.APP_NAME, os.getpid())
SYNC_PORT = 4501
def generate_cfg(self):
- ext_intf = self.vnfd_helper.interfaces
+ port_names = self.vnfd_helper.port_pairs.all_ports
vpci_list = []
port_list = []
- trex_cfg = {
- 'interfaces': vpci_list,
- 'port_info': port_list,
- "port_limit": len(ext_intf),
- "version": '2',
- }
- cfg_file = [trex_cfg]
- for interface in ext_intf:
+ port_nums = sorted(self.vnfd_helper.port_nums(port_names))
+ for port_num in port_nums:
+ interface = self.vnfd_helper.find_interface_by_port(port_num)
virtual_interface = interface['virtual-interface']
- vpci_list.append(virtual_interface["vpci"])
dst_mac = virtual_interface["dst_mac"]
+ # why skip?, ordering is based on DPDK port number so we can't skip
if not dst_mac:
continue
-
+ # TRex ports must be in DPDK port number, so order of append matters
+ vpci_list.append(virtual_interface["vpci"])
local_mac = virtual_interface["local_mac"]
port_list.append({
"src_mac": mac_address_to_hex_list(local_mac),
"dest_mac": mac_address_to_hex_list(dst_mac),
})
+ trex_cfg = {
+ 'interfaces': vpci_list,
+ 'port_info': port_list,
+ "port_limit": len(port_names),
+ "version": '2',
+ }
+ cfg_file = [trex_cfg]
cfg_str = yaml.safe_dump(cfg_file, default_flow_style=False, explicit_start=True)
self.ssh_helper.upload_config_file(os.path.basename(self.CONF_FILE), cfg_str)