[dpdk-dev] [PATCH v4 0/6] Link Bonding mode 6 support (ALB)

Jiajia, SunX sunx.jiajia at intel.com
Wed Mar 4 04:53:57 CET 2015


Tested-by: Jiajia, SunX <sunx.jiajia at intel.com>

- Tested Commit: 8bfc4e3c4cb922d9c7e6b8934fdaffba268c7ed2
- OS: Fedora20 3.11.10-301.fc20.x86_64
- GCC: gcc version 4.8.3
- CPU: Intel(R) Xeon(R) CPU E5-2680 v2 @ 2.80GHz
- NIC: Intel Corporation 82599ES 10-Gigabit SFI/SFP+ Network Connection [8086:10fb]
- Target x86_64-native-linuxapp-gcc 
- Total 3 cases, 3 passed, 0 failed


* Connections ports between tester/ixia and switch and DUT
  - TESTER(Or IXIA)-------SWITCH
  -                       SWITCH---------DUT
  - TESTER(Or IXIA)----------------------DUT
  - portA------------------switch
  -                        switch----------port0
  -                        switch----------port1
  -                        switch----------port2
  - portB----------------------------------port3
* Connections ports between tester/ixia and switch and DUT
  - TESTER(Or IXIA)-------SWITCH
  -                       SWITCH---------DUT
  - TESTER(Or IXIA)----------------------DUT
  - portA-----------------switch
  - portB-----------------switch
  - portC-----------------switch
  -                       switch----------port0
  -                       switch----------port1
  -                       switch----------port2
 
Test Setup#1 for Functional test
================================

Tester has 4 ports(portA--portD), and DUT has 4 ports(port0--port3), then connect portA to port0, portB to port1, portC to port2, portD to port3. 


Test Setup#2 for Functional test
================================

Tester has 2 ports(portA--portB), DUT has 4 ports(port0--port3), and a switch that supports IEEE 802.3ad Dynamic link aggregation, then connect port0-port2 to the switch for dynamic link aggregation, connect portA to aggregated interface on the switch, connect portB to port3. 

Test Setup#3 for Functional test
================================

Tester has 3 ports(portA--portC), DUT has 3 ports(port0--port2), and a switch, then connect port0-port2 to three ports on the switch, connect portA - portB to the other three ports on the switch. 

Test App
===============================

Use testpmd to test the mode 0, 1, 2, 3, 4, 5, use bond_app to test the mode 6. If test the mode 6, Set the tester port address to 
7.0.0.1, 7.0.0.2, 7.0.0.3. And it will be better to turn on the debug switch on the config:
CONFIG_RTE_LIBRTE_BOND_DEBUG_ALB=n - deeper debug, if you want all arp and ipv4 packets be printed 
CONFIG_RTE_LIBRTE_BOND_DEBUG_ALB_L1=n - don't print packets information, just collects statistics from clients, you can print these statistics with show command.


Test Case1: Mode 6(Adaptive load balance) Basic test
=============================================================================

Verify basic commands of bond_app work well.

Use Setup#3

Now bond_app has commands of send, start, stop, show, help, quit
help:

      execute command 'help' in the bond_app, verify it will print all commands help info.

send:

	  make sure that bond_app has been started, execute command 'send 7.0.0.1' on server, use 
	  tcpdump to listen client1 port , verify the port will receive ARP requests.

start:

      step1:
            execute command 'stop' in the bond_app, then execute 'arping -c 1 -I device 7.0.0.10' on the client1,
            verify bond_app will not receive and reply the client1 ARP request.
      Step2:
            Execute command 'start' in the bond_app, then execute 'arping -c 1 -I device 7.0.0.10' on the client1,
            Verify bond_app will receive and reply the client1 ARP request.

stop:

     continue the test of  command 'start', rerun step1.

show:

     execute command 'show' in the bond_app, verify it will print  some bond info: ex. active slaves etc.

quit:

     execute command 'quit' in the bond_app, verify it will terminate all threads and quit.
                
Verify bond_app can check the state of slaves, and do some actions.

Use Setup#1

Start bond_app.

Step1:

      Send 1 ARP request packet to bond0 from client1, verify it will receive and reply it on one slave.

Step2:

	  Bring the port of client1 link down,  verify bond0 will detect the change of slaves, by the command
      'show' to check the state of bond0, verify there are just two slaves.

Step3:

      Send 1 ARP request packet to bond0 on bond1 from client1, verify it will receive nothing.


Test Case2: Mode 6(Adaptive load balance) RX test of mode6
=============================================================================

Verify bond device can receive load balancing for IPV4 traffic.

Use Setup#3

Step1:

      Send ARP request packet (no VLAN header) to bond0 from each client, verify bond0 will choose 
      different slave to reply the request by the policy of round-robin.
      You can use the command 'arping -c 1 -I device 7.0.0.10' to server on each client. The device will
      need you to change it to the interface name of your client.

Step2:

      Send ARP request packet tagged with VLAN header to bond0 from each client, verify bond0 will
      choose different slave to reply the request by the policy of round-robin. The VLAN header will not
      affect the policy of choosing slave to reply the request.
      You can use the scapy to send these packet as below:
                                
      >>> eth = Ether(src='choose-client-port-mac')
      >>> arp = ARP(hwsrc='choose-client-port-mac', psrc='choose-port-ip', pdst='7.0.0.10')
      >>> dot1q = Dot1Q(vlan=1)
      >>> packet = eth/dot1q/arp
      >>> recv = srp1(packet, iface='choose-port-interface-name', timeout=2)

