X-Git-Url: https://gerrit.fd.io/r/gitweb?a=blobdiff_plain;f=src%2Fplugins%2Fgtpu%2Fgtpu_encap.c;h=5f52d5a1543870f56afc48bea5cf1d2b60bdbab9;hb=e73b6b7bacb635814b6e47c63e49c60cc5a13bf1;hp=5c37f4db306c9ec9aa884f6da55fa4e724e2853d;hpb=96cc67dd80e7fbf56071925afff056929965af6d;p=vpp.git diff --git a/src/plugins/gtpu/gtpu_encap.c b/src/plugins/gtpu/gtpu_encap.c index 5c37f4db306..5f52d5a1543 100644 --- a/src/plugins/gtpu/gtpu_encap.c +++ b/src/plugins/gtpu/gtpu_encap.c @@ -298,19 +298,23 @@ gtpu_encap_inline (vlib_main_t * vm, /* Fix GTPU length */ gtpu0 = (gtpu_header_t *)(udp0+1); new_l0 = clib_host_to_net_u16 (vlib_buffer_length_in_chain(vm, b0) - - sizeof (*ip4_0) - sizeof(*udp0)); + - sizeof (*ip4_0) - sizeof(*udp0) + - GTPU_V1_HDR_LEN); gtpu0->length = new_l0; gtpu1 = (gtpu_header_t *)(udp1+1); new_l1 = clib_host_to_net_u16 (vlib_buffer_length_in_chain(vm, b1) - - sizeof (*ip4_1) - sizeof(*udp1)); + - sizeof (*ip4_1) - sizeof(*udp1) + - GTPU_V1_HDR_LEN); gtpu1->length = new_l1; gtpu2 = (gtpu_header_t *)(udp2+1); new_l2 = clib_host_to_net_u16 (vlib_buffer_length_in_chain(vm, b2) - - sizeof (*ip4_2) - sizeof(*udp2)); + - sizeof (*ip4_2) - sizeof(*udp2) + - GTPU_V1_HDR_LEN); gtpu2->length = new_l2; gtpu3 = (gtpu_header_t *)(udp3+1); new_l3 = clib_host_to_net_u16 (vlib_buffer_length_in_chain(vm, b3) - - sizeof (*ip4_3) - sizeof(*udp3)); + - sizeof (*ip4_3) - sizeof(*udp3) + - GTPU_V1_HDR_LEN); gtpu3->length = new_l3; } else /* ipv6 */ @@ -376,13 +380,35 @@ gtpu_encap_inline (vlib_main_t * vm, udp3->length = new_l3; udp3->src_port = flow_hash3; + /* Fix GTPU length */ + gtpu0 = (gtpu_header_t *)(udp0+1); + new_l0 = clib_host_to_net_u16 (vlib_buffer_length_in_chain(vm, b0) + - sizeof (*ip6_0) - sizeof(*udp0) + - GTPU_V1_HDR_LEN); + gtpu0->length = new_l0; + gtpu1 = (gtpu_header_t *)(udp1+1); + new_l1 = clib_host_to_net_u16 (vlib_buffer_length_in_chain(vm, b1) + - sizeof (*ip6_1) - sizeof(*udp1) + - GTPU_V1_HDR_LEN); + gtpu1->length = new_l1; + gtpu2 = (gtpu_header_t *)(udp2+1); + new_l2 = clib_host_to_net_u16 (vlib_buffer_length_in_chain(vm, b2) + - sizeof (*ip6_2) - sizeof(*udp2) + - GTPU_V1_HDR_LEN); + gtpu2->length = new_l2; + gtpu3 = (gtpu_header_t *)(udp3+1); + new_l3 = clib_host_to_net_u16 (vlib_buffer_length_in_chain(vm, b3) + - sizeof (*ip6_3) - sizeof(*udp3) + - GTPU_V1_HDR_LEN); + gtpu3->length = new_l3; + /* IPv6 UDP checksum is mandatory */ udp0->checksum = ip6_tcp_udp_icmp_compute_checksum(vm, b0, ip6_0, &bogus); if (udp0->checksum == 0) udp0->checksum = 0xffff; udp1->checksum = ip6_tcp_udp_icmp_compute_checksum(vm, b1, - ip6_1, &bogus); + ip6_1, &bogus); if (udp1->checksum == 0) udp1->checksum = 0xffff; udp2->checksum = ip6_tcp_udp_icmp_compute_checksum(vm, b2, @@ -390,27 +416,10 @@ gtpu_encap_inline (vlib_main_t * vm, if (udp2->checksum == 0) udp2->checksum = 0xffff; udp3->checksum = ip6_tcp_udp_icmp_compute_checksum(vm, b3, - ip6_3, &bogus); + ip6_3, &bogus); if (udp3->checksum == 0) udp3->checksum = 0xffff; - /* Fix GTPU length */ - gtpu0 = (gtpu_header_t *)(udp0+1); - new_l0 = clib_host_to_net_u16 (vlib_buffer_length_in_chain(vm, b0) - - sizeof (*ip4_0) - sizeof(*udp0)); - gtpu0->length = new_l0; - gtpu1 = (gtpu_header_t *)(udp1+1); - new_l1 = clib_host_to_net_u16 (vlib_buffer_length_in_chain(vm, b1) - - sizeof (*ip4_1) - sizeof(*udp1)); - gtpu1->length = new_l1; - gtpu2 = (gtpu_header_t *)(udp2+1); - new_l2 = clib_host_to_net_u16 (vlib_buffer_length_in_chain(vm, b2) - - sizeof (*ip4_2) - sizeof(*udp2)); - gtpu2->length = new_l2; - gtpu3 = (gtpu_header_t *)(udp3+1); - new_l3 = clib_host_to_net_u16 (vlib_buffer_length_in_chain(vm, b3) - - sizeof (*ip4_3) - sizeof(*udp3)); - gtpu3->length = new_l3; } pkts_encapsulated += 4; @@ -556,7 +565,8 @@ gtpu_encap_inline (vlib_main_t * vm, /* Fix GTPU length */ gtpu0 = (gtpu_header_t *)(udp0+1); new_l0 = clib_host_to_net_u16 (vlib_buffer_length_in_chain(vm, b0) - - sizeof (*ip4_0) - sizeof(*udp0)); + - sizeof (*ip4_0) - sizeof(*udp0) + - GTPU_V1_HDR_LEN); gtpu0->length = new_l0; } @@ -583,17 +593,18 @@ gtpu_encap_inline (vlib_main_t * vm, udp0->length = new_l0; udp0->src_port = flow_hash0; + /* Fix GTPU length */ + gtpu0 = (gtpu_header_t *)(udp0+1); + new_l0 = clib_host_to_net_u16 (vlib_buffer_length_in_chain(vm, b0) + - sizeof (*ip4_0) - sizeof(*udp0) + - GTPU_V1_HDR_LEN); + gtpu0->length = new_l0; + /* IPv6 UDP checksum is mandatory */ udp0->checksum = ip6_tcp_udp_icmp_compute_checksum(vm, b0, ip6_0, &bogus); if (udp0->checksum == 0) udp0->checksum = 0xffff; - - /* Fix GTPU length */ - gtpu0 = (gtpu_header_t *)(udp0+1); - new_l0 = clib_host_to_net_u16 (vlib_buffer_length_in_chain(vm, b0) - - sizeof (*ip4_0) - sizeof(*udp0)); - gtpu0->length = new_l0; } pkts_encapsulated ++;