28. CVL IAVF: Advanced RSS FOR VLAN/ESP/AH/L2TP/PFCP

28.1. Description

  • Enable IAVF RSS for VLAN/ESP/AH/L2TP/PFCP packets.

28.1.1. Pattern and input set

Hash function: toeplitz
Packet Type Pattern All the Input Set options in combination
VLAN MAC_VLAN_IPV4_PAY c-vlan
MAC_VLAN_IPV4_UDP_PAY c-vlan
MAC_VLAN_IPV4_TCP_PAY c-vlan
MAC_VLAN_IPV4_SCTP_PAY c-vlan
MAC_VLAN_IPV6_PAY c-vlan
MAC_VLAN_IPV6_UDP_PAY c-vlan
MAC_VLAN_IPV6_TCP_PAY c-vlan
MAC_VLAN_IPV6_SCTP_PAY c-vlan
ESP MAC_IPV4_ESP esp
MAC_IPV4_UDP_ESP esp
MAC_IPV6_ESP esp
MAC_IPV6_UDP_ESP esp
AH MAC_IPV4_AH ah
MAC_IPV6_AH ah
L2TP MAC_IPV4_L2TPv3 l2tpv3
MAC_IPV6_L2TPv3 l2tpv3
PFCP MAC_IPV4_PFCP_SESSION pfcp
MAC_IPV6_PFCP_SESSION pfcp

28.2. Prerequisites

  1. Hardware:

    • Intel E810 series ethernet cards: columbiaville_25g/columbiaville_100g
  2. Software:

  3. Copy comms package to /lib/firmware/intel/ice/ddp/ice.pkg, then load driver:

    rmmod ice
    insmod ice.ko
    
  4. create a VF from a PF in DUT, set mac address for thi VF:

    echo 1 > /sys/bus/pci/devices/0000\:18\:00.0/sriov_numvfs
    ip link set enp24s0f0 vf 0 mac 00:11:22:33:44:55
    
  5. bind the VF to dpdk driver in DUT:

    modprobe vfio-pci
    usertools/dpdk-devbind.py --force --bind=vfio-pci 0000:18:01.0
    

Note

The kernel must be >= 3.6+ and VT-d must be enabled in bios.

  1. Launch the testpmd to configuration queue of rx and tx number 16 in DUT:

    ./x86_64-native-linuxapp-gcc/app/dpdk-testpmd  -c 0xff -n 4 -w 0000:18:01.0 -- -i --rxq=16 --txq=16
    testpmd>set fwd rxonly
    testpmd>set verbose 1
    
  2. on tester side, copy the layer python file to /root:

      cp pfcp.py to /root
    
    then import layers when start scapy::
    
      >>> import sys
      >>> sys.path.append('/root')
      >>> from pfcp import PFCP
    

28.3. Test case: MAC_IPV4_PFCP_SESSION

  1. validate a rule for RSS type of MAC_IPV4_PFCP_SESSION:

    testpmd> flow validate 0 ingress pattern eth / ipv4 / udp / pfcp / end actions rss types pfcp end key_len 0 queues end / end
    

    get the message:

    Flow rule validated
    

    check the flow list:

    testpmd> flow list 0
    

    check the rule not exists in the list.

  2. create a rule for RSS type of MAC_IPV4_PFCP_SESSION:

    testpmd> flow create 0 ingress pattern eth / ipv4 / udp / pfcp / end actions rss types pfcp end key_len 0 queues end / end
    testpmd> flow list 0
    

    check the rule exists in the list.

  3. send matched packets

    • MAC_IPV4_PFCP_SESSION packet:

      sendp([Ether(dst="00:11:22:33:44:55")/IP(src="192.168.0.20",dst="192.168.0.21")/UDP(sport=22,dport=8805)/PFCP(Sfield=1, SEID=1)/Raw("x"*80)],iface="enp134s0f0")
      

      change the field [SEID], send a packet:

      sendp([Ether(dst="00:11:22:33:44:55")/IP(src="192.168.0.20",dst="192.168.0.21")/UDP(sport=22,dport=8805)/PFCP(Sfield=1, SEID=2)/Raw("x"*80)],iface="enp134s0f0")
      

      check the hash value is different from the first packet. change other fields, send packets:

      sendp([Ether(dst="00:11:22:33:44:55")/IP(src="192.168.0.25",dst="192.168.0.23")/UDP(sport=23,dport=8805)/PFCP(Sfield=1, SEID=1)/Raw("x"*80)],iface="enp134s0f0")
      

      check the hash values are the same as the first packet.

  4. destroy the rule:

    testpmd> flow destroy 0 rule 0
    testpmd> flow list 0
    

    check the rule not exists in the list. send the first packet in matched packets, check the hash value of this packet is different with before.

