80. Rte_flow Priority Tests

80.1. Description

This document provides the plan for testing the Rte_flow Priority feature. this feature uses devargs as a hint to active flow priority or not.

This test plan is based on Intel E810 series ethernet cards. when priority is not active, flows are created on fdir then switch/ACL. when priority is active, flows are identified into 2 category: High priority as permission stage that maps to switch/ACL, Low priority as distribution stage that maps to fdir, a no destination high priority rule is not acceptable, since it may be overwritten by a low priority rule due to cvl FXP behavior.

Note: Since these tests are focus on priority, the patterns in tests are examples.

80.2. Prerequisites

Bind the pf to dpdk driver:

./usertools/dpdk-devbind.py -b vfio-pci af:00.0

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

80.3. Test Case: Setting Priority in Non-pipeline Mode

Priority is not active in non-pipeline mode. The default value of priority is 0 but it will be ignored.

Patterns in this case:
MAC_IPV4
  1. Start the testpmd application as follows:

    ./x86_64-native-linuxapp-gcc/app/testpmd -c 0xf -n 4 -w 0000:af:00.0 --log-level="ice,7" -- -i --txq=8 --rxq=8
    set fwd rxonly
    set verbose 1
    
  2. Create a rule with priority 0, Check the flow can be created but it will map to fdir filter:

    testpmd> flow create 0 priority 0 ingress pattern eth / ipv4 src is 192.168.0.2 dst is 192.168.0.3 tos is 4 / end actions queue index 2 / end
    ice_interrupt_handler(): OICR: MDD event
    ice_flow_create(): Succeeded to create (1) flow
    Flow rule #0 created
    
  3. Create a rule with priority 1, check the flow can not be created for the vallue of priority is 0 in non-pipeline mode:

    testpmd> flow create 0 priority 1 ingress pattern eth / ipv4 src is 192.168.0.2 dst is 192.168.0.3 tos is 4 / end actions queue index 2 / end
    ice_flow_create(): Failed to create flow
    Caught error type 4 (priority field): cause: 0x7ffe24e65738, Not support priority.: Invalid argument
    
  4. Start the testpmd application as follows:

    ./x86_64-native-linuxapp-gcc/app/testpmd -c 0xf -n 4 -w 0000:af:00.0,pipeline-mode-support=0 --log-level="ice,7" -- -i --txq=8 --rxq=8
    set fwd rxonly
    set verbose 1
    
  5. Create a rule with priority 0, Check the flow can be created but it will map to fdir filter:

    testpmd> flow create 0 priority 0 ingress pattern eth / ipv4 src is 192.168.0.2 dst is 192.168.0.3 tos is 4 / end actions queue index 2 / end
    ice_interrupt_handler(): OICR: MDD event
    ice_flow_create(): Succeeded to create (1) flow
    Flow rule #0 created
    
  6. Create a rule with priority 1, check the flow can not be created for the vallue of priority is 0 in non-pipeline mode:

    testpmd> flow create 0 priority 1 ingress pattern eth / ipv4 src is 192.168.0.2 dst is 192.168.0.3 tos is 4 / end actions queue index 2 / end
    ice_flow_create(): Failed to create flow
    Caught error type 4 (priority field): cause: 0x7ffe24e65738, Not support priority.: Invalid argument
    

80.4. Test Case: Create Flow Rules with Priority in Pipeline Mode

Priority is active in pipeline mode. Creating flow rules and setting priority 0/1 will map switch/fdir filter separately.

