home *** CD-ROM | disk | FTP | other *** search
/ InfoMagic Source Code 1993 July / THE_SOURCE_CODE_CD_ROM.iso / bsd_srcs / sys / netimp / if_imp.h < prev    next >
Encoding:
C/C++ Source or Header  |  1991-05-07  |  9.2 KB  |  249 lines

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