Hi Xiao, Sorry for delayed response.
Thanks, Ori > -----Original Message----- > From: dev <dev-boun...@dpdk.org> On Behalf Of Xiao Zhang > Sent: Thursday, February 20, 2020 6:02 AM > To: dev@dpdk.org > Cc: arybche...@solarflare.com; ferruh.yi...@intel.com; Xiao Zhang > <xiao.zh...@intel.com> > Subject: [dpdk-dev] 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 <xiao.zh...@intel.com> > --- > app/test-pmd/cmdline_flow.c | 37 > +++++++++++++++++++++++++++++ > doc/guides/prog_guide/rte_flow.rst | 11 +++++++++ > doc/guides/testpmd_app_ug/testpmd_funcs.rst | 20 ++++++++++++++++ > lib/librte_ethdev/rte_flow.c | 1 + > lib/librte_ethdev/rte_flow.h | 31 ++++++++++++++++++++++++ > 5 files changed, 100 insertions(+) > > diff --git a/app/test-pmd/cmdline_flow.c b/app/test-pmd/cmdline_flow.c > index c2cc4c5..0b735cd 100644 > --- a/app/test-pmd/cmdline_flow.c > +++ b/app/test-pmd/cmdline_flow.c > @@ -220,6 +220,9 @@ enum index { > ITEM_L2TPV3OIP_SESSION_ID, > ITEM_ESP, > ITEM_ESP_SPI, > + ITEM_PFCP, > + ITEM_PFCP_S_FIELD, > + ITEM_PFCP_SEID, > > /* Validate/create actions. */ > ACTIONS, > @@ -768,6 +771,7 @@ static const enum index next_item[] = { > ITEM_TAG, > ITEM_L2TPV3OIP, > ITEM_ESP, > + ITEM_PFCP, > END_SET, > ZERO, > }; > @@ -1046,6 +1050,13 @@ static const enum index item_esp[] = { > 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, > @@ -2699,6 +2710,26 @@ static const struct token token_list[] = { > .args = ARGS(ARGS_ENTRY_HTON(struct rte_flow_item_esp, > hdr.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", > @@ -6444,6 +6475,9 @@ flow_item_default_mask(const struct rte_flow_item > *item) > case RTE_FLOW_ITEM_TYPE_ESP: > mask = &rte_flow_item_esp_mask; > break; > + case RTE_FLOW_ITEM_TYPE_PFCP: > + mask = &rte_flow_item_pfcp_mask; > + break; > default: > break; > } > @@ -6541,6 +6575,9 @@ cmd_set_raw_parsed(const struct buffer *in) > size = sizeof(struct rte_flow_item_esp); > proto = 0x32; > 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 371819e..2851cee 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 5103ff9..3d05d5f 100644 > --- a/doc/guides/testpmd_app_ug/testpmd_funcs.rst > +++ b/doc/guides/testpmd_app_ug/testpmd_funcs.rst > @@ -3987,6 +3987,11 @@ This section lists supported pattern items and their > attributes, if any. > > - ``session_id {unsigned}``: L2TPv3 over IP session identifier. > > +- ``pfcp``: match PFCP header. > + > + - ``s_field {unsigned}``: S field. > + - ``seid {unsigned}``: session endpoint identifier. > + > Actions list > ^^^^^^^^^^^^ > > @@ -4822,6 +4827,21 @@ ESP rules can be created by the following > commands:: > testpmd> flow create 0 ingress pattern eth / ipv6 / udp / esp 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 885a7ff..a5ac1c7 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 5625dc4..9addf1c 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, > + > }; > > /** > @@ -1509,6 +1516,30 @@ 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; > + uint16_t msg_len; > + uint64_t seid; > +}; I think this should be in BE format. > + > +/** 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 = 0xffffffffffffffff, > +}; > +#endif > + > +/** > * Matching pattern item definition. > * > * A pattern is formed by stacking items starting from the lowest protocol > -- > 2.7.4