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: Julian Anastasov <ja@ssi.bg> Signed-off-by: Simon Horman <horms@verge.net.au>
This commit is contained in:
parent
aaea4ed74d
commit
be97fdb5fb
|
@ -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);
|
||||||
|
|
|
@ -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,20 +221,29 @@ 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) {
|
||||||
ip_vs_app_inc_release(net, inc);
|
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);
|
||||||
|
}
|
||||||
|
|
||||||
|
list_del(&a->a_list);
|
||||||
|
kfree(a);
|
||||||
|
|
||||||
|
/* decrease the module use count */
|
||||||
|
ip_vs_use_count_dec();
|
||||||
}
|
}
|
||||||
|
|
||||||
list_del(&app->a_list);
|
|
||||||
|
|
||||||
mutex_unlock(&__ip_vs_app_mutex);
|
mutex_unlock(&__ip_vs_app_mutex);
|
||||||
|
|
||||||
/* decrease the module use count */
|
|
||||||
ip_vs_use_count_dec();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -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");
|
||||||
}
|
}
|
||||||
|
|
|
@ -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)
|
|
||||||
return -ENOMEM;
|
|
||||||
INIT_LIST_HEAD(&app->a_list);
|
|
||||||
INIT_LIST_HEAD(&app->incs_list);
|
|
||||||
ipvs->ftp_app = app;
|
|
||||||
|
|
||||||
ret = register_ip_vs_app(net, app);
|
app = register_ip_vs_app(net, &ip_vs_ftp);
|
||||||
if (ret)
|
if (IS_ERR(app))
|
||||||
goto err_exit;
|
return PTR_ERR(app);
|
||||||
|
|
||||||
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 = {
|
||||||
|
|
Loading…
Reference in New Issue