x_ospf.c

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

C
177
字号
/* x_ospf.c - x_ospf */

#include <conf.h>
#include <kernel.h>
#include <network.h>
#ifdef OSPF
#include <ospf.h>
#endif /* OSPF */

char	str[120];

#ifdef OSPF
static	int	noarg(), aarg(), darg(), iarg(), narg();
#endif /* OSPF */

/*------------------------------------------------------------------------
 *  x_ospf  -  (command ospf) print ospf status information
 *------------------------------------------------------------------------
 */
COMMAND
x_ospf(int stdin, int stdout, int stderr, int nargs, char *args[])
{
#ifdef	OSPF
	if (nargs == 1)
		return noarg(stdout, stderr);
	if (nargs > 2 || *args[1] != '-') {
		write(stderr, "usage: ospf -[adin]\n", 19);
		return 1;
	}
	switch (args[1][1]) {
	case	'a':	return aarg(stdout, stderr);
	case	'd':	return darg(stdout, stderr);
	case	'i':	return iarg(stdout, stderr);
	case	'n':	return narg(stdout, stderr);
	default:
		write(stderr, "usage: ospf -[adin]\n", 19);
		return 1;
	}
#else	/* OSPF */
	write(stderr, "ospf: no OSPF support installed\n", 32);
#endif	/* OSPF */
}

#ifdef OSPF
static	int
noarg(int stdout, int stderr)
{
}

static	int
aarg(int stdout, int stderr)
{
	struct ospf_ar	*par = &ospf_ar[0];
	int		i;

	for (i=0; i<NAREA; ++i, ++par) {
		sprintf(str, "Area %d: authype %d", par->ar_id,
			par->ar_authtype);
		write(stdout, str, strlen(str));
		if (par->ar_authtype == AU_PASSWD) {
			sprintf(str, "password \"%s\"\n", par->ar_auth);
			write(stdout, str, strlen(str));
		} else
			putc(stdout, '\n');
	}
}

#define IH1 \
"ifn    State   Prio    RID      DRID     BRID\n"
#define IH2 \
"---- --------- ----  -------- -------- --------\n"
static char *ifsnames[] = { "DOWN", "LOOP", "WAITING", "PT2PT", "DROTHER", 
	"BACKUP", "DESIGNATE" };

static	int
iarg(int stdout, int stderr)
{
	struct ospf_if	*pif = &ospf_if[0];
	int		ifn;

	write(stdout, IH1, sizeof(IH1));
	write(stdout, IH2, sizeof(IH2));
	for (ifn=0; ifn<NIF; ++ifn, ++pif) {
		sprintf(str, "%4d %9s %4d", ifn,
			ifsnames[pif->if_state], pif->if_prio);
		write(stdout, str, strlen(str));
		if (pif->if_state != IFS_DOWN) {
			sprintf(str, "  %08X %08X %08X",
				net2hl(pif->if_rid),
				net2hl(pif->if_drid),
				net2hl(pif->if_brid));
			write (stdout, str, strlen(str));
		}
		putc(stdout, '\n');
	}
}

char	*nbsnames[] = { "DOWN", "ATTEMPT", "INIT", "TWOWAY", "EXSTART",
			"EXCHANGE", "LOADING", "FULL" };

#define	NH1 \
"Intf.    State  Sequence    RID     DRID      BRID     prio  opts timeleft\n"
#define NH2 \
"-----  -------- --------- -------- --------  --------  ----  ---- --------\n"

static	int
narg(int stdout, int stderr)
{
	char	ipa[16];	/* "XXX.XXX.XXX.XXX\0" */
	struct ospf_nb	*pnb;
	int	i, ifn;

	write(stdout, NH1, strlen(NH1));
	write(stdout, NH2, strlen(NH2));
	for (ifn=0; ifn<NIF; ++ifn) {
		struct ospf_if	*pif = &ospf_if[ifn];

		if (pif->if_state == IFS_DOWN)
			continue;
		pnb = &pif->if_nbtab[1];
		for (i=0; i<MAXNBR; ++i, ++pnb) {
			if (pnb->nb_state == NBS_DOWN)
				continue;
			sprintf(str,
			    "%4d %9s  %8X  %08X %08X  %08X %5d %c%c%c%11d\n",
			    ifn, nbsnames[pnb->nb_state], pnb->nb_seq,
			    net2hl(pnb->nb_rid), net2hl(pnb->nb_drid),
			    net2hl(pnb->nb_brid),
			    pnb->nb_prio, pnb->nb_opts & NBO_T ? 'T' : ' ',
			    pnb->nb_opts & NBO_E ? 'E' : ' ',
			    pnb->nb_master ? 'M' : ' ', pnb->nb_lastheard);
			write(stdout, str, strlen(str));
		}
	}
	return(OK);
}

#define	DBH1 \
"  LSID      RID    Type    Seq     Age\n"
#define	DBH2 \
"-------- --------  ---- --------  ----\n"

static int dbprint1();

static	int
darg(int stdout, int stderr)
{
	struct ospf_ar	*par;
	struct ospf_db	*pdb;
	int		arn;

	for (arn=0; arn<NAREA; ++arn) {
		par = &ospf_ar[arn];
		sprintf(str, "Area %d\n----------\n", arn);
		write(stdout, str, strlen(str));
		write(stdout, DBH1, sizeof(DBH1));
		write(stdout, DBH2, sizeof(DBH2));
		wait(par->ar_dbmutex);
		for (pdb=par->ar_dblhead; pdb; pdb=pdb->db_lnext)
			dbprint1(stdout, pdb);
		signal(par->ar_dbmutex);
		
	}
}

static int
dbprint1(int stdout, struct ospf_db *pdb)
{
	struct ospf_lsa	*plsa = &pdb->db_lsa;

	sprintf(str, "%08X %08X %4d  %08X %3d\n",
		net2hl(plsa->lsa_lsid), net2hl(plsa->lsa_rid), plsa->lsa_type,
		plsa->lsa_seq, net2hs(plsa->lsa_age));
	write(stdout, str, strlen(str));
}
#endif	/* OSPF */

⌨️ 快捷键说明

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