/* Copyright 1984 by the Massachusetts Institute of Technology */

/* IN GGP and ICMP packet formats.
 */

#define	ggpkt	struct	ggppkt

ggpkt	{	unsb	ggp_type;	/* Opcode */
		unsb	ggp_code;	/* Only for DUR */
		unss	ggp_seqno;	/* Only for RU, ACKs */
/*		byte	ggp_data[];	/* For DUR, SQ, old hdr; rest below  */
		};


/* GGP type codes */

#define	GGPRPLY	0		/* Echo reply */
#define	GGPRU	1		/* Routing update */
#define	GGPACK	2		/* Routing update acknowledge */
#define	GGPDUR	3		/* Destination unreachable */
#define	GGPSQ	4		/* Source quench */
#define	GGPRDR	5		/* Redirect */
#define	GGPECHO	8		/* Echo */
#define	GGPNIST	9		/* Interface status test message */
#define	GGPNACK	10		/* RU negative acknowledge */
#define	GGPNRU	12		/* New style routing update */


/* Data formats for old and new routing updates and redirect messages 

struct	ggprue	{	unsb	ru_net;		/* Net number
			unsb	ru_hopc;	/* Distance to net
		};

struct	ggpru	{	unsb	ru_nents;	/* Number of entries
			struct	ggprue	ru_rents[];
		};

#define	GGPNDU	0200		/* Need update flag in ru_nents
#define	GGPNEM	0177		/* Mask to get no of entries


struct	ggpnrue	{	unsb	nru_dist;	/* No of hops for dist grp
			unsb	nru_nnets;	/* No of nets in dist grp
			inaddr	nru_nets[];	/* Net numbers
		};

struct	ggpnru	{	byte	nru_nuflg;	/* Need update flag
			unsb	nru_ndsts;	/* Number of distance groups
			struct	ggpnrue	nru_rents[];
		};				   above not used */


struct	ggprdr	{	inaddr	rdr_gate;	/* GW to redirect packets to */
			inpkt	rdr_pkt;	/* Hdr of old packet */
		};


#define	icmpkt	struct	icmppkt

icmpkt	{	unsb	icmp_type;	 	/* Opcode */
		unsb	icmp_code;		/* Subtype */
		unss	icmp_cksum;		/* Checksum */
		byte	icmp_data[4];		/* Defined below */
		};



/* ICMP type codes */

#define	ICMPRPLY	0	/* Echo reply */
#define	ICMPDUR		3	/* Destination unreachable */
#define	ICMPSQ		4	/* Source quench */
#define	ICMPRDR		5	/* Redirect */
#define	ICMPRDRHOST	1	/* Redirect to host subcode */
#define	ICMPECHO	8	/* Echo */
#define	ICMPTTLE	11	/* Time-to-live exceeded */
#define	ICMPPARM	12	/* Parameter problem */
#define	ICMPTSTMP	13	/* Timestamp */
#define	ICMPTRPLY	14	/* Timestamp reply */
#define	ICMPIRQ		15	/* Information request */
#define	ICMPIPRLY	16	/* Information request reply */

/* Destination unreachable codes */
#define ICMPUNET	0	/* Net unreachable *
#define ICMPUHOST	1	/* Host unreachable */
#define ICMPUPROT	2	/* Protocol unreachable */
#define ICMPUPORT	3	/* Port unreachable */
#define ICMPUFRAG	4	/* Fragmentation needed */
#define ICMPUSR		5	/* Source route failed */

/* TTL exceeded codes */
#define ICMPTTTLE        0       /* TTL exceeded in transit */
#define ICMPTFRGE        1       /* Fragment reassembly TTL execeeded */

#define	ICMPORTLEN	8	/* bytes of port info passed by ICMP */

/* Data formats for echo, redirect and unreachable messages */

struct	icmpech	{	unss	ec_id;		/* identifier */
			unss	ec_seq;		/* sequence number */
		};

struct	icmprdr	{	inaddr	rdr_gate;	/* GW to redirect packets to */
			inpkt	rdr_pkt;	/* Hdr of old packet */
		};

struct icmpdur	{	long	dur_blank;
			inpkt	dur_pkt;	/* Hdr of old packet */
		};

/* Data format for TTL expired message */

struct icmpttle {       long    unused;         /* unused */
			long    ttl_pkt;        /* header of old packet */
  	         };
               
