Commit a897e194 authored by Aleksei Oladko's avatar Aleksei Oladko Committed by Jakub Kicinski
Browse files

selftests: net: run reuseport in an isolated netns



The reuseport_* tests (bpf, bpf_cpu, bpf_numa, dualstack) currently use
a fixed port range. This can cause intermittent test failures when the
ports are already in use by other services:

  failed to bind receive socket: Address already in use

To avoid conflicts, run these tests in separate network namespaces using
unshare. Each test now has its own isolated network stack, preventing
port collisions with the host services.

Signed-off-by: default avatarAleksei Oladko <aleksey.oladko@virtuozzo.com>
Link: https://patch.msgid.link/20260321215908.175465-2-aleksey.oladko@virtuozzo.com


Signed-off-by: default avatarJakub Kicinski <kuba@kernel.org>
parent ef94e96e
Loading
Loading
Loading
Loading
+11 −0
Original line number Diff line number Diff line
@@ -23,6 +23,7 @@
#include <sys/socket.h>
#include <sys/resource.h>
#include <unistd.h>
#include <sched.h>

#include "kselftest.h"

@@ -455,8 +456,18 @@ static __attribute__((destructor)) void main_dtor(void)
	setrlimit(RLIMIT_MEMLOCK, &rlim_old);
}

static void setup_netns(void)
{
	if (unshare(CLONE_NEWNET))
		error(1, errno, "failed to unshare netns");
	if (system("ip link set lo up"))
		error(1, 0, "failed to bring up lo interface in netns");
}

int main(void)
{
	setup_netns();

	fprintf(stderr, "---- IPv4 UDP ----\n");
	/* NOTE: UDP socket lookups traverse a different code path when there
	 * are > 10 sockets in a group.  Run the bpf test through both paths.
+10 −0
Original line number Diff line number Diff line
@@ -228,10 +228,20 @@ static void test(int *rcv_fd, int len, int family, int proto)
		close(rcv_fd[cpu]);
}

static void setup_netns(void)
{
	if (unshare(CLONE_NEWNET))
		error(1, errno, "failed to unshare netns");
	if (system("ip link set lo up"))
		error(1, 0, "failed to bring up lo interface in netns");
}

int main(void)
{
	int *rcv_fd, cpus;

	setup_netns();

	cpus = sysconf(_SC_NPROCESSORS_ONLN);
	if (cpus <= 0)
		error(1, errno, "failed counting cpus");
+10 −0
Original line number Diff line number Diff line
@@ -230,10 +230,20 @@ static void test(int *rcv_fd, int len, int family, int proto)
		close(rcv_fd[node]);
}

static void setup_netns(void)
{
	if (unshare(CLONE_NEWNET))
		error(1, errno, "failed to unshare netns");
	if (system("ip link set lo up"))
		error(1, 0, "failed to bring up lo interface in netns");
}

int main(void)
{
	int *rcv_fd, nodes;

	setup_netns();

	if (numa_available() < 0)
		ksft_exit_skip("no numa api support\n");

+11 −0
Original line number Diff line number Diff line
@@ -25,6 +25,7 @@
#include <sys/types.h>
#include <sys/socket.h>
#include <unistd.h>
#include <sched.h>

static const int PORT = 8888;

@@ -156,10 +157,20 @@ static void test(int *rcv_fds, int count, int proto)
	close(epfd);
}

static void setup_netns(void)
{
	if (unshare(CLONE_NEWNET))
		error(1, errno, "failed to unshare netns");
	if (system("ip link set lo up"))
		error(1, 0, "failed to bring up lo interface in netns");
}

int main(void)
{
	int rcv_fds[32], i;

	setup_netns();

	fprintf(stderr, "---- UDP IPv4 created before IPv6 ----\n");
	build_rcv_fd(AF_INET, SOCK_DGRAM, rcv_fds, 5);
	build_rcv_fd(AF_INET6, SOCK_DGRAM, &(rcv_fds[5]), 5);