]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
net: ipv4: allow directed broadcast routes to use dst hint
authorOscar Maes <oscmaes92@gmail.com>
Tue, 19 Aug 2025 17:46:41 +0000 (19:46 +0200)
committerJakub Kicinski <kuba@kernel.org>
Mon, 25 Aug 2025 23:07:16 +0000 (16:07 -0700)
Currently, ip_extract_route_hint uses RTN_BROADCAST to decide
whether to use the route dst hint mechanism.

This check is too strict, as it prevents directed broadcast
routes from using the hint, resulting in poor performance
during bursts of directed broadcast traffic.

Fix this in ip_extract_route_hint and modify ip_route_use_hint
to preserve the intended behaviour.

Signed-off-by: Oscar Maes <oscmaes92@gmail.com>
Reviewed-by: David Ahern <dsahern@kernel.org>
Link: https://patch.msgid.link/20250819174642.5148-2-oscmaes92@gmail.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
net/ipv4/ip_input.c
net/ipv4/route.c

index fc323994b1fa0bf22e022dd967bf7c5ad5255d95..a09aca2c8567daf8ad1c9cc9f26291e1b4c2d36f 100644 (file)
@@ -587,9 +587,13 @@ static void ip_sublist_rcv_finish(struct list_head *head)
 }
 
 static struct sk_buff *ip_extract_route_hint(const struct net *net,
-                                            struct sk_buff *skb, int rt_type)
+                                            struct sk_buff *skb)
 {
-       if (fib4_has_custom_rules(net) || rt_type == RTN_BROADCAST ||
+       const struct iphdr *iph = ip_hdr(skb);
+
+       if (fib4_has_custom_rules(net) ||
+           ipv4_is_lbcast(iph->daddr) ||
+           ipv4_is_zeronet(iph->daddr) ||
            IPCB(skb)->flags & IPSKB_MULTIPATH)
                return NULL;
 
@@ -618,8 +622,7 @@ static void ip_list_rcv_finish(struct net *net, struct list_head *head)
 
                dst = skb_dst(skb);
                if (curr_dst != dst) {
-                       hint = ip_extract_route_hint(net, skb,
-                                                    dst_rtable(dst)->rt_type);
+                       hint = ip_extract_route_hint(net, skb);
 
                        /* dispatch old sublist */
                        if (!list_empty(&sublist))
index f639a2ae881ac50584e20f067dd83a6a4b3d4989..1f212b2ce4c6ca1c579aec886de19d0abc896bc1 100644 (file)
@@ -2210,7 +2210,7 @@ ip_route_use_hint(struct sk_buff *skb, __be32 daddr, __be32 saddr,
                goto martian_source;
        }
 
-       if (rt->rt_type != RTN_LOCAL)
+       if (!(rt->rt_flags & RTCF_LOCAL))
                goto skip_validate_source;
 
        reason = fib_validate_source_reason(skb, saddr, daddr, dscp, 0, dev,