virtio: suport multiple MAC addresses
[dpdk.git] / app / test-pmd / cmdline.c
index 590e427..d37610a 100644 (file)
@@ -317,17 +317,23 @@ static void cmd_help_long_parsed(void *parsed_result,
                        "    Disable hardware insertion of a VLAN header in"
                        " packets sent on a port.\n\n"
 
-                       "tx_cksum set (ip|udp|tcp|sctp|vxlan) (hw|sw) (port_id)\n"
+                       "csum set (ip|udp|tcp|sctp|outer-ip) (hw|sw) (port_id)\n"
                        "    Select hardware or software calculation of the"
                        " checksum with when transmitting a packet using the"
                        " csum forward engine.\n"
                        "    ip|udp|tcp|sctp always concern the inner layer.\n"
-                       "    vxlan concerns the outer IP and UDP layer (in"
-                       " case the packet is recognized as a vxlan packet by"
-                       " the forward engine)\n"
+                       "    outer-ip concerns the outer IP layer in"
+                       " case the packet is recognized as a tunnel packet by"
+                       " the forward engine (vxlan, gre and ipip are supported)\n"
                        "    Please check the NIC datasheet for HW limits.\n\n"
 
-                       "tx_checksum show (port_id)\n"
+                       "csum parse-tunnel (on|off) (tx_port_id)\n"
+                       "    If disabled, treat tunnel packets as non-tunneled"
+                       " packets (treat inner headers as payload). The port\n"
+                       "    argument is the port used for TX in csum forward"
+                       " engine.\n\n"
+
+                       "csum show (port_id)\n"
                        "    Display tx checksum offload configuration\n\n"
 
                        "tso set (segsize) (portid)\n"
@@ -2097,17 +2103,17 @@ cmd_config_thresh_parsed(void *parsed_result,
        }
 
        if (!strcmp(res->name, "txpt"))
-               tx_thresh.pthresh = res->value;
+               tx_pthresh = res->value;
        else if(!strcmp(res->name, "txht"))
-               tx_thresh.hthresh = res->value;
+               tx_hthresh = res->value;
        else if(!strcmp(res->name, "txwt"))
-               tx_thresh.wthresh = res->value;
+               tx_wthresh = res->value;
        else if(!strcmp(res->name, "rxpt"))
-               rx_thresh.pthresh = res->value;
+               rx_pthresh = res->value;
        else if(!strcmp(res->name, "rxht"))
-               rx_thresh.hthresh = res->value;
+               rx_hthresh = res->value;
        else if(!strcmp(res->name, "rxwt"))
-               rx_thresh.wthresh = res->value;
+               rx_wthresh = res->value;
        else {
                printf("Unknown parameter\n");
                return;
@@ -2316,6 +2322,11 @@ static void cmd_set_list_parsed(void *parsed_result,
        } parsed_items;
        unsigned int nb_item;
 
+       if (test_done == 0) {
+               printf("Please stop forwarding first\n");
+               return;
+       }
+
        res = parsed_result;
        if (!strcmp(res->list_name, "corelist")) {
                nb_item = parse_item_list(res->list_of_items, "core",
@@ -2370,6 +2381,10 @@ static void cmd_set_mask_parsed(void *parsed_result,
 {
        struct cmd_setmask_result *res = parsed_result;
 
+       if (test_done == 0) {
+               printf("Please stop forwarding first\n");
+               return;
+       }
        if (!strcmp(res->mask, "coremask"))
                set_fwd_lcores_mask(res->hexavalue);
        else if (!strcmp(res->mask, "portmask"))
@@ -2874,8 +2889,8 @@ cmdline_parse_inst_t cmd_tx_vlan_reset = {
 
 
 /* *** ENABLE HARDWARE INSERTION OF CHECKSUM IN TX PACKETS *** */
-struct cmd_tx_cksum_result {
-       cmdline_fixed_string_t tx_cksum;
+struct cmd_csum_result {
+       cmdline_fixed_string_t csum;
        cmdline_fixed_string_t mode;
        cmdline_fixed_string_t proto;
        cmdline_fixed_string_t hwsw;
@@ -2883,14 +2898,62 @@ struct cmd_tx_cksum_result {
 };
 
 static void
-cmd_tx_cksum_parsed(void *parsed_result,
+csum_show(int port_id)
+{
+       struct rte_eth_dev_info dev_info;
+       uint16_t ol_flags;
+
+       ol_flags = ports[port_id].tx_ol_flags;
+       printf("Parse tunnel is %s\n",
+               (ol_flags & TESTPMD_TX_OFFLOAD_PARSE_TUNNEL) ? "on" : "off");
+       printf("IP checksum offload is %s\n",
+               (ol_flags & TESTPMD_TX_OFFLOAD_IP_CKSUM) ? "hw" : "sw");
+       printf("UDP checksum offload is %s\n",
+               (ol_flags & TESTPMD_TX_OFFLOAD_UDP_CKSUM) ? "hw" : "sw");
+       printf("TCP checksum offload is %s\n",
+               (ol_flags & TESTPMD_TX_OFFLOAD_TCP_CKSUM) ? "hw" : "sw");
+       printf("SCTP checksum offload is %s\n",
+               (ol_flags & TESTPMD_TX_OFFLOAD_SCTP_CKSUM) ? "hw" : "sw");
+       printf("Outer-Ip checksum offload is %s\n",
+               (ol_flags & TESTPMD_TX_OFFLOAD_OUTER_IP_CKSUM) ? "hw" : "sw");
+
+       /* display warnings if configuration is not supported by the NIC */
+       rte_eth_dev_info_get(port_id, &dev_info);
+       if ((ol_flags & TESTPMD_TX_OFFLOAD_IP_CKSUM) &&
+               (dev_info.tx_offload_capa & DEV_TX_OFFLOAD_IPV4_CKSUM) == 0) {
+               printf("Warning: hardware IP checksum enabled but not "
+                       "supported by port %d\n", port_id);
+       }
+       if ((ol_flags & TESTPMD_TX_OFFLOAD_UDP_CKSUM) &&
+               (dev_info.tx_offload_capa & DEV_TX_OFFLOAD_UDP_CKSUM) == 0) {
+               printf("Warning: hardware UDP checksum enabled but not "
+                       "supported by port %d\n", port_id);
+       }
+       if ((ol_flags & TESTPMD_TX_OFFLOAD_TCP_CKSUM) &&
+               (dev_info.tx_offload_capa & DEV_TX_OFFLOAD_TCP_CKSUM) == 0) {
+               printf("Warning: hardware TCP checksum enabled but not "
+                       "supported by port %d\n", port_id);
+       }
+       if ((ol_flags & TESTPMD_TX_OFFLOAD_SCTP_CKSUM) &&
+               (dev_info.tx_offload_capa & DEV_TX_OFFLOAD_SCTP_CKSUM) == 0) {
+               printf("Warning: hardware SCTP checksum enabled but not "
+                       "supported by port %d\n", port_id);
+       }
+       if ((ol_flags & TESTPMD_TX_OFFLOAD_OUTER_IP_CKSUM) &&
+               (dev_info.tx_offload_capa & DEV_TX_OFFLOAD_OUTER_IPV4_CKSUM) == 0) {
+               printf("Warning: hardware outer IP checksum enabled but not "
+                       "supported by port %d\n", port_id);
+       }
+}
+
+static void
+cmd_csum_parsed(void *parsed_result,
                       __attribute__((unused)) struct cmdline *cl,
                       __attribute__((unused)) void *data)
 {
-       struct cmd_tx_cksum_result *res = parsed_result;
+       struct cmd_csum_result *res = parsed_result;
        int hw = 0;
-       uint16_t ol_flags, mask = 0;
-       struct rte_eth_dev_info dev_info;
+       uint16_t mask = 0;
 
        if (port_id_is_invalid(res->port_id)) {
                printf("invalid port %d\n", res->port_id);
@@ -2910,8 +2973,8 @@ cmd_tx_cksum_parsed(void *parsed_result,
                        mask = TESTPMD_TX_OFFLOAD_TCP_CKSUM;
                } else if (!strcmp(res->proto, "sctp")) {
                        mask = TESTPMD_TX_OFFLOAD_SCTP_CKSUM;
-               } else if (!strcmp(res->proto, "vxlan")) {
-                       mask = TESTPMD_TX_OFFLOAD_VXLAN_CKSUM;
+               } else if (!strcmp(res->proto, "outer-ip")) {
+                       mask = TESTPMD_TX_OFFLOAD_OUTER_IP_CKSUM;
                }
 
                if (hw)
@@ -2919,86 +2982,109 @@ cmd_tx_cksum_parsed(void *parsed_result,
                else
                        ports[res->port_id].tx_ol_flags &= (~mask);
        }
-
-       ol_flags = ports[res->port_id].tx_ol_flags;
-       printf("IP checksum offload is %s\n",
-               (ol_flags & TESTPMD_TX_OFFLOAD_IP_CKSUM) ? "hw" : "sw");
-       printf("UDP checksum offload is %s\n",
-               (ol_flags & TESTPMD_TX_OFFLOAD_UDP_CKSUM) ? "hw" : "sw");
-       printf("TCP checksum offload is %s\n",
-               (ol_flags & TESTPMD_TX_OFFLOAD_TCP_CKSUM) ? "hw" : "sw");
-       printf("SCTP checksum offload is %s\n",
-               (ol_flags & TESTPMD_TX_OFFLOAD_SCTP_CKSUM) ? "hw" : "sw");
-       printf("VxLAN checksum offload is %s\n",
-               (ol_flags & TESTPMD_TX_OFFLOAD_VXLAN_CKSUM) ? "hw" : "sw");
-
-       /* display warnings if configuration is not supported by the NIC */
-       rte_eth_dev_info_get(res->port_id, &dev_info);
-       if ((ol_flags & TESTPMD_TX_OFFLOAD_IP_CKSUM) &&
-               (dev_info.tx_offload_capa & DEV_TX_OFFLOAD_IPV4_CKSUM) == 0) {
-               printf("Warning: hardware IP checksum enabled but not "
-                       "supported by port %d\n", res->port_id);
-       }
-       if ((ol_flags & TESTPMD_TX_OFFLOAD_UDP_CKSUM) &&
-               (dev_info.tx_offload_capa & DEV_TX_OFFLOAD_UDP_CKSUM) == 0) {
-               printf("Warning: hardware UDP checksum enabled but not "
-                       "supported by port %d\n", res->port_id);
-       }
-       if ((ol_flags & TESTPMD_TX_OFFLOAD_TCP_CKSUM) &&
-               (dev_info.tx_offload_capa & DEV_TX_OFFLOAD_TCP_CKSUM) == 0) {
-               printf("Warning: hardware TCP checksum enabled but not "
-                       "supported by port %d\n", res->port_id);
-       }
-       if ((ol_flags & TESTPMD_TX_OFFLOAD_SCTP_CKSUM) &&
-               (dev_info.tx_offload_capa & DEV_TX_OFFLOAD_SCTP_CKSUM) == 0) {
-               printf("Warning: hardware SCTP checksum enabled but not "
-                       "supported by port %d\n", res->port_id);
-       }
+       csum_show(res->port_id);
 }
 
-cmdline_parse_token_string_t cmd_tx_cksum_tx_cksum =
-       TOKEN_STRING_INITIALIZER(struct cmd_tx_cksum_result,
-                               tx_cksum, "tx_checksum");
-cmdline_parse_token_string_t cmd_tx_cksum_mode =
-       TOKEN_STRING_INITIALIZER(struct cmd_tx_cksum_result,
+cmdline_parse_token_string_t cmd_csum_csum =
+       TOKEN_STRING_INITIALIZER(struct cmd_csum_result,
+                               csum, "csum");
+cmdline_parse_token_string_t cmd_csum_mode =
+       TOKEN_STRING_INITIALIZER(struct cmd_csum_result,
                                mode, "set");
-cmdline_parse_token_string_t cmd_tx_cksum_proto =
-       TOKEN_STRING_INITIALIZER(struct cmd_tx_cksum_result,
-                               proto, "ip#tcp#udp#sctp#vxlan");
-cmdline_parse_token_string_t cmd_tx_cksum_hwsw =
-       TOKEN_STRING_INITIALIZER(struct cmd_tx_cksum_result,
+cmdline_parse_token_string_t cmd_csum_proto =
+       TOKEN_STRING_INITIALIZER(struct cmd_csum_result,
+                               proto, "ip#tcp#udp#sctp#outer-ip");
+cmdline_parse_token_string_t cmd_csum_hwsw =
+       TOKEN_STRING_INITIALIZER(struct cmd_csum_result,
                                hwsw, "hw#sw");
-cmdline_parse_token_num_t cmd_tx_cksum_portid =
-       TOKEN_NUM_INITIALIZER(struct cmd_tx_cksum_result,
+cmdline_parse_token_num_t cmd_csum_portid =
+       TOKEN_NUM_INITIALIZER(struct cmd_csum_result,
                                port_id, UINT8);
 
-cmdline_parse_inst_t cmd_tx_cksum_set = {
-       .f = cmd_tx_cksum_parsed,
+cmdline_parse_inst_t cmd_csum_set = {
+       .f = cmd_csum_parsed,
        .data = NULL,
        .help_str = "enable/disable hardware calculation of L3/L4 checksum when "
-               "using csum forward engine: tx_cksum set ip|tcp|udp|sctp|vxlan hw|sw <port>",
+               "using csum forward engine: csum set ip|tcp|udp|sctp|outer-ip hw|sw <port>",
        .tokens = {
-               (void *)&cmd_tx_cksum_tx_cksum,
-               (void *)&cmd_tx_cksum_mode,
-               (void *)&cmd_tx_cksum_proto,
-               (void *)&cmd_tx_cksum_hwsw,
-               (void *)&cmd_tx_cksum_portid,
+               (void *)&cmd_csum_csum,
+               (void *)&cmd_csum_mode,
+               (void *)&cmd_csum_proto,
+               (void *)&cmd_csum_hwsw,
+               (void *)&cmd_csum_portid,
                NULL,
        },
 };
 
-cmdline_parse_token_string_t cmd_tx_cksum_mode_show =
-       TOKEN_STRING_INITIALIZER(struct cmd_tx_cksum_result,
+cmdline_parse_token_string_t cmd_csum_mode_show =
+       TOKEN_STRING_INITIALIZER(struct cmd_csum_result,
                                mode, "show");
 
-cmdline_parse_inst_t cmd_tx_cksum_show = {
-       .f = cmd_tx_cksum_parsed,
+cmdline_parse_inst_t cmd_csum_show = {
+       .f = cmd_csum_parsed,
+       .data = NULL,
+       .help_str = "show checksum offload configuration: csum show <port>",
+       .tokens = {
+               (void *)&cmd_csum_csum,
+               (void *)&cmd_csum_mode_show,
+               (void *)&cmd_csum_portid,
+               NULL,
+       },
+};
+
+/* Enable/disable tunnel parsing */
+struct cmd_csum_tunnel_result {
+       cmdline_fixed_string_t csum;
+       cmdline_fixed_string_t parse;
+       cmdline_fixed_string_t onoff;
+       uint8_t port_id;
+};
+
+static void
+cmd_csum_tunnel_parsed(void *parsed_result,
+                      __attribute__((unused)) struct cmdline *cl,
+                      __attribute__((unused)) void *data)
+{
+       struct cmd_csum_tunnel_result *res = parsed_result;
+
+       if (port_id_is_invalid(res->port_id)) {
+               printf("invalid port %d\n", res->port_id);
+               return;
+       }
+
+       if (!strcmp(res->onoff, "on"))
+               ports[res->port_id].tx_ol_flags |=
+                       TESTPMD_TX_OFFLOAD_PARSE_TUNNEL;
+       else
+               ports[res->port_id].tx_ol_flags &=
+                       (~TESTPMD_TX_OFFLOAD_PARSE_TUNNEL);
+
+       csum_show(res->port_id);
+}
+
+cmdline_parse_token_string_t cmd_csum_tunnel_csum =
+       TOKEN_STRING_INITIALIZER(struct cmd_csum_tunnel_result,
+                               csum, "csum");
+cmdline_parse_token_string_t cmd_csum_tunnel_parse =
+       TOKEN_STRING_INITIALIZER(struct cmd_csum_tunnel_result,
+                               parse, "parse_tunnel");
+cmdline_parse_token_string_t cmd_csum_tunnel_onoff =
+       TOKEN_STRING_INITIALIZER(struct cmd_csum_tunnel_result,
+                               onoff, "on#off");
+cmdline_parse_token_num_t cmd_csum_tunnel_portid =
+       TOKEN_NUM_INITIALIZER(struct cmd_csum_tunnel_result,
+                               port_id, UINT8);
+
+cmdline_parse_inst_t cmd_csum_tunnel = {
+       .f = cmd_csum_tunnel_parsed,
        .data = NULL,
-       .help_str = "show checksum offload configuration: tx_cksum show <port>",
+       .help_str = "enable/disable parsing of tunnels for csum engine: "
+       "csum parse_tunnel on|off <tx-port>",
        .tokens = {
-               (void *)&cmd_tx_cksum_tx_cksum,
-               (void *)&cmd_tx_cksum_mode_show,
-               (void *)&cmd_tx_cksum_portid,
+               (void *)&cmd_csum_tunnel_csum,
+               (void *)&cmd_csum_tunnel_parse,
+               (void *)&cmd_csum_tunnel_onoff,
+               (void *)&cmd_csum_tunnel_portid,
                NULL,
        },
 };
@@ -5108,7 +5194,7 @@ cmd_link_flow_ctrl_set_parsed(void *parsed_result,
        struct cmd_link_flow_ctrl_set_result *res = parsed_result;
        cmdline_parse_inst_t *cmd = data;
        struct rte_eth_fc_conf fc_conf;
-       int rx_fc_en, tx_fc_en;
+       int rx_fc_en, tx_fc_en = 0;
        int ret;
 
        /*
@@ -5584,7 +5670,7 @@ cmdline_parse_token_string_t cmd_showport_what =
        TOKEN_STRING_INITIALIZER(struct cmd_showport_result, what,
                                 "info#stats#xstats#fdir#stat_qmap");
 cmdline_parse_token_num_t cmd_showport_portnum =
-       TOKEN_NUM_INITIALIZER(struct cmd_showport_result, portnum, INT32);
+       TOKEN_NUM_INITIALIZER(struct cmd_showport_result, portnum, UINT8);
 
 cmdline_parse_inst_t cmd_showport = {
        .f = cmd_showport_parsed,
@@ -9050,8 +9136,9 @@ cmdline_parse_ctx_t main_ctx[] = {
        (cmdline_parse_inst_t *)&cmd_tx_vlan_set,
        (cmdline_parse_inst_t *)&cmd_tx_vlan_reset,
        (cmdline_parse_inst_t *)&cmd_tx_vlan_set_pvid,
-       (cmdline_parse_inst_t *)&cmd_tx_cksum_set,
-       (cmdline_parse_inst_t *)&cmd_tx_cksum_show,
+       (cmdline_parse_inst_t *)&cmd_csum_set,
+       (cmdline_parse_inst_t *)&cmd_csum_show,
+       (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_link_flow_control_set,