diff --git a/tests/TestSuite_dpdk_gro_lib.py b/tests/TestSuite_dpdk_gro_lib.py
index f2b5b0d..3f23e3e 100644
--- a/tests/TestSuite_dpdk_gro_lib.py
+++ b/tests/TestSuite_dpdk_gro_lib.py
@@ -97,6 +97,12 @@ class TestDPDKGROLib(TestCase):
         self.prepare_dpdk()
         self.base_dir = self.dut.base_dir.replace('~', '/root')
 
+        self.ports_socket = self.dut.get_numa_id(self.dut_ports[0])
+        # get cbdma device
+        self.cbdma_dev_infos = []
+        self.dmas_info = None
+        self.device_str = None
+
     def set_up(self):
         #
         # Run before each test case.
@@ -106,15 +112,60 @@ class TestDPDKGROLib(TestCase):
         self.dut.send_expect("killall -s INT %s" % self.testpmd_name, "#")
         self.dut.send_expect("killall -s INT qemu-system-x86_64", "#")
 
-    def launch_testpmd_gro_on(self, mode=1):
+    def get_cbdma_ports_info_and_bind_to_dpdk(self, cbdma_num):
+        """
+        get all cbdma ports
+        """
+        str_info = 'Misc (rawdev) devices using kernel driver'
+        out = self.dut.send_expect('./usertools/dpdk-devbind.py --status-dev misc', '# ', 30)
+        device_info = out.split('\n')
+        for device in device_info:
+            pci_info = re.search('\s*(0000:\d*:\d*.\d*)', device)
+            if pci_info is not None:
+                dev_info = pci_info.group(1)
+                # the numa id of ioat dev, only add the device which
+                # on same socket with nic dev
+                bus = int(dev_info[5:7], base=16)
+                if bus >= 128:
+                    cur_socket = 1
+                else:
+                    cur_socket = 0
+                if self.ports_socket == cur_socket:
+                    self.cbdma_dev_infos.append(pci_info.group(1))
+        self.verify(len(self.cbdma_dev_infos) >= cbdma_num, 'There no enough cbdma device to run this suite')
+        used_cbdma = self.cbdma_dev_infos[0:cbdma_num]
+        dmas_info = ''
+        for dmas in used_cbdma:
+            number = used_cbdma.index(dmas)
+            dmas = 'txq{}@{};'.format(number, dmas)
+            dmas_info += dmas
+        self.dmas_info = dmas_info[:-1]
+        self.device_str = ' '.join(self.cbdma_dev_infos)
+        self.dut.setup_modules(self.target, "igb_uio","None")
+        self.dut.send_expect('./usertools/dpdk-devbind.py --force --bind=%s %s' % ("igb_uio", self.device_str), '# ', 60)
+
+    def bind_cbdma_device_to_kernel(self):
+        if self.device_str is not None:
+            self.dut.send_expect('modprobe ioatdma', '# ')
+            self.dut.send_expect('./usertools/dpdk-devbind.py -u %s' % self.device_str, '# ', 30)
+            self.dut.send_expect('./usertools/dpdk-devbind.py --force --bind=ioatdma  %s' % self.device_str, '# ', 60)
+
+    def launch_testpmd_gro_on(self, mode=1, queue=1):
         #
         # Launch the vhost sample with different parameters
         # mode 1 : tcp traffic light mode
         # mode 2 : tcp traffic heavy mode
         # mode 3 : vxlan traffic light mode
         # mode 4 : tcp traffic flush 4
