app/testpmd: add csum parse-tunnel command

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 <olivier.matz@6wind.com>
Acked-by: Jijiang Liu <jijiang.liu@intel.com>
This commit is contained in:
Olivier Matz 2015-02-13 10:22:39 +01:00 committed by Thomas Monjalon
parent 75032511f3
commit 64fc36064d
3 changed files with 72 additions and 2 deletions

View 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"
@ -2898,6 +2904,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",
@ -3020,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;
@ -9069,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,

View File

@ -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

View File

@ -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.