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 <[email protected]>
---
 net/ipv4/route.c | 18 ++++++++++--------
 1 file changed, 10 insertions(+), 8 deletions(-)

diff --git a/net/ipv4/route.c b/net/ipv4/route.c
index 33bf83bcccdb..8ac298d69c8c 100644
--- a/net/ipv4/route.c
+++ b/net/ipv4/route.c
@@ -2434,9 +2434,10 @@ out:     return reason;
 }
 
 /* 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
@@ -2479,23 +2480,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);
 
@@ -3308,6 +3309,7 @@ static int inet_rtm_getroute(struct sk_buff *in_skb, 
struct nlmsghdr *nlh,
                err = ip_route_input_rcu(skb, dst, src,
                                         inet_dsfield_to_dscp(rtm->rtm_tos),
                                         dev, &res);
+               err = err ? -EINVAL : 0;
 
                rt = skb_rtable(skb);
                if (err == 0 && rt->dst.error)
-- 
2.39.5


Reply via email to