271. flow classify¶
This document provides test plan for flow classify feature.
Flow Classify provides flow record information with some measured properties.
DPDK provides a Flow Classification library that provides the ability to classify an input packet by matching it against a set of Flow rules. The implementation supports counting of IPv4 5-tuple packets which match a particular Flow rule only.
example/flow_classify is the tool to call flow_classify lib for group of packets, just after receiving them or before transmitting them. It is intended as a demonstration of the basic components of a DPDK forwarding application which uses the Flow Classify library API’s.
DPDK technical doc refer to:
dpdk/doc/guides/sample_app_ug/flow_classify.rst
dpdk/doc/guides/prog_guide/flow_classify_lib.rst
271.1. Prerequisites¶
2xNICs (2 full duplex optical ports per NIC) Flow Classify should run on 2 pair link peer at least.
i40e driver nic: Ethernet Controller X710 for 10GbE SFP+ 1572 Ethernet Controller XXV710 for 25GbE SFP28 158b Ethernet Controller XL710 for 40GbE QSFP+ 1583
ixgbe driver nic: 82599ES 10-Gigabit SFI/SFP+ Network Connection 10fb
ice driver nic: Ethernet Controller E810-C for QSFP 1592 Ethernet Controller E810-XXV for SFP 159b Ethernet Controller E810-C for SFP 1593
271.2. HW configuration¶
link peer topology:
Tester DUT
.-------. .-------.
| port0 | <------------------> | port0 |
| port1 | <------------------> | port1 |
'-------' '-------'
271.3. Stream configuration¶
five valid streams(as examples/flow_classify/ipv4_rules_file.txt), three invalid streams are the streams beyond config file.
UDP_1:
Frame Data/Protocols: Ethernet 2 0800, IPv4,UDP/IP, Fixed 64.
IPv4 Header Page: Dest Address: 2.2.2.7 Src Address: 2.2.2.3
UDP Header: Src Port: 32 Dest Port: 33
Ether()/IP (proto='udp', src='2.2.2.3', dst='2.2.2.7')/UDP(sport=32, dport=33)/Raw()
UDP_2:
Frame Data/Protocols: Ethernet 2 0800, IPv4,UDP/IP, Fixed 64.
IPv4 Header Page: Dest Address: 9.9.9.7 Src Address: 9.9.9.3
UDP Header: Src Port: 32 Dest Port: 33
Ether()/IP (proto='udp', src='9.9.9.3', dst='9.9.9.7')/UDP(sport=32, dport=33)/Raw()
UDP_invalid:
Frame Data/Protocols: Ethernet 2 0800, IPv4,UDP/IP, Fixed 64.
IPv4 Header Page: Dest Address: 9.8.7.6 Src Address: 192.168.0.36
UDP Header: Src Port: 10 Dest Port: 11
Ether()/IP (proto='udp', src='9.8.7.6', dst='192.168.0.36')/UDP(sport=10, dport=11)/Raw()
TCP_1:
Frame Data/Protocols: Ethernet 2 0800, IPv4,TCP/IP, Fixed 64.
IPv4 Header Page: Dest Address: 9.9.9.7 Src Address: 9.9.9.3
TCP Header: Src Port: 32 Dest Port: 33
Ether()/IP (proto='tcp', src='9.9.9.3', dst='9.9.9.7')/TCP(sport=32, dport=33)/Raw()
TCP_2:
Frame Data/Protocols: Ethernet 2 0800, IPv4,TCP/IP, Fixed 64.
IPv4 Header Page: Dest Address: 9.9.8.7 Src Address: 9.9.8.3
TCP Header: Src Port: 32 Dest Port: 33
Ether()/IP (proto='tcp', src='9.9.8.3', dst='9.9.8.7')/TCP(sport=32, dport=33)/Raw()
TCP_invalid:
Frame Data/Protocols: Ethernet 2 0800, IPv4,TCP/IP, Fixed 64.
IPv4 Header Page: Dest Address: 9.8.7.6 Src Address: 192.168.0.36
TCP Header: Src Port: 10 Dest Port: 11
Ether()/IP (proto='tcp', src='9.8.7.6', dst='192.168.0.36')/TCP(sport=10, dport=11)/Raw()
SCTP_1:
Frame Data/Protocols: Ethernet 2 0800, IPv4, None, Fixed 256.
IPv4 Header Page: Dest Address: 2.3.4.5 Src Address: 6.7.8.9
SCTP Header: Src Port: 32 Dest Port: 33
Protocol: 132-SCTP
Ether()/IP (proto='sctp', src='6.7.8.9', dst='2.3.4.5')/SCTP(sport=32, dport=33)/Raw()
SCTP_invalid:
Frame Data/Protocols: Ethernet 2 0800, IPv4, None, Fixed 256.
IPv4 Header Page: Dest Address: 9.8.7.6 Src Address: 192.168.0.36
SCTP Header: Src Port: 10 Dest Port: 11
Protocol: 132-SCTP
Ether()/IP (proto='sctp', src='9.8.7.6', dst='192.168.0.36')/SCTP(sport=10, dport=11)/Raw()
271.4. Compilation:¶
steps:
CC=gcc meson -Denable_kmods=True -Dlibdir=lib --default-library=static <build_target>
ninja -C <build_target>
meson configure -Dexamples=flow_classify <build_target>
ninja -C <build_target>
Flow classify bin file under:
<build_target>/examples/dpdk-flow_classify
rule config file(default):
$DPDK_PATH/examples/flow_classify/ipv4_rules_file.txt
271.5. Test cases¶
The idea behind the testing process is to compare packet count sending by ixia packet generator with packet count filtered by flow_classify. Valid packets should be in flow_classify output and invalid packets should be ignored. The rules are configured in a txt file. Testing content includes single udp/tcp/sctp stream and multiple streams.
271.5.1. Test Case : check valid rule with udp stream¶
Send 32 packets of valid stream(as UDP_1 or UDP_2 in Stream configuration), then check the total received packets in flow_classify’s output message.
steps:
boot up flow_classify:
./dpdk-flow_classify -c 4 -n 4 -- --rule_ipv4=<rule config file>
send stream by packet generator(e.g. scapy or ixia):
scapy> sendp(UDP_1, iface='xxxxx', count=32)
check flow_classify output contain the following message:
rule[0] count=1 or rule[1] count=1
271.5.2. Test Case : check invalid rule with udp stream¶
Send 32 packets of invalid stream(as UDP_invalid in Stream configuration), then check flow_classify’s output message has no count message
steps:
boot up flow_classify:
./dpdk-flow_classify -c 4 -n 4 -- --rule_ipv4=<rule config file>
send stream by packet generator(e.g. scapy or ixia):
scapy> sendp(UDP_invalid, iface='xxxxx', count=32)
check flow_classify output has no message as “rule[xxx] count=xxx”, such as:
rule[0] count=1
271.5.3. Test Case : check valid rule with tcp stream¶
Send 32 packets of valid stream(as TCP_1 or TCP_2 in Stream configuration), then check the total received packets in flow_classify’s output message.
steps:
boot up flow_classify:
./dpdk-flow_classify -c 4 -n 4 -- --rule_ipv4=<rule config file>
send stream by packet generator(e.g. scapy or ixia):
scapy> sendp(TCP_1, iface='xxxxx', count=32)
check flow_classify output contain the following message:
rule[2] count=1 or rule[3] count=1
271.5.4. Test Case : check invalid rule with tcp stream¶
Send 32 packets of invalid stream(as TCP_invalid in Stream configuration), then check flow_classify’s output message has no count message.
steps:
boot up flow_classify:
./dpdk-flow_classify -c 4 -n 4 -- --rule_ipv4=<rule config file>
send stream by packet generator(e.g. scapy or ixia):
scapy> sendp(TCP_invalid, iface='xxxxx', count=32)
check flow_classify output has no message as “rule[xxx] count=xxx”, such as:
rule[2] count=1
271.5.5. Test Case : check valid rule with sctp stream¶
Send 32 packets of valid stream(as SCTP_1 in Stream configuration), then check the total received packets in flow_classify’s output message.
steps:
boot up flow_classify:
./dpdk-flow_classify -c 4 -n 4 -- --rule_ipv4=<rule config file>
send stream by packet generator(e.g. scapy or ixia):
scapy> sendp(SCTP_1, iface='xxxxx', count=32)
check flow_classify output contain the following message:
rule[4] count=1
271.5.6. Test Case : check invalid rule with sctp stream¶
Send 32 packets of invalid stream(as SCTP_invalid in Stream configuration), then check flow_classify’s output message has no count message.
steps:
boot up flow_classify:
./dpdk-flow_classify -c 4 -n 4 -- --rule_ipv4=<rule config file>
send stream by packet generator(e.g. scapy or ixia):
scapy> sendp(SCTP_invalid, iface='xxxxx', count=32)
check flow_classify output has no “rule[xxx] count=xxx” message, such as:
rule[4] count=1
271.5.7. Test Case: check valid/invalid rule with multiple streams¶
Send multiple streams, 32 packets/each stream type(all stream types in Stream configuration), then check if they are filtered/captured by flow_classify.
steps:
boot up flow_classify:
./dpdk-flow_classify -c 4 -n 4 -- --rule_ipv4=<rule config file>
send multiple stream by packet generator(e.g. scapy or ixia), include SCTP_1/SCTP_invalid/TCP_invalid/TCP_1/TCP_2/UDP_invalid/UDP_1/UDP_2:
scapy> multiple_stream = [SCTP_1, SCTP_invalid, TCP_invalid, TCP_1, TCP_2, UDP_invalid, UDP_1, UDP_2] scapy> sendp(multiple_stream, iface='xxxx', count=32)
check flow_classify output only contain the following count message:
rule[0] count=1 rule[1] count=1 rule[2] count=1 rule[3] count=1 rule[4] count=1