diff --git a/sys/include/net/gnrc/icmpv6/error.h b/sys/include/net/gnrc/icmpv6/error.h
index a6dd7ad440b71ba3de068ede892df9d4e26721ce..9d0692424a9a1969e26777e6b01231fabdeba6f8 100644
--- a/sys/include/net/gnrc/icmpv6/error.h
+++ b/sys/include/net/gnrc/icmpv6/error.h
@@ -39,7 +39,7 @@ extern "C" {
  * @param[in] code      The code for the message @see net/icmpv6.h.
  * @param[in] orig_pkt  The invoking packet.
  */
-void gnrc_icmpv6_error_dst_unr_send(uint8_t code, gnrc_pktsnip_t *orig_pkt);
+void gnrc_icmpv6_error_dst_unr_send(uint8_t code, const gnrc_pktsnip_t *orig_pkt);
 
 /**
  * @brief   Sends an ICMPv6 packet too big message for sending.
@@ -47,7 +47,8 @@ void gnrc_icmpv6_error_dst_unr_send(uint8_t code, gnrc_pktsnip_t *orig_pkt);
  * @param[in] mtu       The maximum transission unit of the next-hop link.
  * @param[in] orig_pkt  The invoking packet.
  */
-void gnrc_icmpv6_error_pkt_too_big_send(uint32_t mtu, gnrc_pktsnip_t *orig_pkt);
+void gnrc_icmpv6_error_pkt_too_big_send(uint32_t mtu,
+                                        const gnrc_pktsnip_t *orig_pkt);
 
 /**
  * @brief   Sends an ICMPv6 time exceeded message for sending.
@@ -55,7 +56,8 @@ void gnrc_icmpv6_error_pkt_too_big_send(uint32_t mtu, gnrc_pktsnip_t *orig_pkt);
  * @param[in] code      The code for the message @see net/icmpv6.h.
  * @param[in] orig_pkt  The invoking packet.
  */
-void gnrc_icmpv6_error_time_exc_send(uint8_t code, gnrc_pktsnip_t *orig_pkt);
+void gnrc_icmpv6_error_time_exc_send(uint8_t code,
+                                     const gnrc_pktsnip_t *orig_pkt);
 
 /**
  * @brief   Sends an ICMPv6 parameter problem message for sending.
@@ -65,7 +67,7 @@ void gnrc_icmpv6_error_time_exc_send(uint8_t code, gnrc_pktsnip_t *orig_pkt);
  * @param[in] orig_pkt  The invoking packet.
  */
 void gnrc_icmpv6_error_param_prob_send(uint8_t code, void *ptr,
-                                       gnrc_pktsnip_t *orig_pkt);
+                                       const gnrc_pktsnip_t *orig_pkt);
 
 #ifdef __cplusplus
 }
diff --git a/sys/net/gnrc/network_layer/icmpv6/error/gnrc_icmpv6_error.c b/sys/net/gnrc/network_layer/icmpv6/error/gnrc_icmpv6_error.c
index 0cbf6ddfd2dc41bd27fa4ef749fd4a4f091790e8..eb584225186d62bfa31138eba45db5643dd78694 100644
--- a/sys/net/gnrc/network_layer/icmpv6/error/gnrc_icmpv6_error.c
+++ b/sys/net/gnrc/network_layer/icmpv6/error/gnrc_icmpv6_error.c
@@ -26,7 +26,7 @@
 /* TODO: generalize and centralize (see https://github.com/RIOT-OS/RIOT/pull/3184) */
 #define MIN(a, b)   ((a) < (b)) ? (a) : (b)
 