28.4. Test case: MAC_IPV6_PFCP_SESSION

  1. validate a rule for RSS type of MAC_IPV6_PFCP_SESSION:

    testpmd> flow validate 0 ingress pattern eth / ipv6 / udp / pfcp / end actions rss types pfcp end key_len 0 queues end / end
    

    get the message:

    Flow rule validated
    

    check the flow list:

    testpmd> flow list 0
    

    check the rule not exists in the list.

  2. create a rule for RSS type of MAC_IPV6_PFCP_SESSION:

    testpmd> flow create 0 ingress pattern eth / ipv6 / udp / pfcp / end actions rss types pfcp end key_len 0 queues end / end
    testpmd> flow list 0
    

    check the rule exists in the list.

  3. send matched packets

    • MAC_IPV6_PFCP_SESSION packet:

      sendp([Ether(dst="00:11:22:33:44:55")/IPv6(src="CDCD:910A:2222:5498:8475:1111:3900:1536", dst="CDCD:910A:2222:5498:8475:1111:3900:2022")/UDP(sport=22,dport=8805)/PFCP(Sfield=1, SEID=1)/Raw("x"*80)],iface="enp134s0f0")
      

      change the field [SEID], send a packet:

      sendp([Ether(dst="00:11:22:33:44:55")/IPv6(src="CDCD:910A:2222:5498:8475:1111:3900:1536", dst="CDCD:910A:2222:5498:8475:1111:3900:2022")/UDP(sport=22,dport=8805)/PFCP(Sfield=1, SEID=2)/Raw("x"*80)],iface="enp134s0f0")
      

      check the hash value is different from the first packet. change other fields, send packets:

      sendp([Ether(dst="00:11:22:33:44:55")/IPv6(src="CDCD:910A:2222:5498:8475:1111:3900:1537", dst="CDCD:910A:2222:5498:8475:1111:3900:2023")/UDP(sport=23,dport=8805)/PFCP(Sfield=1, SEID=1)/Raw("x"*80)],iface="enp134s0f0")
      

      check the hash values are the same as the first packet.

  4. destroy the rule:

    testpmd> flow destroy 0 rule 0
    testpmd> flow list 0
    

    check the rule not exists in the list. send the first packet in matched packets, check the hash value of this packet is different with before.

28.5. Test case: MAC_IPV4_L2TPv3

  1. validate a rule for RSS type of MAC_IPV4_L2TPv3:

    testpmd> flow validate 0 ingress pattern eth / ipv4 / l2tpv3oip / end actions rss types l2tpv3 end key_len 0 queues end / end
    

    get the message:

    Flow rule validated
    

    check the flow list:

    testpmd> flow list 0
    

    check the rule not exists in the list.

  2. create a rule for RSS type of MAC_IPV4_L2TPv3:

    testpmd> flow create 0 ingress pattern eth / ipv4 / l2tpv3oip / end actions rss types l2tpv3 end key_len 0 queues end / end
    testpmd> flow list 0
    

    check the rule exists in the list.

  3. send matched packets

    • MAC_IPV4_L2TPv3 packet:

      sendp([Ether(dst="00:11:22:33:44:55")/IP(src="192.168.0.3",dst="192.168.0.5", proto=115)/L2TP('\x00\x00\x00\x11')/Raw("x"*480)], iface="enp134s0f0")
      

      change the field [session_id], send a packet:

      sendp([Ether(dst="00:11:22:33:44:55")/IP(src="192.168.0.3",dst="192.168.0.4", proto=115)/L2TP('\x00\x00\x00\x12')/Raw("x"*480)], iface="enp134s0f0")
      

      check the hash value is different from the first packet. change other fields, send packets:

      sendp([Ether(dst="00:11:22:33:44:55")/IP(src="192.168.0.5",dst="192.168.0.7", proto=115)/L2TP('\x00\x00\x00\x11')/Raw("x"*480)], iface="enp134s0f0")
      

      check the hash values are the same as the first packet.

  4. destroy the rule:

    testpmd> flow destroy 0 rule 0
    testpmd> flow list 0
    

    check the rule not exists in the list. send the first packet in matched packets, check the hash value of this packet is different with before.

28.6. Test case: MAC_IPV6_L2TPv3

  1. validate a rule for RSS type of MAC_IPV6_L2TPv3:

    testpmd> flow validate 0 ingress pattern eth / ipv6 / l2tpv3oip / end actions rss types l2tpv3 end key_len 0 queues end / end
    

    get the message:

    Flow rule validated
    

    check the flow list:

    testpmd> flow list 0
    

    check the rule not exists in the list.

  2. create a rule for RSS type of MAC_IPV6_L2TPv3:

    testpmd> flow create 0 ingress pattern eth / ipv6 / l2tpv3oip / end actions rss types l2tpv3 end key_len 0 queues end / end
    testpmd> flow list 0
    

    check the rule exists in the list.

  3. send matched packets

    • MAC_IPV6_L2TPv3 packet:

      sendp([Ether(dst="00:11:22:33:44:55")/IPv6(src="CDCD:910A:2222:5498:8475:1111:3900:1536", dst="CDCD:910A:2222:5498:8475:1111:3900:2022", nh=115)/L2TP('\x00\x00\x00\x11')/Raw("x"*480)], iface="enp134s0f0")
      

      change the field [session_id], send a packet:

      sendp([Ether(dst="00:11:22:33:44:55")/IPv6(src="CDCD:910A:2222:5498:8475:1111:3900:1536", dst="CDCD:910A:2222:5498:8475:1111:3900:2022", nh=115)/L2TP('\x00\x00\x00\x12')/Raw("x"*480)], iface="enp134s0f0")
      

      check the hash value is different from the first packet. change other fields, send packets:

      sendp([Ether(dst="00:11:22:33:44:55")/IPv6(src="CDCD:910A:2222:5498:8475:1111:3900:1537", dst="CDCD:910A:2222:5498:8475:1111:3900:2023", nh=115)/L2TP('\x00\x00\x00\x11')/Raw("x"*480)], iface="enp134s0f0")
      

      check the hash values are the same as the first packet.

  4. destroy the rule:

    testpmd> flow destroy 0 rule 0
    testpmd> flow list 0
    

    check the rule not exists in the list. send the first packet in matched packets, check the hash value of this packet is different with before.

