ftp.nice.ch/pub/next/unix/network/system/gated.2.1pl2.NI.bs.tar.gz#/gated-2.1/src/egp.h

This is egp.h in view mode; [Download] [Up]

/*
 * $Header: /disk/d/src/devel/gated/dist/src/RCS/egp.h,v 2.1 92/02/24 14:12:30 jch Exp $
 */

/*%Copyright%*/
/************************************************************************
*									*
*	GateD, Release 2						*
*									*
*	Copyright (c) 1990,1991,1992 by Cornell University		*
*	    All rights reserved.					*
*									*
*	THIS SOFTWARE IS PROVIDED "AS IS" AND WITHOUT ANY		*
*	EXPRESS OR IMPLIED WARRANTIES, INCLUDING, WITHOUT		*
*	LIMITATION, THE IMPLIED WARRANTIES OF MERCHANTABILITY		*
*	AND FITNESS FOR A PARTICULAR PURPOSE.				*
*									*
*	Royalty-free licenses to redistribute GateD Release		*
*	2 in whole or in part may be obtained by writing to:		*
*									*
*	    GateDaemon Project						*
*	    Information Technologies/Network Resources			*
*	    143 Caldwell Hall						*
*	    Cornell University						*
*	    Ithaca, NY 14853-2602					*
*									*
*	GateD is based on Kirton's EGP, UC Berkeley's routing		*
*	daemon	 (routed), and DCN's HELLO routing Protocol.		*
*	Development of Release 2 has been supported by the		*
*	National Science Foundation.					*
*									*
*	Please forward bug fixes, enhancements and questions to the	*
*	gated mailing list: gated-people@gated.cornell.edu.		*
*									*
*	Authors:							*
*									*
*		Jeffrey C Honig <jch@gated.cornell.edu>			*
*		Scott W Brim <swb@gated.cornell.edu>			*
*									*
*************************************************************************
*									*
*      Portions of this software may fall under the following		*
*      copyrights:							*
*									*
*	Copyright (c) 1988 Regents of the University of California.	*
*	All rights reserved.						*
*									*
*	Redistribution and use in source and binary forms are		*
*	permitted provided that the above copyright notice and		*
*	this paragraph are duplicated in all such forms and that	*
*	any documentation, advertising materials, and other		*
*	materials related to such distribution and use			*
*	acknowledge that the software was developed by the		*
*	University of California, Berkeley.  The name of the		*
*	University may not be used to endorse or promote		*
*	products derived from this software without specific		*
*	prior written permission.  THIS SOFTWARE IS PROVIDED		*
*	``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES,	*
*	INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF	*
*	MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.		*
*									*
************************************************************************/


#ifdef	PROTO_EGP
#include "egp_param.h"

#define EGP_N_POLLAGE	3		/* minimum number of poll intervals before a route is deleted when not updated */

#define	EGP_LIMIT_PKTSIZE	1024, IP_MAXPACKET - sizeof (struct ip)

/*
 *	EGP Polling rate structure.
 */
struct egp_rate {
    time_t rate_min;
    time_t rate_last;
    time_t rate_window[RATE_WINDOW];
};


/*
 *	EGP stats definition
 */
struct egpstats_t {
    u_int inmsgs;
    u_int inerrors;
    u_int outmsgs;
    u_int outerrors;
    u_int inerrmsgs;
    u_int outerrmsgs;
    u_int stateups;
    u_int statedowns;
    int trigger;
};


/*
 * Structure egpngh stores state information for an EGP neighbor. There is
 * one such structure allocated at initialization for each of the trusted EGP
 * neighbors read from the initialization file. The egpngh structures are in a
 * singly linked list pointed to by external variable "egp_neighbor_head".
 * The major states of a neighbor are IDLE, ACQUIRED, DOWN, UP and CEASE.
 */


struct egpngh {
    struct egpngh *ng_next;		/* next state table of linked list */
    char ng_name[16];			/* Printable address of this neighbor */

    /* Status */
    int ng_state;			/* Current state of protocol */
    flag_t ng_flags;
    u_int ng_status;			/* Info saved for cease retransmission */

    /* Variables */
    u_short ng_R;			/* receive sequence number */
    u_short ng_S;			/* send sequence number */
    time_t ng_T1;			/* interval between Hello command retransmissions */
    time_t ng_T2;			/* interval between Poll command retransmissions */
    time_t ng_T3;			/* interval during which neighbor-reachibility indications are counted */
    time_t ng_P1;			/* Minimum interval acceptable between successive Hello commands received */
    time_t ng_P2;			/* Minimum interval acceptable between successive Poll commands received */
    int ng_M;				/* hello polling mode */
    int ng_j;				/* neighbor-up threshold */
    int ng_k;				/* neighbor-down threshold */
    int ng_V;				/* EGP version we speak */

