diff options
Diffstat (limited to 'net/tipc/socket.c')
-rw-r--r-- | net/tipc/socket.c | 22 |
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 | ||
1109 | static 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 | |||
1109 | static int tipc_wait_for_rcvmsg(struct socket *sock, long *timeop) | 1127 | static 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); |