From f405891b688d76be1cdca48a4fcf528ef9ff07e0 Mon Sep 17 00:00:00 2001 From: Johann Fischer Date: Wed, 23 Dec 2015 15:32:02 +0100 Subject: [PATCH] gnrc_sixlowpan_iphc.c: handle forwarded GNRC_NETTYPE_IPV6 packet --- .../sixlowpan/iphc/gnrc_sixlowpan_iphc.c | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/sys/net/gnrc/network_layer/sixlowpan/iphc/gnrc_sixlowpan_iphc.c b/sys/net/gnrc/network_layer/sixlowpan/iphc/gnrc_sixlowpan_iphc.c index 1c8d53ca2c..3874828214 100644 --- a/sys/net/gnrc/network_layer/sixlowpan/iphc/gnrc_sixlowpan_iphc.c +++ b/sys/net/gnrc/network_layer/sixlowpan/iphc/gnrc_sixlowpan_iphc.c @@ -562,8 +562,21 @@ inline static size_t iphc_nhc_udp_encode(gnrc_pktsnip_t *udp, ipv6_hdr_t *ipv6_h /* Set UDP header ID (rfc6282#section-5). */ ipv6_hdr->nh |= NHC_UDP_ID; - /* shrink udp allocation to final size */ - gnrc_pktbuf_realloc_data(udp, nhc_len); + + if (udp->type == GNRC_NETTYPE_IPV6) { + /* forwarded ipv6 packet */ + size_t diff = sizeof(udp_hdr_t) - nhc_len; + for (int i = nhc_len; i < (udp->size - diff); i++) { + udp_data[i] = udp_data[i + diff]; + } + /* NOTE: gnrc_pktbuf_realloc_data overflow if (udp->size - diff) < 4 */ + gnrc_pktbuf_realloc_data(udp, (udp->size - diff)); + } + else { + /* shrink udp allocation to final size */ + gnrc_pktbuf_realloc_data(udp, nhc_len); + DEBUG("6lo iphc nhc: set udp len to %d\n", nhc_len); + } return nhc_len; }