+#include <vnet/gso/hdr_offset_parser.h>
+
+static_always_inline void
+vnet_calc_ip4_checksums (vlib_main_t * vm, vlib_buffer_t * b,
+ ip4_header_t * ip4, tcp_header_t * th,
+ udp_header_t * uh)
+{
+ if (b->flags & VNET_BUFFER_F_OFFLOAD_IP_CKSUM)
+ ip4->checksum = ip4_header_checksum (ip4);
+ if (b->flags & VNET_BUFFER_F_OFFLOAD_TCP_CKSUM)
+ {
+ th->checksum = 0;
+ th->checksum = ip4_tcp_udp_compute_checksum (vm, b, ip4);
+ }
+ if (b->flags & VNET_BUFFER_F_OFFLOAD_UDP_CKSUM)
+ {
+ uh->checksum = 0;
+ uh->checksum = ip4_tcp_udp_compute_checksum (vm, b, ip4);
+ }
+}
+
+static_always_inline void
+vnet_calc_ip6_checksums (vlib_main_t * vm, vlib_buffer_t * b,
+ ip6_header_t * ip6, tcp_header_t * th,
+ udp_header_t * uh)
+{
+ int bogus;
+ if (b->flags & VNET_BUFFER_F_OFFLOAD_TCP_CKSUM)
+ {
+ th->checksum = 0;
+ th->checksum = ip6_tcp_udp_icmp_compute_checksum (vm, b, ip6, &bogus);
+ }
+ if (b->flags & VNET_BUFFER_F_OFFLOAD_UDP_CKSUM)
+ {
+ uh->checksum = 0;
+ uh->checksum = ip6_tcp_udp_icmp_compute_checksum (vm, b, ip6, &bogus);
+ }
+}