From mboxrd@z Thu Jan 1 00:00:00 1970 Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.remote-ip=209.85.208.70 ARC-Seal: i=1; d=subspace.kernel.org; s=arc20261015; a=rsa-sha256; cv=none; t=1793225898; b=Um/ueY1qNP/UJqjWTKr1T6tuC2F6lpkJ9IOCq5K2YCb4NSrL6zFPHzphbWOR8I1DY8hQ Mbiu7Wcuz8iHNEDb3Vr/ay+2GW1w6YXb9KyAN3oVCQZhbZYv5pXuPU1R9C+aOohaSYdbv jMaTv3X/murrsknOwVZgZY7a+S6zYQofXiNkGZm0QBH3jQ7JaS7Y7Of3BI89mgJZ8QAOq UbzsBUZab+NmxZr+Q6biojgorkrg9oTK5wKMuHJxH459Trd7SPcWhmD0hZrrsYUeHxbEr csIYq518bCWbCoQc0c0/C24cQIkXQRlU+ekM+JAXTcJZX8suf1yUQvsBj7/iX0NnNKg== 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=lQF03M86fq0tEGErt62WAK1N0+R2FD8bJsUhn4n2Dr3JHZxd1P9tCwSLlf4tKAYXwxYY Sz5eieHs/W7z5tMhr+LGTixE35F4DpA1RGNn08dheHx0+6yImhX5CTsFyjNIka61ogQMb no5IG8NqdmvQ1BU9FQntXLzl7oP69Cst1TcwRTZ4p6x9dTT4vomOA5A9tTouVCg89k5SP WVP3PtABFRw1Pu1pM1jw4umQOKKPrM2cPKb0IIOFv9IYgv9cieocVbI/VNtuzJJxrqvyk FWMMwr9CsE5TtlmVdzTZtVpo1DAwz1yygR7xw+axiKAs0gZ9AwE2Hd4R9in+r3SCtiQ== 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.208.70 Received: from mail-ed1-f70.google.com (mail-ed1-f70.google.com [209.85.208.70]) (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 A4F9660A2635 for ; Wed, 28 Oct 2026 22:18:17 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.4.2 smtp.subspace.kernel.org A4F9660A2635 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-ed1-f70.google.com with SMTP id 4fb4d7f45d1cf-6b1d35e3c0fso1566623a12.3 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=1OX+sfl7xG0lsWp+WSwrwwY6i4KrwbWnZb1+yGLG2JWKKbDYnMVsVglVzwudvmZ3NR ODYdX5ZvdcXTjPlzutjH1FVCGkR2E5gvU1qjwM8OVh1VbqAyDXzB1FxP2fVxw/PU/YFe P4zXz5kXHuuCTNxUPfz3f8WxCkx/NdBy+bqP8GrWw2i8I7HR+HamlG5h8/LB4ViQFHEs /xPLV7Q1o6qEL1k73mhQHUk6KMa20zA0rh8Ij76m9Ox0dX9oe30ylNp3GTjtFL8SXZEL DX+/HY3TQEmzXllT9Tuj+PflhekhMnlJHO3XLcyxb91ngc0C+nyaSJlubcfMyFkROoi9 ZzIg== X-Forwarded-Encrypted: i=1; AKwUvBwTqKk84t5sm1FRJjQvtQ+HH8y8NH70J1+FdJPElfU7Fb3F8u3DxJrkNSLcMD4Z9atAKtRVV01pPCQSDF4=@vger.kernel.org X-Gm-Message-State: AFq9FYKyy/C/fin40ddIn2FNE1kfiSAOdauxQC/fW+FVrOt2xKombJQb 2W3Iu23h9F+M71YfwWwua5Nr+4DtTs7/4umBhuZ80v/Of0Ny1IeUtJKV5K2oIo/CQpYioqEABA= = 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-kernel@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