|
@@ -421,23 +421,24 @@ __ip_vs_svc_fwm_get(int af, __u32 fwmark)
|
|
|
}
|
|
|
|
|
|
struct ip_vs_service *
|
|
|
-ip_vs_service_get(__u32 fwmark, __u16 protocol, __be32 vaddr, __be16 vport)
|
|
|
+ip_vs_service_get(int af, __u32 fwmark, __u16 protocol,
|
|
|
+ const union nf_inet_addr *vaddr, __be16 vport)
|
|
|
{
|
|
|
struct ip_vs_service *svc;
|
|
|
- union nf_inet_addr _vaddr = { .ip = vaddr };
|
|
|
+
|
|
|
read_lock(&__ip_vs_svc_lock);
|
|
|
|
|
|
/*
|
|
|
* Check the table hashed by fwmark first
|
|
|
*/
|
|
|
- if (fwmark && (svc = __ip_vs_svc_fwm_get(AF_INET, fwmark)))
|
|
|
+ if (fwmark && (svc = __ip_vs_svc_fwm_get(af, fwmark)))
|
|
|
goto out;
|
|
|
|
|
|
/*
|
|
|
* Check the table hashed by <protocol,addr,port>
|
|
|
* for "full" addressed entries
|
|
|
*/
|
|
|
- svc = __ip_vs_service_get(AF_INET, protocol, &_vaddr, vport);
|
|
|
+ svc = __ip_vs_service_get(af, protocol, vaddr, vport);
|
|
|
|
|
|
if (svc == NULL
|
|
|
&& protocol == IPPROTO_TCP
|
|
@@ -447,7 +448,7 @@ ip_vs_service_get(__u32 fwmark, __u16 protocol, __be32 vaddr, __be16 vport)
|
|
|
* Check if ftp service entry exists, the packet
|
|
|
* might belong to FTP data connections.
|
|
|
*/
|
|
|
- svc = __ip_vs_service_get(AF_INET, protocol, &_vaddr, FTPPORT);
|
|
|
+ svc = __ip_vs_service_get(af, protocol, vaddr, FTPPORT);
|
|
|
}
|
|
|
|
|
|
if (svc == NULL
|
|
@@ -455,16 +456,16 @@ ip_vs_service_get(__u32 fwmark, __u16 protocol, __be32 vaddr, __be16 vport)
|
|
|
/*
|
|
|
* Check if the catch-all port (port zero) exists
|
|
|
*/
|
|
|
- svc = __ip_vs_service_get(AF_INET, protocol, &_vaddr, 0);
|
|
|
+ svc = __ip_vs_service_get(af, protocol, vaddr, 0);
|
|
|
}
|
|
|
|
|
|
out:
|
|
|
read_unlock(&__ip_vs_svc_lock);
|
|
|
|
|
|
- IP_VS_DBG(9, "lookup service: fwm %u %s %u.%u.%u.%u:%u %s\n",
|
|
|
- fwmark, ip_vs_proto_name(protocol),
|
|
|
- NIPQUAD(vaddr), ntohs(vport),
|
|
|
- svc?"hit":"not hit");
|
|
|
+ IP_VS_DBG_BUF(9, "lookup service: fwm %u %s %s:%u %s\n",
|
|
|
+ fwmark, ip_vs_proto_name(protocol),
|
|
|
+ IP_VS_DBG_ADDR(af, vaddr), ntohs(vport),
|
|
|
+ svc ? "hit" : "not hit");
|
|
|
|
|
|
return svc;
|
|
|
}
|
|
@@ -605,8 +606,9 @@ struct ip_vs_dest *ip_vs_find_dest(__be32 daddr, __be16 dport,
|
|
|
{
|
|
|
struct ip_vs_dest *dest;
|
|
|
struct ip_vs_service *svc;
|
|
|
+ union nf_inet_addr _vaddr = { .ip = vaddr };
|
|
|
|
|
|
- svc = ip_vs_service_get(0, protocol, vaddr, vport);
|
|
|
+ svc = ip_vs_service_get(AF_INET, 0, protocol, &_vaddr, vport);
|
|
|
if (!svc)
|
|
|
return NULL;
|
|
|
dest = ip_vs_lookup_dest(svc, daddr, dport);
|