Document: FSC-0058
Version:  002
Date:     01-Nov-1992



                  A New Way Of Addressing In FidoNet(r)

                      Wim Van Sebroeck & Jan Spooren
                            November 1st, 1992

           This document replaces the now obsolete version 001



   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 trademarks of Tom Jennings and Fido
    Software.



A. Why a new Proposal :
------------------------
FidoNet has grown from a few single BBSs to a worldwide network of nodes.
Because of that enormous growth, we have several kludge-lines just to write
to someone else. And for every extra dimension a new kludge is necessary.
(3D: ^AINTL ; 4D: ^AFMPT, ^ATOPT ; 5D: ^ADOMAIN). Every time a new
dimension or addressing-system is invented, not only the packer/router
software needs to be adjusted, but also the message editor and a whole
series of other utilities, being virtually the whole FidoNet software.

This is why we made this proposal:
1) to make life easier for programmers and developers.
2) to have a system that will have no problems with further
  backward-compatibility. (from this system on)
3) to have a system that is simple (in usage).
4) and to have a system that accepts every possible address.


B. Proposal :
--------------
To send a message one needs two things: the origin address and the
destination address. (And for routing inter-domain messages you also need
the address of the gateway). Until now, we needed four different
kludge-lines when we wanted to send a message to another domain (^ADOMAIN,
^AINTL, ^AFMPT, ^ATOPT). To minimize these kludges we suggest the
following:

       ^ADEST <dest_address>
       ^AORIG <orig_address>
       ^AROUTE <route_via_address>

These kludges are *not* followed by a colon (':').

1) The ^ADEST kludge: this kludge contains the address where the message
  has to be sent to. In other words: it contains the destination address.
  <dest_address> is an ASCII string that may contain any readable
  character, (above and including 32 (space) and below ASCII 128), and is
  only terminated by the end-CR of the kludge-line. It is up to the
  mailprocessors of every domain (FidoNet compatible or not) if they
  regard the address as case-sensitive or not.

  The FORMAT of <dest_address> is :

  <Address>[@<Domain>]

  Where <Address> is the valid username/address in the network <Domain>,
  and <Domain> cannot have any '@' of '/'-characters in it, while
  <Address> can. The reason why '/' characters are not allowed in the
  <Domain>-field, is because they are necessary to recognize a
  FidoNet-style address, since <Domain> is optional for messages that
  won't be crossing domain- borders. (*)

  In other words:  The domain is always the string behind the last @ sign
  in the <dest_address> field, except when domain would contain a
  '/'-character. In that case, <Domain> is the default domain, and
  <Address> is the complete string behind the DEST-kludge.

  Concerning FidoNet-compatible addresses, there are some extra rules,
  since FidoNet is one of these rare networks that haven't got the
  username in the address.

  A valid FidoNet <Address> is made up like this:

  <Username>@<Fido_Address>

  Where <Username>@ is mandatory and <Fido_Address> is a valid fidonet
  address. The FidoNet-address must contain at least the zone:net/node
  number. Point number is optional.

  Eg.: ^ADEST Wim Van Sebroeck@2:292/[email protected]

  will generate an outbound message for user 'Wim Van Sebroeck' at
  Fido-node 2:292/862.0 within FidoNet. The domain name for FidoNet is
  'FidoNet.Org', and *not* just Fido, or FidoNet or whatever. This is not
  a waste of space, since the domain name can be omitted when the message
  remains in the default network. Only for messages crossing domain
  borders, the domain name is necessary. We opted for the '.org' and
  '.ftn' suffixes, in order to make interfacing to InterNet easier.

  Some more addressing-examples:

        ^ADEST Jan Spooren@2:292/[email protected]
        ^ADEST 292/862-cosysops@2:292/850
        ^ADEST TE880714%BANUFS11@BITNET
        ^ADEST Jack@OS/2.dev.itnet@itnet
        ^ADEST m2xenix!uunet!BANUFS11.BITNET!TE880714@uucp

  The first example should be clear, since it will be the most frequently
  used addressing-style.
  The 4th example shows the kludge for a message to the address
  'Jack@OS/2.dev.itnet', within domain 'itnet'. There is no problem
  whatsoever with the '/' character, because it is part of the <Address>,
  and not of the <Domain>.
  In the last example, the message has to be sent to the uucp-gateway,
  wich will send it on within the internet-network, with the
  destination-address: 'm2xenix!uunet!BANUFS.11BITNET!TE880714'

  Also this is a valid address:

  ^ADEST Wim Van Sebroeck@2:292/[email protected]@SIGnet.ftn

  The message will be sent to 2:292/[email protected], within SIGnet.ftn.
  SIGnet will then send the message back to 2:292/862.0 in FidoNet.
  The message will cross the domain-borders twice. Apart from the fact
  that it may seem an annoying practice, technically the address is 100%
  OK.

  Information in the DEST-kludge will always override information in the
  FTS-0001 message header.



  FOOTNOTE:

  (*)

  For a proper understanding of this '/'-restriction, let's illustrate
  this by means of an example. If we send a message with a kludge like
  this:

  ^ADEST Wim Van Sebroeck@2:292/862

  Then the mailprocessor could wrongly interpret the <dest_address>:
  It could decide the <address> to be 'Wim Van Sebroeck' in <domain>
  '2:292/862'. But with the '/'-restriction it is now clear that the
  address is 'Wim Van Sebroeck@2:292/862' in the default domain.