28.7. Test case: MAC_IPV4_ESP

  1. validate a rule for RSS type of MAC_IPV4_ESP:

    testpmd> flow validate 0 ingress pattern eth / ipv4 / esp / end actions rss types esp end key_len 0 queues end / end
    

    get the message:

    Flow rule validated
    

    check the flow list:

    testpmd> flow list 0
    

    check the rule not exists in the list.

  2. create a rule for RSS type of MAC_IPV4_ESP:

    testpmd> flow create 0 ingress pattern eth / ipv4 / esp / end actions rss types esp end key_len 0 queues end / end
    testpmd> flow list 0
    

    check the rule exists in the list

  3. send matched packets

    • MAC_IPV4_ESP packet:

      sendp([Ether(dst="00:11:22:33:44:55")/IP(src="192.168.0.3",dst="192.168.0.5",proto=50)/ESP(spi=11)/Raw("x"*480)], iface="enp134s0f0")
      

      change the field [spi], send a packet:

      sendp([Ether(dst="00:11:22:33:44:55")/IP(src="192.168.0.3",dst="192.168.0.5",proto=50)/ESP(spi=12)/Raw("x"*480)], iface="enp134s0f0")
      

      check the hash value is different from the first packet. change other fields, send packets:

      sendp([Ether(dst="00:11:22:33:44:55")/IP(src="192.168.0.4",dst="192.168.0.7",proto=50)/ESP(spi=11)/Raw("x"*480)], iface="enp134s0f0")
      

    check the hash values are the same as the first packet.

  4. destroy the rule:

    testpmd> flow destroy 0 rule 0
    testpmd> flow list 0
    

    check the rule not exists in the list. send the first packet in matched packets, check the hash value of this packet is different with before.

28.8. Test case: MAC_IPV4_UDP_ESP

  1. validate a rule for RSS type of MAC_IPV4_UDP_ESP:

    testpmd> flow validate 0 ingress pattern eth / ipv4 / udp / esp / end actions rss types esp end key_len 0 queues end / end
    

    get the message:

    Flow rule validated
    

    check the flow list:

    testpmd> flow list 0
    

    check the rule not exists in the list.

  2. create a rule for RSS type of MAC_IPV4_UDP_ESP:

    testpmd> flow create 0 ingress pattern eth / ipv4 / udp / esp / end actions rss types esp end key_len 0 queues end / end
    testpmd> flow list 0
    

    check the rule exists in the list

  3. send matched packets

    • MAC_IPV4_UDP_ESP packet:

      sendp([Ether(dst="00:11:22:33:44:55")/IP(src="192.168.0.3",dst="192.168.0.5")/UDP(dport=4500)/ESP(spi=11)/Raw("x"*480)], iface="enp134s0f0")
      

      change the field [spi], send a packet:

      sendp([Ether(dst="00:11:22:33:44:55")/IP(src="192.168.0.3",dst="192.168.0.5")/UDP(dport=4500)/ESP(spi=12)/Raw("x"*480)], iface="enp134s0f0")
      

      check the hash value is different from the first packet. change other fields, send packets:

      sendp([Ether(dst="00:11:22:33:44:55")/IP(src="192.168.0.4",dst="192.168.0.7")/UDP(dport=4500)/ESP(spi=11)/Raw("x"*480)], iface="enp134s0f0")
      

      check the hash values are the same as the first packet.

  4. destroy the rule:

    testpmd> flow destroy 0 rule 0
    testpmd> flow list 0
    

    check the rule not exists in the list. send the first packet in matched packets, check the hash value of this packet is different with before.

28.9. Test case: MAC_IPV6_ESP

  1. validate a rule for RSS type of MAC_IPV6_ESP:

    testpmd> flow validate 0 ingress pattern eth / ipv6 / esp / end actions rss types esp end key_len 0 queues end / end
    

    get the message:

    Flow rule validated
    

    check the flow list:

    testpmd> flow list 0
    

    check the rule not exists in the list.

  2. create a rule for RSS type of MAC_IPV6_ESP:

    testpmd> flow create 0 ingress pattern eth / ipv6 / esp / end actions rss types esp end key_len 0 queues end / end
    testpmd> flow list 0
    

    check the rule exists in the list

  3. send matched packets

    • MAC_IPV6_ESP packet:

      sendp([Ether(dst="00:11:22:33:44:55")/IPv6(src="CDCD:910A:2222:5498:8475:1111:3900:1536", dst="CDCD:910A:2222:5498:8475:1111:3900:2022", nh=50)/ESP(spi=11)/Raw("x"*480)], iface="enp134s0f0")
      

      change the field [spi], send a packet:

      sendp([Ether(dst="00:11:22:33:44:55")/IPv6(src="CDCD:910A:2222:5498:8475:1111:3900:1536", dst="CDCD:910A:2222:5498:8475:1111:3900:2022", nh=50)/ESP(spi=12)/Raw("x"*480)], iface="enp134s0f0")
      

      check the hash value is different from the first packet. change other fields, send packets:

      sendp([Ether(dst="00:11:22:33:44:55")/IPv6(src="CDCD:910A:2222:5498:8475:1111:3900:1537", dst="CDCD:910A:2222:5498:8475:1111:3900:2023", nh=50)/ESP(spi=11)/Raw("x"*480)], iface="enp134s0f0")
      

      check the hash values are the same as the first packet.

  4. destroy the rule:

    testpmd> flow destroy 0 rule 0
    testpmd> flow list 0
    

    check the rule not exists in the list. send the first packet in matched packets, check the hash value of this packet is different with before.

