aboutsummaryrefslogtreecommitdiffstats
path: root/net/tipc/link.c
diff options
context:
space:
mode:
Diffstat (limited to 'net/tipc/link.c')
-rw-r--r--net/tipc/link.c55
1 files changed, 16 insertions, 39 deletions
diff --git a/net/tipc/link.c b/net/tipc/link.c
index 69cd9bf3f561..fd340ad742ea 100644
--- a/net/tipc/link.c
+++ b/net/tipc/link.c
@@ -790,8 +790,7 @@ int tipc_link_send_buf(struct tipc_link *l_ptr, struct sk_buff *buf)
790 return link_send_long_buf(l_ptr, buf); 790 return link_send_long_buf(l_ptr, buf);
791 791
792 /* Packet can be queued or sent. */ 792 /* Packet can be queued or sent. */
793 if (likely(!tipc_bearer_blocked(l_ptr->b_ptr) && 793 if (likely(!link_congested(l_ptr))) {
794 !link_congested(l_ptr))) {
795 link_add_to_outqueue(l_ptr, buf, msg); 794 link_add_to_outqueue(l_ptr, buf, msg);
796 795
797 tipc_bearer_send(l_ptr->b_ptr, buf, &l_ptr->media_addr); 796 tipc_bearer_send(l_ptr->b_ptr, buf, &l_ptr->media_addr);
@@ -957,14 +956,13 @@ static int link_send_buf_fast(struct tipc_link *l_ptr, struct sk_buff *buf,
957 956
958 if (likely(!link_congested(l_ptr))) { 957 if (likely(!link_congested(l_ptr))) {
959 if (likely(msg_size(msg) <= l_ptr->max_pkt)) { 958 if (likely(msg_size(msg) <= l_ptr->max_pkt)) {
960 if (likely(!tipc_bearer_blocked(l_ptr->b_ptr))) { 959 link_add_to_outqueue(l_ptr, buf, msg);
961 link_add_to_outqueue(l_ptr, buf, msg); 960 tipc_bearer_send(l_ptr->b_ptr, buf,
962 tipc_bearer_send(l_ptr->b_ptr, buf, 961 &l_ptr->media_addr);
963 &l_ptr->media_addr); 962 l_ptr->unacked_window = 0;
964 l_ptr->unacked_window = 0; 963 return res;
965 return res; 964 }
966 } 965 else
967 } else
968 *used_max_pkt = l_ptr->max_pkt; 966 *used_max_pkt = l_ptr->max_pkt;
969 } 967 }
970 return tipc_link_send_buf(l_ptr, buf); /* All other cases */ 968 return tipc_link_send_buf(l_ptr, buf); /* All other cases */
@@ -1013,8 +1011,7 @@ exit:
1013 } 1011 }
1014 1012
1015 /* Exit if link (or bearer) is congested */ 1013 /* Exit if link (or bearer) is congested */
1016 if (link_congested(l_ptr) || 1014 if (link_congested(l_ptr)) {
1017 tipc_bearer_blocked(l_ptr->b_ptr)) {
1018 res = link_schedule_port(l_ptr, 1015 res = link_schedule_port(l_ptr,
1019 sender->ref, res); 1016 sender->ref, res);
1020 goto exit; 1017 goto exit;
@@ -1281,9 +1278,6 @@ void tipc_link_push_queue(struct tipc_link *l_ptr)
1281{ 1278{
1282 u32 res; 1279 u32 res;
1283 1280
1284 if (tipc_bearer_blocked(l_ptr->b_ptr))
1285 return;
1286
1287 do { 1281 do {
1288 res = tipc_link_push_packet(l_ptr); 1282 res = tipc_link_push_packet(l_ptr);
1289 } while (!res); 1283 } while (!res);
@@ -1370,26 +1364,15 @@ void tipc_link_retransmit(struct tipc_link *l_ptr, struct sk_buff *buf,
1370 1364
1371 msg = buf_msg(buf); 1365 msg = buf_msg(buf);
1372 1366
1373 if (tipc_bearer_blocked(l_ptr->b_ptr)) { 1367 /* Detect repeated retransmit failures */
1374 if (l_ptr->retransm_queue_size == 0) { 1368 if (l_ptr->last_retransmitted == msg_seqno(msg)) {
1375 l_ptr->retransm_queue_head = msg_seqno(msg); 1369 if (++l_ptr->stale_count > 100) {
1376 l_ptr->retransm_queue_size = retransmits; 1370 link_retransmit_failure(l_ptr, buf);
1377 } else { 1371 return;
1378 pr_err("Unexpected retransmit on link %s (qsize=%d)\n",
1379 l_ptr->name, l_ptr->retransm_queue_size);
1380 } 1372 }
1381 return;
1382 } else { 1373 } else {
1383 /* Detect repeated retransmit failures on unblocked bearer */ 1374 l_ptr->last_retransmitted = msg_seqno(msg);
1384 if (l_ptr->last_retransmitted == msg_seqno(msg)) { 1375 l_ptr->stale_count = 1;
1385 if (++l_ptr->stale_count > 100) {
1386 link_retransmit_failure(l_ptr, buf);
1387 return;
1388 }
1389 } else {
1390 l_ptr->last_retransmitted = msg_seqno(msg);
1391 l_ptr->stale_count = 1;
1392 }
1393 } 1376 }
1394 1377
1395 while (retransmits && (buf != l_ptr->next_out) && buf) { 1378 while (retransmits && (buf != l_ptr->next_out) && buf) {
@@ -1861,12 +1844,6 @@ void tipc_link_send_proto_msg(struct tipc_link *l_ptr, u32 msg_typ,
1861 skb_copy_to_linear_data(buf, msg, sizeof(l_ptr->proto_msg)); 1844 skb_copy_to_linear_data(buf, msg, sizeof(l_ptr->proto_msg));
1862 buf->priority = TC_PRIO_CONTROL; 1845 buf->priority = TC_PRIO_CONTROL;
1863 1846
1864 /* Defer message if bearer is already blocked */
1865 if (tipc_bearer_blocked(l_ptr->b_ptr)) {
1866 l_ptr->proto_msg_queue = buf;
1867 return;
1868 }
1869
1870 tipc_bearer_send(l_ptr->b_ptr, buf, &l_ptr->media_addr); 1847 tipc_bearer_send(l_ptr->b_ptr, buf, &l_ptr->media_addr);
1871 l_ptr->unacked_window = 0; 1848 l_ptr->unacked_window = 0;
1872 kfree_skb(buf); 1849 kfree_skb(buf);