Add IPv6 routing extension header support in raw_encap command.
1. No TLV support now.
2. Assume header length equals to the current segment_left.

Signed-off-by: Rongwei Liu <rongw...@nvidia.com>
Acked-by: Ori Kam <or...@nvidia.com>
---
 app/test-pmd/cmdline_flow.c | 23 +++++++++++++++++++++++
 1 file changed, 23 insertions(+)

diff --git a/app/test-pmd/cmdline_flow.c b/app/test-pmd/cmdline_flow.c
index 7a8516829c..4bdb46e89a 100644
--- a/app/test-pmd/cmdline_flow.c
+++ b/app/test-pmd/cmdline_flow.c
@@ -10925,6 +10925,13 @@ flow_item_default_mask(const struct rte_flow_item 
*item)
 {
        const void *mask = NULL;
        static rte_be32_t gre_key_default_mask = RTE_BE32(UINT32_MAX);
+       static struct rte_flow_item_ipv6_routing_ext 
ipv6_routing_ext_default_mask = {
+               .hdr = {
+                       .next_hdr = 0xff,
+                       .type = 0xff,
+                       .segments_left = 0xff,
+               },
+       };
 
        switch (item->type) {
        case RTE_FLOW_ITEM_TYPE_ANY:
@@ -11027,6 +11034,9 @@ flow_item_default_mask(const struct rte_flow_item *item)
        case RTE_FLOW_ITEM_TYPE_METER_COLOR:
                mask = &rte_flow_item_meter_color_mask;
                break;
+       case RTE_FLOW_ITEM_TYPE_IPV6_ROUTING_EXT:
+               mask = &ipv6_routing_ext_default_mask;
+               break;
        default:
                break;
        }
@@ -11181,6 +11191,7 @@ cmd_set_raw_parsed(const struct buffer *in)
        for (i = n - 1 ; i >= 0; --i) {
                const struct rte_flow_item_gtp *gtp;
                const struct rte_flow_item_geneve_opt *opt;
+               struct rte_flow_item_ipv6_routing_ext *ext;
 
                item = in->args.vc.pattern + i;
                if (item->spec == NULL)
@@ -11201,6 +11212,18 @@ cmd_set_raw_parsed(const struct buffer *in)
                        size = sizeof(struct rte_ipv6_hdr);
                        proto = RTE_ETHER_TYPE_IPV6;
                        break;
+               case RTE_FLOW_ITEM_TYPE_IPV6_ROUTING_EXT:
+                       ext = (struct rte_flow_item_ipv6_routing_ext 
*)(uintptr_t)item->spec;
+                       if (!ext->hdr.hdr_len) {
+                               size = sizeof(struct rte_ipv6_routing_ext) +
+                                       (ext->hdr.segments_left << 4);
+                               ext->hdr.hdr_len = ext->hdr.segments_left << 1;
+                       } else {
+                               size = sizeof(struct rte_ipv6_routing_ext) +
+                                       (ext->hdr.hdr_len << 3);
+                       }
+                       proto = IPPROTO_ROUTING;
+                       break;
                case RTE_FLOW_ITEM_TYPE_UDP:
                        size = sizeof(struct rte_udp_hdr);
                        proto = 0x11;
-- 
2.27.0

Reply via email to