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 081/201] net: ipv4: use kfree_skb_reason() in ip_rcv_finish_core()
    Date
    From: Menglong Dong <imagedong@tencent.com>

    [ Upstream commit c1f166d1f7eef212096a98b22f5acf92f9af353d ]

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

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

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

    --
    2.35.1


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