亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? ip_vs_proto_udp.c

?? 優龍2410linux2.6.8內核源代碼
?? C
字號:
/* * ip_vs_proto_udp.c:	UDP load balancing support for IPVS * * Version:     $Id: ip_vs_proto_udp.c,v 1.3 2002/11/30 01:50:35 wensong Exp $ * * Authors:     Wensong Zhang <wensong@linuxvirtualserver.org> *              Julian Anastasov <ja@ssi.bg> * *              This program is free software; you can redistribute it and/or *              modify it under the terms of the GNU General Public License *              as published by the Free Software Foundation; either version *              2 of the License, or (at your option) any later version. * * Changes: * */#include <linux/kernel.h>#include <linux/netfilter_ipv4.h>#include <net/ip_vs.h>static struct ip_vs_conn *udp_conn_in_get(const struct sk_buff *skb, struct ip_vs_protocol *pp,		const struct iphdr *iph, unsigned int proto_off, int inverse){	struct ip_vs_conn *cp;	__u16 ports[2];	if (skb_copy_bits(skb, proto_off, ports, sizeof(ports)) < 0)		return NULL;	if (likely(!inverse)) {		cp = ip_vs_conn_in_get(iph->protocol,				       iph->saddr, ports[0],				       iph->daddr, ports[1]);	} else {		cp = ip_vs_conn_in_get(iph->protocol,				       iph->daddr, ports[1],				       iph->saddr, ports[0]);	}	return cp;}static struct ip_vs_conn *udp_conn_out_get(const struct sk_buff *skb, struct ip_vs_protocol *pp,		 const struct iphdr *iph, unsigned int proto_off, int inverse){	struct ip_vs_conn *cp;	__u16 ports[2];	if (skb_copy_bits(skb, skb->nh.iph->ihl*4, ports, sizeof(ports)) < 0)		return NULL;	if (likely(!inverse)) {		cp = ip_vs_conn_out_get(iph->protocol,					iph->saddr, ports[0],					iph->daddr, ports[1]);	} else {		cp = ip_vs_conn_out_get(iph->protocol,					iph->daddr, ports[1],					iph->saddr, ports[0]);	}	return cp;}static intudp_conn_schedule(struct sk_buff *skb, struct ip_vs_protocol *pp,		  int *verdict, struct ip_vs_conn **cpp){	struct ip_vs_service *svc;	struct udphdr udph;	if (skb_copy_bits(skb, skb->nh.iph->ihl*4, &udph, sizeof(udph)) < 0) {		*verdict = NF_DROP;		return 0;	}	if ((svc = ip_vs_service_get(skb->nfmark, skb->nh.iph->protocol,				     skb->nh.iph->daddr, udph.dest))) {		if (ip_vs_todrop()) {			/*			 * It seems that we are very loaded.			 * We have to drop this packet :(			 */			ip_vs_service_put(svc);			*verdict = NF_DROP;			return 0;		}		/*		 * Let the virtual server select a real server for the		 * incoming connection, and create a connection entry.		 */		*cpp = ip_vs_schedule(svc, skb);		if (!*cpp) {			*verdict = ip_vs_leave(svc, skb, pp);			return 0;		}		ip_vs_service_put(svc);	}	return 1;}static inline voidudp_fast_csum_update(struct udphdr *uhdr, u32 oldip, u32 newip,		     u16 oldport, u16 newport){	uhdr->check =		ip_vs_check_diff(~oldip, newip,				 ip_vs_check_diff(oldport ^ 0xFFFF,						  newport, uhdr->check));	if (!uhdr->check)		uhdr->check = 0xFFFF;}static intudp_snat_handler(struct sk_buff **pskb,		 struct ip_vs_protocol *pp, struct ip_vs_conn *cp){	struct udphdr *udph;	unsigned int udphoff = (*pskb)->nh.iph->ihl * 4;	/* csum_check requires unshared skb */	if (!ip_vs_make_skb_writable(pskb, udphoff+sizeof(*udph)))		return 0;	if (unlikely(cp->app != NULL)) {		/* Some checks before mangling */		if (pp->csum_check && !pp->csum_check(*pskb, pp))			return 0;		/*		 *	Call application helper if needed		 */		if (!ip_vs_app_pkt_out(cp, pskb))			return 0;	}	udph = (void *)(*pskb)->nh.iph + udphoff;	udph->source = cp->vport;	/*	 *	Adjust UDP checksums	 */	if (!cp->app && (udph->check != 0)) {		/* Only port and addr are changed, do fast csum update */		udp_fast_csum_update(udph, cp->daddr, cp->vaddr,				     cp->dport, cp->vport);		if ((*pskb)->ip_summed == CHECKSUM_HW)			(*pskb)->ip_summed = CHECKSUM_NONE;	} else {		/* full checksum calculation */		udph->check = 0;		(*pskb)->csum = skb_checksum(*pskb, udphoff,					     (*pskb)->len - udphoff, 0);		udph->check = csum_tcpudp_magic(cp->vaddr, cp->caddr,						(*pskb)->len - udphoff,						cp->protocol,						(*pskb)->csum);		if (udph->check == 0)			udph->check = 0xFFFF;		IP_VS_DBG(11, "O-pkt: %s O-csum=%d (+%zd)\n",			  pp->name, udph->check,			  (char*)&(udph->check) - (char*)udph);	}	return 1;}static intudp_dnat_handler(struct sk_buff **pskb,		 struct ip_vs_protocol *pp, struct ip_vs_conn *cp){	struct udphdr *udph;	unsigned int udphoff = (*pskb)->nh.iph->ihl * 4;	/* csum_check requires unshared skb */	if (!ip_vs_make_skb_writable(pskb, udphoff+sizeof(*udph)))		return 0;	if (unlikely(cp->app != NULL)) {		/* Some checks before mangling */		if (pp->csum_check && !pp->csum_check(*pskb, pp))			return 0;		/*		 *	Attempt ip_vs_app call.		 *	It will fix ip_vs_conn		 */		if (!ip_vs_app_pkt_in(cp, pskb))			return 0;	}	udph = (void *)(*pskb)->nh.iph + udphoff;	udph->dest = cp->dport;	/*	 *	Adjust UDP checksums	 */	if (!cp->app && (udph->check != 0)) {		/* Only port and addr are changed, do fast csum update */		udp_fast_csum_update(udph, cp->vaddr, cp->daddr,				     cp->vport, cp->dport);		if ((*pskb)->ip_summed == CHECKSUM_HW)			(*pskb)->ip_summed = CHECKSUM_NONE;	} else {		/* full checksum calculation */		udph->check = 0;		(*pskb)->csum = skb_checksum(*pskb, udphoff,					     (*pskb)->len - udphoff, 0);		udph->check = csum_tcpudp_magic(cp->caddr, cp->daddr,						(*pskb)->len - udphoff,						cp->protocol,						(*pskb)->csum);		if (udph->check == 0)			udph->check = 0xFFFF;		(*pskb)->ip_summed = CHECKSUM_UNNECESSARY;	}	return 1;}static intudp_csum_check(struct sk_buff *skb, struct ip_vs_protocol *pp){	struct udphdr udph;	unsigned int udphoff = skb->nh.iph->ihl*4;	if (skb_copy_bits(skb, udphoff, &udph, sizeof(udph)) < 0)		return 0;	if (udph.check != 0) {		switch (skb->ip_summed) {		case CHECKSUM_NONE:			skb->csum = skb_checksum(skb, udphoff,						 skb->len - udphoff, 0);		case CHECKSUM_HW:			if (csum_tcpudp_magic(skb->nh.iph->saddr,					      skb->nh.iph->daddr,					      skb->len - udphoff,					      skb->nh.iph->protocol,					      skb->csum)) {				IP_VS_DBG_RL_PKT(0, pp, skb, 0,						 "Failed checksum for");				return 0;			}			break;		default:			/* CHECKSUM_UNNECESSARY */			break;		}	}	return 1;}/* *	Note: the caller guarantees that only one of register_app, *	unregister_app or app_conn_bind is called each time. */#define	UDP_APP_TAB_BITS	4#define	UDP_APP_TAB_SIZE	(1 << UDP_APP_TAB_BITS)#define	UDP_APP_TAB_MASK	(UDP_APP_TAB_SIZE - 1)static struct list_head udp_apps[UDP_APP_TAB_SIZE];static spinlock_t udp_app_lock = SPIN_LOCK_UNLOCKED;static inline __u16 udp_app_hashkey(__u16 port){	return ((port >> UDP_APP_TAB_BITS) ^ port) & UDP_APP_TAB_MASK;}static int udp_register_app(struct ip_vs_app *inc){	struct ip_vs_app *i;	__u16 hash, port = inc->port;	int ret = 0;	hash = udp_app_hashkey(port);	spin_lock_bh(&udp_app_lock);	list_for_each_entry(i, &udp_apps[hash], p_list) {		if (i->port == port) {			ret = -EEXIST;			goto out;		}	}	list_add(&inc->p_list, &udp_apps[hash]);	atomic_inc(&ip_vs_protocol_udp.appcnt);  out:	spin_unlock_bh(&udp_app_lock);	return ret;}static voidudp_unregister_app(struct ip_vs_app *inc){	spin_lock_bh(&udp_app_lock);	atomic_dec(&ip_vs_protocol_udp.appcnt);	list_del(&inc->p_list);	spin_unlock_bh(&udp_app_lock);}static int udp_app_conn_bind(struct ip_vs_conn *cp){	int hash;	struct ip_vs_app *inc;	int result = 0;	/* Default binding: bind app only for NAT */	if (IP_VS_FWD_METHOD(cp) != IP_VS_CONN_F_MASQ)		return 0;	/* Lookup application incarnations and bind the right one */	hash = udp_app_hashkey(cp->vport);	spin_lock(&udp_app_lock);	list_for_each_entry(inc, &udp_apps[hash], p_list) {		if (inc->port == cp->vport) {			if (unlikely(!ip_vs_app_inc_get(inc)))				break;			spin_unlock(&udp_app_lock);			IP_VS_DBG(9, "%s: Binding conn %u.%u.%u.%u:%u->"				  "%u.%u.%u.%u:%u to app %s on port %u\n",				  __FUNCTION__,				  NIPQUAD(cp->caddr), ntohs(cp->cport),				  NIPQUAD(cp->vaddr), ntohs(cp->vport),				  inc->name, ntohs(inc->port));			cp->app = inc;			if (inc->init_conn)				result = inc->init_conn(inc, cp);			goto out;		}	}	spin_unlock(&udp_app_lock);  out:	return result;}static int udp_timeouts[IP_VS_UDP_S_LAST+1] = {	[IP_VS_UDP_S_NORMAL]		=	5*60*HZ,	[IP_VS_UDP_S_LAST]		=	2*HZ,};static char * udp_state_name_table[IP_VS_UDP_S_LAST+1] = {	[IP_VS_UDP_S_NORMAL]		=	"UDP",	[IP_VS_UDP_S_LAST]		=	"BUG!",};static intudp_set_state_timeout(struct ip_vs_protocol *pp, char *sname, int to){	return ip_vs_set_state_timeout(pp->timeout_table, IP_VS_UDP_S_LAST,				       udp_state_name_table, sname, to);}static const char * udp_state_name(int state){	if (state >= IP_VS_UDP_S_LAST)		return "ERR!";	return udp_state_name_table[state] ? udp_state_name_table[state] : "?";}static intudp_state_transition(struct ip_vs_conn *cp, int direction,		     const struct sk_buff *skb,		     struct ip_vs_protocol *pp){	cp->timeout = pp->timeout_table[IP_VS_UDP_S_NORMAL];	return 1;}static void udp_init(struct ip_vs_protocol *pp){	IP_VS_INIT_HASH_TABLE(udp_apps);	pp->timeout_table = udp_timeouts;}static void udp_exit(struct ip_vs_protocol *pp){}struct ip_vs_protocol ip_vs_protocol_udp = {	.name =			"UDP",	.protocol =		IPPROTO_UDP,	.dont_defrag =		0,	.init =			udp_init,	.exit =			udp_exit,	.conn_schedule =	udp_conn_schedule,	.conn_in_get =		udp_conn_in_get,	.conn_out_get =		udp_conn_out_get,	.snat_handler =		udp_snat_handler,	.dnat_handler =		udp_dnat_handler,	.csum_check =		udp_csum_check,	.state_transition =	udp_state_transition,	.state_name =		udp_state_name,	.register_app =		udp_register_app,	.unregister_app =	udp_unregister_app,	.app_conn_bind =	udp_app_conn_bind,	.debug_packet =		ip_vs_tcpudp_debug_packet,	.timeout_change =	NULL,	.set_state_timeout =	udp_set_state_timeout,};

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美一卡二卡在线| 91视频在线观看| 天堂在线一区二区| 亚洲影院理伦片| 亚洲激情一二三区| 亚洲午夜精品17c| 丝袜a∨在线一区二区三区不卡| 一区二区三区四区不卡视频| 亚洲天堂a在线| 亚洲精品视频在线看| 伊人婷婷欧美激情| 日韩成人精品在线观看| 日本成人超碰在线观看| 紧缚捆绑精品一区二区| 国产二区国产一区在线观看| 国产福利一区二区三区视频在线| 丁香六月综合激情| 在线免费观看日本一区| 欧美一级日韩不卡播放免费| 久久久精品欧美丰满| 中文字幕一区二区在线播放| 亚洲国产日日夜夜| 久久不见久久见免费视频1| 91老师片黄在线观看| 欧美在线一二三| 久久综合丝袜日本网| 1000部国产精品成人观看| 午夜精品福利在线| 国产夫妻精品视频| 欧美色视频在线观看| 精品久久久久99| 亚洲欧美一区二区在线观看| 日本一区中文字幕| 99精品欧美一区二区三区小说 | 毛片不卡一区二区| 国产一区欧美一区| 在线观看视频欧美| 久久精品视频免费| 日韩精品亚洲一区二区三区免费| 精久久久久久久久久久| 在线观看精品一区| 国产精品五月天| 麻豆成人久久精品二区三区红 | 国产精品进线69影院| 午夜欧美在线一二页| 国产99久久久国产精品潘金| 91精品91久久久中77777| 精品国产一区久久| 亚洲成人av电影在线| 成人av在线一区二区三区| 欧美一级二级在线观看| 亚洲视频香蕉人妖| 国产成人av自拍| 欧美一区二区三区在线看| 亚洲综合一二三区| 东方aⅴ免费观看久久av| 日韩欧美国产系列| 婷婷丁香久久五月婷婷| 91豆麻精品91久久久久久| 亚洲国产精品成人综合| 精品一区二区三区久久| 欧美人动与zoxxxx乱| 亚洲一区二三区| 91网站最新网址| 亚洲精品免费在线| 91丨porny丨中文| 亚洲欧洲在线观看av| 成人毛片视频在线观看| 中文字幕不卡三区| www.亚洲人| 亚洲人成电影网站色mp4| 91网站最新网址| 亚洲综合免费观看高清完整版| 97久久精品人人爽人人爽蜜臀| 国产精品久久久久三级| av不卡免费在线观看| 中文字幕在线视频一区| av不卡免费电影| 一区二区在线看| 欧美年轻男男videosbes| 天堂av在线一区| 欧美大片拔萝卜| 国产伦精品一区二区三区免费| 久久亚区不卡日本| 国产成人综合视频| 国产精品久久久久久户外露出| 97国产一区二区| 亚洲一区二区三区自拍| 欧美一级搡bbbb搡bbbb| 国产精品18久久久久久vr| 欧美经典一区二区三区| 91麻豆福利精品推荐| 亚洲国产成人91porn| 欧美一区二区二区| 国产一区二区0| 136国产福利精品导航| 欧美美女网站色| 国产一区二区三区高清播放| 国产精品全国免费观看高清| 欧美在线观看一二区| 免费观看30秒视频久久| 欧美国产一区在线| 在线免费不卡视频| 狠狠久久亚洲欧美| 亚洲中国最大av网站| 精品国产凹凸成av人导航| 99精品视频一区| 麻豆视频观看网址久久| 中文字幕视频一区| 91精品国产91热久久久做人人| 成人性生交大片免费看视频在线 | 久久婷婷久久一区二区三区| www.欧美日韩国产在线| 午夜激情一区二区三区| 国产精品久久久一本精品| 欧美日本韩国一区| 99精品视频中文字幕| 国产中文字幕精品| 亚洲高清视频中文字幕| 日本一区二区动态图| 欧美高清性hdvideosex| 成人黄色电影在线| 久久99精品久久久久久久久久久久 | wwwwxxxxx欧美| 制服丝袜在线91| 色哟哟精品一区| 成人免费毛片嘿嘿连载视频| 轻轻草成人在线| 亚洲午夜一区二区| 亚洲九九爱视频| 国产精品欧美一区二区三区| 精品免费视频.| 日韩一级完整毛片| 欧美久久免费观看| 在线观看日韩电影| 色婷婷av一区二区三区之一色屋| 国产乱人伦偷精品视频免下载 | 26uuu精品一区二区| 欧美一卡二卡在线观看| 在线成人av影院| 在线观看日韩高清av| 99国产精品久久久久| 成人av网址在线| 成人黄色一级视频| 成人性生交大合| 成人亚洲一区二区一| 成人理论电影网| www.日韩精品| 在线观看日韩毛片| 欧美视频在线观看一区| 欧美视频中文字幕| 欧美日韩国产另类一区| 在线播放中文一区| 日韩精品一区二区三区老鸭窝 | 欧美三级电影在线看| 欧美图片一区二区三区| 欧美日韩一区中文字幕| 欧美丰满少妇xxxbbb| 91精品久久久久久蜜臀| 日韩精品一区在线观看| 久久久久久久久99精品| 国产精品免费免费| 亚洲另类色综合网站| 一区二区三区加勒比av| 天堂午夜影视日韩欧美一区二区| 亚洲国产精品视频| 久久99国产精品免费| 国产精品一二二区| 91一区二区三区在线观看| 色综合天天天天做夜夜夜夜做| 亚洲国产aⅴ成人精品无吗| 亚洲欧美一区二区三区国产精品| 成人免费视频在线观看| 亚洲在线免费播放| 久久99精品国产麻豆不卡| 高清国产一区二区| 色婷婷综合久久久中文一区二区| 欧美日韩国产天堂| 久久九九影视网| 一区二区三区在线观看国产| 免费视频最近日韩| 成人妖精视频yjsp地址| 欧美揉bbbbb揉bbbbb| 欧美xxxx老人做受| 国产精品久久久久桃色tv| 肉色丝袜一区二区| 国产河南妇女毛片精品久久久| 色综合中文综合网| 亚洲一区二区三区四区在线观看| 免费观看在线综合色| 成人免费av资源| 91精品国产综合久久精品| 中文字幕欧美国产| 全部av―极品视觉盛宴亚洲| 99在线热播精品免费| 精品少妇一区二区| 亚洲地区一二三色| 成人va在线观看| 亚洲精品一区在线观看| 亚洲成人tv网|