summaryrefslogtreecommitdiff
path: root/net
diff options
context:
space:
mode:
authorAllan Stephens <allan.stephens@windriver.com>2011-10-24 18:59:20 (GMT)
committerPaul Gortmaker <paul.gortmaker@windriver.com>2011-12-27 16:33:52 (GMT)
commit10745cd5990542447268f60078133df8b1ee960b (patch)
tree544d8226e2adf82a31e5bb7639c439a12bec7cea /net
parent9157bafb44637a2cfefc222d6551100ead40e79e (diff)
downloadlinux-fsl-qoriq-10745cd5990542447268f60078133df8b1ee960b.tar.xz
tipc: Flush unsent broadcast messages when contact with last node is lost
Adds code to release any unsent broadcast messages in the broadcast link transmit queue if TIPC loses contact with its only neighboring node. Previously, a broadcast link that was in the congested state would hold on to the unsent messages, even though the messages were now undeliverable. Signed-off-by: Allan Stephens <allan.stephens@windriver.com> Signed-off-by: Paul Gortmaker <paul.gortmaker@windriver.com>
Diffstat (limited to 'net')
-rw-r--r--net/tipc/bcast.c12
1 files changed, 11 insertions, 1 deletions
diff --git a/net/tipc/bcast.c b/net/tipc/bcast.c
index dd990b0..4609819 100644
--- a/net/tipc/bcast.c
+++ b/net/tipc/bcast.c
@@ -252,7 +252,17 @@ void tipc_bclink_acknowledge(struct tipc_node *n_ptr, u32 acked)
while (crs && less_eq(buf_seqno(crs), acked)) {
next = crs->next;
- bcbuf_decr_acks(crs);
+
+ if (crs != bcl->next_out)
+ bcbuf_decr_acks(crs);
+ else if (bclink->bcast_nodes.count)
+ break;
+ else {
+ bcbuf_set_acks(crs, 0);
+ bcl->next_out = next;
+ bclink_set_last_sent();
+ }
+
if (bcbuf_acks(crs) == 0) {
bcl->first_out = next;
bcl->out_queue_size--;