From: Xiao Zhang Date: Fri, 6 Mar 2020 06:39:26 +0000 (+0800) Subject: ethdev: add PFCP header to flow API X-Git-Url: http://git.droids-corp.org/?p=dpdk.git;a=commitdiff_plain;h=ecbc8570131de834a611286b5bdc1710d56271e6 ethdev: add PFCP header to flow API This patch adds the new flow item RTE_FLOW_ITEM_TYPE_PFCP to flow API to match a PFCP header. Add sample PFCP rules for testpmd guide. Since Session Endpoint Identifier (SEID) only will be present in PFCP Session header and PFCP Session headers shall be identified when the S field is equal to 1, when create rules for PFCP Session header with certain SEID the S field need be set 1. Signed-off-by: Xiao Zhang Acked-by: Ori Kam --- diff --git a/app/test-pmd/cmdline_flow.c b/app/test-pmd/cmdline_flow.c index 680cb1c565..a781545022 100644 --- a/app/test-pmd/cmdline_flow.c +++ b/app/test-pmd/cmdline_flow.c @@ -222,6 +222,9 @@ enum index { ITEM_ESP_SPI, ITEM_AH, ITEM_AH_SPI, + ITEM_PFCP, + ITEM_PFCP_S_FIELD, + ITEM_PFCP_SEID, /* Validate/create actions. */ ACTIONS, @@ -771,6 +774,7 @@ static const enum index next_item[] = { ITEM_L2TPV3OIP, ITEM_ESP, ITEM_AH, + ITEM_PFCP, END_SET, ZERO, }; @@ -1055,6 +1059,13 @@ static const enum index item_ah[] = { ZERO, }; +static const enum index item_pfcp[] = { + ITEM_PFCP_S_FIELD, + ITEM_PFCP_SEID, + ITEM_NEXT, + ZERO, +}; + static const enum index next_set_raw[] = { SET_RAW_INDEX, ITEM_ETH, @@ -2721,6 +2732,26 @@ static const struct token token_list[] = { .next = NEXT(item_ah, NEXT_ENTRY(UNSIGNED), item_param), .args = ARGS(ARGS_ENTRY_HTON(struct rte_flow_item_ah, spi)), }, + [ITEM_PFCP] = { + .name = "pfcp", + .help = "match pfcp header", + .priv = PRIV_ITEM(PFCP, sizeof(struct rte_flow_item_pfcp)), + .next = NEXT(item_pfcp), + .call = parse_vc, + }, + [ITEM_PFCP_S_FIELD] = { + .name = "s_field", + .help = "S field", + .next = NEXT(item_pfcp, NEXT_ENTRY(UNSIGNED), item_param), + .args = ARGS(ARGS_ENTRY_HTON(struct rte_flow_item_pfcp, + s_field)), + }, + [ITEM_PFCP_SEID] = { + .name = "seid", + .help = "session endpoint identifier", + .next = NEXT(item_pfcp, NEXT_ENTRY(UNSIGNED), item_param), + .args = ARGS(ARGS_ENTRY_HTON(struct rte_flow_item_pfcp, seid)), + }, /* Validate/create actions. */ [ACTIONS] = { .name = "actions", @@ -6469,6 +6500,9 @@ flow_item_default_mask(const struct rte_flow_item *item) case RTE_FLOW_ITEM_TYPE_AH: mask = &rte_flow_item_ah_mask; break; + case RTE_FLOW_ITEM_TYPE_PFCP: + mask = &rte_flow_item_pfcp_mask; + break; default: break; } @@ -6570,6 +6604,9 @@ cmd_set_raw_parsed(const struct buffer *in) size = sizeof(struct rte_flow_item_ah); proto = 0x33; break; + case RTE_FLOW_ITEM_TYPE_PFCP: + size = sizeof(struct rte_flow_item_pfcp); + break; default: printf("Error - Not supported item\n"); *total_size = 0; diff --git a/doc/guides/prog_guide/rte_flow.rst b/doc/guides/prog_guide/rte_flow.rst index 371819e162..41c147913c 100644 --- a/doc/guides/prog_guide/rte_flow.rst +++ b/doc/guides/prog_guide/rte_flow.rst @@ -1344,6 +1344,17 @@ Matches a L2TPv3 over IP header. - ``session_id``: L2TPv3 over IP session identifier. - Default ``mask`` matches session_id only. +Item: ``PFCP`` +^^^^^^^^^^^^^^ + +Matches a PFCP Header. + +- ``s_field``: S field. +- ``msg_type``: message type. +- ``msg_len``: message length. +- ``seid``: session endpoint identifier. +- Default ``mask`` matches s_field and seid. + Actions ~~~~~~~ diff --git a/doc/guides/testpmd_app_ug/testpmd_funcs.rst b/doc/guides/testpmd_app_ug/testpmd_funcs.rst index 95f4f069db..5bb12a51ba 100644 --- a/doc/guides/testpmd_app_ug/testpmd_funcs.rst +++ b/doc/guides/testpmd_app_ug/testpmd_funcs.rst @@ -3991,6 +3991,11 @@ This section lists supported pattern items and their attributes, if any. - ``spi {unsigned}``: security parameters index. +- ``pfcp``: match PFCP header. + + - ``s_field {unsigned}``: S field. + - ``seid {unsigned}``: session endpoint identifier. + Actions list ^^^^^^^^^^^^ @@ -4840,6 +4845,21 @@ AH rules can be created by the following commands:: testpmd> flow create 0 ingress pattern eth / ipv6 / udp / ah spi is 1 / end actions queue index 3 / end +Sample PFCP rules +~~~~~~~~~~~~~~~~~ + +PFCP rules can be created by the following commands(s_field need to be 1 +if seid is set):: + + testpmd> flow create 0 ingress pattern eth / ipv4 / pfcp s_field is 0 / end + actions queue index 3 / end + testpmd> flow create 0 ingress pattern eth / ipv4 / pfcp s_field is 1 + seid is 1 / end actions queue index 3 / end + testpmd> flow create 0 ingress pattern eth / ipv6 / pfcp s_field is 0 / end + actions queue index 3 / end + testpmd> flow create 0 ingress pattern eth / ipv6 / pfcp s_field is 1 + seid is 1 / end actions queue index 3 / end + BPF Functions -------------- diff --git a/lib/librte_ethdev/rte_flow.c b/lib/librte_ethdev/rte_flow.c index 885a7ff9a4..a5ac1c7fbd 100644 --- a/lib/librte_ethdev/rte_flow.c +++ b/lib/librte_ethdev/rte_flow.c @@ -94,6 +94,7 @@ static const struct rte_flow_desc_data rte_flow_desc_item[] = { MK_FLOW_ITEM(AH, sizeof(struct rte_flow_item_ah)), MK_FLOW_ITEM(HIGIG2, sizeof(struct rte_flow_item_higig2_hdr)), MK_FLOW_ITEM(L2TPV3OIP, sizeof(struct rte_flow_item_l2tpv3oip)), + MK_FLOW_ITEM(PFCP, sizeof(struct rte_flow_item_pfcp)), }; /** Generate flow_action[] entry. */ diff --git a/lib/librte_ethdev/rte_flow.h b/lib/librte_ethdev/rte_flow.h index 5625dc4917..7f3e08fad3 100644 --- a/lib/librte_ethdev/rte_flow.h +++ b/lib/librte_ethdev/rte_flow.h @@ -520,6 +520,13 @@ enum rte_flow_item_type { */ RTE_FLOW_ITEM_TYPE_L2TPV3OIP, + /** + * Matches PFCP Header. + * See struct rte_flow_item_pfcp. + * + */ + RTE_FLOW_ITEM_TYPE_PFCP, + }; /** @@ -1508,6 +1515,29 @@ static const struct rte_flow_item_ah rte_flow_item_ah_mask = { }; #endif +/** + * @warning + * @b EXPERIMENTAL: this structure may change without prior notice + * + * RTE_FLOW_ITEM_TYPE_PFCP + * + * Match PFCP Header + */ +struct rte_flow_item_pfcp { + uint8_t s_field; + uint8_t msg_type; + rte_be16_t msg_len; + rte_be64_t seid; +}; + +/** Default mask for RTE_FLOW_ITEM_TYPE_PFCP. */ +#ifndef __cplusplus +static const struct rte_flow_item_pfcp rte_flow_item_pfcp_mask = { + .s_field = 0x01, + .seid = RTE_BE64(0xffffffffffffffff), +}; +#endif + /** * Matching pattern item definition. *