| Document: FSC-0082
 | Version:  001
 | Date:     14 May 1995
 |
 | Stephan Slabihoud, 2:2446/[email protected]


                     A Proposed New Packet Type
                          Stephan Slabihoud
                      2:2446/[email protected]
                        90:400/[email protected]
              [email protected]
                         1.Rev: Sep 20, 1994




    Status of this document
    =======================

    This FSC suggests a proposed protocol for the FidoNet(r)
    community, and requests discussion and suggestions for
    improvements. Distribution of this document is unlimited.

    Fido and FidoNet are registered marks of Tom Jennings and
    Fido Software.

    Purpose
    =======

    This document should introduce a widely used standardised
    extension to FTS-0001, like FTS-0006, 0007 and 0008 are,
    and  provides a new way to switch to a new more confortable
    bundling method. I call this method XType-1. This is also
    more convenient than FSC-0014 (an earlier binary-style msg
    proposal) and allows multimedia extensions for further
    support (e.g. samples and pictures like World-Wide-Webb). An
    example how to implement MM extensions can be found at the
    end of this document. Note: This proposal does not suggest
    how to implement MM extensions, it should only demonstrate
    the flexibility of XType-1.

    Prologue
    ========

    The new bundling method (XType-1) that document is introducing
    is NOT backward compatible. So only new software packages may
    offer this bundling method.

    Why introducing a new bundle format?
    ====================================

    Well, FSC-0001, 0039, 0048 and 0045 are not very comfortable
    to handle. Software must be very complex to process a Type-2
    packet and looking for control lines like SEEN-BYs, MSGIDs,
    REPLYs and so on slows down the importing, processing and
    exporting of every mail.

    How can I recognize a new XType-1 bundle?
    =========================================

    XType-1 bundles are using a new extension "*.PKX" and not longer
    "*.PKT". So software can recognize a reveived XType-1 packet
    in a very easy way. Older software that do not know the XType-1
    bundling method will not touch the file. But it is highly
    recommended to send the XType-1 bundles only to nodes you know
    about that they can process this new bundling method.
    Filename naming is the same as in FTSC-0001 explained. Only the
    extension has been changed from "PKT" to "PKX".
    For older software it is possible to convert the XType-1 format
    in one of the older formats like FSC-0001, 0039, 0048 and 0045.


    Packet Header
    =============

      Offset
     dec hex
             .-----------------------------------------------------.
       0   0 | HeaderVersion      ($01) | I/M-Format           [1] | [2]
             +--------------------------+--------------------------+
       2   2 | ProductCode          (*) | ProductCode          (*) |
             +--------------------------+--------------------------+
       4   4 | Revision         (major) | Revision         (minor) |
             +--------------------------+--------------------------+
       6   6 | origZone             (*) | origZone             (*) |
             +--------------------------+--------------------------+
       8   8 | origNet              (*) | origNet              (*) |
             +--------------------------+--------------------------+
      10   A | origNode             (*) | origNode             (*) |
             +--------------------------+--------------------------+
      12   C | origPoint            (*) | origPoint            (*) |
             +--------------------------+--------------------------+
      14   E | destZone             (*) | destZone             (*) |
             +--------------------------+--------------------------+
      16  10 | destNet              (*) | destNet              (*) |
             +--------------------------+--------------------------+
      18  12 | destNode             (*) | destNode             (*) |
             +--------------------------+--------------------------+
      20  14 | destPoint            (*) | destPoint            (*) |
             +--------------------------+--------------------------+
      22  16 |                      password                       |
             |                8 bytes, null padded                 |
             +--------------------------+--------------------------+
      30  1E | Date/Time in POSIX 1003.1 format                (*) |
             | (4 bytes)                                           | [5]
             +--------------------------+--------------------------+
      34  22 | CapabilWord          (*) | CapabilWord          (*) |
             +--------------------------+--------------------------+
      36  24 |          length of origNetwork (in bytes)       (*) | [3]
             +-----------------------------------------------------+
      38  26 |  origNetwork, zero when "length of origNetwork"=0   | [4]
             |           null padded to an even length             |
             +-----------------------------------------------------+
      ~~  ~~ |          length of destNetwork (in bytes)       (*) | [3]
             +-----------------------------------------------------+
      ~~  ~~ |  destNetwork, zero when "length of destNetwork"=0   | [4]
             |           null padded to an even length             |
             +-----------------------------------------------------+
      ~~  ~~ |                    zero or more                     |
             ~                        packed                       ~
             |                       messages                      |
             +--------------------------+--------------------------+
      ~~  ~~ |      0      |      0     |      0      |      0     |
             '-----------------------------------------------------'

   (*) high-low-byte or low-high-byte according to I/M-Format-Flag
       (see [1]).

   [1] This flag defines Intel ($00) or Motorola ($01) format.
       Intel-Format stores low-byte first, Motorola-Format stores
       high-byte first.
   (2) HeaderVersion $01 means XType-1 ($02 means XType-2 and so on).
   (3) Length of network domain (max. 64k characters). Zero, when
       no network name is used, not known or your software does not
       allow a 5D address. When this field is $0000 the next field (the
       domain itself) will not be stored.
   (4) Domain names are not case sensitive.
   (5) POSIX 1003.1 format: Long integer containing the number of
       seconds since the 1st of January 1970 (00:00:00).

   Packet       = PacketHeader  { PakdMessage }  $00 $00

   PacketHeader = $01            /* $01 means XType-1 header             */
                  I/M-Format     /* $00=Intel format, $01=Motorola format*/
                  productCode    /* 0 for Fido, write to FTSC for others */
                  revision       /* revision or 0                        */
                  origZone       /* zone of pkt sender (otherwise null)  */
                  origNet        /* of packet, not of messages in packet */
                  origNode       /* zone of pkt sender (otherwise null)  */
                  origPoint      /* zone of pkt sender (otherwise null)  */
                  destZone       /* zone of pkt receiver (otherwise null)*/
                  destNet        /* of packet, not of messages in packet */
                  destNode       /* of packet, not of messages in packet */
                  destPoint      /* of packet, not of messages in packet */
                  password       /* session pasword  (otherwise null)    */
                  date           /* of packet creation, binary coded     */
                  time           /* of packet creation, binary coded     */
                  CapabilWord    /* bitvector of XType versions known by */
                                 /* orig. software                       */
                  origLength     /* length of orig domain                */
                  origNetwork    /* network of pkt sender                */
                  destLength     /* length of dest domain                */
                  destNetwork    /* network of pkt receiver              */



                   msb           Capability Word               lsb
    Node Supports  ------------FTSC Type Supported **)------------

                    U  S 14 13 12 11 10  9  8  7  6  5  4  3  2  1

    Type-N,XType-1  0  1  0  0  0  0  0  0  0  0  0  0  0  0  0  1

                    ^  ^
                    |  +-- "S" Indicates nodes able to process type 2,
                    |      type 2+ or stone age style packets
                    +----- "U" Indicates nodes able to process RFC-822
                           bundles.
                   ** - In the example bit definitions only XType-1
                        is defined now. The rest are to be concidered
                        "reserved by FTSC".

    Generating XType-1 bundles
    ==========================

     Do we have a CW              Does CW indicate
    stored for dest?  YES ---->   higher packets  YES ---> Generate higher
          NO                       we support?                packet
          |                            NO
         \|/                           |
          +-----<----------------------+
          |
     Fill header with all info
          |
     Add Messages
          |
     Terminate packet
          |
     Send packet


    Receiving bundles
    =================

      Receiving a PKX? NO -------------> Old style (PKT) format
         YES
          |
      HeaderVersion = $01 NO -------------> Process XType-Other
         YES
          |
      Store CW
          |
      Process


    Packed Messages in the XType-1 bundle
    =====================================

    To conserve space and eliminate fields which would be meaningless
    if sent, messages are packed for transmission in a binary style.

    XType-1 uses two different styles, a netmail style and an echomail
    style.


                            Packed Netmail Message
      Offset
     dec hex
             .-----------------------------------------------------.
       0   0 |     0      |     1       | I/M-Format           [1] |
             +--------------------------+--------------------------+
       2   2 | origZone             (*) | origZone             (*) |
             +--------------------------+--------------------------+
       4   4 | origNet              (*) | origNet              (*) |
             +--------------------------+--------------------------+
       6   6 | origNode             (*) | origNode             (*) |
             +--------------------------+--------------------------+
       8   8 | origPoint            (*) | origPoint            (*) |
             +--------------------------+--------------------------+
      10   A | destZone             (*) | destZone             (*) |
             +--------------------------+--------------------------+
      12   C | destNet              (*) | destNet              (*) |
             +--------------------------+--------------------------+
      14   E | destNode             (*) | destNode             (*) |
             +--------------------------+--------------------------+
      16  10 | destPoint            (*) | destPoint            (*) |
             +--------------------------+--------------------------+
      18  12 | Attribute            (*) | Attribute            (*) |
             +--------------------------+--------------------------+
      20  14 | cost                 (*) | cost                 (*) |
             +--------------------------+--------------------------+
      22  16 | Time/Date string (20 characters)                    | [2]
             +-----------------------------------------------------+
      42  2A |          length of origNetwork (in bytes)       (*) | [3]
             +-----------------------------------------------------+
      44  2C |  origNetwork, zero when "length of origNetwork"=0   |
             |           null padded to an even length             |
             +-----------------------------------------------------+
      ~~  ~~ |          length of destNetwork (in bytes)       (*) | [3]
             +-----------------------------------------------------+
      ~~  ~~ |  destNetwork, zero when "length of destNetwork"=0   |
             |           null padded to an even length             |
             +-----------------------------------------------------+
      ~~  ~~ |                  variable fields                    |
             ~                                                     ~
             |                                                     |
             `-----------------------------------------------------'

                            Packed Echomail Message
      Offset
     dec hex
             .-----------------------------------------------------.
       0   0 |     0      |     2       | I/M-Format           [1] |
             +--------------------------+--------------------------+
       2   2 | Attribute            (*) | Attribute            (*) |
             +--------------------------+--------------------------+
       4   4 | cost                 (*) | cost                 (*) |
             +--------------------------+--------------------------+
       6   6 | Time/Date string (20 characters)                    | [2]
             +--------------------------+--------------------------+
      26  1A |                  variable fields                    |
             ~                                                     ~
             |                                                     |
             `-----------------------------------------------------'

   (*) high-low-byte or low-high-byte according to I/M-Format-Flag
       (see [1]).
   [1] This flag defines Intel ($00) or Motorola ($01) format.
       Intel-Format stores low-byte first, Motorola-Format stores
       high-byte first. Date/Time always stored in the format above!
   [2] Time/Date string (ascii format)
       Format (see FTS):
       DAY [ ] MONTH [ ] JEAR [ ][ ] HOUR [:] MINUTE [:] SECOND [0]

          DAY: [00] ... [31]
        MONTH: [Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec]
         JEAR: [00] ... [99]
         HOUR: [00] ... [23]
       MINUTE: [00] ... [59]
       SECOND: [00] ... [59]

   (3) Length of network domain (max. 64k characters). Zero, when
       no network name is used, not known or your software does not
       allow a 5D address. When this field is $0000 the next field (the
       domain itself) will not be stored.


     Due to routing, the origin and destination net and node of a packet
     are often quite different from those of the messages within it, nor
     need the origin and destination nets and nodes of the messages within
     a packet be homogenous.

     PakdMessage  = $01             /* $01 indicates packed netmail message*/
                    I/M-Format      /* $00=Intel, $01=Motorola-Format  */
                    origZone        /* of message */
                    origNet         /* of message */
                    origNode        /* of message */
                    origPoint       /* of message */
                    destZone        /* of message */
                    destNet         /* of message */
                    destNode        /* of message */
                    destPoint       /* of message */
                    AttributeWord   /* as described in FTS-0001        */
                    cost            /* in lowest unit of originator's  */
                                    /* currency                        */
                    Date/Time       /* message body was last edited    */
                    origLength      /* length of orig domain           */
                    origNetwork     /* network of pkt sender           */
                    destLength      /* length of dest domain           */
                    destNetwork     /* network of pkt receiver         */


     PakdMessage  = $02             /* $02 indicates packed echomail message*/
                    I/M-Format      /* $00=Intel, $01=Motorola-Format  */
                    AttributeWord   /* as described in FTS-0001        */
                    cost            /* in lowest unit of originator's  */
                                    /* currency                        */
                    Date/Time       /* message body was last edited    */


    AttributeWord   bit       meaning
                    ---       --------------------
                      0  +    Private
                      1  + s  Crash
                      2       Recd
                      3       Sent
                      4  +    FileAttached
                      5       InTransit
                      6       Orphan
                      7       KillSent
                      8       Local
                      9    s  HoldForPickup
                     10  +    unused
                     11    s  FileRequest
                     12  + s  ReturnReceiptRequest
                     13  + s  IsReturnReceipt
                     14  + s  AuditRequest
                     15    s  FileUpdateReq

                           s - need not be recognized, but it's ok
                           + - not zeroed before packeting

    Bits numbers ascend with arithmetic significance of bit position.



    What is a variable field:
    =========================

    A variable field consists of a header of four bytes length:

             .-----------------------------------------------------.
       0     | DATA LENGTH          (*) | DATA LENGTH          (*) |
             |               $0000 when last field                 |
             +--------------------------+--------------------------+
       2     | FIELD-ID                                            |
             |           "ND" (end data) when last field           |
             +--------------------------+--------------------------+
       4     | FIELD-DATA                                          |
             ~                                                     ~
             | zero padded to an even length                       |
             `-----------------------------------------------------'


    Defined FIELD-ID's:
    ===================

    FIELD-ID  -  synonym to
    --------------------------------------------------------------
          FR     "From" user
          TO     "To" user
          SJ     "Subject"
          AR     AREA               (only used in echomails)
          PD     ^PID
          TD     ^TID
          ED     ^EID
          MD     ^MSGID
          RP     ^REPLY
          RT     ^REPLYTO           (used by uucp gateways)
          RA     ^REPLYADDR         (used by uucp gateways)
          SN     ^SEEN-BY           (only used in echomails)
          VA     ^VIA               (only used in netmails)
          RN     ^REALNAME
          SP     ^SPLIT
          CS     ^CHARSET or ^CHRS
          OR     Origin             (only used in echomails)
          TL     Tearline
          ML     Mailtext follows
          ND     End of data fields
    --------------------------------------------------------------
     multimedia extensions (explanation follows):
          VO     audio data VOC format
          WA     audio data WAV format
          MI     MIDI data
          GF     bitmap data GIF
          TI     bitmap data TIFF
          JP     bitmap data JPEG
          AV     video data AVI
    --------------------------------------------------------------
     write to St.Slabihoud for more...

    All fields must have an even length. An odd field length must
    be aligned to an even one with a padded 0.

     Field  = dataLength       /* of field data (incl. 0)   */
              fieldID          /* see table                 */
              fieldData        /* Field data                */

    Example (NetMail):
    ==================

    From: Stephan Slabihoud on 2:2446/110.6
    To  : Guenther Paczia on 2:2446/110
    Subj: This is a testmail
    -----------------------------------------
    ^PID: AVALON 3.72
    ^MSGID: 2:2446/[email protected] a3dbcfe5
    ^MYCTRL nothing interest
    This is the message body


             .-----------------------------------------------------.
             | MESSAGE-HEADER                                      |
             ~                                                     ~
             |                                                     |
             +--------------------------+--------------------------+
             | PACKED NETMAIL MESSAGE HEADER                       |
             ~                                                     ~
             |                                                     |
             +--------------------------+--------------------------+
             |           18             |           0              |
             +--------------------------+--------------------------+
             |           'F'            |           'R'            |
             +--------------------------+--------------------------+
             |             'Stephan Slabihoud', $00                |
             +--------------------------+--------------------------+
             |           16             |           0              |
             +--------------------------+--------------------------+
             |           'T'            |           'O'            |
             +--------------------------+--------------------------+
             |             'Guenther Paczia', $00                  |
             +--------------------------+--------------------------+
             |           18             |           0              |
             +--------------------------+--------------------------+
             |           'S'            |           'J'            |
             +--------------------------+--------------------------+
             |             'This is a testmail'                    |
             +--------------------------+--------------------------+
             |           12             |           0              |
             +--------------------------+--------------------------+
             |           'P'            |           'D'            |
             +--------------------------+--------------------------+
             |             'AVALON 3.72', $00                      |
             +--------------------------+--------------------------+
             |           34             |           0              |
             +--------------------------+--------------------------+
             |           'M'            |           'D'            |
             +--------------------------+--------------------------+
             |             '2:2446/[email protected] a3dbcfe5\0'   |
             +--------------------------+--------------------------+
             |           50             |           0              |
             +--------------------------+--------------------------+
             |           'M'            |           'L'            |
             +--------------------------+--------------------------+
             | '^MYCTRL nothing interest', $0A                     |
             | 'This is the message body', $0A                     |
             +--------------------------+--------------------------+
             |           0              |           0              |
             +--------------------------+--------------------------+
             |           'N'            |           'D'            |
             +--------------------------+--------------------------+
             | more messages or zero                               |
             ~                                                     ~
             |                                                     |
             +--------------------------+--------------------------+
             |      0      |      0     |      0      |      0     |
             '-----------------------------------------------------'


    Unknown control lines are stores as usual in the message body. So
    it is possible to receive a XType-1 packet and convert it into an
    old style Type-2+ packet to send to it to another systems that do
    not recognize the new Xtype-n bundles.

    Messages can be longer than 65535 bytes. Just use the 'ML' fields
    more than once. When importing such a mail the importer can easily
    split the mail into smaller parts. All 'ML' fields can be added to
    one big mail, or each 'ML' text can be stored in its own message.
    According to older software each 'ML' field should not be longer
    than 8 kbyte (but it is allowed to use longer fields!).

    All fields are unsigned integer.



    Example: How to implement MultiMedia extensions (draft version):
    ================================================================

    Graphics and sounds are coded in one of the following fields:
       Audio: VO,WA,MI
       Bitmap: GF,TI,JP
       Video: AV

    Each field-data starts with a multimedia header:

              .------------------------.
       0   0  | Name (Title)           |
              | 16 chars (zero padded) |
              +------------------------+
      16  10  | ID                     |
              | 32bit Random Number    |
              +------------------------+
      20  14  | Flags                  |
              | 16bit bitfield         |
              +------------------------+
      22  16  | 42 reserved bytes      |
              |                        |
              +------------------------+
      64  40  | start of data          |
              ~                        ~
              |                        |
              '------------------------'

      Flags:
       Bit 0/1  - 1 = align left
                  2 = align right
                  3 = center
                  0 = reserved
       Bit 2-15 - reserved


    There are some possibilties for a mail editor to show/play the
    multimedia extensions:

     1. It shows the mail in the first window and a list of all
        available fields in an extra (selection) window. The user
        selects the picture/sound from the selection window.

     2. Pictures will be put together with the mailtext in ONE window
        (a button will be shown when it is an audio field).
        To define the place where a picture (or other multimedia
        extension) is shown put following ^A-control line into the
        mailbody:     ^MMEDIA: <field> <id> [<infotext>]
          <field> is the "variable field" shortcut.
          <id> is the 32bit ID in hex from the multimedia header.
          <infotext> can be used as infotext for buttons.

    Example of ML field (mailbody):
    ------------------------------------------------------------
      Welcome to\n
      ^MMEDIA: GF 5417fde6\n\n
      Please select:\n\n
      To hear my voice click on the button:\n
      ^MMEDIA: VO 2f4dca67 Say it\n
      I am watching you ;-):\n
      ^MMEDIA: GF 5627320f Click here\n
    ------------------------------------------------------------

    This mail could be shown as follows:
    ------------------------------------------------------------
      Welcome to:
      +------------------------------+
      | GIF-Picture                  |
      +------------------------------+

      Please select:

      To hear my voice:
      +--------+
      | Say it |
      +--------+
      I am watching you ;-):
      +-------------+
      |             |
      | GIF-Picture |
      |             |
      +-------------+
    ------------------------------------------------------------
    Note: All pictures can be shown as button as well. This should
          be switchable in the mail editor.



    Credits
    =======

    Thanx to Jonathan de Boyne Pollard, Peter Dreuw, Daniel Roesen and
    Rowan Crowe for their good ideas.


    Epilog
    ======

    That's all, now it's up to you to decide whether or not to
    implement it.