diff --git a/test_plans/mev_cpfl_hairpin_queue_test_plan.rst b/test_plans/mev_cpfl_hairpin_queue_test_plan.rst
new file mode 100644
index 00000000..0f2ee4bf
--- /dev/null
+++ b/test_plans/mev_cpfl_hairpin_queue_test_plan.rst
@@ -0,0 +1,100 @@
+==============================
+MEV CPFL Support Hairpin Queue
+==============================
+
+Description
+===========
+Enabling Port2Port forwarding as hairpin queue implementation in dpdk cpfl PMD.
+launch testpmd not start forwarding, multi hairpin queues receive and transmit packet.
+start forwarding, multi data queues receive and transmit packet;
+
+Prerequisites
+=============
+1. CI release >= MEV 0.81(3921)::
+
+    [root@mev-acc-rl ~]# cat /etc/issue
+    MEV ACC mev-hw-b0-ci-ts.release.3921
+
+2. During IMC boot, press 'N' when you see 'start init app and auxiliary script [Y/N]'.::
+
+    cd /etc/dpcp
+    cp cfg/cp_init_use_case_2.cfg ./cp_init.cfg
+    cp cp_init.cfg cp_init.cfg.bak
+    sed -i 's/pf_allowed_to_create_p2p = 5;/pf_allowed_to_create_p2p = 8;/g' cp_init.cfg
+    sed -i 's/cpf_host = 4;/cpf_host = 0;/g' cp_init.cfg
+
+3. Update customized package::
+
+    copy package to /etc/dpcp/package/ and rename with default_pkg.pkg.
+    cd /etc/dpcp/package/
+    rm default_pkg.pkg
+    ssh-keygen -f "/root/.ssh/known_hosts" -R "100.0.0.100"
+    scp default_pkg.pkg root@100.0.0.100:/etc/dpcp/package/
+
+4. Run /etc/init.d/run_default_init_app
+
+Test Case
+=========
+Common Steps
+------------
+1. Launch testpmd but not start forwarding.
+
+2. Configure port to receive packets on IMC::
+
+    cli_client --query --config --verbose
+    devmem 0x202920C100 64 0x804
+
+3. Create rule on IMC::
+
+    vi rule_1.txt
+    opcode=0x1303 prof_id=0x34 sub_prof_id=0x0 cookie=0xa2b87 key=0x18,0x0,00,00,00,00,0xde,0xad,0xbe,0xef,0x20,0x24,0x0,0x0,0x0,0x0,00,00,00,00,00,00,0xa,0x2,0x1d,0x64,00,00,00,00,00,00,00,00,00,00,00,00,
+    0xa,0x2,0x1d,0x2,00,00,00,00,00,00,00,00,00,00,00,00 act=set_vsi{act_val=0 val_type=2 dst_pe=0 slot=0x0} act=set_q{qnum=0x151 no_implicit_vsi=1 prec=5} act=count{counter_id=0x10 slot=0x0 prec=0x3}
+
+    cli_client -x -f rule_1.txt
+
+4. Send match packet from tester and check tester can receive the transmit packet::
+
+    tcpdump -i ens21f0 -env -Q in
+    sendp([Ether(dst="de:ad:be:ef:20:24")/IP(src="10.2.29.100", dst="10.2.29.2")/UDP()],iface="ens21f0",count=1)
+
+5. Send mismatch packets form tester and check tester can't receive the transmit packet::
+
+    sendp(Ether(dst="de:ad:be:ef:20:25")/IP(src="10.2.29.100", dst="10.2.29.2")/UDP(),iface="ens21f0",count=1)
+    sendp(Ether(dst="de:ad:be:ef:20:25")/IP(src="10.2.29.101", dst="10.2.29.2")/UDP(),iface="ens21f0",count=1)
+    sendp(Ether(dst="de:ad:be:ef:20:25")/IP(src="10.2.29.100", dst="10.2.29.4")/UDP(),iface="ens21f0",count=1)
+    sendp(Ether(dst="de:ad:be:ef:20:25")/IP(src="10.2.29.100", dst="10.2.29.2")/TCP(),iface="ens21f0",count=1)
+    sendp(Ether(dst="de:ad:be:ef:20:25")/IP(src="10.2.29.100", dst="10.2.29.2"),iface="ens21f0",count=1)
+
+6. Start testpmd forwarding and send mismatch packets, check testpmd can receive and transmit packets::
+
+    testpmd> start
+    testpmd> set verbose 1
+    testpmd> show port stats all
+
+7. Send mismatch packets form tester and check tester can't receive the transmit packet::
+
+    sendp(Ether(dst="de:ad:be:ef:20:25")/IP(src="10.2.29.100", dst="10.2.29.2")/UDP(),iface="ens21f0",count=1)
+    sendp(Ether(dst="de:ad:be:ef:20:25")/IP(src="10.2.29.101", dst="10.2.29.2")/UDP(),iface="ens21f0",count=1)
+    sendp(Ether(dst="de:ad:be:ef:20:25")/IP(src="10.2.29.100", dst="10.2.29.4")/UDP(),iface="ens21f0",count=1)
+    sendp(Ether(dst="de:ad:be:ef:20:25")/IP(src="10.2.29.100", dst="10.2.29.2")/TCP(),iface="ens21f0",count=1)
+    sendp(Ether(dst="de:ad:be:ef:20:25")/IP(src="10.2.29.100", dst="10.2.29.2"),iface="ens21f0",count=1)
+
+Test case 1: single_hairpin_queue
+---------------------------------
+Test subcase 1: single_hairpin_queue_single_data_queue
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+./dpdk-testpmd -l 1-2 -n 4 -a af:00.6,vport=0 -- -i --rxq=1 --txq=1 --hairpinq=1 --hairpin-mode=0
+
+Test subcase 2: single_hairpin_queue_multi_data_queue
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+./dpdk-testpmd -l 1-2 -n 4 -a ca:00.6,vport=0 -- -i --rxq=16 --txq=16 --hairpinq=1 --hairpin-mode=0
+
+Test case 2: multi_hairpin_queue
+---------------------------------
+Test subcase 1: multi_hairpin_queue_single_data_queue
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+./dpdk-testpmd -l 1-2 -n 4 -a ca:00.6,vport=0 -- -i --rxq=1 --txq=1 --hairpinq=16 --hairpin-mode=0
+
+Test subcase 2: multi_hairpin_queue_multi_data_queues
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+./dpdk-testpmd -l 1-2 -n 4 -a ca:00.6,vport=0 -- -i --rxq=16 --txq=16 --hairpinq=16 --hairpin-mode=0
