summaryrefslogtreecommitdiff
path: root/net/ipv4/icmp.c
diff options
context:
space:
mode:
authorWillem de Bruijn <willemb@google.com>2020-07-24 16:03:09 +0300
committerDavid S. Miller <davem@davemloft.net>2020-07-25 03:12:41 +0300
commit178c49d9f9a4b5ade00c93480d714708fe971e24 (patch)
tree715bff01ce3d3520801c36e1a2daf7f3a20273d5 /net/ipv4/icmp.c
parentc4e9e09f5589f9afe6b8f8c4fb078e0559bca667 (diff)
downloadlinux-178c49d9f9a4b5ade00c93480d714708fe971e24.tar.xz
icmp: prepare rfc 4884 for ipv6
The RFC 4884 spec is largely the same between IPv4 and IPv6. Factor out the IPv4 specific parts in preparation for IPv6 support: - icmp types supported - icmp header size, and thus offset to original datagram start - datagram length field offset in icmp(6)hdr. - datagram length field word size: 4B for IPv4, 8B for IPv6. Signed-off-by: Willem de Bruijn <willemb@google.com> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/ipv4/icmp.c')
-rw-r--r--net/ipv4/icmp.c17
1 files changed, 4 insertions, 13 deletions
diff --git a/net/ipv4/icmp.c b/net/ipv4/icmp.c
index 8d2654cdbd77..7498c58460a1 100644
--- a/net/ipv4/icmp.c
+++ b/net/ipv4/icmp.c
@@ -1151,24 +1151,15 @@ static bool ip_icmp_error_rfc4884_validate(const struct sk_buff *skb, int off)
}
void ip_icmp_error_rfc4884(const struct sk_buff *skb,
- struct sock_ee_data_rfc4884 *out)
+ struct sock_ee_data_rfc4884 *out,
+ int thlen, int off)
{
- int hlen, off;
-
- switch (icmp_hdr(skb)->type) {
- case ICMP_DEST_UNREACH:
- case ICMP_TIME_EXCEEDED:
- case ICMP_PARAMETERPROB:
- break;
- default:
- return;
- }
+ int hlen;
/* original datagram headers: end of icmph to payload (skb->data) */
- hlen = -skb_transport_offset(skb) - sizeof(struct icmphdr);
+ hlen = -skb_transport_offset(skb) - thlen;
/* per rfc 4884: minimal datagram length of 128 bytes */
- off = icmp_hdr(skb)->un.reserved[1] * sizeof(u32);
if (off < 128 || off < hlen)
return;