net: icmp: add skb drop reasons to icmp protocol
authorMenglong Dong <imagedong@tencent.com>
Thu, 7 Apr 2022 06:20:52 +0000 (14:20 +0800)
committerDavid S. Miller <davem@davemloft.net>
Mon, 11 Apr 2022 09:38:37 +0000 (10:38 +0100)
commitb384c95a861eebf47e88695cf6a29f34e0b10b0f
tree1f19e6a50dca8426ad3b93cead37fdb6c3c6db17
parent41a95a00ebeffd4d735977d8c602d77fb6b3eed2
net: icmp: add skb drop reasons to icmp protocol

Replace kfree_skb() used in icmp_rcv() and icmpv6_rcv() with
kfree_skb_reason().

In order to get the reasons of the skb drops after icmp message handle,
we change the return type of 'handler()' in 'struct icmp_control' from
'bool' to 'enum skb_drop_reason'. This may change its original
intention, as 'false' means failure, but 'SKB_NOT_DROPPED_YET' means
success now. Therefore, all 'handler' and the call of them need to be
handled. Following 'handler' functions are involved:

icmp_unreach()
icmp_redirect()
icmp_echo()
icmp_timestamp()
icmp_discard()

And following new drop reasons are added:

SKB_DROP_REASON_ICMP_CSUM
SKB_DROP_REASON_INVALID_PROTO

The reason 'INVALID_PROTO' is introduced for the case that the packet
doesn't follow rfc 1122 and is dropped. This is not a common case, and
I believe we can locate the problem from the data in the packet. For now,
this 'INVALID_PROTO' is used for the icmp broadcasts with wrong types.

Maybe there should be a document file for these reasons. For example,
list all the case that causes the 'UNHANDLED_PROTO' and 'INVALID_PROTO'
drop reason. Therefore, users can locate their problems according to the
document.

Reviewed-by: Hao Peng <flyingpeng@tencent.com>
Reviewed-by: Jiang Biao <benbjiang@tencent.com>
Signed-off-by: Menglong Dong <imagedong@tencent.com>
Reviewed-by: David Ahern <dsahern@kernel.org>
Signed-off-by: David S. Miller <davem@davemloft.net>
include/linux/skbuff.h
include/net/ping.h
include/trace/events/skb.h
net/ipv4/icmp.c
net/ipv4/ping.c
net/ipv6/icmp.c