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: 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
2df3041ba3
commit
33cba42985
|
@ -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,
|
||||
};
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue