setmask.c

来自「TCP-IP红宝书源代码」· C语言 代码 · 共 57 行

C
57
字号
/* setmask.c - setmask */

#include <conf.h>
#include <kernel.h>
#include <network.h>

extern	int	bsdbrc;		/* use Berkeley (all-0's) broadcast	*/
/*------------------------------------------------------------------------
 *  setmask - set the net mask for an interface
 *------------------------------------------------------------------------
 */
int
setmask(unsigned ifn, IPaddr mask)
{
	IPaddr	defmask;

	if (nif[ifn].ni_svalid) {
		/* one set already-- fix things */

		rtdel(nif[ifn].ni_subnet, nif[ifn].ni_mask);
		rtdel(nif[ifn].ni_brc, ip_maskall);
		rtdel(nif[ifn].ni_subnet, ip_maskall);
	}
	nif[ifn].ni_mask = mask;
	nif[ifn].ni_svalid = TRUE;
	defmask = netmask(nif[ifn].ni_ip);

	nif[ifn].ni_subnet = nif[ifn].ni_ip & nif[ifn].ni_mask; 
	if (bsdbrc)
		nif[ifn].ni_brc = nif[ifn].ni_subnet;
	else
		nif[ifn].ni_brc = nif[ifn].ni_subnet |
				~nif[ifn].ni_mask;
	/* set network (not subnet) broadcast */
	nif[ifn].ni_nbrc = nif[ifn].ni_ip | ~defmask;

	/* install routes */
	/* net */
	rtadd(nif[ifn].ni_subnet, nif[ifn].ni_mask, nif[ifn].ni_ip,
		0, ifn, RT_INF);
	if (bsdbrc) {
		IPaddr	aobrc;		/* all 1's broadcast */

		aobrc = nif[ifn].ni_subnet | ~nif[ifn].ni_mask;
		rtadd(aobrc, ip_maskall, nif[ifn].ni_ip, 0,
			NI_LOCAL, RT_INF);
	} else	/* broadcast (all 1's) */
		rtadd(nif[ifn].ni_brc, ip_maskall, nif[ifn].ni_ip, 0,
			NI_LOCAL, RT_INF);
	/* broadcast (all 0's) */
	rtadd(nif[ifn].ni_subnet, ip_maskall, nif[ifn].ni_ip, 0,
		NI_LOCAL, RT_INF);
	return OK;
}

IPaddr	ip_maskall = 0xffffffff;

⌨️ 快捷键说明

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