* [PATCH net-next v2 0/2] net: ipv4: allow directed broadcast routes to use dst hint
@ 2025-08-14 14:03 Oscar Maes
2025-08-14 14:03 ` [PATCH net-next v2 1/2] " Oscar Maes
2025-08-14 14:03 ` [PATCH net-next v2 2/2] selftests: net: add test for dst hint mechanism with directed broadcast addresses Oscar Maes
0 siblings, 2 replies; 7+ messages in thread
From: Oscar Maes @ 2025-08-14 14:03 UTC (permalink / raw)
To: netdev
Cc: davem, dsahern, edumazet, kuba, pabeni, horms, shuah,
linux-kernel, Oscar Maes
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.
This series fixes this, and adds a new selftest to ensure
this does not regress.
Changes in v2:
- Removed unused variable
- Fixed formatting
- Added new selftest
Link to v1: https://lore.kernel.org/netdev/20250724124942.6895-1-oscmaes92@gmail.com/
Oscar Maes (2):
net: ipv4: allow directed broadcast routes to use dst hint
selftests: net: add test for dst hint mechanism with directed
broadcast addresses
net/ipv4/ip_input.c | 11 +++--
net/ipv4/route.c | 2 +-
tools/testing/selftests/net/route_hint.sh | 58 +++++++++++++++++++++++
3 files changed, 66 insertions(+), 5 deletions(-)
create mode 100755 tools/testing/selftests/net/route_hint.sh
--
2.39.5
^ permalink raw reply [flat|nested] 7+ messages in thread
* [PATCH net-next v2 1/2] net: ipv4: allow directed broadcast routes to use dst hint
2025-08-14 14:03 [PATCH net-next v2 0/2] net: ipv4: allow directed broadcast routes to use dst hint Oscar Maes
@ 2025-08-14 14:03 ` Oscar Maes
2025-08-19 10:46 ` Paolo Abeni
2025-08-14 14:03 ` [PATCH net-next v2 2/2] selftests: net: add test for dst hint mechanism with directed broadcast addresses Oscar Maes
1 sibling, 1 reply; 7+ messages in thread
From: Oscar Maes @ 2025-08-14 14:03 UTC (permalink / raw)
To: netdev
Cc: davem, dsahern, edumazet, kuba, pabeni, horms, shuah,
linux-kernel, Oscar Maes
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>
---
net/ipv4/ip_input.c | 11 +++++++----
net/ipv4/route.c | 2 +-
2 files changed, 8 insertions(+), 5 deletions(-)
diff --git a/net/ipv4/ip_input.c b/net/ipv4/ip_input.c
index fc323994b1fa..57bf6e23b342 100644
--- a/net/ipv4/ip_input.c
+++ b/net/ipv4/ip_input.c
@@ -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) ||
+ (iph->daddr == 0 && iph->saddr == 0) ||
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))
diff --git a/net/ipv4/route.c b/net/ipv4/route.c
index f639a2ae881a..1f212b2ce4c6 100644
--- a/net/ipv4/route.c
+++ b/net/ipv4/route.c
@@ -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,
--
2.39.5
^ permalink raw reply related [flat|nested] 7+ messages in thread
* [PATCH net-next v2 2/2] selftests: net: add test for dst hint mechanism with directed broadcast addresses
2025-08-14 14:03 [PATCH net-next v2 0/2] net: ipv4: allow directed broadcast routes to use dst hint Oscar Maes
2025-08-14 14:03 ` [PATCH net-next v2 1/2] " Oscar Maes
@ 2025-08-14 14:03 ` Oscar Maes
2025-08-19 10:56 ` Paolo Abeni
1 sibling, 1 reply; 7+ messages in thread
From: Oscar Maes @ 2025-08-14 14:03 UTC (permalink / raw)
To: netdev
Cc: davem, dsahern, edumazet, kuba, pabeni, horms, shuah,
linux-kernel, Oscar Maes
Add a test for ensuring that the dst hint mechanism is used for
directed broadcast addresses.
This test relies on mausezahn for sending directed broadcast packets.
Additionally, a high GRO flush timeout is set to ensure that packets
will be received as lists.
The test determines if the hint mechanism was used by checking
the in_brd statistic using lnstat.
Signed-off-by: Oscar Maes <oscmaes92@gmail.com>
---
tools/testing/selftests/net/route_hint.sh | 58 +++++++++++++++++++++++
1 file changed, 58 insertions(+)
create mode 100755 tools/testing/selftests/net/route_hint.sh
diff --git a/tools/testing/selftests/net/route_hint.sh b/tools/testing/selftests/net/route_hint.sh
new file mode 100755
index 000000000000..fab08d8b742d
--- /dev/null
+++ b/tools/testing/selftests/net/route_hint.sh
@@ -0,0 +1,58 @@
+#!/bin/bash
+# SPDX-License-Identifier: GPL-2.0
+
+# This test ensures directed broadcast routes use dst hint mechanism
+
+CLIENT_NS=$(mktemp -u client-XXXXXXXX)
+CLIENT_IP4="192.168.0.1"
+
+SERVER_NS=$(mktemp -u server-XXXXXXXX)
+SERVER_IP4="192.168.0.2"
+
+BROADCAST_ADDRESS="192.168.0.255"
+
+setup() {
+ ip netns add "${CLIENT_NS}"
+ ip netns add "${SERVER_NS}"
+
+ ip -net "${SERVER_NS}" link add link1 type veth peer name link0 netns "${CLIENT_NS}"
+
+ ip -net "${CLIENT_NS}" link set link0 up
+ ip -net "${CLIENT_NS}" addr add "${CLIENT_IP4}/24" dev link0
+
+ ip -net "${SERVER_NS}" link set link1 up
+ ip -net "${SERVER_NS}" addr add "${SERVER_IP4}/24" dev link1
+
+ ip netns exec "${CLIENT_NS}" ethtool -K link0 tcp-segmentation-offload off
+ ip netns exec "${SERVER_NS}" sh -c "echo 500000000 > /sys/class/net/link1/gro_flush_timeout"
+ ip netns exec "${SERVER_NS}" sh -c "echo 1 > /sys/class/net/link1/napi_defer_hard_irqs"
+ ip netns exec "${SERVER_NS}" ethtool -K link1 generic-receive-offload on
+}
+
+cleanup() {
+ ip -net "${SERVER_NS}" link del link1
+ ip netns del "${CLIENT_NS}"
+ ip netns del "${SERVER_NS}"
+}
+
+directed_bcast_hint_test()
+{
+ echo "Testing for directed broadcast route hint"
+
+ orig_in_brd=$(ip netns exec "${SERVER_NS}" lnstat -k in_brd -s0 -i1 -c1 | tr -d ' |')
+ ip netns exec "${CLIENT_NS}" mausezahn link0 -a own -b bcast -A "${CLIENT_IP4}" \
+ -B "${BROADCAST_ADDRESS}" -c1 -t tcp "sp=1-100,dp=1234,s=1,a=0" -p 5 -q
+ sleep 1
+ new_in_brd=$(ip netns exec "${SERVER_NS}" lnstat -k in_brd -s0 -i1 -c1 | tr -d ' |')
+
+ res=$(echo "${new_in_brd} - ${orig_in_brd}" | bc)
+
+ [ "${res}" -lt 100 ]
+}
+
+trap cleanup EXIT
+
+setup
+
+directed_bcast_hint_test
+exit $?
--
2.39.5
^ permalink raw reply related [flat|nested] 7+ messages in thread
* Re: [PATCH net-next v2 1/2] net: ipv4: allow directed broadcast routes to use dst hint
2025-08-19 10:46 ` Paolo Abeni
@ 2025-08-19 0:08 ` Oscar Maes
0 siblings, 0 replies; 7+ messages in thread
From: Oscar Maes @ 2025-08-19 0:08 UTC (permalink / raw)
To: Paolo Abeni
Cc: netdev, davem, dsahern, edumazet, kuba, horms, shuah,
linux-kernel
On Tue, Aug 19, 2025 at 12:46:42PM +0200, Paolo Abeni wrote:
> On 8/14/25 4:03 PM, Oscar Maes wrote:
> > diff --git a/net/ipv4/ip_input.c b/net/ipv4/ip_input.c
> > index fc323994b1fa..57bf6e23b342 100644
> > --- a/net/ipv4/ip_input.c
> > +++ b/net/ipv4/ip_input.c
> > @@ -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) ||
> > + (iph->daddr == 0 && iph->saddr == 0) ||
>
> ipv4_is_zeronet(iph->daddr) is preferred for the daddr check, and it's
> not clear why the new check for the saddr is needed here.
>
> /P
>
Will change.
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH net-next v2 2/2] selftests: net: add test for dst hint mechanism with directed broadcast addresses
2025-08-19 10:56 ` Paolo Abeni
@ 2025-08-19 0:11 ` Oscar Maes
0 siblings, 0 replies; 7+ messages in thread
From: Oscar Maes @ 2025-08-19 0:11 UTC (permalink / raw)
To: Paolo Abeni
Cc: netdev, davem, dsahern, edumazet, kuba, horms, shuah,
linux-kernel
On Tue, Aug 19, 2025 at 12:56:58PM +0200, Paolo Abeni wrote:
> On 8/14/25 4:03 PM, Oscar Maes wrote:
> > tools/testing/selftests/net/route_hint.sh | 58 +++++++++++++++++++++++
> > 1 file changed, 58 insertions(+)
> > create mode 100755 tools/testing/selftests/net/route_hint.sh
>
> You must additionally update the net selftest Makefile to include the
> new test.
>
My bad.
> >
> > diff --git a/tools/testing/selftests/net/route_hint.sh b/tools/testing/selftests/net/route_hint.sh
> > new file mode 100755
> > index 000000000000..fab08d8b742d
> > --- /dev/null
> > +++ b/tools/testing/selftests/net/route_hint.sh
> > @@ -0,0 +1,58 @@
> > +#!/bin/bash
> > +# SPDX-License-Identifier: GPL-2.0
> > +
> > +# This test ensures directed broadcast routes use dst hint mechanism
> > +
> > +CLIENT_NS=$(mktemp -u client-XXXXXXXX)
> > +CLIENT_IP4="192.168.0.1"
> > +
> > +SERVER_NS=$(mktemp -u server-XXXXXXXX)
> > +SERVER_IP4="192.168.0.2"
>
> > +
> > +BROADCAST_ADDRESS="192.168.0.255"
> > +
> > +setup() {
> > + ip netns add "${CLIENT_NS}"
> > + ip netns add "${SERVER_NS}"
>
> You can/should use setup_ns() from lib.sh to avoid some duplicate code
>
> > +
> > + ip -net "${SERVER_NS}" link add link1 type veth peer name link0 netns "${CLIENT_NS}"
> > +
> > + ip -net "${CLIENT_NS}" link set link0 up
> > + ip -net "${CLIENT_NS}" addr add "${CLIENT_IP4}/24" dev link0
> > +
> > + ip -net "${SERVER_NS}" link set link1 up
> > + ip -net "${SERVER_NS}" addr add "${SERVER_IP4}/24" dev link1
> > +
> > + ip netns exec "${CLIENT_NS}" ethtool -K link0 tcp-segmentation-offload off
> > + ip netns exec "${SERVER_NS}" sh -c "echo 500000000 > /sys/class/net/link1/gro_flush_timeout"
> > + ip netns exec "${SERVER_NS}" sh -c "echo 1 > /sys/class/net/link1/napi_defer_hard_irqs"
> > + ip netns exec "${SERVER_NS}" ethtool -K link1 generic-receive-offload on
> > +}
> > +
> > +cleanup() {
> > + ip -net "${SERVER_NS}" link del link1
> > + ip netns del "${CLIENT_NS}"
> > + ip netns del "${SERVER_NS}"
> > +}
> > +
> > +directed_bcast_hint_test()
> > +{
> > + echo "Testing for directed broadcast route hint"
> > +
> > + orig_in_brd=$(ip netns exec "${SERVER_NS}" lnstat -k in_brd -s0 -i1 -c1 | tr -d ' |')
>
> Likely using the '--json' argument and 'jq' will make the parsing more
> clear.
>
> > + ip netns exec "${CLIENT_NS}" mausezahn link0 -a own -b bcast -A "${CLIENT_IP4}" \
> > + -B "${BROADCAST_ADDRESS}" -c1 -t tcp "sp=1-100,dp=1234,s=1,a=0" -p 5 -q
>
> You should check for mausezahn presence and ev. error out with error
> code 4 (ksft_skip)
>
> > + sleep 1
> > + new_in_brd=$(ip netns exec "${SERVER_NS}" lnstat -k in_brd -s0 -i1 -c1 | tr -d ' |')
> > +
> > + res=$(echo "${new_in_brd} - ${orig_in_brd}" | bc)
> > +
> > + [ "${res}" -lt 100 ]
>
> It would be helpful additionally printing the test result: '[ ok ]' /
> '[fail] expected ... found ...'
>
> /P
>
Will fix everything in v3 and resend shortly.
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH net-next v2 1/2] net: ipv4: allow directed broadcast routes to use dst hint
2025-08-14 14:03 ` [PATCH net-next v2 1/2] " Oscar Maes
@ 2025-08-19 10:46 ` Paolo Abeni
2025-08-19 0:08 ` Oscar Maes
0 siblings, 1 reply; 7+ messages in thread
From: Paolo Abeni @ 2025-08-19 10:46 UTC (permalink / raw)
To: Oscar Maes, netdev
Cc: davem, dsahern, edumazet, kuba, horms, shuah, linux-kernel
On 8/14/25 4:03 PM, Oscar Maes wrote:
> diff --git a/net/ipv4/ip_input.c b/net/ipv4/ip_input.c
> index fc323994b1fa..57bf6e23b342 100644
> --- a/net/ipv4/ip_input.c
> +++ b/net/ipv4/ip_input.c
> @@ -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) ||
> + (iph->daddr == 0 && iph->saddr == 0) ||
ipv4_is_zeronet(iph->daddr) is preferred for the daddr check, and it's
not clear why the new check for the saddr is needed here.
/P
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH net-next v2 2/2] selftests: net: add test for dst hint mechanism with directed broadcast addresses
2025-08-14 14:03 ` [PATCH net-next v2 2/2] selftests: net: add test for dst hint mechanism with directed broadcast addresses Oscar Maes
@ 2025-08-19 10:56 ` Paolo Abeni
2025-08-19 0:11 ` Oscar Maes
0 siblings, 1 reply; 7+ messages in thread
From: Paolo Abeni @ 2025-08-19 10:56 UTC (permalink / raw)
To: Oscar Maes, netdev
Cc: davem, dsahern, edumazet, kuba, horms, shuah, linux-kernel
On 8/14/25 4:03 PM, Oscar Maes wrote:
> tools/testing/selftests/net/route_hint.sh | 58 +++++++++++++++++++++++
> 1 file changed, 58 insertions(+)
> create mode 100755 tools/testing/selftests/net/route_hint.sh
You must additionally update the net selftest Makefile to include the
new test.
>
> diff --git a/tools/testing/selftests/net/route_hint.sh b/tools/testing/selftests/net/route_hint.sh
> new file mode 100755
> index 000000000000..fab08d8b742d
> --- /dev/null
> +++ b/tools/testing/selftests/net/route_hint.sh
> @@ -0,0 +1,58 @@
> +#!/bin/bash
> +# SPDX-License-Identifier: GPL-2.0
> +
> +# This test ensures directed broadcast routes use dst hint mechanism
> +
> +CLIENT_NS=$(mktemp -u client-XXXXXXXX)
> +CLIENT_IP4="192.168.0.1"
> +
> +SERVER_NS=$(mktemp -u server-XXXXXXXX)
> +SERVER_IP4="192.168.0.2"
> +
> +BROADCAST_ADDRESS="192.168.0.255"
> +
> +setup() {
> + ip netns add "${CLIENT_NS}"
> + ip netns add "${SERVER_NS}"
You can/should use setup_ns() from lib.sh to avoid some duplicate code
> +
> + ip -net "${SERVER_NS}" link add link1 type veth peer name link0 netns "${CLIENT_NS}"
> +
> + ip -net "${CLIENT_NS}" link set link0 up
> + ip -net "${CLIENT_NS}" addr add "${CLIENT_IP4}/24" dev link0
> +
> + ip -net "${SERVER_NS}" link set link1 up
> + ip -net "${SERVER_NS}" addr add "${SERVER_IP4}/24" dev link1
> +
> + ip netns exec "${CLIENT_NS}" ethtool -K link0 tcp-segmentation-offload off
> + ip netns exec "${SERVER_NS}" sh -c "echo 500000000 > /sys/class/net/link1/gro_flush_timeout"
> + ip netns exec "${SERVER_NS}" sh -c "echo 1 > /sys/class/net/link1/napi_defer_hard_irqs"
> + ip netns exec "${SERVER_NS}" ethtool -K link1 generic-receive-offload on
> +}
> +
> +cleanup() {
> + ip -net "${SERVER_NS}" link del link1
> + ip netns del "${CLIENT_NS}"
> + ip netns del "${SERVER_NS}"
> +}
> +
> +directed_bcast_hint_test()
> +{
> + echo "Testing for directed broadcast route hint"
> +
> + orig_in_brd=$(ip netns exec "${SERVER_NS}" lnstat -k in_brd -s0 -i1 -c1 | tr -d ' |')
Likely using the '--json' argument and 'jq' will make the parsing more
clear.
> + ip netns exec "${CLIENT_NS}" mausezahn link0 -a own -b bcast -A "${CLIENT_IP4}" \
> + -B "${BROADCAST_ADDRESS}" -c1 -t tcp "sp=1-100,dp=1234,s=1,a=0" -p 5 -q
You should check for mausezahn presence and ev. error out with error
code 4 (ksft_skip)
> + sleep 1
> + new_in_brd=$(ip netns exec "${SERVER_NS}" lnstat -k in_brd -s0 -i1 -c1 | tr -d ' |')
> +
> + res=$(echo "${new_in_brd} - ${orig_in_brd}" | bc)
> +
> + [ "${res}" -lt 100 ]
It would be helpful additionally printing the test result: '[ ok ]' /
'[fail] expected ... found ...'
/P
^ permalink raw reply [flat|nested] 7+ messages in thread
end of thread, other threads:[~2025-08-19 15:09 UTC | newest]
Thread overview: 7+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-08-14 14:03 [PATCH net-next v2 0/2] net: ipv4: allow directed broadcast routes to use dst hint Oscar Maes
2025-08-14 14:03 ` [PATCH net-next v2 1/2] " Oscar Maes
2025-08-19 10:46 ` Paolo Abeni
2025-08-19 0:08 ` Oscar Maes
2025-08-14 14:03 ` [PATCH net-next v2 2/2] selftests: net: add test for dst hint mechanism with directed broadcast addresses Oscar Maes
2025-08-19 10:56 ` Paolo Abeni
2025-08-19 0:11 ` Oscar Maes
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).