vnet: add assert for offload flags in debug mode 85/42185/6
authorMohsin Kazmi <[email protected]>
Mon, 27 Jan 2025 18:28:53 +0000 (18:28 +0000)
committerBenoit Ganne <[email protected]>
Tue, 27 May 2025 10:46:50 +0000 (10:46 +0000)
Type: improvement

Signed-off-by: Mohsin Kazmi <[email protected]>
Change-Id: I7ac5ba0e2dc1fe09a00124b661d6c853a010736a

src/plugins/lisp/lisp-cp/packets.c
src/vnet/buffer.h
src/vnet/dpo/mpls_label_dpo.c
src/vnet/ethernet/node.c
src/vnet/gso/gro_func.h
src/vnet/ip/ip4_forward.c
src/vnet/ip/ip6_forward.c

index 6c36a55..6aaa516 100644 (file)
@@ -182,9 +182,11 @@ pkt_push_udp_and_ip (vlib_main_t * vm, vlib_buffer_t * b, u16 sp, u16 dp,
   if (csum_offload)
     {
       ih = pkt_push_ip (vm, b, sip, dip, IP_PROTOCOL_UDP, 1);
-      vnet_buffer_offload_flags_set (b, VNET_BUFFER_OFFLOAD_F_UDP_CKSUM);
       vnet_buffer (b)->l3_hdr_offset = (u8 *) ih - b->data;
       vnet_buffer (b)->l4_hdr_offset = (u8 *) uh - b->data;
+      b->flags |=
+       VNET_BUFFER_F_L3_HDR_OFFSET_VALID | VNET_BUFFER_F_L4_HDR_OFFSET_VALID;
+      vnet_buffer_offload_flags_set (b, VNET_BUFFER_OFFLOAD_F_UDP_CKSUM);
       uh->checksum = 0;
     }
   else
index 276cb11..5620f99 100644 (file)
@@ -547,6 +547,23 @@ vnet_buffer_offload_flags_set (vlib_buffer_t *b, vnet_buffer_oflags_t oflags)
       vnet_buffer (b)->oflags = oflags;
       b->flags |= VNET_BUFFER_F_OFFLOAD;
     }
+#if CLIB_DEBUG > 0
+  if (VNET_BUFFER_OFFLOAD_F_IP_CKSUM & oflags)
+    {
+      ASSERT (b->flags & VNET_BUFFER_F_L3_HDR_OFFSET_VALID);
+      ASSERT (b->flags & VNET_BUFFER_F_IS_IP4);
+    }
+
+  if ((VNET_BUFFER_OFFLOAD_F_TCP_CKSUM | VNET_BUFFER_OFFLOAD_F_UDP_CKSUM) &
+      oflags)
+    ASSERT (b->flags & VNET_BUFFER_F_L4_HDR_OFFSET_VALID);
+
+  if (VNET_BUFFER_OFFLOAD_F_OUTER_UDP_CKSUM & oflags)
+    ASSERT (VNET_BUFFER_OFFLOAD_F_TNL_VXLAN & oflags);
+  if (VNET_BUFFER_OFFLOAD_F_OUTER_IP_CKSUM & oflags)
+    ASSERT ((VNET_BUFFER_OFFLOAD_F_TNL_IPIP & oflags) ||
+           (VNET_BUFFER_OFFLOAD_F_TNL_VXLAN & oflags));
+#endif
 }
 
 static_always_inline void
