Skip to content

Commit e6e10c5

Browse files
TropicaoMartin KaFai Lau
authored andcommitted
selftests/bpf: Add checks in tc_tunnel when entering net namespaces
test_tc_tunnel is missing checks on any open_netns. Add those checks anytime we try to enter a net namespace, and skip the related operations if we fail. While at it, reduce the number of open_netns/close_netns for cases involving operations in two distinct namespaces: the test currently does the following: nstoken = open_netns("foo") do_operation(); close(nstoken); nstoken = open_netns("bar") do_another_operation(); close(nstoken); As already stated in reviews for the initial test, we don't need to go back to the root net namespace to enter a second namespace, so just do: ntoken_client = open_netns("foo") do_operation(); nstoken_server = open_netns("bar") do_another_operation(); close(nstoken_server); close(nstoken_client); Signed-off-by: Alexis Lothoré (eBPF Foundation) <[email protected]> Signed-off-by: Martin KaFai Lau <[email protected]> Link: https://patch.msgid.link/[email protected]
1 parent c076fd5 commit e6e10c5

File tree

1 file changed

+88
-46
lines changed

1 file changed

+88
-46
lines changed

tools/testing/selftests/bpf/prog_tests/test_tc_tunnel.c

Lines changed: 88 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -133,8 +133,12 @@ static void set_subtest_addresses(struct subtest_cfg *cfg)
133133

