All of lore.kernel.org
 help / color / mirror / Atom feed
From: Ori Kam <orika@nvidia.com>
To: Jie Wang <jie1x.wang@intel.com>, "dev@dpdk.org" <dev@dpdk.org>
Cc: "ferruh.yigit@intel.com" <ferruh.yigit@intel.com>,
	NBU-Contact-Thomas Monjalon <thomas@monjalon.net>,
	"andrew.rybchenko@oktetlabs.ru" <andrew.rybchenko@oktetlabs.ru>,
	"xiaoyun.li@intel.com" <xiaoyun.li@intel.com>,
	"stevex.yang@intel.com" <stevex.yang@intel.com>,
	"jingjing.wu@intel.com" <jingjing.wu@intel.com>,
	"beilei.xing@intel.com" <beilei.xing@intel.com>,
	"wenjun1.wu@intel.com" <wenjun1.wu@intel.com>
Subject: Re: [dpdk-dev] [PATCH v3 3/3] app/testpmd: support L2TPV2 and PPP protocol pattern
Date: Sun, 17 Oct 2021 08:51:38 +0000	[thread overview]
Message-ID: <DM8PR12MB54008543F6858EAFC7A1B91CD6BB9@DM8PR12MB5400.namprd12.prod.outlook.com> (raw)
In-Reply-To: <20211015095823.701188-4-jie1x.wang@intel.com>

Hi Jie,

Sorry if I wan't clear on my last review.

You don't need to implement encap/decap for those protocols just make sure they are working
with the set encap and set decap along with the raw action.

You can look at cmd_set_raw_parsed and use other tunnels as reference (for example gtp).


