diff options
Diffstat (limited to 'net/tipc/link.c')
-rw-r--r-- | net/tipc/link.c | 55 |
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); |