diff --git a/sys/net/gnrc/network_layer/ipv6/gnrc_ipv6.c b/sys/net/gnrc/network_layer/ipv6/gnrc_ipv6.c index 0940ae555a..afd0b85d72 100644 --- a/sys/net/gnrc/network_layer/ipv6/gnrc_ipv6.c +++ b/sys/net/gnrc/network_layer/ipv6/gnrc_ipv6.c @@ -522,6 +522,9 @@ static void _send(gnrc_pktsnip_t *pkt, bool prep_hdr) if (ipv6 != pkt) { /* in case packet has netif header */ pkt->next = payload;/* pkt is already write-protected so we can do that */ } + else { + pkt = payload; /* pkt is the IPv6 header so we just write-protected it */ + } ipv6 = payload; /* Reset ipv6 from temporary variable */ hdr = ipv6->data; diff --git a/sys/net/gnrc/transport_layer/udp/gnrc_udp.c b/sys/net/gnrc/transport_layer/udp/gnrc_udp.c index e6f3c78908..e630d3d088 100644 --- a/sys/net/gnrc/transport_layer/udp/gnrc_udp.c +++ b/sys/net/gnrc/transport_layer/udp/gnrc_udp.c @@ -139,13 +139,34 @@ static void _receive(gnrc_pktsnip_t *pkt) static void _send(gnrc_pktsnip_t *pkt) { udp_hdr_t *hdr; - gnrc_pktsnip_t *udp_snip; + gnrc_pktsnip_t *udp_snip, *tmp; - /* get udp snip and hdr */ - LL_SEARCH_SCALAR(pkt, udp_snip, type, GNRC_NETTYPE_UDP); + /* write protect first header */ + tmp = gnrc_pktbuf_start_write(pkt); + if (tmp == NULL) { + DEBUG("udp: cannot send packet: unable to allocate packet\n"); + gnrc_pktbuf_release(pkt); + return; + } + pkt = tmp; + udp_snip = tmp->next; + + /* get and write protect until udp snip */ + while ((udp_snip != NULL) && (udp_snip->type != GNRC_NETTYPE_UDP)) { + udp_snip = gnrc_pktbuf_start_write(udp_snip); + if (udp_snip == NULL) { + DEBUG("udp: cannot send packet: unable to allocate packet\n"); + gnrc_pktbuf_release(pkt); + return; + } + tmp->next = udp_snip; + tmp = udp_snip; + udp_snip = udp_snip->next; + } assert(udp_snip != NULL); + /* write protect UDP snip */ udp_snip = gnrc_pktbuf_start_write(udp_snip); if (udp_snip == NULL) { DEBUG("udp: cannot send packet: unable to allocate packet\n");