[dpdk-dev] [PATCH v2 00/10] Add a VXLAN sample

Liu, Yong yong.liu at intel.com
Wed Jun 3 10:26:43 CEST 2015


Tested-by: Yong Liu <yong.liu at intel.com>

- Tested Commit: 7c4c66bf666b8059ed0ad2f2478ef349b3272f51
- OS: Fedora20 3.15.5
- GCC: gcc version 4.8.3 20140911
- CPU: Intel(R) Xeon(R) CPU E5-2699 v3 @ 2.30GHz
- NIC: Intel Corporation Device XL710 [8086:1584] Firmware 4.33
- Default x86_64-native-linuxapp-gcc configuration
- Prerequisites: set up dpdk vhost-user running environment
    allocate enough hugepages for both vxlan sample and virtual machine
- Total 5 cases, 5 passed, 0 failed

- Prerequisites command / instruction:
  Update qemu-system-x86_64 to version 2.2.0 which support hugepage based memory
  Prepare vhost-use requested modules
    modprobe fuse
    modprobe cuse
    insmod lib/librte_vhost/eventfd_link/eventfd_link.ko
  Allocate 4096*2M hugepages for vm and dpdk
    echo 4096 > /sys/kernel/mm/hugepages/hugepages-2048kB/nr_hugepages
	
- Case: vxlan_sample_encap
  Description: check vxlan sample encap function work fine
  Command / instruction:
    Start vxlan sample with only encapsulation enable
      tep_termination -c 0xf -n 3 --socket-mem 2048,2048 -- -p 0x1 \
        --udp-port 4789 --nb-devices 2 --filter-type 3 --tx-checksum 0 \
        --encap 1 --decap 0
    Wait for vhost-net socket device created and message dumped.
      VHOST_CONFIG: bind to vhost-net
    Start virtual machine with hugepage based memory and two vhost-user devices
      qemu-system-x86_64 -name vm0 -enable-kvm -daemonize \
        -cpu host -smp 4 -m 4096 \
        -object memory-backend-file,id=mem,size=4096M,mem-path=/mnt/huge,share=on \
        -numa node,memdev=mem -mem-prealloc \
        -chardev socket,id=char0,path=./dpdk/vhost-net \
        -netdev type=vhost-user,id=netdev0,chardev=char0,vhostforce \
        -device virtio-net-pci,netdev=netdev0,mac=00:00:20:00:00:20 \
        -chardev socket,id=char1,path=./dpdk/vhost-net \
        -netdev type=vhost-user,id=netdev1,chardev=char1,vhostforce \
        -device virtio-net-pci,netdev=netdev1,mac=00:00:20:00:00:21 \
        -drive file=/storage/vm-image/vm0.img -vnc :1
    Login into virtual machine and start testpmd with additional arguments
      testpmd -c f -n 3 -- -i --txqflags=0xf00 --disable-hw-vlan
    Start packet forward of testpmd and transit several packets for mac learning
      testpmd> set fwd mac
      testpmd> start tx_first
    Make sure virtIO port registered normally.
      VHOST_CONFIG: virtio is now ready for processing.
      VHOST_DATA: (1) Device has been added to data core 56
      VHOST_DATA: (1) MAC_ADDRESS 00:00:20:00:00:21 and VNI 1000 registered
      VHOST_DATA: (0) MAC_ADDRESS 00:00:20:00:00:20 and VNI 1000 registered
    Send normal udp packet to PF device and packet dmac match PF device 
    Verify packet has been recevied in virtIO port0 and forwarded by port1
      testpmd> show port stats all
    Verify encapsulated packet received on PF device

- Case: vxlan_sample_decap
  Description: check vxlan sample decap function work fine
  Command / instruction:
    Start vxlan sample with only de-capsulation enable
      tep_termination -c 0xf -n 3 --socket-mem 2048,2048 -- -p 0x1 \
        --udp-port 4789 --nb-devices 2 --filter-type 3 --tx-checksum 0 \
        --encap 0 --decap 1
    Start vhost-user test environment like case vxlan_sample_encap
    Send vxlan packet Ether(dst=PF mac)/IP/UDP/vni(1000)/
	  Ether(dst=virtIO port0)/IP/UDP to PF device
	Verify that packet received by virtIO port0 and forwarded by virtIO port1.
      testpmd> show port stats all
	Verify that PF received packet just the same as inner packet
    Send vxlan packet Ether(dst=PF mac)/IP/UDP/vni(1000)/
	  Ether(dst=virtIO port1)/IP/UDP to PF device
	Verify that packet received by virtIO port1 and forwarded by virtIO port0.
      testpmd> show port stats all	
	Make sure PF received packet received inner packet with mac reversed.
	