28.10. Test case: MAC_IPV6_UDP_ESP

  1. validate a rule for RSS type of MAC_IPV6_UDP_ESP:

    testpmd> flow validate 0 ingress pattern eth / ipv6 / udp / esp / end actions rss types esp end key_len 0 queues end / end
    

    get the message:

    Flow rule validated
    

    check the flow list:

    testpmd> flow list 0
    

    check the rule not exists in the list.

  2. create a rule for RSS type of MAC_IPV6_UDP_ESP:

    testpmd> flow create 0 ingress pattern eth / ipv6 / udp / esp / end actions rss types esp end key_len 0 queues end / end
    testpmd> flow list 0
    

    check the rule exists in the list

  3. send matched packets

    • MAC_IPV6_UDP_ESP packet:

      sendp([Ether(dst="00:11:22:33:44:55")/IPv6(src="CDCD:910A:2222:5498:8475:1111:3900:1536", dst="CDCD:910A:2222:5498:8475:1111:3900:2022")/UDP(dport=4500)/ESP(spi=11)/Raw("x"*480)], iface="enp134s0f0")
      

      change the field [spi], send a packet:

      sendp([Ether(dst="00:11:22:33:44:55")/IPv6(src="CDCD:910A:2222:5498:8475:1111:3900:1536", dst="CDCD:910A:2222:5498:8475:1111:3900:2022")/UDP(dport=4500)/ESP(spi=12)/Raw("x"*480)], iface="enp134s0f0")
      

      check the hash value is different from the first packet. change other fields, send packets:

      sendp([Ether(dst="00:11:22:33:44:55")/IPv6(src="CDCD:910A:2222:5498:8475:1111:3900:1537", dst="CDCD:910A:2222:5498:8475:1111:3900:2023")/UDP(dport=4500)/ESP(spi=11)/Raw("x"*480)], iface="enp134s0f0")
      

      check the hash values are the same as the first packet.

  4. destroy the rule:

    testpmd> flow destroy 0 rule 0
    testpmd> flow list 0
    

    check the rule not exists in the list. send the first packet in matched packets, check the hash value of this packet is different with before.

28.11. Test case: MAC_IPV4_AH

  1. validate a rule for RSS type of MAC_IPV4_AH:

    testpmd> flow validate 0 ingress pattern eth / ipv4 / ah / end actions rss types ah end key_len 0 queues end / end
    

    get the message:

    Flow rule validated
    

    check the flow list:

    testpmd> flow list 0
    

    check the rule not exists in the list.

  2. create a rule for RSS type of MAC_IPV4_AH:

    testpmd> flow create 0 ingress pattern eth / ipv4 / ah / end actions rss types ah end key_len 0 queues end / end
    testpmd> flow list 0
    

    check the rule exists in the list.

  3. send matched packets

    • MAC_IPV4_AH packet:

      sendp([Ether(dst="00:11:22:33:44:55")/IP(src="192.168.0.3",dst="192.168.0.5",proto=51)/AH(spi=11)/Raw("x"*480)], iface="enp134s0f0")
      

      change the field [spi], send a packet:

      sendp([Ether(dst="00:11:22:33:44:55")/IP(src="192.168.0.3",dst="192.168.0.5",proto=51)/AH(spi=12)/Raw("x"*480)], iface="enp134s0f0")
      

      check the hash value is different from the first packet. change other fields, send packets:

      sendp([Ether(dst="00:11:22:33:44:55")/IP(src="192.168.0.4",dst="192.168.0.8",proto=51)/AH(spi=11)/Raw("x"*480)], iface="enp134s0f0")
      

      check the hash values are the same as the first packet.

  4. destroy the rule:

    testpmd> flow destroy 0 rule 0
    testpmd> flow list 0
    

    check the rule not exists in the list. send the first packet in matched packets, check the hash value of this packet is different with before.

28.12. Test case: MAC_IPV6_AH

  1. validate a rule for RSS type of MAC_IPV6_AH:

    testpmd> flow validate 0 ingress pattern eth / ipv6 / ah / end actions rss types ah end key_len 0 queues end / end
    

    get the message:

    Flow rule validated
    

    check the flow list:

    testpmd> flow list 0
    

    check the rule not exists in the list.

  2. create a rule for RSS type of MAC_IPV6_AH:

    testpmd> flow create 0 ingress pattern eth / ipv6 / ah / end actions rss types ah end key_len 0 queues end / end
    testpmd> flow list 0
    

    check the rule exists in the list.

  3. send matched packets

    • MAC_IPV6_AH packet:

      sendp([Ether(dst="00:11:22:33:44:55")/IPv6(src="CDCD:910A:2222:5498:8475:1111:3900:1536", dst="CDCD:910A:2222:5498:8475:1111:3900:2022", nh=51)/AH(spi=11)/Raw("x"*480)], iface="enp134s0f0")
      

      change the field [spi], send a packet:

      sendp([Ether(dst="00:11:22:33:44:55")/IPv6(src="CDCD:910A:2222:5498:8475:1111:3900:1536", dst="CDCD:910A:2222:5498:8475:1111:3900:2022", nh=51)/AH(spi=12)/Raw("x"*480)], iface="enp134s0f0")
      

      check the hash value is different from the first packet. change other fields, send packets:

      sendp([Ether(dst="00:11:22:33:44:55")/IPv6(src="CDCD:910A:2222:5498:8475:1111:3900:1537", dst="CDCD:910A:2222:5498:8475:1111:3900:2023", nh=51)/AH(spi=11)/Raw("x"*480)], iface="enp134s0f0")
      

      check the hash values are the same as the first packet.

  4. destroy the rule:

    testpmd> flow destroy 0 rule 0
    testpmd> flow list 0
    

    check the rule not exists in the list. send the first packet in matched packets, check the hash value of this packet is different with before.

