123167Smckusick /* 234853Sbostic * Copyright (c) 1982, 1986, 1988 Regents of the University of California. 333453Skarels * All rights reserved. 423167Smckusick * 533453Skarels * Redistribution and use in source and binary forms are permitted 634853Sbostic * provided that the above copyright notice and this paragraph are 734853Sbostic * duplicated in all such forms and that any documentation, 834853Sbostic * advertising materials, and other materials related to such 934853Sbostic * distribution and use acknowledge that the software was developed 1034853Sbostic * by the University of California, Berkeley. The name of the 1134853Sbostic * University may not be used to endorse or promote products derived 1234853Sbostic * from this software without specific prior written permission. 1334853Sbostic * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR 1434853Sbostic * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED 1534853Sbostic * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. 1633453Skarels * 17*44414Skarels * @(#)if_imp.h 7.6 (Berkeley) 06/28/90 1823167Smckusick */ 195686Ssam 205686Ssam /* 215686Ssam * Structure of IMP 1822 long leader. 225686Ssam */ 235772Swnj struct control_leader { 2433427Skarels u_char dl_format; /* 1-8 leader format */ 2533427Skarels u_char dl_network; /* 9-16 src/dest network */ 2633427Skarels u_char dl_flags; /* 17-24 leader flags */ 2733427Skarels u_char dl_mtype; /* 25-32 message type */ 2833427Skarels u_char dl_htype; /* 33-40 handling type */ 2933427Skarels u_char dl_host; /* 41-48 host number */ 3033427Skarels u_short dl_imp; /* 49-64 imp field */ 3133427Skarels u_char dl_link; /* 65-72 link number */ 3233427Skarels u_char dl_subtype; /* 73-80 message subtype */ 335772Swnj }; 345772Swnj 355686Ssam struct imp_leader { 365772Swnj struct control_leader il_dl; 375772Swnj #define il_format il_dl.dl_format 385772Swnj #define il_network il_dl.dl_network 395772Swnj #define il_flags il_dl.dl_flags 405772Swnj #define il_mtype il_dl.dl_mtype 415772Swnj #define il_htype il_dl.dl_htype 425772Swnj #define il_host il_dl.dl_host 435772Swnj #define il_imp il_dl.dl_imp 445772Swnj #define il_link il_dl.dl_link 455772Swnj #define il_subtype il_dl.dl_subtype 465686Ssam u_short il_length; /* message length */ 475686Ssam }; 485686Ssam 4933453Skarels #define IMP_MAXHOSTMSG 8 /* max messages in flight to a host */ 5033427Skarels #define IMP_NOOPCNT 3 /* # of noops to send imp on reset */ 516270Sroot /* insure things are even... */ 526270Sroot #define IMPMTU ((8159 / NBBY) & ~01) 5333427Skarels #define IMP_RCVBUF ((8159 / NBBY + 2) & ~01) 545686Ssam 555686Ssam /* 565686Ssam * IMP-host flags 575686Ssam */ 5834209Skarels #define IMP_1822L_H2I 0xd /* 1822L host-to-imp, 96-bit format */ 5934209Skarels #define IMP_1822L_I2H 0xe /* 1822L imp-to-host, 96-bit format */ 605686Ssam #define IMP_NFF 0xf /* 96-bit (new) format */ 615686Ssam #define IMP_TRACE 0x8 /* trace message route */ 625686Ssam 635686Ssam /* 645686Ssam * IMP-host message types. 655686Ssam */ 665686Ssam #define IMPTYPE_DATA 0 /* data for protocol */ 675686Ssam #define IMPTYPE_BADLEADER 1 /* leader error */ 685686Ssam #define IMPTYPE_DOWN 2 /* imp going down */ 695686Ssam #define IMPTYPE_NOOP 4 /* noop seen during initialization */ 705686Ssam #define IMPTYPE_RFNM 5 /* request for new messages */ 715686Ssam #define IMPTYPE_HOSTDEAD 6 /* host doesn't respond */ 725686Ssam #define IMPTYPE_HOSTUNREACH 7 /* host unreachable */ 735686Ssam #define IMPTYPE_BADDATA 8 /* data error */ 745686Ssam #define IMPTYPE_INCOMPLETE 9 /* incomplete message, send rest */ 755686Ssam #define IMPTYPE_RESET 10 /* reset complete */ 765686Ssam /* non-blocking IMP interface */ 775686Ssam #define IMPTYPE_RETRY 11 /* IMP refused, try again */ 785686Ssam #define IMPTYPE_NOTIFY 12 /* IMP refused, will notify */ 795686Ssam #define IMPTYPE_TRYING 13 /* IMP refused, still rexmt'ng */ 805686Ssam #define IMPTYPE_READY 14 /* ready for next message */ 815686Ssam 825686Ssam /* 83*44414Skarels * Link numbers 84*44414Skarels */ 85*44414Skarels #define IMPLINK_IP 155 86*44414Skarels #define IMPLINK_LOWEXPER 156 87*44414Skarels #define IMPLINK_HIGHEXPER 158 88*44414Skarels 89*44414Skarels /* 9033427Skarels * IMPTYPE_DOWN subtypes, in link number field. 915686Ssam */ 9233427Skarels #define IMP_DMASK 0x3 /* host going down mask */ 935686Ssam #define IMPDOWN_GOING 0 /* 30 secs */ 945686Ssam #define IMPDOWN_PM 1 /* hardware PM */ 955686Ssam #define IMPDOWN_RELOAD 2 /* software reload */ 965686Ssam #define IMPDOWN_RESTART 3 /* emergency restart */ 9733427Skarels #define IMPDOWN_WHENMASK 0x3c /* mask for "how soon" */ 9833427Skarels #define IMPDOWN_WHENSHIFT 2 /* shift for "how soon" */ 9933427Skarels #define IMPDOWN_WHENUNIT 5 /* unit for "how soon", 5 min. */ 1005686Ssam 10133427Skarels #define IMPTV_DOWN 30 /* going down timer 30 secs */ 10233427Skarels 10333427Skarels #ifdef IMPMESSAGES 1045686Ssam /* 10533427Skarels * Messages from IMP regarding why 10633427Skarels * it's going down. 10733427Skarels */ 10833427Skarels char *impmessage[] = { 10933427Skarels "in 30 seconds", 11033427Skarels "for hardware PM", 11133427Skarels "to reload software", 11233427Skarels "for emergency reset" 11333427Skarels }; 11433427Skarels #endif 11533427Skarels 11633427Skarels /* 1175686Ssam * IMPTYPE_BADLEADER subtypes. 1185686Ssam */ 1195686Ssam #define IMPLEADER_ERR 0 /* error flip-flop set */ 1205686Ssam #define IMPLEADER_SHORT 1 /* leader < 80 bits */ 1215686Ssam #define IMPLEADER_TYPE 2 /* illegal type field */ 1225686Ssam #define IMPLEADER_OPPOSITE 3 /* opposite leader type */ 1235686Ssam 1245686Ssam /* 1255686Ssam * IMPTYPE_HOSTDEAD subtypes. 1265686Ssam */ 1275686Ssam #define IMPHOST_NORDY 1 /* ready-line negated */ 1285686Ssam #define IMPHOST_TARDY 2 /* tardy receiving mesgs */ 1295686Ssam #define IMPHOST_NOEXIST 3 /* NCC doesn't know host */ 1305686Ssam #define IMPHOST_IMPSOFT 4 /* IMP software won't allow mesgs */ 1315686Ssam #define IMPHOST_PM 5 /* host down for scheduled PM */ 1325686Ssam #define IMPHOST_HARDSCHED 6 /* " " " " hardware work */ 1335686Ssam #define IMPHOST_SOFTSCHED 7 /* " " " " software work */ 1345686Ssam #define IMPHOST_RESTART 8 /* host down for emergency restart */ 1355686Ssam #define IMPHOST_POWER 9 /* down because of power outage */ 1365686Ssam #define IMPHOST_BREAKPOINT 10 /* host stopped at a breakpoint */ 1375686Ssam #define IMPHOST_HARDWARE 11 /* hardware failure */ 1385686Ssam #define IMPHOST_NOTUP 12 /* host not scheduled to be up */ 1395686Ssam /* 13-14 currently unused */ 1405686Ssam #define IMPHOST_COMINGUP 15 /* host in process of coming up */ 1415686Ssam 1425686Ssam /* 1435686Ssam * IMPTYPE_HOSTUNREACH subtypes. 1445686Ssam */ 1455686Ssam #define IMPREACH_IMP 0 /* destination IMP can't be reached */ 1465686Ssam #define IMPREACH_HOSTUP 1 /* destination host isn't up */ 1475686Ssam #define IMPREACH_LEADER 2 /* host doesn't support long leader */ 1485686Ssam #define IMPREACH_PROHIBITED 3 /* communication is prohibited */ 1495686Ssam 1505686Ssam /* 1515686Ssam * IMPTYPE_INCOMPLETE subtypes. 1525686Ssam */ 1535686Ssam #define IMPCOMPLETE_SLOW 0 /* host didn't take data fast enough */ 1545686Ssam #define IMPCOMPLETE_TOOLONG 1 /* message was too long */ 1555686Ssam #define IMPCOMPLETE_TIMEOUT 2 /* mesg transmission time > 15 sec. */ 1565686Ssam #define IMPCOMPLETE_FAILURE 3 /* IMP/circuit failure */ 1575686Ssam #define IMPCOMPLETE_NOSPACE 4 /* no resources within 15 sec. */ 1585686Ssam #define IMPCOMPLETE_IMPIO 5 /* src IMP I/O failure during receipt */ 1595686Ssam 1605686Ssam /* 1615686Ssam * IMPTYPE_RETRY subtypes. 1625686Ssam */ 1635686Ssam #define IMPRETRY_BUFFER 0 /* IMP buffer wasn't available */ 1645686Ssam #define IMPRETRY_BLOCK 1 /* connection block unavailable */ 1655686Ssam 16634209Skarels #define RFNMTIMER (120*PR_SLOWHZ) /* time to wait for RFNM for msg. */ 16734209Skarels #define IMP_OTIMER (5*IFNET_SLOWHZ) /* max output time unless blocked */ 16833453Skarels 1695686Ssam /* 1705686Ssam * Data structure shared between IMP protocol module and hardware 1715686Ssam * interface driver. Used to allow layering of IMP routines on top 17233427Skarels * of varying device drivers. 1735686Ssam */ 1745922Ssam struct impcb { 17533427Skarels int ic_hwunit; /* H/W unit number */ 17633427Skarels char *ic_hwname; /* H/W type name */ 1775686Ssam char ic_oactive; /* output in progress */ 1785686Ssam int (*ic_init)(); /* hardware init routine */ 17933453Skarels int (*ic_output)(); /* hardware output routine */ 18033453Skarels int (*ic_down)(); /* hardware "drop ready" routine */ 1815686Ssam }; 1825686Ssam 1835686Ssam /* 18433427Skarels * IMP software status per interface. 18533427Skarels * (partially shared with the hardware specific module) 18633427Skarels * 18733427Skarels * Each interface is referenced by a network interface structure, 18833427Skarels * imp_if, which the routing code uses to locate the interface. 18933427Skarels * This structure contains the output queue for the interface, its 19033427Skarels * address, ... IMP specific structures used in connecting the 19133427Skarels * IMP software modules to the hardware specific interface routines 19233427Skarels * are stored here. The common structures are made visible to the 19333427Skarels * interface driver by passing a pointer to the hardware routine 19433427Skarels * at "attach" time. 19533427Skarels */ 19633427Skarels struct imp_softc { 19733427Skarels struct ifnet imp_if; /* network visible interface */ 19833427Skarels struct impcb imp_cb; /* hooks to hardware module */ 19933427Skarels int imp_state; /* current state of IMP */ 20033427Skarels int imp_dropcnt; /* used during initialization */ 20133453Skarels struct mbuf *imp_hosts; /* Head of host table hash chains. */ 20233453Skarels struct mbuf *imp_hostq; /* current round-robin-output mark */ 20333453Skarels u_int imp_hostent; /* current round-robin-output mark */ 20433453Skarels int imp_msgready; /* number of messages ready to send */ 20533453Skarels u_long imp_block; /* times imp blocked output */ 20633427Skarels u_long imp_lostrfnm; /* rfnm's timed out */ 20733427Skarels u_long imp_badrfnm; /* rfnm/incompl after timeout/bogus */ 20833427Skarels u_long imp_incomplete; /* incomplete's received */ 20933427Skarels u_long imp_garbage; /* bad messages received */ 21033427Skarels }; 21133453Skarels 21233427Skarels struct imp_softc *impattach(); 21333427Skarels 21433427Skarels /* 2155686Ssam * State of an IMP. 2165686Ssam */ 21733427Skarels #define IMPS_DOWN 0 /* unavailable, host not ready */ 21833427Skarels #define IMPS_WINIT 1 /* imp not ready, waiting for init */ 2195686Ssam #define IMPS_INIT 2 /* coming up */ 2205686Ssam #define IMPS_UP 3 /* ready to go */ 22133427Skarels #define IMPS_GOINGDOWN 4 /* been told we go down soon */ 2225686Ssam 22333427Skarels #define IMPS_RUNNING(s) ((s) >= IMPS_UP) /* ready for messages */ 22433427Skarels #define IMPS_IMPREADY(s) ((s) >= IMPS_INIT) /* IMP ready line on */ 2255772Swnj 2265772Swnj #ifdef IMPLEADERS 2275922Ssam char *impleaders[IMPTYPE_READY+1] = { 2285772Swnj "DATA", "BADLEADER", "DOWN", "bad", "NOOP", "RFNM", "HOSTDEAD", 2295772Swnj "HOSTUNREACH", "BADDATA", "INCOMPLETE", "RESET", "RETRY", 2305772Swnj "NOTIFY", "TRYING", "READY" 2315772Swnj }; 2325772Swnj #endif 233