⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ip_vs.h

📁 linux 内核源代码
💻 H
📖 第 1 页 / 共 2 页
字号:
	/* Control members */	struct ip_vs_conn       *control;       /* Master control connection */	atomic_t                n_control;      /* Number of controlled ones */	struct ip_vs_dest       *dest;          /* real server */	atomic_t                in_pkts;        /* incoming packet counter */	/* packet transmitter for different forwarding methods.  If it	   mangles the packet, it must return NF_DROP or better NF_STOLEN,	   otherwise this must be changed to a sk_buff **.	 */	int (*packet_xmit)(struct sk_buff *skb, struct ip_vs_conn *cp,			   struct ip_vs_protocol *pp);	/* Note: we can group the following members into a structure,	   in order to save more space, and the following members are	   only used in VS/NAT anyway */	struct ip_vs_app        *app;           /* bound ip_vs_app object */	void                    *app_data;      /* Application private data */	struct ip_vs_seq        in_seq;         /* incoming seq. struct */	struct ip_vs_seq        out_seq;        /* outgoing seq. struct */};/* *	The information about the virtual service offered to the net *	and the forwarding entries */struct ip_vs_service {	struct list_head	s_list;   /* for normal service table */	struct list_head	f_list;   /* for fwmark-based service table */	atomic_t		refcnt;   /* reference counter */	atomic_t		usecnt;   /* use counter */	__u16			protocol; /* which protocol (TCP/UDP) */	__be32			addr;	  /* IP address for virtual service */	__be16			port;	  /* port number for the service */	__u32                   fwmark;   /* firewall mark of the service */	unsigned		flags;	  /* service status flags */	unsigned		timeout;  /* persistent timeout in ticks */	__be32			netmask;  /* grouping granularity */	struct list_head	destinations;  /* real server d-linked list */	__u32			num_dests;     /* number of servers */	struct ip_vs_stats      stats;         /* statistics for the service */	struct ip_vs_app	*inc;	  /* bind conns to this app inc */	/* for scheduling */	struct ip_vs_scheduler	*scheduler;    /* bound scheduler object */	rwlock_t		sched_lock;    /* lock sched_data */	void			*sched_data;   /* scheduler application data */};/* *	The real server destination forwarding entry *	with ip address, port number, and so on. */struct ip_vs_dest {	struct list_head	n_list;   /* for the dests in the service */	struct list_head	d_list;   /* for table with all the dests */	__be32			addr;		/* IP address of the server */	__be16			port;		/* port number of the server */	volatile unsigned	flags;		/* dest status flags */	atomic_t		conn_flags;	/* flags to copy to conn */	atomic_t		weight;		/* server weight */	atomic_t		refcnt;		/* reference counter */	struct ip_vs_stats      stats;          /* statistics */	/* connection counters and thresholds */	atomic_t		activeconns;	/* active connections */	atomic_t		inactconns;	/* inactive connections */	atomic_t		persistconns;	/* persistent connections */	__u32			u_threshold;	/* upper threshold */	__u32			l_threshold;	/* lower threshold */	/* for destination cache */	spinlock_t		dst_lock;	/* lock of dst_cache */	struct dst_entry	*dst_cache;	/* destination cache entry */	u32			dst_rtos;	/* RT_TOS(tos) for dst */	/* for virtual service */	struct ip_vs_service	*svc;		/* service it belongs to */	__u16			protocol;	/* which protocol (TCP/UDP) */	__be32			vaddr;		/* virtual IP address */	__be16			vport;		/* virtual port number */	__u32			vfwmark;	/* firewall mark of service */};/* *	The scheduler object */struct ip_vs_scheduler {	struct list_head	n_list;		/* d-linked list head */	char			*name;		/* scheduler name */	atomic_t		refcnt;		/* reference counter */	struct module		*module;	/* THIS_MODULE/NULL */	/* scheduler initializing service */	int (*init_service)(struct ip_vs_service *svc);	/* scheduling service finish */	int (*done_service)(struct ip_vs_service *svc);	/* scheduler updating service */	int (*update_service)(struct ip_vs_service *svc);	/* selecting a server from the given service */	struct ip_vs_dest* (*schedule)(struct ip_vs_service *svc,				       const struct sk_buff *skb);};/* *	The application module object (a.k.a. app incarnation) */struct ip_vs_app{	struct list_head	a_list;		/* member in app list */	int			type;		/* IP_VS_APP_TYPE_xxx */	char			*name;		/* application module name */	__u16			protocol;	struct module		*module;	/* THIS_MODULE/NULL */	struct list_head	incs_list;	/* list of incarnations */	/* members for application incarnations */	struct list_head	p_list;		/* member in proto app list */	struct ip_vs_app	*app;		/* its real application */	__be16			port;		/* port number in net order */	atomic_t		usecnt;		/* usage counter */	/* output hook: return false if can't linearize. diff set for TCP.  */	int (*pkt_out)(struct ip_vs_app *, struct ip_vs_conn *,		       struct sk_buff *, int *diff);	/* input hook: return false if can't linearize. diff set for TCP. */	int (*pkt_in)(struct ip_vs_app *, struct ip_vs_conn *,		      struct sk_buff *, int *diff);	/* ip_vs_app initializer */	int (*init_conn)(struct ip_vs_app *, struct ip_vs_conn *);	/* ip_vs_app finish */	int (*done_conn)(struct ip_vs_app *, struct ip_vs_conn *);	/* not used now */	int (*bind_conn)(struct ip_vs_app *, struct ip_vs_conn *,			 struct ip_vs_protocol *);	void (*unbind_conn)(struct ip_vs_app *, struct ip_vs_conn *);	int *			timeout_table;	int *			timeouts;	int			timeouts_size;	int (*conn_schedule)(struct sk_buff *skb, struct ip_vs_app *app,			     int *verdict, struct ip_vs_conn **cpp);	struct ip_vs_conn *	(*conn_in_get)(const struct sk_buff *skb, struct ip_vs_app *app,		       const struct iphdr *iph, unsigned int proto_off,		       int inverse);	struct ip_vs_conn *	(*conn_out_get)(const struct sk_buff *skb, struct ip_vs_app *app,			const struct iphdr *iph, unsigned int proto_off,			int inverse);	int (*state_transition)(struct ip_vs_conn *cp, int direction,				const struct sk_buff *skb,				struct ip_vs_app *app);	void (*timeout_change)(struct ip_vs_app *app, int flags);};/* *      IPVS core functions *      (from ip_vs_core.c) */extern const char *ip_vs_proto_name(unsigned proto);extern void ip_vs_init_hash_table(struct list_head *table, int rows);#define IP_VS_INIT_HASH_TABLE(t) ip_vs_init_hash_table(t, sizeof(t)/sizeof(t[0]))#define IP_VS_APP_TYPE_UNSPEC	0#define IP_VS_APP_TYPE_FTP	1/* *     ip_vs_conn handling functions *     (from ip_vs_conn.c) *//* *     IPVS connection entry hash table */#ifndef CONFIG_IP_VS_TAB_BITS#define CONFIG_IP_VS_TAB_BITS   12#endif/* make sure that IP_VS_CONN_TAB_BITS is located in [8, 20] */#if CONFIG_IP_VS_TAB_BITS < 8#define IP_VS_CONN_TAB_BITS	8#endif#if CONFIG_IP_VS_TAB_BITS > 20#define IP_VS_CONN_TAB_BITS	20#endif#if 8 <= CONFIG_IP_VS_TAB_BITS && CONFIG_IP_VS_TAB_BITS <= 20#define IP_VS_CONN_TAB_BITS	CONFIG_IP_VS_TAB_BITS#endif#define IP_VS_CONN_TAB_SIZE     (1 << IP_VS_CONN_TAB_BITS)#define IP_VS_CONN_TAB_MASK     (IP_VS_CONN_TAB_SIZE - 1)enum {	IP_VS_DIR_INPUT = 0,	IP_VS_DIR_OUTPUT,	IP_VS_DIR_INPUT_ONLY,	IP_VS_DIR_LAST,};extern struct ip_vs_conn *ip_vs_conn_in_get(int protocol, __be32 s_addr, __be16 s_port, __be32 d_addr, __be16 d_port);extern struct ip_vs_conn *ip_vs_ct_in_get(int protocol, __be32 s_addr, __be16 s_port, __be32 d_addr, __be16 d_port);extern struct ip_vs_conn *ip_vs_conn_out_get(int protocol, __be32 s_addr, __be16 s_port, __be32 d_addr, __be16 d_port);/* put back the conn without restarting its timer */static inline void __ip_vs_conn_put(struct ip_vs_conn *cp){	atomic_dec(&cp->refcnt);}extern void ip_vs_conn_put(struct ip_vs_conn *cp);extern void ip_vs_conn_fill_cport(struct ip_vs_conn *cp, __be16 cport);extern struct ip_vs_conn *ip_vs_conn_new(int proto, __be32 caddr, __be16 cport, __be32 vaddr, __be16 vport,	       __be32 daddr, __be16 dport, unsigned flags,	       struct ip_vs_dest *dest);extern void ip_vs_conn_expire_now(struct ip_vs_conn *cp);extern const char * ip_vs_state_name(__u16 proto, int state);extern void ip_vs_tcp_conn_listen(struct ip_vs_conn *cp);extern int ip_vs_check_template(struct ip_vs_conn *ct);extern void ip_vs_secure_tcp_set(int on);extern void ip_vs_random_dropentry(void);extern int ip_vs_conn_init(void);extern void ip_vs_conn_cleanup(void);static inline void ip_vs_control_del(struct ip_vs_conn *cp){	struct ip_vs_conn *ctl_cp = cp->control;	if (!ctl_cp) {		IP_VS_ERR("request control DEL for uncontrolled: "			  "%d.%d.%d.%d:%d to %d.%d.%d.%d:%d\n",			  NIPQUAD(cp->caddr),ntohs(cp->cport),			  NIPQUAD(cp->vaddr),ntohs(cp->vport));		return;	}	IP_VS_DBG(7, "DELeting control for: "		  "cp.dst=%d.%d.%d.%d:%d ctl_cp.dst=%d.%d.%d.%d:%d\n",		  NIPQUAD(cp->caddr),ntohs(cp->cport),		  NIPQUAD(ctl_cp->caddr),ntohs(ctl_cp->cport));	cp->control = NULL;	if (atomic_read(&ctl_cp->n_control) == 0) {		IP_VS_ERR("BUG control DEL with n=0 : "			  "%d.%d.%d.%d:%d to %d.%d.%d.%d:%d\n",			  NIPQUAD(cp->caddr),ntohs(cp->cport),			  NIPQUAD(cp->vaddr),ntohs(cp->vport));		return;	}	atomic_dec(&ctl_cp->n_control);}static inline voidip_vs_control_add(struct ip_vs_conn *cp, struct ip_vs_conn *ctl_cp){	if (cp->control) {		IP_VS_ERR("request control ADD for already controlled: "			  "%d.%d.%d.%d:%d to %d.%d.%d.%d:%d\n",			  NIPQUAD(cp->caddr),ntohs(cp->cport),			  NIPQUAD(cp->vaddr),ntohs(cp->vport));		ip_vs_control_del(cp);	}	IP_VS_DBG(7, "ADDing control for: "		  "cp.dst=%d.%d.%d.%d:%d ctl_cp.dst=%d.%d.%d.%d:%d\n",		  NIPQUAD(cp->caddr),ntohs(cp->cport),		  NIPQUAD(ctl_cp->caddr),ntohs(ctl_cp->cport));	cp->control = ctl_cp;	atomic_inc(&ctl_cp->n_control);}/* *      IPVS application functions *      (from ip_vs_app.c) */#define IP_VS_APP_MAX_PORTS  8extern int register_ip_vs_app(struct ip_vs_app *app);extern void unregister_ip_vs_app(struct ip_vs_app *app);extern int ip_vs_bind_app(struct ip_vs_conn *cp, struct ip_vs_protocol *pp);extern void ip_vs_unbind_app(struct ip_vs_conn *cp);extern intregister_ip_vs_app_inc(struct ip_vs_app *app, __u16 proto, __u16 port);extern int ip_vs_app_inc_get(struct ip_vs_app *inc);extern void ip_vs_app_inc_put(struct ip_vs_app *inc);extern int ip_vs_app_pkt_out(struct ip_vs_conn *, struct sk_buff *skb);extern int ip_vs_app_pkt_in(struct ip_vs_conn *, struct sk_buff *skb);extern int ip_vs_skb_replace(struct sk_buff *skb, gfp_t pri,			     char *o_buf, int o_len, char *n_buf, int n_len);extern int ip_vs_app_init(void);extern void ip_vs_app_cleanup(void);/* *	IPVS protocol functions (from ip_vs_proto.c) */extern int ip_vs_protocol_init(void);extern void ip_vs_protocol_cleanup(void);extern void ip_vs_protocol_timeout_change(int flags);extern int *ip_vs_create_timeout_table(int *table, int size);extern intip_vs_set_state_timeout(int *table, int num, char **names, char *name, int to);extern voidip_vs_tcpudp_debug_packet(struct ip_vs_protocol *pp, const struct sk_buff *skb,			  int offset, const char *msg);extern struct ip_vs_protocol ip_vs_protocol_tcp;extern struct ip_vs_protocol ip_vs_protocol_udp;extern struct ip_vs_protocol ip_vs_protocol_icmp;extern struct ip_vs_protocol ip_vs_protocol_esp;extern struct ip_vs_protocol ip_vs_protocol_ah;/* *      Registering/unregistering scheduler functions *      (from ip_vs_sched.c) */extern int register_ip_vs_scheduler(struct ip_vs_scheduler *scheduler);extern int unregister_ip_vs_scheduler(struct ip_vs_scheduler *scheduler);extern int ip_vs_bind_scheduler(struct ip_vs_service *svc,				struct ip_vs_scheduler *scheduler);extern int ip_vs_unbind_scheduler(struct ip_vs_service *svc);extern struct ip_vs_scheduler *ip_vs_scheduler_get(const char *sched_name);extern void ip_vs_scheduler_put(struct ip_vs_scheduler *scheduler);extern struct ip_vs_conn *ip_vs_schedule(struct ip_vs_service *svc, const struct sk_buff *skb);extern int ip_vs_leave(struct ip_vs_service *svc, struct sk_buff *skb,			struct ip_vs_protocol *pp);/* *      IPVS control data and functions (from ip_vs_ctl.c) */extern int sysctl_ip_vs_cache_bypass;extern int sysctl_ip_vs_expire_nodest_conn;extern int sysctl_ip_vs_expire_quiescent_template;extern int sysctl_ip_vs_sync_threshold[2];extern int sysctl_ip_vs_nat_icmp_send;extern struct ip_vs_stats ip_vs_stats;extern struct ip_vs_service *ip_vs_service_get(__u32 fwmark, __u16 protocol, __be32 vaddr, __be16 vport);static inline void ip_vs_service_put(struct ip_vs_service *svc){	atomic_dec(&svc->usecnt);}extern struct ip_vs_dest *ip_vs_lookup_real_service(__u16 protocol, __be32 daddr, __be16 dport);extern int ip_vs_use_count_inc(void);extern void ip_vs_use_count_dec(void);extern int ip_vs_control_init(void);extern void ip_vs_control_cleanup(void);extern struct ip_vs_dest *ip_vs_find_dest(__be32 daddr, __be16 dport,		 __be32 vaddr, __be16 vport, __u16 protocol);extern struct ip_vs_dest *ip_vs_try_bind_dest(struct ip_vs_conn *cp);/* *      IPVS sync daemon data and function prototypes *      (from ip_vs_sync.c) */extern volatile int ip_vs_sync_state;extern volatile int ip_vs_master_syncid;extern volatile int ip_vs_backup_syncid;extern char ip_vs_master_mcast_ifn[IP_VS_IFNAME_MAXLEN];extern char ip_vs_backup_mcast_ifn[IP_VS_IFNAME_MAXLEN];extern int start_sync_thread(int state, char *mcast_ifn, __u8 syncid);extern int stop_sync_thread(int state);extern void ip_vs_sync_conn(struct ip_vs_conn *cp);/* *      IPVS rate estimator prototypes (from ip_vs_est.c) */extern int ip_vs_new_estimator(struct ip_vs_stats *stats);extern void ip_vs_kill_estimator(struct ip_vs_stats *stats);extern void ip_vs_zero_estimator(struct ip_vs_stats *stats);/* *	Various IPVS packet transmitters (from ip_vs_xmit.c) */extern int ip_vs_null_xmit(struct sk_buff *skb, struct ip_vs_conn *cp, struct ip_vs_protocol *pp);extern int ip_vs_bypass_xmit(struct sk_buff *skb, struct ip_vs_conn *cp, struct ip_vs_protocol *pp);extern int ip_vs_nat_xmit(struct sk_buff *skb, struct ip_vs_conn *cp, struct ip_vs_protocol *pp);extern int ip_vs_tunnel_xmit(struct sk_buff *skb, struct ip_vs_conn *cp, struct ip_vs_protocol *pp);extern int ip_vs_dr_xmit(struct sk_buff *skb, struct ip_vs_conn *cp, struct ip_vs_protocol *pp);extern int ip_vs_icmp_xmit(struct sk_buff *skb, struct ip_vs_conn *cp, struct ip_vs_protocol *pp, int offset);extern void ip_vs_dst_reset(struct ip_vs_dest *dest);/* *	This is a simple mechanism to ignore packets when *	we are loaded. Just set ip_vs_drop_rate to 'n' and *	we start to drop 1/rate of the packets */extern int ip_vs_drop_rate;extern int ip_vs_drop_counter;static __inline__ int ip_vs_todrop(void){	if (!ip_vs_drop_rate) return 0;	if (--ip_vs_drop_counter > 0) return 0;	ip_vs_drop_counter = ip_vs_drop_rate;	return 1;}/* *      ip_vs_fwd_tag returns the forwarding tag of the connection */#define IP_VS_FWD_METHOD(cp)  (cp->flags & IP_VS_CONN_F_FWD_MASK)static inline char ip_vs_fwd_tag(struct ip_vs_conn *cp){	char fwd;	switch (IP_VS_FWD_METHOD(cp)) {	case IP_VS_CONN_F_MASQ:		fwd = 'M'; break;	case IP_VS_CONN_F_LOCALNODE:		fwd = 'L'; break;	case IP_VS_CONN_F_TUNNEL:		fwd = 'T'; break;	case IP_VS_CONN_F_DROUTE:		fwd = 'R'; break;	case IP_VS_CONN_F_BYPASS:		fwd = 'B'; break;	default:		fwd = '?'; break;	}	return fwd;}extern void ip_vs_nat_icmp(struct sk_buff *skb, struct ip_vs_protocol *pp,		struct ip_vs_conn *cp, int dir);extern __sum16 ip_vs_checksum_complete(struct sk_buff *skb, int offset);static inline __wsum ip_vs_check_diff4(__be32 old, __be32 new, __wsum oldsum){	__be32 diff[2] = { ~old, new };	return csum_partial((char *) diff, sizeof(diff), oldsum);}static inline __wsum ip_vs_check_diff2(__be16 old, __be16 new, __wsum oldsum){	__be16 diff[2] = { ~old, new };	return csum_partial((char *) diff, sizeof(diff), oldsum);}#endif /* __KERNEL__ */#endif	/* _IP_VS_H */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -