diff --git a/sys/include/net/gnrc/pkt.h b/sys/include/net/gnrc/pkt.h index 88043f218d..7467f0bdc5 100644 --- a/sys/include/net/gnrc/pkt.h +++ b/sys/include/net/gnrc/pkt.h @@ -210,10 +210,26 @@ static inline gnrc_pktsnip_t *gnrc_pkt_prepend(gnrc_pktsnip_t *pkt, static inline gnrc_pktsnip_t *gnrc_pkt_delete(gnrc_pktsnip_t *pkt, gnrc_pktsnip_t *snip) { - list_node_t list = { (list_node_t *)pkt }; + /* Removing head is a no-op. The new head is the next in the list. */ + if (pkt == snip) { + return pkt->next; + } - list_remove(&list, (list_node_t *)snip); - return (gnrc_pktsnip_t *)list.next; + /* Removing nothing is a no-op, the new head is the old one */ + if (snip == NULL) { + return pkt; + } + + /* Iterate over the list and remove the given snip from it, if found. + * The new head is the old head. */ + for (gnrc_pktsnip_t *i = pkt; i != NULL; i = i->next) { + if (i->next == snip) { + i->next = snip->next; + return pkt; + } + } + + return pkt; } /**