Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

selftests/bpf: Set MACs during veth creation in tc_redirect

tc_redirect/tc_redirect_dtime fails intermittently on some systems
with:

(network_helpers.c:303: errno: Operation now in progress) Failed to connect to server

The problem is that on these systems systemd-networkd and systemd-udevd
are installed in the default configuration, which includes:

/usr/lib/systemd/network/99-default.link
/usr/lib/udev/rules.d/80-net-setup-link.rules

These configs instruct systemd to change MAC addresses of newly created
interfaces, which includes the ones created by BPF selftests. In this
particular case it causes SYN+ACK packets to be dropped, because they
get the PACKET_OTHERHOST type - the fact that this causes a connect()
on a blocking socket to return -EINPROGRESS looks like a bug, which
needs to be investigated separately.

systemd won't change the MAC address if the kernel reports that it was
already set by userspace; the NET_ADDR_SET check in
link_generate_new_hw_addr() is responsible for this.

In order to eliminate the race window between systemd and the test,
set MAC addresses during link creation. Ignore checkpatch's "quoted
string split across lines" warning, since it points to a command line,
and not a user-visible message.

Signed-off-by: Ilya Leoshkevich <iii@linux.ibm.com>
Signed-off-by: Martin KaFai Lau <martin.lau@kernel.org>
Link: https://patch.msgid.link/20250416124845.584362-1-iii@linux.ibm.com

authored by

Ilya Leoshkevich and committed by
Martin KaFai Lau
60400cd2 b9c09fb2

+6 -5
+6 -5
tools/testing/selftests/bpf/prog_tests/tc_redirect.c
··· 56 56 57 57 #define MAC_DST_FWD "00:11:22:33:44:55" 58 58 #define MAC_DST "00:22:33:44:55:66" 59 + #define MAC_SRC_FWD "00:33:44:55:66:77" 60 + #define MAC_SRC "00:44:55:66:77:88" 59 61 60 62 #define IFADDR_STR_LEN 18 61 63 #define PING_ARGS "-i 0.2 -c 3 -w 10 -q" ··· 209 207 int err; 210 208 211 209 if (result->dev_mode == MODE_VETH) { 212 - SYS(fail, "ip link add src type veth peer name src_fwd"); 213 - SYS(fail, "ip link add dst type veth peer name dst_fwd"); 214 - 215 - SYS(fail, "ip link set dst_fwd address " MAC_DST_FWD); 216 - SYS(fail, "ip link set dst address " MAC_DST); 210 + SYS(fail, "ip link add src address " MAC_SRC " type veth " 211 + "peer name src_fwd address " MAC_SRC_FWD); 212 + SYS(fail, "ip link add dst address " MAC_DST " type veth " 213 + "peer name dst_fwd address " MAC_DST_FWD); 217 214 } else if (result->dev_mode == MODE_NETKIT) { 218 215 err = create_netkit(NETKIT_L3, "src", "src_fwd"); 219 216 if (!ASSERT_OK(err, "create_ifindex_src"))