From patchwork Fri Feb 19 14:47:03 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Petr Vorel X-Patchwork-Id: 1442262 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=lists.linux.it (client-ip=213.254.12.146; helo=picard.linux.it; envelope-from=ltp-bounces+incoming=patchwork.ozlabs.org@lists.linux.it; receiver=) Received: from picard.linux.it (picard.linux.it [213.254.12.146]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 4DhvYw4f3Rz9sVJ for ; Sat, 20 Feb 2021 01:47:32 +1100 (AEDT) Received: from picard.linux.it (localhost [IPv6:::1]) by picard.linux.it (Postfix) with ESMTP id E66EE3C65F0 for ; Fri, 19 Feb 2021 15:47:29 +0100 (CET) X-Original-To: ltp@lists.linux.it Delivered-To: ltp@picard.linux.it Received: from in-6.smtp.seeweb.it (in-6.smtp.seeweb.it [217.194.8.6]) by picard.linux.it (Postfix) with ESMTP id 6DD443C65AD for ; Fri, 19 Feb 2021 15:47:11 +0100 (CET) Received: from mx2.suse.de (mx2.suse.de [195.135.220.15]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by in-6.smtp.seeweb.it (Postfix) with ESMTPS id 7AB9E1401236 for ; Fri, 19 Feb 2021 15:47:10 +0100 (CET) Received: from relay2.suse.de (unknown [195.135.221.27]) by mx2.suse.de (Postfix) with ESMTP id C9DE6ACBF; Fri, 19 Feb 2021 14:47:09 +0000 (UTC) From: Petr Vorel To: ltp@lists.linux.it Date: Fri, 19 Feb 2021 15:47:03 +0100 Message-Id: <20210219144704.20433-2-pvorel@suse.cz> X-Mailer: git-send-email 2.30.1 In-Reply-To: <20210219144704.20433-1-pvorel@suse.cz> References: <20210219144704.20433-1-pvorel@suse.cz> MIME-Version: 1.0 X-Virus-Scanned: clamav-milter 0.102.4 at in-6.smtp.seeweb.it X-Virus-Status: Clean X-Spam-Status: No, score=0.0 required=7.0 tests=SPF_HELO_NONE,SPF_PASS autolearn=disabled version=3.4.4 X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on in-6.smtp.seeweb.it Subject: [LTP] [PATCH 1/2] libclone: Move test.h include to C file X-BeenThere: ltp@lists.linux.it X-Mailman-Version: 2.1.29 Precedence: list List-Id: Linux Test Project List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: ltp-bounces+incoming=patchwork.ozlabs.org@lists.linux.it Sender: "ltp" so that libclone.h can be used in new API tests. This requires to include test.sh earlier in mqns_helper.h. Signed-off-by: Petr Vorel Reviewed-by: Cyril Hrubis --- testcases/kernel/containers/libclone/libclone.c | 1 + testcases/kernel/containers/libclone/libclone.h | 1 - testcases/kernel/containers/mqns/mqns_helper.h | 2 +- 3 files changed, 2 insertions(+), 2 deletions(-) diff --git a/testcases/kernel/containers/libclone/libclone.c b/testcases/kernel/containers/libclone/libclone.c index 239674ff8..8ffde0ffc 100644 --- a/testcases/kernel/containers/libclone/libclone.c +++ b/testcases/kernel/containers/libclone/libclone.c @@ -15,6 +15,7 @@ * ***************************************************************************/ #include "libclone.h" +#include "test.h" int do_clone_tests(unsigned long clone_flags, int (*fn1) (void *arg), void *arg1, diff --git a/testcases/kernel/containers/libclone/libclone.h b/testcases/kernel/containers/libclone/libclone.h index b8740f1bc..354555a26 100644 --- a/testcases/kernel/containers/libclone/libclone.h +++ b/testcases/kernel/containers/libclone/libclone.h @@ -27,7 +27,6 @@ #include #include #include "lapi/syscalls.h" -#include "test.h" #include "lapi/namespaces_constants.h" #define T_UNSHARE 0 diff --git a/testcases/kernel/containers/mqns/mqns_helper.h b/testcases/kernel/containers/mqns/mqns_helper.h index 605378d48..463330ce6 100644 --- a/testcases/kernel/containers/mqns/mqns_helper.h +++ b/testcases/kernel/containers/mqns/mqns_helper.h @@ -21,9 +21,9 @@ #include #include #include "../libclone/libclone.h" +#include "test.h" #include "lapi/syscalls.h" #include "safe_macros.h" -#include "test.h" static int dummy_child(void *v) { From patchwork Fri Feb 19 14:47:04 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Petr Vorel X-Patchwork-Id: 1442261 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=lists.linux.it (client-ip=2001:1418:10:5::2; helo=picard.linux.it; envelope-from=ltp-bounces+incoming=patchwork.ozlabs.org@lists.linux.it; receiver=) Received: from picard.linux.it (picard.linux.it [IPv6:2001:1418:10:5::2]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 4DhvYm6LLYz9sVF for ; Sat, 20 Feb 2021 01:47:24 +1100 (AEDT) Received: from picard.linux.it (localhost [IPv6:::1]) by picard.linux.it (Postfix) with ESMTP id 8FAD73C65BA for ; Fri, 19 Feb 2021 15:47:21 +0100 (CET) X-Original-To: ltp@lists.linux.it Delivered-To: ltp@picard.linux.it Received: from in-6.smtp.seeweb.it (in-6.smtp.seeweb.it [217.194.8.6]) by picard.linux.it (Postfix) with ESMTP id 656093C4F14 for ; Fri, 19 Feb 2021 15:47:11 +0100 (CET) Received: from mx2.suse.de (mx2.suse.de [195.135.220.15]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by in-6.smtp.seeweb.it (Postfix) with ESMTPS id 785171401200 for ; Fri, 19 Feb 2021 15:47:10 +0100 (CET) Received: from relay2.suse.de (unknown [195.135.221.27]) by mx2.suse.de (Postfix) with ESMTP id 04B23AE05; Fri, 19 Feb 2021 14:47:10 +0000 (UTC) From: Petr Vorel To: ltp@lists.linux.it Date: Fri, 19 Feb 2021 15:47:04 +0100 Message-Id: <20210219144704.20433-3-pvorel@suse.cz> X-Mailer: git-send-email 2.30.1 In-Reply-To: <20210219144704.20433-1-pvorel@suse.cz> References: <20210219144704.20433-1-pvorel@suse.cz> MIME-Version: 1.0 X-Virus-Scanned: clamav-milter 0.102.4 at in-6.smtp.seeweb.it X-Virus-Status: Clean X-Spam-Status: No, score=0.0 required=7.0 tests=SPF_HELO_NONE,SPF_PASS autolearn=disabled version=3.4.4 X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on in-6.smtp.seeweb.it Subject: [LTP] [PATCH 2/2] netns_netlink: Rewrite into new API X-BeenThere: ltp@lists.linux.it X-Mailman-Version: 2.1.29 Precedence: list List-Id: Linux Test Project List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Richard Palethorpe Errors-To: ltp-bounces+incoming=patchwork.ozlabs.org@lists.linux.it Sender: "ltp" From: Richard Palethorpe This also require to rewrite netns_helper.h. New test still uses legacy libclone.h. Signed-off-by: Petr Vorel --- Hi, check_iproute() is broken since v5.7.0-77-gb687d1067169 (released in v5.8.0), but that will be fixed by introducing C code, which will be used also by helper binary which will be used by shell tests (netns_helper.sh, mc_cmds.sh). Rewriting netns_helper.h first helps avoiding having to support legacy API. Kind regards, Petr .../kernel/containers/netns/netns_helper.h | 38 ++---- .../kernel/containers/netns/netns_netlink.c | 115 +++++++----------- 2 files changed, 56 insertions(+), 97 deletions(-) diff --git a/testcases/kernel/containers/netns/netns_helper.h b/testcases/kernel/containers/netns/netns_helper.h index 8b876454f..5468dd5e3 100644 --- a/testcases/kernel/containers/netns/netns_helper.h +++ b/testcases/kernel/containers/netns/netns_helper.h @@ -1,32 +1,20 @@ +// SPDX-License-Identifier: GPL-2.0 /* * Copyright (c) International Business Machines Corp., 2008 - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See - * the GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . * * Author: Veerendra C * * Net namespaces were introduced around 2.6.25. Kernels before that, * assume they are not enabled. Kernels after that, check for -EINVAL * when trying to use CLONE_NEWNET and CLONE_NEWNS. - ***************************************************************************/ + */ #define _GNU_SOURCE -#include #include "config.h" -#include "libclone.h" +#include #include "lapi/syscalls.h" -#include "test.h" -#include "safe_macros.h" +#include "tst_safe_macros.h" +#include "libclone.h" #ifndef CLONE_NEWNS #define CLONE_NEWNS -1 @@ -40,17 +28,15 @@ static void check_iproute(unsigned int spe_ipver) ipf = popen("ip -V", "r"); if (ipf == NULL) - tst_brkm(TCONF, NULL, - "Failed while opening pipe for iproute check"); + tst_brk(TCONF, "Failed while opening pipe for iproute check"); n = fscanf(ipf, "ip utility, iproute2-ss%u", &ipver); if (n < 1) { - tst_brkm(TCONF, NULL, - "Failed while obtaining version for iproute check"); + tst_brk(TCONF, "Failed while obtaining version for iproute check"); } if (ipver < spe_ipver) { - tst_brkm(TCONF, NULL, "The commands in iproute tools do " - "not support required objects"); + tst_brk(TCONF, + "The commands in iproute tools do not support required objects"); } pclose(ipf); @@ -67,14 +53,14 @@ static void check_netns(void) int pid, status; /* Checking if the kernel supports unshare with netns capabilities. */ if (CLONE_NEWNS == -1) - tst_brkm(TCONF | TERRNO, NULL, "CLONE_NEWNS (%d) not supported", + tst_brk(TCONF | TERRNO, "CLONE_NEWNS (%d) not supported", CLONE_NEWNS); pid = do_clone_unshare_test(T_UNSHARE, CLONE_NEWNET | CLONE_NEWNS, dummy, NULL); if (pid == -1) - tst_brkm(TCONF | TERRNO, NULL, + tst_brk(TCONF | TERRNO, "unshare syscall smoke test failed"); - SAFE_WAIT(NULL, &status); + SAFE_WAIT(&status); } diff --git a/testcases/kernel/containers/netns/netns_netlink.c b/testcases/kernel/containers/netns/netns_netlink.c index 47e8235d6..7e62611fb 100644 --- a/testcases/kernel/containers/netns/netns_netlink.c +++ b/testcases/kernel/containers/netns/netns_netlink.c @@ -1,34 +1,27 @@ -/* Copyright (c) 2014 Red Hat, Inc. - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of version 2 the GNU General Public License as - * published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - *********************************************************************** - * File: netns_netlink.c +// SPDX-License-Identifier: GPL-2.0 +/* + * Copyright (c) 2014 Red Hat, Inc. + * Copyright (c) 2021 Petr Vorel + */ + +/*\ + * [DESCRIPTION] * * Tests a netlink interface inside a new network namespace. - * Description: - * 1. Unshares a network namespace (so network related actions - * have no effect on a real system) - * 2. Forks a child which creates a NETLINK_ROUTE netlink socket - * and listens to RTMGRP_LINK (network interface create/delete/up/down) - * multicast group. - * 4. Child then waits for parent approval to receive data from socket - * 3. Parent creates a new TAP interface (dummy0) and immediately - * removes it (which should generate some data in child's netlink socket). - * Then it allows child to continue. - * 4. As the child was listening to RTMGRP_LINK multicast group, it should - * detect the new interface creation/deletion (by reading data from netlink - * socket), if so, the test passes, otherwise it fails. - */ + * + * - Unshares a network namespace (so network related actions + * have no effect on a real system). + * - Forks a child which creates a NETLINK_ROUTE netlink socket + * and listens to RTMGRP_LINK (network interface create/delete/up/down) + * multicast group. + * - Child then waits for parent approval to receive data from socket + * - Parent creates a new TAP interface (dummy0) and immediately + * removes it (which should generate some data in child's netlink socket). + * Then it allows child to continue. + * - As the child was listening to RTMGRP_LINK multicast group, it should + * detect the new interface creation/deletion (by reading data from netlink + * socket), if so, the test passes, otherwise it fails. +\*/ #define _GNU_SOURCE #include @@ -40,28 +33,18 @@ #include #include #include + +#include "tst_test.h" +#include "tst_safe_macros.h" #include "netns_helper.h" -#include "test.h" -#include "safe_macros.h" #define MAX_TRIES 1000 #define IP_TUNTAP_MIN_VER 100519 -char *TCID = "netns_netlink"; -int TST_TOTAL = 1; - -static void cleanup(void) -{ - tst_rmdir(); -} - static void setup(void) { - tst_require_root(); check_iproute(IP_TUNTAP_MIN_VER); check_netns(); - tst_tmpdir(); - TST_CHECKPOINT_INIT(tst_rmdir); } int child_func(void) @@ -89,7 +72,7 @@ int child_func(void) } /* waits for parent to create an interface */ - TST_SAFE_CHECKPOINT_WAIT(NULL, 0); + TST_CHECKPOINT_WAIT(0); /* To get rid of "resource temporarily unavailable" errors * when testing with -i option */ @@ -121,60 +104,50 @@ int child_func(void) return 0; } -static void test(void) +static void test_netns_netlink(void) { pid_t pid; int status; /* unshares the network namespace */ - if (unshare(CLONE_NEWNET) == -1) - tst_brkm(TBROK | TERRNO, cleanup, "unshare failed"); + SAFE_UNSHARE(CLONE_NEWNET); - pid = tst_fork(); - if (pid < 0) { - tst_brkm(TBROK | TERRNO, cleanup, "fork failed"); - } + pid = SAFE_FORK(); if (pid == 0) { _exit(child_func()); } /* creates TAP network interface dummy0 */ if (WEXITSTATUS(system("ip tuntap add dev dummy0 mode tap"))) - tst_brkm(TBROK, cleanup, "system() failed"); + tst_brk(TBROK, "system() failed"); /* removes previously created dummy0 device */ if (WEXITSTATUS(system("ip tuntap del mode tap dummy0"))) - tst_brkm(TBROK, cleanup, "system() failed"); + tst_brk(TBROK, "system() failed"); /* allow child to continue */ - TST_SAFE_CHECKPOINT_WAKE(cleanup, 0); + TST_CHECKPOINT_WAKE(0); - - SAFE_WAITPID(cleanup, pid, &status, 0); + SAFE_WAITPID(pid, &status, 0); if (WIFEXITED(status) && WEXITSTATUS(status) != 0) { - tst_resm(TFAIL, "netlink interface fail"); + tst_res(TFAIL, "netlink interface fail"); return; } if (WIFSIGNALED(status)) { - tst_resm(TFAIL, "child was killed with signal %s", + tst_res(TFAIL, "child was killed with signal %s", tst_strsig(WTERMSIG(status))); return; } - tst_resm(TPASS, "netlink interface pass"); + tst_res(TPASS, "netlink interface pass"); } -int main(int argc, char *argv[]) -{ - int lc; - tst_parse_opts(argc, argv, NULL, NULL); - - setup(); - - for (lc = 0; TEST_LOOPING(lc); lc++) - test(); - - cleanup(); - tst_exit(); -} +static struct tst_test test = { + .test_all = test_netns_netlink, + .setup = setup, + .needs_checkpoints = 1, + .needs_tmpdir = 1, + .needs_root = 1, + .forks_child = 1, +};