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