Hi Partha,
I am working on the backlog from SLES12spt to upstream (I found I had missed 
4-5 bug corrections).
I hope you find  time to have a look at this one, which is one of your own 
patches from sp2 adapted to current upstream.
I did a basic test, and it looked ok, but I still want to hear if you have any 
comments.

BR
///jon


-----Original Message-----
From: Jon Maloy 
Sent: September 25, 2018 3:15 PM
To: Jon Maloy <[email protected]>; Jon Maloy <[email protected]>
Cc: Mohan Krishna Ghanta Krishnamurthy 
<[email protected]>; 
[email protected]; Tung Quang Nguyen 
<[email protected]>; Hoang Huu Le <[email protected]>; Canh 
Duc Luu <[email protected]>; Gordan Mihaljevic 
<[email protected]>; [email protected]; 
[email protected]; [email protected]
Subject: [net 1/1] tipc: queue socket protocol error messages into socket 
receive buffer

From: Parthasarathy Bhuvaragan <[email protected]>

In tipc_sk_filter_rcv(), when we detect protocol messages with error we call 
tipc_sk_conn_proto_rcv() and let it reset the connection and notify the socket 
by calling sk->sk_state_change().

However, tipc_sk_filter_rcv() may have been called from the function 
tipc_backlog_rcv(), in which case the socket lock is held and the socket 
already awake. This means that the sk_state_change() call is ignored and the 
error notification lost. Now the receive queue will remain empty and the socket 
sleeps forever.

In this commit, we convert the protocol message into a connection abort message 
and enqueue it into the socket's receive queue. By this addition to the above 
state change we cover all conditions.

Signed-off-by: Parthasarathy Bhuvaragan <[email protected]>
Signed-off-by: Jon Maloy <[email protected]>
---
 net/tipc/socket.c | 14 ++++++++++++--
 1 file changed, 12 insertions(+), 2 deletions(-)

diff --git a/net/tipc/socket.c b/net/tipc/socket.c index b6f99b0..49810fd 100644
--- a/net/tipc/socket.c
+++ b/net/tipc/socket.c
@@ -1196,6 +1196,7 @@ void tipc_sk_mcast_rcv(struct net *net, struct 
sk_buff_head *arrvq,
  * @skb: pointer to message buffer.
  */
 static void tipc_sk_conn_proto_rcv(struct tipc_sock *tsk, struct sk_buff *skb,
+                                  struct sk_buff_head *inputq,
                                   struct sk_buff_head *xmitq)
 {
        struct tipc_msg *hdr = buf_msg(skb);
@@ -1213,7 +1214,16 @@ static void tipc_sk_conn_proto_rcv(struct tipc_sock 
*tsk, struct sk_buff *skb,
                tipc_node_remove_conn(sock_net(sk), tsk_peer_node(tsk),
                                      tsk_peer_port(tsk));
                sk->sk_state_change(sk);
-               goto exit;
+
+               /* State change is ignored if socket already awake,
+                * - convert msg to abort msg and add to inqueue
+                */
+               msg_set_user(hdr, TIPC_CRITICAL_IMPORTANCE);
+               msg_set_type(hdr, TIPC_CONN_MSG);
+               msg_set_size(hdr, BASIC_H_SIZE);
+               msg_set_hdr_sz(hdr, BASIC_H_SIZE);
+               __skb_queue_tail(inputq, skb);
+               return;
        }
 
        tsk->probe_unacked = false;
@@ -1936,7 +1946,7 @@ static void tipc_sk_proto_rcv(struct sock *sk,
 
        switch (msg_user(hdr)) {
        case CONN_MANAGER:
-               tipc_sk_conn_proto_rcv(tsk, skb, xmitq);
+               tipc_sk_conn_proto_rcv(tsk, skb, inputq, xmitq);
                return;
        case SOCK_WAKEUP:
                tipc_dest_del(&tsk->cong_links, msg_orignode(hdr), 0);
--
2.1.4



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

Reply via email to