From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mail-pg1-f172.google.com (mail-pg1-f172.google.com [209.85.215.172]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id E61B6459AF9 for ; Fri, 7 Aug 2026 22:10:03 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.215.172 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1786140605; cv=none; b=iAch49WgJ/0I2lwpoC0m4sy64jxCB5hEeoHqHVGka5tfX/EGgrPs/dUUKZllILZJI/8vQsE2V6RhYWi/EDfMzxNtThQAZ+kjgt2EqlZi3PZFJZzFvFPKDCmmGKlbiYAR6RFQ8urQlj0qoglq5fNamILaLL3/D0gWHLP+lh+uQzo= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1786140605; c=relaxed/simple; bh=HgtG2lJaDXD2Ez34y3RSHzeEVJH+VzPy71sbxtDt4GE=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=Fcwh7RyoG0okqbzcb4efUfw7OT1CQYAeXgnHx9eXnWTsTlfTUR1SfHlWYEGbxJj4LDzO7uNiAko7FSzO5oamDulr96+AH+5VWwNo7DM89iRr1Tijff7xfVAU/FU8qnOTEeegfjzHkVuycO/3H0Szwqugx+D7u6b6yJ3SOKfv6Gw= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=ETj5mQmy; arc=none smtp.client-ip=209.85.215.172 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="ETj5mQmy" Received: by mail-pg1-f172.google.com with SMTP id 41be03b00d2f7-c99eaa1f020so4057786a12.2 for ; Fri, 07 Aug 2026 15:10:03 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1786140603; x=1786745403; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to:content-type; bh=XE0UzVUXwsGoJ/wVoGB07+IWtuFU1IC6Kjeaw1YnJIU=; b=ETj5mQmygvBNvtapE4Iq86SAnuTSFr27de/vM2vm9oVbpDg421vXR+t0oQV1CD7ZKq wQmrE4+qPYQ8TQl1/7vteEyYM97SYLndzAyYTs5X5AjvNa2hKc0+LbzpiVx6jnOXWYvo Zd7E4NZsVrRSg6RuTA0t9xf3Bm9qYcEETAhfGuhn2u5f1rRu8VHVtGd8hlIzZMD0MJrG Q1vUrcg9mVBeSrzhdFC1TAlFxBSqI+D7lWRfTqQgYpRksrTMK8YYgV6+aMnbFfUzNmdf UHPVFvsa1L0c0cQ69ydFpkAy7Rc/+rF4QB1oBOHXjQxwwlBzdqVjIJj6BJEDwOpVOGEZ g4BQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1786140603; x=1786745403; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to:content-type; bh=XE0UzVUXwsGoJ/wVoGB07+IWtuFU1IC6Kjeaw1YnJIU=; b=lFZxXkc7TsBf4H4vaT6uHESEK5Tt+zkiOl7StgYB0tkraauxSq9aNGQTGgTtyg4A4T KkUYY1PSr29LkNUMPA4lEK1zvdx5zjJDqMyLvylVdfOlogNgpPlgiNhUC/3MwJ4DTjsX eyi38w0OYXThkCqhUsYLRB1n0ZcsQ8VdXhovmo/vMI3qFrzpDpYzIkWtJ9uRexRCT7OE eu9aeh8Dm7xuCqG/kyHVqZUiOIEvc7dmgTcRZv075Co0mX5FI8fN0wCwdJgio83w2YVq hhHYHT6nRgazs1b6ESf6rnllVrP6n4YBJKW81khFRtV/ru/Pf6xbLbtcKyvCtH7cBDPf etMg== X-Forwarded-Encrypted: i=1; AHgh+RqqBNY7usGpBao/4p5bv/d3x+Lo3QTcnWx7VKGB4hsAg95AIjXesTmWqvupBvlfyPc0m7RjuYWbi3MTrOI=@vger.kernel.org X-Gm-Message-State: AOJu0YzPlIHRGUQFNdED0SgVNdj0xvtic465+QOAs8wabX9qr6Y6CWUS UL+O5bd4ka0ARHO7BqckcBWKeJd2YgPkyohKUKhji0Ue14PW1zJpI/WME65K+ktt X-Gm-Gg: AR+sD13TAaudxeh19T6xB6QMmoyl6YQTpJO4vHGvXIhFvfaBnGFSRsgHU+czHDi+mol 0x5vSwHpxdmFO84j7eUpHb9lOWZcHk9FeceUdS9a0StB+StJ4WgYii1ZPI82M9icSsXp5aiQzIe flmjX4H8Beo1OgBXdPoi5M6vB8RBsGNG0whKNFiChnTy6KQEKBs1FOoVX8Wx6B/vyKUBTPyHO0p i6cFTaSSog2G8N7rO2Gg7iqWtymXXb+CVag9Lc9XCg2QT1lKNjufAsFC9c8zLwviBHhcQnOKv4K 1TRJtjEttJ+y5a7VWbexiEwf1tx+iLe6iJT0+FFLuZlGBqmzKPMXtGElSr3U71tDNPAcljhkz3P hUBEJ2IwphxC2IuhAJiCvct9XW8qZoS98wipkRFg8DQmD+/cRssZzdqheaUGa9BnXn8zBONk8CU vBHnd8d7qdx4CO9C1dE2UCakkaY01Z7p/mwLEPZc65uArrJJ2cVGWWS8oAp8S+D+WSdQ== X-Received: by 2002:a05:6a20:728c:b0:3c0:b4f8:bbfb with SMTP id adf61e73a8af0-3cbc03b5531mr7505750637.22.1786140603049; Fri, 07 Aug 2026 15:10:03 -0700 (PDT) Received: from fedora ([2804:1b3:a8c3:8ee5:1c39:64d9:e257:73dc]) by smtp.gmail.com with ESMTPSA id 5a478bee46e88-315be568bd3sm11182762eec.0.2026.08.07.15.10.00 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 07 Aug 2026 15:10:02 -0700 (PDT) From: Marcelo Mendes Spessoto Junior To: "David S . Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni , Simon Horman , Shuah Khan Cc: netdev@vger.kernel.org, linux-kselftest@vger.kernel.org, linux-kernel@vger.kernel.org, Marcelo Mendes Spessoto Junior Subject: [PATCH net-next v3 2/5] selftests: net: test IPV6_FL_F_REMOTE Date: Fri, 7 Aug 2026 19:09:39 -0300 Message-ID: <20260807220942.421382-3-marcelomspessoto@gmail.com> X-Mailer: git-send-email 2.55.0 In-Reply-To: <20260807220942.421382-1-marcelomspessoto@gmail.com> References: <20260807220942.421382-1-marcelomspessoto@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: 8bit This flag retrieves the flow label seen by the socket at connection setup via a getsockopt query. Therefore, the validation of this flag requires a brief connection setup (source code for flow label shows it must be TCP). The simple TCP connection logic was wrapped inside two simple helpers, because there are other uncovered features of flow label mgr that could benefit from it (such as IPV6_FL_F_REFLECT). Signed-off-by: Marcelo Mendes Spessoto Junior --- .../selftests/net/ipv6_flowlabel_mgr.c | 88 +++++++++++++++++++ 1 file changed, 88 insertions(+) diff --git a/tools/testing/selftests/net/ipv6_flowlabel_mgr.c b/tools/testing/selftests/net/ipv6_flowlabel_mgr.c index ec187890a1ed..51541e792257 100644 --- a/tools/testing/selftests/net/ipv6_flowlabel_mgr.c +++ b/tools/testing/selftests/net/ipv6_flowlabel_mgr.c @@ -24,6 +24,9 @@ #ifndef IPV6_FLOWLABEL_MGR #define IPV6_FLOWLABEL_MGR 32 #endif +#ifndef IPV6_FLOWINFO_SEND +#define IPV6_FLOWINFO_SEND 33 +#endif /* from net/ipv6/ip6_flowlabel.c */ #define FL_MIN_LINGER 6 @@ -101,6 +104,67 @@ static int flowlabel_renew(int fd, uint32_t label, uint8_t share, return setsockopt(fd, SOL_IPV6, IPV6_FLOWLABEL_MGR, &req, sizeof(req)); } +static struct sockaddr_in6 loopback_addr(void) +{ + struct sockaddr_in6 addr = { + .sin6_family = AF_INET6, + .sin6_addr = IN6ADDR_LOOPBACK_INIT, + .sin6_port = htons(8888), + }; + + return addr; +} + +static int tcp_listen(void) +{ + struct sockaddr_in6 addr = loopback_addr(); + const int one = 1; + int fd; + + fd = socket(PF_INET6, SOCK_STREAM, 0); + if (fd == -1) + error(1, errno, "socket listener"); + if (setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &one, sizeof(one))) + error(1, errno, "setsockopt SO_REUSEADDR"); + if (bind(fd, (void *)&addr, sizeof(addr))) + error(1, errno, "bind"); + if (listen(fd, 1)) + error(1, errno, "listen"); + + return fd; +} + +static void tcp_connect(int listener, uint32_t flowlabel, + int *client, int *accepted) +{ + struct sockaddr_in6 addr = loopback_addr(); + const int one = 1; + int cfd, afd; + + cfd = socket(PF_INET6, SOCK_STREAM, 0); + if (cfd == -1) + error(1, errno, "socket client"); + + if (flowlabel_get(cfd, flowlabel, IPV6_FL_S_EXCL, IPV6_FL_F_CREATE)) + error(1, errno, "flowlabel_get"); + if (setsockopt(cfd, SOL_IPV6, IPV6_FLOWINFO_SEND, &one, sizeof(one))) + error(1, errno, "setsockopt flowinfo_send"); + addr.sin6_flowinfo = htonl(flowlabel); + + if (connect(cfd, (void *)&addr, sizeof(addr))) + error(1, errno, "connect"); + + afd = accept(listener, NULL, NULL); + if (afd == -1) + error(1, errno, "accept"); + + if (flowlabel_put(cfd, flowlabel)) + error(1, errno, "flowlabel_put"); + + *client = cfd; + *accepted = afd; +} + static void run_tests(int fd) { int wstatus; @@ -216,6 +280,30 @@ static void run_tests(int fd) IPV6_FL_F_CREATE), EPERM); } + + { + struct in6_flowlabel_req freq = { + .flr_action = IPV6_FL_A_GET, + .flr_flags = IPV6_FL_F_REMOTE, + }; + int remote_listener = tcp_listen(); + socklen_t freq_len = sizeof(freq); + int remote_cfd, remote_afd; + + explain("Prepare TCP SYN for REMOTE flag validation"); + tcp_connect(remote_listener, 7, &remote_cfd, &remote_afd); + + explain("Query for label sent by client with IPV6_FL_F_REMOTE"); + expect_pass(getsockopt(remote_afd, SOL_IPV6, IPV6_FLOWLABEL_MGR, + &freq, &freq_len)); + if (ntohl(freq.flr_label) != 7) + error(1, 0, "unexpected remote flowlabel %u", + ntohl(freq.flr_label)); + + close(remote_afd); + close(remote_cfd); + close(remote_listener); + } } static void parse_opts(int argc, char **argv) -- 2.55.0