#

/* Copyright 1984 by the Massachusetts Institute of Technology */
/* See permission and disclaimer notice in file notice.h */
#include	"notice.h"

ext	unsw	mysystem;

struct egpngh {
	unsb	ng_state;
	unsb	ng_flags;
	inaddr	ng_myaddr;	/* My inet address for common net */
	inaddr	ng_addr;	/* Neighbor's inet address */
				/* Acquire and hello info */
	unss	ng_id;		/* Id last acquire or hello */
	unss	ng_retry;	/* For states ACQUIRE_SENT and CEASE_SENT,
				  No. retries to acquire or cease neighbor.
				  For NEIGHBOR state, no. consecutive times
					neighbor is unreachable */
	long	ng_hint;	/* Send acquire, hello or cease interval 
					in seconds */
	long	ng_htime;	/* Time for next acquire, hello, or cease */
	unsb	ng_hello;	/* No. hellos sent in hello interval */
	unsb	ng_heardme;	/* No. I heard yous to match hellos */
	unsb	ng_rhello;	/* No. hellos rcvd */
	unsb	ng_racq;	/* No. neigh. acquires rcvd */
				/* NR Poll info */
	unss	ng_spid;	/* Id next NR poll to send */
	unsw	ng_spint;	/* Send NR poll interval (in seconds) */
	unsb	ng_resnd;	/* No. resends of this NR poll id */
	unsb	ng_rercv;	/* No. unsolicited NR msgs for prev. id */
	long	ng_stime;	/* Time to send next NR poll */
	unss	ng_rpid;	/* Id last NR poll rcvd */
	unsb	ng_rpint;	/* Rcv NR poll interval (in minutes) */
	unsb	ng_repoll;	/* No. repolls before next NR poll time */
	long	ng_rtime;	/* Time to rcv next NR poll */
	};

#define egpng	struct egpngh

struct egpnn {
	unsb	egp_nnam[4];
	unsb	egp_ntype;	/* Core or not core gw */
	};

struct egpnet {
	unsb	egp_net[4];
	};

ext	unsw		nneigh;
ext	egpng		egpngh[];
ext	struct egpnn	egpnn[];
ext	unsw		nhop1;
ext	struct egpnet	egphop1[];

/* States */
#define EMPTY		0
#define UNACQUIRED	1
#define ACQUIRE_SENT	2
#define NEIGHBOR	3
#define CEASE_SENT	4
#define BAD		5

/* Flags */
#define COREGW		01
#define REACHABLE	02

/* Net unreachable value in NR packet */
#define NET_UNREACH	255		/* = 0377 */

/* Retry counts */
#define ACQTRY		20	/* No. acquire retransmits */
#define CEASETRY	5	/* No. cease retransmits */
#define NREPOLL		3	/* No. NR poll retransmits */

/* Acquire interval constants */
#define ACQINT1		30	/* Neigh. acquire interval when in state
					UNACQUIRED or ACQUIRE_SENT- seconds */
#define ACQINT2		(5*60)	/* Neigh. acquire interval after trying
					to acquire nghbr ACQTRY times or
					after being ceased - seconds */

/* Receive interval constants */
#define	RCVMINS		10	/* No. minutes betw. chk for rcv too many
				  neighbor acqs  or too many hellos */
#define NRACQ		40	/* Max. no. neighbor acqs allowed during
					RCVMINS minutes */
#define NRHELLO		50	/* Max. no. hellos allowed during
					RCVMINS */
#define	HELLOINT	30	/* My advertised hello interval - seconds */

/* Hello interval constants */
#define NHELLO		4	/* No. hellos to send before decide 
				whether neighbor is reachable */
#define NHEARD_R	3	/* No. I heard yous expected per NHELLOs
				sent to transition from unreachable to
				reachable */
#define NHEARD_UR	1	/* No. I heard yous expected per NHELLOs
				sent to transition from reachable to
				unreachable */
#define UNREACH		20	/* No. consecutive times neighbor is
				  unreachable before ceased */

/* Poll interval constants */
#define	POLLINT		1	/* My advertised poll interval - minutes */

/* Timeout on EGP routes */
#define EGP_RTE_TIMEOUT 100*60	/* 100 minutes */


/* Basic EGP packet */
#define egpkt	struct egppkt

egpkt	{	unsb	egp_ver;	/* Version # */
		unsb	egp_type;	/* Opcode */
		unsb	egp_code;
		unsb	egp_info;
		unss	egp_chksum;
		unss	egp_system;	/* Autonomous system */
		unss	egp_id;
		};

/* EGP neighbor acquisition packet */
struct egpacq	{
	egpkt	ea_pkt;
	unss	ea_hint;	/* Hello interval in seconds */
	unss	ea_pint;	/* NR poll interval in seconds */
	};

/* EGP NR poll packet */
struct egppoll	{
	egpkt	ep_pkt;
	unss	ep_bl1;
	unsb	ep_net[4];	/* Source net */
	};

/* EGP NR Message packet */
struct egpnr	{
	egpkt	en_pkt;
	unsb	en_igw;		/* No. internal gateways */
	unsb	en_egw;		/* No. external gateways */
	unsb	en_net[4];
	};

#define UFLAG	0200

/* EGP Error packet */
struct egperr	{
	egpkt	ee_pkt;
	unss	ee_rsn;
	unsb	ee_egphd[12];	/* First 12 bytes of bad egp pkt */
};

#define EGPLEN	(sizeof(egpkt))
#define EGPVER	2

/* EGP Types */
#define EGPNR		1
#define	EGPPOLL		2
#define EGPACQ		3
#define EGPHELLO	5
#define	EGPERR		8

/* Neighbor Acquisition Codes */
#define NAREQ	0	/* Neighbor acq. request */
#define NAREPLY	1	/* Neighbor acq. reply */
#define NAREFUS	2	/* Neighbor acq. refuse */
#define NACEASE	3	/* Neighbor cease */
#define NACACK	4	/* Neighbor cease ack */

/* Neighbor Hello Codes */
#define HELLO	0
#define HEARDU	1

/* Error Reasons */
#define ERR_UNSPEC	0
#define ERR_BADHDR	1
#define ERR_BADDATA	2
#define ERR_MAXPOLL	4
#define ERR_NORSP	5

#define CLAA 1
#define CLAB 2
#define CLAC 3
