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

Commit a62fbcce authored by Ying Xue's avatar Ying Xue Committed by David S. Miller
Browse files

tipc: make subscriber server support net namespace



TIPC establishes one subscriber server which allows users to subscribe
their interesting name service status. After tipc supports namespace,
one dedicated tipc stack instance is created for each namespace, and
each instance can be deemed as one independent TIPC node. As a result,
subscriber server must be built for each namespace.

Signed-off-by: default avatarYing Xue <ying.xue@windriver.com>
Tested-by: default avatarTero Aho <Tero.Aho@coriant.com>
Reviewed-by: default avatarJon Maloy <jon.maloy@ericsson.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 34747539
Loading
Loading
Loading
Loading
+12 −12
Original line number Diff line number Diff line
@@ -68,8 +68,14 @@ static int __net_init tipc_init_net(struct net *net)
	err = tipc_nametbl_init(net);
	if (err)
		goto out_nametbl;

	err = tipc_subscr_start(net);
	if (err)
		goto out_subscr;
	return 0;

out_subscr:
	tipc_nametbl_stop(net);
out_nametbl:
	tipc_sk_rht_destroy(net);
out_sk_rht:
@@ -78,6 +84,7 @@ static int __net_init tipc_init_net(struct net *net)

static void __net_exit tipc_exit_net(struct net *net)
{
	tipc_subscr_stop(net);
	tipc_net_stop(net);
	tipc_nametbl_stop(net);
	tipc_sk_rht_destroy(net);
@@ -104,10 +111,6 @@ static int __init tipc_init(void)

	get_random_bytes(&tipc_random, sizeof(tipc_random));

	err = register_pernet_subsys(&tipc_net_ops);
	if (err)
		goto out_pernet;

	err = tipc_netlink_start();
	if (err)
		goto out_netlink;
@@ -120,9 +123,9 @@ static int __init tipc_init(void)
	if (err)
		goto out_sysctl;

	err = tipc_subscr_start();
	err = register_pernet_subsys(&tipc_net_ops);
	if (err)
		goto out_subscr;
		goto out_pernet;

	err = tipc_bearer_setup();
	if (err)
@@ -131,28 +134,25 @@ static int __init tipc_init(void)
	pr_info("Started in single node mode\n");
	return 0;
out_bearer:
	tipc_subscr_stop();
out_subscr:
	unregister_pernet_subsys(&tipc_net_ops);
out_pernet:
	tipc_unregister_sysctl();
out_sysctl:
	tipc_socket_stop();
out_socket:
	tipc_netlink_stop();
out_netlink:
	unregister_pernet_subsys(&tipc_net_ops);
out_pernet:
	pr_err("Unable to start in single node mode\n");
	return err;
}

static void __exit tipc_exit(void)
{
	unregister_pernet_subsys(&tipc_net_ops);
	tipc_bearer_cleanup();
	tipc_netlink_stop();
	tipc_subscr_stop();
	tipc_socket_stop();
	tipc_unregister_sysctl();
	unregister_pernet_subsys(&tipc_net_ops);

	pr_info("Deactivated\n");
}
+4 −0
Original line number Diff line number Diff line
@@ -106,6 +106,10 @@ struct tipc_net {
	/* Name table */
	spinlock_t nametbl_lock;
	struct name_table *nametbl;

	/* Topology subscription server */
	struct tipc_server *topsrv;
	atomic_t subscription_count;
};

#ifdef CONFIG_SYSCTL
+1 −1
Original line number Diff line number Diff line
@@ -309,7 +309,7 @@ static struct socket *tipc_create_listen_sock(struct tipc_conn *con)
	struct socket *sock = NULL;
	int ret;

	ret = tipc_sock_create_local(s->type, &sock);
	ret = tipc_sock_create_local(s->net, s->type, &sock);
	if (ret < 0)
		return NULL;
	ret = kernel_setsockopt(sock, SOL_TIPC, TIPC_IMPORTANCE,
+3 −1
Original line number Diff line number Diff line
@@ -47,6 +47,7 @@
 * @conn_idr: identifier set of connection
 * @idr_lock: protect the connection identifier set
 * @idr_in_use: amount of allocated identifier entry
 * @net: network namspace instance
 * @rcvbuf_cache: memory cache of server receive buffer
 * @rcv_wq: receive workqueue
 * @send_wq: send workqueue
@@ -63,6 +64,7 @@ struct tipc_server {
	struct idr conn_idr;
	spinlock_t idr_lock;
	int idr_in_use;
	struct net *net;
	struct kmem_cache *rcvbuf_cache;
	struct workqueue_struct *rcv_wq;
	struct workqueue_struct *send_wq;
@@ -73,7 +75,7 @@ struct tipc_server {
				  struct sockaddr_tipc *addr, void *usr_data,
				  void *buf, size_t len);
	struct sockaddr_tipc *saddr;
	const char name[TIPC_SERVER_NAME_LEN];
	char name[TIPC_SERVER_NAME_LEN];
	int imp;
	int type;
};
+2 −2
Original line number Diff line number Diff line
@@ -388,7 +388,7 @@ static int tipc_sk_create(struct net *net, struct socket *sock,
 *
 * Returns 0 on success, errno otherwise
 */
int tipc_sock_create_local(int type, struct socket **res)
int tipc_sock_create_local(struct net *net, int type, struct socket **res)
{
	int rc;

@@ -397,7 +397,7 @@ int tipc_sock_create_local(int type, struct socket **res)
		pr_err("Failed to create kernel socket\n");
		return rc;
	}
	tipc_sk_create(&init_net, *res, 0, 1);
	tipc_sk_create(net, *res, 0, 1);

	return 0;
}
Loading