From nobody Sun May 5 11:03:32 2024 Delivered-To: wpasupplicant.patchew@gmail.com Received: by 2002:a02:cbb9:0:0:0:0:0 with SMTP id v25csp1110585jap; Fri, 3 Dec 2021 14:35:52 -0800 (PST) X-Google-Smtp-Source: ABdhPJx8WQnwQxBiOe7sOvN3K5mL7MQI5hzlarhmjtc4HexuaNlCXa53mier4Q42w9nMm0AS0UDu X-Received: by 2002:aa7:8d0a:0:b0:4a2:82d7:1695 with SMTP id j10-20020aa78d0a000000b004a282d71695mr22331707pfe.86.1638570952193; Fri, 03 Dec 2021 14:35:52 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1638570952; cv=none; d=google.com; s=arc-20160816; b=hmFuZLlT3pN2s00bO0pL6ttLap+sLO6Thflt5j4r9JmicpaglUUytlJwjTgm1+3IEp 23/osp7ZJKH0+LS1EZq4iAFlsPfHCIGG1XMeW0iZzlW1os2xQTZKbd8N5v2VgQEPmieR 29Fqx3CGhRgXlvfCQ0IvWcEkaSxUewNRNqj3dOzJWdSvmEPHt0j7AZcPvuBQcBSJI2d7 exU+4njKR29xAd50YsIbuuY8nyT6aFETW/nJ94m95PIw/bBWNQK0DmmKUGS1NqSwgbxl +e1FjKc0ecUTh5/SHc0NQYGoeWbhTmWRzXVkW+lPMP3P9/WSKgWDewmHrFM+hRqMBWlC u6tg== 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=mttM59rcqeZUId/wy6aXmj6uOZJFXcXvZ6j83rkTuUs=; b=LZkAzcfKxjC88E53dmQb7aDlc3rCh/uIfO1NJAQCSrN2yFsnUFFKYKkbJ7dcvhDvk/ mM2VEa4KcaVhjNOjNQAex8A4IU85vdWKvVKFa32N/rgXfbd4WfanYI7GqMLTrZdyaEvF ALuZ7t6EXtqQb7oVCdtaoYYN0EWjOG8VKcwlgqqqhBva0hMhprG+PNNhN1pPxiKSe+PP pITJjbTGAUmSveXwcRkwvSJPCkn0xNVOPv8g0DK5JS+flbRA1OO/iZU2MFITwArCW8vv 1U/iUpCoyFPhXQX7/NtbHwebq63tI8HcdJa16Th0Zzxau6WMi6wkXN68njaEBBy+1zfE hAbg== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of mptcp+bounces-2625-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 2604:1380:1000:8100::1 as permitted sender) smtp.mailfrom="mptcp+bounces-2625-wpasupplicant.patchew=gmail.com@lists.linux.dev"; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=intel.com Return-Path: Received: from sjc.edge.kernel.org (sjc.edge.kernel.org. [2604:1380:1000:8100::1]) by mx.google.com with ESMTPS id u12si470737plr.57.2021.12.03.14.35.52 for (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Fri, 03 Dec 2021 14:35:52 -0800 (PST) Received-SPF: pass (google.com: domain of mptcp+bounces-2625-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 2604:1380:1000:8100::1 as permitted sender) client-ip=2604:1380:1000:8100::1; Authentication-Results: mx.google.com; spf=pass (google.com: domain of mptcp+bounces-2625-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 2604:1380:1000:8100::1 as permitted sender) smtp.mailfrom="mptcp+bounces-2625-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 sjc.edge.kernel.org (Postfix) with ESMTPS id D9F0E3E0EBF for ; Fri, 3 Dec 2021 22:35:51 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 65B2B2CAB; Fri, 3 Dec 2021 22:35:50 +0000 (UTC) X-Original-To: mptcp@lists.linux.dev Received: from mga04.intel.com (mga04.intel.com [192.55.52.120]) (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 AF83429CA for ; Fri, 3 Dec 2021 22:35:48 +0000 (UTC) X-IronPort-AV: E=McAfee;i="6200,9189,10187"; a="235802939" X-IronPort-AV: E=Sophos;i="5.87,284,1631602800"; d="scan'208";a="235802939" Received: from orsmga003.jf.intel.com ([10.7.209.27]) by fmsmga104.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 03 Dec 2021 14:35:47 -0800 X-IronPort-AV: E=Sophos;i="5.87,284,1631602800"; d="scan'208";a="460185303" Received: from mjmartin-desk2.amr.corp.intel.com (HELO mjmartin-desk2.intel.com) ([10.251.18.88]) by orsmga003-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 03 Dec 2021 14:35:47 -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 01/10] mptcp: add TCP_INQ cmsg support Date: Fri, 3 Dec 2021 14:35:32 -0800 Message-Id: <20211203223541.69364-2-mathew.j.martineau@linux.intel.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20211203223541.69364-1-mathew.j.martineau@linux.intel.com> References: <20211203223541.69364-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 Support the TCP_INQ setsockopt. This is a boolean that tells recvmsg path to include the remaining in-sequence bytes in the cmsg data. v2: do not use CB(skb)->offset, increment map_seq instead (Paolo Abeni) v3: adjust CB(skb)->map_seq when taking skb from ofo queue (Paolo Abeni) Closes: https://github.com/multipath-tcp/mptcp_net-next/issues/224 Signed-off-by: Florian Westphal Signed-off-by: Mat Martineau --- net/mptcp/protocol.c | 36 +++++++++++++++++++++++++++++++++++- net/mptcp/protocol.h | 1 + net/mptcp/sockopt.c | 38 +++++++++++++++++++++++++++++++++++++- 3 files changed, 73 insertions(+), 2 deletions(-) diff --git a/net/mptcp/protocol.c b/net/mptcp/protocol.c index b100048e43fe..ffc8068aaad0 100644 --- a/net/mptcp/protocol.c +++ b/net/mptcp/protocol.c @@ -46,6 +46,7 @@ struct mptcp_skb_cb { =20 enum { MPTCP_CMSG_TS =3D BIT(0), + MPTCP_CMSG_INQ =3D BIT(1), }; =20 static struct percpu_counter mptcp_sockets_allocated ____cacheline_aligned= _in_smp; @@ -738,6 +739,7 @@ static bool __mptcp_ofo_queue(struct mptcp_sock *msk) MPTCP_SKB_CB(skb)->map_seq, msk->ack_seq, delta); MPTCP_SKB_CB(skb)->offset +=3D delta; + MPTCP_SKB_CB(skb)->map_seq +=3D delta; __skb_queue_tail(&sk->sk_receive_queue, skb); } msk->ack_seq =3D end_seq; @@ -1784,8 +1786,10 @@ static int __mptcp_recvmsg_mskq(struct mptcp_sock *m= sk, copied +=3D count; =20 if (count < data_len) { - if (!(flags & MSG_PEEK)) + if (!(flags & MSG_PEEK)) { MPTCP_SKB_CB(skb)->offset +=3D count; + MPTCP_SKB_CB(skb)->map_seq +=3D count; + } break; } =20 @@ -1965,6 +1969,27 @@ static bool __mptcp_move_skbs(struct mptcp_sock *msk) return !skb_queue_empty(&msk->receive_queue); } =20 +static unsigned int mptcp_inq_hint(const struct sock *sk) +{ + const struct mptcp_sock *msk =3D mptcp_sk(sk); + const struct sk_buff *skb; + + skb =3D skb_peek(&msk->receive_queue); + if (skb) { + u64 hint_val =3D msk->ack_seq - MPTCP_SKB_CB(skb)->map_seq; + + if (hint_val >=3D INT_MAX) + return INT_MAX; + + return (unsigned int)hint_val; + } + + if (sk->sk_state =3D=3D TCP_CLOSE || (sk->sk_shutdown & RCV_SHUTDOWN)) + return 1; + + return 0; +} + static int mptcp_recvmsg(struct sock *sk, struct msghdr *msg, size_t len, int nonblock, int flags, int *addr_len) { @@ -1989,6 +2014,9 @@ static int mptcp_recvmsg(struct sock *sk, struct msgh= dr *msg, size_t len, len =3D min_t(size_t, len, INT_MAX); target =3D sock_rcvlowat(sk, flags & MSG_WAITALL, len); =20 + if (unlikely(msk->recvmsg_inq)) + cmsg_flags =3D MPTCP_CMSG_INQ; + while (copied < len) { int bytes_read; =20 @@ -2062,6 +2090,12 @@ static int mptcp_recvmsg(struct sock *sk, struct msg= hdr *msg, size_t len, if (cmsg_flags && copied >=3D 0) { if (cmsg_flags & MPTCP_CMSG_TS) tcp_recv_timestamp(msg, sk, &tss); + + if (cmsg_flags & MPTCP_CMSG_INQ) { + unsigned int inq =3D mptcp_inq_hint(sk); + + put_cmsg(msg, SOL_TCP, TCP_CM_INQ, sizeof(inq), &inq); + } } =20 pr_debug("msk=3D%p rx queue empty=3D%d:%d copied=3D%d", diff --git a/net/mptcp/protocol.h b/net/mptcp/protocol.h index d87cc040352e..bb51fa7f5566 100644 --- a/net/mptcp/protocol.h +++ b/net/mptcp/protocol.h @@ -249,6 +249,7 @@ struct mptcp_sock { bool rcv_fastclose; bool use_64bit_ack; /* Set when we received a 64-bit DSN */ bool csum_enabled; + u8 recvmsg_inq:1; spinlock_t join_list_lock; struct work_struct work; struct sk_buff *ooo_last_skb; diff --git a/net/mptcp/sockopt.c b/net/mptcp/sockopt.c index fb43e145cb57..11cda8629993 100644 --- a/net/mptcp/sockopt.c +++ b/net/mptcp/sockopt.c @@ -557,6 +557,7 @@ static bool mptcp_supported_sockopt(int level, int optn= ame) case TCP_TIMESTAMP: case TCP_NOTSENT_LOWAT: case TCP_TX_DELAY: + case TCP_INQ: return true; } =20 @@ -568,7 +569,6 @@ static bool mptcp_supported_sockopt(int level, int optn= ame) /* TCP_FASTOPEN_KEY, TCP_FASTOPEN TCP_FASTOPEN_CONNECT, TCP_FASTOPEN_NO_= COOKIE, * are not supported fastopen is currently unsupported */ - /* TCP_INQ is currently unsupported, needs some recvmsg work */ } return false; } @@ -698,7 +698,21 @@ static int mptcp_setsockopt_v4(struct mptcp_sock *msk,= int optname, static int mptcp_setsockopt_sol_tcp(struct mptcp_sock *msk, int optname, sockptr_t optval, unsigned int optlen) { + struct sock *sk =3D (void *)msk; + int ret, val; + switch (optname) { + case TCP_INQ: + ret =3D mptcp_get_int_option(msk, optval, optlen, &val); + if (ret) + return ret; + if (val < 0 || val > 1) + return -EINVAL; + + lock_sock(sk); + msk->recvmsg_inq =3D !!val; + release_sock(sk); + return 0; case TCP_ULP: return -EOPNOTSUPP; case TCP_CONGESTION: @@ -1032,6 +1046,26 @@ static int mptcp_getsockopt_subflow_addrs(struct mpt= cp_sock *msk, char __user *o return 0; } =20 +static int mptcp_put_int_option(struct mptcp_sock *msk, char __user *optva= l, + int __user *optlen, int val) +{ + int len; + + if (get_user(len, optlen)) + return -EFAULT; + + len =3D min_t(unsigned int, len, sizeof(int)); + if (len < 0) + return -EINVAL; + + if (put_user(len, optlen)) + return -EFAULT; + if (copy_to_user(optval, &val, len)) + return -EFAULT; + + return 0; +} + static int mptcp_getsockopt_sol_tcp(struct mptcp_sock *msk, int optname, char __user *optval, int __user *optlen) { @@ -1042,6 +1076,8 @@ static int mptcp_getsockopt_sol_tcp(struct mptcp_sock= *msk, int optname, case TCP_CC_INFO: return mptcp_getsockopt_first_sf_only(msk, SOL_TCP, optname, optval, optlen); + case TCP_INQ: + return mptcp_put_int_option(msk, optval, optlen, msk->recvmsg_inq); } return -EOPNOTSUPP; } --=20 2.34.1 From nobody Sun May 5 11:03:32 2024 Delivered-To: wpasupplicant.patchew@gmail.com Received: by 2002:a02:cbb9:0:0:0:0:0 with SMTP id v25csp1110609jap; Fri, 3 Dec 2021 14:35:53 -0800 (PST) X-Google-Smtp-Source: ABdhPJwaSpvNKXdWB14MRex3YOzJQHbq4Hip2J4BUXQeFvBylmX3nL+wiX8ekfGIS2igT8ZPc/zT X-Received: by 2002:a62:16c7:0:b0:49f:a6cc:c77d with SMTP id 190-20020a6216c7000000b0049fa6ccc77dmr20853772pfw.23.1638570953467; Fri, 03 Dec 2021 14:35:53 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1638570953; cv=none; d=google.com; s=arc-20160816; b=0ulbtU/1GcQmQGcpHhTAUyBXtboUDdt+eiYLn1evhxzmXqmfL7/AJiiHJVSF3InyxM r1bVVJ0rPJvmNDI3qJJeW4tIxVVp3ZZpT1wEOXak0MmAfquzVPFQa7M9sJ9ZXjkAmNcW Zl1Vm6vdqHiUWXF9/kx6cCrauUtRRMYahl7BCmOHUrR+kK08rkX4MsSGAZl1j4LHDzqq bgPomoTtl5Jgb+2wCUZDw8X4WIwy2CwNB4Fbva8W461yBije8AOPRFvZWQTLG3NGXcIO bPVEzeFnJEI1yNkp9tkTWT9VbpDXU/Ir3Zuj157IJFJMwsjcrARqrCi3EEbnQNzF6+kn iBgA== 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=epAAJVVTar7Cuc++U2Vr1tL5uIrzFGu2zYowD4i3YTs=; b=LABBfcrX+2Q2GqfQdYWv89wJJz7mvCo/pufq9HM0P1r4v2paG60cRBVfqWCJug6eWK +a4orCORYOjgSOVcRggTyEg87LE4VEkP1AQ9qxJq+xRf5Y+a08OnHd7kvd5wFk21l3gZ hYYDtFZBhcUPVRG8OHvnHBwirlHSjS/FaXoXtvlnm+J+b1DQzW5KyrzN++36HxCFE1gv fz23YDoytoVvficTaDwziHhZh8A0FS5VuHjFcjM9JtZxDBsb2nw87eCAFtaV29SlWe8z RTuVb91ZRzxxuUqCkD1i5A7oE468OKAFAjwnc2JmKYYKRwaEX1s+zy9zGeUb+SNIkOqz OUDw== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of mptcp+bounces-2626-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 147.75.69.165 as permitted sender) smtp.mailfrom="mptcp+bounces-2626-wpasupplicant.patchew=gmail.com@lists.linux.dev"; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=intel.com Return-Path: Received: from sjc.edge.kernel.org (sjc.edge.kernel.org. [147.75.69.165]) by mx.google.com with ESMTPS id w15si4779577pfc.130.2021.12.03.14.35.53 for (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Fri, 03 Dec 2021 14:35:53 -0800 (PST) Received-SPF: pass (google.com: domain of mptcp+bounces-2626-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 147.75.69.165 as permitted sender) client-ip=147.75.69.165; Authentication-Results: mx.google.com; spf=pass (google.com: domain of mptcp+bounces-2626-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 147.75.69.165 as permitted sender) smtp.mailfrom="mptcp+bounces-2626-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 sjc.edge.kernel.org (Postfix) with ESMTPS id E6BC83E0F76 for ; Fri, 3 Dec 2021 22:35:52 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id C10302CAD; Fri, 3 Dec 2021 22:35:50 +0000 (UTC) X-Original-To: mptcp@lists.linux.dev Received: from mga04.intel.com (mga04.intel.com [192.55.52.120]) (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 9AFE32CA8 for ; Fri, 3 Dec 2021 22:35:49 +0000 (UTC) X-IronPort-AV: E=McAfee;i="6200,9189,10187"; a="235802941" X-IronPort-AV: E=Sophos;i="5.87,284,1631602800"; d="scan'208";a="235802941" Received: from orsmga003.jf.intel.com ([10.7.209.27]) by fmsmga104.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 03 Dec 2021 14:35:47 -0800 X-IronPort-AV: E=Sophos;i="5.87,284,1631602800"; d="scan'208";a="460185304" Received: from mjmartin-desk2.amr.corp.intel.com (HELO mjmartin-desk2.intel.com) ([10.251.18.88]) by orsmga003-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 03 Dec 2021 14:35:47 -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 02/10] selftests: mptcp: add TCP_INQ support Date: Fri, 3 Dec 2021 14:35:33 -0800 Message-Id: <20211203223541.69364-3-mathew.j.martineau@linux.intel.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20211203223541.69364-1-mathew.j.martineau@linux.intel.com> References: <20211203223541.69364-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 Do checks on the returned inq counter. Fail on: 1. Huge value (> 1 kbyte, test case files are 1 kb) 2. last hint larger than returned bytes when read was short 3. erronenous indication of EOF. 3) happens when a hint of X bytes reads X-1 on next call but next recvmsg returns more data (instead of EOF). Signed-off-by: Florian Westphal Signed-off-by: Mat Martineau --- .../selftests/net/mptcp/mptcp_connect.c | 60 ++++++++++++++++++- .../selftests/net/mptcp/mptcp_sockopt.sh | 4 +- 2 files changed, 61 insertions(+), 3 deletions(-) diff --git a/tools/testing/selftests/net/mptcp/mptcp_connect.c b/tools/test= ing/selftests/net/mptcp/mptcp_connect.c index ada9b80774d4..98de28ac3ba8 100644 --- a/tools/testing/selftests/net/mptcp/mptcp_connect.c +++ b/tools/testing/selftests/net/mptcp/mptcp_connect.c @@ -73,12 +73,20 @@ static uint32_t cfg_mark; struct cfg_cmsg_types { unsigned int cmsg_enabled:1; unsigned int timestampns:1; + unsigned int tcp_inq:1; }; =20 struct cfg_sockopt_types { unsigned int transparent:1; }; =20 +struct tcp_inq_state { + unsigned int last; + bool expect_eof; +}; + +static struct tcp_inq_state tcp_inq; + static struct cfg_cmsg_types cfg_cmsg_types; static struct cfg_sockopt_types cfg_sockopt_types; =20 @@ -389,7 +397,9 @@ static size_t do_write(const int fd, char *buf, const s= ize_t len) static void process_cmsg(struct msghdr *msgh) { struct __kernel_timespec ts; + bool inq_found =3D false; bool ts_found =3D false; + unsigned int inq =3D 0; struct cmsghdr *cmsg; =20 for (cmsg =3D CMSG_FIRSTHDR(msgh); cmsg ; cmsg =3D CMSG_NXTHDR(msgh, cmsg= )) { @@ -398,12 +408,27 @@ static void process_cmsg(struct msghdr *msgh) ts_found =3D true; continue; } + if (cmsg->cmsg_level =3D=3D IPPROTO_TCP && cmsg->cmsg_type =3D=3D TCP_CM= _INQ) { + memcpy(&inq, CMSG_DATA(cmsg), sizeof(inq)); + inq_found =3D true; + continue; + } + } =20 if (cfg_cmsg_types.timestampns) { if (!ts_found) xerror("TIMESTAMPNS not present\n"); } + + if (cfg_cmsg_types.tcp_inq) { + if (!inq_found) + xerror("TCP_INQ not present\n"); + + if (inq > 1024) + xerror("tcp_inq %u is larger than one kbyte\n", inq); + tcp_inq.last =3D inq; + } } =20 static ssize_t do_recvmsg_cmsg(const int fd, char *buf, const size_t len) @@ -420,10 +445,23 @@ static ssize_t do_recvmsg_cmsg(const int fd, char *bu= f, const size_t len) .msg_controllen =3D sizeof(msg_buf), }; int flags =3D 0; + unsigned int last_hint =3D tcp_inq.last; int ret =3D recvmsg(fd, &msg, flags); =20 - if (ret <=3D 0) + if (ret <=3D 0) { + if (ret =3D=3D 0 && tcp_inq.expect_eof) + return ret; + + if (ret =3D=3D 0 && cfg_cmsg_types.tcp_inq) + if (last_hint !=3D 1 && last_hint !=3D 0) + xerror("EOF but last tcp_inq hint was %u\n", last_hint); + return ret; + } + + if (tcp_inq.expect_eof) + xerror("expected EOF, last_hint %u, now %u\n", + last_hint, tcp_inq.last); =20 if (msg.msg_controllen && !cfg_cmsg_types.cmsg_enabled) xerror("got %lu bytes of cmsg data, expected 0\n", @@ -435,6 +473,19 @@ static ssize_t do_recvmsg_cmsg(const int fd, char *buf= , const size_t len) if (msg.msg_controllen) process_cmsg(&msg); =20 + if (cfg_cmsg_types.tcp_inq) { + if ((size_t)ret < len && last_hint > (unsigned int)ret) { + if (ret + 1 !=3D (int)last_hint) { + int next =3D read(fd, msg_buf, sizeof(msg_buf)); + + xerror("read %u of %u, last_hint was %u tcp_inq hint now %u next_read = returned %d/%m\n", + ret, (unsigned int)len, last_hint, tcp_inq.last, next); + } else { + tcp_inq.expect_eof =3D true; + } + } + } + return ret; } =20 @@ -944,6 +995,8 @@ static void apply_cmsg_types(int fd, const struct cfg_c= msg_types *cmsg) =20 if (cmsg->timestampns) xsetsockopt(fd, SOL_SOCKET, SO_TIMESTAMPNS_NEW, &on, sizeof(on)); + if (cmsg->tcp_inq) + xsetsockopt(fd, IPPROTO_TCP, TCP_INQ, &on, sizeof(on)); } =20 static void parse_cmsg_types(const char *type) @@ -965,6 +1018,11 @@ static void parse_cmsg_types(const char *type) return; } =20 + if (strncmp(type, "TCPINQ", len) =3D=3D 0) { + cfg_cmsg_types.tcp_inq =3D 1; + return; + } + fprintf(stderr, "Unrecognized cmsg option %s\n", type); exit(1); } diff --git a/tools/testing/selftests/net/mptcp/mptcp_sockopt.sh b/tools/tes= ting/selftests/net/mptcp/mptcp_sockopt.sh index 41de643788b8..c8c364369599 100755 --- a/tools/testing/selftests/net/mptcp/mptcp_sockopt.sh +++ b/tools/testing/selftests/net/mptcp/mptcp_sockopt.sh @@ -178,7 +178,7 @@ do_transfer() =20 timeout ${timeout_test} \ ip netns exec ${listener_ns} \ - $mptcp_connect -t ${timeout_poll} -l -M 1 -p $port -s ${srv_proto} -c T= IMESTAMPNS \ + $mptcp_connect -t ${timeout_poll} -l -M 1 -p $port -s ${srv_proto} -c T= IMESTAMPNS,TCPINQ \ ${local_addr} < "$sin" > "$sout" & spid=3D$! =20 @@ -186,7 +186,7 @@ do_transfer() =20 timeout ${timeout_test} \ ip netns exec ${connector_ns} \ - $mptcp_connect -t ${timeout_poll} -M 2 -p $port -s ${cl_proto} -c TIMES= TAMPNS \ + $mptcp_connect -t ${timeout_poll} -M 2 -p $port -s ${cl_proto} -c TIMES= TAMPNS,TCPINQ \ $connect_addr < "$cin" > "$cout" & =20 cpid=3D$! --=20 2.34.1 From nobody Sun May 5 11:03:32 2024 Delivered-To: wpasupplicant.patchew@gmail.com Received: by 2002:a02:cbb9:0:0:0:0:0 with SMTP id v25csp1110624jap; Fri, 3 Dec 2021 14:35:54 -0800 (PST) X-Google-Smtp-Source: ABdhPJxKQf3nwQxnHwvz13vQ9TL/dZ0rkSY9XvEM+TJC7sl/Lw55+rZSq8bGfTz/LhZdN4a3M3WZ X-Received: by 2002:ac8:4d87:: with SMTP id a7mr23727569qtw.410.1638570954816; Fri, 03 Dec 2021 14:35:54 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1638570954; cv=none; d=google.com; s=arc-20160816; b=jdUo/+3CN1wqudADA/A4dhzsV6ugSs2X2/q27M5HJDr1mNXU3Qs2Zl3albGlAlwSC5 Ngc/bYTcaWxDqxWEoQW3U5+EJh6hobagdDo70vihwynFrn5JgwV5VziAEYyHH8YyS5lp MQzWlurW2TfUEhyDp3kS4Enn1AYRY265Lj2lrnFYfXyPpP7XYMVh4FRljYeUYJFg4tUS kJZ1MM4QTLGpY8iHS4yTQ7mHfMQpkDR/Xy57VoyAYEDUvohuf7LFASD8TThM26LhBUTr LLk3tyv+3Dg333G3QYtdnE1tbuU+mj7pciOXvAyEfZWDyHhUZ1z2RLzw5J3ZkoSn1skm AsEw== 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=k1yBghti5p5mqzq3o9gZIONElVXqX9iyU1Ukzbmgy7I=; b=F7m7HaTpQPzF2PXqoB9PiPcey7h1Yk+VWbnTSsD23qPQliEL/pIZGhbbvvDcANr2yt ViZ9U6hbBdsVTfgAQCB5A+kbSmPuRvHsu2BpL8UJRwn6n3Ld3P5Wrs22+Cg1oVZFQdUk FBEYqVMLKJaj66BMqSnPq2HsMzN+UvZ2YRW80Tsl3gwLmYmWPunuiAUfS3M6mXJXXka2 3CxFt1vh1kGPGikXLzYnEqgdb1nHvbJ94FVc2iDV2W5F4zSiydLItnuDgjdzBu9iyCyO L1fe9Y8NYlPfpGaCOd5xggvjc3ZAjrTnuqptxSYqDii0wRJ9RhqLjQyRRpPvLvUEDrTC 43tw== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of mptcp+bounces-2627-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 2604:1380:1:3600::1 as permitted sender) smtp.mailfrom="mptcp+bounces-2627-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. [2604:1380:1:3600::1]) by mx.google.com with ESMTPS id d14si4524732qtx.484.2021.12.03.14.35.54 for (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Fri, 03 Dec 2021 14:35:54 -0800 (PST) Received-SPF: pass (google.com: domain of mptcp+bounces-2627-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 2604:1380:1:3600::1 as permitted sender) client-ip=2604:1380:1:3600::1; Authentication-Results: mx.google.com; spf=pass (google.com: domain of mptcp+bounces-2627-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 2604:1380:1:3600::1 as permitted sender) smtp.mailfrom="mptcp+bounces-2627-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 605F91C0E5C for ; Fri, 3 Dec 2021 22:35:54 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 6D1672CAE; Fri, 3 Dec 2021 22:35:51 +0000 (UTC) X-Original-To: mptcp@lists.linux.dev Received: from mga04.intel.com (mga04.intel.com [192.55.52.120]) (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 CF48B2C9D for ; Fri, 3 Dec 2021 22:35:49 +0000 (UTC) X-IronPort-AV: E=McAfee;i="6200,9189,10187"; a="235802942" X-IronPort-AV: E=Sophos;i="5.87,284,1631602800"; d="scan'208";a="235802942" Received: from orsmga003.jf.intel.com ([10.7.209.27]) by fmsmga104.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 03 Dec 2021 14:35:47 -0800 X-IronPort-AV: E=Sophos;i="5.87,284,1631602800"; d="scan'208";a="460185306" Received: from mjmartin-desk2.amr.corp.intel.com (HELO mjmartin-desk2.intel.com) ([10.251.18.88]) by orsmga003-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 03 Dec 2021 14:35:47 -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 03/10] mptcp: add SIOCINQ, OUTQ and OUTQNSD ioctls Date: Fri, 3 Dec 2021 14:35:34 -0800 Message-Id: <20211203223541.69364-4-mathew.j.martineau@linux.intel.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20211203223541.69364-1-mathew.j.martineau@linux.intel.com> References: <20211203223541.69364-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 Allows to query in-sequence data ready for read(), total bytes in write queue and total bytes in write queue that have not yet been sent. v2: remove unneeded READ_ONCE() (Paolo Abeni) v3: check for new data unconditionally in SIOCINQ ioctl (Mat Martineau) Signed-off-by: Florian Westphal Signed-off-by: Mat Martineau --- net/mptcp/protocol.c | 53 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 53 insertions(+) diff --git a/net/mptcp/protocol.c b/net/mptcp/protocol.c index ffc8068aaad0..943f74e804bd 100644 --- a/net/mptcp/protocol.c +++ b/net/mptcp/protocol.c @@ -22,6 +22,7 @@ #endif #include #include +#include #include "protocol.h" #include "mib.h" =20 @@ -3211,6 +3212,57 @@ static int mptcp_forward_alloc_get(const struct sock= *sk) return sk->sk_forward_alloc + mptcp_sk(sk)->rmem_fwd_alloc; } =20 +static int mptcp_ioctl_outq(const struct mptcp_sock *msk, u64 v) +{ + const struct sock *sk =3D (void *)msk; + u64 delta; + + if (sk->sk_state =3D=3D TCP_LISTEN) + return -EINVAL; + + if ((1 << sk->sk_state) & (TCPF_SYN_SENT | TCPF_SYN_RECV)) + return 0; + + delta =3D msk->write_seq - v; + if (delta > INT_MAX) + delta =3D INT_MAX; + + return (int)delta; +} + +static int mptcp_ioctl(struct sock *sk, int cmd, unsigned long arg) +{ + struct mptcp_sock *msk =3D mptcp_sk(sk); + bool slow; + int answ; + + switch (cmd) { + case SIOCINQ: + if (sk->sk_state =3D=3D TCP_LISTEN) + return -EINVAL; + + lock_sock(sk); + __mptcp_move_skbs(msk); + answ =3D mptcp_inq_hint(sk); + release_sock(sk); + break; + case SIOCOUTQ: + slow =3D lock_sock_fast(sk); + answ =3D mptcp_ioctl_outq(msk, READ_ONCE(msk->snd_una)); + unlock_sock_fast(sk, slow); + break; + case SIOCOUTQNSD: + slow =3D lock_sock_fast(sk); + answ =3D mptcp_ioctl_outq(msk, msk->snd_nxt); + unlock_sock_fast(sk, slow); + break; + default: + return -ENOIOCTLCMD; + } + + return put_user(answ, (int __user *)arg); +} + static struct proto mptcp_prot =3D { .name =3D "MPTCP", .owner =3D THIS_MODULE, @@ -3223,6 +3275,7 @@ static struct proto mptcp_prot =3D { .shutdown =3D mptcp_shutdown, .destroy =3D mptcp_destroy, .sendmsg =3D mptcp_sendmsg, + .ioctl =3D mptcp_ioctl, .recvmsg =3D mptcp_recvmsg, .release_cb =3D mptcp_release_cb, .hash =3D mptcp_hash, --=20 2.34.1 From nobody Sun May 5 11:03:32 2024 Delivered-To: wpasupplicant.patchew@gmail.com Received: by 2002:a02:cbb9:0:0:0:0:0 with SMTP id v25csp1110653jap; Fri, 3 Dec 2021 14:35:57 -0800 (PST) X-Google-Smtp-Source: ABdhPJwedcUzIkHKNT7YnS/4XbKF2aaHbij143jqBFMtMBtd9S0cf+H845XLo2InXAxuCUyVnUd2 X-Received: by 2002:a17:902:b588:b0:143:b732:834 with SMTP id a8-20020a170902b58800b00143b7320834mr26253141pls.22.1638570956879; Fri, 03 Dec 2021 14:35:56 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1638570956; cv=none; d=google.com; s=arc-20160816; b=0uUJdZnNm5t+zPDya8wJCq4bpN6YibLH42n9GejFN6g/bA/0zbzwvRPJ66dfWC+f8E GNy9j5j4i2ilxptt6TbPfHojlCjtIdWQSw6fv2qKZDDKqA5dimx7TlB9pQsmmN1/TFxt MWXo2ILsgDoWBRGSooF/2HJ0ApP228e5bT621Ip8Wd3bEkD/U4PX5r31errsWB66G2Ah st5z+vTea9lFPkJZKXNJs5l05Su3icJwEWNMZ538/4ekmaRJI0720kAaO70RasD9SCPj X0tuQmnxe1VHXSqTJ3/6t1pW1z7mCQuKZCn311/NsMpgMPM/KONhaWMfau7Ciu0zDsLE Nd5Q== 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=LGlfZAHbN8q+seL/szCkwRYZzUan4yFJkb99ueAuMYE=; b=wLZHig02k9MU42/LJOdjikNiy+RtAtFQlv8A17zFXcrUrvNxJK12jUyYy3AWDo33HK xbwF26Jz5uiSv6v+gepfep4j1Tq0DbaEHjfdjkpYQI4KDHMypQyh7Z2CrdWCO9Hz+RoY viyVpUC/PKSOcD46msxjlT0sB2XBsWTr8GG+ScJt/d5h6Ujakl6CrpAiJAF/0ZeBIEiA kJzz8yOfNpt/AuY/MO+v0wwmm8SCSlSR9mg6ZpaewX0j5X3xnDGDeOvZ0cZy0oJaVpxw bK0DtvgbhcyRFE6S6OBtzqgvtIYeQvYKl+WddfyYGYCJ/hZ3jGEXWkxrd+o2TT1Ubl9t PWiQ== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of mptcp+bounces-2629-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 147.75.69.165 as permitted sender) smtp.mailfrom="mptcp+bounces-2629-wpasupplicant.patchew=gmail.com@lists.linux.dev"; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=intel.com Return-Path: Received: from sjc.edge.kernel.org (sjc.edge.kernel.org. [147.75.69.165]) by mx.google.com with ESMTPS id v20si2772256plg.312.2021.12.03.14.35.56 for (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Fri, 03 Dec 2021 14:35:56 -0800 (PST) Received-SPF: pass (google.com: domain of mptcp+bounces-2629-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 147.75.69.165 as permitted sender) client-ip=147.75.69.165; Authentication-Results: mx.google.com; spf=pass (google.com: domain of mptcp+bounces-2629-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 147.75.69.165 as permitted sender) smtp.mailfrom="mptcp+bounces-2629-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 sjc.edge.kernel.org (Postfix) with ESMTPS id 627DE3E0F83 for ; Fri, 3 Dec 2021 22:35:56 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 0FF652CAF; Fri, 3 Dec 2021 22:35:52 +0000 (UTC) X-Original-To: mptcp@lists.linux.dev Received: from mga04.intel.com (mga04.intel.com [192.55.52.120]) (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 923242CAC for ; Fri, 3 Dec 2021 22:35:50 +0000 (UTC) X-IronPort-AV: E=McAfee;i="6200,9189,10187"; a="235802943" X-IronPort-AV: E=Sophos;i="5.87,284,1631602800"; d="scan'208";a="235802943" Received: from orsmga003.jf.intel.com ([10.7.209.27]) by fmsmga104.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 03 Dec 2021 14:35:47 -0800 X-IronPort-AV: E=Sophos;i="5.87,284,1631602800"; d="scan'208";a="460185308" Received: from mjmartin-desk2.amr.corp.intel.com (HELO mjmartin-desk2.intel.com) ([10.251.18.88]) by orsmga003-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 03 Dec 2021 14:35:47 -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 04/10] selftests: mptcp: add inq test case Date: Fri, 3 Dec 2021 14:35:35 -0800 Message-Id: <20211203223541.69364-5-mathew.j.martineau@linux.intel.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20211203223541.69364-1-mathew.j.martineau@linux.intel.com> References: <20211203223541.69364-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 client & server use a unix socket connection to communicate outside of the mptcp connection. This allows the consumer to know in advance how many bytes have been (or will be) sent by the peer. This allows stricter checks on the bytecounts reported by TCP_INQ cmsg. Suggested-by: Mat Martineau Signed-off-by: Florian Westphal Signed-off-by: Mat Martineau --- tools/testing/selftests/net/mptcp/.gitignore | 1 + tools/testing/selftests/net/mptcp/Makefile | 2 +- tools/testing/selftests/net/mptcp/mptcp_inq.c | 603 ++++++++++++++++++ .../selftests/net/mptcp/mptcp_sockopt.sh | 40 ++ 4 files changed, 645 insertions(+), 1 deletion(-) create mode 100644 tools/testing/selftests/net/mptcp/mptcp_inq.c diff --git a/tools/testing/selftests/net/mptcp/.gitignore b/tools/testing/s= elftests/net/mptcp/.gitignore index 7569d892967a..49daae73c41e 100644 --- a/tools/testing/selftests/net/mptcp/.gitignore +++ b/tools/testing/selftests/net/mptcp/.gitignore @@ -1,5 +1,6 @@ # SPDX-License-Identifier: GPL-2.0-only mptcp_connect +mptcp_inq mptcp_sockopt pm_nl_ctl *.pcap diff --git a/tools/testing/selftests/net/mptcp/Makefile b/tools/testing/sel= ftests/net/mptcp/Makefile index bbf4e448bad9..0356c4501c99 100644 --- a/tools/testing/selftests/net/mptcp/Makefile +++ b/tools/testing/selftests/net/mptcp/Makefile @@ -8,7 +8,7 @@ CFLAGS =3D -Wall -Wl,--no-as-needed -O2 -g -I$(top_srcdir= )/usr/include TEST_PROGS :=3D mptcp_connect.sh pm_netlink.sh mptcp_join.sh diag.sh \ simult_flows.sh mptcp_sockopt.sh =20 -TEST_GEN_FILES =3D mptcp_connect pm_nl_ctl mptcp_sockopt +TEST_GEN_FILES =3D mptcp_connect pm_nl_ctl mptcp_sockopt mptcp_inq =20 TEST_FILES :=3D settings =20 diff --git a/tools/testing/selftests/net/mptcp/mptcp_inq.c b/tools/testing/= selftests/net/mptcp/mptcp_inq.c new file mode 100644 index 000000000000..b8debd4fb5ed --- /dev/null +++ b/tools/testing/selftests/net/mptcp/mptcp_inq.c @@ -0,0 +1,603 @@ +// SPDX-License-Identifier: GPL-2.0 + +#define _GNU_SOURCE + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +#include +#include + +#include +#include + +#ifndef IPPROTO_MPTCP +#define IPPROTO_MPTCP 262 +#endif +#ifndef SOL_MPTCP +#define SOL_MPTCP 284 +#endif + +static int pf =3D AF_INET; +static int proto_tx =3D IPPROTO_MPTCP; +static int proto_rx =3D IPPROTO_MPTCP; + +static void die_perror(const char *msg) +{ + perror(msg); + exit(1); +} + +static void die_usage(int r) +{ + fprintf(stderr, "Usage: mptcp_inq [-6] [ -t tcp|mptcp ] [ -r tcp|mptcp]\n= "); + exit(r); +} + +static void xerror(const char *fmt, ...) +{ + va_list ap; + + va_start(ap, fmt); + vfprintf(stderr, fmt, ap); + va_end(ap); + fputc('\n', stderr); + exit(1); +} + +static const char *getxinfo_strerr(int err) +{ + if (err =3D=3D EAI_SYSTEM) + return strerror(errno); + + return gai_strerror(err); +} + +static void xgetaddrinfo(const char *node, const char *service, + const struct addrinfo *hints, + struct addrinfo **res) +{ + int err =3D getaddrinfo(node, service, hints, res); + + if (err) { + const char *errstr =3D getxinfo_strerr(err); + + fprintf(stderr, "Fatal: getaddrinfo(%s:%s): %s\n", + node ? node : "", service ? service : "", errstr); + exit(1); + } +} + +static int sock_listen_mptcp(const char * const listenaddr, + const char * const port) +{ + int sock; + struct addrinfo hints =3D { + .ai_protocol =3D IPPROTO_TCP, + .ai_socktype =3D SOCK_STREAM, + .ai_flags =3D AI_PASSIVE | AI_NUMERICHOST + }; + + hints.ai_family =3D pf; + + struct addrinfo *a, *addr; + int one =3D 1; + + xgetaddrinfo(listenaddr, port, &hints, &addr); + hints.ai_family =3D pf; + + for (a =3D addr; a; a =3D a->ai_next) { + sock =3D socket(a->ai_family, a->ai_socktype, proto_rx); + if (sock < 0) + continue; + + if (-1 =3D=3D setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, &one, + sizeof(one))) + perror("setsockopt"); + + if (bind(sock, a->ai_addr, a->ai_addrlen) =3D=3D 0) + break; /* success */ + + perror("bind"); + close(sock); + sock =3D -1; + } + + freeaddrinfo(addr); + + if (sock < 0) + xerror("could not create listen socket"); + + if (listen(sock, 20)) + die_perror("listen"); + + return sock; +} + +static int sock_connect_mptcp(const char * const remoteaddr, + const char * const port, int proto) +{ + struct addrinfo hints =3D { + .ai_protocol =3D IPPROTO_TCP, + .ai_socktype =3D SOCK_STREAM, + }; + struct addrinfo *a, *addr; + int sock =3D -1; + + hints.ai_family =3D pf; + + xgetaddrinfo(remoteaddr, port, &hints, &addr); + for (a =3D addr; a; a =3D a->ai_next) { + sock =3D socket(a->ai_family, a->ai_socktype, proto); + if (sock < 0) + continue; + + if (connect(sock, a->ai_addr, a->ai_addrlen) =3D=3D 0) + break; /* success */ + + die_perror("connect"); + } + + if (sock < 0) + xerror("could not create connect socket"); + + freeaddrinfo(addr); + return sock; +} + +static int protostr_to_num(const char *s) +{ + if (strcasecmp(s, "tcp") =3D=3D 0) + return IPPROTO_TCP; + if (strcasecmp(s, "mptcp") =3D=3D 0) + return IPPROTO_MPTCP; + + die_usage(1); + return 0; +} + +static void parse_opts(int argc, char **argv) +{ + int c; + + while ((c =3D getopt(argc, argv, "h6t:r:")) !=3D -1) { + switch (c) { + case 'h': + die_usage(0); + break; + case '6': + pf =3D AF_INET6; + break; + case 't': + proto_tx =3D protostr_to_num(optarg); + break; + case 'r': + proto_rx =3D protostr_to_num(optarg); + break; + default: + die_usage(1); + break; + } + } +} + +/* wait up to timeout milliseconds */ +static void wait_for_ack(int fd, int timeout, size_t total) +{ + int i; + + for (i =3D 0; i < timeout; i++) { + int nsd, ret, queued =3D -1; + struct timespec req; + + ret =3D ioctl(fd, TIOCOUTQ, &queued); + if (ret < 0) + die_perror("TIOCOUTQ"); + + ret =3D ioctl(fd, SIOCOUTQNSD, &nsd); + if (ret < 0) + die_perror("SIOCOUTQNSD"); + + if ((size_t)queued > total) + xerror("TIOCOUTQ %u, but only %zu expected\n", queued, total); + assert(nsd <=3D queued); + + if (queued =3D=3D 0) + return; + + /* wait for peer to ack rx of all data */ + req.tv_sec =3D 0; + req.tv_nsec =3D 1 * 1000 * 1000ul; /* 1ms */ + nanosleep(&req, NULL); + } + + xerror("still tx data queued after %u ms\n", timeout); +} + +static void connect_one_server(int fd, int unixfd) +{ + size_t len, i, total, sent; + char buf[4096], buf2[4096]; + ssize_t ret; + + len =3D rand() % (sizeof(buf) - 1); + + if (len < 128) + len =3D 128; + + for (i =3D 0; i < len ; i++) { + buf[i] =3D rand() % 26; + buf[i] +=3D 'A'; + } + + buf[i] =3D '\n'; + + /* un-block server */ + ret =3D read(unixfd, buf2, 4); + assert(ret =3D=3D 4); + + assert(strncmp(buf2, "xmit", 4) =3D=3D 0); + + ret =3D write(unixfd, &len, sizeof(len)); + assert(ret =3D=3D (ssize_t)sizeof(len)); + + ret =3D write(fd, buf, len); + if (ret < 0) + die_perror("write"); + + if (ret !=3D (ssize_t)len) + xerror("short write"); + + ret =3D read(unixfd, buf2, 4); + assert(strncmp(buf2, "huge", 4) =3D=3D 0); + + total =3D rand() % (16 * 1024 * 1024); + total +=3D (1 * 1024 * 1024); + sent =3D total; + + ret =3D write(unixfd, &total, sizeof(total)); + assert(ret =3D=3D (ssize_t)sizeof(total)); + + wait_for_ack(fd, 5000, len); + + while (total > 0) { + if (total > sizeof(buf)) + len =3D sizeof(buf); + else + len =3D total; + + ret =3D write(fd, buf, len); + if (ret < 0) + die_perror("write"); + total -=3D ret; + + /* we don't have to care about buf content, only + * number of total bytes sent + */ + } + + ret =3D read(unixfd, buf2, 4); + assert(ret =3D=3D 4); + assert(strncmp(buf2, "shut", 4) =3D=3D 0); + + wait_for_ack(fd, 5000, sent); + + ret =3D write(fd, buf, 1); + assert(ret =3D=3D 1); + close(fd); + ret =3D write(unixfd, "closed", 6); + assert(ret =3D=3D 6); + + close(unixfd); +} + +static void get_tcp_inq(struct msghdr *msgh, unsigned int *inqv) +{ + struct cmsghdr *cmsg; + + for (cmsg =3D CMSG_FIRSTHDR(msgh); cmsg ; cmsg =3D CMSG_NXTHDR(msgh, cmsg= )) { + if (cmsg->cmsg_level =3D=3D IPPROTO_TCP && cmsg->cmsg_type =3D=3D TCP_CM= _INQ) { + memcpy(inqv, CMSG_DATA(cmsg), sizeof(*inqv)); + return; + } + } + + xerror("could not find TCP_CM_INQ cmsg type"); +} + +static void process_one_client(int fd, int unixfd) +{ + unsigned int tcp_inq; + size_t expect_len; + char msg_buf[4096]; + char buf[4096]; + char tmp[16]; + struct iovec iov =3D { + .iov_base =3D buf, + .iov_len =3D 1, + }; + struct msghdr msg =3D { + .msg_iov =3D &iov, + .msg_iovlen =3D 1, + .msg_control =3D msg_buf, + .msg_controllen =3D sizeof(msg_buf), + }; + ssize_t ret, tot; + + ret =3D write(unixfd, "xmit", 4); + assert(ret =3D=3D 4); + + ret =3D read(unixfd, &expect_len, sizeof(expect_len)); + assert(ret =3D=3D (ssize_t)sizeof(expect_len)); + + if (expect_len > sizeof(buf)) + xerror("expect len %zu exceeds buffer size", expect_len); + + for (;;) { + struct timespec req; + unsigned int queued; + + ret =3D ioctl(fd, FIONREAD, &queued); + if (ret < 0) + die_perror("FIONREAD"); + if (queued > expect_len) + xerror("FIONREAD returned %u, but only %zu expected\n", + queued, expect_len); + if (queued =3D=3D expect_len) + break; + + req.tv_sec =3D 0; + req.tv_nsec =3D 1000 * 1000ul; + nanosleep(&req, NULL); + } + + /* read one byte, expect cmsg to return expected - 1 */ + ret =3D recvmsg(fd, &msg, 0); + if (ret < 0) + die_perror("recvmsg"); + + if (msg.msg_controllen =3D=3D 0) + xerror("msg_controllen is 0"); + + get_tcp_inq(&msg, &tcp_inq); + + assert((size_t)tcp_inq =3D=3D (expect_len - 1)); + + iov.iov_len =3D sizeof(buf); + ret =3D recvmsg(fd, &msg, 0); + if (ret < 0) + die_perror("recvmsg"); + + /* should have gotten exact remainder of all pending data */ + assert(ret =3D=3D (ssize_t)tcp_inq); + + /* should be 0, all drained */ + get_tcp_inq(&msg, &tcp_inq); + assert(tcp_inq =3D=3D 0); + + /* request a large swath of data. */ + ret =3D write(unixfd, "huge", 4); + assert(ret =3D=3D 4); + + ret =3D read(unixfd, &expect_len, sizeof(expect_len)); + assert(ret =3D=3D (ssize_t)sizeof(expect_len)); + + /* peer should send us a few mb of data */ + if (expect_len <=3D sizeof(buf)) + xerror("expect len %zu too small\n", expect_len); + + tot =3D 0; + do { + iov.iov_len =3D sizeof(buf); + ret =3D recvmsg(fd, &msg, 0); + if (ret < 0) + die_perror("recvmsg"); + + tot +=3D ret; + + get_tcp_inq(&msg, &tcp_inq); + + if (tcp_inq > expect_len - tot) + xerror("inq %d, remaining %d total_len %d\n", + tcp_inq, expect_len - tot, (int)expect_len); + + assert(tcp_inq <=3D expect_len - tot); + } while ((size_t)tot < expect_len); + + ret =3D write(unixfd, "shut", 4); + assert(ret =3D=3D 4); + + /* wait for hangup. Should have received one more byte of data. */ + ret =3D read(unixfd, tmp, sizeof(tmp)); + assert(ret =3D=3D 6); + assert(strncmp(tmp, "closed", 6) =3D=3D 0); + + sleep(1); + + iov.iov_len =3D 1; + ret =3D recvmsg(fd, &msg, 0); + if (ret < 0) + die_perror("recvmsg"); + assert(ret =3D=3D 1); + + get_tcp_inq(&msg, &tcp_inq); + + /* tcp_inq should be 1 due to received fin. */ + assert(tcp_inq =3D=3D 1); + + iov.iov_len =3D 1; + ret =3D recvmsg(fd, &msg, 0); + if (ret < 0) + die_perror("recvmsg"); + + /* expect EOF */ + assert(ret =3D=3D 0); + get_tcp_inq(&msg, &tcp_inq); + assert(tcp_inq =3D=3D 1); + + close(fd); +} + +static int xaccept(int s) +{ + int fd =3D accept(s, NULL, 0); + + if (fd < 0) + die_perror("accept"); + + return fd; +} + +static int server(int unixfd) +{ + int fd =3D -1, r, on =3D 1; + + switch (pf) { + case AF_INET: + fd =3D sock_listen_mptcp("127.0.0.1", "15432"); + break; + case AF_INET6: + fd =3D sock_listen_mptcp("::1", "15432"); + break; + default: + xerror("Unknown pf %d\n", pf); + break; + } + + r =3D write(unixfd, "conn", 4); + assert(r =3D=3D 4); + + alarm(15); + r =3D xaccept(fd); + + if (-1 =3D=3D setsockopt(r, IPPROTO_TCP, TCP_INQ, &on, sizeof(on))) + die_perror("setsockopt"); + + process_one_client(r, unixfd); + + return 0; +} + +static int client(int unixfd) +{ + int fd =3D -1; + + alarm(15); + + switch (pf) { + case AF_INET: + fd =3D sock_connect_mptcp("127.0.0.1", "15432", proto_tx); + break; + case AF_INET6: + fd =3D sock_connect_mptcp("::1", "15432", proto_tx); + break; + default: + xerror("Unknown pf %d\n", pf); + } + + connect_one_server(fd, unixfd); + + return 0; +} + +static void init_rng(void) +{ + int fd =3D open("/dev/urandom", O_RDONLY); + unsigned int foo; + + if (fd > 0) { + int ret =3D read(fd, &foo, sizeof(foo)); + + if (ret < 0) + srand(fd + foo); + close(fd); + } + + srand(foo); +} + +static pid_t xfork(void) +{ + pid_t p =3D fork(); + + if (p < 0) + die_perror("fork"); + else if (p =3D=3D 0) + init_rng(); + + return p; +} + +static int rcheck(int wstatus, const char *what) +{ + if (WIFEXITED(wstatus)) { + if (WEXITSTATUS(wstatus) =3D=3D 0) + return 0; + fprintf(stderr, "%s exited, status=3D%d\n", what, WEXITSTATUS(wstatus)); + return WEXITSTATUS(wstatus); + } else if (WIFSIGNALED(wstatus)) { + xerror("%s killed by signal %d\n", what, WTERMSIG(wstatus)); + } else if (WIFSTOPPED(wstatus)) { + xerror("%s stopped by signal %d\n", what, WSTOPSIG(wstatus)); + } + + return 111; +} + +int main(int argc, char *argv[]) +{ + int e1, e2, wstatus; + pid_t s, c, ret; + int unixfds[2]; + + parse_opts(argc, argv); + + e1 =3D socketpair(AF_UNIX, SOCK_DGRAM, 0, unixfds); + if (e1 < 0) + die_perror("pipe"); + + s =3D xfork(); + if (s =3D=3D 0) + return server(unixfds[1]); + + close(unixfds[1]); + + /* wait until server bound a socket */ + e1 =3D read(unixfds[0], &e1, 4); + assert(e1 =3D=3D 4); + + c =3D xfork(); + if (c =3D=3D 0) + return client(unixfds[0]); + + close(unixfds[0]); + + ret =3D waitpid(s, &wstatus, 0); + if (ret =3D=3D -1) + die_perror("waitpid"); + e1 =3D rcheck(wstatus, "server"); + ret =3D waitpid(c, &wstatus, 0); + if (ret =3D=3D -1) + die_perror("waitpid"); + e2 =3D rcheck(wstatus, "client"); + + return e1 ? e1 : e2; +} diff --git a/tools/testing/selftests/net/mptcp/mptcp_sockopt.sh b/tools/tes= ting/selftests/net/mptcp/mptcp_sockopt.sh index c8c364369599..0879da915014 100755 --- a/tools/testing/selftests/net/mptcp/mptcp_sockopt.sh +++ b/tools/testing/selftests/net/mptcp/mptcp_sockopt.sh @@ -279,6 +279,45 @@ run_tests() fi } =20 +do_tcpinq_test() +{ + ip netns exec "$ns1" ./mptcp_inq "$@" + lret=3D$? + if [ $lret -ne 0 ];then + ret=3D$lret + echo "FAIL: mptcp_inq $@" 1>&2 + return $lret + fi + + echo "PASS: TCP_INQ cmsg/ioctl $@" + return $lret +} + +do_tcpinq_tests() +{ + local lret=3D0 + + ip netns exec "$ns1" iptables -F + ip netns exec "$ns1" ip6tables -F + + for args in "-t tcp" "-r tcp"; do + do_tcpinq_test $args + lret=3D$? + if [ $lret -ne 0 ] ; then + return $lret + fi + do_tcpinq_test -6 $args + lret=3D$? + if [ $lret -ne 0 ] ; then + return $lret + fi + done + + do_tcpinq_test -r tcp -t tcp + + return $? +} + sin=3D$(mktemp) sout=3D$(mktemp) cin=3D$(mktemp) @@ -300,4 +339,5 @@ if [ $ret -eq 0 ];then echo "PASS: SOL_MPTCP getsockopt has expected information" fi =20 +do_tcpinq_tests exit $ret --=20 2.34.1 From nobody Sun May 5 11:03:32 2024 Delivered-To: wpasupplicant.patchew@gmail.com Received: by 2002:a02:cbb9:0:0:0:0:0 with SMTP id v25csp1110639jap; Fri, 3 Dec 2021 14:35:56 -0800 (PST) X-Google-Smtp-Source: ABdhPJxVin93rxmtlYi0xfdI4rkM0EGncrLTPdUcfXBw/u4qmuEqlDdjZn+RRQkkoNurRz3Th14u X-Received: by 2002:a05:622a:120e:: with SMTP id y14mr23396270qtx.671.1638570956015; Fri, 03 Dec 2021 14:35:56 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1638570956; cv=none; d=google.com; s=arc-20160816; b=VmewdY3l0RkKstLkdqF8+vfB3hbL2TZqls/YV9esGsDZ5mfptKVs4ozWgZ9vpHPn1g lhjrvnQCKV1kff/w7xOWXHdOdBwWXiiK/sSyopVSGElvcC51DmSlngmjs5m1Qva+rUjF QD+WNNF4kPOHAOTpaVxahF+Tm9h7Uo67X5bICDYiOhx3zrO8K44MS3fzbG8qYi4lgMKY y18NRbHjskSjLbnihTKCDEstuyQj645NCKI+pDURcogXroPgf7lAKwU2RowBEeW03TqN Px/nD4KuB15jxfWCf/7/XgkJ00O9e2G0WJPMSSuj3Ir7yU1ue88JsFKDbiHs5ifUcMLx P2cA== 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=tpiTTOoIrEz/WRXhKvQLwu2D2qRthTZyvtj8bkaBXew=; b=B8mMcY3hm/G/XNZOK5arCnCRgLWJ659foEa08K/y92BjQfudCsXJ+Ty7MIH4UX5stZ bpMz9oNuZ/P4dCEAT/HFPAwosePVbE2XVgkRSVuNglSpXF8gQ3uVyFZoGv8/dyFmdiZU H6krBy8TjSQi/DVwP4DAHN84WhyzmTJsIWUmKx/+LAP8/Qfx8T3K3dw7lj4xpQKuXdur 6Ma1+daCXAh+q4lHEtCcI3tMAOEWLWUiEx4vv3RTN+vSyR/TYpyDbV4keYw5n39CnodZ VqI0EaDYP2DZBTkwASTAUvk3ox3egCpbx/9TM7ceAn4HVF0s9wyTXWyZSeN2DHdpnLPB k14Q== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of mptcp+bounces-2628-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 147.75.197.195 as permitted sender) smtp.mailfrom="mptcp+bounces-2628-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 w74si3750076qkb.730.2021.12.03.14.35.55 for (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Fri, 03 Dec 2021 14:35:56 -0800 (PST) Received-SPF: pass (google.com: domain of mptcp+bounces-2628-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-2628-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 147.75.197.195 as permitted sender) smtp.mailfrom="mptcp+bounces-2628-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 A086B1C0F0A for ; Fri, 3 Dec 2021 22:35:55 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id D7D252C9E; Fri, 3 Dec 2021 22:35:51 +0000 (UTC) X-Original-To: mptcp@lists.linux.dev Received: from mga04.intel.com (mga04.intel.com [192.55.52.120]) (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 CAA752CA8 for ; Fri, 3 Dec 2021 22:35:50 +0000 (UTC) X-IronPort-AV: E=McAfee;i="6200,9189,10187"; a="235802944" X-IronPort-AV: E=Sophos;i="5.87,284,1631602800"; d="scan'208";a="235802944" Received: from orsmga003.jf.intel.com ([10.7.209.27]) by fmsmga104.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 03 Dec 2021 14:35:47 -0800 X-IronPort-AV: E=Sophos;i="5.87,284,1631602800"; d="scan'208";a="460185309" Received: from mjmartin-desk2.amr.corp.intel.com (HELO mjmartin-desk2.intel.com) ([10.251.18.88]) by orsmga003-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 03 Dec 2021 14:35:47 -0800 From: Mat Martineau To: netdev@vger.kernel.org Cc: Davide Caratti , davem@davemloft.net, kuba@kernel.org, matthieu.baerts@tessares.net, mptcp@lists.linux.dev, Mat Martineau Subject: [PATCH net-next 05/10] mptcp: allow changing the "backup" bit by endpoint id Date: Fri, 3 Dec 2021 14:35:36 -0800 Message-Id: <20211203223541.69364-6-mathew.j.martineau@linux.intel.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20211203223541.69364-1-mathew.j.martineau@linux.intel.com> References: <20211203223541.69364-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: Davide Caratti a non-zero 'id' is sufficient to identify MPTCP endpoints: allow changing the value of 'backup' bit by simply specifying the endpoint id. Link: https://github.com/multipath-tcp/mptcp_net-next/issues/158 Signed-off-by: Davide Caratti Signed-off-by: Mat Martineau --- net/mptcp/pm_netlink.c | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/net/mptcp/pm_netlink.c b/net/mptcp/pm_netlink.c index 7b96be1e9f14..4ff8d55cbe82 100644 --- a/net/mptcp/pm_netlink.c +++ b/net/mptcp/pm_netlink.c @@ -1702,22 +1702,28 @@ static int mptcp_nl_addr_backup(struct net *net, =20 static int mptcp_nl_cmd_set_flags(struct sk_buff *skb, struct genl_info *i= nfo) { + struct mptcp_pm_addr_entry addr =3D { .addr =3D { .family =3D AF_UNSPEC }= , }, *entry; struct nlattr *attr =3D info->attrs[MPTCP_PM_ATTR_ADDR]; struct pm_nl_pernet *pernet =3D genl_info_pm_nl(info); - struct mptcp_pm_addr_entry addr, *entry; struct net *net =3D sock_net(skb->sk); - u8 bkup =3D 0; + u8 bkup =3D 0, lookup_by_id =3D 0; int ret; =20 - ret =3D mptcp_pm_parse_addr(attr, info, true, &addr); + ret =3D mptcp_pm_parse_addr(attr, info, false, &addr); if (ret < 0) return ret; =20 if (addr.flags & MPTCP_PM_ADDR_FLAG_BACKUP) bkup =3D 1; + if (addr.addr.family =3D=3D AF_UNSPEC) { + lookup_by_id =3D 1; + if (!addr.addr.id) + return -EOPNOTSUPP; + } =20 list_for_each_entry(entry, &pernet->local_addr_list, list) { - if (addresses_equal(&entry->addr, &addr.addr, true)) { + if ((!lookup_by_id && addresses_equal(&entry->addr, &addr.addr, true)) || + (lookup_by_id && entry->addr.id =3D=3D addr.addr.id)) { mptcp_nl_addr_backup(net, &entry->addr, bkup); =20 if (bkup) --=20 2.34.1 From nobody Sun May 5 11:03:32 2024 Delivered-To: wpasupplicant.patchew@gmail.com Received: by 2002:a02:cbb9:0:0:0:0:0 with SMTP id v25csp1110670jap; Fri, 3 Dec 2021 14:35:58 -0800 (PST) X-Google-Smtp-Source: ABdhPJxraGSspq7Srf/ADFdyrrLw66iJwyLdHY0lnHYRmCwZ4p46vKRdp9MfwJ/c2P9zgO2aNxmM X-Received: by 2002:aa7:9acc:0:b0:4a2:b8b5:8813 with SMTP id x12-20020aa79acc000000b004a2b8b58813mr21948717pfp.4.1638570958010; Fri, 03 Dec 2021 14:35:58 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1638570958; cv=none; d=google.com; s=arc-20160816; b=opGeq9g826orrQQYX0RrDAubZDTxIUhpboAJnu7lYGcL57HpYrqqG4THs0qyguGHfp y2xq2fPCm/CPw9fASMCEPLnhsmO+f3naokFKiODla+6hA+nTFPXKY2FNQ4G5S9iZTxuM NdorX/jsIQus1WqNbKha5FU31zuFKYhENcrVLIoWwnl6l7X2klf3fazeUkz833yYIvEy u3YVB3NkiPEfJaP10ISUCz3Ic/NkzIPpIane++zJx2fXtGaerHMqaa1PRZfX86DYBpr3 81zNZhTkoTMMf95BJlrK8sw2aoDVaH10jj8gSEq33zdk3Mp5uLJNq3JEa0BNpppU9JXh umCg== 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=nzFXckPcLpzkP+F8tYKDQL0I2DWo2QpVkZOc2jsntpA=; b=YTLaFiDitkY6EFEHVv4VaLfWdsVoScLdefkhEd49bh72nvNO59dVqHQnL1lYIczWoW Iy2MnElU3b9GQZzAryHhH7vDb6ii8crs+ocAc1VeAlfgENq3734n0/t53mIniJIuTERF 8uDCKu2rCdb5G2hKEnp2ClcFRyuh86E0YpidmMvl0y6DmsRTQCNR4gpCm+d7+J26JEUm 9rhxTjM2w76wmU/nsP/xYWTyQ96lbv0wIuDyIY5/m3Ghvn4dUxuREnBk9OiGT9FU7KO9 RJCfxLtslxA/KQ2PO8iVnozE67RiFTCO4oA27+0tQRJgk/YTWRHGNj5n2nVXSujmUmQz hJvg== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of mptcp+bounces-2630-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 2604:1380:1000:8100::1 as permitted sender) smtp.mailfrom="mptcp+bounces-2630-wpasupplicant.patchew=gmail.com@lists.linux.dev"; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=intel.com Return-Path: Received: from sjc.edge.kernel.org (sjc.edge.kernel.org. [2604:1380:1000:8100::1]) by mx.google.com with ESMTPS id s2si5963324pgq.103.2021.12.03.14.35.57 for (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Fri, 03 Dec 2021 14:35:58 -0800 (PST) Received-SPF: pass (google.com: domain of mptcp+bounces-2630-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 2604:1380:1000:8100::1 as permitted sender) client-ip=2604:1380:1000:8100::1; Authentication-Results: mx.google.com; spf=pass (google.com: domain of mptcp+bounces-2630-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 2604:1380:1000:8100::1 as permitted sender) smtp.mailfrom="mptcp+bounces-2630-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 sjc.edge.kernel.org (Postfix) with ESMTPS id BD4DF3E0F63 for ; Fri, 3 Dec 2021 22:35:57 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 8841F2CAC; Fri, 3 Dec 2021 22:35:52 +0000 (UTC) X-Original-To: mptcp@lists.linux.dev Received: from mga04.intel.com (mga04.intel.com [192.55.52.120]) (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 732352C9D for ; Fri, 3 Dec 2021 22:35:51 +0000 (UTC) X-IronPort-AV: E=McAfee;i="6200,9189,10187"; a="235802946" X-IronPort-AV: E=Sophos;i="5.87,284,1631602800"; d="scan'208";a="235802946" Received: from orsmga003.jf.intel.com ([10.7.209.27]) by fmsmga104.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 03 Dec 2021 14:35:47 -0800 X-IronPort-AV: E=Sophos;i="5.87,284,1631602800"; d="scan'208";a="460185310" Received: from mjmartin-desk2.amr.corp.intel.com (HELO mjmartin-desk2.intel.com) ([10.251.18.88]) by orsmga003-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 03 Dec 2021 14:35:47 -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 06/10] mptcp: getsockopt: add support for IP_TOS Date: Fri, 3 Dec 2021 14:35:37 -0800 Message-Id: <20211203223541.69364-7-mathew.j.martineau@linux.intel.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20211203223541.69364-1-mathew.j.martineau@linux.intel.com> References: <20211203223541.69364-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 earlier patch added IP_TOS setsockopt support, this allows to get the value set by earlier setsockopt. Extends mptcp_put_int_option to handle u8 input/output by adding required cast. Reviewed-by: Matthieu Baerts Signed-off-by: Florian Westphal Signed-off-by: Mat Martineau --- net/mptcp/sockopt.c | 36 ++++++++++++++++++++++++++++++------ 1 file changed, 30 insertions(+), 6 deletions(-) diff --git a/net/mptcp/sockopt.c b/net/mptcp/sockopt.c index 11cda8629993..44e0a37c567c 100644 --- a/net/mptcp/sockopt.c +++ b/net/mptcp/sockopt.c @@ -1053,15 +1053,24 @@ static int mptcp_put_int_option(struct mptcp_sock *= msk, char __user *optval, =20 if (get_user(len, optlen)) return -EFAULT; - - len =3D min_t(unsigned int, len, sizeof(int)); if (len < 0) return -EINVAL; =20 - if (put_user(len, optlen)) - return -EFAULT; - if (copy_to_user(optval, &val, len)) - return -EFAULT; + if (len < sizeof(int) && len > 0 && val >=3D 0 && val <=3D 255) { + unsigned char ucval =3D (unsigned char)val; + + len =3D 1; + if (put_user(len, optlen)) + return -EFAULT; + if (copy_to_user(optval, &ucval, 1)) + return -EFAULT; + } else { + len =3D min_t(unsigned int, len, sizeof(int)); + if (put_user(len, optlen)) + return -EFAULT; + if (copy_to_user(optval, &val, len)) + return -EFAULT; + } =20 return 0; } @@ -1082,6 +1091,19 @@ static int mptcp_getsockopt_sol_tcp(struct mptcp_soc= k *msk, int optname, return -EOPNOTSUPP; } =20 +static int mptcp_getsockopt_v4(struct mptcp_sock *msk, int optname, + char __user *optval, int __user *optlen) +{ + struct sock *sk =3D (void *)msk; + + switch (optname) { + case IP_TOS: + return mptcp_put_int_option(msk, optval, optlen, inet_sk(sk)->tos); + } + + return -EOPNOTSUPP; +} + static int mptcp_getsockopt_sol_mptcp(struct mptcp_sock *msk, int optname, char __user *optval, int __user *optlen) { @@ -1117,6 +1139,8 @@ int mptcp_getsockopt(struct sock *sk, int level, int = optname, if (ssk) return tcp_getsockopt(ssk, level, optname, optval, option); =20 + if (level =3D=3D SOL_IP) + return mptcp_getsockopt_v4(msk, optname, optval, option); if (level =3D=3D SOL_TCP) return mptcp_getsockopt_sol_tcp(msk, optname, optval, option); if (level =3D=3D SOL_MPTCP) --=20 2.34.1 From nobody Sun May 5 11:03:32 2024 Delivered-To: wpasupplicant.patchew@gmail.com Received: by 2002:a02:cbb9:0:0:0:0:0 with SMTP id v25csp1110683jap; Fri, 3 Dec 2021 14:35:59 -0800 (PST) X-Google-Smtp-Source: ABdhPJyPnxNT+oSmXhyPDS6oSS/ml/z1wrMicI7WvhkCk8cuJ09Shtv5pw0SaHRWuFWVhPyL1v8x X-Received: by 2002:a17:903:2305:b0:142:1bca:72eb with SMTP id d5-20020a170903230500b001421bca72ebmr25566682plh.67.1638570959292; Fri, 03 Dec 2021 14:35:59 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1638570959; cv=none; d=google.com; s=arc-20160816; b=FQ3BkAf/IRy+j8VWphIUT3NKlTZoDNw9TZzs8wp6q2XdKlO0YTay/iHvM+HX4F9n3c TBxhEl7GdvL0THc9TKPBKgPJf1xw5duUqdpa4kIowjFOohVnwzvUncfAgiv8U8JO86ZZ Vl7xAtUygIVra9WnecFeWUyhANCa/RvXT/WvDHOKHco7o1UQhRuBFY3sq3Pb2Z7EPpo3 04w4Tc562ozXaCCxVBahcsJyS42zNcgEYS/i2Vk8FmCL9PFe7NvuVzmVTiBfuaTB8W6k RNXSt4RNQrupfLhP1+blGKifm1UQnuOK6kjvNMzlJTEbG1jwfSxkoaTAG4Hi0qlyJGZ2 ew2A== 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=s6K3LgKJ0xFIUa1exWQYAYhYt3igbrEsrtbQTwKi2dw=; b=fcof7L2bNh6HGDars1hR6S2394VTKu2CsXnu04QtonNCHDtIkLsSxReQH2Flr0LmS4 TSBElYsec50sXhJB3xTpl21E994fNcStOAdtXF3DV4nBeASThM4k4f69GXBOzpeiIR+Z LUgbI02dAeOg2x9vpphGYvUdyWOupFEtki0Vnqd8BtY1xTEM3JsW0YPVHbgAy3+UTbtN G6sJft5FJ3fGU04Cy8JU07I0ykg+YSTNR4hYrfThlss9kGWBNReu+PjYaNMms0NcMXqB VkNOjHMvXCwL4Bi7KVIcZgODrxy4pjLYYpqWVbARzBo9QCcjzcDNTH2qEKLbApNqpxsb IdSw== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of mptcp+bounces-2631-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 2604:1380:1000:8100::1 as permitted sender) smtp.mailfrom="mptcp+bounces-2631-wpasupplicant.patchew=gmail.com@lists.linux.dev"; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=intel.com Return-Path: Received: from sjc.edge.kernel.org (sjc.edge.kernel.org. [2604:1380:1000:8100::1]) by mx.google.com with ESMTPS id i2si4178105pfa.347.2021.12.03.14.35.59 for (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Fri, 03 Dec 2021 14:35:59 -0800 (PST) Received-SPF: pass (google.com: domain of mptcp+bounces-2631-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 2604:1380:1000:8100::1 as permitted sender) client-ip=2604:1380:1000:8100::1; Authentication-Results: mx.google.com; spf=pass (google.com: domain of mptcp+bounces-2631-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 2604:1380:1000:8100::1 as permitted sender) smtp.mailfrom="mptcp+bounces-2631-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 sjc.edge.kernel.org (Postfix) with ESMTPS id 011593E100C for ; Fri, 3 Dec 2021 22:35:59 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id D4FD12CB1; Fri, 3 Dec 2021 22:35:52 +0000 (UTC) X-Original-To: mptcp@lists.linux.dev Received: from mga04.intel.com (mga04.intel.com [192.55.52.120]) (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 E18322CA8 for ; Fri, 3 Dec 2021 22:35:51 +0000 (UTC) X-IronPort-AV: E=McAfee;i="6200,9189,10187"; a="235802947" X-IronPort-AV: E=Sophos;i="5.87,284,1631602800"; d="scan'208";a="235802947" Received: from orsmga003.jf.intel.com ([10.7.209.27]) by fmsmga104.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 03 Dec 2021 14:35:47 -0800 X-IronPort-AV: E=Sophos;i="5.87,284,1631602800"; d="scan'208";a="460185311" Received: from mjmartin-desk2.amr.corp.intel.com (HELO mjmartin-desk2.intel.com) ([10.251.18.88]) by orsmga003-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 03 Dec 2021 14:35:47 -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 07/10] selftests: mptcp: check IP_TOS in/out are the same Date: Fri, 3 Dec 2021 14:35:38 -0800 Message-Id: <20211203223541.69364-8-mathew.j.martineau@linux.intel.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20211203223541.69364-1-mathew.j.martineau@linux.intel.com> References: <20211203223541.69364-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 Check that getsockopt(IP_TOS) returns what setsockopt(IP_TOS) did set right before. Also check that socklen_t =3D=3D 0 and -1 input values match those of normal tcp sockets. Reviewed-by: Matthieu Baerts Signed-off-by: Florian Westphal Signed-off-by: Mat Martineau --- .../selftests/net/mptcp/mptcp_sockopt.c | 63 +++++++++++++++++++ 1 file changed, 63 insertions(+) diff --git a/tools/testing/selftests/net/mptcp/mptcp_sockopt.c b/tools/test= ing/selftests/net/mptcp/mptcp_sockopt.c index 417b11cafafe..ac9a4d9c1764 100644 --- a/tools/testing/selftests/net/mptcp/mptcp_sockopt.c +++ b/tools/testing/selftests/net/mptcp/mptcp_sockopt.c @@ -4,6 +4,7 @@ =20 #include #include +#include #include #include #include @@ -13,6 +14,7 @@ #include #include #include +#include #include =20 #include @@ -594,6 +596,44 @@ static int server(int pipefd) return 0; } =20 +static void test_ip_tos_sockopt(int fd) +{ + uint8_t tos_in, tos_out; + socklen_t s; + int r; + + tos_in =3D rand() & 0xfc; + r =3D setsockopt(fd, SOL_IP, IP_TOS, &tos_in, sizeof(tos_out)); + if (r !=3D 0) + die_perror("setsockopt IP_TOS"); + + tos_out =3D 0; + s =3D sizeof(tos_out); + r =3D getsockopt(fd, SOL_IP, IP_TOS, &tos_out, &s); + if (r !=3D 0) + die_perror("getsockopt IP_TOS"); + + if (tos_in !=3D tos_out) + xerror("tos %x !=3D %x socklen_t %d\n", tos_in, tos_out, s); + + if (s !=3D 1) + xerror("tos should be 1 byte"); + + s =3D 0; + r =3D getsockopt(fd, SOL_IP, IP_TOS, &tos_out, &s); + if (r !=3D 0) + die_perror("getsockopt IP_TOS 0"); + if (s !=3D 0) + xerror("expect socklen_t =3D=3D 0"); + + s =3D -1; + r =3D getsockopt(fd, SOL_IP, IP_TOS, &tos_out, &s); + if (r !=3D -1 && errno !=3D EINVAL) + die_perror("getsockopt IP_TOS did not indicate -EINVAL"); + if (s !=3D -1) + xerror("expect socklen_t =3D=3D -1"); +} + static int client(int pipefd) { int fd =3D -1; @@ -611,6 +651,8 @@ static int client(int pipefd) xerror("Unknown pf %d\n", pf); } =20 + test_ip_tos_sockopt(fd); + connect_one_server(fd, pipefd); =20 return 0; @@ -642,6 +684,25 @@ static int rcheck(int wstatus, const char *what) return 111; } =20 +static void init_rng(void) +{ + int fd =3D open("/dev/urandom", O_RDONLY); + + if (fd >=3D 0) { + unsigned int foo; + ssize_t ret; + + /* can't fail */ + ret =3D read(fd, &foo, sizeof(foo)); + assert(ret =3D=3D sizeof(foo)); + + close(fd); + srand(foo); + } else { + srand(time(NULL)); + } +} + int main(int argc, char *argv[]) { int e1, e2, wstatus; @@ -650,6 +711,8 @@ int main(int argc, char *argv[]) =20 parse_opts(argc, argv); =20 + init_rng(); + e1 =3D pipe(pipefds); if (e1 < 0) die_perror("pipe"); --=20 2.34.1 From nobody Sun May 5 11:03:32 2024 Delivered-To: wpasupplicant.patchew@gmail.com Received: by 2002:a02:cbb9:0:0:0:0:0 with SMTP id v25csp1110697jap; Fri, 3 Dec 2021 14:36:01 -0800 (PST) X-Google-Smtp-Source: ABdhPJznNzwvrvu+4xdF65qrszrH4toyHiF7ZMqSErIWUxTEfljNJ6rNFDDSRgkHWITq47CjP5pP X-Received: by 2002:a37:712:: with SMTP id 18mr20316653qkh.366.1638570960950; Fri, 03 Dec 2021 14:36:00 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1638570960; cv=none; d=google.com; s=arc-20160816; b=WCau+gmsK6zqjN8wqDGbiSw2GEg3HoIi5SdzfjiYZ5XzYGfyh2TULgA6t5r18LRMjN 2oMulWz+UR6neepW/Rlxh8mfZpCHrt+KRTQ7GK22NpP4fARFOK5roAtk2/3lZtkozOM1 q5Q28b/d/qJXfLr6cvMwd4wgG7uDvgnzzZs+HbCMe0XIPDnMvPQH1pc/NEh6dazotVGw k1KmzfiK7ofkzul/wgSSKhssYLa/MNAb6x4ST69bYsNJfe/vWf58piilESqu28zujlZc TKBBS41XXWCR5b+vg8IRILuryNgh2tuzVCVvEHVU5wV9raYLV6nriCkAjjuBnWsoKaNv 3qPQ== 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=85IM9K1uBIsWfXOcagqlMbIQs4ERoSq02G/mdOfeZQI=; b=viyQsCIhqj7YhVq1WhbjiY1VaWEZtS4dITXejnXJCksxa4Pf0hz/DQ6hDAC9VedE3k YIKXAVt+4fo7By6epKsaFjjypFxZoqMOg7Lxi2FRu1Hzc5SoDnaOJLHb4oiVADI597kD 7lewuWj72UeGvh2FsI1YdKbZLGPaymR4jpEtq2tYpuewPwNHTh0TBCk1p7xZTn1MtBqe uTLiR7KoW0QRuOuoMRNAB00jfkZemCS17riJx/gocOsPAa7bxn/+gyMN8J47o8k3V+GS MYrXLoVz0nYTDSJlb5/JeLTb8a7a3LasVb/8s1LFj+GwgeKQoMde5G49cZBlkr7WmtnZ O4rQ== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of mptcp+bounces-2632-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 147.75.197.195 as permitted sender) smtp.mailfrom="mptcp+bounces-2632-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 z15si4701352qta.68.2021.12.03.14.36.00 for (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Fri, 03 Dec 2021 14:36:00 -0800 (PST) Received-SPF: pass (google.com: domain of mptcp+bounces-2632-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-2632-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 147.75.197.195 as permitted sender) smtp.mailfrom="mptcp+bounces-2632-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 806CF1C0ECA for ; Fri, 3 Dec 2021 22:36:00 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 5287E2CAB; Fri, 3 Dec 2021 22:35:53 +0000 (UTC) X-Original-To: mptcp@lists.linux.dev Received: from mga04.intel.com (mga04.intel.com [192.55.52.120]) (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 1C0142CB0 for ; Fri, 3 Dec 2021 22:35:52 +0000 (UTC) X-IronPort-AV: E=McAfee;i="6200,9189,10187"; a="235802948" X-IronPort-AV: E=Sophos;i="5.87,284,1631602800"; d="scan'208";a="235802948" Received: from orsmga003.jf.intel.com ([10.7.209.27]) by fmsmga104.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 03 Dec 2021 14:35:47 -0800 X-IronPort-AV: E=Sophos;i="5.87,284,1631602800"; d="scan'208";a="460185313" Received: from mjmartin-desk2.amr.corp.intel.com (HELO mjmartin-desk2.intel.com) ([10.251.18.88]) by orsmga003-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 03 Dec 2021 14:35:47 -0800 From: Mat Martineau To: netdev@vger.kernel.org Cc: Maxim Galaganov , davem@davemloft.net, kuba@kernel.org, matthieu.baerts@tessares.net, mptcp@lists.linux.dev, Paolo Abeni , Mat Martineau Subject: [PATCH net-next 08/10] tcp: expose __tcp_sock_set_cork and __tcp_sock_set_nodelay Date: Fri, 3 Dec 2021 14:35:39 -0800 Message-Id: <20211203223541.69364-9-mathew.j.martineau@linux.intel.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20211203223541.69364-1-mathew.j.martineau@linux.intel.com> References: <20211203223541.69364-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: Maxim Galaganov Expose __tcp_sock_set_cork() and __tcp_sock_set_nodelay() for use in MPTCP setsockopt code -- namely for syncing MPTCP socket options with subflows inside sync_socket_options() while already holding the subflow socket lock. Acked-by: Paolo Abeni Acked-by: Matthieu Baerts Signed-off-by: Maxim Galaganov Signed-off-by: Mat Martineau --- include/linux/tcp.h | 2 ++ net/ipv4/tcp.c | 4 ++-- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/include/linux/tcp.h b/include/linux/tcp.h index 48d8a363319e..78b91bb92f0d 100644 --- a/include/linux/tcp.h +++ b/include/linux/tcp.h @@ -512,11 +512,13 @@ static inline u16 tcp_mss_clamp(const struct tcp_sock= *tp, u16 mss) int tcp_skb_shift(struct sk_buff *to, struct sk_buff *from, int pcount, int shiftlen); =20 +void __tcp_sock_set_cork(struct sock *sk, bool on); void tcp_sock_set_cork(struct sock *sk, bool on); int tcp_sock_set_keepcnt(struct sock *sk, int val); int tcp_sock_set_keepidle_locked(struct sock *sk, int val); int tcp_sock_set_keepidle(struct sock *sk, int val); int tcp_sock_set_keepintvl(struct sock *sk, int val); +void __tcp_sock_set_nodelay(struct sock *sk, bool on); void tcp_sock_set_nodelay(struct sock *sk); void tcp_sock_set_quickack(struct sock *sk, int val); int tcp_sock_set_syncnt(struct sock *sk, int val); diff --git a/net/ipv4/tcp.c b/net/ipv4/tcp.c index 6ab82e1a1d41..20054618c87e 100644 --- a/net/ipv4/tcp.c +++ b/net/ipv4/tcp.c @@ -3207,7 +3207,7 @@ static void tcp_enable_tx_delay(void) * TCP_CORK can be set together with TCP_NODELAY and it is stronger than * TCP_NODELAY. */ -static void __tcp_sock_set_cork(struct sock *sk, bool on) +void __tcp_sock_set_cork(struct sock *sk, bool on) { struct tcp_sock *tp =3D tcp_sk(sk); =20 @@ -3235,7 +3235,7 @@ EXPORT_SYMBOL(tcp_sock_set_cork); * However, when TCP_NODELAY is set we make an explicit push, which overri= des * even TCP_CORK for currently queued segments. */ -static void __tcp_sock_set_nodelay(struct sock *sk, bool on) +void __tcp_sock_set_nodelay(struct sock *sk, bool on) { if (on) { tcp_sk(sk)->nonagle |=3D TCP_NAGLE_OFF|TCP_NAGLE_PUSH; --=20 2.34.1 From nobody Sun May 5 11:03:32 2024 Delivered-To: wpasupplicant.patchew@gmail.com Received: by 2002:a02:cbb9:0:0:0:0:0 with SMTP id v25csp1110709jap; Fri, 3 Dec 2021 14:36:01 -0800 (PST) X-Google-Smtp-Source: ABdhPJzCGdv1urUNIJ9uXgRDdlbBkE/b6yRdvwsI97XiKusa/NVuzh5NebQeaRx2qGXcLLv8kl+N X-Received: by 2002:a17:903:120a:b0:143:e4e9:4cdb with SMTP id l10-20020a170903120a00b00143e4e94cdbmr25591197plh.89.1638570961631; Fri, 03 Dec 2021 14:36:01 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1638570961; cv=none; d=google.com; s=arc-20160816; b=xTcyL83bmBM18O9P6q6inZkHO7D0lGtixhSC53OvMVawlFT0m7nL/7jHZPiGu9qMS2 Ktg7SGQPBs+N5eka20K9+p4yyUwxIRrSbVCWW5S9QqDwg+g394SiGwDIMmim22xoz+Dn Yc71hHxTlOJypZj2ZYEDSK/3v7q47CtHmj+IDaATRqinnVEaD5uPyckrpKRNQxntx1BQ ffoi1PyEpjL8sXidpmcNTjeVVbfBgnt48xa8abc19IzWsQO7rjy7NpIxkS8sT88Gr0Sz B2E4nQlXQHOx43PqVFFcoBLE5NaKJ3IPmnao4fAahQLde2M+8BNd42hzU6Q+vAvqusdC F2Zw== 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=oWlNhohRGw5dW113tIGW5jGGroT6imNAlorwwc3FQnI=; b=sg/J35D0CIrx5OUSCEY8usR9UtmGHKkgQ0ZqvrosWuBodt6uXtPvBHglOKuJeq3gA/ CSMYK92zFUxz5blwt6LNyIa2lcVQVf2/v9BkI8ux0gGRey36gEyF2+xFcFj4S2CxKvy9 rO7FfvNIt4uaDsAOHkxppfItwRGlRKaG5W89BwII5N96Wcm3bQRyde0lavFnr/6qIrxS 0D/JX2P9vnHGNo0UhJzNHCMsmdF4hIZ2mnX+LnKzwoGX2TXzYFf/QVMx0GBOnJyrUIKS 8K9fJGmNF7cjEbpq5+bdqHs1nm/NmDK1bWwV7hUmA8wPkBO31qWC/BDnGwS/pZ8Lk+45 3l9g== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of mptcp+bounces-2633-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 147.75.69.165 as permitted sender) smtp.mailfrom="mptcp+bounces-2633-wpasupplicant.patchew=gmail.com@lists.linux.dev"; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=intel.com Return-Path: Received: from sjc.edge.kernel.org (sjc.edge.kernel.org. [147.75.69.165]) by mx.google.com with ESMTPS id qe16si5748465pjb.189.2021.12.03.14.36.01 for (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Fri, 03 Dec 2021 14:36:01 -0800 (PST) Received-SPF: pass (google.com: domain of mptcp+bounces-2633-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 147.75.69.165 as permitted sender) client-ip=147.75.69.165; Authentication-Results: mx.google.com; spf=pass (google.com: domain of mptcp+bounces-2633-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 147.75.69.165 as permitted sender) smtp.mailfrom="mptcp+bounces-2633-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 sjc.edge.kernel.org (Postfix) with ESMTPS id 373223E0FF2 for ; Fri, 3 Dec 2021 22:36:01 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 83D4F2CB0; Fri, 3 Dec 2021 22:35:53 +0000 (UTC) X-Original-To: mptcp@lists.linux.dev Received: from mga04.intel.com (mga04.intel.com [192.55.52.120]) (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 8E7512C9D for ; Fri, 3 Dec 2021 22:35:52 +0000 (UTC) X-IronPort-AV: E=McAfee;i="6200,9189,10187"; a="235802949" X-IronPort-AV: E=Sophos;i="5.87,284,1631602800"; d="scan'208";a="235802949" Received: from orsmga003.jf.intel.com ([10.7.209.27]) by fmsmga104.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 03 Dec 2021 14:35:48 -0800 X-IronPort-AV: E=Sophos;i="5.87,284,1631602800"; d="scan'208";a="460185314" Received: from mjmartin-desk2.amr.corp.intel.com (HELO mjmartin-desk2.intel.com) ([10.251.18.88]) by orsmga003-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 03 Dec 2021 14:35:47 -0800 From: Mat Martineau To: netdev@vger.kernel.org Cc: Maxim Galaganov , davem@davemloft.net, kuba@kernel.org, matthieu.baerts@tessares.net, mptcp@lists.linux.dev, Paolo Abeni , Mat Martineau Subject: [PATCH net-next 09/10] mptcp: expose mptcp_check_and_set_pending Date: Fri, 3 Dec 2021 14:35:40 -0800 Message-Id: <20211203223541.69364-10-mathew.j.martineau@linux.intel.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20211203223541.69364-1-mathew.j.martineau@linux.intel.com> References: <20211203223541.69364-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: Maxim Galaganov Expose the mptcp_check_and_set_pending() function for use inside MPTCP sockopt code. The next patch will call it when TCP_CORK is cleared or TCP_NODELAY is set on the MPTCP socket in order to push pending data from mptcp_release_cb(). Acked-by: Paolo Abeni Reviewed-by: Matthieu Baerts Signed-off-by: Maxim Galaganov Signed-off-by: Mat Martineau --- net/mptcp/protocol.c | 2 +- net/mptcp/protocol.h | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/net/mptcp/protocol.c b/net/mptcp/protocol.c index 943f74e804bd..f124cca125d2 100644 --- a/net/mptcp/protocol.c +++ b/net/mptcp/protocol.c @@ -1502,7 +1502,7 @@ static void mptcp_update_post_push(struct mptcp_sock = *msk, msk->snd_nxt =3D snd_nxt_new; } =20 -static void mptcp_check_and_set_pending(struct sock *sk) +void mptcp_check_and_set_pending(struct sock *sk) { if (mptcp_send_head(sk) && !test_bit(MPTCP_PUSH_PENDING, &mptcp_sk(sk)->flags)) diff --git a/net/mptcp/protocol.h b/net/mptcp/protocol.h index bb51fa7f5566..147b22da41ca 100644 --- a/net/mptcp/protocol.h +++ b/net/mptcp/protocol.h @@ -555,6 +555,7 @@ unsigned int mptcp_stale_loss_cnt(const struct net *net= ); void mptcp_subflow_fully_established(struct mptcp_subflow_context *subflow, struct mptcp_options_received *mp_opt); bool __mptcp_retransmit_pending_data(struct sock *sk); +void mptcp_check_and_set_pending(struct sock *sk); void __mptcp_push_pending(struct sock *sk, unsigned int flags); bool mptcp_subflow_data_available(struct sock *sk); void __init mptcp_subflow_init(void); --=20 2.34.1 From nobody Sun May 5 11:03:32 2024 Delivered-To: wpasupplicant.patchew@gmail.com Received: by 2002:a02:cbb9:0:0:0:0:0 with SMTP id v25csp1110734jap; Fri, 3 Dec 2021 14:36:03 -0800 (PST) X-Google-Smtp-Source: ABdhPJwRRqvzax+Xny5PqJj0RVFWyGjfdBaLDz45uGkP0WDrNmqc7Z9YA4hICruop3KLHyHnK9/I X-Received: by 2002:a05:620a:2a10:: with SMTP id o16mr19526722qkp.357.1638570963196; Fri, 03 Dec 2021 14:36:03 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1638570963; cv=none; d=google.com; s=arc-20160816; b=oV9Z6tbthqKfrJm0xkpyW1CbWGwYPfNkkkxw+Sz9B7J0c8Cmixyt4oaNngq8XXnk42 eoZbx0WQbwIuF0EbprnLDY32Yx3xHqhXhGS5n6gkfPTA6NLKOuKmrOk4NgJjCcjXYON+ 5x9iXVXh10NDGHNL+tOKooT8OXlN112Zf2r8MwEkXV+KnsAwAJ6T0YOZk9Ei5ytQnE+u F3kvNe8n8jCfRwG2T293XxYnZL5++/VZs4tkFDATNARU5V727CdrtYPI59BS168haqOZ 6zA571G/i9Vv2talUSCS2GRCTIBXlxb/ol34g9GGdx3sYmCS8q6kZYShuAU5gG+Bf7+m uLXw== 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=n93htVrOJVZx+LZJsc0lflX1juLKH7l1KUP5Ej2l7nw=; b=ORLgexhNQiVMG/uJuBEbP90JNqo8h1MaKkTGrSAIxEXvEi3xyUQYV2qchVV9G9HfPB ksxf0kvn9LctYv/qi1T+CPG66N82vLzQiirvMlKacgyuthWt5ktLrqTbkD126Gh73bic Oepf4LoPaMsC2bPOn/zTE+Vn+DJNFxtMM9Eg1f6Y//yoO9q5P2jUSYCoDhO4i4lPs4Az psCTuqgU3oh5GmMKmJkAg/kC1WWIh+M2veiOa19sAx++YuEu3+gyfs44AT6DWqgbW+6p kxl9K6aYi0/Hkk1eYvy8uwxKdlbECtLDNlYnfuWnx4byQeonbXM/Avyi7ITOMRG4VP/S hyEQ== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of mptcp+bounces-2634-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 2604:1380:1:3600::1 as permitted sender) smtp.mailfrom="mptcp+bounces-2634-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. [2604:1380:1:3600::1]) by mx.google.com with ESMTPS id n7si4660784qta.219.2021.12.03.14.36.03 for (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Fri, 03 Dec 2021 14:36:03 -0800 (PST) Received-SPF: pass (google.com: domain of mptcp+bounces-2634-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 2604:1380:1:3600::1 as permitted sender) client-ip=2604:1380:1:3600::1; Authentication-Results: mx.google.com; spf=pass (google.com: domain of mptcp+bounces-2634-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 2604:1380:1:3600::1 as permitted sender) smtp.mailfrom="mptcp+bounces-2634-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 D11C41C0F0A for ; Fri, 3 Dec 2021 22:36:02 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id EAC7C2C9D; Fri, 3 Dec 2021 22:35:53 +0000 (UTC) X-Original-To: mptcp@lists.linux.dev Received: from mga04.intel.com (mga04.intel.com [192.55.52.120]) (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 D9FE72CA8 for ; Fri, 3 Dec 2021 22:35:52 +0000 (UTC) X-IronPort-AV: E=McAfee;i="6200,9189,10187"; a="235802950" X-IronPort-AV: E=Sophos;i="5.87,284,1631602800"; d="scan'208";a="235802950" Received: from orsmga003.jf.intel.com ([10.7.209.27]) by fmsmga104.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 03 Dec 2021 14:35:48 -0800 X-IronPort-AV: E=Sophos;i="5.87,284,1631602800"; d="scan'208";a="460185315" Received: from mjmartin-desk2.amr.corp.intel.com (HELO mjmartin-desk2.intel.com) ([10.251.18.88]) by orsmga003-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 03 Dec 2021 14:35:48 -0800 From: Mat Martineau To: netdev@vger.kernel.org Cc: Maxim Galaganov , davem@davemloft.net, kuba@kernel.org, matthieu.baerts@tessares.net, mptcp@lists.linux.dev, Paolo Abeni , Mat Martineau Subject: [PATCH net-next 10/10] mptcp: support TCP_CORK and TCP_NODELAY Date: Fri, 3 Dec 2021 14:35:41 -0800 Message-Id: <20211203223541.69364-11-mathew.j.martineau@linux.intel.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20211203223541.69364-1-mathew.j.martineau@linux.intel.com> References: <20211203223541.69364-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: Maxim Galaganov First, add cork and nodelay fields to the mptcp_sock structure so they can be used in sync_socket_options(), and fill them on setsockopt while holding the msk socket lock. Then, on setsockopt set proper tcp_sk(ssk)->nonagle values for subflows by calling __tcp_sock_set_cork() or __tcp_sock_set_nodelay() on the ssk while holding the ssk socket lock. tcp_push_pending_frames() will be invoked on the ssk if a cork was cleared or nodelay was set. Also set MPTCP_PUSH_PENDING bit by calling mptcp_check_and_set_pending(). This will lead to __mptcp_push_pending() being called inside mptcp_release_cb() with new tcp_sk(ssk)->nonagle. Also add getsockopt support for TCP_CORK and TCP_NODELAY. Acked-by: Paolo Abeni Reviewed-by: Matthieu Baerts Signed-off-by: Maxim Galaganov Signed-off-by: Mat Martineau --- net/mptcp/protocol.h | 4 ++- net/mptcp/sockopt.c | 70 ++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 73 insertions(+), 1 deletion(-) diff --git a/net/mptcp/protocol.h b/net/mptcp/protocol.h index 147b22da41ca..e1469155fb15 100644 --- a/net/mptcp/protocol.h +++ b/net/mptcp/protocol.h @@ -249,7 +249,9 @@ struct mptcp_sock { bool rcv_fastclose; bool use_64bit_ack; /* Set when we received a 64-bit DSN */ bool csum_enabled; - u8 recvmsg_inq:1; + u8 recvmsg_inq:1, + cork:1, + nodelay:1; spinlock_t join_list_lock; struct work_struct work; struct sk_buff *ooo_last_skb; diff --git a/net/mptcp/sockopt.c b/net/mptcp/sockopt.c index 44e0a37c567c..3c3db22fd36a 100644 --- a/net/mptcp/sockopt.c +++ b/net/mptcp/sockopt.c @@ -616,6 +616,66 @@ static int mptcp_setsockopt_sol_tcp_congestion(struct = mptcp_sock *msk, sockptr_t return ret; } =20 +static int mptcp_setsockopt_sol_tcp_cork(struct mptcp_sock *msk, sockptr_t= optval, + unsigned int optlen) +{ + struct mptcp_subflow_context *subflow; + struct sock *sk =3D (struct sock *)msk; + int val; + + if (optlen < sizeof(int)) + return -EINVAL; + + if (copy_from_sockptr(&val, optval, sizeof(val))) + return -EFAULT; + + lock_sock(sk); + sockopt_seq_inc(msk); + msk->cork =3D !!val; + mptcp_for_each_subflow(msk, subflow) { + struct sock *ssk =3D mptcp_subflow_tcp_sock(subflow); + + lock_sock(ssk); + __tcp_sock_set_cork(ssk, !!val); + release_sock(ssk); + } + if (!val) + mptcp_check_and_set_pending(sk); + release_sock(sk); + + return 0; +} + +static int mptcp_setsockopt_sol_tcp_nodelay(struct mptcp_sock *msk, sockpt= r_t optval, + unsigned int optlen) +{ + struct mptcp_subflow_context *subflow; + struct sock *sk =3D (struct sock *)msk; + int val; + + if (optlen < sizeof(int)) + return -EINVAL; + + if (copy_from_sockptr(&val, optval, sizeof(val))) + return -EFAULT; + + lock_sock(sk); + sockopt_seq_inc(msk); + msk->nodelay =3D !!val; + mptcp_for_each_subflow(msk, subflow) { + struct sock *ssk =3D mptcp_subflow_tcp_sock(subflow); + + lock_sock(ssk); + __tcp_sock_set_nodelay(ssk, !!val); + release_sock(ssk); + } + if (val) + mptcp_check_and_set_pending(sk); + release_sock(sk); + + return 0; +} + static int mptcp_setsockopt_sol_ip_set_transparent(struct mptcp_sock *msk,= int optname, sockptr_t optval, unsigned int optlen) { @@ -717,6 +777,10 @@ static int mptcp_setsockopt_sol_tcp(struct mptcp_sock = *msk, int optname, return -EOPNOTSUPP; case TCP_CONGESTION: return mptcp_setsockopt_sol_tcp_congestion(msk, optval, optlen); + case TCP_CORK: + return mptcp_setsockopt_sol_tcp_cork(msk, optval, optlen); + case TCP_NODELAY: + return mptcp_setsockopt_sol_tcp_nodelay(msk, optval, optlen); } =20 return -EOPNOTSUPP; @@ -1087,6 +1151,10 @@ static int mptcp_getsockopt_sol_tcp(struct mptcp_soc= k *msk, int optname, optval, optlen); case TCP_INQ: return mptcp_put_int_option(msk, optval, optlen, msk->recvmsg_inq); + case TCP_CORK: + return mptcp_put_int_option(msk, optval, optlen, msk->cork); + case TCP_NODELAY: + return mptcp_put_int_option(msk, optval, optlen, msk->nodelay); } return -EOPNOTSUPP; } @@ -1189,6 +1257,8 @@ 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); + __tcp_sock_set_cork(ssk, !!msk->cork); + __tcp_sock_set_nodelay(ssk, !!msk->nodelay); =20 inet_sk(ssk)->transparent =3D inet_sk(sk)->transparent; inet_sk(ssk)->freebind =3D inet_sk(sk)->freebind; --=20 2.34.1