[dpdk-dev] [PATCH 15/18] net/ixgbe: parse flow director filter

Zhao1, Wei wei.zhao1 at intel.com
Tue Dec 27 04:31:28 CET 2016


Hi,  Adrien

> -----Original Message-----
> From: Adrien Mazarguil [mailto:adrien.mazarguil at 6wind.com]
> Sent: Friday, December 23, 2016 4:13 PM
> To: Yigit, Ferruh <ferruh.yigit at intel.com>
> Cc: Zhao1, Wei <wei.zhao1 at intel.com>; dev at dpdk.org; Lu, Wenzhuo
> <wenzhuo.lu at intel.com>
> Subject: Re: [dpdk-dev] [PATCH 15/18] net/ixgbe: parse flow director filter
> 
> Hi,
> 
> On Thu, Dec 22, 2016 at 10:44:32AM +0000, Ferruh Yigit wrote:
> > On 12/22/2016 9:19 AM, Zhao1, Wei wrote:
> > > Hi, Yigit
> > >
> > >> -----Original Message-----
> > >> From: Yigit, Ferruh
> > >> Sent: Wednesday, December 21, 2016 1:01 AM
> > >> To: Zhao1, Wei <wei.zhao1 at intel.com>; dev at dpdk.org
> > >> Cc: Lu, Wenzhuo <wenzhuo.lu at intel.com>
> > >> Subject: Re: [dpdk-dev] [PATCH 15/18] net/ixgbe: parse flow
> > >> director filter
> > >>
> > >> On 12/2/2016 10:43 AM, Wei Zhao wrote:
> > >>> From: wei zhao1 <wei.zhao1 at intel.com>
> > >>>
> > >>> check if the rule is a flow director rule, and get the flow director info.
> > >>>
> > >>> Signed-off-by: wei zhao1 <wei.zhao1 at intel.com>
> > >>> Signed-off-by: Wenzhuo Lu <wenzhuo.lu at intel.com>
> > >>> ---
> > >>
> > >> <...>
> > >>
> > >>> +	PATTERN_SKIP_VOID(rule, struct ixgbe_fdir_rule,
> > >>> +			  RTE_FLOW_ERROR_TYPE_ITEM_NUM);
> > >>> +	if (item->type != RTE_FLOW_ITEM_TYPE_ETH &&
> > >>> +	    item->type != RTE_FLOW_ITEM_TYPE_IPV4 &&
> > >>> +	    item->type != RTE_FLOW_ITEM_TYPE_IPV6 &&
> > >>> +	    item->type != RTE_FLOW_ITEM_TYPE_UDP &&
> > >>> +	    item->type != RTE_FLOW_ITEM_TYPE_VXLAN &&
> > >>> +	    item->type != RTE_FLOW_ITEM_TYPE_NVGRE) {
> > >>
> > >> This gives build error [1], there are a few more same usage:
> > >>
> > >> .../drivers/net/ixgbe/ixgbe_ethdev.c:9238:17: error: comparison of
> > >> constant
> > >> 241 with expression of type 'const enum rte_flow_item_type' is
> > >> always true [-Werror,-Wtautological-constant-out-of-range-compare]
> > >>             item->type != RTE_FLOW_ITEM_TYPE_NVGRE) {
> > >>
> > >>
> > >>
> > >
> > > Ok, I will add two type definition RTE_FLOW_ITEM_TYPE_NVGRE and
> RTE_FLOW_ITEM_TYPE_E_TAG  into const enum rte_flow_item_type to
> eliminate this problem.
> > > Thank you.
> > >
> >
> > CC: Adrien Mazarguil <adrien.mazarguil at 6wind.com>
> 
> Thanks, the original message did not catch my attention.
> 
> > Yes, that is what right thing to do, since rte_flow patchset not
> > merged yet, perhaps Adrien may want to include this as next version of
> > his patchset?
> >
> > What do you think Adrien?
> 
> I think by now the rte_flow series is automatically categorized as spam by
> half the community already, and that new items such as these can be added
> subsequently on their own, ideally before the entire ixgbe/i40e series.
> 
> I have a few comments regarding these new items if we want to make them
> part of rte_flow.h (see definitions below).
> 
oK , I will add these type definition by my patch in v2

> Unfortunately, even though they are super convenient to use and expose in
> the testpmd flow command, we need to avoid C-style bit-field definitions
> such as these for protocol header matching because they are not endian-
> safe, particularly multi-byte fields. Only meta-data that should be interpreted
> with host endianness can use them (e.g. struct rte_flow_attr, struct
> rte_flow_action_vf, etc):
> 
>  struct rte_flow_item_nvgre {
>         uint32_t flags0:1; /**< 0 */
>         uint32_t rsvd1:1; /**< 1 bit not defined */
>         uint32_t flags1:2; /**< 2 bits, 1 0 */
>         uint32_t rsvd0:9; /**< Reserved0 */
>         uint32_t ver:3; /**< version */
>         uint32_t protocol:16; /**< protocol type, 0x6558 */
>         uint32_t tni:24; /**< tenant network ID or virtual subnet ID */
>         uint32_t flow_id:8; /**< flow ID or Reserved */  };
> 
> For an example how to avoid them, see struct ipv6_hdr definition in rte_ip.h,
> where field vtc_flow is 32 bit but covers three protocol fields and is
> considered big-endian (Nelio's endianness series [1] would be really handy to
> eliminate confusion here). Also see struct rte_flow_item_vxlan, which
> covers 24-bit fields using uint8_t arrays.
> 
>  struct rte_flow_item_e_tag {
>         struct ether_addr dst; /**< Destination MAC. */
>         struct ether_addr src; /**< Source MAC. */
>         uint16_t e_tag_ethertype; /**< E-tag EtherType, 0x893F. */
>         uint16_t e_pcp:3; /**<  E-PCP */
>         uint16_t dei:1; /**< DEI */
>         uint16_t in_e_cid_base:12; /**< Ingress E-CID base */
>         uint16_t rsv:2; /**< reserved */
>         uint16_t grp:2; /**< GRP */
>         uint16_t e_cid_base:12; /**< E-CID base */
>         uint16_t in_e_cid_ext:8; /**< Ingress E-CID extend */
>         uint16_t e_cid_ext:8; /**< E-CID extend */
>         uint16_t type; /**< MAC type. */
>         unsigned int tags; /**< Number of 802.1Q/ad tags defined. */
>         struct {
>                 uint16_t tpid; /**< Tag protocol identifier. */
>                 uint16_t tci; /**< Tag control information. */
>         } tag[]; /**< 802.1Q/ad tag definitions, outermost first. */  };
> 
> Besides the bit-field issue for this one, looks like it should be split, at least the
> initial part is already covered by rte_flow_item_eth.
> 
> I do not know much about E-Tag (IEEE 802.1BR right?) but it sort of looks like a
> 2.5 layer protocol reminiscent of VLAN.
> 
> tags and tag[] fields seem based on the VLAN definition of the original
> rte_flow RFC that has since been replaced with stacked rte_flow_item_vlan
> items, much easier to program for. Perhaps this can be relied on instead of
> having e_tag implement its own variant.
> 
> As a protocol-matching item and E-Tag TCI being 6 bytes according to IEEE
> 802.1BR, sizeof(struct rte_flow_item_e_tag) should ideally return 6 as well
> and would likely comprise three big-endian uint16_t fields. See how
> PCP/DEI/VID VLAN fields are interpreted in testpmd [2].
> 
> Again, these concerns only stand if you intend to include these definitions
> into rte_flow.h.
> 
> [1] http://dpdk.org/ml/archives/dev/2016-November/050060.html
> [2] http://dpdk.org/ml/archives/dev/2016-December/052976.html
> 
> --
> Adrien Mazarguil
> 6WIND


More information about the dev mailing list