diff options
author | Ben Cartwright-Cox <ben@benjojo.co.uk> | 2015-11-14 15:13:58 +0000 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2015-11-16 15:08:48 -0500 |
commit | 027ac58e3c757277dd6cb8975d1b69c27853aa76 (patch) | |
tree | 31841f2576a30bcdaa9619d6abd5189bd6f3e412 /net | |
parent | c300366b6b978fcb84f8eeb6205e5980cc0c40c3 (diff) | |
download | lwn-027ac58e3c757277dd6cb8975d1b69c27853aa76.tar.gz lwn-027ac58e3c757277dd6cb8975d1b69c27853aa76.zip |
raw: increment correct SNMP counters for ICMP messages
Sending ICMP packets with raw sockets ends up in the SNMP counters
logging the type as the first byte of the IPv4 header rather than
the ICMP header. This is fixed by adding the IP Header Length to
the casting into a icmphdr struct.
Signed-off-by: Ben Cartwright-Cox <ben@benjojo.co.uk>
Acked-by: Eric Dumazet <eric.dumazet@gmail.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net')
-rw-r--r-- | net/ipv4/raw.c | 8 |
1 files changed, 5 insertions, 3 deletions
diff --git a/net/ipv4/raw.c b/net/ipv4/raw.c index 8c0d0bdc2a7c..63e5be0abd86 100644 --- a/net/ipv4/raw.c +++ b/net/ipv4/raw.c @@ -406,10 +406,12 @@ static int raw_send_hdrinc(struct sock *sk, struct flowi4 *fl4, ip_select_ident(net, skb, NULL); iph->check = ip_fast_csum((unsigned char *)iph, iph->ihl); + skb->transport_header += iphlen; + if (iph->protocol == IPPROTO_ICMP && + length >= iphlen + sizeof(struct icmphdr)) + icmp_out_count(net, ((struct icmphdr *) + skb_transport_header(skb))->type); } - if (iph->protocol == IPPROTO_ICMP) - icmp_out_count(net, ((struct icmphdr *) - skb_transport_header(skb))->type); err = NF_HOOK(NFPROTO_IPV4, NF_INET_LOCAL_OUT, net, sk, skb, NULL, rt->dst.dev, |