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

📄 if_elect.c

📁 TCP-IP红宝书源代码
💻 C
字号:
/* if_elect.c - if_elect */

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

int if_elect1(struct ospf_if *, struct ospf_nb **, struct ospf_nb **);
void db_resync(struct ospf_if *), nb_reform(struct ospf_if *);

/*------------------------------------------------------------------------
 * if_elect - elect a designated router and backup designated router
 *------------------------------------------------------------------------
 */
void
if_elect(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);
	}
}

⌨️ 快捷键说明

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