mptcp: add new mptcp_fill_diag helper
authorFlorian Westphal <fw@strlen.de>
Fri, 17 Sep 2021 23:33:18 +0000 (16:33 -0700)
committerDavid S. Miller <davem@davemloft.net>
Sat, 18 Sep 2021 13:20:00 +0000 (14:20 +0100)
Will be re-used from getsockopt path.
Since diag can be a module, we can't export the helper from diag, it
needs to be moved to core.

Signed-off-by: Florian Westphal <fw@strlen.de>
Signed-off-by: Mat Martineau <mathew.j.martineau@linux.intel.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
include/net/mptcp.h
net/mptcp/mptcp_diag.c
net/mptcp/sockopt.c

index 6026bbe..f83fa48 100644 (file)
@@ -12,6 +12,8 @@
 #include <linux/tcp.h>
 #include <linux/types.h>
 
+struct mptcp_info;
+struct mptcp_sock;
 struct seq_file;
 
 /* MPTCP sk_buff extension data */
@@ -121,6 +123,8 @@ bool mptcp_incoming_options(struct sock *sk, struct sk_buff *skb);
 void mptcp_write_options(__be32 *ptr, const struct tcp_sock *tp,
                         struct mptcp_out_options *opts);
 
+void mptcp_diag_fill_info(struct mptcp_sock *msk, struct mptcp_info *info);
+
 /* move the skb extension owership, with the assumption that 'to' is
  * newly allocated
  */
index f48eb63..fdf0c1f 100644 (file)
@@ -113,37 +113,13 @@ static void mptcp_diag_get_info(struct sock *sk, struct inet_diag_msg *r,
 {
        struct mptcp_sock *msk = mptcp_sk(sk);
        struct mptcp_info *info = _info;
-       u32 flags = 0;
-       bool slow;
-       u8 val;
 
        r->idiag_rqueue = sk_rmem_alloc_get(sk);
        r->idiag_wqueue = sk_wmem_alloc_get(sk);
        if (!info)
                return;
 
-       slow = lock_sock_fast(sk);
-       info->mptcpi_subflows = READ_ONCE(msk->pm.subflows);
-       info->mptcpi_add_addr_signal = READ_ONCE(msk->pm.add_addr_signaled);
-       info->mptcpi_add_addr_accepted = READ_ONCE(msk->pm.add_addr_accepted);
-       info->mptcpi_local_addr_used = READ_ONCE(msk->pm.local_addr_used);
-       info->mptcpi_subflows_max = mptcp_pm_get_subflows_max(msk);
-       val = mptcp_pm_get_add_addr_signal_max(msk);
-       info->mptcpi_add_addr_signal_max = val;
-       val = mptcp_pm_get_add_addr_accept_max(msk);
-       info->mptcpi_add_addr_accepted_max = val;
-       info->mptcpi_local_addr_max = mptcp_pm_get_local_addr_max(msk);
-       if (test_bit(MPTCP_FALLBACK_DONE, &msk->flags))
-               flags |= MPTCP_INFO_FLAG_FALLBACK;
-       if (READ_ONCE(msk->can_ack))
-               flags |= MPTCP_INFO_FLAG_REMOTE_KEY_RECEIVED;
-       info->mptcpi_flags = flags;
-       info->mptcpi_token = READ_ONCE(msk->token);
-       info->mptcpi_write_seq = READ_ONCE(msk->write_seq);
-       info->mptcpi_snd_una = READ_ONCE(msk->snd_una);
-       info->mptcpi_rcv_nxt = READ_ONCE(msk->ack_seq);
-       info->mptcpi_csum_enabled = READ_ONCE(msk->csum_enabled);
-       unlock_sock_fast(sk, slow);
+       mptcp_diag_fill_info(msk, info);
 }
 
 static const struct inet_diag_handler mptcp_diag_handler = {
index 8c03afa..54f0d52 100644 (file)
@@ -670,6 +670,38 @@ out:
        return ret;
 }
 
+void mptcp_diag_fill_info(struct mptcp_sock *msk, struct mptcp_info *info)
+{
+       struct sock *sk = &msk->sk.icsk_inet.sk;
+       bool slow = lock_sock_fast(sk);
+       u32 flags = 0;
+       u8 val;
+
+       info->mptcpi_subflows = READ_ONCE(msk->pm.subflows);
+       info->mptcpi_add_addr_signal = READ_ONCE(msk->pm.add_addr_signaled);
+       info->mptcpi_add_addr_accepted = READ_ONCE(msk->pm.add_addr_accepted);
+       info->mptcpi_local_addr_used = READ_ONCE(msk->pm.local_addr_used);
+       info->mptcpi_subflows_max = mptcp_pm_get_subflows_max(msk);
+       val = mptcp_pm_get_add_addr_signal_max(msk);
+       info->mptcpi_add_addr_signal_max = val;
+       val = mptcp_pm_get_add_addr_accept_max(msk);
+       info->mptcpi_add_addr_accepted_max = val;
+       info->mptcpi_local_addr_max = mptcp_pm_get_local_addr_max(msk);
+       if (test_bit(MPTCP_FALLBACK_DONE, &msk->flags))
+               flags |= MPTCP_INFO_FLAG_FALLBACK;
+       if (READ_ONCE(msk->can_ack))
+               flags |= MPTCP_INFO_FLAG_REMOTE_KEY_RECEIVED;
+       info->mptcpi_flags = flags;
+       info->mptcpi_token = READ_ONCE(msk->token);
+       info->mptcpi_write_seq = READ_ONCE(msk->write_seq);
+       info->mptcpi_snd_una = READ_ONCE(msk->snd_una);
+       info->mptcpi_rcv_nxt = READ_ONCE(msk->ack_seq);
+       info->mptcpi_csum_enabled = READ_ONCE(msk->csum_enabled);
+
+       unlock_sock_fast(sk, slow);
+}
+EXPORT_SYMBOL_GPL(mptcp_diag_fill_info);
+
 static int mptcp_getsockopt_sol_tcp(struct mptcp_sock *msk, int optname,
                                    char __user *optval, int __user *optlen)
 {