28.13. Test case: MAC_VLAN_IPV4_PAY

  1. validate a rule for RSS type of MAC_VLAN_IPV4_PAY:

    testpmd> flow validate 0 ingress pattern eth / vlan / ipv4 / end actions rss types c-vlan end key_len 0 queues end / end
    

    get the message:

    Flow rule validated
    

    check the flow list:

    testpmd> flow list 0
    

    check the rule not exists in the list.

  2. create a rule for RSS type of MAC_VLAN_IPV4_PAY:

    testpmd> flow create 0 ingress pattern eth / vlan / ipv4 / end actions rss types c-vlan end key_len 0 queues end / end
    testpmd> flow list 0
    

    check the rule exists in the list.

  3. send matched packets

    • MAC_VLAN_IPV4_PAY packet:

      sendp([Ether(src="10:22:33:44:55:66", dst="00:11:22:33:44:55",type=0x8100)/Dot1Q(vlan=1,type=0x0800)/IP(src="192.168.1.1", dst="192.168.1.2")/Raw("x" * 80)],iface="enp134s0f0",count=1)
      

      change the field [VLAN ID], send packets:

      sendp([Ether(src="10:22:33:44:55:66", dst="00:11:22:33:44:55",type=0x8100)/Dot1Q(vlan=2,type=0x0800)/IP(src="192.168.1.1", dst="192.168.1.2")/Raw("x" * 80)],iface="enp134s0f0",count=1)
      

      check the hash value is different from the first packet. change other fields, send packets:

      sendp([Ether(src="10:22:33:44:55:99", dst="00:11:22:33:44:55",type=0x8100)/Dot1Q(vlan=1,type=0x0800)/IP(src="192.168.1.3", dst="192.168.1.4")/Raw("x" * 80)],iface="enp134s0f0",count=1)
      

      check the hash values are the same as the first packet.

  4. destroy the rule:

    testpmd> flow destroy 0 rule 0
    testpmd> flow list 0
    

    check the rule not exists. send the first packet in matched packets, check the hash value of this packet is different with before.

28.14. Test case: MAC_VLAN_IPV4_UDP_PAY

  1. validate a rule for RSS type of MAC_VLAN_IPV4_UDP_PAY:

    testpmd> flow validate 0 ingress pattern eth / vlan / ipv4 / udp / end actions rss types c-vlan end key_len 0 queues end / end
    

    get the message:

    Flow rule validated
    

    check the flow list:

    testpmd> flow list 0
    

    check the rule not exists in the list.

  2. create a rule for RSS type of MAC_VLAN_IPV4_UDP_PAY:

    testpmd> flow create 0 ingress pattern eth / vlan / ipv4 / udp / end actions rss types c-vlan end key_len 0 queues end / end
    testpmd> flow list 0
    

    check the rule exists in the list.

  3. send matched packets

    • MAC_VLAN_IPV4_UDP_PAY packet:

      sendp([Ether(src="10:22:33:44:55:66", dst="00:11:22:33:44:55",type=0x8100)/Dot1Q(vlan=1,type=0x0800)/IP(src="192.168.1.1", dst="192.168.1.2")/UDP(sport=25,dport=23)/Raw("x" * 80)],iface="enp134s0f0",count=1)
      

      change the field [VLAN ID], send packets:

      sendp([Ether(src="10:22:33:44:55:66", dst="00:11:22:33:44:55",type=0x8100)/Dot1Q(vlan=2,type=0x0800)/IP(src="192.168.1.1", dst="192.168.1.2")/UDP(sport=25,dport=23)/Raw("x" * 80)],iface="enp134s0f0",count=1)
      

      check the hash values are different from the first packet. change other fields, send packets:

      sendp([Ether(src="10:22:33:44:55:99", dst="00:11:22:33:44:55",type=0x8100)/Dot1Q(vlan=1,type=0x0800)/IP(src="192.168.1.3", dst="192.168.1.4")/UDP(sport=19,dport=99)/Raw("x" * 80)],iface="enp134s0f0",count=1)
      

      check the hash values are the same as as the first packet.

  4. destroy the rule:

    testpmd> flow destroy 0 rule 0
    testpmd> flow list 0
    

    check the rule not exists. send the first packet in matched packets, check the hash value of this packet is different with before.

28.15. Test case: MAC_VLAN_IPV4_TCP_PAY

  1. validate a rule for RSS type of MAC_VLAN_IPV4_TCP_PAY:

    testpmd> flow validate 0 ingress pattern eth / vlan / ipv4 / tcp / end actions rss types c-vlan end key_len 0 queues end / end
    

    get the message:

    Flow rule validated
    

    check the flow list:

    testpmd> flow list 0
    

    check the rule not exists in the list.

  2. create a rule for RSS type of MAC_VLAN_IPV4_TCP_PAY:

    testpmd> flow create 0 ingress pattern eth / vlan / ipv4 / tcp / end actions rss types c-vlan end key_len 0 queues end / end
    testpmd> flow list 0
    

    check the rule exists in the list.

  3. send matched packets

    • MAC_VLAN_IPV4_TCP_PAY packet:

      sendp([Ether(src="10:22:33:44:55:66", dst="00:11:22:33:44:55",type=0x8100)/Dot1Q(vlan=1,type=0x0800)/IP(src="192.168.1.1", dst="192.168.1.2")/TCP(sport=25,dport=23)/Raw("x" * 80)],iface="enp134s0f0",count=1)
      

      change the field [VLAN ID], send packets:

      sendp([Ether(src="10:22:33:44:55:66", dst="00:11:22:33:44:55",type=0x8100)/Dot1Q(vlan=2,type=0x0800)/IP(src="192.168.1.1", dst="192.168.1.2")/TCP(sport=25,dport=23)/Raw("x" * 80)],iface="enp134s0f0",count=1)
      

      check the hash values are different from the first packet. change other fields, send packets:

      sendp([Ether(src="10:22:33:44:55:99", dst="00:11:22:33:44:55",type=0x8100)/Dot1Q(vlan=1,type=0x0800)/IP(src="192.168.1.3", dst="192.168.1.4")/TCP(sport=19,dport=99)/Raw("x" * 80)],iface="enp134s0f0",count=1)
      

      check the hash values are the same as as the first packet.

  4. destroy the rule:

    testpmd> flow destroy 0 rule 0
    testpmd> flow list 0
    

    check the rule not exists. send the first packet in matched packets, check the hash value of this packet is different with before.

