Commit 619c1517 authored by Patrick McHardy's avatar Patrick McHardy
parents 1f2d9c9d 6c8f7949
...@@ -836,8 +836,6 @@ struct netns_ipvs { ...@@ -836,8 +836,6 @@ struct netns_ipvs {
int num_services; /* no of virtual services */ int num_services; /* no of virtual services */
rwlock_t rs_lock; /* real services table */ rwlock_t rs_lock; /* real services table */
/* semaphore for IPVS sockopts. And, [gs]etsockopt may sleep. */
struct lock_class_key ctl_key; /* ctl_mutex debuging */
/* Trash for destinations */ /* Trash for destinations */
struct list_head dest_trash; struct list_head dest_trash;
/* Service counters */ /* Service counters */
...@@ -1089,19 +1087,19 @@ ip_vs_control_add(struct ip_vs_conn *cp, struct ip_vs_conn *ctl_cp) ...@@ -1089,19 +1087,19 @@ ip_vs_control_add(struct ip_vs_conn *cp, struct ip_vs_conn *ctl_cp)
/* /*
* IPVS netns init & cleanup functions * IPVS netns init & cleanup functions
*/ */
extern int __ip_vs_estimator_init(struct net *net); extern int ip_vs_estimator_net_init(struct net *net);
extern int __ip_vs_control_init(struct net *net); extern int ip_vs_control_net_init(struct net *net);
extern int __ip_vs_protocol_init(struct net *net); extern int ip_vs_protocol_net_init(struct net *net);
extern int __ip_vs_app_init(struct net *net); extern int ip_vs_app_net_init(struct net *net);
extern int __ip_vs_conn_init(struct net *net); extern int ip_vs_conn_net_init(struct net *net);
extern int __ip_vs_sync_init(struct net *net); extern int ip_vs_sync_net_init(struct net *net);
extern void __ip_vs_conn_cleanup(struct net *net); extern void ip_vs_conn_net_cleanup(struct net *net);
extern void __ip_vs_app_cleanup(struct net *net); extern void ip_vs_app_net_cleanup(struct net *net);
extern void __ip_vs_protocol_cleanup(struct net *net); extern void ip_vs_protocol_net_cleanup(struct net *net);
extern void __ip_vs_control_cleanup(struct net *net); extern void ip_vs_control_net_cleanup(struct net *net);
extern void __ip_vs_estimator_cleanup(struct net *net); extern void ip_vs_estimator_net_cleanup(struct net *net);
extern void __ip_vs_sync_cleanup(struct net *net); extern void ip_vs_sync_net_cleanup(struct net *net);
extern void __ip_vs_service_cleanup(struct net *net); extern void ip_vs_service_net_cleanup(struct net *net);
/* /*
* IPVS application functions * IPVS application functions
...@@ -1119,8 +1117,6 @@ extern void ip_vs_app_inc_put(struct ip_vs_app *inc); ...@@ -1119,8 +1117,6 @@ extern void ip_vs_app_inc_put(struct ip_vs_app *inc);
extern int ip_vs_app_pkt_out(struct ip_vs_conn *, struct sk_buff *skb); extern int ip_vs_app_pkt_out(struct ip_vs_conn *, struct sk_buff *skb);
extern int ip_vs_app_pkt_in(struct ip_vs_conn *, struct sk_buff *skb); extern int ip_vs_app_pkt_in(struct ip_vs_conn *, struct sk_buff *skb);
extern int ip_vs_app_init(void);
extern void ip_vs_app_cleanup(void);
void ip_vs_bind_pe(struct ip_vs_service *svc, struct ip_vs_pe *pe); void ip_vs_bind_pe(struct ip_vs_service *svc, struct ip_vs_pe *pe);
void ip_vs_unbind_pe(struct ip_vs_service *svc); void ip_vs_unbind_pe(struct ip_vs_service *svc);
...@@ -1223,15 +1219,11 @@ extern int start_sync_thread(struct net *net, int state, char *mcast_ifn, ...@@ -1223,15 +1219,11 @@ extern int start_sync_thread(struct net *net, int state, char *mcast_ifn,
__u8 syncid); __u8 syncid);
extern int stop_sync_thread(struct net *net, int state); extern int stop_sync_thread(struct net *net, int state);
extern void ip_vs_sync_conn(struct net *net, struct ip_vs_conn *cp); extern void ip_vs_sync_conn(struct net *net, struct ip_vs_conn *cp);
extern int ip_vs_sync_init(void);
extern void ip_vs_sync_cleanup(void);
/* /*
* IPVS rate estimator prototypes (from ip_vs_est.c) * IPVS rate estimator prototypes (from ip_vs_est.c)
*/ */
extern int ip_vs_estimator_init(void);
extern void ip_vs_estimator_cleanup(void);
extern void ip_vs_start_estimator(struct net *net, struct ip_vs_stats *stats); extern void ip_vs_start_estimator(struct net *net, struct ip_vs_stats *stats);
extern void ip_vs_stop_estimator(struct net *net, struct ip_vs_stats *stats); extern void ip_vs_stop_estimator(struct net *net, struct ip_vs_stats *stats);
extern void ip_vs_zero_estimator(struct ip_vs_stats *stats); extern void ip_vs_zero_estimator(struct ip_vs_stats *stats);
......
...@@ -576,7 +576,7 @@ static const struct file_operations ip_vs_app_fops = { ...@@ -576,7 +576,7 @@ static const struct file_operations ip_vs_app_fops = {
}; };
#endif #endif
int __net_init __ip_vs_app_init(struct net *net) int __net_init ip_vs_app_net_init(struct net *net)
{ {
struct netns_ipvs *ipvs = net_ipvs(net); struct netns_ipvs *ipvs = net_ipvs(net);
...@@ -585,17 +585,7 @@ int __net_init __ip_vs_app_init(struct net *net) ...@@ -585,17 +585,7 @@ int __net_init __ip_vs_app_init(struct net *net)
return 0; return 0;
} }
void __net_exit __ip_vs_app_cleanup(struct net *net) void __net_exit ip_vs_app_net_cleanup(struct net *net)
{ {
proc_net_remove(net, "ip_vs_app"); proc_net_remove(net, "ip_vs_app");
} }
int __init ip_vs_app_init(void)
{
return 0;
}
void ip_vs_app_cleanup(void)
{
}
...@@ -1247,7 +1247,7 @@ static void ip_vs_conn_flush(struct net *net) ...@@ -1247,7 +1247,7 @@ static void ip_vs_conn_flush(struct net *net)
/* /*
* per netns init and exit * per netns init and exit
*/ */
int __net_init __ip_vs_conn_init(struct net *net) int __net_init ip_vs_conn_net_init(struct net *net)
{ {
struct netns_ipvs *ipvs = net_ipvs(net); struct netns_ipvs *ipvs = net_ipvs(net);
...@@ -1258,7 +1258,7 @@ int __net_init __ip_vs_conn_init(struct net *net) ...@@ -1258,7 +1258,7 @@ int __net_init __ip_vs_conn_init(struct net *net)
return 0; return 0;
} }
void __net_exit __ip_vs_conn_cleanup(struct net *net) void __net_exit ip_vs_conn_net_cleanup(struct net *net)
{ {
/* flush all the connection entries first */ /* flush all the connection entries first */
ip_vs_conn_flush(net); ip_vs_conn_flush(net);
......
...@@ -1384,7 +1384,7 @@ ip_vs_in_icmp(struct sk_buff *skb, int *related, unsigned int hooknum) ...@@ -1384,7 +1384,7 @@ ip_vs_in_icmp(struct sk_buff *skb, int *related, unsigned int hooknum)
offset += 2 * sizeof(__u16); offset += 2 * sizeof(__u16);
verdict = ip_vs_icmp_xmit(skb, cp, pp, offset, hooknum); verdict = ip_vs_icmp_xmit(skb, cp, pp, offset, hooknum);
out: out:
__ip_vs_conn_put(cp); __ip_vs_conn_put(cp);
return verdict; return verdict;
...@@ -1891,22 +1891,22 @@ static int __net_init __ip_vs_init(struct net *net) ...@@ -1891,22 +1891,22 @@ static int __net_init __ip_vs_init(struct net *net)
atomic_inc(&ipvs_netns_cnt); atomic_inc(&ipvs_netns_cnt);
net->ipvs = ipvs; net->ipvs = ipvs;
if (__ip_vs_estimator_init(net) < 0) if (ip_vs_estimator_net_init(net) < 0)
goto estimator_fail; goto estimator_fail;
if (__ip_vs_control_init(net) < 0) if (ip_vs_control_net_init(net) < 0)
goto control_fail; goto control_fail;
if (__ip_vs_protocol_init(net) < 0) if (ip_vs_protocol_net_init(net) < 0)
goto protocol_fail; goto protocol_fail;
if (__ip_vs_app_init(net) < 0) if (ip_vs_app_net_init(net) < 0)
goto app_fail; goto app_fail;
if (__ip_vs_conn_init(net) < 0) if (ip_vs_conn_net_init(net) < 0)
goto conn_fail; goto conn_fail;
if (__ip_vs_sync_init(net) < 0) if (ip_vs_sync_net_init(net) < 0)
goto sync_fail; goto sync_fail;
printk(KERN_INFO "IPVS: Creating netns size=%zu id=%d\n", printk(KERN_INFO "IPVS: Creating netns size=%zu id=%d\n",
...@@ -1917,27 +1917,27 @@ static int __net_init __ip_vs_init(struct net *net) ...@@ -1917,27 +1917,27 @@ static int __net_init __ip_vs_init(struct net *net)
*/ */
sync_fail: sync_fail:
__ip_vs_conn_cleanup(net); ip_vs_conn_net_cleanup(net);
conn_fail: conn_fail:
__ip_vs_app_cleanup(net); ip_vs_app_net_cleanup(net);
app_fail: app_fail:
__ip_vs_protocol_cleanup(net); ip_vs_protocol_net_cleanup(net);
protocol_fail: protocol_fail:
__ip_vs_control_cleanup(net); ip_vs_control_net_cleanup(net);
control_fail: control_fail:
__ip_vs_estimator_cleanup(net); ip_vs_estimator_net_cleanup(net);
estimator_fail: estimator_fail:
return -ENOMEM; return -ENOMEM;
} }
static void __net_exit __ip_vs_cleanup(struct net *net) static void __net_exit __ip_vs_cleanup(struct net *net)
{ {
__ip_vs_service_cleanup(net); /* ip_vs_flush() with locks */ ip_vs_service_net_cleanup(net); /* ip_vs_flush() with locks */
__ip_vs_conn_cleanup(net); ip_vs_conn_net_cleanup(net);
__ip_vs_app_cleanup(net); ip_vs_app_net_cleanup(net);
__ip_vs_protocol_cleanup(net); ip_vs_protocol_net_cleanup(net);
__ip_vs_control_cleanup(net); ip_vs_control_net_cleanup(net);
__ip_vs_estimator_cleanup(net); ip_vs_estimator_net_cleanup(net);
IP_VS_DBG(2, "ipvs netns %d released\n", net_ipvs(net)->gen); IP_VS_DBG(2, "ipvs netns %d released\n", net_ipvs(net)->gen);
} }
...@@ -1945,7 +1945,7 @@ static void __net_exit __ip_vs_dev_cleanup(struct net *net) ...@@ -1945,7 +1945,7 @@ static void __net_exit __ip_vs_dev_cleanup(struct net *net)
{ {
EnterFunction(2); EnterFunction(2);
net_ipvs(net)->enable = 0; /* Disable packet reception */ net_ipvs(net)->enable = 0; /* Disable packet reception */
__ip_vs_sync_cleanup(net); ip_vs_sync_net_cleanup(net);
LeaveFunction(2); LeaveFunction(2);
} }
...@@ -1967,36 +1967,23 @@ static int __init ip_vs_init(void) ...@@ -1967,36 +1967,23 @@ static int __init ip_vs_init(void)
{ {
int ret; int ret;
ip_vs_estimator_init();
ret = ip_vs_control_init(); ret = ip_vs_control_init();
if (ret < 0) { if (ret < 0) {
pr_err("can't setup control.\n"); pr_err("can't setup control.\n");
goto cleanup_estimator; goto exit;
} }
ip_vs_protocol_init(); ip_vs_protocol_init();
ret = ip_vs_app_init();
if (ret < 0) {
pr_err("can't setup application helper.\n");
goto cleanup_protocol;
}
ret = ip_vs_conn_init(); ret = ip_vs_conn_init();
if (ret < 0) { if (ret < 0) {
pr_err("can't setup connection table.\n"); pr_err("can't setup connection table.\n");
goto cleanup_app; goto cleanup_protocol;
}
ret = ip_vs_sync_init();
if (ret < 0) {
pr_err("can't setup sync data.\n");
goto cleanup_conn;
} }
ret = register_pernet_subsys(&ipvs_core_ops); /* Alloc ip_vs struct */ ret = register_pernet_subsys(&ipvs_core_ops); /* Alloc ip_vs struct */
if (ret < 0) if (ret < 0)
goto cleanup_sync; goto cleanup_conn;
ret = register_pernet_device(&ipvs_core_dev_ops); ret = register_pernet_device(&ipvs_core_dev_ops);
if (ret < 0) if (ret < 0)
...@@ -2016,17 +2003,12 @@ static int __init ip_vs_init(void) ...@@ -2016,17 +2003,12 @@ static int __init ip_vs_init(void)
unregister_pernet_device(&ipvs_core_dev_ops); unregister_pernet_device(&ipvs_core_dev_ops);
cleanup_sub: cleanup_sub:
unregister_pernet_subsys(&ipvs_core_ops); unregister_pernet_subsys(&ipvs_core_ops);
cleanup_sync: cleanup_conn:
ip_vs_sync_cleanup();
cleanup_conn:
ip_vs_conn_cleanup(); ip_vs_conn_cleanup();
cleanup_app: cleanup_protocol:
ip_vs_app_cleanup();
cleanup_protocol:
ip_vs_protocol_cleanup(); ip_vs_protocol_cleanup();
ip_vs_control_cleanup(); ip_vs_control_cleanup();
cleanup_estimator: exit:
ip_vs_estimator_cleanup();
return ret; return ret;
} }
...@@ -2035,12 +2017,9 @@ static void __exit ip_vs_cleanup(void) ...@@ -2035,12 +2017,9 @@ static void __exit ip_vs_cleanup(void)
nf_unregister_hooks(ip_vs_ops, ARRAY_SIZE(ip_vs_ops)); nf_unregister_hooks(ip_vs_ops, ARRAY_SIZE(ip_vs_ops));
unregister_pernet_device(&ipvs_core_dev_ops); unregister_pernet_device(&ipvs_core_dev_ops);
unregister_pernet_subsys(&ipvs_core_ops); /* free ip_vs struct */ unregister_pernet_subsys(&ipvs_core_ops); /* free ip_vs struct */
ip_vs_sync_cleanup();
ip_vs_conn_cleanup(); ip_vs_conn_cleanup();
ip_vs_app_cleanup();
ip_vs_protocol_cleanup(); ip_vs_protocol_cleanup();
ip_vs_control_cleanup(); ip_vs_control_cleanup();
ip_vs_estimator_cleanup();
pr_info("ipvs unloaded.\n"); pr_info("ipvs unloaded.\n");
} }
......
...@@ -1334,9 +1334,9 @@ ip_vs_edit_service(struct ip_vs_service *svc, struct ip_vs_service_user_kern *u) ...@@ -1334,9 +1334,9 @@ ip_vs_edit_service(struct ip_vs_service *svc, struct ip_vs_service_user_kern *u)
ip_vs_bind_pe(svc, pe); ip_vs_bind_pe(svc, pe);
} }
out_unlock: out_unlock:
write_unlock_bh(&__ip_vs_svc_lock); write_unlock_bh(&__ip_vs_svc_lock);
out: out:
ip_vs_scheduler_put(old_sched); ip_vs_scheduler_put(old_sched);
ip_vs_pe_put(old_pe); ip_vs_pe_put(old_pe);
return ret; return ret;
...@@ -1483,7 +1483,7 @@ static int ip_vs_flush(struct net *net) ...@@ -1483,7 +1483,7 @@ static int ip_vs_flush(struct net *net)
* Delete service by {netns} in the service table. * Delete service by {netns} in the service table.
* Called by __ip_vs_cleanup() * Called by __ip_vs_cleanup()
*/ */
void __ip_vs_service_cleanup(struct net *net) void ip_vs_service_net_cleanup(struct net *net)
{ {
EnterFunction(2); EnterFunction(2);
/* Check for "full" addressed entries */ /* Check for "full" addressed entries */
...@@ -1662,7 +1662,7 @@ proc_do_sync_mode(ctl_table *table, int write, ...@@ -1662,7 +1662,7 @@ proc_do_sync_mode(ctl_table *table, int write,
/* /*
* IPVS sysctl table (under the /proc/sys/net/ipv4/vs/) * IPVS sysctl table (under the /proc/sys/net/ipv4/vs/)
* Do not change order or insert new entries without * Do not change order or insert new entries without
* align with netns init in __ip_vs_control_init() * align with netns init in ip_vs_control_net_init()
*/ */
static struct ctl_table vs_vars[] = { static struct ctl_table vs_vars[] = {
...@@ -2469,7 +2469,7 @@ __ip_vs_get_service_entries(struct net *net, ...@@ -2469,7 +2469,7 @@ __ip_vs_get_service_entries(struct net *net,
count++; count++;
} }
} }
out: out:
return ret; return ret;
} }
...@@ -2707,7 +2707,7 @@ do_ip_vs_get_ctl(struct sock *sk, int cmd, void __user *user, int *len) ...@@ -2707,7 +2707,7 @@ do_ip_vs_get_ctl(struct sock *sk, int cmd, void __user *user, int *len)
ret = -EINVAL; ret = -EINVAL;
} }
out: out:
mutex_unlock(&__ip_vs_mutex); mutex_unlock(&__ip_vs_mutex);
return ret; return ret;
} }
...@@ -3595,7 +3595,7 @@ static void ip_vs_genl_unregister(void) ...@@ -3595,7 +3595,7 @@ static void ip_vs_genl_unregister(void)
* per netns intit/exit func. * per netns intit/exit func.
*/ */
#ifdef CONFIG_SYSCTL #ifdef CONFIG_SYSCTL
int __net_init __ip_vs_control_init_sysctl(struct net *net) int __net_init ip_vs_control_net_init_sysctl(struct net *net)
{ {
int idx; int idx;
struct netns_ipvs *ipvs = net_ipvs(net); struct netns_ipvs *ipvs = net_ipvs(net);
...@@ -3654,7 +3654,7 @@ int __net_init __ip_vs_control_init_sysctl(struct net *net) ...@@ -3654,7 +3654,7 @@ int __net_init __ip_vs_control_init_sysctl(struct net *net)
return 0; return 0;
} }
void __net_init __ip_vs_control_cleanup_sysctl(struct net *net) void __net_init ip_vs_control_net_cleanup_sysctl(struct net *net)
{ {
struct netns_ipvs *ipvs = net_ipvs(net); struct netns_ipvs *ipvs = net_ipvs(net);
...@@ -3665,8 +3665,8 @@ void __net_init __ip_vs_control_cleanup_sysctl(struct net *net) ...@@ -3665,8 +3665,8 @@ void __net_init __ip_vs_control_cleanup_sysctl(struct net *net)
#else #else
int __net_init __ip_vs_control_init_sysctl(struct net *net) { return 0; } int __net_init ip_vs_control_net_init_sysctl(struct net *net) { return 0; }
void __net_init __ip_vs_control_cleanup_sysctl(struct net *net) { } void __net_init ip_vs_control_net_cleanup_sysctl(struct net *net) { }
#endif #endif
...@@ -3674,7 +3674,7 @@ static struct notifier_block ip_vs_dst_notifier = { ...@@ -3674,7 +3674,7 @@ static struct notifier_block ip_vs_dst_notifier = {
.notifier_call = ip_vs_dst_event, .notifier_call = ip_vs_dst_event,
}; };
int __net_init __ip_vs_control_init(struct net *net) int __net_init ip_vs_control_net_init(struct net *net)
{ {
int idx; int idx;
struct netns_ipvs *ipvs = net_ipvs(net); struct netns_ipvs *ipvs = net_ipvs(net);
...@@ -3702,7 +3702,7 @@ int __net_init __ip_vs_control_init(struct net *net) ...@@ -3702,7 +3702,7 @@ int __net_init __ip_vs_control_init(struct net *net)
proc_net_fops_create(net, "ip_vs_stats_percpu", 0, proc_net_fops_create(net, "ip_vs_stats_percpu", 0,
&ip_vs_stats_percpu_fops); &ip_vs_stats_percpu_fops);
if (__ip_vs_control_init_sysctl(net)) if (ip_vs_control_net_init_sysctl(net))
goto err; goto err;
return 0; return 0;
...@@ -3712,13 +3712,13 @@ int __net_init __ip_vs_control_init(struct net *net) ...@@ -3712,13 +3712,13 @@ int __net_init __ip_vs_control_init(struct net *net)
return -ENOMEM; return -ENOMEM;
} }
void __net_exit __ip_vs_control_cleanup(struct net *net) void __net_exit ip_vs_control_net_cleanup(struct net *net)
{ {
struct netns_ipvs *ipvs = net_ipvs(net); struct netns_ipvs *ipvs = net_ipvs(net);
ip_vs_trash_cleanup(net); ip_vs_trash_cleanup(net);
ip_vs_stop_estimator(net, &ipvs->tot_stats); ip_vs_stop_estimator(net, &ipvs->tot_stats);
__ip_vs_control_cleanup_sysctl(net); ip_vs_control_net_cleanup_sysctl(net);
proc_net_remove(net, "ip_vs_stats_percpu"); proc_net_remove(net, "ip_vs_stats_percpu");
proc_net_remove(net, "ip_vs_stats"); proc_net_remove(net, "ip_vs_stats");
proc_net_remove(net, "ip_vs"); proc_net_remove(net, "ip_vs");
......
...@@ -192,7 +192,7 @@ void ip_vs_read_estimator(struct ip_vs_stats_user *dst, ...@@ -192,7 +192,7 @@ void ip_vs_read_estimator(struct ip_vs_stats_user *dst,
dst->outbps = (e->outbps + 0xF) >> 5; dst->outbps = (e->outbps + 0xF) >> 5;
} }
int __net_init __ip_vs_estimator_init(struct net *net) int __net_init ip_vs_estimator_net_init(struct net *net)
{ {
struct netns_ipvs *ipvs = net_ipvs(net); struct netns_ipvs *ipvs = net_ipvs(net);
...@@ -203,16 +203,7 @@ int __net_init __ip_vs_estimator_init(struct net *net) ...@@ -203,16 +203,7 @@ int __net_init __ip_vs_estimator_init(struct net *net)
return 0; return 0;
} }
void __net_exit __ip_vs_estimator_cleanup(struct net *net) void __net_exit ip_vs_estimator_net_cleanup(struct net *net)
{ {
del_timer_sync(&net_ipvs(net)->est_timer); del_timer_sync(&net_ipvs(net)->est_timer);
} }
int __init ip_vs_estimator_init(void)
{
return 0;
}
void ip_vs_estimator_cleanup(void)
{
}
...@@ -44,8 +44,8 @@ ...@@ -44,8 +44,8 @@
#include <net/ip_vs.h> #include <net/ip_vs.h>
#define SERVER_STRING "227 Entering Passive Mode (" #define SERVER_STRING "227 "
#define CLIENT_STRING "PORT " #define CLIENT_STRING "PORT"
/* /*
...@@ -79,14 +79,17 @@ ip_vs_ftp_done_conn(struct ip_vs_app *app, struct ip_vs_conn *cp) ...@@ -79,14 +79,17 @@ ip_vs_ftp_done_conn(struct ip_vs_app *app, struct ip_vs_conn *cp)
/* /*
* Get <addr,port> from the string "xxx.xxx.xxx.xxx,ppp,ppp", started * Get <addr,port> from the string "xxx.xxx.xxx.xxx,ppp,ppp", started
* with the "pattern" and terminated with the "term" character. * with the "pattern", ignoring before "skip" and terminated with
* the "term" character.
* <addr,port> is in network order. * <addr,port> is in network order.
*/ */
static int ip_vs_ftp_get_addrport(char *data, char *data_limit, static int ip_vs_ftp_get_addrport(char *data, char *data_limit,
const char *pattern, size_t plen, char term, const char *pattern, size_t plen,
char skip, char term,
__be32 *addr, __be16 *port, __be32 *addr, __be16 *port,
char **start, char **end) char **start, char **end)
{ {
char *s, c;
unsigned char p[6]; unsigned char p[6];
int i = 0; int i = 0;
...@@ -101,19 +104,38 @@ static int ip_vs_ftp_get_addrport(char *data, char *data_limit, ...@@ -101,19 +104,38 @@ static int ip_vs_ftp_get_addrport(char *data, char *data_limit,
if (strnicmp(data, pattern, plen) != 0) { if (strnicmp(data, pattern, plen) != 0) {
return 0; return 0;
} }
*start = data + plen; s = data + plen;
if (skip) {
int found = 0;
for (;; s++) {
if (s == data_limit)
return -1;
if (!found) {
if (*s == skip)
found = 1;
} else if (*s != skip) {
break;
}
}
}
for (data = *start; *data != term; data++) { for (data = s; ; data++) {
if (data == data_limit) if (data == data_limit)
return -1; return -1;
if (*data == term)
break;
} }
*end = data; *end = data;
memset(p, 0, sizeof(p)); memset(p, 0, sizeof(p));
for (data = *start; data != *end; data++) { for (data = s; ; data++) {
if (*data >= '0' && *data <= '9') { c = *data;
p[i] = p[i]*10 + *data - '0'; if (c == term)
} else if (*data == ',' && i < 5) { break;
if (c >= '0' && c <= '9') {
p[i] = p[i]*10 + c - '0';
} else if (c == ',' && i < 5) {
i++; i++;
} else { } else {
/* unexpected character */ /* unexpected character */
...@@ -124,8 +146,9 @@ static int ip_vs_ftp_get_addrport(char *data, char *data_limit, ...@@ -124,8 +146,9 @@ static int ip_vs_ftp_get_addrport(char *data, char *data_limit,
if (i != 5) if (i != 5)
return -1; return -1;
*addr = get_unaligned((__be32 *)p); *start = s;
*port = get_unaligned((__be16 *)(p + 4)); *addr = get_unaligned((__be32 *) p);
*port = get_unaligned((__be16 *) (p + 4));
return 1; return 1;
} }
...@@ -185,7 +208,8 @@ static int ip_vs_ftp_out(struct ip_vs_app *app, struct ip_vs_conn *cp, ...@@ -185,7 +208,8 @@ static int ip_vs_ftp_out(struct ip_vs_app *app, struct ip_vs_conn *cp,
if (ip_vs_ftp_get_addrport(data, data_limit, if (ip_vs_ftp_get_addrport(data, data_limit,
SERVER_STRING, SERVER_STRING,
sizeof(SERVER_STRING)-1, ')', sizeof(SERVER_STRING)-1,
'(', ')',
&from.ip, &port, &from.ip, &port,
&start, &end) != 1) &start, &end) != 1)
return 1; return 1;
...@@ -345,7 +369,7 @@ static int ip_vs_ftp_in(struct ip_vs_app *app, struct ip_vs_conn *cp, ...@@ -345,7 +369,7 @@ static int ip_vs_ftp_in(struct ip_vs_app *app, struct ip_vs_conn *cp,
*/ */
if (ip_vs_ftp_get_addrport(data_start, data_limit, if (ip_vs_ftp_get_addrport(data_start, data_limit,
CLIENT_STRING, sizeof(CLIENT_STRING)-1, CLIENT_STRING, sizeof(CLIENT_STRING)-1,
'\r', &to.ip, &port, ' ', '\r', &to.ip, &port,
&start, &end) != 1) &start, &end) != 1)
return 1; return 1;
......
...@@ -316,7 +316,7 @@ ip_vs_tcpudp_debug_packet(int af, struct ip_vs_protocol *pp, ...@@ -316,7 +316,7 @@ ip_vs_tcpudp_debug_packet(int af, struct ip_vs_protocol *pp,
/* /*
* per network name-space init * per network name-space init
*/ */
int __net_init __ip_vs_protocol_init(struct net *net) int __net_init ip_vs_protocol_net_init(struct net *net)
{ {
#ifdef CONFIG_IP_VS_PROTO_TCP #ifdef CONFIG_IP_VS_PROTO_TCP
register_ip_vs_proto_netns(net, &ip_vs_protocol_tcp); register_ip_vs_proto_netns(net, &ip_vs_protocol_tcp);
...@@ -336,7 +336,7 @@ int __net_init __ip_vs_protocol_init(struct net *net) ...@@ -336,7 +336,7 @@ int __net_init __ip_vs_protocol_init(struct net *net)
return 0; return 0;
} }
void __net_exit __ip_vs_protocol_cleanup(struct net *net) void __net_exit ip_vs_protocol_net_cleanup(struct net *net)
{ {
struct netns_ipvs *ipvs = net_ipvs(net); struct netns_ipvs *ipvs = net_ipvs(net);
struct ip_vs_proto_data *pd; struct ip_vs_proto_data *pd;
......
...@@ -1663,7 +1663,7 @@ int stop_sync_thread(struct net *net, int state) ...@@ -1663,7 +1663,7 @@ int stop_sync_thread(struct net *net, int state)
/* /*
* Initialize data struct for each netns * Initialize data struct for each netns
*/ */
int __net_init __ip_vs_sync_init(struct net *net) int __net_init ip_vs_sync_net_init(struct net *net)
{ {
struct netns_ipvs *ipvs = net_ipvs(net); struct netns_ipvs *ipvs = net_ipvs(net);
...@@ -1677,7 +1677,7 @@ int __net_init __ip_vs_sync_init(struct net *net) ...@@ -1677,7 +1677,7 @@ int __net_init __ip_vs_sync_init(struct net *net)
return 0; return 0;
} }
void __ip_vs_sync_cleanup(struct net *net) void ip_vs_sync_net_cleanup(struct net *net)
{ {
int retc; int retc;
...@@ -1689,12 +1689,3 @@ void __ip_vs_sync_cleanup(struct net *net) ...@@ -1689,12 +1689,3 @@ void __ip_vs_sync_cleanup(struct net *net)
if (retc && retc != -ESRCH) if (retc && retc != -ESRCH)
pr_err("Failed to stop Backup Daemon\n"); pr_err("Failed to stop Backup Daemon\n");
} }
int __init ip_vs_sync_init(void)
{
return 0;
}
void ip_vs_sync_cleanup(void)
{
}
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment