import unittest import errno from tests.base import BaseResources, RCResources, UDResources from pyverbs.qp import QP, QPAttr, QPInitAttr, QPCap from pyverbs.pyverbs_error import PyverbsRDMAError from pyverbs.providers.mlx5.mlx5dv import Mlx5QP from tests.mlx5_base import Mlx5RDMATestCase import tests.utils as u import pyverbs.enums as e from pyverbs.cq import CQ class LagRawQP(BaseResources): def __init__(self, dev_name, ib_port): super().__init__(dev_name, ib_port, None) self.cq = self.create_cq() self.qp = self.create_qp() def create_cq(self): return CQ(self.ctx, 100) @u.requires_root_on_eth() def create_qp(self): qia = QPInitAttr(e.IBV_QPT_RAW_PACKET, rcq=self.cq, scq=self.cq, cap=QPCap()) try: qp = QP(self.pd, qia) except PyverbsRDMAError as ex: if ex.error_code == errno.EOPNOTSUPP: raise unittest.SkipTest("Create Raw Packet QP is not supported") raise ex qp.to_init(QPAttr(port_num=self.ib_port)) return qp class LagPortTestCase(Mlx5RDMATestCase): def setUp(self): super().setUp() self.iters = 10 self.server = None self.client = None def modify_lag(self, resources): try: port_num, active_port_num = Mlx5QP.query_lag_port(resources.qp) # if port_num is 1 - modify to 2, else modify to 1 new_port_num = (2 - port_num) + 1 Mlx5QP.modify_lag_port(resources.qp, new_port_num) port_num, active_port_num = Mlx5QP.query_lag_port(resources.qp) self.assertEqual(port_num, new_port_num, 'Port num is not as expected') except PyverbsRDMAError as ex: if ex.error_code == errno.EOPNOTSUPP: raise unittest.SkipTest('Set LAG affinity is not supported on this device') raise ex def test_raw_modify_lag_port(self): qp = LagRawQP(self.dev_name, self.ib_port) self.modify_lag(qp) def create_players(self, resource, **resource_arg): """ Initialize tests resources. :param resource: The RDMA resources to use. :param resource_arg: Dictionary of args that specify the resource specific attributes. :return: None """ super().create_players(resource, **resource_arg) self.modify_lag(self.client) self.modify_lag(self.server) def test_rc_modify_lag_port(self): self.create_players(RCResources) u.traffic(**self.traffic_args) def test_ud_modify_lag_port(self): self.create_players(UDResources) u.traffic(**self.traffic_args)