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