ip6: ECMP hash support for ipv6 fragments 09/39309/5
authorBenoît Ganne <bganne@cisco.com>
Wed, 2 Aug 2023 09:31:46 +0000 (11:31 +0200)
committerBeno�t Ganne <bganne@cisco.com>
Thu, 22 Feb 2024 08:24:02 +0000 (08:24 +0000)
Type: improvement

Change-Id: I41f70e5977fedbf0050205ebe52126ef373ebc06
Signed-off-by: Benoît Ganne <bganne@cisco.com>
src/vnet/ip/ip6_inlines.h
src/vnet/ip/ip6_packet.h

index 4a2b91b..9bd4752 100644 (file)
@@ -49,31 +49,40 @@ always_inline u32
 ip6_compute_flow_hash (const ip6_header_t * ip,
                       flow_hash_config_t flow_hash_config)
 {
-  tcp_header_t *tcp;
-  udp_header_t *udp = (void *) (ip + 1);
-  gtpv1u_header_t *gtpu = (void *) (udp + 1);
+  const tcp_header_t *tcp;
+  const udp_header_t *udp = (void *) (ip + 1);
+  const gtpv1u_header_t *gtpu = (void *) (udp + 1);
   u64 a, b, c;
   u64 t1, t2;
   u32 t3;
   uword is_tcp_udp = 0;
-  uword is_udp = ip->protocol == IP_PROTOCOL_UDP;
   u8 protocol = ip->protocol;
+  uword is_udp = protocol == IP_PROTOCOL_UDP;
 
-  if (PREDICT_TRUE ((ip->protocol == IP_PROTOCOL_TCP) || is_udp))
+  if (PREDICT_TRUE ((protocol == IP_PROTOCOL_TCP) || is_udp))
     {
       is_tcp_udp = 1;
       tcp = (void *) (ip + 1);
     }
-  else if (ip->protocol == IP_PROTOCOL_IP6_HOP_BY_HOP_OPTIONS)
+  else
     {
-      ip6_hop_by_hop_header_t *hbh = (ip6_hop_by_hop_header_t *) (ip + 1);
-      if ((hbh->protocol == IP_PROTOCOL_TCP) ||
-         (hbh->protocol == IP_PROTOCOL_UDP))
+      const void *cur = ip + 1;
+      if (protocol == IP_PROTOCOL_IP6_HOP_BY_HOP_OPTIONS)
+       {
+         const ip6_hop_by_hop_header_t *hbh = cur;
+         protocol = hbh->protocol;
+         cur += (hbh->length + 1) * 8;
+       }
+      if (protocol == IP_PROTOCOL_IPV6_FRAGMENTATION)
+       {
+         const ip6_fragment_ext_header_t *frag = cur;
+         protocol = frag->protocol;
+       }
+      else if (protocol == IP_PROTOCOL_TCP || protocol == IP_PROTOCOL_UDP)
        {
          is_tcp_udp = 1;
-         tcp = (tcp_header_t *) ((u8 *) hbh + ((hbh->length + 1) << 3));
+         tcp = cur;
        }
-      protocol = hbh->protocol;
     }
 
   t1 = (ip->src_address.as_u64[0] ^ ip->src_address.as_u64[1]);
index e71604c..c506792 100644 (file)
@@ -440,6 +440,13 @@ typedef CLIB_PACKED (struct {
   u16 value;
 }) ip6_router_alert_option_t;
 
+typedef CLIB_PACKED (struct {
+  u8 protocol;
+  u8 reserved;
+  u16 fragoff;
+  u32 id;
+}) ip6_fragment_ext_header_t;
+
 typedef CLIB_PACKED (struct {
   u8 next_hdr;
   /* Length of this header plus option data in 8 byte units. */