xref: /csrg-svn/sys/deprecated/netimp/if_imp.h (revision 33427)
123167Smckusick /*
229080Smckusick  * Copyright (c) 1982, 1986 Regents of the University of California.
323167Smckusick  * All rights reserved.  The Berkeley software License Agreement
423167Smckusick  * specifies the terms and conditions for redistribution.
523167Smckusick  *
6*33427Skarels  *	@(#)if_imp.h	7.2 (Berkeley) 02/03/88
723167Smckusick  */
85686Ssam 
95686Ssam /*
105686Ssam  * Structure of IMP 1822 long leader.
115686Ssam  */
125772Swnj struct control_leader {
13*33427Skarels 	u_char	dl_format;	/* 1-8   leader format */
14*33427Skarels 	u_char	dl_network;	/* 9-16  src/dest network */
15*33427Skarels 	u_char	dl_flags;	/* 17-24 leader flags */
16*33427Skarels 	u_char	dl_mtype;	/* 25-32 message type */
17*33427Skarels 	u_char	dl_htype;	/* 33-40 handling type */
18*33427Skarels 	u_char	dl_host;	/* 41-48 host number */
19*33427Skarels 	u_short	dl_imp;		/* 49-64 imp field */
20*33427Skarels 	u_char	dl_link;	/* 65-72 link number */
21*33427Skarels 	u_char	dl_subtype;	/* 73-80 message subtype */
225772Swnj };
235772Swnj 
245686Ssam struct imp_leader {
255772Swnj 	struct	control_leader il_dl;
265772Swnj #define	il_format	il_dl.dl_format
275772Swnj #define	il_network	il_dl.dl_network
285772Swnj #define	il_flags	il_dl.dl_flags
295772Swnj #define	il_mtype	il_dl.dl_mtype
305772Swnj #define	il_htype	il_dl.dl_htype
315772Swnj #define	il_host		il_dl.dl_host
325772Swnj #define	il_imp		il_dl.dl_imp
335772Swnj #define	il_link		il_dl.dl_link
345772Swnj #define	il_subtype	il_dl.dl_subtype
355686Ssam 	u_short	il_length;	/* message length */
365686Ssam };
375686Ssam 
38*33427Skarels #define	IMP_NOOPCNT	3	/* # of noops to send imp on reset */
396270Sroot /* insure things are even... */
406270Sroot #define	IMPMTU		((8159 / NBBY) & ~01)
41*33427Skarels #define	IMP_RCVBUF	((8159 / NBBY + 2) & ~01)
425686Ssam 
435686Ssam /*
445686Ssam  * IMP-host flags
455686Ssam  */
465686Ssam #define	IMP_NFF		0xf	/* 96-bit (new) format */
475686Ssam #define	IMP_TRACE	0x8	/* trace message route */
485686Ssam 
495686Ssam /*
505686Ssam  * IMP-host message types.
515686Ssam  */
525686Ssam #define	IMPTYPE_DATA		0	/* data for protocol */
535686Ssam #define	IMPTYPE_BADLEADER	1	/* leader error */
545686Ssam #define	IMPTYPE_DOWN		2	/* imp going down */
555686Ssam #define	IMPTYPE_NOOP		4	/* noop seen during initialization */
565686Ssam #define	IMPTYPE_RFNM		5	/* request for new messages */
575686Ssam #define	IMPTYPE_HOSTDEAD	6	/* host doesn't respond */
585686Ssam #define	IMPTYPE_HOSTUNREACH	7	/* host unreachable */
595686Ssam #define	IMPTYPE_BADDATA		8	/* data error */
605686Ssam #define	IMPTYPE_INCOMPLETE	9	/* incomplete message, send rest */
615686Ssam #define	IMPTYPE_RESET		10	/* reset complete */
625686Ssam /* non-blocking IMP interface */
635686Ssam #define	IMPTYPE_RETRY		11	/* IMP refused, try again */
645686Ssam #define	IMPTYPE_NOTIFY		12	/* IMP refused, will notify */
655686Ssam #define	IMPTYPE_TRYING		13	/* IMP refused, still rexmt'ng */
665686Ssam #define	IMPTYPE_READY		14	/* ready for next message */
675686Ssam 
685686Ssam /*
69*33427Skarels  * IMPTYPE_DOWN subtypes, in link number field.
705686Ssam  */
71*33427Skarels #define	IMP_DMASK		0x3	/* host going down mask */
725686Ssam #define	IMPDOWN_GOING		0	/* 30 secs */
735686Ssam #define	IMPDOWN_PM		1	/* hardware PM */
745686Ssam #define	IMPDOWN_RELOAD		2	/* software reload */
755686Ssam #define	IMPDOWN_RESTART		3	/* emergency restart */
76*33427Skarels #define	IMPDOWN_WHENMASK	0x3c	/* mask for "how soon" */
77*33427Skarels #define	IMPDOWN_WHENSHIFT	2	/* shift for "how soon" */
78*33427Skarels #define	IMPDOWN_WHENUNIT	5	/* unit for "how soon", 5 min. */
795686Ssam 
80*33427Skarels #define	IMPTV_DOWN	30		/* going down timer 30 secs */
81*33427Skarels 
82*33427Skarels #ifdef IMPMESSAGES
835686Ssam /*
84*33427Skarels  * Messages from IMP regarding why
85*33427Skarels  * it's going down.
86*33427Skarels  */
87*33427Skarels char *impmessage[] = {
88*33427Skarels 	"in 30 seconds",
89*33427Skarels 	"for hardware PM",
90*33427Skarels 	"to reload software",
91*33427Skarels 	"for emergency reset"
92*33427Skarels };
93*33427Skarels #endif
94*33427Skarels 
95*33427Skarels /*
965686Ssam  * IMPTYPE_BADLEADER subtypes.
975686Ssam  */
985686Ssam #define	IMPLEADER_ERR		0	/* error flip-flop set */
995686Ssam #define	IMPLEADER_SHORT		1	/* leader < 80 bits */
1005686Ssam #define	IMPLEADER_TYPE		2	/* illegal type field */
1015686Ssam #define	IMPLEADER_OPPOSITE	3	/* opposite leader type */
1025686Ssam 
1035686Ssam /*
1045686Ssam  * IMPTYPE_HOSTDEAD subtypes.
1055686Ssam  */
1065686Ssam #define	IMPHOST_NORDY		1	/* ready-line negated */
1075686Ssam #define	IMPHOST_TARDY		2	/* tardy receiving mesgs */
1085686Ssam #define	IMPHOST_NOEXIST		3	/* NCC doesn't know host */
1095686Ssam #define	IMPHOST_IMPSOFT		4	/* IMP software won't allow mesgs */
1105686Ssam #define	IMPHOST_PM		5	/* host down for scheduled PM */
1115686Ssam #define	IMPHOST_HARDSCHED	6	/* " " " " hardware work */
1125686Ssam #define	IMPHOST_SOFTSCHED	7	/* " " " " software work */
1135686Ssam #define	IMPHOST_RESTART		8	/* host down for emergency restart */
1145686Ssam #define	IMPHOST_POWER		9	/* down because of power outage */
1155686Ssam #define	IMPHOST_BREAKPOINT	10	/* host stopped at a breakpoint */
1165686Ssam #define	IMPHOST_HARDWARE	11	/* hardware failure */
1175686Ssam #define	IMPHOST_NOTUP		12	/* host not scheduled to be up */
1185686Ssam /* 13-14 currently unused */
1195686Ssam #define	IMPHOST_COMINGUP	15	/* host in process of coming up */
1205686Ssam 
1215686Ssam /*
1225686Ssam  * IMPTYPE_HOSTUNREACH subtypes.
1235686Ssam  */
1245686Ssam #define	IMPREACH_IMP		0	/* destination IMP can't be reached */
1255686Ssam #define	IMPREACH_HOSTUP		1	/* destination host isn't up */
1265686Ssam #define	IMPREACH_LEADER		2	/* host doesn't support long leader */
1275686Ssam #define	IMPREACH_PROHIBITED	3	/* communication is prohibited */
1285686Ssam 
1295686Ssam /*
1305686Ssam  * IMPTYPE_INCOMPLETE subtypes.
1315686Ssam  */
1325686Ssam #define	IMPCOMPLETE_SLOW	0	/* host didn't take data fast enough */
1335686Ssam #define	IMPCOMPLETE_TOOLONG	1	/* message was too long */
1345686Ssam #define	IMPCOMPLETE_TIMEOUT	2	/* mesg transmission time > 15 sec. */
1355686Ssam #define	IMPCOMPLETE_FAILURE	3	/* IMP/circuit failure */
1365686Ssam #define	IMPCOMPLETE_NOSPACE	4	/* no resources within 15 sec. */
1375686Ssam #define	IMPCOMPLETE_IMPIO	5	/* src IMP I/O failure during receipt */
1385686Ssam 
1395686Ssam /*
1405686Ssam  * IMPTYPE_RETRY subtypes.
1415686Ssam  */
1425686Ssam #define	IMPRETRY_BUFFER		0	/* IMP buffer wasn't available */
1435686Ssam #define	IMPRETRY_BLOCK		1	/* connection block unavailable */
1445686Ssam 
145*33427Skarels #define	RFNMTIMER	(120*PR_SLOWHZ)	/* time to wait for RFNM for msg. */
1465686Ssam /*
1475686Ssam  * Data structure shared between IMP protocol module and hardware
1485686Ssam  * interface driver.  Used to allow layering of IMP routines on top
149*33427Skarels  * of varying device drivers.
1505686Ssam  */
1515922Ssam struct impcb {
152*33427Skarels 	int	ic_hwunit;		/* H/W unit number */
153*33427Skarels 	char	*ic_hwname;		/* H/W type name */
1545686Ssam 	char	ic_oactive;		/* output in progress */
1555686Ssam 	int	(*ic_init)();		/* hardware init routine */
1565686Ssam 	int	(*ic_start)();		/* hardware start output routine */
157*33427Skarels 	int	(*ic_stop)();		/* hardware "drop ready" routine */
1585686Ssam };
1595686Ssam 
1605686Ssam /*
161*33427Skarels  * IMP software status per interface.
162*33427Skarels  * (partially shared with the hardware specific module)
163*33427Skarels  *
164*33427Skarels  * Each interface is referenced by a network interface structure,
165*33427Skarels  * imp_if, which the routing code uses to locate the interface.
166*33427Skarels  * This structure contains the output queue for the interface, its
167*33427Skarels  * address, ...  IMP specific structures used in connecting the
168*33427Skarels  * IMP software modules to the hardware specific interface routines
169*33427Skarels  * are stored here.  The common structures are made visible to the
170*33427Skarels  * interface driver by passing a pointer to the hardware routine
171*33427Skarels  * at "attach" time.
172*33427Skarels  */
173*33427Skarels struct imp_softc {
174*33427Skarels 	struct	ifnet imp_if;		/* network visible interface */
175*33427Skarels 	struct	impcb imp_cb;		/* hooks to hardware module */
176*33427Skarels 	int	imp_state;		/* current state of IMP */
177*33427Skarels 	int	imp_dropcnt;		/* used during initialization */
178*33427Skarels 	u_long	imp_lostrfnm;		/* rfnm's timed out */
179*33427Skarels 	u_long	imp_badrfnm;		/* rfnm/incompl after timeout/bogus */
180*33427Skarels 	u_long	imp_incomplete;		/* incomplete's received */
181*33427Skarels 	u_long	imp_garbage;		/* bad messages received */
182*33427Skarels };
183*33427Skarels struct	imp_softc *impattach();
184*33427Skarels 
185*33427Skarels /*
1865686Ssam  * State of an IMP.
1875686Ssam  */
188*33427Skarels #define	IMPS_DOWN	0		/* unavailable, host not ready */
189*33427Skarels #define	IMPS_WINIT	1		/* imp not ready, waiting for init */
1905686Ssam #define	IMPS_INIT	2		/* coming up */
1915686Ssam #define	IMPS_UP		3		/* ready to go */
192*33427Skarels #define	IMPS_GOINGDOWN	4		/* been told we go down soon */
1935686Ssam 
194*33427Skarels #define	IMPS_RUNNING(s)	((s) >= IMPS_UP)	/* ready for messages */
195*33427Skarels #define	IMPS_IMPREADY(s) ((s) >= IMPS_INIT)	/* IMP ready line on */
1965772Swnj 
1975772Swnj #ifdef IMPLEADERS
1985922Ssam char *impleaders[IMPTYPE_READY+1] = {
1995772Swnj 	"DATA", "BADLEADER", "DOWN", "bad", "NOOP", "RFNM", "HOSTDEAD",
2005772Swnj 	"HOSTUNREACH", "BADDATA", "INCOMPLETE", "RESET", "RETRY",
2015772Swnj 	"NOTIFY", "TRYING", "READY"
2025772Swnj };
2035772Swnj #endif
204