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 + -
显示快捷键?