Patterns in this case:
MAC_IPV4_TCP MAC_IPV4_VXLAN_IPV4_UDP_PAY
  1. Start the testpmd application as follows:

    ./x86_64-native-linuxapp-gcc/app/testpmd -c 0xf -n 4 -w 0000:af:00.0,pipeline-mode-support=1 --log-level="ice,7" -- -i --txq=8 --rxq=8
    set fwd rxonly
    set verbose 1
    rx_vxlan_port add 4789 0
    
  2. Create switch filter rules:

    flow create 0 priority 0 ingress pattern eth / ipv4 src is 192.168.0.2 dst is 192.168.0.3 tos is 4 / tcp src is 25 dst is 23 / end actions queue index 1 / end
    
    flow create 0 priority 0 ingress pattern eth / ipv4 / udp / vxlan / eth / ipv4 src is 192.168.0.2 dst is 192.168.0.3 tos is 4 / udp src is 25 dst is 23 / end actions queue index 2 / end
    
  3. Create fdir filter rules:

    flow create 0 priority 1 ingress pattern eth / ipv4 src is 192.168.0.4 dst is 192.168.0.7 tos is 4 ttl is 20 / tcp src is 25 dst is 23 / end actions queue index 3 / end
    
    flow create 0 priority 1 ingress pattern eth / ipv4 / udp / vxlan / eth / ipv4 src is 192.168.0.4 dst is 192.168.0.7 / udp src is 25 dst is 23 / end actions queue index 4 / end
    
  4. Check flow list with commands “flow list 0”, all flows are created correctly:

    +-----+--------+--------+--------+-----------------------+
    |ID  | Group  | Prio   | Attr   | Rul                   |
    +=====+========+========+========+=======================+
    | 0   | 0      | 0     | i-     | ETH IPV4 TCP => QUEUE |
    +-----+--------+--------+--------+-----------------------+
    | 1       ...                                           |
    +-----+--------+--------+--------+-----------------------+
    | 2       ...                                           |
    +-----+--------+--------+--------+-----------------------+
    | 3       ...                                           |
    +-----+--------+--------+--------+-----------------------+
    
  5. Send packets according to the created rules in tester:

    sendp([Ether(dst="00:00:00:00:11:00",src="11:22:33:44:55:66")/IP(src="192.168.0.2",dst="192.168.0.3",tos=4)/TCP(sport=25,dport=23)/Raw('x'*80)],iface="enp134s0f0")
    sendp([Ether(dst="00:00:00:00:11:00",src="11:22:33:44:55:66")/IP()/UDP()/VXLAN()/Ether()/IP(src="192.168.0.2",dst="192.168.0.3",tos=4)/UDP(sport=25,dport=23)/Raw('x'*80)],iface="enp134s0f0")
    sendp([Ether(dst="00:00:00:00:11:00",src="11:22:33:44:55:66")/IP(src="192.168.0.4",dst="192.168.0.7",tos=4,ttl=20)/TCP(sport=25,dport=23)/Raw('x'*80)],iface="enp134s0f0")
    sendp([Ether(dst="00:00:00:00:11:00",src="11:22:33:44:55:66")/IP()/UDP()/VXLAN()/Ether()/IP(src="192.168.0.4 ",dst="192.168.0.7")/UDP(sport=25,dport=23)/Raw('x'*80)],iface="enp134s0f0")
    
  6. Check the packets are recieved in right queues by dut:

    testpmd> port 0/queue 1: received 1 packets
     src=11:22:33:44:55:66 - dst=00:00:00:00:11:00 - type=0x0800 - length=134 - nb_segs=1 - RSS hash=0x96803f93 - RSS queue=0x1 - hw ptype: L2_ETHER L3_IPV4_EXT_UNKNOWN L4_TCP  - sw ptype: L2_ETHER L3_IPV4 L4_TCP  - l2_len=14 - l3_len=20 - l4_len=20 - Receive queue=0x1
     ol_flags: PKT_RX_RSS_HASH PKT_RX_L4_CKSUM_GOOD PKT_RX_IP_CKSUM_GOOD PKT_RX_OUTER_L4_CKSUM_UNKNOWN
    ......
    

#. Create rules without priority, Check only patterns supported by switch can be created for the default priorty is 0. So the first flow can be created and the second flow can not be created:

testpmd> flow create 0 ingress pattern eth / ipv4 src is 192.168.0.3 dst is 192.168.0.1 tos is 5 / tcp src is 25 dst is 23 / end actions queue index 1 / end
ice_flow_create(): Succeeded to create (2) flow
Flow rule #1 created
testpmd>  flow create 0 ingress pattern eth / ipv4 src is 192.168.0.2 dst is 192.168.0.3 tos is 4 ttl is 20 / sctp src is 25 dst is 23 / end actions queue index 1 / end
ice_flow_create(): Failed to create flow
Caught error type 2 (flow rule (handle)): Invalid input pattern: Invalid argument

80.5. Test case: Create No Destination High Priority Flow Rule

A no destination high priority rule is not acceptable. Destination here means exact actions.

Patterns in this case:
MAC_IPV4_TCP
  1. Start the testpmd application as follows:

    ./x86_64-native-linuxapp-gcc/app/testpmd -c 0xf -n 4 -w 0000:af:00.0,pipeline-mode-support=1 --log-level="ice,7" -- -i --txq=8 --rxq=8
    set fwd rxonly
    set verbose 1
    
  2. Create a rule without exact actions, check the flows can not be created:

    testpmd> flow create 0 priority 0 ingress pattern eth / ipv4 src is 192.168.0.2 dst is 192.168.0.3 tos is 4 / tcp src is 25 dst is 23 / end actions / end
    Bad arguments
    testpmd> flow create 0 priority 0 ingress pattern eth / ipv4 src is 192.168.0.2 dst is 192.168.0.3 tos is 4 / tcp src is 25 dst is 23 / end
    Bad arguments
    

80.6. Test case: Create Flow Rules Only Supported by Fdir Filter with Priority 0

Creating a rule only supported by fdir filter with priority 0, it is not acceptable.

