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_SOCKET_FILTER, /* dropped by socket filter */
|
||||||
SKB_DROP_REASON_UDP_CSUM, /* UDP checksum error */
|
SKB_DROP_REASON_UDP_CSUM, /* UDP checksum error */
|
||||||
SKB_DROP_REASON_NETFILTER_DROP, /* dropped by netfilter */
|
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,
|
SKB_DROP_REASON_MAX,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -17,6 +17,9 @@
|
|||||||
EM(SKB_DROP_REASON_SOCKET_FILTER, SOCKET_FILTER) \
|
EM(SKB_DROP_REASON_SOCKET_FILTER, SOCKET_FILTER) \
|
||||||
EM(SKB_DROP_REASON_UDP_CSUM, UDP_CSUM) \
|
EM(SKB_DROP_REASON_UDP_CSUM, UDP_CSUM) \
|
||||||
EM(SKB_DROP_REASON_NETFILTER_DROP, NETFILTER_DROP) \
|
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)
|
EMe(SKB_DROP_REASON_MAX, MAX)
|
||||||
|
|
||||||
#undef EM
|
#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)
|
static struct sk_buff *ip_rcv_core(struct sk_buff *skb, struct net *net)
|
||||||
{
|
{
|
||||||
const struct iphdr *iph;
|
const struct iphdr *iph;
|
||||||
|
int drop_reason;
|
||||||
u32 len;
|
u32 len;
|
||||||
|
|
||||||
/* When the interface is in promisc. mode, drop all the crap
|
/* When the interface is in promisc. mode, drop all the crap
|
||||||
* that it receives, do not try to analyse it.
|
* 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;
|
goto drop;
|
||||||
|
}
|
||||||
|
|
||||||
__IP_UPD_PO_STATS(net, IPSTATS_MIB_IN, skb->len);
|
__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;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
drop_reason = SKB_DROP_REASON_NOT_SPECIFIED;
|
||||||
if (!pskb_may_pull(skb, sizeof(struct iphdr)))
|
if (!pskb_may_pull(skb, sizeof(struct iphdr)))
|
||||||
goto inhdr_error;
|
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);
|
len = ntohs(iph->tot_len);
|
||||||
if (skb->len < len) {
|
if (skb->len < len) {
|
||||||
|
drop_reason = SKB_DROP_REASON_PKT_TOO_SMALL;
|
||||||
__IP_INC_STATS(net, IPSTATS_MIB_INTRUNCATEDPKTS);
|
__IP_INC_STATS(net, IPSTATS_MIB_INTRUNCATEDPKTS);
|
||||||
goto drop;
|
goto drop;
|
||||||
} else if (len < (iph->ihl*4))
|
} 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;
|
return skb;
|
||||||
|
|
||||||
csum_error:
|
csum_error:
|
||||||
|
drop_reason = SKB_DROP_REASON_IP_CSUM;
|
||||||
__IP_INC_STATS(net, IPSTATS_MIB_CSUMERRORS);
|
__IP_INC_STATS(net, IPSTATS_MIB_CSUMERRORS);
|
||||||
inhdr_error:
|
inhdr_error:
|
||||||
|
if (drop_reason == SKB_DROP_REASON_NOT_SPECIFIED)
|
||||||
|
drop_reason = SKB_DROP_REASON_IP_INHDR;
|
||||||
__IP_INC_STATS(net, IPSTATS_MIB_INHDRERRORS);
|
__IP_INC_STATS(net, IPSTATS_MIB_INHDRERRORS);
|
||||||
drop:
|
drop:
|
||||||
kfree_skb(skb);
|
kfree_skb_reason(skb, drop_reason);
|
||||||
out:
|
out:
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user