]> git.ipfire.org Git - thirdparty/bird.git/blob - doc/bird.sgml
Implement option to exit after config file parsing.
[thirdparty/bird.git] / doc / bird.sgml
1 <!doctype birddoc system>
2
3 <!--
4 BIRD documentation
5
6 This documentation can have 4 forms: sgml (this is master copy), html,
7 ASCII text and dvi/postscript (generated from sgml using
8 sgmltools). You should always edit master copy.
9
10 This is a slightly modified linuxdoc dtd. Anything in <descrip> tags is considered definition of
11 configuration primitives, <cf> is fragment of configuration within normal text, <m> is
12 "meta" information within fragment of configuration - something in config which is not keyword.
13
14 (set-fill-column 100)
15
16 Copyright 1999,2000 Pavel Machek <pavel@ucw.cz>, distribute under GPL version 2 or later.
17
18 -->
19
20 <book>
21
22 <title>BIRD User's Guide
23 <author>
24 Ondrej Filip <it/&lt;feela@network.cz&gt;/,
25 Pavel Machek <it/&lt;pavel@ucw.cz&gt;/,
26 Martin Mares <it/&lt;mj@ucw.cz&gt;/,
27 Ondrej Zajicek <it/&lt;santiago@crfreenet.org&gt;/
28 </author>
29
30 <abstract>
31 This document contains user documentation for the BIRD Internet Routing Daemon project.
32 </abstract>
33
34 <!-- Table of contents -->
35 <toc>
36
37 <!-- Begin the document -->
38
39 <chapt>Introduction
40
41 <sect>What is BIRD
42
43 <p><label id="intro">
44 The name `BIRD' is actually an acronym standing for `BIRD Internet Routing Daemon'.
45 Let's take a closer look at the meaning of the name:
46
47 <p><em/BIRD/: Well, we think we have already explained that. It's an acronym standing
48 for `BIRD Internet Routing Daemon', you remember, don't you? :-)
49
50 <p><em/Internet Routing/: It's a program (well, a daemon, as you are going to discover in a moment)
51 which works as a dynamic router in an Internet type network (that is, in a network running either
52 the IPv4 or the IPv6 protocol). Routers are devices which forward packets between interconnected
53 networks in order to allow hosts not connected directly to the same local area network to
54 communicate with each other. They also communicate with the other routers in the Internet to discover
55 the topology of the network which allows them to find optimal (in terms of some metric) rules for
56 forwarding of packets (which are called routing tables) and to adapt themselves to the
57 changing conditions such as outages of network links, building of new connections and so on. Most of
58 these routers are costly dedicated devices running obscure firmware which is hard to configure and
59 not open to any changes (on the other hand, their special hardware design allows them to keep up with lots of high-speed network interfaces, better than general-purpose computer does). Fortunately, most operating systems of the UNIX family allow an ordinary
60 computer to act as a router and forward packets belonging to the other hosts, but only according to
61 a statically configured table.
62
63 <p>A <em/Routing Daemon/ is in UNIX terminology a non-interactive program running on
64 background which does the dynamic part of Internet routing, that is it communicates
65 with the other routers, calculates routing tables and sends them to the OS kernel
66 which does the actual packet forwarding. There already exist other such routing
67 daemons: routed (RIP only), GateD (non-free), Zebra<HTMLURL URL="http://www.zebra.org">
68 and MRTD<HTMLURL URL="http://sourceforge.net/projects/mrt">, but their capabilities are
69 limited and they are relatively hard to configure and maintain.
70
71 <p>BIRD is an Internet Routing Daemon designed to avoid all of these shortcomings,
72 to support all the routing technology used in the today's Internet or planned to be
73 used in near future and to have a clean extensible architecture allowing new routing
74 protocols to be incorporated easily. Among other features, BIRD supports:
75
76 <itemize>
77 <item>both IPv4 and IPv6 protocols
78 <item>multiple routing tables
79 <item>the Border Gateway Protocol (BGPv4)
80 <item>the Routing Information Protocol (RIPv2)
81 <item>the Open Shortest Path First protocol (OSPFv2)
82 <item>a virtual protocol for exchange of routes between different routing tables on a single host
83 <item>a command-line interface allowing on-line control and inspection
84 of status of the daemon
85 <item>soft reconfiguration (no need to use complex online commands
86 to change the configuration, just edit the configuration file
87 and notify BIRD to re-read it and it will smoothly switch itself
88 to the new configuration, not disturbing routing protocols
89 unless they are affected by the configuration changes)
90 <item>a powerful language for route filtering
91 </itemize>
92
93 <p>BIRD has been developed at the Faculty of Math and Physics, Charles University, Prague,
94 Czech Republic as a student project. It can be freely distributed under the terms of the GNU General
95 Public License.
96
97 <p>BIRD has been designed to work on all UNIX-like systems. It has been developed and
98 tested under Linux 2.0 to 2.4, and then ported to FreeBSD and NetBSD, porting to other
99 systems (even non-UNIX ones) should be relatively easy due to its highly modular architecture.
100
101 <sect>Installing BIRD
102
103 <p>On a recent UNIX system with GNU development tools (GCC, binutils, m4, make) and Perl, installing BIRD should be as easy as:
104
105 <code>
106 ./configure
107 make
108 make install
109 vi /usr/local/etc/bird.conf
110 bird
111 </code>
112
113 <p>You can use <tt>./configure --help</tt> to get a list of configure
114 options. The most important ones are:
115 <tt/--enable-ipv6/ which enables building of an IPv6 version of BIRD,
116 <tt/--with-protocols=/ to produce a slightly smaller BIRD executable by configuring out routing protocols you don't use, and
117 <tt/--prefix=/ to install BIRD to a place different from.
118 <file>/usr/local</file>.
119
120 <sect>Running BIRD
121
122 <p>You can pass several command-line options to bird:
123
124 <descrip>
125 <tag>-c <m/config name/</tag>
126 use given configuration file instead of <it/prefix/<file>/etc/bird.conf</file>.
127
128 <tag>-d</tag>
129 enable debug messages and run bird in foreground.
130
131 <tag>-D <m/filename of debug log/</tag>
132 log debugging information to given file instead of stderr.
133
134 <tag>-p</tag>
135 just parse the config file and exit.
136
137 <tag>-s <m/name of communication socket/</tag>
138 use given filename for a socket for communications with the client, default is <it/prefix/<file>/var/run/bird.ctl</file>.
139 </descrip>
140
141 <p>BIRD writes messages about its work to log files or syslog (according to config).
142
143 <chapt>About routing tables
144
145 <p>BIRD has one or more routing tables which may or may not be
146 synchronized with OS kernel and which may or may not be synchronized with
147 each other (see the Pipe protocol). Each routing table contains a list of
148 known routes. Each route consists of:
149
150 <itemize>
151 <item>network prefix this route is for (network address and prefix length -- the number of bits forming the network part of the address; also known as a netmask)
152 <item>preference of this route
153 <item>IP address of router which told us about this route
154 <item>IP address of router we should forward the packets to
155 using this route
156 <item>other attributes common to all routes
157 <item>dynamic attributes defined by protocols which may or
158 may not be present (typically protocol metrics)
159 </itemize>
160
161 Routing table maintains multiple entries
162 for a network, but at most one entry for one network and one
163 protocol. The entry with the highest preference is used for routing (we
164 will call such an entry the <it/selected route/). If
165 there are more entries with the same preference and they are from the same
166 protocol, the protocol decides (typically according to metrics). If they aren't,
167 an internal ordering is used to break the tie. You can
168 get the list of route attributes in the Route attributes section.
169
170 <p>Each protocol is connected to a routing table through two filters
171 which can accept, reject and modify the routes. An <it/export/
172 filter checks routes passed from the routing table to the protocol,
173 an <it/import/ filter checks routes in the opposite direction.
174 When the routing table gets a route from a protocol, it recalculates
175 the selected route and broadcasts it to all protocols connected to
176 the table. The protocols typically send the update to other routers
177 in the network.
178
179 <chapt>Configuration
180
181 <sect>Introduction
182
183 <p>BIRD is configured using a text configuration file. Upon startup, BIRD reads <it/prefix/<file>/etc/bird.conf</file> (unless the
184 <tt/-c/ command line option is given). Configuration may be changed at user's request: if you modify
185 the config file and then signal BIRD with <tt/SIGHUP/, it will adjust to the new
186 config. Then there's the client
187 which allows you to talk with BIRD in an extensive way.
188
189 <p>In the config, everything on a line after <cf/#/ or inside <cf>/*
190 */</cf> is a comment, whitespace characters are treated as a single space. If there's a variable number of options, they are grouped using
191 the <cf/{ }/ brackets. Each option is terminated by a <cf/;/. Configuration
192 is case sensitive.
193
194 <p>Here is an example of a simple config file. It enables
195 synchronization of routing tables with OS kernel, scans for
196 new network interfaces every 10 seconds and runs RIP on all network interfaces found.
197
198
199 <code>
200 protocol kernel {
201 persist; # Don't remove routes on BIRD shutdown
202 scan time 20; # Scan kernel routing table every 20 seconds
203 export all; # Default is export none
204 }
205
206 protocol device {
207 scan time 10; # Scan interfaces every 10 seconds
208 }
209
210 protocol rip {
211 export all;
212 import all;
213 interface "*";
214 }
215 </code>
216
217
218 <sect>Global options
219
220 <p><descrip>
221 <tag>log "<m/filename/"|syslog|stderr all|{ <m/list of classes/ }</tag>
222 Set logging of messages having the given class (either <cf/all/ or <cf/{
223 error, trace }/ etc.) into selected destination. Classes are:
224 <cf/info/, <cf/warning/, <cf/error/ and <cf/fatal/ for messages about local problems,
225 <cf/debug/ for debugging messages,
226 <cf/trace/ when you want to know what happens in the network,
227 <cf/remote/ for messages about misbehavior of remote machines,
228 <cf/auth/ about authentication failures,
229 <cf/bug/ for internal BIRD bugs. You may specify more than one <cf/log/ line to establish logging to multiple
230 destinations. Default: log everything to the system log.
231
232 <tag>debug protocols all|off|{ states, routes, filters, interfaces, events, packets }</tag>
233 Set global defaults of protocol debugging options. See <cf/debug/ in the following section. Default: off.
234
235 <tag>debug commands <m/number/</tag>
236 Control logging of client connections (0 for no logging, 1 for
237 logging of connects and disconnects, 2 and higher for logging of
238 all client commands). Default: 0.
239
240 <tag>filter <m/name local variables/{ <m/commands/ }</tag> Define a filter. You can learn more about filters
241 in the following chapter.
242
243 <tag>function <m/name/ (<m/parameters/) <m/local variables/ { <m/commands/ }</tag> Define a function. You can learn more
244 about functions in the following chapter.
245
246 <tag>protocol rip|ospf|bgp|... <m/[name]/ { <m>protocol options</m> }</tag> Define a protocol
247 instance called <cf><m/name/</cf> (or with a name like "rip5" generated automatically if you don't specify any <cf><m/name/</cf>). You can learn more
248 about configuring protocols in their own chapters. You can run more than one instance of
249 most protocols (like RIP or BGP). By default, no instances are configured.
250
251 <tag>define <m/constant/ = (<m/expression/)|<m/number/|<m/IP address/</tag> Define a constant. You can use it later in every place
252 you could use a simple integer or an IP address.
253
254 <tag>router id <m/IPv4 address/</tag> Set BIRD's router ID. It's a world-wide unique identification of your router, usually one of router's IPv4 addresses. Default: in IPv4 version, the lowest IP address of a non-loopback interface. In IPv6 version, this option is mandatory.
255
256 <tag>listen bgp [address <m/address/] [port <m/port/] [v6only]</tag>
257 This option allows to specify address and port where BGP
258 protocol should listen. It is global option as listening
259 socket is common to all BGP instances. Default is to listen on
260 all addresses (0.0.0.0) and port 179. In IPv6 mode, option
261 <cf/v6only/ can be used to specify that BGP socket should
262 listen to IPv6 connections only. This is needed if you want to
263 run both bird and bird6 on the same port.
264
265 <tag>table <m/name/</tag> Create a new routing table. The default
266 routing table is created implicitly, other routing tables have
267 to be added by this command.
268
269 <tag>eval <m/expr/</tag> Evaluates given filter expression. It
270 is used by us for testing of filters.
271 </descrip>
272
273 <sect>Protocol options
274
275 <p>For each protocol instance, you can configure a bunch of options.
276 Some of them (those described in this section) are generic, some are
277 specific to the protocol (see sections talking about the protocols).
278
279 <p>Several options use a <cf><m/switch/</cf> argument. It can be either
280 <cf/on/, <cf/yes/ or a numeric expression with a non-zero value for the
281 option to be enabled or <cf/off/, <cf/no/ or a numeric expression evaluating
282 to zero to disable it. An empty <cf><m/switch/</cf> is equivalent to <cf/on/
283 ("silence means agreement").
284
285 <descrip>
286 <tag>preference <m/expr/</tag> Sets the preference of routes generated by this protocol. Default: protocol dependent.
287
288 <tag>disabled <m/switch/</tag> Disables the protocol. You can change the disable/enable status from the command
289 line interface without needing to touch the configuration. Disabled protocols are not activated. Default: protocol is enabled.
290
291 <tag>debug all|off|{ states, routes, filters, interfaces, events, packets }</tag>
292 Set protocol debugging options. If asked, each protocol is capable of
293 writing trace messages about its work to the log (with category
294 <cf/trace/). You can either request printing of <cf/all/ trace messages
295 or only of the types selected: <cf/states/ for protocol state changes
296 (protocol going up, down, starting, stopping etc.),
297 <cf/routes/ for routes exchanged with the routing table,
298 <cf/filters/ for details on route filtering,
299 <cf/interfaces/ for interface change events sent to the protocol,
300 <cf/events/ for events internal to the protocol and
301 <cf/packets/ for packets sent and received by the protocol. Default: off.
302
303 <tag>router id <m/IPv4 address/</tag> This option can be used to override global
304 router id for a given protocol. This option is not yet implemented for OSPF
305 protocol. Default: uses global router id.
306
307 <tag>import all | none | filter <m/name/ | filter { <m/filter commands/ } | where <m/filter expression/</tag>
308 Specify a filter to be used for filtering routes coming from the protocol to the routing table. <cf/all/ is shorthand for <cf/where true/ and <cf/none/ is shorthand for <cf/where false/. Default: <cf/all/.
309
310 <tag>export <m/filter/</tag> This is similar to the <cf>import</cf> keyword, except that it
311 works in the direction from the routing table to the protocol. Default: <cf/none/.
312
313 <tag>description "<m/text/"</tag> This is an optional
314 description of the protocol. It is displayed as a part of the
315 output of 'show route all' command.
316
317 <tag>table <m/name/</tag> Connect this protocol to a non-default routing table.
318 </descrip>
319
320 <p>There are several options that give sense only with certain protocols:
321
322 <descrip>
323 <tag><label id="dsc-iface">interface [-] [ "<m/mask/" ] [ <m/prefix/ ] [, ...] [ { <m/option/ ; [...] } ]</tag>
324
325 Specifies a set of interfaces on which the protocol is activated with
326 given interface-specific options. A set of interfaces specified by one
327 interface option is described using an interface pattern. The
328 interface pattern consists of a sequence of clauses (separted by
329 commas), each clause may contain a mask, a prefix, or both of them. An
330 interface matches the clause if its name matches the mask (if
331 specified) and its address matches the prefix (if specified). Mask is
332 specified as shell-like pattern.
333
334 An interface matches the pattern if it matches any of its
335 clauses. If the clause begins with <cf/-/, matching interfaces are
336 excluded. Patterns are parsed left-to-right, thus
337 <cf/interface "eth0", -"eth*", "*";/ means eth0 and all
338 non-ethernets.
339
340 An interface option can be used more times with different
341 interfaces-specific options, in that case for given interface
342 the first matching interface option is used.
343
344 This option is allowed in Direct, OSPF and RIP protocols,
345 but in OSPF protocol it is used in <cf/area/ subsection.
346
347 Default: none.
348
349 Examples:
350
351 <cf>interface "*" { type broadcast; };</cf> - start the protocol on all interfaces with
352 <cf>type broadcast</cf> option.
353
354 <cf>interface "eth1", "eth4", "eth5" { type pointopoint; };</cf> - start the protocol
355 on enumerated interfaces with <cf>type pointopoint</cf> option.
356
357 <cf>interface -192.168.1.0/24, 192.168.0.0/16;</cf> - start the protocol on all
358 interfaces that have address from 192.168.0.0/16, but not
359 from 192.168.1.0/24.
360
361 <cf>interface -192.168.1.0/24, 192.168.0.0/16;</cf> - start the protocol on all
362 interfaces that have address from 192.168.0.0/16, but not
363 from 192.168.1.0/24.
364
365 <cf>interface "eth*" 192.168.1.0/24;</cf> - start the protocol on all
366 ethernet interfaces that have address from 192.168.1.0/24.
367
368 <tag><label id="dsc-pass">password "<m/password/" [ { id <m/num/; generate from <m/time/; generate to <m/time/; accept from <m/time/; accept to <m/time/; } ]</tag>
369 Specifies a password that can be used by the protocol. Password option can
370 be used more times to specify more passwords. If more passwords are
371 specified, it is a protocol-dependent decision which one is really
372 used. Specifying passwords does not mean that authentication is
373 enabled, authentication can be enabled by separate, protocol-dependent
374 <cf/authentication/ option.
375
376 This option is allowed in OSPF and RIP protocols. BGP has also
377 <cf/password/ option, but it is slightly different and described
378 separately.
379
380 Default: none.
381 </descrip>
382
383 <p>Password option can contain section with some (not necessary all) password sub-options:
384
385 <descrip>
386 <tag>id <M>num</M></tag>
387 ID of the password, (0-255). If it's not used, BIRD will choose
388 ID based on an order of the password item in the interface. For
389 example, second password item in one interface will have default
390 ID 2. ID is used by some routing protocols to identify which
391 password was used to authenticate protocol packets.
392
393 <tag>generate from "<m/time/"</tag>
394 The start time of the usage of the password for packet signing.
395 The format of <cf><m/time/</cf> is <tt>dd-mm-yyyy HH:MM:SS</tt>.
396
397 <tag>generate to "<m/time/"</tag>
398 The last time of the usage of the password for packet signing.
399
400 <tag>accept from "<m/time/"</tag>
401 The start time of the usage of the password for packet verification.
402
403 <tag>accept to "<m/time/"</tag>
404 The last time of the usage of the password for packet verification.
405 </descrip>
406
407 <chapt>Remote control
408
409 <p>You can use the command-line client <file>birdc</file> to talk with
410 a running BIRD. Communication is done using a <file/bird.ctl/ UNIX domain
411 socket (unless changed with the <tt/-s/ option given to both the server and
412 the client). The commands can perform simple actions such as enabling/disabling
413 of protocols, telling BIRD to show various information, telling it to
414 show routing table filtered by filter, or asking BIRD to
415 reconfigure. Press <tt/?/ at any time to get online help. Option
416 <tt/-v/ can be passed to the client, to make it dump numeric return
417 codes along with the messages. You do not necessarily need to use <file/birdc/ to talk to BIRD, your
418 own applications could do that, too -- the format of communication between
419 BIRD and <file/birdc/ is stable (see the programmer's documentation).
420
421 Many commands have the <m/name/ of the protocol instance as an argument.
422 This argument can be omitted if there exists only a single instance.
423
424 <p>Here is a brief list of supported functions:
425
426 <descrip>
427 <tag>dump resources|sockets|interfaces|neighbors|attributes|routes|protocols</tag>
428 Dump contents of internal data structures to the debugging output.
429
430 <tag>show status</tag>
431 Show router status, that is BIRD version, uptime and time from last reconfiguration.
432
433 <tag>show protocols [all]</tag>
434 Show list of protocol instances along with tables they are connected to and protocol status, possibly giving verbose information, if <cf/all/ is specified.
435
436 <tag>show ospf interface [<m/name/] ["<m/interface/"]</tag>
437 Show detailed information about OSPF interfaces.
438
439 <tag>show ospf neighbors [<m/name/] ["<m/interface/"]</tag>
440 Show a list of OSPF neighbors and a state of adjacency to them.
441
442 <tag>show ospf state [<m/name/]</tag>
443 Show detailed information about OSPF areas based on a content of link-state database.
444 It shows network topology, aggregated networks and routers from other areas and external routes.
445
446 <tag>show ospf topology [<m/name/]</tag>
447 Show a topology of OSPF areas based on a content of link-state database.
448 It is just a stripped-down version of 'show ospf state'.
449
450 <tag>show static [<m/name/]</tag>
451 Show detailed information about static routes.
452
453 <tag>show interfaces [summary]</tag>
454 Show the list of interfaces. For each interface, print its type, state, MTU and addresses assigned.
455
456 <tag>show symbols</tag>
457 Show the list of symbols defined in the configuration (names of protocols, routing tables etc.).
458
459 <tag>show route [[for] <m/prefix/|<m/IP/] [table <m/sym/] [filter <m/f/|where <m/c/] [(export|preexport) <m/p/] [protocol <m/p/] [<m/options/]</tag>
460 Show contents of a routing table (by default of the main one),
461 that is routes, their metrics and (in case the <cf/all/ switch is given)
462 all their attributes.
463
464 <p>You can specify a <m/prefix/ if you want to print routes for a
465 specific network. If you use <cf>for <m/prefix or IP/</cf>, you'll get
466 the entry which will be used for forwarding of packets to the given
467 destination. By default, all routes for each network are printed with
468 the selected one at the top, unless <cf/primary/ is given in which case
469 only the selected route is shown.
470
471 <p>You can also ask for printing only routes processed and accepted by
472 a given filter (<cf>filter <m/name/</cf> or <cf>filter { <m/filter/ }
473 </cf> or matching a given condition (<cf>where <m/condition/</cf>).
474 The <cf/export/ and <cf/preexport/ switches ask for printing of entries
475 that are exported to the specified protocol. With <cf/preexport/, the
476 export filter of the protocol is skipped.
477
478 <p>You can also select just routes added by a specific protocol.
479 <cf>protocol <m/p/</cf>.
480
481 <p>The <cf/stats/ switch requests showing of route statistics (the
482 number of networks, number of routes before and after filtering). If
483 you use <cf/count/ instead, only the statistics will be printed.
484
485 <tag>enable|disable|restart <m/name/|"<m/pattern/"|all</tag>
486 Enable, disable or restart a given protocol instance, instances matching the <cf><m/pattern/</cf> or <cf/all/ instances.
487
488 <tag>configure [soft] ["<m/config file/"]</tag>
489 Reload configuration from a given file. BIRD will smoothly
490 switch itself to the new configuration, protocols are
491 reconfigured if possible, restarted otherwise. Changes in
492 filters usualy lead to restart of affected protocols. If
493 <cf/soft/ option is used, changes in filters does not cause
494 BIRD to restart affected protocols, therefore already accepted
495 routes (according to old filters) would be still propagated,
496 but new routes would be processed according to the new
497 filters.
498
499 <tag/down/
500 Shut BIRD down.
501
502 <tag>debug <m/protocol/|<m/pattern/|all all|off|{ states | routes | filters | events | packets }</tag>
503 Control protocol debugging.
504 </descrip>
505
506 <chapt>Filters
507
508 <sect>Introduction
509
510 <p>BIRD contains a simple programming language. (No, it can't yet read mail :-). There are
511 two objects in this language: filters and functions. Filters are interpreted by BIRD core when a route is
512 being passed between protocols and routing tables. The filter language contains control structures such
513 as if's and switches, but it allows no loops. An example of a filter using many features can be found in <file>filter/test.conf</file>.
514
515 <p>Filter gets the route, looks at its attributes and
516 modifies some of them if it wishes. At the end, it decides whether to
517 pass the changed route through (using <cf/accept/) or whether to <cf/reject/ it. A simple filter looks
518 like this:
519
520 <code>
521 filter not_too_far
522 int var;
523 {
524 if defined( rip_metric ) then
525 var = rip_metric;
526 else {
527 var = 1;
528 rip_metric = 1;
529 }
530 if rip_metric &gt; 10 then
531 reject "RIP metric is too big";
532 else
533 accept "ok";
534 }
535 </code>
536
537 <p>As you can see, a filter has a header, a list of local variables, and a body. The header consists of
538 the <cf/filter/ keyword followed by a (unique) name of filter. The list of local variables consists of
539 <cf><M>type name</M>;</cf> pairs where each pair defines one local variable. The body consists of
540 <cf> { <M>statements</M> }</cf>. Each <m/statement/ is terminated by a <cf/;/. You can group
541 several statements to a single compound statement by using braces (<cf>{ <M>statements</M> }</cf>) which is useful if
542 you want to make a bigger block of code conditional.
543
544 <p>BIRD supports functions, so that you don't have to repeat the same blocks of code over and
545 over. Functions can have zero or more parameters and they can have local variables. Recursion is not allowed. Function definitions
546 look like this:
547
548 <code>
549 function name ()
550 int local_variable;
551 {
552 local_variable = 5;
553 }
554
555 function with_parameters (int parameter)
556 {
557 print parameter;
558 }
559 </code>
560
561 <p>Unlike in C, variables are declared after the <cf/function/ line, but before the first <cf/{/. You can't declare
562 variables in nested blocks. Functions are called like in C: <cf>name();
563 with_parameters(5);</cf>. Function may return values using the <cf>return <m/[expr]/</cf>
564 command. Returning a value exits from current function (this is similar to C).
565
566 <p>Filters are declared in a way similar to functions except they can't have explicit
567 parameters. They get a route table entry as an implicit parameter, it is also passed automatically
568 to any functions called. The filter must terminate with either
569 <cf/accept/ or <cf/reject/ statement. If there's a runtime error in filter, the route
570 is rejected.
571
572 <p>A nice trick to debug filters is to use <cf>show route filter
573 <m/name/</cf> from the command line client. An example session might look
574 like:
575
576 <code>
577 pavel@bug:~/bird$ ./birdc -s bird.ctl
578 BIRD 0.0.0 ready.
579 bird> show route
580 10.0.0.0/8 dev eth0 [direct1 23:21] (240)
581 195.113.30.2/32 dev tunl1 [direct1 23:21] (240)
582 127.0.0.0/8 dev lo [direct1 23:21] (240)
583 bird> show route ?
584 show route [<prefix>] [table <t>] [filter <f>] [all] [primary]...
585 bird> show route filter { if 127.0.0.5 &tilde; net then accept; }
586 127.0.0.0/8 dev lo [direct1 23:21] (240)
587 bird>
588 </code>
589
590 <sect>Data types
591
592 <p>Each variable and each value has certain type. Booleans, integers and enums are
593 incompatible with each other (that is to prevent you from shooting in the foot).
594
595 <descrip>
596 <tag/bool/ This is a boolean type, it can have only two values, <cf/true/ and
597 <cf/false/. Boolean is the only type you can use in <cf/if/
598 statements.
599
600 <tag/int/ This is a general integer type, you can expect it to store signed values from -2000000000
601 to +2000000000. Overflows are not checked. You can use <cf/0x1234/ syntax to write hexadecimal values.
602
603 <tag/pair/ This is a pair of two short integers. Each component can have values from 0 to
604 65535. Literals of this type are written as <cf/(1234,5678)/. The same syntax can also be
605 used to construct a pair from two arbitrary integer expressions (for example <cf/(1+2,a)/).
606
607 <tag/string/ This is a string of characters. There are no ways to modify strings in
608 filters. You can pass them between functions, assign them to variables of type <cf/string/, print
609 such variables, but you can't concatenate two strings. String literals
610 are written as <cf/"This is a string constant"/.
611
612 <tag/ip/ This type can hold a single IP address. Depending on the compile-time configuration of BIRD you are using, it
613 is either an IPv4 or IPv6 address. IP addresses are written in the standard notation (<cf/10.20.30.40/ or <cf/fec0:3:4::1/). You can apply special operator <cf>.mask(<M>num</M>)</cf>
614 on values of type ip. It masks out all but first <cf><M>num</M></cf> bits from the IP
615 address. So <cf/1.2.3.4.mask(8) = 1.0.0.0/ is true.
616
617 <tag/prefix/ This type can hold a network prefix consisting of IP address and prefix length. Prefix literals are written as
618 <cf><M>ipaddress</M>/<M>pxlen</M></cf>, or
619 <cf><m>ipaddress</m>/<m>netmask</m></cf>. There are two special
620 operators on prefixes:
621 <cf/.ip/ which extracts the IP address from the pair, and <cf/.len/, which separates prefix
622 length from the pair. So <cf>1.2.0.0/16.pxlen = 16</cf> is true.
623
624 <tag/int|ip|prefix|pair|enum set/
625 Filters recognize four types of sets. Sets are similar to strings: you can pass them around
626 but you can't modify them. Literals of type <cf>set int</cf> look like <cf>
627 [ 1, 2, 5..7 ]</cf>. As you can see, both simple values and ranges are permitted in
628 sets.
629
630 Sets of prefixes are special: their literals does not allow ranges, but allows
631 prefix patterns that are written as <cf><M>ipaddress</M>/<M>pxlen</M>{<M>low</M>,<M>high</M>}</cf>.
632 Prefix <cf><m>ip1</m>/<m>len1</m></cf> matches prefix pattern <cf><m>ip2</m>/<m>len2</m>{<m>l</m>,<m>h</m>}</cf> iff
633 the first <cf>min(len1, len2)</cf> bits of <cf/ip1/ and <cf/ip2/ are identical and <cf>len1 &lt;= ip1 &lt;= len2</cf>.
634 A valid prefix pattern has to satisfy <cf>low &lt;= high</cf>, but <cf/pxlen/ is not constrained by <cf/low/
635 or <cf/high/. Obviously, a prefix matches a prefix set literal iff it matches any prefix pattern in the
636 prefix set literal.
637
638 There are also two shorthands for prefix patterns: <cf><m>address</m>/<m/len/+</cf> is a shorthand for
639 <cf><m>address</m>/<m/len/{<m/len/,<m/maxlen/}</cf> (where <cf><m>maxlen</m></cf> is 32 for IPv4 and 128 for IPv6),
640 that means network prefix <cf><m>address</m>/<m/len/</cf> and all its subnets. <cf><m>address</m>/<m/len/-</cf>
641 is a shorthand for <cf><m>address</m>/<m/len/{0,<m/len/}</cf>, that means network prefix <cf><m>address</m>/<m/len/</cf>
642 and all its supernets (network prefixes that contain it).
643
644 For example, <cf>[ 1.0.0.0/8, 2.0.0.0/8+, 3.0.0.0/8-, 4.0.0.0/8{16,24} ]</cf> matches
645 prefix <cf>1.0.0.0/8</cf>, all subprefixes of <cf>2.0.0.0/8</cf>, all superprefixes of <cf>3.0.0.0/8</cf> and prefixes
646 <cf/4.X.X.X/ whose prefix length is 16 to 24. <cf>[ 0.0.0.0/0{20,24} ]</cf> matches all prefixes (regardless of
647 IP address) whose prefix length is 20 to 24, <cf>[ 1.2.3.4/32- ]</cf> matches any prefix that contains IP address
648 <cf>1.2.3.4</cf>. <cf>1.2.0.0/16 &tilde; [ 1.0.0.0/8{15,17} ]</cf> is true,
649 but <cf>1.0.0.0/16 &tilde; [ 1.0.0.0/8- ]</cf> is false.
650
651 Cisco-style patterns like <cf>10.0.0.0/8 ge 16 le 24</cf> can be expressed
652 in BIRD as <cf>10.0.0.0/8{16,24}</cf>, <cf>192.168.0.0/16 le 24</cf> as
653 <cf>192.168.0.0/16{16,24}</cf> and <cf>192.168.0.0/16 ge 24</cf> as
654 <cf>192.168.0.0/16{24,32}</cf>.
655
656 <tag/enum/
657 Enumeration types are fixed sets of possibilities. You can't define your own
658 variables of such type, but some route attributes are of enumeration
659 type. Enumeration types are incompatible with each other.
660
661 <tag/bgppath/
662 BGP path is a list of autonomous system numbers. You can't write literals of this type.
663 There are several special operators on bgppaths:
664
665 <cf><m/P/.first</cf> returns the first ASN (the neighbor ASN) in path <m/P/.
666
667 <cf><m/P/.last</cf> returns the last ASN (the source ASN) in path <m/P/.
668
669 Both <cf/first/ and <cf/last/ return zero if there is no appropriate ASN,
670 for example if the path contains an AS set element as the first (or the last) part.
671
672 <cf><m/P/.len</cf> returns the length of path <m/P/.
673
674 <cf>prepend(<m/P/,<m/A/)</cf> prepends ASN <m/A/ to path <m/P/ and returns the result.
675 Statement <cf><m/P/ = prepend(<m/P/, <m/A/);</cf> can be shortened to
676 <cf><m/P/.prepend(<m/A/);</cf> if <m/P/ is appropriate route attribute
677 (for example <cf/bgp_path/).
678
679 <tag/bgpmask/
680 BGP masks are patterns used for BGP path matching
681 (using <cf>path &tilde; [= 2 3 5 * =]</cf> syntax). The masks
682 resemble wildcard patterns as used by UNIX shells. Autonomous
683 system numbers match themselves, <cf/*/ matches any (even empty)
684 sequence of arbitrary AS numbers and <cf/?/ matches one arbitrary AS number.
685 For example, if <cf>bgp_path</cf> is 4 3 2 1, then:
686 <tt>bgp_path &tilde; [= * 4 3 * =]</tt> is true, but
687 <tt>bgp_path &tilde; [= * 4 5 * =]</tt> is false.
688 BGP mask expressions can also contain integer expressions enclosed in parenthesis
689 and integer variables, for example <tt>[= * 4 (1+2) a =]</tt>.
690 There is also old syntax that uses / .. / instead of [= .. =] and ? instead of *.
691
692 <tag/clist/
693 Community list is similar to set of pairs,
694 except that unlike other sets, it can be modified.
695 There exist no literals of this type.
696 There are two special operators on clists:
697
698 <cf>add(<m/C/,<m/P/)</cf> adds pair <m/P/ to clist <m/C/ and returns the result.
699
700 <cf>delete(<m/C/,<m/P/)</cf> deletes pair <m/P/ from clist <m/C/ and returns the result.
701
702 Statement <cf><m/C/ = add(<m/C/, <m/P/);</cf> can be shortened to
703 <cf><m/C/.add(<m/P/);</cf> if <m/C/ is appropriate route attribute
704 (for example <cf/bgp_community/). Similarly for <cf/delete/.
705
706 </descrip>
707
708 <sect>Operators
709
710 <p>The filter language supports common integer operators <cf>(+,-,*,/)</cf>, parentheses <cf/(a*(b+c))/, comparison
711 <cf/(a=b, a!=b, a&lt;b, a&gt;=b)/. Logical operations include unary not (<cf/!/), and (<cf/&amp;&amp;/) and or (<cf/&verbar;&verbar;/).
712 Special operators include <cf/&tilde;/ for "is element of a set" operation - it can be
713 used on element and set of elements of the same type (returning true if element is contained in the given set), or
714 on two strings (returning true if first string matches a shell-like pattern stored in second string) or on IP and prefix (returning true if IP is within the range defined by that prefix), or on
715 prefix and prefix (returning true if first prefix is more specific than second one) or on bgppath and bgpmask (returning true if the path matches the mask) or on pair and clist (returning true if the community is element of the community list).
716
717
718 <sect>Control structures
719
720 <p>Filters support two control structures: conditions and case switches.
721
722 <p>Syntax of a condition is: <cf>if
723 <M>boolean expression</M> then <M>command1</M>; else <M>command2</M>;</cf> and you can use <cf>{
724 <M>command_1</M>; <M>command_2</M>; <M>...</M> }</cf> instead of either command. The <cf>else</cf>
725 clause may be omitted. If the <cf><m>boolean expression</m></cf> is true, <cf><m>command1</m></cf> is executed, otherwise <cf><m>command2</m></cf> is executed.
726
727 <p>The <cf>case</cf> is similar to case from Pascal. Syntax is <cf>case <m/expr/ { else |
728 <m/num_or_prefix [ .. num_or_prefix]/: <m/statement/ ; [ ... ] }</cf>. The expression after
729 <cf>case</cf> can be of any type which can be on the left side of the &tilde; operator and anything that could
730 be a member of a set is allowed before <cf/:/. Multiple commands are allowed without <cf/{}/ grouping.
731 If <cf><m/expr/</cf> matches one of the <cf/:/ clauses, statements between it and next <cf/:/ statement are executed. If <cf><m/expr/</cf> matches neither of the <cf/:/ clauses, the statements after <cf/else:/ are executed.
732
733 <p>Here is example that uses <cf/if/ and <cf/case/ structures:
734
735 <code>
736 case arg1 {
737 2: print "two"; print "I can do more commands without {}";
738 3 .. 5: print "three to five";
739 else: print "something else";
740 }
741
742 if 1234 = i then printn "."; else {
743 print "not 1234";
744 print "You need {} around multiple commands";
745 }
746 </code>
747
748 <sect>Route attributes
749
750 <p>A filter is implicitly passed a route, and it can access its
751 attributes just like it accesses variables. Attempts to access undefined
752 attribute result in a runtime error; you can check if an attribute is
753 defined by using the <cf>defined( <m>attribute</m> )</cf> operator.
754
755 <descrip>
756 <tag><m/prefix/ net</tag>
757 Network the route is talking about. Read-only. (See the chapter about routing tables.)
758
759 <tag><m/enum/ scope</tag>
760 Address scope of the network (<cf/SCOPE_HOST/ for addresses local to this host, <cf/SCOPE_LINK/ for those specific for a physical link, <cf/SCOPE_SITE/ and <cf/SCOPE_ORGANIZATION/ for private addresses, <cf/SCOPE_UNIVERSE/ for globally visible addresses).
761
762 <tag><m/int/ preference</tag>
763 Preference of the route. Valid values are 0-65535. (See the chapter about routing tables.)
764
765 <tag><m/ip/ from</tag>
766 The router which the route has originated from. Read-only.
767
768 <tag><m/ip/ gw</tag>
769 Next hop packets routed using this route should be forwarded to.
770
771 <tag><m/string/ proto</tag>
772 The name of the protocol which the route has been imported from. Read-only.
773
774 <tag><m/enum/ source</tag>
775 what protocol has told me about this route. Possible values: <cf/RTS_DUMMY/, <cf/RTS_STATIC/, <cf/RTS_INHERIT/, <cf/RTS_DEVICE/, <cf/RTS_STATIC_DEVICE/, <cf/RTS_REDIRECT/, <cf/RTS_RIP/, <cf/RTS_OSPF/, <cf/RTS_OSPF_IA/, <cf/RTS_OSPF_EXT/, <cf/RTS_BGP/, <cf/RTS_PIPE/.
776
777 <tag><m/enum/ cast</tag>
778 Route type (<cf/RTC_UNICAST/ for normal routes, <cf/RTC_BROADCAST/, <cf/RTC_MULTICAST/, <cf/RTC_ANYCAST/ for broadcast, multicast and anycast routes). Read-only.
779
780 <tag><m/enum/ dest</tag>
781 Type of destination the packets should be sent to (<cf/RTD_ROUTER/ for forwarding to a neighboring router, <cf/RTD_NETWORK/ for routing to a directly-connected network, <cf/RTD_BLACKHOLE/ for packets to be silently discarded, <cf/RTD_UNREACHABLE/, <cf/RTD_PROHIBIT/ for packets that should be returned with ICMP host unreachable / ICMP administratively prohibited messages). Read-only.
782 </descrip>
783
784 <p>There also exist some protocol-specific attributes which are described in the corresponding protocol sections.
785
786 <sect>Other statements
787
788 <p>The following statements are available:
789
790 <descrip>
791 <tag><m/variable/ = <m/expr/</tag> Set variable to a given value.
792
793 <tag>accept|reject [ <m/expr/ ]</tag> Accept or reject the route, possibly printing <cf><m>expr</m></cf>.
794
795 <tag>return <m/expr/</tag> Return <cf><m>expr</m></cf> from the current function, the function ends at this point.
796
797 <tag>print|printn <m/expr/ [<m/, expr.../]</tag>
798 Prints given expressions; useful mainly while debugging
799 filters. The <cf/printn/ variant does not terminate the line.
800
801 <tag>quitbird</tag>
802 Terminates BIRD. Useful when debugging the filter interpreter.
803 </descrip>
804
805 <chapt>Protocols
806
807 <sect>BGP
808
809 <p>The Border Gateway Protocol is the routing protocol used for backbone
810 level routing in the today's Internet. Contrary to the other protocols, its convergence
811 doesn't rely on all routers following the same rules for route selection,
812 making it possible to implement any routing policy at any router in the
813 network, the only restriction being that if a router advertises a route,
814 it must accept and forward packets according to it.
815
816 <p>BGP works in terms of autonomous systems (often abbreviated as AS). Each
817 AS is a part of the network with common management and common routing policy. It is identified by a unique 16-bit number.
818 Routers within each AS usually communicate with each other using either a interior routing
819 protocol (such as OSPF or RIP) or an interior variant of BGP (called iBGP).
820 Boundary routers at the border of the AS communicate with their peers
821 in the neighboring AS'es via exterior BGP (eBGP).
822
823 <p>Each BGP router sends to its neighbors updates of the parts of its
824 routing table it wishes to export along with complete path information
825 (a list of AS'es the packet will travel through if it uses the particular
826 route) in order to avoid routing loops.
827
828 <p>BIRD supports all requirements of the BGP4 standard as defined in
829 RFC 4271<htmlurl url="ftp://ftp.rfc-editor.org/in-notes/rfc4271.txt">
830 It also supports the community attributes
831 (RFC 1997<htmlurl url="ftp://ftp.rfc-editor.org/in-notes/rfc1997.txt">),
832 capability negotiation
833 (RFC 3392<htmlurl url="ftp://ftp.rfc-editor.org/in-notes/rfc3392.txt">),
834 MD5 password authentication
835 (RFC 2385<htmlurl url="ftp://ftp.rfc-editor.org/in-notes/rfc2385.txt">),
836 route reflectors
837 (RFC 4456<htmlurl url="ftp://ftp.rfc-editor.org/in-notes/rfc4456.txt">),
838 multiprotocol extensions
839 (RFC 4760<htmlurl url="ftp://ftp.rfc-editor.org/in-notes/rfc4760.txt">),
840 and 4B AS numbers
841 (RFC 4893<htmlurl url="ftp://ftp.rfc-editor.org/in-notes/rfc4893.txt">).
842
843
844 For IPv6, it uses the standard multiprotocol extensions defined in
845 RFC 2283<htmlurl url="ftp://ftp.rfc-editor.org/in-notes/rfc2283.txt">
846 including changes described in the
847 latest draft<htmlurl url="ftp://ftp.rfc-editor.org/internet-drafts/draft-ietf-idr-bgp4-multiprotocol-v2-05.txt">
848 and applied to IPv6 according to
849 RFC 2545<htmlurl url="ftp://ftp.rfc-editor.org/in-notes/rfc2545.txt">.
850
851 <sect1>Route selection rules
852
853 <p>BGP doesn't have any simple metric, so the rules for selection of an optimal
854 route among multiple BGP routes with the same preference are a bit more complex
855 and they are implemented according to the following algorithm. It starts the first
856 rule, if there are more "best" routes, then it uses the second rule to choose
857 among them and so on.
858
859 <itemize>
860 <item>Prefer route with the highest Local Preference attribute.
861 <item>Prefer route with the shortest AS path.
862 <item>Prefer IGP origin over EGP and EGP over incomplete.
863 <item>Prefer the lowest value of the Multiple Exit Discriminator.
864 <item>Prefer internal routes over external ones.
865 <item>Prefer the route with the lowest value of router ID of the
866 advertising router.
867 </itemize>
868
869 <sect1>Configuration
870
871 <p>Each instance of the BGP corresponds to one neighboring router.
872 This allows to set routing policy and all the other parameters differently
873 for each neighbor using the following configuration parameters:
874
875 <descrip>
876 <tag>local as <m/number/</tag> Define which AS we are part of. (Note that
877 contrary to other IP routers, BIRD is able to act as a router located
878 in multiple AS'es simultaneously, but in such cases you need to tweak
879 the BGP paths manually in the filters to get consistent behavior.)
880 This parameter is mandatory.
881
882 <tag>neighbor <m/ip/ as <m/number/</tag> Define neighboring router
883 this instance will be talking to and what AS it's located in. Unless
884 you use the <cf/multihop/ clause, it must be directly connected to one
885 of your router's interfaces. In case the neighbor is in the same AS
886 as we are, we automatically switch to iBGP. This parameter is mandatory.
887
888 <tag>multihop <m/number/ via <m/ip/</tag> Configure multihop BGP to a
889 neighbor which is connected at most <m/number/ hops far and to which
890 we should route via our direct neighbor with address <m/ip/.
891 Default: switched off.
892
893 <tag>next hop self</tag> Avoid calculation of the Next Hop
894 attribute and always advertise our own source address (see
895 below) as a next hop. This needs to be used only occasionally
896 to circumvent misconfigurations of other routers.
897 Default: disabled.
898
899 <tag>missing lladdr self|drop|ignore</tag>Next Hop attribute
900 in BGP-IPv6 sometimes contains just the global IPv6 address,
901 but sometimes it has to contain both global and link-local
902 IPv6 addresses. This option specifies what to do if BIRD have
903 to send both addresses but does not know link-local address.
904 This situation might happen when routes from other protocols
905 are exported to BGP, or when improper updates are received
906 from BGP peers. <tag/self/ means that BIRD advertises its own
907 local address instead. <tag/drop/ means that BIRD skips that
908 prefixes and logs error. <tag/ignore/ means that BIRD ignores
909 the problem and sends just the global address (and therefore
910 forms improper BGP update). Default: <tag/self/, unless BIRD
911 is configured as a route server (option <tag/rs client/), in
912 that case default is <tag/drop/, because route servers usually
913 does not forward packets ifselves.
914
915 <tag>source address <m/ip/</tag> Define local address we should use
916 for next hop calculation. Default: the address of the local end
917 of the interface our neighbor is connected to.
918
919 <tag>password <m/string/</tag> Use this password for MD5 authentication
920 of BGP sessions. Default: no authentication. Password has to be set by
921 external utility (e.g. setkey(8)) on BSD systems.
922
923 <tag>passive <m/switch/</tag> Standard BGP behavior is both
924 initiating outgoing connections and accepting incoming
925 connections. In passive mode, outgoing connections are not
926 initiated. Default: off.
927
928 <tag>rr client</tag> Be a route reflector and treat the neighbor as
929 a route reflection client. Default: disabled.
930
931 <tag>rr cluster id <m/IPv4 address/</tag> Route reflectors use cluster id
932 to avoid route reflection loops. When there is one route reflector in a cluster
933 it usually uses its router id as a cluster id, but when there are more route
934 reflectors in a cluster, these need to be configured (using this option) to
935 use a common cluster id. Clients in a cluster need not know their cluster
936 id and this option is not allowed for them. Default: the same as router id.
937
938 <tag>rs client</tag> Be a route server and treat the neighbor
939 as a route server client. A route server is used as a
940 replacement for full mesh EBGP routing in Internet exchange
941 points in a similar way to route reflectors used in IBGP routing.
942 BIRD does not implement obsoleted RFC 1863, but uses ad-hoc implementation,
943 which behaves like plain EBGP but reduces modifications to advertised route
944 attributes to be transparent (for example does not prepend its AS number to
945 AS PATH attribute and keep MED attribute). Default: disabled.
946
947 <tag>enable as4 <m/switch/</tag> BGP protocol was designed to use 2B AS numbers
948 and was extended later to allow 4B AS number. BIRD supports 4B AS extension,
949 but by disabling this option it can be persuaded not to advertise it and
950 to maintain old-style sessions with its neighbors. This might be useful for
951 circumventing bugs in neighbor's implementation of 4B AS extension.
952 Even when disabled (off), BIRD behaves internally as AS4-aware BGP router.
953 Default: on.
954
955 <tag>capabilities <m/switch/</tag> Use capability advertisement
956 to advertise optional capabilities. This is standard behavior
957 for newer BGP implementations, but there might be some older
958 BGP implementations that reject such connection attempts.
959 When disabled (off), features that request it (4B AS support)
960 are also disabled. Default: on, with automatic fallback to
961 off when received capability-related error.
962
963 <tag>advertise ipv4 <m/switch/</tag> Advertise IPv4 multiprotocol capability.
964 This is not a correct behavior according to the strict interpretation
965 of RFC 4760, but it is widespread and required by some BGP
966 implementations (Cisco and Quagga). This option is relevant
967 to IPv4 mode with enabled capability advertisement only. Default: on.
968
969 <tag>route limit <m/number/</tag> The maximal number of routes
970 that may be imported from the protocol. If the route limit is
971 exceeded, the connection is closed with error. Default: no limit.
972
973 <tag>disable after error <m/switch/</tag> When an error is encountered (either
974 locally or by the other side), disable the instance automatically
975 and wait for an administrator to fix the problem manually. Default: off.
976
977 <tag>hold time <m/number/</tag> Time in seconds to wait for a Keepalive
978 message from the other side before considering the connection stale.
979 Default: depends on agreement with the neighboring router, we prefer
980 240 seconds if the other side is willing to accept it.
981
982 <tag>startup hold time <m/number/</tag> Value of the hold timer used
983 before the routers have a chance to exchange open messages and agree
984 on the real value. Default: 240 seconds.
985
986 <tag>keepalive time <m/number/</tag> Delay in seconds between sending
987 of two consecutive Keepalive messages. Default: One third of the hold time.
988
989 <tag>connect retry time <m/number/</tag> Time in seconds to wait before
990 retrying a failed attempt to connect. Default: 120 seconds.
991
992 <tag>start delay time <m/number/</tag> Delay in seconds between protocol
993 startup and the first attempt to connect. Default: 5 seconds.
994
995 <tag>error wait time <m/number/,<m/number/</tag> Minimum and maximum delay in seconds between a protocol
996 failure (either local or reported by the peer) and automatic restart.
997 Doesn't apply when <cf/disable after error/ is configured. If consecutive
998 errors happen, the delay is increased exponentially until it reaches the maximum. Default: 60, 300.
999
1000 <tag>error forget time <m/number/</tag> Maximum time in seconds between two protocol
1001 failures to treat them as a error sequence which makes the <cf/error wait time/
1002 increase exponentially. Default: 300 seconds.
1003
1004 <tag>path metric <m/switch/</tag> Enable comparison of path lengths
1005 when deciding which BGP route is the best one. Default: on.
1006
1007 <tag>prefer older <m/switch/</tag> Standard route selection algorithm
1008 breaks ties by comparing router IDs. This changes the behavior
1009 to prefer older routes (when both are external and from different
1010 peer). For details, see RFC 5004. Default: off.
1011
1012 <tag>default bgp_med <m/number/</tag> Value of the Multiple Exit
1013 Discriminator to be used during route selection when the MED attribute
1014 is missing. Default: 0.
1015
1016 <tag>default bgp_local_pref <m/number/</tag> Value of the Local Preference
1017 to be used during route selection when the Local Preference attribute
1018 is missing. Default: 0.
1019 </descrip>
1020
1021 <sect1>Attributes
1022
1023 <p>BGP defines several route attributes. Some of them (those marked with `<tt/I/' in the
1024 table below) are available on internal BGP connections only, some of them (marked
1025 with `<tt/O/') are optional.
1026
1027 <descrip>
1028 <tag>bgppath <cf/bgp_path/</tag> Sequence of AS numbers describing the AS path
1029 the packet will travel through when forwarded according to the particular route. In case of
1030 internal BGP it doesn't contain the number of the local AS.
1031
1032 <tag>int <cf/bgp_local_pref/ [I]</tag> Local preference value used for
1033 selection among multiple BGP routes (see the selection rules above). It's
1034 used as an additional metric which is propagated through the whole local AS.
1035
1036 <tag>int <cf/bgp_med/ [O]</tag> The Multiple Exit Discriminator of the route
1037 is an optional attribute which is used on on external (inter-AS) links to
1038 convey to an adjacent AS the optimal entry point into the local AS.
1039 The received attribute may be also propagated over internal BGP links
1040 (and this is default behavior). The attribute value is zeroed when a route
1041 is exported from a routing table to a BGP instance to ensure that the attribute
1042 received from a neighboring AS is not propagated to other neighboring ASes.
1043 A new value might be set in the export filter of a BGP instance.
1044 See RFC 4451<htmlurl url="ftp://ftp.rfc-editor.org/in-notes/rfc4451.txt">
1045 for further discussion of BGP MED attribute.
1046
1047 <tag>enum <cf/bgp_origin/</tag> Origin of the route: either <cf/ORIGIN_IGP/
1048 if the route has originated in an interior routing protocol or
1049 <cf/ORIGIN_EGP/ if it's been imported from the <tt>EGP</tt> protocol
1050 (nowadays it seems to be obsolete) or <cf/ORIGIN_INCOMPLETE/ if the origin
1051 is unknown.
1052
1053 <tag>ip <cf/bgp_next_hop/</tag> Next hop to be used for forwarding of packets
1054 to this destination. On internal BGP connections, it's an address of the
1055 originating router if it's inside the local AS or a boundary router the
1056 packet will leave the AS through if it's an exterior route, so each BGP
1057 speaker within the AS has a chance to use the shortest interior path
1058 possible to this point.
1059
1060 <tag>void <cf/bgp_atomic_aggr/ [O]</tag> This is an optional attribute
1061 which carries no value, but the sole presence of which indicates that the route
1062 has been aggregated from multiple routes by some router on the path from
1063 the originator.
1064
1065 <!-- we don't handle aggregators right since they are of a very obscure type
1066 <tag>bgp_aggregator</tag>
1067 -->
1068 <tag>clist <cf/bgp_community/ [O]</tag> List of community values associated
1069 with the route. Each such value is a pair (represented as a <cf/pair/ data
1070 type inside the filters) of 16-bit integers, the first of them containing the number of the AS which defines
1071 the community and the second one being a per-AS identifier. There are lots
1072 of uses of the community mechanism, but generally they are used to carry
1073 policy information like "don't export to USA peers". As each AS can define
1074 its own routing policy, it also has a complete freedom about which community
1075 attributes it defines and what will their semantics be.
1076 </descrip>
1077
1078 <sect1>Example
1079
1080 <p><code>
1081 protocol bgp {
1082 local as 65000; # Use a private AS number
1083 neighbor 62.168.0.130 as 5588; # Our neighbor ...
1084 multihop 20 via 62.168.0.13; # ... which is connected indirectly
1085 export filter { # We use non-trivial export rules
1086 if source = RTS_STATIC then { # Export only static routes
1087 # Assign our community
1088 bgp_community.add((65000,5678));
1089 # Artificially increase path length
1090 # by advertising local AS number twice
1091 if bgp_path ~ [= 65000 =] then
1092 bgp_path.prepend(65000);
1093 accept;
1094 }
1095 reject;
1096 };
1097 import all;
1098 source address 62.168.0.1; # Use a non-standard source address
1099 }
1100 </code>
1101
1102 <sect>Device
1103
1104 <p>The Device protocol is not a real routing protocol. It doesn't generate
1105 any routes and it only serves as a module for getting information about network
1106 interfaces from the kernel.
1107
1108 <p>Except for very unusual circumstances, you probably should include
1109 this protocol in the configuration since almost all other protocols
1110 require network interfaces to be defined for them to work with.
1111
1112 <sect1>Configuration
1113
1114 <p><descrip>
1115 <tag>scan time <m/number/</tag> Time in seconds between two scans
1116 of the network interface list. On systems where we are notified about
1117 interface status changes asynchronously (such as newer versions of
1118 Linux), we need to scan the list only in order to avoid confusion by lost
1119 notification messages, so the default time is set to a large value.
1120
1121 <tag>primary [ "<m/mask/" ] <m/prefix/</tag>
1122 If a network interface has more than one network address,
1123 BIRD has to choose one of them as a primary one, because some
1124 routing protocols (for example OSPFv2) suppose there is only
1125 one network address per interface. By default, BIRD chooses
1126 the lexicographically smallest address as the primary one.
1127
1128 This option allows to specify which network address should be
1129 chosen as a primary one. Network addresses that match
1130 <m/prefix/ are preferred to non-matching addresses. If more
1131 <cf/primary/ options are used, the first one has the highest
1132 preference. If "<m/mask/" is specified, then such
1133 <cf/primary/ option is relevant only to matching network
1134 interfaces.
1135
1136 In all cases, an address marked by operating system as
1137 secondary cannot be chosen as the primary one.
1138 </descrip>
1139
1140 <p>As the Device protocol doesn't generate any routes, it cannot have
1141 any attributes. Example configuration looks like this:
1142
1143 <p><code>
1144 protocol device {
1145 scan time 10; # Scan the interfaces often
1146 primary "eth0" 192.168.1.1;
1147 primary 192.168.0.0/16;
1148 }
1149 </code>
1150
1151 <sect>Direct
1152
1153 <p>The Direct protocol is a simple generator of device routes for all the
1154 directly connected networks according to the list of interfaces provided
1155 by the kernel via the Device protocol.
1156
1157 <p>It's highly recommended to include this protocol in your configuration
1158 unless you want to use BIRD as a route server or a route reflector, that is
1159 on a machine which doesn't forward packets itself and only participates in
1160 distribution of routing information.
1161
1162 <p>The only configurable thing about direct is what interfaces it watches:
1163
1164 <p><descrip>
1165 <tag>interface <m/pattern [, ...]/</tag> By default, the Direct
1166 protocol will generate device routes for all the interfaces
1167 available. If you want to restrict it to some subset of interfaces
1168 (for example if you're using multiple routing tables for policy
1169 routing and some of the policy domains don't contain all interfaces),
1170 just use this clause.
1171 </descrip>
1172
1173 <p>Direct device routes don't contain any specific attributes.
1174
1175 <p>Example config might look like this:
1176
1177 <p><code>
1178 protocol direct {
1179 interface "-arc*", "*"; # Exclude the ARCnets
1180 }
1181 </code>
1182
1183 <sect>Kernel
1184
1185 <p>The Kernel protocol is not a real routing protocol. Instead of communicating
1186 the with other routers in the network, it performs synchronization of BIRD's routing
1187 tables with the OS kernel. Basically, it sends all routing table updates to the kernel
1188 and from time to time it scans the kernel tables to see whether some routes have
1189 disappeared (for example due to unnoticed up/down transition of an interface)
1190 or whether an `alien' route has been added by someone else (depending on the
1191 <cf/learn/ switch, such routes are either deleted or accepted to our
1192 table).
1193
1194 <p>If your OS supports only a single routing table, you can configure only one
1195 instance of the Kernel protocol. If it supports multiple tables (in order to
1196 allow policy routing; such an OS is for example Linux 2.2), you can run as many instances as you want, but each of
1197 them must be connected to a different BIRD routing table and to a different
1198 kernel table.
1199
1200 <sect1>Configuration
1201
1202 <p><descrip>
1203 <tag>persist <m/switch/</tag> Tell BIRD to leave all its routes in the
1204 routing tables when it exits (instead of cleaning them up).
1205 <tag>scan time <m/number/</tag> Time in seconds between two consecutive scans of the
1206 kernel routing table.
1207 <tag>learn <m/switch/</tag> Enable learning of routes added to the kernel
1208 routing tables by other routing daemons or by the system administrator.
1209 This is possible only on systems which support identification of route
1210 authorship.
1211 <tag>kernel table <m/number/</tag> Select which kernel table should
1212 this particular instance of the Kernel protocol work with. Available
1213 only on systems supporting multiple routing tables.
1214 </descrip>
1215
1216 <p>The Kernel protocol doesn't define any route attributes.
1217 <p>A simple configuration can look this way:
1218
1219 <p><code>
1220 protocol kernel {
1221 import all;
1222 export all;
1223 }
1224 </code>
1225
1226 <p>Or for a system with two routing tables:
1227
1228 <p><code>
1229 protocol kernel { # Primary routing table
1230 learn; # Learn alien routes from the kernel
1231 persist; # Don't remove routes on bird shutdown
1232 scan time 10; # Scan kernel routing table every 10 seconds
1233 import all;
1234 export all;
1235 }
1236
1237 protocol kernel { # Secondary routing table
1238 table auxtable;
1239 kernel table 100;
1240 export all;
1241 }
1242 </code>
1243
1244 <sect>OSPF
1245
1246 <sect1>Introduction
1247
1248 <p>Open Shortest Path First (OSPF) is a quite complex interior gateway
1249 protocol. The current IPv4 version (OSPFv2) is defined
1250 in RFC 2328<htmlurl url="ftp://ftp.rfc-editor.org/in-notes/rfc2328.txt">. It's a link
1251 state (a.k.a. shortest path first) protocol -- each router maintains a database
1252 describing the autonomous system's topology. Each participating router
1253 has an identical copy of the database and all routers run the same algorithm
1254 calculating a shortest path tree with themselves as a root.
1255 OSPF chooses the least cost path as the best path.
1256 (OSPFv3 - OSPF for IPv6 is not supported yet.)
1257
1258 <p>In OSPF, the autonomous system can be split to several areas in order
1259 to reduce the amount of resources consumed for exchanging the routing
1260 information and to protect the other areas from incorrect routing data.
1261 Topology of the area is hidden to the rest of the autonomous system.
1262
1263 <p>Another very important feature of OSPF is that
1264 it can keep routing information from other protocols (like Static or BGP)
1265 in its link state database as external routes. Each external route can
1266 be tagged by the advertising router, making it possible to pass additional
1267 information between routers on the boundary of the autonomous system.
1268
1269 <p>OSPF quickly detects topological changes in the autonomous system (such
1270 as router interface failures) and calculates new loop-free routes after a short
1271 period of convergence. Only a minimal amount of
1272 routing traffic is involved.
1273
1274 <p>Each router participating in OSPF routing periodically sends Hello messages
1275 to all its interfaces. This allows neighbors to be discovered dynamically.
1276 Then the neighbors exchange theirs parts of the link state database and keep it
1277 identical by flooding updates. The flooding process is reliable and ensures
1278 that each router detects all changes.
1279
1280 <sect1>Configuration
1281
1282 <p>In the main part of configuration, there can be multiple definitions of
1283 OSPF area witch different id included. These definitions includes many other
1284 switches and multiple definitions of interfaces. Definition of interface
1285 may contain many switches and constant definitions and list of neighbors
1286 on nonbroadcast networks.
1287
1288 <code>
1289 protocol ospf &lt;name&gt; {
1290 rfc1583compat &lt;switch&gt;;
1291 tick &lt;num&gt;;
1292 area &lt;id&gt; {
1293 stub cost &lt;num&gt;;
1294 networks {
1295 &lt;prefix&gt;;
1296 &lt;prefix&gt; hidden;
1297 }
1298 stubnet &lt;prefix&gt;;
1299 stubnet &lt;prefix&gt; {
1300 hidden &lt;switch&gt;;
1301 summary &lt;switch&gt;;
1302 cost &lt;num&gt;;
1303 }
1304 interface &lt;interface pattern&gt; {
1305 cost &lt;num&gt;;
1306 stub &lt;switch&gt;;
1307 hello &lt;num&gt;;
1308 poll &lt;num&gt;;
1309 retransmit &lt;num&gt;;
1310 priority &lt;num&gt;;
1311 wait &lt;num&gt;;
1312 dead count &lt;num&gt;;
1313 dead &lt;num&gt;;
1314 rx buffer [normal|large|&lt;num&gt;];
1315 type [broadcast|nonbroadcast|pointopoint];
1316 strict nonbroadcast &lt;switch&gt;;
1317 authentication [none|simple|cryptographics];
1318 password "&lt;text&gt;";
1319 password "&lt;text&gt;" {
1320 id &lt;num&gt;;
1321 generate from "&lt;date&gt;";
1322 generate to "&lt;date&gt;";
1323 accept from "&lt;date&gt;";
1324 accept to "&lt;date&gt;";
1325 };
1326 neighbors {
1327 &lt;ip&gt;;
1328 &lt;ip&gt; eligible;
1329 };
1330 };
1331 virtual link &lt;id&gt; {
1332 hello &lt;num&gt;;
1333 retransmit &lt;num&gt;;
1334 wait &lt;num&gt;;
1335 dead count &lt;num&gt;;
1336 dead &lt;num&gt;;
1337 authentication [none|simple];
1338 password "&lt;text&gt;";
1339 };
1340 };
1341 }
1342 </code>
1343
1344 <descrip>
1345 <tag>rfc1583compat <M>switch</M></tag>
1346 This option controls compatibility of routing table
1347 calculation with RFC 1583<htmlurl
1348 url="ftp://ftp.rfc-editor.org/in-notes/rfc1583.txt">. Default
1349 value is no.
1350
1351 <tag>area <M>id</M></tag>
1352 This defines an OSPF area with given area ID (an integer or an IPv4
1353 address, similarly to a router ID).
1354 The most important area is
1355 the backbone (ID 0) to which every other area must be connected.
1356
1357 <tag>stub cost <M>num</M></tag>
1358 No external (except default) routes are flooded into stub areas.
1359 Setting this value marks area stub with defined cost of default route.
1360 Default value is no. (Area is not stub.)
1361
1362 <tag>tick <M>num</M></tag>
1363 The routing table calculation and clean-up of areas' databases
1364 is not performed when a single link state
1365 change arrives. To lower the CPU utilization, it's processed later
1366 at periodical intervals of <m/num/ seconds. The default value is 1.
1367
1368 <tag>networks { <m/set/ }</tag>
1369 Definition of area IP ranges. This is used in summary lsa origination.
1370 Hidden networks are not propagated into other areas.
1371
1372 <tag>stubnet <m/prefix/ { <m/options/ }</tag>
1373 Stub networks are networks that are not transit networks
1374 between OSPF routers. They are also propagated through an
1375 OSPF area as a part of a link state database. By default,
1376 BIRD generates a stub network record for each primary network
1377 address on each OSPF interface that does not have any OSPF
1378 neighbors, and also for each non-primary network address on
1379 each OSPF interface. This option allows to alter a set of
1380 stub networks propagated by this router.
1381
1382 Each instance of this option adds a stub network with given
1383 network prefix to the set of propagated stub network, unless
1384 option <cf/hidden/ is used. It also suppresses default stub
1385 networks for given network prefix. When option
1386 <cf/summary/ is used, also default stub networks that are
1387 subnetworks of given stub network are suppressed. This might
1388 be used, for example, to aggregate generated stub networks.
1389
1390 <tag>interface <M>pattern</M></tag>
1391 Defines that the specified interfaces belong to the area being defined.
1392 See <ref id="dsc-iface" name="interface"> common option for detailed description.
1393
1394 <tag>virtual link <M>id</M></tag>
1395 Virtual link to router with the router id. Virtual link acts as a
1396 point-to-point interface belonging to backbone. The actual area is
1397 used as transport area. This item cannot be in the backbone.
1398
1399 <tag>cost <M>num</M></tag>
1400 Specifies output cost (metric) of an interface. Default value is 10.
1401
1402 <tag>stub <M>switch</M></tag>
1403 If set to interface it does not listen to any packet and does not send
1404 any hello. Default value is no.
1405
1406 <tag>hello <M>num</M></tag>
1407 Specifies interval in seconds between sending of Hello messages. Beware, all
1408 routers on the same network need to have the same hello interval.
1409 Default value is 10.
1410
1411 <tag>poll <M>num</M></tag>
1412 Specifies interval in seconds between sending of Hello messages for
1413 some neighbors on NBMA network. Default value is 20.
1414
1415 <tag>retransmit <M>num</M></tag>
1416 Specifies interval in seconds between retransmissions of unacknowledged updates.
1417 Default value is 5.
1418
1419 <tag>priority <M>num</M></tag>
1420 On every multiple access network (e.g., the Ethernet) Designed Router
1421 and Backup Designed router are elected. These routers have some
1422 special functions in the flooding process. Higher priority increases
1423 preferences in this election. Routers with priority 0 are not
1424 eligible. Default value is 1.
1425
1426 <tag>wait <M>num</M></tag>
1427 After start, router waits for the specified number of seconds between starting
1428 election and building adjacency. Default value is 40.
1429
1430 <tag>dead count <M>num</M></tag>
1431 When the router does not receive any messages from a neighbor in
1432 <m/dead count/*<m/hello/ seconds, it will consider the neighbor down.
1433
1434 <tag>dead <M>num</M></tag>
1435 When the router does not receive any messages from a neighbor in
1436 <m/dead/ seconds, it will consider the neighbor down. If both directives
1437 <m/dead count/ and <m/dead/ are used, <m/dead/ has precendence.
1438
1439 <tag>rx buffer <M>num</M></tag>
1440 This sets the size of buffer used for receiving packets. The buffer should
1441 be bigger than maximal size of any packets. Value NORMAL (default)
1442 means 2*MTU, value LARGE means maximal allowed packet - 65536.
1443
1444 <tag>type broadcast</tag>
1445 BIRD detects a type of a connected network automatically, but sometimes it's
1446 convenient to force use of a different type manually.
1447 On broadcast networks, flooding and Hello messages are sent using multicasts
1448 (a single packet for all the neighbors).
1449
1450 <tag>type pointopoint</tag>
1451 Point-to-point networks connect just 2 routers together. No election
1452 is performed there which reduces the number of messages sent.
1453
1454 <tag>type nonbroadcast</tag>
1455 On nonbroadcast networks, the packets are sent to each neighbor
1456 separately because of lack of multicast capabilities.
1457
1458 <tag>strict nonbroadcast <M>switch</M></tag>
1459 If set, don't send hello to any undefined neighbor. This switch
1460 is ignored on on any non-NBMA network. Default is No.
1461
1462 <tag>authentication none</tag>
1463 No passwords are sent in OSPF packets. This is the default value.
1464
1465 <tag>authentication simple</tag>
1466 Every packet carries 8 bytes of password. Received packets
1467 lacking this password are ignored. This authentication mechanism is
1468 very weak.
1469
1470 <tag>authentication cryptographic</tag>
1471 16-byte long MD5 digest is appended to every packet. For the digest
1472 generation 16-byte long passwords are used. Those passwords are
1473 not sent via network, so this mechanismus is quite secure.
1474 Packets can still be read by an attacker.
1475
1476 <tag>password "<M>text</M>"</tag>
1477 An 8-byte or 16-byte password used for authentication.
1478 See <ref id="dsc-pass" name="password"> common option for detailed description.
1479
1480 <tag>neighbors { <m/set/ } </tag>
1481 A set of neighbors to which Hello messages on nonbroadcast networks
1482 are to be sent. Some of them could be marked as eligible.
1483
1484 </descrip>
1485
1486 <sect1>Attributes
1487
1488 <p>OSPF defines three route attributes. Each internal route has a <cf/metric/
1489 Metric is ranging from 1 to infinity (65535).
1490 External routes use <cf/metric type 1/ or <cf/metric type 2/.
1491 A <cf/metric of type 1/ is comparable with internal <cf/metric/, a
1492 <cf/metric of type 2/ is always longer
1493 than any <cf/metric of type 1/ or any <cf/internal metric/.
1494 If you specify both metrics only metric1 is used.
1495 Each external route can also carry a <cf/tag/ which is a 32-bit
1496 integer which is used when exporting routes to other protocols;
1497 otherwise, it doesn't affect routing inside the OSPF domain at all.
1498 Default is <cf/metric of type 2 = 10000/ and <cf/tag = 0/.
1499
1500 <sect1>Example
1501
1502 <p>
1503
1504 <code>
1505 protocol ospf MyOSPF {
1506 rfc1583compatibility yes;
1507 tick 2;
1508 export filter {
1509 if source = RTS_BGP then {
1510 ospf_metric1 = 100;
1511 accept;
1512 }
1513 reject;
1514 };
1515 area 0.0.0.0 {
1516 interface "eth*" {
1517 cost 11;
1518 hello 15;
1519 priority 100;
1520 retransmit 7;
1521 authentication simple;
1522 password "aaa";
1523 };
1524 interface "ppp*" {
1525 cost 100;
1526 authentication cryptographic;
1527 password "abc" {
1528 id 1;
1529 generate to "22-04-2003 11:00:06";
1530 accept from "17-01-2001 12:01:05";
1531 };
1532 password "def" {
1533 id 2;
1534 generate to "22-07-2005 17:03:21";
1535 accept from "22-02-2001 11:34:06";
1536 };
1537 };
1538 interface "arc0" {
1539 cost 10;
1540 stub yes;
1541 };
1542 interface "arc1";
1543 };
1544 area 120 {
1545 stub yes;
1546 networks {
1547 172.16.1.0/24;
1548 172.16.2.0/24 hidden;
1549 }
1550 interface "-arc0" , "arc*" {
1551 type nonbroadcast;
1552 authentication none;
1553 strict nonbroadcast yes;
1554 wait 120;
1555 poll 40;
1556 dead count 8;
1557 neighbors {
1558 192.168.120.1 eligible;
1559 192.168.120.2;
1560 192.168.120.10;
1561 };
1562 };
1563 };
1564 }
1565 </code>
1566
1567 <sect>Pipe
1568
1569 <sect1>Introduction
1570
1571 <p>The Pipe protocol serves as a link between two routing tables, allowing routes to be
1572 passed from a table declared as primary (i.e., the one the pipe is connected to using the
1573 <cf/table/ configuration keyword) to the secondary one (declared using <cf/peer table/)
1574 and vice versa, depending on what's allowed by the filters. Export filters control export
1575 of routes from the primary table to the secondary one, import filters control the opposite
1576 direction.
1577
1578 <p>The Pipe protocol may work in the opaque mode or in the transparent
1579 mode. In the opaque mode, the Pipe protocol retransmits optimal route
1580 from one table to the other table in a similar way like other
1581 protocols send and receive routes. Retransmitted route will have the
1582 source set to the Pipe protocol, which may limit access to protocol
1583 specific route attributes. The opaque mode is a default mode.
1584
1585 <p>In transparent mode, the Pipe protocol retransmits all routes from
1586 one table to the other table, retaining their original source and
1587 attributes. If import and export filters are set to accept, then both
1588 tables would have the same content. The mode can be set by
1589 <tt/mode/ option.
1590
1591 <p>The primary use of multiple routing tables and the Pipe protocol is for policy routing,
1592 where handling of a single packet doesn't depend only on its destination address, but also
1593 on its source address, source interface, protocol type and other similar parameters.
1594 In many systems (Linux being a good example), the kernel allows to enforce routing policies
1595 by defining routing rules which choose one of several routing tables to be used for a packet
1596 according to its parameters. Setting of these rules is outside the scope of BIRD's work
1597 (on Linux, you can use the <tt/ip/ command), but you can create several routing tables in BIRD,
1598 connect them to the kernel ones, use filters to control which routes appear in which tables
1599 and also you can employ the Pipe protocol for exporting a selected subset of one table to
1600 another one.
1601
1602 <sect1>Configuration
1603
1604 <p><descrip>
1605 <tag>peer table <m/table/</tag> Defines secondary routing table to connect to. The
1606 primary one is selected by the <cf/table/ keyword.
1607
1608 <tag>mode opaque|transparent</tag> Specifies the mode for the pipe to work in. Default is opaque.
1609 </descrip>
1610
1611 <sect1>Attributes
1612
1613 <p>The Pipe protocol doesn't define any route attributes.
1614
1615 <sect1>Example
1616
1617 <p>Let's consider a router which serves as a boundary router of two different autonomous
1618 systems, each of them connected to a subset of interfaces of the router, having its own
1619 exterior connectivity and wishing to use the other AS as a backup connectivity in case
1620 of outage of its own exterior line.
1621
1622 <p>Probably the simplest solution to this situation is to use two routing tables (we'll
1623 call them <cf/as1/ and <cf/as2/) and set up kernel routing rules, so that packets having
1624 arrived from interfaces belonging to the first AS will be routed according to <cf/as1/
1625 and similarly for the second AS. Thus we have split our router to two logical routers,
1626 each one acting on its own routing table, having its own routing protocols on its own
1627 interfaces. In order to use the other AS's routes for backup purposes, we can pass
1628 the routes between the tables through a Pipe protocol while decreasing their preferences
1629 and correcting their BGP paths to reflect the AS boundary crossing.
1630
1631 <code>
1632 table as1; # Define the tables
1633 table as2;
1634
1635 protocol kernel kern1 { # Synchronize them with the kernel
1636 table as1;
1637 kernel table 1;
1638 }
1639
1640 protocol kernel kern2 {
1641 table as2;
1642 kernel table 2;
1643 }
1644
1645 protocol bgp bgp1 { # The outside connections
1646 table as1;
1647 local as 1;
1648 neighbor 192.168.0.1 as 1001;
1649 export all;
1650 import all;
1651 }
1652
1653 protocol bgp bgp2 {
1654 table as2;
1655 local as 2;
1656 neighbor 10.0.0.1 as 1002;
1657 export all;
1658 import all;
1659 }
1660
1661 protocol pipe { # The Pipe
1662 table as1;
1663 peer table as2;
1664 export filter {
1665 if net ~ [ 1.0.0.0/8+] then { # Only AS1 networks
1666 if preference>10 then preference = preference-10;
1667 if source=RTS_BGP then bgp_path.prepend(1);
1668 accept;
1669 }
1670 reject;
1671 };
1672 import filter {
1673 if net ~ [ 2.0.0.0/8+] then { # Only AS2 networks
1674 if preference>10 then preference = preference-10;
1675 if source=RTS_BGP then bgp_path.prepend(2);
1676 accept;
1677 }
1678 reject;
1679 };
1680 }
1681 </code>
1682
1683 <sect>RIP
1684
1685 <sect1>Introduction
1686
1687 <p>The RIP protocol (also sometimes called Rest In Pieces) is a simple protocol, where each router broadcasts (to all its neighbors)
1688 distances to all networks it can reach. When a router hears distance to another network, it increments
1689 it and broadcasts it back. Broadcasts are done in regular intervals. Therefore, if some network goes
1690 unreachable, routers keep telling each other that its distance is the original distance plus 1 (actually, plus
1691 interface metric, which is usually one). After some time, the distance reaches infinity (that's 15 in
1692 RIP) and all routers know that network is unreachable. RIP tries to minimize situations where
1693 counting to infinity is necessary, because it is slow. Due to infinity being 16, you can't use
1694 RIP on networks where maximal distance is higher than 15 hosts. You can read more about RIP at <HTMLURL
1695 URL="http://www.ietf.org/html.charters/rip-charter.html" name="http://www.ietf.org/html.charters/rip-charter.html">. Both IPv4
1696 (RFC 1723<htmlurl url="ftp://ftp.rfc-editor.org/in-notes/rfc1723.txt">)
1697 and IPv6 (RFC 2080<htmlurl url="ftp://ftp.rfc-editor.org/in-notes/rfc2080.txt">) versions of RIP are supported by BIRD, historical RIPv1 (RFC 1058<htmlurl url="ftp://ftp.rfc-editor.org/in-notes/rfc1058.txt">)is
1698 not currently supported. RIPv4 MD5 authentication (RFC 2082<htmlurl url="ftp://ftp.rfc-editor.org/in-notes/rfc2082.txt">) is supported.
1699
1700 <p>RIP is a very simple protocol, and it has a lot of shortcomings. Slow
1701 convergence, big network load and inability to handle larger networks
1702 makes it pretty much obsolete in IPv4 world. (It is still usable on
1703 very small networks.) It is widely used in IPv6 networks,
1704 because there are no good implementations of OSPFv3.
1705
1706 <sect1>Configuration
1707
1708 <p>In addition to options common for all to other protocols, RIP supports the following ones:
1709
1710 <descrip>
1711 <tag/authentication none|plaintext|md5/ selects authentication method to be used. <cf/none/ means that
1712 packets are not authenticated at all, <cf/plaintext/ means that a plaintext password is embedded
1713 into each packet, and <cf/md5/ means that packets are authenticated using a MD5 cryptographic
1714 hash. If you set authentication to not-none, it is a good idea to add <cf>password</cf>
1715 section. Default: none.
1716
1717 <tag>honor always|neighbor|never </tag>specifies when should requests for dumping routing table
1718 be honored. (Always, when sent from a host on a directly connected
1719 network or never.) Routing table updates are honored only from
1720 neighbors, that is not configurable. Default: never.
1721 </descrip>
1722
1723 <p>There are two options that can be specified per-interface. First is <cf>metric</cf>, with
1724 default one. Second is <cf>mode multicast|broadcast|quiet|nolisten|version1</cf>, it selects mode for
1725 rip to work in. If nothing is specified, rip runs in multicast mode. <cf>version1</cf> is
1726 currently equivalent to <cf>broadcast</cf>, and it makes RIP talk to a broadcast address even
1727 through multicast mode is possible. <cf>quiet</cf> option means that RIP will not transmit
1728 any periodic messages to this interface and <cf>nolisten</cf> means that RIP will send to this
1729 interface but not listen to it.
1730
1731 <p>The following options generally override behavior specified in RFC. If you use any of these
1732 options, BIRD will no longer be RFC-compliant, which means it will not be able to talk to anything
1733 other than equally configured BIRD. I have warned you.
1734
1735 <descrip>
1736 <tag>port <M>number</M></tag>
1737 selects IP port to operate on, default 520. (This is useful when testing BIRD, if you
1738 set this to an address &gt;1024, you will not need to run bird with UID==0).
1739
1740 <tag>infinity <M>number</M></tag>
1741 selects the value of infinity, default is 16. Bigger values will make protocol convergence
1742 even slower.
1743
1744 <tag>period <M>number</M>
1745 </tag>specifies the number of seconds between periodic updates. Default is 30 seconds. A lower
1746 number will mean faster convergence but bigger network
1747 load. Do not use values lower than 10.
1748
1749 <tag>timeout time <M>number</M>
1750 </tag>specifies how old route has to be to be considered unreachable. Default is 4*<cf/period/.
1751
1752 <tag>garbage time <M>number</M>
1753 </tag>specifies how old route has to be to be discarded. Default is 10*<cf/period/.
1754 </descrip>
1755
1756 <sect1>Attributes
1757
1758 <p>RIP defines two route attributes:
1759
1760 <descrip>
1761 <tag>int <cf/rip_metric/</tag> RIP metric of the route (ranging from 0 to <cf/infinity/).
1762 When routes from different RIP instances are available and all of them have the same
1763 preference, BIRD prefers the route with lowest <cf/rip_metric/.
1764 When importing a non-RIP route, the metric defaults to 5.
1765
1766 <tag>int <cf/rip_tag/</tag> RIP route tag: a 16-bit number which can be used
1767 to carry additional information with the route (for example, an originating AS number
1768 in case of external routes). When importing a non-RIP route, the tag defaults to 0.
1769 </descrip>
1770
1771 <sect1>Example
1772
1773 <p><code>
1774 protocol rip MyRIP_test {
1775 debug all;
1776 port 1520;
1777 period 10;
1778 garbage time 60;
1779 interface "eth0" { metric 3; mode multicast; };
1780 interface "eth*" { metric 2; mode broadcast; };
1781 honor neighbor;
1782 authentication none;
1783 import filter { print "importing"; accept; };
1784 export filter { print "exporting"; accept; };
1785 }
1786 </code>
1787
1788 <sect>Static
1789
1790 <p>The Static protocol doesn't communicate with other routers in the network,
1791 but instead it allows you to define routes manually. This is often used for
1792 specifying how to forward packets to parts of the network which don't use
1793 dynamic routing at all and also for defining sink routes (i.e., those
1794 telling to return packets as undeliverable if they are in your IP block,
1795 you don't have any specific destination for them and you don't want to send
1796 them out through the default route to prevent routing loops).
1797
1798 <p>There are three types of static routes: `classical' routes telling to
1799 forward packets to a neighboring router, device routes specifying forwarding
1800 to hosts on a directly connected network and special routes (sink, blackhole
1801 etc.) which specify a special action to be done instead of forwarding the
1802 packet.
1803
1804 <p>When the particular destination is not available (the interface is down or
1805 the next hop of the route is not a neighbor at the moment), Static just
1806 uninstalls the route from the table it is connected to and adds it again as soon
1807 as the destination becomes adjacent again.
1808
1809 <p>The Static protocol has no configuration options. Instead, the
1810 definition of the protocol contains a list of static routes:
1811
1812 <descrip>
1813 <tag>route <m/prefix/ via <m/ip/</tag> Static route through
1814 a neighboring router.
1815 <tag>route <m/prefix/ via <m/"interface"/</tag> Static device
1816 route through an interface to hosts on a directly connected network.
1817 <tag>route <m/prefix/ drop|reject|prohibit</tag> Special routes
1818 specifying to drop the packet, return it as unreachable or return
1819 it as administratively prohibited.
1820 </descrip>
1821
1822 <p>Static routes have no specific attributes.
1823
1824 <p>Example static config might look like this:
1825
1826 <p><code>
1827 protocol static {
1828 table testable; # Connect to a non-default routing table
1829 route 0.0.0.0/0 via 62.168.0.13; # Default route
1830 route 62.168.0.0/25 reject; # Sink route
1831 route 10.2.0.0/24 via "arc0"; # Secondary network
1832 }
1833 </code>
1834
1835 <chapt>Conclusions
1836
1837 <sect>Future work
1838
1839 <p>Although BIRD supports all the commonly used routing protocols,
1840 there are still some features which would surely deserve to be
1841 implemented in future versions of BIRD:
1842
1843 <itemize>
1844 <item>OSPF for IPv6 networks
1845 <item>OSPF NSSA areas and opaque LSA's
1846 <item>Route aggregation and flap dampening
1847 <item>Generation of IPv6 router advertisements
1848 <item>Multipath routes
1849 <item>Multicast routing protocols
1850 <item>Ports to other systems
1851 </itemize>
1852
1853 <sect>Getting more help
1854
1855 <p>If you use BIRD, you're welcome to join the bird-users mailing list
1856 (<HTMLURL URL="mailto:bird-users@bird.network.cz" name="bird-users@bird.network.cz">)
1857 where you can share your experiences with the other users and consult
1858 your problems with the authors. To subscribe to the list, just send a
1859 <tt/subscribe bird-users/ command in a body of a mail to
1860 (<HTMLURL URL="mailto:majordomo@bird.network.cz" name="majordomo@bird.network.cz">).
1861 The home page of BIRD can be found at <HTMLURL URL="http://bird.network.cz/" name="http://bird.network.cz/">.
1862
1863 <p>BIRD is a relatively young system and it probably contains some
1864 bugs. You can report any problems to the bird-users list and the authors
1865 will be glad to solve them, but before you do so,
1866 please make sure you have read the available documentation and that you are running the latest version (available at <HTMLURL
1867 URL="ftp://bird.network.cz/pub/bird" name="bird.network.cz:/pub/bird">). (Of course, a patch
1868 which fixes the bug is always welcome as an attachment.)
1869
1870 <p>If you want to understand what is going inside, Internet standards are
1871 a good and interesting reading. You can get them from <HTMLURL URL="ftp://ftp.rfc-editor.org/" name="ftp.rfc-editor.org"> (or a nicely sorted version from <HTMLURL URL="ftp://atrey.karlin.mff.cuni.cz/pub/rfc" name="atrey.karlin.mff.cuni.cz:/pub/rfc">).
1872
1873 <p><it/Good luck!/
1874
1875 </book>
1876
1877 <!--
1878 LocalWords: GPL IPv GateD BGPv RIPv OSPFv Linux sgml html dvi sgmltools Pavel
1879 LocalWords: linuxdoc dtd descrip config conf syslog stderr auth ospf bgp Mbps
1880 LocalWords: router's eval expr num birdc ctl UNIX if's enums bool int ip GCC
1881 LocalWords: len ipaddress pxlen netmask enum bgppath bgpmask clist gw md eth
1882 LocalWords: RTS printn quitbird iBGP AS'es eBGP RFC multiprotocol IGP Machek
1883 LocalWords: EGP misconfigurations keepalive pref aggr aggregator BIRD's RTC
1884 LocalWords: OS'es AS's multicast nolisten misconfigured UID blackhole MRTD MTU
1885 LocalWords: uninstalls ethernets IP binutils ANYCAST anycast dest RTD ICMP rfc
1886 LocalWords: compat multicasts nonbroadcast pointopoint loopback sym stats
1887 LocalWords: Perl SIGHUP dd mm yy HH MM SS EXT IA UNICAST multihop Discriminator txt
1888 LocalWords: proto wildcard
1889 -->