28.16. Test case: MAC_VLAN_IPV4_SCTP_PAY

  1. validate a rule for RSS type of MAC_VLAN_IPV4_SCTP_PAY:

    testpmd> flow validate 0 ingress pattern eth / vlan / ipv4 / sctp / end actions rss types c-vlan end key_len 0 queues end / end
    

    get the message:

    Flow rule validated
    

    check the flow list:

    testpmd> flow list 0
    

    check the rule not exists in the list.

  2. create a rule for RSS type of MAC_VLAN_IPV4_SCTP_PAY:

    testpmd> flow create 0 ingress pattern eth / vlan / ipv4 / sctp / end actions rss types c-vlan end key_len 0 queues end / end
    testpmd> flow list 0
    

    check the rule exists in the list.

  3. send matched packets

    • MAC_VLAN_IPV4_SCTP_PAY packet:

      sendp([Ether(src="10:22:33:44:55:66", dst="00:11:22:33:44:55",type=0x8100)/Dot1Q(vlan=1,type=0x0800)/IP(src="192.168.1.1", dst="192.168.1.2")/SCTP(sport=25,dport=23)/Raw("x" * 80)],iface="enp134s0f0",count=1)
      

      change the field [VLAN ID], send packets:

      sendp([Ether(src="10:22:33:44:55:66", dst="00:11:22:33:44:55",type=0x8100)/Dot1Q(vlan=2,type=0x0800)/IP(src="192.168.1.1", dst="192.168.1.2")/SCTP(sport=25,dport=23)/Raw("x" * 80)],iface="enp134s0f0",count=1)
      

      check the hash values are different from the first packet. change other fields, send packets:

      sendp([Ether(src="10:22:33:44:55:99", dst="00:11:22:33:44:55",type=0x8100)/Dot1Q(vlan=1,type=0x0800)/IP(src="192.168.1.3", dst="192.168.1.5")/SCTP(sport=19,dport=99)/Raw("x" * 80)],iface="enp134s0f0",count=1)
      

      check the hash values are the same as as the first packet.

  4. destroy the rule:

    testpmd> flow destroy 0 rule 0
    testpmd> flow list 0
    

    check the rule not exists. send the first packet in matched packets, check the hash value of this packet is different with before.

28.17. Test case: MAC_VLAN_IPV6_PAY

  1. validate a rule for RSS type of MAC_VLAN_IPV6_PAY:

    testpmd> flow validate 0 ingress pattern eth / vlan / ipv6 / end actions rss types c-vlan end key_len 0 queues end / end
    

    get the message:

    Flow rule validated
    

    check the flow list:

    testpmd> flow list 0
    

    check the rule not exists in the list.

  2. create a rule for RSS type of MAC_VLAN_IPV6_PAY:

    testpmd> flow create 0 ingress pattern eth / vlan / ipv6 / end actions rss types c-vlan end key_len 0 queues end / end
    testpmd> flow list 0
    

    check the rule exists in the list.

  3. send matched packets

    • MAC_VLAN_IPV6_PAY packet:

      sendp([Ether(src="10:22:33:44:55:66", dst="00:11:22:33:44:55",type=0x8100)/Dot1Q(vlan=1,type=0x86dd)/IPv6(src="CDCD:910A:2222:5498:8475:1111:3900:1536", dst="CDCD:910A:2222:5498:8475:1111:3900:2022")/Raw("x" * 80)],iface="enp134s0f0",count=1)
      

      change the field [VLAN ID], send packets:

      sendp([Ether(src="10:22:33:44:55:66", dst="00:11:22:33:44:55",type=0x8100)/Dot1Q(vlan=2,type=0x86dd)/IPv6(src="CDCD:910A:2222:5498:8475:1111:3900:1536", dst="CDCD:910A:2222:5498:8475:1111:3900:2022")/Raw("x" * 80)],iface="enp134s0f0",count=1)
      

      check the hash values are different from the first packet. change other fields, send packets:

      sendp([Ether(src="10:22:33:44:55:99", dst="00:11:22:33:44:55",type=0x8100)/Dot1Q(vlan=1,type=0x86dd)/IPv6(src="CDCD:910A:2222:5498:8475:1111:3900:1537", dst="CDCD:910A:2222:5498:8475:1111:3900:2023")/Raw("y" * 80)],iface="enp134s0f0",count=1)
      

    check the hash values are the same as the first packet.

  4. destroy the rule:

    testpmd> flow destroy 0 rule 0
    testpmd> flow list 0
    

    check the rule not exists. send the first packet in matched packets, check the hash value of this packet is different with before.

