From mboxrd@z Thu Jan 1 00:00:00 1970 Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.remote-ip=209.85.218.72 ARC-Seal: i=1; d=subspace.kernel.org; s=arc20261015; a=rsa-sha256; cv=none; t=1793225898; b=Cv3tujeh+63Hc2mUot6oGKcgzdGFSgv41i5m9krzBaTtKVaqkUJkuu+8CeyBoVx1KUwl GPAVn74KVHPIWkGe5ssfuN3PcuL1mTs7ghMar9DoJ5/YpDLOx6+WhZWt7KecdfzGzvnvq QgG+14m1LAKw46ccFn4eL4FBNC3LEUUKBr8fmGEeaiZkt7YXiJOxVyrNDyUjvogtIh4lR zKBVrdmny2eK2psMzytlMh8flOIJ5oa/myTidAp/di7HdaZH+ckmHf2JMv02D7AsGpQlH Ph4Xgr+vmPKl8rut3e4fZwPaPpqep79GhrddinkzJZVXJAw/x8IGZyS8cs9SqPIVpBA== ARC-Message-Signature: i=1; d=subspace.kernel.org; s=arc20261015; a=rsa-sha256; c=relaxed/relaxed; t=1793225898; h=DMARC-Filter:Received:DKIM-Signature:X-Google-DKIM-Signature: X-Forwarded-Encrypted:X-Gm-Message-State:X-Received:Date:In-Reply-To: Mime-Version:References:X-Mailer:Message-ID:Subject:From:To:Cc: Content-Type; bh=LuXjD7L3OcsNkkaeGIp4Cs+2/jEhkIJjHJvLaqO3j5k=; b=cCqHHRbdRX6fymV+Wr2rhy5Lhj4ZLIKA9fATqdjyv+M/NA+SvdkBtfj+2Ie0J8+0Od8O YLpGmqRKjGIRPJUMY5EMIOL7gwzTXFPx4auU+/WnXXnJhtV81G3iTvkdAuhoAunF6h3QS V3ei7dCoUQM50b93oTiMQoTK4TJ2hDOLsTSnjCPtnZcX6mjfCPWy364CgeHlKHZW8XF6s ZhUY46cCdqDAdT069rN5ek9HtlFcvCZezqsxC4CTtl4UtpRVtipg9mjT8RUlMzRPmvFoN JOI3EYIxNcxI2HbfXFyjTjCtIwSWo4Qgpx305Kt5aq7/wU5i+gybkLIiwcPiyk4XUrg== ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass header.from=google.com; spf=pass smtp.mailfrom=flex--halg.bounces.google.com; dkim=pass header.d=google.com header.i=@google.com header.a=rsa-sha256 header.s=20260707 header.b=cG9MXphV; arc=none smtp.remote-ip=209.85.218.72 Received: from mail-ej1-f72.google.com (mail-ej1-f72.google.com [209.85.218.72]) (using TLSv1.3 with cipher TLS_AES_128_GCM_SHA256 (128/128 bits) key-exchange X25519 server-signature ECDSA (prime256v1) server-digest SHA256) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 918FC60A262C for ; Wed, 28 Oct 2026 22:18:17 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.4.2 smtp.subspace.kernel.org 918FC60A262C Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=flex--halg.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key, unprotected) header.d=google.com header.i=@google.com header.a=rsa-sha256 header.s=20260707 header.b=cG9MXphV Received: by mail-ej1-f72.google.com with SMTP id a640c23a62f3a-c4048584447so113277266b.1 for ; Wed, 28 Oct 2026 15:18:17 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20260707; t=1793225896; x=1793830696; darn=vger.kernel.org; h=content-type:cc:to:from:subject:message-id:references:mime-version :in-reply-to:date:from:to:cc:subject:date:message-id:reply-to :content-type; bh=LuXjD7L3OcsNkkaeGIp4Cs+2/jEhkIJjHJvLaqO3j5k=; b=cG9MXphVliGfueSx2Z0NoNbYsnSXHOGHkWt5dQAGZ8EsOMi4HeS3qSTjFLd5X4KDzN 08MKv/iUjqxQdb3ioitFUylTCyNYvndTExu9ZkmqFsRzBm7wEb3IZEO4xL1pFDB3ImtK bjLsaohZ8mCteV0cvwxrH6GRnOyss5cZ0+p1j0gBk3m+rSFw7K1Ac/tXCxXFwPrdqD6R QQRGpEQ9oOEFX4JQzcl8eO1/yaGbuzVPrg6TvUD2Q5QrbaB1gfUzlpHpj9FeVjOu0/PI GmsDP24gl5/0EwYUvv6Kf4qYid+2zDPhTQzM9gs+aVHSfDV3rLlvMp8Dl4Hu7ng56jjm XyXw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20260707; t=1793225896; x=1793830696; h=content-type:cc:to:from:subject:message-id:references:mime-version :in-reply-to:date:x-gm-message-state:from:to:cc:subject:date :message-id:reply-to:content-type; bh=LuXjD7L3OcsNkkaeGIp4Cs+2/jEhkIJjHJvLaqO3j5k=; b=RadMv4tqYun9PzUfh4pI+yJ5yjL5vp1EAzc/URIDVdQ5soVfBdSJXvilgXHfsW2NA6 IzvBIJVTLjNpp9JycjvH10WIVP++DsQpQBCE3ITfPB4FwnnAMXhAZKCbLCjhd6y1DwuB 4P8CLpf2QPjSuJkk3MzN+d8Lz4G3/kFukbVQJaIAOpftepakLMJME34CxT95t22secp6 YWVhhky7GVBVhigp4yOnXMS78jhFPuMv7Byy181i+h45n8OTdP/Dy9POTy3WLR8Cn53j UB/GhaqSeAkp/ihQulMtKv4gENcsNuora8Marf6nd2XvOsTazEyRtYK6vjoi7/aO3ux9 XB6Q== X-Forwarded-Encrypted: i=1; AKwUvBzwOG5XzB7MsOYxcHaEnJ4Yv2fvLmlPgHCvE++xAs4aBM/SOkFBEKdCBnSMOqXhb2b9okwCCdFrK+w=@vger.kernel.org X-Gm-Message-State: AFq9FYK+m6eai+9Q6Mf/MQ3AU3kPJU+vx1fY+pfqsEGR2373s7uwymwZ NKW/+UcWvtMd46kWnLPYQYnNox52uWfo/6pLDCRxzecQHhG/4hElxp/9G6/A40LY4TnRFhVuhw= = X-Received: from ejblw4.prod.google.com ([2002:a17:906:bcc4:b0:c46:48a5:ea8c]) (user=halg job=prod-delivery.src-stubby-dispatcher) by 2002:a17:906:e2cf:b0:c49:c76f:dad4 with SMTP id a640c23a62f3a-c49c76fdf58mr174243066b.31.1793225895629; Wed, 28 Oct 2026 15:18:15 -0700 (PDT) Date: Wed, 28 Oct 2026 22:17:02 +0000 In-Reply-To: <20261028221705.3915340-1-halg@google.com> X-Mailing-List: linux-doc@vger.kernel.org List-Id: List-Post: List-Help: List-Subscribe: List-Unsubscribe: List-Owner: Precedence: list Mime-Version: 1.0 References: <20261028221705.3915340-1-halg@google.com> X-Mailer: git-send-email 2.56.0.313.g2479322e68-goog Message-ID: <20261028221705.3915340-6-halg@google.com> Subject: [PATCH 5/8] selftests/net: add test suite for CLONE_NEWNET_LOOPBACK From: "Hallgrimur H. Gunnarsson" To: Christian Brauner , Alexander Viro , Paul Moore , Serge Hallyn , Kees Cook , "David S . Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni Cc: Jan Kara , James Morris , Simon Horman , Jonathan Corbet , Shuah Khan , Randy Dunlap , Jann Horn , "=?UTF-8?q?G=C3=BCnther=20Noack?=" , KP Singh , Jonathan Calmels , Casey Schaufler , linux-fsdevel@vger.kernel.org, linux-security-module@vger.kernel.org, linux-api@vger.kernel.org, containers@lists.linux.dev, netdev@vger.kernel.org, linux-doc@vger.kernel.org, linux-kselftest@vger.kernel.org, linux-kernel@vger.kernel.org, "Hallgrimur H. Gunnarsson" Content-Type: text/plain; charset="UTF-8" Add tests in tools/testing/selftests/net to validate CLONE_NEWNET_LOOPBACK and UNSHARE_NEWNET_LOOPBACK behavior. Signed-off-by: Hallgrimur H. Gunnarsson --- tools/testing/selftests/net/.gitignore | 1 + tools/testing/selftests/net/Makefile | 1 + tools/testing/selftests/net/loopback_netns.c | 103 +++++++++++++++++++ 3 files changed, 105 insertions(+) create mode 100644 tools/testing/selftests/net/loopback_netns.c diff --git a/tools/testing/selftests/net/.gitignore b/tools/testing/selftests/net/.gitignore index c9f46031ac73..54919a8b3682 100644 --- a/tools/testing/selftests/net/.gitignore +++ b/tools/testing/selftests/net/.gitignore @@ -18,6 +18,7 @@ ipv6_flowlabel ipv6_flowlabel_mgr ipv6_fragmentation log.txt +loopback_netns msg_zerocopy netlink-dumps nettest diff --git a/tools/testing/selftests/net/Makefile b/tools/testing/selftests/net/Makefile index 0f5c178bc224..7d7e88e6676f 100644 --- a/tools/testing/selftests/net/Makefile +++ b/tools/testing/selftests/net/Makefile @@ -184,6 +184,7 @@ TEST_GEN_PROGS := \ icmp_rfc4884 \ ipv6_flowlabel_mgr \ ipv6_fragmentation \ + loopback_netns \ proc_net_pktgen \ reuseaddr_conflict \ reuseport_bpf \ diff --git a/tools/testing/selftests/net/loopback_netns.c b/tools/testing/selftests/net/loopback_netns.c new file mode 100644 index 000000000000..03cc665fb502 --- /dev/null +++ b/tools/testing/selftests/net/loopback_netns.c @@ -0,0 +1,103 @@ +// SPDX-License-Identifier: GPL-2.0 +#define _GNU_SOURCE + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +#include "../clone3/clone3_selftests.h" +#include "../kselftest_harness.h" + +static int get_lo_flags(void) +{ + struct ifreq ifr; + int fd, ret; + + memset(&ifr, 0, sizeof(ifr)); + strncpy(ifr.ifr_name, "lo", IFNAMSIZ - 1); + + fd = socket(AF_INET, SOCK_DGRAM, 0); + if (fd < 0) + return -errno; + + ret = ioctl(fd, SIOCGIFFLAGS, &ifr); + close(fd); + + if (ret < 0) + return -errno; + + return ifr.ifr_flags; +} + +TEST(baseline_lo_down) +{ + int flags; + + ASSERT_EQ(0, unshare(CLONE_NEWUSER | CLONE_NEWNET)); + + flags = get_lo_flags(); + ASSERT_GE(flags, 0); + EXPECT_EQ(0, flags & IFF_UP); +} + +TEST(unshare_loopback) +{ + struct stat st_before, st_after; + int flags; + + ASSERT_EQ(0, stat("/proc/self/ns/net", &st_before)); + ASSERT_EQ(0, unshare(CLONE_NEWUSER | UNSHARE_NEWNET_LOOPBACK)); + ASSERT_EQ(0, stat("/proc/self/ns/net", &st_after)); + EXPECT_NE(st_before.st_ino, st_after.st_ino); + + flags = get_lo_flags(); + ASSERT_GE(flags, 0); + EXPECT_NE(0, flags & IFF_UP); + EXPECT_NE(0, flags & IFF_RUNNING); +} + +TEST(clone3_loopback) +{ + struct __clone_args args = { + .flags = CLONE_NEWUSER | CLONE_NEWNET_LOOPBACK, + .exit_signal = SIGCHLD, + }; + struct stat st_parent, st_child; + int status; + pid_t pid; + + ASSERT_EQ(0, stat("/proc/self/ns/net", &st_parent)); + + pid = sys_clone3(&args, sizeof(args)); + ASSERT_GE(pid, 0); + + if (pid == 0) { + int flags; + + if (stat("/proc/self/ns/net", &st_child) != 0 || + st_parent.st_ino == st_child.st_ino) + _exit(1); + + flags = get_lo_flags(); + if (flags < 0 || !(flags & IFF_UP) || !(flags & IFF_RUNNING)) + _exit(2); + + _exit(0); + } + + ASSERT_EQ(pid, waitpid(pid, &status, 0)); + ASSERT_TRUE(WIFEXITED(status)); + EXPECT_EQ(0, WEXITSTATUS(status)); +} + +TEST_HARNESS_MAIN -- 2.56.0.313.g2479322e68-goog