Tested-by: Qian Xu <qian.q.xu at intel.com>
- Tested Commit: b67578ccdf45df9fd0f0204578b71acd854ca834
- OS: Fedora20 3.11
- GCC: gcc version 4.8.3 20140624
- CPU: Intel(R) Xeon(R) CPU E5-2680 v2 @ 2.80GHz
- NIC: Intel 82599 Ethernet 10G SFI/SFP+ Network Connection
- Default x86_64-native-linuxapp-gcc configuration
- Total 1 case, 1 passed, 0 failed
- Case: test_perf_virtio_one_vm_dpdk_fwd_vhost-user
Description: in one-copy mode, vhost sample is in vhost user mode, launch one
VM with 2 virtio devices and run testpmd in the VM.
Steps:
On host:
1. Start vhost-switch. vm2vm 0 means only one vm without vm to vm
communication::
taskset -c 1-3 <dpdk_folder>/examples/vhost/build/vhost-switch -c 0xf -n 4
--huge-dir /mnt/huge --socket-mem 1024,1024 -- -p 1 --mergeable 0 --zero-copy 0
--vm2vm 0
2. Start VM with vhost user as backend::
<qemu-2.2.0_folder>/x86_64-softmmu/qemu-system-x86_64 -name us-vhost-vm1
-cpu host -enable-kvm -m 2048 -object
memory-backend-file,id=mem,size=2048M,mem-path=/mnt/huge,share=on -numa
node,memdev=mem -mem-prealloc -smp 2 -drive file=/home/img/dpdk1-vm1.img
-chardev socket,id=char0,path=<dpdk/vhost-net -netdev
type=vhost-user,id=mynet1,chardev=char0,vhostforce -device
virtio-net-pci,mac=52:54:00:00:00:01,netdev=mynet1 -chardev
socket,id=char1,path=/home/qxu10/dpdk/vhost-net -netdev
type=vhost-user,id=mynet2,chardev=char1,vhostforce -device
virtio-net-pci,mac=52:54:00:00:00:02,netdev=mynet2 -netdev
tap,id=ipvm1,ifname=tap3,script=/etc/qemu-ifup -device
rtl8139,netdev=ipvm1,id=net0,mac=00:00:00:00:00:09 -nographic
On guest:
3. ensure the dpdk folder copied to the guest with the same config file and
build process as host. Then bind 2 virtio devices to igb_uio and start testpmd,
below is the step for reference::
./<dpdk_folder>/tools/dpdk_nic_bind.py --bind igb_uio 00:03.0 00:04.0
./<dpdk_folder>/x86_64-native-linuxapp-gcc/app/test-pmd/testpmd -c f -n 4
-- -i --txqflags 0x0f00 --disable-hw-vlan-filter
$ >set fwd mac
$ >start tx_first
4. After typing start tx_first in testpmd, user can see there would be 2 virtio
device with MAC and vlan id registered in vhost-user server, the log would be
shown in host's vhost-sample output.
5. Send traffic(30second) to virtio1 and virtio2, and set the packet size from
64 to 1518 as well as the jumbo frame 3000. Check the performance in Mpps. The
traffic sent to virtio1 should have the DEST MAC of Virtio1's MAC, Vlan id of
Virtio1. The traffic sent to virtio2 should have the DEST MAC of Virtio2's MAC,
Vlan id of Virtio2. As to the functionality criteria, The received rate should
not be zero. As to the performance criteria, need check it with developer or
design doc/PRD.
-----Original Message-----
From: Ouyang, Changchun
Sent: Friday, February 13, 2015 8:04 PM
To: dev at dpdk.org
Cc: Cao, Waterman; Ouyang, Changchun
Subject: [PATCH] testpmd: HW vlan command
This patch enables testpmd user can config port hw_vlan with more fine
granularity:
hw vlan filter, hw vlan strip, and hw vlan extend.
Don't remove the original command(hw-vlan) considering that some user still
want to use only one command to switch on/off all 3 options.
Signed-off-by: Changchun Ouyang <changchun.ouyang at intel.com>
---
app/test-pmd/cmdline.c | 36 +++++++++++++++++++++++++++++++++---
app/test-pmd/parameters.c | 18 ++++++++++++++++++
2 files changed, 51 insertions(+), 3 deletions(-)
diff --git a/app/test-pmd/cmdline.c b/app/test-pmd/cmdline.c index
590e427..99cc307 100644
--- a/app/test-pmd/cmdline.c
+++ b/app/test-pmd/cmdline.c
@@ -584,7 +584,8 @@ static void cmd_help_long_parsed(void *parsed_result,
"port config all max-pkt-len (value)\n"
" Set the max packet length.\n\n"
- "port config all (crc-strip|rx-cksum|hw-vlan|drop-en)"
+ "port config all
(crc-strip|rx-cksum|hw-vlan|hw-vlan-filter|"
+ "hw-vlan-strip|hw-vlan-extend|drop-en)"
" (on|off)\n"
" Set crc-strip/rx-checksum/hardware-vlan/drop_en"
" for ports.\n\n"
@@ -1327,6 +1328,33 @@ cmd_config_rx_mode_flag_parsed(void *parsed_result,
printf("Unknown parameter\n");
return;
}
+ } else if (!strcmp(res->name, "hw-vlan-filter")) {
+ if (!strcmp(res->value, "on"))
+ rx_mode.hw_vlan_filter = 1;
+ else if (!strcmp(res->value, "off"))
+ rx_mode.hw_vlan_filter = 0;
+ else {
+ printf("Unknown parameter\n");
+ return;
+ }
+ } else if (!strcmp(res->name, "hw-vlan-strip")) {
+ if (!strcmp(res->value, "on"))
+ rx_mode.hw_vlan_strip = 1;
+ else if (!strcmp(res->value, "off"))
+ rx_mode.hw_vlan_strip = 0;
+ else {
+ printf("Unknown parameter\n");
+ return;
+ }
+ } else if (!strcmp(res->name, "hw-vlan-extend")) {
+ if (!strcmp(res->value, "on"))
+ rx_mode.hw_vlan_extend = 1;
+ else if (!strcmp(res->value, "off"))
+ rx_mode.hw_vlan_extend = 0;
+ else {
+ printf("Unknown parameter\n");
+ return;
+ }
} else if (!strcmp(res->name, "drop-en")) {
if (!strcmp(res->value, "on"))
rx_drop_en = 1;
@@ -1355,7 +1383,8 @@ cmdline_parse_token_string_t cmd_config_rx_mode_flag_all =
TOKEN_STRING_INITIALIZER(struct cmd_config_rx_mode_flag, all, "all");
cmdline_parse_token_string_t cmd_config_rx_mode_flag_name =
TOKEN_STRING_INITIALIZER(struct cmd_config_rx_mode_flag, name,
- "crc-strip#rx-cksum#hw-vlan");
+ "crc-strip#rx-cksum#hw-vlan#"
+
"hw-vlan-filter#hw-vlan-strip#hw-vlan-extend");
cmdline_parse_token_string_t cmd_config_rx_mode_flag_value =
TOKEN_STRING_INITIALIZER(struct cmd_config_rx_mode_flag, value,
"on#off");
@@ -1363,7 +1392,8 @@ cmdline_parse_token_string_t
cmd_config_rx_mode_flag_value = cmdline_parse_inst_t cmd_config_rx_mode_flag =
{
.f = cmd_config_rx_mode_flag_parsed,
.data = NULL,
- .help_str = "port config all crc-strip|rx-cksum|hw-vlan on|off",
+ .help_str = "port config all crc-strip|rx-cksum|hw-vlan|"
+ "hw-vlan-filter|hw-vlan-strip|hw-vlan-extend on|off",
.tokens = {
(void *)&cmd_config_rx_mode_flag_port,
(void *)&cmd_config_rx_mode_flag_keyword,
diff --git a/app/test-pmd/parameters.c b/app/test-pmd/parameters.c index
adf3203..04dc129 100644
--- a/app/test-pmd/parameters.c
+++ b/app/test-pmd/parameters.c
@@ -157,6 +157,9 @@ usage(char* progname)
printf(" --crc-strip: enable CRC stripping by hardware.\n");
printf(" --enable-rx-cksum: enable rx hardware checksum offload.\n");
printf(" --disable-hw-vlan: disable hardware vlan.\n");
+ printf(" --disable-hw-vlan-filter: disable hardware vlan filter.\n");
+ printf(" --disable-hw-vlan-strip: disable hardware vlan strip.\n");
+ printf(" --disable-hw-vlan-extend: disable hardware vlan extend.\n");
printf(" --enable-drop-en: enable per queue packet drop.\n");
printf(" --disable-rss: disable rss.\n");
printf(" --port-topology=N: set port topology (N: paired (default) or "
@@ -528,6 +531,9 @@ launch_args_parse(int argc, char** argv)
{ "crc-strip", 0, 0, 0 },
{ "enable-rx-cksum", 0, 0, 0 },
{ "disable-hw-vlan", 0, 0, 0 },
+ { "disable-hw-vlan-filter", 0, 0, 0 },
+ { "disable-hw-vlan-strip", 0, 0, 0 },
+ { "disable-hw-vlan-extend", 0, 0, 0 },
{ "enable-drop-en", 0, 0, 0 },
{ "disable-rss", 0, 0, 0 },
{ "port-topology", 1, 0, 0 },
@@ -778,6 +784,18 @@ launch_args_parse(int argc, char** argv)
rx_mode.hw_vlan_extend = 0;
}
+ if (!strcmp(lgopts[opt_idx].name,
+ "disable-hw-vlan-filter"))
+ rx_mode.hw_vlan_filter = 0;
+
+ if (!strcmp(lgopts[opt_idx].name,
+ "disable-hw-vlan-strip"))
+ rx_mode.hw_vlan_strip = 0;
+
+ if (!strcmp(lgopts[opt_idx].name,
+ "disable-hw-vlan-extend"))
+ rx_mode.hw_vlan_extend = 0;
+
if (!strcmp(lgopts[opt_idx].name, "enable-drop-en"))
rx_drop_en = 1;
--
1.8.4.2