FidoNet Route Files Explained
Part 1 -- The Many Faces of FidoNet
by Ben Baker, Fido 100/76
There is no aspect of FidoNet more universally mis-
understood than routing. It is the intent of this foru-
part series to clear some of the fog.
The justification for nets and routing has been
discussed many times and will NOT be discussed again here.
Given that routing is good, how is it done? What's the
meaning of the various statements that go into route files?
Indeed, what's the meaning of route files?
Let's first take a look at "the network." But how do we
do that? In reality, there is no "the network." FidoNet is
a different thing when viewed by each different Fido! The
only formal definition of FidoNet is the node list, and it
serves as an adaquate view of "the network" for most
independent Fidos but only the members of some nets.
Consider the hypothetical node, Fido 21/7. He's an
independent member of a "Region." To him, "the network" is a
couple of hundred other independent nodes to whom he sends
messages directly and another couple of hundred to which he
has access through 36 defined "Hosts." If he receives a
message not addressed to his node, his Fido "orphans" it.
He has no intention of forwarding someone else's mail. They
can pay their own phone bills! When he sends a message to
18/3, Fido knows (from the node list) that is another
independent and sends the message direct. When he sends a
message to 100/76, Fido knows (from the node list) that is a
member of net 100 and sends it to 100/0. Fido 21/7 executes
only schedule A during the national mail window. He has no
use for ANY route files.
Another hypothetical node, Fido 201/4 is a member of an
"inbound only" net. Since the sysop has used the '4'
command properly, Fido knows he is a member of net 201 and
will treat other members of that net as though they were
independent nodes. When he sends a message to 201/5, Fido
will send it direct and not to 201/0. Messages headed out-
side net 201 will be handled for 201/4 just as they were for
21/7. Fido 201/4 executes two schedules, A during the
national window followed immediatly by B when he just sits
quietly and waits for 201/0 to send him any mail he
received. He has no use for ANY route files.
Everyone else has a view of "the network" more
complicated than Fido can discover from just the node list.
If you're a Southern California Hub, or a local node in the
New York Megalopolis, or maybe the host of a modest network
in Memphis "the network" looks different to you than to
other sysops. It is the function of route files to modify
Fido's view of "the network" to conform to yours.
If your Fido is executing any mail event and any other
Fido calls it up and offers it a mail packet, your Fido will
graciously receive that packet and at the end of the mail
event, he will unpack it into messages. These actions have
nothing whatever to do with route files!
Reread that last paragraph two or three times until it
sinks in. It is a very important, very misunderstood point.
Route files do not and cannot control the way you receive
mail. ROUTE FILES CONTROL ONLY THE WAY YOU SEND MAIL!!!
After all, that's when you're paying the phone bill.
Furthermore, what you say in ROUTE.B has absolutely
nothing to do with how Fido behaves in schedule C. I will
come back to this point later.
Ever since we first began routing FidoNet messages to
places other than their final destination, route files have
used three basic commands to mold Fido's view of FidoNet to
correspond with your view. In part 2 we will look at
SCHEDULE, ROUTE-TO and ACCEPT-FROM and see just how they
Part 3 will examine a bevy of new routing commands
available with Fido V11 and see how they have made automatic
distribution at last possible.
LISTGEN V2 is capable of generating route files auto-
matically. Part 4 will discuss how ROUTE.CTL statements map
to route file commands.
Stay with me for the next few weeks and maybe we can
burn off the fog and find a bright sky, a calm sea and clear
sailing. (And don't throw away your newsletters, you'll
want to refer back from time to time.)
FidoNet Route Files Explained
Part 2 -- In the Beginning
by Ben Baker, Fido 100/76
From the time he first began "routing" messages, Fido
has used "route files" to tell him what messages to send
where when. Three basic route file commands do this;
SCHEDULE aka SEND-TO, ROUTE-TO and ACCEPT-FROM. This week,
we'll look at these commands in depth.
Before going farther, I need to define a couple of
terms. A "target" is a node to which your Fido will connect
and directly send a message. An "addressee" is the ultimate
destination node for a message. This is an important
distinction. Because of routing, the addressee and the
target for a particular message are often different nodes.
A "packet" is a collection of messages all to be sent
to a single target (though perhaps several addressees). At
the beginning of each schedule Fido builds all the packets
he will be permitted to send during that schedule.
Now, let's take a look at the three basic commands that
may appear in a route file, and see how each of them can
modify Fido's behavior.
These commands are equivalent. They tell Fido "During
this schedule, you may build packets for any target in
. Include all messages to different addressees
which may be routed to these targets. Do not consider any
outgoing messages which cannot be sent to one of these
targets." Unless there is an ACCEPT-FROM statement (see
below) only messages originating on your Fido qualify to go
into packets. If is empty (and this is NOT
schedule A), Fido will not build any packets. If he doesn't
build any packets he will not send any mail, even if he is
POLLed (see next week).
This command will override any node list implied
routing affecting these nodes. It tells Fido "If
is in and there are outgoing messages for any
nodes in , put them in 's packet."
If is not in you blew it. It's
almost, but not quite a "no operation." No packets will be
built for nodes in , even if they are in
! Don't route messages to a that's
not in the for this schedule.
By the way, a bug in an earlier version of Fido pre-
vented messages to from being sent unless he was
also in . I don't know if that has been
corrected, but it's still good general practice to put
Normally, Fido only sends mail originating on your
board. If you receive a message originating on A and
addressed to B, without this statement, your Fido will not
attempt to send it along to B. Instead, he will mark it
"orphan" to give you an indication that he had a problem
with it and otherwise ignore it. This statement in a route
file tells Fido "When you build packets, if you find any
messages from any nodes in , treat them as
if they originated here. In other words FORWARD any
messages from the nodes in that you can
get into packets FOR THIS SCHEDULE's ."
I actually suggested this verb for this action and have
regretted it ever since! It's a misnomer. A better verb
might be "FORWARD-FOR" but hindsight is always 20-20. It
really means "Accept, for forwarding, only messages from
these guys." It's designed to prevent you from paying
someone else's phone costs without prior arrangement.
So where do you put this statement? Remember two
important points I've mentioned before. 1) Route files
affect how you SEND mail, not how you receive it. 2) A
particular route file affects only the schedule with the
matching . Consider Fido 202/0, a hypothetical bi-
directional host. He executes three schedules each night.
During schedule B, before the national window, he collects
outgoing mail from his locals. During schedule C he sends
mail from himself and his locals to "the network" and
receives mail for himself and his locals from it. Then in
schedule D, after the national window, he distributes the
mail he received for his locals.
ROUTE.B needs neither a nor an ACCEPT-
FROM statement. Indeed, he doesn't really need any ROUTE.B
file at all because HE ISN'T SENDING ANY MAIL DURING
ROUTE.C has the national net excluding 202/0's locals
in its . It also has "ACCEPT-FROM 1, 2, 3,
(all locals)." Now let's say that 202/3 received a message
from 125/1 last night, but it wasn't delivered because 202/3
was down. The message is still here. Won't it be
"orphaned" because 125/1 isn't in the ACCEPT-FROM list? NO!
Because 202/3 isn't in the , the message won't
even be considered DURING THIS SCHEDULE.
ROUTE.D has all the nodes in net 202 in the list>, and an "ACCEPT-FROM ALL" statement. Now the fore-
going message will be processed correctly and forwarded to
Now let's say that 100/76 tries to forward a message to
Jakarta through 202/0. 202/0 cannot refuse delivery of the
offending message, so there it sits in his mail area.
During schedule B, he ignores all outgoing mail because he
doesn't have a . During schedule C Jakarta is
in his , but 100/76 is not in his list>, so the message is orphaned. During schedule D 100/76
IS in the , but Jakarta is not in the
so the message is again ignored.
Make no mistake, if Jakarta had been in the list> in schedule D, the message would have been sent, even
though it had been marked an orphan during schedule C
(provided, of course that a connection could be made and
Jakarta happened to be in a mail schedule at that time).
This means that if messages are orphaned because of errors
in your routing files, the routing files can be corrected
and the messages can still be sent. The orphan flag is NOT
a dead end!
A similar kind of bug existed (and may still; I don't
know) with ACCEPT-FROM as with ROUTE-TO (above). If a route
file contains an ACCEPT-FROM statement, make sure your own
node is in the . (The first time I used
this statement, I forwarded a lot of messages, but
"orphaned" my own messages!)
Well, that's how routing is achieved. Remember, all
these statements control out-going mail. You can receive
mail even if you don't have any route files!
A final point on routing. If a message says it has a
file attached (even if the file doesn't exist) all bets are
off. Routing is suspended and the message will be sent
direct from the originator to the addressee. Fido has
several built-in safeguards to prevent you from forwarding
someone else's files, or forwarding your files through
someone else for that matter.
Next week we'll take a close look at the goodies TJ has
provided in version 11 and see how they are making automatic
node list distribution at long last a reality.
FidoNet Route Files Explained
Part 3 -- Keep the Old, Ring In the New
by Ben Baker, Fido 100/76
Last week we looked at the basic routing statements
that have been with us since version 7 or so. Now let's
look at what's been added in version 11.
Please refer back to last weeks definitions. I con-
tinue to use them as defined.
This tells Fido "Go ahead and build packets for any
targets in the SCHEDULE command's , but DON'T
ATTEMPT TO CALL ANYBODY. If any targets happen to call in
for any reason, try to give them their packets before they
There MUST be a for this statement to
mean anything. It is not intended for normally "receive
only" schedules like 202/0's collection schedule (see last
week). Instead, it prevents you from originating calls
during schedules when you are trying to SEND mail. (Route
files control how you send mail, not how you receive it.)
You are really trying to send mail on the other guy's
nickel, but as you will see, he has to cooperate in that
This statement might be used by the locals during the
collection schedule in a large, busy net. Collisions are
avoided because there's only one node, the outbound host,
placing calls. He POLLs (see below) the locals for their
"OK, Fido, build packets for targets in the list>, but don't attempt to actually call any targets in
." This is a limited "RECV-ONLY" command.
Any packets for targets not in will be
sent normally (if they haven't been picked up), but packets
for have to be "picked up."
There's a hidden gimmick here that bears further
exploration. Ken Kaplan (Fido 100/22 AKA 1/0) is the
original source in the national nodelist distribution
system. Regional coordinators call his Fido each week to
pick up copies of the latest nodelist. The route file for
his national window contains the statement "HOLD coordinator list>." Fido will not attempt to send any
packets targetted for a regional coordinator. Does this
mean that he can't send "normal" messages to the
coordinators? Not at all. Because he is a member of net
100, all his "normal" messages, including those addressed to
the coordinators, wind up in a packet targetted for 100/10,
the outbound host. Since 100/10 is not in the list>, that packet is sent and the messages go out. HOLD
APPLIES TO THE TARGETS OF PACKETS, NOT TO THE ADDRESSEES OF
MESSAGES! It is only when Ken sends messages to the
coordinators with the nodelist (or other files) attached to
them that Fido builds packets targetted for them instead of
Does that mean that Ken can't send the coordinators
other files without waiting for them to pick them up? Well,
yes and no. Because of the HOLD statement, he can't say
send FIDO_IBM.EXE to 14/61 (see PICK-UP below for why 14/61
and not 14/0). But he can use another gimmick. The
coordinators have dual identities (set by the '4' command of
Fido) and he can certainly send a file to 14/0. Fido is
smart, but so smart he'll notice that 14/0 and 14/61 happen
to have the same phone number. He'll send the packet for
14/0 and hold the one for 14/61. By the same token, if both
packets are still present when 14/61 calls in, he'll only
pick up the the nodelist targetted for 14/61 and not the new
Fido targetted for 14/0. (You can't have your cake and eat
Whenever any other Fido calls your Fido for any reason,
your Fido looks to see if there is a packet targetted for
him. If there is, your Fido will try to deliver it then and
there and avoid making the phone call which you have to pay
for. Without this statement (or the next one) in his route
file, the other Fido will simply hang up on you, leaving you
with a phone call to make in order to deliver your packet.
This statement says to Fido "If you happen to call any
target in , hang around to see if he has
mail for me."
This is a two-edged sword. It can speed up mail
exchange, but the Fido that places the call pays for it. It
works best within a local net where the calls are all toll
free anyway. In fact, it won't work at all between larger
nets supported by distinct inbound and outbound hosts.
Specifying "PICKUP 100/0" in your national window schedule
would only get you messages originating on 100/0 (or 100/51
actually) with files attached. Any other mail for you might
be in a packet addressed to you, but on 100/10, the outbound
host, and that's not who you called.
Even worse, let's say Tom Jennings is sending a file to
100/10 and wants to pick up any mail from St. Louis for San
Francisco while he's at it. He's the host of net 125, and
that's perfectly legitimate, right? Wrong! His primary
identity (the '4' command again) is 125/1 and 100/10 may
have a packet for 125/0, but he won't have a packet for
125/1. This command deals at the packet/target level just
as the HOLD command does. Furthermore, it deals with real
identities, not alternate identities.
As I said, this is most useful within a local net, and
that's where it probably should be applied.
This tells Fido "Even if I don't have any mail for the
targets in generate empty packets
addressed to them so you have an excuse to call them. Then
when you do call them, pick anything they have for me."
"POLL " implies "PICKUP list>" which need not be specified. This is the statement
an outbound host might use to poll his locals or hubs for
outgoing traffic prior to national mail time. Together with
the next statement, this method can be very efficient.
The regional coordinators run a special schedule each
Saturday morning during the national mail window. It's
route file is identical to their normal national schedule
route file except that it contains the statement "POLL 1/0."
That's how they get the nodelist for subsequent redis-
As I see it, POLL has a lot more uses than PICKUP.
This one is mainly for outbound hosts. It says "I'm
not expecting any mail during this schedule, so don't wait
the normal one or two minutes for incomming calls after
making an outgoing call. As soon as you finish one, dial
another until all packets have been sent."
As I said above, this can be very efficient, but
there's a problem you need to be aware of. Fido will make a
maximum of 30 attempts without connect to send a packet to a
particular target. If you have only one packet addressed to
a busy target, Fido would normally take about an hour to use
up 30 attempts, but in SEND-ONLY mode he can attempt 30
calls in about 20 minutes! If you have a Courier and are
running it in "X4" response code mode, he'll make 30
attempts in 10 to 15 minutes. (The Courier doesn't waste a
lot of time in "fast-dial, busy-detect" mode.)
If you're an outbound host and want to try SEND-ONLY
during the national window, you risk using up your call
attempts while your target is busiest, then when he's
quieted down and you could get through, you've given up! I
suggest you break your national time into two schedules, and
only use SEND-ONLY during the last 20 minutes or so of the
On the other hand, polling your locals or hubs is a
different matter. They should be in RECV-ONLY mode and you
can expect every call to connect the first try. The call
attempt limit doesn't apply to this situation and the SEND-
ONLY command should be used to shorten the time needed to
This command tells Fido "Do not send messages addressed
to these nodes anywhere but to the addressed nodes. Treat
them as though they have files attached, whether they do or
This lets you say things like Fido 100/76 (in Illinois)
SEND-TO 100/10 ; Outbound Host (in Missouri)
ROUTE-TO 100/10 ALL ; Send everything to accross the river
NO-ROUTE 100/482 ; Except other Illinois traffic
The only other way to achieve this end is to list in
the ROUTE-TO command all 500 odd nodes whose messages should
be routed to 100/10, and that list changes every week!
Now you should have a good handle on how the commands
used in ROUTE. control how Fido SENDS files during
schedule . But sometimes these commands require very
long lists of node numbers which change from week to week as
the node list changes. LISTGEN 2 will generate the route
files automatically and let you specify the long lists
symbolically in terms of nets, area codes, etc.. Next week
in the last part of this series, we'll see how the
statements in LISTGEN's ROUTE.CTL file correspond to the
commands in ROUTE..
FidoNet Route Files Explained
Part 4 -- LISTGEN and ROUTE.CTL
by Ben Baker, Fido 100/76
LISTGEN Version 2 will automatically generate route
files for you if you desire. The advantage is that LISTGEN
is driven by a control file, ROUTE.CTL, in which you specify
the statements necessary with symbolic parameters that you
define in terms of nets, area codes, etc.. A properly
designed ROUTE.CTL need only change when your routing needs
change. LISTGEN will continue to create correct route files
week after week as the nodelist changes.
Before I begin, I'd like to do a quick review of the
route file commands and their effect.
Determines which nodes may have
packets build to SEND mail to.
Directs that messages to par-
ticular addressees be SENT in
packets to another node.
Specifies which oritinators'
messages may be SENT.
RECV-ONLY States that packets may only be
SENT by being picked up.
States that packets to part-
icular nodes may only be SENT
by being picked up.
States that it is OK to receive
mail from particular nodes when
we originate calls to SEND them
Directs that packets (empty if
necessary) be generated and
SENT to particular nodes in
order to pick up mail.
SEND-ONLY States that calls may be made
rapid-fire to SEND as many
packets as possible.
Note that each definition above includes the verb SEND
or SENT. I did that deliberately to emphasize that these
commands all control some aspect of sending mail.
LISTGEN has been adaquately documented and I do not
intend to re-document it here, but I would like to show you
how ROUTE.CTL commands map to the ROUTE. commands
When LISTGEN encounters this command in ROUTE.CTL it
does two things. First it closes any route file it may be
working on and creates a new ROUTE. file for the new
. Then it generates a SCHEDULE statement from the
specifications in this one for the new ROUTE.,
expanding any symbolic parameters to lists of nodes from the
nodelist. In other words, it begins a new route file as you
would expect it to by defining the .
This phrase, when encountered, generates an ACCEPT-FROM
TO [ VIA ]
If the VIA clause is present, this statement generates
a "ROUTE-TO ." Successive TO
phrases without VIA clauses accumulate to make a larger
until a VIA clause IS found. Then the
entire list is routed to the . (I'm not entirely
happy with this "feature," but that's the way it works.) If
no VIA clause is ever found, the TO phrase generates no
output at all! It does serve as documentation in your
ROUTE.CTL file, saying "I expect to be sending mail TO these
nodes in this schedule."
All of the other route file commands discussed above
map one-for-one in the same format from ROUTE.CTL to
The big advantage in using LISTGEN is to be able to use
simple symbols which it will translate into long lists of
nodes. To illustrate, net 100 spans two area codes, 314 in
Missouri and 618 in Illinois. To minimize the number of
toll calls placed accross the Mississippi, I serve as "Metro
East" hub to concentrate the Illinois traffic. I have the
following statements (among others) in my ROUTE.CTL file:
define Metro-East as Net-100 except Area-314 ; Area 618
define Outbound as 100/10
define World as all except Metro-East
* * *
FROM Metro-East TO World VIA Outbound
Nodes may come and go, both in our net and across the
country, and these statements need not change. LISTGEN
interprets them week after week and builds the right route
files every time. And in several months, if our outbound
host should change making it necessary to change ROUTE.CTL,
I can look at this and not have to say to myself "What on
earth was I trying to do here?" It's all pretty obvious.
Before I wrap it up, there are two important exceptions
to the things I have said. First, schedule A is special in
that the always is the entire nodelist, no
matter what ROUTE.A says. For that reason, if you do any
routing not defined by the node list, I recommend that you
DO NOT USE SCHEDULE A. For all other schedules, Fido does
exactly what ROUTE. tells it to do and nothing more.
And second, ROUTE.BBS is a special route file that affects
all schedules for which there are no ROUTE. files. For
that reason, I recommend that you FORGET YOU EVER HEARD OF
ROUTE.BBS. It'll cause more problems than it'll ever solve!
So, routing can get pretty complex (just ask 'em in
Southern California), but it doesn't need to be complicated
once you know what the objective of each schedule is from
your point of view, and what your Fido needs to do to meet
In fact, it's pretty easy if you just remember the two
points I have been hammering at you since we began:
1) Route files control the way you send messages, not
the way you receive them. Every command we discussed above
controls some aspect of sending messages. And. . .
2) A particular route file only affects the schedule
with the matching . What you say in ROUTE.B has no
bearing whatever on schedule C. Each schedule must be
separately spelled out.