mirror of
https://github.com/RIOT-OS/RIOT.git
synced 2025-01-18 12:52:44 +01:00
gnrc_icmpv6_error: adapt _fit() to get MTU from netif
This commit is contained in:
parent
c8c8564d51
commit
c4175a5e52
@ -26,13 +26,41 @@
|
|||||||
#define ICMPV6_ERROR_SET_VALUE(data, value) \
|
#define ICMPV6_ERROR_SET_VALUE(data, value) \
|
||||||
((icmpv6_error_pkt_too_big_t *)(data))->mtu = byteorder_htonl(value)
|
((icmpv6_error_pkt_too_big_t *)(data))->mtu = byteorder_htonl(value)
|
||||||
|
|
||||||
/* TODO: generalize and centralize (see https://github.com/RIOT-OS/RIOT/pull/3184) */
|
|
||||||
#define MIN(a, b) ((a) < (b)) ? (a) : (b)
|
#define MIN(a, b) ((a) < (b)) ? (a) : (b)
|
||||||
|
|
||||||
static inline size_t _fit(const gnrc_pktsnip_t *pkt)
|
/**
|
||||||
|
* @brief Get packet fit.
|
||||||
|
*
|
||||||
|
* Get's the minimum size for an ICMPv6 error message packet, based on the
|
||||||
|
* invoking packet's size and the interface the invoking packet came over.
|
||||||
|
*
|
||||||
|
* @param[in] orig_pkt The invoking packet
|
||||||
|
*
|
||||||
|
* @return The supposed size of the ICMPv6 error message.
|
||||||
|
*/
|
||||||
|
static size_t _fit(const gnrc_pktsnip_t *orig_pkt)
|
||||||
{
|
{
|
||||||
/* TODO: replace IPV6_MIN_MTU with known path MTU? */
|
/* discarding const qualifier is safe here */
|
||||||
return MIN((gnrc_pkt_len(pkt) + ICMPV6_ERROR_SZ), IPV6_MIN_MTU);
|
gnrc_pktsnip_t *netif_hdr = gnrc_pktsnip_search_type(
|
||||||
|
(gnrc_pktsnip_t *)orig_pkt, GNRC_NETTYPE_NETIF
|
||||||
|
);
|
||||||
|
size_t pkt_len = gnrc_pkt_len(orig_pkt) + ICMPV6_ERROR_SZ +
|
||||||
|
sizeof(ipv6_hdr_t);
|
||||||
|
|
||||||
|
if (netif_hdr) {
|
||||||
|
gnrc_netif_hdr_t *data = netif_hdr->data;
|
||||||
|
gnrc_netif_t *netif = gnrc_netif_get_by_pid(data->if_pid);
|
||||||
|
|
||||||
|
DEBUG("gnrc_icmpv6_error: fitting to MTU of iface %u (%u)\n",
|
||||||
|
netif->pid, netif->ipv6.mtu);
|
||||||
|
return MIN(pkt_len, netif->ipv6.mtu - sizeof(ipv6_hdr_t));
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
/* packet does not have a netif header (most likely because it did not
|
||||||
|
* came from remote) => just assume pkt_len as ideal */
|
||||||
|
DEBUG("gnrc_icmpv6_error: copying whole packet\n");
|
||||||
|
return pkt_len;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Build a generic error message */
|
/* Build a generic error message */
|
||||||
|
Loading…
Reference in New Issue
Block a user