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]>
---
v4:
- collapse the 2 lines that we modify in inet_rtm_getroute()
---
 net/ipv4/route.c | 19 ++++++++++---------
 1 file changed, 10 insertions(+), 9 deletions(-)

diff --git a/net/ipv4/route.c b/net/ipv4/route.c
index 1c4727504909..1926a8a1a83a 100644
--- a/net/ipv4/route.c
+++ b/net/ipv4/route.c
@@ -2435,9 +2435,10 @@ ip_route_input_slow(struct sk_buff *skb, __be32 daddr, 
__be32 saddr,
 }
 
 /* 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
@@ -2480,23 +2481,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,7 +3309,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)
-- 
2.39.5


Reply via email to