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

Commit be97fdb5 authored by Julian Anastasov's avatar Julian Anastasov Committed by Simon Horman
Browse files

ipvs: generalize app registration in netns



	Get rid of the ftp_app pointer and allow applications
to be registered without adding fields in the netns_ipvs structure.

v2: fix coding style as suggested by Pablo Neira Ayuso <pablo@netfilter.org>

Signed-off-by: default avatarJulian Anastasov <ja@ssi.bg>
Signed-off-by: default avatarSimon Horman <horms@verge.net.au>
parent aaea4ed7
Loading
Loading
Loading
Loading
+2 −3
Original line number Original line Diff line number Diff line
@@ -808,8 +808,6 @@ struct netns_ipvs {
	struct list_head	rs_table[IP_VS_RTAB_SIZE];
	struct list_head	rs_table[IP_VS_RTAB_SIZE];
	/* ip_vs_app */
	/* ip_vs_app */
	struct list_head	app_list;
	struct list_head	app_list;
	/* ip_vs_ftp */
	struct ip_vs_app	*ftp_app;
	/* ip_vs_proto */
	/* ip_vs_proto */
	#define IP_VS_PROTO_TAB_SIZE	32	/* must be power of 2 */
	#define IP_VS_PROTO_TAB_SIZE	32	/* must be power of 2 */
	struct ip_vs_proto_data *proto_data_table[IP_VS_PROTO_TAB_SIZE];
	struct ip_vs_proto_data *proto_data_table[IP_VS_PROTO_TAB_SIZE];
@@ -1179,7 +1177,8 @@ extern void ip_vs_service_net_cleanup(struct net *net);
 *      (from ip_vs_app.c)
 *      (from ip_vs_app.c)
 */
 */
#define IP_VS_APP_MAX_PORTS  8
#define IP_VS_APP_MAX_PORTS  8
extern int register_ip_vs_app(struct net *net, struct ip_vs_app *app);
extern struct ip_vs_app *register_ip_vs_app(struct net *net,
					    struct ip_vs_app *app);
extern void unregister_ip_vs_app(struct net *net, struct ip_vs_app *app);
extern void unregister_ip_vs_app(struct net *net, struct ip_vs_app *app);
extern int ip_vs_bind_app(struct ip_vs_conn *cp, struct ip_vs_protocol *pp);
extern int ip_vs_bind_app(struct ip_vs_conn *cp, struct ip_vs_protocol *pp);
extern void ip_vs_unbind_app(struct ip_vs_conn *cp);
extern void ip_vs_unbind_app(struct ip_vs_conn *cp);
+42 −16
Original line number Original line Diff line number Diff line
@@ -180,22 +180,38 @@ register_ip_vs_app_inc(struct net *net, struct ip_vs_app *app, __u16 proto,
}
}




/*
/* Register application for netns */
 *	ip_vs_app registration routine
struct ip_vs_app *register_ip_vs_app(struct net *net, struct ip_vs_app *app)
 */
int register_ip_vs_app(struct net *net, struct ip_vs_app *app)
{
{
	struct netns_ipvs *ipvs = net_ipvs(net);
	struct netns_ipvs *ipvs = net_ipvs(net);
	/* increase the module use count */
	struct ip_vs_app *a;
	ip_vs_use_count_inc();
	int err = 0;

	if (!ipvs)
		return ERR_PTR(-ENOENT);


	mutex_lock(&__ip_vs_app_mutex);
	mutex_lock(&__ip_vs_app_mutex);


	list_add(&app->a_list, &ipvs->app_list);
	list_for_each_entry(a, &ipvs->app_list, a_list) {
		if (!strcmp(app->name, a->name)) {
			err = -EEXIST;
			goto out_unlock;
		}
	}
	a = kmemdup(app, sizeof(*app), GFP_KERNEL);
	if (!a) {
		err = -ENOMEM;
		goto out_unlock;
	}
	INIT_LIST_HEAD(&a->incs_list);
	list_add(&a->a_list, &ipvs->app_list);
	/* increase the module use count */
	ip_vs_use_count_inc();


out_unlock:
	mutex_unlock(&__ip_vs_app_mutex);
	mutex_unlock(&__ip_vs_app_mutex);


	return 0;
	return err ? ERR_PTR(err) : a;
}
}




@@ -205,22 +221,31 @@ int register_ip_vs_app(struct net *net, struct ip_vs_app *app)
 */
 */
void unregister_ip_vs_app(struct net *net, struct ip_vs_app *app)
void unregister_ip_vs_app(struct net *net, struct ip_vs_app *app)
{
{
	struct ip_vs_app *inc, *nxt;
	struct netns_ipvs *ipvs = net_ipvs(net);
	struct ip_vs_app *a, *anxt, *inc, *nxt;

	if (!ipvs)
		return;


	mutex_lock(&__ip_vs_app_mutex);
	mutex_lock(&__ip_vs_app_mutex);


	list_for_each_entry_safe(inc, nxt, &app->incs_list, a_list) {
	list_for_each_entry_safe(a, anxt, &ipvs->app_list, a_list) {
		if (app && strcmp(app->name, a->name))
			continue;
		list_for_each_entry_safe(inc, nxt, &a->incs_list, a_list) {
			ip_vs_app_inc_release(net, inc);
			ip_vs_app_inc_release(net, inc);
		}
		}


	list_del(&app->a_list);
		list_del(&a->a_list);

		kfree(a);
	mutex_unlock(&__ip_vs_app_mutex);


		/* decrease the module use count */
		/* decrease the module use count */
		ip_vs_use_count_dec();
		ip_vs_use_count_dec();
	}
	}


	mutex_unlock(&__ip_vs_app_mutex);
}



/*
/*
 *	Bind ip_vs_conn to its ip_vs_app (called by cp constructor)
 *	Bind ip_vs_conn to its ip_vs_app (called by cp constructor)
@@ -586,5 +611,6 @@ int __net_init ip_vs_app_net_init(struct net *net)


void __net_exit ip_vs_app_net_cleanup(struct net *net)
void __net_exit ip_vs_app_net_cleanup(struct net *net)
{
{
	unregister_ip_vs_app(net, NULL /* all */);
	proc_net_remove(net, "ip_vs_app");
	proc_net_remove(net, "ip_vs_app");
}
}
+5 −16
Original line number Original line Diff line number Diff line
@@ -441,16 +441,10 @@ static int __net_init __ip_vs_ftp_init(struct net *net)


	if (!ipvs)
	if (!ipvs)
		return -ENOENT;
		return -ENOENT;
	app = kmemdup(&ip_vs_ftp, sizeof(struct ip_vs_app), GFP_KERNEL);

	if (!app)
	app = register_ip_vs_app(net, &ip_vs_ftp);
		return -ENOMEM;
	if (IS_ERR(app))
	INIT_LIST_HEAD(&app->a_list);
		return PTR_ERR(app);
	INIT_LIST_HEAD(&app->incs_list);
	ipvs->ftp_app = app;

	ret = register_ip_vs_app(net, app);
	if (ret)
		goto err_exit;


	for (i = 0; i < ports_count; i++) {
	for (i = 0; i < ports_count; i++) {
		if (!ports[i])
		if (!ports[i])
@@ -464,9 +458,7 @@ static int __net_init __ip_vs_ftp_init(struct net *net)
	return 0;
	return 0;


err_unreg:
err_unreg:
	unregister_ip_vs_app(net, app);
	unregister_ip_vs_app(net, &ip_vs_ftp);
err_exit:
	kfree(ipvs->ftp_app);
	return ret;
	return ret;
}
}
/*
/*
@@ -474,10 +466,7 @@ err_exit:
 */
 */
static void __ip_vs_ftp_exit(struct net *net)
static void __ip_vs_ftp_exit(struct net *net)
{
{
	struct netns_ipvs *ipvs = net_ipvs(net);
	unregister_ip_vs_app(net, &ip_vs_ftp);

	unregister_ip_vs_app(net, ipvs->ftp_app);
	kfree(ipvs->ftp_app);
}
}


static struct pernet_operations ip_vs_ftp_ops = {
static struct pernet_operations ip_vs_ftp_ops = {