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

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

?? rip.c

?? 很好的TCP_IP協(xié)議源代碼分析,很適用很好
?? C
?? 第 1 頁(yè) / 共 2 頁(yè)
字號(hào):
/* This file contains code to implement the Routing Information Protocol (RIP)
 * and is derived from 4.2BSD code. Mike Karels of Berkeley has stated on
 * TCP-IP that the code may be freely used as long as UC Berkeley is
 * Further documentation on the RIP protocol is now available in Charles
 */
#include "global.h"
#include "mbuf.h"
#include "netuser.h"
#include "udp.h"
#include "timer.h"
#include "iface.h"
#include "ip.h"
#include "internet.h"
#include "rip.h"
#include "arp.h"

struct rip_stat Rip_stat;
uint16 Rip_trace;
int Rip_merge;
struct rip_list *Rip_list;
struct udp_cb *Rip_cb;

struct rip_refuse *Rip_refuse;

static void rip_rx(struct iface *iface,struct udp_cb *sock,int cnt);
static void proc_rip(struct iface *iface,int32 gateway,
	struct rip_route *ep,int32 ttl);
static uint8 *putheader(uint8 *cp,enum ripcmd command,uint8 version);
static uint8 *putentry(uint8 *cp,uint16 fam,int32 target,int32 metric);
static void rip_shout(void *p);
static void send_routes(int32 dest,uint16 port,int split,int trig,
	int us);

/* Send RIP CMD_RESPONSE packet(s) to the specified rip_list entry */
static void
rip_shout(p)
void *p;
{
	register struct rip_list *rl;

	rl = (struct rip_list *)p;
	stop_timer(&rl->rip_time);
	send_routes(rl->dest,RIP_PORT,rl->flags.rip_split,0,rl->flags.rip_us);
	set_timer(&rl->rip_time,rl->interval*1000L);
	start_timer(&rl->rip_time);
}

/* Send the routing table. */
static void
send_routes(dest,port,split,trig,us)
int32 dest;		/* IP destination address to send to */
uint16 port;
int split;		/* Do split horizon? */
int trig;		/* Send only triggered updates? */
int us;			/* Include our address in update */
{
	uint8 *cp;
	int i,bits,numroutes,maxroutes;
	uint16 pktsize;
	struct mbuf *bp;
	struct route *rp;
	struct socket lsock,fsock;
	struct iface *iface;

	if((rp = rt_lookup(dest)) == NULL)
		return;	/* No route exists, can't do it */
	iface = rp->iface;

	/* Compute maximum packet size and number of routes we can send */
	pktsize = ip_mtu(dest) - IPLEN;
	pktsize = min(pktsize,MAXRIPPACKET);
	maxroutes = (pktsize - RIPHEADER) / RIPROUTE;

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

	/* Allocate space for a full size RIP packet and generate header */
	if((bp = alloc_mbuf(pktsize)) == NULL)
		return; 
	numroutes = 0;
	cp = putheader(bp->data,RIPCMD_RESPONSE,RIPVERSION);

	/* Emit route to ourselves, if requested */
	if(us){
		cp = putentry(cp,RIP_IPFAM,iface->addr,1);
		numroutes++;
	}
	/* Emit default route, if appropriate */
	if(R_default.iface != NULL && !R_default.flags.rtprivate
	 && (!trig || R_default.flags.rttrig)){
		if(!split || iface != R_default.iface){
	 		cp = putentry(cp,RIP_IPFAM,0,R_default.metric);
			numroutes++;
		} else if(trig){
			cp = putentry(cp,RIP_IPFAM,0,RIP_INFINITY);
			numroutes++;
		}
	}
	for(bits=0;bits<32;bits++){
		for(i=0;i<HASHMOD;i++){
			for(rp = Routes[bits][i];rp != NULL;rp=rp->next){
				if(rp->flags.rtprivate
				 || (trig && !rp->flags.rttrig)) 
					continue;

				if(numroutes >= maxroutes){
					/* Packet full, flush and make another */
					bp->cnt = RIPHEADER + numroutes * RIPROUTE;
					send_udp(&lsock,&fsock,0,0,&bp,bp->cnt,0,0);
					Rip_stat.output++;
					if((bp = alloc_mbuf(pktsize)) == NULL)
						return; 
					numroutes = 0;
					cp = putheader(bp->data,RIPCMD_RESPONSE,RIPVERSION);
				}
				if(!split || iface != rp->iface){
			 		cp = putentry(cp,RIP_IPFAM,rp->target,rp->metric+1);
					numroutes++;
				} else if(trig){
			 		cp = putentry(cp,RIP_IPFAM,rp->target,RIP_INFINITY);
					numroutes++;
				}
			}
		}
	}
	if(numroutes != 0){
		bp->cnt = RIPHEADER + numroutes * RIPROUTE;
		send_udp(&lsock,&fsock,0,0,&bp,bp->cnt,0,0);
		Rip_stat.output++;
	} else {
		free_p(&bp);
	}
}
/* Add an entry to the rip broadcast list */
int
rip_add(dest,interval,split,us)
int32 dest;
int32 interval;
int split,us;
{
	register struct rip_list *rl;
	struct route *rp;

	if((rp = rt_lookup(dest)) == NULL){
		printf("%s is unreachable\n",inet_ntoa(dest));
		return 1;
	}
	for(rl = Rip_list; rl != NULL; rl = rl->next)
		if(rl->dest == dest)
			break;

	if(rl == NULL){
		/* get a chunk of memory for the rip interface descriptor */
		rl = (struct rip_list *)callocw(1,sizeof(struct rip_list));

		/* tack this record on as the first in the list */
		rl->next = Rip_list;
		if(rl->next != NULL)
			rl->next->prev = rl;
		Rip_list = rl;
		rl->dest = dest;
	}
	/* and the interface ptr, tick interval and flags */
	rl->iface = rp->iface;
	rl->interval = interval;
	rl->flags.rip_split = split;
	rl->flags.rip_us = us;

	/* set up the timer stuff */
	rl->rip_time.func = rip_shout;
	rl->rip_time.arg = rl;
	/* This will initialize the timer and do an immediate broadcast */
	rip_shout(rl);
	return 0;
}

