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

📄 rtadd.c,v

📁 关于IP协议方面的
💻 C,V
字号:
head	1.1;access;symbols;locks	dls:1.1; strict;comment	@ * @;1.1date	97.09.21.19.27.09;	author dls;	state Dist;branches;next	;desc@@1.1log@pre-3e code@text@/* rtadd.c - rtadd */#include <conf.h>#include <kernel.h>#include <network.h>struct	route *rtnew();/*------------------------------------------------------------------------ *  rtadd  -  add a route to the routing table *------------------------------------------------------------------------ */int rtadd(net, mask, gw, metric, intf, ttl)IPaddr	net, mask, gw;int	metric, intf, ttl;{	struct	route	*prt, *srt, *prev;	Bool		isdup;	int		hv, i;	if (!Route.ri_valid)		rtinit();	prt = rtnew(net, mask, gw, metric, intf, ttl);	if (prt == (struct route *)SYSERR)		return SYSERR;	/* compute the queue sort key for this route */	prt->rt_key = 0;	for (i=0; i<32; ++i)		prt->rt_key += (mask >> i) & 1;	wait(Route.ri_mutex);	/* special case for default routes */	if (net == RT_DEFAULT) {		if (Route.ri_default)			RTFREE(Route.ri_default);		Route.ri_default = prt;		signal(Route.ri_mutex);		return OK;	}	prev = NULL;	hv = rthash(net);	isdup = FALSE;	for (srt=rttable[hv]; srt; srt = srt->rt_next) {		if (prt->rt_key > srt->rt_key)			break;		if (srt->rt_net == prt->rt_net &&	    	    srt->rt_mask == prt->rt_mask) {			isdup = TRUE;			break;		}		prev = srt;	}	if (isdup) {		struct	route	*tmprt;		if (srt->rt_gw == prt->rt_gw) {			/* just update the existing route */#ifdef	RIP			if (dorip) {				srt->rt_ttl = ttl;				if (srt->rt_metric != metric) {					if (metric == RTM_INF)						srt->rt_ttl = RIPZTIME;					send(rippid, 0);				}			}#endif	/* RIP */			srt->rt_metric = metric;			RTFREE(prt);			signal(Route.ri_mutex);			return OK;		}		/* else, someone else has a route there... */		if (srt->rt_metric <= prt->rt_metric) {			/* no better off to change; drop the new one */			RTFREE(prt);			signal(Route.ri_mutex);			return OK;		}#ifdef	RIP		else if (dorip)			send(rippid, 0);#endif	/* RIP */		tmprt = srt;		srt = srt->rt_next;		RTFREE(tmprt);	}#ifdef	RIP	else if (dorip)		send(rippid, 0);#endif	/* RIP */	prt->rt_next = srt;	if (prev)		prev->rt_next = prt;	else		rttable[hv] = prt;	signal(Route.ri_mutex);	return OK;}@

⌨️ 快捷键说明

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