index 872577d..bccedfb 100644 (file)
@@ -447,6 +447,11 @@ mpls_label_imposition_inline (vlib_main_t * vm,
                 vnet_buffer (b2)->l3_hdr_offset = b2->current_data;
                 vnet_buffer (b3)->l3_hdr_offset = b3->current_data;
 
+                b0->flags |= VNET_BUFFER_F_L3_HDR_OFFSET_VALID;
+                b1->flags |= VNET_BUFFER_F_L3_HDR_OFFSET_VALID;
+                b2->flags |= VNET_BUFFER_F_L3_HDR_OFFSET_VALID;
+                b3->flags |= VNET_BUFFER_F_L3_HDR_OFFSET_VALID;
+
                 if (DPO_PROTO_IP4 == dproto)
                 {
                     ip4_header_t * ip0 = vlib_buffer_get_current(b0);
@@ -792,6 +797,7 @@ mpls_label_imposition_inline (vlib_main_t * vm,
             if (DPO_PROTO_MPLS != dproto)
             {
                 vnet_buffer (b0)->l3_hdr_offset = b0->current_data;
+                b0->flags |= VNET_BUFFER_F_L3_HDR_OFFSET_VALID;
 
                 if (DPO_PROTO_IP4 == dproto)
                 {
index 2d7f091..aaf06a9 100644 (file)
@@ -610,6 +610,7 @@ eth_input_tag_lookup (vlib_main_t * vm, vnet_main_t * vnm,
   vlib_buffer_advance (b, l->adv);
   vnet_buffer (b)->l2.l2_len = l->len;
   vnet_buffer (b)->l3_hdr_offset = vnet_buffer (b)->l2_hdr_offset + l->len;
+  b->flags |= VNET_BUFFER_F_L3_HDR_OFFSET_VALID;
 
   if (l->err == ETHERNET_ERROR_NONE)
     {
index e2e4e93..ebda0f7 100644 (file)
@@ -394,7 +394,10 @@ gro_fixup_header (vlib_main_t *vm, vlib_buffer_t *b0, u32 ack_number, u8 is_l2)
        clib_host_to_net_u16 (vlib_buffer_length_in_chain (vm, b0) -
                              gho0.l3_hdr_offset);
       vnet_buffer (b0)->l3_hdr_offset = (u8 *) ip4 - b0->data;
-      b0->flags |= (VNET_BUFFER_F_GSO | VNET_BUFFER_F_IS_IP4);
+      b0->flags |= (VNET_BUFFER_F_GSO | VNET_BUFFER_F_IS_IP4 |
+                   VNET_BUFFER_F_L2_HDR_OFFSET_VALID |
+                   VNET_BUFFER_F_L3_HDR_OFFSET_VALID |
+                   VNET_BUFFER_F_L4_HDR_OFFSET_VALID);
       vnet_buffer_offload_flags_set (b0, (VNET_BUFFER_OFFLOAD_F_TCP_CKSUM |
                                          VNET_BUFFER_OFFLOAD_F_IP_CKSUM));
     }
@@ -406,7 +409,10 @@ gro_fixup_header (vlib_main_t *vm, vlib_buffer_t *b0, u32 ack_number, u8 is_l2)
        clib_host_to_net_u16 (vlib_buffer_length_in_chain (vm, b0) -
                              gho0.l4_hdr_offset);
       vnet_buffer (b0)->l3_hdr_offset = (u8 *) ip6 - b0->data;
-      b0->flags |= (VNET_BUFFER_F_GSO | VNET_BUFFER_F_IS_IP6);
+      b0->flags |= (VNET_BUFFER_F_GSO | VNET_BUFFER_F_IS_IP6 |
+                   VNET_BUFFER_F_L2_HDR_OFFSET_VALID |
+                   VNET_BUFFER_F_L3_HDR_OFFSET_VALID |
+                   VNET_BUFFER_F_L4_HDR_OFFSET_VALID);
       vnet_buffer_offload_flags_set (b0, VNET_BUFFER_OFFLOAD_F_TCP_CKSUM);
     }
 
index cabefd8..4760e29 100644 (file)
@@ -1786,6 +1786,8 @@ ip4_local_inline (vlib_main_t *vm, vlib_node_runtime_t *node,
 
       vnet_buffer (b[0])->l3_hdr_offset = b[0]->current_data;
       vnet_buffer (b[1])->l3_hdr_offset = b[1]->current_data;
+      b[0]->flags |= VNET_BUFFER_F_IS_IP4 | VNET_BUFFER_F_L3_HDR_OFFSET_VALID;
+      b[1]->flags |= VNET_BUFFER_F_IS_IP4 | VNET_BUFFER_F_L3_HDR_OFFSET_VALID;
 
       pt[0] = ip4_local_classify (b[0], ip[0], &next[0]);
       pt[1] = ip4_local_classify (b[1], ip[1], &next[1]);
@@ -1834,6 +1836,7 @@ ip4_local_inline (vlib_main_t *vm, vlib_node_runtime_t *node,
 
       ip[0] = vlib_buffer_get_current (b[0]);
       vnet_buffer (b[0])->l3_hdr_offset = b[0]->current_data;
+      b[0]->flags |= VNET_BUFFER_F_IS_IP4 | VNET_BUFFER_F_L3_HDR_OFFSET_VALID;
       pt[0] = ip4_local_classify (b[0], ip[0], &next[0]);
 
       if (head_of_feature_arc == 0 || pt[0])
index 3c1f40b..803396f 100644 (file)
@@ -1311,6 +1311,10 @@ ip6_local_inline (vlib_main_t *vm, vlib_node_runtime_t *node,
        {
          vnet_buffer (b[0])->l3_hdr_offset = b[0]->current_data;
          vnet_buffer (b[1])->l3_hdr_offset = b[1]->current_data;
+         b[0]->flags |=
+           VNET_BUFFER_F_IS_IP6 | VNET_BUFFER_F_L3_HDR_OFFSET_VALID;
+         b[1]->flags |=
+           VNET_BUFFER_F_IS_IP6 | VNET_BUFFER_F_L3_HDR_OFFSET_VALID;
 
          u8 type[2];
          type[0] = lm->builtin_protocol_by_ip_protocol[ip[0]->protocol];
@@ -1524,6 +1528,9 @@ ip6_local_inline (vlib_main_t *vm, vlib_node_runtime_t *node,
       if (head_of_feature_arc)
        {
          vnet_buffer (b[0])->l3_hdr_offset = b[0]->current_data;
+         b[0]->flags |=
+           VNET_BUFFER_F_IS_IP6 | VNET_BUFFER_F_L3_HDR_OFFSET_VALID;
+
          u8 type = lm->builtin_protocol_by_ip_protocol[ip->protocol];
 
          u32 flags = b[0]->flags;