From: Mohsin Kazmi Date: Mon, 27 Jan 2025 18:28:53 +0000 (+0000) Subject: vnet: add assert for offload flags in debug mode X-Git-Url: https://gerrit.fd.io/r/gitweb?a=commitdiff_plain;h=7e00099480ab4d2c9353b8b5ed8d516e33abdd24;p=vpp.git vnet: add assert for offload flags in debug mode Type: improvement Signed-off-by: Mohsin Kazmi Change-Id: I7ac5ba0e2dc1fe09a00124b661d6c853a010736a --- diff --git a/src/plugins/lisp/lisp-cp/packets.c b/src/plugins/lisp/lisp-cp/packets.c index 6c36a550ab4..6aaa5167e42 100644 --- a/src/plugins/lisp/lisp-cp/packets.c +++ b/src/plugins/lisp/lisp-cp/packets.c @@ -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 diff --git a/src/vnet/buffer.h b/src/vnet/buffer.h index 276cb1115f1..5620f995c92 100644 --- a/src/vnet/buffer.h +++ b/src/vnet/buffer.h @@ -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 diff --git a/src/vnet/dpo/mpls_label_dpo.c b/src/vnet/dpo/mpls_label_dpo.c index 872577dfbe1..bccedfbfaf2 100644 --- a/src/vnet/dpo/mpls_label_dpo.c +++ b/src/vnet/dpo/mpls_label_dpo.c @@ -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) { diff --git a/src/vnet/ethernet/node.c b/src/vnet/ethernet/node.c index 2d7f0913994..aaf06a96e75 100644 --- a/src/vnet/ethernet/node.c +++ b/src/vnet/ethernet/node.c @@ -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) { diff --git a/src/vnet/gso/gro_func.h b/src/vnet/gso/gro_func.h index e2e4e93850b..ebda0f78c17 100644 --- a/src/vnet/gso/gro_func.h +++ b/src/vnet/gso/gro_func.h @@ -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); } diff --git a/src/vnet/ip/ip4_forward.c b/src/vnet/ip/ip4_forward.c index cabefd81230..4760e29a6f3 100644 --- a/src/vnet/ip/ip4_forward.c +++ b/src/vnet/ip/ip4_forward.c @@ -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]) diff --git a/src/vnet/ip/ip6_forward.c b/src/vnet/ip/ip6_forward.c index 3c1f40beff5..803396f583c 100644 --- a/src/vnet/ip/ip6_forward.c +++ b/src/vnet/ip/ip6_forward.c @@ -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;