Commit 9bbac6a9 authored by Hans Schillstrom's avatar Hans Schillstrom Committed by Simon Horman

IPVS: netns, common protocol changes and use of appcnt.

appcnt and timeout_table moved from struct ip_vs_protocol to
ip_vs proto_data.

struct net *net added as first param to
 - register_app()
 - unregister_app()
 - app_conn_bind()
 - ip_vs_conn_new()

[horms@verge.net.au: removed cosmetic-change-only hunk]
Signed-off-by: default avatarHans Schillstrom <hans.schillstrom@ericsson.com>
Acked-by: default avatarJulian Anastasov <ja@ssi.bg>
Signed-off-by: default avatarSimon Horman <horms@verge.net.au>
parent 9330419d
...@@ -360,8 +360,6 @@ struct ip_vs_protocol { ...@@ -360,8 +360,6 @@ struct ip_vs_protocol {
u16 protocol; u16 protocol;
u16 num_states; u16 num_states;
int dont_defrag; int dont_defrag;
atomic_t appcnt; /* counter of proto app incs */
int *timeout_table; /* protocol timeout table */
void (*init)(struct ip_vs_protocol *pp); void (*init)(struct ip_vs_protocol *pp);
......
...@@ -804,7 +804,7 @@ ip_vs_conn_new(const struct ip_vs_conn_param *p, ...@@ -804,7 +804,7 @@ ip_vs_conn_new(const struct ip_vs_conn_param *p,
struct ip_vs_dest *dest, __u32 fwmark) struct ip_vs_dest *dest, __u32 fwmark)
{ {
struct ip_vs_conn *cp; struct ip_vs_conn *cp;
struct ip_vs_protocol *pp = ip_vs_proto_get(p->protocol); struct ip_vs_proto_data *pd = ip_vs_proto_data_get(&init_net, p->protocol);
cp = kmem_cache_zalloc(ip_vs_conn_cachep, GFP_ATOMIC); cp = kmem_cache_zalloc(ip_vs_conn_cachep, GFP_ATOMIC);
if (cp == NULL) { if (cp == NULL) {
...@@ -863,8 +863,8 @@ ip_vs_conn_new(const struct ip_vs_conn_param *p, ...@@ -863,8 +863,8 @@ ip_vs_conn_new(const struct ip_vs_conn_param *p,
#endif #endif
ip_vs_bind_xmit(cp); ip_vs_bind_xmit(cp);
if (unlikely(pp && atomic_read(&pp->appcnt))) if (unlikely(pd && atomic_read(&pd->appcnt)))
ip_vs_bind_app(cp, pp); ip_vs_bind_app(cp, pd->pp);
/* /*
* Allow conntrack to be preserved. By default, conntrack * Allow conntrack to be preserved. By default, conntrack
......
...@@ -1035,7 +1035,7 @@ static int sctp_register_app(struct ip_vs_app *inc) ...@@ -1035,7 +1035,7 @@ static int sctp_register_app(struct ip_vs_app *inc)
} }
} }
list_add(&inc->p_list, &ipvs->sctp_apps[hash]); list_add(&inc->p_list, &ipvs->sctp_apps[hash]);
atomic_inc(&pd->pp->appcnt); atomic_inc(&pd->appcnt);
out: out:
spin_unlock_bh(&ipvs->sctp_app_lock); spin_unlock_bh(&ipvs->sctp_app_lock);
...@@ -1048,7 +1048,7 @@ static void sctp_unregister_app(struct ip_vs_app *inc) ...@@ -1048,7 +1048,7 @@ static void sctp_unregister_app(struct ip_vs_app *inc)
struct ip_vs_proto_data *pd = ip_vs_proto_data_get(&init_net, IPPROTO_SCTP); struct ip_vs_proto_data *pd = ip_vs_proto_data_get(&init_net, IPPROTO_SCTP);
spin_lock_bh(&ipvs->sctp_app_lock); spin_lock_bh(&ipvs->sctp_app_lock);
atomic_dec(&pd->pp->appcnt); atomic_dec(&pd->appcnt);
list_del(&inc->p_list); list_del(&inc->p_list);
spin_unlock_bh(&ipvs->sctp_app_lock); spin_unlock_bh(&ipvs->sctp_app_lock);
} }
......
...@@ -596,7 +596,7 @@ static int tcp_register_app(struct ip_vs_app *inc) ...@@ -596,7 +596,7 @@ static int tcp_register_app(struct ip_vs_app *inc)
} }
} }
list_add(&inc->p_list, &ipvs->tcp_apps[hash]); list_add(&inc->p_list, &ipvs->tcp_apps[hash]);
atomic_inc(&pd->pp->appcnt); atomic_inc(&pd->appcnt);
out: out:
spin_unlock_bh(&ipvs->tcp_app_lock); spin_unlock_bh(&ipvs->tcp_app_lock);
...@@ -611,7 +611,7 @@ tcp_unregister_app(struct ip_vs_app *inc) ...@@ -611,7 +611,7 @@ tcp_unregister_app(struct ip_vs_app *inc)
struct ip_vs_proto_data *pd = ip_vs_proto_data_get(&init_net, IPPROTO_TCP); struct ip_vs_proto_data *pd = ip_vs_proto_data_get(&init_net, IPPROTO_TCP);
spin_lock_bh(&ipvs->tcp_app_lock); spin_lock_bh(&ipvs->tcp_app_lock);
atomic_dec(&pd->pp->appcnt); atomic_dec(&pd->appcnt);
list_del(&inc->p_list); list_del(&inc->p_list);
spin_unlock_bh(&ipvs->tcp_app_lock); spin_unlock_bh(&ipvs->tcp_app_lock);
} }
...@@ -701,7 +701,6 @@ struct ip_vs_protocol ip_vs_protocol_tcp = { ...@@ -701,7 +701,6 @@ struct ip_vs_protocol ip_vs_protocol_tcp = {
.protocol = IPPROTO_TCP, .protocol = IPPROTO_TCP,
.num_states = IP_VS_TCP_S_LAST, .num_states = IP_VS_TCP_S_LAST,
.dont_defrag = 0, .dont_defrag = 0,
.appcnt = ATOMIC_INIT(0),
.init = NULL, .init = NULL,
.exit = NULL, .exit = NULL,
.init_netns = __ip_vs_tcp_init, .init_netns = __ip_vs_tcp_init,
......
...@@ -373,7 +373,7 @@ static int udp_register_app(struct ip_vs_app *inc) ...@@ -373,7 +373,7 @@ static int udp_register_app(struct ip_vs_app *inc)
} }
} }
list_add(&inc->p_list, &ipvs->udp_apps[hash]); list_add(&inc->p_list, &ipvs->udp_apps[hash]);
atomic_inc(&pd->pp->appcnt); atomic_inc(&pd->appcnt);
out: out:
spin_unlock_bh(&ipvs->udp_app_lock); spin_unlock_bh(&ipvs->udp_app_lock);
...@@ -388,7 +388,7 @@ udp_unregister_app(struct ip_vs_app *inc) ...@@ -388,7 +388,7 @@ udp_unregister_app(struct ip_vs_app *inc)
struct netns_ipvs *ipvs = net_ipvs(&init_net); struct netns_ipvs *ipvs = net_ipvs(&init_net);
spin_lock_bh(&ipvs->udp_app_lock); spin_lock_bh(&ipvs->udp_app_lock);
atomic_dec(&pd->pp->appcnt); atomic_dec(&pd->appcnt);
list_del(&inc->p_list); list_del(&inc->p_list);
spin_unlock_bh(&ipvs->udp_app_lock); spin_unlock_bh(&ipvs->udp_app_lock);
} }
......
...@@ -725,17 +725,16 @@ ip_vs_conn_fill_param_sync(int af, union ip_vs_sync_conn *sc, ...@@ -725,17 +725,16 @@ ip_vs_conn_fill_param_sync(int af, union ip_vs_sync_conn *sc,
* Param: ... * Param: ...
* timeout is in sec. * timeout is in sec.
*/ */
static void ip_vs_proc_conn(struct ip_vs_conn_param *param, unsigned flags, static void ip_vs_proc_conn(struct net *net, struct ip_vs_conn_param *param,
unsigned state, unsigned protocol, unsigned type, unsigned int flags, unsigned int state,
unsigned int protocol, unsigned int type,
const union nf_inet_addr *daddr, __be16 dport, const union nf_inet_addr *daddr, __be16 dport,
unsigned long timeout, __u32 fwmark, unsigned long timeout, __u32 fwmark,
struct ip_vs_sync_conn_options *opt, struct ip_vs_sync_conn_options *opt)
struct ip_vs_protocol *pp)
{ {
struct ip_vs_dest *dest; struct ip_vs_dest *dest;
struct ip_vs_conn *cp; struct ip_vs_conn *cp;
if (!(flags & IP_VS_CONN_F_TEMPLATE)) if (!(flags & IP_VS_CONN_F_TEMPLATE))
cp = ip_vs_conn_in_get(param); cp = ip_vs_conn_in_get(param);
else else
...@@ -821,17 +820,23 @@ static void ip_vs_proc_conn(struct ip_vs_conn_param *param, unsigned flags, ...@@ -821,17 +820,23 @@ static void ip_vs_proc_conn(struct ip_vs_conn_param *param, unsigned flags,
if (timeout > MAX_SCHEDULE_TIMEOUT / HZ) if (timeout > MAX_SCHEDULE_TIMEOUT / HZ)
timeout = MAX_SCHEDULE_TIMEOUT / HZ; timeout = MAX_SCHEDULE_TIMEOUT / HZ;
cp->timeout = timeout*HZ; cp->timeout = timeout*HZ;
} else if (!(flags & IP_VS_CONN_F_TEMPLATE) && pp->timeout_table) } else {
cp->timeout = pp->timeout_table[state]; struct ip_vs_proto_data *pd;
pd = ip_vs_proto_data_get(net, protocol);
if (!(flags & IP_VS_CONN_F_TEMPLATE) && pd && pd->timeout_table)
cp->timeout = pd->timeout_table[state];
else else
cp->timeout = (3*60*HZ); cp->timeout = (3*60*HZ);
}
ip_vs_conn_put(cp); ip_vs_conn_put(cp);
} }
/* /*
* Process received multicast message for Version 0 * Process received multicast message for Version 0
*/ */
static void ip_vs_process_message_v0(const char *buffer, const size_t buflen) static void ip_vs_process_message_v0(struct net *net, const char *buffer,
const size_t buflen)
{ {
struct ip_vs_sync_mesg_v0 *m = (struct ip_vs_sync_mesg_v0 *)buffer; struct ip_vs_sync_mesg_v0 *m = (struct ip_vs_sync_mesg_v0 *)buffer;
struct ip_vs_sync_conn_v0 *s; struct ip_vs_sync_conn_v0 *s;
...@@ -879,7 +884,6 @@ static void ip_vs_process_message_v0(const char *buffer, const size_t buflen) ...@@ -879,7 +884,6 @@ static void ip_vs_process_message_v0(const char *buffer, const size_t buflen)
} }
} else { } else {
/* protocol in templates is not used for state/timeout */ /* protocol in templates is not used for state/timeout */
pp = NULL;
if (state > 0) { if (state > 0) {
IP_VS_DBG(2, "BACKUP v0, Invalid template state %u\n", IP_VS_DBG(2, "BACKUP v0, Invalid template state %u\n",
state); state);
...@@ -894,9 +898,9 @@ static void ip_vs_process_message_v0(const char *buffer, const size_t buflen) ...@@ -894,9 +898,9 @@ static void ip_vs_process_message_v0(const char *buffer, const size_t buflen)
s->vport, &param); s->vport, &param);
/* Send timeout as Zero */ /* Send timeout as Zero */
ip_vs_proc_conn(&param, flags, state, s->protocol, AF_INET, ip_vs_proc_conn(net, &param, flags, state, s->protocol, AF_INET,
(union nf_inet_addr *)&s->daddr, s->dport, (union nf_inet_addr *)&s->daddr, s->dport,
0, 0, opt, pp); 0, 0, opt);
} }
} }
...@@ -945,7 +949,7 @@ static int ip_vs_proc_str(__u8 *p, unsigned int plen, unsigned int *data_len, ...@@ -945,7 +949,7 @@ static int ip_vs_proc_str(__u8 *p, unsigned int plen, unsigned int *data_len,
/* /*
* Process a Version 1 sync. connection * Process a Version 1 sync. connection
*/ */
static inline int ip_vs_proc_sync_conn(__u8 *p, __u8 *msg_end) static inline int ip_vs_proc_sync_conn(struct net *net, __u8 *p, __u8 *msg_end)
{ {
struct ip_vs_sync_conn_options opt; struct ip_vs_sync_conn_options opt;
union ip_vs_sync_conn *s; union ip_vs_sync_conn *s;
...@@ -1043,7 +1047,6 @@ static inline int ip_vs_proc_sync_conn(__u8 *p, __u8 *msg_end) ...@@ -1043,7 +1047,6 @@ static inline int ip_vs_proc_sync_conn(__u8 *p, __u8 *msg_end)
} }
} else { } else {
/* protocol in templates is not used for state/timeout */ /* protocol in templates is not used for state/timeout */
pp = NULL;
if (state > 0) { if (state > 0) {
IP_VS_DBG(3, "BACKUP, Invalid template state %u\n", IP_VS_DBG(3, "BACKUP, Invalid template state %u\n",
state); state);
...@@ -1058,18 +1061,18 @@ static inline int ip_vs_proc_sync_conn(__u8 *p, __u8 *msg_end) ...@@ -1058,18 +1061,18 @@ static inline int ip_vs_proc_sync_conn(__u8 *p, __u8 *msg_end)
} }
/* If only IPv4, just silent skip IPv6 */ /* If only IPv4, just silent skip IPv6 */
if (af == AF_INET) if (af == AF_INET)
ip_vs_proc_conn(&param, flags, state, s->v4.protocol, af, ip_vs_proc_conn(net, &param, flags, state, s->v4.protocol, af,
(union nf_inet_addr *)&s->v4.daddr, s->v4.dport, (union nf_inet_addr *)&s->v4.daddr, s->v4.dport,
ntohl(s->v4.timeout), ntohl(s->v4.fwmark), ntohl(s->v4.timeout), ntohl(s->v4.fwmark),
(opt_flags & IPVS_OPT_F_SEQ_DATA ? &opt : NULL), (opt_flags & IPVS_OPT_F_SEQ_DATA ? &opt : NULL)
pp); );
#ifdef CONFIG_IP_VS_IPV6 #ifdef CONFIG_IP_VS_IPV6
else else
ip_vs_proc_conn(&param, flags, state, s->v6.protocol, af, ip_vs_proc_conn(net, &param, flags, state, s->v6.protocol, af,
(union nf_inet_addr *)&s->v6.daddr, s->v6.dport, (union nf_inet_addr *)&s->v6.daddr, s->v6.dport,
ntohl(s->v6.timeout), ntohl(s->v6.fwmark), ntohl(s->v6.timeout), ntohl(s->v6.fwmark),
(opt_flags & IPVS_OPT_F_SEQ_DATA ? &opt : NULL), (opt_flags & IPVS_OPT_F_SEQ_DATA ? &opt : NULL)
pp); );
#endif #endif
return 0; return 0;
/* Error exit */ /* Error exit */
...@@ -1083,7 +1086,8 @@ static inline int ip_vs_proc_sync_conn(__u8 *p, __u8 *msg_end) ...@@ -1083,7 +1086,8 @@ static inline int ip_vs_proc_sync_conn(__u8 *p, __u8 *msg_end)
* ip_vs_conn entries. * ip_vs_conn entries.
* Handles Version 0 & 1 * Handles Version 0 & 1
*/ */
static void ip_vs_process_message(__u8 *buffer, const size_t buflen) static void ip_vs_process_message(struct net *net, __u8 *buffer,
const size_t buflen)
{ {
struct ip_vs_sync_mesg *m2 = (struct ip_vs_sync_mesg *)buffer; struct ip_vs_sync_mesg *m2 = (struct ip_vs_sync_mesg *)buffer;
__u8 *p, *msg_end; __u8 *p, *msg_end;
...@@ -1136,7 +1140,8 @@ static void ip_vs_process_message(__u8 *buffer, const size_t buflen) ...@@ -1136,7 +1140,8 @@ static void ip_vs_process_message(__u8 *buffer, const size_t buflen)
return; return;
} }
/* Process a single sync_conn */ /* Process a single sync_conn */
if ((retc=ip_vs_proc_sync_conn(p, msg_end)) < 0) { retc = ip_vs_proc_sync_conn(net, p, msg_end);
if (retc < 0) {
IP_VS_ERR_RL("BACKUP, Dropping buffer, Err: %d in decoding\n", IP_VS_ERR_RL("BACKUP, Dropping buffer, Err: %d in decoding\n",
retc); retc);
return; return;
...@@ -1146,7 +1151,7 @@ static void ip_vs_process_message(__u8 *buffer, const size_t buflen) ...@@ -1146,7 +1151,7 @@ static void ip_vs_process_message(__u8 *buffer, const size_t buflen)
} }
} else { } else {
/* Old type of message */ /* Old type of message */
ip_vs_process_message_v0(buffer, buflen); ip_vs_process_message_v0(net, buffer, buflen);
return; return;
} }
} }
...@@ -1500,7 +1505,7 @@ static int sync_thread_backup(void *data) ...@@ -1500,7 +1505,7 @@ static int sync_thread_backup(void *data)
/* disable bottom half, because it accesses the data /* disable bottom half, because it accesses the data
shared by softirq while getting/creating conns */ shared by softirq while getting/creating conns */
local_bh_disable(); local_bh_disable();
ip_vs_process_message(tinfo->buf, len); ip_vs_process_message(&init_net, tinfo->buf, len);
local_bh_enable(); local_bh_enable();
} }
} }
......
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