IPVS: Extend scheduling functions for IPv6 support
Convert ip_vs_schedule() and ip_vs_sched_persist() to support scheduling of IPv6 connections. Signed-off-by: Julius Volz <juliusv@google.com> Signed-off-by: Simon Horman <horms@verge.net.au>
This commit is contained in:
parent
b3cdd2a738
commit
cd17f9ed09
1 changed files with 31 additions and 25 deletions
|
@ -176,19 +176,25 @@ ip_vs_sched_persist(struct ip_vs_service *svc,
|
||||||
struct ip_vs_iphdr iph;
|
struct ip_vs_iphdr iph;
|
||||||
struct ip_vs_dest *dest;
|
struct ip_vs_dest *dest;
|
||||||
struct ip_vs_conn *ct;
|
struct ip_vs_conn *ct;
|
||||||
__be16 dport; /* destination port to forward */
|
__be16 dport; /* destination port to forward */
|
||||||
union nf_inet_addr snet; /* source network of the client,
|
union nf_inet_addr snet; /* source network of the client,
|
||||||
after masking */
|
after masking */
|
||||||
ip_vs_fill_iphdr(AF_INET, skb_network_header(skb), &iph);
|
|
||||||
|
ip_vs_fill_iphdr(svc->af, skb_network_header(skb), &iph);
|
||||||
|
|
||||||
/* Mask saddr with the netmask to adjust template granularity */
|
/* Mask saddr with the netmask to adjust template granularity */
|
||||||
snet.ip = iph.saddr.ip & svc->netmask;
|
#ifdef CONFIG_IP_VS_IPV6
|
||||||
|
if (svc->af == AF_INET6)
|
||||||
|
ipv6_addr_prefix(&snet.in6, &iph.saddr.in6, svc->netmask);
|
||||||
|
else
|
||||||
|
#endif
|
||||||
|
snet.ip = iph.saddr.ip & svc->netmask;
|
||||||
|
|
||||||
IP_VS_DBG(6, "p-schedule: src %u.%u.%u.%u:%u dest %u.%u.%u.%u:%u "
|
IP_VS_DBG_BUF(6, "p-schedule: src %s:%u dest %s:%u "
|
||||||
"mnet %u.%u.%u.%u\n",
|
"mnet %s\n",
|
||||||
NIPQUAD(iph.saddr.ip), ntohs(ports[0]),
|
IP_VS_DBG_ADDR(svc->af, &iph.saddr), ntohs(ports[0]),
|
||||||
NIPQUAD(iph.daddr.ip), ntohs(ports[1]),
|
IP_VS_DBG_ADDR(svc->af, &iph.daddr), ntohs(ports[1]),
|
||||||
NIPQUAD(snet));
|
IP_VS_DBG_ADDR(svc->af, &snet));
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* As far as we know, FTP is a very complicated network protocol, and
|
* As far as we know, FTP is a very complicated network protocol, and
|
||||||
|
@ -206,10 +212,10 @@ ip_vs_sched_persist(struct ip_vs_service *svc,
|
||||||
if (ports[1] == svc->port) {
|
if (ports[1] == svc->port) {
|
||||||
/* Check if a template already exists */
|
/* Check if a template already exists */
|
||||||
if (svc->port != FTPPORT)
|
if (svc->port != FTPPORT)
|
||||||
ct = ip_vs_ct_in_get(AF_INET, iph.protocol, &snet, 0,
|
ct = ip_vs_ct_in_get(svc->af, iph.protocol, &snet, 0,
|
||||||
&iph.daddr, ports[1]);
|
&iph.daddr, ports[1]);
|
||||||
else
|
else
|
||||||
ct = ip_vs_ct_in_get(AF_INET, iph.protocol, &snet, 0,
|
ct = ip_vs_ct_in_get(svc->af, iph.protocol, &snet, 0,
|
||||||
&iph.daddr, 0);
|
&iph.daddr, 0);
|
||||||
|
|
||||||
if (!ct || !ip_vs_check_template(ct)) {
|
if (!ct || !ip_vs_check_template(ct)) {
|
||||||
|
@ -230,7 +236,7 @@ ip_vs_sched_persist(struct ip_vs_service *svc,
|
||||||
* for ftp service.
|
* for ftp service.
|
||||||
*/
|
*/
|
||||||
if (svc->port != FTPPORT)
|
if (svc->port != FTPPORT)
|
||||||
ct = ip_vs_conn_new(AF_INET, iph.protocol,
|
ct = ip_vs_conn_new(svc->af, iph.protocol,
|
||||||
&snet, 0,
|
&snet, 0,
|
||||||
&iph.daddr,
|
&iph.daddr,
|
||||||
ports[1],
|
ports[1],
|
||||||
|
@ -238,7 +244,7 @@ ip_vs_sched_persist(struct ip_vs_service *svc,
|
||||||
IP_VS_CONN_F_TEMPLATE,
|
IP_VS_CONN_F_TEMPLATE,
|
||||||
dest);
|
dest);
|
||||||
else
|
else
|
||||||
ct = ip_vs_conn_new(AF_INET, iph.protocol,
|
ct = ip_vs_conn_new(svc->af, iph.protocol,
|
||||||
&snet, 0,
|
&snet, 0,
|
||||||
&iph.daddr, 0,
|
&iph.daddr, 0,
|
||||||
&dest->addr, 0,
|
&dest->addr, 0,
|
||||||
|
@ -265,10 +271,10 @@ ip_vs_sched_persist(struct ip_vs_service *svc,
|
||||||
.all = { 0, 0, 0, htonl(svc->fwmark) }
|
.all = { 0, 0, 0, htonl(svc->fwmark) }
|
||||||
};
|
};
|
||||||
|
|
||||||
ct = ip_vs_ct_in_get(AF_INET, IPPROTO_IP, &snet, 0,
|
ct = ip_vs_ct_in_get(svc->af, IPPROTO_IP, &snet, 0,
|
||||||
&fwmark, 0);
|
&fwmark, 0);
|
||||||
} else
|
} else
|
||||||
ct = ip_vs_ct_in_get(AF_INET, iph.protocol, &snet, 0,
|
ct = ip_vs_ct_in_get(svc->af, iph.protocol, &snet, 0,
|
||||||
&iph.daddr, 0);
|
&iph.daddr, 0);
|
||||||
|
|
||||||
if (!ct || !ip_vs_check_template(ct)) {
|
if (!ct || !ip_vs_check_template(ct)) {
|
||||||
|
@ -293,14 +299,14 @@ ip_vs_sched_persist(struct ip_vs_service *svc,
|
||||||
.all = { 0, 0, 0, htonl(svc->fwmark) }
|
.all = { 0, 0, 0, htonl(svc->fwmark) }
|
||||||
};
|
};
|
||||||
|
|
||||||
ct = ip_vs_conn_new(AF_INET, IPPROTO_IP,
|
ct = ip_vs_conn_new(svc->af, IPPROTO_IP,
|
||||||
&snet, 0,
|
&snet, 0,
|
||||||
&fwmark, 0,
|
&fwmark, 0,
|
||||||
&dest->addr, 0,
|
&dest->addr, 0,
|
||||||
IP_VS_CONN_F_TEMPLATE,
|
IP_VS_CONN_F_TEMPLATE,
|
||||||
dest);
|
dest);
|
||||||
} else
|
} else
|
||||||
ct = ip_vs_conn_new(AF_INET, iph.protocol,
|
ct = ip_vs_conn_new(svc->af, iph.protocol,
|
||||||
&snet, 0,
|
&snet, 0,
|
||||||
&iph.daddr, 0,
|
&iph.daddr, 0,
|
||||||
&dest->addr, 0,
|
&dest->addr, 0,
|
||||||
|
@ -320,7 +326,7 @@ ip_vs_sched_persist(struct ip_vs_service *svc,
|
||||||
/*
|
/*
|
||||||
* Create a new connection according to the template
|
* Create a new connection according to the template
|
||||||
*/
|
*/
|
||||||
cp = ip_vs_conn_new(AF_INET, iph.protocol,
|
cp = ip_vs_conn_new(svc->af, iph.protocol,
|
||||||
&iph.saddr, ports[0],
|
&iph.saddr, ports[0],
|
||||||
&iph.daddr, ports[1],
|
&iph.daddr, ports[1],
|
||||||
&dest->addr, dport,
|
&dest->addr, dport,
|
||||||
|
@ -387,7 +393,7 @@ ip_vs_schedule(struct ip_vs_service *svc, const struct sk_buff *skb)
|
||||||
/*
|
/*
|
||||||
* Create a connection entry.
|
* Create a connection entry.
|
||||||
*/
|
*/
|
||||||
cp = ip_vs_conn_new(AF_INET, iph.protocol,
|
cp = ip_vs_conn_new(svc->af, iph.protocol,
|
||||||
&iph.saddr, pptr[0],
|
&iph.saddr, pptr[0],
|
||||||
&iph.daddr, pptr[1],
|
&iph.daddr, pptr[1],
|
||||||
&dest->addr, dest->port ? dest->port : pptr[1],
|
&dest->addr, dest->port ? dest->port : pptr[1],
|
||||||
|
@ -396,13 +402,13 @@ ip_vs_schedule(struct ip_vs_service *svc, const struct sk_buff *skb)
|
||||||
if (cp == NULL)
|
if (cp == NULL)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
IP_VS_DBG(6, "Schedule fwd:%c c:%u.%u.%u.%u:%u v:%u.%u.%u.%u:%u "
|
IP_VS_DBG_BUF(6, "Schedule fwd:%c c:%s:%u v:%s:%u "
|
||||||
"d:%u.%u.%u.%u:%u conn->flags:%X conn->refcnt:%d\n",
|
"d:%s:%u conn->flags:%X conn->refcnt:%d\n",
|
||||||
ip_vs_fwd_tag(cp),
|
ip_vs_fwd_tag(cp),
|
||||||
NIPQUAD(cp->caddr.ip), ntohs(cp->cport),
|
IP_VS_DBG_ADDR(svc->af, &cp->caddr), ntohs(cp->cport),
|
||||||
NIPQUAD(cp->vaddr.ip), ntohs(cp->vport),
|
IP_VS_DBG_ADDR(svc->af, &cp->vaddr), ntohs(cp->vport),
|
||||||
NIPQUAD(cp->daddr.ip), ntohs(cp->dport),
|
IP_VS_DBG_ADDR(svc->af, &cp->daddr), ntohs(cp->dport),
|
||||||
cp->flags, atomic_read(&cp->refcnt));
|
cp->flags, atomic_read(&cp->refcnt));
|
||||||
|
|
||||||
ip_vs_conn_stats(cp, svc);
|
ip_vs_conn_stats(cp, svc);
|
||||||
return cp;
|
return cp;
|
||||||
|
|
Loading…
Reference in a new issue