Commit 33cba429 authored by Menglong Dong's avatar Menglong Dong Committed by David S. Miller
Browse files

net: ipv4: use kfree_skb_reason() in ip_rcv_core()



Replace kfree_skb() with kfree_skb_reason() in ip_rcv_core(). Three new
drop reasons are introduced:

SKB_DROP_REASON_OTHERHOST
SKB_DROP_REASON_IP_CSUM
SKB_DROP_REASON_IP_INHDR

Signed-off-by: default avatarMenglong Dong <imagedong@tencent.com>
Reviewed-by: default avatarDavid Ahern <dsahern@kernel.org>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 2df3041b
Loading
Loading
Loading
Loading
+9 −0
Original line number Diff line number Diff line
@@ -321,6 +321,15 @@ enum skb_drop_reason {
	SKB_DROP_REASON_SOCKET_FILTER,	/* dropped by socket filter */
	SKB_DROP_REASON_UDP_CSUM,	/* UDP checksum error */
	SKB_DROP_REASON_NETFILTER_DROP,	/* dropped by netfilter */
	SKB_DROP_REASON_OTHERHOST,	/* packet don't belong to current
					 * host (interface is in promisc
					 * mode)
					 */
	SKB_DROP_REASON_IP_CSUM,	/* IP checksum error */
	SKB_DROP_REASON_IP_INHDR,	/* there is something wrong with
					 * IP header (see
					 * IPSTATS_MIB_INHDRERRORS)
					 */
	SKB_DROP_REASON_MAX,
};

+3 −0
Original line number Diff line number Diff line
@@ -17,6 +17,9 @@
	EM(SKB_DROP_REASON_SOCKET_FILTER, SOCKET_FILTER)	\
	EM(SKB_DROP_REASON_UDP_CSUM, UDP_CSUM)			\
	EM(SKB_DROP_REASON_NETFILTER_DROP, NETFILTER_DROP)	\
	EM(SKB_DROP_REASON_OTHERHOST, OTHERHOST)		\
	EM(SKB_DROP_REASON_IP_CSUM, IP_CSUM)			\
	EM(SKB_DROP_REASON_IP_INHDR, IP_INHDR)			\
	EMe(SKB_DROP_REASON_MAX, MAX)

#undef EM
+10 −2
Original line number Diff line number Diff line
@@ -436,13 +436,16 @@ static int ip_rcv_finish(struct net *net, struct sock *sk, struct sk_buff *skb)
static struct sk_buff *ip_rcv_core(struct sk_buff *skb, struct net *net)
{
	const struct iphdr *iph;
	int drop_reason;
	u32 len;

	/* When the interface is in promisc. mode, drop all the crap
	 * that it receives, do not try to analyse it.
	 */
	if (skb->pkt_type == PACKET_OTHERHOST)
	if (skb->pkt_type == PACKET_OTHERHOST) {
		drop_reason = SKB_DROP_REASON_OTHERHOST;
		goto drop;
	}

	__IP_UPD_PO_STATS(net, IPSTATS_MIB_IN, skb->len);

@@ -452,6 +455,7 @@ static struct sk_buff *ip_rcv_core(struct sk_buff *skb, struct net *net)
		goto out;
	}

	drop_reason = SKB_DROP_REASON_NOT_SPECIFIED;
	if (!pskb_may_pull(skb, sizeof(struct iphdr)))
		goto inhdr_error;

@@ -488,6 +492,7 @@ static struct sk_buff *ip_rcv_core(struct sk_buff *skb, struct net *net)

	len = ntohs(iph->tot_len);
	if (skb->len < len) {
		drop_reason = SKB_DROP_REASON_PKT_TOO_SMALL;
		__IP_INC_STATS(net, IPSTATS_MIB_INTRUNCATEDPKTS);
		goto drop;
	} else if (len < (iph->ihl*4))
@@ -516,11 +521,14 @@ static struct sk_buff *ip_rcv_core(struct sk_buff *skb, struct net *net)
	return skb;

csum_error:
	drop_reason = SKB_DROP_REASON_IP_CSUM;
	__IP_INC_STATS(net, IPSTATS_MIB_CSUMERRORS);
inhdr_error:
	if (drop_reason == SKB_DROP_REASON_NOT_SPECIFIED)
		drop_reason = SKB_DROP_REASON_IP_INHDR;
	__IP_INC_STATS(net, IPSTATS_MIB_INHDRERRORS);
drop:
	kfree_skb(skb);
	kfree_skb_reason(skb, drop_reason);
out:
	return NULL;
}