Test Case3: Mode 6(Adaptive load balance) TX test of mode6
=============================================================================

Verify bond device can transmit load balance.

Use Setup#3

Use scapy to send 1000 IP packets to bond0, verify slave0, slave1 and slave2 will transmit packets like this:
average = packet_num / slave_num; average*0.9 < slave_transmit_num < 1.1*average; so each slave
will receive packets between 300 and 367.

You can use scapy to send packets as below:

    >>> eth = Ether(src='choose-client-port-mac')
    >>> ip = IP(len=66, dst='7.0.0.10')
    >>> packet = eth/ip
    >>> sendp(packet, iface='choose-port-interface-name', count=1000)



> -----Original Message-----
> From: dev [mailto:dev-bounces at dpdk.org] On Behalf Of Declan Doherty
> Sent: Saturday, February 21, 2015 1:45 AM
> To: Jastrzebski, MichalX K; dev at dpdk.org
> Subject: Re: [dpdk-dev] [PATCH v4 0/6] Link Bonding mode 6 support (ALB)
> 
> On 20/02/15 16:09, Michal Jastrzebski wrote:
> > v4 changes:
> > - license year modified
> > - aded license to rte_eth_bond_alb files
> > - removed RTE_EXEC_ENV_BAREMETAL in #define
> >
> > v3 changes:
> > - completed description for mode 5 unit tests patch
> > - fixed errors required by checkpatch.pl
> > - moved patch version changes from patches to cover-letter
> >
> > v2 changes:
> > in mode 6 patch 2/6:
> > - add VLAN support
> > - fixed sending duplicated ARPupdates
> > - fixed assigning slaves for next clients
> > - fixed TLB mode
> >
> > in debug patch 3/6:
> > - add IPv4 RX/TX information
> > - add mode6_debug(..) function
> >
> > in the example application patch 4/6:
> > - remove count parameter from send command
> > - fixed quit command to use cmdline_quit(cl)
> > - add echo function - all IPv4 packets will be retransmitted. Bonding
> > 	driver will use TLB policy - this will show how TX works in mode
> 6
> > - remove unused structures rx_conf_default and tx_conf_default
> > - add VLAN support
> > - remove unnecessary comments
> > - nodify show command in term of printing DEBUG informations
> >
> > This patchset add support for link bonding mode 6.
> > Additionally it changes an arp_header structure definition.
> > Also a basic example is introduced. Using this example,
> > Bonding will configure each client ARP table,
> > that packets from each client will be received on different slave,
> > mode 6 uses round-robin policy to assign slave to client IP address.
> >
> > Daniel Mrzyglod (1):
> >    bond: modify TLB unit tests
> >
> > Maciej Gajdzica (3):
> >    net: changed arp_hdr struct declaration
> >    bond: add link bonding mode 6 implementation
> >    bond: add unit tests for link bonding mode 6.
> >
> > Michal Jastrzebski (2):
> >    bond: add debug info for mode 6 link bonding
> >    bond: add example application for link bonding mode 6
> >
> >   app/test-pmd/icmpecho.c                    |   27 +-
> >   app/test/packet_burst_generator.c          |   41 +-
> >   app/test/packet_burst_generator.h          |   11 +-
> >   app/test/test_link_bonding.c               |  450 +++++++++++++++-
> >   app/test/test_pmd_perf.c                   |    3 +-
> >   app/test/virtual_pmd.c                     |  109 ++--
> >   app/test/virtual_pmd.h                     |    5 +-
> >   config/common_linuxapp                     |    3 +-
> >   examples/bond/Makefile                     |   57 ++
> >   examples/bond/main.c                       |  796
> ++++++++++++++++++++++++++++
> >   examples/bond/main.h                       |   39 ++
> >   lib/librte_net/rte_arp.h                   |   13 +-
> >   lib/librte_pmd_bond/Makefile               |    1 +
> >   lib/librte_pmd_bond/rte_eth_bond.h         |   11 +-
> >   lib/librte_pmd_bond/rte_eth_bond_alb.c     |  289 ++++++++++
> >   lib/librte_pmd_bond/rte_eth_bond_alb.h     |  142 +++++
> >   lib/librte_pmd_bond/rte_eth_bond_api.c     |   28 +-
> >   lib/librte_pmd_bond/rte_eth_bond_args.c    |    3 +-
> >   lib/librte_pmd_bond/rte_eth_bond_pmd.c     |  460 ++++++++++++++--
> >   lib/librte_pmd_bond/rte_eth_bond_private.h |   12 +
> >   20 files changed, 2354 insertions(+), 146 deletions(-)
> >   create mode 100644 examples/bond/Makefile
> >   create mode 100644 examples/bond/main.c
> >   create mode 100644 examples/bond/main.h
> >   create mode 100644 lib/librte_pmd_bond/rte_eth_bond_alb.c
> >   create mode 100644 lib/librte_pmd_bond/rte_eth_bond_alb.h
> >
> 
> Series Acked-by: Declan Doherty <declan.doherty at intel.com>


More information about the dev mailing list