app/testpmd: support metadata as flow rule item

As described in [1], this series adds option to set metadata value
as match pattern when creating a new flow rule.

This patch introduces additional options in testpmd commands:
- New item type "meta" "data"
- New per-port offload flag "match_metadata".

It also adds commands to configure the tx_metadata value to use:
- New 'config' command takes a 32 bit value and stores it per port:
	port config <port_id> tx_metadata <value>
  testpmd will add to any Tx packet sent from this port the metadata
  value, and set ol_flags accordingly.
- A matching 'show' command is added to read the configured value:
	port config <port_id> tx_metadata <value>

[1] "ethdev: support metadata as flow rule criteria"

Signed-off-by: Dekel Peled <dekelp@mellanox.com>
Reviewed-by: Ferruh Yigit <ferruh.yigit@intel.com>
This commit is contained in:
Dekel Peled 2018-10-21 17:22:48 +03:00 committed by Ferruh Yigit
parent 839b20be0e
commit c18feafa19
6 changed files with 172 additions and 4 deletions

View File

@ -17499,7 +17499,8 @@ cmdline_parse_token_string_t cmd_config_per_port_tx_offload_result_offload =
"sctp_cksum#tcp_tso#udp_tso#outer_ipv4_cksum#"
"qinq_insert#vxlan_tnl_tso#gre_tnl_tso#"
"ipip_tnl_tso#geneve_tnl_tso#macsec_insert#"
"mt_lockfree#multi_segs#mbuf_fast_free#security");
"mt_lockfree#multi_segs#mbuf_fast_free#security#"
"match_metadata");
cmdline_parse_token_string_t cmd_config_per_port_tx_offload_result_on_off =
TOKEN_STRING_INITIALIZER
(struct cmd_config_per_port_tx_offload_result,
@ -17580,8 +17581,8 @@ cmdline_parse_inst_t cmd_config_per_port_tx_offload = {
"sctp_cksum|tcp_tso|udp_tso|outer_ipv4_cksum|"
"qinq_insert|vxlan_tnl_tso|gre_tnl_tso|"
"ipip_tnl_tso|geneve_tnl_tso|macsec_insert|"
"mt_lockfree|multi_segs|mbuf_fast_free|security "
"on|off",
"mt_lockfree|multi_segs|mbuf_fast_free|security|"
"match_metadata on|off",
.tokens = {
(void *)&cmd_config_per_port_tx_offload_result_port,
(void *)&cmd_config_per_port_tx_offload_result_config,
@ -17698,6 +17699,108 @@ cmdline_parse_inst_t cmd_config_per_queue_tx_offload = {
}
};
/* *** configure tx_metadata for specific port *** */
struct cmd_config_tx_metadata_specific_result {
cmdline_fixed_string_t port;
cmdline_fixed_string_t keyword;
uint16_t port_id;
cmdline_fixed_string_t item;
uint32_t value;
};
static void
cmd_config_tx_metadata_specific_parsed(void *parsed_result,
__attribute__((unused)) struct cmdline *cl,
__attribute__((unused)) void *data)
{
struct cmd_config_tx_metadata_specific_result *res = parsed_result;
if (port_id_is_invalid(res->port_id, ENABLED_WARN))
return;
ports[res->port_id].tx_metadata = rte_cpu_to_be_32(res->value);
}
cmdline_parse_token_string_t cmd_config_tx_metadata_specific_port =
TOKEN_STRING_INITIALIZER(struct cmd_config_tx_metadata_specific_result,
port, "port");
cmdline_parse_token_string_t cmd_config_tx_metadata_specific_keyword =
TOKEN_STRING_INITIALIZER(struct cmd_config_tx_metadata_specific_result,
keyword, "config");
cmdline_parse_token_num_t cmd_config_tx_metadata_specific_id =
TOKEN_NUM_INITIALIZER(struct cmd_config_tx_metadata_specific_result,
port_id, UINT16);
cmdline_parse_token_string_t cmd_config_tx_metadata_specific_item =
TOKEN_STRING_INITIALIZER(struct cmd_config_tx_metadata_specific_result,
item, "tx_metadata");
cmdline_parse_token_num_t cmd_config_tx_metadata_specific_value =
TOKEN_NUM_INITIALIZER(struct cmd_config_tx_metadata_specific_result,
value, UINT32);
cmdline_parse_inst_t cmd_config_tx_metadata_specific = {
.f = cmd_config_tx_metadata_specific_parsed,
.data = NULL,
.help_str = "port config <port_id> tx_metadata <value>",
.tokens = {
(void *)&cmd_config_tx_metadata_specific_port,
(void *)&cmd_config_tx_metadata_specific_keyword,
(void *)&cmd_config_tx_metadata_specific_id,
(void *)&cmd_config_tx_metadata_specific_item,
(void *)&cmd_config_tx_metadata_specific_value,
NULL,
},
};
/* *** display tx_metadata per port configuration *** */
struct cmd_show_tx_metadata_result {
cmdline_fixed_string_t cmd_show;
cmdline_fixed_string_t cmd_port;
cmdline_fixed_string_t cmd_keyword;
portid_t cmd_pid;
};
static void
cmd_show_tx_metadata_parsed(void *parsed_result,
__attribute__((unused)) struct cmdline *cl,
__attribute__((unused)) void *data)
{
struct cmd_show_tx_metadata_result *res = parsed_result;
if (!rte_eth_dev_is_valid_port(res->cmd_pid)) {
printf("invalid port id %u\n", res->cmd_pid);
return;
}
if (!strcmp(res->cmd_keyword, "tx_metadata")) {
printf("Port %u tx_metadata: %u\n", res->cmd_pid,
ports[res->cmd_pid].tx_metadata);
}
}
cmdline_parse_token_string_t cmd_show_tx_metadata_show =
TOKEN_STRING_INITIALIZER(struct cmd_show_tx_metadata_result,
cmd_show, "show");
cmdline_parse_token_string_t cmd_show_tx_metadata_port =
TOKEN_STRING_INITIALIZER(struct cmd_show_tx_metadata_result,
cmd_port, "port");
cmdline_parse_token_num_t cmd_show_tx_metadata_pid =
TOKEN_NUM_INITIALIZER(struct cmd_show_tx_metadata_result,
cmd_pid, UINT16);
cmdline_parse_token_string_t cmd_show_tx_metadata_keyword =
TOKEN_STRING_INITIALIZER(struct cmd_show_tx_metadata_result,
cmd_keyword, "tx_metadata");
cmdline_parse_inst_t cmd_show_tx_metadata = {
.f = cmd_show_tx_metadata_parsed,
.data = NULL,
.help_str = "show port <port_id> tx_metadata",
.tokens = {
(void *)&cmd_show_tx_metadata_show,
(void *)&cmd_show_tx_metadata_port,
(void *)&cmd_show_tx_metadata_pid,
(void *)&cmd_show_tx_metadata_keyword,
NULL,
},
};
/* ******************************************************************************** */
/* list of instructions */
@ -17967,6 +18070,8 @@ cmdline_parse_ctx_t main_ctx[] = {
(cmdline_parse_inst_t *)&cmd_operate_bpf_ld_parse,
(cmdline_parse_inst_t *)&cmd_operate_bpf_unld_parse,
#endif
(cmdline_parse_inst_t *)&cmd_config_tx_metadata_specific,
(cmdline_parse_inst_t *)&cmd_show_tx_metadata,
NULL,
};

View File

@ -178,6 +178,8 @@ enum index {
ITEM_ICMP6_ND_OPT_SLA_ETH_SLA,
ITEM_ICMP6_ND_OPT_TLA_ETH,
ITEM_ICMP6_ND_OPT_TLA_ETH_TLA,
ITEM_META,
ITEM_META_DATA,
/* Validate/create actions. */
ACTIONS,
@ -546,6 +548,11 @@ static const enum index item_param[] = {
ZERO,
};
static const enum index item_param_is[] = {
ITEM_PARAM_IS,
ZERO,
};
static const enum index next_item[] = {
ITEM_END,
ITEM_VOID,
@ -584,6 +591,7 @@ static const enum index next_item[] = {
ITEM_ICMP6_ND_OPT,
ITEM_ICMP6_ND_OPT_SLA_ETH,
ITEM_ICMP6_ND_OPT_TLA_ETH,
ITEM_META,
ZERO,
};
@ -804,6 +812,12 @@ static const enum index item_icmp6_nd_opt_tla_eth[] = {
ZERO,
};
static const enum index item_meta[] = {
ITEM_META_DATA,
ITEM_NEXT,
ZERO,
};
static const enum index next_action[] = {
ACTION_END,
ACTION_VOID,
@ -2070,6 +2084,20 @@ static const struct token token_list[] = {
.args = ARGS(ARGS_ENTRY_HTON
(struct rte_flow_item_icmp6_nd_opt_tla_eth, tla)),
},
[ITEM_META] = {
.name = "meta",
.help = "match metadata header",
.priv = PRIV_ITEM(META, sizeof(struct rte_flow_item_meta)),
.next = NEXT(item_meta),
.call = parse_vc,
},
[ITEM_META_DATA] = {
.name = "data",
.help = "metadata value",
.next = NEXT(item_meta, NEXT_ENTRY(UNSIGNED), item_param_is),
.args = ARGS(ARGS_ENTRY_MASK_HTON(struct rte_flow_item_meta,
data, "\xff\xff\xff\xff")),
},
/* Validate/create actions. */
[ACTIONS] = {

View File

@ -1063,6 +1063,10 @@ init_config(void)
DEV_TX_OFFLOAD_MBUF_FAST_FREE))
port->dev_conf.txmode.offloads &=
~DEV_TX_OFFLOAD_MBUF_FAST_FREE;
if (!(port->dev_info.tx_offload_capa &
DEV_TX_OFFLOAD_MATCH_METADATA))
port->dev_conf.txmode.offloads &=
~DEV_TX_OFFLOAD_MATCH_METADATA;
if (numa_support) {
if (port_numa[pid] != NUMA_NO_CONFIG)
port_per_socket[port_numa[pid]]++;
@ -1091,6 +1095,7 @@ init_config(void)
/* set flag to initialize port/queue */
port->need_reconfig = 1;
port->need_reconfig_queues = 1;
port->tx_metadata = 0;
}
/*

View File

@ -196,6 +196,8 @@ struct rte_port {
#ifdef SOFTNIC
struct softnic_port softport; /**< softnic params */
#endif
/**< metadata value to insert in Tx packets. */
rte_be32_t tx_metadata;
};
/**

View File

@ -253,6 +253,15 @@ pkt_burst_transmit(struct fwd_stream *fs)
pkt->l2_len = sizeof(struct ether_hdr);
pkt->l3_len = sizeof(struct ipv4_hdr);
pkts_burst[nb_pkt] = pkt;
/*
* If user configured metadata value add it to packet
* and set ol_flags accordingly
*/
if (ports[fs->tx_port].tx_metadata) {
pkt->tx_metadata = ports[fs->tx_port].tx_metadata;
pkt->ol_flags |= PKT_TX_METADATA;
}
}
nb_tx = rte_eth_tx_burst(fs->tx_port, fs->tx_queue, pkts_burst, nb_pkt);
/*

View File

@ -423,6 +423,12 @@ List port level and all queue level Tx offloading configuration::
testpmd> show port (port_id) tx_offload configuration
show tx metadata setting
~~~~~~~~~~~~~~~~~~~~~~~~
Show Tx metadata value set for a specific port::
testpmd> show port (port_id) tx_metadata
Configuration Functions
-----------------------
@ -1532,7 +1538,8 @@ Enable or disable a per port Tx offloading on all Tx queues of a port::
sctp_cksum, tcp_tso, udp_tso, outer_ipv4_cksum,
qinq_insert, vxlan_tnl_tso, gre_tnl_tso,
ipip_tnl_tso, geneve_tnl_tso, macsec_insert,
mt_lockfree, multi_segs, mbuf_fast_free, security
mt_lockfree, multi_segs, mbuf_fast_free, security,
match_metadata
This command should be run when the port is stopped, or else it will fail.
@ -2028,6 +2035,14 @@ port config udp_tunnel_port
Add/remove UDP tunnel port for VXLAN/GENEVE tunneling protocols::
testpmd> port config (port_id) udp_tunnel_port add|rm vxlan|geneve (udp_port)
port config tx_metadata
~~~~~~~~~~~~~~~~~~~~~~~
Set Tx metadata value per port.
testpmd will add this value to any Tx packet sent from this port::
testpmd> port config (port_id) tx_metadata (value)
Link Bonding Functions
----------------------
@ -3595,6 +3610,10 @@ This section lists supported pattern items and their attributes, if any.
- ``tla {MAC-48}``: target Ethernet LLA.
- ``meta``: match application specific metadata.
- ``data {unsigned}``: metadata value.
Actions list
^^^^^^^^^^^^