From patchwork Wed Feb 4 09:25:13 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Olivier Matz X-Patchwork-Id: 2952 Return-Path: X-Original-To: patchwork@dpdk.org Delivered-To: patchwork@dpdk.org Received: from [92.243.14.124] (localhost [IPv6:::1]) by dpdk.org (Postfix) with ESMTP id 381F1ADD6; Wed, 4 Feb 2015 10:25:53 +0100 (CET) Received: from mail-wg0-f52.google.com (mail-wg0-f52.google.com [74.125.82.52]) by dpdk.org (Postfix) with ESMTP id 64FB5ADD6 for ; Wed, 4 Feb 2015 10:25:51 +0100 (CET) Received: by mail-wg0-f52.google.com with SMTP id y19so514085wgg.11 for ; Wed, 04 Feb 2015 01:25:51 -0800 (PST) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=yX4B36NEBfcZAQQ8+o5ZH9X3/6WBRDBLb0O8ykYbutg=; b=lPg3SgTbp/0AC51IdpLEqGn32nzSBjNCI+gvb/vNfXYJJy0Y3v3TgR1VuKpzjf4sA/ HOXUNoF87OylrqUCZCeU1s4KXBSaj0KARfVd5IEAqxpYr9eqYtcMRkO52v5Rl6l03AvR UQtJPRusPjLj3S9LjYZ1Gj3eJ5maHHJuS+gyEEsIbDdNH+qStZ0AT/rFwAk+zdkF4t17 eVe3aie2SOc1pQs1KrXzuhZZcm0IQOJ9oHWY0wvjLkBitTe8/ilnQCsN/M/oKW+e1Jys uOEg8FLn1uu78n6dFWQjRZolrqYdLydNClgoPr0DhsFEnu2qj+H2TgUhPByNxBZLaLSA EJLw== X-Gm-Message-State: ALoCoQmomayeIymr6lc6USdJDQGeBBRgB32h4cpXdpnbVo+Dtmj65vEmzew8gg4dFuVyQit2mVuM X-Received: by 10.180.23.36 with SMTP id j4mr2322265wif.69.1423041951288; Wed, 04 Feb 2015 01:25:51 -0800 (PST) Received: from glumotte.dev.6wind.com (6wind.net2.nerim.net. [213.41.180.237]) by mx.google.com with ESMTPSA id a13sm2346491wic.3.2015.02.04.01.25.49 (version=TLSv1.2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Wed, 04 Feb 2015 01:25:50 -0800 (PST) From: Olivier Matz To: dev@dpdk.org Date: Wed, 4 Feb 2015 10:25:13 +0100 Message-Id: <1423041925-26956-9-git-send-email-olivier.matz@6wind.com> X-Mailer: git-send-email 2.1.4 In-Reply-To: <1423041925-26956-1-git-send-email-olivier.matz@6wind.com> References: <1422623775-8050-1-git-send-email-olivier.matz@6wind.com> <1423041925-26956-1-git-send-email-olivier.matz@6wind.com> Subject: [dpdk-dev] [PATCH v2 08/20] testpmd: add csum parse_tunnel command X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: patches and discussions about DPDK List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Sender: "dev" Add a new command related to csum forward engine: csum parse-tunnel (on|off) (tx_port_id) If enabled, the tunnel packets received by the csum forward engine are parsed and seen as "outer-headers/inner-headers/data". If disabled, the parsing of the csum forward engine stops at the first l4 layer. A tunnel packet is seens as "headers/data" (inner headers are included in payload). Note: the port argument is the tx_port. It's more coherent compared to all other testpmd csum flags. Signed-off-by: Olivier Matz --- app/test-pmd/cmdline.c | 66 +++++++++++++++++++++++++++++++++++++++++++++++++ app/test-pmd/csumonly.c | 3 ++- app/test-pmd/testpmd.h | 5 +++- 3 files changed, 72 insertions(+), 2 deletions(-) diff --git a/app/test-pmd/cmdline.c b/app/test-pmd/cmdline.c index 55768f1..f57bf0b 100644 --- a/app/test-pmd/cmdline.c +++ b/app/test-pmd/cmdline.c @@ -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" @@ -2889,6 +2895,8 @@ csum_show(int port_id) 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", @@ -3011,6 +3019,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 ", + .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; @@ -9060,6 +9125,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, diff --git a/app/test-pmd/csumonly.c b/app/test-pmd/csumonly.c index ca5ca39..858eb47 100644 --- a/app/test-pmd/csumonly.c +++ b/app/test-pmd/csumonly.c @@ -373,7 +373,8 @@ pkt_burst_checksum_forward(struct fwd_stream *fs) l3_hdr = (char *)eth_hdr + l2_len; /* check if it's a supported tunnel (only vxlan for now) */ - if (l4_proto == IPPROTO_UDP) { + if ((testpmd_ol_flags & TESTPMD_TX_OFFLOAD_PARSE_TUNNEL) && + l4_proto == IPPROTO_UDP) { udp_hdr = (struct udp_hdr *)((char *)l3_hdr + l3_len); /* check udp destination port, 4789 is the default diff --git a/app/test-pmd/testpmd.h b/app/test-pmd/testpmd.h index 8f5e6c7..36277de 100644 --- a/app/test-pmd/testpmd.h +++ b/app/test-pmd/testpmd.h @@ -127,8 +127,11 @@ struct fwd_stream { #define TESTPMD_TX_OFFLOAD_SCTP_CKSUM 0x0008 /** Offload VxLAN checksum in csum forward engine */ #define TESTPMD_TX_OFFLOAD_VXLAN_CKSUM 0x0010 +/** Parse tunnel in csum forward engine. If set, dissect tunnel headers + * of rx packets. If not set, treat inner headers as payload. */ +#define TESTPMD_TX_OFFLOAD_PARSE_TUNNEL 0x0020 /** Insert VLAN header in forward engine */ -#define TESTPMD_TX_OFFLOAD_INSERT_VLAN 0x0020 +#define TESTPMD_TX_OFFLOAD_INSERT_VLAN 0x0040 /** * The data structure associated with each port.