28.18. Test case: MAC_VLAN_IPV6_UDP_PAY

  1. validate a rule for RSS type of MAC_VLAN_IPV6_UDP_PAY:

    testpmd> flow validate 0 ingress pattern eth / vlan / ipv6 / udp / end actions rss types c-vlan end key_len 0 queues end / end
    

    get the message:

    Flow rule validated
    

    check the flow list:

    testpmd> flow list 0
    

    check the rule not exists in the list.

  2. create a rule for RSS type of MAC_VLAN_IPV6_UDP_PAY:

    testpmd> flow create 0 ingress pattern eth / vlan / ipv6 / udp / end actions rss types c-vlan end key_len 0 queues end / end
    testpmd> flow list 0
    

    check the rule exists in the list.

  3. send matched packets

    • MAC_VLAN_IPV6_UDP_PAY packet:

      sendp([Ether(src="10:22:33:44:55:66", dst="00:11:22:33:44:55",type=0x8100)/Dot1Q(vlan=1,type=0x86dd)/IPv6(src="CDCD:910A:2222:5498:8475:1111:3900:1536", dst="CDCD:910A:2222:5498:8475:1111:3900:2022")/UDP(sport=25,dport=23)/Raw("x" * 80)],iface="enp134s0f0",count=1)
      

      change the field [VLAN ID], send packets:

      sendp([Ether(src="10:22:33:44:55:66", dst="00:11:22:33:44:55",type=0x8100)/Dot1Q(vlan=2,type=0x86dd)/IPv6(src="CDCD:910A:2222:5498:8475:1111:3900:1536", dst="CDCD:910A:2222:5498:8475:1111:3900:2022")/UDP(sport=25,dport=23)/Raw("x" * 80)],iface="enp134s0f0",count=1)
      

      check the hash values are different from the first packet. change other fields, send packets:

      sendp([Ether(src="10:22:33:44:55:99", dst="00:11:22:33:44:55",type=0x8100)/Dot1Q(vlan=1,type=0x86dd)/IPv6(src="CDCD:910A:2222:5498:8475:1111:3900:1537", dst="CDCD:910A:2222:5498:8475:1111:3900:2023")/UDP(sport=23,dport=99)/Raw("x" * 80)],iface="enp134s0f0",count=1)
      

      check the hash values are the same as the first packet.

  4. destroy the rule:

    testpmd> flow destroy 0 rule 0
    testpmd> flow list 0
    

    check the rule not exists. send the first packet in matched packets, check the hash value of this packet is different with before.

28.19. Test case: MAC_VLAN_IPV6_TCP_PAY

  1. validate a rule for RSS type of MAC_VLAN_IPV6_TCP_PAY:

    testpmd> flow validate 0 ingress pattern eth / vlan / ipv6 / tcp / end actions rss types c-vlan end key_len 0 queues end / end
    

    get the message:

    Flow rule validated
    

    check the flow list:

    testpmd> flow list 0
    

    check the rule not exists in the list.

  2. create a rule for RSS type of MAC_VLAN_IPV6_TCP_PAY:

    testpmd> flow create 0 ingress pattern eth / vlan / ipv6 / tcp / end actions rss types c-vlan end key_len 0 queues end / end
    testpmd> flow list 0
    

    check the rule exists in the list.

  3. send matched packets

    • MAC_VLAN_IPV6_TCP_PAY packet:

      sendp([Ether(src="10:22:33:44:55:66", dst="00:11:22:33:44:55",type=0x8100)/Dot1Q(vlan=1,type=0x86dd)/IPv6(src="CDCD:910A:2222:5498:8475:1111:3900:1536", dst="CDCD:910A:2222:5498:8475:1111:3900:2022")/TCP(sport=25,dport=23)/Raw("x" * 80)],iface="enp134s0f0",count=1)
      

      change the field [VLAN ID], send packets:

      sendp([Ether(src="10:22:33:44:55:66", dst="00:11:22:33:44:55",type=0x8100)/Dot1Q(vlan=2,type=0x86dd)/IPv6(src="CDCD:910A:2222:5498:8475:1111:3900:1536", dst="CDCD:910A:2222:5498:8475:1111:3900:2022")/TCP(sport=25,dport=23)/Raw("x" * 80)],iface="enp134s0f0",count=1)
      

      check the hash values are different from the first packet. change other fields, send packets:

      sendp([Ether(src="10:22:33:44:55:99", dst="00:11:22:33:44:55",type=0x8100)/Dot1Q(vlan=1,type=0x86dd)/IPv6(src="CDCD:910A:2222:5498:8475:1111:3900:1537", dst="CDCD:910A:2222:5498:8475:1111:3900:2023")/TCP(sport=19,dport=99)/Raw("x" * 80)],iface="enp134s0f0",count=1)
      

      check the hash values are the same as the first packet.

  4. destroy the rule:

    testpmd> flow destroy 0 rule 0
    testpmd> flow list 0
    

    check the rule not exists. send the first packet in matched packets, check the hash value of this packet is different with before.

