From nobody Mon Feb 9 15:10:09 2026 Delivered-To: wpasupplicant.patchew@gmail.com Received: by 2002:a05:6a06:1788:b0:4ac:5e5b:1ad1 with SMTP id y8csp901153piq; Tue, 29 Mar 2022 04:35:46 -0700 (PDT) X-Google-Smtp-Source: ABdhPJwJdhetQBjF/Pavpdh0OHHg6a1ibP2UkwQHVxMKEeyO7YiV5J/qRMtjgnkye+JOcdK7qMSt X-Received: by 2002:a05:622a:194:b0:2e1:e733:5798 with SMTP id s20-20020a05622a019400b002e1e7335798mr27009890qtw.104.1648553746283; Tue, 29 Mar 2022 04:35:46 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1648553746; cv=none; d=google.com; s=arc-20160816; b=WOVImS2bXgeVrrQGo0gUC65vKD3DqoqH/ZdVY8guqP/2SPpKLKDbu385AKf4ToJcTz 1pXE/N7TulwhvLZqOfRGYkxzMd4eakfGCzpZm8tt0bEBnBRkdoVXspGxmrlCYAF109H9 4ZshLFAYeHpM29lHwcpzE0VUfc7Tlh0GOazH57aVlezc04WaFh9PGA7SWjZucWldXvSu UDzLeaXyLQO2AHyArs7CoKE9piFV+n0gXYrwf+4jgUkSG3nAR+Yo1J1u9g+vUSXZi/bI zqb+dbifeCstXuUibQ4zt7O+Om+xZNlCbzFkB5SQQpohhpy9o/154g30LMWm5KUCLIXk b7Dw== 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=5nJ7PuPBElyeSTmWW18NHtoa7bqBAlt8zL7RUymUDIU=; b=Rq7HidCprjZ0PJhCks8U564BDCUdokikjR6fRXpNzwMP/C7q2R5nnG89ubW8QtSOQP iIr5rs0SvuJgoIHC6CxdfqXngK5CSm841DyRHagzzDbMg1vPBmuCaKhLqPU8Q/P4LF23 GhzAKL4QjvsyFlXB7YGnj9hTeAz6JmdlQ9fTWfLnCxVlNaSGN/UrcS6lzjhza5AvthxG VKbylXUhwobb8zGkpklynhayhsg5L6nUtUpcA+k4cDosg95MR/0mzCNRh3HHkwTPIl7+ p1v9gO3sMDa0qEbQ24sebdiB7sRQkCBIouwLNe1D/Oh/wONmAisp8FbuMq4iRO3D0KQa iZXg== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of mptcp+bounces-4525-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 147.75.197.195 as permitted sender) smtp.mailfrom="mptcp+bounces-4525-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 w8-20020a05622a134800b002e06509adf3si11370952qtk.0.2022.03.29.04.35.46 for (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Tue, 29 Mar 2022 04:35:46 -0700 (PDT) Received-SPF: pass (google.com: domain of mptcp+bounces-4525-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-4525-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 147.75.197.195 as permitted sender) smtp.mailfrom="mptcp+bounces-4525-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 ED7601C0781 for ; Tue, 29 Mar 2022 11:35:45 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 60C987C; Tue, 29 Mar 2022 11:35: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 D9E64211E for ; Tue, 29 Mar 2022 11:35:42 +0000 (UTC) Received: from fw by Chamillionaire.breakpoint.cc with local (Exim 4.92) (envelope-from ) id 1nZA8T-0004uY-31; Tue, 29 Mar 2022 13:35:41 +0200 From: Florian Westphal To: Cc: Florian Westphal Subject: [PATCH mptcp-next v3 3/4] mptcp: listen diag dump support Date: Tue, 29 Mar 2022 13:35:22 +0200 Message-Id: <20220329113523.19793-4-fw@strlen.de> X-Mailer: git-send-email 2.35.1 In-Reply-To: <20220329113523.19793-1-fw@strlen.de> References: <20220329113523.19793-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 --- Changes: - init nlattr *bc properly - fix sock_put indentation net/mptcp/mptcp_diag.c | 91 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 91 insertions(+) diff --git a/net/mptcp/mptcp_diag.c b/net/mptcp/mptcp_diag.c index c4992eeb67d8..dbb6d876a203 100644 --- a/net/mptcp/mptcp_diag.c +++ b/net/mptcp/mptcp_diag.c @@ -69,8 +69,83 @@ 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 inet_diag_dump_data *cb_data =3D cb->data; + struct mptcp_diag_ctx *diag_ctx =3D (void *)cb->ctx; + struct nlattr *bc =3D cb_data->inet_diag_nla_bc; + struct net *net =3D sock_net(skb->sk); + 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 +189,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 +202,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