- Case: vxlan_sample_encap_and_decap
  Description: check vxlan sample decap&encap work fine in the same time
  Command / instruction:
    Start vxlan sample with only de-capsulation enable
      tep_termination -c 0xf -n 3 --socket-mem 2048,2048 -- -p 0x1 \
        --udp-port 4789 --nb-devices 2 --filter-type 3 --tx-checksum 0 \
        --encap 1 --decap 1
    Start vhost-user test environment like case vxlan_sample_encap
	Ether(dst=PF mac)/IP/UDP/vni(1000)/ Ether(dst=virtIO port0)/IP/UDP
    Send vxlan packet Ether(dst=PF mac)/IP/UDP/vni(1000)/
	  Ether(dst=virtIO port0)/IP/UDP to PF device
	Verify that packet received by virtIO port0 and forwarded by virtIO port1.
      testpmd> show port stats all
	Verify encapsulated packet received on PF device.
    Verify that inner packet src and dst mac address have been conversed.
	
- Case: vxlan_sample_chksum	
  Description: check vxlan sample transmit checksum work fine
  Command / instruction:
    Start vxlan sample with only decapsulation enable
      tep_termination -c 0xf -n 3 --socket-mem 2048,2048 -- -p 0x1 \
        --udp-port 4789 --nb-devices 2 --filter-type 3 --tx-checksum 1 \
        --encap 1 --decap 1
    Start vhost-user test environment like case vxlan_sample_encap
    Send vxlan packet with Ether(dst = PF mac)/IP/UDP/vni(1000)/ 
	  Ether(dst = virtIO port0)/IP wrong chksum/ UDP wrong chksum
	Verify that packet recevied by virtIO port0 and forwarded by virtIO port1.
      testpmd> show port stats all
	Verify encapsulated packet received on PF device.
    Verify that inner packet src and dst mac address have been conversed.
    Verify that inner packet ip checksum and udp checksum were corrected.
	
    Send vxlan packet with Ether(dst = PF mac)/IP/UDP/vni(1000)/ 
	  Ether(dst = virtIO port0)/IP wrong chksum/ TCP wrong chksum
	Verify that packet recevied by virtIO port0 and forwarded by virtIO port1.
      testpmd> show port stats all
	Verify encapsulated packet received on PF device.
    Verify that inner packet src and dst mac address have been conversed.
    Verify that inner packet ip checksum and tcp checksum were corrected.
	
    Send vxlan packet with Ether(dst = PF mac)/IP/UDP/vni(1000)/ 
	  Ether(dst = virtIO port0)/IP wrong chksum/ SCTP wrong chksum
	Verify that packet received by virtIO port0 and forwarded by virtIO port1.
      testpmd> show port stats all
	Verify encapsulated packet received on PF device.
    Verify that inner packet src and dst mac address have been conversed.
    Verify that inner packet ip checksum and sctp checksum were corrected.

- Case: vxlan_sample_tso
  Description: check vxlan sample tso work fine
  Command / instruction:
    Start vxlan sample with tso enable, tx checksum must enable too
    For hardware limitation, tso segment size must be larger 256 
      tep_termination -c 0xf -n 3 --socket-mem 2048,2048 -- -p 0x1 \
        --udp-port 4789 --nb-devices 2 --filter-type 3 --tx-checksum 1 \
        --encap 1 --decap 1 --tso-segsz 256
    Start vhost-user test environment like case vxlan_sample_encap
    Send vxlan packet with Ether(dst = PF mac)/IP/UDP/vni(1000)/ 
	  Ether(dst = virtIO port0)/TCP/892 Bytes data, total length will be 1000
	Verify that packet recevied by virtIO port0 and forwarded by virtIO port1.
      testpmd> show port stats all
    Verify that four separated vxlan packets received on PF devices.
    Make sure tcp packet payload is 256, 256, 256 and 124.

