net: ipv4: use kfree_skb_reason() in ip_rcv_finish_core()
Replace kfree_skb() with kfree_skb_reason() in ip_rcv_finish_core(), following drop reasons are introduced: SKB_DROP_REASON_IP_RPFILTER SKB_DROP_REASON_UNICAST_IN_L2_MULTICAST Signed-off-by: Menglong Dong <imagedong@tencent.com> Reviewed-by: David Ahern <dsahern@kernel.org> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
33cba42985
commit
c1f166d1f7
|
@ -330,6 +330,15 @@ enum skb_drop_reason {
|
|||
* IP header (see
|
||||
* IPSTATS_MIB_INHDRERRORS)
|
||||
*/
|
||||
SKB_DROP_REASON_IP_RPFILTER, /* IP rpfilter validate failed.
|
||||
* see the document for rp_filter
|
||||
* in ip-sysctl.rst for more
|
||||
* information
|
||||
*/
|
||||
SKB_DROP_REASON_UNICAST_IN_L2_MULTICAST, /* destination address of L2
|
||||
* is multicast, but L3 is
|
||||
* unicast.
|
||||
*/
|
||||
SKB_DROP_REASON_MAX,
|
||||
};
|
||||
|
||||
|
|
|
@ -20,6 +20,9 @@
|
|||
EM(SKB_DROP_REASON_OTHERHOST, OTHERHOST) \
|
||||
EM(SKB_DROP_REASON_IP_CSUM, IP_CSUM) \
|
||||
EM(SKB_DROP_REASON_IP_INHDR, IP_INHDR) \
|
||||
EM(SKB_DROP_REASON_IP_RPFILTER, IP_RPFILTER) \
|
||||
EM(SKB_DROP_REASON_UNICAST_IN_L2_MULTICAST, \
|
||||
UNICAST_IN_L2_MULTICAST) \
|
||||
EMe(SKB_DROP_REASON_MAX, MAX)
|
||||
|
||||
#undef EM
|
||||
|
|
|
@ -318,8 +318,10 @@ static int ip_rcv_finish_core(struct net *net, struct sock *sk,
|
|||
{
|
||||
const struct iphdr *iph = ip_hdr(skb);
|
||||
int (*edemux)(struct sk_buff *skb);
|
||||
int err, drop_reason;
|
||||
struct rtable *rt;
|
||||
int err;
|
||||
|
||||
drop_reason = SKB_DROP_REASON_NOT_SPECIFIED;
|
||||
|
||||
if (ip_can_use_hint(skb, iph, hint)) {
|
||||
err = ip_route_use_hint(skb, iph->daddr, iph->saddr, iph->tos,
|
||||
|
@ -396,19 +398,23 @@ static int ip_rcv_finish_core(struct net *net, struct sock *sk,
|
|||
* so-called "hole-196" attack) so do it for both.
|
||||
*/
|
||||
if (in_dev &&
|
||||
IN_DEV_ORCONF(in_dev, DROP_UNICAST_IN_L2_MULTICAST))
|
||||
IN_DEV_ORCONF(in_dev, DROP_UNICAST_IN_L2_MULTICAST)) {
|
||||
drop_reason = SKB_DROP_REASON_UNICAST_IN_L2_MULTICAST;
|
||||
goto drop;
|
||||
}
|
||||
}
|
||||
|
||||
return NET_RX_SUCCESS;
|
||||
|
||||
drop:
|
||||
kfree_skb(skb);
|
||||
kfree_skb_reason(skb, drop_reason);
|
||||
return NET_RX_DROP;
|
||||
|
||||
drop_error:
|
||||
if (err == -EXDEV)
|
||||
if (err == -EXDEV) {
|
||||
drop_reason = SKB_DROP_REASON_IP_RPFILTER;
|
||||
__NET_INC_STATS(net, LINUX_MIB_IPRPFILTER);
|
||||
}
|
||||
goto drop;
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue