Hi Erik,

Thanks for the clarification. I updated the ptts suite to non-blocking connect
and ran it against my patches and they work.

https://github.com/parbhu/tipcutils/commit/d4df3bb37ff2b23c16ac107f671b5fd5146a4aeb

/Partha


On 2016-07-26 18:25, Erik Hugne wrote:
> I was thinking about nonblocking connect, thats a fairly new addition to
> tipc. And i there was no test for it in the  ptts suite last i checked.
>
> //E
>
> On Jul 26, 2016 14:30, "Parthasarathy Bhuvaragan" <
> parthasarathy.bhuvara...@ericsson.com> wrote:
>
>> Hi Erik,
>>
>> I did run some non blocking test for rdm and stream sockets and they work.
>> Can you elaborate if you have something specific in mind?
>>
>> /Partha
>> On 07/25/2016 10:28 PM, Erik Hugne wrote:
>>
>> Nonblocking sockets tested? :)
>>
>> //E
>>
>> On Jul 25, 2016 14:26, "Parthasarathy Bhuvaragan" 
>> <parthasarathy.bhuvara...@ericsson.com> wrote:
>>
>>
>> In this commit, we remove the state SS_CONNECTED and replace it
>> with the function tipc_sk_state_connected() wherever possible.
>> A socket with sk_state TIPC_ESTABLISHED or TIPC_PROBING replaces
>> the socket state SS_CONNECTED.
>>
>> After these changes, the sock->state is no longer explicitly used by
>> tipc. The FSM below is for various types of connection oriented sockets.
>>
>> Stream Server Listening Socket:
>> +------------------+        +-------------+
>> | TIPC_UNCONNECTED |------->| TIPC_LISTEN |
>> +------------------+        +-------------+
>>                                   |
>> +--------------------+            |
>> | TIPC_DISCONNECTING |<-----------+
>> +--------------------+
>>
>> Stream Server Data Socket:
>> +-----------------+        +------------------+
>> |TIPC_UNCONNECTED |------> | TIPC_ESTABLISHED |<---+
>> +-----------------+        +------------------+    |
>>                                ^   |    |          |
>>                                |   |    +----------+
>>                                |   v
>> +------------------+      +-------------+
>> |TIPC_DISCONNECTING|<-----|TIPC_PROBING |
>> +------------------+      +-------------+
>>
>> Stream Socket Client:
>> +-----------------+       +-----------------+
>> |TIPC_UNCONNECTED |------>| TIPC_CONNECTING |
>> +-----------------+       +-----------------+
>>                                   |
>>                                   |
>>                                   v
>>                           +------------------+
>>                           | TIPC_ESTABLISHED |<---+
>>                           +------------------+    |
>>                                ^   |    |         |
>>                                |   |    +---------+
>>                                |   v
>> +------------------+      +-------------+
>> |TIPC_DISCONNECTING|<-----|TIPC_PROBING |
>> +------------------+      +-------------+
>>
>> Signed-off-by: Parthasarathy Bhuvaragan 
>> <parthasarathy.bhuvara...@ericsson.com>
>> ---
>>  net/tipc/socket.c | 90
>> +++++++++++++++++++++++++------------------------------
>>  1 file changed, 41 insertions(+), 49 deletions(-)
>>
>> diff --git a/net/tipc/socket.c b/net/tipc/socket.c
>> index d2598186fb65..6128c1646866 100644
>> --- a/net/tipc/socket.c
>> +++ b/net/tipc/socket.c
>> @@ -286,7 +286,7 @@ static void tsk_rej_rx_queue(struct sock *sk)
>>
>>  static bool tipc_sk_state_connected(struct sock *sk)
>>  {
>> -       return sk->sk_socket->state == SS_CONNECTED;
>> +       return sk->sk_state == TIPC_ESTABLISHED || sk->sk_state ==
>> TIPC_PROBING;
>>  }
>>
>>  /* tipc_sk_type_connectionless - check if the socket is datagram socket
>> @@ -514,7 +514,7 @@ static int tipc_release(struct socket *sock)
>>                         kfree_skb(skb);
>>                 else {
>>                         if ((sk->sk_state == TIPC_CONNECTING) ||
>> -                           (sock->state == SS_CONNECTED)) {
>> +                           tipc_sk_state_connected(sk)) {
>>                                 tipc_set_state(sk, TIPC_DISCONNECTING);
>>                                 tipc_node_remove_conn(net, dnode,
>> tsk->portid);
>>                         }
>> @@ -628,7 +628,7 @@ static int tipc_getname(struct socket *sock, struct
>> sockaddr *uaddr,
>>
>>         memset(addr, 0, sizeof(*addr));
>>         if (peer) {
>> -               if ((sock->state != SS_CONNECTED) &&
>> +               if ((!tipc_sk_state_connected(sk)) &&
>>                     ((peer != 2) || (sk->sk_state != TIPC_DISCONNECTING)))
>>                         return -ENOTCONN;
>>                 addr->addr.id.ref = tsk_peer_port(tsk);
>> @@ -704,28 +704,24 @@ static unsigned int tipc_poll(struct file *file,
>> struct socket *sock,
>>                 return mask;
>>         }
>>
>> -       switch ((int)sock->state) {
>> -       case SS_CONNECTED:
>> +       switch (sk->sk_state) {
>> +       case TIPC_PROBING:
>> +       case TIPC_ESTABLISHED:
>>                 if (!tsk->link_cong && !tsk_conn_cong(tsk))
>>                         mask |= POLLOUT;
>> +               /* fall thru' */
>> +       case TIPC_LISTEN:
>> +       case TIPC_CONNECTING:
>>                 if (!skb_queue_empty(&sk->sk_receive_queue))
>>                         mask |= (POLLIN | POLLRDNORM);
>>                 break;
>> -       default:
>> -               switch (sk->sk_state) {
>> -               case TIPC_UNCONNECTED:
>> -                       if (!tsk->link_cong)
>> -                               mask |= POLLOUT;
>> -                       break;
>> -               case TIPC_LISTEN:
>> -               case TIPC_CONNECTING:
>> -                       if (!skb_queue_empty(&sk->sk_receive_queue))
>> -                               mask |= (POLLIN | POLLRDNORM);
>> -                       break;
>> -               case TIPC_DISCONNECTING:
>> -                       mask = (POLLIN | POLLRDNORM | POLLHUP);
>> -                       break;
>> -               }
>> +       case TIPC_UNCONNECTED:
>> +               if (!tsk->link_cong)
>> +                       mask |= POLLOUT;
>> +               break;
>> +       case TIPC_DISCONNECTING:
>> +               mask = (POLLIN | POLLRDNORM | POLLHUP);
>> +               break;
>>         }
>>
>>         return mask;
>> @@ -1056,7 +1052,7 @@ static int tipc_wait_for_sndpkt(struct socket *sock,
>> long *timeo_p)
>>                         return err;
>>                 if (sk->sk_state == TIPC_DISCONNECTING)
>>                         return -EPIPE;
>> -               else if (sock->state != SS_CONNECTED)
>> +               else if (!tipc_sk_state_connected(sk))
>>                         return -ENOTCONN;
>>                 if (!*timeo_p)
>>                         return -EAGAIN;
>> @@ -1123,7 +1119,7 @@ static int __tipc_send_stream(struct socket *sock,
>> struct msghdr *m, size_t dsz)
>>         if (dsz > (uint)INT_MAX)
>>                 return -EMSGSIZE;
>>
>> -       if (unlikely(sock->state != SS_CONNECTED)) {
>> +       if (unlikely(!tipc_sk_state_connected(sk))) {
>>                 if (sk->sk_state == TIPC_DISCONNECTING)
>>                         return -EPIPE;
>>                 else
>> @@ -1633,28 +1629,11 @@ static bool filter_connect(struct tipc_sock *tsk,
>> struct sk_buff *skb)
>>  {
>>         struct sock *sk = &tsk->sk;
>>         struct net *net = sock_net(sk);
>> -       struct socket *sock = sk->sk_socket;
>>         struct tipc_msg *hdr = buf_msg(skb);
>>
>>         if (unlikely(msg_mcast(hdr)))
>>                 return false;
>>
>> -       switch ((int)sock->state) {
>> -       case SS_CONNECTED:
>> -
>> -               /* Accept only connection-based messages sent by peer */
>> -               if (unlikely(!tsk_peer_msg(tsk, hdr)))
>> -                       return false;
>> -
>> -               if (unlikely(msg_errcode(hdr))) {
>> -                       tipc_set_state(sk, TIPC_DISCONNECTING);
>> -                       /* Let timer expire on it's own */
>> -                       tipc_node_remove_conn(net, tsk_peer_node(tsk),
>> -                                             tsk->portid);
>> -               }
>> -               return true;
>> -       }
>> -
>>         switch (sk->sk_state) {
>>         case TIPC_CONNECTING:
>>                 /* Accept only ACK or NACK message */
>> @@ -1675,7 +1654,6 @@ static bool filter_connect(struct tipc_sock *tsk,
>> struct sk_buff *skb)
>>
>>                 tipc_sk_finish_conn(tsk, msg_origport(hdr),
>> msg_orignode(hdr));
>>                 msg_set_importance(&tsk->phdr, msg_importance(hdr));
>> -               sock->state = SS_CONNECTED;
>>
>>                 /* If 'ACK+' message, add to socket receive queue */
>>                 if (msg_data_sz(hdr))
>> @@ -1700,6 +1678,19 @@ static bool filter_connect(struct tipc_sock *tsk,
>> struct sk_buff *skb)
>>                 if (!msg_connected(hdr) && !(msg_errcode(hdr)))
>>                         return true;
>>                 break;
>> +       case TIPC_PROBING:
>> +       case TIPC_ESTABLISHED:
>> +               /* Accept only connection-based messages sent by peer */
>> +               if (unlikely(!tsk_peer_msg(tsk, hdr)))
>> +                       return false;
>> +
>> +               if (unlikely(msg_errcode(hdr))) {
>> +                       tipc_set_state(sk, TIPC_DISCONNECTING);
>> +                       /* Let timer expire on it's own */
>> +                       tipc_node_remove_conn(net, tsk_peer_node(tsk),
>> +                                             tsk->portid);
>> +               }
>> +               return true;
>>         default:
>>                 pr_err("Unknown sk_state %u\n", sk->sk_state);
>>         }
>> @@ -2045,13 +2036,14 @@ static int tipc_connect(struct socket *sock,
>> struct sockaddr *dest,
>>                 timeout = msecs_to_jiffies(timeout);
>>                 /* Wait until an 'ACK' or 'RST' arrives, or a timeout
>> occurs */
>>                 res = tipc_wait_for_connect(sock, &timeout);
>> -               goto exit;
>> -       }
>> -
>> -       if (sock->state == SS_CONNECTED)
>> +               break;
>> +       case TIPC_PROBING:
>> +       case TIPC_ESTABLISHED:
>>                 res = -EISCONN;
>> -       else
>> +               break;
>> +       default:
>>                 res = -EINVAL;
>> +       }
>>
>>  exit:
>>         release_sock(sk);
>> @@ -2160,7 +2152,6 @@ static int tipc_accept(struct socket *sock, struct
>> socket *new_sock, int flags)
>>
>>         /* Connect new socket to it's peer */
>>         tipc_sk_finish_conn(new_tsock, msg_origport(msg),
>> msg_orignode(msg));
>> -       new_sock->state = SS_CONNECTED;
>>
>>         tsk_set_importance(new_tsock, msg_importance(msg));
>>         if (msg_named(msg)) {
>> @@ -2214,7 +2205,10 @@ static int tipc_shutdown(struct socket *sock, int
>> how)
>>
>>         lock_sock(sk);
>>
>> -       if (sock->state == SS_CONNECTED || sk->sk_state ==
>> TIPC_CONNECTING) {
>> +       switch (sk->sk_state) {
>> +       case TIPC_PROBING:
>> +       case TIPC_CONNECTING:
>> +       case TIPC_ESTABLISHED:
>>
>>  restart:
>>                 dnode = tsk_peer_node(tsk);
>> @@ -2236,9 +2230,7 @@ restart:
>>                 }
>>                 tipc_set_state(sk, TIPC_DISCONNECTING);
>>                 tipc_node_remove_conn(net, dnode, tsk->portid);
>> -       }
>>
>> -       switch (sk->sk_state) {
>>         case TIPC_DISCONNECTING:
>>
>>                 /* Discard any unreceived messages */
>> --
>> 2.1.4
>>
>>
>>
>>
>>

------------------------------------------------------------------------------
What NetFlow Analyzer can do for you? Monitors network bandwidth and traffic
patterns at an interface-level. Reveals which users, apps, and protocols are 
consuming the most bandwidth. Provides multi-vendor support for NetFlow, 
J-Flow, sFlow and other flows. Make informed decisions using capacity planning
reports.http://sdm.link/zohodev2dev
_______________________________________________
tipc-discussion mailing list
tipc-discussion@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/tipc-discussion

Reply via email to