-# Copyright (c) 2019 Cisco and/or its affiliates.
+# Copyright (c) 2020 Cisco and/or its affiliates.
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at:
BOND_API_MODE_LACP = 5
+class RdmaMode(IntEnum):
+ """RDMA interface mode."""
+ RDMA_API_MODE_AUTO = 0
+ RDMA_API_MODE_IBV = 1
+ RDMA_API_MODE_DV = 2
+
+
class InterfaceUtil:
"""General utilities for managing interfaces"""
return if_key
@staticmethod
- def add_eth_interface(node, ifc_name=None, sw_if_index=None, ifc_pfx=None):
+ def add_eth_interface(
+ node, ifc_name=None, sw_if_index=None, ifc_pfx=None,
+ host_if_key=None):
"""Add ethernet interface to current topology.
:param node: DUT node from topology.
:param ifc_name: Name of the interface.
:param sw_if_index: SW interface index.
:param ifc_pfx: Interface key prefix.
+ :param host_if_key: Host interface key from topology file.
:type node: dict
:type ifc_name: str
:type sw_if_index: int
:type ifc_pfx: str
+ :type host_if_key: str
"""
if_key = Topology.add_new_port(node, ifc_pfx)
Topology.update_interface_name(node, if_key, ifc_name)
ifc_mac = InterfaceUtil.vpp_get_interface_mac(node, sw_if_index)
Topology.update_interface_mac_address(node, if_key, ifc_mac)
+ if host_if_key is not None:
+ Topology.set_interface_numa_node(
+ node, if_key, Topology.get_interface_numa_node(
+ node, host_if_key
+ )
+ )
+ Topology.update_interface_pci_address(
+ node, if_key, Topology.get_interface_pci_addr(node, host_if_key)
+ )
@staticmethod
- def vpp_create_avf_interface(node, vf_pci_addr, num_rx_queues=None):
+ def vpp_create_avf_interface(node, if_key, num_rx_queues=None):
"""Create AVF interface on VPP node.
:param node: DUT node from topology.
- :param vf_pci_addr: PCI address binded to i40evf driver.
+ :param if_key: Interface key from topology file of interface
+ to be bound to i40evf driver.
:param num_rx_queues: Number of RX queues.
:type node: dict
- :type vf_pci_addr: str
+ :type if_key: str
:type num_rx_queues: int
- :returns: Interface key (name) in topology.
+ :returns: AVF interface key (name) in topology.
:rtype: str
:raises RuntimeError: If it is not possible to create AVF interface on
the node.
)
cmd = u"avf_create"
+ vf_pci_addr = Topology.get_interface_pci_addr(node, if_key)
args = dict(
pci_addr=InterfaceUtil.pci_to_int(vf_pci_addr),
enable_elog=0,
sw_if_index = papi_exec.add(cmd, **args).get_sw_if_index(err_msg)
InterfaceUtil.add_eth_interface(
- node, sw_if_index=sw_if_index, ifc_pfx=u"eth_avf"
+ node, sw_if_index=sw_if_index, ifc_pfx=u"eth_avf",
+ host_if_key=if_key
)
- if_key = Topology.get_interface_by_sw_index(node, sw_if_index)
- return if_key
+ return Topology.get_interface_by_sw_index(node, sw_if_index)
@staticmethod
- def vpp_create_rdma_interface(node, pci_addr, num_rx_queues=None):
+ def vpp_create_rdma_interface(
+ node, if_key, num_rx_queues=None, mode=u"auto"):
"""Create RDMA interface on VPP node.
:param node: DUT node from topology.
- :param pci_addr: PCI address binded to rdma-core driver.
+ :param if_key: Physical interface key from topology file of interface
+ to be bound to rdma-core driver.
:param num_rx_queues: Number of RX queues.
+ :param mode: RDMA interface mode - auto/ibv/dv.
:type node: dict
- :type pci_addr: str
+ :type if_key: str
:type num_rx_queues: int
- :returns: Interface key (name) in topology.
+ :type mode: str
+ :returns: Interface key (name) in topology file.
:rtype: str
:raises RuntimeError: If it is not possible to create RDMA interface on
the node.
"""
cmd = u"rdma_create"
+ pci_addr = Topology.get_interface_pci_addr(node, if_key)
args = dict(
name=InterfaceUtil.pci_to_eth(node, pci_addr),
host_if=InterfaceUtil.pci_to_eth(node, pci_addr),
rxq_num=int(num_rx_queues) if num_rx_queues else 0,
- rxq_size=0,
- txq_size=0
+ rxq_size=1024,
+ txq_size=1024,
+ mode=getattr(RdmaMode,f"RDMA_API_MODE_{mode.upper()}").value,
)
err_msg = f"Failed to create RDMA interface on host {node[u'host']}"
with PapiSocketExecutor(node) as papi_exec:
sw_if_index = papi_exec.add(cmd, **args).get_sw_if_index(err_msg)
InterfaceUtil.add_eth_interface(
- node, sw_if_index=sw_if_index, ifc_pfx=u"eth_rdma"
+ node, sw_if_index=sw_if_index, ifc_pfx=u"eth_rdma",
+ host_if_key=if_key
)
- if_key = Topology.get_interface_by_sw_index(node, sw_if_index)
- return if_key
+ return Topology.get_interface_by_sw_index(node, sw_if_index)
@staticmethod
def vpp_enslave_physical_interface(node, interface, bond_if):
)
pf_dev = f"`basename /sys/bus/pci/devices/{pf_pci_addr}/net/*`"
- InterfaceUtil.set_linux_interface_trust_on(node, pf_dev,
- vf_id=vf_id)
+ InterfaceUtil.set_linux_interface_trust_on(
+ node, pf_dev, vf_id=vf_id
+ )
if osi_layer == u"L2":
InterfaceUtil.set_linux_interface_spoof_off(
node, pf_dev, vf_id=vf_id
)
Topology.update_interface_mac_address(node, vf_ifc_key, vf_mac_addr)
Topology.update_interface_pci_address(node, vf_ifc_key, vf_pci_addr)
+ Topology.set_interface_numa_node(
+ node, vf_ifc_key, Topology.get_interface_numa_node(
+ node, ifc_key
+ )
+ )
vf_ifc_keys.append(vf_ifc_key)
return vf_ifc_keys