134134
static int run_server(struct subtest_cfg *cfg)
135135
{
136-
struct nstoken *nstoken = open_netns(SERVER_NS);
137136
int family = cfg->ipproto == 6 ? AF_INET6 : AF_INET;
137+
struct nstoken *nstoken;
138+
139+
nstoken = open_netns(SERVER_NS);
140+
if (!ASSERT_OK_PTR(nstoken, "open server ns"))
141+
return -1;
138142

139143
cfg->server_fd = start_reuseport_server(family, SOCK_STREAM,
140144
cfg->server_addr, TEST_PORT,
@@ -319,6 +323,10 @@ static int configure_encapsulation(struct subtest_cfg *cfg)
319323
static int configure_kernel_decapsulation(struct subtest_cfg *cfg)
320324
{
321325
struct nstoken *nstoken = open_netns(SERVER_NS);
326+
int ret = -1;
327+
328+
if (!ASSERT_OK_PTR(nstoken, "open server ns"))
329+
return ret;
322330

323331
if (cfg->configure_fou_rx_port &&
324332
!ASSERT_OK(add_fou_rx_port(cfg), "configure FOU RX port"))
@@ -337,11 +345,11 @@ static int configure_kernel_decapsulation(struct subtest_cfg *cfg)
337345
SYS(fail, "sysctl -qw net.ipv4.conf.all.rp_filter=0");
338346
SYS(fail, "sysctl -qw net.ipv4.conf.testtun0.rp_filter=0");
339347
SYS(fail, "ip link set dev testtun0 up");
340-
close_netns(nstoken);
341-
return 0;
348+
349+
ret = 0;
342350
fail:
343351
close_netns(nstoken);
344-
return -1;
352+
return ret;
345353
}
346354

347355
static void remove_kernel_decapsulation(struct subtest_cfg *cfg)
@@ -356,24 +364,31 @@ static void remove_kernel_decapsulation(struct subtest_cfg *cfg)
356364
static int configure_ebpf_decapsulation(struct subtest_cfg *cfg)
357365
{
358366
struct nstoken *nstoken = open_netns(SERVER_NS);
367+
int ret = -1;
368+
369+
if (!ASSERT_OK_PTR(nstoken, "open server ns"))
370+
return ret;
359371

360372
if (!cfg->expect_kern_decap_failure)
361373
SYS(fail, "ip link del testtun0");
362374

363375
if (!ASSERT_OK(tc_prog_attach("veth2", cfg->server_ingress_prog_fd, -1),
364376
"attach_program"))
365377
goto fail;
366-
close_netns(nstoken);
367-
return 0;
378+
379+
ret = 0;
368380
fail:
369381
close_netns(nstoken);
370-
return -1;
382+
return ret;
371383
}
372384

373385
static void run_test(struct subtest_cfg *cfg)
374386
{
375387
struct nstoken *nstoken = open_netns(CLIENT_NS);
376388

389+
if (!ASSERT_OK_PTR(nstoken, "open client ns"))
390+
return;
391+
377392
if (!ASSERT_OK(run_server(cfg), "run server"))
378393
goto fail;
379394

@@ -407,7 +422,7 @@ static void run_test(struct subtest_cfg *cfg)
407422

408423
static int setup(void)
409424
{
410-
struct nstoken *nstoken = NULL;
425+
struct nstoken *nstoken_client, *nstoken_server;
411426
int fd, err;
412427

413428
fd = open("/dev/urandom", O_RDONLY);
@@ -424,52 +439,75 @@ static int setup(void)
424439
!ASSERT_OK(make_netns(SERVER_NS), "create server ns"))
425440
goto fail;
426441

427-
nstoken = open_netns(CLIENT_NS);
428-
SYS(fail, "ip link add %s type veth peer name %s",
442+
nstoken_client = open_netns(CLIENT_NS);
443+
if (!ASSERT_OK_PTR(nstoken_client, "open client ns"))
444+
goto fail_delete_ns;
445+
SYS(fail_close_ns_client, "ip link add %s type veth peer name %s",
429446
"veth1 mtu 1500 netns " CLIENT_NS " address " MAC_ADDR_VETH1,
430447
"veth2 mtu 1500 netns " SERVER_NS " address " MAC_ADDR_VETH2);
431-
SYS(fail, "ethtool -K veth1 tso off");
432-
SYS(fail, "ip link set veth1 up");
433-
close_netns(nstoken);
434-
nstoken = open_netns(SERVER_NS);
435-
SYS(fail, "ip link set veth2 up");
436-
close_netns(nstoken);
437-
448+
SYS(fail_close_ns_client, "ethtool -K veth1 tso off");
449+
SYS(fail_close_ns_client, "ip link set veth1 up");
450+
nstoken_server = open_netns(SERVER_NS);
451+
if (!ASSERT_OK_PTR(nstoken_server, "open server ns"))
452+
goto fail_close_ns_client;
453+
SYS(fail_close_ns_server, "ip link set veth2 up");
454+
455+
close_netns(nstoken_server);
456+
close_netns(nstoken_client);
438457
return 0;
458+
459+
fail_close_ns_server:
460+
close_netns(nstoken_server);
461+
fail_close_ns_client:
462+
close_netns(nstoken_client);
463+
fail_delete_ns:
464+
SYS_NOFAIL("ip netns del " CLIENT_NS);
465+
SYS_NOFAIL("ip netns del " SERVER_NS);
439466
fail:
440-
close_netns(nstoken);
441-
return 1;
467+
return -1;
442468
}
443469

444470
static int subtest_setup(struct test_tc_tunnel *skel, struct subtest_cfg *cfg)
445471
{
446-
struct nstoken *nstoken;
472+
struct nstoken *nstoken_client, *nstoken_server;
473+
int ret = -1;
447474

448475
set_subtest_addresses(cfg);
449476
if (!ASSERT_OK(set_subtest_progs(cfg, skel),
450477
"find subtest progs"))
451-
return -1;
478+
goto fail;
452479
if (cfg->extra_decap_mod_args_cb)
453480
cfg->extra_decap_mod_args_cb(cfg, cfg->extra_decap_mod_args);
454481

455-
nstoken = open_netns(CLIENT_NS);
456-
SYS(fail, "ip -4 addr add " IP4_ADDR_VETH1 "/24 dev veth1");
457-
SYS(fail, "ip -4 route flush table main");
458-
SYS(fail, "ip -4 route add " IP4_ADDR_VETH2 " mtu 1450 dev veth1");
459-
SYS(fail, "ip -6 addr add " IP6_ADDR_VETH1 "/64 dev veth1 nodad");
460-
SYS(fail, "ip -6 route flush table main");
461-
SYS(fail, "ip -6 route add " IP6_ADDR_VETH2 " mtu 1430 dev veth1");
462-
close_netns(nstoken);
463-
464-
nstoken = open_netns(SERVER_NS);
465-
SYS(fail, "ip -4 addr add " IP4_ADDR_VETH2 "/24 dev veth2");
466-
SYS(fail, "ip -6 addr add " IP6_ADDR_VETH2 "/64 dev veth2 nodad");
467-
close_netns(nstoken);
468-
469-
return 0;
482+
nstoken_client = open_netns(CLIENT_NS);
483+
if (!ASSERT_OK_PTR(nstoken_client, "open client ns"))
484+
goto fail;
485+
SYS(fail_close_client_ns,
486+
"ip -4 addr add " IP4_ADDR_VETH1 "/24 dev veth1");
487+
SYS(fail_close_client_ns, "ip -4 route flush table main");
488+
SYS(fail_close_client_ns,
489+
"ip -4 route add " IP4_ADDR_VETH2 " mtu 1450 dev veth1");
490+
SYS(fail_close_client_ns,
491+
"ip -6 addr add " IP6_ADDR_VETH1 "/64 dev veth1 nodad");
492+
SYS(fail_close_client_ns, "ip -6 route flush table main");
493+
SYS(fail_close_client_ns,
494+
"ip -6 route add " IP6_ADDR_VETH2 " mtu 1430 dev veth1");
495+
nstoken_server = open_netns(SERVER_NS);
496+
if (!ASSERT_OK_PTR(nstoken_server, "open server ns"))
497+
goto fail_close_client_ns;
498+
SYS(fail_close_server_ns,
499+
"ip -4 addr add " IP4_ADDR_VETH2 "/24 dev veth2");
500+
SYS(fail_close_server_ns,
501+
"ip -6 addr add " IP6_ADDR_VETH2 "/64 dev veth2 nodad");
502+
503+
ret = 0;
504+
505+
fail_close_server_ns:
506+
close_netns(nstoken_server);
507+
fail_close_client_ns:
508+
close_netns(nstoken_client);
470509
fail:
471-
close_netns(nstoken);
472-
return -1;
510+
return ret;
473511
}
474512

475513

@@ -478,15 +516,19 @@ static void subtest_cleanup(struct subtest_cfg *cfg)
478516
struct nstoken *nstoken;
479517

480518
nstoken = open_netns(CLIENT_NS);
481-
SYS_NOFAIL("tc qdisc delete dev veth1 parent ffff:fff1");
482-
SYS_NOFAIL("ip a flush veth1");
483-
close_netns(nstoken);
519+
if (ASSERT_OK_PTR(nstoken, "open clien ns")) {
520+
SYS_NOFAIL("tc qdisc delete dev veth1 parent ffff:fff1");
521+
SYS_NOFAIL("ip a flush veth1");
522+
close_netns(nstoken);
523+
}
484524
nstoken = open_netns(SERVER_NS);
485-
SYS_NOFAIL("tc qdisc delete dev veth2 parent ffff:fff1");
486-
SYS_NOFAIL("ip a flush veth2");
487-
if (!cfg->expect_kern_decap_failure)
488-
remove_kernel_decapsulation(cfg);
489-
close_netns(nstoken);
525+
if (ASSERT_OK_PTR(nstoken, "open clien ns")) {
526+
SYS_NOFAIL("tc qdisc delete dev veth2 parent ffff:fff1");
527+
SYS_NOFAIL("ip a flush veth2");
528+
if (!cfg->expect_kern_decap_failure)
529+
remove_kernel_decapsulation(cfg);
530+
close_netns(nstoken);
531+
}
490532
}
491533

492534
static void cleanup(void)

0 commit comments

Comments
 (0)