[CRIU] [net_ns] Problem of restoring tun in nested net namespace
Andrew Vagin
avagin at virtuozzo.com
Thu Apr 6 10:28:08 PDT 2017
On Fri, Mar 24, 2017 at 05:06:23PM +0300, Kirill Tkhai wrote:
> Hi, Andrew,
>
> there is a problem with restoring tun device in root net ns, when a child net ns exists.
> This problem is related to net_ns only, and the below patch shows how to reproduce it.
>
> 1) Fast investigation shows, that tun restored in net ns of pid=16632 on diagram (i.e., NS_CRIU):
> 16615 pts/2 S+ 0:00 | | \_ python2 ./test/zdtm.py run -t zdtm/static/tun
> 16627 pts/2 S+ 0:00 | | \_ ./zdtm_ct zdtm.py
> 16628 pts/2 S+ 0:00 | | \_ python2 zdtm.py
> 16632 pts/2 S+ 0:00 | | \_ python2 zdtm.py
> 16726 ? Ss 0:00 | | \_ ./tun --pidfile=tun.pid --outfile=tun.out
> 16749 ? Ss 0:00 | | \_ ./tun --pidfile=tun.pid --outfile=tun.out
> 16750 ? S 0:00 | | \_ ./tun --pidfile=tun.pid --outfile=tun.out
>
> 2)I added noauto to this test to prevent crappy travis reports. Please, run the test manually.
>
> 3)Test should fails like the below:
> 14:04:21.671: 5: FAIL: tun.c:267: Address mismatch on tap 4a:ffffffa9 -> ffffffa6:fffffff6 (errno = 16 (Device or resource busy))
The problem is that we need to restore tun file descriptros in proper
namespaces. Will fix. Thanks!
>
> Kirill
>
> ---
> diff --git a/test/zdtm/static/tun.c b/test/zdtm/static/tun.c
> index c53b8fa8..4543b148 100644
> --- a/test/zdtm/static/tun.c
> +++ b/test/zdtm/static/tun.c
> @@ -1,3 +1,19 @@
> +#define _GNU_SOURCE
> +#include <sched.h>
> +#include <stdbool.h>
> +#include <string.h>
> +#include <fcntl.h>
> +#include <unistd.h>
> +#include <signal.h>
> +#include <stdio.h>
> +#include <sys/mount.h>
> +#include <sys/stat.h>
> +#include <sys/mman.h>
> +#include <sys/types.h>
> +#include <sys/wait.h>
> +#include <stdlib.h>
> +#include <limits.h>
> +#include <dirent.h>
> #include <unistd.h>
> #include <string.h>
> #include <fcntl.h>
> @@ -6,6 +22,7 @@
> #include <linux/if.h>
> #include <linux/if_tun.h>
>
> +#include "lock.h"
> #include "zdtmtst.h"
>
> const char *test_doc = "Test TUN/TAP devices\n";
> @@ -112,13 +129,35 @@ static int dev_get_hwaddr(int fd, char *a)
> return 0;
> }
>
> +futex_t *futex;
> +
> +int child(void *unused)
> +{
> + futex_wait_while_lt(futex, 1);
> + return 0;
> +}
> +
> int main(int argc, char **argv)
> {
> int fds[5], ret;
> - char addr[ETH_ALEN], a2[ETH_ALEN];
> + char addr[ETH_ALEN], a2[ETH_ALEN], stack[128];
> + pid_t pid;
>
> test_init(argc, argv);
>
> + futex = mmap(NULL, sizeof(*futex), PROT_WRITE | PROT_READ, MAP_SHARED | MAP_ANONYMOUS, -1, 0);
> + if (futex == MAP_FAILED) {
> + fail("mmap futex\n");
> + return 1;
> + }
> + futex_init(futex);
> +
> + pid = clone(child, stack + 128, CLONE_NEWNET | SIGCHLD, NULL);
> + if (pid < 0) {
> + pr_perror("clone");
> + return 1;
> + }
> +
> /* fd[0] -- opened file */
> fds[0] = __open_tun();
> if (fds[0] < 0) {
> diff --git a/test/zdtm/static/tun.desc b/test/zdtm/static/tun.desc
> index 8c7cfe86..eac32c2d 100644
> --- a/test/zdtm/static/tun.desc
> +++ b/test/zdtm/static/tun.desc
> @@ -1 +1 @@
> -{'flavor': 'ns uns', 'flags': 'suid', 'feature': 'tun'}
> +{'flavor': 'ns uns', 'flags': 'suid noauto', 'feature': 'tun'}
More information about the CRIU
mailing list