diff options
Diffstat (limited to 'net/ipv6/ip6_output.c')
| -rw-r--r-- | net/ipv6/ip6_output.c | 7 | 
1 files changed, 6 insertions, 1 deletions
diff --git a/net/ipv6/ip6_output.c b/net/ipv6/ip6_output.c index c314fdde0097..95a55c6630ad 100644 --- a/net/ipv6/ip6_output.c +++ b/net/ipv6/ip6_output.c @@ -1965,8 +1965,13 @@ struct sk_buff *__ip6_make_skb(struct sock *sk,  	IP6_UPD_PO_STATS(net, rt->rt6i_idev, IPSTATS_MIB_OUT, skb->len);  	if (proto == IPPROTO_ICMPV6) {  		struct inet6_dev *idev = ip6_dst_idev(skb_dst(skb)); +		u8 icmp6_type; -		ICMP6MSGOUT_INC_STATS(net, idev, icmp6_hdr(skb)->icmp6_type); +		if (sk->sk_socket->type == SOCK_RAW && !inet_sk(sk)->hdrincl) +			icmp6_type = fl6->fl6_icmp_type; +		else +			icmp6_type = icmp6_hdr(skb)->icmp6_type; +		ICMP6MSGOUT_INC_STATS(net, idev, icmp6_type);  		ICMP6_INC_STATS(net, idev, ICMP6_MIB_OUTMSGS);  	}  |