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

📄 lss_build.c,v

📁 TCP-IP红宝书源代码
💻 C,V
字号:
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.26.19.50.44;	author dls;	state Works;
branches;
next	1.1;

1.1
date	94.02.20.18.59.56;	author dls;	state Works;
branches;
next	;


desc
@@


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

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

#define LSS_ABORT(par, pnb, pep) { \
		signal(par->ar_dbmutex);	\
		if (pep)			\
			freebuf(pep);		\
		pnb->nb_state = NBS_2WAY;	\
		nb_clearl(pnb);	}

/*------------------------------------------------------------------------
 *  lss_build - build link-state summaries for DD packets
 *------------------------------------------------------------------------
 */
int lss_build(pif, pnb, pep)
struct ospf_if	*pif;
struct ospf_nb	*pnb;
struct ep	*pep;
{
	struct ospf_ar	*par = pif->if_area;
	struct ip	*pip = (struct ip *)pep->ep_data;
	struct ospf	*po = (struct ospf *)pip->ip_data;
	struct ospf_dd	*pdd = (struct ospf_dd *)po->ospf_data;
	struct ospf_db	*pdb;
	struct ospf_lss	*plss;
	struct ep	*ospfddtmpl();
	int		nls, ifn, maxlspp;

	ifn = pif - &ospf_if[0];
	maxlspp = (nif[ifn].ni_mtu - IPMHLEN - MINDDLEN) / LSSHDRLEN;
	wait(par->ar_dbmutex);
	nls = 0;
	for (pdb = par->ar_dblhead; pdb; pdb = pdb->db_lnext) {
kprintf("lss_build, pdb %X\n", pdb);
		if (nls >= maxlspp) {
			pdd->dd_control = DDC_MORE;
			if (pnb->nb_master)
				pdd->dd_control |= DDC_MSTR;
			if (enq(pnb->nb_dsl, pep, 0) < 0) {
				LSS_ABORT(par, pnb, pep);
				return;
			}
			pep = ospfddtmpl(pif);
			if (pep == 0) {
				LSS_ABORT(par, pnb, pep);
				return;
			}
			pip = (struct ip *)pep->ep_data;
			po = (struct ospf *)pip->ip_data;
			pdd = (struct ospf_dd *)po->ospf_data;
			nls = 0;
		}
		plss = &pdd->dd_lss[nls];
		blkcopy(plss, &pdb->db_lsa.lsa_lss, LSSHDRLEN);
		plss->lss_age = hs2net(plss->lss_age);
		plss->lss_seq = hl2net(plss->lss_seq);
		plss->lss_len = hs2net(plss->lss_len);
		po->ospf_len += LSSHDRLEN;
		++nls;
	}
	pdd->dd_control = 0;
	if (pnb->nb_master)
		pdd->dd_control |= DDC_MSTR;
	if (enq(pnb->nb_dsl, pep, 0) < 0) {
		LSS_ABORT(par, pnb, pep);
		return;
	}
	signal(par->ar_dbmutex);
}
@


1.2
log
@*** empty log message ***
@
text
@d8 1
a8 1
#define LSS_ABORT(par, pnb, pep) \
d13 1
a13 1
		nb_clearl(pnb);
d24 7
a30 6
	struct	ospf_ar	*par = pif->if_area;
	struct	ip	*pip = (struct ip *)pep->ep_data;
	struct	ospf	*po = (struct ospf *)pip->ip_data;
	struct	ospf_dd	*pdd = (struct ospf_dd *)po->ospf_data;
	struct	ospf_db	*pdb;
	struct	ep	*ospfddtmpl();
a32 1

d38 2
a39 1
		if (++nls >= maxlspp) {
d57 7
d68 1
a68 1
	if (enq(pnb->nb_dsl, pep, 0) < 0)
d70 2
@


1.1
log
@Initial revision
@
text
@a31 1
kprintf("lss_build\n");
a33 1
kprintf("ifn %d\n", ifn);
a34 1
kprintf("maxlspp %d\n", maxlspp);
d37 1
a37 1
	for (pdb = par->ar_dbhead; pdb; pdb = pdb->db_next) {
a42 1
kprintf("ABORT1, enq(%d, %X)\n", pnb->nb_dsl, pep);
a47 1
kprintf("ABORT2, pep=0\n");
a60 2
{
kprintf("ABORT3, enq(%d, %X)\n", pnb->nb_dsl, pep);
a61 1
}
@

⌨️ 快捷键说明

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