]> git.proxmox.com Git - mirror_ubuntu-kernels.git/commitdiff
mptcp: Add mptcp_close_state() helper
authorMat Martineau <mathew.j.martineau@linux.intel.com>
Tue, 28 Jul 2020 22:12:04 +0000 (15:12 -0700)
committerDavid S. Miller <davem@davemloft.net>
Wed, 29 Jul 2020 00:02:42 +0000 (17:02 -0700)
This will be used to transition to the appropriate state on close and
determine if a DATA_FIN needs to be sent for that state transition.

Signed-off-by: Mat Martineau <mathew.j.martineau@linux.intel.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
net/mptcp/protocol.c

index e1c71bfd61a325fb8e51880a95c2c0297df2f08c..51370b69e30b6c1f369a2f3c476533a110010bcf 100644 (file)
@@ -1498,6 +1498,33 @@ static void mptcp_subflow_shutdown(struct sock *ssk, int how)
        release_sock(ssk);
 }
 
+static const unsigned char new_state[16] = {
+       /* current state:     new state:      action:   */
+       [0 /* (Invalid) */] = TCP_CLOSE,
+       [TCP_ESTABLISHED]   = TCP_FIN_WAIT1 | TCP_ACTION_FIN,
+       [TCP_SYN_SENT]      = TCP_CLOSE,
+       [TCP_SYN_RECV]      = TCP_FIN_WAIT1 | TCP_ACTION_FIN,
+       [TCP_FIN_WAIT1]     = TCP_FIN_WAIT1,
+       [TCP_FIN_WAIT2]     = TCP_FIN_WAIT2,
+       [TCP_TIME_WAIT]     = TCP_CLOSE,        /* should not happen ! */
+       [TCP_CLOSE]         = TCP_CLOSE,
+       [TCP_CLOSE_WAIT]    = TCP_LAST_ACK  | TCP_ACTION_FIN,
+       [TCP_LAST_ACK]      = TCP_LAST_ACK,
+       [TCP_LISTEN]        = TCP_CLOSE,
+       [TCP_CLOSING]       = TCP_CLOSING,
+       [TCP_NEW_SYN_RECV]  = TCP_CLOSE,        /* should not happen ! */
+};
+
+static int mptcp_close_state(struct sock *sk)
+{
+       int next = (int)new_state[sk->sk_state];
+       int ns = next & TCP_STATE_MASK;
+
+       inet_sk_state_store(sk, ns);
+
+       return next & TCP_ACTION_FIN;
+}
+
 static void mptcp_close(struct sock *sk, long timeout)
 {
        struct mptcp_subflow_context *subflow, *tmp;