app/testpmd: fix flow director mask
[dpdk.git] / app / test-pmd / cmdline.c
index b6b61ad..a82b4cc 100644 (file)
 #ifdef RTE_LIBRTE_PMD_BOND
 #include <rte_eth_bond.h>
 #endif
-
+#ifdef RTE_LIBRTE_IXGBE_PMD
+#include <rte_pmd_ixgbe.h>
+#endif
 #include "testpmd.h"
 
 static struct cmdline *testpmd_cl;
 
 static void cmd_reconfig_device_queue(portid_t id, uint8_t dev, uint8_t queue);
 
-#ifdef RTE_NIC_BYPASS
-uint8_t bypass_is_supported(portid_t port_id);
-#endif
-
 /* *** Help command with introduction. *** */
 struct cmd_help_brief_result {
        cmdline_fixed_string_t help;
@@ -264,12 +262,37 @@ static void cmd_help_long_parsed(void *parsed_result,
                        "set portlist (x[,y]*)\n"
                        "    Set the list of forwarding ports.\n\n"
 
+#ifdef RTE_LIBRTE_IXGBE_PMD
+                       "set tx loopback (port_id) (on|off)\n"
+                       "    Enable or disable tx loopback.\n\n"
+
+                       "set all queues drop (port_id) (on|off)\n"
+                       "    Set drop enable bit for all queues.\n\n"
+
+                       "set vf split drop (port_id) (vf_id) (on|off)\n"
+                       "    Set split drop enable bit for a VF from the PF.\n\n"
+
+                       "set vf mac antispoof (port_id) (vf_id) (on|off).\n"
+                       "    Set MAC antispoof for a VF from the PF.\n\n"
+#endif
+
                        "vlan set strip (on|off) (port_id)\n"
                        "    Set the VLAN strip on a port.\n\n"
 
                        "vlan set stripq (on|off) (port_id,queue_id)\n"
                        "    Set the VLAN strip for a queue on a port.\n\n"
 
+#ifdef RTE_LIBRTE_IXGBE_PMD
+                       "set vf vlan stripq (port_id) (vf_id) (on|off)\n"
+                       "    Set the VLAN strip for all queues in a pool for a VF from the PF.\n\n"
+
+                       "set vf vlan insert (port_id) (vf_id) (on|off)\n"
+                       "    Set VLAN insert for a VF from the PF.\n\n"
+
+                       "set vf vlan antispoof (port_id) (vf_id) (on|off)\n"
+                       "    Set VLAN antispoof for a VF from the PF.\n\n"
+#endif
+
                        "vlan set filter (on|off) (port_id)\n"
                        "    Set the VLAN filter on a port.\n\n"
 
@@ -363,6 +386,11 @@ static void cmd_help_long_parsed(void *parsed_result,
                        "mac_addr add port (port_id) vf (vf_id) (mac_address)\n"
                        "    Add a MAC address for a VF on the port.\n\n"
 
+#ifdef RTE_LIBRTE_IXGBE_PMD
+                       "set vf mac addr (port_id) (vf_id) (XX:XX:XX:XX:XX:XX)\n"
+                       "    Set the MAC address for a VF from the PF.\n\n"
+#endif
+
                        "set port (port_id) uta (mac_address|all) (on|off)\n"
                        "    Add/Remove a or all unicast hash filter(s)"
                        "from port X.\n\n"
@@ -549,7 +577,7 @@ static void cmd_help_long_parsed(void *parsed_result,
                        "    Detach physical or virtual dev by port_id\n\n"
 
                        "port config (port_id|all)"
-                       " speed (10|100|1000|10000|40000|100000|auto)"
+                       " speed (10|100|1000|10000|25000|40000|50000|100000|auto)"
                        " duplex (half|full|auto)\n"
                        "    Set speed and duplex for all ports or port_id\n\n"
 
@@ -724,7 +752,7 @@ static void cmd_help_long_parsed(void *parsed_result,
                        "    Set flow director IP mask.\n\n"
 
                        "flow_director_mask (port_id) mode MAC-VLAN"
-                       " vlan (vlan_value) mac (mac_value)\n"
+                       " vlan (vlan_value)\n"
                        "    Set flow director MAC-VLAN mask.\n\n"
 
                        "flow_director_mask (port_id) mode Tunnel"
@@ -1020,8 +1048,12 @@ parse_and_check_speed_duplex(char *speedstr, char *duplexstr, uint32_t *speed)
                        *speed = ETH_LINK_SPEED_1G;
                } else if (!strcmp(speedstr, "10000")) {
                        *speed = ETH_LINK_SPEED_10G;
+               } else if (!strcmp(speedstr, "25000")) {
+                       *speed = ETH_LINK_SPEED_25G;
                } else if (!strcmp(speedstr, "40000")) {
                        *speed = ETH_LINK_SPEED_40G;
+               } else if (!strcmp(speedstr, "50000")) {
+                       *speed = ETH_LINK_SPEED_50G;
                } else if (!strcmp(speedstr, "100000")) {
                        *speed = ETH_LINK_SPEED_100G;
                } else if (!strcmp(speedstr, "auto")) {
@@ -1071,7 +1103,7 @@ cmdline_parse_token_string_t cmd_config_speed_all_item1 =
        TOKEN_STRING_INITIALIZER(struct cmd_config_speed_all, item1, "speed");
 cmdline_parse_token_string_t cmd_config_speed_all_value1 =
        TOKEN_STRING_INITIALIZER(struct cmd_config_speed_all, value1,
-                                               "10#100#1000#10000#40000#100000#auto");
+                               "10#100#1000#10000#25000#40000#50000#100000#auto");
 cmdline_parse_token_string_t cmd_config_speed_all_item2 =
        TOKEN_STRING_INITIALIZER(struct cmd_config_speed_all, item2, "duplex");
 cmdline_parse_token_string_t cmd_config_speed_all_value2 =
@@ -1081,7 +1113,8 @@ cmdline_parse_token_string_t cmd_config_speed_all_value2 =
 cmdline_parse_inst_t cmd_config_speed_all = {
        .f = cmd_config_speed_all_parsed,
        .data = NULL,
-       .help_str = "port config all speed 10|100|1000|10000|40000|100000|auto duplex "
+       .help_str = "port config all speed "
+               "10|100|1000|10000|25000|40000|50000|100000|auto duplex "
                                                        "half|full|auto",
        .tokens = {
                (void *)&cmd_config_speed_all_port,
@@ -1145,7 +1178,7 @@ cmdline_parse_token_string_t cmd_config_speed_specific_item1 =
                                                                "speed");
 cmdline_parse_token_string_t cmd_config_speed_specific_value1 =
        TOKEN_STRING_INITIALIZER(struct cmd_config_speed_specific, value1,
-                                               "10#100#1000#10000#40000#100000#auto");
+                               "10#100#1000#10000#25000#40000#50000#100000#auto");
 cmdline_parse_token_string_t cmd_config_speed_specific_item2 =
        TOKEN_STRING_INITIALIZER(struct cmd_config_speed_specific, item2,
                                                                "duplex");
@@ -1156,7 +1189,8 @@ cmdline_parse_token_string_t cmd_config_speed_specific_value2 =
 cmdline_parse_inst_t cmd_config_speed_specific = {
        .f = cmd_config_speed_specific_parsed,
        .data = NULL,
-       .help_str = "port config X speed 10|100|1000|10000|40000|100000|auto duplex "
+       .help_str = "port config X speed "
+               "10|100|1000|10000|25000|40000|50000|100000|auto duplex "
                                                        "half|full|auto",
        .tokens = {
                (void *)&cmd_config_speed_specific_port,
@@ -1371,7 +1405,7 @@ cmdline_parse_token_num_t cmd_config_mtu_value =
 cmdline_parse_inst_t cmd_config_mtu = {
        .f = cmd_config_mtu_parsed,
        .data = NULL,
-       .help_str = "port config mtu value",
+       .help_str = "port config mtu port_id value",
        .tokens = {
                (void *)&cmd_config_mtu_port,
                (void *)&cmd_config_mtu_keyword,
@@ -1612,7 +1646,6 @@ struct cmd_config_rss_hash_key {
        cmdline_fixed_string_t key;
 };
 
-#define RSS_HASH_KEY_LENGTH 40
 static uint8_t
 hexa_digit_to_value(char hexa_digit)
 {
@@ -1648,16 +1681,29 @@ cmd_config_rss_hash_key_parsed(void *parsed_result,
        uint8_t xdgt0;
        uint8_t xdgt1;
        int i;
+       struct rte_eth_dev_info dev_info;
+       uint8_t hash_key_size;
+       uint32_t key_len;
 
+       memset(&dev_info, 0, sizeof(dev_info));
+       rte_eth_dev_info_get(res->port_id, &dev_info);
+       if (dev_info.hash_key_size > 0 &&
+                       dev_info.hash_key_size <= sizeof(hash_key))
+               hash_key_size = dev_info.hash_key_size;
+       else {
+               printf("dev_info did not provide a valid hash key size\n");
+               return;
+       }
        /* Check the length of the RSS hash key */
-       if (strlen(res->key) != (RSS_HASH_KEY_LENGTH * 2)) {
+       key_len = strlen(res->key);
+       if (key_len != (hash_key_size * 2)) {
                printf("key length: %d invalid - key must be a string of %d"
-                      "hexa-decimal numbers\n", (int) strlen(res->key),
-                      RSS_HASH_KEY_LENGTH * 2);
+                          " hexa-decimal numbers\n",
+                          (int) key_len, hash_key_size * 2);
                return;
        }
        /* Translate RSS hash key into binary representation */
-       for (i = 0; i < RSS_HASH_KEY_LENGTH; i++) {
+       for (i = 0; i < hash_key_size; i++) {
                xdgt0 = parse_and_check_key_hexa_digit(res->key, (i * 2));
                if (xdgt0 == 0xFF)
                        return;
@@ -1667,7 +1713,7 @@ cmd_config_rss_hash_key_parsed(void *parsed_result,
                hash_key[i] = (uint8_t) ((xdgt0 * 16) + xdgt1);
        }
        port_rss_hash_key_update(res->port_id, res->rss_type, hash_key,
-                                RSS_HASH_KEY_LENGTH);
+                       hash_key_size);
 }
 
 cmdline_parse_token_string_t cmd_config_rss_hash_key_port =
@@ -1696,7 +1742,8 @@ cmdline_parse_inst_t cmd_config_rss_hash_key = {
                "port config X rss-hash-key ipv4|ipv4-frag|ipv4-tcp|ipv4-udp|"
                "ipv4-sctp|ipv4-other|ipv6|ipv6-frag|ipv6-tcp|ipv6-udp|"
                "ipv6-sctp|ipv6-other|l2-payload|"
-               "ipv6-ex|ipv6-tcp-ex|ipv6-udp-ex 80 hexa digits\n",
+               "ipv6-ex|ipv6-tcp-ex|ipv6-udp-ex "
+               "<string of hexa digits (variable length, NIC dependent)>\n",
        .tokens = {
                (void *)&cmd_config_rss_hash_key_port,
                (void *)&cmd_config_rss_hash_key_config,
@@ -3476,7 +3523,7 @@ cmdline_parse_inst_t cmd_csum_tunnel = {
        },
 };
 
-/* *** ENABLE HARDWARE SEGMENTATION IN TX PACKETS *** */
+/* *** ENABLE HARDWARE SEGMENTATION IN TX NON-TUNNELED PACKETS *** */
 struct cmd_tso_set_result {
        cmdline_fixed_string_t tso;
        cmdline_fixed_string_t mode;
@@ -3499,9 +3546,9 @@ cmd_tso_set_parsed(void *parsed_result,
                ports[res->port_id].tso_segsz = res->tso_segsz;
 
        if (ports[res->port_id].tso_segsz == 0)
-               printf("TSO is disabled\n");
+               printf("TSO for non-tunneled packets is disabled\n");
        else
-               printf("TSO segment size is %d\n",
+               printf("TSO segment size for non-tunneled packets is %d\n",
                        ports[res->port_id].tso_segsz);
 
        /* display warnings if configuration is not supported by the NIC */
@@ -3529,8 +3576,8 @@ cmdline_parse_token_num_t cmd_tso_set_portid =
 cmdline_parse_inst_t cmd_tso_set = {
        .f = cmd_tso_set_parsed,
        .data = NULL,
-       .help_str = "Set TSO segment size for csum engine (0 to disable): "
-       "tso set <tso_segsz> <port>",
+       .help_str = "Set TSO segment size of non-tunneled packets "
+       "for csum engine (0 to disable): tso set <tso_segsz> <port>",
        .tokens = {
                (void *)&cmd_tso_set_tso,
                (void *)&cmd_tso_set_mode,
@@ -3548,8 +3595,8 @@ cmdline_parse_token_string_t cmd_tso_show_mode =
 cmdline_parse_inst_t cmd_tso_show = {
        .f = cmd_tso_set_parsed,
        .data = NULL,
-       .help_str = "Show TSO segment size for csum engine: "
-       "tso show <port>",
+       .help_str = "Show TSO segment size of non-tunneled packets "
+       "for csum engine: tso show <port>",
        .tokens = {
                (void *)&cmd_tso_set_tso,
                (void *)&cmd_tso_show_mode,
@@ -3558,6 +3605,122 @@ cmdline_parse_inst_t cmd_tso_show = {
        },
 };
 
+/* *** ENABLE HARDWARE SEGMENTATION IN TX TUNNELED PACKETS *** */
+struct cmd_tunnel_tso_set_result {
+       cmdline_fixed_string_t tso;
+       cmdline_fixed_string_t mode;
+       uint16_t tso_segsz;
+       uint8_t port_id;
+};
+
+static void
+check_tunnel_tso_nic_support(uint8_t port_id)
+{
+       struct rte_eth_dev_info dev_info;
+
+       rte_eth_dev_info_get(port_id, &dev_info);
+       if (!(dev_info.tx_offload_capa & DEV_TX_OFFLOAD_VXLAN_TNL_TSO))
+               printf("Warning: TSO enabled but VXLAN TUNNEL TSO not "
+                      "supported by port %d\n", port_id);
+       if (!(dev_info.tx_offload_capa & DEV_TX_OFFLOAD_GRE_TNL_TSO))
+               printf("Warning: TSO enabled but GRE TUNNEL TSO not "
+                       "supported by port %d\n", port_id);
+       if (!(dev_info.tx_offload_capa & DEV_TX_OFFLOAD_IPIP_TNL_TSO))
+               printf("Warning: TSO enabled but IPIP TUNNEL TSO not "
+                      "supported by port %d\n", port_id);
+       if (!(dev_info.tx_offload_capa & DEV_TX_OFFLOAD_GENEVE_TNL_TSO))
+               printf("Warning: TSO enabled but GENEVE TUNNEL TSO not "
+                      "supported by port %d\n", port_id);
+}
+
+static void
+cmd_tunnel_tso_set_parsed(void *parsed_result,
+                         __attribute__((unused)) struct cmdline *cl,
+                         __attribute__((unused)) void *data)
+{
+       struct cmd_tunnel_tso_set_result *res = parsed_result;
+
+       if (port_id_is_invalid(res->port_id, ENABLED_WARN))
+               return;
+
+       if (!strcmp(res->mode, "set"))
+               ports[res->port_id].tunnel_tso_segsz = res->tso_segsz;
+
+       if (ports[res->port_id].tunnel_tso_segsz == 0)
+               printf("TSO for tunneled packets is disabled\n");
+       else {
+               printf("TSO segment size for tunneled packets is %d\n",
+                       ports[res->port_id].tunnel_tso_segsz);
+
+               /* Below conditions are needed to make it work:
+                * (1) tunnel TSO is supported by the NIC;
+                * (2) "csum parse_tunnel" must be set so that tunneled pkts
+                * are recognized;
+                * (3) for tunneled pkts with outer L3 of IPv4,
+                * "csum set outer-ip" must be set to hw, because after tso,
+                * total_len of outer IP header is changed, and the checksum
+                * of outer IP header calculated by sw should be wrong; that
+                * is not necessary for IPv6 tunneled pkts because there's no
+                * checksum in IP header anymore.
+                */
+               check_tunnel_tso_nic_support(res->port_id);
+
+               if (!(ports[res->port_id].tx_ol_flags &
+                     TESTPMD_TX_OFFLOAD_PARSE_TUNNEL))
+                       printf("Warning: csum parse_tunnel must be set "
+                               "so that tunneled packets are recognized\n");
+               if (!(ports[res->port_id].tx_ol_flags &
+                     TESTPMD_TX_OFFLOAD_OUTER_IP_CKSUM))
+                       printf("Warning: csum set outer-ip must be set to hw "
+                               "if outer L3 is IPv4; not necessary for IPv6\n");
+       }
+}
+
+cmdline_parse_token_string_t cmd_tunnel_tso_set_tso =
+       TOKEN_STRING_INITIALIZER(struct cmd_tunnel_tso_set_result,
+                               tso, "tunnel_tso");
+cmdline_parse_token_string_t cmd_tunnel_tso_set_mode =
+       TOKEN_STRING_INITIALIZER(struct cmd_tunnel_tso_set_result,
+                               mode, "set");
+cmdline_parse_token_num_t cmd_tunnel_tso_set_tso_segsz =
+       TOKEN_NUM_INITIALIZER(struct cmd_tunnel_tso_set_result,
+                               tso_segsz, UINT16);
+cmdline_parse_token_num_t cmd_tunnel_tso_set_portid =
+       TOKEN_NUM_INITIALIZER(struct cmd_tunnel_tso_set_result,
+                               port_id, UINT8);
+
+cmdline_parse_inst_t cmd_tunnel_tso_set = {
+       .f = cmd_tunnel_tso_set_parsed,
+       .data = NULL,
+       .help_str = "Set TSO segment size of tunneled packets for csum engine "
+       "(0 to disable): tunnel_tso set <tso_segsz> <port>",
+       .tokens = {
+               (void *)&cmd_tunnel_tso_set_tso,
+               (void *)&cmd_tunnel_tso_set_mode,
+               (void *)&cmd_tunnel_tso_set_tso_segsz,
+               (void *)&cmd_tunnel_tso_set_portid,
+               NULL,
+       },
+};
+
+cmdline_parse_token_string_t cmd_tunnel_tso_show_mode =
+       TOKEN_STRING_INITIALIZER(struct cmd_tunnel_tso_set_result,
+                               mode, "show");
+
+
+cmdline_parse_inst_t cmd_tunnel_tso_show = {
+       .f = cmd_tunnel_tso_set_parsed,
+       .data = NULL,
+       .help_str = "Show TSO segment size of tunneled packets "
+       "for csum engine: tunnel_tso show <port>",
+       .tokens = {
+               (void *)&cmd_tunnel_tso_set_tso,
+               (void *)&cmd_tunnel_tso_show_mode,
+               (void *)&cmd_tunnel_tso_set_portid,
+               NULL,
+       },
+};
+
 /* *** ENABLE/DISABLE FLUSH ON RX STREAMS *** */
 struct cmd_set_flush_rx {
        cmdline_fixed_string_t set;
@@ -3656,9 +3819,6 @@ cmd_set_bypass_mode_parsed(void *parsed_result,
        portid_t port_id = res->port_id;
        uint32_t bypass_mode = RTE_BYPASS_MODE_NORMAL;
 
-       if (!bypass_is_supported(port_id))
-               return;
-
        if (!strcmp(res->value, "bypass"))
                bypass_mode = RTE_BYPASS_MODE_BYPASS;
        else if (!strcmp(res->value, "isolate"))
@@ -3725,9 +3885,6 @@ cmd_set_bypass_event_parsed(void *parsed_result,
        uint32_t bypass_event = RTE_BYPASS_EVENT_NONE;
        uint32_t bypass_mode = RTE_BYPASS_MODE_NORMAL;
 
-       if (!bypass_is_supported(port_id))
-               return;
-
        if (!strcmp(res->event_value, "timeout"))
                bypass_event = RTE_BYPASS_EVENT_TIMEOUT;
        else if (!strcmp(res->event_value, "os_on"))
@@ -3903,9 +4060,6 @@ cmd_show_bypass_config_parsed(void *parsed_result,
                "timeout"};
        int num_events = (sizeof events) / (sizeof events[0]);
 
-       if (!bypass_is_supported(port_id))
-               return;
-
        /* Display the bypass mode.*/
        if (0 != rte_eth_dev_bypass_state_show(port_id, &bypass_mode)) {
                printf("\tFailed to get bypass mode for port = %d\n", port_id);
@@ -4404,7 +4558,7 @@ static void cmd_create_bonded_device_parsed(void *parsed_result,
                return;
        }
 
-       snprintf(ethdev_name, RTE_ETH_NAME_MAX_LEN, "eth_bond_testpmd_%d",
+       snprintf(ethdev_name, RTE_ETH_NAME_MAX_LEN, "net_bond_testpmd_%d",
                        bond_dev_num++);
 
        /* Create a new bonded device. */
@@ -8515,24 +8669,28 @@ cmd_flow_director_filter_parsed(void *parsed_result,
        else
                entry.action.behavior = RTE_ETH_FDIR_ACCEPT;
 
-       if (!strcmp(res->pf_vf, "pf"))
-               entry.input.flow_ext.is_vf = 0;
-       else if (!strncmp(res->pf_vf, "vf", 2)) {
-               struct rte_eth_dev_info dev_info;
+       if (fdir_conf.mode !=  RTE_FDIR_MODE_PERFECT_MAC_VLAN &&
+           fdir_conf.mode !=  RTE_FDIR_MODE_PERFECT_TUNNEL) {
+               if (!strcmp(res->pf_vf, "pf"))
+                       entry.input.flow_ext.is_vf = 0;
+               else if (!strncmp(res->pf_vf, "vf", 2)) {
+                       struct rte_eth_dev_info dev_info;
 
-               memset(&dev_info, 0, sizeof(dev_info));
-               rte_eth_dev_info_get(res->port_id, &dev_info);
-               errno = 0;
-               vf_id = strtoul(res->pf_vf + 2, &end, 10);
-               if (errno != 0 || *end != '\0' || vf_id >= dev_info.max_vfs) {
+                       memset(&dev_info, 0, sizeof(dev_info));
+                       rte_eth_dev_info_get(res->port_id, &dev_info);
+                       errno = 0;
+                       vf_id = strtoul(res->pf_vf + 2, &end, 10);
+                       if (errno != 0 || *end != '\0' ||
+                           vf_id >= dev_info.max_vfs) {
+                               printf("invalid parameter %s.\n", res->pf_vf);
+                               return;
+                       }
+                       entry.input.flow_ext.is_vf = 1;
+                       entry.input.flow_ext.dst_id = (uint16_t)vf_id;
+               } else {
                        printf("invalid parameter %s.\n", res->pf_vf);
                        return;
                }
-               entry.input.flow_ext.is_vf = 1;
-               entry.input.flow_ext.dst_id = (uint16_t)vf_id;
-       } else {
-               printf("invalid parameter %s.\n", res->pf_vf);
-               return;
        }
 
        /* set to report FD ID by default */
@@ -8968,7 +9126,6 @@ cmd_flow_director_mask_parsed(void *parsed_result,
                }
 
                mask->vlan_tci_mask = res->vlan_mask;
-               mask->mac_addr_byte_mask = res->mac_addr_byte_mask;
        } else if (fdir_conf.mode ==  RTE_FDIR_MODE_PERFECT_TUNNEL) {
                if (strcmp(res->mode_value, "Tunnel")) {
                        printf("Please set mode to Tunnel.\n");
@@ -9099,8 +9256,6 @@ cmdline_parse_inst_t cmd_set_flow_director_mac_vlan_mask = {
                (void *)&cmd_flow_director_mask_mode_mac_vlan,
                (void *)&cmd_flow_director_mask_vlan,
                (void *)&cmd_flow_director_mask_vlan_value,
-               (void *)&cmd_flow_director_mask_mac,
-               (void *)&cmd_flow_director_mask_mac_value,
                NULL,
        },
 };
@@ -10597,6 +10752,665 @@ cmdline_parse_inst_t cmd_config_e_tag_filter_del = {
                NULL,
        },
 };
+#ifdef RTE_LIBRTE_IXGBE_PMD
+
+/* vf vlan anti spoof configuration */
+
+/* Common result structure for vf vlan anti spoof */
+struct cmd_vf_vlan_anti_spoof_result {
+       cmdline_fixed_string_t set;
+       cmdline_fixed_string_t vf;
+       cmdline_fixed_string_t vlan;
+       cmdline_fixed_string_t antispoof;
+       uint8_t port_id;
+       uint32_t vf_id;
+       cmdline_fixed_string_t on_off;
+};
+
+/* Common CLI fields for vf vlan anti spoof enable disable */
+cmdline_parse_token_string_t cmd_vf_vlan_anti_spoof_set =
+       TOKEN_STRING_INITIALIZER
+               (struct cmd_vf_vlan_anti_spoof_result,
+                set, "set");
+cmdline_parse_token_string_t cmd_vf_vlan_anti_spoof_vf =
+       TOKEN_STRING_INITIALIZER
+               (struct cmd_vf_vlan_anti_spoof_result,
+                vf, "vf");
+cmdline_parse_token_string_t cmd_vf_vlan_anti_spoof_vlan =
+       TOKEN_STRING_INITIALIZER
+               (struct cmd_vf_vlan_anti_spoof_result,
+                vlan, "vlan");
+cmdline_parse_token_string_t cmd_vf_vlan_anti_spoof_antispoof =
+       TOKEN_STRING_INITIALIZER
+               (struct cmd_vf_vlan_anti_spoof_result,
+                antispoof, "antispoof");
+cmdline_parse_token_num_t cmd_vf_vlan_anti_spoof_port_id =
+       TOKEN_NUM_INITIALIZER
+               (struct cmd_vf_vlan_anti_spoof_result,
+                port_id, UINT8);
+cmdline_parse_token_num_t cmd_vf_vlan_anti_spoof_vf_id =
+       TOKEN_NUM_INITIALIZER
+               (struct cmd_vf_vlan_anti_spoof_result,
+                vf_id, UINT32);
+cmdline_parse_token_string_t cmd_vf_vlan_anti_spoof_on_off =
+       TOKEN_STRING_INITIALIZER
+               (struct cmd_vf_vlan_anti_spoof_result,
+                on_off, "on#off");
+
+static void
+cmd_set_vf_vlan_anti_spoof_parsed(
+       void *parsed_result,
+       __attribute__((unused)) struct cmdline *cl,
+       __attribute__((unused)) void *data)
+{
+       struct cmd_vf_vlan_anti_spoof_result *res = parsed_result;
+       int ret = 0;
+       int is_on = (strcmp(res->on_off, "on") == 0) ? 1 : 0;
+
+       ret = rte_pmd_ixgbe_set_vf_vlan_anti_spoof(res->port_id, res->vf_id,
+                       is_on);
+       switch (ret) {
+       case 0:
+               break;
+       case -EINVAL:
+               printf("invalid vf_id %d\n", res->vf_id);
+               break;
+       case -ENODEV:
+               printf("invalid port_id %d\n", res->port_id);
+               break;
+       default:
+               printf("programming error: (%s)\n", strerror(-ret));
+       }
+}
+
+cmdline_parse_inst_t cmd_set_vf_vlan_anti_spoof = {
+       .f = cmd_set_vf_vlan_anti_spoof_parsed,
+       .data = NULL,
+       .help_str = "set vf vlan antispoof port_id vf_id on|off",
+       .tokens = {
+               (void *)&cmd_vf_vlan_anti_spoof_set,
+               (void *)&cmd_vf_vlan_anti_spoof_vf,
+               (void *)&cmd_vf_vlan_anti_spoof_vlan,
+               (void *)&cmd_vf_vlan_anti_spoof_antispoof,
+               (void *)&cmd_vf_vlan_anti_spoof_port_id,
+               (void *)&cmd_vf_vlan_anti_spoof_vf_id,
+               (void *)&cmd_vf_vlan_anti_spoof_on_off,
+               NULL,
+       },
+};
+
+/* vf mac anti spoof configuration */
+
+/* Common result structure for vf mac anti spoof */
+struct cmd_vf_mac_anti_spoof_result {
+       cmdline_fixed_string_t set;
+       cmdline_fixed_string_t vf;
+       cmdline_fixed_string_t mac;
+       cmdline_fixed_string_t antispoof;
+       uint8_t port_id;
+       uint32_t vf_id;
+       cmdline_fixed_string_t on_off;
+};
+
+/* Common CLI fields for vf mac anti spoof enable disable */
+cmdline_parse_token_string_t cmd_vf_mac_anti_spoof_set =
+       TOKEN_STRING_INITIALIZER
+               (struct cmd_vf_mac_anti_spoof_result,
+                set, "set");
+cmdline_parse_token_string_t cmd_vf_mac_anti_spoof_vf =
+       TOKEN_STRING_INITIALIZER
+               (struct cmd_vf_mac_anti_spoof_result,
+                vf, "vf");
+cmdline_parse_token_string_t cmd_vf_mac_anti_spoof_mac =
+       TOKEN_STRING_INITIALIZER
+               (struct cmd_vf_mac_anti_spoof_result,
+                mac, "mac");
+cmdline_parse_token_string_t cmd_vf_mac_anti_spoof_antispoof =
+       TOKEN_STRING_INITIALIZER
+               (struct cmd_vf_mac_anti_spoof_result,
+                antispoof, "antispoof");
+cmdline_parse_token_num_t cmd_vf_mac_anti_spoof_port_id =
+       TOKEN_NUM_INITIALIZER
+               (struct cmd_vf_mac_anti_spoof_result,
+                port_id, UINT8);
+cmdline_parse_token_num_t cmd_vf_mac_anti_spoof_vf_id =
+       TOKEN_NUM_INITIALIZER
+               (struct cmd_vf_mac_anti_spoof_result,
+                vf_id, UINT32);
+cmdline_parse_token_string_t cmd_vf_mac_anti_spoof_on_off =
+       TOKEN_STRING_INITIALIZER
+               (struct cmd_vf_mac_anti_spoof_result,
+                on_off, "on#off");
+
+static void
+cmd_set_vf_mac_anti_spoof_parsed(
+       void *parsed_result,
+       __attribute__((unused)) struct cmdline *cl,
+       __attribute__((unused)) void *data)
+{
+       struct cmd_vf_mac_anti_spoof_result *res = parsed_result;
+       int ret;
+       int is_on = (strcmp(res->on_off, "on") == 0) ? 1 : 0;
+
+       ret = rte_pmd_ixgbe_set_vf_mac_anti_spoof(res->port_id, res->vf_id,
+                       is_on);
+       switch (ret) {
+       case 0:
+               break;
+       case -EINVAL:
+               printf("invalid vf_id %d or is_on %d\n", res->vf_id, is_on);
+               break;
+       case -ENODEV:
+               printf("invalid port_id %d\n", res->port_id);
+               break;
+       default:
+               printf("programming error: (%s)\n", strerror(-ret));
+       }
+}
+
+cmdline_parse_inst_t cmd_set_vf_mac_anti_spoof = {
+       .f = cmd_set_vf_mac_anti_spoof_parsed,
+       .data = NULL,
+       .help_str = "set vf mac antispoof port_id vf_id on|off",
+       .tokens = {
+               (void *)&cmd_vf_mac_anti_spoof_set,
+               (void *)&cmd_vf_mac_anti_spoof_vf,
+               (void *)&cmd_vf_mac_anti_spoof_mac,
+               (void *)&cmd_vf_mac_anti_spoof_antispoof,
+               (void *)&cmd_vf_mac_anti_spoof_port_id,
+               (void *)&cmd_vf_mac_anti_spoof_vf_id,
+               (void *)&cmd_vf_mac_anti_spoof_on_off,
+               NULL,
+       },
+};
+
+/* vf vlan strip queue configuration */
+
+/* Common result structure for vf mac anti spoof */
+struct cmd_vf_vlan_stripq_result {
+       cmdline_fixed_string_t set;
+       cmdline_fixed_string_t vf;
+       cmdline_fixed_string_t vlan;
+       cmdline_fixed_string_t stripq;
+       uint8_t port_id;
+       uint16_t vf_id;
+       cmdline_fixed_string_t on_off;
+};
+
+/* Common CLI fields for vf vlan strip enable disable */
+cmdline_parse_token_string_t cmd_vf_vlan_stripq_set =
+       TOKEN_STRING_INITIALIZER
+               (struct cmd_vf_vlan_stripq_result,
+                set, "set");
+cmdline_parse_token_string_t cmd_vf_vlan_stripq_vf =
+       TOKEN_STRING_INITIALIZER
+               (struct cmd_vf_vlan_stripq_result,
+                vf, "vf");
+cmdline_parse_token_string_t cmd_vf_vlan_stripq_vlan =
+       TOKEN_STRING_INITIALIZER
+               (struct cmd_vf_vlan_stripq_result,
+                vlan, "vlan");
+cmdline_parse_token_string_t cmd_vf_vlan_stripq_stripq =
+       TOKEN_STRING_INITIALIZER
+               (struct cmd_vf_vlan_stripq_result,
+                stripq, "stripq");
+cmdline_parse_token_num_t cmd_vf_vlan_stripq_port_id =
+       TOKEN_NUM_INITIALIZER
+               (struct cmd_vf_vlan_stripq_result,
+                port_id, UINT8);
+cmdline_parse_token_num_t cmd_vf_vlan_stripq_vf_id =
+       TOKEN_NUM_INITIALIZER
+               (struct cmd_vf_vlan_stripq_result,
+                vf_id, UINT16);
+cmdline_parse_token_string_t cmd_vf_vlan_stripq_on_off =
+       TOKEN_STRING_INITIALIZER
+               (struct cmd_vf_vlan_stripq_result,
+                on_off, "on#off");
+
+static void
+cmd_set_vf_vlan_stripq_parsed(
+       void *parsed_result,
+       __attribute__((unused)) struct cmdline *cl,
+       __attribute__((unused)) void *data)
+{
+       struct cmd_vf_vlan_stripq_result *res = parsed_result;
+       int ret = 0;
+       int is_on = (strcmp(res->on_off, "on") == 0) ? 1 : 0;
+
+       ret = rte_pmd_ixgbe_set_vf_vlan_stripq(res->port_id, res->vf_id, is_on);
+       switch (ret) {
+       case 0:
+               break;
+       case -EINVAL:
+               printf("invalid vf_id %d or is_on %d\n", res->vf_id, is_on);
+               break;
+       case -ENODEV:
+               printf("invalid port_id %d\n", res->port_id);
+               break;
+       default:
+               printf("programming error: (%s)\n", strerror(-ret));
+       }
+}
+
+cmdline_parse_inst_t cmd_set_vf_vlan_stripq = {
+       .f = cmd_set_vf_vlan_stripq_parsed,
+       .data = NULL,
+       .help_str = "set vf vlan stripq port_id vf_id on|off",
+       .tokens = {
+               (void *)&cmd_vf_vlan_stripq_set,
+               (void *)&cmd_vf_vlan_stripq_vf,
+               (void *)&cmd_vf_vlan_stripq_vlan,
+               (void *)&cmd_vf_vlan_stripq_stripq,
+               (void *)&cmd_vf_vlan_stripq_port_id,
+               (void *)&cmd_vf_vlan_stripq_vf_id,
+               (void *)&cmd_vf_vlan_stripq_on_off,
+               NULL,
+       },
+};
+
+/* vf vlan insert configuration */
+
+/* Common result structure for vf vlan insert */
+struct cmd_vf_vlan_insert_result {
+       cmdline_fixed_string_t set;
+       cmdline_fixed_string_t vf;
+       cmdline_fixed_string_t vlan;
+       cmdline_fixed_string_t insert;
+       uint8_t port_id;
+       uint16_t vf_id;
+       cmdline_fixed_string_t on_off;
+};
+
+/* Common CLI fields for vf vlan insert enable disable */
+cmdline_parse_token_string_t cmd_vf_vlan_insert_set =
+       TOKEN_STRING_INITIALIZER
+               (struct cmd_vf_vlan_insert_result,
+                set, "set");
+cmdline_parse_token_string_t cmd_vf_vlan_insert_vf =
+       TOKEN_STRING_INITIALIZER
+               (struct cmd_vf_vlan_insert_result,
+                vf, "vf");
+cmdline_parse_token_string_t cmd_vf_vlan_insert_vlan =
+       TOKEN_STRING_INITIALIZER
+               (struct cmd_vf_vlan_insert_result,
+                vlan, "vlan");
+cmdline_parse_token_string_t cmd_vf_vlan_insert_insert =
+       TOKEN_STRING_INITIALIZER
+               (struct cmd_vf_vlan_insert_result,
+                insert, "insert");
+cmdline_parse_token_num_t cmd_vf_vlan_insert_port_id =
+       TOKEN_NUM_INITIALIZER
+               (struct cmd_vf_vlan_insert_result,
+                port_id, UINT8);
+cmdline_parse_token_num_t cmd_vf_vlan_insert_vf_id =
+       TOKEN_NUM_INITIALIZER
+               (struct cmd_vf_vlan_insert_result,
+                vf_id, UINT16);
+cmdline_parse_token_string_t cmd_vf_vlan_insert_on_off =
+       TOKEN_STRING_INITIALIZER
+               (struct cmd_vf_vlan_insert_result,
+                on_off, "on#off");
+
+static void
+cmd_set_vf_vlan_insert_parsed(
+       void *parsed_result,
+       __attribute__((unused)) struct cmdline *cl,
+       __attribute__((unused)) void *data)
+{
+       struct cmd_vf_vlan_insert_result *res = parsed_result;
+       int ret;
+       int is_on = (strcmp(res->on_off, "on") == 0) ? 1 : 0;
+
+       ret = rte_pmd_ixgbe_set_vf_vlan_insert(res->port_id, res->vf_id, is_on);
+       switch (ret) {
+       case 0:
+               break;
+       case -EINVAL:
+               printf("invalid vf_id %d or is_on %d\n", res->vf_id, is_on);
+               break;
+       case -ENODEV:
+               printf("invalid port_id %d\n", res->port_id);
+               break;
+       default:
+               printf("programming error: (%s)\n", strerror(-ret));
+       }
+}
+
+cmdline_parse_inst_t cmd_set_vf_vlan_insert = {
+       .f = cmd_set_vf_vlan_insert_parsed,
+       .data = NULL,
+       .help_str = "set vf vlan insert port_id vf_id on|off",
+       .tokens = {
+               (void *)&cmd_vf_vlan_insert_set,
+               (void *)&cmd_vf_vlan_insert_vf,
+               (void *)&cmd_vf_vlan_insert_vlan,
+               (void *)&cmd_vf_vlan_insert_insert,
+               (void *)&cmd_vf_vlan_insert_port_id,
+               (void *)&cmd_vf_vlan_insert_vf_id,
+               (void *)&cmd_vf_vlan_insert_on_off,
+               NULL,
+       },
+};
+
+/* tx loopback configuration */
+
+/* Common result structure for tx loopback */
+struct cmd_tx_loopback_result {
+       cmdline_fixed_string_t set;
+       cmdline_fixed_string_t tx;
+       cmdline_fixed_string_t loopback;
+       uint8_t port_id;
+       cmdline_fixed_string_t on_off;
+};
+
+/* Common CLI fields for tx loopback enable disable */
+cmdline_parse_token_string_t cmd_tx_loopback_set =
+       TOKEN_STRING_INITIALIZER
+               (struct cmd_tx_loopback_result,
+                set, "set");
+cmdline_parse_token_string_t cmd_tx_loopback_tx =
+       TOKEN_STRING_INITIALIZER
+               (struct cmd_tx_loopback_result,
+                tx, "tx");
+cmdline_parse_token_string_t cmd_tx_loopback_loopback =
+       TOKEN_STRING_INITIALIZER
+               (struct cmd_tx_loopback_result,
+                loopback, "loopback");
+cmdline_parse_token_num_t cmd_tx_loopback_port_id =
+       TOKEN_NUM_INITIALIZER
+               (struct cmd_tx_loopback_result,
+                port_id, UINT8);
+cmdline_parse_token_string_t cmd_tx_loopback_on_off =
+       TOKEN_STRING_INITIALIZER
+               (struct cmd_tx_loopback_result,
+                on_off, "on#off");
+
+static void
+cmd_set_tx_loopback_parsed(
+       void *parsed_result,
+       __attribute__((unused)) struct cmdline *cl,
+       __attribute__((unused)) void *data)
+{
+       struct cmd_tx_loopback_result *res = parsed_result;
+       int ret;
+       int is_on = (strcmp(res->on_off, "on") == 0) ? 1 : 0;
+
+       ret = rte_pmd_ixgbe_set_tx_loopback(res->port_id, is_on);
+       switch (ret) {
+       case 0:
+               break;
+       case -EINVAL:
+               printf("invalid is_on %d\n", is_on);
+               break;
+       case -ENODEV:
+               printf("invalid port_id %d\n", res->port_id);
+               break;
+       default:
+               printf("programming error: (%s)\n", strerror(-ret));
+       }
+}
+
+cmdline_parse_inst_t cmd_set_tx_loopback = {
+       .f = cmd_set_tx_loopback_parsed,
+       .data = NULL,
+       .help_str = "set tx loopback port_id on|off",
+       .tokens = {
+               (void *)&cmd_tx_loopback_set,
+               (void *)&cmd_tx_loopback_tx,
+               (void *)&cmd_tx_loopback_loopback,
+               (void *)&cmd_tx_loopback_port_id,
+               (void *)&cmd_tx_loopback_on_off,
+               NULL,
+       },
+};
+
+/* all queues drop enable configuration */
+
+/* Common result structure for all queues drop enable */
+struct cmd_all_queues_drop_en_result {
+       cmdline_fixed_string_t set;
+       cmdline_fixed_string_t all;
+       cmdline_fixed_string_t queues;
+       cmdline_fixed_string_t drop;
+       uint8_t port_id;
+       cmdline_fixed_string_t on_off;
+};
+
+/* Common CLI fields for tx loopback enable disable */
+cmdline_parse_token_string_t cmd_all_queues_drop_en_set =
+       TOKEN_STRING_INITIALIZER
+               (struct cmd_all_queues_drop_en_result,
+                set, "set");
+cmdline_parse_token_string_t cmd_all_queues_drop_en_all =
+       TOKEN_STRING_INITIALIZER
+               (struct cmd_all_queues_drop_en_result,
+                all, "all");
+cmdline_parse_token_string_t cmd_all_queues_drop_en_queues =
+       TOKEN_STRING_INITIALIZER
+               (struct cmd_all_queues_drop_en_result,
+                queues, "queues");
+cmdline_parse_token_string_t cmd_all_queues_drop_en_drop =
+       TOKEN_STRING_INITIALIZER
+               (struct cmd_all_queues_drop_en_result,
+                drop, "drop");
+cmdline_parse_token_num_t cmd_all_queues_drop_en_port_id =
+       TOKEN_NUM_INITIALIZER
+               (struct cmd_all_queues_drop_en_result,
+                port_id, UINT8);
+cmdline_parse_token_string_t cmd_all_queues_drop_en_on_off =
+       TOKEN_STRING_INITIALIZER
+               (struct cmd_all_queues_drop_en_result,
+                on_off, "on#off");
+
+static void
+cmd_set_all_queues_drop_en_parsed(
+       void *parsed_result,
+       __attribute__((unused)) struct cmdline *cl,
+       __attribute__((unused)) void *data)
+{
+       struct cmd_all_queues_drop_en_result *res = parsed_result;
+       int ret = 0;
+       int is_on = (strcmp(res->on_off, "on") == 0) ? 1 : 0;
+
+       ret = rte_pmd_ixgbe_set_all_queues_drop_en(res->port_id, is_on);
+       switch (ret) {
+       case 0:
+               break;
+       case -EINVAL:
+               printf("invalid is_on %d\n", is_on);
+               break;
+       case -ENODEV:
+               printf("invalid port_id %d\n", res->port_id);
+               break;
+       default:
+               printf("programming error: (%s)\n", strerror(-ret));
+       }
+}
+
+cmdline_parse_inst_t cmd_set_all_queues_drop_en = {
+       .f = cmd_set_all_queues_drop_en_parsed,
+       .data = NULL,
+       .help_str = "set all queues drop port_id on|off",
+       .tokens = {
+               (void *)&cmd_all_queues_drop_en_set,
+               (void *)&cmd_all_queues_drop_en_all,
+               (void *)&cmd_all_queues_drop_en_queues,
+               (void *)&cmd_all_queues_drop_en_drop,
+               (void *)&cmd_all_queues_drop_en_port_id,
+               (void *)&cmd_all_queues_drop_en_on_off,
+               NULL,
+       },
+};
+
+/* vf split drop enable configuration */
+
+/* Common result structure for vf split drop enable */
+struct cmd_vf_split_drop_en_result {
+       cmdline_fixed_string_t set;
+       cmdline_fixed_string_t vf;
+       cmdline_fixed_string_t split;
+       cmdline_fixed_string_t drop;
+       uint8_t port_id;
+       uint16_t vf_id;
+       cmdline_fixed_string_t on_off;
+};
+
+/* Common CLI fields for vf split drop enable disable */
+cmdline_parse_token_string_t cmd_vf_split_drop_en_set =
+       TOKEN_STRING_INITIALIZER
+               (struct cmd_vf_split_drop_en_result,
+                set, "set");
+cmdline_parse_token_string_t cmd_vf_split_drop_en_vf =
+       TOKEN_STRING_INITIALIZER
+               (struct cmd_vf_split_drop_en_result,
+                vf, "vf");
+cmdline_parse_token_string_t cmd_vf_split_drop_en_split =
+       TOKEN_STRING_INITIALIZER
+               (struct cmd_vf_split_drop_en_result,
+                split, "split");
+cmdline_parse_token_string_t cmd_vf_split_drop_en_drop =
+       TOKEN_STRING_INITIALIZER
+               (struct cmd_vf_split_drop_en_result,
+                drop, "drop");
+cmdline_parse_token_num_t cmd_vf_split_drop_en_port_id =
+       TOKEN_NUM_INITIALIZER
+               (struct cmd_vf_split_drop_en_result,
+                port_id, UINT8);
+cmdline_parse_token_num_t cmd_vf_split_drop_en_vf_id =
+       TOKEN_NUM_INITIALIZER
+               (struct cmd_vf_split_drop_en_result,
+                vf_id, UINT16);
+cmdline_parse_token_string_t cmd_vf_split_drop_en_on_off =
+       TOKEN_STRING_INITIALIZER
+               (struct cmd_vf_split_drop_en_result,
+                on_off, "on#off");
+
+static void
+cmd_set_vf_split_drop_en_parsed(
+       void *parsed_result,
+       __attribute__((unused)) struct cmdline *cl,
+       __attribute__((unused)) void *data)
+{
+       struct cmd_vf_split_drop_en_result *res = parsed_result;
+       int ret;
+       int is_on = (strcmp(res->on_off, "on") == 0) ? 1 : 0;
+
+       ret = rte_pmd_ixgbe_set_vf_split_drop_en(res->port_id, res->vf_id,
+                       is_on);
+       switch (ret) {
+       case 0:
+               break;
+       case -EINVAL:
+               printf("invalid vf_id %d or is_on %d\n", res->vf_id, is_on);
+               break;
+       case -ENODEV:
+               printf("invalid port_id %d\n", res->port_id);
+               break;
+       default:
+               printf("programming error: (%s)\n", strerror(-ret));
+       }
+}
+
+cmdline_parse_inst_t cmd_set_vf_split_drop_en = {
+       .f = cmd_set_vf_split_drop_en_parsed,
+       .data = NULL,
+       .help_str = "set vf split drop port_id vf_id on|off",
+       .tokens = {
+               (void *)&cmd_vf_split_drop_en_set,
+               (void *)&cmd_vf_split_drop_en_vf,
+               (void *)&cmd_vf_split_drop_en_split,
+               (void *)&cmd_vf_split_drop_en_drop,
+               (void *)&cmd_vf_split_drop_en_port_id,
+               (void *)&cmd_vf_split_drop_en_vf_id,
+               (void *)&cmd_vf_split_drop_en_on_off,
+               NULL,
+       },
+};
+
+/* vf mac address configuration */
+
+/* Common result structure for vf mac address */
+struct cmd_set_vf_mac_addr_result {
+       cmdline_fixed_string_t set;
+       cmdline_fixed_string_t vf;
+       cmdline_fixed_string_t mac;
+       cmdline_fixed_string_t addr;
+       uint8_t port_id;
+       uint16_t vf_id;
+       struct ether_addr mac_addr;
+
+};
+
+/* Common CLI fields for vf split drop enable disable */
+cmdline_parse_token_string_t cmd_set_vf_mac_addr_set =
+       TOKEN_STRING_INITIALIZER
+               (struct cmd_set_vf_mac_addr_result,
+                set, "set");
+cmdline_parse_token_string_t cmd_set_vf_mac_addr_vf =
+       TOKEN_STRING_INITIALIZER
+               (struct cmd_set_vf_mac_addr_result,
+                vf, "vf");
+cmdline_parse_token_string_t cmd_set_vf_mac_addr_mac =
+       TOKEN_STRING_INITIALIZER
+               (struct cmd_set_vf_mac_addr_result,
+                mac, "mac");
+cmdline_parse_token_string_t cmd_set_vf_mac_addr_addr =
+       TOKEN_STRING_INITIALIZER
+               (struct cmd_set_vf_mac_addr_result,
+                addr, "addr");
+cmdline_parse_token_num_t cmd_set_vf_mac_addr_port_id =
+       TOKEN_NUM_INITIALIZER
+               (struct cmd_set_vf_mac_addr_result,
+                port_id, UINT8);
+cmdline_parse_token_num_t cmd_set_vf_mac_addr_vf_id =
+       TOKEN_NUM_INITIALIZER
+               (struct cmd_set_vf_mac_addr_result,
+                vf_id, UINT16);
+cmdline_parse_token_etheraddr_t cmd_set_vf_mac_addr_mac_addr =
+       TOKEN_ETHERADDR_INITIALIZER(struct cmd_set_vf_mac_addr_result,
+                mac_addr);
+
+static void
+cmd_set_vf_mac_addr_parsed(
+       void *parsed_result,
+       __attribute__((unused)) struct cmdline *cl,
+       __attribute__((unused)) void *data)
+{
+       struct cmd_set_vf_mac_addr_result *res = parsed_result;
+       int ret;
+
+       ret = rte_pmd_ixgbe_set_vf_mac_addr(res->port_id, res->vf_id,
+                       &res->mac_addr);
+       switch (ret) {
+       case 0:
+               break;
+       case -EINVAL:
+               printf("invalid vf_id %d or mac_addr\n", res->vf_id);
+               break;
+       case -ENODEV:
+               printf("invalid port_id %d\n", res->port_id);
+               break;
+       default:
+               printf("programming error: (%s)\n", strerror(-ret));
+       }
+}
+
+cmdline_parse_inst_t cmd_set_vf_mac_addr = {
+       .f = cmd_set_vf_mac_addr_parsed,
+       .data = NULL,
+       .help_str = "set vf mac addr port_id vf_id xx:xx:xx:xx:xx:xx",
+       .tokens = {
+               (void *)&cmd_set_vf_mac_addr_set,
+               (void *)&cmd_set_vf_mac_addr_vf,
+               (void *)&cmd_set_vf_mac_addr_mac,
+               (void *)&cmd_set_vf_mac_addr_addr,
+               (void *)&cmd_set_vf_mac_addr_port_id,
+               (void *)&cmd_set_vf_mac_addr_vf_id,
+               (void *)&cmd_set_vf_mac_addr_mac_addr,
+               NULL,
+       },
+};
+#endif
 
 /* ******************************************************************************** */
 
@@ -10659,6 +11473,8 @@ cmdline_parse_ctx_t main_ctx[] = {
        (cmdline_parse_inst_t *)&cmd_csum_tunnel,
        (cmdline_parse_inst_t *)&cmd_tso_set,
        (cmdline_parse_inst_t *)&cmd_tso_show,
+       (cmdline_parse_inst_t *)&cmd_tunnel_tso_set,
+       (cmdline_parse_inst_t *)&cmd_tunnel_tso_show,
        (cmdline_parse_inst_t *)&cmd_link_flow_control_set,
        (cmdline_parse_inst_t *)&cmd_link_flow_control_set_rx,
        (cmdline_parse_inst_t *)&cmd_link_flow_control_set_tx,
@@ -10752,6 +11568,16 @@ cmdline_parse_ctx_t main_ctx[] = {
        (cmdline_parse_inst_t *)&cmd_config_e_tag_forwarding_en_dis,
        (cmdline_parse_inst_t *)&cmd_config_e_tag_filter_add,
        (cmdline_parse_inst_t *)&cmd_config_e_tag_filter_del,
+#ifdef RTE_LIBRTE_IXGBE_PMD
+       (cmdline_parse_inst_t *)&cmd_set_vf_vlan_anti_spoof,
+       (cmdline_parse_inst_t *)&cmd_set_vf_mac_anti_spoof,
+       (cmdline_parse_inst_t *)&cmd_set_vf_vlan_stripq,
+       (cmdline_parse_inst_t *)&cmd_set_vf_vlan_insert,
+       (cmdline_parse_inst_t *)&cmd_set_tx_loopback,
+       (cmdline_parse_inst_t *)&cmd_set_all_queues_drop_en,
+       (cmdline_parse_inst_t *)&cmd_set_vf_split_drop_en,
+       (cmdline_parse_inst_t *)&cmd_set_vf_mac_addr,
+#endif
        NULL,
 };
 
@@ -10800,29 +11626,3 @@ cmd_reconfig_device_queue(portid_t id, uint8_t dev, uint8_t queue)
                        ports[id].need_reconfig_queues = queue;
        }
 }
-
-#ifdef RTE_NIC_BYPASS
-#include <rte_pci_dev_ids.h>
-uint8_t
-bypass_is_supported(portid_t port_id)
-{
-       struct rte_port   *port;
-       struct rte_pci_id *pci_id;
-
-       if (port_id_is_invalid(port_id, ENABLED_WARN))
-               return 0;
-
-       /* Get the device id. */
-       port    = &ports[port_id];
-       pci_id = &port->dev_info.pci_dev->id;
-
-       /* Check if NIC supports bypass. */
-       if (pci_id->device_id == IXGBE_DEV_ID_82599_BYPASS) {
-               return 1;
-       }
-       else {
-               printf("\tBypass not supported for port_id = %d.\n", port_id);
-               return 0;
-       }
-}
-#endif