[dts] [PATCH 4/9] framework: enable connect X3 support

gowrishankar gowrishankar.m at linux.vnet.ibm.com
Thu Mar 3 08:57:57 CET 2016


On Tuesday 01 March 2016 06:47 PM, Liu, Yong wrote:
> Hi Gowrishankar,
>
>> -----Original Message-----
>> From: dts [mailto:dts-bounces at 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 <gowrishankar.m at linux.vnet.ibm.com>
>> ---
>>   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
>
>



More information about the dts mailing list