    /* Polling info */
    struct egp_rate ng_poll_rate;	/* Polling rate */
    struct egp_rate ng_hello_rate;	/* Hello rate */
    u_int ng_R_lastpoll;		/* sequence number of last poll */
    u_short ng_S_lasthello;		/* sequence number of last hello sent */
    int ng_noupdate;			/* # successive polls (new id) which did not receive a valid update */

    /* Tasks and timers */
    task *ng_task;			/* Task for this peer */

    /* Addresses */
    struct sockaddr_in ng_gateway;	/* Address of local gateway */
    if_entry *ng_interface;		/* Pointer to Interface for sending packets */
    gw_entry ng_gw;			/* gw_entry for this peer */
#define	ng_addr		ng_gw.gw_addr.in
#define	ng_accept	ng_gw.gw_accept
#define	ng_propagate	ng_gw.gw_propagate
#define	ng_time		ng_gw.gw_time

    struct sockaddr_in ng_paddr;	/* Last address he polled */
    struct sockaddr_in ng_saddr;	/* Address I should poll */

    /* Neighbor Reachability Info */
    int ng_responses;			/* Shift register of responses for determining
				        reachability, each set bit corresponds to a
				        response, each zero to no response */

    /* Configured info */
    time_t ng_rtage;			/* Maximum age of these routes */
    flag_t ng_options;			/* Option flags */
    as_t ng_asin;			/* AS number our neighbor should have */
    as_t ng_asout;			/* AS number we should tell our neighbor */
    metric_t ng_defaultmetric;		/* Metric to use for default */
    u_short ng_version;			/* Configuration specified version */
    metric_t ng_metricout;		/* Metric to use for all outgoing nets */
    pref_t ng_preference;		/* Preference */

    /* Max acquire info */
    struct egpngh *ng_gr_head;		/* Pointer to head of group */
    u_short ng_gr_acquire;		/* Maximum neighbors to acquire in this group */
    u_short ng_gr_number;		/* Number of neighbors in this group */
    u_short ng_gr_index;		/* Group number */

    /* Statistics */
    struct egpstats_t ng_stats;		/* Statistic structre */
};

/* Timers */
#define	EGP_TIMER_t1	0		/* timer t1 (user to control Request, Hello and Cease command retransmissions) */
#define	EGP_TIMER_t2	1		/* timer t2 (used to control Poll command retransmissions) */
#define	EGP_TIMER_t3	2		/* timer 3 (abort timer) */

/* States */
#define NGS_IDLE		0
#define NGS_ACQUISITION		1
#define NGS_DOWN		2
#define NGS_UP			3
#define NGS_CEASE		4

/* flags */
#define	NGF_SENT_UNSOL		0x01	/* An unsolicited update has been sent since we were polled */
#define	NGF_SENT_POLL		0x02	/* A Poll has been sent, an update is outstanding */
#define	NGF_SENT_REPOLL		0x04	/* A rePoll has been sent, an update is outstanding */
#define	NGF_RECV_REPOLL		0x08	/* An rePoll has been received on this id */
#define	NGF_RECV_UNSOL		0x10	/* An unsolicited update has been received since we sent a poll */
#define	NGF_PROC_POLL		0x20	/* A Poll is being processed, don't send an unsolicited if we transition to Up */
#define	NGF_DELETE		0x40	/* Delete after re-init should be cleared by parser */
#define	NGF_WAIT		0x80	/* Waiting for deleted neighbor to start us */
#define	NGF_GENDEFAULT		0x100	/* Default generation has been requested */

/* Options */
#define NGO_METRICOUT		0x01	/* Use and outbound metric */
#define NGO_ASIN		0x02	/* Verify inbound AS number */
#define NGO_ASOUT		0x04	/* Use this outbound AS number */
#define NGO_NOGENDEFAULT	0x08	/* Don't consider this neighbor for default generation */
#define NGO_DEFAULTIN		0x10	/* Allow default in an NG packet */
#define NGO_DEFAULTOUT		0x20	/* Send DEFAULT net to this neighbor */
#define	NGO_INTERFACE		0x40	/* Interface was specified */
#define	NGO_SADDR		0x80	/* IP Source Network was specified */
#define	NGO_GATEWAY		0x0100	/* Address of local gateway to Source Network */
#define	NGO_MAXACQUIRE		0x0200	/* Maxacquire for this group */
#define	NGO_VERSION		0x0400	/* EGP version number to use initially */
#define	NGO_PREFERENCE		0x0800	/* Preference for this AS */
#define	NGO_P1			0x1000	/* P1 was specified */
#define	NGO_P2			0x2000	/* P2 was specified */

/* Basic EGP packet */

struct egppkt {
    u_char egp_ver;			/* Version # */
    u_char egp_type;			/* Opcode */
    u_char egp_code;
    u_char egp_status;
    u_short egp_chksum;
    as_t egp_system;			/* Autonomous system */
    u_short egp_id;
};


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

