Thread (16 messages) 16 messages, 2 authors, 2024-11-06

Re: [PATCH RESEND net-next v4 9/9] net: ip: make ip_route_use_hint() return drop reasons

From: Menglong Dong <hidden>
Date: 2024-11-06 11:58:11
Also in: bpf, bridge, lkml, netfilter-devel

On Tue, Nov 5, 2024 at 7:28 PM Paolo Abeni [off-list ref] wrote:
On 10/30/24 02:41, Menglong Dong wrote:
quoted
diff --git a/net/ipv4/route.c b/net/ipv4/route.c
index e248e5577d0e..7f969c865c81 100644
--- a/net/ipv4/route.c
+++ b/net/ipv4/route.c
@@ -2142,28 +2142,34 @@ ip_mkroute_input(struct sk_buff *skb, struct fib_result *res,
  * assuming daddr is valid and the destination is not a local broadcast one.
  * Uses the provided hint instead of performing a route lookup.
  */
-int ip_route_use_hint(struct sk_buff *skb, __be32 daddr, __be32 saddr,
-                   dscp_t dscp, struct net_device *dev,
-                   const struct sk_buff *hint)
+enum skb_drop_reason
+ip_route_use_hint(struct sk_buff *skb, __be32 daddr, __be32 saddr,
+               dscp_t dscp, struct net_device *dev,
+               const struct sk_buff *hint)
 {
+     enum skb_drop_reason reason = SKB_DROP_REASON_NOT_SPECIFIED;
      struct in_device *in_dev = __in_dev_get_rcu(dev);
      struct rtable *rt = skb_rtable(hint);
      struct net *net = dev_net(dev);
-     enum skb_drop_reason reason;
-     int err = -EINVAL;
      u32 tag = 0;

      if (!in_dev)
-             return -EINVAL;
+             return reason;

-     if (ipv4_is_multicast(saddr) || ipv4_is_lbcast(saddr))
+     if (ipv4_is_multicast(saddr) || ipv4_is_lbcast(saddr)) {
+             reason = SKB_DROP_REASON_IP_INVALID_SOURCE;
              goto martian_source;
+     }

-     if (ipv4_is_zeronet(saddr))
+     if (ipv4_is_zeronet(saddr)) {
+             reason = SKB_DROP_REASON_IP_INVALID_SOURCE;
              goto martian_source;
+     }

-     if (ipv4_is_loopback(saddr) && !IN_DEV_NET_ROUTE_LOCALNET(in_dev, net))
+     if (ipv4_is_loopback(saddr) && !IN_DEV_NET_ROUTE_LOCALNET(in_dev, net)) {
+             reason = IP_LOCALNET;
              goto martian_source;
+     }

      if (rt->rt_type != RTN_LOCAL)
              goto skip_validate_source;
Please explicitly replace also the

        return 0;

with

        return SKB_NOT_DROPPED_YET;

So that is clear the drop reason is always specified.
Okay!

Thanks!
Menglong Dong

Thanks,

Paolo
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help