On 09/25/2018 07:34 AM, Jon Maloy wrote:
> We refactor the function tipc_sk_filter_connect(), both to make it
> more readable and as a preparation for the next commit.
> 
> Signed-off-by: Jon Maloy <[email protected]>
> ---
>  net/tipc/socket.c | 101 
> +++++++++++++++++++++++-------------------------------
>  1 file changed, 43 insertions(+), 58 deletions(-)
> 
> diff --git a/net/tipc/socket.c b/net/tipc/socket.c
> index 4c50cff..14e6471 100644
> --- a/net/tipc/socket.c
> +++ b/net/tipc/socket.c
> @@ -1959,91 +1959,76 @@ static void tipc_sk_proto_rcv(struct sock *sk,
>  }
>  
>  /**
> - * tipc_filter_connect - Handle incoming message for a connection-based 
> socket
> + * tipc_sk_filter_connect - check incoming message for a connection-based 
> socket
>   * @tsk: TIPC socket
> - * @skb: pointer to message buffer. Set to NULL if buffer is consumed
> - *
> - * Returns true if everything ok, false otherwise
> + * @skb: pointer to message buffer.
> + * Returns true if message should be added to receive queue, false otherwise
>   */
>  static bool tipc_sk_filter_connect(struct tipc_sock *tsk, struct sk_buff 
> *skb)
>  {
>       struct sock *sk = &tsk->sk;
>       struct net *net = sock_net(sk);
>       struct tipc_msg *hdr = buf_msg(skb);
> -     u32 pport = msg_origport(hdr);
> -     u32 pnode = msg_orignode(hdr);
> +     bool con_msg = msg_connected(hdr);
> +     u32 pport = tsk_peer_port(tsk);
> +     u32 pnode = tsk_peer_node(tsk);
> +     u32 oport = msg_origport(hdr);
> +     u32 onode = msg_orignode(hdr);
> +     int err = msg_errcode(hdr);
>  
>       if (unlikely(msg_mcast(hdr)))
>               return false;
>  
>       switch (sk->sk_state) {
>       case TIPC_CONNECTING:
> -             /* Accept only ACK or NACK message */
> -             if (unlikely(!msg_connected(hdr))) {
> -                     if (pport != tsk_peer_port(tsk) ||
> -                         pnode != tsk_peer_node(tsk))
> -                             return false;
> -
> -                     tipc_set_sk_state(sk, TIPC_DISCONNECTING);
> -                     sk->sk_err = ECONNREFUSED;
> -                     sk->sk_state_change(sk);
> -                     return true;
> -             }
> -
> -             if (unlikely(msg_errcode(hdr))) {
> -                     tipc_set_sk_state(sk, TIPC_DISCONNECTING);
> -                     sk->sk_err = ECONNREFUSED;
> -                     sk->sk_state_change(sk);
> -                     return true;
> -             }
> -
> -             if (unlikely(!msg_isdata(hdr))) {
> -                     tipc_set_sk_state(sk, TIPC_DISCONNECTING);
> -                     sk->sk_err = EINVAL;
> -                     sk->sk_state_change(sk);
> -                     return true;
> +             /* Setup ACK */
> +             if (likely(con_msg)) {
> +                     if (err)
> +                             break;
> +                     tipc_sk_finish_conn(tsk, oport, onode);
> +                     msg_set_importance(&tsk->phdr, msg_importance(hdr));
> +                     /* ACK+ message with data is added to receive queue */
> +                     if (msg_data_sz(hdr))
> +                             return true;
> +                     /* Empty ACK-, - wake up sleeping connect() and drop */
> +                     sk->sk_data_ready(sk);
> +                     msg_set_dest_droppable(hdr, 1);
> +                     return false;
>               }
> +             /* Ignore connectionless message if not from listening socket */
> +             if (oport != pport || onode != pnode)
> +                     return false;
>  
> -             tipc_sk_finish_conn(tsk, msg_origport(hdr), msg_orignode(hdr));
> -             msg_set_importance(&tsk->phdr, msg_importance(hdr));
> -
> -             /* If 'ACK+' message, add to socket receive queue */
> -             if (msg_data_sz(hdr))
> -                     return true;
> -
> -             /* If empty 'ACK-' message, wake up sleeping connect() */
> -             sk->sk_data_ready(sk);
> -
> -             /* 'ACK-' message is neither accepted nor rejected: */
> -             msg_set_dest_droppable(hdr, 1);
> -             return false;
> -
> +             /* Rejected SYN - abort */
> +             break;
>       case TIPC_OPEN:
>       case TIPC_DISCONNECTING:
> -             break;
> +             return false;
>       case TIPC_LISTEN:
>               /* Accept only SYN message */
> -             if (!msg_connected(hdr) && !(msg_errcode(hdr)))
> +             if (!con_msg && !err)
>                       return true;
> -             break;
> +             return false;
>       case TIPC_ESTABLISHED:
>               /* Accept only connection-based messages sent by peer */
> -             if (unlikely(!tsk_peer_msg(tsk, hdr)))
> +             if (likely(con_msg && !err && pport == oport && pnode == onode))
> +                     return true;
> +             if (!tsk_peer_msg(tsk, hdr))
>                       return false;
> -
> -             if (unlikely(msg_errcode(hdr))) {
> -                     tipc_set_sk_state(sk, TIPC_DISCONNECTING);
> -                     /* Let timer expire on it's own */
> -                     tipc_node_remove_conn(net, tsk_peer_node(tsk),
> -                                           tsk->portid);
> -                     sk->sk_state_change(sk);
> -             }
> +             if (!err)
> +                     return true;
> +             tipc_set_sk_state(sk, TIPC_DISCONNECTING);

It's better to set a error code to sk->sk_err.

> +             tipc_node_remove_conn(net, pnode, tsk->portid);
> +             sk->sk_state_change(sk);
>               return true;
>       default:
>               pr_err("Unknown sk_state %u\n", sk->sk_state);
>       }
> -
> -     return false;
> +     /* Abort connection setup attempt */
> +     tipc_set_sk_state(sk, TIPC_DISCONNECTING);
> +     sk->sk_err = ECONNREFUSED;
> +     sk->sk_state_change(sk);
> +     return true;
>  }
>  
>  /**
> 


_______________________________________________
tipc-discussion mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/tipc-discussion

Reply via email to