From nobody Fri Mar 29 06:41:59 2024 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 From nobody Fri Mar 29 06:41:59 2024 Delivered-To: wpasupplicant.patchew@gmail.com Received: by 2002:a02:956b:0:0:0:0:0 with SMTP id y98csp4136670jah; Mon, 8 Nov 2021 02:57:35 -0800 (PST) X-Google-Smtp-Source: ABdhPJxz/pE/d1HX0V99djHlmnbby1rJuCiZjsYdDcXzJiD8vQeHM/L8qOHzzCkj9Rx4CsQW36Ek X-Received: by 2002:a05:6830:1d87:: with SMTP id y7mr1905250oti.269.1636369055289; Mon, 08 Nov 2021 02:57:35 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1636369055; cv=none; d=google.com; s=arc-20160816; b=QlxGGGpXci1k/j2CpqvRVLWB29gU9UDiTKxjl+yXqDkjDyMGySTLt+7bxnpThFOPkU krJb/GeT3BgV5Wp3uoNHhrZ2fCPobtJWwhAa9hPyEz7fdPiRb/P5wweYSLACn97AEvoa p2jUHE6f3DLsMxh/S2BUaMCjGoNAFRoqRsPuAbR+iNhgfIFg9+LuhwTNr88Vj9EJXOVc VfhG3h67a5FrwkmSuh3ph8Omwcnl/ruBIWhtOGHyK5uySk/jlXdVUPVjIROmz0piytyN UVBQxQN05JonVOhbRPVj62+IWUJGn4Cu82c5oNDsPlaR0ONvoowVW85+JoPa131uLmsq gVxw== 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=ChZthzb/UgZdLOsktQxHDwgNt3a3vrhIk6tEyOcZzuk=; b=dSc0LfCq//SJoi4mLEwvOJaKxcj7Z6/iFQ27Uinhe6/hWob9PQLIfEuTwPQhyBXtRg t0R2LsnWIO5rEb3LgjkXo0UjlaI3ZiWW29neweaI7fIRbLYmgCVhAYwjK/HrtandFR/U IxbMG9+ItCbYvphrt8BllssuGS6qJCdask+/6LnUGrsYGH0eNTJ3y0Pw6iAqMZ4yM0P4 jyyfniqNwg0twCELKmQeQcN2B9vdzVNsNH36Rx1bI/62OOk2NaNMCoeMaWoK8aqfc7CX VU/RHHnjtTfxvNTM36236GemS9RfPk9NXz9c7+L0Gn2fjShxNfR6ciD+rhIE0fqqdZfX 3rXg== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of mptcp+bounces-2381-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 147.75.69.165 as permitted sender) smtp.mailfrom="mptcp+bounces-2381-wpasupplicant.patchew=gmail.com@lists.linux.dev" Return-Path: Received: from sjc.edge.kernel.org (sjc.edge.kernel.org. [147.75.69.165]) by mx.google.com with ESMTPS id d21si24962388oti.241.2021.11.08.02.57.35 for (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Mon, 08 Nov 2021 02:57:35 -0800 (PST) Received-SPF: pass (google.com: domain of mptcp+bounces-2381-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-2381-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 147.75.69.165 as permitted sender) smtp.mailfrom="mptcp+bounces-2381-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 sjc.edge.kernel.org (Postfix) with ESMTPS id 5CFC73E1018 for ; Mon, 8 Nov 2021 10:57:34 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 7D4ED29CA; Mon, 8 Nov 2021 10:57:33 +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 003432C85 for ; Mon, 8 Nov 2021 10:57:31 +0000 (UTC) Received: from fw by Chamillionaire.breakpoint.cc with local (Exim 4.92) (envelope-from ) id 1mk2LC-0006Y3-0F; Mon, 08 Nov 2021 11:57:30 +0100 From: Florian Westphal To: Cc: Florian Westphal Subject: [PATCH mptcp-next 2/3] selftests: mptcp: add TCP_INQ support Date: Mon, 8 Nov 2021 11:57:10 +0100 Message-Id: <20211108105711.16200-3-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" Do checks on the returned inq counter. Fail on: 1. Huge value (>=3D 1 megabyte, test case files are 1 MB) 2. last hint larger than returned bytes when read was short 3. erroenous 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 --- .../selftests/net/mptcp/mptcp_connect.c | 56 ++++++++++++++++++- .../selftests/net/mptcp/mptcp_sockopt.sh | 10 ++-- 2 files changed, 60 insertions(+), 6 deletions(-) diff --git a/tools/testing/selftests/net/mptcp/mptcp_connect.c b/tools/test= ing/selftests/net/mptcp/mptcp_connect.c index ada9b80774d4..e3e4338d610f 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 >=3D 1 * 1024 * 1024) + xerror("tcp_inq is larger than one mbyte\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,15 @@ 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) + xerror("read %u of %u, last_hint was %u\n", ret, (unsigned int)len, la= st_hint); + else + tcp_inq.expect_eof =3D true; + } + } + return ret; } =20 @@ -944,6 +991,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 +1014,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..75af784cc62a 100755 --- a/tools/testing/selftests/net/mptcp/mptcp_sockopt.sh +++ b/tools/testing/selftests/net/mptcp/mptcp_sockopt.sh @@ -167,7 +167,7 @@ do_transfer() :> "$cout" :> "$sout" =20 - mptcp_connect=3D"./mptcp_connect -r 20" + mptcp_connect=3D"./mptcp_connect" =20 local local_addr if is_v6 "${connect_addr}"; then @@ -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$! @@ -284,8 +284,8 @@ sout=3D$(mktemp) cin=3D$(mktemp) cout=3D$(mktemp) init -make_file "$cin" "client" 1 -make_file "$sin" "server" 1 +make_file "$cin" "client" 1024 +make_file "$sin" "server" 1024 trap cleanup EXIT =20 run_tests $ns1 $ns2 10.0.1.1 --=20 2.32.0 From nobody Fri Mar 29 06:41:59 2024 Delivered-To: wpasupplicant.patchew@gmail.com Received: by 2002:a02:956b:0:0:0:0:0 with SMTP id y98csp4136727jah; Mon, 8 Nov 2021 02:57:39 -0800 (PST) X-Google-Smtp-Source: ABdhPJxTxrE0Rev2wfYEof9/e02Km4Q/jFLIRoyxmOrr+iZatgiClvn9P7bdUh7R/HxJ9YMk53za X-Received: by 2002:aca:3b02:: with SMTP id i2mr36077375oia.85.1636369059035; Mon, 08 Nov 2021 02:57:39 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1636369059; cv=none; d=google.com; s=arc-20160816; b=LyYBY6RlKsoFK24lLDi2QLfUcgPg4v3LCGaqtxGTAccngm5N5AdBI1rJYsnIDBSXAL vXjRoxzQjeBqUUcKll1gLUHqLvieeJaKS9vPRQzzu67EomQOL9Xn+dN+JJU8PNBF8HPD SmA9yuIWrVJ0vk/5dCWJEo2L0/w5lUDMRdYDcGmLG6L7TtBb9hiKBhlg78gScQnt08e8 E5qn/SY63djwD+3i7n9FEu+OzortQUQhVS+GtD/04B3J+YxWAlRtaYcqw9YO4WYibhot FGe6dDSU/JJRpoWJDvl4ZL0T9IJRYHT1AI67/Zit1QNQhx29RKAAhuj1H7VolOlheH4i 7KMw== 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=PIhX8Re4xZBURmkwar34TukI2k3XEWhua1HGpkEFZ7k=; b=juv3Ip90aR2zUcMa6Wt7M24WKESNFKumZykxN7cm1uNNId0Ffz3uHGzBy7mEjqx6CV 4ynoyAHUMmLkYVcq7CH69lx/eXlrQxQijLTcJGj47Vx6w8lmEfsfKipjQrgmSxrWhbiM 664OuJwnxsSVvIJPc686kRSiuAUa+gqDdQzbvBBD634Nwk3y7L2nW71WbBM3/eBQU23w AgAkZwfNJfNdq2bJe0SM4Irp3wBmVFq0/izqB8MJ4ZScqe3pwtEuidabhCaS4jWtKsoc iZb7yoG4cNuaDo8NRiEmYVHsBTTC5z7d7ITvHL0uYGk4n6+SpI55+sd0yUcWhJPazn6v jMNA== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of mptcp+bounces-2382-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 2604:1380:1000:8100::1 as permitted sender) smtp.mailfrom="mptcp+bounces-2382-wpasupplicant.patchew=gmail.com@lists.linux.dev" Return-Path: Received: from sjc.edge.kernel.org (sjc.edge.kernel.org. [2604:1380:1000:8100::1]) by mx.google.com with ESMTPS id f7si32768924otu.127.2021.11.08.02.57.38 for (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Mon, 08 Nov 2021 02:57:39 -0800 (PST) Received-SPF: pass (google.com: domain of mptcp+bounces-2382-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-2382-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 2604:1380:1000:8100::1 as permitted sender) smtp.mailfrom="mptcp+bounces-2382-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 sjc.edge.kernel.org (Postfix) with ESMTPS id 3EA7E3E103F for ; Mon, 8 Nov 2021 10:57:38 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 589542C85; Mon, 8 Nov 2021 10:57:37 +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 2358A29CA for ; Mon, 8 Nov 2021 10:57:36 +0000 (UTC) Received: from fw by Chamillionaire.breakpoint.cc with local (Exim 4.92) (envelope-from ) id 1mk2LG-0006YL-FG; Mon, 08 Nov 2021 11:57:34 +0100 From: Florian Westphal To: Cc: Florian Westphal Subject: [PATCH mptcp-next 3/3] mptcp: add SIOCINQ, OUTQ and OUTQNSD ioctls Date: Mon, 8 Nov 2021 11:57:11 +0100 Message-Id: <20211108105711.16200-4-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" 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. Signed-off-by: Florian Westphal --- net/mptcp/protocol.c | 52 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 52 insertions(+) diff --git a/net/mptcp/protocol.c b/net/mptcp/protocol.c index b4263bf821ac..29b6f57b917e 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 @@ -3260,6 +3261,56 @@ 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 READ_ONCE(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); + int answ; + bool slow; + + switch (cmd) { + case SIOCINQ: + if (sk->sk_state =3D=3D TCP_LISTEN) + return -EINVAL; + + slow =3D lock_sock_fast(sk); + answ =3D mptcp_inq_hint(sk); + unlock_sock_fast(sk, slow); + 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, READ_ONCE(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, @@ -3272,6 +3323,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.32.0