2) The ^AORIG kludge: this kludge contains the origin address.
  <orig_address> has the same restrictions as the <dest_address>.

  For example: ^AORIG Wim Van Sebroeck@2:292/[email protected]
           or: ^AORIG Infomag.Dev@ITNet


3) The ^AROUTE kludge: this is needed to point to the gateway address, when
  sending a message to another domain. Since not all gateways are listed
  in the nodelist and because possibly not all intermediate systems are
  aware of a particular domain-name, it is necessary to add the address of
  the gateway.
  The gateway is a system within the default domain, that can send the
  message to the desired domain. The kludge can also be used, however, to
  point to a zonegate between different zones in one domain. In any case,
  for every domain-border that will be crossed, there needs to be one
  ROUTE-kludge to indicate the gateway. It should be obvious, that a
  FidoNet-address in a ROUTE-kludge never carries a username.

  The ROUTE-kludge always overrides the DEST-kludge. A system receiving a
  message should ALWAYS send the message to the address specified by the
  ROUTE-kludge, and NOT to the destination address. In other words, the
  ROUTE-kludge is not to be interpreted as a hint to a possible gateway,
  but must be regarded as a new destination address, and the message will
  always have to reach the gateway. The gateway will then change the
  ^AROUTE to a ^AROUTD kludge, in order to indicate that the gateway
  received the message, and to see to it that the message won't travel
  back to the gateway. This absolute priority of the ROUTE-kludge above
  the DEST-kludge is necessary, since otherwise messages could be bouncing
  between two nodes that both prefer different gateways to send the
  message to.
  The ROUTE-kludge also has nothing to do with the actual routing itself.
  The ROUTE-kludge only defines an intermediate address that has to be
  reached before the message reaches its final destination. How the
  message gets to this intermediate address doesn't matter: it may be
  direct or it may be routed through other systems. Remember that FidoNet
  is an amateur network, with each system paying its own phone bills!

  For example: ^AORIG Wim Van Sebroeck@2:292/[email protected]
               ^AROUTE 1:105/[email protected]
               ^ADEST m2xenix!uunet!BANUFS11.BITNET!TE880714@uucp


C. Advantages and Disadvantages :
---------------------------------
a) Advantages:
    - The main advantage is that one only needs two kludges to specify the
      origin and the destination address. (And that these kludges are
      always in a message).
    - The system is also very flexible because any address is possible.
    - Utilities must not be updated when a new address-dimension is created.
    - Inter-domain and inter-network messages are finally possible.
    - No limits are placed on both username and address-field length.
    - Perfect compatibility is ensured with future message and packet
      formats that will override FTS-0001.

b) Disadvantages:
    - Please be so kind to write them to us. We can't figure what they
      could be?


D. Implementation Notes :
--------------------------

D.1. Processing an outgoing message.

-----+----------+-------------------------+-------------------------+-----.
|State| State    | Predicate(s)            | Action(s)               | Next|
|  #  | Name     |                         |                         | St  |
|-----+----------+-------------------------+-------------------------+-----|
| O1  | MsgFound | Find DEST/ROUTE         | 1 Found fsc-58 kludge   | O2  |
|     |          | kludges in message      | 2 Fsc-58 kludge not fnd | S8  |
|     |          |                         | 3 Error occured         | exit|
|     |          |                         | 4 Dest is 1 of our AKAs | exit|
|-----+----------+-------------------------+-------------------------+-----|
| O2  | ReadKldg |                         | Take only 1st ROUTE and | O3  |
|     |          |                         | 1st DEST-kludge         |     |
|-----+----------+-------------------------+-------------------------+-----|
| O3  | ChkROUTE | Is there a ROUTE kludge | 1 Route kludge found    | O4  |
|     |          |                         | 2 No route kludge       | O10 |
|-----+----------+-------------------------+-------------------------+-----|
| O4  | WeRoute? | Is ROUTE one of our     | 1 Yes                   | O5  |
|     |          | AKA's                   | 2 No                    | O9  |
|-----+----------+-------------------------+-------------------------+-----|
| O5  | DsblROUT |                         | Change ROUTE into ROUTD | O6  |
|     |          |                         | and strip 'TOPT' and    |     |
|     |          |                         | 'INTL'-kludges to our   |     |
|     |          |                         | system.                 |     |
|-----+----------+-------------------------+-------------------------+-----|
| O6  | WeGate?  | Are we a gateway to     | 1 Yes                   | O7  |
|     |          | another domain?         | 2 No                    | O2  |
|-----+----------+-------------------------+-------------------------+-----|
| O7  | Needgate | Get next ROUTE/DEST-kldg| 1 Yes                   | O8  |
|     |          | Is it another domain?   | 2 No                    | O3  |
|-----+----------+-------------------------+-------------------------+-----|
| O8  | Gateway  |                         | Do gatewaying-stuff     | exit|
|     |          |                         | Don't forget to strip   |     |
|     |          |                         | @<domain> from the      |     |
|     |          |                         | <dest_address>          |     |
|-----+----------+-------------------------+-------------------------+-----|
| O9  | SndROUTE |                         | SendMsg to ROUTE        | S1  |
|     |          |                         | (Temp. Dest = ROUTE)    |     |
|-----+----------+-------------------------+-------------------------+-----|
| O10 | SndDEST  |                         | SendMsg to DEST         | S1  |
|     |          |                         | (Temp. Dest = DEST)     |     |
`-----+----------+-------------------------+-------------------------+-----'


D.2. Sending of an outgoing message

SendMsg(Temporary_destination)

-----+----------+-------------------------+-------------------------+-----.
|State| State    | Predicate(s)            | Action(s)               | Next|
|  #  | Name     |                         |                         | St  |
|-----+----------+-------------------------+-------------------------+-----|
| S1  | Looktabl |                         | Find node to route to   | S2  |
|     |          |                         | according to own routng |     |
|     |          |                         | scheme and msg-attribs. |     |
|-----+----------+-------------------------+-------------------------+-----|
| S2  | IsFsc58  | Lookup in table if node | 1 No, not fsc-58 compl. | S3  |
|     |          | is fsc-58 compliant     | 2 YES! Fsc-58 compliant | S8  |
|-----+----------+-------------------------+-------------------------+-----|
| S3  | FMPT     | Has ORIG-kludge point#  | 1 No                    | S4  |
|     |          |                         | 2 Yes: Insert FMPT-kldg |     |
|     |          |                         |   if not already present|     |
|-----+----------+-------------------------+-------------------------+-----|
| S4  | TOPT     | Contains                | 1 No                    | S5  |
|     |          | temporary_destination   | 2 Yes: Insert TOPT-kldg |     |
|     |          | a point-address ?       |   if not already present|     |
|-----+----------+-------------------------+-------------------------+-----|
| S5  | INTL     | Compare ORIG and        | 1 Zones equal           | S6  |
|     |          | temporary_destination   | 2 Not eq. : Make INTL-k |     |
|     |          |                         |   if not already present|     |
|-----+----------+-------------------------+-------------------------+-----|
| S6  | DOMAIN   | Compare ORIG and        | 1 Domains equal         | S7  |
|     |          | temporary_destination   | 2 Not eq. : Domain-kldg |     |
|     |          |                         |   if not already present|     |
|-----+----------+-------------------------+-------------------------+-----|
| S7  | Usernames|                         | Fill in FTS-1 dest and  | S8  |
|     |          |                         | orig usernames, accord. |     |
|     |          |                         | to ORIG and DEST except |     |
|     |          |                         | when ORIG/D names blank |     |
|-----+----------+-------------------------+-------------------------+-----|
| S8  | XportMsg |                         | Export message          | Exit|
`-----+----------+-------------------------+-------------------------+-----'


