* struct bclink - link used for broadcast messages
  * @link: (non-standard) broadcast link structure
  * @node: (non-standard) node structure representing b'cast link's peer node
+ * @bcast_nodes: map of broadcast-capable nodes
  * @retransmit_to: node that most recently requested a retransmit
  *
  * Handles sequence numbering, fragmentation, bundling, etc.
 struct bclink {
        struct link link;
        struct tipc_node node;
+       struct tipc_node_map bcast_nodes;
        struct tipc_node *retransmit_to;
 };
 
 
 static DEFINE_SPINLOCK(bc_lock);
 
-/* broadcast-capable node map */
-struct tipc_node_map tipc_bcast_nmap;
-
 const char tipc_bclink_name[] = "broadcast-link";
 
 static void tipc_nmap_diff(struct tipc_node_map *nm_a,
        bcbuf_set_acks(buf, bcbuf_acks(buf) - 1);
 }
 
+void tipc_bclink_add_node(u32 addr)
+{
+       spin_lock_bh(&bc_lock);
+       tipc_nmap_add(&bclink->bcast_nodes, addr);
+       spin_unlock_bh(&bc_lock);
+}
+
+void tipc_bclink_remove_node(u32 addr)
+{
+       spin_lock_bh(&bc_lock);
+       tipc_nmap_remove(&bclink->bcast_nodes, addr);
+       spin_unlock_bh(&bc_lock);
+}
 
 static void bclink_set_last_sent(void)
 {
        if (likely(!msg_non_seq(buf_msg(buf)))) {
                struct tipc_msg *msg;
 
-               bcbuf_set_acks(buf, tipc_bcast_nmap.count);
+               bcbuf_set_acks(buf, bclink->bcast_nodes.count);
                msg = buf_msg(buf);
                msg_set_non_seq(msg, 1);
                msg_set_mc_netid(msg, tipc_net_id);
                bcl->stats.sent_info++;
 
-               if (WARN_ON(!tipc_bcast_nmap.count)) {
+               if (WARN_ON(!bclink->bcast_nodes.count)) {
                        dump_stack();
                        return 0;
                }
 
        /* Send buffer over bearers until all targets reached */
 
-       bcbearer->remains = tipc_bcast_nmap;
+       bcbearer->remains = bclink->bcast_nodes;
 
        for (bp_index = 0; bp_index < MAX_BEARERS; bp_index++) {
                struct tipc_bearer *p = bcbearer->bpairs[bp_index].primary;
 
        u32 map[MAX_NODES / WSIZE];
 };
 
-extern struct tipc_node_map tipc_bcast_nmap;
-
 #define PLSIZE 32
 
 /**
 
 void tipc_bclink_init(void);
 void tipc_bclink_stop(void);
+void tipc_bclink_add_node(u32 addr);
+void tipc_bclink_remove_node(u32 addr);
 struct tipc_node *tipc_bclink_retransmit_to(void);
 void tipc_bclink_acknowledge(struct tipc_node *n_ptr, u32 acked);
 int  tipc_bclink_send_msg(struct sk_buff *buf);
 
        n_ptr->bclink.acked = tipc_bclink_get_last_sent();
 
        if (n_ptr->bclink.supported) {
-               tipc_nmap_add(&tipc_bcast_nmap, n_ptr->addr);
+               tipc_bclink_add_node(n_ptr->addr);
                if (n_ptr->addr < tipc_own_addr)
                        tipc_own_tag++;
        }
                        n_ptr->bclink.defragm = NULL;
                }
 
-               tipc_nmap_remove(&tipc_bcast_nmap, n_ptr->addr);
+               tipc_bclink_remove_node(n_ptr->addr);
                tipc_bclink_acknowledge(n_ptr,
                                        mod(n_ptr->bclink.acked + 10000));
                if (n_ptr->addr < tipc_own_addr)