Patterns in this case:
MAC_IPV6_SCTP MAC_IPV4_SCTP
  1. Start the testpmd application as follows:

    ./x86_64-native-linuxapp-gcc/app/testpmd -c 0xf -n 4 -w 0000:af:00.0,pipeline-mode-support=1 --log-level="ice,7" -- -i --txq=8 --rxq=8
    set fwd rxonly
    set verbose 1
    
  2. Create rules, check the flows can not be created:

    testpmd> flow create 0 priority 0 ingress pattern eth / ipv6 src is 1111:2222:3333:4444:5555:6666:7777:8888 dst is 1111:2222:3333:4444:5555:6666:7777:9999 / sctp src is 25 dst is 23 / end actions queue index 1 / end
    ice_flow_create(): Failed to create flow
    Caught error type 2 (flow rule (handle)): Invalid input pattern: Invalid argument
    
    testpmd> flow create 0 priority 0 ingress pattern eth / ipv4 src is 192.168.0.2 dst is 192.168.0.3 tos is 4 ttl is 20 / sctp src is 25 dst is 23 / end actions queue index 1 / end
    ice_flow_create(): Failed to create flow
    Caught error type 2 (flow rule (handle)): Invalid input pattern: Invalid argument
    

80.7. Test case: Create flow rules only supported by switch filter with priority 1

Create a rule only supported by fdir switch with priority 1, it is not acceptable.

Patterns in this case:
MAC_IPV4_NVGRE_MAC_IPV4 MAC_IPV4_NVGRE_MAC_IPV4_UDP
  1. Start the testpmd application as follows:

    ./x86_64-native-linuxapp-gcc/app/testpmd -c 0xf -n 4 -w 0000:af:00.0,pipeline-mode-support=1 --log-level="ice,7" -- -i --txq=8 --rxq=8
    set fwd rxonly
    set verbose 1
    
  2. Create rules, check the flows can not be created:

    testpmd> flow create 0 priority 1 ingress pattern eth / ipv4 / nvgre / eth / ipv4 src is 192.168.0.2 dst is 192.168.0.3 tos is 4 / end actions queue index 3 / end
    ice_flow_create(): Failed to create flow
    Caught error type 13 (specific pattern item): cause: 0x7fffe65b8128, Unsupported pattern: Invalid argument
    
    testpmd> flow create 0 priority 1 ingress pattern eth / ipv4 / nvgre / eth / ipv4 src is 192.168.0.2 dst is 192.168.0.3 tos is 4 / udp src is 25 dst is 23 / end actions queue index 3 / end
    ice_flow_create(): Failed to create flow
    Caught error type 13 (specific pattern item): cause: 0x7fffe65b8128, Unsupported pattern: Invalid argument
    

80.8. Test case: Create flow rules with same parameter but differenet actions

It is acceptable to create same rules with differenet filter in pipeline mode. When fdir filter and switch filter has the same parameter rules, the flow will map to switch then fdir.