D.3. Processing an incoming message:

-----+----------+-------------------------+-------------------------+-----.
| I1  | ChkKldg  | Find DEST/ROUTE/ORIG    | If found: store kludges | I2  |
|     |          | kludges in message      |                         |     |
|-----+----------+-------------------------+-------------------------+-----|
| I2  | ChkFSC58 | Are DEST/ROUTE/ORIG     | 1 Yes, fsc-58 compliant | I3  |
|     |          | Kludges available?      | 2 No, not fsc-58 compl. | I4  |
|-----+----------+-------------------------+-------------------------+-----|
| I3  | ChkTable | Is originator of packet | If not in lookup-table  | I4  |
|     |          | in lookup-table? ^^^^^^ | and should be, then     |     |
|     |          |      ( SEE SECTION E !) | add node to the table   |     |
|-----+----------+-------------------------+-------------------------+-----|
| I4  | ChkDEST  | Is message to us?       | 1 Yes: store message    | exit|
|     |          | (Are we DEST?)          | 2 No                    | I5  |
|-----+----------+-------------------------+-------------------------+-----|
| I5  | KeepTrans| Do we keep a copy of in-| 1 Yes: Store msg and -->| O1  |
|     |          | transit mail ?  :-(     | 2 No:                   | O1  |
`-----+----------+-------------------------+-------------------------+-----'



E. Discussion of the Implementation Notes.
------------------------------------------

* O5, "DsblROUT" :

 It is clear that when a message travels through an intermediate system
 which is mentioned in a ROUTE-kludge, this ROUTE-kludge will have to be
 removed, because the message did arrive at this system.  Instead of just
 deleting the whole kludge-line, the kludge will be changed in ROUTD.
 This is a much easier and faster process for a mailprocessor and it
 enables the recipient of the message to have some information about the
 route the message took.

 Because there is no FTS-0001 equivalent to the route-kludge, a system that
 is in a route-kludge needs to be FSC-0058 compliant.  The intermediate
 systems to this ROUTE-system need not to be FSC-0058 compliant: Our
 implementation notes assume a list of fsc-0058 compliant nodes (the
 'lookup table'), that is continuously updated, when messages arrive from
 fsc-0058 systems.  When a message is to be send on to a non-fsc-0058
 system, the message will be converted to the old FTS-0001 format,
 including FMPT-, TOPT- and INTL-kludges.  The destination-address in this
 (converted) message will then be the address of the first ROUTE-kludge.

 There is one tricky point:  When such a message arrives at this ROUTE-
 system, the message can have TOPT (if the system is a pointsystem) and
 INTL kludges in the messagebody, due to the conversion to the FTS-0001
 format.  The ROUTE-system's mailprocessor will have to find these and
 strip them from the message.

* S3 -> S7 :

 These stages perform the conversion to FTS-0001 format, in case the next
 receiving system will be non-fsc-0058 compliant.

* I3, "ChkTable" :

 Care must be exercized:  If we find FTS-0058 information in a message
 we don't know if the last system, or any of the previous systems the
 message passed is fsc-0058 compliant.  We can only know for sure when the
 message was sent directly to us.  That is (in FidoNet packet type 2) when
 the packet-orig address is the same as the message orig-address, or when
 the packet-orig address is the same as the last routd-kludge address.

 We are aware of the fact that the lookup-table won't be filled fast this
 way.  But we don't want that:  We only have to know if our 'surrounding'
 nodes, i.e., the nodes with which we have frequent connections, support
 fsc-0058.
 We also want to know if gateway systems are fsc-0058 compliant, because we
 have to put them in a ROUTE-kludge.  But these should be just a few
 systems and the fact of their fsc-0058 compliance will be known easily.
 They can then be added manually.

 We do not even dare to suggest the use of a nodelist-flag, that could
 simplify this whole system of investigating the fsc-0058 compliance, in
 order to downgrade to the FTS-0001 level for non-compliant systems.



F. Questions :
---------------
Questions can always be sent to:

   Jan Spooren             2:292/[email protected]
   Wim Van Sebroeck        2:292/[email protected]



                     --- End Of Proposal ---