Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 37c64cf6 authored by Jon Maloy's avatar Jon Maloy Committed by David S. Miller
Browse files

tipc: apply bearer link tolerance on running links



Currently, the default link tolerance set in struct tipc_bearer only
has effect on links going up after that moment. I.e., a user has to
reset all the node's links across that bearer to have the new value
applied. This is too limiting and disturbing on a running cluster to
be useful.

We now change this so that also already existing links are updated
dynamically, without any need for a reset, when the bearer value is
changed. We leverage the already existing per-link functionality
for this to achieve the wanted effect.

Acked-by: default avatarYing Xue <ying.xue@windriver.com>
Signed-off-by: default avatarJon Maloy <jon.maloy@ericsson.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent a92ac140
Loading
Loading
Loading
Loading
+5 −3
Original line number Original line Diff line number Diff line
@@ -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 tipc_nl_bearer_set(struct sk_buff *skb, struct genl_info *info)
{
{
	int err;
	char *name;
	struct tipc_bearer *b;
	struct tipc_bearer *b;
	struct nlattr *attrs[TIPC_NLA_BEARER_MAX + 1];
	struct nlattr *attrs[TIPC_NLA_BEARER_MAX + 1];
	struct net *net = sock_net(skb->sk);
	struct net *net = sock_net(skb->sk);
	char *name;
	int err;


	if (!info->attrs[TIPC_NLA_BEARER])
	if (!info->attrs[TIPC_NLA_BEARER])
		return -EINVAL;
		return -EINVAL;
@@ -982,8 +982,10 @@ int tipc_nl_bearer_set(struct sk_buff *skb, struct genl_info *info)
			return err;
			return err;
		}
		}


		if (props[TIPC_NLA_PROP_TOL])
		if (props[TIPC_NLA_PROP_TOL]) {
			b->tolerance = nla_get_u32(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])
		if (props[TIPC_NLA_PROP_PRIO])
			b->priority = nla_get_u32(props[TIPC_NLA_PROP_PRIO]);
			b->priority = nla_get_u32(props[TIPC_NLA_PROP_PRIO]);
		if (props[TIPC_NLA_PROP_WIN])
		if (props[TIPC_NLA_PROP_WIN])
+2 −1
Original line number Original line Diff line number Diff line
@@ -2126,6 +2126,7 @@ void tipc_link_set_tolerance(struct tipc_link *l, u32 tol,
			     struct sk_buff_head *xmitq)
			     struct sk_buff_head *xmitq)
{
{
	l->tolerance = tol;
	l->tolerance = tol;
	if (link_is_up(l))
		tipc_link_build_proto_msg(l, STATE_MSG, 0, 0, 0, tol, 0, xmitq);
		tipc_link_build_proto_msg(l, STATE_MSG, 0, 0, 0, tol, 0, xmitq);
}
}


+24 −0
Original line number Original line Diff line number Diff line
@@ -1618,6 +1618,30 @@ void tipc_rcv(struct net *net, struct sk_buff *skb, struct tipc_bearer *b)
	kfree_skb(skb);
	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)
int tipc_nl_peer_rm(struct sk_buff *skb, struct genl_info *info)
{
{
	struct net *net = sock_net(skb->sk);
	struct net *net = sock_net(skb->sk);
+1 −0
Original line number Original line Diff line number Diff line
@@ -65,6 +65,7 @@ void tipc_node_check_dest(struct net *net, u32 onode,
			  struct tipc_media_addr *maddr,
			  struct tipc_media_addr *maddr,
			  bool *respond, bool *dupl_addr);
			  bool *respond, bool *dupl_addr);
void tipc_node_delete_links(struct net *net, int bearer_id);
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,
int tipc_node_get_linkname(struct net *net, u32 bearer_id, u32 node,
			   char *linkname, size_t len);
			   char *linkname, size_t len);
int tipc_node_xmit(struct net *net, struct sk_buff_head *list, u32 dnode,
int tipc_node_xmit(struct net *net, struct sk_buff_head *list, u32 dnode,