/* add a gateway to the rip_refuse list which allows us to ignore their
 * advertisements
*/
int
riprefadd(gateway)
int32 gateway;
{
	register struct rip_refuse *rl;

	for(rl = Rip_refuse; rl != NULL; rl = rl->next)
		if(rl->target == gateway)
			return 0;	/* Already in table */
  

	/* get a chunk of memory for the rip interface descriptor */
	rl = (struct rip_refuse *)callocw(1,sizeof(struct rip_refuse));

	/* tack this record on as the first in the list */
	rl->next = Rip_refuse;
	if(rl->next != NULL)
		rl->next->prev = rl;
	Rip_refuse = rl;

	/* fill in the gateway to ignore */
	rl->target = gateway;
	return 0;
}

/* drop a RIP target */
int
rip_drop(dest)
int32	dest;
{
	register struct rip_list *rl;

	for(rl = Rip_list; rl != NULL; rl = rl->next)
		if(rl->dest == dest)
			break;

	/* leave if we didn't find it */
	if(rl == NULL)
		return 0;

	/* stop the timer */
	stop_timer(&rl->rip_time);

	/* Unlink from list */
	if(rl->next != NULL)
		rl->next->prev = rl->prev;
	if(rl->prev != NULL)
		rl->prev->next = rl->next;
	else
		Rip_list = rl->next;

	/* and deallocate the descriptor memory */
	free(rl);
	return 0;
}

/* drop a RIP-refuse target from the rip_refuse list */
int
riprefdrop(gateway)
int32 gateway;
{
	register struct rip_refuse *rl;
	
	for(rl = Rip_refuse; rl != NULL; rl = rl->next)
		if(rl->target == gateway)
			break;
  
	/* leave if we didn't find it */
	if(rl == NULL)
		return 0;

	/* Unlink from list */
	if(rl->next != NULL)
		rl->next->prev = rl->prev;
	if(rl->prev != NULL)
		rl->prev->next = rl->next;
	else
		Rip_refuse = rl->next;

	/* and deallocate the structure memory */
	free(rl);
	return 0;
}

/* function to output a RIP CMD_RESPONSE packet for the rip_trigger list */
void
rip_trigger()
{
	register struct rip_list *rl;
	int bits,i;
	struct route *rp;

	for(rl=Rip_list;rl != NULL;rl = rl->next){
		send_routes(rl->dest,RIP_PORT,rl->flags.rip_split,1,0);
	}
	/* Clear the trigger list */
	R_default.flags.rttrig = 0;
	for(bits=0;bits<32;bits++){
		for(i=0;i<HASHMOD;i++){
			for(rp = Routes[bits][i];rp != NULL;rp = rp->next){
				rp->flags.rttrig = 0;
			}
		}
	}
}

/* Start RIP agent listening at local RIP UDP port */
int
rip_init()
{
	struct socket lsock;

	lsock.address = INADDR_ANY;
	lsock.port = RIP_PORT;

	if(Rip_cb == NULL)
		Rip_cb = open_udp(&lsock,rip_rx);

	return 0;
}

/* Process RIP input received from 'interface'. */
static void
rip_rx(iface,sock,cnt)
struct iface *iface;
struct udp_cb *sock;
int cnt;
{
	struct mbuf *bp;
	struct socket fsock;
	enum ripcmd cmd;
	register struct rip_refuse *rfl;
	struct rip_route entry;
	struct route *rp;
	struct rip_list *rl;
	int32 ttl;

	/* receive the RIP packet */
	recv_udp(sock,&fsock,&bp);

	/* increment the rcvd cnt */
	Rip_stat.rcvd++;

	/* check the gateway of this packet against the rip_refuse list and
	 * discard it if a match is found
	 */
	for(rfl=Rip_refuse;rfl != NULL;rfl = rfl->next){
		if(fsock.address == rfl->target){
			Rip_stat.refusals++;
			if(Rip_trace > 1)
				printf("RIP refused from %s\n",
				 inet_ntoa(fsock.address));
			free_p(&bp);
			return;
		 }
	}
	cmd = PULLCHAR(&bp);
	/* Check the version of the frame */
	if(PULLCHAR(&bp) != RIPVERSION){

?? 快捷鍵說(shuō)明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
中文字幕不卡一区| 国产99久久久国产精品潘金 | 欧美日韩免费高清一区色橹橹 | 国产欧美精品一区| 日日夜夜免费精品| 99久久综合狠狠综合久久| 日韩欧美一级二级三级| 一区二区三区.www| 懂色av中文字幕一区二区三区 | 日本高清成人免费播放| 久久嫩草精品久久久精品| 亚洲成人激情自拍| 91一区二区在线| 国产区在线观看成人精品| 日本成人中文字幕在线视频| 91啪九色porn原创视频在线观看| 久久久天堂av| 久久国产综合精品| 日韩欧美成人激情| 午夜视频在线观看一区二区 | 夜夜操天天操亚洲| 一本色道久久综合亚洲91| 欧美高清在线一区| 成人午夜看片网址| 国产精品伦一区| 国产福利精品导航| 国产日韩成人精品| 国产成人亚洲精品青草天美| 久久色成人在线| 精品中文字幕一区二区小辣椒| 欧美精品成人一区二区三区四区| 亚洲图片欧美视频| 欧美日韩精品一区二区三区蜜桃 | 精品一区二区三区不卡| 欧美一区二区三区免费在线看| 亚洲一级二级三级在线免费观看| 色综合欧美在线| 亚洲成人黄色影院| 91精品一区二区三区在线观看| 亚洲国产精品综合小说图片区| 欧美日韩精品是欧美日韩精品| 亚瑟在线精品视频| 717成人午夜免费福利电影| 日韩激情中文字幕| 精品国内二区三区| 成人性生交大合| 亚洲精品视频自拍| 91精品中文字幕一区二区三区| 美国十次综合导航| 国产日韩高清在线| 色婷婷精品久久二区二区蜜臀av| 亚洲一区自拍偷拍| 欧美成人午夜电影| av在线一区二区三区| 亚洲一区二区视频| 久久亚区不卡日本| 色伊人久久综合中文字幕| 婷婷夜色潮精品综合在线| 精品国免费一区二区三区| 99久久精品免费观看| 日韩不卡一区二区三区| 国产网站一区二区| 欧美性猛交xxxx黑人交| 国产自产v一区二区三区c| 亚洲少妇30p| 欧美成人精品福利| 一本色道久久综合精品竹菊| 青青草国产成人av片免费 | 91精品国产综合久久久久久久久久 | 国产一区二区在线视频| 亚洲视频一区二区免费在线观看| 欧美日韩成人综合天天影院 | 久久精品国产精品亚洲综合| 中文字幕精品一区二区精品绿巨人 | 麻豆91精品视频| 国产精品女人毛片| 日韩三级在线免费观看| 99久久亚洲一区二区三区青草| 日韩国产在线观看| ...xxx性欧美| 久久久99免费| 日韩一区二区三区在线视频| 99久久久国产精品免费蜜臀| 在线亚洲+欧美+日本专区| 久久99精品视频| 亚洲一卡二卡三卡四卡| 国产精品色在线观看| 欧美电影免费观看高清完整版在 | 欧美精品九九99久久| 99国产精品国产精品毛片| 精品无人码麻豆乱码1区2区 | 一区二区国产视频| 国产精品免费久久| 久久久午夜精品理论片中文字幕| 欧美日韩视频专区在线播放| 色噜噜狠狠一区二区三区果冻| 国产91精品一区二区| 久久99国产精品久久99果冻传媒| 亚洲va国产va欧美va观看| 亚洲蜜臀av乱码久久精品蜜桃| 国产性天天综合网| 久久综合国产精品| 26uuu色噜噜精品一区| 欧美不卡激情三级在线观看| 欧美一区二区日韩| 56国语精品自产拍在线观看| 欧美视频一区在线观看| 欧美中文字幕一区二区三区| 91看片淫黄大片一级在线观看| 国产v综合v亚洲欧| 国产91丝袜在线播放| 国产成人av电影在线| 国产精品99久久久久久似苏梦涵| 老司机精品视频在线| 蜜臀精品久久久久久蜜臀 | 亚洲免费资源在线播放| 亚洲欧洲在线观看av| 国产精品美日韩| 亚洲欧美日韩中文播放 | 国产精品天干天干在观线| 国产三级精品视频| 国产精品国产自产拍高清av王其| 中文字幕高清不卡| 一区二区三区四区视频精品免费| 亚洲欧美另类图片小说| 亚洲va在线va天堂| 免费成人结看片| 国产激情偷乱视频一区二区三区| 国产毛片精品视频| 91麻豆国产福利在线观看| 欧美三级三级三级爽爽爽| 777午夜精品免费视频| 精品国产一区二区精华| 国产精品女人毛片| 午夜伦欧美伦电影理论片| 久久国产婷婷国产香蕉| 成人午夜短视频| 欧美亚洲国产一区二区三区| 欧美电影影音先锋| 久久亚洲欧美国产精品乐播 | 91麻豆国产自产在线观看| 欧美日韩精品一区二区三区四区| 欧美一级在线观看| 国产精品国产a级| 亚洲va欧美va人人爽| 国产毛片精品国产一区二区三区| 不卡区在线中文字幕| 777久久久精品| 中文字幕一区二区三区蜜月| 日韩精品欧美精品| 高清在线观看日韩| 9191成人精品久久| 日韩一区在线看| 免费欧美日韩国产三级电影| 国产成人av电影在线观看| 欧美伦理视频网站| 国产精品国产三级国产aⅴ无密码 国产精品国产三级国产aⅴ原创 | 不卡一区二区三区四区| 欧美精品99久久久**| 国产精品丝袜黑色高跟| 美女网站在线免费欧美精品| 91在线云播放| 久久亚洲免费视频| 天天亚洲美女在线视频| www.日韩精品| 精品欧美一区二区三区精品久久| 一片黄亚洲嫩模| 成人黄色小视频| 久久丝袜美腿综合| 日韩成人免费在线| 精品污污网站免费看| 国产精品久久国产精麻豆99网站| 免费成人av在线播放| 欧美日韩国产另类不卡| 亚洲天堂福利av| 风间由美一区二区av101| 欧美一卡二卡三卡| 午夜婷婷国产麻豆精品| 色婷婷香蕉在线一区二区| 国产精品麻豆欧美日韩ww| 国内精品免费在线观看| 日韩一区国产二区欧美三区| 亚洲夂夂婷婷色拍ww47| 91美女片黄在线观看91美女| 欧美激情一区二区三区在线| 狠狠色狠狠色综合系列| 91精品久久久久久蜜臀| 亚洲成人免费观看| 欧美日韩一区三区| 亚洲国产精品天堂| 欧美日韩免费电影| 午夜在线电影亚洲一区| 日本高清视频一区二区| 亚洲一区二区综合| 欧美亚洲动漫制服丝袜| 亚洲综合色噜噜狠狠| 欧美老年两性高潮| 日本欧洲一区二区| 欧美一区三区二区| 久久99热这里只有精品|