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

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? rip.c

?? 很好的TCP_IP協(xié)議源代碼分析,很適用很好
?? C
?? 第 1 頁 / 共 2 頁
字號:
		free_p(&bp);
		Rip_stat.version++;
		return;
	}
	switch(cmd){
	case RIPCMD_RESPONSE:
		if(Rip_trace > 1)
			printf("RIPCMD_RESPONSE from %s \n",inet_ntoa(fsock.address));

		Rip_stat.response++;
		/* See if this interface is on our broadcast list; if so,
		 * use its interval to calculate entry lifetimes. Otherwise,
		 * use default
		 */
		ttl = RIP_TTL;
		for(rl=Rip_list; rl != NULL; rl = rl->next){
			if(rl->iface == iface){
				ttl = rl->interval * 4;
				break;
			}
		}
		(void)pull16(&bp);	/* remove one word of padding */
		while(len_p(bp) >= RIPROUTE){
			pullentry(&entry,&bp);
			proc_rip(iface,fsock.address,&entry,ttl);
		}
		/* If we can't reach the sender of this update, or if
		 * our existing route is not through the interface we
		 * got this update on, add him as a host specific entry
		 */
		if((rp = rt_blookup(fsock.address,32)) != NULL){
			/* Host-specific route already exists, refresh it */
			start_timer(&rp->timer);
		} else if((rp = rt_lookup(fsock.address)) == NULL
		 || rp->iface != iface){
			entry.addr_fam = RIP_IPFAM;
			entry.target = fsock.address;
			entry.metric = 0; /* will get incremented to 1 */
			proc_rip(iface,fsock.address,&entry,ttl);
		}
		if(Rip_merge)
			rt_merge(Rip_trace);
		rip_trigger();
		break;
	case RIPCMD_REQUEST:
		if(Rip_trace > 1)
			printf("RIPCMD_REQUEST\n");

		Rip_stat.request++;
		/* For now, just send the whole table with split horizon
		 * enabled when the source port is RIP_PORT, and send
		 * the whole table with split horizon disable when another
		 * source port is used. This should be replaced with a more
		 * complete implementation that checks for non-global requests
		 */
		if(fsock.port == RIP_PORT)
			send_routes(fsock.address,fsock.port,1,0,1);
		else
			send_routes(fsock.address,fsock.port,0,0,1);
		break;
	default:
		if(Rip_trace > 1)
			printf("RIPCMD: Unknown Type\n");

		Rip_stat.unknown++;
		break;
	} /* switch */
	free_p(&bp);
}
/* Apply a set of heuristics for determining the number of significant bits
 * (i.e., the address mask) in the target address. Needed since RIP doesn't
 * include the address mask for each entry.
 */
