aboutsummaryrefslogtreecommitdiffstats
path: root/net/tipc/socket.c
diff options
context:
space:
mode:
Diffstat (limited to 'net/tipc/socket.c')
-rw-r--r--net/tipc/socket.c22
1 files changed, 20 insertions, 2 deletions
diff --git a/net/tipc/socket.c b/net/tipc/socket.c
index a65105818fe5..686a11be5c58 100644
--- a/net/tipc/socket.c
+++ b/net/tipc/socket.c
@@ -1106,6 +1106,24 @@ static int anc_data_recv(struct msghdr *m, struct tipc_msg *msg,
1106 return 0; 1106 return 0;
1107} 1107}
1108 1108
1109static void tipc_sk_send_ack(struct tipc_port *port, uint ack)
1110{
1111 struct sk_buff *buf = NULL;
1112 struct tipc_msg *msg;
1113 u32 peer_port = tipc_port_peerport(port);
1114 u32 dnode = tipc_port_peernode(port);
1115
1116 if (!port->connected)
1117 return;
1118 buf = tipc_msg_create(CONN_MANAGER, CONN_ACK, INT_H_SIZE, 0, dnode,
1119 tipc_own_addr, peer_port, port->ref, TIPC_OK);
1120 if (!buf)
1121 return;
1122 msg = buf_msg(buf);
1123 msg_set_msgcnt(msg, ack);
1124 tipc_link_xmit(buf, dnode, msg_link_selector(msg));
1125}
1126
1109static int tipc_wait_for_rcvmsg(struct socket *sock, long *timeop) 1127static int tipc_wait_for_rcvmsg(struct socket *sock, long *timeop)
1110{ 1128{
1111 struct sock *sk = sock->sk; 1129 struct sock *sk = sock->sk;
@@ -1226,7 +1244,7 @@ restart:
1226 if (likely(!(flags & MSG_PEEK))) { 1244 if (likely(!(flags & MSG_PEEK))) {
1227 if ((sock->state != SS_READY) && 1245 if ((sock->state != SS_READY) &&
1228 (++tsk->rcv_unacked >= TIPC_CONNACK_INTV)) { 1246 (++tsk->rcv_unacked >= TIPC_CONNACK_INTV)) {
1229 tipc_acknowledge(port->ref, tsk->rcv_unacked); 1247 tipc_sk_send_ack(port, tsk->rcv_unacked);
1230 tsk->rcv_unacked = 0; 1248 tsk->rcv_unacked = 0;
1231 } 1249 }
1232 advance_rx_queue(sk); 1250 advance_rx_queue(sk);
@@ -1337,7 +1355,7 @@ restart:
1337 /* Consume received message (optional) */ 1355 /* Consume received message (optional) */
1338 if (likely(!(flags & MSG_PEEK))) { 1356 if (likely(!(flags & MSG_PEEK))) {
1339 if (unlikely(++tsk->rcv_unacked >= TIPC_CONNACK_INTV)) { 1357 if (unlikely(++tsk->rcv_unacked >= TIPC_CONNACK_INTV)) {
1340 tipc_acknowledge(port->ref, tsk->rcv_unacked); 1358 tipc_sk_send_ack(port, tsk->rcv_unacked);
1341 tsk->rcv_unacked = 0; 1359 tsk->rcv_unacked = 0;
1342 } 1360 }
1343 advance_rx_queue(sk); 1361 advance_rx_queue(sk);