X-Git-Url: https://gerrit.fd.io/r/gitweb?a=blobdiff_plain;f=src%2Fvnet%2Fip%2Fip4.h;h=74faa05947e9937af5c0263d427c723dcfc51064;hb=66b11318a1e5f24880e3ec77c95d70647732a4a8;hp=71640defb21af96dc6187e0ba250f793158cdcfb;hpb=a3af337e06a79f7d1dacf42a319f241c907122fc;p=vpp.git diff --git a/src/vnet/ip/ip4.h b/src/vnet/ip/ip4.h index 71640defb21..74faa05947e 100644 --- a/src/vnet/ip/ip4.h +++ b/src/vnet/ip/ip4.h @@ -42,6 +42,7 @@ #include #include +#include #include typedef struct ip4_mfib_t @@ -328,7 +329,8 @@ u32 ip4_tcp_udp_validate_checksum (vlib_main_t * vm, vlib_buffer_t * p0); */ always_inline void * vlib_buffer_push_ip4 (vlib_main_t * vm, vlib_buffer_t * b, - ip4_address_t * src, ip4_address_t * dst, int proto) + ip4_address_t * src, ip4_address_t * dst, int proto, + u8 csum_offload) { ip4_header_t *ih; @@ -346,7 +348,16 @@ vlib_buffer_push_ip4 (vlib_main_t * vm, vlib_buffer_t * b, ih->src_address.as_u32 = src->as_u32; ih->dst_address.as_u32 = dst->as_u32; - ih->checksum = ip4_header_checksum (ih); + /* Offload ip4 header checksum generation */ + if (csum_offload) + { + ih->checksum = 0; + b->flags |= VNET_BUFFER_F_OFFLOAD_IP_CKSUM | VNET_BUFFER_F_IS_IP4; + vnet_buffer (b)->l3_hdr_offset = (u8 *) ih - b->data; + } + else + ih->checksum = ip4_header_checksum (ih); + return ih; } #endif /* included_ip_ip4_h */