28.20. Test case: MAC_VLAN_IPV6_SCTP_PAY

  1. validate a rule for RSS type of MAC_VLAN_IPV6_SCTP_PAY:

    testpmd> flow validate 0 ingress pattern eth / vlan / ipv6 / sctp / end actions rss types c-vlan end key_len 0 queues end / end
    

    get the message:

    Flow rule validated
    

    check the flow list:

    testpmd> flow list 0
    

    check the rule not exists in the list.

  2. create a rule for RSS type of MAC_VLAN_IPV6_SCTP_PAY:

    testpmd> flow create 0 ingress pattern eth / vlan / ipv6 / sctp / end actions rss types c-vlan end key_len 0 queues end / end
    testpmd> flow list 0
    

    check the rule exists in the list.

  3. send matched packets

    • MAC_VLAN_IPV6_SCTP_PAY packet:

      sendp([Ether(src="10:22:33:44:55:66", dst="00:11:22:33:44:55",type=0x8100)/Dot1Q(vlan=1,type=0x86dd)/IPv6(src="CDCD:910A:2222:5498:8475:1111:3900:1536", dst="CDCD:910A:2222:5498:8475:1111:3900:2022")/SCTP(sport=25,dport=23)/Raw("x" * 80)],iface="enp134s0f0",count=1)
      

      change the field [VLAN ID], send packets:

      sendp([Ether(src="10:22:33:44:55:66", dst="00:11:22:33:44:55",type=0x8100)/Dot1Q(vlan=2,type=0x86dd)/IPv6(src="CDCD:910A:2222:5498:8475:1111:3900:1536", dst="CDCD:910A:2222:5498:8475:1111:3900:2022")/SCTP(sport=25,dport=23)/Raw("x" * 80)],iface="enp134s0f0",count=1)
      

      check the hash values are different from the first packet. change other fields, send packets:

      sendp([Ether(src="10:22:33:44:55:99", dst="00:11:22:33:44:55",type=0x8100)/Dot1Q(vlan=1,type=0x86dd)/IPv6(src="CDCD:910A:2222:5498:8475:1111:3900:1537", dst="CDCD:910A:2222:5498:8475:1111:3900:2023")/SCTP(sport=25,dport=99)/Raw("x" * 80)],iface="enp134s0f0",count=1)
      

      check the hash values are the same as the first packet.

  4. destroy the rule:

    testpmd> flow destroy 0 rule 0
    testpmd> flow list 0
    

    check the rule not exists. send the first packet in matched packets, check the hash value of this packet is different with before.

28.21. Test case: negative cases

28.21.1. Subcase 1: not support pattern and input set

  1. validate a rule with wrong input set:

    testpmd> flow validate 0 ingress pattern eth / pppoes / ipv4 / end actions rss types l2-src-only l2-dst-only end key_len 0 queues end / end
    

    get the error message:

    Invalid input set: Invalid argument
    

    create a rule with wrong hash input set:

    testpmd> flow create 0 ingress pattern eth / pppoes / ipv4 / end actions rss types l2-src-only l2-dst-only end key_len 0 queues end / end
    

    Failed to create flow, report error message:

    Invalid input set: Invalid argument
    
  2. validate a rule with wrong hash type:

    testpmd> flow validate 0 ingress pattern eth / pppoes / ipv4 / udp / end actions rss types ipv4-tcp end key_len 0 queues end / end
    

    get the error message:

    Invalid input set: Invalid argument
    

    create a rule with wrong hash type:

    testpmd> flow create 0 ingress pattern eth / pppoes / ipv4 / udp / end actions rss types ipv4-tcp end key_len 0 queues end / end
    

    Failed to create flow, report error message:

    Invalid input set: Invalid argument
    
  3. validate a rule with wrong symmetric hash input set:

    testpmd> flow validate 0 ingress pattern eth / pppoes / ipv4 / udp / end actions rss func symmetric_toeplitz types ipv4-udp l3-src-only end key_len 0 queues end / end
    

    get the error message:

    Invalid input set: Invalid argument
    

    create a rule with wrong symmetric hash input set:

    testpmd> flow create 0 ingress pattern eth / pppoes / ipv4 / udp / end actions rss func symmetric_toeplitz types ipv4-udp l3-src-only end key_len 0 queues end / end
    

    Failed to create flow, report error message:

    Invalid input set: Invalid argument
    
  4. check the rule list:

    testpmd> flow list 0
    
there is no listed.

28.21.2. Subcase 2: void action

  1. create a rule with void action:

    testpmd> flow create 0 ingress pattern eth / ipv4 / udp / pfcp / end actions end
    

    Failed to create flow, report message:

    NULL action.: Invalid argument
    
  2. check the rule list:

    testpmd> flow list 0
    

    there is no rule listed.

28.21.3. Subcase 3: delete a non-existing rule

  1. show the rule list of port 0:

    testpmd> flow list 0
    

    There is no rule listed.

  2. destroy rule 0 of port 0:

    testpmd> flow destroy 0 rule 0
    

    There is no error message reported.

  3. flush rules of port 0:

    testpmd> flow flush 0
    

    There is no error message reported.

28.21.4. Subcase 4: unsupported pattern with OS default package

  1. load OS default package and launch testpmd as step 3-5 in Prerequisites.

  2. create unsupported patterns in OS default package:

    testpmd> flow create 0 ingress pattern eth / ipv4 / udp / pfcp / end actions rss types pfcp end key_len 0 queues end / end
    testpmd> flow create 0 ingress pattern eth / ipv4 / l2tpv3oip / end actions rss types l2tpv3 end key_len 0 queues end / end
    testpmd> flow create 0 ingress pattern eth / ipv4 / esp / end actions rss types esp end key_len 0 queues end / end
    testpmd> flow create 0 ingress pattern eth / ipv4 / ah / end actions rss types ah end key_len 0 queues end / end
    
  3. check the rule list:

    testpmd> flow list 0
    

    there is no rule listed.

28.21.5. Subcase 5: invalid port

  1. create a rule with invalid port:

    testpmd> flow create 1 ingress pattern eth / ipv4 / udp / pfcp / end actions rss types pfcp end key_len 0 queues end / end
    

    Failed to create flow, report message:

    No such device: No such device
    
  2. check the rule list on port 0:

    testpmd> flow list 0
    

    there is no rule listed. check on port 1:

    testpmd> flow list 1
    

    get the error message:

    Invalid port 1