ospf_hin.c,v

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

C,V
153
字号
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.06.18.20.41;	author dls;	state Works;
branches;
next	1.1;

1.1
date	94.01.18.20.50.51;	author dls;	state Old;
branches;
next	;


desc
@@


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

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

/*------------------------------------------------------------------------
 * ospf_hin - handled input of OSPF HELLO packets
 *------------------------------------------------------------------------
 */
int
ospf_hin(pep)
struct ep	*pep;
{
	struct ospf_if		*pif = &ospf_if[pep->ep_ifn];
	struct ospf_nb		*pnb, *nb_add();
	struct ip		*pip;
	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;
}
@


1.2
log
@*** empty log message ***
@
text
@d26 2
a27 2
	if (poh->oh_hintv != pif->if_hintv ||
	    poh->oh_rdintv != pif->if_rdintv)
d35 1
a35 1
	blkcopy(pnb->nb_ipa, pip->ip_src, IP_ALEN);
@


1.1
log
@Initial revision
@
text
@a7 3
extern struct neighbor	nbtab[];
extern int		ospf_nlock;

d16 2
a20 1
	int			nn, freen;
d26 2
a27 1
	if (poh->oh_interval != HELLOINTV || poh->oh_dead != DEADINTV)
d29 1
a29 1
	if (po->ospf_rid == ospf_rid)
a30 1
	/* else, add to neighbor list */
d32 9
a40 9
	wait(ospf_nlock);
	freen = -1;
	for (nn=0; nn<MAXNBR; ++nn) {
		if (nbtab[nn].nb_state == NBS_DOWN) {
			freen = nn;
			continue;
		}
		if (nbtab[nn].nb_rid == po->ospf_rid)
			break;
d42 16
a57 9
	if (nn >= MAXNBR) {
		if (freen >= 0) {
			nbtab[freen].nb_rid = po->ospf_rid;
			nbtab[freen].nb_lastheard = DEADINTV;
			nbtab[freen].nb_state = NBS_INIT;
		}
	} else
		nbtab[nn].nb_lastheard = DEADINTV;
	signal(ospf_nlock);
@

⌨️ 快捷键说明

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