net: ip: make ip_route_input_rcu() return drop reasons
authorMenglong Dong <menglong8.dong@gmail.com>
Thu, 7 Nov 2024 12:55:57 +0000 (20:55 +0800)
committerPaolo Abeni <pabeni@redhat.com>
Tue, 12 Nov 2024 10:24:51 +0000 (11:24 +0100)
In this commit, we make ip_route_input_rcu() return drop reasons, which
come from ip_route_input_mc() and ip_route_input_slow().

The only caller of ip_route_input_rcu() is ip_route_input_noref(). We
adjust it by making it return -EINVAL on error and ignore the reasons that
ip_route_input_rcu() returns. In the following patch, we will make
ip_route_input_noref() returns the drop reasons.

Signed-off-by: Menglong Dong <dongml2@chinatelecom.cn>
Signed-off-by: Paolo Abeni <pabeni@redhat.com>
net/ipv4/route.c

index b73f035..270bc8c 100644 (file)
@@ -2448,9 +2448,10 @@ martian_source:
 }
 
 /* called with rcu_read_lock held */
-static int ip_route_input_rcu(struct sk_buff *skb, __be32 daddr, __be32 saddr,
-                             dscp_t dscp, struct net_device *dev,
-                             struct fib_result *res)
+static enum skb_drop_reason
+ip_route_input_rcu(struct sk_buff *skb, __be32 daddr, __be32 saddr,
+                  dscp_t dscp, struct net_device *dev,
+                  struct fib_result *res)
 {
        /* Multicast recognition logic is moved from route cache to here.
         * The problem was that too many Ethernet cards have broken/missing
@@ -2493,23 +2494,23 @@ static int ip_route_input_rcu(struct sk_buff *skb, __be32 daddr, __be32 saddr,
                        reason = ip_route_input_mc(skb, daddr, saddr, dscp,
                                                   dev, our);
                }
-               return reason ? -EINVAL : 0;
+               return reason;
        }
 
-       return ip_route_input_slow(skb, daddr, saddr, dscp, dev, res) ? -EINVAL : 0;
+       return ip_route_input_slow(skb, daddr, saddr, dscp, dev, res);
 }
 
 int ip_route_input_noref(struct sk_buff *skb, __be32 daddr, __be32 saddr,
                         dscp_t dscp, struct net_device *dev)
 {
+       enum skb_drop_reason reason;
        struct fib_result res;
-       int err;
 
        rcu_read_lock();
-       err = ip_route_input_rcu(skb, daddr, saddr, dscp, dev, &res);
+       reason = ip_route_input_rcu(skb, daddr, saddr, dscp, dev, &res);
        rcu_read_unlock();
 
-       return err;
+       return reason ? -EINVAL : 0;
 }
 EXPORT_SYMBOL(ip_route_input_noref);
 
@@ -3321,7 +3322,7 @@ static int inet_rtm_getroute(struct sk_buff *in_skb, struct nlmsghdr *nlh,
                skb->mark       = mark;
                err = ip_route_input_rcu(skb, dst, src,
                                         inet_dsfield_to_dscp(rtm->rtm_tos),
-                                        dev, &res);
+                                        dev, &res) ? -EINVAL : 0;
 
                rt = skb_rtable(skb);
                if (err == 0 && rt->dst.error)