xref: /dpdk/dts/framework/testbed_model/port.py (revision b935bdc3da26ab86ec775dfad3aa63a1a61f5667)
1840b1e01SJuraj Linkeš# SPDX-License-Identifier: BSD-3-Clause
2840b1e01SJuraj Linkeš# Copyright(c) 2022 University of New Hampshire
3840b1e01SJuraj Linkeš# Copyright(c) 2023 PANTHEON.tech s.r.o.
4840b1e01SJuraj Linkeš
56ef07151SJuraj Linkeš"""NIC port model.
66ef07151SJuraj Linkeš
76ef07151SJuraj LinkešBasic port information, such as location (the port are identified by their PCI address on a node),
86ef07151SJuraj Linkešdrivers and address.
96ef07151SJuraj Linkeš"""
106ef07151SJuraj Linkeš
116ef07151SJuraj Linkeš
12840b1e01SJuraj Linkešfrom dataclasses import dataclass
13840b1e01SJuraj Linkeš
14840b1e01SJuraj Linkešfrom framework.config import PortConfig
15840b1e01SJuraj Linkeš
16840b1e01SJuraj Linkeš
17840b1e01SJuraj Linkeš@dataclass(slots=True, frozen=True)
18840b1e01SJuraj Linkešclass PortIdentifier:
196ef07151SJuraj Linkeš    """The port identifier.
206ef07151SJuraj Linkeš
216ef07151SJuraj Linkeš    Attributes:
226ef07151SJuraj Linkeš        node: The node where the port resides.
236ef07151SJuraj Linkeš        pci: The PCI address of the port on `node`.
246ef07151SJuraj Linkeš    """
256ef07151SJuraj Linkeš
26840b1e01SJuraj Linkeš    node: str
27840b1e01SJuraj Linkeš    pci: str
28840b1e01SJuraj Linkeš
29840b1e01SJuraj Linkeš
30840b1e01SJuraj Linkeš@dataclass(slots=True)
31840b1e01SJuraj Linkešclass Port:
326ef07151SJuraj Linkeš    """Physical port on a node.
336ef07151SJuraj Linkeš
346ef07151SJuraj Linkeš    The ports are identified by the node they're on and their PCI addresses. The port on the other
356ef07151SJuraj Linkeš    side of the connection is also captured here.
366ef07151SJuraj Linkeš    Each port is serviced by a driver, which may be different for the operating system (`os_driver`)
376ef07151SJuraj Linkeš    and for DPDK (`os_driver_for_dpdk`). For some devices, they are the same, e.g.: ``mlx5_core``.
386ef07151SJuraj Linkeš
396ef07151SJuraj Linkeš    Attributes:
40840b1e01SJuraj Linkeš        identifier: The PCI address of the port on a node.
416ef07151SJuraj Linkeš        os_driver: The operating system driver name when the operating system controls the port,
426ef07151SJuraj Linkeš            e.g.: ``i40e``.
436ef07151SJuraj Linkeš        os_driver_for_dpdk: The operating system driver name for use with DPDK, e.g.: ``vfio-pci``.
44840b1e01SJuraj Linkeš        peer: The identifier of a port this port is connected with.
456ef07151SJuraj Linkeš            The `peer` is on a different node.
466ef07151SJuraj Linkeš        mac_address: The MAC address of the port.
476ef07151SJuraj Linkeš        logical_name: The logical name of the port. Must be discovered.
48840b1e01SJuraj Linkeš    """
49840b1e01SJuraj Linkeš
50840b1e01SJuraj Linkeš    identifier: PortIdentifier
51840b1e01SJuraj Linkeš    os_driver: str
52840b1e01SJuraj Linkeš    os_driver_for_dpdk: str
53840b1e01SJuraj Linkeš    peer: PortIdentifier
54840b1e01SJuraj Linkeš    mac_address: str = ""
55840b1e01SJuraj Linkeš    logical_name: str = ""
56840b1e01SJuraj Linkeš
57*b935bdc3SLuca Vizzarro    def __init__(self, node_name: str, config: PortConfig):
586ef07151SJuraj Linkeš        """Initialize the port from `node_name` and `config`.
596ef07151SJuraj Linkeš
606ef07151SJuraj Linkeš        Args:
616ef07151SJuraj Linkeš            node_name: The name of the port's node.
626ef07151SJuraj Linkeš            config: The test run configuration of the port.
636ef07151SJuraj Linkeš        """
64840b1e01SJuraj Linkeš        self.identifier = PortIdentifier(
65*b935bdc3SLuca Vizzarro            node=node_name,
66840b1e01SJuraj Linkeš            pci=config.pci,
67840b1e01SJuraj Linkeš        )
68840b1e01SJuraj Linkeš        self.os_driver = config.os_driver
69840b1e01SJuraj Linkeš        self.os_driver_for_dpdk = config.os_driver_for_dpdk
70840b1e01SJuraj Linkeš        self.peer = PortIdentifier(node=config.peer_node, pci=config.peer_pci)
71840b1e01SJuraj Linkeš
72840b1e01SJuraj Linkeš    @property
73840b1e01SJuraj Linkeš    def node(self) -> str:
746ef07151SJuraj Linkeš        """The node where the port resides."""
75840b1e01SJuraj Linkeš        return self.identifier.node
76840b1e01SJuraj Linkeš
77840b1e01SJuraj Linkeš    @property
78840b1e01SJuraj Linkeš    def pci(self) -> str:
796ef07151SJuraj Linkeš        """The PCI address of the port."""
80840b1e01SJuraj Linkeš        return self.identifier.pci
81840b1e01SJuraj Linkeš
82840b1e01SJuraj Linkeš
83840b1e01SJuraj Linkeš@dataclass(slots=True, frozen=True)
84840b1e01SJuraj Linkešclass PortLink:
856ef07151SJuraj Linkeš    """The physical, cabled connection between the ports.
866ef07151SJuraj Linkeš
876ef07151SJuraj Linkeš    Attributes:
886ef07151SJuraj Linkeš        sut_port: The port on the SUT node connected to `tg_port`.
896ef07151SJuraj Linkeš        tg_port: The port on the TG node connected to `sut_port`.
906ef07151SJuraj Linkeš    """
916ef07151SJuraj Linkeš
92840b1e01SJuraj Linkeš    sut_port: Port
93840b1e01SJuraj Linkeš    tg_port: Port
94