@@ -532,20 +532,18 @@ static void __tipc_shutdown(struct socket *sock, int error)
532
532
struct sock * sk = sock -> sk ;
533
533
struct tipc_sock * tsk = tipc_sk (sk );
534
534
struct net * net = sock_net (sk );
535
- long timeout = CONN_TIMEOUT_DEFAULT ;
535
+ long timeout = msecs_to_jiffies ( CONN_TIMEOUT_DEFAULT ) ;
536
536
u32 dnode = tsk_peer_node (tsk );
537
537
struct sk_buff * skb ;
538
538
539
539
/* Avoid that hi-prio shutdown msgs bypass msgs in link wakeup queue */
540
540
tipc_wait_for_cond (sock , & timeout , (!tsk -> cong_link_cnt &&
541
541
!tsk_conn_cong (tsk )));
542
542
543
- /* Push out unsent messages or remove if pending SYN */
544
- skb = skb_peek (& sk -> sk_write_queue );
545
- if (skb && !msg_is_syn (buf_msg (skb )))
546
- tipc_sk_push_backlog (tsk );
547
- else
548
- __skb_queue_purge (& sk -> sk_write_queue );
543
+ /* Push out delayed messages if in Nagle mode */
544
+ tipc_sk_push_backlog (tsk );
545
+ /* Remove pending SYN */
546
+ __skb_queue_purge (& sk -> sk_write_queue );
549
547
550
548
/* Reject all unreceived messages, except on an active connection
551
549
* (which disconnects locally & sends a 'FIN+' to peer).
@@ -1248,9 +1246,14 @@ static void tipc_sk_push_backlog(struct tipc_sock *tsk)
1248
1246
struct sk_buff_head * txq = & tsk -> sk .sk_write_queue ;
1249
1247
struct net * net = sock_net (& tsk -> sk );
1250
1248
u32 dnode = tsk_peer_node (tsk );
1249
+ struct sk_buff * skb = skb_peek (txq );
1251
1250
int rc ;
1252
1251
1253
- if (skb_queue_empty (txq ) || tsk -> cong_link_cnt )
1252
+ if (!skb || tsk -> cong_link_cnt )
1253
+ return ;
1254
+
1255
+ /* Do not send SYN again after congestion */
1256
+ if (msg_is_syn (buf_msg (skb )))
1254
1257
return ;
1255
1258
1256
1259
tsk -> snt_unacked += tsk -> snd_backlog ;
@@ -1447,8 +1450,10 @@ static int __tipc_sendmsg(struct socket *sock, struct msghdr *m, size_t dlen)
1447
1450
rc = tipc_msg_build (hdr , m , 0 , dlen , mtu , & pkts );
1448
1451
if (unlikely (rc != dlen ))
1449
1452
return rc ;
1450
- if (unlikely (syn && !tipc_msg_skb_clone (& pkts , & sk -> sk_write_queue )))
1453
+ if (unlikely (syn && !tipc_msg_skb_clone (& pkts , & sk -> sk_write_queue ))) {
1454
+ __skb_queue_purge (& pkts );
1451
1455
return - ENOMEM ;
1456
+ }
1452
1457
1453
1458
trace_tipc_sk_sendmsg (sk , skb_peek (& pkts ), TIPC_DUMP_SK_SNDQ , " " );
1454
1459
rc = tipc_node_xmit (net , & pkts , dnode , tsk -> portid );
@@ -2757,6 +2762,7 @@ static void tipc_sk_timeout(struct timer_list *t)
2757
2762
if (sock_owned_by_user (sk )) {
2758
2763
sk_reset_timer (sk , & sk -> sk_timer , jiffies + HZ / 20 );
2759
2764
bh_unlock_sock (sk );
2765
+ sock_put (sk );
2760
2766
return ;
2761
2767
}
2762
2768
0 commit comments