ospf_hin.c

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

C
62
字号
/* ospf_hin.c - ospf_hin */

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

struct ospf_nb *nb_add(struct ospf_if *, struct ospf *);
int nb_switch(struct ospf_if *, struct ospf_nb *, struct ep *);


/*------------------------------------------------------------------------
 * ospf_hin - handled input of OSPF HELLO packets
 *------------------------------------------------------------------------
 */
void
ospf_hin(struct ep *pep)
{
	struct ospf_if		*pif = &ospf_if[pep->ep_ifn];
	struct ip		*pip;
	struct ospf_nb		*pnb;
	struct ospf		*po;
	struct ospf_hello	*poh;

	pip = (struct ip *)pep->ep_data;
	po = (struct ospf *)((char *)pip + IP_HLEN(pip));
	poh = (struct ospf_hello *)po->ospf_data;

	if (net2hs(poh->oh_hintv) != pif->if_hintv ||
	    net2hl(poh->oh_rdintv) != pif->if_rdintv)
		return;
	if (po->ospf_rid == pif->if_rid)
		return;		/* one of our own packets */

	pnb = nb_add(pif, po);
	if (pnb == 0)
		return;		/* neighbor list overflowed */
	pnb->nb_ipa = pip->ip_src;
	if (nb_switch(pif, pnb, pep) == 0)
		return;
	if (poh->oh_prio != pnb->nb_prio) {
		pif->if_event |= IFE_NCHNG;
		pnb->nb_prio = poh->oh_prio;
	}
	if (poh->oh_drid == pnb->nb_rid) {	/* Neighbor claims DR	*/
		if (poh->oh_brid == 0 && pif->if_state == IFS_WAITING)
			pif->if_event |= IFE_BSEEN;
		else if (pnb->nb_drid != pnb->nb_rid)
			pif->if_event |= IFE_NCHNG;
	} else if (pnb->nb_drid == pnb->nb_rid)
		pif->if_event |= IFE_NCHNG;
	pnb->nb_drid = poh->oh_drid;
	if (poh->oh_brid == pnb->nb_rid) {
		if (pif->if_state == IFS_WAITING)
			pif->if_event |= IFE_BSEEN;
		else if (pnb->nb_brid != pnb->nb_rid)
			pif->if_event |= IFE_NCHNG;
	} else if (pnb->nb_brid == pnb->nb_rid)
		pif->if_event |= IFE_NCHNG;
	pnb->nb_brid = poh->oh_brid;
}

⌨️ 快捷键说明

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