net: ipv4: fix regression in local-broadcast routes
Subsystems (6)
PATCH v3 1/2 net: ipv4: fix regression in local-broadcast routes
Commit 9e30ecf23b1b ("net: ipv4: fix incorrect MTU in broadcast routes") introduced a regression where local-broadcast packets would have their gateway set in __mkroute_output, which was caused by fi = NULL being removed.
Fix this by resetting the fib_info for local-broadcast packets. This preserves the intended changes for directed-broadcast packets.
---
Link to discussion:
https://lore.kernel.org/netdev/[email protected]/
Thanks to Brett Sheffield for finding the regression and writing the initial fix!
net/ipv4/route.c | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-)
net/ipv4/route.c +7 -3
@@ -2575,12 +2575,16 @@ static struct rtable *__mkroute_output(const struct fib_result *res, !netif_is_l3_master(dev_out))return ERR_PTR (-EINVAL ); -if (ipv4_is_lbcast (fl4->daddr)) +if (ipv4_is_lbcast (fl4->daddr)) { type =RTN_BROADCAST ; -else if (ipv4_is_multicast (fl4->daddr)) + +/* reset fi to prevent gateway resolution */ + fi =NULL ; + }else if (ipv4_is_multicast (fl4->daddr)) { type =RTN_MULTICAST ; -else if (ipv4_is_zeronet (fl4->daddr)) + }else if (ipv4_is_zeronet (fl4->daddr)) {return ERR_PTR (-EINVAL ); + }if (dev_out->flags &IFF_LOOPBACK ) flags |=RTCF_LOCAL ;
Signature · 1 line
2.39.5
PATCH v3 2/2 selftests: net: add test for destination in broadcast packets
Add test to check the broadcast ethernet destination field is set correctly.
This test sends a broadcast ping, captures it using tcpdump and ensures that all bits of the 6 octet ethernet destination address are correctly set by examining the output capture file.
---
Link to discussion:
https://lore.kernel.org/netdev/[email protected]/
Thanks to Brett Sheffield for writing the initial version of this selftest!
tools/testing/selftests/net/Makefile | 1 + .../selftests/net/broadcast_ether_dst.sh | 82 +++++++++++++++++++ 2 files changed, 83 insertions(+) create mode 100755 tools/testing/selftests/net/broadcast_ether_dst.sh
tools/testing/selftests/net/Makefile +1 -0
@@ -115,6 +115,7 @@ TEST_PROGS += skf_net_off.sh TEST_GEN_FILES += skf_net_off TEST_GEN_FILES += tfo TEST_PROGS += tfo_passive.sh +TEST_PROGS += broadcast_ether_dst.sh TEST_PROGS += broadcast_pmtu.sh TEST_PROGS += ipv6_force_forwarding.sh
tools/testing/selftests/net/broadcast_ether_dst.sh new file +82 -0
82 lines not on this page · raw message
Signature · 1 line
2.39.5
kernel test robot
build botRe: [PATCH net v3 2/2] selftests: net: add test for destination in broadcast packets
FYI: kernel test robot notices the stable kernel rule is not satisfied.
Hi,
Thanks for your patch.
FYI: kernel test robot notices the stable kernel rule is not satisfied.
The check is based on https://www.kernel.org/doc/html/latest/process/stable-kernel-rules.html#option-1
Rule: add the tag "Cc: [email protected]" in the sign-off area to have the patch automatically included in the stable tree.
Subject: [PATCH net v3 2/2] selftests: net: add test for destination in broadcast packets
Signature · 2 lines
0-DAY CI Kernel Test Service https://github.com/intel/lkp-tests/wiki
Re: [PATCH net v3 2/2] selftests: net: add test for destination in broadcast packets
In reply to Oscar MaesQuoted 7 lines · Oscar Maes
Add test to check the broadcast ethernet destination field is set correctly.
This test sends a broadcast ping, captures it using tcpdump and ensures that all bits of the 6 octet ethernet destination address are correctly set by examining the output capture file.
Quoted 7 lines
Signed-off-by Oscar Maes <[email protected]>---
Link to discussion:
https://lore.kernel.org/netdev/[email protected]/Thanks to Brett Sheffield for writing the initial version of this selftest!
Thanks for leaving my author name in the file. Perhaps you might consider adding:
to your commit message. I spend quite a bit of my Saturday bisecting and diagnosing, and writing the patch and test.
Quoted 109 lines
tools/testing/selftests/net/Makefile | 1 + .../selftests/net/broadcast_ether_dst.sh | 82 +++++++++++++++++++ 2 files changed, 83 insertions(+) create mode 100755 tools/testing/selftests/net/broadcast_ether_dst.shtools/testing/selftests/net/Makefile +1
-0@@ -115,6 +115,7 @@ TEST_PROGS += skf_net_off.sh TEST_GEN_FILES += skf_net_off TEST_GEN_FILES += tfo TEST_PROGS += tfo_passive.sh +TEST_PROGS += broadcast_ether_dst.sh TEST_PROGS += broadcast_pmtu.sh TEST_PROGS += ipv6_force_forwarding.shtools/testing/selftests/net/broadcast_ether_dst.sh new file +82
-0@@ -0,0 +1,82 @@ +#!/bin/bash +# SPDX-License-Identifier: GPL-2.0 +# +# Author: Brett A C Sheffield <[email protected]> +# Author: Oscar Maes <[email protected]> +# +# Ensure destination ethernet field is correctly set for +# broadcast packets + +source lib.sh + +CLIENT_IP4="192.168.0.1" +GW_IP4="192.168.0.2" + +setup() { + setup_ns CLIENT_NS 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 "${CLIENT_NS}" route add default via "${GW_IP4}" + ip netns exec "${CLIENT_NS}" arp -s "${GW_IP4}" 00:11:22:33:44:55 +} + +cleanup() { + rm -f "${CAPFILE}" + ip -net "${SERVER_NS}" link del link1 + cleanup_ns "${CLIENT_NS}" "${SERVER_NS}" +} + +test_broadcast_ether_dst() { + local rc=0 + CAPFILE=$(mktemp -u cap.XXXXXXXXXX) + + echo "Testing ethernet broadcast destination" + + # start tcpdump listening for icmp + # tcpdump will exit after receiving a single packet + # timeout will kill tcpdump if it is still running after 2s + timeout 2s ip netns exec "${CLIENT_NS}" \ + tcpdump -i link0 -c 1 -w "${CAPFILE}" icmp &> /dev/null & + pid=$! + sleep 0.1 # let tcpdump wake up + + # send broadcast ping + ip netns exec "${CLIENT_NS}" \ + ping -W0.01 -c1 -b 255.255.255.255 &> /dev/null + + # wait for tcpdump for exit after receiving packet + wait "${pid}" + + # compare ethernet destination field to ff:ff:ff:ff:ff:ff + ether_dst=$(tcpdump -r "${CAPFILE}" -tnne 2>/dev/null | \ + awk '{sub(/,/,"",$3); print $3}') + if [[ "${ether_dst}" == "ff:ff:ff:ff:ff:ff" ]]; then + echo "[ OK ]" + rc="${ksft_pass}" + else + echo "[FAIL] expected dst ether addr to be ff:ff:ff:ff:ff:ff," \ + "got ${ether_dst}" + rc="${ksft_fail}" + fi + + return "${rc}" +} + +if [ ! -x "$(command -v tcpdump)" ]; then + echo "SKIP: Could not run test without tcpdump tool" + exit "${ksft_skip}" +fi + +trap cleanup EXIT + +setup +test_broadcast_ether_dst + +exit $?Signature · 1 line
2.39.5
Paolo Abeni
maintainerRe: [PATCH net v3 2/2] selftests: net: add test for destination in broadcast packets
Quoted 16 lines · Brett A C Sheffield
Quoted 7 lines · Oscar Maes
Add test to check the broadcast ethernet destination field is set correctly.
This test sends a broadcast ping, captures it using tcpdump and ensures that all bits of the 6 octet ethernet destination address are correctly set by examining the output capture file.
Quoted 7 lines
Signed-off-by Oscar Maes <[email protected]>---
Link to discussion:
https://lore.kernel.org/netdev/[email protected]/Thanks to Brett Sheffield for writing the initial version of this selftest!
Quoted 7 lines
Thanks for leaving my author name in the file. Perhaps you might consider adding:
Co-Authored-By Brett A C Sheffield <[email protected]>to your commit message. I spend quite a bit of my Saturday bisecting and diagnosing, and writing the patch and test.
I don't want to delay the fix, since I received other reports for the same problem, but I think proper recognition should be agreed by all the involved parties.
I'm going to apply patch 1/2 standalone, to allow repost for this one.
Quoted 63 lines
Quoted 63 lines
tools/testing/selftests/net/Makefile | 1 + .../selftests/net/broadcast_ether_dst.sh | 82 +++++++++++++++++++ 2 files changed, 83 insertions(+) create mode 100755 tools/testing/selftests/net/broadcast_ether_dst.shtools/testing/selftests/net/Makefile +1
-0@@ -115,6 +115,7 @@ TEST_PROGS += skf_net_off.sh TEST_GEN_FILES += skf_net_off TEST_GEN_FILES += tfo TEST_PROGS += tfo_passive.sh +TEST_PROGS += broadcast_ether_dst.sh TEST_PROGS += broadcast_pmtu.sh TEST_PROGS += ipv6_force_forwarding.shtools/testing/selftests/net/broadcast_ether_dst.sh new file +40
-0@@ -0,0 +1,82 @@ +#!/bin/bash +# SPDX-License-Identifier: GPL-2.0 +# +# Author: Brett A C Sheffield <[email protected]> +# Author: Oscar Maes <[email protected]> +# +# Ensure destination ethernet field is correctly set for +# broadcast packets + +source lib.sh + +CLIENT_IP4="192.168.0.1" +GW_IP4="192.168.0.2" + +setup() { + setup_ns CLIENT_NS 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 "${CLIENT_NS}" route add default via "${GW_IP4}" + ip netns exec "${CLIENT_NS}" arp -s "${GW_IP4}" 00:11:22:33:44:55 +} + +cleanup() { + rm -f "${CAPFILE}" + ip -net "${SERVER_NS}" link del link1 + cleanup_ns "${CLIENT_NS}" "${SERVER_NS}" +} + +test_broadcast_ether_dst() { + local rc=0 + CAPFILE=$(mktemp -u cap.XXXXXXXXXX) + + echo "Testing ethernet broadcast destination"
Quoted 8 lines
tools/testing/selftests/net/broadcast_ether_dst.sh line 48
Quoted 8 lines
tools/testing/selftests/net/broadcast_ether_dst.sh new file +8
-0+ + # start tcpdump listening for icmp + # tcpdump will exit after receiving a single packet + # timeout will kill tcpdump if it is still running after 2s + timeout 2s ip netns exec "${CLIENT_NS}" \ + tcpdump -i link0 -c 1 -w "${CAPFILE}" icmp &> /dev/null & + pid=$! + sleep 0.1 # let tcpdump wake up
Here you could use slowwait checking for packet socket creation, to be more robust WRT very slow env.
/P
Quoted 17 lines · Oscar Maes
Commit
9e30ecf23b1b("net: ipv4: fix incorrect MTU in broadcast routes") introduced a regression where local-broadcast packets would have their gateway set in__mkroute_output, which was caused by fi = NULL being removed.Fix this by resetting the
fib_infofor local-broadcast packets. This preserves the intended changes for directed-broadcast packets.Fixes 9e30ecf23b1b ("net: ipv4: fix incorrect MTU in broadcast routes")Reported-by Brett A C Sheffield <[email protected]>Signed-off-by Oscar Maes <[email protected]>---
Link to discussion:
https://lore.kernel.org/netdev/[email protected]/
Quoted 6 lines
Thanks to Brett Sheffield for finding the regression and writing the initial fix!
net/ipv4/route.c | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-)
This series was applied to netdev/net.git (main) by Paolo Abeni <[email protected]>:
Hello:
This series was applied to netdev/net.git (main)
by Paolo Abeni <[email protected]>:
Quoted 9 lines · On Wed, 27 Aug 2025 08:23:21 +0200 you wrote:
Commit
9e30ecf23b1b("net: ipv4: fix incorrect MTU in broadcast routes") introduced a regression where local-broadcast packets would have their gateway set in__mkroute_output, which was caused by fi = NULL being removed.Fix this by resetting the
fib_infofor local-broadcast packets. This preserves the intended changes for directed-broadcast packets.[...]
Here is the summary with links:
- [net,v3,1/2] net: ipv4: fix regression in local-broadcast routes
https://git.kernel.org/netdev/net/c/5189446ba995
- [net,v3,2/2] selftests: net: add test for destination in broadcast packets (no matching commit)
You are awesome, thank you!
Signature · 2 lines
Deet-doot-dot, I am a bot. https://korg.docs.kernel.org/patchwork/pwbot.html