-        eal_param = self.dut.create_eal_parameters(cores=self.vhost_list, vdevs=['net_vhost0,iface=%s/vhost-net,queues=1' % self.base_dir])
-        self.testcmd_start = self.path + eal_param + " -- -i  --enable-hw-vlan-strip --tx-offloads=0x00 --txd=1024 --rxd=1024"
+        # mode 5 : tcp traffice light mode with cdbma enable
+        if mode == 5:
+            self.get_cbdma_ports_info_and_bind_to_dpdk(cbdma_num=2)
+            self.dut.send_expect('./usertools/dpdk-devbind.py --force --bind=igb_uio  %s' % self.pci, '# ', 20)
+            eal_param = self.dut.create_eal_parameters(cores=self.vhost_list, vdevs=["'net_vhost0,iface=%s/vhost-net,queues=%s,dmas=[%s],dmathr=1024'" % (self.base_dir, queue, self.dmas_info)])
+            self.testcmd_start = self.path + eal_param + " -- -i --txd=1024 --rxd=1024 --txq=2 --rxq=2"
+        else:
+            eal_param = self.dut.create_eal_parameters(cores=self.vhost_list, vdevs=['net_vhost0,iface=%s/vhost-net,queues=%s' % (self.base_dir, queue)])
+            self.testcmd_start = self.path + eal_param + " -- -i  --enable-hw-vlan-strip --tx-offloads=0x00 --txd=1024 --rxd=1024"
         self.vhost_user = self.dut.new_session(suite="user")
         self.vhost_user.send_expect(self.testcmd_start, "testpmd> ", 120)
         self.vhost_user.send_expect("set fwd csum", "testpmd> ", 120)
@@ -125,13 +176,13 @@ class TestDPDKGROLib(TestCase):
         self.vhost_user.send_expect("csum set ip hw 0", "testpmd> ", 120)
         self.vhost_user.send_expect("csum set tcp hw 1", "testpmd> ", 120)
         self.vhost_user.send_expect("csum set ip hw 1", "testpmd> ", 120)
-        if(mode == 1):
+        if(mode == 1 or mode == 5):
             self.vhost_user.send_expect("set port 0 gro on", "testpmd> ", 120)
             self.vhost_user.send_expect("set gro flush 1", "testpmd> ", 120)
-        if(mode == 2):
+        elif(mode == 2):
             self.vhost_user.send_expect("set port 0 gro on", "testpmd> ", 120)
             self.vhost_user.send_expect("set gro flush 2", "testpmd> ", 120)
-        if (mode == 3):
+        elif (mode == 3):
             self.vhost_user.send_expect("csum parse-tunnel on 1", "testpmd> ", 120)
             self.vhost_user.send_expect("csum parse-tunnel on 0", "testpmd> ", 120)
             self.vhost_user.send_expect("csum set outer-ip hw 0", "testpmd> ", 120)
@@ -240,15 +291,18 @@ class TestDPDKGROLib(TestCase):
                 vm_config.params[i]['cpu'][0]['number'] = 1
                 vm_config.params[i]['cpu'][0]['cpupin'] = self.qemu_cpupin
 
-    def start_vm(self):
+    def start_vm(self, mode=1, queue=1):
         self.vm1 = VM(self.dut, 'vm0', 'vhost_sample')
         self.vm1.load_config()
         vm_params_1 = {}
         vm_params_1['driver'] = 'vhost-user'
         vm_params_1['opt_path'] = self.base_dir + '/vhost-net'
         vm_params_1['opt_mac'] = self.virtio_mac1
-        vm_params_1[
-            'opt_settings'] = 'mrg_rxbuf=on,csum=off,gso=off,host_tso4=on,guest_tso4=on'
+        if mode == 5:
+            vm_params_1['opt_queue'] = queue
+            vm_params_1['opt_settings'] = 'mrg_rxbuf=on,csum=on,gso=on,host_tso4=on,guest_tso4=on,mq=on,vectors=15'
+        else:
+            vm_params_1['opt_settings'] = 'mrg_rxbuf=on,csum=on,gso=on,host_tso4=on,guest_tso4=on'
         self.vm1.set_vm_device(**vm_params_1)
         self.set_vm_cpu_number(self.vm1)
         try:
@@ -275,6 +329,15 @@ class TestDPDKGROLib(TestCase):
         self.result_table_print()
         self.output_result = "Iperf throughput is %s" % iperfdata[-1]
         self.logger.info(self.output_result)
+        iperfdata_kb = 0
+        tmp_value = iperfdata[-1].split(" ")[0]
+        if 'Gbits' in iperfdata[-1]:
+            iperfdata_kb = float(tmp_value)*1000000
+        elif 'Mbits' in iperfdata[-1]:
+            iperfdata_kb = float(tmp_value)*1000
+        else:
+            iperfdata_kb = float(tmp_value)
+        return iperfdata_kb
 
     def test_vhost_gro_tcp_lightmode(self):
         self.config_kernel_nic_host(0)
