1 /* 2 * Copyright (c) International Business Machines Corp., 2008 3 * This program is free software; you can redistribute it and/or modify 4 * it under the terms of the GNU General Public License as published by 5 * the Free Software Foundation; either version 2 of the License, or 6 * (at your option) any later version. 7 * 8 * This program is distributed in the hope that it will be useful, 9 * but WITHOUT ANY WARRANTY; without even the implied warranty of 10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See 11 * the GNU General Public License for more details. 12 * 13 * You should have received a copy of the GNU General Public License 14 * along with this program. If not, see <http://www.gnu.org/licenses/>. 15 * 16 * Author: Veerendra C <vechandr (at) in.ibm.com> 17 * 18 * Net namespaces were introduced around 2.6.25. Kernels before that, 19 * assume they are not enabled. Kernels after that, check for -EINVAL 20 * when trying to use CLONE_NEWNET and CLONE_NEWNS. 21 ***************************************************************************/ 22 23 #define _GNU_SOURCE 24 #include <sched.h> 25 #include "config.h" 26 #include "libclone.h" 27 #include "linux_syscall_numbers.h" 28 #include "test.h" 29 #include "safe_macros.h" 30 31 #ifndef CLONE_NEWNS 32 #define CLONE_NEWNS -1 33 #endif 34 35 static void check_iproute(unsigned int spe_ipver) 36 { 37 FILE *ipf; 38 int n; 39 unsigned int ipver = 0; 40 41 ipf = popen("ip -V", "r"); 42 if (ipf == NULL) 43 tst_brkm(TCONF, NULL, 44 "Failed while opening pipe for iproute check"); 45 46 n = fscanf(ipf, "ip utility, iproute2-ss%u", &ipver); 47 if (n < 1) { 48 tst_brkm(TCONF, NULL, 49 "Failed while obtaining version for iproute check"); 50 } 51 if (ipver < spe_ipver) { 52 tst_brkm(TCONF, NULL, "The commands in iproute tools do " 53 "not support required objects"); 54 } 55 56 pclose(ipf); 57 } 58 59 static void check_netns(void) 60 { 61 int pid, status; 62 /* Checking if the kernel supports unshare with netns capabilities. */ 63 if (CLONE_NEWNS == -1) 64 tst_brkm(TCONF | TERRNO, NULL, "CLONE_NEWNS (%d) not supported", 65 CLONE_NEWNS); 66 67 pid = do_clone_unshare_test(T_UNSHARE, CLONE_NEWNET | CLONE_NEWNS, NULL, 68 NULL); 69 if (pid == -1) 70 tst_brkm(TCONF | TERRNO, NULL, 71 "unshare syscall smoke test failed"); 72 73 SAFE_WAIT(NULL, &status); 74 } 75