From nobody Mon Feb 9 18:43:19 2026 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