38 #define KMSG_COMPONENT "IPVS"
39 #define pr_fmt(fmt) KMSG_COMPONENT ": " fmt
42 #include <linux/slab.h>
43 #include <linux/module.h>
44 #include <linux/kernel.h>
60 #ifndef CONFIG_IP_VS_DH_TAB_BITS
61 #define CONFIG_IP_VS_DH_TAB_BITS 8
63 #define IP_VS_DH_TAB_BITS CONFIG_IP_VS_DH_TAB_BITS
64 #define IP_VS_DH_TAB_SIZE (1 << IP_VS_DH_TAB_BITS)
65 #define IP_VS_DH_TAB_MASK (IP_VS_DH_TAB_SIZE - 1)
75 #ifdef CONFIG_IP_VS_IPV6
77 addr_fold = addr->
ip6[0]^addr->
ip6[1]^
91 return (tbl[ip_vs_dh_hashkey(af, addr)]).dest;
157 IP_VS_DBG(6,
"DH hash table (memory=%Zdbytes) allocated for "
162 ip_vs_dh_assign(tbl, svc);
177 IP_VS_DBG(6,
"DH hash table (memory=%Zdbytes) released\n",
192 ip_vs_dh_assign(tbl, svc);
202 static inline int is_overloaded(
struct ip_vs_dest *dest)
218 ip_vs_fill_iphdr(svc->
af, skb_network_header(skb), &iph);
220 IP_VS_DBG(6,
"%s(): Scheduling...\n", __func__);
223 dest = ip_vs_dh_get(svc->
af, tbl, &iph.daddr);
227 || is_overloaded(dest)) {
231 IP_VS_DBG_BUF(6,
"DH: destination IP address %s --> server %s:%d\n",
232 IP_VS_DBG_ADDR(svc->
af, &iph.daddr),
233 IP_VS_DBG_ADDR(svc->
af, &dest->
addr),
249 .init_service = ip_vs_dh_init_svc,
250 .done_service = ip_vs_dh_done_svc,
251 .update_service = ip_vs_dh_update_svc,
252 .schedule = ip_vs_dh_schedule,
256 static int __init ip_vs_dh_init(
void)
262 static void __exit ip_vs_dh_cleanup(
void)