#define KMSG_COMPONENT …
#define pr_fmt(fmt) …
#include <linux/ip.h>
#include <linux/slab.h>
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/skbuff.h>
#include <net/ip_vs.h>
#include <linux/siphash.h>
#include <linux/bitops.h>
#include <linux/gcd.h>
#define IP_VS_SVC_F_SCHED_MH_FALLBACK …
#define IP_VS_SVC_F_SCHED_MH_PORT …
struct ip_vs_mh_lookup { … };
struct ip_vs_mh_dest_setup { … };
static int primes[] = …;
#ifndef CONFIG_IP_VS_MH_TAB_INDEX
#define CONFIG_IP_VS_MH_TAB_INDEX …
#endif
#define IP_VS_MH_TAB_BITS …
#define IP_VS_MH_TAB_INDEX …
#define IP_VS_MH_TAB_SIZE …
struct ip_vs_mh_state { … };
static inline void generate_hash_secret(hsiphash_key_t *hash1,
hsiphash_key_t *hash2)
{ … }
static inline bool is_unavailable(struct ip_vs_dest *dest)
{ … }
static inline unsigned int
ip_vs_mh_hashkey(int af, const union nf_inet_addr *addr,
__be16 port, hsiphash_key_t *key, unsigned int offset)
{ … }
static void ip_vs_mh_reset(struct ip_vs_mh_state *s)
{ … }
static int ip_vs_mh_permutate(struct ip_vs_mh_state *s,
struct ip_vs_service *svc)
{ … }
static int ip_vs_mh_populate(struct ip_vs_mh_state *s,
struct ip_vs_service *svc)
{ … }
static inline struct ip_vs_dest *
ip_vs_mh_get(struct ip_vs_service *svc, struct ip_vs_mh_state *s,
const union nf_inet_addr *addr, __be16 port)
{ … }
static inline struct ip_vs_dest *
ip_vs_mh_get_fallback(struct ip_vs_service *svc, struct ip_vs_mh_state *s,
const union nf_inet_addr *addr, __be16 port)
{ … }
static int ip_vs_mh_reassign(struct ip_vs_mh_state *s,
struct ip_vs_service *svc)
{ … }
static int ip_vs_mh_gcd_weight(struct ip_vs_service *svc)
{ … }
static int ip_vs_mh_shift_weight(struct ip_vs_service *svc, int gcd)
{ … }
static void ip_vs_mh_state_free(struct rcu_head *head)
{ … }
static int ip_vs_mh_init_svc(struct ip_vs_service *svc)
{ … }
static void ip_vs_mh_done_svc(struct ip_vs_service *svc)
{ … }
static int ip_vs_mh_dest_changed(struct ip_vs_service *svc,
struct ip_vs_dest *dest)
{ … }
static inline __be16
ip_vs_mh_get_port(const struct sk_buff *skb, struct ip_vs_iphdr *iph)
{ … }
static struct ip_vs_dest *
ip_vs_mh_schedule(struct ip_vs_service *svc, const struct sk_buff *skb,
struct ip_vs_iphdr *iph)
{ … }
static struct ip_vs_scheduler ip_vs_mh_scheduler = …;
static int __init ip_vs_mh_init(void)
{ … }
static void __exit ip_vs_mh_cleanup(void)
{ … }
module_init(…) …;
module_exit(ip_vs_mh_cleanup);
MODULE_DESCRIPTION(…) …;
MODULE_LICENSE(…) …;
MODULE_AUTHOR(…) …;