diff options
Diffstat (limited to 'net/tipc/net.c')
| -rw-r--r-- | net/tipc/net.c | 56 | 
1 files changed, 32 insertions, 24 deletions
| diff --git a/net/tipc/net.c b/net/tipc/net.c index cf13df3cde8f..a54f3cbe2246 100644 --- a/net/tipc/net.c +++ b/net/tipc/net.c @@ -40,7 +40,6 @@  #include "subscr.h"  #include "socket.h"  #include "node.h" -#include "config.h"  static const struct nla_policy tipc_nl_net_policy[TIPC_NLA_NET_MAX + 1] = {  	[TIPC_NLA_NET_UNSPEC]	= { .type = NLA_UNSPEC }, @@ -108,48 +107,54 @@ static const struct nla_policy tipc_nl_net_policy[TIPC_NLA_NET_MAX + 1] = {   *     - A local spin_lock protecting the queue of subscriber events.  */ -int tipc_net_start(u32 addr) +int tipc_net_start(struct net *net, u32 addr)  { +	struct tipc_net *tn = net_generic(net, tipc_net_id);  	char addr_string[16];  	int res; -	tipc_own_addr = addr; -	tipc_named_reinit(); -	tipc_sk_reinit(); -	res = tipc_bclink_init(); +	tn->own_addr = addr; +	tipc_named_reinit(net); +	tipc_sk_reinit(net); +	res = tipc_bclink_init(net);  	if (res)  		return res; -	tipc_nametbl_publish(TIPC_CFG_SRV, tipc_own_addr, tipc_own_addr, -			     TIPC_ZONE_SCOPE, 0, tipc_own_addr); +	tipc_nametbl_publish(net, TIPC_CFG_SRV, tn->own_addr, tn->own_addr, +			     TIPC_ZONE_SCOPE, 0, tn->own_addr);  	pr_info("Started in network mode\n");  	pr_info("Own node address %s, network identity %u\n", -		tipc_addr_string_fill(addr_string, tipc_own_addr), tipc_net_id); +		tipc_addr_string_fill(addr_string, tn->own_addr), +		tn->net_id);  	return 0;  } -void tipc_net_stop(void) +void tipc_net_stop(struct net *net)  { -	if (!tipc_own_addr) +	struct tipc_net *tn = net_generic(net, tipc_net_id); + +	if (!tn->own_addr)  		return; -	tipc_nametbl_withdraw(TIPC_CFG_SRV, tipc_own_addr, 0, tipc_own_addr); +	tipc_nametbl_withdraw(net, TIPC_CFG_SRV, tn->own_addr, 0, +			      tn->own_addr);  	rtnl_lock(); -	tipc_bearer_stop(); -	tipc_bclink_stop(); -	tipc_node_stop(); +	tipc_bearer_stop(net); +	tipc_bclink_stop(net); +	tipc_node_stop(net);  	rtnl_unlock();  	pr_info("Left network mode\n");  } -static int __tipc_nl_add_net(struct tipc_nl_msg *msg) +static int __tipc_nl_add_net(struct net *net, struct tipc_nl_msg *msg)  { +	struct tipc_net *tn = net_generic(net, tipc_net_id);  	void *hdr;  	struct nlattr *attrs; -	hdr = genlmsg_put(msg->skb, msg->portid, msg->seq, &tipc_genl_v2_family, +	hdr = genlmsg_put(msg->skb, msg->portid, msg->seq, &tipc_genl_family,  			  NLM_F_MULTI, TIPC_NL_NET_GET);  	if (!hdr)  		return -EMSGSIZE; @@ -158,7 +163,7 @@ static int __tipc_nl_add_net(struct tipc_nl_msg *msg)  	if (!attrs)  		goto msg_full; -	if (nla_put_u32(msg->skb, TIPC_NLA_NET_ID, tipc_net_id)) +	if (nla_put_u32(msg->skb, TIPC_NLA_NET_ID, tn->net_id))  		goto attr_msg_full;  	nla_nest_end(msg->skb, attrs); @@ -176,6 +181,7 @@ msg_full:  int tipc_nl_net_dump(struct sk_buff *skb, struct netlink_callback *cb)  { +	struct net *net = sock_net(skb->sk);  	int err;  	int done = cb->args[0];  	struct tipc_nl_msg msg; @@ -187,7 +193,7 @@ int tipc_nl_net_dump(struct sk_buff *skb, struct netlink_callback *cb)  	msg.portid = NETLINK_CB(cb->skb).portid;  	msg.seq = cb->nlh->nlmsg_seq; -	err = __tipc_nl_add_net(&msg); +	err = __tipc_nl_add_net(net, &msg);  	if (err)  		goto out; @@ -200,8 +206,10 @@ out:  int tipc_nl_net_set(struct sk_buff *skb, struct genl_info *info)  { -	int err; +	struct net *net = sock_net(skb->sk); +	struct tipc_net *tn = net_generic(net, tipc_net_id);  	struct nlattr *attrs[TIPC_NLA_NET_MAX + 1]; +	int err;  	if (!info->attrs[TIPC_NLA_NET])  		return -EINVAL; @@ -216,21 +224,21 @@ int tipc_nl_net_set(struct sk_buff *skb, struct genl_info *info)  		u32 val;  		/* Can't change net id once TIPC has joined a network */ -		if (tipc_own_addr) +		if (tn->own_addr)  			return -EPERM;  		val = nla_get_u32(attrs[TIPC_NLA_NET_ID]);  		if (val < 1 || val > 9999)  			return -EINVAL; -		tipc_net_id = val; +		tn->net_id = val;  	}  	if (attrs[TIPC_NLA_NET_ADDR]) {  		u32 addr;  		/* Can't change net addr once TIPC has joined a network */ -		if (tipc_own_addr) +		if (tn->own_addr)  			return -EPERM;  		addr = nla_get_u32(attrs[TIPC_NLA_NET_ADDR]); @@ -238,7 +246,7 @@ int tipc_nl_net_set(struct sk_buff *skb, struct genl_info *info)  			return -EINVAL;  		rtnl_lock(); -		tipc_net_start(addr); +		tipc_net_start(net, addr);  		rtnl_unlock();  	} |