> -----Original Message-----
> From: dev [mailto:dev-bounces at dpdk.org] On Behalf Of Jijiang Liu
> Sent: Friday, May 29, 2015 3:40 PM
> To: dev at dpdk.org
> Subject: [dpdk-dev] [PATCH v2 00/10] Add a VXLAN sample
> 
> This VXLAN sample simulates a VXLAN Tunnel Endpoint (VTEP) termination in
> DPDK, which is used to demonstrate the offload and filtering capabilities
> of i40 NIC for VXLAN packet.
> 
> And this sample uses the basic virtio devices management function from
> vHost example, and the US-vHost interface and tunnel filtering mechanism
> to direct the traffic to/from a specific VM.
> 
> In addition, this sample is also designed to show how tunneling protocols
> can be handled. For the vHost interface, we do not need to support zero
> copy/inter VM packet transfer, etc. The approaches we took would be of
> benefit to you because we put a pluggable structure in place so that the
> application could be easily extended to support a new tunneling protocol.
> 
> The software framework is as follows:
> 
> 
>        |-------------------|   |-------------------|
>        | VM-1(VNI:100)     |   |  VM-2(VNI:200)    |
>        | |------| |------| |   | |------| |------| |
>        | |vport0| |vport1| |   | |vport0| |vport1| |
>        |-|------|-|------|-|   |-|------|-|------|-|      Guests
>                       \         /
>          |-------------\-------/--------|
>          |     us-vHost interface       |
>          |          |-|----|--|         |
>          |     decap| | TEP|  | encap   |       DPDK App
>          |          |-|----|--|         |
>          |            |    |            |
>          |------------|----|------------|
>                       |    |
>         |-------------|----|---------------|
>         |tunnel filter|    | IP/L4 Tx csum |
>         |IP/L4 csum   |    | TSO           |
>         |packet type  |    |               |               NIC
>         |packet recogn|    |               |
>         |-------------|----|---------------|
>                       |    |
>                       |    |
>                       |    |
>                      /-------\
>                     VXLAN Tunnel
> 
> The sample will support the followings:
> 1> Tunneling packet recognition.
> 
> 2> The port of UDP tunneling is configurable
> 
> 3> Directing incoming traffic to the correct queue based on the tunnel
> filter type such as inner MAC address and VNI.
> 
>  The VNI will be assigned from a static internal table based on the us-
> vHost device ID. Each device will receive a unique device ID. The inner
> MAC will be learned by  the first packet transmitted from a device.
> 
> 4> Decapsulation of Rx VXLAN traffic. This is a software only operation.
> 
> 5> Encapsulation of Tx VXLAN traffic. This is a software only operation.
> 
> 6> Tx outer IP, inner IP and L4 checksum offload
> 
> 7> TSO support for tunneling packet
> 
> The limitations:
> 1. No ARP support
> 2. There are some duplicated source codes because I used  the basic virtio
> device management function from VHOST sample. Considering that the current
> VHOST sample is quite complicated and huge enough,  I think we shall have
> a separate sample for tunneling packet processing.
> 3. Currently, only the i40e NIC is tested in the sample, but other types
> of NICs will also be supported if they are able to support tunneling
> packet filter.
> 
> V2 change:
>     Fixed an issue about the 'nb_ports' duplication in check_ports_num().
>     Removed the inaccurate comment in main.c
>     Fixed an issue about TSO offload.
> 
> Jijiang Liu (10):
>   create VXLAN sample framework using virtio device management function
>   add basic VXLAN structures
>   addthe pluggable structures
>   implement VXLAN packet processing
>   add udp port configuration
>   add filter type configuration
>   add tx checksum offload configuration
>   add TSO offload configuration
>   add Rx checksum statistics
>   add encapsulation and decapsulation flags
> 
>  examples/Makefile                      |    1 +
>  examples/tep_termination/Makefile      |   55 ++
>  examples/tep_termination/main.c        | 1206
> ++++++++++++++++++++++++++++++++
>  examples/tep_termination/main.h        |  129 ++++
>  examples/tep_termination/vxlan.c       |  262 +++++++
>  examples/tep_termination/vxlan.h       |   76 ++
>  examples/tep_termination/vxlan_setup.c |  463 ++++++++++++
>  examples/tep_termination/vxlan_setup.h |   78 ++
>  8 files changed, 2270 insertions(+), 0 deletions(-)
>  create mode 100644 examples/tep_termination/Makefile
>  create mode 100644 examples/tep_termination/main.c
>  create mode 100644 examples/tep_termination/main.h
>  create mode 100644 examples/tep_termination/vxlan.c
>  create mode 100644 examples/tep_termination/vxlan.h
>  create mode 100644 examples/tep_termination/vxlan_setup.c
>  create mode 100644 examples/tep_termination/vxlan_setup.h
> 
> --
> 1.7.7.6



More information about the dev mailing list