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