diff options
Diffstat (limited to 'net/tipc')
| -rw-r--r-- | net/tipc/bearer.c | 8 | ||||
| -rw-r--r-- | net/tipc/link.c | 3 | ||||
| -rw-r--r-- | net/tipc/node.c | 24 | ||||
| -rw-r--r-- | net/tipc/node.h | 1 | 
4 files changed, 32 insertions, 4 deletions
diff --git a/net/tipc/bearer.c b/net/tipc/bearer.c index c8001471da6c..83d284feab1a 100644 --- a/net/tipc/bearer.c +++ b/net/tipc/bearer.c @@ -946,11 +946,11 @@ int tipc_nl_bearer_add(struct sk_buff *skb, struct genl_info *info)  int tipc_nl_bearer_set(struct sk_buff *skb, struct genl_info *info)  { -	int err; -	char *name;  	struct tipc_bearer *b;  	struct nlattr *attrs[TIPC_NLA_BEARER_MAX + 1];  	struct net *net = sock_net(skb->sk); +	char *name; +	int err;  	if (!info->attrs[TIPC_NLA_BEARER])  		return -EINVAL; @@ -982,8 +982,10 @@ int tipc_nl_bearer_set(struct sk_buff *skb, struct genl_info *info)  			return err;  		} -		if (props[TIPC_NLA_PROP_TOL]) +		if (props[TIPC_NLA_PROP_TOL]) {  			b->tolerance = nla_get_u32(props[TIPC_NLA_PROP_TOL]); +			tipc_node_apply_tolerance(net, b); +		}  		if (props[TIPC_NLA_PROP_PRIO])  			b->priority = nla_get_u32(props[TIPC_NLA_PROP_PRIO]);  		if (props[TIPC_NLA_PROP_WIN]) diff --git a/net/tipc/link.c b/net/tipc/link.c index 2d6b2aed30e0..3c230466804d 100644 --- a/net/tipc/link.c +++ b/net/tipc/link.c @@ -2126,7 +2126,8 @@ void tipc_link_set_tolerance(struct tipc_link *l, u32 tol,  			     struct sk_buff_head *xmitq)  {  	l->tolerance = tol; -	tipc_link_build_proto_msg(l, STATE_MSG, 0, 0, 0, tol, 0, xmitq); +	if (link_is_up(l)) +		tipc_link_build_proto_msg(l, STATE_MSG, 0, 0, 0, tol, 0, xmitq);  }  void tipc_link_set_prio(struct tipc_link *l, u32 prio, diff --git a/net/tipc/node.c b/net/tipc/node.c index 9036d8756e73..389193d7cf67 100644 --- a/net/tipc/node.c +++ b/net/tipc/node.c @@ -1618,6 +1618,30 @@ discard:  	kfree_skb(skb);  } +void tipc_node_apply_tolerance(struct net *net, struct tipc_bearer *b) +{ +	struct tipc_net *tn = tipc_net(net); +	int bearer_id = b->identity; +	struct sk_buff_head xmitq; +	struct tipc_link_entry *e; +	struct tipc_node *n; + +	__skb_queue_head_init(&xmitq); + +	rcu_read_lock(); + +	list_for_each_entry_rcu(n, &tn->node_list, list) { +		tipc_node_write_lock(n); +		e = &n->links[bearer_id]; +		if (e->link) +			tipc_link_set_tolerance(e->link, b->tolerance, &xmitq); +		tipc_node_write_unlock(n); +		tipc_bearer_xmit(net, bearer_id, &xmitq, &e->maddr); +	} + +	rcu_read_unlock(); +} +  int tipc_nl_peer_rm(struct sk_buff *skb, struct genl_info *info)  {  	struct net *net = sock_net(skb->sk); diff --git a/net/tipc/node.h b/net/tipc/node.h index acd58d23a70e..4ce5e3a185c0 100644 --- a/net/tipc/node.h +++ b/net/tipc/node.h @@ -65,6 +65,7 @@ void tipc_node_check_dest(struct net *net, u32 onode,  			  struct tipc_media_addr *maddr,  			  bool *respond, bool *dupl_addr);  void tipc_node_delete_links(struct net *net, int bearer_id); +void tipc_node_apply_tolerance(struct net *net, struct tipc_bearer *b);  int tipc_node_get_linkname(struct net *net, u32 bearer_id, u32 node,  			   char *linkname, size_t len);  int tipc_node_xmit(struct net *net, struct sk_buff_head *list, u32 dnode,  | 
