lkml.org 
[lkml]   [2022]   [Jul]   [27]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.15 080/201] net: ipv4: use kfree_skb_reason() in ip_rcv_core()
    Date
    From: Menglong Dong <imagedong@tencent.com>

    [ Upstream commit 33cba42985c8144eef78d618fc1e51aaa074b169 ]

    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>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    include/linux/skbuff.h | 9 +++++++++
    include/trace/events/skb.h | 3 +++
    net/ipv4/ip_input.c | 12 ++++++++++--
    3 files changed, 22 insertions(+), 2 deletions(-)

    diff --git a/include/linux/skbuff.h b/include/linux/skbuff.h
    index b63da0d1a4b2..514fb8074f78 100644
    --- a/include/linux/skbuff.h
    +++ b/include/linux/skbuff.h
    @@ -318,6 +318,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,
    };

    diff --git a/include/trace/events/skb.h b/include/trace/events/skb.h
    index 3d89f7b09a43..f2b1778485f0 100644
    --- a/include/trace/events/skb.h
    +++ b/include/trace/events/skb.h
    @@ -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
    diff --git a/net/ipv4/ip_input.c b/net/ipv4/ip_input.c
    index 3a025c011971..7be18de32e16 100644
    --- a/net/ipv4/ip_input.c
    +++ b/net/ipv4/ip_input.c
    @@ -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;
    }
    --
    2.35.1


    \
     
     \ /
      Last update: 2022-07-27 19:10    [W:4.212 / U:0.160 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site