From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from e23smtp04.au.ibm.com (e23smtp04.au.ibm.com [202.81.31.146]) by dpdk.org (Postfix) with ESMTP id 979772C72 for ; Fri, 26 Feb 2016 11:18:29 +0100 (CET) Received: from localhost by e23smtp04.au.ibm.com with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted for from ; Fri, 26 Feb 2016 20:18:26 +1000 Received: from d23dlp02.au.ibm.com (202.81.31.213) by e23smtp04.au.ibm.com (202.81.31.210) with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted; Fri, 26 Feb 2016 20:18:24 +1000 X-IBM-Helo: d23dlp02.au.ibm.com X-IBM-MailFrom: gowrishankar.m@linux.vnet.ibm.com X-IBM-RcptTo: dts@dpdk.org Received: from d23relay08.au.ibm.com (d23relay08.au.ibm.com [9.185.71.33]) by d23dlp02.au.ibm.com (Postfix) with ESMTP id 915B12BB0057 for ; Fri, 26 Feb 2016 21:18:24 +1100 (EST) Received: from d23av01.au.ibm.com (d23av01.au.ibm.com [9.190.234.96]) by d23relay08.au.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id u1QAIDqK66584730 for ; Fri, 26 Feb 2016 21:18:24 +1100 Received: from d23av01.au.ibm.com (localhost [127.0.0.1]) by d23av01.au.ibm.com (8.14.4/8.14.4/NCO v10.0 AVout) with ESMTP id u1QAHnft000719 for ; Fri, 26 Feb 2016 21:17:49 +1100 Received: from chozha.in.ibm.com ([9.79.215.216]) by d23av01.au.ibm.com (8.14.4/8.14.4/NCO v10.0 AVin) with ESMTP id u1QAHhv1032599 for ; Fri, 26 Feb 2016 21:17:48 +1100 From: Gowrishankar To: dts Date: Fri, 26 Feb 2016 15:47:09 +0530 Message-Id: <1456481834-10027-5-git-send-email-gowrishankar.m@linux.vnet.ibm.com> X-Mailer: git-send-email 1.7.10.4 In-Reply-To: <1456481834-10027-1-git-send-email-gowrishankar.m@linux.vnet.ibm.com> References: <1456481834-10027-1-git-send-email-gowrishankar.m@linux.vnet.ibm.com> X-TM-AS-MML: disable X-Content-Scanned: Fidelis XPS MAILER x-cbid: 16022610-0013-0000-0000-000002CF8386 Subject: [dts] [PATCH 4/9] framework: enable connect X3 support X-BeenThere: dts@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: test suite reviews and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 26 Feb 2016 10:18:30 -0000 Connect X3 dual port adapter shares single pci device ID. This limits dts frame- work to use both the ports for the tests. With this patch, a new attribute also to refer second interface in such single pci port lookup is introduced. Added supporting APIs to derive this second interface and its MAC addresses whereever needed. Signed-off-by: Gowrishankar --- framework/dut.py | 25 +++++++++++++++++-------- framework/settings.py | 2 ++ framework/tester.py | 26 ++++++++++++++++++++++++++ nics/net_device.py | 27 +++++++++++++++++++++++++++ 4 files changed, 72 insertions(+), 8 deletions(-) diff --git a/framework/dut.py b/framework/dut.py index ff40fac..41605a3 100644 --- a/framework/dut.py +++ b/framework/dut.py @@ -569,15 +569,12 @@ class Dut(Crb): for port_info in self.ports_info: port = port_info['port'] - intf = port.get_interface_name() - if "No such file" in intf: - self.logger.info("DUT: [%s] %s" % (pci_bus, unknow_interface)) - continue + intf = port_info['intf'] out = self.send_expect("ip link show %s" % intf, "# ") if "DOWN" in out: self.send_expect("ip link set %s up" % intf, "# ") time.sleep(5) - macaddr = port.get_mac_addr() + macaddr = port_info['mac'] out = self.send_expect("ip -family inet6 address show dev %s | awk '/inet6/ { print $2 }'" % intf, "# ") ipv6 = out.split('/')[0] @@ -585,8 +582,6 @@ class Dut(Crb): if ":" not in ipv6: ipv6 = "Not connected" - port_info['mac'] = macaddr - port_info['intf'] = intf port_info['ipv6'] = ipv6 def rescan_ports_uncached_freebsd(self): @@ -689,10 +684,24 @@ class Dut(Crb): devfun_id = addr_array[2] port = GetNicObj(self, domain_id, bus_id, devfun_id) + intf = port.get_interface_name() + macaddr = port.get_mac_addr() + numa = port.socket + # store the port info to port mapping + self.ports_info.append( + {'port': port, 'pci': pci_bus, 'type': pci_id, 'numa': numa, + 'intf': intf, 'mac': macaddr}) + + if not port.get_interface_peer(): + continue + + intf = port.get_interface_peer() + macaddr = port.get_peer_mac_addr() numa = port.socket # store the port info to port mapping self.ports_info.append( - {'port': port, 'pci': pci_bus, 'type': pci_id, 'numa': numa}) + {'port': port, 'pci': pci_bus, 'type': pci_id, 'numa': numa, + 'intf': intf, 'mac': macaddr}) def scan_ports_uncached_freebsd(self): """ diff --git a/framework/settings.py b/framework/settings.py index 068afce..f3e3b9a 100644 --- a/framework/settings.py +++ b/framework/settings.py @@ -78,6 +78,7 @@ NICS = { 'fortpark':'8086:374c', 'fvl10g_vf':'8086:154c', 'atwood': '8086:15d5', + 'ConnectX3':'15b3:1003', 'ConnectX4':'15b3:1013', 'boulderrapid': '8086:15d0', } @@ -114,6 +115,7 @@ DRIVERS = { 'fortpark':'i40e', 'fvl10g_vf':'i40evf', 'atwood': 'fm10k', + 'ConnectX3':'mlx4_core', 'ConnectX4':'mlx5_core', 'boulderrapid': 'fm10k', } diff --git a/framework/tester.py b/framework/tester.py index 1d69355..87ee298 100644 --- a/framework/tester.py +++ b/framework/tester.py @@ -207,6 +207,10 @@ class Tester(Crb): itf = port.get_interface_name() self.enable_ipv6(itf) self.send_expect("ifconfig %s up" % itf, "# ") + if port.get_interface_peer(): + itf = port.get_interface_peer() + self.enable_ipv6(itf) + self.send_expect("ifconfig %s up" % itf, "# ") except Exception as e: self.logger.error(" !!! Restore ITF: " + e.message) @@ -220,6 +224,9 @@ class Tester(Crb): port = GetNicObj(self, addr_array[0], addr_array[1], addr_array[2]) itf = port.get_interface_name() self.enable_promisc(itf) + if port.get_interface_peer(): + itf = port.get_interface_peer() + self.enable_promisc(itf) except Exception as e: pass @@ -314,6 +321,25 @@ class Tester(Crb): 'mac': macaddr, 'ipv6': ipv6}) + # return if port is not connect x3 + if not port.get_interface_peer(): + continue + + intf = port.get_interface_peer() + + self.logger.info("Tester: [%s %s] %s" % (pci_bus, pci_id, intf)) + macaddr = port.get_peer_mac_addr() + + ipv6 = port.get_ipv6_addr() + + # store the port info to port mapping + self.ports_info.append({'port': port, + 'pci': pci_bus, + 'type': pci_id, + 'intf': intf, + 'mac': macaddr, + 'ipv6': ipv6}) + def send_ping6(self, localPort, ipv6, mac): """ Send ping6 packet from local port with destination ipv6 address. diff --git a/nics/net_device.py b/nics/net_device.py index a9127cb..b0fee34 100644 --- a/nics/net_device.py +++ b/nics/net_device.py @@ -150,9 +150,21 @@ class NetDevice(object): self.intf_name = 'N/A' else: self.intf_name = out + self.intf_peer = None + + # not a complete fix for CX3. + if len(out.split()) > 1 and self.default_driver == 'mlx4_core': + self.intf_name = out.split()[0] + self.intf_peer = out.split()[1] return self.intf_name + def get_interface_peer(self): + """ + Get interface name of second port of this pci device. + """ + return self.intf_peer + def get_interface_name_linux(self, domain_id, bus_id, devfun_id, driver): """ Get interface name of specified pci device on linux. @@ -242,6 +254,18 @@ class NetDevice(object): else: return out + @nic_has_driver + def get_peer_mac_addr(self): + """ + Get mac address of peer of specified pci device. + """ + get_mac_addr = getattr(self, 'get_mac_addr_%s' % self.__get_os_type()) + out = get_mac_addr(self.get_interface_peer(), self.domain_id, self.bus_id, self.devfun_id, self.current_driver) + if "No such file or directory" in out: + return 'N/A' + else: + return out + def get_mac_addr_linux(self, intf, domain_id, bus_id, devfun_id, driver): """ Get mac address of specified pci device on linux. @@ -733,6 +757,9 @@ class NetDevice(object): if driver == self.default_driver: itf = self.get_interface_name() self.__send_expect("ifconfig %s up" % itf, "# ") + if self.get_interface_peer(): + itf = self.get_interface_peer() + self.__send_expect("ifconfig %s up" % itf, "# ") def bind_driver_linux_pci_stub(self, domain_id, bus_id, devfun_id): """ -- 1.7.10.4