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

selftests/bpf: Move open_netns() and close_netns() into network_helpers.c

These will also be used by the xdp_do_redirect test being added in the next
commit.

Signed-off-by: Toke Høiland-Jørgensen <toke@redhat.com>
Signed-off-by: Alexei Starovoitov <ast@kernel.org>
Acked-by: Martin KaFai Lau <kafai@fb.com>
Link: https://lore.kernel.org/bpf/20220309105346.100053-5-toke@redhat.com

authored by

Toke Høiland-Jørgensen and committed by
Alexei Starovoitov
a3033884 24592ad1

+95 -89
+86
tools/testing/selftests/bpf/network_helpers.c
··· 1 1 // SPDX-License-Identifier: GPL-2.0-only 2 + #define _GNU_SOURCE 3 + 2 4 #include <errno.h> 3 5 #include <stdbool.h> 4 6 #include <stdio.h> 5 7 #include <string.h> 6 8 #include <unistd.h> 9 + #include <sched.h> 7 10 8 11 #include <arpa/inet.h> 12 + #include <sys/mount.h> 13 + #include <sys/stat.h> 9 14 10 15 #include <linux/err.h> 11 16 #include <linux/in.h> 12 17 #include <linux/in6.h> 18 + #include <linux/limits.h> 13 19 14 20 #include "bpf_util.h" 15 21 #include "network_helpers.h" 22 + #include "test_progs.h" 16 23 17 24 #define clean_errno() (errno == 0 ? "None" : strerror(errno)) 18 25 #define log_err(MSG, ...) ({ \ ··· 362 355 return "ping -6"; 363 356 } 364 357 return "ping"; 358 + } 359 + 360 + struct nstoken { 361 + int orig_netns_fd; 362 + }; 363 + 364 + static int setns_by_fd(int nsfd) 365 + { 366 + int err; 367 + 368 + err = setns(nsfd, CLONE_NEWNET); 369 + close(nsfd); 370 + 371 + if (!ASSERT_OK(err, "setns")) 372 + return err; 373 + 374 + /* Switch /sys to the new namespace so that e.g. /sys/class/net 375 + * reflects the devices in the new namespace. 376 + */ 377 + err = unshare(CLONE_NEWNS); 378 + if (!ASSERT_OK(err, "unshare")) 379 + return err; 380 + 381 + /* Make our /sys mount private, so the following umount won't 382 + * trigger the global umount in case it's shared. 383 + */ 384 + err = mount("none", "/sys", NULL, MS_PRIVATE, NULL); 385 + if (!ASSERT_OK(err, "remount private /sys")) 386 + return err; 387 + 388 + err = umount2("/sys", MNT_DETACH); 389 + if (!ASSERT_OK(err, "umount2 /sys")) 390 + return err; 391 + 392 + err = mount("sysfs", "/sys", "sysfs", 0, NULL); 393 + if (!ASSERT_OK(err, "mount /sys")) 394 + return err; 395 + 396 + err = mount("bpffs", "/sys/fs/bpf", "bpf", 0, NULL); 397 + if (!ASSERT_OK(err, "mount /sys/fs/bpf")) 398 + return err; 399 + 400 + return 0; 401 + } 402 + 403 + struct nstoken *open_netns(const char *name) 404 + { 405 + int nsfd; 406 + char nspath[PATH_MAX]; 407 + int err; 408 + struct nstoken *token; 409 + 410 + token = malloc(sizeof(struct nstoken)); 411 + if (!ASSERT_OK_PTR(token, "malloc token")) 412 + return NULL; 413 + 414 + token->orig_netns_fd = open("/proc/self/ns/net", O_RDONLY); 415 + if (!ASSERT_GE(token->orig_netns_fd, 0, "open /proc/self/ns/net")) 416 + goto fail; 417 + 418 + snprintf(nspath, sizeof(nspath), "%s/%s", "/var/run/netns", name); 419 + nsfd = open(nspath, O_RDONLY | O_CLOEXEC); 420 + if (!ASSERT_GE(nsfd, 0, "open netns fd")) 421 + goto fail; 422 + 423 + err = setns_by_fd(nsfd); 424 + if (!ASSERT_OK(err, "setns_by_fd")) 425 + goto fail; 426 + 427 + return token; 428 + fail: 429 + free(token); 430 + return NULL; 431 + } 432 + 433 + void close_netns(struct nstoken *token) 434 + { 435 + ASSERT_OK(setns_by_fd(token->orig_netns_fd), "setns_by_fd"); 436 + free(token); 365 437 }
+9
tools/testing/selftests/bpf/network_helpers.h
··· 55 55 struct sockaddr_storage *addr, socklen_t *len); 56 56 char *ping_command(int family); 57 57 58 + struct nstoken; 59 + /** 60 + * open_netns() - Switch to specified network namespace by name. 61 + * 62 + * Returns token with which to restore the original namespace 63 + * using close_netns(). 64 + */ 65 + struct nstoken *open_netns(const char *name); 66 + void close_netns(struct nstoken *token); 58 67 #endif
-89
tools/testing/selftests/bpf/prog_tests/tc_redirect.c
··· 10 10 * to drop unexpected traffic. 11 11 */ 12 12 13 - #define _GNU_SOURCE 14 - 15 13 #include <arpa/inet.h> 16 14 #include <linux/if.h> 17 15 #include <linux/if_tun.h> ··· 17 19 #include <linux/sysctl.h> 18 20 #include <linux/time_types.h> 19 21 #include <linux/net_tstamp.h> 20 - #include <sched.h> 21 22 #include <stdbool.h> 22 23 #include <stdio.h> 23 - #include <sys/mount.h> 24 24 #include <sys/stat.h> 25 25 #include <unistd.h> 26 26 ··· 86 90 } 87 91 fclose(f); 88 92 return 0; 89 - } 90 - 91 - struct nstoken { 92 - int orig_netns_fd; 93 - }; 94 - 95 - static int setns_by_fd(int nsfd) 96 - { 97 - int err; 98 - 99 - err = setns(nsfd, CLONE_NEWNET); 100 - close(nsfd); 101 - 102 - if (!ASSERT_OK(err, "setns")) 103 - return err; 104 - 105 - /* Switch /sys to the new namespace so that e.g. /sys/class/net 106 - * reflects the devices in the new namespace. 107 - */ 108 - err = unshare(CLONE_NEWNS); 109 - if (!ASSERT_OK(err, "unshare")) 110 - return err; 111 - 112 - /* Make our /sys mount private, so the following umount won't 113 - * trigger the global umount in case it's shared. 114 - */ 115 - err = mount("none", "/sys", NULL, MS_PRIVATE, NULL); 116 - if (!ASSERT_OK(err, "remount private /sys")) 117 - return err; 118 - 119 - err = umount2("/sys", MNT_DETACH); 120 - if (!ASSERT_OK(err, "umount2 /sys")) 121 - return err; 122 - 123 - err = mount("sysfs", "/sys", "sysfs", 0, NULL); 124 - if (!ASSERT_OK(err, "mount /sys")) 125 - return err; 126 - 127 - err = mount("bpffs", "/sys/fs/bpf", "bpf", 0, NULL); 128 - if (!ASSERT_OK(err, "mount /sys/fs/bpf")) 129 - return err; 130 - 131 - return 0; 132 - } 133 - 134 - /** 135 - * open_netns() - Switch to specified network namespace by name. 136 - * 137 - * Returns token with which to restore the original namespace 138 - * using close_netns(). 139 - */ 140 - static struct nstoken *open_netns(const char *name) 141 - { 142 - int nsfd; 143 - char nspath[PATH_MAX]; 144 - int err; 145 - struct nstoken *token; 146 - 147 - token = calloc(1, sizeof(struct nstoken)); 148 - if (!ASSERT_OK_PTR(token, "malloc token")) 149 - return NULL; 150 - 151 - token->orig_netns_fd = open("/proc/self/ns/net", O_RDONLY); 152 - if (!ASSERT_GE(token->orig_netns_fd, 0, "open /proc/self/ns/net")) 153 - goto fail; 154 - 155 - snprintf(nspath, sizeof(nspath), "%s/%s", "/var/run/netns", name); 156 - nsfd = open(nspath, O_RDONLY | O_CLOEXEC); 157 - if (!ASSERT_GE(nsfd, 0, "open netns fd")) 158 - goto fail; 159 - 160 - err = setns_by_fd(nsfd); 161 - if (!ASSERT_OK(err, "setns_by_fd")) 162 - goto fail; 163 - 164 - return token; 165 - fail: 166 - free(token); 167 - return NULL; 168 - } 169 - 170 - static void close_netns(struct nstoken *token) 171 - { 172 - ASSERT_OK(setns_by_fd(token->orig_netns_fd), "setns_by_fd"); 173 - free(token); 174 93 } 175 94 176 95 static int netns_setup_namespaces(const char *verb)