#define KMSG_COMPONENT …
#define pr_fmt(fmt) …
#include <linux/interrupt.h>
#include <linux/in.h>
#include <linux/inet.h>
#include <linux/net.h>
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/proc_fs.h>
#include <linux/slab.h>
#include <linux/seq_file.h>
#include <linux/jhash.h>
#include <linux/random.h>
#include <linux/rcupdate_wait.h>
#include <net/net_namespace.h>
#include <net/ip_vs.h>
#ifndef CONFIG_IP_VS_TAB_BITS
#define CONFIG_IP_VS_TAB_BITS …
#endif
static int ip_vs_conn_tab_bits = …;
module_param_named(conn_tab_bits, ip_vs_conn_tab_bits, int, 0444);
MODULE_PARM_DESC(…) …;
int ip_vs_conn_tab_size __read_mostly;
static int ip_vs_conn_tab_mask __read_mostly;
static struct hlist_head *ip_vs_conn_tab __read_mostly;
static struct kmem_cache *ip_vs_conn_cachep __read_mostly;
static atomic_t ip_vs_conn_no_cport_cnt = …;
static unsigned int ip_vs_conn_rnd __read_mostly;
#define CT_LOCKARRAY_BITS …
#define CT_LOCKARRAY_SIZE …
#define CT_LOCKARRAY_MASK …
#ifdef CONFIG_IP_VS_IPV6
#define IP_VS_ADDRSTRLEN …
#else
#define IP_VS_ADDRSTRLEN …
#endif
struct ip_vs_aligned_lock
{ … } __attribute__((__aligned__ …));
static struct ip_vs_aligned_lock
__ip_vs_conntbl_lock_array[CT_LOCKARRAY_SIZE] __cacheline_aligned;
static inline void ct_write_lock_bh(unsigned int key)
{ … }
static inline void ct_write_unlock_bh(unsigned int key)
{ … }
static void ip_vs_conn_expire(struct timer_list *t);
static unsigned int ip_vs_conn_hashkey(struct netns_ipvs *ipvs, int af, unsigned int proto,
const union nf_inet_addr *addr,
__be16 port)
{ … }
static unsigned int ip_vs_conn_hashkey_param(const struct ip_vs_conn_param *p,
bool inverse)
{ … }
static unsigned int ip_vs_conn_hashkey_conn(const struct ip_vs_conn *cp)
{ … }
static inline int ip_vs_conn_hash(struct ip_vs_conn *cp)
{ … }
static inline int ip_vs_conn_unhash(struct ip_vs_conn *cp)
{ … }
static inline bool ip_vs_conn_unlink(struct ip_vs_conn *cp)
{ … }
static inline struct ip_vs_conn *
__ip_vs_conn_in_get(const struct ip_vs_conn_param *p)
{ … }
struct ip_vs_conn *ip_vs_conn_in_get(const struct ip_vs_conn_param *p)
{ … }
static int
ip_vs_conn_fill_param_proto(struct netns_ipvs *ipvs,
int af, const struct sk_buff *skb,
const struct ip_vs_iphdr *iph,
struct ip_vs_conn_param *p)
{ … }
struct ip_vs_conn *
ip_vs_conn_in_get_proto(struct netns_ipvs *ipvs, int af,
const struct sk_buff *skb,
const struct ip_vs_iphdr *iph)
{ … }
EXPORT_SYMBOL_GPL(…);
struct ip_vs_conn *ip_vs_ct_in_get(const struct ip_vs_conn_param *p)
{ … }
struct ip_vs_conn *ip_vs_conn_out_get(const struct ip_vs_conn_param *p)
{ … }
struct ip_vs_conn *
ip_vs_conn_out_get_proto(struct netns_ipvs *ipvs, int af,
const struct sk_buff *skb,
const struct ip_vs_iphdr *iph)
{ … }
EXPORT_SYMBOL_GPL(…);
static void __ip_vs_conn_put_timer(struct ip_vs_conn *cp)
{ … }
void ip_vs_conn_put(struct ip_vs_conn *cp)
{ … }
void ip_vs_conn_fill_cport(struct ip_vs_conn *cp, __be16 cport)
{ … }
static inline void ip_vs_bind_xmit(struct ip_vs_conn *cp)
{ … }
#ifdef CONFIG_IP_VS_IPV6
static inline void ip_vs_bind_xmit_v6(struct ip_vs_conn *cp)
{ … }
#endif
static inline int ip_vs_dest_totalconns(struct ip_vs_dest *dest)
{ … }
static inline void
ip_vs_bind_dest(struct ip_vs_conn *cp, struct ip_vs_dest *dest)
{ … }
void ip_vs_try_bind_dest(struct ip_vs_conn *cp)
{ … }
static inline void ip_vs_unbind_dest(struct ip_vs_conn *cp)
{ … }
static int expire_quiescent_template(struct netns_ipvs *ipvs,
struct ip_vs_dest *dest)
{ … }
int ip_vs_check_template(struct ip_vs_conn *ct, struct ip_vs_dest *cdest)
{ … }
static void ip_vs_conn_rcu_free(struct rcu_head *head)
{ … }
static void ip_vs_conn_del(struct ip_vs_conn *cp)
{ … }
static void ip_vs_conn_del_put(struct ip_vs_conn *cp)
{ … }
static void ip_vs_conn_expire(struct timer_list *t)
{ … }
void ip_vs_conn_expire_now(struct ip_vs_conn *cp)
{ … }
struct ip_vs_conn *
ip_vs_conn_new(const struct ip_vs_conn_param *p, int dest_af,
const union nf_inet_addr *daddr, __be16 dport, unsigned int flags,
struct ip_vs_dest *dest, __u32 fwmark)
{ … }
#ifdef CONFIG_PROC_FS
struct ip_vs_iter_state { … };
static void *ip_vs_conn_array(struct seq_file *seq, loff_t pos)
{ … }
static void *ip_vs_conn_seq_start(struct seq_file *seq, loff_t *pos)
__acquires(RCU)
{ … }
static void *ip_vs_conn_seq_next(struct seq_file *seq, void *v, loff_t *pos)
{ … }
static void ip_vs_conn_seq_stop(struct seq_file *seq, void *v)
__releases(RCU)
{ … }
static int ip_vs_conn_seq_show(struct seq_file *seq, void *v)
{ … }
static const struct seq_operations ip_vs_conn_seq_ops = …;
static const char *ip_vs_origin_name(unsigned int flags)
{ … }
static int ip_vs_conn_sync_seq_show(struct seq_file *seq, void *v)
{ … }
static const struct seq_operations ip_vs_conn_sync_seq_ops = …;
#endif
static inline int todrop_entry(struct ip_vs_conn *cp)
{ … }
static inline bool ip_vs_conn_ops_mode(struct ip_vs_conn *cp)
{ … }
void ip_vs_random_dropentry(struct netns_ipvs *ipvs)
{ … }
static void ip_vs_conn_flush(struct netns_ipvs *ipvs)
{ … }
#ifdef CONFIG_SYSCTL
void ip_vs_expire_nodest_conn_flush(struct netns_ipvs *ipvs)
{ … }
#endif
int __net_init ip_vs_conn_net_init(struct netns_ipvs *ipvs)
{ … }
void __net_exit ip_vs_conn_net_cleanup(struct netns_ipvs *ipvs)
{ … }
int __init ip_vs_conn_init(void)
{ … }
void ip_vs_conn_cleanup(void)
{ … }