From nobody Mon Feb 9 10:28:45 2026 Delivered-To: wpasupplicant.patchew@gmail.com Received: by 2002:a17:907:7811:b0:6d8:2910:9a8 with SMTP id la17csp4144873ejc; Mon, 28 Mar 2022 05:49:37 -0700 (PDT) X-Google-Smtp-Source: ABdhPJyGg8uRHjrNrY5D2eilVuCcGdK81XYmEF+B/Hw8/e2lAhDr1up5N+sgWVKOHSDXWb+9leKl X-Received: by 2002:a05:6122:792:b0:343:3995:cdb2 with SMTP id k18-20020a056122079200b003433995cdb2mr2109449vkr.15.1648471777610; Mon, 28 Mar 2022 05:49:37 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1648471777; cv=none; d=google.com; s=arc-20160816; b=QEFHctPw3uC+AeDynxbOBP5WoKEx5NoYVviIFGdtD9pD/0pBU5/P84ZffWa/0Q2Gqg M2Gi8qz8in4qsiC9Ja20jdS6+zbdtpRY6yBjMgSZfYNg3slMsp4GzbSiQn68saGicgVL e96N5Ng+hEoTZ/HxivM323nHzTTBMvN72fu0SpJULbfjr6ybEb4m+/pMa/LM+sYS+9jD 4+GCh5d9Ie3e0B53EgX3j9B/T3kiDhMNe4oP/DQ177gljHumSjGUarpDdwD6gixPeyNF UhEUl0LekLroIcln3o+senMW9UttccXU5RiZRePwTiAyGQQbs6SdeafrGfrAv8glDBJA YUzA== 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=dSsRu3xpA1VHVV4vob/CxlRrVr7xVuthMv6phcKx42A=; b=BYCBoYGVfpk63141jzI+xaDSWAFHRffCm3IbfzbHCykwwicv89rY4fQPKwz10I+cOJ fdOQqbEebFXogko7Qcu+C5+gSmJfKR5CMPoaQXyxr5z+5XBlwNWNYofRHEHVCY/zpc3v MS8E62oaCXZ9Kt5W3px4yu4nMj38bgKYR84kbo0ALvf9tSuENtZiD+DoU96KDOtvpY3t 0Ddlp7A91pEyKMwbGTTfAsgfxxtXr9KV2FKkpG3YlMa6SnHAWBbDnzwCaBkzlkFAEWt3 CvhXySm/75XyDRvk7vIme0L9R5I852TTU+U3gmWytr6diJnkRDKk61DzqsY4XxantibU 6r/g== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of mptcp+bounces-4479-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 2604:1380:1000:8100::1 as permitted sender) smtp.mailfrom="mptcp+bounces-4479-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 o2-20020a67e142000000b0032557098017si1600997vsl.300.2022.03.28.05.49.37 for (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Mon, 28 Mar 2022 05:49:37 -0700 (PDT) Received-SPF: pass (google.com: domain of mptcp+bounces-4479-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-4479-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 2604:1380:1000:8100::1 as permitted sender) smtp.mailfrom="mptcp+bounces-4479-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 AEA703E0EA1 for ; Mon, 28 Mar 2022 12:49:36 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id A1B074358; Mon, 28 Mar 2022 12:49:35 +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 5CA0242BA for ; Mon, 28 Mar 2022 12:49:34 +0000 (UTC) Received: from fw by Chamillionaire.breakpoint.cc with local (Exim 4.92) (envelope-from ) id 1nYooO-00069H-FP; Mon, 28 Mar 2022 14:49:32 +0200 From: Florian Westphal To: Cc: Florian Westphal Subject: [PATCH mptcp-next v2 3/3] mptcp: listen diag dump support Date: Mon, 28 Mar 2022 14:49:13 +0200 Message-Id: <20220328124913.29768-4-fw@strlen.de> X-Mailer: git-send-email 2.35.1 In-Reply-To: <20220328124913.29768-1-fw@strlen.de> References: <20220328124913.29768-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" makes 'ss -Ml' show mptcp listen sockets. Iterate over the tcp listen sockets and pick those that have mptcp ulp info attached. mptcp_diag_get_info() is modified to prefer msk->first for mptcp sockets in listen state. This reports accurate number for recv and send queue (pending / max connection backlog counters). Sample output: ss -Mil State Recv-Q Send-Q Local Address:Port Peer Address:Port LISTEN 0 20 127.0.0.1:12000 0.0.0.0:* subflows_max:2 Signed-off-by: Florian Westphal Reported-by: Dan Carpenter Reported-by: kernel test robot --- Changes: - place functionality in helper function - prefer msk->first for msk listeners - more verbose commit message net/mptcp/mptcp_diag.c | 88 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 88 insertions(+) diff --git a/net/mptcp/mptcp_diag.c b/net/mptcp/mptcp_diag.c index c4992eeb67d8..076dd99d35d9 100644 --- a/net/mptcp/mptcp_diag.c +++ b/net/mptcp/mptcp_diag.c @@ -69,8 +69,80 @@ static int mptcp_diag_dump_one(struct netlink_callback *= cb, struct mptcp_diag_ctx { long s_slot; long s_num; + unsigned int l_slot; + unsigned int l_num; }; =20 +static void mptcp_diag_dump_listeners(struct sk_buff *skb, struct netlink_= callback *cb, + const struct inet_diag_req_v2 *r, + bool net_admin) +{ + struct mptcp_diag_ctx *diag_ctx =3D (void *)cb->ctx; + struct net *net =3D sock_net(skb->sk); + struct nlattr *bc; + int i; + + for (i =3D diag_ctx->l_slot; i < INET_LHTABLE_SIZE; i++) { + struct inet_listen_hashbucket *ilb; + struct hlist_nulls_node *node; + struct sock *sk; + int num =3D 0; + + ilb =3D &tcp_hashinfo.listening_hash[i]; + + rcu_read_lock(); + spin_lock(&ilb->lock); + sk_nulls_for_each(sk, node, &ilb->nulls_head) { + const struct mptcp_subflow_context *ctx =3D mptcp_subflow_ctx(sk); + struct inet_sock *inet =3D inet_sk(sk); + int ret; + + if (num < diag_ctx->l_num) + goto next_listen; + + if (!ctx || strcmp(inet_csk(sk)->icsk_ulp_ops->name, "mptcp")) + goto next_listen; + + sk =3D ctx->conn; + if (!sk || !net_eq(sock_net(sk), net)) + goto next_listen; + + if (r->sdiag_family !=3D AF_UNSPEC && + sk->sk_family !=3D r->sdiag_family) + goto next_listen; + + if (r->id.idiag_sport !=3D inet->inet_sport && + r->id.idiag_sport) + goto next_listen; + + if (!refcount_inc_not_zero(&sk->sk_refcnt)) + goto next_listen; + + ret =3D sk_diag_dump(sk, skb, cb, r, bc, net_admin); + sock_put(sk); + if (ret < 0) { + spin_unlock(&ilb->lock); + rcu_read_unlock(); + diag_ctx->l_slot =3D i; + diag_ctx->l_num =3D num; + return; + } + diag_ctx->l_num =3D num + 1; + num =3D 0; +next_listen: + ++num; + } + spin_unlock(&ilb->lock); + rcu_read_unlock(); + + cond_resched(); + diag_ctx->l_num =3D 0; + } + + diag_ctx->l_num =3D 0; + diag_ctx->l_slot =3D i; +} + static void mptcp_diag_dump(struct sk_buff *skb, struct netlink_callback *= cb, const struct inet_diag_req_v2 *r) { @@ -114,6 +186,9 @@ static void mptcp_diag_dump(struct sk_buff *skb, struct= netlink_callback *cb, } cond_resched(); } + + if ((r->idiag_states & TCPF_LISTEN) && r->id.idiag_dport =3D=3D 0) + mptcp_diag_dump_listeners(skb, cb, r, net_admin); } =20 static void mptcp_diag_get_info(struct sock *sk, struct inet_diag_msg *r, @@ -124,6 +199,19 @@ static void mptcp_diag_get_info(struct sock *sk, struc= t inet_diag_msg *r, =20 r->idiag_rqueue =3D sk_rmem_alloc_get(sk); r->idiag_wqueue =3D sk_wmem_alloc_get(sk); + + if (inet_sk_state_load(sk) =3D=3D TCP_LISTEN) { + struct sock *lsk =3D READ_ONCE(msk->first); + + if (lsk) { + /* override with settings from tcp listener, + * so Send-Q will show accept queue. + */ + r->idiag_rqueue =3D READ_ONCE(lsk->sk_ack_backlog); + r->idiag_wqueue =3D READ_ONCE(lsk->sk_max_ack_backlog); + } + } + if (!info) return; =20 --=20 2.35.1