@@ -1071,3 +1071,757 @@ TC34: ACL DCF mode is active, add ACL filters by way of host based configuration
# ethtool -N enp24s0f1 flow-type tcp4 src-ip 192.168.10.0 m 0.255.255.255 dst-port 8000 m 0x00ff action -1
Added rule with ID 15871
+
+===============================
+CVL DCF enable device reset API
+===============================
+
+Description
+===========
+The test plan includes ten test cases, such as two_testpmd_dcf_reset_port, two_testpmd_dcf_reset_device, two_testpmd_dcf_reset_port_detach, two_testpmd_dcf_reset_mtu,
+two_testpmd_dcf_reset_mac, one_testpmd_dcf_reset_port, one_testpmd_dcf_reset_device, one_testpmd_dcf_reset_port_detach, one_testpmd_dcf_reset_mtu, one_testpmd_dcf_reset_mac.
+
+DCF PMD need to support rte_eth_dev_reset.The reason is that when a DCF instance be killed, all the flow rules still exist in hardware. when DCF gets to reconnect,
+It has already lost the flow context, and if the application wants to create new rules, they may fail because FW reports that the rules already exist.The current
+workaround assumes that the user can turn off / turn on VF trust mode, so kernel PF will reset DCF by removing all old rules.The rte_eth_dev_reset API provides
+a more elegant way for the application to reset DCF through the command "port reset all" when reconnecting.
+
+Prerequisites
+=============
+
+Hardware
+--------
+Supportted NICs: columbiaville_25g/columbiaville_100g
+
+Software
+--------
+dpdk: http://dpdk.org/git/dpdk
+scapy: http://www.secdev.org/projects/scapy/
+
+General Set Up
+--------------
+1. Copy specific ice package to /lib/firmware/updates/intel/ice/ddp/ice.pkg,
+ then load driver::
+
+ # cp ice_comms-1.3.31.0.pkg /lib/firmware/updates/intel/ice/ddp/ice.pkg
+ # rmmod ice
+ # insmod ice.ko
+
+2. Compile DPDK::
+
+ # CC=gcc meson --werror -Denable_kmods=True -Dlibdir=lib --default-library=static x86_64-native-linuxapp-gcc
+ # ninja -C x86_64-native-linuxapp-gcc -j 110
+
+3. Get the pci device id and interface of DUT and tester.
+
+ # ./usertools/dpdk-devbind.py -s
+
+ 0000:3b:00.0 'Ethernet Controller E810-C for SFP 1593' if=ens785f0 drv=ice unused=vfio-pci
+ 0000:af:00.0 'Ethernet Controller XXV710 for 25GbE SFP28 158b' if=ens260f0 drv=i40e unused=vfio-pci
+
+4. Generate 4 VFs on PF0::
+
+ # echo 4 > /sys/bus/pci/devices/0000:3b:00.0/sriov_numvfs
+
+5. Get VF pci device id of DUT.
+
+ # ./usertools/dpdk-devbind.py -s
+
+ 0000:3b:01.0 'Ethernet Adaptive Virtual Function 1889' if=ens785f0v0 drv=iavf unused=vfio-pci
+ 0000:3b:01.1 'Ethernet Adaptive Virtual Function 1889' if=ens785f0v1 drv=iavf unused=vfio-pci
+
+6. Set VF0 as trust::
+
+ # ip link set ens785f0 vf 0 trust on
+
+7. Bind the VF ports of DUT to dpdk::
+
+ # ./usertools/dpdk-devbind.py -b vfio-pci 3b:01.0 3b:01.1
+
+Test case
+=========
+
+Common Steps
+------------
+The common steps launch two testpmds and kill DCF process, then relaunch two testpmds.
+
+1. Launch the userland ``testpmd`` application on DUT as follows::
+
+ # ./x86_64-native-linuxapp-gcc/app/dpdk-testpmd -v -c 0x6 -n 4 -a 0000:3b:01.0,cap=dcf --file-prefix=dcf -- -i
+
+2. Launch another ``testpmd`` application on the VF1 of DUT as follows::
+
+ # ./x86_64-native-linuxapp-gcc/app/dpdk-testpmd -v -c 0x18 -n 4 -a 0000:3b:01.1 --file-prefix=vf -- -i
+
+3. Set verbose in VF testpmd::
+
+ testpmd> set verbose 1
+
+4. Set fwd engine and start in VF testpmd::
+
+ testpmd> set fwd mac
+ testpmd> start
+
+5. Validate a switch rule to VF1 in DCF testpmd::
+
+ testpmd> flow validate 0 priority 0 ingress pattern eth / ipv4 src is 192.168.0.2 dst is 192.168.0.3 / end actions vf id 1 / end
+
+ Get the message::
+
+ Flow rule validated
+
+6. Create a switch rule to VF1 in DCF testpmd and list rules::
+
+ testpmd> flow create 0 priority 0 ingress pattern eth / ipv4 src is 192.168.0.2 dst is 192.168.0.3 / end actions vf id 1 / end
+
+ Get the message::
+
+ Flow rule #0 created
+
+ Check the flow list::
+
+ testpmd> flow list 0
+
+ ID Group Prio Attr Rule
+ 0 0 0 i-- ETH IPV4 => VF
+
+7. Send a matched packet in scapy to VF1, check the VF1 of DUT can receive the packet::
+
+Tester::
+
+ >>> sendp([Ether(src="00:11:22:33:44:55", dst='C6:44:32:0A:EC:E1')/IP(src='192.168.0.2', dst='192.168.0.3')/("X"*64)],iface="ens260f0",count=1)
+
+the VF1 of DUT::
+
+ testpmd> port 0/queue 0: received 1 packets
+ src=00:11:22:33:44:55 - dst=C6:44:32:0A:EC:E1 - type=0x0800 - length=98 - nb_segs=1 - hw ptype: L2_ETHER L3_IPV4_EXT_UNKNOWN L4_NONFRAG - sw ptype: L2_ETHER L3_IPV4 - l2_len=14 - l3_len=20 - Receive queue=0x0
+ ol_flags: RTE_MBUF_F_RX_L4_CKSUM_GOOD RTE_MBUF_F_RX_IP_CKSUM_GOOD RTE_MBUF_F_RX_OUTER_L4_CKSUM_UNKNOWN
+
+8. Check the process ID and kill DCF process::
+
+ # ps -ef |grep testpmd
+ # kill -9 #####
+
+9. Relaunch the userland ``testpmd`` application on DUT as follows::
+
+ # ./x86_64-native-linuxapp-gcc/app/dpdk-testpmd -v -c 0x6 -n 4 -a 0000:3b:01.0,cap=dcf --file-prefix=dcf -- -i
+
+10. Send a matched packet in scapy to VF1, DCF flow rule is still valid and check the VF1 of DUT can receive the packet::
+
+Tester::
+
+ >>> sendp([Ether(src="00:11:22:33:44:55", dst="C6:44:32:0A:EC:E1")/IP(src="192.168.0.2", dst="192.168.0.3")/("X"*64)],iface="ens260f0",count=1,inter=0,verbose=False)
+
+the VF1 of DUT::
+
+ testpmd> port 0/queue 0: received 1 packets
+ src=00:11:22:33:44:55 - dst=C6:44:32:0A:EC:E1 - type=0x0800 - length=98 - nb_segs=1 - hw ptype: L2_ETHER L3_IPV4_EXT_UNKNOWN L4_NONFRAG - sw ptype: L2_ETHER L3_IPV4 - l2_len=14 - l3_len=20 - Receive queue=0x0
+ ol_flags: RTE_MBUF_F_RX_L4_CKSUM_GOOD RTE_MBUF_F_RX_IP_CKSUM_GOOD RTE_MBUF_F_RX_OUTER_L4_CKSUM_UNKNOWN
+
+Test Case 1: two_testpmd_dcf_reset_port
+---------------------------------------
+The test case resets DCF by resetting the port, and DCF should clean up all old rules.
+
+Test Steps
+~~~~~~~~~~
+1. Reset port in DCF testpmd::
+
+ testpmd> stop
+ testpmd> port stop all
+ testpmd> port reset all
+ testpmd> port start all
+ testpmd> start
+
+2. Validate a switch rule to VF1 in DCF testpmd::
+
+ testpmd> flow validate 0 priority 0 ingress pattern eth / ipv4 src is 192.168.0.2 dst is 192.168.0.3 / end actions vf id 1 / end
+
+ Get the message::
+
+ Flow rule validated
+
+3. Create a switch rule to VF1 in DCF testpmd and list rules::
+
+ testpmd> flow create 0 priority 0 ingress pattern eth / ipv4 src is 192.168.0.2 dst is 192.168.0.3 / end actions vf id 1 / end
+
+ Get the message::
+
+ Flow rule #0 created
+
+ Check the flow list::
+
+ testpmd> flow list 0
+
+ ID Group Prio Attr Rule
+ 0 0 0 i-- ETH IPV4 => VF
+
+4. Send a matched packet in scapy to VF1, and check the VF1 of DUT can receive the packet::
+
+Tester::
+
+ >>> sendp([Ether(src="00:11:22:33:44:55", dst="C6:44:32:0A:EC:E1")/IP(src="192.168.0.2", dst="192.168.0.3")/("X"*64)],iface="ens260f0",count=1,inter=0,verbose=False)
+
+the VF1 of DUT::
+
+ testpmd> port 0/queue 0: received 1 packets
+ src=00:11:22:33:44:55 - dst=C6:44:32:0A:EC:E1 - type=0x0800 - length=98 - nb_segs=1 - hw ptype: L2_ETHER L3_IPV4_EXT_UNKNOWN L4_NONFRAG - sw ptype: L2_ETHER L3_IPV4 - l2_len=14 - l3_len=20 - Receive queue=0x0
+ ol_flags: RTE_MBUF_F_RX_L4_CKSUM_GOOD RTE_MBUF_F_RX_IP_CKSUM_GOOD RTE_MBUF_F_RX_OUTER_L4_CKSUM_UNKNOWN
+
+Test Case 2: two_testpmd_dcf_reset_device
+-----------------------------------------
+The test case resets DCF by resetting the device, and DCF should clean up all old rules.
+
+Test Steps
+~~~~~~~~~~
+1. Reset DCF device::
+
+ # echo 1 > /sys/bus/pci/devices/0000:3b:01.0/reset
+
+2. Reset port in DCF testpmd::
+
+ testpmd> stop
+ testpmd> port stop all
+ testpmd> port reset all
+ testpmd> port start all
+ testpmd> start
+
+3. Validate a switch rule to VF1 in DCF testpmd::
+
+ testpmd> flow validate 0 priority 0 ingress pattern eth / ipv4 src is 192.168.0.2 dst is 192.168.0.3 / end actions vf id 1 / end
+
+ Get the message::
+
+ Flow rule validated
+
+4. Create a switch rule to VF1 in DCF testpmd and list rules::
+
+ testpmd> flow create 0 priority 0 ingress pattern eth / ipv4 src is 192.168.0.2 dst is 192.168.0.3 / end actions vf id 1 / end
+
+ Get the message::
+
+ Flow rule #0 created
+
+ Check the flow list::
+
+ testpmd> flow list 0
+
+ ID Group Prio Attr Rule
+ 0 0 0 i-- ETH IPV4 => VF
+
+5. Send a matched packet in scapy to VF1, and check the VF1 of DUT can receive the packet::
+
+Tester::
+
+ >>> sendp([Ether(src="00:11:22:33:44:55", dst="C6:44:32:0A:EC:E1")/IP(src="192.168.0.2", dst="192.168.0.3")/("X"*64)],iface="ens260f0",count=1,inter=0,verbose=False)
+
+the VF1 of DUT::
+
+ testpmd> port 0/queue 0: received 1 packets
+ src=00:11:22:33:44:55 - dst=C6:44:32:0A:EC:E1 - type=0x0800 - length=98 - nb_segs=1 - hw ptype: L2_ETHER L3_IPV4_EXT_UNKNOWN L4_NONFRAG - sw ptype: L2_ETHER L3_IPV4 - l2_len=14 - l3_len=20 - Receive queue=0x0
+ ol_flags: RTE_MBUF_F_RX_L4_CKSUM_GOOD RTE_MBUF_F_RX_IP_CKSUM_GOOD RTE_MBUF_F_RX_OUTER_L4_CKSUM_UNKNOWN
+
+Test Case 3: two_testpmd_dcf_reset_port_detach
+----------------------------------------------
+The test case resets DCF by detaching the port, and DCF should clean up all old rules.
+
+Test Steps
+~~~~~~~~~~
+1. Reset DCF device::
+
+ # echo 1 > /sys/bus/pci/devices/0000:3b:01.0/reset
+
+2. Detach and reset port in DCF testpmd::
+
+ testpmd> stop
+ testpmd> port stop 0
+ testpmd> port detach 0
+ testpmd> port attach 3b:01.0,cap=dcf
+ testpmd> port reset 0
+ testpmd> port start 0
+ testpmd> start
+
+3. Validate a switch rule to VF1 in DCF testpmd::
+
+ testpmd> flow validate 0 priority 0 ingress pattern eth / ipv4 src is 192.168.0.2 dst is 192.168.0.3 / end actions vf id 1 / end
+
+ Get the message::
+
+ Flow rule validated
+
+4. Create a switch rule to VF1 in DCF testpmd and list rules::
+
+ testpmd> flow create 0 priority 0 ingress pattern eth / ipv4 src is 192.168.0.2 dst is 192.168.0.3 / end actions vf id 1 / end
+
+ Get the message::
+
+ Flow rule #0 created
+
+ Check the flow list::
+
+ testpmd> flow list 0
+
+ ID Group Prio Attr Rule
+ 0 0 0 i-- ETH IPV4 => VF
+
+5. Send a matched packet in scapy to VF1, and check the VF1 of DUT can receive the packet::
+
+Tester::
+
+ >>> sendp([Ether(src="00:11:22:33:44:55", dst="C6:44:32:0A:EC:E1")/IP(src="192.168.0.2", dst="192.168.0.3")/("X"*64)],iface="ens260f0",count=1,inter=0,verbose=False)
+
+the VF1 of DUT::
+
+ testpmd> port 0/queue 0: received 1 packets
+ src=00:11:22:33:44:55 - dst=C6:44:32:0A:EC:E1 - type=0x0800 - length=98 - nb_segs=1 - hw ptype: L2_ETHER L3_IPV4_EXT_UNKNOWN L4_NONFRAG - sw ptype: L2_ETHER L3_IPV4 - l2_len=14 - l3_len=20 - Receive queue=0x0
+ ol_flags: RTE_MBUF_F_RX_L4_CKSUM_GOOD RTE_MBUF_F_RX_IP_CKSUM_GOOD RTE_MBUF_F_RX_OUTER_L4_CKSUM_UNKNOWN
+
+Test Case 4: two_testpmd_dcf_reset_mtu
+--------------------------------------
+The test case resets DCF by reseting the mtu, and DCF should clean up all old rules.
+
+Test Steps
+~~~~~~~~~~
+1. Modify the value of mtu::
+
+ # ifconfig ens785f0 mtu 3000
+
+2. Reset port in DCF testpmd::
+
+ testpmd> stop
+ testpmd> port stop all
+ testpmd> port reset all
+ testpmd> port start all
+ testpmd> start
+
+3. Validate a switch rule to VF1 in DCF testpmd::
+
+ testpmd> flow validate 0 priority 0 ingress pattern eth / ipv4 src is 192.168.0.2 dst is 192.168.0.3 / end actions vf id 1 / end
+
+ Get the message::
+
+ Flow rule validated
+
+4. Create a switch rule to VF1 in DCF testpmd and list rules::
+
+ testpmd> flow create 0 priority 0 ingress pattern eth / ipv4 src is 192.168.0.2 dst is 192.168.0.3 / end actions vf id 1 / end
+
+ Get the message::
+
+ Flow rule #0 created
+
+ Check the flow list::
+
+ testpmd> flow list 0
+
+ ID Group Prio Attr Rule
+ 0 0 0 i-- ETH IPV4 => VF
+
+5. Send a matched packet in scapy to VF1, and check the VF1 of DUT can receive the packet::
+
+Tester::
+
+ >>> sendp([Ether(src="00:11:22:33:44:55", dst="C6:44:32:0A:EC:E1")/IP(src="192.168.0.2", dst="192.168.0.3")/("X"*64)],iface="ens260f0",count=1,inter=0,verbose=False)
+
+the VF1 of DUT::
+
+ testpmd> port 0/queue 0: received 1 packets
+ src=00:11:22:33:44:55 - dst=C6:44:32:0A:EC:E1 - type=0x0800 - length=98 - nb_segs=1 - hw ptype: L2_ETHER L3_IPV4_EXT_UNKNOWN L4_NONFRAG - sw ptype: L2_ETHER L3_IPV4 - l2_len=14 - l3_len=20 - Receive queue=0x0
+ ol_flags: RTE_MBUF_F_RX_L4_CKSUM_GOOD RTE_MBUF_F_RX_IP_CKSUM_GOOD RTE_MBUF_F_RX_OUTER_L4_CKSUM_UNKNOWN
+
+Test Case 5: two_testpmd_dcf_reset_mac
+--------------------------------------
+The test case resets DCF by reseting mac addr, and DCF should clean up all old rules.
+
+Test Steps
+~~~~~~~~~~
+1. Reset VF0 by set mac addr::
+
+ # ip link set ens785f0 vf 0 mac 00:01:02:03:04:05
+
+2. Reset port in DCF testpmd::
+
+ testpmd> stop
+ testpmd> port stop all
+ testpmd> port reset all
+ testpmd> port start all
+ testpmd> start
+
+3. Validate a switch rule to VF1 in DCF testpmd::
+
+ testpmd> flow validate 0 priority 0 ingress pattern eth / ipv4 src is 192.168.0.2 dst is 192.168.0.3 / end actions vf id 1 / end
+
+ Get the message::
+
+ Flow rule validated
+
+4. Create a switch rule to VF1 in DCF testpmd and list rules::
+
+ testpmd> flow create 0 priority 0 ingress pattern eth / ipv4 src is 192.168.0.2 dst is 192.168.0.3 / end actions vf id 1 / end
+
+ Get the message::
+
+ Flow rule #0 created
+
+ Check the flow list::
+
+ testpmd> flow list 0
+
+ ID Group Prio Attr Rule
+ 0 0 0 i-- ETH IPV4 => VF
+
+5. Send a matched packet in scapy to VF1, and check the VF1 of DUT can receive the packet::
+
+Tester::
+
+ >>> sendp([Ether(src="00:11:22:33:44:55", dst="C6:44:32:0A:EC:E1")/IP(src="192.168.0.2", dst="192.168.0.3")/("X"*64)],iface="ens260f0",count=1,inter=0,verbose=False)
+
+the VF1 of DUT::
+
+ testpmd> port 0/queue 0: received 1 packets
+ src=00:11:22:33:44:55 - dst=C6:44:32:0A:EC:E1 - type=0x0800 - length=98 - nb_segs=1 - hw ptype: L2_ETHER L3_IPV4_EXT_UNKNOWN L4_NONFRAG - sw ptype: L2_ETHER L3_IPV4 - l2_len=14 - l3_len=20 - Receive queue=0x0
+ ol_flags: RTE_MBUF_F_RX_L4_CKSUM_GOOD RTE_MBUF_F_RX_IP_CKSUM_GOOD RTE_MBUF_F_RX_OUTER_L4_CKSUM_UNKNOWN
+
+Common Steps
+------------
+The common steps launch one testpmd and kill DCF process, then relaunch one testpmd.
+
+1. Launch the userland ``testpmd`` application on DUT as follows::
+
+ # ./x86_64-native-linuxapp-gcc/app/dpdk-testpmd -v -c 0x6 -n 4 -a 3b:01.0,cap=dcf -a 3b:01.1 --file-prefix=dcf -- -i
+
+2. Set verbose::
+
+ testpmd> set verbose 1
+
+3. Set fwd engine and start::
+
+ testpmd> set fwd mac
+ testpmd> start
+
+4. Validate a switch rule to VF1::
+
+ testpmd> flow validate 0 priority 0 ingress pattern eth / ipv4 src is 192.168.0.2 dst is 192.168.0.3 / end actions vf id 1 / end
+
+ Get the message::
+
+ Flow rule validated
+
+5. Create a switch rule to VF1 and list rules::
+
+ testpmd> flow create 0 priority 0 ingress pattern eth / ipv4 src is 192.168.0.2 dst is 192.168.0.3 / end actions vf id 1 / end
+
+ Get the message::
+
+ Flow rule #0 created
+
+ Check the flow list::
+
+ testpmd> flow list 0
+
+ ID Group Prio Attr Rule
+ 0 0 0 i-- ETH IPV4 => VF
+
+6. Send a matched packet in scapy to VF1, check DUT can receive the packet::
+
+Tester::
+
+ >>> sendp([Ether(src="00:11:22:33:44:55", dst="C6:44:32:0A:EC:E1")/IP(src="192.168.0.2", dst="192.168.0.3")/("X"*64)],iface="ens260f0",count=1,inter=0,verbose=False)
+
+DUT::
+
+ testpmd> port 1/queue 0: received 1 packets
+ src=00:11:22:33:44:55 - dst=C6:44:32:0A:EC:E1 - type=0x0800 - length=98 - nb_segs=1 - hw ptype: L2_ETHER L3_IPV4_EXT_UNKNOWN L4_NONFRAG - sw ptype: L2_ETHER L3_IPV4 - l2_len=14 - l3_len=20 - Receive queue=0x0
+ ol_flags: RTE_MBUF_F_RX_L4_CKSUM_GOOD RTE_MBUF_F_RX_IP_CKSUM_GOOD RTE_MBUF_F_RX_OUTER_L4_CKSUM_UNKNOWN
+
+7. Check the process ID and kill DCF process::
+
+ # ps -ef |grep testpmd
+ # kill -9 #####
+
+8. Relaunch the userland ``testpmd`` application on DUT as follows::
+
+ # ./x86_64-native-linuxapp-gcc/app/dpdk-testpmd -v -c 0x6 -n 4 -a 3b:01.0,cap=dcf -a 3b:01.1 --file-prefix=dcf -- -i
+
+9. Set verbose::
+
+ testpmd> set verbose 1
+
+10. Set fwd engine and start::
+
+ testpmd> set fwd mac
+ testpmd> start
+
+11. Send a matched packet in scapy to VF1, DCF flow rule is cleared and check DUT can't receive the packet::
+
+Tester::
+
+ >>> sendp([Ether(src="00:11:22:33:44:55", dst="C6:44:32:0A:EC:E1")/IP(src="192.168.0.2", dst="192.168.0.3")/("X"*64)],iface="ens260f0",count=1,inter=0,verbose=False)
+
+DUT::
+
+ testpmd>
+
+Test Case 6: one_testpmd_dcf_reset_port
+---------------------------------------
+The test case resets DCF by resetting the port, and DCF should clean up all old rules.
+
+Test Steps
+~~~~~~~~~~
+1. Reset port in testpmd::
+
+ testpmd> stop
+ testpmd> port stop all
+ testpmd> port reset all
+ testpmd> port start all
+ testpmd> start
+
+2. Validate a switch rule to VF1::
+
+ testpmd> flow validate 0 priority 0 ingress pattern eth / ipv4 src is 192.168.0.2 dst is 192.168.0.3 / end actions vf id 1 / end
+
+ Get the message::
+
+ Flow rule validated
+
+3. Create a switch rule to VF1 and list rules::
+
+ testpmd> flow create 0 priority 0 ingress pattern eth / ipv4 src is 192.168.0.2 dst is 192.168.0.3 / end actions vf id 1 / end
+
+ Get the message::
+
+ Flow rule #0 created
+
+ Check the flow list::
+
+ testpmd> flow list 0
+
+ ID Group Prio Attr Rule
+ 0 0 0 i-- ETH IPV4 => VF
+
+4. Send a matched packet in scapy to VF1, and check DUT can receive the packet::
+
+Tester::
+
+ >>> sendp([Ether(src="00:11:22:33:44:55", dst="C6:44:32:0A:EC:E1")/IP(src="192.168.0.2", dst="192.168.0.3")/("X"*64)],iface="ens260f0",count=1,inter=0,verbose=False)
+
+DUT::
+
+ testpmd> port 1/queue 0: received 1 packets
+ src=00:11:22:33:44:55 - dst=C6:44:32:0A:EC:E1 - type=0x0800 - length=98 - nb_segs=1 - hw ptype: L2_ETHER L3_IPV4_EXT_UNKNOWN L4_NONFRAG - sw ptype: L2_ETHER L3_IPV4 - l2_len=14 - l3_len=20 - Receive queue=0x0
+ ol_flags: RTE_MBUF_F_RX_L4_CKSUM_GOOD RTE_MBUF_F_RX_IP_CKSUM_GOOD RTE_MBUF_F_RX_OUTER_L4_CKSUM_UNKNOWN
+
+Test Case 7: one_testpmd_dcf_reset_device
+-----------------------------------------
+The test case resets DCF by resetting the device, and DCF should clean up all old rules.
+
+Test Steps
+~~~~~~~~~~
+1. Reset DCF device::
+
+ # echo 1 > /sys/bus/pci/devices/0000:3b:01.0/reset
+
+2. Reset port in testpmd::
+
+ testpmd> stop
+ testpmd> port stop all
+ testpmd> port reset all
+ testpmd> port start all
+ testpmd> start
+
+3. Validate a switch rule to VF1::
+
+ testpmd> flow validate 0 priority 0 ingress pattern eth / ipv4 src is 192.168.0.2 dst is 192.168.0.3 / end actions vf id 1 / end
+
+ Get the message::
+
+ Flow rule validated
+
+4. Create a switch rule to VF1 and list rules::
+
+ testpmd> flow create 0 priority 0 ingress pattern eth / ipv4 src is 192.168.0.2 dst is 192.168.0.3 / end actions vf id 1 / end
+
+ Get the message::
+
+ Flow rule #0 created
+
+ Check the flow list::
+
+ testpmd> flow list 0
+
+ ID Group Prio Attr Rule
+ 0 0 0 i-- ETH IPV4 => VF
+
+5. Send a matched packet in scapy to VF1, and check DUT can receive the packet::
+
+Tester::
+
+ >>> sendp([Ether(src="00:11:22:33:44:55", dst="C6:44:32:0A:EC:E1")/IP(src="192.168.0.2", dst="192.168.0.3")/("X"*64)],iface="ens260f0",count=1,inter=0,verbose=False)
+
+DUT::
+
+ testpmd> port 1/queue 0: received 1 packets
+ src=00:11:22:33:44:55 - dst=C6:44:32:0A:EC:E1 - type=0x0800 - length=98 - nb_segs=1 - hw ptype: L2_ETHER L3_IPV4_EXT_UNKNOWN L4_NONFRAG - sw ptype: L2_ETHER L3_IPV4 - l2_len=14 - l3_len=20 - Receive queue=0x0
+ ol_flags: RTE_MBUF_F_RX_L4_CKSUM_GOOD RTE_MBUF_F_RX_IP_CKSUM_GOOD RTE_MBUF_F_RX_OUTER_L4_CKSUM_UNKNOWN
+
+Test Case 8: one_testpmd_dcf_reset_port_detach
+----------------------------------------------
+The test case resets DCF by detaching the port, and DCF should clean up all old rules.
+
+Test Steps
+~~~~~~~~~~
+1. Reset DCF device::
+
+ # echo 1 > /sys/bus/pci/devices/0000:3b:01.0/reset
+
+2. Detach and reset port in DCF testpmd::
+
+ testpmd> stop
+ testpmd> port stop 0
+ testpmd> port detach 0
+ testpmd> port attach 3b:01.0,cap=dcf
+ testpmd> port reset 0
+ testpmd> port start 0
+ testpmd> start
+
+3. Validate a switch rule to VF1::
+
+ testpmd> flow validate 0 priority 0 ingress pattern eth / ipv4 src is 192.168.0.2 dst is 192.168.0.3 / end actions vf id 1 / end
+
+ Get the message::
+
+ Flow rule validated
+
+4. Create a switch rule to VF1 and list rules::
+
+ testpmd> flow create 0 priority 0 ingress pattern eth / ipv4 src is 192.168.0.2 dst is 192.168.0.3 / end actions vf id 1 / end
+
+ Get the message::
+
+ Flow rule #0 created
+
+ Check the flow list::
+
+ testpmd> flow list 0
+
+ ID Group Prio Attr Rule
+ 0 0 0 i-- ETH IPV4 => VF
+
+5. Send a matched packet in scapy to VF1, and check DUT can receive the packet::
+
+Tester::
+
+ >>> sendp([Ether(src="00:11:22:33:44:55", dst="C6:44:32:0A:EC:E1")/IP(src="192.168.0.2", dst="192.168.0.3")/("X"*64)],iface="ens260f0",count=1,inter=0,verbose=False)
+
+DUT::
+
+ testpmd> port 1/queue 0: received 1 packets
+ src=00:11:22:33:44:55 - dst=C6:44:32:0A:EC:E1 - type=0x0800 - length=98 - nb_segs=1 - hw ptype: L2_ETHER L3_IPV4_EXT_UNKNOWN L4_NONFRAG - sw ptype: L2_ETHER L3_IPV4 - l2_len=14 - l3_len=20 - Receive queue=0x0
+ ol_flags: RTE_MBUF_F_RX_L4_CKSUM_GOOD RTE_MBUF_F_RX_IP_CKSUM_GOOD RTE_MBUF_F_RX_OUTER_L4_CKSUM_UNKNOWN
+
+Test Case 9: one_testpmd_dcf_reset_mtu
+--------------------------------------
+The test case resets DCF by resetting the mtu, and DCF should clean up all old rules.
+
+Test Steps
+~~~~~~~~~~
+1. Modify the value of mtu::
+
+ # ifconfig ens785f0 mtu 3000
+
+2. Reset port in DCF testpmd::
+
+ testpmd> stop
+ testpmd> port stop all
+ testpmd> port reset all
+ testpmd> port start all
+ testpmd> start
+
+3. Validate a switch rule to VF1::
+
+ testpmd> flow validate 0 priority 0 ingress pattern eth / ipv4 src is 192.168.0.2 dst is 192.168.0.3 / end actions vf id 1 / end
+
+ Get the message::
+
+ Flow rule validated
+
+4. Create a switch rule to VF1 and list rules::
+
+ testpmd> flow create 0 priority 0 ingress pattern eth / ipv4 src is 192.168.0.2 dst is 192.168.0.3 / end actions vf id 1 / end
+
+ Get the message::
+
+ Flow rule #0 created
+
+ Check the flow list::
+
+ testpmd> flow list 0
+
+ ID Group Prio Attr Rule
+ 0 0 0 i-- ETH IPV4 => VF
+
+5. Send a matched packet in scapy to VF1, and check DUT can receive the packet::
+
+Tester::
+
+ >>> sendp([Ether(src="00:11:22:33:44:55", dst="C6:44:32:0A:EC:E1")/IP(src="192.168.0.2", dst="192.168.0.3")/("X"*64)],iface="ens260f0",count=1,inter=0,verbose=False)
+
+DUT::
+
+ testpmd> port 1/queue 0: received 1 packets
+ src=00:11:22:33:44:55 - dst=C6:44:32:0A:EC:E1 - type=0x0800 - length=98 - nb_segs=1 - hw ptype: L2_ETHER L3_IPV4_EXT_UNKNOWN L4_NONFRAG - sw ptype: L2_ETHER L3_IPV4 - l2_len=14 - l3_len=20 - Receive queue=0x0
+ ol_flags: RTE_MBUF_F_RX_L4_CKSUM_GOOD RTE_MBUF_F_RX_IP_CKSUM_GOOD RTE_MBUF_F_RX_OUTER_L4_CKSUM_UNKNOWN
+
+Test Case 10: one_testpmd_dcf_reset_mac
+--------------------------------------
+The test case resets DCF by resetting mac addr, and DCF should clean up all old rules.
+
+Test Steps
+~~~~~~~~~~
+1. Reset VF0 by set mac addr::
+
+ # ip link set ens785f0 vf 0 mac 00:01:02:03:04:05
+
+2. Reset port in DCF testpmd::
+
+ testpmd> stop
+ testpmd> port stop all
+ testpmd> port reset all
+ testpmd> port start all
+ testpmd> start
+
+3. Validate a switch rule to VF1::
+
+ testpmd> flow validate 0 priority 0 ingress pattern eth / ipv4 src is 192.168.0.2 dst is 192.168.0.3 / end actions vf id 1 / end
+
+ Get the message::
+
+ Flow rule validated
+
+4. Create a switch rule to VF1 and list rules::
+
+ testpmd> flow create 0 priority 0 ingress pattern eth / ipv4 src is 192.168.0.2 dst is 192.168.0.3 / end actions vf id 1 / end
+
+ Get the message::
+
+ Flow rule #0 created
+
+ Check the flow list::
+
+ testpmd> flow list 0
+
+ ID Group Prio Attr Rule
+ 0 0 0 i-- ETH IPV4 => VF
+
+5. Send a matched packet in scapy to VF1, and check DUT can receive the packet::
+
+Tester::
+
+ >>> sendp([Ether(src="00:11:22:33:44:55", dst="C6:44:32:0A:EC:E1")/IP(src="192.168.0.2", dst="192.168.0.3")/("X"*64)],iface="ens260f0",count=1,inter=0,verbose=False)
+
+DUT::
+
+ testpmd> port 1/queue 0: received 1 packets
+ src=00:11:22:33:44:55 - dst=C6:44:32:0A:EC:E1 - type=0x0800 - length=98 - nb_segs=1 - hw ptype: L2_ETHER L3_IPV4_EXT_UNKNOWN L4_NONFRAG - sw ptype: L2_ETHER L3_IPV4 - l2_len=14 - l3_len=20 - Receive queue=0x0
+ ol_flags: RTE_MBUF_F_RX_L4_CKSUM_GOOD RTE_MBUF_F_RX_IP_CKSUM_GOOD RTE_MBUF_F_RX_OUTER_L4_CKSUM_UNKNOWN
+
+