-static inline size_t _fit(gnrc_pktsnip_t *pkt)
+static inline size_t _fit(const gnrc_pktsnip_t *pkt)
 {
     /* TODO: replace IPV6_MIN_MTU with known path MTU? */
     return MIN((gnrc_pkt_len(pkt) + ICMPV6_ERROR_SZ), IPV6_MIN_MTU);
@@ -34,7 +34,8 @@ static inline size_t _fit(gnrc_pktsnip_t *pkt)
 
 /* Build a generic error message */
 static gnrc_pktsnip_t *_icmpv6_error_build(uint8_t type, uint8_t code,
-                                           gnrc_pktsnip_t *orig_pkt, uint32_t value)
+                                           const gnrc_pktsnip_t *orig_pkt,
+                                           uint32_t value)
 {
     gnrc_pktsnip_t *pkt = gnrc_icmpv6_build(NULL, type, code, _fit(orig_pkt));
 
@@ -55,19 +56,19 @@ static gnrc_pktsnip_t *_icmpv6_error_build(uint8_t type, uint8_t code,
 }
 
 static inline gnrc_pktsnip_t *_dst_unr_build(uint8_t code,
-                                             gnrc_pktsnip_t *orig_pkt)
+                                             const gnrc_pktsnip_t *orig_pkt)
 {
     return _icmpv6_error_build(ICMPV6_DST_UNR, code, orig_pkt, 0);
 }
 
 static inline gnrc_pktsnip_t *_pkt_too_big_build(uint32_t mtu,
-                                                 gnrc_pktsnip_t *orig_pkt)
+                                                 const gnrc_pktsnip_t *orig_pkt)
 {
     return _icmpv6_error_build(ICMPV6_PKT_TOO_BIG, 0, orig_pkt, mtu);
 }
 
 static inline gnrc_pktsnip_t *_time_exc_build(uint8_t code,
-                                              gnrc_pktsnip_t *orig_pkt)
+                                              const gnrc_pktsnip_t *orig_pkt)
 {
     return _icmpv6_error_build(ICMPV6_TIME_EXC, code, orig_pkt, 0);
 }
@@ -78,7 +79,7 @@ static inline bool _in_range(uint8_t *ptr, uint8_t *start, size_t sz)
 }
 
 static gnrc_pktsnip_t *_param_prob_build(uint8_t code, void *ptr,
-                                         gnrc_pktsnip_t *orig_pkt)
+                                         const gnrc_pktsnip_t *orig_pkt)
 {
     gnrc_pktsnip_t *pkt = gnrc_icmpv6_build(NULL, ICMPV6_PARAM_PROB, code,
                                             _fit(orig_pkt));
@@ -121,7 +122,7 @@ static gnrc_pktsnip_t *_param_prob_build(uint8_t code, void *ptr,
     return pkt;
 }
 
-void gnrc_icmpv6_error_dst_unr_send(uint8_t code, gnrc_pktsnip_t *orig_pkt)
+void gnrc_icmpv6_error_dst_unr_send(uint8_t code, const gnrc_pktsnip_t *orig_pkt)
 {
     gnrc_pktsnip_t *pkt = _dst_unr_build(code, orig_pkt);
 
@@ -130,7 +131,8 @@ void gnrc_icmpv6_error_dst_unr_send(uint8_t code, gnrc_pktsnip_t *orig_pkt)
     }
 }
 
-void gnrc_icmpv6_error_pkt_too_big_send(uint32_t mtu, gnrc_pktsnip_t *orig_pkt)
+void gnrc_icmpv6_error_pkt_too_big_send(uint32_t mtu,
+                                        const gnrc_pktsnip_t *orig_pkt)
 {
     gnrc_pktsnip_t *pkt = _pkt_too_big_build(mtu, orig_pkt);
 
@@ -139,7 +141,8 @@ void gnrc_icmpv6_error_pkt_too_big_send(uint32_t mtu, gnrc_pktsnip_t *orig_pkt)
     }
 }
 
-void gnrc_icmpv6_error_time_exc_send(uint8_t code, gnrc_pktsnip_t *orig_pkt)
+void gnrc_icmpv6_error_time_exc_send(uint8_t code,
+                                     const gnrc_pktsnip_t *orig_pkt)
 {
     gnrc_pktsnip_t *pkt = _time_exc_build(code, orig_pkt);
 
@@ -149,7 +152,7 @@ void gnrc_icmpv6_error_time_exc_send(uint8_t code, gnrc_pktsnip_t *orig_pkt)
 }
 
 void gnrc_icmpv6_error_param_prob_send(uint8_t code, void *ptr,
-                                       gnrc_pktsnip_t *orig_pkt)
+                                       const gnrc_pktsnip_t *orig_pkt)
 {
     gnrc_pktsnip_t *pkt = _param_prob_build(code, ptr, orig_pkt);