Patterns in this case:
MAC_IPV4_TCP
  1. Start the testpmd application as follows:

    ./x86_64-native-linuxapp-gcc/app/testpmd -c 0xf -n 4 -w 0000:af:00.0,pipeline-mode-support=1 --log-level="ice,7" -- -i --txq=8 --rxq=8
    set fwd rxonly
    set verbose 1
    
  2. Create switch rule then fdir rule with the same parameter, check two flows can be created:

    testpmd> flow create 0 priority 0 ingress pattern eth / ipv4 src is 192.168.0.2 dst is 192.168.0.3 tos is 4 / tcp src is 25 dst is 23 / end actions queue index 1 / end
    ice_flow_create(): Succeeded to create (2) flow
    Flow rule #0 created
    
    testpmd> flow create 0 priority 1 ingress pattern eth / ipv4 src is 192.168.0.2 dst is 192.168.0.3 tos is 4 / tcp src is 25 dst is 23 / end actions queue index 3 / end
    ice_interrupt_handler(): OICR: MDD event
    ice_flow_create(): Succeeded to create (1) flow
    Flow rule #1 created
    
  3. Tester send a pkt to dut:

    sendp([Ether(dst="00:00:00:00:11:00",src="11:22:33:44:55:66")/IP(src="192.168.0.2",dst="192.168.0.3",tos=4)/TCP(sport=25,dport=23)/Raw('x'*80)],iface="enp134s0f0")
    
  4. Check the packets are recieved by dut in queue 1:

    testpmd> port 0/queue 1: received 1 packets
    src=11:22:33:44:55:66 - dst=00:00:00:00:11:00 - type=0x0800 - length=134 - nb_segs=1 - RSS hash=0xf12811f1 - RSS queue=0x1 - hw ptype: L2_ETHER L3_IPV4_EXT_UNKNOWN L4_TCP  - sw ptype: L2_ETHER L3_IPV4 L4_TCP  - l2_len=14 - l3_len=20 - l4_len=20 - Receive queue=0x1
    ol_flags: PKT_RX_RSS_HASH PKT_RX_L4_CKSUM_GOOD PKT_RX_IP_CKSUM_GOOD PKT_RX_OUTER_L4_CKSUM_UNKNOWN
    
  5. Remove the switch rule:

    testpmd>flow destroy 0 rule 0
    
  6. Tester send a pkt to dut:

    sendp([Ether(dst="00:00:00:00:11:00",src="11:22:33:44:55:66")/IP(src="192.168.0.2",dst="192.168.0.3",tos=4)/TCP(sport=25,dport=23)/Raw('x'*80)],iface="enp134s0f0")
    
  7. Check the packets are recieved in queue 3:

    testpmd> port 0/queue 3: received 1 packets
    src=11:22:33:44:55:66 - dst=00:00:00:00:11:00 - type=0x0800 - length=134 - nb_segs=1 - RSS hash=0xf12811f1 - RSS queue=0x3 - hw ptype: L2_ETHER L3_IPV4_EXT_UNKNOWN L4_TCP  - sw ptype: L2_ETHER L3_IPV4 L4_TCP  - l2_len=14 - l3_len=20 - l4_len=20 - Receive queue=0x3
    ol_flags: PKT_RX_RSS_HASH PKT_RX_L4_CKSUM_GOOD PKT_RX_IP_CKSUM_GOOD PKT_RX_OUTER_L4_CKSUM_UNKNOWN
    
  8. Restart the testpmd application as follows:

    ./x86_64-native-linuxapp-gcc/app/testpmd -c 0xf -n 4 -w 0000:af:00.0, pipeline-mode-support=1 --log-level="ice,7" -- -i --txq=8 --rxq=8
    set fwd rxonly
    set verbose 1
    
  9. Create fdir rule then switch rule with the same parameter, check two flows can be created:

    testpmd> flow create 0 priority 1 ingress pattern eth / ipv4 src is 192.168.0.2 dst is 192.168.0.3 tos is 4 / tcp src is 25 dst is 23 / end actions queue index 3 / end
    ice_interrupt_handler(): OICR: MDD event
    ice_flow_create(): Succeeded to create (1) flow
    Flow rule #0 created
    

    testpmd> flow create 0 priority 0 ingress pattern eth / ipv4 src is 192.168.0.2 dst is 192.168.0.3 tos is 4 / tcp src is 25 dst is 23 / end actions queue index 1 / end ice_flow_create(): Succeeded to create (2) flow Flow rule #1 created

  10. Tester send a pkt to dut:

    sendp([Ether(dst="00:00:00:00:11:00",src="11:22:33:44:55:66")/IP(src="192.168.0.2",dst="192.168.0.3",tos=4)/TCP(sport=25,dport=23)/Raw('x'*80)],iface="enp134s0f0")
    
  11. Check the packets are recieved by dut in queue 1:

    testpmd> port 0/queue 1: received 1 packets
     src=11:22:33:44:55:66 - dst=00:00:00:00:11:00 - type=0x0800 - length=134 - nb_segs=1 - RSS hash=0xf12811f1 - RSS queue=0x1 - hw ptype: L2_ETHER L3_IPV4_EXT_UNKNOWN L4_TCP  - sw ptype: L2_ETHER L3_IPV4 L4_TCP  - l2_len=14 - l3_len=20 - l4_len=20 - Receive queue=0x1
     ol_flags: PKT_RX_RSS_HASH PKT_RX_L4_CKSUM_GOOD PKT_RX_IP_CKSUM_GOOD PKT_RX_OUTER_L4_CKSUM_UNKNOWN
    
  12. Remove the switch rule:

    testpmd>flow destroy 0 rule 1
    
  13. Tester send a pkt to dut:

    sendp([Ether(dst="00:00:00:00:11:00",src="11:22:33:44:55:66")/IP(src="192.168.0.2",dst="192.168.0.3",tos=4)/TCP(sport=25,dport=23)/Raw('x'*80)],iface="enp134s0f0")
    
  14. Check the packets are recieved in queue 3:

    testpmd> port 0/queue 3: received 1 packets
     src=11:22:33:44:55:66 - dst=00:00:00:00:11:00 - type=0x0800 - length=134 - nb_segs=1 - RSS hash=0xf12811f1 - RSS queue=0x3 - hw ptype: L2_ETHER L3_IPV4_EXT_UNKNOWN L4_TCP  - sw ptype: L2_ETHER L3_IPV4 L4_TCP  - l2_len=14 - l3_len=20 - l4_len=20 - Receive queue=0x3
     ol_flags: PKT_RX_RSS_HASH PKT_RX_L4_CKSUM_GOOD PKT_RX_IP_CKSUM_GOOD PKT_RX_OUTER_L4_CKSUM_UNKNOWN