aboutsummaryrefslogtreecommitdiffstats
path: root/net/tipc/bcast.c
diff options
context:
space:
mode:
Diffstat (limited to 'net/tipc/bcast.c')
-rw-r--r--net/tipc/bcast.c20
1 files changed, 16 insertions, 4 deletions
diff --git a/net/tipc/bcast.c b/net/tipc/bcast.c
index dd13bfa09333..b8670bf262e2 100644
--- a/net/tipc/bcast.c
+++ b/net/tipc/bcast.c
@@ -37,7 +37,6 @@
37 37
38#include "core.h" 38#include "core.h"
39#include "link.h" 39#include "link.h"
40#include "port.h"
41#include "socket.h" 40#include "socket.h"
42#include "msg.h" 41#include "msg.h"
43#include "bcast.h" 42#include "bcast.h"
@@ -227,6 +226,17 @@ static void bclink_retransmit_pkt(u32 after, u32 to)
227} 226}
228 227
229/** 228/**
229 * tipc_bclink_wakeup_users - wake up pending users
230 *
231 * Called with no locks taken
232 */
233void tipc_bclink_wakeup_users(void)
234{
235 while (skb_queue_len(&bclink->link.waiting_sks))
236 tipc_sk_rcv(skb_dequeue(&bclink->link.waiting_sks));
237}
238
239/**
230 * tipc_bclink_acknowledge - handle acknowledgement of broadcast packets 240 * tipc_bclink_acknowledge - handle acknowledgement of broadcast packets
231 * @n_ptr: node that sent acknowledgement info 241 * @n_ptr: node that sent acknowledgement info
232 * @acked: broadcast sequence # that has been acknowledged 242 * @acked: broadcast sequence # that has been acknowledged
@@ -300,8 +310,9 @@ void tipc_bclink_acknowledge(struct tipc_node *n_ptr, u32 acked)
300 tipc_link_push_queue(bcl); 310 tipc_link_push_queue(bcl);
301 bclink_set_last_sent(); 311 bclink_set_last_sent();
302 } 312 }
303 if (unlikely(released && !list_empty(&bcl->waiting_ports))) 313 if (unlikely(released && !skb_queue_empty(&bcl->waiting_sks)))
304 tipc_link_wakeup_ports(bcl, 0); 314 n_ptr->action_flags |= TIPC_WAKEUP_BCAST_USERS;
315
305exit: 316exit:
306 tipc_bclink_unlock(); 317 tipc_bclink_unlock();
307} 318}
@@ -840,9 +851,10 @@ int tipc_bclink_init(void)
840 sprintf(bcbearer->media.name, "tipc-broadcast"); 851 sprintf(bcbearer->media.name, "tipc-broadcast");
841 852
842 spin_lock_init(&bclink->lock); 853 spin_lock_init(&bclink->lock);
843 INIT_LIST_HEAD(&bcl->waiting_ports); 854 __skb_queue_head_init(&bcl->waiting_sks);
844 bcl->next_out_no = 1; 855 bcl->next_out_no = 1;
845 spin_lock_init(&bclink->node.lock); 856 spin_lock_init(&bclink->node.lock);
857 __skb_queue_head_init(&bclink->node.waiting_sks);
846 bcl->owner = &bclink->node; 858 bcl->owner = &bclink->node;
847 bcl->max_pkt = MAX_PKT_DEFAULT_MCAST; 859 bcl->max_pkt = MAX_PKT_DEFAULT_MCAST;
848 tipc_link_set_queue_limits(bcl, BCLINK_WIN_DEFAULT); 860 tipc_link_set_queue_limits(bcl, BCLINK_WIN_DEFAULT);