/* EGP NR poll packet */
struct egppoll {
    struct egppkt ep_pkt;
    u_short ep_unused;
    struct in_addr ep_net;		/* Source net */
};

/* EGP NR Message packet */
struct egpnr {
    struct egppkt en_pkt;
    u_char en_igw;			/* No. internal gateways */
    u_char en_egw;			/* No. external gateways */
    struct in_addr en_net;		/* shared net */
};

#define NRMAXNETUNIT 9			/* maximum size per net in octets of net part
																		       of NR message */
/* EGP Error packet */
struct egperr {
    struct egppkt ee_pkt;
    u_short ee_rsn;
    u_char ee_egphd[12];		/* First 12 bytes of bad egp pkt */
};

#define EGPVER	2
#define	EGPVERDEFAULT	2
#define	EGPVMASK	0x03		/* We speak version 2 and sometime version 3 */

/* 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 NACONF	1			/* Neighbor acq. confirmation */
#define NAREFUS	2			/* Neighbor acq. refuse */
#define NACEASE	3			/* Neighbor cease */
#define NACACK	4			/* Neighbor cease ack */

/* Neighbor Acquisition Message Status Info */
#define UNSPEC		0
#define	ACTIVE		1
#define	PASSIVE		2
#define	NORESOURCE	3
#define	ADMINPROHIB	4
#define	GODOWN		5
#define	PARAMPROB	6
#define	PROTOVIOL	7

/* Neighbor Hello Codes */
#define neighHello	0
#define neighHeardU	1

/* Reachability, poll and update status */
#define INDETERMINATE	0
#define UP		1
#define DOWN		2
#define UNSOLICITED   128

/* Error reason status */
#define	EUNSPEC		0
#define EBADHEAD	1
#define	EBADDATA	2
#define ENOREACH	3
#define	EXSPOLL		4
#define ENORESPONSE	5
#define	EUVERSION	6
#define	EMAXERR		EUVERSION


extern struct egpstats_t egp_stats;

#ifdef	USE_PROTOTYPES
extern void egp_init(void);
extern void egp_reinit(void);
extern void egp_dump(FILE * fd);
extern void egp_recv(task * tp);
extern void egp_event_t1(timer * tip, time_t interval);
extern void egp_event_t2(timer * tip, time_t interval);
extern void egp_event_t3(timer * tip, time_t interval);
extern void egp_event_stop(struct egpngh * ngp, u_int status);
extern void egp_event_start(task * tp);
extern void egp_event_delete(struct egpngh * ngp);

extern int egp_rt_recv(struct egpngh * ngp, struct egppkt * pkt, int egplen);
extern int egp_rt_send(struct egpnr * nrpkt, struct egpngh * ngp);
extern int egp_neighbor_changed(struct egpngh * ngpo, struct egpngh * ngpn);

#else				/* USE_PROTOTYPES */
extern void egp_init();
extern void egp_reinit();
extern void egp_dump();
extern void egp_recv();
extern void egp_event_t1();
extern void egp_event_t2();
extern void egp_event_t3();
extern void egp_event_stop();
extern void egp_event_start();
extern void egp_event_delete();

extern int egp_rt_recv();
extern int egp_rt_send();
extern int egp_neighbor_changed();

#endif				/* USE_PROTOTYPES */

#define	egp_clear_timer(tp) egp_set_timer(tp, (time_t)0)

extern bits egp_states[];
extern bits egp_flags[];
extern bits egp_options[];

extern u_int egp_reachability[];	/* Number of bits in a given state of
				           the reachability register */

extern const char *egp_acq_codes[];	/* Acquisition packet types */
extern const char *egp_reach_codes[];	/* Reachability codes */
extern const char *egp_nr_status[];	/* Network reachability states */
extern const char *egp_acq_status[];	/* Acquisition packet codes */
extern const char *egp_reasons[];	/* Error code reasons */

extern int egp_neighbors;		/* number of egp neighbors */
extern struct egpngh *egp_neighbor_head;/* start of linked list of egp neighbor state tables */

#if	defined(AGENT_SNMP)
extern void egp_sort_neighbors();
extern struct egpngh **egp_sort;	/* Sorted list of pointers to neighbors */

#endif				/* defined(AGENT_SNMP) */

extern u_short egprid_h;		/* sequence number of received egp packet
				           in host byte order - all ids in internal
				           tables are in host byte order */
extern int doing_egp;			/* Are we running EGP protocols? */
extern int egp_pktsize;			/* Maximum packet size */
extern pref_t egp_preference;		/* Preference for EGP routes */
extern metric_t egp_default_metric;	/* default EGP metric */
extern adv_entry *egp_accept_list;	/* List of EGP advise entries */
extern adv_entry *egp_propagate_list;	/* List of EGP propagate entries */

#define	EGP_LIST(ngp)	for (ngp = egp_neighbor_head; ngp; ngp = ngp->ng_next)
#define	EGP_LISTEND

#endif				/* PROTO_EGP */

These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.