]> git.ipfire.org Git - thirdparty/bird.git/blob - doc/bird.sgml
Some misspells.
[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 amount 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 multiple definitions of interfaces. Definition of interface
1005 may contain many switches and constant definitions 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 stub &lt;switch&gt;;
1018 hello &lt;num&gt;;
1019 poll &lt;num&gt;;
1020 retransmit &lt;num&gt;;
1021 priority &lt;num&gt;;
1022 wait &lt;num&gt;;
1023 dead count &lt;num&gt;;
1024 type [broadcast|nonbroadcast|pointopoint];
1025 strict nonbroadcast &lt;switch&gt;;
1026 authentication [none|simple];
1027 password "&lt;text&gt;";
1028 neighbors {
1029 &lt;ip&gt;;
1030 &lt;ip&gt; eligible;
1031 };
1032 };
1033 };
1034 }
1035 </code>
1036
1037 <descrip>
1038 <tag>rfc1583compat <M>switch</M></tag>
1039 This option controls compatibility of routing table
1040 calculation with RFC 1583<htmlurl
1041 url="ftp://ftp.rfc-editor.org/in-notes/rfc1583.txt">. Default
1042 value is no.
1043
1044 <tag>area <M>id</M></tag>
1045 This defines an OSPF area with given area ID (an integer or an IPv4
1046 address, similarly to a router ID).
1047 The most important area is
1048 the backbone (ID 0) to which every other area must be connected.
1049
1050 <tag>stub <M>switch</M></tag>
1051 No external routes are flooded into stub areas. Default value is no.
1052
1053 <tag>tick <M>num</M></tag>
1054 The routing table calculation is not performed when a single link state
1055 change arrives. To lower the CPU utilization, it's processed later
1056 at periodical intervals of <m/num/ seconds. The default value is 7.
1057
1058 <tag>interface <M>pattern</M></tag>
1059 Defines that the specified interfaces belong to the area being defined.
1060
1061 <tag>cost <M>num</M></tag>
1062 Specifies output cost (metric) of an interface. Default value is 10.
1063
1064 <tag>stub <M>switch</M></tag>
1065 If set to interface it does not listen to any packet and does not send
1066 any hello. Default value is no.
1067
1068 <tag>hello <M>num</M></tag>
1069 Specifies interval in seconds between sending of Hello messages. Beware, all
1070 routers on the same network need to have the same hello interval.
1071 Default value is 10.
1072
1073 <tag>poll <M>num</M></tag>
1074 Specifies interval in seconds between sending of Hello messages for
1075 some neighbors on NBMA network. Default value is 20.
1076
1077 <tag>retransmit <M>num</M></tag>
1078 Specifies interval in seconds between retransmissions of unacknowledged updates.
1079 Default value is 5.
1080
1081 <tag>priority <M>num</M></tag>
1082 On every multiple access network (e.g., the Ethernet) Designed Router
1083 and Backup Designed router are elected. These routers have some
1084 special functions in the flooding process. Higher priority increases
1085 preferences in this election. Routers with priority 0 are not
1086 eligible. Default value is 1.
1087
1088 <tag>wait <M>num</M></tag>
1089 After start, router waits for the specified number of seconds between starting
1090 election and building adjacency. Default value is 40.
1091
1092 <tag>dead count <M>num</M></tag>
1093 When the router does not receive any messages from a neighbor in
1094 <m/dead count/*<m/hello/ seconds, it will consider the neighbor down.
1095
1096 <tag>type broadcast</tag>
1097 BIRD detects a type of a connected network automatically, but sometimes it's
1098 convenient to force use of a different type manually.
1099 On broadcast networks, flooding and Hello messages are sent using multicasts (a single packet for all the neighbors).
1100
1101 <tag>type pointopoint</tag>
1102 Point-to-point networks connect just 2 routers together. No election
1103 is performed there which reduces the number of messages sent.
1104
1105 <tag>type nonbroadcast</tag>
1106 On nonbroadcast networks, the packets are sent to each neighbor
1107 separately because of lack of multicast capabilities.
1108
1109 <tag>strict nonbroadcast <M>switch</M></tag>
1110 If set, don't send hello to any undefined neighbor. This switch
1111 is ignored on on any non-NBMA network. Default is No.
1112
1113 <tag>authentication none</tag>
1114 No passwords are sent in OSPF packets. This is the default value.
1115
1116 <tag>authentication simple</tag>
1117 Every packet carries 8 bytes of password. Received packets
1118 lacking this password are ignored. This authentication mechanism is
1119 very weak.
1120
1121 <tag>password "<M>text</M>"</tag>
1122 An 8-byte password used for authentication.
1123
1124 <tag>neighbors { <m/set/ } </tag>
1125 A set of neighbors to which Hello messages on nonbroadcast networks
1126 are to be sent. Some of them could be marked as eligible.
1127
1128 </descrip>
1129
1130 <sect1>Attributes
1131
1132 <p>OSPF defines three route attributes. Each internal route has a <cf/metric/
1133 Metric is ranging from 1 to infinity (65535).
1134 External routes use <cf/metric type 1/ or <cf/metric type 2/.
1135 A <cf/metric of type 1/ is comparable with internal <cf/metric/, a
1136 <cf/metric of type 2/ is always longer
1137 than any <cf/metric of type 1/ or any <cf/internal metric/.
1138 If you specify both metrics only metric1 is used.
1139 Each external route can also carry a <cf/tag/ which is a 32-bit
1140 integer which is used when exporting routes to other protocols;
1141 otherwise, it doesn't affect routing inside the OSPF domain at all.
1142 Default is <cf/metric of type 2 = 10000/ and <cf/tag = 0/.
1143
1144 <sect1>Example
1145
1146 <p>
1147
1148 <code>
1149 protocol ospf MyOSPF {
1150 export filter {
1151 if source = RTS_BGP then {
1152 ospf_metric1 = 100;
1153 accept;
1154 }
1155 reject;
1156 };
1157 area 0.0.0.0 {
1158 tick 8;
1159 interface "eth*" {
1160 cost 11;
1161 hello 15;
1162 priority 100;
1163 retransmit 7;
1164 authentication simple;
1165 password "aaa";
1166 };
1167 interface "ppp*" {
1168 cost 100;
1169 };
1170 interface "arc0" {
1171 cost 10;
1172 stub yes;
1173 };
1174 };
1175 area 120 {
1176 stub yes;
1177 interface "-arc0" , "arc*" {
1178 type nonbroadcast;
1179 authentication none;
1180 strict nonbroadcast yes;
1181 wait 120;
1182 poll 40;
1183 dead count 8;
1184 neighbors {
1185 192.168.120.1 eligible;
1186 192.168.120.2;
1187 192.168.120.10;
1188 };
1189 };
1190 };
1191 }
1192 </code>
1193
1194 <sect>Pipe
1195
1196 <sect1>Introduction
1197
1198 <p>The Pipe protocol serves as a link between two routing tables, allowing routes to be
1199 passed from a table declared as primary (i.e., the one the pipe is connected to using the
1200 <cf/table/ configuration keyword) to the secondary one (declared using <cf/peer table/)
1201 and vice versa, depending on what's allowed by the filters. Export filters control export
1202 of routes from the primary table to the secondary one, import filters control the opposite
1203 direction.
1204
1205 <p>The primary use of multiple routing tables and the Pipe protocol is for policy routing,
1206 where handling of a single packet doesn't depend only on its destination address, but also
1207 on its source address, source interface, protocol type and other similar parameters.
1208 In many systems (Linux 2.2 being a good example), the kernel allows to enforce routing policies
1209 by defining routing rules which choose one of several routing tables to be used for a packet
1210 according to its parameters. Setting of these rules is outside the scope of BIRD's work
1211 (on Linux, you can use the <tt/ip/ command), but you can create several routing tables in BIRD,
1212 connect them to the kernel ones, use filters to control which routes appear in which tables
1213 and also you can employ the Pipe protocol for exporting a selected subset of one table to
1214 another one.
1215
1216 <sect1>Configuration
1217
1218 <p><descrip>
1219 <tag>peer table <m/table/</tag> Define secondary routing table to connect to. The
1220 primary one is selected by the <cf/table/ keyword.
1221 </descrip>
1222
1223 <sect1>Attributes
1224
1225 <p>The Pipe protocol doesn't define any route attributes.
1226
1227 <sect1>Example
1228
1229 <p>Let's consider a router which serves as a boundary router of two different autonomous
1230 systems, each of them connected to a subset of interfaces of the router, having its own
1231 exterior connectivity and wishing to use the other AS as a backup connectivity in case
1232 of outage of its own exterior line.
1233
1234 <p>Probably the simplest solution to this situation is to use two routing tables (we'll
1235 call them <cf/as1/ and <cf/as2/) and set up kernel routing rules, so that packets having
1236 arrived from interfaces belonging to the first AS will be routed according to <cf/as1/
1237 and similarly for the second AS. Thus we have split our router to two logical routers,
1238 each one acting on its own routing table, having its own routing protocols on its own
1239 interfaces. In order to use the other AS's routes for backup purposes, we can pass
1240 the routes between the tables through a Pipe protocol while decreasing their preferences
1241 and correcting their BGP paths to reflect the AS boundary crossing.
1242
1243 <code>
1244 table as1; # Define the tables
1245 table as2;
1246
1247 protocol kernel kern1 { # Synchronize them with the kernel
1248 table as1;
1249 kernel table 1;
1250 }
1251
1252 protocol kernel kern2 {
1253 table as2;
1254 kernel table 2;
1255 }
1256
1257 protocol bgp bgp1 { # The outside connections
1258 table as1;
1259 local as 1;
1260 neighbor 192.168.0.1 as 1001;
1261 export all;
1262 import all;
1263 }
1264
1265 protocol bgp bgp2 {
1266 table as2;
1267 local as 2;
1268 neighbor 10.0.0.1 as 1002;
1269 export all;
1270 import all;
1271 }
1272
1273 protocol pipe { # The Pipe
1274 table as1;
1275 peer table as2;
1276 export filter {
1277 if net ~ [ 1.0.0.0/8+] then { # Only AS1 networks
1278 if preference>10 then preference = preference-10;
1279 if source=RTS_BGP then bgp_path.prepend(1);
1280 accept;
1281 }
1282 reject;
1283 };
1284 import filter {
1285 if net ~ [ 2.0.0.0/8+] then { # Only AS2 networks
1286 if preference>10 then preference = preference-10;
1287 if source=RTS_BGP then bgp_path.prepend(2);
1288 accept;
1289 }
1290 reject;
1291 };
1292 }
1293 </code>
1294
1295 <sect>RIP
1296
1297 <sect1>Introduction
1298
1299 <p>The RIP protocol (also sometimes called Rest In Pieces) is a simple protocol, where each router broadcasts (to all its neighbors)
1300 distances to all networks it can reach. When a router hears distance to another network, it increments
1301 it and broadcasts it back. Broadcasts are done in regular intervals. Therefore, if some network goes
1302 unreachable, routers keep telling each other that its distance is the original distance plus 1 (actually, plus
1303 interface metric, which is usually one). After some time, the distance reaches infinity (that's 15 in
1304 RIP) and all routers know that network is unreachable. RIP tries to minimize situations where
1305 counting to infinity is necessary, because it is slow. Due to infinity being 16, you can't use
1306 RIP on networks where maximal distance is higher than 15 hosts. You can read more about RIP at <HTMLURL
1307 URL="http://www.ietf.org/html.charters/rip-charter.html" name="http://www.ietf.org/html.charters/rip-charter.html">. Both IPv4
1308 (RFC 1723<htmlurl url="ftp://ftp.rfc-editor.org/in-notes/rfc1723.txt">)
1309 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
1310 not currently supported. RIPv4 md5 authentication (RFC 2082<htmlurl url="ftp://ftp.rfc-editor.org/in-notes/rfc2082.txt">) is supported.
1311
1312 <p>RIP is a very simple protocol, and it has a lot of shortcomings. Slow
1313 convergence, big network load and inability to handle larger networks
1314 makes it pretty much obsolete in IPv4 world. (It is still usable on
1315 very small networks.) It is widely used in IPv6 networks,
1316 because there are no good implementations of OSPFv3.
1317
1318 <sect1>Configuration
1319
1320 <p>In addition to options common for all to other protocols, RIP supports the following ones:
1321
1322 <descrip>
1323 <tag/authentication none|password|md5/ selects authentication method to be used. <cf/none/ means that
1324 packets are not authenticated at all, <cf/password/ means that a plaintext password is embedded
1325 into each packet, and <cf/md5/ means that packets are authenticated using a md5 cryptographic
1326 hash. If you set authentication to not-none, it is a good idea to add <cf>passwords { }</cf>
1327 section. Default: none.
1328
1329 <tag>honor always|neighbor|never </tag>specifies when should requests for dumping routing table
1330 be honored. (Always, when sent from a host on a directly connected
1331 network or never.) Routing table updates are honored only from
1332 neighbors, that is not configurable. Default: never.
1333 </descrip>
1334
1335 <p>There are two options that can be specified per-interface. First is <cf>metric</cf>, with
1336 default one. Second is <cf>mode multicast|broadcast|quiet|nolisten|version1</cf>, it selects mode for
1337 rip to work in. If nothing is specified, rip runs in multicast mode. <cf>version1</cf> is
1338 currently equivalent to <cf>broadcast</cf>, and it makes RIP talk to a broadcast address even
1339 through multicast mode is possible. <cf>quiet</cf> option means that RIP will not transmit
1340 any periodic messages to this interface and <cf>nolisten</cf> means that RIP will send to this
1341 interface but not listen to it.
1342
1343 <p>The following options generally override behavior specified in RFC. If you use any of these
1344 options, BIRD will no longer be RFC-compliant, which means it will not be able to talk to anything
1345 other than equally configured BIRD. I have warned you.
1346
1347 <descrip>
1348 <tag>port <M>number</M></tag>
1349 selects IP port to operate on, default 520. (This is useful when testing BIRD, if you
1350 set this to an address &gt;1024, you will not need to run bird with UID==0).
1351
1352 <tag>infinity <M>number</M></tag>
1353 selects the value of infinity, default is 16. Bigger values will make protocol convergence
1354 even slower.
1355
1356 <tag>period <M>number</M>
1357 </tag>specifies the number of seconds between periodic updates. Default is 30 seconds. A lower
1358 number will mean faster convergence but bigger network
1359 load. Do not use values lower than 10.
1360
1361 <tag>timeout time <M>number</M>
1362 </tag>specifies how old route has to be to be considered unreachable. Default is 4*<cf/period/.
1363
1364 <tag>garbage time <M>number</M>
1365 </tag>specifies how old route has to be to be discarded. Default is 10*<cf/period/.
1366 </descrip>
1367
1368 <sect1>Attributes
1369
1370 <p>RIP defines two route attributes:
1371
1372 <descrip>
1373 <tag>int <cf/rip_metric/</tag> RIP metric of the route (ranging from 0 to <cf/infinity/).
1374 When routes from different RIP instances are available and all of them have the same
1375 preference, BIRD prefers the route with lowest <cf/rip_metric/.
1376 When importing a non-RIP route, the metric defaults to 5.
1377
1378 <tag>int <cf/rip_tag/</tag> RIP route tag: a 16-bit number which can be used
1379 to carry additional information with the route (for example, an originating AS number
1380 in case of external routes). When importing a non-RIP route, the tag defaults to 0.
1381 </descrip>
1382
1383 <sect1>Example
1384
1385 <p><code>
1386 protocol rip MyRIP_test {
1387 debug all;
1388 port 1520;
1389 period 10;
1390 garbage time 60;
1391 interface "eth0" { metric 3; mode multicast; }
1392 "eth1" { metric 2; mode broadcast; };
1393 honor neighbor;
1394 authentication none;
1395 import filter { print "importing"; accept; };
1396 export filter { print "exporting"; accept; };
1397 }
1398 </code>
1399
1400 <sect>Static
1401
1402 <p>The Static protocol doesn't communicate with other routers in the network,
1403 but instead it allows you to define routes manually. This is often used for
1404 specifying how to forward packets to parts of the network which don't use
1405 dynamic routing at all and also for defining sink routes (i.e., those
1406 telling to return packets as undeliverable if they are in your IP block,
1407 you don't have any specific destination for them and you don't want to send
1408 them out through the default route to prevent routing loops).
1409
1410 <p>There are three types of static routes: `classical' routes telling to
1411 forward packets to a neighboring router, device routes specifying forwarding
1412 to hosts on a directly connected network and special routes (sink, blackhole
1413 etc.) which specify a special action to be done instead of forwarding the
1414 packet.
1415
1416 <p>When the particular destination is not available (the interface is down or
1417 the next hop of the route is not a neighbor at the moment), Static just
1418 uninstalls the route from the table it is connected to and adds it again as soon
1419 as the destination becomes adjacent again.
1420
1421 <p>The Static protocol has no configuration options. Instead, the
1422 definition of the protocol contains a list of static routes:
1423
1424 <descrip>
1425 <tag>route <m/prefix/ via <m/ip/</tag> Static route through
1426 a neighboring router.
1427 <tag>route <m/prefix/ via <m/"interface"/</tag> Static device
1428 route through an interface to hosts on a directly connected network.
1429 <tag>route <m/prefix/ drop|reject|prohibit</tag> Special routes
1430 specifying to drop the packet, return it as unreachable or return
1431 it as administratively prohibited.
1432 </descrip>
1433
1434 <p>Static routes have no specific attributes.
1435
1436 <p>Example static config might look like this:
1437
1438 <p><code>
1439 protocol static {
1440 table testable; # Connect to a non-default routing table
1441 route 0.0.0.0/0 via 62.168.0.13; # Default route
1442 route 62.168.0.0/25 reject; # Sink route
1443 route 10.2.0.0/24 via "arc0"; # Secondary network
1444 }
1445 </code>
1446
1447 <chapt>Conclusions
1448
1449 <sect>Future work
1450
1451 <p>Although BIRD supports all the commonly used routing protocols,
1452 there are still some features which would surely deserve to be
1453 implemented in future versions of BIRD:
1454
1455 <itemize>
1456 <item>OSPF for IPv6 networks
1457 <item>OSPF NSSA areas and opaque LSA's
1458 <item>Route aggregation and flap dampening
1459 <item>Generation of IPv6 router advertisements
1460 <item>Multipath routes
1461 <item>Multicast routing protocols
1462 <item>Ports to other systems
1463 </itemize>
1464
1465 <sect>Getting more help
1466
1467 <p>If you use BIRD, you're welcome to join the bird-users mailing list
1468 (<HTMLURL URL="mailto:bird-users@bird.network.cz" name="bird-users@bird.network.cz">)
1469 where you can share your experiences with the other users and consult
1470 your problems with the authors. To subscribe to the list, just send a
1471 <tt/subscribe bird-users/ command in a body of a mail to
1472 (<HTMLURL URL="mailto:majordomo@bird.network.cz" name="majordomo@bird.network.cz">).
1473 The home page of BIRD can be found at <HTMLURL URL="http://bird.network.cz/" name="http://bird.network.cz/">.
1474
1475 <p>BIRD is a relatively young system and it probably contains some
1476 bugs. You can report any problems to the bird-users list and the authors
1477 will be glad to solve them, but before you do so,
1478 please make sure you have read the available documentation and that you are running the latest version (available at <HTMLURL
1479 URL="ftp://bird.network.cz/pub/bird" name="bird.network.cz:/pub/bird">). (Of course, a patch
1480 which fixes the bug is always welcome as an attachment.)
1481
1482 <p>If you want to understand what is going inside, Internet standards are
1483 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">).
1484
1485 <p><it/Good luck!/
1486
1487 </book>
1488
1489 <!--
1490 LocalWords: GPL IPv GateD BGPv RIPv OSPFv Linux sgml html dvi sgmltools Pavel
1491 LocalWords: linuxdoc dtd descrip config conf syslog stderr auth ospf bgp Mbps
1492 LocalWords: router's eval expr num birdc ctl UNIX if's enums bool int ip GCC
1493 LocalWords: len ipaddress pxlen netmask enum bgppath bgpmask clist gw md eth
1494 LocalWords: RTS printn quitbird iBGP AS'es eBGP RFC multiprotocol IGP Machek
1495 LocalWords: EGP misconfigurations keepalive pref aggr aggregator BIRD's RTC
1496 LocalWords: OS'es AS's multicast nolisten misconfigured UID blackhole MRTD MTU
1497 LocalWords: uninstalls ethernets IP binutils ANYCAST anycast dest RTD ICMP rfc
1498 LocalWords: compat multicasts nonbroadcast pointopoint loopback sym stats
1499 LocalWords: Perl SIGHUP dd mm yy HH MM SS EXT IA UNICAST multihop Discriminator txt
1500 LocalWords: proto wildcard
1501 -->