Hi Beilei, On Thu, Mar 23, 2017 at 06:57:47PM +0800, Beilei Xing wrote: > This patch adds sopport for MPLS and GRE items to generic filter > API.
Besides the typo, my previous comment about the title line still stands ("app/testpmd" is not accurate regarding the intent of this patch). > > Signed-off-by: Beilei Xing <beilei.x...@intel.com> > --- > app/test-pmd/cmdline_flow.c | 46 > +++++++++++++++++++++++++++++ > app/test-pmd/config.c | 2 ++ > doc/guides/prog_guide/rte_flow.rst | 20 +++++++++++-- > doc/guides/testpmd_app_ug/testpmd_funcs.rst | 8 +++++ > lib/librte_ether/rte_flow.h | 45 ++++++++++++++++++++++++++++ > 5 files changed, 119 insertions(+), 2 deletions(-) > > diff --git a/app/test-pmd/cmdline_flow.c b/app/test-pmd/cmdline_flow.c > index ff98690..ff1e47c 100644 > --- a/app/test-pmd/cmdline_flow.c > +++ b/app/test-pmd/cmdline_flow.c > @@ -159,6 +159,10 @@ enum index { > ITEM_SCTP_CKSUM, > ITEM_VXLAN, > ITEM_VXLAN_VNI, > + ITEM_MPLS, > + ITEM_MPLS_LABEL, > + ITEM_GRE, > + ITEM_GRE_PROTO, > > /* Validate/create actions. */ > ACTIONS, > @@ -432,6 +436,8 @@ static const enum index next_item[] = { > ITEM_TCP, > ITEM_SCTP, > ITEM_VXLAN, > + ITEM_MPLS, > + ITEM_GRE, > ZERO, > }; > > @@ -538,6 +544,18 @@ static const enum index item_vxlan[] = { > ZERO, > }; > > +static const enum index item_mpls[] = { > + ITEM_MPLS_LABEL, > + ITEM_NEXT, > + ZERO, > +}; > + > +static const enum index item_gre[] = { > + ITEM_GRE_PROTO, > + ITEM_NEXT, > + ZERO, > +}; > + > static const enum index next_action[] = { > ACTION_END, > ACTION_VOID, > @@ -1279,6 +1297,34 @@ static const struct token token_list[] = { > .next = NEXT(item_vxlan, NEXT_ENTRY(UNSIGNED), item_param), > .args = ARGS(ARGS_ENTRY_HTON(struct rte_flow_item_vxlan, vni)), > }, > + [ITEM_MPLS] = { > + .name = "mpls", > + .help = "match MPLS header", > + .priv = PRIV_ITEM(MPLS, sizeof(struct rte_flow_item_mpls)), > + .next = NEXT(item_mpls), > + .call = parse_vc, > + }, > + [ITEM_MPLS_LABEL] = { > + .name = "label", I didn't catch this during my previous review, naming it "label" is wrong because users will actually specify the entire "label_tc_s_ttl" field at once. If you really want to name it "label" with the intent of only assigning the initial 20b, have a look at ITEM_IPV6_TC and ITEM_IPV6_FLOW entries in the same array. > + .help = "MPLS label", > + .next = NEXT(item_mpls, NEXT_ENTRY(UNSIGNED), item_param), > + .args = ARGS(ARGS_ENTRY_HTON(struct rte_flow_item_mpls, > + label_tc_s_ttl)), > + }, > + [ITEM_GRE] = { > + .name = "gre", > + .help = "match GRE header", > + .priv = PRIV_ITEM(GRE, sizeof(struct rte_flow_item_gre)), > + .next = NEXT(item_gre), > + .call = parse_vc, > + }, > + [ITEM_GRE_PROTO] = { > + .name = "protocol", > + .help = "GRE protocol type", > + .next = NEXT(item_gre, NEXT_ENTRY(UNSIGNED), item_param), > + .args = ARGS(ARGS_ENTRY_HTON(struct rte_flow_item_gre, > + protocol)), > + }, > /* Validate/create actions. */ > [ACTIONS] = { > .name = "actions", > diff --git a/app/test-pmd/config.c b/app/test-pmd/config.c > index eb3d572..90d153e 100644 > --- a/app/test-pmd/config.c > +++ b/app/test-pmd/config.c > @@ -963,6 +963,8 @@ static const struct { > MK_FLOW_ITEM(TCP, sizeof(struct rte_flow_item_tcp)), > MK_FLOW_ITEM(SCTP, sizeof(struct rte_flow_item_sctp)), > MK_FLOW_ITEM(VXLAN, sizeof(struct rte_flow_item_vxlan)), > + MK_FLOW_ITEM(MPLS, sizeof(struct rte_flow_item_mpls)), > + MK_FLOW_ITEM(GRE, sizeof(struct rte_flow_item_gre)), > }; > > /** Compute storage space needed by item specification. */ > diff --git a/doc/guides/prog_guide/rte_flow.rst > b/doc/guides/prog_guide/rte_flow.rst > index 3bf8871..45897cd 100644 > --- a/doc/guides/prog_guide/rte_flow.rst > +++ b/doc/guides/prog_guide/rte_flow.rst > @@ -187,8 +187,8 @@ Pattern item > Pattern items fall in two categories: > > - Matching protocol headers and packet data (ANY, RAW, ETH, VLAN, IPV4, > - IPV6, ICMP, UDP, TCP, SCTP, VXLAN and so on), usually associated with a > - specification structure. > + IPV6, ICMP, UDP, TCP, SCTP, VXLAN, MPLS, GRE and so on), usually > + associated with a specification structure. > > - Matching meta-data or affecting pattern processing (END, VOID, INVERT, PF, > VF, PORT and so on), often without a specification structure. > @@ -863,6 +863,22 @@ Matches a VXLAN header (RFC 7348). > - ``rsvd1``: reserved, normally 0x00. > - Default ``mask`` matches VNI only. > > +Item: ``MPLS`` > +^^^^^^^^^^^^^^ > + > +Matches a MPLS header. > + > +- ``label_tc_s_ttl``: Lable, TC, Bottom of Stack and TTL. Typo, "Lable". Also a minor comment, this word should be lower case since it comes after a colon. > +- Default ``mask`` matches label only. > + > +Item: ``GRE`` > +^^^^^^^^^^^^^^ > + > +Matches a GRE header. > + > +- ``c_rsvd0_ver``: Checksum, reserved 0 and version. > +- ``protocol``: Protocol type. "Checksum" and "Protocol" should be lower case. You must define a default mask as well. > +[ > Actions > ~~~~~~~ > > diff --git a/doc/guides/testpmd_app_ug/testpmd_funcs.rst > b/doc/guides/testpmd_app_ug/testpmd_funcs.rst > index bdc6a14..f9fa5d6 100644 > --- a/doc/guides/testpmd_app_ug/testpmd_funcs.rst > +++ b/doc/guides/testpmd_app_ug/testpmd_funcs.rst > @@ -2453,6 +2453,14 @@ This section lists supported pattern items and their > attributes, if any. > > - ``vni {unsigned}``: VXLAN identifier. > > +- ``mpls``: match MPLS header. > + > + - ``label {unsigned}``: MPLS label. > + > +- ``gre``: match GRE header. > + > + - ``protocol {unsigned}``: Protocol type. > + Indentation issue, also "Protocol" should be lower case. > Actions list > ^^^^^^^^^^^^ > > diff --git a/lib/librte_ether/rte_flow.h b/lib/librte_ether/rte_flow.h > index 171a569..f855090 100644 > --- a/lib/librte_ether/rte_flow.h > +++ b/lib/librte_ether/rte_flow.h > @@ -282,6 +282,20 @@ enum rte_flow_item_type { > * See struct rte_flow_item_nvgre. > */ > RTE_FLOW_ITEM_TYPE_NVGRE, > + > + /** > + * Matches a MPLS header. > + * > + * See struct rte_flow_item_mpls. > + */ > + RTE_FLOW_ITEM_TYPE_MPLS, > + > + /** > + * Matches a GRE header. > + * > + * See struct rte_flow_item_gre. > + */ > + RTE_FLOW_ITEM_TYPE_GRE, > }; > > /** > @@ -599,6 +613,37 @@ struct rte_flow_item_nvgre { > }; > > /** > + * RTE_FLOW_ITEM_TYPE_MPLS. > + * > + * Matches a MPLS header. > + */ > +struct rte_flow_item_mpls { > + /** > + * Lable (20b), TC (3b), Bottom of Stack (1b), TTL (8b). Typo, "Lable". > + */ > + uint32_t label_tc_s_ttl; > +}; > + > +/** Default mask for RTE_FLOW_ITEM_TYPE_MPLS. */ > +static const struct rte_flow_item_mpls rte_flow_item_mpls_mask = { > + .label_tc_s_ttl = 0xfffff, > +}; This default mask is wrong, it has to be specified in network order (you can include rte_byteorder.h if you need some #ifdef). > + > +/** > + * RTE_FLOW_ITEM_TYPE_GRE. > + * > + * Matches a GRE header. > + */ > +struct rte_flow_item_gre { > + /** > + * Checksum (1b), reserved 0 (12b), version (3b). > + * Refer to RFC 2784. > + */ > + uint16_t c_rsvd0_ver; > + uint16_t protocol; /**< Protocol type. */ > +}; Default mask is missing, you must add one. > + > +/** > * Matching pattern item definition. > * > * A pattern is formed by stacking items starting from the lowest protocol > -- > 2.5.5 > -- Adrien Mazarguil 6WIND