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: Hans Schillstrom <hans.schillstrom@ericsson.com> Acked-by: Julian Anastasov <ja@ssi.bg> Signed-off-by: Simon Horman <horms@verge.net.au>
This commit is contained in:
parent
9330419d9a
commit
9bbac6a904
6 changed files with 39 additions and 37 deletions
|
@ -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,
|
||||||
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,
|
||||||
#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)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
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)
|
||||||
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)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
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)
|
||||||
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 = {
|
||||||
.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)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
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)
|
||||||
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,
|
||||||
* 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,
|
||||||
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;
|
||||||
else
|
|
||||||
cp->timeout = (3*60*HZ);
|
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
|
||||||
|
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)
|
||||||
}
|
}
|
||||||
} 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)
|
||||||
s->vport, ¶m);
|
s->vport, ¶m);
|
||||||
|
|
||||||
/* Send timeout as Zero */
|
/* Send timeout as Zero */
|
||||||
ip_vs_proc_conn(¶m, flags, state, s->protocol, AF_INET,
|
ip_vs_proc_conn(net, ¶m, 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,
|
||||||
/*
|
/*
|
||||||
* 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)
|
||||||
}
|
}
|
||||||
} 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)
|
||||||
}
|
}
|
||||||
/* 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(¶m, flags, state, s->v4.protocol, af,
|
ip_vs_proc_conn(net, ¶m, 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(¶m, flags, state, s->v6.protocol, af,
|
ip_vs_proc_conn(net, ¶m, 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 @@ out:
|
||||||
* 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)
|
||||||
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)
|
||||||
}
|
}
|
||||||
} 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)
|
||||||
/* 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();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue