Document: FSC-0048 Version: 002 Date: 21-Oct-90 A Proposed Type-2 Packet Extension Jan Vroonhof 2:281/1.12@fidonet Oct 21, 1990 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 ======= The final goal of this document is to become a widely used standardised extension to FTS-0001, like FTS-0006, 0007 and 0008 are, and provide an elegant way to switch to a new bundling method without requiring major effort or breaking anything. Prologue ======== The main thing that needs stressing is that the additions covered by this document are FULLY (I repeat FULLY) BACKWARDS COMPATIBLE with FTS-0001 (and other existing standards and practices in FidoNet and WhatEverOtherNets that I know of). When I say "backwards compatible" I mean that problems it would create already exist in the current FTS-0001 system (e.g. zone conflicts when dealing with a non compliant system). In short it only corrects some flaws in FTS-0001 WITHOUT generating new ones. In this document I have tried to stay as much as possible on the paths of existing practices. Therefore I think implementation of the additions it proposes will not be too hard. ! Prologue to revision 2 ! ====================== ! Revision 2 of this document reserves a bit in the ! CapabilityWord for one bundle type already in use outside of ! FidoNet, RFC-822. A small change was made to the "receiving" ! flowchart in order to ensure compatibility with FSC-0039.004. ! In the process a lot of errors and omissions in the spelling, ! credits etc. were corrected. =============== ! All references in the following to FSC-0039 are to Revision 1 ! of that document. My thoughts on FSC-0039 and FTS-0001 rev 12 =========================================== First, revision 12 of FTS-0001 introduced the term "(some impls)" to indicate that some implementations used their own ! extensions to FTS-0001 (Note that in later revisions this was ! changed to "optional"). The problem is that this info cannot be relied upon, because there is no way to actually validate the data. One can only check whether the values of these fields are in the range of valid values and hope for the best. Second, FSC-0039 introduced the idea of having a bitfield (called the Capability Word) indicating whether extension data was valid. Through the Capability Word, it also made it possible to indicate the ability to support other, non type 2, packets, thus allowing for flexible migration towards type 3. It also documented the addressing extensions used by various programs. However, FSC-0039 has two flaws: 1. One cannot be sure the bitfield is zero because other implementations might use this field for their own purposes. Therefore this document includes a second validation copy for the Capability Word (CW hereafter). This copy allows the FSC-xxxx compliant software to validate the CW by comparing the two. The chance of some junk portraying itself as a CW is significantly reduced by this. ! Please note that the validation copy is byte swapped ! compared to the normal capability word. While this started ! out as a typo, I decided to leave it in as it introduces ! some extra safety, without requiring much extra code effort. ! In later revisions of FSC-0039, Mark adopted this idea of a ! validation copy too and eliminated the problem. 2. Although FSC-0039 provides a way to make packet headers 4D it is not backwards compatible. It cannot be used in FTS- 0001 sessions to unknown systems, making FidoNet still not totally 4D capable. Although it implements fields for zone and point number, an FTS-0001 compliant application is not required to look at these fields. When a point mails using these fields to implement its 4D address, a system only looking at the net/node info, as is required by FTS-0001, still sees it as a boss node, causing the obvious problems. This document provides a way for transparent point handling, using a technique already exploited by many mailers internally. It will allow this document to be implemented and used by mailers not supporting it. At the same time the danger that a point is seen as the boss node is eliminated. It does NOT provide full inter-zone backwards compatibility, but that is not needed as badly, as problems are not yet too great. Any measures to ensure backwards compatibility in this area might harm communication with non-supporting programs, when the old system could handle the situation. Packet Header ============= The "|" character is used to indicate extensions documented in FTS-0001 revision 12, the ":" character indicates those documented here and in FSC-0039. Offset dec hex .-----------------------------------------------------. 0 0 | origNode (low order) | origNode (high order) | +--------------------------+--------------------------+ 2 2 | destNode (low order) | destNode (high order) | +--------------------------+--------------------------+ 4 4 | year (low order) | year (high order) | +--------------------------+--------------------------+ 6 6 | month (low order) | month (high order) | +--------------------------+--------------------------+ 8 8 | day (low order) | day (high order) | +--------------------------+--------------------------+ 10 A | hour (low order) | hour (high order) | +--------------------------+--------------------------+ 12 C | minute (low order) | minute (high order) | +--------------------------+--------------------------+ 14 E | second (low order) | second (high order) | +--------------------------+--------------------------+ 16 10 | baud (low order) | baud (high order) | +--------------------------+--------------------------+ 18 12 | 0 | 2 | 0 | 0 | +--------------------------+--------------------------+ 20 14 | origNet (low order) | origNet (high order) | : | Set to -1 if from point | +--------------------------+--------------------------+ 22 16 | destNet (low order) | destNet (high order) | +--------------------------+--------------------------+ | 24 18 | ProductCode (low order) | Revision (major) | | +--------------------------+--------------------------+ | 26 1A | password | | | 8 bytes, null padded | | +--------------------------+--------------------------+ |: 34 22 | origZone (low order) | origZone (high order) | } | +--------------------------+--------------------------+ } As in |: 36 24 | destZone (low order) | destZone (high order) | } QMail : +--------------------------+--------------------------+ : 38 26 | AuxNet (low order) | AuxNet (high order) | : +--------------------------+--------------------------+ : 40 28 | CWvalidationCopy (high) | CWvalidationCopy (low) | : +--------------------------+--------------------------+ : 42 2A | ProductCode (high order) | Revision (minor) | : +--------------------------+--------------------------+ : 44 2C | CapabilWord (low order) | CapabilWord (high order) | : +--------------------------+--------------------------+ : 46 2E | origZone (low order) | origZone (high order) | } : +--------------------------+--------------------------+ } As in : 48 30 | destZone (low order) | destZone (high order) | } FD etc : +--------------------------+--------------------------+ : 50 32 | origPoint (low order) | origPoint (high order) | } : +--------------------------+--------------------------+ } As in : 52 34 | destPoint (low order) | destPoint (high order) | } FD etc : +--------------------------+--------------------------+ : 54 46 | Product Specific Data | : + + : | 4 Bytes | +--------------------------+--------------------------+ 58 3A | zero or more | ~ packed ~ | messages | +--------------------------+--------------------------+ | 0 | 0 | 0 | 0 | '-----------------------------------------------------' Packet = PacketHeader { PakdMessage } 00H 00H PacketHeader = origNode (* of packet, not of messages in packet *) destNode (* of packet, not of messages in packet *) year (* of packet creation, e.g. 1986 *) month (* of packet creation, 0-11 for Jan-Dec *) day (* of packet creation, 1-31 *) hour (* of packet creation, 0-23 *) minute (* of packet creation, 0-59 *) second (* of packet creation, 0-59 *) baud (* max baud rate of orig and dest *) PacketType (* old type-1 packets now obsolete *) origNet (* of packet, not of messages in packet set to -1 if orig=point *) destNet (* of packet, not of messages in packet *) + productCode Lo (* 0 for Fido, write to FTSC for others *) |+ serialNo Maj (* binary serial number (otherwise null) *) | password (* session pasword (otherwise null) *) | origZone (* zone of pkt sender (otherwise null) *) | destZone (* zone of pkt receiver (otherwise null) *) | auxNet (* contains Orignet if Origin is a point *) +! Bytesw. CWvalidationCopy (* Must be equal to CW to be valid *) + ProductCode Hi + revision Minor + origZone (* zone of pkt sender (otherwise null) *) + destZone (* zone of pkt receiver (otherwise null) *) + ProdData (* Product specific filler *) When the two copies of the CW match they can be asumed to be valid and used. Stone-Aged: Old FTS-0001 Type-2+ : Old FTS-0001 plus changes indicated by "|" and ":" are valid A Type-N Bundle will always advertise its capabilities in the CW regardless of the type being sent. As shown in the example below, the CW allows Type-N processors to automatically track the capability of your system. Again, in cases where a stone- age processor is being used, this field will be ignored, and in the unusual event that it is not ignored, and is somehow harmful to the far system, the Type-N processor can be configured to send a CW of 0. The format of the Capability Word is designed to support up to 15 future bundle types, and is bit-mapped to facilitate the easy determination of the maximum common level supported between two nodes: msb Capability Word lsb Node Supports ------------FTSC Type Supported **)------------ U 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2+ 2+,3, and 7 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 1 2+,3, and 5 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 2+ (this Doc) 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 Stone Age 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ! ^-- "U" Indicates nodes able to process RFC-822 ! bundles. ** - In the example bit definitions only type 2, and the Stone-Age type, are defined now. The rest are to be concidered "reserved by FTSC". The receiving Type-N bundler would AND the two words, obtaining a word expressing the Types which are common to both the receiving and the sending system. The most significant Type will be used for future sessions, by default. Please note that this assumes that new bundling Types will be increasingly more efficient or in some way more beneficial. Because this may not always be the case, there should be a method provided to override the automatic upgrade, as illustrated above, should this ever happen. ! N.B. The one bit left over (Msb) is now used as indicator for ! RFC-822 type bundles. For info on RFC-822 please check out ! the relevant documents themselves. ! For a more explanatory text on using the CW to its full ! potential, refer to the FSC-0039 text by Mark Howard. ! Mark also gives some more rationale for the origional idea ! of the CW. Generating Type-2+ 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 | \|/ | Are we sending from a point? (origPoint != 0) YES --+ | | NO | | \|/ | set AuxNet = OrigNet \|/ set OrigNet = -1 | | +-----<----------------------------------------+ | Add Messages | Terminate packet | Send packet Receiving Type-2+ bundles ========================= Receive Packet | Packettype = 2 NO -------------> Process Type-Other YES | | CWcopies match NO --------+------> Treat as normal Stone-Age packet YES | | | | | Store CW /|\ | | | /|\ CW is 0 YES --------------+ | NO | | | | | CW indicates support for 2+ NO --+ YES | | ! OrigPoint is not 0 and OrigNet = -1 YES -------+ NO | | \|/ ! \|/ Set OrigNet is AuxNet | | +------<-----------------------------------+ | Process using added info Credits ======= To Mark Howard, for introducing the idea of a CW in his FSC- 0039 document and quite rightly pointing out one big omision in revision 1 of this document. To Rick Moore, for doing a good job in processing all these revisions by Mark and myself, and for his work for the FTSC in general. To Joaquim Homrighausen, for his contributions to FidoNet software in general, and especially for his time devoted to reading, discussing and implementing the ideas Mark and I introduced. To Andre van de Wijdeven, for producing and letting me beta test his TS-MM software, which in my opinion is the best point software around. (I'm not saying available, because it isn't :-() To john lots, for shipping this stuff to the US. To Jon Webb, for doing a much needed grammar and spelling check. To Bob Hartman, Vince Periello, Tom Jennings, Eelco de Graaff, aXel Horst, Arjen van Loon, jim nutt, Odinn Sorensen, David Nugent, Peter Janssens and many others, for making FidoNet what it is now, for me and for everybody. Epilog ====== So this it, now it's up to you to decide whether or not to implement it. A small change was made in the receivers flowchart and a small incompatibility with the later revisions of FSC-0039 was removed. That will ensure that FSC-0048 and FSC-0039 mailers can happily talk to each other.... The best way to implement this would be to always support FSC- 0048 on inbound trafic and generate FSC-0048 on outbound by default. A switch on a per-node basis will force your software to be FSC-0039 or even FSC-0001 only, and you will cover all bases. This can be done easily, as FSC-0048 is a superset of FSC-0039 (The -1 thing on points being the difference) which in turn is a superset of FTS-0001 (CW). I'd be glad to get some feedback. You can put it in NET_DEV or netmail me. Jan Vroonhof (2:281/1.12@fidonet)