From nobody Mon Feb 9 05:41:45 2026 Delivered-To: wpasupplicant.patchew@gmail.com Received: by 2002:a02:956b:0:0:0:0:0 with SMTP id y98csp4158787jah; Mon, 8 Nov 2021 03:23:46 -0800 (PST) X-Google-Smtp-Source: ABdhPJzdLV9C5uPpB7lt6JwFjVKpuIuco5L2B6RVWCQYhkLGrSNaIOX/4hXgH5u8tU/szg5ce0i/ X-Received: by 2002:a9d:bec:: with SMTP id 99mr38117307oth.193.1636370626620; Mon, 08 Nov 2021 03:23:46 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1636370626; cv=none; d=google.com; s=arc-20160816; b=JcQgQ/7FcqM8CoSdf8RSyxxJQFf8Bl86D/SX5lhUqpUdXcDa+nHXzKH8Lk0YnFfhl5 k4o/EfQcGCKVlIn9MXmC84veq/O9eRSuhEAL70bzbGHelfuaLtZM4xvzXx2E8DhdkB0V 0/cAeqrFuB+RXyGAlLMunw0tx+QR/0FITsCvwnt6NZ3LVJUgKeN11IPjZh/gEtIDVxW9 og4i/PDbrjdswXakqphPyinZ3qa+iDLBXlzY7J6MaVLqy/56j7npwZqiEnrB71rY1+w2 QAb2HIVztxH8iVOXcXvfma9K8XPczh/V+yKm+PG86BuyHOTto5Vg1roNCyR5yc1VU2Dl SlVQ== 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=3z3UNwgCfkGvYrHQGIVOnUfOKTB32OBIbVvThu4KSxc=; b=V5LsMtO+CoSF2q41Lc1tytZx7+uw4PcQX9eEB+HpsLkB3Oe2mOKPfei7Y4GHdxk8dZ 7SLxTPp1U25eE+JTygHYuOAtS+T9kYFeiK3FzTonq9MvSO9t5MtKwony7Fs60rbhsY9Z RLIIv0E/kxoHA3FgrUt9qNgW2UiFEnnrsNXcaoFZ8GdZv8gPB3BQ2Me05oZqnA+UGNFL LPfi7x1rusTSn5FYcLtvExep6uoVUcKkDGQTxa52SbgToWL2TIaIpVxslfhQNLSjEz5R iRj0keBMDg+Uf7zJrGmcQyb3OQJb+hsRI0mSQB4ZVh3dx9DNw5PzN9NTnSS/HmogpuhT o81g== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of mptcp+bounces-2384-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 147.75.197.195 as permitted sender) smtp.mailfrom="mptcp+bounces-2384-wpasupplicant.patchew=gmail.com@lists.linux.dev" Return-Path: Received: from ewr.edge.kernel.org (ewr.edge.kernel.org. [147.75.197.195]) by mx.google.com with ESMTPS id e125si18777862oia.59.2021.11.08.03.23.46 for (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Mon, 08 Nov 2021 03:23:46 -0800 (PST) Received-SPF: pass (google.com: domain of mptcp+bounces-2384-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-2384-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 147.75.197.195 as permitted sender) smtp.mailfrom="mptcp+bounces-2384-wpasupplicant.patchew=gmail.com@lists.linux.dev" 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 D695A1C0BFC for ; Mon, 8 Nov 2021 11:23:45 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 479CD2C9A; Mon, 8 Nov 2021 11:23:44 +0000 (UTC) X-Original-To: mptcp@lists.linux.dev Received: from Chamillionaire.breakpoint.cc (Chamillionaire.breakpoint.cc [193.142.43.52]) (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 F3BFB2C85 for ; Mon, 8 Nov 2021 11:23:42 +0000 (UTC) Received: from fw by Chamillionaire.breakpoint.cc with local (Exim 4.92) (envelope-from ) id 1mk2L7-0006Xg-J9; Mon, 08 Nov 2021 11:57:25 +0100 From: Florian Westphal To: Cc: Florian Westphal Subject: [PATCH mptcp-next 1/3] mptcp: add TCP_INQ cmsg support Date: Mon, 8 Nov 2021 11:57:09 +0100 Message-Id: <20211108105711.16200-2-fw@strlen.de> X-Mailer: git-send-email 2.32.0 In-Reply-To: <20211108105711.16200-1-fw@strlen.de> References: <20211108105711.16200-1-fw@strlen.de> 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" Support the TCP_INQ setsockopt. This is a boolean that tells recvmsg path to include the remaining in-sequence bytes into a cmsg data. Closes: https://github.com/multipath-tcp/mptcp_net-next/issues/224 Signed-off-by: Florian Westphal --- net/mptcp/protocol.c | 33 +++++++++++++++++++++++++++++++++ net/mptcp/protocol.h | 1 + net/mptcp/sockopt.c | 37 +++++++++++++++++++++++++++++++++++++ 3 files changed, 71 insertions(+) diff --git a/net/mptcp/protocol.c b/net/mptcp/protocol.c index b0bfe20d6bb0..b4263bf821ac 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; @@ -2006,6 +2007,29 @@ 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; + u64 acked =3D msk->ack_seq; + u64 hint_val =3D 0; + + skb =3D skb_peek(&msk->receive_queue); + if (skb) { + u64 map_seq =3D MPTCP_SKB_CB(skb)->map_seq + MPTCP_SKB_CB(skb)->offset; + + hint_val =3D acked - map_seq; + + if (hint_val >=3D INT_MAX) + hint_val =3D INT_MAX - 1; + } + + if (hint_val =3D=3D 0 && sock_flag(sk, SOCK_DONE)) + hint_val =3D 1; + + return (unsigned int)hint_val; +} + static int mptcp_recvmsg(struct sock *sk, struct msghdr *msg, size_t len, int nonblock, int flags, int *addr_len) { @@ -2030,6 +2054,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 @@ -2103,6 +2130,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 906509c6cde5..e77de7662df0 100644 --- a/net/mptcp/protocol.h +++ b/net/mptcp/protocol.h @@ -250,6 +250,7 @@ struct mptcp_sock { bool use_64bit_ack; /* Set when we received a 64-bit DSN */ bool csum_enabled; bool allow_infinite_fallback; + 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 b818e91f2e09..7405152691e0 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 @@ -698,7 +699,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 +1047,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 +1077,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.32.0