> -----Original Message-----
> From: Jie Wang <jie1x.wang@intel.com>
> Sent: Friday, October 15, 2021 12:58 PM
> To: dev@dpdk.org
> Subject: [PATCH v3 3/3] app/testpmd: support L2TPV2 and PPP protocol pattern
> 
> Add support for test-pmd to parse protocol pattern L2TPv2 and PPP.
> 
> Signed-off-by: Wenjun Wu <wenjun1.wu@intel.com>
> Signed-off-by: Jie Wang <jie1x.wang@intel.com>
> ---
>  app/test-pmd/cmdline.c      | 244 ++++++++++++++++++++++
>  app/test-pmd/cmdline_flow.c | 396 ++++++++++++++++++++++++++++++++++++
>  app/test-pmd/testpmd.h      |  22 ++
>  3 files changed, 662 insertions(+)
> 
> diff --git a/app/test-pmd/cmdline.c b/app/test-pmd/cmdline.c index 36d50fd3c7..bba761ad4b 100644
> --- a/app/test-pmd/cmdline.c
> +++ b/app/test-pmd/cmdline.c
> @@ -13300,6 +13300,247 @@ cmdline_parse_inst_t cmd_set_nvgre_with_vlan = {
>  	},
>  };
> 
> +/** Set L2TPV2 encapsulation details */ struct cmd_set_l2tpv2_result {
> +	cmdline_fixed_string_t set;
> +	cmdline_fixed_string_t l2tpv2;
> +	cmdline_fixed_string_t pos_token;
> +	cmdline_fixed_string_t ip_version;
> +	uint32_t vlan_present:1;
> +	uint16_t flags_version;
> +	uint16_t session_id;
> +	uint16_t udp_src;
> +	uint16_t udp_dst;
> +	cmdline_ipaddr_t ip_src;
> +	cmdline_ipaddr_t ip_dst;
> +	uint16_t tci;
> +	uint8_t tos;
> +	uint8_t ttl;
> +	struct rte_ether_addr eth_src;
> +	struct rte_ether_addr eth_dst;
> +};
> +
> +cmdline_parse_token_string_t cmd_set_l2tpv2_set =
> +	TOKEN_STRING_INITIALIZER(struct cmd_set_l2tpv2_result, set, "set");
> +cmdline_parse_token_string_t cmd_set_l2tpv2_l2tpv2 =
> +	TOKEN_STRING_INITIALIZER(struct cmd_set_l2tpv2_result, l2tpv2,
> +"l2tpv2"); cmdline_parse_token_string_t cmd_set_l2tpv2_l2tpv2_tos_ttl =
> +	TOKEN_STRING_INITIALIZER(struct cmd_set_l2tpv2_result, l2tpv2,
> +				 "l2tpv2-tos-ttl");
> +cmdline_parse_token_string_t cmd_set_l2tpv2_l2tpv2_with_vlan =
> +	TOKEN_STRING_INITIALIZER(struct cmd_set_l2tpv2_result, l2tpv2,
> +				 "l2tpv2-with-vlan");
> +cmdline_parse_token_string_t cmd_set_l2tpv2_ip_version =
> +	TOKEN_STRING_INITIALIZER(struct cmd_set_l2tpv2_result, pos_token,
> +				 "ip-version");
> +cmdline_parse_token_string_t cmd_set_l2tpv2_ip_version_value =
> +	TOKEN_STRING_INITIALIZER(struct cmd_set_l2tpv2_result, ip_version,
> +				 "ipv4#ipv6");
> +cmdline_parse_token_string_t cmd_set_l2tpv2_flags_version =
> +	TOKEN_STRING_INITIALIZER(struct cmd_set_l2tpv2_result, pos_token,
> +				 "flags_version");
> +cmdline_parse_token_num_t cmd_set_l2tpv2_flags_version_value =
> +	TOKEN_NUM_INITIALIZER(struct cmd_set_l2tpv2_result, flags_version,
> +			      RTE_UINT16);
> +cmdline_parse_token_string_t cmd_set_l2tpv2_session_id =
> +	TOKEN_STRING_INITIALIZER(struct cmd_set_l2tpv2_result, pos_token,
> +				 "session_id");
> +cmdline_parse_token_num_t cmd_set_l2tpv2_session_id_value =
> +	TOKEN_NUM_INITIALIZER(struct cmd_set_l2tpv2_result, session_id,
> +			      RTE_UINT16);
> +cmdline_parse_token_string_t cmd_set_l2tpv2_udp_src =
> +	TOKEN_STRING_INITIALIZER(struct cmd_set_l2tpv2_result, pos_token,
> +				 "udp-src");
> +cmdline_parse_token_num_t cmd_set_l2tpv2_udp_src_value =
> +	TOKEN_NUM_INITIALIZER(struct cmd_set_l2tpv2_result, udp_src,
> +			      RTE_UINT16);
> +cmdline_parse_token_string_t cmd_set_l2tpv2_udp_dst =
> +	TOKEN_STRING_INITIALIZER(struct cmd_set_l2tpv2_result, pos_token,
> +				 "udp-dst");
> +cmdline_parse_token_num_t cmd_set_l2tpv2_udp_dst_value =
> +	TOKEN_NUM_INITIALIZER(struct cmd_set_l2tpv2_result, udp_dst,
> +			      RTE_UINT16);
> +cmdline_parse_token_string_t cmd_set_l2tpv2_ip_tos =
> +	TOKEN_STRING_INITIALIZER(struct cmd_set_l2tpv2_result, pos_token,
> +				 "ip-tos");
> +cmdline_parse_token_num_t cmd_set_l2tpv2_ip_tos_value =
> +	TOKEN_NUM_INITIALIZER(struct cmd_set_l2tpv2_result, tos, RTE_UINT8);
> +cmdline_parse_token_string_t cmd_set_l2tpv2_ip_ttl =
> +	TOKEN_STRING_INITIALIZER(struct cmd_set_l2tpv2_result, pos_token,
> +				 "ip-ttl");
> +cmdline_parse_token_num_t cmd_set_l2tpv2_ip_ttl_value =
> +	TOKEN_NUM_INITIALIZER(struct cmd_set_l2tpv2_result, ttl, RTE_UINT8);
> +cmdline_parse_token_string_t cmd_set_l2tpv2_ip_src =
> +	TOKEN_STRING_INITIALIZER(struct cmd_set_l2tpv2_result, pos_token,
> +				 "ip-src");
> +cmdline_parse_token_ipaddr_t cmd_set_l2tpv2_ip_src_value =
> +	TOKEN_IPADDR_INITIALIZER(struct cmd_set_l2tpv2_result, ip_src);
> +cmdline_parse_token_string_t cmd_set_l2tpv2_ip_dst =
> +	TOKEN_STRING_INITIALIZER(struct cmd_set_l2tpv2_result, pos_token,
> +				 "ip-dst");
> +cmdline_parse_token_ipaddr_t cmd_set_l2tpv2_ip_dst_value =
> +	TOKEN_IPADDR_INITIALIZER(struct cmd_set_l2tpv2_result, ip_dst);
> +cmdline_parse_token_string_t cmd_set_l2tpv2_vlan =
> +	TOKEN_STRING_INITIALIZER(struct cmd_set_l2tpv2_result, pos_token,
> +				 "vlan-tci");
> +cmdline_parse_token_num_t cmd_set_l2tpv2_vlan_value =
> +	TOKEN_NUM_INITIALIZER(struct cmd_set_l2tpv2_result, tci, RTE_UINT16);
> +cmdline_parse_token_string_t cmd_set_l2tpv2_eth_src =
> +	TOKEN_STRING_INITIALIZER(struct cmd_set_l2tpv2_result, pos_token,
> +				 "eth-src");
> +cmdline_parse_token_etheraddr_t cmd_set_l2tpv2_eth_src_value =
> +	TOKEN_ETHERADDR_INITIALIZER(struct cmd_set_l2tpv2_result, eth_src);
> +cmdline_parse_token_string_t cmd_set_l2tpv2_eth_dst =
> +	TOKEN_STRING_INITIALIZER(struct cmd_set_l2tpv2_result, pos_token,
> +				 "eth-dst");
> +cmdline_parse_token_etheraddr_t cmd_set_l2tpv2_eth_dst_value =
> +	TOKEN_ETHERADDR_INITIALIZER(struct cmd_set_l2tpv2_result, eth_dst);
> +
> +static void cmd_set_l2tpv2_parsed(void *parsed_result,
> +	__rte_unused struct cmdline *cl,
> +	__rte_unused void *data)
> +{
> +	struct cmd_set_l2tpv2_result *res = parsed_result;
> +
> +	l2tpv2_encap_conf.select_tos_ttl = 0;
> +	if (strcmp(res->l2tpv2, "l2tpv2") == 0)
> +		l2tpv2_encap_conf.select_vlan = 0;
> +	else if (strcmp(res->l2tpv2, "l2tpv2-with-vlan") == 0)
> +		l2tpv2_encap_conf.select_vlan = 1;
> +	else if (strcmp(res->l2tpv2, "l2tpv2-tos-ttl") == 0) {
> +		l2tpv2_encap_conf.select_vlan = 0;
> +		l2tpv2_encap_conf.select_tos_ttl = 1;
> +	}
> +	if (strcmp(res->ip_version, "ipv4") == 0)
> +		l2tpv2_encap_conf.select_ipv4 = 1;
> +	else if (strcmp(res->ip_version, "ipv6") == 0)
> +		l2tpv2_encap_conf.select_ipv4 = 0;
> +	else
> +		return;
> +
> +	l2tpv2_encap_conf.flags_version = res->flags_version;
> +	l2tpv2_encap_conf.session_id = res->session_id;
> +	l2tpv2_encap_conf.udp_src = res->udp_src;
> +	l2tpv2_encap_conf.udp_dst = res->udp_dst;
> +	l2tpv2_encap_conf.ip_tos = res->tos;
> +	l2tpv2_encap_conf.ip_ttl = res->ttl;
> +	if (l2tpv2_encap_conf.select_ipv4) {
> +		IPV4_ADDR_TO_UINT(res->ip_src, l2tpv2_encap_conf.ipv4_src);
> +		IPV4_ADDR_TO_UINT(res->ip_dst, l2tpv2_encap_conf.ipv4_dst);
> +	} else {
> +		IPV6_ADDR_TO_ARRAY(res->ip_src, l2tpv2_encap_conf.ipv6_src);
> +		IPV6_ADDR_TO_ARRAY(res->ip_dst, l2tpv2_encap_conf.ipv6_dst);
> +	}
> +	if (l2tpv2_encap_conf.select_vlan)
> +		l2tpv2_encap_conf.vlan_tci = rte_cpu_to_be_16(res->tci);
> +	rte_memcpy(l2tpv2_encap_conf.eth_src, res->eth_src.addr_bytes,
> +		   RTE_ETHER_ADDR_LEN);
> +	rte_memcpy(l2tpv2_encap_conf.eth_dst, res->eth_dst.addr_bytes,
> +		   RTE_ETHER_ADDR_LEN);
> +}
> +
> +cmdline_parse_inst_t cmd_set_l2tpv2 = {
> +	.f = cmd_set_l2tpv2_parsed,
> +	.data = NULL,
> +	.help_str = "set l2tpv2 ip-version ipv4|ipv6 flags_version"
> +		" <flags_version> session_id <session_id> udp-src <udp-src>"
> +		" udp-dst <udp-dst> ip-src <ip-src> ip-dst <ip-dst> eth-src"
> +		" <eth-src> eth-dst <eth-dst>",
> +	.tokens = {
> +		(void *)&cmd_set_l2tpv2_set,
> +		(void *)&cmd_set_l2tpv2_l2tpv2,
> +		(void *)&cmd_set_l2tpv2_ip_version,
> +		(void *)&cmd_set_l2tpv2_ip_version_value,
> +		(void *)&cmd_set_l2tpv2_flags_version,
> +		(void *)&cmd_set_l2tpv2_flags_version_value,
> +		(void *)&cmd_set_l2tpv2_session_id,
> +		(void *)&cmd_set_l2tpv2_session_id_value,
> +		(void *)&cmd_set_l2tpv2_udp_src,
> +		(void *)&cmd_set_l2tpv2_udp_src_value,
> +		(void *)&cmd_set_l2tpv2_udp_dst,
> +		(void *)&cmd_set_l2tpv2_udp_dst_value,
> +		(void *)&cmd_set_l2tpv2_ip_src,
> +		(void *)&cmd_set_l2tpv2_ip_src_value,
> +		(void *)&cmd_set_l2tpv2_ip_dst,
> +		(void *)&cmd_set_l2tpv2_ip_dst_value,
> +		(void *)&cmd_set_l2tpv2_eth_src,
> +		(void *)&cmd_set_l2tpv2_eth_src_value,
> +		(void *)&cmd_set_l2tpv2_eth_dst,
> +		(void *)&cmd_set_l2tpv2_eth_dst_value,
> +		NULL,
> +	},
> +};
> +
> +cmdline_parse_inst_t cmd_set_l2tpv2_tos_ttl = {
> +	.f = cmd_set_l2tpv2_parsed,
> +	.data = NULL,
> +	.help_str = "set l2tpv2-tos-ttl ip-version ipv4|ipv6 flags_version"
> +		" <flags_version> session_id <session_id> udp-src <udp-src>"
> +		" udp-dst <udp-dst> ip-tos <ip-tos> ip-ttl <ip-ttl> ip-src"
> +		" <ip-src> ip-dst <ip-dst> eth-src <eth-src> eth-dst <eth-dst>",
> +	.tokens = {
> +		(void *)&cmd_set_l2tpv2_set,
> +		(void *)&cmd_set_l2tpv2_l2tpv2_tos_ttl,
> +		(void *)&cmd_set_l2tpv2_ip_version,
> +		(void *)&cmd_set_l2tpv2_ip_version_value,
> +		(void *)&cmd_set_l2tpv2_flags_version,
> +		(void *)&cmd_set_l2tpv2_flags_version_value,
> +		(void *)&cmd_set_l2tpv2_session_id,
> +		(void *)&cmd_set_l2tpv2_session_id_value,
> +		(void *)&cmd_set_l2tpv2_udp_src,
> +		(void *)&cmd_set_l2tpv2_udp_src_value,
> +		(void *)&cmd_set_l2tpv2_udp_dst,
> +		(void *)&cmd_set_l2tpv2_udp_dst_value,
> +		(void *)&cmd_set_l2tpv2_ip_tos,
> +		(void *)&cmd_set_l2tpv2_ip_tos_value,
> +		(void *)&cmd_set_l2tpv2_ip_ttl,
> +		(void *)&cmd_set_l2tpv2_ip_ttl_value,
> +		(void *)&cmd_set_l2tpv2_ip_src,
> +		(void *)&cmd_set_l2tpv2_ip_src_value,
> +		(void *)&cmd_set_l2tpv2_ip_dst,
> +		(void *)&cmd_set_l2tpv2_ip_dst_value,
> +		(void *)&cmd_set_l2tpv2_eth_src,
> +		(void *)&cmd_set_l2tpv2_eth_src_value,
> +		(void *)&cmd_set_l2tpv2_eth_dst,
> +		(void *)&cmd_set_l2tpv2_eth_dst_value,
> +		NULL,
> +	},
> +};
> +
> +cmdline_parse_inst_t cmd_set_l2tpv2_with_vlan = {
> +	.f = cmd_set_l2tpv2_parsed,
> +	.data = NULL,
> +	.help_str = "set l2tpv2-with-vlan ip-version ipv4|ipv6 flags_version"
> +		" <flags_version> session_id <session_id> udp-src <udp-src>"
> +		" udp-dst <udp-dst> ip-src <ip-src> ip-dst <ip-dst> vlan-tci"
> +		" <vlan-tci> eth-src <eth-src> eth-dst <eth-dst>",
> +	.tokens = {
> +		(void *)&cmd_set_l2tpv2_set,
> +		(void *)&cmd_set_l2tpv2_l2tpv2_with_vlan,
> +		(void *)&cmd_set_l2tpv2_ip_version,
> +		(void *)&cmd_set_l2tpv2_ip_version_value,
> +		(void *)&cmd_set_l2tpv2_flags_version,
> +		(void *)&cmd_set_l2tpv2_flags_version_value,
> +		(void *)&cmd_set_l2tpv2_session_id,
> +		(void *)&cmd_set_l2tpv2_session_id_value,
> +		(void *)&cmd_set_l2tpv2_udp_src,
> +		(void *)&cmd_set_l2tpv2_udp_src_value,
> +		(void *)&cmd_set_l2tpv2_udp_dst,
> +		(void *)&cmd_set_l2tpv2_udp_dst_value,
> +		(void *)&cmd_set_l2tpv2_ip_src,
> +		(void *)&cmd_set_l2tpv2_ip_src_value,
> +		(void *)&cmd_set_l2tpv2_ip_dst,
> +		(void *)&cmd_set_l2tpv2_ip_dst_value,
> +		(void *)&cmd_set_l2tpv2_vlan,
> +		(void *)&cmd_set_l2tpv2_vlan_value,
> +		(void *)&cmd_set_l2tpv2_eth_src,
> +		(void *)&cmd_set_l2tpv2_eth_src_value,
> +		(void *)&cmd_set_l2tpv2_eth_dst,
> +		(void *)&cmd_set_l2tpv2_eth_dst_value,
> +		NULL,
> +	},
> +};
> +
>  /** Set L2 encapsulation details */
>  struct cmd_set_l2_encap_result {
>  	cmdline_fixed_string_t set;
> @@ -17774,6 +18015,9 @@ cmdline_parse_ctx_t main_ctx[] = {
>  	(cmdline_parse_inst_t *)&cmd_set_vxlan_with_vlan,
>  	(cmdline_parse_inst_t *)&cmd_set_nvgre,
>  	(cmdline_parse_inst_t *)&cmd_set_nvgre_with_vlan,
> +	(cmdline_parse_inst_t *)&cmd_set_l2tpv2,
> +	(cmdline_parse_inst_t *)&cmd_set_l2tpv2_tos_ttl,
> +	(cmdline_parse_inst_t *)&cmd_set_l2tpv2_with_vlan,
>  	(cmdline_parse_inst_t *)&cmd_set_l2_encap,
>  	(cmdline_parse_inst_t *)&cmd_set_l2_encap_with_vlan,
>  	(cmdline_parse_inst_t *)&cmd_set_l2_decap, diff --git a/app/test-pmd/cmdline_flow.c
> b/app/test-pmd/cmdline_flow.c index 0b5856c7d5..4f73d4f39d 100644
> --- a/app/test-pmd/cmdline_flow.c
> +++ b/app/test-pmd/cmdline_flow.c
> @@ -306,6 +306,23 @@ enum index {
>  	ITEM_POL_PORT,
>  	ITEM_POL_METER,
>  	ITEM_POL_POLICY,
> +	ITEM_L2TPV2,
> +	ITEM_L2TPV2_COMMON,
> +	ITEM_L2TPV2_COMMON_TYPE,
> +	ITEM_L2TPV2_COMMON_TYPE_DATA_L,
> +	ITEM_L2TPV2_COMMON_TYPE_CTRL,
> +	ITEM_L2TPV2_MSG_DATA_L_LENGTH,
> +	ITEM_L2TPV2_MSG_DATA_L_TUNNEL_ID,
> +	ITEM_L2TPV2_MSG_DATA_L_SESSION_ID,
> +	ITEM_L2TPV2_MSG_CTRL_LENGTH,
> +	ITEM_L2TPV2_MSG_CTRL_TUNNEL_ID,
> +	ITEM_L2TPV2_MSG_CTRL_SESSION_ID,
> +	ITEM_L2TPV2_MSG_CTRL_NS,
> +	ITEM_L2TPV2_MSG_CTRL_NR,
> +	ITEM_PPP,
> +	ITEM_PPP_ADDR,
> +	ITEM_PPP_CTRL,
> +	ITEM_PPP_PROTO_ID,
> 
>  	/* Validate/create actions. */
>  	ACTIONS,
> @@ -376,6 +393,8 @@ enum index {
>  	ACTION_VXLAN_DECAP,
>  	ACTION_NVGRE_ENCAP,
>  	ACTION_NVGRE_DECAP,
> +	ACTION_L2TPV2_ENCAP,
> +	ACTION_L2TPV2_DECAP,
>  	ACTION_L2_ENCAP,
>  	ACTION_L2_DECAP,
>  	ACTION_MPLSOGRE_ENCAP,
> @@ -581,6 +600,44 @@ struct action_nvgre_encap_data {
>  	struct rte_flow_item_nvgre item_nvgre;  };
> 
> +struct l2tpv2_encap_conf l2tpv2_encap_conf = {
> +	.select_ipv4 = 1,
> +	.select_vlan = 0,
> +	.select_tos_ttl = 0,
> +	.flags_version = 0,
> +	.session_id = 0,
> +	.udp_src = 0,
> +	.udp_dst = 1701,
> +	.ipv4_src = RTE_IPV4(127, 0, 0, 1),
> +	.ipv4_dst = RTE_IPV4(255, 255, 255, 255),
> +	.ipv6_src = "\x00\x00\x00\x00\x00\x00\x00\x00"
> +		"\x00\x00\x00\x00\x00\x00\x00\x01",
> +	.ipv6_dst = "\x00\x00\x00\x00\x00\x00\x00\x00"
> +		"\x00\x00\x00\x00\x00\x00\x11\x11",
> +	.vlan_tci = 0,
> +	.ip_tos = 0,
> +	.ip_ttl = 255,
> +	.eth_src = "\x00\x00\x00\x00\x00\x00",
> +	.eth_dst = "\xff\xff\xff\xff\xff\xff", };
> +
> +/** Maximum number of items in struct rte_flow_action_l2tpv2_encap. */
> +#define ACTION_L2TPV2_ENCAP_ITEMS_NUM 6
> +
> +/** Storage for struct rte_flow_action_l2tpv2_encap including external
> +data. */ struct action_l2tpv2_encap_data {
> +	struct rte_flow_action_l2tpv2_encap conf;
> +	struct rte_flow_item items[ACTION_L2TPV2_ENCAP_ITEMS_NUM];
> +	struct rte_flow_item_eth item_eth;
> +	struct rte_flow_item_vlan item_vlan;
> +	union {
> +		struct rte_flow_item_ipv4 item_ipv4;
> +		struct rte_flow_item_ipv6 item_ipv6;
> +	};
> +	struct rte_flow_item_udp item_udp;
> +	struct rte_flow_item_l2tpv2 item_l2tpv2; };
> +
>  struct l2_encap_conf l2_encap_conf;
> 

See my comment at the top.

>  struct l2_decap_conf l2_decap_conf;
> @@ -614,6 +671,7 @@ struct rte_flow_action_port_id
> sample_port_id[RAW_SAMPLE_CONFS_MAX_NUM];
>  struct rte_flow_action_raw_encap sample_encap[RAW_SAMPLE_CONFS_MAX_NUM];
>  struct action_vxlan_encap_data sample_vxlan_encap[RAW_SAMPLE_CONFS_MAX_NUM];
>  struct action_nvgre_encap_data sample_nvgre_encap[RAW_SAMPLE_CONFS_MAX_NUM];
> +struct action_l2tpv2_encap_data
> +sample_l2tpv2_encap[RAW_SAMPLE_CONFS_MAX_NUM];
>  struct action_rss_data sample_rss_data[RAW_SAMPLE_CONFS_MAX_NUM];
>  struct rte_flow_action_vf sample_vf[RAW_SAMPLE_CONFS_MAX_NUM];
> 
> @@ -999,6 +1057,8 @@ static const enum index next_item[] = {
>  	ITEM_GENEVE_OPT,
>  	ITEM_INTEGRITY,
>  	ITEM_CONNTRACK,
> +	ITEM_L2TPV2,
> +	ITEM_PPP,
>  	END_SET,
>  	ZERO,
>  };
> @@ -1367,6 +1427,31 @@ static const enum index item_integrity_lv[] = {
>  	ZERO,
>  };
> 
> +static const enum index item_l2tpv2[] = {
> +	ITEM_L2TPV2_COMMON,
> +	ITEM_NEXT,
> +	ZERO,
> +};
> +
> +static const enum index item_l2tpv2_common[] = {
> +	ITEM_L2TPV2_COMMON_TYPE,
> +	ZERO,
> +};
> +
> +static const enum index item_l2tpv2_common_type[] = {
> +	ITEM_L2TPV2_COMMON_TYPE_DATA_L,
> +	ITEM_L2TPV2_COMMON_TYPE_CTRL,
> +	ZERO,
> +};
> +
> +static const enum index item_ppp[] = {
> +	ITEM_PPP_ADDR,
> +	ITEM_PPP_CTRL,
> +	ITEM_PPP_PROTO_ID,
> +	ITEM_NEXT,
> +	ZERO,
> +};
> +
>  static const enum index next_action[] = {
>  	ACTION_END,
>  	ACTION_VOID,
> @@ -1400,6 +1485,8 @@ static const enum index next_action[] = {
>  	ACTION_VXLAN_DECAP,
>  	ACTION_NVGRE_ENCAP,
>  	ACTION_NVGRE_DECAP,
> +	ACTION_L2TPV2_ENCAP,
> +	ACTION_L2TPV2_DECAP,
>  	ACTION_L2_ENCAP,
>  	ACTION_L2_DECAP,
>  	ACTION_MPLSOGRE_ENCAP,
> @@ -1687,6 +1774,7 @@ static const enum index next_action_sample[] = {
>  	ACTION_RAW_ENCAP,
>  	ACTION_VXLAN_ENCAP,
>  	ACTION_NVGRE_ENCAP,
> +	ACTION_L2TPV2_ENCAP,
>  	ACTION_NEXT,
>  	ZERO,
>  };
> @@ -1757,6 +1845,9 @@ static int parse_vc_action_vxlan_encap(struct context *, const struct token
> *,  static int parse_vc_action_nvgre_encap(struct context *, const struct token *,
>  				       const char *, unsigned int, void *,
>  				       unsigned int);
> +static int parse_vc_action_l2tpv2_encap(struct context *, const struct token *,
> +					const char *, unsigned int, void *,
> +					unsigned int);
>  static int parse_vc_action_l2_encap(struct context *, const struct token *,
>  				    const char *, unsigned int, void *,
>  				    unsigned int);
> @@ -3606,6 +3697,136 @@ static const struct token token_list[] = {
>  			     item_param),
>  		.args = ARGS(ARGS_ENTRY(struct rte_flow_item_conntrack, flags)),
>  	},
> +	[ITEM_L2TPV2] = {
> +		.name = "l2tpv2",
> +		.help = "match l2tpv2 header",
> +		.priv = PRIV_ITEM(L2TPV2, sizeof(struct rte_flow_item_l2tpv2)),
> +		.next = NEXT(item_l2tpv2),
> +		.call = parse_vc,
> +	},
> +	[ITEM_L2TPV2_COMMON] = {
> +		.name = "common",
> +		.help = "l2tpv2 common header",
> +		.next = NEXT(item_l2tpv2_common),
> +	},
> +	[ITEM_L2TPV2_COMMON_TYPE] = {
> +		.name = "type",
> +		.help = "type of common header",
> +		.next = NEXT(item_l2tpv2_common_type),
> +		.args = ARGS(ARG_ENTRY_HTON(struct rte_flow_item_l2tpv2)),
> +	},
> +	[ITEM_L2TPV2_COMMON_TYPE_DATA_L] = {
> +		.name = "data_l",
> +		.help = "Type #6: data message with length option",
> +		.next = NEXT(NEXT_ENTRY(ITEM_L2TPV2_MSG_DATA_L_LENGTH,
> +					ITEM_L2TPV2_MSG_DATA_L_TUNNEL_ID,
> +					ITEM_L2TPV2_MSG_DATA_L_SESSION_ID,
> +					ITEM_NEXT)),
> +		.call = parse_vc,
> +	},
> +	[ITEM_L2TPV2_MSG_DATA_L_LENGTH] = {
> +		.name = "length",
> +		.help = "message length",
> +		.next = NEXT(item_l2tpv2, NEXT_ENTRY(COMMON_UNSIGNED),
> +			     item_param),
> +		.args = ARGS(ARGS_ENTRY_HTON(struct rte_flow_item_l2tpv2,
> +					     hdr.type7.tunnel_id)),
> +	},
> +	[ITEM_L2TPV2_MSG_DATA_L_TUNNEL_ID] = {
> +		.name = "tunnel_id",
> +		.help = "tunnel identifier",
> +		.next = NEXT(item_l2tpv2, NEXT_ENTRY(COMMON_UNSIGNED),
> +			     item_param),
> +		.args = ARGS(ARGS_ENTRY_HTON(struct rte_flow_item_l2tpv2,
> +					     hdr.type7.tunnel_id)),
> +	},
> +	[ITEM_L2TPV2_MSG_DATA_L_SESSION_ID] = {
> +		.name = "session_id",
> +		.help = "session identifier",
> +		.next = NEXT(item_l2tpv2, NEXT_ENTRY(COMMON_UNSIGNED),
> +			     item_param),
> +		.args = ARGS(ARGS_ENTRY_HTON(struct rte_flow_item_l2tpv2,
> +					     hdr.type7.session_id)),
> +	},
> +	[ITEM_L2TPV2_COMMON_TYPE_CTRL] = {
> +		.name = "control",
> +		.help = "Type #3: conrtol message contains length, ns, nr options",
> +		.next = NEXT(NEXT_ENTRY(ITEM_L2TPV2_MSG_CTRL_LENGTH,
> +					ITEM_L2TPV2_MSG_CTRL_TUNNEL_ID,
> +					ITEM_L2TPV2_MSG_CTRL_SESSION_ID,
> +					ITEM_L2TPV2_MSG_CTRL_NS,
> +					ITEM_L2TPV2_MSG_CTRL_NR,
> +					ITEM_NEXT)),
> +		.call = parse_vc,
> +	},
> +	[ITEM_L2TPV2_MSG_CTRL_LENGTH] = {
> +		.name = "length",
> +		.help = "message length",
> +		.next = NEXT(item_l2tpv2, NEXT_ENTRY(COMMON_UNSIGNED),
> +			     item_param),
> +		.args = ARGS(ARGS_ENTRY_HTON(struct rte_flow_item_l2tpv2,
> +					     hdr.type3.length)),
> +	},
> +	[ITEM_L2TPV2_MSG_CTRL_TUNNEL_ID] = {
> +		.name = "tunnel_id",
> +		.help = "tunnel identifier",
> +		.next = NEXT(item_l2tpv2, NEXT_ENTRY(COMMON_UNSIGNED),
> +			     item_param),
> +		.args = ARGS(ARGS_ENTRY_HTON(struct rte_flow_item_l2tpv2,
> +					     hdr.type3.tunnel_id)),
> +	},
> +	[ITEM_L2TPV2_MSG_CTRL_SESSION_ID] = {
> +		.name = "session_id",
> +		.help = "session identifier",
> +		.next = NEXT(item_l2tpv2, NEXT_ENTRY(COMMON_UNSIGNED),
> +			     item_param),
> +		.args = ARGS(ARGS_ENTRY_HTON(struct rte_flow_item_l2tpv2,
> +					     hdr.type3.session_id)),
> +	},
> +	[ITEM_L2TPV2_MSG_CTRL_NS] = {
> +		.name = "ns",
> +		.help = "sequence number for message",
> +		.next = NEXT(item_l2tpv2, NEXT_ENTRY(COMMON_UNSIGNED),
> +			     item_param),
> +		.args = ARGS(ARGS_ENTRY_HTON(struct rte_flow_item_l2tpv2,
> +					     hdr.type3.ns)),
> +	},
> +	[ITEM_L2TPV2_MSG_CTRL_NR] = {
> +		.name = "nr",
> +		.help = "sequence number for next receive message",
> +		.next = NEXT(item_l2tpv2, NEXT_ENTRY(COMMON_UNSIGNED),
> +			     item_param),
> +		.args = ARGS(ARGS_ENTRY_HTON(struct rte_flow_item_l2tpv2,
> +					     hdr.type3.nr)),
> +	},
> +	[ITEM_PPP] = {
> +		.name = "ppp",
> +		.help = "match ppp header",
> +		.priv = PRIV_ITEM(PPP, sizeof(struct rte_flow_item_ppp)),
> +		.next = NEXT(item_ppp),
> +		.call = parse_vc,
> +	},
> +	[ITEM_PPP_ADDR] = {
> +		.name = "addr",
> +		.help = "ppp address",
> +		.next = NEXT(item_ppp, NEXT_ENTRY(COMMON_UNSIGNED),
> +			     item_param),
> +		.args = ARGS(ARGS_ENTRY(struct rte_flow_item_ppp, addr)),
> +	},
> +	[ITEM_PPP_CTRL] = {
> +		.name = "ctrl",
> +		.help = "ppp control",
> +		.next = NEXT(item_ppp, NEXT_ENTRY(COMMON_UNSIGNED),
> +			     item_param),
> +		.args = ARGS(ARGS_ENTRY(struct rte_flow_item_ppp, ctrl)),
> +	},
> +	[ITEM_PPP_PROTO_ID] = {
> +		.name = "proto_id",
> +		.help = "ppp protocol id",
> +		.next = NEXT(item_ppp, NEXT_ENTRY(COMMON_UNSIGNED),
> +			     item_param),
> +		.args = ARGS(ARGS_ENTRY(struct rte_flow_item_ppp, proto_id)),
> +	},
>  	/* Validate/create actions. */
>  	[ACTIONS] = {
>  		.name = "actions",
> @@ -4125,6 +4346,24 @@ static const struct token token_list[] = {
>  		.next = NEXT(NEXT_ENTRY(ACTION_NEXT)),
>  		.call = parse_vc,
>  	},
> +	[ACTION_L2TPV2_ENCAP] = {
> +		.name = "l2tpv2_encap",
> +		.help = "L2TPV2 encapsulation, uses configuration set by \"set"
> +			" l2tpv2\"",
> +		.priv = PRIV_ACTION(L2TPV2_ENCAP,
> +				    sizeof(struct action_l2tpv2_encap_data)),
> +		.next = NEXT(NEXT_ENTRY(ACTION_NEXT)),
> +		.call = parse_vc_action_l2tpv2_encap,
> +	},
> +	[ACTION_L2TPV2_DECAP] = {
> +		.name = "l2tpv2_decap",
> +		.help = "Performs a decapsulation action by stripping all"
> +			" headers of the L2TPV2 tunnel network overlay from the"
> +			" matched flow.",
> +		.priv = PRIV_ACTION(L2TPV2_DECAP, 0),
> +		.next = NEXT(NEXT_ENTRY(ACTION_NEXT)),
> +		.call = parse_vc,
> +	},
>  	[ACTION_L2_ENCAP] = {
>  		.name = "l2_encap",
>  		.help = "l2 encap, uses configuration set by"
> @@ -5907,6 +6146,152 @@ parse_vc_action_nvgre_encap(struct context *ctx, const struct token
> *token,
>  	return ret;
>  }
> 
> +/** Setup L2TPV2 encap configuration. */ static int
> +parse_setup_l2tpv2_encap_data(struct action_l2tpv2_encap_data
> +*action_l2tpv2_encap_data) {
> +	/* Set up default configuration. */
> +	*action_l2tpv2_encap_data = (struct action_l2tpv2_encap_data){
> +		.conf = (struct rte_flow_action_l2tpv2_encap){
> +			.definition = action_l2tpv2_encap_data->items,
> +		},
> +		.items = {
> +			{
> +				.type = RTE_FLOW_ITEM_TYPE_ETH,
> +				.spec = &action_l2tpv2_encap_data->item_eth,
> +				.mask = &rte_flow_item_eth_mask,
> +			},
> +			{
> +				.type = RTE_FLOW_ITEM_TYPE_VLAN,
> +				.spec = &action_l2tpv2_encap_data->item_vlan,
> +				.mask = &rte_flow_item_vlan_mask,
> +			},
> +			{
> +				.type = RTE_FLOW_ITEM_TYPE_IPV4,
> +				.spec = &action_l2tpv2_encap_data->item_ipv4,
> +				.mask = &rte_flow_item_ipv4_mask,
> +			},
> +			{
> +				.type = RTE_FLOW_ITEM_TYPE_UDP,
> +				.spec = &action_l2tpv2_encap_data->item_udp,
> +				.mask = &rte_flow_item_udp_mask,
> +			},
> +			{
> +				.type = RTE_FLOW_ITEM_TYPE_L2TPV2,
> +				.spec = &action_l2tpv2_encap_data->item_l2tpv2,
> +				.mask = &rte_flow_item_l2tpv2_mask,
> +			},
> +			{
> +				.type = RTE_FLOW_ITEM_TYPE_END,
> +			},
> +		},
> +		.item_eth.type = 0,
> +		.item_vlan = {
> +			.tci = l2tpv2_encap_conf.vlan_tci,
> +			.inner_type = 0,
> +		},
> +		.item_ipv4.hdr = {
> +			.src_addr = l2tpv2_encap_conf.ipv4_src,
> +			.dst_addr = l2tpv2_encap_conf.ipv4_dst,
> +		},
> +		.item_udp.hdr = {
> +			.src_port = l2tpv2_encap_conf.udp_src,
> +			.dst_port = l2tpv2_encap_conf.udp_dst,
> +		},
> +	};
> +	memcpy(action_l2tpv2_encap_data->item_eth.dst.addr_bytes,
> +	       l2tpv2_encap_conf.eth_dst, RTE_ETHER_ADDR_LEN);
> +	memcpy(action_l2tpv2_encap_data->item_eth.src.addr_bytes,
> +	       l2tpv2_encap_conf.eth_src, RTE_ETHER_ADDR_LEN);
> +	if (!l2tpv2_encap_conf.select_ipv4) {
> +		memcpy(&action_l2tpv2_encap_data->item_ipv6.hdr.src_addr,
> +		       &l2tpv2_encap_conf.ipv6_src,
> +		       sizeof(l2tpv2_encap_conf.ipv6_src));
> +		memcpy(&action_l2tpv2_encap_data->item_ipv6.hdr.dst_addr,
> +		       &l2tpv2_encap_conf.ipv6_dst,
> +		       sizeof(l2tpv2_encap_conf.ipv6_dst));
> +		action_l2tpv2_encap_data->items[2] = (struct rte_flow_item){
> +			.type = RTE_FLOW_ITEM_TYPE_IPV6,
> +			.spec = &action_l2tpv2_encap_data->item_ipv6,
> +			.mask = &rte_flow_item_ipv6_mask,
> +		};
> +	}
> +	if (!l2tpv2_encap_conf.select_vlan)
> +		action_l2tpv2_encap_data->items[1].type =
> +			RTE_FLOW_ITEM_TYPE_VOID;
> +	if (l2tpv2_encap_conf.select_tos_ttl) {
> +		if (l2tpv2_encap_conf.select_ipv4) {
> +			static struct rte_flow_item_ipv4 ipv4_mask_tos;
> +
> +			memcpy(&ipv4_mask_tos, &rte_flow_item_ipv4_mask,
> +			       sizeof(ipv4_mask_tos));
> +			ipv4_mask_tos.hdr.type_of_service = 0xff;
> +			ipv4_mask_tos.hdr.time_to_live = 0xff;
> +			action_l2tpv2_encap_data->item_ipv4.hdr.type_of_service =
> +					l2tpv2_encap_conf.ip_tos;
> +			action_l2tpv2_encap_data->item_ipv4.hdr.time_to_live =
> +					l2tpv2_encap_conf.ip_ttl;
> +			action_l2tpv2_encap_data->items[2].mask =
> +							&ipv4_mask_tos;
> +		} else {
> +			static struct rte_flow_item_ipv6 ipv6_mask_tos;
> +
> +			memcpy(&ipv6_mask_tos, &rte_flow_item_ipv6_mask,
> +			       sizeof(ipv6_mask_tos));
> +			ipv6_mask_tos.hdr.vtc_flow |=
> +				RTE_BE32(0xfful << RTE_IPV6_HDR_TC_SHIFT);
> +			ipv6_mask_tos.hdr.hop_limits = 0xff;
> +			action_l2tpv2_encap_data->item_ipv6.hdr.vtc_flow |=
> +				rte_cpu_to_be_32
> +					((uint32_t)l2tpv2_encap_conf.ip_tos <<
> +					 RTE_IPV6_HDR_TC_SHIFT);
> +			action_l2tpv2_encap_data->item_ipv6.hdr.hop_limits =
> +					l2tpv2_encap_conf.ip_ttl;
> +			action_l2tpv2_encap_data->items[2].mask =
> +							&ipv6_mask_tos;
> +		}
> +	}
> +
> +	if (0xc800 == (l2tpv2_encap_conf.flags_version & 0xcb00)) {
> +		action_l2tpv2_encap_data->item_l2tpv2.hdr.type3.session_id =
> +			l2tpv2_encap_conf.session_id;
> +	} else if (0x4000 == (l2tpv2_encap_conf.flags_version & 0xcb00)) {
> +		action_l2tpv2_encap_data->item_l2tpv2.hdr.type6.session_id =
> +			l2tpv2_encap_conf.session_id;
> +	}
> +
> +	return 0;
> +}
> +
> +/** Parse l2tpv2 encap action. */
> +static int
> +parse_vc_action_l2tpv2_encap(struct context *ctx, const struct token *token,
> +			    const char *str, unsigned int len,
> +			    void *buf, unsigned int size)
> +{
> +	struct buffer *out = buf;
> +	struct rte_flow_action *action;
> +	struct action_l2tpv2_encap_data *action_l2tpv2_encap_data;
> +	int ret;
> +
> +	ret = parse_vc(ctx, token, str, len, buf, size);
> +	if (ret < 0)
> +		return ret;
> +	/* Nothing else to do if there is no buffer. */
> +	if (!out)
> +		return ret;
> +	if (!out->args.vc.actions_n)
> +		return -1;
> +	action = &out->args.vc.actions[out->args.vc.actions_n - 1];
> +	/* Point to selected object. */
> +	ctx->object = out->args.vc.data;
> +	ctx->objmask = NULL;
> +	action_l2tpv2_encap_data = ctx->object;
> +	parse_setup_l2tpv2_encap_data(action_l2tpv2_encap_data);
> +	action->conf = &action_l2tpv2_encap_data->conf;
> +	return ret;
> +}
> +
>  /** Parse l2 encap action. */
>  static int
>  parse_vc_action_l2_encap(struct context *ctx, const struct token *token, @@ -8333,6 +8718,12 @@
> flow_item_default_mask(const struct rte_flow_item *item)
>  	case RTE_FLOW_ITEM_TYPE_PFCP:
>  		mask = &rte_flow_item_pfcp_mask;
>  		break;
> +	case RTE_FLOW_ITEM_TYPE_L2TPV2:
> +		mask = &rte_flow_item_l2tpv2_mask;
> +		break;
> +	case RTE_FLOW_ITEM_TYPE_PPP:
> +		mask = &rte_flow_item_ppp_mask;
> +		break;
>  	default:
>  		break;
>  	}
> @@ -8432,6 +8823,11 @@ cmd_set_raw_parsed_sample(const struct buffer *in)
>  			parse_setup_nvgre_encap_data(&sample_nvgre_encap[idx]);
>  			action->conf = &sample_nvgre_encap[idx];
>  			break;
> +		case RTE_FLOW_ACTION_TYPE_L2TPV2_ENCAP:
> +			size = sizeof(struct rte_flow_action_l2tpv2_encap);
> +			parse_setup_l2tpv2_encap_data(&sample_l2tpv2_encap[idx]);
> +			action->conf = &sample_l2tpv2_encap[idx];
> +			break;
>  		default:
>  			fprintf(stderr, "Error - Not supported action\n");
>  			return;
> diff --git a/app/test-pmd/testpmd.h b/app/test-pmd/testpmd.h index e9d9db06ce..c744799b46
> 100644
> --- a/app/test-pmd/testpmd.h
> +++ b/app/test-pmd/testpmd.h
> @@ -567,6 +567,28 @@ struct nvgre_encap_conf {
> 
>  extern struct nvgre_encap_conf nvgre_encap_conf;
> 
> +/* L2TPV2 encap/decap parameters. */
> +struct l2tpv2_encap_conf {
> +	uint32_t select_ipv4:1;
> +	uint32_t select_vlan:1;
> +	uint32_t select_tos_ttl:1;
> +	rte_be16_t flags_version;
> +	rte_be16_t session_id;
> +	rte_be16_t udp_src;
> +	rte_be16_t udp_dst;
> +	rte_be32_t ipv4_src;
> +	rte_be32_t ipv4_dst;
> +	uint8_t ipv6_src[16];
> +	uint8_t ipv6_dst[16];
> +	rte_be16_t vlan_tci;
> +	uint8_t ip_tos;
> +	uint8_t ip_ttl;
> +	uint8_t eth_src[RTE_ETHER_ADDR_LEN];
> +	uint8_t eth_dst[RTE_ETHER_ADDR_LEN];
> +};
> +
> +extern struct l2tpv2_encap_conf l2tpv2_encap_conf;
> +
>  /* L2 encap parameters. */
>  struct l2_encap_conf {
>  	uint32_t select_ipv4:1;
> --
> 2.25.1

Best,
Ori


  reply	other threads:[~2021-10-17  8:51 UTC|newest]

Thread overview: 71+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-09-24 15:17 [dpdk-dev] [PATCH 0/4] support PPPoL2TPv2oUDP RSS Hash Jie Wang
2021-09-24 15:17 ` [dpdk-dev] [PATCH 1/4] net/iavf: support PPPoL2TPv2oUDP over IPv4 " Jie Wang
2021-09-24 15:17 ` [dpdk-dev] [PATCH 2/4] app/testpmd: support PPPoL2TPv2oUDP " Jie Wang
2021-09-24 15:17 ` [dpdk-dev] [PATCH 3/4] ethdev: " Jie Wang
2021-09-30 14:38   ` Ori Kam
2021-10-05 14:42     ` Ferruh Yigit
2021-10-05 15:06       ` Ori Kam
2021-09-24 15:17 ` [dpdk-dev] [PATCH 4/4] net/iavf: support PPPoL2TPv2oUDP over IPv6 " Jie Wang
2021-10-12 10:25 ` [dpdk-dev] [PATCH v2 0/3] support PPPoL2TPv2oUDP " Jie Wang
2021-10-12 10:25   ` [dpdk-dev] [PATCH v2 1/3] net/iavf: " Jie Wang
2021-10-12 10:25   ` [dpdk-dev] [PATCH v2 2/3] app/testpmd: " Jie Wang
2021-10-12 15:31     ` Ori Kam
2021-10-13  8:15       ` Wang, Jie1X
2021-10-13  9:15         ` Ori Kam
2021-10-13  9:54           ` Wang, Jie1X
2021-10-13 10:19             ` Ori Kam
2021-10-12 10:25   ` [dpdk-dev] [PATCH v2 3/3] ethdev: " Jie Wang
2021-10-12 15:28     ` Ori Kam
2021-10-15  9:58   ` [dpdk-dev] [PATCH v3 0/3] " Jie Wang
2021-10-15  9:58     ` [dpdk-dev] [PATCH v3 1/3] ethdev: support PPP and L2TPV2 procotol Jie Wang
2021-10-15 11:10       ` Ferruh Yigit
2021-10-17  8:12         ` Ori Kam
2021-10-17  8:19       ` Ori Kam
2021-10-15  9:58     ` [dpdk-dev] [PATCH v3 2/3] net/iavf: support PPPoL2TPv2oUDP RSS Hash Jie Wang
2021-10-15  9:58     ` [dpdk-dev] [PATCH v3 3/3] app/testpmd: support L2TPV2 and PPP protocol pattern Jie Wang
2021-10-17  8:51       ` Ori Kam [this message]
2021-10-18  9:33     ` [dpdk-dev] [PATCH v4 0/3] support PPPoL2TPv2oUDP RSS Hash Jie Wang
2021-10-18  9:33       ` [dpdk-dev] [PATCH v4 1/3] ethdev: support PPP and L2TPV2 procotol Jie Wang
2021-10-18 10:56         ` Ori Kam
2021-10-18 12:39           ` Zhang, Qi Z
2021-10-18  9:33       ` [dpdk-dev] [PATCH v4 2/3] net/iavf: support PPPoL2TPv2oUDP RSS Hash Jie Wang
2021-10-18  9:33       ` [dpdk-dev] [PATCH v4 3/3] app/testpmd: support L2TPV2 and PPP protocol pattern Jie Wang
2021-10-18 11:03         ` Ori Kam
2021-10-18 12:41           ` Zhang, Qi Z
2021-10-19  3:08       ` [dpdk-dev] [PATCH v5 0/3] support PPPoL2TPv2oUDP RSS Hash Jie Wang
2021-10-19  3:08         ` [dpdk-dev] [PATCH v5 1/3] ethdev: support PPP and L2TPV2 procotol Jie Wang
2021-10-19  6:17           ` Ori Kam
2021-10-19 10:30           ` Ferruh Yigit
2021-10-19  3:08         ` [dpdk-dev] [PATCH v5 2/3] net/iavf: support PPPoL2TPv2oUDP RSS Hash Jie Wang
2021-10-20  1:57           ` Xing, Beilei
2021-10-19  3:08         ` [dpdk-dev] [PATCH v5 3/3] app/testpmd: support L2TPV2 and PPP protocol pattern Jie Wang
2021-10-19  9:41           ` Ferruh Yigit
2021-10-20  9:32         ` [dpdk-dev] [PATCH v6 0/3] support PPPoL2TPv2oUDP RSS Hash Jie Wang
2021-10-20  9:32           ` [dpdk-dev] [PATCH v6 1/3] ethdev: support PPP and L2TPV2 procotol Jie Wang
2021-10-20  9:53             ` Andrew Rybchenko
2021-10-20  9:32           ` [dpdk-dev] [PATCH v6 2/3] net/iavf: support PPPoL2TPv2oUDP RSS Hash Jie Wang
2021-10-21  2:07             ` Xing, Beilei
2021-10-20  9:32           ` [dpdk-dev] [PATCH v6 3/3] app/testpmd: support L2TPV2 and PPP protocol pattern Jie Wang
2021-10-21  6:26           ` [dpdk-dev] [PATCH v7 0/3] support PPPoL2TPv2oUDP RSS Hash Jie Wang
2021-10-21  6:26             ` [dpdk-dev] [PATCH v7 1/3] ethdev: support L2TPv2 and PPP procotol Jie Wang
2021-10-21  7:50               ` Ori Kam
2021-10-21  7:52                 ` Andrew Rybchenko
2021-10-21  8:28                   ` Wang, Jie1X
2021-10-21  8:30                     ` Andrew Rybchenko
2021-10-21  8:41                 ` Wang, Jie1X
2021-10-21 13:18                   ` Ori Kam
2021-10-21  9:26                 ` Ferruh Yigit
2021-10-21  9:29               ` Ferruh Yigit
2021-10-21  6:26             ` [dpdk-dev] [PATCH v7 2/3] net/iavf: support PPPoL2TPv2oUDP RSS Hash Jie Wang
2021-10-21  6:26             ` [dpdk-dev] [PATCH v7 3/3] app/testpmd: support L2TPv2 and PPP protocol pattern Jie Wang
2021-10-21 10:05             ` [dpdk-dev] [PATCH v8 0/3] support PPPoL2TPv2oUDP RSS Hash Jie Wang
2021-10-21 10:05               ` [dpdk-dev] [PATCH v8 1/3] ethdev: support L2TPv2 and PPP procotol Jie Wang
2021-10-21 10:13                 ` Andrew Rybchenko
2021-10-21 10:05               ` [dpdk-dev] [PATCH v8 2/3] net/iavf: support PPPoL2TPv2oUDP RSS Hash Jie Wang
2021-10-21 10:05               ` [dpdk-dev] [PATCH v8 3/3] app/testpmd: support L2TPv2 and PPP protocol pattern Jie Wang
2021-10-21 10:49               ` [dpdk-dev] [PATCH v9 0/3] support PPPoL2TPv2oUDP RSS Hash Jie Wang
2021-10-21 10:49                 ` [dpdk-dev] [PATCH v9 1/3] ethdev: support L2TPv2 and PPP procotol Jie Wang
2021-10-21 12:16                   ` Ferruh Yigit
2021-10-21 10:49                 ` [dpdk-dev] [PATCH v9 2/3] net/iavf: support PPPoL2TPv2oUDP RSS Hash Jie Wang
2021-10-21 10:49                 ` [dpdk-dev] [PATCH v9 3/3] app/testpmd: support L2TPv2 and PPP protocol pattern Jie Wang
2021-10-21 12:17                 ` [dpdk-dev] [PATCH v9 0/3] support PPPoL2TPv2oUDP RSS Hash Ferruh Yigit

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=DM8PR12MB54008543F6858EAFC7A1B91CD6BB9@DM8PR12MB5400.namprd12.prod.outlook.com \
    --to=orika@nvidia.com \
    --cc=andrew.rybchenko@oktetlabs.ru \
    --cc=beilei.xing@intel.com \
    --cc=dev@dpdk.org \
    --cc=ferruh.yigit@intel.com \
    --cc=jie1x.wang@intel.com \
    --cc=jingjing.wu@intel.com \
    --cc=stevex.yang@intel.com \
    --cc=thomas@monjalon.net \
    --cc=wenjun1.wu@intel.com \
    --cc=xiaoyun.li@intel.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.