]> git.ipfire.org Git - thirdparty/bird.git/blob - doc/bird.sgml
Final version of documentation (famous last words)
[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 </author>
28
29 <abstract>
30 This document contains user documentation for the BIRD Internet Routing Daemon project.
31 </abstract>
32
33 <!-- Table of contents -->
34 <toc>
35
36 <!-- Begin the document -->
37
38 <chapt>Introduction
39
40 <sect>What is BIRD
41
42 <p><label id="intro">
43 The name `BIRD' is actually an acronym standing for `BIRD Internet Routing Daemon'.
44 Let's take a closer look at the meaning of the name:
45
46 <p><em/BIRD/: Well, we think we have already explained that. It's an acronym standing
47 for `BIRD Internet Routing Daemon', you remember, don't you? :-)
48
49 <p><em/Internet Routing/: It's a program (well, a daemon, as you are going to discover in a moment)
50 which works as a dynamic router in an Internet type network (that is, in a network running either
51 the IPv4 or the IPv6 protocol). Routers are devices which forward packets between interconnected
52 networks in order to allow hosts not connected directly to the same local area network to
53 communicate with each other. They also communicate with the other routers in the Internet to discover
54 the topology of the network which allows them to find optimal (in terms of some metric) rules for
55 forwarding of packets (which are called routing tables) and to adapt themselves to the
56 changing conditions such as outages of network links, building of new connections and so on. Most of
57 these routers are costly dedicated devices running obscure firmware which is hard to configure and
58 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
59 computer to act as a router and forward packets belonging to the other hosts, but only according to
60 a statically configured table.
61
62 <p>A <em/Routing Daemon/ is in UNIX terminology a non-interactive program running on
63 background which does the dynamic part of Internet routing, that is it communicates
64 with the other routers, calculates routing tables and sends them to the OS kernel
65 which does the actual packet forwarding. There already exist other such routing daemons: routed (RIP only), GateD<HTMLURL URL="http://www.gated.org/">
66 (non-free), Zebra<HTMLURL URL="http://www.zebra.org"> and MRTD<HTMLURL URL="http://www.zcu.cz/ftp/mirrors/mmrz/mrtd">, but their capabilities are limited and
67 they are relatively hard to configure and maintain.
68
69 <p>BIRD is an Internet Routing Daemon designed to avoid all of these shortcomings,
70 to support all the routing technology used in the today's Internet or planned to be
71 used in near future and to have a clean extensible architecture allowing new routing
72 protocols to be incorporated easily. Among other features, BIRD supports:
73
74 <itemize>
75 <item>both IPv4 and IPv6 protocols
76 <item>multiple routing tables
77 <item>the Border Gateway Protocol (BGPv4)
78 <item>the Routing Information Protocol (RIPv2)
79 <item>the Open Shortest Path First protocol (OSPFv2)
80 <item>a virtual protocol for exchange of routes between different routing tables on a single host
81 <item>a command-line interface allowing on-line control and inspection
82 of status of the daemon
83 <item>soft reconfiguration (no need to use complex online commands
84 to change the configuration, just edit the configuration file
85 and notify BIRD to re-read it and it will smoothly switch itself
86 to the new configuration, not disturbing routing protocols
87 unless they are affected by the configuration changes)
88 <item>a powerful language for route filtering
89 </itemize>
90
91 <p>BIRD has been developed at the Faculty of Math and Physics, Charles University, Prague,
92 Czech Republic as a student project. It can be freely distributed under the terms of the GNU General
93 Public License.
94
95 <p>BIRD has been designed to work on all UNIX-like systems. It has been developed and
96 tested under Linux 2.0 to 2.4, but porting to other systems (even non-UNIX ones) should
97 be relatively easy due to its highly modular architecture.
98
99 <sect>Installing BIRD
100
101 <p>On a recent UNIX system with GNU development tools (GCC, binutils, m4, make) and Perl, installing BIRD should be as easy as:
102
103 <code>
104 ./configure
105 make
106 make install
107 vi /usr/local/etc/bird.conf
108 bird
109 </code>
110
111 <p>You can use <tt>./configure --help</tt> to get a list of configure
112 options. The most important ones are:
113 <tt/--enable-ipv6/ which enables building of an IPv6 version of BIRD,
114 <tt/--with-protocols=/ to produce a slightly smaller BIRD executable by configuring out routing protocols you don't use, and
115 <tt/--prefix=/ to install BIRD to a place different from.
116 <file>/usr/local</file>.
117
118 <sect>Running BIRD
119
120 <p>You can pass several command-line options to bird:
121
122 <descrip>
123 <tag>-c <m/config name/</tag>
124 use given configuration file instead of <it/prefix/<file>/etc/bird.conf</file>.
125
126 <tag>-d</tag>
127 enable debug messages and run bird in foreground.
128
129 <tag>-D <m/filename of debug log/</tag>
130 log debugging information to given file instead of stderr
131
132 <tag>-s <m/name of communication socket/</tag>
133 use given filename for a socket for communications with the client, default is <it/prefix/<file>/var/run/bird.ctl</file>.
134 </descrip>
135
136 <p>BIRD writes messages about its work to log files or syslog (according to config).
137
138 <chapt>About routing tables
139
140 <p>BIRD has one or more routing tables which may or may not be
141 synchronized with OS kernel and which may or may not be synchronized with
142 each other (see the Pipe protocol). Each routing table contains a list of
143 known routes. Each route consists of:
144
145 <itemize>
146 <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)
147 <item>preference of this route
148 <item>IP address of router which told us about this route
149 <item>IP address of router we should forward the packets to
150 using this route
151 <item>other attributes common to all routes
152 <item>dynamic attributes defined by protocols which may or
153 may not be present (typically protocol metrics)
154 </itemize>
155
156 Routing table maintains multiple entries
157 for a network, but at most one entry for one network and one
158 protocol. The entry with the highest preference is used for routing (we
159 will call such an entry the <it/selected route/). If
160 there are more entries with the same preference and they are from the same
161 protocol, the protocol decides (typically according to metrics). If they aren't,
162 an internal ordering is used to break the tie. You can
163 get the list of route attributes in the Route attributes section.
164
165 <p>Each protocol is connected to a routing table through two filters
166 which can accept, reject and modify the routes. An <it/export/
167 filter checks routes passed from the routing table to the protocol,
168 an <it/import/ filter checks routes in the opposite direction.
169 When the routing table gets a route from a protocol, it recalculates
170 the selected route and broadcasts it to all protocols connected to
171 the table. The protocols typically send the update to other routers
172 in the network.
173
174 <chapt>Configuration
175
176 <sect>Introduction
177
178 <p>BIRD is configured using a text configuration file. Upon startup, BIRD reads <it/prefix/<file>/etc/bird.conf</file> (unless the
179 <tt/-c/ command line option is given). Configuration may be changed at user's request: if you modify
180 the config file and then signal BIRD with <tt/SIGHUP/, it will adjust to the new
181 config. Then there's the client
182 which allows you to talk with BIRD in an extensive way.
183
184 <p>In the config, everything on a line after <cf/#/ or inside <cf>/*
185 */</cf> is a comment, whitespace characters are treated as a single space. If there's a variable number of options, they are grouped using
186 the <cf/{ }/ brackets. Each option is terminated by a <cf/;/. Configuration
187 is case sensitive.
188
189 <p>Here is an example of a simple config file. It enables
190 synchronization of routing tables with OS kernel, scans for
191 new network interfaces every 10 seconds and runs RIP on all network interfaces found.
192
193
194 <code>
195 protocol kernel {
196 persist; # Don't remove routes on BIRD shutdown
197 scan time 20; # Scan kernel routing table every 20 seconds
198 export all; # Default is export none
199 }
200
201 protocol device {
202 scan time 10; # Scan interfaces every 10 seconds
203 }
204
205 protocol rip {
206 export all;
207 import all;
208 }
209 </code>
210
211
212 <sect>Global options
213
214 <p><descrip>
215 <tag>log "<m/filename/"|syslog|stderr all|{ <m/list of classes/ }</tag>
216 Set logging of messages having the given class (either <cf/all/ or <cf/{
217 error, trace }/ etc.) into selected destination. Classes are:
218 <cf/info/, <cf/warning/, <cf/error/ and <cf/fatal/ for messages about local problems,
219 <cf/debug/ for debugging messages,
220 <cf/trace/ when you want to know what happens in the network,
221 <cf/remote/ for messages about misbehavior of remote machines,
222 <cf/auth/ about authentication failures,
223 <cf/bug/ for internal BIRD bugs. You may specify more than one <cf/log/ line to establish logging to multiple
224 destinations. Default: log everything to the system log.
225
226 <tag>debug protocols all|off|{ states, routes, filters, interfaces, events, packets }</tag>
227 Set global defaults of protocol debugging options. See <cf/debug/ in the following section. Default: off.
228
229 <tag>debug commands <m/number/</tag>
230 Control logging of client connections (0 for no logging, 1 for
231 logging of connects and disconnects, 2 and higher for logging of
232 all client commands). Default: 0.
233
234 <tag>filter <m/name local variables/{ <m/commands/ }</tag> Define a filter. You can learn more about filters
235 in the following chapter.
236
237 <tag>function <m/name/ (<m/parameters/) <m/local variables/ { <m/commands/ }</tag> Define a function. You can learn more
238 about functions in the following chapter.
239
240 <tag>protocol rip|ospf|bgp|... <m/[name]/ { <m>protocol options</m> }</tag> Define a protocol
241 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
242 about configuring protocols in their own chapters. You can run more than one instance of
243 most protocols (like RIP or BGP). By default, no instances are configured.
244
245 <tag>define <m/constant/ = (<m/expression/)|<m/number/|<m/IP address/</tag> Define a constant. You can use it later in every place
246 you could use a simple integer or an IP address.
247
248 <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.
249
250 <tag>table <m/name/</tag> Create a new routing table. The default
251 routing table is created implicitly, other routing tables have
252 to be added by this command.
253
254 <tag>eval <m/expr/</tag> Evaluates given filter expression. It
255 is used by us for testing of filters.
256 </descrip>
257
258 <sect>Protocol options
259
260 <p>For each protocol instance, you can configure a bunch of options.
261 Some of them (those described in this section) are generic, some are
262 specific to the protocol (see sections talking about the protocols).
263
264 <p>Several options use a <cf><m/switch/</cf> argument. It can be either
265 <cf/on/, <cf/yes/ or a numeric expression with a non-zero value for the
266 option to be enabled or <cf/off/, <cf/no/ or a numeric expression evaluating
267 to zero to disable it. An empty <cf><m/switch/</cf> is equivalent to <cf/on/
268 ("silence means agreement").
269
270 <descrip>
271 <tag>preference <m/expr/</tag> Sets the preference of routes generated by this protocol. Default: protocol dependent.
272
273 <tag>disabled <m/switch/</tag> Disables the protocol. You can change the disable/enable status from the command
274 line interface without needing to touch the configuration. Disabled protocols are not activated. Default: protocol is enabled.
275
276 <tag>debug all|off|{ states, routes, filters, interfaces, events, packets }</tag>
277 Set protocol debugging options. If asked, each protocol is capable of
278 writing trace messages about its work to the log (with category
279 <cf/trace/). You can either request printing of <cf/all/ trace messages
280 or only of the types selected: <cf/states/ for protocol state changes
281 (protocol going up, down, starting, stopping etc.),
282 <cf/routes/ for routes exchanged with the routing table,
283 <cf/filters/ for details on route filtering,
284 <cf/interfaces/ for interface change events sent to the protocol,
285 <cf/events/ for events internal to the protocol and
286 <cf/packets/ for packets sent and received by the protocol. Default: off.
287
288 <tag>import all | none | filter <m/name/ | filter { <m/filter commands/ } | where <m/filter expression/</tag>
289 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/.
290
291 <tag>export <m/filter/</tag> This is similar to the <cf>import</cf> keyword, except that it
292 works in the direction from the routing table to the protocol. Default: <cf/none/.
293
294 <tag>table <m/name/</tag> Connect this protocol to a non-default routing table.
295 </descrip>
296
297 <p>There are several options that give sense only with certain protocols:
298
299 <descrip>
300 <tag>passwords { password "<m/password/" from <m/time/ to <m/time/ passive <m/time/ id
301 <m/num/ [...] }</tag> Specifies passwords to be used with this protocol. <cf>Passive <m/time/</cf> is
302 time from which the password is not used for sending, but it is recognized on reception. <cf/id/ is password ID as needed by
303 certain protocols. Format of <cf><m/time/</cf> is <tt>dd-mm-yyyy HH:MM:SS</tt>.
304
305 <tag>interface "<m/mask/"|<m/prefix/ [ { <m/option/ ; [...] } ]</tag> Specifies which
306 interfaces is this protocol active on and allows you to set options on a
307 per-interface basis. Mask is specified as in shell-like patterns, thus <cf>interface
308 "*" { mode broadcast; };</cf> will start the protocol on all interfaces with <cf>mode
309 broadcast;</cf> option. If the first character of mask is <cf/-/, such interfaces are
310 excluded. Masks are parsed left-to-right, thus <cf/interface "-eth*", "*";/ means all but
311 the ethernets. Default: none.
312
313 </descrip>
314
315 <chapt>Remote control
316
317 <p>You can use the command-line client <file>birdc</file> to talk with
318 a running BIRD. Communication is done using a <file/bird.ctl/ UNIX domain
319 socket (unless changed with the <tt/-s/ option given to both the server and
320 the client). The commands can perform simple actions such as enabling/disabling
321 of protocols, telling BIRD to show various information, telling it to
322 show routing table filtered by filter, or asking BIRD to
323 reconfigure. Press <tt/?/ at any time to get online help. Option
324 <tt/-v/ can be passed to the client, to make it dump numeric return
325 codes along with the messages. You do not necessarily need to use <file/birdc/ to talk to BIRD, your
326 own applications could do that, too -- the format of communication between
327 BIRD and <file/birdc/ is stable (see the programmer's documentation).
328
329 <p>Here is a brief list of supported functions:
330
331 <descrip>
332 <tag>dump resources|sockets|interfaces|neighbors|attributes|routes|protocols</tag>
333 Dump contents of internal data structures to the debugging output.
334
335 <tag>show status</tag>
336 Show router status, that is BIRD version, uptime and time from last reconfiguration.
337
338 <tag>show protocols [all]</tag>
339 Show list of protocol instances along with tables they are connected to and protocol status, possibly giving verbose information, if <cf/all/ is specified.
340
341 <tag>show ospf [interface|neighbors] [<m/name/] ["<m/interface/"]</tag>
342 Show detailed information about OSPF protocol, possibly giving a verbose list of interfaces and neighbors. The <m/name/ of the protocol instance can be omitted if there exists only a single instance.
343
344 <tag>show static [<m/name/]</tag>
345 Show detailed information about static routes. The <m/name/ of the protocol instance can be omitted if there exists only a single instance.
346
347 <tag>show interfaces [summary]</tag>
348 Show the list of interfaces. For each interface, print its type, state, MTU and addresses assigned.
349
350 <tag>show symbols</tag>
351 Show the list of symbols defined in the configuration (names of protocols, routing tables etc.).
352
353 <tag>show route [[for] <m/prefix/|<m/IP/] [table <m/sym/] [filter <m/f/|where <m/c/] [(import|proto) <m/p/] [<m/options/]</tag>
354 Show contents of a routing table (by default of the main one),
355 that is routes, their metrics and (in case the <cf/all/ switch is given)
356 all their attributes.
357
358 <p>You can specify a <m/prefix/ if you want to print routes for a
359 specific network. If you use <cf>for <m/prefix or IP/</cf>, you'll get
360 the entry which will be used for forwarding of packets to the given
361 destination. By default, all routes for each network are printed with
362 the selected one at the top, unless <cf/primary/ is given in which case
363 only the selected route is shown.
364
365 <p>You can also ask for printing only routes processed and accepted by
366 a given filter (<cf>filter <m/name/</cf> or <cf>filter { <m/filter/ }
367 </cf> or matching a given condition (<cf>where <m/condition/</cf>).
368 The <cf/import/ and <cf/proto/ switches ask for printing of entries as
369 they would be seen by the specified protocol. With <cf/import/, the
370 export filter of the protocol is skipped.
371
372 <p>The <cf/stats/ switch requests showing of route statistics (the
373 number of networks, number of routes before and after filtering). If
374 you use <cf/count/ instead, only the statistics will be printed.
375
376 <tag>enable|disable|restart <m/name/|"<m/pattern/"|all</tag>
377 Enable, disable or restart a given protocol instance, instances matching the <cf><m/pattern/</cf> or <cf/all/ instances.
378
379 <tag>configure ["<m/config file/"]</tag>
380 Reload configuration from a given file.
381
382 <tag/down/
383 Shut BIRD down.
384
385 <tag>debug <m/protocol/|<m/pattern/|all all|off|{ states | routes | filters | events | packets }</tag>
386 Control protocol debugging.
387 </descrip>
388
389 <chapt>Filters
390
391 <sect>Introduction
392
393 <p>BIRD contains a simple programming language. (No, it can't yet read mail :-). There are
394 two objects in this language: filters and functions. Filters are interpreted by BIRD core when a route is
395 being passed between protocols and routing tables. The filter language contains control structures such
396 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>.
397
398 <p>Filter gets the route, looks at its attributes and
399 modifies some of them if it wishes. At the end, it decides whether to
400 pass the changed route through (using <cf/accept/) or whether to <cf/reject/ it. A simple filter looks
401 like this:
402
403 <code>
404 filter not_too_far
405 int var;
406 {
407 if defined( rip_metric ) then
408 var = rip_metric;
409 else {
410 var = 1;
411 rip_metric = 1;
412 }
413 if rip_metric &gt; 10 then
414 reject "RIP metric is too big";
415 else
416 accept "ok";
417 }
418 </code>
419
420 <p>As you can see, a filter has a header, a list of local variables, and a body. The header consists of
421 the <cf/filter/ keyword followed by a (unique) name of filter. The list of local variables consists of
422 <cf><M>type name</M>;</cf> pairs where each pair defines one local variable. The body consists of
423 <cf> { <M>statements</M> }</cf>. Each <m/statement/ is terminated by a <cf/;/. You can group
424 several statements to a single compound statement by using braces (<cf>{ <M>statements</M> }</cf>) which is useful if
425 you want to make a bigger block of code conditional.
426
427 <p>BIRD supports functions, so that you don't have to repeat the same blocks of code over and
428 over. Functions can have zero or more parameters and they can have local variables. Recursion is not allowed. Function definitions
429 look like this:
430
431 <code>
432 function name ()
433 int local_variable;
434 {
435 local_variable = 5;
436 }
437
438 function with_parameters (int parameter)
439 {
440 print parameter;
441 }
442 </code>
443
444 <p>Unlike in C, variables are declared after the <cf/function/ line, but before the first <cf/{/. You can't declare
445 variables in nested blocks. Functions are called like in C: <cf>name();
446 with_parameters(5);</cf>. Function may return values using the <cf>return <m/[expr]/</cf>
447 command. Returning a value exits from current function (this is similar to C).
448
449 <p>Filters are declared in a way similar to functions except they can't have explicit
450 parameters. They get a route table entry as an implicit parameter, it is also passed automatically
451 to any functions called. The filter must terminate with either
452 <cf/accept/ or <cf/reject/ statement. If there's a runtime error in filter, the route
453 is rejected.
454
455 <p>A nice trick to debug filters is to use <cf>show route filter
456 <m/name/</cf> from the command line client. An example session might look
457 like:
458
459 <code>
460 pavel@bug:~/bird$ ./birdc -s bird.ctl
461 BIRD 0.0.0 ready.
462 bird> show route
463 10.0.0.0/8 dev eth0 [direct1 23:21] (240)
464 195.113.30.2/32 dev tunl1 [direct1 23:21] (240)
465 127.0.0.0/8 dev lo [direct1 23:21] (240)
466 bird> show route ?
467 show route [<prefix>] [table <t>] [filter <f>] [all] [primary]...
468 bird> show route filter { if 127.0.0.5 &tilde; net then accept; }
469 127.0.0.0/8 dev lo [direct1 23:21] (240)
470 bird>
471 </code>
472
473 <sect>Data types
474
475 <p>Each variable and each value has certain type. Booleans, integers and enums are
476 incompatible with each other (that is to prevent you from shooting in the foot).
477
478 <descrip>
479 <tag/bool/ This is a boolean type, it can have only two values, <cf/true/ and
480 <cf/false/. Boolean is the only type you can use in <cf/if/
481 statements.
482
483 <tag/int/ This is a general integer type, you can expect it to store signed values from -2000000000
484 to +2000000000. Overflows are not checked. You can use <cf/0x1234/ syntax to write hexadecimal values.
485
486 <tag/pair/ This is a pair of two short integers. Each component can have values from 0 to
487 65535. Literals of this type is written as <cf/(1234,5678)/.
488
489 <tag/string/ This is a string of characters. There are no ways to modify strings in
490 filters. You can pass them between functions, assign them to variables of type <cf/string/, print
491 such variables, but you can't concatenate two strings. String literals
492 are written as <cf/"This is a string constant"/.
493
494 <tag/ip/ This type can hold a single IP address. Depending on the compile-time configuration of BIRD you are using, it
495 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>
496 on values of type ip. It masks out all but first <cf><M>num</M></cf> bits from the IP
497 address. So <cf/1.2.3.4.mask(8) = 1.0.0.0/ is true.
498
499 <tag/prefix/ This type can hold a network prefix consisting of IP address and prefix length. Prefix literals are written as
500 <cf><M>ipaddress</M>/<M>pxlen</M></cf>, or
501 <cf><m>ipaddress</m>/<m>netmask</m></cf>. There are two special
502 operators on prefixes:
503 <cf/.ip/ which extracts the IP address from the pair, and <cf/.len/, which separates prefix
504 length from the pair. So <cf>1.2.0.0/16.pxlen = 16</cf> is true.
505
506 <tag/int|ip|prefix|pair|enum set/
507 Filters recognize four types of sets. Sets are similar to strings: you can pass them around
508 but you can't modify them. Literals of type <cf>set int</cf> look like <cf>
509 [ 1, 2, 5..7 ]</cf>. As you can see, both simple values and ranges are permitted in
510 sets. Sets of prefixes are special: you can specify which prefix lengths should match them by
511 using <cf>[ 1.0.0.0/8+, 2.0.0.0/8-, 3.0.0.0/8{5,6} ]</cf>. <cf>3.0.0.0/8{5,6}</cf> matches
512 prefixes <cf/3.X.X.X/ whose prefix length is 5 to 6. <cf><m>address</m>/<m>num</m>+</cf> is a shorthand for <cf><m>address</m>/{0,<m/num/}</cf>,
513 <cf><m>address</m>/<m/num/-</cf> is a shorthand for <cf><m>address</m>/{0,<m/num-1/}</cf>. For example,
514 <cf>1.2.0.0/16 &tilde; [ 1.0.0.0/8{ 15 , 17 } ]</cf> is true, but
515 <cf>1.0.0.0/8 &tilde; [ 1.0.0.0/8- ]</cf> is false.
516
517 <tag/enum/
518 Enumeration types are fixed sets of possibilities. You can't define your own
519 variables of such type, but some route attributes are of enumeration
520 type. Enumeration types are incompatible with each other.
521
522 <tag/bgppath/
523 BGP path is a list of autonomous system numbers. You can't write literals of this type.
524
525 <tag/bgpmask/
526 BGP masks are patterns used for BGP path matching
527 (using <cf>path &tilde; /2 3 5 ?/</cf> syntax). The masks
528 resemble wildcard patterns as used by UNIX shells. Autonomous
529 system numbers match themselves, <cf/?/ matches any (even empty)
530 sequence of arbitrary AS numbers (<cf/*/ hasn't been chosen, because
531 <cf>/*</cf> starts a comment). For example:
532 <tt>/4 3 2 1/ &tilde; /? 4 3 ?/</tt> is true, but
533 <tt>/4 3 2 1/ &tilde; /? 4 5 ?/</tt> is false.
534 <tag/clist/
535 Community list is similar to set of pairs,
536 except that unlike other sets, it can be modified.
537 There exist no literals of this type.
538
539 </descrip>
540
541 <sect>Operators
542
543 <p>The filter language supports common integer operators <cf>(+,-,*,/)</cf>, parentheses <cf/(a*(b+c))/, comparison
544 <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;/).
545 Special operators include <cf/&tilde;/ for "is element of a set" operation - it can be
546 used on element and set of elements of the same type (returning true if element is contained in the given set), or on IP and prefix (returning true if IP is within the range defined by that prefix), or on
547 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).
548
549
550 <sect>Control structures
551
552 <p>Filters support two control structures: conditions and case switches.
553
554 <p>Syntax of a condition is: <cf>if
555 <M>boolean expression</M> then <M>command1</M>; else <M>command2</M>;</cf> and you can use <cf>{
556 <M>command_1</M>; <M>command_2</M>; <M>...</M> }</cf> instead of either command. The <cf>else</cf>
557 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.
558
559 <p>The <cf>case</cf> is similar to case from Pascal. Syntax is <cf>case <m/expr/ { else |
560 <m/num_or_prefix [ .. num_or_prefix]/: <m/statement/ ; [ ... ] }</cf>. The expression after
561 <cf>case</cf> can be of any type which can be on the left side of the &tilde; operator and anything that could
562 be a member of a set is allowed before <cf/:/. Multiple commands are allowed without <cf/{}/ grouping.
563 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.
564
565 <p>Here is example that uses <cf/if/ and <cf/case/ structures:
566
567 <code>
568 case arg1 {
569 2: print "two"; print "I can do more commands without {}";
570 3 .. 5: print "three to five";
571 else: print "something else";
572 }
573
574 if 1234 = i then printn "."; else {
575 print "not 1234";
576 print "You need {} around multiple commands";
577 }
578 </code>
579
580 <sect>Route attributes
581
582 <p>A filter is implicitly passed a route, and it can access its
583 attributes just like it accesses variables. Attempts to access undefined
584 attribute result in a runtime error; you can check if an attribute is
585 defined by using the <cf>defined( <m>attribute</m> )</cf> operator.
586
587 <descrip>
588 <tag><m/prefix/ net</tag>
589 Network the route is talking about. Read-only. (See the chapter about routing tables.)
590
591 <tag><m/enum/ scope</tag>
592 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).
593
594 <tag><m/int/ preference</tag>
595 Preference of the route. (See the chapter about routing tables.)
596
597 <tag><m/ip/ from</tag>
598 The router which the route has originated from. Read-only.
599
600 <tag><m/ip/ gw</tag>
601 Next hop packets routed using this route should be forwarded to.
602
603 <tag><m/enum/ source</tag>
604 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_EXT/, <cf/RTS_OSPF_IA/, <cf/RTS_OSPF_BOUNDARY/, <cf/RTS_BGP/, <cf/RTS_PIPE/.
605
606 <tag><m/enum/ cast</tag>
607 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.
608
609 <tag><m/enum/ dest</tag>
610 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.
611 </descrip>
612
613 <p>There also exist some protocol-specific attributes which are described in the corresponding protocol sections.
614
615 <sect>Other statements
616
617 <p>The following statements are available:
618
619 <descrip>
620 <tag><m/variable/ = <m/expr/</tag> Set variable to a given value.
621
622 <tag>accept|reject [ <m/expr/ ]</tag> Accept or reject the route, possibly printing <cf><m>expr</m></cf>.
623
624 <tag>return <m/expr/</tag> Return <cf><m>expr</m></cf> from the current function, the function ends at this point.
625
626 <tag>print|printn <m/expr/ [<m/, expr.../]</tag>
627 Prints given expressions; useful mainly while debugging
628 filters. The <cf/printn/ variant does not terminate the line.
629
630 <tag>quitbird</tag>
631 Terminates BIRD. Useful when debugging the filter interpreter.
632 </descrip>
633
634 <chapt>Protocols
635
636 <sect>BGP
637
638 <p>The Border Gateway Protocol is the routing protocol used for backbone
639 level routing in the today's Internet. Contrary to the other protocols, its convergence
640 doesn't rely on all routers following the same rules for route selection,
641 making it possible to implement any routing policy at any router in the
642 network, the only restriction being that if a router advertises a route,
643 it must accept and forward packets according to it.
644
645 <p>BGP works in terms of autonomous systems (often abbreviated as AS). Each
646 AS is a part of the network with common management and common routing policy. It is identified by a unique 16-bit number.
647 Routers within each AS usually communicate with each other using either a interior routing
648 protocol (such as OSPF or RIP) or an interior variant of BGP (called iBGP).
649 Boundary routers at the border of the AS communicate with their peers
650 in the neighboring AS'es via exterior BGP (eBGP).
651
652 <p>Each BGP router sends to its neighbors updates of the parts of its
653 routing table it wishes to export along with complete path information
654 (a list of AS'es the packet will travel through if it uses the particular
655 route) in order to avoid routing loops.
656
657 <p>BIRD supports all requirements of the BGP4 standard as defined in
658 RFC 1771<htmlurl url="ftp://ftp.rfc-editor.org/in-notes/rfc1771.txt">
659 including several enhancements from the
660 latest draft<htmlurl url="ftp://ftp.rfc-editor.org/internet-drafts/draft-ietf-idr-bgp4-09.txt">.
661 It also supports the community attributes as per
662 RFC 1997<htmlurl url="ftp://ftp.rfc-editor.org/in-notes/rfc1997.txt">,
663 capability negotiation defined in
664 RFC 2842<htmlurl url="ftp://ftp.rfc-editor.org/in-notes/rfc2842.txt">.
665 For IPv6, it uses the standard multiprotocol extensions defined in
666 RFC 2283<htmlurl url="ftp://ftp.rfc-editor.org/in-notes/rfc2283.txt">
667 including changes described in the
668 latest draft<htmlurl url="ftp://ftp.rfc-editor.org/internet-drafts/draft-ietf-idr-bgp4-multiprotocol-v2-05.txt">
669 and applied to IPv6 according to
670 RFC 2545<htmlurl url="ftp://ftp.rfc-editor.org/in-notes/rfc2545.txt">.
671
672 <sect1>Route selection rules
673
674 <p>BGP doesn't have any simple metric, so the rules for selection of an optimal
675 route among multiple BGP routes with the same preference are a bit more complex
676 and they are implemented according to the following algorithm. It starts the first
677 rule, if there are more "best" routes, then it uses the second rule to choose
678 among them and so on.
679
680 <itemize>
681 <item>Prefer route with the highest Local Preference attribute.
682 <item>Prefer route with the shortest AS path.
683 <item>Prefer IGP origin over EGP and EGP over incomplete.
684 <item>Prefer the lowest value of the Multiple Exit Discriminator.
685 <item>Prefer internal routes over external ones.
686 <item>Prefer the route with the lowest value of router ID of the
687 advertising router.
688 </itemize>
689
690 <sect1>Configuration
691
692 <p>Each instance of the BGP corresponds to one neighboring router.
693 This allows to set routing policy and all the other parameters differently
694 for each neighbor using the following configuration parameters:
695
696 <descrip>
697 <tag>local as <m/number/</tag> Define which AS we are part of. (Note that
698 contrary to other IP routers, BIRD is able to act as a router located
699 in multiple AS'es simultaneously, but in such cases you need to tweak
700 the BGP paths manually in the filters to get consistent behavior.)
701 This parameter is mandatory.
702
703 <tag>neighbor <m/ip/ as <m/number/</tag> Define neighboring router
704 this instance will be talking to and what AS it's located in. Unless
705 you use the <cf/multihop/ clause, it must be directly connected to one
706 of your router's interfaces. In case the neighbor is in the same AS
707 as we are, we automatically switch to iBGP. This parameter is mandatory.
708
709 <tag>multihop <m/number/ via <m/ip/</tag> Configure multihop BGP to a
710 neighbor which is connected at most <m/number/ hops far and to which
711 we should route via our direct neighbor with address <m/ip/.
712 Default: switched off.
713
714 <tag>next hop self</tag> Avoid calculation of the Next Hop attribute
715 and always advertise our own source address (see below) as a next hop.
716 This needs to be used only
717 occasionally to circumvent misconfigurations of other routers.
718 Default: disabled.
719
720 <tag>source address <m/ip/</tag> Define local address we should use
721 for next hop calculation. Default: the address of the local end
722 of the interface our neighbor is connected to.
723
724 <tag>disable after error <m/switch/</tag> When an error is encountered (either
725 locally or by the other side), disable the instance automatically
726 and wait for an administrator to fix the problem manually. Default: off.
727
728 <tag>hold time <m/number/</tag> Time in seconds to wait for a Keepalive
729 message from the other side before considering the connection stale.
730 Default: depends on agreement with the neighboring router, we prefer
731 240 seconds if the other side is willing to accept it.
732
733 <tag>startup hold time <m/number/</tag> Value of the hold timer used
734 before the routers have a chance to exchange open messages and agree
735 on the real value. Default: 240 seconds.
736
737 <tag>keepalive time <m/number/</tag> Delay in seconds between sending
738 of two consecutive Keepalive messages. Default: One third of the hold time.
739
740 <tag>connect retry time <m/number/</tag> Time in seconds to wait before
741 retrying a failed attempt to connect. Default: 120 seconds.
742
743 <tag>start delay time <m/number/</tag> Delay in seconds between protocol
744 startup and the first attempt to connect. Default: 5 seconds.
745
746 <tag>error wait time <m/number/,<m/number/</tag> Minimum and maximum delay in seconds between a protocol
747 failure (either local or reported by the peer) and automatic restart.
748 Doesn't apply when <cf/disable after error/ is configured. If consecutive
749 errors happen, the delay is increased exponentially until it reaches the maximum. Default: 60, 300.
750
751 <tag>error forget time <m/number/</tag> Maximum time in seconds between two protocol
752 failures to treat them as a error sequence which makes the <cf/error wait time/
753 increase exponentially. Default: 300 seconds.
754
755 <tag>path metric <m/switch/</tag> Enable comparison of path lengths
756 when deciding which BGP route is the best one. Default: on.
757
758 <tag>default bgp_med <m/number/</tag> Value of the Multiple Exit
759 Discriminator to be used during route selection when the MED attribute
760 is missing. Default: infinite.
761
762 <tag>default bgp_local_pref <m/number/</tag> Value of the Local Preference
763 to be used during route selection when the Local Preference attribute
764 is missing. Default: 0.
765 </descrip>
766
767 <sect1>Attributes
768
769 <p>BGP defines several route attributes. Some of them (those marked with `<tt/I/' in the
770 table below) are available on internal BGP connections only, some of them (marked
771 with `<tt/O/') are optional.
772
773 <descrip>
774 <tag>bgppath <cf/bgp_path/</tag> Sequence of AS numbers describing the AS path
775 the packet will travel through when forwarded according to the particular route. In case of
776 internal BGP it doesn't contain the number of the local AS.
777
778 <tag>int <cf/bgp_local_pref/ [I]</tag> Local preference value used for
779 selection among multiple BGP routes (see the selection rules above). It's
780 used as an additional metric which is propagated through the whole local AS.
781
782 <tag>int <cf/bgp_med/ [IO]</tag> The Multiple Exit Discriminator of the route
783 is an optional attribute which is often used within the local AS to
784 reflect interior distances to various boundary routers. See the route selection
785 rules above for exact semantics.
786
787 <tag>enum <cf/bgp_origin/</tag> Origin of the route: either <cf/ORIGIN_IGP/
788 if the route has originated in an interior routing protocol or
789 <cf/ORIGIN_EGP/ if it's been imported from the <tt>EGP</tt> protocol
790 (nowadays it seems to be obsolete) or <cf/ORIGIN_INCOMPLETE/ if the origin
791 is unknown.
792
793 <tag>ip <cf/bgp_next_hop/</tag> Next hop to be used for forwarding of packets
794 to this destination. On internal BGP connections, it's an address of the
795 originating router if it's inside the local AS or a boundary router the
796 packet will leave the AS through if it's an exterior route, so each BGP
797 speaker within the AS has a chance to use the shortest interior path
798 possible to this point.
799
800 <tag>void <cf/bgp_atomic_aggr/ [O]</tag> This is an optional attribute
801 which carries no value, but the sole presence of which indicates that the route
802 has been aggregated from multiple routes by some router on the path from
803 the originator.
804
805 <!-- we don't handle aggregators right since they are of a very obscure type
806 <tag>bgp_aggregator</tag>
807 -->
808 <tag>clist <cf/bgp_community/ [O]</tag> List of community values associated
809 with the route. Each such value is a pair (represented as a <cf/pair/ data
810 type inside the filters) of 16-bit integers, the first of them containing the number of the AS which defines
811 the community and the second one being a per-AS identifier. There are lots
812 of uses of the community mechanism, but generally they are used to carry
813 policy information like "don't export to USA peers". As each AS can define
814 its own routing policy, it also has a complete freedom about which community
815 attributes it defines and what will their semantics be.
816 </descrip>
817
818 <sect1>Example
819
820 <p><code>
821 protocol bgp {
822 local as 65000; # Use a private AS number
823 neighbor 62.168.0.130 as 5588; # Our neighbor ...
824 multihop 20 via 62.168.0.13; # ... which is connected indirectly
825 export filter { # We use non-trivial export rules
826 if source = RTS_STATIC then { # Export only static routes
827 # Assign our community
828 bgp_community.add((65000,5678));
829 # Artificially increase path length
830 # by advertising local AS number twice
831 if bgp_path ~ / 65000 / then
832 bgp_path.prepend(65000);
833 accept;
834 }
835 reject;
836 };
837 import all;
838 source address 62.168.0.1; # Use a non-standard source address
839 }
840 </code>
841
842 <sect>Device
843
844 <p>The Device protocol is not a real routing protocol. It doesn't generate
845 any routes and it only serves as a module for getting information about network
846 interfaces from the kernel.
847
848 <p>Except for very unusual circumstances, you probably should include
849 this protocol in the configuration since almost all other protocols
850 require network interfaces to be defined for them to work with.
851
852 <p>The only configurable thing is interface scan time:
853
854 <p><descrip>
855 <tag>scan time <m/number/</tag> Time in seconds between two scans
856 of the network interface list. On systems where we are notified about
857 interface status changes asynchronously (such as newer versions of
858 Linux), we need to scan the list only in order to avoid confusion by lost
859 notification messages, so the default time is set to a large value.
860 </descrip>
861
862 <p>As the Device protocol doesn't generate any routes, it cannot have
863 any attributes. Example configuration looks really simple:
864
865 <p><code>
866 protocol device {
867 scan time 10; # Scan the interfaces often
868 }
869 </code>
870
871 <sect>Direct
872
873 <p>The Direct protocol is a simple generator of device routes for all the
874 directly connected networks according to the list of interfaces provided
875 by the kernel via the Device protocol.
876
877 <p>It's highly recommended to include this protocol in your configuration
878 unless you want to use BIRD as a route server or a route reflector, that is
879 on a machine which doesn't forward packets itself and only participates in
880 distribution of routing information.
881
882 <p>The only configurable thing about direct is what interfaces it watches:
883
884 <p><descrip>
885 <tag>interface <m/pattern [, ...]/</tag> By default, the Direct
886 protocol will generate device routes for all the interfaces
887 available. If you want to restrict it to some subset of interfaces
888 (for example if you're using multiple routing tables for policy
889 routing and some of the policy domains don't contain all interfaces),
890 just use this clause.
891 </descrip>
892
893 <p>Direct device routes don't contain any specific attributes.
894
895 <p>Example config might look like this:
896
897 <p><code>
898 protocol direct {
899 interface "-arc*", "*"; # Exclude the ARCnets
900 }
901 </code>
902
903 <sect>Kernel
904
905 <p>The Kernel protocol is not a real routing protocol. Instead of communicating
906 the with other routers in the network, it performs synchronization of BIRD's routing
907 tables with the OS kernel. Basically, it sends all routing table updates to the kernel
908 and from time to time it scans the kernel tables to see whether some routes have
909 disappeared (for example due to unnoticed up/down transition of an interface)
910 or whether an `alien' route has been added by someone else (depending on the
911 <cf/learn/ switch, such routes are either deleted or accepted to our
912 table).
913
914 <p>If your OS supports only a single routing table, you can configure only one
915 instance of the Kernel protocol. If it supports multiple tables (in order to
916 allow policy routing; such an OS is for example Linux 2.2), you can run as many instances as you want, but each of
917 them must be connected to a different BIRD routing table and to a different
918 kernel table.
919
920 <sect1>Configuration
921
922 <p><descrip>
923 <tag>persist <m/switch/</tag> Tell BIRD to leave all its routes in the
924 routing tables when it exits (instead of cleaning them up).
925 <tag>scan time <m/number/</tag> Time in seconds between two consecutive scans of the
926 kernel routing table.
927 <tag>learn <m/switch/</tag> Enable learning of routes added to the kernel
928 routing tables by other routing daemons or by the system administrator.
929 This is possible only on systems which support identification of route
930 authorship.
931 <tag>kernel table <m/number/</tag> Select which kernel table should
932 this particular instance of the Kernel protocol work with. Available
933 only on systems supporting multiple routing tables.
934 </descrip>
935
936 <p>The Kernel protocol doesn't define any route attributes.
937 <p>A simple configuration can look this way:
938
939 <p><code>
940 protocol kernel {
941 import all;
942 export all;
943 }
944 </code>
945
946 <p>Or for a system with two routing tables:
947
948 <p><code>
949 protocol kernel { # Primary routing table
950 learn; # Learn alien routes from the kernel
951 persist; # Don't remove routes on bird shutdown
952 scan time 10; # Scan kernel routing table every 10 seconds
953 import all;
954 export all;
955 }
956
957 protocol kernel { # Secondary routing table
958 table auxtable;
959 kernel table 100;
960 export all;
961 }
962 </code>
963
964 <sect>OSPF
965
966 <sect1>Introduction
967
968 <p>Open Shortest Path First (OSPF) is a quite complex interior gateway
969 protocol. The current IPv4 version (OSPFv2) is defined in RFC 2328<htmlurl url="ftp://ftp.rfc-editor.org/in-notes/rfc2328.txt">. It's a link
970 state (a.k.a. shortest path first) protocol -- each router maintains a database
971 describing the autonomous system's topology. Each participating router
972 has an identical copy of the database and all routers run the same algorithm
973 calculating a shortest path tree with themselves as a root.
974 OSPF chooses the least cost path as the best path.
975
976 <p>In OSPF, the autonomous system can be split to several areas in order
977 to reduce the amount of resources consumed for exchanging the routing
978 information and to protect the other areas from incorrect routing data.
979 Topology of the area is hidden to the rest of the autonomous system.
980 Unfortunately, multiple OSPF areas are not yet fully supported
981 by this version of BIRD and neither is the IPv6 version (OSPFv3).
982
983 <p>Another very important feature of OSPF is that
984 it can keep routing information from other protocols (like Static or BGP)
985 in its link state database as external routes. Each external route can
986 be tagged by the advertising router, making it possible to pass additional
987 information between routers on the boundary of the autonomous system.
988
989 <p>OSPF quickly detects topological changes in the autonomous system (such
990 as router interface failures) and calculates new loop-free routes after a short
991 period of convergence. Only a minimal ammount of
992 routing traffic is involved.
993
994 <p>Each router participating in OSPF routing periodically sends Hello messages
995 to all its interfaces. This allows neighbors to be discovered dynamically.
996 Then the neighbors exchange theirs parts of the link state database and keep it
997 identical by flooding updates. The flooding process is reliable and ensures
998 that each router detects all changes.
999
1000 <sect1>Configuration
1001
1002 <p>In the main part of configuration, there can be multiple definitions of
1003 OSPF area witch different id included. These definitions includes many other
1004 switches and mutliple definitions of interfaces. Definition of interface
1005 may contain many switches and constant definitinons and list of neighbors
1006 on nonbroadcast networks.
1007
1008 <code>
1009 protocol ospf &lt;name&gt; {
1010 rfc1583compat &lt;switch&gt;;
1011 area &lt;id&gt; {
1012 stub &lt;switch&gt;;
1013 tick &lt;num&gt;;
1014 interface &lt;interface pattern&gt;
1015 {
1016 cost &lt;num&gt;;
1017 hello &lt;num&gt;;
1018 retransmit &lt;num&gt;;
1019 priority &lt;num&gt;;
1020 wait &lt;num&gt;;
1021 dead count &lt;num&gt;;
1022 type [broadcast|nonbroadcast|pointopoint];
1023 authetication [none|simple];
1024 password "&lt;text&gt;";
1025 neighbors {
1026 &lt;ip&gt;;
1027 };
1028 };
1029 };
1030 }
1031 </code>
1032
1033 <descrip>
1034 <tag>rfc1583compat <M>switch</M></tag>
1035 This option controls compatibility of routing table
1036 calculation with RFC 1583<htmlurl
1037 url="ftp://ftp.rfc-editor.org/in-notes/rfc1583.txt">. Default
1038 value is no.
1039
1040 <tag>area <M>id</M></tag>
1041 This defines an OSPF area with given area ID (an integer or an IPv4
1042 address, similarly to a router ID).
1043 The most important area is
1044 the backbone (ID 0) to which every other area must be connected.
1045
1046 <tag>stub <M>switch</M></tag>
1047 No external routes are flooded into stub areas. Default value is no.
1048
1049 <tag>tick <M>num</M></tag>
1050 The routing table calculation is not performed when a single link state
1051 change arrives. To lower the CPU utilization, it's processed later
1052 at periodical intervals of <m/num/ seconds. The default value is 7.
1053
1054 <tag>interface <M>pattern</M></tag>
1055 Defines that the specified interfaces belong to the area being defined.
1056
1057 <tag>cost <M>num</M></tag>
1058 Specifies output cost (metric) of an interface. Default value is 10.
1059
1060 <tag>hello <M>num</M></tag>
1061 Specifies interval in seconds between sending of Hello messages. Beware, all
1062 routers on the same network need to have the same hello interval.
1063 Default value is 10.
1064
1065 <tag>retransmit <M>num</M></tag>
1066 Specifies interval in seconds between retransmissions of unacknowledged updates.
1067 Default value is 5.
1068
1069 <tag>priority <M>num</M></tag>
1070 On every multiple access network (e.g., the Ethernet) Designed Router
1071 and Backup Designed router are elected. These routers have some
1072 special functions in the flooding process. Higher priority increases
1073 preferences in this election. Routers with priority 0 are not
1074 eligible. Default value is 1.
1075
1076 <tag>wait <M>num</M></tag>
1077 After start, router waits for the specified number of seconds between starting
1078 election and building adjacency. Default value is 40.
1079
1080 <tag>dead count <M>num</M></tag>
1081 When the router does not receive any messages from a neighbor in
1082 <m/dead count/*<m/hello/ seconds, it will consider the neighbor down.
1083
1084 <tag>type broadcast</tag>
1085 BIRD detects a type of a connected network automatically, but sometimes it's
1086 convenient to force use of a different type manually.
1087 On broadcast networks, flooding and Hello messages are sent using multicasts (a single packet for all the neighbors).
1088
1089 <tag>type nonbroadcast</tag>
1090 On nonbroadcast networks, the packets are sent to each neighbor
1091 separately because of lack of multicast capabilities.
1092
1093 <tag>type pointopoint</tag>
1094 Point-to-point networks connect just 2 routers together. No election
1095 is performed there which reduces the number of messages sent.
1096
1097 <tag>authentication none</tag>
1098 No passwords are sent in OSPF packets. This is the default value.
1099
1100 <tag>authentication simple</tag>
1101 Every packet carries 8 bytes of password. Received packets
1102 lacking this password are ignored. This authentication mechanism is
1103 very weak.
1104
1105 <tag>password "<M>text</M>"</tag>
1106 An 8-byte password used for authentication.
1107
1108 <tag>neighbors { <m/set/ } </tag>
1109 A set of neighbors to which Hello messages on nonbroadcast networks
1110 are to be sent.
1111 </descrip>
1112
1113 <sect1>Attributes
1114
1115 <p>OSPF defines three route attributes. Each internal route has a <cf/metric/
1116 Metric is ranging from 1 to infinity (65535).
1117 External routes use <cf/metric type 1/ or <cf/metric type 2/.
1118 A <cf/metric of type 1/ is comparable with internal <cf/metric/, a
1119 <cf/metric of type 2/ is always longer
1120 than any <cf/metric of type 1/ or any <cf/internal metric/.
1121 Each external route can also carry a <cf/tag/ which is a 32-bit
1122 integer which is used when exporting routes to other protocols;
1123 otherwise, it doesn't affect routing inside the OSPF domain at all.
1124
1125 <sect1>Example
1126
1127 <p>
1128
1129 <code>
1130 protocol ospf MyOSPF {
1131 export filter {
1132 if source = RTS_BGP then {
1133 ospf_metric1 = 100;
1134 accept;
1135 }
1136 reject;
1137 };
1138 area 0.0.0.0 {
1139 tick 8;
1140 interface "eth*" {
1141 cost 11;
1142 hello 15;
1143 priority 100;
1144 retransmit 7;
1145 authentication simple;
1146 password "aaa";
1147 };
1148 interface "ppp*" {
1149 cost 100;
1150 };
1151 };
1152 area 120 {
1153 stub yes;
1154 interface "-arc0" , "arc*" {
1155 type nonbroadcast;
1156 authentication none;
1157 wait 50;
1158 dead count 6;
1159 neighbors {
1160 192.168.120.1;
1161 192.168.120.2;
1162 192.168.120.10;
1163 };
1164 };
1165 };
1166 }
1167 </code>
1168
1169 <sect>Pipe
1170
1171 <sect1>Introduction
1172
1173 <p>The Pipe protocol serves as a link between two routing tables, allowing routes to be
1174 passed from a table declared as primary (i.e., the one the pipe is connected to using the
1175 <cf/table/ configuration keyword) to the secondary one (declared using <cf/peer table/)
1176 and vice versa, depending on what's allowed by the filters. Export filters control export
1177 of routes from the primary table to the secondary one, import filters control the opposite
1178 direction.
1179
1180 <p>The primary use of multiple routing tables and the Pipe protocol is for policy routing,
1181 where handling of a single packet doesn't depend only on its destination address, but also
1182 on its source address, source interface, protocol type and other similar parameters.
1183 In many systems (Linux 2.2 being a good example), the kernel allows to enforce routing policies
1184 by defining routing rules which choose one of several routing tables to be used for a packet
1185 according to its parameters. Setting of these rules is outside the scope of BIRD's work
1186 (on Linux, you can use the <tt/ip/ command), but you can create several routing tables in BIRD,
1187 connect them to the kernel ones, use filters to control which routes appear in which tables
1188 and also you can employ the Pipe protocol for exporting a selected subset of one table to
1189 another one.
1190
1191 <sect1>Configuration
1192
1193 <p><descrip>
1194 <tag>peer table <m/table/</tag> Define secondary routing table to connect to. The
1195 primary one is selected by the <cf/table/ keyword.
1196 </descrip>
1197
1198 <sect1>Attributes
1199
1200 <p>The Pipe protocol doesn't define any route attributes.
1201
1202 <sect1>Example
1203
1204 <p>Let's consider a router which serves as a boundary router of two different autonomous
1205 systems, each of them connected to a subset of interfaces of the router, having its own
1206 exterior connectivity and wishing to use the other AS as a backup connectivity in case
1207 of outage of its own exterior line.
1208
1209 <p>Probably the simplest solution to this situation is to use two routing tables (we'll
1210 call them <cf/as1/ and <cf/as2/) and set up kernel routing rules, so that packets having
1211 arrived from interfaces belonging to the first AS will be routed according to <cf/as1/
1212 and similarly for the second AS. Thus we have split our router to two logical routers,
1213 each one acting on its own routing table, having its own routing protocols on its own
1214 interfaces. In order to use the other AS's routes for backup purposes, we can pass
1215 the routes between the tables through a Pipe protocol while decreasing their preferences
1216 and correcting their BGP paths to reflect the AS boundary crossing.
1217
1218 <code>
1219 table as1; # Define the tables
1220 table as2;
1221
1222 protocol kernel kern1 { # Synchronize them with the kernel
1223 table as1;
1224 kernel table 1;
1225 }
1226
1227 protocol kernel kern2 {
1228 table as2;
1229 kernel table 2;
1230 }
1231
1232 protocol bgp bgp1 { # The outside connections
1233 table as1;
1234 local as 1;
1235 neighbor 192.168.0.1 as 1001;
1236 export all;
1237 import all;
1238 }
1239
1240 protocol bgp bgp2 {
1241 table as2;
1242 local as 2;
1243 neighbor 10.0.0.1 as 1002;
1244 export all;
1245 import all;
1246 }
1247
1248 protocol pipe { # The Pipe
1249 table as1;
1250 peer table as2;
1251 export filter {
1252 if net ~ [ 1.0.0.0/8+] then { # Only AS1 networks
1253 if preference>10 then preference = preference-10;
1254 if source=RTS_BGP then bgp_path.prepend(1);
1255 accept;
1256 }
1257 reject;
1258 };
1259 import filter {
1260 if net ~ [ 2.0.0.0/8+] then { # Only AS2 networks
1261 if preference>10 then preference = preference-10;
1262 if source=RTS_BGP then bgp_path.prepend(2);
1263 accept;
1264 }
1265 reject;
1266 };
1267 }
1268 </code>
1269
1270 <sect>RIP
1271
1272 <sect1>Introduction
1273
1274 <p>The RIP protocol (also sometimes called Rest In Pieces) is a simple protocol, where each router broadcasts (to all its neighbors)
1275 distances to all networks it can reach. When a router hears distance to another network, it increments
1276 it and broadcasts it back. Broadcasts are done in regular intervals. Therefore, if some network goes
1277 unreachable, routers keep telling each other that its distance is the original distance plus 1 (actually, plus
1278 interface metric, which is usually one). After some time, the distance reaches infinity (that's 15 in
1279 RIP) and all routers know that network is unreachable. RIP tries to minimize situations where
1280 counting to infinity is necessary, because it is slow. Due to infinity being 16, you can't use
1281 RIP on networks where maximal distance is higher than 15 hosts. You can read more about RIP at <HTMLURL
1282 URL="http://www.ietf.org/html.charters/rip-charter.html" name="http://www.ietf.org/html.charters/rip-charter.html">. Both IPv4
1283 (RFC 1723<htmlurl url="ftp://ftp.rfc-editor.org/in-notes/rfc1723.txt">)
1284 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
1285 not currently supported. RIPv4 md5 authentication (RFC 2082<htmlurl url="ftp://ftp.rfc-editor.org/in-notes/rfc2082.txt">) is supported.
1286
1287 <p>RIP is a very simple protocol, and it has a lot of shortcomings. Slow
1288 convergence, big network load and inability to handle larger networks
1289 makes it pretty much obsolete in IPv4 world. (It is still usable on
1290 very small networks.) It is widely used in IPv6 networks,
1291 because there are no good implementations of OSPFv3.
1292
1293 <sect1>Configuration
1294
1295 <p>In addition to options common for all to other protocols, RIP supports the following ones:
1296
1297 <descrip>
1298 <tag/authentication none|password|md5/ selects authentication method to be used. <cf/none/ means that
1299 packets are not authenticated at all, <cf/password/ means that a plaintext password is embedded
1300 into each packet, and <cf/md5/ means that packets are authenticated using a md5 cryptographic
1301 hash. If you set authentication to not-none, it is a good idea to add <cf>passwords { }</cf>
1302 section. Default: none.
1303
1304 <tag>honor always|neighbor|never </tag>specifies when should requests for dumping routing table
1305 be honored. (Always, when sent from a host on a directly connected
1306 network or never.) Routing table updates are honored only from
1307 neighbors, that is not configurable. Default: never.
1308 </descrip>
1309
1310 <p>There are two options that can be specified per-interface. First is <cf>metric</cf>, with
1311 default one. Second is <cf>mode multicast|broadcast|quiet|nolisten|version1</cf>, it selects mode for
1312 rip to work in. If nothing is specified, rip runs in multicast mode. <cf>version1</cf> is
1313 currently equivalent to <cf>broadcast</cf>, and it makes RIP talk to a broadcast address even
1314 through multicast mode is possible. <cf>quiet</cf> option means that RIP will not transmit
1315 any periodic messages to this interface and <cf>nolisten</cf> means that RIP will send to this
1316 interface but not listen to it.
1317
1318 <p>The following options generally override behavior specified in RFC. If you use any of these
1319 options, BIRD will no longer be RFC-compliant, which means it will not be able to talk to anything
1320 other than equally configured BIRD. I have warned you.
1321
1322 <descrip>
1323 <tag>port <M>number</M></tag>
1324 selects IP port to operate on, default 520. (This is useful when testing BIRD, if you
1325 set this to an address &gt;1024, you will not need to run bird with UID==0).
1326
1327 <tag>infinity <M>number</M></tag>
1328 selects the value of infinity, default is 16. Bigger values will make protocol convergence
1329 even slower.
1330
1331 <tag>period <M>number</M>
1332 </tag>specifies the number of seconds between periodic updates. Default is 30 seconds. A lower
1333 number will mean faster convergence but bigger network
1334 load. Do not use values lower than 10.
1335
1336 <tag>timeout time <M>number</M>
1337 </tag>specifies how old route has to be to be considered unreachable. Default is 4*<cf/period/.
1338
1339 <tag>garbage time <M>number</M>
1340 </tag>specifies how old route has to be to be discarded. Default is 10*<cf/period/.
1341 </descrip>
1342
1343 <sect1>Attributes
1344
1345 <p>RIP defines two route attributes:
1346
1347 <descrip>
1348 <tag>int <cf/rip_metric/</tag> RIP metric of the route (ranging from 0 to <cf/infinity/).
1349 When routes from different RIP instances are available and all of them have the same
1350 preference, BIRD prefers the route with lowest <cf/rip_metric/.
1351 When importing a non-RIP route, the metric defaults to 5.
1352
1353 <tag>int <cf/rip_tag/</tag> RIP route tag: a 16-bit number which can be used
1354 to carry additional information with the route (for example, an originating AS number
1355 in case of external routes). When importing a non-RIP route, the tag defaults to 0.
1356 </descrip>
1357
1358 <sect1>Example
1359
1360 <p><code>
1361 protocol rip MyRIP_test {
1362 debug all;
1363 port 1520;
1364 period 10;
1365 garbage time 60;
1366 interface "eth0" { metric 3; mode multicast; }
1367 "eth1" { metric 2; mode broadcast; };
1368 honor neighbor;
1369 authentication none;
1370 import filter { print "importing"; accept; };
1371 export filter { print "exporting"; accept; };
1372 }
1373 </code>
1374
1375 <sect>Static
1376
1377 <p>The Static protocol doesn't communicate with other routers in the network,
1378 but instead it allows you to define routes manually. This is often used for
1379 specifying how to forward packets to parts of the network which don't use
1380 dynamic routing at all and also for defining sink routes (i.e., those
1381 telling to return packets as undeliverable if they are in your IP block,
1382 you don't have any specific destination for them and you don't want to send
1383 them out through the default route to prevent routing loops).
1384
1385 <p>There are three types of static routes: `classical' routes telling to
1386 forward packets to a neighboring router, device routes specifying forwarding
1387 to hosts on a directly connected network and special routes (sink, blackhole
1388 etc.) which specify a special action to be done instead of forwarding the
1389 packet.
1390
1391 <p>When the particular destination is not available (the interface is down or
1392 the next hop of the route is not a neighbor at the moment), Static just
1393 uninstalls the route from the table it is connected to and adds it again as soon
1394 as the destination becomes adjacent again.
1395
1396 <p>The Static protocol has no configuration options. Instead, the
1397 definition of the protocol contains a list of static routes:
1398
1399 <descrip>
1400 <tag>route <m/prefix/ via <m/ip/</tag> Static route through
1401 a neighboring router.
1402 <tag>route <m/prefix/ via <m/"interface"/</tag> Static device
1403 route through an interface to hosts on a directly connected network.
1404 <tag>route <m/prefix/ drop|reject|prohibit</tag> Special routes
1405 specifying to drop the packet, return it as unreachable or return
1406 it as administratively prohibited.
1407 </descrip>
1408
1409 <p>Static routes have no specific attributes.
1410
1411 <p>Example static config might look like this:
1412
1413 <p><code>
1414 protocol static {
1415 table testable; # Connect to a non-default routing table
1416 route 0.0.0.0/0 via 62.168.0.13; # Default route
1417 route 62.168.0.0/25 reject; # Sink route
1418 route 10.2.0.0/24 via "arc0"; # Secondary network
1419 }
1420 </code>
1421
1422 <chapt>Conclusions
1423
1424 <sect>Future work
1425
1426 <p>Although BIRD supports all the commonly used routing protocols,
1427 there are still some features which would surely deserve to be
1428 implemented in future versions of BIRD:
1429
1430 <itemize>
1431 <item>OSPF for IPv6 networks
1432 <item>OSPF NSSA areas and opaque LSA's
1433 <item>Route aggregation and flap dampening
1434 <item>Generation of IPv6 router advertisements
1435 <item>Multipath routes
1436 <item>Multicast routing protocols
1437 <item>Ports to other systems
1438 </itemize>
1439
1440 <sect>Getting more help
1441
1442 <p>If you use BIRD, you're welcome to join the bird-users mailing list
1443 (<HTMLURL URL="mailto:bird-users@bird.network.cz" name="bird-users@bird.network.cz">)
1444 where you can share your experiences with the other users and consult
1445 your problems with the authors. To subscribe to the list, just send a
1446 <tt/subscribe bird-users/ command in a body of a mail to
1447 (<HTMLURL URL="mailto:majordomo@bird.network.cz" name="majordomo@bird.network.cz">).
1448 The home page of BIRD can be found at <HTMLURL URL="http://bird.network.cz/" name="http://bird.network.cz/">.
1449
1450 <p>BIRD is a relatively young system and it probably contains some
1451 bugs. You can report any problems to the bird-users list and the authors
1452 will be glad to solve them, but before you do so,
1453 please make sure you have read the available documentation and that you are running the latest version (available at <HTMLURL
1454 URL="ftp://bird.network.cz/pub/bird" name="bird.network.cz:/pub/bird">). (Of course, a patch
1455 which fixes the bug is always welcome as an attachment.)
1456
1457 <p>If you want to understand what is going inside, Internet standards are
1458 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">).
1459
1460 <p><it/Good luck!/
1461
1462 </book>
1463
1464 <!--
1465 LocalWords: GPL IPv GateD BGPv RIPv OSPFv Linux sgml html dvi sgmltools Pavel
1466 LocalWords: linuxdoc dtd descrip config conf syslog stderr auth ospf bgp Mbps
1467 LocalWords: router's eval expr num birdc ctl UNIX if's enums bool int ip GCC
1468 LocalWords: len ipaddress pxlen netmask enum bgppath bgpmask clist gw md eth
1469 LocalWords: RTS printn quitbird iBGP AS'es eBGP RFC multiprotocol IGP Machek
1470 LocalWords: EGP misconfigurations keepalive pref aggr aggregator BIRD's RTC
1471 LocalWords: OS'es AS's multicast nolisten misconfigured UID blackhole MRTD MTU
1472 LocalWords: uninstalls ethernets IP binutils ANYCAST anycast dest RTD ICMP rfc
1473 LocalWords: compat multicasts nonbroadcast pointopoint loopback sym stats
1474 LocalWords: Perl SIGHUP dd mm yy HH MM SS EXT IA UNICAST multihop Discriminator txt
1475 LocalWords: proto wildcard
1476 -->