Commit 5b57a98c authored by Simon Horman's avatar Simon Horman

IPVS: compact ip_vs_sched_persist()

Compact ip_vs_sched_persist() by setting up parameters
and calling functions once.
Signed-off-by: default avatarSimon Horman <horms@verge.net.au>
Acked-by: default avatarJulian Anastasov <ja@ssi.bg>
parent 001985b2
...@@ -193,10 +193,14 @@ ip_vs_sched_persist(struct ip_vs_service *svc, ...@@ -193,10 +193,14 @@ 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 */ int protocol = iph.protocol;
__be16 dport = 0; /* destination port to forward */
__be16 vport = 0; /* virtual service port */
unsigned int flags; unsigned int flags;
union nf_inet_addr snet; /* source network of the client, union nf_inet_addr snet; /* source network of the client,
after masking */ after masking */
const union nf_inet_addr fwmark = { .ip = htonl(svc->fwmark) };
const union nf_inet_addr *vaddr = &iph.daddr;
ip_vs_fill_iphdr(svc->af, skb_network_header(skb), &iph); ip_vs_fill_iphdr(svc->af, skb_network_header(skb), &iph);
...@@ -227,119 +231,61 @@ ip_vs_sched_persist(struct ip_vs_service *svc, ...@@ -227,119 +231,61 @@ ip_vs_sched_persist(struct ip_vs_service *svc,
* service, and a template like <caddr, 0, vaddr, vport, daddr, dport> * service, and a template like <caddr, 0, vaddr, vport, daddr, dport>
* is created for other persistent services. * is created for other persistent services.
*/ */
if (ports[1] == svc->port) { {
/* Check if a template already exists */ if (ports[1] == svc->port) {
if (svc->port != FTPPORT) /* non-FTP template:
ct = ip_vs_ct_in_get(svc->af, iph.protocol, &snet, 0, * <protocol, caddr, 0, vaddr, vport, daddr, dport>
&iph.daddr, ports[1]); * FTP template:
else * <protocol, caddr, 0, vaddr, 0, daddr, 0>
ct = ip_vs_ct_in_get(svc->af, iph.protocol, &snet, 0,
&iph.daddr, 0);
if (!ct || !ip_vs_check_template(ct)) {
/*
* No template found or the dest of the connection
* template is not available.
*/
dest = svc->scheduler->schedule(svc, skb);
if (dest == NULL) {
IP_VS_DBG(1, "p-schedule: no dest found.\n");
return NULL;
}
/*
* Create a template like <protocol,caddr,0,
* vaddr,vport,daddr,dport> for non-ftp service,
* and <protocol,caddr,0,vaddr,0,daddr,0>
* for ftp service.
*/ */
if (svc->port != FTPPORT) if (svc->port != FTPPORT)
ct = ip_vs_conn_new(svc->af, iph.protocol, vport = ports[1];
&snet, 0,
&iph.daddr,
ports[1],
&dest->addr, dest->port,
IP_VS_CONN_F_TEMPLATE,
dest);
else
ct = ip_vs_conn_new(svc->af, iph.protocol,
&snet, 0,
&iph.daddr, 0,
&dest->addr, 0,
IP_VS_CONN_F_TEMPLATE,
dest);
if (ct == NULL)
return NULL;
ct->timeout = svc->timeout;
} else { } else {
/* set destination with the found template */ /* Note: persistent fwmark-based services and
dest = ct->dest; * persistent port zero service are handled here.
* fwmark template:
* <IPPROTO_IP,caddr,0,fwmark,0,daddr,0>
* port zero template:
* <protocol,caddr,0,vaddr,0,daddr,0>
*/
if (svc->fwmark) {
protocol = IPPROTO_IP;
vaddr = &fwmark;
}
} }
dport = dest->port; }
} else {
/* /* Check if a template already exists */
* Note: persistent fwmark-based services and persistent ct = ip_vs_ct_in_get(svc->af, protocol, &snet, 0, vaddr, vport);
* port zero service are handled here.
* fwmark template: <IPPROTO_IP,caddr,0,fwmark,0,daddr,0> if (!ct || !ip_vs_check_template(ct)) {
* port zero template: <protocol,caddr,0,vaddr,0,daddr,0> /* No template found or the dest of the connection
* template is not available.
*/ */
if (svc->fwmark) { dest = svc->scheduler->schedule(svc, skb);
union nf_inet_addr fwmark = { if (!dest) {
.ip = htonl(svc->fwmark) IP_VS_DBG(1, "p-schedule: no dest found.\n");
}; return NULL;
}
ct = ip_vs_ct_in_get(svc->af, IPPROTO_IP, &snet, 0, if (ports[1] == svc->port && svc->port != FTPPORT)
&fwmark, 0); dport = dest->port;
} else
ct = ip_vs_ct_in_get(svc->af, iph.protocol, &snet, 0,
&iph.daddr, 0);
if (!ct || !ip_vs_check_template(ct)) { /* Create a template */
/* ct = ip_vs_conn_new(svc->af, protocol, &snet, 0,vaddr, vport,
* If it is not persistent port zero, return NULL, &dest->addr, dport,
* otherwise create a connection template. IP_VS_CONN_F_TEMPLATE, dest);
*/ if (ct == NULL)
if (svc->port) return NULL;
return NULL;
dest = svc->scheduler->schedule(svc, skb); ct->timeout = svc->timeout;
if (dest == NULL) { } else
IP_VS_DBG(1, "p-schedule: no dest found.\n"); /* set destination with the found template */
return NULL; dest = ct->dest;
}
/* dport = ports[1];
* Create a template according to the service if (dport == svc->port && dest->port)
*/ dport = dest->port;
if (svc->fwmark) {
union nf_inet_addr fwmark = {
.ip = htonl(svc->fwmark)
};
ct = ip_vs_conn_new(svc->af, IPPROTO_IP,
&snet, 0,
&fwmark, 0,
&dest->addr, 0,
IP_VS_CONN_F_TEMPLATE,
dest);
} else
ct = ip_vs_conn_new(svc->af, iph.protocol,
&snet, 0,
&iph.daddr, 0,
&dest->addr, 0,
IP_VS_CONN_F_TEMPLATE,
dest);
if (ct == NULL)
return NULL;
ct->timeout = svc->timeout;
} else {
/* set destination with the found template */
dest = ct->dest;
}
dport = ports[1];
}
flags = (svc->flags & IP_VS_SVC_F_ONEPACKET flags = (svc->flags & IP_VS_SVC_F_ONEPACKET
&& iph.protocol == IPPROTO_UDP)? && iph.protocol == IPPROTO_UDP)?
......
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