|
|
1.1 root 1: /*
2: * Copyright (c) 1982, 1986, 1988 Regents of the University of California.
3: * All rights reserved.
4: *
5: * Redistribution is only permitted until one year after the first shipment
6: * of 4.4BSD by the Regents. Otherwise, redistribution and use in source and
7: * binary forms are permitted provided that: (1) source distributions retain
8: * this entire copyright notice and comment, and (2) distributions including
9: * binaries display the following acknowledgement: This product includes
10: * software developed by the University of California, Berkeley and its
11: * contributors'' in the documentation or other materials provided with the
12: * distribution and in all advertising materials mentioning features or use
13: * of this software. Neither the name of the University nor the names of
14: * its contributors may be used to endorse or promote products derived from
15: * this software without specific prior written permission.
16: * THIS SOFTWARE IS PROVIDED AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED
17: * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
18: * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
19: *
20: * @(#)if_imp.h 7.7 (Berkeley) 6/28/90
21: */
22:
23: /*
24: * Structure of IMP 1822 long leader.
25: */
26: struct control_leader {
27: u_char dl_format; /* 1-8 leader format */
28: u_char dl_network; /* 9-16 src/dest network */
29: u_char dl_flags; /* 17-24 leader flags */
30: u_char dl_mtype; /* 25-32 message type */
31: u_char dl_htype; /* 33-40 handling type */
32: u_char dl_host; /* 41-48 host number */
33: u_short dl_imp; /* 49-64 imp field */
34: u_char dl_link; /* 65-72 link number */
35: u_char dl_subtype; /* 73-80 message subtype */
36: };
37:
38: struct imp_leader {
39: struct control_leader il_dl;
40: #define il_format il_dl.dl_format
41: #define il_network il_dl.dl_network
42: #define il_flags il_dl.dl_flags
43: #define il_mtype il_dl.dl_mtype
44: #define il_htype il_dl.dl_htype
45: #define il_host il_dl.dl_host
46: #define il_imp il_dl.dl_imp
47: #define il_link il_dl.dl_link
48: #define il_subtype il_dl.dl_subtype
49: u_short il_length; /* message length */
50: };
51:
52: #define IMP_MAXHOSTMSG 8 /* max messages in flight to a host */
53: #define IMP_NOOPCNT 3 /* # of noops to send imp on reset */
54: /* insure things are even... */
55: #define IMPMTU ((8159 / NBBY) & ~01)
56: #define IMP_RCVBUF ((8159 / NBBY + 2) & ~01)
57:
58: /*
59: * IMP-host flags
60: */
61: #define IMP_1822L_H2I 0xd /* 1822L host-to-imp, 96-bit format */
62: #define IMP_1822L_I2H 0xe /* 1822L imp-to-host, 96-bit format */
63: #define IMP_NFF 0xf /* 96-bit (new) format */
64: #define IMP_TRACE 0x8 /* trace message route */
65:
66: /*
67: * IMP-host message types.
68: */
69: #define IMPTYPE_DATA 0 /* data for protocol */
70: #define IMPTYPE_BADLEADER 1 /* leader error */
71: #define IMPTYPE_DOWN 2 /* imp going down */
72: #define IMPTYPE_NOOP 4 /* noop seen during initialization */
73: #define IMPTYPE_RFNM 5 /* request for new messages */
74: #define IMPTYPE_HOSTDEAD 6 /* host doesn't respond */
75: #define IMPTYPE_HOSTUNREACH 7 /* host unreachable */
76: #define IMPTYPE_BADDATA 8 /* data error */
77: #define IMPTYPE_INCOMPLETE 9 /* incomplete message, send rest */
78: #define IMPTYPE_RESET 10 /* reset complete */
79: /* non-blocking IMP interface */
80: #define IMPTYPE_RETRY 11 /* IMP refused, try again */
81: #define IMPTYPE_NOTIFY 12 /* IMP refused, will notify */
82: #define IMPTYPE_TRYING 13 /* IMP refused, still rexmt'ng */
83: #define IMPTYPE_READY 14 /* ready for next message */
84:
85: /*
86: * Link numbers
87: */
88: #define IMPLINK_IP 155
89: #define IMPLINK_LOWEXPER 156
90: #define IMPLINK_HIGHEXPER 158
91:
92: /*
93: * IMPTYPE_DOWN subtypes, in link number field.
94: */
95: #define IMP_DMASK 0x3 /* host going down mask */
96: #define IMPDOWN_GOING 0 /* 30 secs */
97: #define IMPDOWN_PM 1 /* hardware PM */
98: #define IMPDOWN_RELOAD 2 /* software reload */
99: #define IMPDOWN_RESTART 3 /* emergency restart */
100: #define IMPDOWN_WHENMASK 0x3c /* mask for "how soon" */
101: #define IMPDOWN_WHENSHIFT 2 /* shift for "how soon" */
102: #define IMPDOWN_WHENUNIT 5 /* unit for "how soon", 5 min. */
103:
104: #define IMPTV_DOWN 30 /* going down timer 30 secs */
105:
106: #ifdef IMPMESSAGES
107: /*
108: * Messages from IMP regarding why
109: * it's going down.
110: */
111: char *impmessage[] = {
112: "in 30 seconds",
113: "for hardware PM",
114: "to reload software",
115: "for emergency reset"
116: };
117: #endif
118:
119: /*
120: * IMPTYPE_BADLEADER subtypes.
121: */
122: #define IMPLEADER_ERR 0 /* error flip-flop set */
123: #define IMPLEADER_SHORT 1 /* leader < 80 bits */
124: #define IMPLEADER_TYPE 2 /* illegal type field */
125: #define IMPLEADER_OPPOSITE 3 /* opposite leader type */
126:
127: /*
128: * IMPTYPE_HOSTDEAD subtypes.
129: */
130: #define IMPHOST_NORDY 1 /* ready-line negated */
131: #define IMPHOST_TARDY 2 /* tardy receiving mesgs */
132: #define IMPHOST_NOEXIST 3 /* NCC doesn't know host */
133: #define IMPHOST_IMPSOFT 4 /* IMP software won't allow mesgs */
134: #define IMPHOST_PM 5 /* host down for scheduled PM */
135: #define IMPHOST_HARDSCHED 6 /* " " " " hardware work */
136: #define IMPHOST_SOFTSCHED 7 /* " " " " software work */
137: #define IMPHOST_RESTART 8 /* host down for emergency restart */
138: #define IMPHOST_POWER 9 /* down because of power outage */
139: #define IMPHOST_BREAKPOINT 10 /* host stopped at a breakpoint */
140: #define IMPHOST_HARDWARE 11 /* hardware failure */
141: #define IMPHOST_NOTUP 12 /* host not scheduled to be up */
142: /* 13-14 currently unused */
143: #define IMPHOST_COMINGUP 15 /* host in process of coming up */
144:
145: /*
146: * IMPTYPE_HOSTUNREACH subtypes.
147: */
148: #define IMPREACH_IMP 0 /* destination IMP can't be reached */
149: #define IMPREACH_HOSTUP 1 /* destination host isn't up */
150: #define IMPREACH_LEADER 2 /* host doesn't support long leader */
151: #define IMPREACH_PROHIBITED 3 /* communication is prohibited */
152:
153: /*
154: * IMPTYPE_INCOMPLETE subtypes.
155: */
156: #define IMPCOMPLETE_SLOW 0 /* host didn't take data fast enough */
157: #define IMPCOMPLETE_TOOLONG 1 /* message was too long */
158: #define IMPCOMPLETE_TIMEOUT 2 /* mesg transmission time > 15 sec. */
159: #define IMPCOMPLETE_FAILURE 3 /* IMP/circuit failure */
160: #define IMPCOMPLETE_NOSPACE 4 /* no resources within 15 sec. */
161: #define IMPCOMPLETE_IMPIO 5 /* src IMP I/O failure during receipt */
162:
163: /*
164: * IMPTYPE_RETRY subtypes.
165: */
166: #define IMPRETRY_BUFFER 0 /* IMP buffer wasn't available */
167: #define IMPRETRY_BLOCK 1 /* connection block unavailable */
168:
169: #define RFNMTIMER (120*PR_SLOWHZ) /* time to wait for RFNM for msg. */
170: #define IMP_OTIMER (5*IFNET_SLOWHZ) /* max output time unless blocked */
171:
172: /*
173: * Data structure shared between IMP protocol module and hardware
174: * interface driver. Used to allow layering of IMP routines on top
175: * of varying device drivers.
176: */
177: struct impcb {
178: int ic_hwunit; /* H/W unit number */
179: char *ic_hwname; /* H/W type name */
180: char ic_oactive; /* output in progress */
181: int (*ic_init)(); /* hardware init routine */
182: int (*ic_output)(); /* hardware output routine */
183: int (*ic_down)(); /* hardware "drop ready" routine */
184: };
185:
186: /*
187: * IMP software status per interface.
188: * (partially shared with the hardware specific module)
189: *
190: * Each interface is referenced by a network interface structure,
191: * imp_if, which the routing code uses to locate the interface.
192: * This structure contains the output queue for the interface, its
193: * address, ... IMP specific structures used in connecting the
194: * IMP software modules to the hardware specific interface routines
195: * are stored here. The common structures are made visible to the
196: * interface driver by passing a pointer to the hardware routine
197: * at "attach" time.
198: */
199: struct imp_softc {
200: struct ifnet imp_if; /* network visible interface */
201: struct impcb imp_cb; /* hooks to hardware module */
202: int imp_state; /* current state of IMP */
203: int imp_dropcnt; /* used during initialization */
204: struct mbuf *imp_hosts; /* Head of host table hash chains. */
205: struct mbuf *imp_hostq; /* current round-robin-output mark */
206: u_int imp_hostent; /* current round-robin-output mark */
207: int imp_msgready; /* number of messages ready to send */
208: u_long imp_block; /* times imp blocked output */
209: u_long imp_lostrfnm; /* rfnm's timed out */
210: u_long imp_badrfnm; /* rfnm/incompl after timeout/bogus */
211: u_long imp_incomplete; /* incomplete's received */
212: u_long imp_garbage; /* bad messages received */
213: };
214:
215: struct imp_softc *impattach();
216:
217: /*
218: * State of an IMP.
219: */
220: #define IMPS_DOWN 0 /* unavailable, host not ready */
221: #define IMPS_WINIT 1 /* imp not ready, waiting for init */
222: #define IMPS_INIT 2 /* coming up */
223: #define IMPS_UP 3 /* ready to go */
224: #define IMPS_GOINGDOWN 4 /* been told we go down soon */
225:
226: #define IMPS_RUNNING(s) ((s) >= IMPS_UP) /* ready for messages */
227: #define IMPS_IMPREADY(s) ((s) >= IMPS_INIT) /* IMP ready line on */
228:
229: #ifdef IMPLEADERS
230: char *impleaders[IMPTYPE_READY+1] = {
231: "DATA", "BADLEADER", "DOWN", "bad", "NOOP", "RFNM", "HOSTDEAD",
232: "HOSTUNREACH", "BADDATA", "INCOMPLETE", "RESET", "RETRY",
233: "NOTIFY", "TRYING", "READY"
234: };
235: #endif
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.