diff options
author | Andreas Schultz <andreas.schultz@travelping.com> | 2018-07-17 11:34:20 +0200 |
---|---|---|
committer | Florin Coras <florin.coras@gmail.com> | 2018-07-18 04:39:56 +0000 |
commit | d6dfd002328676eddda3b90bf46af0128a119b75 (patch) | |
tree | d31469567aa4a7394df630c7490e8b83beda1e44 /src/plugins/gtpu/gtpu_encap.c | |
parent | 96cc67dd80e7fbf56071925afff056929965af6d (diff) |
Fix GTP-U length header field in encoding
The length in the GTPU header does not specify the length of the
payload. It does specify the number of bytes following the fixed
part (the first 8 bytes) of the GTPU header (see 3GPP TS 29.060,
Sect. 9.3.1).
Change-Id: I8ce73df015e1cf1f38d306666962c0058756111c
Signed-off-by: Andreas Schultz <andreas.schultz@travelping.com>
Diffstat (limited to 'src/plugins/gtpu/gtpu_encap.c')
-rw-r--r-- | src/plugins/gtpu/gtpu_encap.c | 30 |
1 files changed, 20 insertions, 10 deletions
diff --git a/src/plugins/gtpu/gtpu_encap.c b/src/plugins/gtpu/gtpu_encap.c index 5c37f4db306..4442c42ad66 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 */ @@ -397,19 +401,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 (*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 (*ip4_1) - sizeof(*udp1)); + - 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 (*ip4_2) - sizeof(*udp2)); + - 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 (*ip4_3) - sizeof(*udp3)); + - sizeof (*ip6_3) - sizeof(*udp3) + - GTPU_V1_HDR_LEN); gtpu3->length = new_l3; } @@ -556,7 +564,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; } @@ -592,7 +601,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; } |