[PATCH v4 1/3] ethdev: add IPv6 routing extension header definition

Andrew Rybchenko andrew.rybchenko at oktetlabs.ru
Wed Feb 1 10:31:18 CET 2023


On 2/1/23 12:27, Rongwei Liu wrote:
> HI Andrew:
> 
> BR
> Rongwei
> 
>> -----Original Message-----
>> From: Andrew Rybchenko <andrew.rybchenko at oktetlabs.ru>
>> Sent: Wednesday, February 1, 2023 17:21
>> To: Rongwei Liu <rongweil at nvidia.com>; dev at dpdk.org; Matan Azrad
>> <matan at nvidia.com>; Slava Ovsiienko <viacheslavo at nvidia.com>; Ori Kam
>> <orika at nvidia.com>; NBU-Contact-Thomas Monjalon (EXTERNAL)
>> <thomas at monjalon.net>
>> Cc: Raslan Darawsheh <rasland at nvidia.com>; Aman Singh
>> <aman.deep.singh at intel.com>; Yuying Zhang <yuying.zhang at intel.com>;
>> Ferruh Yigit <ferruh.yigit at amd.com>; Olivier Matz <olivier.matz at 6wind.com>
>> Subject: Re: [PATCH v4 1/3] ethdev: add IPv6 routing extension header
>> definition
>>
>> External email: Use caution opening links or attachments
>>
>>
>> On 1/31/23 12:36, Rongwei Liu wrote:
>>> Add IPv6 routing extension header definition and no TLV support for
>>> now.
>>>
>>> At rte_flow layer, there are new items defined for matching
>>> type/nexthdr/segments_left field.
>>>
>>> Add command line support for IPv6 routing extension header
>>> matching: type/nexthdr/segment_list.
>>>
>>> Signed-off-by: Rongwei Liu <rongweil at nvidia.com>
>>> Acked-by: Ori Kam <orika at nvidia.com>
>>> ---
>>>    app/test-pmd/cmdline_flow.c            | 46 ++++++++++++++++++++++++++
>>>    doc/guides/prog_guide/rte_flow.rst     |  9 +++++
>>>    doc/guides/rel_notes/release_23_03.rst |  9 +++++
>>>    lib/ethdev/rte_flow.c                  | 19 +++++++++++
>>>    lib/ethdev/rte_flow.h                  | 21 ++++++++++++
>>>    lib/net/rte_ip.h                       | 19 +++++++++++
>>>    6 files changed, 123 insertions(+)
>>>
>>> diff --git a/app/test-pmd/cmdline_flow.c b/app/test-pmd/cmdline_flow.c
>>> index 88108498e0..7a8516829c 100644
>>> --- a/app/test-pmd/cmdline_flow.c
>>> +++ b/app/test-pmd/cmdline_flow.c
>>> @@ -298,6 +298,10 @@ enum index {
>>>        ITEM_IPV6_SRC,
>>>        ITEM_IPV6_DST,
>>>        ITEM_IPV6_HAS_FRAG_EXT,
>>> +     ITEM_IPV6_ROUTING_EXT,
>>> +     ITEM_IPV6_ROUTING_EXT_TYPE,
>>> +     ITEM_IPV6_ROUTING_EXT_NEXT_HDR,
>>> +     ITEM_IPV6_ROUTING_EXT_SEG_LEFT,
>>>        ITEM_ICMP,
>>>        ITEM_ICMP_TYPE,
>>>        ITEM_ICMP_CODE,
>>> @@ -1326,6 +1330,7 @@ static const enum index next_item[] = {
>>>        ITEM_ARP_ETH_IPV4,
>>>        ITEM_IPV6_EXT,
>>>        ITEM_IPV6_FRAG_EXT,
>>> +     ITEM_IPV6_ROUTING_EXT,
>>>        ITEM_ICMP6,
>>>        ITEM_ICMP6_ND_NS,
>>>        ITEM_ICMP6_ND_NA,
>>> @@ -1435,6 +1440,15 @@ static const enum index item_ipv6[] = {
>>>        ITEM_IPV6_SRC,
>>>        ITEM_IPV6_DST,
>>>        ITEM_IPV6_HAS_FRAG_EXT,
>>> +     ITEM_IPV6_ROUTING_EXT,
>>> +     ITEM_NEXT,
>>> +     ZERO,
>>> +};
>>> +
>>> +static const enum index item_ipv6_routing_ext[] = {
>>> +     ITEM_IPV6_ROUTING_EXT_TYPE,
>>> +     ITEM_IPV6_ROUTING_EXT_NEXT_HDR,
>>> +     ITEM_IPV6_ROUTING_EXT_SEG_LEFT,
>>>        ITEM_NEXT,
>>>        ZERO,
>>>    };
>>> @@ -3844,6 +3858,38 @@ static const struct token token_list[] = {
>>>                .args = ARGS(ARGS_ENTRY_BF(struct rte_flow_item_ipv6,
>>>                                           has_frag_ext, 1)),
>>>        },
>>> +     [ITEM_IPV6_ROUTING_EXT] = {
>>> +             .name = "ipv6_routing_ext",
>>> +             .help = "match IPv6 routing extension header",
>>> +             .priv = PRIV_ITEM(IPV6_ROUTING_EXT,
>>> +                               sizeof(struct rte_flow_item_ipv6_routing_ext)),
>>> +             .next = NEXT(item_ipv6_routing_ext),
>>> +             .call = parse_vc,
>>> +     },
>>> +     [ITEM_IPV6_ROUTING_EXT_TYPE] = {
>>> +             .name = "ext_type",
>>> +             .help = "match IPv6 routing extension header type",
>>> +             .next = NEXT(item_ipv6_routing_ext,
>> NEXT_ENTRY(COMMON_UNSIGNED),
>>> +                          item_param),
>>> +             .args = ARGS(ARGS_ENTRY_HTON(struct
>> rte_flow_item_ipv6_routing_ext,
>>> +                                          hdr.type)),
>>> +     },
>>> +     [ITEM_IPV6_ROUTING_EXT_NEXT_HDR] = {
>>> +             .name = "ext_next_hdr",
>>> +             .help = "match IPv6 routing extension header next header type",
>>> +             .next = NEXT(item_ipv6_routing_ext,
>> NEXT_ENTRY(COMMON_UNSIGNED),
>>> +                          item_param),
>>> +             .args = ARGS(ARGS_ENTRY_HTON(struct
>> rte_flow_item_ipv6_routing_ext,
>>> +                                          hdr.next_hdr)),
>>> +     },
>>> +     [ITEM_IPV6_ROUTING_EXT_SEG_LEFT] = {
>>> +             .name = "ext_seg_left",
>>> +             .help = "match IPv6 routing extension header segment left",
>>> +             .next = NEXT(item_ipv6_routing_ext,
>> NEXT_ENTRY(COMMON_UNSIGNED),
>>> +                          item_param),
>>> +             .args = ARGS(ARGS_ENTRY_HTON(struct
>> rte_flow_item_ipv6_routing_ext,
>>> +                                          hdr.segments_left)),
>>> +     },
>>>        [ITEM_ICMP] = {
>>>                .name = "icmp",
>>>                .help = "match ICMP header", diff --git
>>> a/doc/guides/prog_guide/rte_flow.rst
>>> b/doc/guides/prog_guide/rte_flow.rst
>>> index 3e6242803d..602fab29d3 100644
>>> --- a/doc/guides/prog_guide/rte_flow.rst
>>> +++ b/doc/guides/prog_guide/rte_flow.rst
>>> @@ -1544,6 +1544,15 @@ Matches Color Marker set by a Meter.
>>>
>>>    - ``color``: Metering color marker.
>>>
>>> +Item: ``IPV6_ROUTING_EXT``
>>> +^^^^^^^^^^^^^^^^^^^^^^^^^^
>>> +
>>> +Matches IPv6 routing extension header.
>>> +
>>> +- ``next_hdr``: Next layer header type.
>>> +- ``type``: IPv6 routing extension header type.
>>> +- ``segments_left``: How many IPv6 destination addresses carries on.
>>> +
>>>    Actions
>>>    ~~~~~~~
>>>
>>> diff --git a/doc/guides/rel_notes/release_23_03.rst
>>> b/doc/guides/rel_notes/release_23_03.rst
>>> index c15f6fbb9f..1337da73b8 100644
>>> --- a/doc/guides/rel_notes/release_23_03.rst
>>> +++ b/doc/guides/rel_notes/release_23_03.rst
>>> @@ -69,6 +69,11 @@ New Features
>>>        ``rte_event_dev_config::nb_single_link_event_port_queues`` parameter
>>>        required for eth_rx, eth_tx, crypto and timer eventdev adapters.
>>>
>>> +* **Added rte_flow support for matching IPv6 routing extension header
>>> +fields.**
>>> +
>>> +  Added ``ipv6_routing_ext`` items in rte_flow to match IPv6 routing
>>> + extension  header.
>>> +
>>>
>>>    Removed Items
>>>    -------------
>>> @@ -98,6 +103,10 @@ API Changes
>>>       Also, make sure to start the actual text at the margin.
>>>       =======================================================
>>>
>>> +* net: added a new structure:
>>> +
>>> +    - IPv6 routing extension header ``rte_ipv6_routing_ext``.
>>> +
>>>
>>>    ABI Changes
>>>    -----------
>>> diff --git a/lib/ethdev/rte_flow.c b/lib/ethdev/rte_flow.c index
>>> 7d0c24366c..833382c466 100644
>>> --- a/lib/ethdev/rte_flow.c
>>> +++ b/lib/ethdev/rte_flow.c
>>> @@ -76,6 +76,23 @@ rte_flow_item_flex_conv(void *buf, const void *data)
>>>        return src->length;
>>>    }
>>>
>>> +static size_t
>>> +rte_flow_item_ipv6_routing_ext_conv(void *buf, const void *data) {
>>> +     struct rte_flow_item_ipv6_routing_ext *dst = buf;
>>> +     const struct rte_flow_item_ipv6_routing_ext *src = data;
>>> +     size_t len;
>>> +
>>> +     if (src->hdr.hdr_len)
>>
>> Please, compare vs 0
>>
>>> +             len = src->hdr.hdr_len << 3;
>>> +     else
>>> +             len = src->hdr.segments_left << 4;
>>> +     if (dst == NULL)
>>> +             return 0;
>>> +     memcpy(dst->segments, src->segments, len);
>>> +     return len;
>>> +}
>>> +
>>>    /** Generate flow_item[] entry. */
>>>    #define MK_FLOW_ITEM(t, s) \
>>>        [RTE_FLOW_ITEM_TYPE_ ## t] = { \ @@ -157,6 +174,8 @@ static
>>> const struct rte_flow_desc_data rte_flow_desc_item[] = {
>>>        MK_FLOW_ITEM(L2TPV2, sizeof(struct rte_flow_item_l2tpv2)),
>>>        MK_FLOW_ITEM(PPP, sizeof(struct rte_flow_item_ppp)),
>>>        MK_FLOW_ITEM(METER_COLOR, sizeof(struct
>>> rte_flow_item_meter_color)),
>>> +     MK_FLOW_ITEM_FN(IPV6_ROUTING_EXT, sizeof(struct
>> rte_flow_item_ipv6_routing_ext),
>>> +                     rte_flow_item_ipv6_routing_ext_conv),
>>>    };
>>>
>>>    /** Generate flow_action[] entry. */ diff --git
>>> a/lib/ethdev/rte_flow.h b/lib/ethdev/rte_flow.h index
>>> b60987db4b..ff9270690c 100644
>>> --- a/lib/ethdev/rte_flow.h
>>> +++ b/lib/ethdev/rte_flow.h
>>> @@ -624,6 +624,13 @@ enum rte_flow_item_type {
>>>         * See struct rte_flow_item_meter_color.
>>>         */
>>>        RTE_FLOW_ITEM_TYPE_METER_COLOR,
>>> +
>>> +     /**
>>> +      * Matches the presence of IPv6 routing extension header.
>>> +      *
>>> +      * @see struct rte_flow_item_ipv6_routing_ext.
>>> +      */
>>> +     RTE_FLOW_ITEM_TYPE_IPV6_ROUTING_EXT,
>>>    };
>>>
>>>    /**
>>> @@ -873,6 +880,20 @@ struct rte_flow_item_ipv6 {
>>>        uint32_t reserved:23;
>>>    };
>>>
>>> +/**
>>> + * @warning
>>> + * @b EXPERIMENTAL: this structure may change without prior notice
>>> + *
>>> + * RTE_FLOW_ITEM_TYPE_IPV6_ROUTING_EXT.
>>> + *
>>> + * Matches an IPv6 routing extension header.
>>> + */
>>> +struct rte_flow_item_ipv6_routing_ext {
>>> +     struct rte_ipv6_routing_ext hdr;
>>> +     __extension__
>>> +     rte_be32_t segments[]; /**< Each hop IPv6 address. */
>>
>> Do we really need it? Are you going to support it?
>> Will testpmd and flow conf work correctly since it uses size of the structure?
>>
> In the rte_flow.c and testpmd raw_encap() function, it relies on the hdr_len or segment_left fild not sizeof this structure.

We still have a number of sizeof() invocations for the
structure in the patch. I worry that related code will
not work fine if someone tries to specify segments.

>> IMHO we should just remove it right now if we're not going to support it.
>>
> In matching, we don't support segments field. I am ok to remove it.

Me too



More information about the dev mailing list