diff --git a/sys/net/network_layer/ng_ipv6/ng_ipv6.c b/sys/net/network_layer/ng_ipv6/ng_ipv6.c index 6d6b5bea0f5058d0b5dc65451f8953de0758cdf2..91a4194eec5bd8468269633d0134f5d00818b3b2 100644 --- a/sys/net/network_layer/ng_ipv6/ng_ipv6.c +++ b/sys/net/network_layer/ng_ipv6/ng_ipv6.c @@ -456,27 +456,37 @@ static void _send(ng_pktsnip_t *pkt, bool prep_hdr) ng_pktsnip_t *ipv6, *payload; ng_ipv6_addr_t *tmp; ng_ipv6_hdr_t *hdr; - /* seize payload as temporary variable */ - payload = ng_pktbuf_start_write(pkt); - - if (payload == NULL) { - DEBUG("ipv6: unable to get write access to packet, dropping packet\n"); - ng_pktbuf_release(pkt); - return; - } - - pkt = payload; /* Reset pkt from temporary variable */ - /* get IPv6 snip and (if present) generic interface header */ if (pkt->type == NG_NETTYPE_NETIF) { /* If there is already a netif header (routing protocols and * neighbor discovery might add them to preset sending interface) */ iface = ((ng_netif_hdr_t *)pkt->data)->if_pid; + /* seize payload as temporary variable */ + ipv6 = ng_pktbuf_start_write(pkt); /* write protect for later removal + * in _send_unicast() */ + if (ipv6 == NULL) { + DEBUG("ipv6: unable to get write access to netif header, dropping packet\n"); + ng_pktbuf_release(pkt); + return; + } + pkt = ipv6; /* Reset pkt from temporary variable */ + ipv6 = pkt->next; } else { ipv6 = pkt; } + /* seize payload as temporary variable */ + payload = ng_pktbuf_start_write(ipv6); + if (payload == NULL) { + DEBUG("ipv6: unable to get write access to IPv6 header, dropping packet\n"); + ng_pktbuf_release(pkt); + return; + } + if (ipv6 != pkt) { /* in case packet has netif header */ + pkt->next = payload;/* pkt is already write-protected so we can do that */ + } + ipv6 = payload; /* Reset ipv6 from temporary variable */ hdr = ipv6->data; payload = ipv6->next;