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
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
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);
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)
{
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)
{
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));
}
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);
}
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]);
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])
{
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];
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;