From nobody Mon Feb 9 03:12:01 2026 Delivered-To: wpasupplicant.patchew@gmail.com Received: by 2002:a02:cbb9:0:0:0:0:0 with SMTP id v25csp7705243jap; Tue, 16 Nov 2021 05:59:33 -0800 (PST) X-Google-Smtp-Source: ABdhPJwDgnMjBCjbIN1HWp7ouJZZYmUQZ72UjiRPXByR/nVq+eF7cFpj1TNK7QiqC1RyJBIXc74w X-Received: by 2002:a17:90a:b105:: with SMTP id z5mr72773933pjq.64.1637071173667; Tue, 16 Nov 2021 05:59:33 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1637071173; cv=none; d=google.com; s=arc-20160816; b=Xzn7g31Zf18el0MNFvNMX7yKwau5n1u2pPpqaxzOB7FMlC03TIdaw+kom/Xs9jZYnz udGOZxfzvjnFN4aAa3rhl5oFWkAiiW2WVCs2bIEI80U+1VkpkhUj4dufvUzUNNZmmv3E 5ZnHhx9JenlPHBlsmbT5ZTl8whmKNVs7G7CnemFWjt8UIHI2v8X9xkuRsJ6Irtqj9/3j /2hKbu7AU+cYiK/06Psnf36wewU2Q59L/T5sXLi6apj8NIrS9r7SUgaYWy0y8wI6T7Fu TEo859xyCy3BS6Ox58sWnF1dMF6dBSEq1Oxe5OgOLIaSv5zsma6VSpf3bQBNyCT9flNy effw== 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=FkTL4Q4rIZqyLdM6Vz0MT/bGnxTA5TgEF8NjM3J7Vlc=; b=vMqo9uzeLSS5CWXAvJjP3ONGrU1yPyzpcd+KrAe4lo3PG2z/lxYTghdYawEU4H15eu fh63ueWV0pr2QkgtK8DKUddXLFsxmVqCK9v2l9++DwSs6O6ZFEGV0brlBvdMl0hXpMKi Jn4zePsMrOFRtGwwee8auxWTx3VLauKdL+ottEkT9JhLggJQwYizcL5BTi5t0OppZ53X 46vcDQNnkbIb+j+bqABy7jEy1wAjA3U8PF8knT9WXoYOEe1HinyPKMcPRHeXF+y2OaEA jphmA6UswM2bJXCLR4UW0IREtcfDj5jpjP0vLfKjcDspC7TaXE5vWMefMt4fSw1he6lY JU+A== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of mptcp+bounces-2448-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 147.75.197.195 as permitted sender) smtp.mailfrom="mptcp+bounces-2448-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 u3si38313372pfk.211.2021.11.16.05.59.33 for (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Tue, 16 Nov 2021 05:59:33 -0800 (PST) Received-SPF: pass (google.com: domain of mptcp+bounces-2448-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-2448-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 147.75.197.195 as permitted sender) smtp.mailfrom="mptcp+bounces-2448-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 A425D1C0B91 for ; Tue, 16 Nov 2021 13:59:32 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 35C852C88; Tue, 16 Nov 2021 13:59:31 +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 E67EE2C85 for ; Tue, 16 Nov 2021 13:59:29 +0000 (UTC) Received: from fw by Chamillionaire.breakpoint.cc with local (Exim 4.92) (envelope-from ) id 1mmyza-0003TT-4g; Tue, 16 Nov 2021 14:59:22 +0100 From: Florian Westphal To: Cc: Florian Westphal Subject: [PATCH mptcp-next v3 1/4] mptcp: add TCP_INQ cmsg support Date: Tue, 16 Nov 2021 14:48:01 +0100 Message-Id: <20211116134804.30090-2-fw@strlen.de> X-Mailer: git-send-email 2.32.0 In-Reply-To: <20211116134804.30090-1-fw@strlen.de> References: <20211116134804.30090-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 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 --- net/mptcp/protocol.c | 36 +++++++++++++++++++++++++++++++++++- net/mptcp/protocol.h | 1 + net/mptcp/sockopt.c | 37 +++++++++++++++++++++++++++++++++++++ 3 files changed, 73 insertions(+), 1 deletion(-) diff --git a/net/mptcp/protocol.c b/net/mptcp/protocol.c index b0bfe20d6bb0..4aaa458d846c 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; @@ -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; @@ -1825,8 +1827,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 @@ -2006,6 +2010,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) { @@ -2030,6 +2055,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 +2131,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 fb43e145cb57..0295d6d9207e 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