From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from e23smtp05.au.ibm.com (e23smtp05.au.ibm.com [202.81.31.147]) by dpdk.org (Postfix) with ESMTP id 7FA052986 for ; Thu, 3 Mar 2016 08:59:01 +0100 (CET) Received: from localhost by e23smtp05.au.ibm.com with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted for from ; Thu, 3 Mar 2016 17:58:58 +1000 Received: from d23dlp03.au.ibm.com (202.81.31.214) by e23smtp05.au.ibm.com (202.81.31.211) with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted; Thu, 3 Mar 2016 17:58:56 +1000 X-IBM-Helo: d23dlp03.au.ibm.com X-IBM-MailFrom: gowrishankar.m@linux.vnet.ibm.com X-IBM-RcptTo: dts@dpdk.org Received: from d23relay10.au.ibm.com (d23relay10.au.ibm.com [9.190.26.77]) by d23dlp03.au.ibm.com (Postfix) with ESMTP id 1718E357805A for ; Thu, 3 Mar 2016 18:58:56 +1100 (EST) Received: from d23av03.au.ibm.com (d23av03.au.ibm.com [9.190.234.97]) by d23relay10.au.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id u237wldl25821196 for ; Thu, 3 Mar 2016 18:58:56 +1100 Received: from d23av03.au.ibm.com (localhost [127.0.0.1]) by d23av03.au.ibm.com (8.14.4/8.14.4/NCO v10.0 AVout) with ESMTP id u237wNTW029488 for ; Thu, 3 Mar 2016 18:58:23 +1100 Received: from [9.124.124.138] (chozha.in.ibm.com [9.124.124.138]) by d23av03.au.ibm.com (8.14.4/8.14.4/NCO v10.0 AVin) with ESMTP id u237wLc4028748; Thu, 3 Mar 2016 18:58:22 +1100 Message-ID: <56D7EE85.5040407@linux.vnet.ibm.com> Date: Thu, 03 Mar 2016 13:27:57 +0530 From: gowrishankar User-Agent: Mozilla/5.0 (X11; Linux i686; rv:31.0) Gecko/20100101 Thunderbird/31.3.0 MIME-Version: 1.0 To: "Liu, Yong" References: <1456481834-10027-1-git-send-email-gowrishankar.m@linux.vnet.ibm.com> <1456481834-10027-5-git-send-email-gowrishankar.m@linux.vnet.ibm.com> <86228AFD5BCD8E4EBFD2B90117B5E81E144FF148@SHSMSX103.ccr.corp.intel.com> In-Reply-To: <86228AFD5BCD8E4EBFD2B90117B5E81E144FF148@SHSMSX103.ccr.corp.intel.com> Content-Type: text/plain; charset=windows-1252; format=flowed Content-Transfer-Encoding: 7bit X-TM-AS-MML: disable X-Content-Scanned: Fidelis XPS MAILER x-cbid: 16030307-0017-0000-0000-000002ED1E8F Cc: dts Subject: Re: [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: Thu, 03 Mar 2016 07:59:02 -0000 On Tuesday 01 March 2016 06:47 PM, Liu, Yong wrote: > Hi Gowrishankar, > >> -----Original Message----- >> From: dts [mailto:dts-bounces@dpdk.org] On Behalf Of Gowrishankar >> Sent: Friday, February 26, 2016 6:17 PM >> To: dts >> Subject: [dts] [PATCH 4/9] framework: enable connect X3 support >> >> 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'] > Here is to strip NIC kernel interface after bind it to kernel driver. > When in scan_port function, nic information may unavailable for kernel driver not bound. > So macaddress and interface should strip in rescan_port function. Sure, I will add this check. >> 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 >> + > In DTS, word "peer" has been designated for tester port which connected to dut port. > Suggest change another word for the second port. I got it. I would rather call it "interface 2" to avoid confusion. get_interface2_name(), get_intf2_mac_addr() and self.intf2_name are more correct I hope. Thank you for the review. If there are no other changes, I can send version 2 of patches with above correction. Regards, Gowrishankar > >> 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 > >