From patchwork Thu Oct 27 14:22:35 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Parthasarathy Bhuvaragan X-Patchwork-Id: 687669 X-Patchwork-Delegate: davem@davemloft.net Return-Path: X-Original-To: patchwork-incoming@ozlabs.org Delivered-To: patchwork-incoming@ozlabs.org Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 3t4Tdr1BxNz9vDg for ; Fri, 28 Oct 2016 01:23:44 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1030426AbcJ0OXe (ORCPT ); Thu, 27 Oct 2016 10:23:34 -0400 Received: from sessmg22.ericsson.net ([193.180.251.58]:52694 "EHLO sessmg22.ericsson.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S966135AbcJ0OXQ (ORCPT ); Thu, 27 Oct 2016 10:23:16 -0400 X-AuditID: c1b4fb3a-18c55980000078c6-da-58120dd1fdbd Received: from ESESSHC011.ericsson.se (Unknown_Domain [153.88.183.51]) by (Symantec Mail Security) with SMTP id 34.B3.30918.1DD02185; Thu, 27 Oct 2016 16:23:14 +0200 (CEST) Received: from tipsy.lab.linux.ericsson.se (10.35.28.120) by ESESSHC011.ericsson.se (153.88.183.51) with Microsoft SMTP Server (TLS) id 14.3.319.2; Thu, 27 Oct 2016 16:23:12 +0200 From: Parthasarathy Bhuvaragan To: CC: , , , Subject: [PATCH net-next v1 14/16] tipc: create TIPC_CLOSING as a new sk_state Date: Thu, 27 Oct 2016 16:22:35 +0200 Message-ID: <1477578157-13256-15-git-send-email-parthasarathy.bhuvaragan@ericsson.com> X-Mailer: git-send-email 2.1.4 In-Reply-To: <1477578157-13256-1-git-send-email-parthasarathy.bhuvaragan@ericsson.com> References: <1477578157-13256-1-git-send-email-parthasarathy.bhuvaragan@ericsson.com> MIME-Version: 1.0 X-Originating-IP: [10.35.28.120] X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFtrBLMWRmVeSWpSXmKPExsUyM2K7se4lXqEIgy0TuC0WLTrMZHFsgZjF lvNZFo+vX2d2YPF433OFyWP3gs9MHp83yXms37KVKYAlissmJTUnsyy1SN8ugSvjxOa9bAV/ FSqaT9xkaWBcJtXFyMkhIWAiMW1ZA1sXIxeHkMB6RolbuztYQBJCAtsZJf6v9eti5OBgE3CT mNecABIWEZCRONq/gA3EZhYokzjZ9p4RxBYW8JN4MuExWCuLgKrE4g0PWUFsXoEwia4fDYwQ u+Qkzh//yQxicwLFb659xAaxKlTi2t+tbBD1ghInZz5hgZgvIXHwxQtmiBojiQkXjzNBzFGQ +Dazm2kCo8AsJC2zkLQsYGRaxShanFpcnJtuZKSXWpSZXFycn6eXl1qyiREYnge3/LbawXjw ueMhRgEORiUe3gQOoQgh1sSy4srcQ4wSHMxKIrxfuIBCvCmJlVWpRfnxRaU5qcWHGKU5WJTE ec1W3g8XEkhPLEnNTk0tSC2CyTJxcEo1MOpOCDS2Napd+Ohb/TzZRwkGvEF6xk9XxwnxP9rd 3REw96Jzedfdh/KuN5Uj7s9um+31uWfRwvmCed+2R0rcWJ5jeW/O4TfzYlWftFbkpDocCn4X 6Pxxw/3lf/Z1cEduafveUr3KU+j2+2ov50s6EcWnxFgMlgpf23y8vCPdsrZXyOlE7KV5+Uos xRmJhlrMRcWJADA+fupLAgAA Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org In this commit, we create a new tipc socket state TIPC_CLOSING in sk_state. We primarily replace all the remaining references to SS_DISCONNECTING sock->state with TIPC_CLOSING. Thus the FSM for sockets will be as follows: For connectionless sockets: +-----------+ +--------------+ | TIPC_OPEN |------>| TIPC_CLOSING | +-----------+ +--------------+ For connection oriented sockets: +-----------+ +------------------+ +--------------+ | TIPC_OPEN |------>| TIPC_XXXX (1..N) |----->| TIPC_CLOSING | +-----------+ +------------------+ +--------------+ There is no functional change in this commit. Acked-by: Ying Xue Acked-by: Jon Maloy Signed-off-by: Parthasarathy Bhuvaragan --- include/uapi/linux/tipc.h | 1 + net/tipc/socket.c | 19 ++++++++----------- 2 files changed, 9 insertions(+), 11 deletions(-) diff --git a/include/uapi/linux/tipc.h b/include/uapi/linux/tipc.h index f5c03fdfc8a8..a45ebf273e76 100644 --- a/include/uapi/linux/tipc.h +++ b/include/uapi/linux/tipc.h @@ -185,6 +185,7 @@ enum { TIPC_ESTABLISHED, TIPC_OPEN, TIPC_DISCONNECTING, + TIPC_CLOSING, }; /* diff --git a/net/tipc/socket.c b/net/tipc/socket.c index 6fef087c4aac..cddf9bca9a90 100644 --- a/net/tipc/socket.c +++ b/net/tipc/socket.c @@ -348,6 +348,7 @@ static int tipc_set_sk_state(struct sock *sk, int state) switch (state) { case TIPC_OPEN: + case TIPC_CLOSING: res = 0; break; case TIPC_LISTEN: @@ -508,7 +509,7 @@ static int tipc_release(struct socket *sock) * (which disconnects locally & sends a 'FIN+' to peer) */ dnode = tsk_peer_node(tsk); - while (sock->state != SS_DISCONNECTING) { + while (sk->sk_state != TIPC_CLOSING) { skb = __skb_dequeue(&sk->sk_receive_queue); if (skb == NULL) break; @@ -517,7 +518,7 @@ static int tipc_release(struct socket *sock) else { if ((sock->state == SS_CONNECTING) || (sock->state == SS_CONNECTED)) { - sock->state = SS_DISCONNECTING; + tipc_set_sk_state(sk, TIPC_CLOSING); tipc_node_remove_conn(net, dnode, tsk->portid); } tipc_sk_respond(sk, skb, TIPC_ERR_NO_PORT); @@ -538,7 +539,7 @@ static int tipc_release(struct socket *sock) } /* Reject any messages that accumulated in backlog queue */ - sock->state = SS_DISCONNECTING; + tipc_set_sk_state(sk, TIPC_CLOSING); release_sock(sk); call_rcu(&tsk->rcu, tipc_sk_callback); @@ -685,9 +686,6 @@ static unsigned int tipc_poll(struct file *file, struct socket *sock, if (!skb_queue_empty(&sk->sk_receive_queue)) mask |= (POLLIN | POLLRDNORM); break; - case SS_DISCONNECTING: - mask = (POLLIN | POLLRDNORM | POLLHUP); - break; default: switch (sk->sk_state) { case TIPC_OPEN: @@ -697,6 +695,7 @@ static unsigned int tipc_poll(struct file *file, struct socket *sock, (!skb_queue_empty(&sk->sk_receive_queue))) mask |= (POLLIN | POLLRDNORM); break; + case TIPC_CLOSING: case TIPC_DISCONNECTING: mask = (POLLIN | POLLRDNORM | POLLHUP); break; @@ -881,7 +880,7 @@ static int tipc_wait_for_sndmsg(struct socket *sock, long *timeo_p) int err = sock_error(sk); if (err) return err; - if (sock->state == SS_DISCONNECTING) + if (sk->sk_state == TIPC_CLOSING) return -EPIPE; if (!*timeo_p) return -EAGAIN; @@ -1334,7 +1333,7 @@ static int tipc_wait_for_rcvmsg(struct socket *sock, long *timeop) for (;;) { prepare_to_wait(sk_sleep(sk), &wait, TASK_INTERRUPTIBLE); if (timeo && skb_queue_empty(&sk->sk_receive_queue)) { - if (sock->state == SS_DISCONNECTING) { + if (sk->sk_state == TIPC_CLOSING) { err = -ENOTCONN; break; } @@ -1675,13 +1674,11 @@ static bool filter_connect(struct tipc_sock *tsk, struct sk_buff *skb) /* 'ACK-' message is neither accepted nor rejected: */ msg_set_dest_droppable(hdr, 1); return false; - - case SS_DISCONNECTING: - break; } switch (sk->sk_state) { case TIPC_OPEN: + case TIPC_CLOSING: case TIPC_DISCONNECTING: break; case TIPC_LISTEN: