From nobody Mon Feb 9 13:57:09 2026 Delivered-To: wpasupplicant.patchew@gmail.com Received: by 2002:a02:cbb9:0:0:0:0:0 with SMTP id v25csp2669071jap; Fri, 19 Nov 2021 12:41:53 -0800 (PST) X-Google-Smtp-Source: ABdhPJzuTqavrSZaczmLxqXX0RCJ+kOnaudpQVpJjUu0eZgNyFrWxbfqeQkblSCwU/Y83Q+6rCk8 X-Received: by 2002:a05:6a00:783:b0:4a3:25c8:afcb with SMTP id g3-20020a056a00078300b004a325c8afcbmr18277151pfu.33.1637354513613; Fri, 19 Nov 2021 12:41:53 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1637354513; cv=none; d=google.com; s=arc-20160816; b=ePV45YDGCyD/pBHbSAPW/5lSk5BjZhRALrC/YOGVRTGf56hGn6zygMHOoCpCPFWULA yn/kC6TaPfYlD50g9hGoOe9cg7s1tQ2bQF4P/UZFxU+o3kHOBvdty5AotywHf/iH94sa GHNNOqGAWAG3V9DUuKsIyswM2EwXKG3r1hp8vopE+TZvpLBqPzvyLcu/zMFADSAZ5vXU b4dBN70O7sHDboRAPh/3I2ke4FYyO+nS448IdbfqFD+Cf3Tw2580eGniw4QDWA3X5k0c y+IXIMi4RdtY3LX9cw4ZUZ8B88FxPRvqBf7lExNmMyoJRG+epeAW3rdYuvKSc2YkhmlH +rOg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=content-transfer-encoding:mime-version:list-unsubscribe :list-subscribe:list-id:precedence:references:in-reply-to:message-id :date:subject:cc:to:from; bh=zcfFz8HFnvUpOiFYGhvPyWeZedxI5hzocPSu+DwRK00=; b=I97QmJ1qdZJBZIih6hPRtpuEuXHi7l9h62EGq8BZIZ2lbiew5rdvd5IThqN5OjsAMi PZ1HNVgV7XY+lB/P9DvfsZ/lYmxt/K9RwwxG0ODi/cuTRD4jFxoWhaxsLCMnjxDjGDZM lSCMhDY5kPKoHWfaGlycJXmUzbelmPGbSTSDc5RN0sED3RLTDoCUaoPxBt4nBTOHswOi ETKTa35cpdr4R/a6SQjHT0oYLQoaEt+Qn23CXU6tm8wCun9yOeVkizIo/VIT4UNy/sWd U7gTSWy4lhmohcX/mvH1qOHhKB7KzWqKDkzYCzCd6aupdLCQPwIcm/6FEqoMB1TeUdkQ qPfw== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of mptcp+bounces-2490-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 147.75.197.195 as permitted sender) smtp.mailfrom="mptcp+bounces-2490-wpasupplicant.patchew=gmail.com@lists.linux.dev"; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=intel.com Return-Path: Received: from ewr.edge.kernel.org (ewr.edge.kernel.org. [147.75.197.195]) by mx.google.com with ESMTPS id r18si1242471plr.160.2021.11.19.12.41.53 for (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Fri, 19 Nov 2021 12:41:53 -0800 (PST) Received-SPF: pass (google.com: domain of mptcp+bounces-2490-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 147.75.197.195 as permitted sender) client-ip=147.75.197.195; Authentication-Results: mx.google.com; spf=pass (google.com: domain of mptcp+bounces-2490-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 147.75.197.195 as permitted sender) smtp.mailfrom="mptcp+bounces-2490-wpasupplicant.patchew=gmail.com@lists.linux.dev"; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=intel.com Received: from smtp.subspace.kernel.org (wormhole.subspace.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ewr.edge.kernel.org (Postfix) with ESMTPS id E0A9F1C0F31 for ; Fri, 19 Nov 2021 20:41:52 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 4E5AF2C81; Fri, 19 Nov 2021 20:41:51 +0000 (UTC) X-Original-To: mptcp@lists.linux.dev Received: from mga06.intel.com (mga06.intel.com [134.134.136.31]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 21B862C8B for ; Fri, 19 Nov 2021 20:41:50 +0000 (UTC) X-IronPort-AV: E=McAfee;i="6200,9189,10173"; a="295303541" X-IronPort-AV: E=Sophos;i="5.87,248,1631602800"; d="scan'208";a="295303541" Received: from fmsmga007.fm.intel.com ([10.253.24.52]) by orsmga104.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 19 Nov 2021 12:41:49 -0800 X-IronPort-AV: E=Sophos;i="5.87,248,1631602800"; d="scan'208";a="506889225" Received: from mjmartin-desk2.amr.corp.intel.com (HELO mjmartin-desk2.intel.com) ([10.209.14.166]) by fmsmga007-auth.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 19 Nov 2021 12:41:48 -0800 From: Mat Martineau To: netdev@vger.kernel.org Cc: Florian Westphal , davem@davemloft.net, kuba@kernel.org, matthieu.baerts@tessares.net, mptcp@lists.linux.dev, Mat Martineau Subject: [PATCH net-next 3/4] mptcp: sockopt: add SOL_IP freebind & transparent options Date: Fri, 19 Nov 2021 12:41:36 -0800 Message-Id: <20211119204137.415733-4-mathew.j.martineau@linux.intel.com> X-Mailer: git-send-email 2.34.0 In-Reply-To: <20211119204137.415733-1-mathew.j.martineau@linux.intel.com> References: <20211119204137.415733-1-mathew.j.martineau@linux.intel.com> Precedence: bulk X-Mailing-List: mptcp@lists.linux.dev List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: Florian Westphal These options also need to be set before bind, so do the sync of msk to new ssk socket a bit earlier. Signed-off-by: Florian Westphal Signed-off-by: Mat Martineau --- net/mptcp/sockopt.c | 66 ++++++++++++++++++++++++++++++++++++++++++++- net/mptcp/subflow.c | 3 ++- 2 files changed, 67 insertions(+), 2 deletions(-) diff --git a/net/mptcp/sockopt.c b/net/mptcp/sockopt.c index b452571e8d9b..fb43e145cb57 100644 --- a/net/mptcp/sockopt.c +++ b/net/mptcp/sockopt.c @@ -390,6 +390,8 @@ static int mptcp_setsockopt_v6(struct mptcp_sock *msk, = int optname, =20 switch (optname) { case IPV6_V6ONLY: + case IPV6_TRANSPARENT: + case IPV6_FREEBIND: lock_sock(sk); ssock =3D __mptcp_nmpc_socket(msk); if (!ssock) { @@ -398,8 +400,24 @@ static int mptcp_setsockopt_v6(struct mptcp_sock *msk,= int optname, } =20 ret =3D tcp_setsockopt(ssock->sk, SOL_IPV6, optname, optval, optlen); - if (ret =3D=3D 0) + if (ret !=3D 0) { + release_sock(sk); + return ret; + } + + sockopt_seq_inc(msk); + + switch (optname) { + case IPV6_V6ONLY: sk->sk_ipv6only =3D ssock->sk->sk_ipv6only; + break; + case IPV6_TRANSPARENT: + inet_sk(sk)->transparent =3D inet_sk(ssock->sk)->transparent; + break; + case IPV6_FREEBIND: + inet_sk(sk)->freebind =3D inet_sk(ssock->sk)->freebind; + break; + } =20 release_sock(sk); break; @@ -598,6 +616,46 @@ static int mptcp_setsockopt_sol_tcp_congestion(struct = mptcp_sock *msk, sockptr_t return ret; } =20 +static int mptcp_setsockopt_sol_ip_set_transparent(struct mptcp_sock *msk,= int optname, + sockptr_t optval, unsigned int optlen) +{ + struct sock *sk =3D (struct sock *)msk; + struct inet_sock *issk; + struct socket *ssock; + int err; + + err =3D ip_setsockopt(sk, SOL_IP, optname, optval, optlen); + if (err !=3D 0) + return err; + + lock_sock(sk); + + ssock =3D __mptcp_nmpc_socket(msk); + if (!ssock) { + release_sock(sk); + return -EINVAL; + } + + issk =3D inet_sk(ssock->sk); + + switch (optname) { + case IP_FREEBIND: + issk->freebind =3D inet_sk(sk)->freebind; + break; + case IP_TRANSPARENT: + issk->transparent =3D inet_sk(sk)->transparent; + break; + default: + release_sock(sk); + WARN_ON_ONCE(1); + return -EOPNOTSUPP; + } + + sockopt_seq_inc(msk); + release_sock(sk); + return 0; +} + static int mptcp_setsockopt_v4_set_tos(struct mptcp_sock *msk, int optname, sockptr_t optval, unsigned int optlen) { @@ -627,6 +685,9 @@ static int mptcp_setsockopt_v4(struct mptcp_sock *msk, = int optname, sockptr_t optval, unsigned int optlen) { switch (optname) { + case IP_FREEBIND: + case IP_TRANSPARENT: + return mptcp_setsockopt_sol_ip_set_transparent(msk, optname, optval, opt= len); case IP_TOS: return mptcp_setsockopt_v4_set_tos(msk, optname, optval, optlen); } @@ -1068,6 +1129,9 @@ static void sync_socket_options(struct mptcp_sock *ms= k, struct sock *ssk) =20 if (inet_csk(sk)->icsk_ca_ops !=3D inet_csk(ssk)->icsk_ca_ops) tcp_set_congestion_control(ssk, msk->ca_name, false, true); + + inet_sk(ssk)->transparent =3D inet_sk(sk)->transparent; + inet_sk(ssk)->freebind =3D inet_sk(sk)->freebind; } =20 static void __mptcp_sockopt_sync(struct mptcp_sock *msk, struct sock *ssk) diff --git a/net/mptcp/subflow.c b/net/mptcp/subflow.c index 49787a1d7b34..b8dd3441f7d0 100644 --- a/net/mptcp/subflow.c +++ b/net/mptcp/subflow.c @@ -1425,6 +1425,8 @@ int __mptcp_subflow_connect(struct sock *sk, const st= ruct mptcp_addr_info *loc, if (addr.ss_family =3D=3D AF_INET6) addrlen =3D sizeof(struct sockaddr_in6); #endif + mptcp_sockopt_sync(msk, ssk); + ssk->sk_bound_dev_if =3D ifindex; err =3D kernel_bind(sf, (struct sockaddr *)&addr, addrlen); if (err) @@ -1441,7 +1443,6 @@ int __mptcp_subflow_connect(struct sock *sk, const st= ruct mptcp_addr_info *loc, mptcp_info2sockaddr(remote, &addr, ssk->sk_family); =20 mptcp_add_pending_subflow(msk, subflow); - mptcp_sockopt_sync(msk, ssk); err =3D kernel_connect(sf, (struct sockaddr *)&addr, addrlen, O_NONBLOCK); if (err && err !=3D -EINPROGRESS) goto failed_unlink; --=20 2.34.0