int
nbits(target)
int32 target;
{
	int bits;

	if(target == 0)
		return 0;	/* Special case: 0.0.0.0 is the default route */

	/* Check the host-part bytes of
	 * the address to check for byte-wide zeros
	 * which we'll consider to be subnet routes.
	 * e.g.	44.80.0.0 will be considered to be equal to 44.80/16
	 * whereas 44.80.1.0 will be considered to be 44.80.1/24
	 */
	switch (hibyte(hiword(target)) >> 6) {
	case 3:	/* Class C address */
		/*is it a host address ? i.e. are there any 1's in the
		 * host part ?
		 */
		if(target & 0xff)
			bits = 32;
		else
			bits = 24;
		break;
	case 2:  /* Class B address */
		if(target & 0xff)
			bits = 32;
		else if(target & 0xff00)
			bits = 24;
		else
			bits = 16;
		break;
        case 0:	  /* Class A address */
        case 1:
		if(target & 0xff)
			bits = 32;
		else if(target & 0xff00)
			bits = 24;
		else if(target & 0xff0000)
			bits = 16;
		else
			bits = 8;
	}

	return bits;
}
/* Remove and process a RIP response entry from a packet */
static void
proc_rip(iface,gateway,ep,ttl)
struct iface *iface;
int32 gateway;
register struct rip_route *ep;
int32 ttl;
{
	unsigned int bits;
	register struct route *rp;
	int add = 0;	/* action flags */
	int drop = 0;
	int trigger = 0;

	if(ep->addr_fam != RIP_IPFAM) {
		/* Skip non-IP addresses */
		if(Rip_trace > 1)
			printf("RIP_rx: Not an IP RIP packet !\n");
		Rip_stat.addr_family++;
		return;
	}
	/* Guess at the mask, since it's not explicit */
	bits = nbits(ep->target);

	/* Don't ever add a route to myself through somebody! */
	if(bits == 32 && ismyaddr(ep->target) != NULL){
		if(Rip_trace > 1){
			printf("route to self: %s %ld\n",
			 inet_ntoa(ep->target),ep->metric);
		}
		return;
	}
	/* Find existing entry, if any */
	rp = rt_blookup(ep->target,bits);

	/* Don't touch private routes */
	if(rp != NULL && rp->flags.rtprivate)
		return;

	if(rp == NULL){
		if(ep->metric < RIP_INFINITY){
			/* New route; add it and trigger an update */
			add++;
			trigger++;
		}
	} else if(rp->metric == RIP_INFINITY){
		/* Route is in hold-down; ignore this guy */
		if(Rip_trace > 0){
			printf("ignored (hold-down): %s %lu\n",
			 inet_ntoa(ep->target),ep->metric);
		}
	} else if(rp->gateway == gateway && rp->iface == iface){
		/* This is the gateway for the entry we already have;
		 * restart the timer
		 */
		set_timer(&rp->timer,ttl*1000L);
		start_timer(&rp->timer);
		if(rp->metric != ep->metric){
			/* Metric has changed. Update it and trigger an
			 * update. If route has become unavailable, start
			 * the hold-down timeout.
			 */
			if(Rip_trace){
				printf("metric change: %s %lu -> %lu\n",
				 inet_ntoa(ep->target),rp->metric,ep->metric);
			}
			if(ep->metric == RIP_INFINITY)
				rt_timeout(rp);	/* Enter hold-down timeout */
			else
				rp->metric = ep->metric;
			trigger++;
		}
	} else {
		/* Entry is from a different gateway than the current route */
		if(ep->metric < rp->metric){
			/* Switch to a new gateway */
			if(Rip_trace > 0){
				printf("metric better: %s %lu\n",
				 inet_ntoa(ep->target),ep->metric);
			}
			drop++;
			add++;
			trigger++;
		} else {
			/* Metric is no better, stay with current route */
			if(Rip_trace > 1){
				printf("metric not better: %s %lu\n",
				 inet_ntoa(ep->target),ep->metric);
			}
		}
	}
	if(drop){
		/* Switching to a better gateway; delete old entry */
		if(Rip_trace){
			printf("route drop [%s]/%u",
			 inet_ntoa(ep->target),bits);
			if(rp != NULL)
				printf(" %s %s %lu",rp->iface->name,
				 inet_ntoa(rp->gateway),rp->metric);
			printf("\n");
		}
		rt_drop(ep->target,bits);
	}
	if(add){
		/* Add a new entry */
		if(Rip_trace > 0){
			printf("route add [%s]/%u %s",inet_ntoa(ep->target),
			 bits,iface->name);
			printf(" [%s] %u\n",inet_ntoa(gateway),
			 (int)ep->metric);
		}
		rp = rt_add(ep->target,(unsigned) bits,gateway,iface,
		 (int) ep->metric,ttl,0);
	}
	/* If the route changed, mark it for a triggered update */
	if(trigger){
		rp->flags.rttrig = 1;
	}
}
/* Send a RIP request packet to the specified destination */
int
ripreq(dest,replyport)
int32 dest;
uint16 replyport;
{
	struct mbuf *bp;
	struct socket lsock,fsock;
	uint8 *cp;

	lsock.address = INADDR_ANY;
	lsock.port = replyport;

	/* if we were given a valid dest addr, ask it (the routers on that net)
	 * for a default gateway
	 */
	if(dest == 0)
		return 0;

	fsock.address = dest;
	fsock.port = RIP_PORT;

	/* Send out one RIP Request packet as a broadcast to 'dest'  */
	if((bp = alloc_mbuf(RIPHEADER + RIPROUTE)) == NULL)
		return -1;

	cp = putheader(bp->data,RIPCMD_REQUEST,RIPVERSION);
	cp = putentry(cp,0,0L,RIP_INFINITY);
	bp->cnt = RIPHEADER + RIPROUTE;
	send_udp(&lsock, &fsock,0,0,&bp,bp->cnt,0,0);
	Rip_stat.output++;
	return 0;
}
void
pullentry(ep,bpp)
register struct rip_route *ep;
struct mbuf **bpp;
{
	ep->addr_fam = pull16(bpp);
	(void)pull16(bpp);
	ep->target = pull32(bpp);
	(void)pull32(bpp);
	(void)pull32(bpp);
	ep->metric = pull32(bpp);
}

/* Write the header of a RIP packet */
static uint8 *
putheader(cp,command,version)
register uint8 *cp;
enum ripcmd command;
uint8 version;
{
	*cp++ = command;
	*cp++ = version;
	return put16(cp,0);
}

/* Write a single entry into a rip packet */
static uint8 *
putentry(cp,fam,target,metric)
register uint8 *cp;
uint16 fam;
int32 target;
int32 metric;
{
	cp = put16(cp,fam);
	cp = put16(cp,0);
	cp = put32(cp,target);
	cp = put32(cp,0L);
	cp = put32(cp,0L);
	return put32(cp,metric);
}
/* Route timeout handler. If route has already been marked for deletion
 * then delete it. Otherwise mark for deletion and restart timer.
 */
void
rt_timeout(s)
void *s;
{
	register struct route *rp = (struct route *)s;

	stop_timer(&rp->timer);
	if(rp->metric < RIP_INFINITY){
		rp->metric = RIP_INFINITY;
		if(dur_timer(&rp->timer) == 0)
			set_timer(&rp->timer,RIP_TTL*1000L);
		/* wait 2/3 of timeout before garbage collect */
		set_timer(&rp->timer,dur_timer(&rp->timer)*2/3);
		rp->timer.func = (void *)rt_timeout;
		rp->timer.arg = (void *)rp;
		start_timer(&rp->timer);
		/* Route changed; mark it for triggered update */
		rp->flags.rttrig = 1;
		rip_trigger();
	} else {
		rt_drop(rp->target,rp->bits);
	}
}

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
一区二区三区在线免费视频| 日韩欧美国产午夜精品| 日本不卡一二三| 经典三级在线一区| 在线免费观看日韩欧美| 日韩av一区二区三区四区| 亚洲午夜日本在线观看| 国产精品乱码久久久久久| 亚洲精品乱码久久久久久黑人| 国产精品资源在线| eeuss鲁片一区二区三区在线看| 99视频热这里只有精品免费| 7777精品伊人久久久大香线蕉完整版| 欧美日韩在线三级| 中文字幕欧美国产| 国产精品国产成人国产三级| 亚洲综合一二区| 日韩精品国产精品| 欧美日韩一区二区不卡| 精品亚洲国产成人av制服丝袜| 欧美日韩亚洲国产综合| 国产精品欧美综合在线| 精品制服美女丁香| 日韩一区二区电影在线| 亚洲成人免费看| 91在线云播放| 99re在线精品| 亚洲影院久久精品| 精品伦理精品一区| 国产精品综合网| 久久蜜桃av一区二区天堂| 无吗不卡中文字幕| 日韩欧美资源站| 男女男精品网站| 欧美精品一区二区三区在线| 亚洲免费看黄网站| 精品欧美一区二区三区精品久久| 国产福利91精品一区二区三区| 国产精品不卡一区二区三区| 成人福利视频在线| 日精品一区二区| 国产日产欧产精品推荐色| 国产成人精品免费在线| 精品粉嫩超白一线天av| 韩国在线一区二区| 亚洲激情第一区| 欧美三级在线看| 91精品办公室少妇高潮对白| 日本伦理一区二区| 国产精品中文字幕欧美| 男女激情视频一区| 亚洲国产成人高清精品| 日韩欧美精品在线| 成人av电影在线网| 亚洲男人的天堂在线观看| 欧美手机在线视频| 欧美一级日韩一级| 欧美精三区欧美精三区| 国产精品美女www爽爽爽| 精品国产精品一区二区夜夜嗨| 成人黄色av电影| 欧洲人成人精品| 91福利国产成人精品照片| 懂色av噜噜一区二区三区av| 免费不卡在线视频| 欧美经典一区二区三区| 国产精品国产三级国产有无不卡 | 性感美女极品91精品| 国产女人18水真多18精品一级做| 在线中文字幕一区| 国产suv精品一区二区883| 免费看欧美女人艹b| 精品一区二区在线看| 国内外成人在线| 欧美日韩高清一区| 欧美性生活久久| 中文字幕在线不卡视频| 亚洲妇女屁股眼交7| 国产精品免费av| 欧美精品一区二区三区高清aⅴ| 91精品国产全国免费观看 | 欧美三级电影网站| 欧美日韩高清一区二区三区| 亚洲免费视频中文字幕| 国产精品久久精品日日| 中文av一区特黄| 天涯成人国产亚洲精品一区av| 久久av中文字幕片| 日产国产欧美视频一区精品 | 日韩久久免费av| 久久久精品国产免大香伊 | 日韩一区二区在线播放| 国产亲近乱来精品视频| 国产精品夜夜嗨| 欧美日韩国产一二三| 337p粉嫩大胆噜噜噜噜噜91av| 国产精品久久久久影院老司| 美国毛片一区二区| 在线看国产一区二区| 中文字幕在线播放不卡一区| 精品中文字幕一区二区| 欧美午夜电影一区| 亚洲另类在线一区| 岛国精品一区二区| 国产精品拍天天在线| 精品一区二区三区av| 日韩欧美国产一区二区三区| 一区二区三区丝袜| 经典三级在线一区| 国产蜜臀97一区二区三区| 久久99久久久久| 色8久久人人97超碰香蕉987| 国产精品国产a| 欧美自拍丝袜亚洲| 另类中文字幕网| 亚洲国产成人午夜在线一区| 国产在线精品免费| 精品国产a毛片| 经典三级在线一区| 欧美一区二区三区免费| 9i看片成人免费高清| 亚洲一级二级三级在线免费观看| 欧美一区二区视频在线观看| 久久99久久精品欧美| 亚洲一区二区三区四区的| 91精品国产综合久久久久| 粉嫩欧美一区二区三区高清影视| 日韩视频一区在线观看| 成人免费电影视频| 日韩精品久久久久久| 欧美日韩午夜在线视频| 91在线porny国产在线看| 亚洲私人影院在线观看| 久久视频一区二区| 久久久精品欧美丰满| 欧美精品xxxxbbbb| 97精品国产露脸对白| 国产在线精品一区在线观看麻豆| 国产精品福利一区二区| 欧美日韩国产综合一区二区| 91九色02白丝porn| 蜜桃视频在线一区| 亚洲二区在线观看| 日韩成人一级片| 亚洲高清中文字幕| 久久精品99国产国产精| 一区二区三区精品视频| 三级影片在线观看欧美日韩一区二区 | 中日韩av电影| 日韩欧美一区中文| 911国产精品| 91看片淫黄大片一级在线观看| 极品少妇一区二区三区精品视频| youjizz国产精品| 欧美三级视频在线播放| 在线播放91灌醉迷j高跟美女| 制服丝袜亚洲网站| 久久久久久久久97黄色工厂| 国产精品网站在线播放| 亚洲欧洲日产国码二区| 国产欧美一区二区三区在线看蜜臀 | 美国十次综合导航| 一区二区三区在线观看国产| 亚洲一区影音先锋| 国产成人精品亚洲777人妖| 国产一区二三区| 欧美伊人久久大香线蕉综合69| 久久天堂av综合合色蜜桃网| 国产精品美女www爽爽爽| 卡一卡二国产精品 | 久久久久久久久久看片| 日本一区二区三级电影在线观看 | 欧美一级久久久| 亚洲丝袜美腿综合| 欧美精品久久99| 亚洲国产精品国自产拍av| 一区二区三区久久| 欧美日韩一区久久| 91精品国产乱码| 国产亚洲女人久久久久毛片| 一区二区三区在线免费视频 | 国产·精品毛片| 免费在线看成人av| 精品久久一二三区| 丰满亚洲少妇av| 亚洲人成电影网站色mp4| 色综合天天综合网天天看片| 国产欧美精品国产国产专区| 懂色av一区二区三区蜜臀| 中文字幕制服丝袜一区二区三区| 免费在线观看一区| 26uuu精品一区二区在线观看| 成人小视频免费观看| 51精品久久久久久久蜜臀| 中文字幕永久在线不卡| 蜜桃精品在线观看| 久久九九久精品国产免费直播| 国产69精品久久99不卡| 亚洲一区二区三区中文字幕在线| 欧美系列一区二区|