app/testpmd: add csum parse-tunnel command
[dpdk.git] / app / test-pmd / cmdline.c
index daea21b..7d45439 100644 (file)
@@ -327,6 +327,12 @@ static void cmd_help_long_parsed(void *parsed_result,
                        " the forward engine)\n"
                        "    Please check the NIC datasheet for HW limits.\n\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"
 
@@ -2891,6 +2897,51 @@ struct cmd_csum_result {
        uint8_t port_id;
 };
 
+static void
+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("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(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);
+       }
+
+}
+
 static void
 cmd_csum_parsed(void *parsed_result,
                       __attribute__((unused)) struct cmdline *cl,
@@ -2898,8 +2949,7 @@ cmd_csum_parsed(void *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);
@@ -2928,41 +2978,7 @@ cmd_csum_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_csum_csum =
@@ -3012,6 +3028,63 @@ cmdline_parse_inst_t cmd_csum_show = {
        },
 };
 
+/* 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 = "enable/disable parsing of tunnels for csum engine: "
+       "csum parse_tunnel on|off <tx-port>",
+       .tokens = {
+               (void *)&cmd_csum_tunnel_csum,
+               (void *)&cmd_csum_tunnel_parse,
+               (void *)&cmd_csum_tunnel_onoff,
+               (void *)&cmd_csum_tunnel_portid,
+               NULL,
+       },
+};
+
 /* *** ENABLE HARDWARE SEGMENTATION IN TX PACKETS *** */
 struct cmd_tso_set_result {
        cmdline_fixed_string_t tso;
@@ -9061,6 +9134,7 @@ cmdline_parse_ctx_t main_ctx[] = {
        (cmdline_parse_inst_t *)&cmd_tx_vlan_set_pvid,
        (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,