














                                NETHACK3 MANUAL

                               Citadel-86: V3.41

                             Copyright 1989 - 1991

                                  by Hue, Jr.

                             C-86 Test System Sysop

                                    91Dec08












































                         Table of Contents

     I. Introduction . . . . . . . . . . . . . . . . . . . . . . .  2
        I.1 History  . . . . . . . . . . . . . . . . . . . . . . .  2
        I.2 Purpose  . . . . . . . . . . . . . . . . . . . . . . .  2
     II. Overview  . . . . . . . . . . . . . . . . . . . . . . . .  3
     III. Information Transfer Layer . . . . . . . . . . . . . . .  3
        III.1 Call Stabilization . . . . . . . . . . . . . . . . .  4
        III.2 Transfer Medium  . . . . . . . . . . . . . . . . . .  5
     IV. Application Layer . . . . . . . . . . . . . . . . . . . .  6
        IV.1 Overview  . . . . . . . . . . . . . . . . . . . . . .  7
        IV.2 ID & Name . . . . . . . . . . . . . . . . . . . . . .  7
        IV.3 Facility Requests . . . . . . . . . . . . . . . . . .  8
        IV.4 Message & File Transfer . . . . . . . . . . . . . . .  9
        IV.5 Network Session Control Facilities  . . . . . . . . .  9
           IV.5.a Hangup command . . . . . . . . . . . . . . . . .  9
           IV.5.b Error Code Support . . . . . . . . . . . . . . . 10
           IV.5.c Role Reversal  . . . . . . . . . . . . . . . . . 10
           IV.6 Data Transfer Facilities . . . . . . . . . . . . . 10
           IV.6.a Normal Mail  . . . . . . . . . . . . . . . . . . 10
           IV.6.b Room File Requests . . . . . . . . . . . . . . . 10
           IV.6.c Ambiguous Room File Requests . . . . . . . . . . 11
           IV.6.d Ambiguous Room File Requests With Approval . . . 11
           IV.6.e Network Room . . . . . . . . . . . . . . . . . . 12
           IV.6.f Check Mail . . . . . . . . . . . . . . . . . . . 12
           IV.6.g Send File  . . . . . . . . . . . . . . . . . . . 13
           IV.6.h Alternate Room Sharing . . . . . . . . . . . . . 13
           IV.6.i Message Compaction . . . . . . . . . . . . . . . 13
           IV.6.j Route Mail . . . . . . . . . . . . . . . . . . . 14
           IV.6.k Mass Transfers
        IV.7 ITL Alternate Realities . . . . . . . . . . . . . . . 14
        IV.8 Security  . . . . . . . . . . . . . . . . . . . . . . 15
           IV.8.a System Net Password  . . . . . . . . . . . . . . 15
        IV.9 Other Reserved Facility Byte Values . . . . . . . . . 15
        IV.10 Facilities -- Short List . . . . . . . . . . . . . . 16
     V. Minimal Compatability Requirements . . . . . . . . . . . . 16
     VI. Anytime Netting . . . . . . . . . . . . . . . . . . . . . 16
     VII. Message Transfer Format  . . . . . . . . . . . . . . . . 17
          VII.1 Field types  . . . . . . . . . . . . . . . . . . . 17
            VII.1.a Displayable fields . . . . . . . . . . . . . . 18
            VII.1.b Non-Displayable fields . . . . . . . . . . . . 19
            VII.1.c Special Fields . . . . . . . . . . . . . . . . 19
            VII.1.d Developer's Fields Assignments . . . . . . . . 20
          VII.2 Special Fields becoming Standard Fields  . . . . . 20
          VII.3 Other Additions to the Standard Fields . . . . . . 21
          VII.4 Identifier Summary . . . . . . . . . . . . . . . . 21
          VII.5 An Example . . . . . . . . . . . . . . . . . . . . 22
     Appendix A.  Examples!  . . . . . . . . . . . . . . . . . . . 22
       A.1 Call Stabilization  . . . . . . . . . . . . . . . . . . 22
       A.2 ID & Name . . . . . . . . . . . . . . . . . . . . . . . 23
       A.3 Normal Mail . . . . . . . . . . . . . . . . . . . . . . 23
       A.4 Ambiguous Room File Requests  . . . . . . . . . . . . . 24
       A.5 Network Room  . . . . . . . . . . . . . . . . . . . . . 24
       A.6 Check Mail  . . . . . . . . . . . . . . . . . . . . . . 25
       A.7 Send File . . . . . . . . . . . . . . . . . . . . . . . 25
       A.8 Alternate Room Sharing  . . . . . . . . . . . . . . . . 25
     Appendix B. BBS Software compatible with C86Net . . . . . . . 26
     Appendix C. Main C86Net . . . . . . . . . . . . . . . . . . . 26


                                    -1-






     I. Introduction
        This document attempts to detail, in a haphazard manner, the network
     known as C86Net.  C86Net is a BBS network protocol currently used by
     Citadel-86 (for Z100s and PClones), NeoCitadel (PClones), STadel (Atari
     STs), Amiga Citadel-68K (Amigas), Novucivitas, Asgard-86, and others.

     I.1 History
        The original motivations for C86Net were two-fold: to provide an
     interesting project exploring a topic the author had never studied
     before, and to (ultimately) allow the sysops of Citadel-86s in the Twin
     Cities area of Minnesota (aka Minneapolis/St. Paul) to communicate with
     each other without having to call each other's boards; the number of
     Citadels in the area was beginning to escalate, making it impossible
     for gainfully employed sysops to talk conveniently.

        The first version of C86Net came into being in June of 1985, and is
     better left unmentioned.  After learning from his mistakes and discussing
     the entire project with John Stanley, a second version was attempted and
     installed in all local Citadel-86s.  This, too, was a ghastly mistake,
     but enough lessons were learned so the third version of C86Net could
     be constructed in an expandable fashion allowing easy backward
     compatability as the network facilities were expanded.  The installation
     of the second and third versions mandated this ability: updating an
     entire set of systems simultaneously is a nightmarish situation.

        The history of C86Net since then has consisted of two events: the
     addition of new facilities as new needs were identified, and the
     integration of non-Citadel-86 systems to C86Net networks.

        The exact chronology of adding facilities is not going to be detailed
     here; it would be both tedious and useless.  However, the astute reader
     will note several anomolies and redundancies in the facilities.  Be
     advised this is what happens when the author is programming for both
     learning and fun; another term is "programming by accretion."

        The first non-Citadel-86 system to join a C86Net was NeoCitadel, by
     Hue, Sr., which started by supporting Net Mail.  Then a valiant, notable
     effort was made by Lum the Mad, author of Lumadel, a very good Citadel
     clone for the Apple II series of computers.  His networker, written in
     Apple Basic, actually managed to communicate during several manual tests
     with a Citadel-86.  However, an automated networker was never completed,
     and Lumadel languished after Lum bought an IBM clone.

        Some Other BBS software compatible with C86Net includes Amiga
     Citadel-68K as ported by Stallion aka Jay Johnson, and STadel as ported by 
     David Parsons, both ports of Citadel-86, as well as Asgard-86 by Gary
     Meadows and Novucivitas by Brent Barrett, both of Sacramento, CA, and
     Fortress, a port of STadel, by Chris Camacho of Atlanta, GA.  This is not
     a complete list.  See Appendix B for more detail.


     I.2 Purpose
        The purpose of this document is to detail C86Net at the byte level.
     We will only talk about how the protocol should react to each condition.
     We are not going to discuss what each facility "should" be used for,
     although suggestions may be advanced, and most should be fairly obvious.



                                    -2-






        If you only have a headache when you're done reading this, count
     yourself lucky.  The author will probably know what a year's worth of PMS
     is like.

     II. Overview
        Just about any networking textbook will tell you most networks
     can be divided into some set of layers (an example, the ISO Standard, is
     fairly well explained in Computer Networks by Tannenbaum), and the
     Citadel-86 Networking protocol is not an exception, in concept.  (NOTE:
     no attempt is going to be made to use network terminology currently in
     use by network experts.  Instead, the terminology I'll use will be what
     I think best describes the subject matter.  As such, this document's
     terminology may change from revision to revision as people discuss and
     argue with me about it.)  Familiarity with such a textbook (or, better
     yet, a real network implementation) is certainly suggested (unless you
     have masochistic tendencies, like I did).

        The protocol seems to break down into just two layers.  The first can
     be termed the "information transfer" layer, or the "link" layer; the
     second can be described as the "application" layer.

                            ---------------------
                            | Application Layer | -  -  -  -  -  -  -  -  -
                            ---------------------
                                     |  |\                      Another _____\
             This node              \|  |                         node       /
                           ------------------------
                           | Information Transfer |  _  _  _  _  _  _  _  _
                           |        Layer         |
                           ------------------------

        The purpose of the Information Transfer Layer is to ensure (to the
     extent possible) all information be conveyed from and to this system's
     Application Layer from another system's Application Layer actually
     succeeds in transmission.

        The purpose of the Application Layer is to accomplish useful work
     during a networking session with another node.

        It should be apparent that the Application Layer is dependent on the
     Information Transfer Layer.  Despite this dependency, most of this
     document is dedicated to the Application Layer and its facilities,
     since the Information Transfer Layer is very simple (not necessarily a
     good sign).

        Whenever the acronym "ITL" is used, assume it means Information
     Transfer Layer; similarly, the "AL" refers to the Application Layer.

     III. Information Transfer Layer
        As mentioned, the ITL's purpose is to provide a stable communications
     medium.








                                    -3-






        The keyword here is "stable".  In order to achieve this, several goals
     must be accomplished during any given networking session in order for
     overall success to be achieved, and these can be broken into two parts.

        The first part is called "Call Stabilization."  This part of the ITL
     has the goal of establishing stabilization.  The section on Call
     Stabilization will detail some of the problems associated with
     Call Stabilization.

        The second part is the provision of a transfer medium.  In this
     section, it is best to remember that looking at C86Net from a layer
     viewpoint does not mean C86Net was built as a reflection of some
     layer model.  This should lessen confusion.

     III.1 Call Stabilization
        The purpose of this process is to establish quickly and efficiently
     that the caller is another system on the net wishing to engage in a
     networking session.  The design of call stabilization was driven by whim,
     a wish for efficiency, and experience with earlier versions of C86Net.

        The problems consist of, first, users calling in during networking.
     Call Stabilization is designed to stave off the fumblings of an honest
     user who simply doesn't realize the networker is in effect by
     forcing a "recognition code" to be given that would be difficult for a
     casual user to generate.

        The second (and last) problem comes from the machines the network
     was originally implemented on, which are Z-100s and IBMs using MS-DOS.
     During the last few years the marketplace has literally been bombarded by
     modems capable of multiple baud rates (300, 1200, 2400, and now 9600
     looms on the scene), and can signal to the host system what the connect
     baud rate is.

        The modems can typically have two methods of signaling the connect
     baud rate: by sending a unique text string to the host at the serial port
     baud rate, and via signals on the RS232 interface.

        Unfortunately, within my experience the use of the text strings for
     divining baud rate is not completely reliable; and, ridiculously, both
     IBM and Zenith completely neglected to make available the RS232 signals
     on their serial ports that would have allowed the programmer to discover
     the connect baud rate, with the exception of some internal modems on the
     IBM.

        Therefore, Call Stabilization must allow some way for effective baud
     rate connect detection to occur.  The Call Stabilization technique
     currently in use does not seem to be too bad in achieving the objectives.












                                    -4-






        Here is the process (sort of) graphically, right after carrier detect:

               Caller                |                     Receiver
               ------                |                     --------
                           Systems detect carrier
      Wait for full second           |                Wait for full second
      Send following 3 bytes:        |                Begin waiting for the
               7                     |                following three bytes:
               13                    |                        7
               69                    |                        13
      and wait 4 seconds.            |                        69
      If have not received a         |                 After the 4 second
      correct response (see          |                 response wait, the
      Receiver column), then         |                 Receiver can switch
      resend the above 3 bytes.      |                 bauds if necessary.
      This looping process should    |                 If get the above 3
      only be repeated 20 times.     |                 bytes, then respond
      If, on the 20th try, still     |                 instantly with:
      have not received a correct    |                        ~7
      response, HANGUP.              |                        ~13
      If have received a correct     |                        ~69
      response, send an ACK.         |                 and then wait for an
                                     |                 ACK. This should end
                                                       Call Stabilization.

        So, essentially, the caller waits a second, and then sends a 3 byte
     sequence to the receiver.  When the receiver receives those 3 bytes
     successfully, it replies with the logical negation of those 3 bytes.  The
     caller then sends an ACK back, indicating the call is stabilized.
     If the protocol fails 20 times, then the caller hangs up, assuming
     something was wrong.

        The 7-13-69 sequence only has significance in that a casual user
     probably won't generate it accidentally.

     III.2 Transfer Medium
        The purpose of this part of the ITL is to provide a stable means of
     transporting information to and from the other half of the networking
     session.

        Take it as a caveat that this is neither "clean" or "elegant" by
     any stretch of the imagination.  Just take a deep breath and start
     reading (particularly if you're a networking professional!).  Also, this
     is going to be difficult, seeing as I have troubles explaining it
     coherently myself.  However, considering the fact that adding new
     facilities to the Applications Layer has been simple as of late, I must
     assume SOMETHING is being done right here.












                                    -5-






        The Transfer Medium takes some stream of information and attempts to
     transfer it to another system.  As such, it is under strategic control of
     the Application Layer in terms of when to start and when to stop; another
     way to explain it is the Application Layer will tell it to start
     sending some stream of data, will tell it to stop sending, will tell it
     to receive information from the other system, etc.  Details of when to
     send, when to receive, etc., are contained in the sections on the
     Application Layer, and will not be treated further in this section.

        One of the responsibilities of the Transfer Medium is to place no
     interpretation on the data stream; the Transfer Medium only takes the
     data and sends it to the other system's Transfer Medium, or receives the
     data and sends it "up" to the Application Layer of the host system.  The
     Application Layers involved make decisions as to what is to be done with
     the data.

        So, what is the structure of the ITL Transfer Medium?  Currently,
     the systems have four choices.  First, there is Ward Christiansen's
     XMODEM protocol, which is the default and is always used during the
     initial phases of a network session (and is, therefore, the required
     transfer medium).  Citadel-86 usually uses XMODEM-checksum for transfers,
     but XMODEM-CRC should function just as well, although due to the
     handshaking overhead, the network may suffer performance degradation
     when conversing with systems not supporting XMODEM-CRC.

        The other three transfer medium choices are YMODEM (single mode),
     WXMODEM, and ZMODEM.  Activation of the alternatives is covered in Section
     IV.7.

        At the risk of confusing the readers, let's hop ahead and state
     the AL uses the ITL to transfer Facility Requests to and from nodes,
     sending each Facility Request when needed.  Each Request is, or should
     be, treated by the ITL as a separate file.  Therefore, the ITL should
     send, or receive, each Request as a new file (where it stores it is an
     implementation detail), with a new block 1, etc.  We'll try to provide
     details at the end of this document.


     IV. Application Layer
        The Application Layer (AL), via the ITL, manages all of the work
     to take place during a network session.


















                                    -6-







     IV.1 Overview
        The following diagram graphically demonstrates the flow of control
     during a C86Net network session.  Assume, of course, this is a
     minimal diagram. The references to the ITL are provided for completeness'
     sake and context.

       -----------------
       |     CALL      |                ITL Territory
       | STABILIZATION |       _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
       -----------------      /
               |             /          AL Territory
       _ _ _ _ | _ _ _ _ _ _/
               |                RECEIVER TELLS CALLER CAN'T HANDLE COMMAND
               |                    ____________________<___________
               |                    |                              |
       ----------------     ----------------     ------------      ^
       | CALLER SENDS |_>___| CALLER SENDS |___>_| RECEIVER |___>__|
       | ID & NAME    |     |   COMMAND    |     | RESPONDS |      |
       ----------------     ----------------     ------------     \|/
                                   |                               |
                                   |                               |
                                   |                        --------------
                                   |                        |  RECEIVER  |
                                   |                        |  TELLS     |
                                   ^                        |  CALLER    |
                                   |                        | CAN HANDLE |
                                   |                        |   COMMAND  |
                                   |                        --------------
                                   |                               |
                                   |                               |
                                   |  UNLESS COMMAND IS    ----------------
                                   _____________<__________| DO SPECIFIED |
                                         'HANGUP'          | ACTION       |
                                                           ----------------

        Call Stabilization has already been covered (III.1), so we shan't
     speak of it further.  The diagram can be summarized as: caller identifies
     itself, and then begins sending a sequence of Facility Requests.  Each
     Request is dealt with by the receiver as received, and implies some set
     of actions both systems are aware of.  Each Request's actions are
     detailed in this document.

     IV.2 ID & Name
        After receiving the ACK indicating end of Call Stabilization, the
     calling system must identify itself to the receiver.  The caller sends,
     in this order, nodeId & nodeName to the Transfer Medium, telling it to
     send them to the receiver.

        nodeId, nodeName: Are normal null-terminated C strings.

        Neither the nodeId nor nodeName may exceed 20 bytes in length
     (including the null byte terminating each string); therefore, the total
     bytes of significant data the AL must deal with should not exceed 40.
     This also implies the ITL should not send more than a sector
     (128 bytes) worth of data.



                                    -7-






        So, for example, let's say a system using the nodeName "Buffalo"
     and with a nodeId of "US 612 477 0927" calls some other system. After
     the WC session was over, the receiver's buffer or temporary file would
     look like this

          Id            name
     US 612 477 0927<0>Buffalo<0> <-balance of the sector is trash->

     IV.3 Facility Requests
        After the caller identifies itself, the two systems go into a loop.
     Each loop starts with the Caller sending a Facility Request.  A Facility
     Request at the AL layer consists of at least one byte, which contains a
     code indicating the Facility requested, and up to four optional
     parameters which are used to convey other data required for the Facility.
     Each of these parameters are normal C null-terminated strings, and none
     may exceed more than 20 bytes in length, including the ending null byte;
     they may be smaller if the entire 20 bytes is not needed.  The last of
     the optional parameters, be there 0 or 4 of them, is always followed by a
     0 byte.  A Facility Request not requiring any parameters would look like
     this at the Application Layer:

       <facility-byte><0>

     and a Facility Request needing two parameters would look like this:

       <facility-byte><string1><string2><0>

        At the ITL level, the Facility Request byte comes first, followed by
     each parameter; the rest of the sector is trash.

        The receiver, on receipt of the facility request, must decide if it
     can execute the facility requested by the caller.  If so, the receiver
     just sends back one byte, called GOOD, and then the network session
     proceeds along the lines implied by the facility.  If the receiver cannot
     execute the facility requested, it sends back a byte called BAD followed
     by a null-terminated string < 126 characters which explains why the
     facility cannot be executed.

       <Good>

       <Bad><error string>

        The actual values of GOOD and BAD are

      BAD:  0
      GOOD: 1

        Section IV.5 through IV.9 detail all facilities currently supported by
     Citadel-86 in C86Net, plus some proposed facilities.










                                    -8-






     IV.4 Message & File Transfer
        When "transfer of messages" is mentioned below, we mean a series of 0
     or more messages are to be sent from one system to the other.  When the
     number of messages is 0, then it is not necessary to do more than start
     and stop the ITL, which should be interpreted by the system receiving the
     0 messages to mean 0 messages were received.

        When one or more messages are being sent, each should be in the format
     detailed in Section VII.

        When more than one message is being sent, there should be no separator
     between messages, due to the format messages are sent in.  Because
     of the current character of the ITL, networking leaves us with
     last sectors of which zero or more bytes will be trash.  Therefore, when
     transferring messages, the balance of the last sector which has no meaning
     can either be ^Z filled (vis a vis XMODEM rules) or space-filled.

        A file transfer implies one or more files are being sent.  There
     is no data transformations applied to files at the AL layer, i.e., they
     are sent (conceptually) byte by byte to the ITL for transfer.  The ITL,
     being what it is, does not currently perform any transformations.  In the
     future it may, but the ITL has the responsibility of ensuring
     transformations inserted by the ITL are taken out before termination of
     the ITL.

        Really, this may sound bad, but it's very easy.  "Clean up after
     yourself."

     IV.5 Network Session Control Facilities
        These facilities are used to control the overall behavior of a network
     session.

     IV.5.a Hangup command
        This facility is a simple 1-byte command telling the receiver to
     hang up.  Unfortunately, the behavior of the receiver for this facility
     depends on the state of the network session.  If this facility is used
     while Role Reversal is active, then it signals the end of the Role
     Reversal facility, and the receiver should send back a GOOD byte (see
     Section IV.5.c).

        If this Facility is requested when the session is not indulging in
     a Role Reversal, then the receiver does NOT send back either a GOOD or
     BAD byte.  Instead, it just hangs up (i.e., terminates the Network
     session).

        The value of the Hangup byte is 0.













                                    -9-






     IV.5.b Error Code Support
        This Request asks the receiver if his system can transmit Error Code
     responses to Requests. This Request must be exercised and accepted as
     GOOD before the receiver can use the Error Code response instead of the
     BAD response when reporting his ability to support a particular facility
     requested.

        The value of the Error Code Support byte is 200.

        Citadel-86 does not currently support this facility.

     IV.5.c Role Reversal
        In order to make networking more efficient in nets using room
     sharing concepts, it has become a necessity to allow "role reversal"
     during the networking period.  The term "role reversal" means during
     the period of a call, two systems, supposing they are adequately
     equipped, may exchange their roles of "caller" and "receiver", and then
     continue to network, with the real receiver now becoming the "caller",
     and vice versa.  All services should be supported under role reversal.

         When role reversal is agreed upon by the two systems (this is defined
     to be the point at which the receiver has replied GOOD to the caller),
     the two systems now switch roles.  The caller, who has now become the
     receiver, now starts waiting for the first facility request from the
     receiver, who has now become the caller.

        The caller and receiver should, of course, be aware of who is who;
     this is why the stage of CALLER SENDS NAME & ID is skipped during role
     reversal.

        The end of role reversal is signaled by the original receiver (now the
     caller) by sending the HANGUP command.  The original caller (now the
     receiver) acknowledges this (reply GOOD), and at this point, the two
     again reverse roles. Note that the HANGUP command has been modified in
     this one contextual instance to act differently from its normal behavior.

        The value of the Role Reveral byte is 201.

     IV.6 Data Transfer Facilities
        These facilities support transfer of various sorts of data between
     nodes.

     IV.6.a Normal Mail
        This facility is a parameterless facility which is designed to allow
     transfer of Mail> from the transmitter to the receiver.  If the receiver
     signals it can receive Mail>, then the transmitter should begin
     transmitting all Mail messages destined for the receiver via the ITL.

        The value of the Normal Mail byte is 1.

     IV.6.b Room File Requests
        This facility is used to request one file from the receiver.  It has
     two parameters, the name of the room the file is located in
     (parameter 1), and the name of the file to be transferred (parameter 2).





                                    -10-






        If the receiver is willing to transfer the specified file to the
     transmitter, it should send back a GOOD byte, and then tell the ITL to
     send the file to the transmitter, which should be ready to receive the
     file.

        If the receiver will not or can not satisfy the request, then it should
     return a BAD byte.  The reasons for not satisfying this request are, of
     course, implementation dependent, but they can include such reasons as
     non-existence of room, non-existence of file, sheer peevishness, etc.

        This facility is an anachronism, retained for backward compatability.
     The facility Ambiguous Room File Requests is a better choice.

        The value of the Room File Request byte is 2.

     IV.6.c Ambiguous Room File Requests
        This facility is an expansion of IV.6.b, and very similar to it.  It,
     too, has two parameters, the first the name of the room and the second
     the name of the file requested.  However, the second parameter can safely
     be used to specify an ambiguous set of files if the user so chooses.

        If the receiver consents to send the requested files to the
     transmitter, then it should send back a GOOD byte.  At this point, the
     procedure diverges from used in IV.6.b.  For each file to be sent to
     the transmitter by the receiver, it first sends via the ITL two strings
     (null-terminated), which, in order, are the name of the file, and the
     size of the file in 128 byte sectors.  If the file SEX.ED was 12877 bytes
     long, the receiver would send

                    SEX.ED<0>101<0>

        These two strings constitute in themselves a separate transfer; in ITL
     terms this means a separate XMODEM transfer, as if we were sending a
     single file just ahead of the real file.

        The transmitter does nothing but receive these pairs for each file
     it will receive.  When the receiver has no more files to send satisfying
     the request for files, it sends one more of the pre-file headers,
     in which the length of the file name is 0.  This indicates the end of this
     facility.

        The value of the Ambiguous Room File Request byte is 3.


     IV.6.d Ambiguous Room File Requests With Approval
        This is a non-implemented facility, which is not yet completely
     defined.
        The value of the Ambiguous Room File Request With Approval byte is 4.











                                    -11-






     IV.6.e Network Room
        This facility is used to send 0 or more messages from one system to
     another for a specified room.  The room these messages are coming
     from is the sole parameter of this facility. If the receiver is willing
     to accept the messages for delivery to the room on the receiver's system,
     it replies GOOD to the caller, and then begins data transfer of the
     messages in the same manner as it would for Mail transfer.  It it does
     not wish to accept the messages (for whatever reason) from the caller, it
     then replies BAD.

        The value of the Network Room byte is 5.

     IV.6.f Check Mail
        The Normal Mail facility does not contain any provisions for checking
     to see if Mail messages can be delivered to the designated recipients.
     This command provides that facility.  If the receiver chooses to accept
     this command, it should send a GOOD byte, and then cycle through the Mail
     messages already received from the caller.  For each undeliverable message
     the receiver should send back a byte and three strings which describe the
     reason the Mail message cannot be delivered.  The three strings, in the
     order they should be sent, should contain the following information:

             String 1: Author of the Mail> message.
             String 2: Recipient of the Mail> message.
             String 3: Error "context."  This field should contain a message
                       describing (in English) something useful about the
                       error.  Citadel-86 currently fills this with the date
                       and time of the message, suitable for sending to the
                       author of the failed message.

        All three of these strings must be present.  Any or all of the three,
     however, may be of 0 length.  None may exceed 20 characters in length
     (including the 0 byte).

        The values of the byte are:

      NO_RECIPIENT    1  -- This reason indicates there is no such
                            recipient on the Receiver system. Note the
                            second string following this reason byte normally
                            contains the name of the unknown recipient.
      BAD_FORM        2  -- This reason indicates there was no "To" field
                            in the message.  Usually is a symptom of
                            programming error.
      UNKNOWN         99 -- Something really* odd happened.  The context
                            string (#3) should perhaps contain the number (on
                            the Caller system) of the message, so it may
                            be investigated later.

        After all of the negative acknowledgements of Mail> have been sent
     back, the receiver sends one more byte, which is called the NO_ERROR
     byte. It indicates there are no more errors to be sent to the
     transmitter.  If there were no bad Mail messages in the first place, then
     the only real data the receiver would return to the transmitter
     would be the NO_ERROR byte.  The value of the NO_ERROR byte is 0.





                                    -12-






        All negative acknowledgements, plus the NO_ERROR byte, are sent as a
     single stream of data, not as separate ITL transfers!

        The value of the Check Mail byte is 6.

     IV.6.g Send File
        This facility allows the sysop to send a file to another system.
     There are three parameters associated with this request: The name of the
     file the sender wishes to send to the receiver, and the size of the
     file, first in terms of sectors (CP/M compatibility, if ever any CP/M
     Citadels wish to join the net), and then in just bytes. (Remember, these
     are really just ASCII strings.)

        The file is sent only upon positive acknowledgement of this request.
     However, it should not be assumed a negative response implies
     the facility is not supported.  Since the size of the file is sent along
     with the request, the receiver may decline to receive the file due to
     space considerations, but could receive a smaller file.

        The value of the Send File byte is 7.

     IV.6.h Alternate Room Sharing
        This facility was motivated by the LD room sharing network, due to the
     fact that a system willing to absorb the expense of sharing rooms
     at LD may not be willing to support the additional costs occurring
     from the role reversal command (for instance, very large files being sent
     or requested by the receiving system).

        This facility solves the above problem.  Succinctly, it notifies the
     receiving system the caller wishes to share the specified room.  Upon
     receiving a positive acknowledgement, the caller proceeds to send all
     net messages destined for the receiver.  When finished, the
     receiver sends all net messages destined for the caller for the specified
     room.  This is most commonly used for C86Net routing.

        Usually, messages from systems other than the two involved in the
     network session will be passed to other systems using this Facility.

        The value of the Alternate Room Sharing byte is 8.

     IV.6.i Message Compaction
        This facility allows an optional compaction of all messages transferred
     during a network session, whether it be Mail, room sharing, or whatnot,
     no matter which direction is selected.  Such compaction serves to shorten
     network sessions.  When this facility is used and the receiver agrees to
     it, all further message transfers will be compacted using the agreed upon
     method.

        This facility has a single parameter, which is used to indicate which
     type of compaction is to be used.  More efficient methods can therefore
     be added easily.

        The only currently valid parameter value is:

        "0" -- Compact messages using C-86 proprietary method.




                                    -13-






        The "0" compaction method is a low-efficiency method, more for testing
     than for actual use.  It only achieves 20-30% compaction in limited
     testing.  New methods will be added as whim takes us.

        The value of the Message Compaction byte is 10.

     IV.6.j Route Mail
        C86Net RouteMail is triggered using this Facility Request.  C86Net
     RouteMail functions by passing Mail on from a Source system (the system
     which generates a piece of Mail meant for another system to which the
     system is not directly connected) to the Target system (the ultimate
     target of said Mail) by asking each system in turn to send the Mail
     meant for the Target.  Included in this "request" is an optional "domain"
     designator" which can be used by intervening systems as a hint as to
     where the mail should be routed in order to reach its ultimate destination.
     How each intervening system wishes to route the Mail onwards is up to the
     system, whether it be via an implementor's extension or using C86Net
     RouteMail.  Citadel-86 systems, if they do not connect directly with a
     given system, only know what system to ask to pass the Mail onwards, based
     on the domain designation (if present) or the node id.

        This Request currently has three parameters.  The first parameter
     of this Request is the Node ID of the system for which the Mail is
     meant (which can be just " " if it's not known), the second parameter is
     the Name of the system, and the third parameter is the domain of the
     target system.  Usually, the Node Id should be used for identifying the
     target system, since the name of any system is not guaranteed to be the
     same across all systems' nodelists, but if the domain is provided then it
     can be used as a mechanism for getting the mail to a domain "server", and
     then the server should be able to make a positive ID on the system and
     deliver the Mail.  If the receiving system can, or thinks it can, transfer
     the Mail to the target system, it should reply GOOD.  The sender should
     then transfer the Mail to the receiver.  If the receiver can not in good
     conscience accept the Mail for delivery, it should reply BAD.

        Note it is perfectly valid to not only encounter several Route
     Mail requests during a network session, but to even receive more than
     one with identical parameters during a network session.

        The value of the Route Mail byte is 9.

     IV.6.k Mass Transfers
	This facility used to transfer nearly all the messages destined for
     the receiving system in a selectable standard compressed format using
     a selectable high speed protocol.

     IV.6.k.1 Request Parameters
     String 1: Identifies proposed compaction method.  String definitions:

      "1" - LHA
      "2" - PKZIP
      "3" - ZOO
      "4" - SEA ARC
      "5" - ARJ

     String 2: Protocol Override Field.  This allows specification of a protocol
     other than the current default transmission protocol.  Since we are now
     sending a file, it should not be difficult to implement ZMODEM or other
     fast protocol.  NOTE: This protocol only applies to the actual file of
     messages (in compacted form) that is transferred, not to any of the
     bureaucratic overhead.  String definitions:

      "-1" - use current transmission protocol.
      "0"  - use XMODEM.
      "1"  - use YMODEM.
      "2"  - use WXMODEM.
      "3"  - use ZMODEM.

      NOTE: The last four values are the same as used for Facility Request 100.

     String 3: Message Format field.  This field controls how the messages of
     the various rooms are stored in the compressed file.  This will allow the
     controlled exploration of optimization of message transmission.  The only
     valid value (see below) at the moment does not represent the ultimate
     optimization possible; for example, some experimentation reveals placing
     all outgoing messages into a single files before compression may represent
     a significant savings (due to internal file overhead savings).  A single
     example is the that an LZH file generated in the format currently used was
     around 27K, while placing all outgoing messages into a single file before
     compression resulted in a LZH file of about 25K, a savings of a bit more
     than 2K.  The same experiment with PKZIP revealed similar savings.

      "0" - File per Room format.  In this format the compressed file will
     contain one file per room format.  This format is detailed below.

      No other values are currently supported.
     
      String 4: Reserved.  Please place an Ascii "-1" (i.e., strcpy(field, "-1")
     in this field.

     IV.6.k.2 Summary
	This facility allows the combination of all normal room messages (that
     is, excluding Mail and Mail Routing) are collected into one or more files,
     compacted using standard compaction programs available on at least a few
     varieties of computers, and transferred as one file, possibly using a
     high-performance protocol such as Zmodem.

	This facility requires some off-line message management in order to
     minimize the amount of connect time actually used.

     IV.6.k.2 Detailed Data Flow
	See above for definitions of parameters of the initial facility request.
     If a system cannot support a given combination, the other system may feel
     free to attempt to use a different combination.  However, if a new archived
     file must be created, this may create unsightly delays.  Administrative
     procedures may have to be indulged in by sysops rather than having the
     software attempt to negotiate a workable combination.

	Once the receiving system accepts this facility request and accepts it,
     the next transfer is of a file (called the Proposal File) detailing the
     rooms the sender wishes to transfer.  This is sent as a simple text file
     (UNIX-style -- linefeed indicates end of line) using the usual network
     protocol (NOT the protocol mentioned in parameter 2, above), in which each
     pair of lines is a record.  The first line of each pair is a room name the
     caller wishes to transfer; the second is a filename (to be found in the
     transferred archive file -- if such is appropriate, but the two field
     record should still be used) that will contain the messages destined for
     that room.  A blank line indicates the end of list.  A text file format
     was selected both for simplicity of processing and of debug.

	The receiving system now sends a file (again, using the network
     protocol currently in effect, not the protocol mentioned above) back to
     the sending system indicating what problems, if any, the receiver has.
     This, too, is a text file, in which the first blank line of the text file
     indicates end of text file (and of problem report).  If the first line is
     blank, then the proposal of the sender is acceptable.

	But if the first line is NOT blank, then it should be the name of a
     room the receiver does not wish to receive.  Succeeding lines can contain
     more rooms that it won't accept that were present in the proposal of the
     sender.  The sender can use this list to generate a new facility request,
     although Citadel-86 itself will not attempt that.

	Anyways, if the receiver refuses to receive one of the rooms, then this
     facility is terminated at this point.  If the receiver makes no complaints,
     however, then the next step is to allow the sender up to two minutes to
     prepare the compressed file.  The sender indicates it is ready to proceed
     by sending a single ACK to the receiver.  The receiver should detect this
     and immediately begin receiving the archive file (using the protocol
     specified in String 2 of the facility request).

	If the receiver never receives the ACK, at the end of two minutes it
     should attempt to start its reception regardless.  If the reception fails
     then the network session should be deemed a failure and carrier dropped.

	Once the reception of the mass transfer file is complete, one more
     action must take place.  Since external protocols are definitely
     candidates for transfer links, we must be able to positively identify if a
     file has been transmitted, yet not all external protocols can be depended
     on telling the system if such has occurred. Therefore, the receiving
     system should, once the file reception has finished (and no matter what
     protocol is in use), check to see if the file actually was received and
     send back a packet (using the normal network protocol currently in use) of
     which only the first byte is significant.  If the value of the byte is
     GOOD, then the transfer was successful, if BAD then it was not successful.
     Astute network developers will note this is the same packet used for
     responding to Facility Requests (and thus should be exceedingly easy to
     implement).

     IV.6.k.2 File Format (String 3, option "0")
	The file containing the messages will be an archive file containing one
     or more files containing room messages to be integrated into the message
     base of a given system.  The exact format of the file depends on the
     archive method negotiated by the systems (see above); the names of the
     archived files and what rooms they relate to are entirely up to the
     sender, although they should be restricted to DOS limitations.  The
     mapping of filename to room is contained in the proposal file.

     IV.6.k.3 Errata
	o Only one archive file per net session should be sent.

	o Rooms can be sent both via archive file and normal room sharing
     commands during a network session.  Those sent via the archive file should
     be assumed to be "earlier" (older) than those coming via the room sharing
     facilities.  This practice is not recommended, however.

	o Rooms with zero length names cannot be sent using Mass Transfer.

	o C86 will be caching normal room messages just before calling the
     systems in question, or during the net session itself if the installation
     is called, rather than after a user logs out, after a net session, etc.
     This is due to the fact that sometimes inappropriate messages are left in
     net rooms by users which need to be deleted.  Management would be a
     nightmare to handle message deletions if messages are cached at first
     opportunity, so C86 will be doing it only during net times.  Hopefully,
     most installations using this option will be on h/w capable of caching
     and compressing messages quickly. 

	Virtual rooms are immediately cached on receipt, however.

	o As a later observation, it may become necessary to schedule a
     "caching" event for caching systems just before they are expected to call
     in.  This will make transfers more efficient at the cost of doing a cache
     before the net call begins -- that is, making us slightly vulnerable to
     village idiots getting their messages into a cache file.  Wise scheduling
     will keep that window small enough not to matter.

     IV.7 ITL Alternate Realities
        These facilities are used to attempt to change transfer medium types
     (communication protocols).  When two systems begin a Network Session,
     they should communicate via XMODEM.  However, while XMODEM is fairly
     reliable, it is a touch slow.  Therefore, it may be worthwhile for
     the two systems to attempt to switch from XMODEM to another protocol.

        At this point we should point out this command does not fit
     neatly into the ITL/AL layering.  Formally, this command should be
     confined to the ITL layer, without the AL layer knowing anything about
     it.  However, it has been decided this Facility Request will be
     transmitted and received just like any other Facility Request, thus
     impacting the AL.





                                    -14-






        Alright, enough of the nitpicking.  This Facility Request has
     one parameter connected with it, and it indicates which protocol the
     transmitter wishes to switch to for ITL transfers.  Whether or not
     the receiver can use this protocol, neither system should switch
     to the new protocol until the receiver has acknowledged the Facility
     Request, whether it be negatively or positively.  This allows one
     system to request a protocol the receiver does not support without
     mass confusion arising.

        The four currently valid parameter values are:

        "0" -- Indicates a request for XMODEM.  (Superfluous.)
        "1" -- Indicates a request for YMODEM.
        "2" -- Indicates a request for WXMODEM.
        "3" -- Indicates a request for ZMODEM.  (not supported in C86.)

        As indicated, the parameter values are really ASCII strings, not
     binary data.

        The value used for changing ITL transfer mediums is 100.

     IV.8 Security
        These facilities address security concerns on the network.

     IV.8.a System Net Password
        This facility provides a rough security system by allowing a string
     designated to be a password to be sent by the caller to the receiver.
     The protocol itself does not designate what a bad (or good) password
     should mean to the receiving system; this is up to the implementors.  As
     an example, the implementor of Citadel-86 has made the following
     decisions (this is [or should be] detailed in NETWORK3.MAN):

      o If there is no password listed for this system, and none is sent, or a
        zero-length password is sent, then the caller is assumed to be
        validated, and all commands will be whole-heartedly executed.
      o If the caller sends a password matching (non case-sensitive) with
        the password the receiver has recorded for the caller, then the
        caller is validated and all commands will be executed.
      o If the caller sends an invalid password, then the receiver will do
        nothing useful during role reversal, and will not respond positively
        to role reversal requests.

        Technically, this command is very simple.  The caller sends the
     command byte to the receiver, and the first parameter of the command byte
     contains the password (<= 20 including terminating NULL).  The receiver
     ALWAYS responds positively, whether or not the password matches.

        The value of the System Net Password byte is 202.

     IV.9 Other Reserved Facility Byte Values.
        Byte values 11 - 13 are reserved for STadel routing.

        Before using any other byte values, please try to coordinate with
     whomever else is implementing C86Net.





                                    -15-







     IV.10 Facilities -- Short List
            Name    |     Byte Value  |   Description
            ----    |     ----------  |   -----------
     Hangup         |         0       |   End a network session or role
                    |                 |           reversal.
     Error Code     |       200       |   Alternate error reporting (not
                    |                 |           implemented on Citadel-86).
     Role Reversal  |       201       |   Role reveral.
     Normal Mail    |         1       |   Send Mail.
     File Request   |         2       |   Request a File.
     Ambiguous FR   |         3       |   Ambiguous File Request.
     AFR w/ approval|         4       |   Ambiguous File Request With Approval
                    |                 |           (not implemented).
     Network Room   |         5       |   Send messages from room to system.
     Check Mail     |         6       |   Check Mail previously sent.
     Send File      |         7       |   Send File to system.
     Alt Room Net   |         8       |   Share room alternate system (routing).
     Route Mail     |         9       |   Mail Routing
     Message        |        10       |   Compact all messages during network
         Compaction |                 |   session
     ITL change     |       100       |   Change ITL communication protocol.
     System pwd     |       202       |   System password.
     STadel         |       11-13     |   STadel
        reserved

     V. Minimal Compatability Requirements
        In order for a system to be compatible with C86Net at a minimal level,
     it must satisfy requirements at the ITL and AL levels.

        At the ITL level, it must be able to call stabilize and use the XMODEM
     style of transfer for all facilities supported at the AL level.  This
     includes the SYSTEM ID following call stabilization.

        At the AL level, technically the minimum facility support you
     need is only the Hangup facility (Section IV.5.a).  However, that's
     hardly useful, so a practical minimum would be the Hangup and Mail
     commands.

     VI. Anytime Netting
        While this document was originally written to only address the behavior
     of two C86Net-compatible systems during a network session, it seems
     some brief mention of "anytime netting" might be appropriate in this
     document.

        When C86Net was first implemented in Citadel-86, one of the design
     decisions made was systems would communicate at a set time during
     the nighttime hours in order to exchange messages and other data.

        This, as it turns out, was a very simplistic decision, and when the
     idea of "events" was introduced by David Parsons, they were immediately
     seized upon as a way to allow multiple net sessions during a day.  This
     greatly expanded the flexibility of the network.






                                    -16-






        However, since most systems did not wish to take up daytime (i.e.,
     "prime time") hours with static net sessions, delays in delivery of net
     messages to other systems were still large, and with the network reaching
     international proportions, forcing messages to traverse several
     backbones to reach all systems, propagation delays were becoming
     irritating.

        At that point, several groups indicated a great deal of interest in
     "anytime netting", and several people implemented it.  After some
     unfortunately boneheaded delay, Citadel-86 has implemented it.

        While the method of deciding when a net session is to be held between
     systems is not part of the definition of C86Net, it would appear
     anytime-netting is handy enough to be worth a short note.  Basically, to
     handle anytime-netting, a C86Net compatible system must be able to accept
     a C86Net call during anytime of the day or night, and may optionally be
     able to call out during the day to other selected C86Net systems.
     Apparently (and this is rather tentative), the best method of detecting
     a C86Net call is to scan the input for a binary 7 (the first byte of
     stabilization) when a call is detected by a system.  If a 7 is detected,
     then the receiving system should stop output at once (if it has some form
     of autobaud) and switch to network mode.


     VII. Message Transfer Format
        A C86Net message (like the original Citadel message format) consists
     of a collection of C strings (ASCII text followed by a null byte).  Each
     of these strings is the value of some part of the message; precisely which
     part is identified by the first byte of the string, and this byte is known
     as the field identifier for this string.

        Fields may come in any order, except the Message field text is the
     last field of the message, and must always be present.  Most other fields
     of a message do not have to be present, but it is recommended that as
     many as are practical be filled in, particularly the date, time, system
     origin, and message number fields, since these may be used for 'vortex'
     control.

        Any data following the null byte of the message field is considered
     to be either garbage or part of the next message, if more than one message
     has been sent.

     VII.1 Field types
        The fields of a C86Net message seem to fall into three categories,
     displayable, non-displayable, and special.  Fields which are 'displayable'
     are generally fields of interest to the user, such as the author of the
     message, the text of the message, etc.

        Fields which are 'non-displayable' usually contain information useful
     for housekeeping on the net.

        The following sections cover all three types of fields in detail,
     including suggested formats for data.






                                    -17-






     VII.1.a Displayable fields
        As noted, these fields usually contain data of interest to the human
     readers.  Each field is treated separately.  Normally there should only
     be one instance of each field in a message; exceptions will be noted.

        Message Author: Field identifier 'A' identifies an author field.  This
     field may be no more than 128 bytes (including the trailing null byte), and
     should contain the name of the author of the message.

        Message Date: Field identifier 'D' identifies a date field.  This
     field, limited to 20 bytes, should contain only the date when the message
     was entered.  Current standard format is yymmmdd, such as "89Jan01".
     Note that by adhering to this format, and others like it, individual
     software packages may more easily customize message headers when
     displaying messages from foreign systems, and allow the foreign systems
     to do likewise.

        Message Time: Field identifier 'C' identifies a time field.  This
     field, limited to 20 bytes, should contain only the time the message was
     entered.  Current standard format is hh:mm <am | pm>, such as "12:44 pm".

        System Origin: Field identifier 'N' identifies a system origin field.
     This field, limited to 20 bytes, should contain the name (human readable)
     of the system this message originated on.  It is NOT recommended this
     field be used for housekeeping purposes!

        System Domain: Field identifier 'X' identifies the home domain of
     the system.  This field should only be filled in if domains are actually
     implemented in your software, since other systems on the net will use
     a combination of domain and system name to reply to net Mail.

        Message Recipient: Field identifier 'T' identifies a To field.
     This field, limited to 128 bytes, should contain the name of the recipient
     of this mail message.  Non-mail messages may contain 'T'o fields, too,
     but delivery of such messages should not be expected (see Facility Request
     1, above).  Normally, this field is used to deliver network mail to users,
     but see the 'w' field, below.

        Other Recipients: Field identifier 'W' identifies an Other Recipient
     ("Who else?") field.  This field, limited to 61 bytes, identifies a
     recipient of Mail other than the primary recipient.  It is not, however,
     a field which should be used for Mail delivery by recipient systems; it
     is transmitted purely for cosmetic reasons.  See the 'w' field, below.
     There may be more than one Other Recipient field in a message.

        OtherNet Address: Field Identifier 'P' identifies an "OtherNet
     Address".  This is a free form string which is used to form addresses
     of use to other networks, such as USENET, FidoNet, etc.  This is filled
     in by users sending Mail to systems on other nets, and can also contain
     "return address" information for messages coming in from other Nets.

        Message Text: Field identifier 'M' identifies a message text field.
     This field is currently limited to 7499 bytes, but this is an artificial
     limit and should be done away with someday.  This text should be in
     normal Citadel format, except all Carriage Returns should become
     Line Feeds during transmissions (for obscure historical reasons).



                                    -18-





     VII.1.b Non-Displayable fields
        System ID: Field identifier 'O' identifies a system id field.  The
     system id field, limited to 20 bytes, identifies a system at program
     level.  This field should be used for any housekeeping purposes which
     involve identifying other systems.  The current format of the data of
     this field is traditional Citadel system id, e.g., "US 612 431 1107",
     since this is a relatively static value for most systems -- far more
     static than the 'N' field has turned out to be.

        Room ID: Field identifier 'R' identifies a room name field.  This
     field, limited to 20 bytes, is the name of the 'room' in which this
     message originated.  Some systems may find this field cramped ...

        Message ID: Field identifier 'S' identifies a message id field.  This
     field, limited to 20 bytes, contains the message number assigned to this
     message by the originating system.  NOTE: the format of this data is
     special.  It is "<high 16 bits><space><low 16 bits>", where the first
     number is the high 16 bits of the message id in decimal, and the second
     number is the low 16 bits of the message id in decimal.  For example,
     if a message had id 4099, it would appear in the 'S' field as "0 4099".
     This special format is retained for possible backward compatability with
     CP/M versions of Citadel ... which are still in use and threatening to
     network, believe it or not!

        Recipient Override: Field identifier 'w' (different from 'W', above)
     identifies a Recipient Override field.  'w' fields, of which there may
     be multiple instances in a message, should appear only in net Mail
     messages.  When they are present in a message, they OVERRIDE the 'T'o
     field of the message; that is, the message of which they are part of
     should be delivered to the person named in each 'w' field, and the person
     named in the 'T'o field should be ignored insofar as Mail delivery goes.
     For example, if a message was received during Facility Request 1 which
     had 3 'w' fields within it, with values of "Jocko", "Moo Cow", and
     "Jack the Snipper", then the message should be placed in the Mail of
     those three users, and not to whomever was named in the 'T'o field.
     'w' fields may be up to 45 bytes long (although only 20 bytes really
     makes sense).  'w' fields are creatures of the net; there should be no
     reason to save them in your message base.

        Target System: Field identifier 't' identifies a Target System.  This
     field, limited to 20 bytes at the moment, if present will contain the
     name of the system this piece of Mail is targeted for.  This field is
     purely a creature of the net and should not need to be saved in message
     bases, but only in temporary files.  At the moment, Citadel-86 is using
     this field for internal purposes only, involving OtherNet integration.
     Other software need not expect this field in Mail messages.

     VII.1.c Special Fields
        There are two sorts of special fields.  The first are those reserved
     for STadel use by David Parsons, and those field identifiers are 'Z',
     'J', 'I', and '#'.

        The second type of special field are those identifiers reserved for
     other C86Net developers.  As the net has grown, become more popular, and
     endured childish squabbles as poor programming practices and large egos
     clashed, Mark Metson, developer of the Knotwork software, noted the lack




                                    -19-






     of communication and devised a scheme to allow further development of
     C86Net to proceed while protecting developers from each other.  His
     modified proposal has been incorporated into C86Net, and it essentially
     consists of assigning to each 'major' developer a field identifier which
     they may use for their own work.  All other developers are asked not to
     use these identifiers for their own purposes.

        At first it may seem a single identifier is rather inadequate,
     but actually it need not be.  Since the developer is assigned the field
     identifier for their exclusive use, they may use it as they like, so
     long as they remember it must be treated just like any other field
     identifier in that a NULL byte still constitutes an "End of Field" mark.
     The first idea which comes to mind is to use the second byte of the field
     as a "SubField Identifier", for the developer's own purposes.  There may
     be other ways of using it, as well.  In any case, it should be apparent
     the exclusive use of a single identifier should be more than
     adequate for a developer's needs.

        There is no requirement for one developer to carry or save another
     developer's fields on the network.

     VII.1.d Developer's Fields Assignments
        In keeping with the Citadel tradition of using ASCII for field
     identifiers, the following assignments have been made to known developers
     who are involved, or thought to be involved, with the net.  If you are
     not listed here and wish to be, please contact Hue, Jr. or his successors
     for an assignment.  (For those confused by flawed documentation distributed
     by K2NE, K2NE never has been and never will be Hue, Jr.'s successor in
     this matter.)

      Identifier        Assigned to             Software
      ----------        -----------             --------
         '0'            David Parsons           STadel
         '1'            Jay Johnson             Amiga Citadel-68k
         '2'            Hue, Sr.                NeoCitadel
         '3'            farokh irani            Citadel-286
         '4'            Gary Meadows/BKB        Asgard-86
         '5'            Mark Metson             Knotwork
         '6'            K2NE                    K2NE
         '7'            elim & Mr. Neutron      <fnord>adel
         '8'            cmc                     Fortress
         '9'            b0b                     b0badel

        Mark Metson's scheme, at least at this point, appears to constitute a
     very good way to avoid clashes in field identifiers in the future.
     Therefore, developers are asked not to trample outside their assigned
     identifiers without coordinating with other C86Net developers.  Citadel-86
     remains the primary C86Net developer so long as Hue, Jr. continues to
     program.

     VII.2 Special Fields becoming Standard Fields
        The fields detailed above, with the exception of the "developers'
     fields", constitute a 'standard' collection of fields.  Not all standard
     fields need be supported by a system, of course.






                                    -20-





        A field devised by a developer may eventually become a standard field
     if it displays a wide enough appeal amongst the developers.  Unilateral
     grabbing of fields is frowned upon deeply with the advent of developers'
     fields.  The transformation from a developer's special field to a standard
     field will no doubt require negotiation, biting of fingernails, etc. etc.
     Due to the anarchic nature of the net, there can be no "final arbiter" on
     matters such as these; instead, developers are asked to behave in a
     responsible and respectful manner.  The actual procedures for adding a
     developer's field (and thus functionality) to the standard set will be
     developed when, and if!, needed.

     VII.3 Other Additions to the Standard Fields
        Hue, Jr. of Citadel-86 reserves the right to add new fields to the
     standard set at any time.  Since Mark Metson's scheme should protect
     all developers from each other, this should not disrupt any other
     developer who follows the rules.

     VII.4 Identifier Summary

      Identifier        Data                                 Max Length
      ----------        ----                                 ----------
      'A'          Author of current message.                128
      'C'          Time message was written.                 20
      'D'          Date on which message was written.        20
      'J'          STadel reserved
      'I'          STadel reserved
      'M'          Message text, all CRs changed to Line     7499, should not
                    Feeds.                                         be limited,
                                                                   though.
      'N'          Name of system which message was          20
                    written on.
      'O'          ID of system which message was written    20
                    on (i.e., "US 612 470-9635").
      'P'          OtherNet address                          128
      'Q'          C-86 reserved (inadvertently forgotten)
      'R'          Room which message was originally         20
                    written in.
      'S'          Message ID on source system, in old       20
                    CP/M Citadel 8-bit style (i.e., 32 bit
                    number split into two 16 bitters.  See
                    below in the example).
      'T'          Recipient of message (normally for        128
                    private Mail).
      'W'          Secondary recipient field.                45
      'X'          Domain of system originating message      20
      'Z'          STadel reserved
      't'          Target System identifier (OtherNet)       20
      'w'          Recipient override field.

      'Z'          STadel reserved                           ??
      'J'             "      "
      'I'             "      "
      '#'             "      "







                                    -21-






      '0'          David Parsons identifier field           variable
      '1'          Jay Johnson identifier field
      '2'          Hue, Sr. identifier field
      '3'          farokh irani identifier field
      '4'          Gary Meadows/BKB identifier field
      '5'          Mark Metson identifier field
      '6'          K2NE identifier field
      '7'          elim/Mr. Neutron identifier field
      '8'          cmc (Fortress) identifier field
      '9'          b0b (b0badel) identifier field
      
        In the above table, the MAX LENGTHS include the NULL byte.

     VII.5 An example
        So, a message on Test System (nodeId US 612 470 9635, nodeName 'C86
     Test System', domain 'MN') in room CitaNews) that looks like this:

        86Feb01 @ 10:01 from John Flash @ C-86 Test System _ MN
        This is a test.

      with a message ID of 5644 might look like this during transmission on
      the net:

      D86Feb01<0>C10:01<0>S0 5644<0>NC-86 Test System<0>OUS 612 470
      9635<0>AJohn Flash<0>RCitaNews<0>XMN<0>MThis is a test.<LF><0>

        Clear as mud, right?

     Appendix A.  Examples!
        The following are examples for selected facilities, in order to
     illuminate what may be otherwise very bewildering examples.  Not all
     of the facilities are covered.

        Many of the facilities will show examples at two levels:  a high level
     displaying the "file" flow used, and a low level view examining the
     contents of certain data and control packets.  Throughout the examples,
     the term "file" means an XMODEM session is completed, starting with block
     #1 and ending with block N and an EOT.  This may be an actual file being
     transferred, as will happen with File Requests, or it may mean a series
     of messages being transmitted, which may or may not be stored as a file,
     depending on the implementation, or it may refer to control information
     (such as a Facility Request), which again could be stored as a file on
     disk, or stored in a temporary RAM buffer.

        The abbreviation FR stands for Facility Request below.  In all cases
     below, unless otherwise noted, it assumes all Facility Requests are
     positively acknowledged.

     A.1 Call Stabilization
        The following illustrates a call in which the first attempt at call
     stabilization fails because the receiver, a 300/1200 system which cannot
     directly detect the baud of the caller, started looking at 300 baud, while
     the caller is at 1200.







                                    -22-






          CALLER                    RECEIVER
               <The systems connect!>
        <7><13>69> -->              receives garbage, switches to 1200 after
                                    4 seconds
         Times out at 4
         seconds
        <7><13>69> -->              Receives sequence
         Gets confirmation     <--  <~7><~13><~69>
          <ACK> -->                 Receives ACK

             CALL STABILIZATION COMPLETED

     A.2. ID & Name
        From a high level, caller identification flow control is very simple.

        CALLER           RECEIVER
             == <file> ==>

        The length of file in this case should never exceed a single XMODEM
     sector.  The contents should look like this:

         <C-string: nodeId><C-string: node name><trash>

        Suppose the node name of a system was Dandelion Wine, and the node id
     was US 612 732 4419.  Then the ID & Name "file" would contain

         US 612 732 4419<0>Dandelion Wine<0><irrelevant trash>

     A.3. Normal Mail
        At a high level, here is the sequence of file transfers.

           CALLER           RECEIVER
         == file: FR == >
                      <== file: GOOD ==
         == file: Mail> messages == >

        At a low level, the file: FR should only have a length of one sector
     (as should all FRs), containing:

        <1><0><126 bytes of irrelevant trash>

        The file: GOOD should contain the following:

        <1><127 bytes of trash>

        This is all a GOOD reply should ever contain, so we shall not
     explain it again.  Refer to Appendix A for an explanation of the
     appearance of file: Mail> messages.











                                    -23-







     A.4. Ambiguous Room File Requests
        Here is the high level view of this facility:

           CALLER           RECEIVER
         == file: FR == >
                      <== file: GOOD ==
                      <== file: File #1 header ==
                      <== file: File #1 ==
                            ...
                      <== file: File #n header ==
                      <== file: File #n ==
                      <== file: File header with empty string ==

        For a low level examination, let's assume the Caller asked for
     *.doc in a room called Whatever>.   The file: FR would then contain

        <3>Whatever<0>*.doc<0><0><irrelevant trash>

        Now let's suppose the RECEIVER has decided the files SEX.DOC
     and GARBAGE.DOC match with *.doc in Whatever>, with sizes of 100,909 and
     32,555 bytes. File #1 header would contain

        SEX.DOC<0>789<0><irrelevant trash>

     while File #1 itself would be the contents of SEX.DOC.  File #2 header
     would contain

        GARBAGE.DOC<0>255<0><irrelevant trash>

     while File #2 would be the contents of GARBAGE.DOC.  File #3 header,
     since no more files need to be sent, would contain

        <0><irrelevant trash>

     and that would constitute the end of this Facility.

     A.5 Network Room
        From a high level viewpoint, this Facility looks like this:

           CALLER           RECEIVER
         == file: FR == >
                      <== file: GOOD ==
         == file: messages == >

        The contents of the FR for a room named Philosophy would be

         <5>Philosophy<0><0><irrelevant trash>











                                    -24-






     A.6 Check Mail
        From a high level viewpoint, this Facility looks like this:

           CALLER           RECEIVER
         == file: FR ==>
                      <== file: GOOD ==
                      <== file: acknowledgements ==

        The content of the FR would simply be

           <6><0><irrelevant trash>

        Let's look at the example that all the Mail messages transferred
     earlier could be delivered.  The content of file: acknowledgements
     would then be

            <0><irrelevant trash>

     which would result in a single sector being returned to the transmitter.
     Now let's suppose two Mail messages could not be delivered.  One was
     addressed to Curly, while the other was addressed to Moe, both from
     Mikey.  Then the file: acknowledgements would contain

       <1>Mikey<0>Moe<0>87Oct08 @ 4:04<0><1>Mikey<0>Curly<0>87Oct07
       @ 23:13<0><0><irrelevant trash>

     A.7 Send File

        From a high level viewpoint, this Facility looks like this:

           CALLER           RECEIVER
         == file: FR ==>
                      <== file: GOOD ==
         == file: file ==>

        The contents of the FR for a file named GURGLE.NOT, size 13,934 bytes,
     would be

          <7>GURGLE.NOT<0>109<0>13934<0><0><irrelevant trash>

     A.8 Alternate Room Sharing
        From a high level viewpoint, this Facility looks like this:

           CALLER           RECEIVER
         == file: FR ==>
                      <== file: GOOD ==
         == file: messages ==>
                      <== file: messages ==

        For a room named Horse Trading, the FR would look like

          <8>Horse Trading<0><0><irrelevant trash>

        The file: messages would be the messages to be sent from the
     transmitter to the receiver, first, and then from the receiver to the
     transmitter.



                                    -25-






     Appendix B.  BBS Software compatible with C86Net
        The following BBS packages are known to be at least minimally
     compatible with C86Net.  Consult their documentation to find out how
     many facilities each supports.

      Name                 Home base           Number           Baud rates
      ----                 ---------           ------           ----------
      Citadel-86           C-86 Test System    (612) 470-9635   3/9600 (HST)
      NeoCitadel           Free Lunch          (612) 431-1107   3/12/24
      STadel               No longer supported per se.
      Amiga Citadel-68k    Images              (612) 884-7951   3/12/24
      Asgard-86            Hotel               (916) 927-7680   3/12/24
      Novucivitas          Novu                (916) ???-????   ????
      <fnord>adel          Secret Service      (403) 425-1779   300/1200/2400
      Fortress             Overmind            (???) ???-????   3/12/24/(PEP)
      Citadel-86e          Electronic New York (914) 735-9362   300/1200/2400
      b0badel              Interface           (???) ???-????   300/1200/2400
      K2NE                 Jersey Devil        (???) ???-????   ????

     Appendix C. Main C86Net
        Most of the homebase systems listed in Appendix B participate in
     what may best be termed the main C86Net, to which all systems are invited
     to participate in.





































                                   -26-


