X-Git-Url: https://gerrit.fd.io/r/gitweb?a=blobdiff_plain;f=src%2Fvnet%2Flisp-cp%2Fpackets.c;h=5cb2cfa12c30623f8020b4d76d9a8f1b46dad551;hb=d6ae4bf13a7819d64d128d196d491af4700fa948;hp=f24024f150011936b7aa335484c12f29d23c7773;hpb=68b0fb0c620c7451ef1a6380c43c39de6614db51;p=vpp.git diff --git a/src/vnet/lisp-cp/packets.c b/src/vnet/lisp-cp/packets.c index f24024f1500..5cb2cfa12c3 100644 --- a/src/vnet/lisp-cp/packets.c +++ b/src/vnet/lisp-cp/packets.c @@ -85,7 +85,7 @@ udp_ip6_checksum (ip6_header_t * ip6, udp_header_t * up, u32 len) } phu; /* pseudo-header */ - memset (&phu, 0, sizeof (phu)); + clib_memset (&phu, 0, sizeof (phu)); phu.ph.ph_src = ip6->src_address; phu.ph.ph_dst = ip6->dst_address; phu.ph.ph_len = clib_host_to_net_u32 (len); @@ -143,7 +143,7 @@ pkt_push_udp (vlib_main_t * vm, vlib_buffer_t * b, u16 sp, u16 dp) void * pkt_push_ip (vlib_main_t * vm, vlib_buffer_t * b, ip_address_t * src, - ip_address_t * dst, u32 proto) + ip_address_t * dst, u32 proto, u8 csum_offload) { if (ip_addr_version (src) != ip_addr_version (dst)) { @@ -156,7 +156,7 @@ pkt_push_ip (vlib_main_t * vm, vlib_buffer_t * b, ip_address_t * src, { case IP4: return vlib_buffer_push_ip4 (vm, b, &ip_addr_v4 (src), - &ip_addr_v4 (dst), proto); + &ip_addr_v4 (dst), proto, csum_offload); break; case IP6: return vlib_buffer_push_ip6 (vm, b, &ip_addr_v6 (src), @@ -169,7 +169,7 @@ pkt_push_ip (vlib_main_t * vm, vlib_buffer_t * b, ip_address_t * src, void * pkt_push_udp_and_ip (vlib_main_t * vm, vlib_buffer_t * b, u16 sp, u16 dp, - ip_address_t * sip, ip_address_t * dip) + ip_address_t * sip, ip_address_t * dip, u8 csum_offload) { u16 udpsum; udp_header_t *uh; @@ -177,16 +177,28 @@ pkt_push_udp_and_ip (vlib_main_t * vm, vlib_buffer_t * b, u16 sp, u16 dp, uh = pkt_push_udp (vm, b, sp, dp); - ih = pkt_push_ip (vm, b, sip, dip, IP_PROTOCOL_UDP); - - udpsum = udp_checksum (uh, clib_net_to_host_u16 (uh->length), ih, - ip_addr_version (sip)); - if (udpsum == (u16) ~ 0) + if (csum_offload) { - clib_warning ("Failed UDP checksum! Discarding"); - return 0; + ih = pkt_push_ip (vm, b, sip, dip, IP_PROTOCOL_UDP, 1); + b->flags |= VNET_BUFFER_F_OFFLOAD_UDP_CKSUM; + vnet_buffer (b)->l3_hdr_offset = (u8 *) ih - b->data; + vnet_buffer (b)->l4_hdr_offset = (u8 *) uh - b->data; + uh->checksum = 0; + } + else + { + ih = pkt_push_ip (vm, b, sip, dip, IP_PROTOCOL_UDP, 0); + udpsum = udp_checksum (uh, clib_net_to_host_u16 (uh->length), ih, + ip_addr_version (sip)); + if (udpsum == (u16) ~ 0) + { + clib_warning ("Failed UDP checksum! Discarding"); + return 0; + } + /* clear flags used for csum since we're not offloading */ + b->flags &= ~(VNET_BUFFER_F_IS_IP4 | VNET_BUFFER_F_IS_IP6); + uh->checksum = udpsum; } - uh->checksum = udpsum; return ih; } @@ -196,9 +208,9 @@ pkt_push_ecm_hdr (vlib_buffer_t * b) ecm_hdr_t *h; h = vlib_buffer_push_uninit (b, sizeof (h[0])); - memset (h, 0, sizeof (h[0])); + clib_memset (h, 0, sizeof (h[0])); h->type = LISP_ENCAP_CONTROL_TYPE; - memset (h->reserved2, 0, sizeof (h->reserved2)); + clib_memset (h->reserved2, 0, sizeof (h->reserved2)); return h; }