diff options
Diffstat (limited to 'net/tipc/node.c')
| -rw-r--r-- | net/tipc/node.c | 33 | 
1 files changed, 25 insertions, 8 deletions
diff --git a/net/tipc/node.c b/net/tipc/node.c index a4c2816c3746..4edcee3088da 100644 --- a/net/tipc/node.c +++ b/net/tipc/node.c @@ -75,6 +75,8 @@ struct tipc_bclink_entry {  	struct sk_buff_head arrvq;  	struct sk_buff_head inputq2;  	struct sk_buff_head namedq; +	u16 named_rcv_nxt; +	bool named_open;  };  /** @@ -396,10 +398,10 @@ static void tipc_node_write_unlock(struct tipc_node *n)  	write_unlock_bh(&n->lock);  	if (flags & TIPC_NOTIFY_NODE_DOWN) -		tipc_publ_notify(net, publ_list, addr); +		tipc_publ_notify(net, publ_list, addr, n->capabilities);  	if (flags & TIPC_NOTIFY_NODE_UP) -		tipc_named_node_up(net, addr); +		tipc_named_node_up(net, addr, n->capabilities);  	if (flags & TIPC_NOTIFY_LINK_UP) {  		tipc_mon_peer_up(net, addr, bearer_id); @@ -1483,6 +1485,7 @@ static void node_lost_contact(struct tipc_node *n,  	/* Clean up broadcast state */  	tipc_bcast_remove_peer(n->net, n->bc_entry.link); +	__skb_queue_purge(&n->bc_entry.namedq);  	/* Abort any ongoing link failover */  	for (i = 0; i < MAX_BEARERS; i++) { @@ -1512,7 +1515,7 @@ static void node_lost_contact(struct tipc_node *n,   * tipc_node_get_linkname - get the name of a link   *   * @bearer_id: id of the bearer - * @node: peer node address + * @addr: peer node address   * @linkname: link name output buffer   *   * Returns 0 on success @@ -1729,12 +1732,23 @@ int tipc_node_distr_xmit(struct net *net, struct sk_buff_head *xmitq)  	return 0;  } -void tipc_node_broadcast(struct net *net, struct sk_buff *skb) +void tipc_node_broadcast(struct net *net, struct sk_buff *skb, int rc_dests)  { +	struct sk_buff_head xmitq;  	struct sk_buff *txskb;  	struct tipc_node *n; +	u16 dummy;  	u32 dst; +	/* Use broadcast if all nodes support it */ +	if (!rc_dests && tipc_bcast_get_mode(net) != BCLINK_MODE_RCAST) { +		__skb_queue_head_init(&xmitq); +		__skb_queue_tail(&xmitq, skb); +		tipc_bcast_xmit(net, &xmitq, &dummy); +		return; +	} + +	/* Otherwise use legacy replicast method */  	rcu_read_lock();  	list_for_each_entry_rcu(n, tipc_nodes(net), list) {  		dst = n->addr; @@ -1749,7 +1763,6 @@ void tipc_node_broadcast(struct net *net, struct sk_buff *skb)  		tipc_node_xmit_skb(net, txskb, dst, 0);  	}  	rcu_read_unlock(); -  	kfree_skb(skb);  } @@ -1844,7 +1857,9 @@ static void tipc_node_bc_rcv(struct net *net, struct sk_buff *skb, int bearer_id  	/* Handle NAME_DISTRIBUTOR messages sent from 1.7 nodes */  	if (!skb_queue_empty(&n->bc_entry.namedq)) -		tipc_named_rcv(net, &n->bc_entry.namedq); +		tipc_named_rcv(net, &n->bc_entry.namedq, +			       &n->bc_entry.named_rcv_nxt, +			       &n->bc_entry.named_open);  	/* If reassembly or retransmission failure => reset all links to peer */  	if (rc & TIPC_LINK_DOWN_EVT) @@ -2007,7 +2022,7 @@ static bool tipc_node_check_state(struct tipc_node *n, struct sk_buff *skb,   * tipc_rcv - process TIPC packets/messages arriving from off-node   * @net: the applicable net namespace   * @skb: TIPC packet - * @bearer: pointer to bearer message arrived on + * @b: pointer to bearer message arrived on   *   * Invoked with no locks held. Bearer pointer must point to a valid bearer   * structure (i.e. cannot be NULL), but bearer can be inactive. @@ -2114,7 +2129,9 @@ rcv:  		tipc_node_link_down(n, bearer_id, false);  	if (unlikely(!skb_queue_empty(&n->bc_entry.namedq))) -		tipc_named_rcv(net, &n->bc_entry.namedq); +		tipc_named_rcv(net, &n->bc_entry.namedq, +			       &n->bc_entry.named_rcv_nxt, +			       &n->bc_entry.named_open);  	if (unlikely(!skb_queue_empty(&n->bc_entry.inputq1)))  		tipc_node_mcast_rcv(n);  | 
