diff options
Diffstat (limited to 'net/tipc/bearer.c')
| -rw-r--r-- | net/tipc/bearer.c | 30 | 
1 files changed, 28 insertions, 2 deletions
diff --git a/net/tipc/bearer.c b/net/tipc/bearer.c index 00bc0e620532..ce9f7bfc0b92 100644 --- a/net/tipc/bearer.c +++ b/net/tipc/bearer.c @@ -343,7 +343,7 @@ restart:  static int tipc_reset_bearer(struct net *net, struct tipc_bearer *b_ptr)  {  	pr_info("Resetting bearer <%s>\n", b_ptr->name); -	tipc_link_delete_list(net, b_ptr->identity); +	tipc_node_delete_links(net, b_ptr->identity);  	tipc_disc_reset(net, b_ptr);  	return 0;  } @@ -361,7 +361,7 @@ static void bearer_disable(struct net *net, struct tipc_bearer *b_ptr)  	pr_info("Disabling bearer <%s>\n", b_ptr->name);  	b_ptr->media->disable_media(b_ptr); -	tipc_link_delete_list(net, b_ptr->identity); +	tipc_node_delete_links(net, b_ptr->identity);  	if (b_ptr->link_req)  		tipc_disc_delete(b_ptr->link_req); @@ -470,6 +470,32 @@ void tipc_bearer_send(struct net *net, u32 bearer_id, struct sk_buff *buf,  	rcu_read_unlock();  } +/* tipc_bearer_xmit() -send buffer to destination over bearer + */ +void tipc_bearer_xmit(struct net *net, u32 bearer_id, +		      struct sk_buff_head *xmitq, +		      struct tipc_media_addr *dst) +{ +	struct tipc_net *tn = net_generic(net, tipc_net_id); +	struct tipc_bearer *b; +	struct sk_buff *skb, *tmp; + +	if (skb_queue_empty(xmitq)) +		return; + +	rcu_read_lock(); +	b = rcu_dereference_rtnl(tn->bearer_list[bearer_id]); +	if (likely(b)) { +		skb_queue_walk_safe(xmitq, skb, tmp) { +			__skb_dequeue(xmitq); +			b->media->send_msg(net, skb, b, dst); +			/* Until we remove cloning in tipc_l2_send_msg(): */ +			kfree_skb(skb); +		} +	} +	rcu_read_unlock(); +} +  /**   * tipc_l2_rcv_msg - handle incoming TIPC message from an interface   * @buf: the received packet  |