if_elect.c,v

来自「TCP-IP红宝书源代码」· C,V 代码 · 共 190 行

C,V
190
字号
head	1.3;
access;
symbols;
locks
	dls:1.3; strict;
comment	@ * @;


1.3
date	97.09.21.19.28.38;	author dls;	state Dist;
branches;
next	1.2;

1.2
date	94.02.13.19.38.53;	author dls;	state Works;
branches;
next	1.1;

1.1
date	94.02.06.18.20.16;	author dls;	state Ok;
branches;
next	;


desc
@@


1.3
log
@pre-3e code
@
text
@/* if_elect.c - if_elect */

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

/*------------------------------------------------------------------------
 * if_elect - elect a designated router and backup designated router
 *------------------------------------------------------------------------
 */
if_elect(ifn)
unsigned int	ifn;
{
	struct ospf_if	*pif = &ospf_if[ifn];
	struct ospf_nb	*pnb, *pdr, *pbr;
	unsigned long		odrid, obrid;

	wait(pif->if_nbmutex);
	odrid = pif->if_drid;
	obrid = pif->if_brid;
	if_elect1(pif, &pdr, &pbr);
	pif->if_brid = pbr ? pbr->nb_rid : 0;
	if (pdr)
		pif->if_drid = pdr->nb_rid;
	else {
		pif->if_drid = pif->if_brid;
		pif->if_brid = 0;
	}
	/*
	 * if designate or backup has changed in this pass and this
	 * router is old or new designate or backup, run again to get
	 * a backup designate. Also update DB if we were/are designate
	 */
	if ((odrid != pif->if_drid &&
	   (odrid == pif->if_rid || pif->if_drid == pif->if_rid))) {
		if_elect1(pif, &pdr, &pbr);
		pif->if_brid = pbr ? pbr->nb_rid : 0;
		db_resync(pif);
	}
	if ((obrid != pif->if_brid &&
	   (obrid == pif->if_rid || pif->if_brid == pif->if_rid))) {
		if_elect1(pif, &pdr, &pbr);
		pif->if_brid = pbr ? pbr->nb_rid : 0;
	}
	signal(pif->if_nbmutex);
	if (obrid != pif->if_brid || odrid != pif->if_drid) {
		if (pif->if_drid == pif->if_rid)
			pif->if_state = IFS_DR;
		else if (pif->if_brid == pif->if_rid)
			pif->if_state = IFS_BACKUP;
		else
			pif->if_state = IFS_DROTHER;
		nb_reform(pif);
	}
}
@


1.2
log
@*** empty log message ***
@
text
@d13 1
a13 1
int	ifn;
d17 1
a17 1
	long		odrid, obrid;
d33 1
a33 1
	 * a backup designate.
d36 6
a41 2
	   (odrid == pif->if_rid || pif->if_drid == pif->if_rid)) ||
	   (obrid != pif->if_brid &&
a46 2
kprintf("odrid %X if_drid %X obrid %X if_brid %X\n", odrid, pif->if_drid,
obrid, pif->if_brid);
@


1.1
log
@Initial revision
@
text
@a14 1
	Bool		bdecl, cdecl;	/* backup & current declared */
d17 1
a17 3
	long		odrid, obrid, brid, drid;
	Bool		oncethrough = 0;
	int		i;
d22 1
a22 43
again:
	drid = pif->if_drid;
	brid = pif->if_brid;
	bdecl = FALSE;
	pdr = pbr = 0;
	pnb = &pif->if_nbtab[0];
	for (i=0; i<=MAXNBR; ++i, ++pnb) {
		if (pnb->nb_state < NBS_2WAY)
			continue;
		if (pnb->nb_rid == pnb->nb_drid) {
			/* neighbor claims designated routership */

			if (pdr) {
				if (pnb->nb_prio < pdr->nb_prio)
					continue;
				if ((pnb->nb_prio == pdr->nb_prio) &&
				    (pnb->nb_rid < pdr->nb_rid))
					continue;
			}
			pdr = pnb;
			continue;
		} /* else pnb is a backup candidate */

		cdecl = pnb->nb_rid == pnb->nb_brid;
		if (bdecl && !cdecl)
			continue;
		if (cdecl && !bdecl) {
			bdecl = TRUE;
			pbr = pnb;
			continue;
		}
		if (pbr == 0) {
			pbr = pnb;
			continue;
		}
		if (pnb->nb_prio < pbr->nb_prio)
			continue;
		if ((pnb->nb_prio == pbr->nb_prio) &&
		    (pnb->nb_rid < pbr->nb_rid))
			continue;
		pbr = pnb;	/* new backup */
	}
	pif->if_drid = pdr ? pdr->nb_rid : 0;
d24 3
a26 1
	if (pif->if_drid == 0) {
d31 3
a33 2
	 * if designate or backup has changed in this loop and we were
	 * old or new,  run again to get a backup designate.
d35 7
a41 6
	if (drid != pif->if_drid &&
	    (drid == pif->if_rid || pif->if_drid == pif->if_rid))
		goto again;
	if (brid != pif->if_brid &&
	    (brid == pif->if_rid || pif->if_brid == pif->if_rid))
		goto again;
@

⌨️ 快捷键说明

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