@@ -299,7 +362,7 @@ class TestDPDKGROLib(TestCase):
             'ip netns exec ns1 iperf -c %s -i 1 -t 10 -P 1> /root/iperf_client.log &' %
             (self.virtio_ip1), '', 180)
         time.sleep(30)
-        self.iperf_result_verify('GRO lib')
+        tc1_perfdata = self.iperf_result_verify('GRO lib')
         print(("the GRO lib %s " % (self.output_result)))
         self.dut.send_expect('rm /root/iperf_client.log', '#', 10)
         # Turn off DPDK GRO lib and Kernel GRO off
@@ -313,6 +376,7 @@ class TestDPDKGROLib(TestCase):
         self.dut.send_expect('rm /root/iperf_client.log', '#', 10)
         self.quit_testpmd()
         self.dut.send_expect("killall -s INT qemu-system-x86_64", "#")
+        self.dut.send_expect('echo %s > /root/dpdk_gro_lib_on_iperf_tc1.log' % tc1_perfdata, '#', 10)
 
     def test_vhost_gro_tcp_heavymode(self):
         self.config_kernel_nic_host(0)
@@ -376,6 +440,42 @@ class TestDPDKGROLib(TestCase):
         self.quit_testpmd()
         self.dut.send_expect("killall -s INT qemu-system-x86_64", "#")
 
+    def test_vhost_gro_tcp_ipv4_with_cbdma_enable(self):
+        self.config_kernel_nic_host(0)
+        self.heavymode = 5
+        self.launch_testpmd_gro_on(self.heavymode, queue=2)
+        self.start_vm(mode=5, queue=2)
+        time.sleep(5)
+        self.dut.get_session_output(timeout=2)
+        # Get the virtio-net device name
+        for port in self.vm1_dut.ports_info:
+            self.vm1_intf = port['intf']
+        # Start the Iperf test
+        self.vm1_dut.send_expect('ifconfig -a', '#', 30)
+        self.vm1_dut.send_expect(
+            'ifconfig %s %s up' %
+            (self.vm1_intf, self.virtio_ip1), '#', 10)
+        self.vm1_dut.send_expect('ethtool -L %s combined 2' % self.vm1_intf, '#', 10)
+        self.vm1_dut.send_expect(
+            'ethtool -K %s gro off' %
+            (self.vm1_intf), '#', 10)
+        self.vm1_dut.send_expect('iperf -s', '', 10)
+        self.dut.send_expect('rm /root/iperf_client.log', '#', 10)
+        out = self.dut.send_expect(
+            'ip netns exec ns1 iperf -c %s -i 1 -t 60 -m -P 2 > /root/iperf_client.log &' %
+            (self.virtio_ip1), '', 180)
+        time.sleep(30)
+        print(out)
+        tc4_perfdata = self.iperf_result_verify('GRO lib')
+        print(("the GRO lib %s " % (self.output_result)))
+        #self.dut.send_expect('rm /root/iperf_client.log', '#', 10)
+        self.quit_testpmd()
+        self.dut.send_expect("killall -s INT qemu-system-x86_64", "#")
+        tc1_perfdata = self.dut.send_expect("cat /root/dpdk_gro_lib_on_iperf_tc1.log", "#")
+        self.verify("No such file or directory" not in tc1_perfdata, "Cannot find dpdk_gro_lib_on_iperf_tc1.log, please run test_vhost_gro_tcp_lightmode firstly")
+        if tc1_perfdata:
+            self.verify(float(tc4_perfdata) > float(tc1_perfdata), "TestFailed: W/cbdma iperf data is %s Kbits/sec, W/O cbdma iperf data is %s Kbits/sec" %(tc4_perfdata, tc1_perfdata))
+
     def tear_down(self):
         """
         Run after each test case.
@@ -390,6 +490,7 @@ class TestDPDKGROLib(TestCase):
         self.dut.send_expect(
             "./usertools/dpdk-devbind.py -b %s %s" %
             (self.pci_drv, self.peer_pci), '# ', 30)
+        self.bind_cbdma_device_to_kernel()
 
     def tear_down_all(self):
         """
