ospfhello.c

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

C
65
字号
/* ospfhello.c - ospfhello */

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

#define	OSPFDELTA	10	/* OSPF "stagger" bounds (1/10 secs)	*/

int ospf_hsend(unsigned);

/*------------------------------------------------------------------------
 * ospfhello - send OSPF hello packets
 *------------------------------------------------------------------------
 */
PROCESS
ospfhello(void)
{
	struct ospf_if	*pif;
	int		ifn, rnd;

	/* select initial "random" offset to stagger hello's */
	rnd = nif[NI_PRIMARY].ni_ip % OSPFDELTA;

	/* do state changes first so we can receive while waiting */
	for (ifn=0; ifn<Net.nif; ++ifn) {
		if (ifn == NI_LOCAL)
			continue;
		if (nif[ifn].ni_state != NIS_UP)
			continue;
		pif = &ospf_if[ifn];
		switch (pif->if_type) {
		case IFT_MULTI:
		case IFT_BROADCAST:
			if (pif->if_prio > 0) {
				pif->if_twait = pif->if_rdintv;
				pif->if_state = IFS_WAITING;
			} else
				pif->if_state = IFS_DROTHER;
			break;
		case IFT_PT2PT:
		case IFT_VIRTUAL:
			pif->if_state = IFS_PT2PT;
			break;
		default:
			break;
		}
	}

	while (1) {
		sleep10(HELLOINTV*10 + rnd);
		if (++rnd == OSPFDELTA)
			rnd = -OSPFDELTA;

		for (ifn=0; ifn<Net.nif; ++ifn) {
			if (ifn == NI_LOCAL)
				continue;
			if (nif[ifn].ni_state != NIS_UP)
				continue;
			ospf_hsend(ifn);
		}
	}
}

⌨️ 快捷键说明

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