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