]> git.ipfire.org Git - thirdparty/bird.git/blame - doc/bird.sgml
Spelling.
[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
4e8ec666 10This is a slightly modified linuxdoc dtd. Anything in <descrip> tags is considered definition of
326e33f5 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 65which does the actual packet forwarding. There already exist other such routing daemons: routed (rip only), GateD<HTMLURL URL="http://www.gated.org/">
4e8ec666 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
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>
4e8ec666 146 <item>network prefix this route is for (consists of network 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,
4e8ec666 226 <cf/bug/ for internal BIRD bugs. You may specify more than one <cf/log/ line to establish 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
4e8ec666 272 <tag>import { <m/filter commands/ } | <m/name/ | all | none</tag> Specify a filter to be used for filtering routes coming from protocol to the 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
4e8ec666 319being passed between protocols 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 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
25696edb
PM
438 prefixes <cf/3.X.X.X/, whose prefix length is 5 to 6. <cf><m>address</m>/<m>num</m>+</cf> is shorthand for <cf><m>address</m>/{0,<m/num/}</cf>,
439 <cf><m>address</m>/<m/num/-</cf> is shorthand for <cf><m>address</m>/{0,<m/num-1/}</cf>. For example,
a7c9f7c0 440 <cf>1.2.0.0/16 ~ [ 1.0.0.0/8{ 15 , 17 } ]</cf> is true, but
25696edb 441 <cf>1.0.0.0/8 ~ [ 1.0.0.0/8- ]</cf> is false.
d37f899b
PM
442
443 <tag/enum/
4e8ec666 444 Enumeration types are fixed in BIRD -- you can't define your own
a7c9f7c0
PM
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 -->
4a5bb2bf 461 <tag/clist/
a7c9f7c0 462 Community list is similar to set of pairs,
4a5bb2bf 463 except that unlike other sets, it can be modified.
a7c9f7c0 464 There exist no literals of this type.
0e5373fd 465
d37f899b
PM
466</descrip>
467
a7c9f7c0 468<sect>Operators
d37f899b 469
25696edb 470<!-- Sorry, birddoc does not support tables. -->
a7c9f7c0
PM
471
472<p>The filter language supports common integer operators <cf>(+,-,*,/)</cf>, parentheses <cf/(a*(b+c))/, comparison
25696edb
PM
473<cf/(a=b, a!=b, a&lt;b, a&gt;=b)/. Logical operations include unary not (<cf/!/), and (<cf/&&/) and or (<cf/||/).
474Special operators include <cf/&tilde;/ for "in" operation. In operation can be
475used on element and set of that elements (returning true if element is within given set), or on IP and prefix (returning true if IP is within range defined by that prefix), or on
4e8ec666 476prefix and prefix (returning true if first prefix is more specific than second) or on bgppath and bgpmask (returning true if path matches given path mask) or on pair and clist (returning true if given community is element of community list).
25696edb 477
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>
25696edb 523 Network the route is talking about. Read-only. (See the section about routing tables.)
a7c9f7c0
PM
524
525 <tag><m/enum/ scope</tag>
25696edb 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>
25696edb 532 The router which the route has originated from. Read-only.
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>
25696edb 538 what protocol has told me about this route. Possible values: <cf/RTS_DUMMY, RTS_STATIC, RTS_INHERIT, RTS_DEVICE, RTS_STATIC_DEVICE, RTS_REDIRECT, RTS_RIP, RTS_OSPF, RTS_OSPF_EXT, RTS_OSPF_IA, RTS_OSPF_BOUNDARY, RTS_BGP, RTS_PIPE/.
c184d9d0 539
cd4fecb6 540 <tag><m/enum/ cast</tag>
25696edb 541 Route type (<cf/RTC_UNICAST/ for normal routes, <cf/RTC_BROADCAST, RTC_MULTICAST, RTC_ANYCAST/ for broadcast, multicast and anycast routes.) Read-only.
c184d9d0 542
cd4fecb6 543 <tag><m/enum/ dest</tag>
4e8ec666 544 Type of destination the packets should be sent to (<cf/RTD_ROUTER/ for forwarding to a neighboring router, <cf/RTD_NETWORK/ for routing to directly-connected network, <cf/RTD_BLACKHOLE/ for packets to be silently discarded, <cf/RTD_UNREACHABLE, RTD_PROHIBIT/ for packets that should be discarded with ICMP host unreachable / ICMP administratively prohibited messages.) Read-only.
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
3ca3e999
MM
882<p>Open Shortest Path First (OSPF) is a quite complex interior gateway
883protocol. The current IPv4 version (OSPFv2) is defined in RFC 2328
884<htmlurl url="ftp://ftp.rfc-editor.org/in-notes/rfc2328.txt">. It's a link
885state (a.k.a. shortest path first) protocol -- Each router maintains a database
886describing the autonomous system's topology. Each participating router
887has an identical copy of the database and all routers run the same algorithm
888calculating a shortest path tree with themselves as a root.
4e8ec666 889OSPF chooses the least cost path as the best path.
3ca3e999
MM
890
891<p>In OSPF, the autonomous system can be split to several areas in order
892to reduce the amount of resources consumed for exchanging the routing
893information and to protect the other areas from incorrect routing data.
894Topology of the area is hidden to the rest of the autonomous system.
4e8ec666 895Unfortunately multiple OSPF areas are not yet fully supported
3ca3e999
MM
896by this version of BIRD and neither is the IPv6 version (OSPFv3).
897
898<p>Another very important feature of OSPF is that
899it can keep routing information from other protocols (like Static or BGP)
900in its link state database as external routes. Each external route can
901be tagged by the advertising router, making possible to pass additional
902information between routers on the boundary of the autonomous system.
903
904<p>OSPF quickly detects topological changes in the autonomous system (such
8fd12e6b 905as router interface failures) and calculates new loop-free routes after a
3ca3e999
MM
906period of convergence. This period is short and involves only minimal
907routing traffic.
8fd12e6b 908
3ca3e999
MM
909<p>Each router participating in OSPF routing periodically sends Hello messages
910to all its interfaces. This allows neighbors to be discovered dynamically.
911Then the neighbors exchange theirs parts of the link state database and keep it
912identical by flooding updates. The flooding process is reliable and ensures
913that each router detects all changes.
8fd12e6b
OF
914
915<sect1>Configuration
916
917<p>
918
919<code>
088bc8ad 920protocol ospf &lt;name&gt; {
3ca3e999 921 rfc1583compat &lt;bool&gt;;
088bc8ad
OF
922 area &lt;id&gt; {
923 stub &lt;bool&gt;;
924 tick &lt;num&gt;;
3ca3e999 925 interface &lt;interface pattern&gt;
8fd12e6b 926 {
088bc8ad
OF
927 cost &lt;num&gt;;
928 hello &lt;num&gt;;
929 retransmit &lt;num&gt;;
930 priority &lt;num&gt;;
931 wait &lt;num&gt;;
932 dead count &lt;num&gt;;
8fd12e6b
OF
933 type [broadcast|nonbroadcast|pointopoint];
934 authetication [none|simple];
088bc8ad 935 password "&lt;text&gt;";
8fd12e6b 936 neighbors {
088bc8ad 937 &lt;ip&gt;;
8fd12e6b
OF
938 };
939 };
940 };
941}
942</code>
943
944<descrip>
945 <tag>rfc1583compat <M>bool</M></tag>
3ca3e999 946 This option controls compatibility of routing table
8fd12e6b
OF
947 calculation with RFC 1583<htmlurl
948 url="ftp://ftp.rfc-editor.org/in-notes/rfc1583.txt">. Default
949 value is no.
950
951 <tag>area <M>id</M></tag>
3ca3e999
MM
952 This defines an OSPF area with given area ID (an integer or an IPv4
953 address, similarly to a router ID).
954 The most important area is
955 the backbone (ID 0) to which every other area must be connected.
8fd12e6b
OF
956
957 <tag>stub <M>bool</M></tag>
3ca3e999 958 No external routes are flooded into stub areas. Default value is no.
8fd12e6b
OF
959
960 <tag>tick <M>num</M></tag>
3ca3e999
MM
961 The routing table calculation is not performed when a single link state
962 change arrives. To lower the CPU utilization, it's processed later
963 at periodical intervals of <m/num/ seconds. The default value is 7.
8fd12e6b 964
3ca3e999
MM
965 <tag>interface <M>pattern</M></tag>
966 Defines that the specified interfaces belong to the area being defined.
8fd12e6b
OF
967
968 <tag>cost <M>num</M></tag>
3ca3e999 969 Specifies output cost (metric) of an interface. Default value is 10.
8fd12e6b
OF
970
971 <tag>hello <M>num</M></tag>
3ca3e999
MM
972 Specifies interval in seconds between sending of Hello messages. Beware, all
973 routers on the same network need to have the same hello interval.
8fd12e6b
OF
974 Default value is 10.
975
976 <tag>retransmit <M>num</M></tag>
4e8ec666 977 Specifies interval in seconds between retransmissions of unacknowledged updates.
8fd12e6b
OF
978 Default value is 5.
979
980 <tag>priority <M>num</M></tag>
3ca3e999
MM
981 On every multiple access network (e.g., the Ethernet) Designed Router
982 and Backup Designed router are elected. These routers have some
983 special functions in the flooding process. Higher priority increases
984 preferences in this election. Routers with priority 0 are not
8fd12e6b
OF
985 eligible. Default value is 1.
986
987 <tag>wait <M>num</M></tag>
3ca3e999 988 After start, router waits for the specified number of seconds between starting
8fd12e6b
OF
989 election and building adjacency. Default value is 40.
990
991 <tag>dead count <M>num</M></tag>
3ca3e999
MM
992 When the router does not receive any messages from a neighbor in
993 <m/dead count/*<m/hello/ seconds, it will consider the neighbor down.
8fd12e6b 994
3ca3e999
MM
995 <tag>type broadcast</tag>
996 BIRD detects a type of a connected network automatically, but sometimes it's
997 convenient to force use of a different type manually.
998 On broadcast networks, flooding and Hello messages are sent using multicasts (a single packet for all the neighbors).
8fd12e6b 999
3ca3e999
MM
1000 <tag>type nonbroadcast</tag>
1001 On nonbroadcast networks, the packets are sent to each neighbor
1002 separately because of lack of multicast capabilities.
8fd12e6b 1003
3ca3e999
MM
1004 <tag>type pointopoint</tag>
1005 Point-to-point networks connect just 2 routers together. No election
1006 is performed there which reduces the number of messages sent.
8fd12e6b 1007
4e8ec666 1008 <tag>authentication none</tag>
3ca3e999 1009 No passwords are sent in OSPF packets. This is the default value.
8fd12e6b 1010
4e8ec666 1011 <tag>authentication simple</tag>
3ca3e999 1012 Every packet carries 8 bytes of password. Received packets
4e8ec666 1013 lacking this password are ignored. This authentication mechanism is
8fd12e6b
OF
1014 very weak.
1015
1016 <tag>password <M>text</M></tag>
3ca3e999 1017 An 8-byte password used for authentication.
8fd12e6b
OF
1018
1019 <tag>neighbors</tag>
3ca3e999
MM
1020 A set of neighbors to which Hello messages on nonbroadcast networks
1021 are to be sent.
8fd12e6b
OF
1022</descrip>
1023
1024<sect1>Attributes
1025
3ca3e999
MM
1026<p>OSPF defines three route attributes. Each internal route has a metric. External
1027routes use metric type 1 or metric type 2. A metric of type 1 is comparable
1028with internal metrics, a metric of type 2 is always longer than any metric of type 1
1029or any internal metric. Each external route can also carry a tag which is
1030a 32-bit integer which is used when exporting routes to other protocols; otherwise,
1031it doesn't affect routing inside the OSPF domain at all.
8fd12e6b
OF
1032
1033<sect1>Example
1034
1035<p>
1036
1037<code>
1038protocol ospf MyOSPF {
76c7efec
OF
1039 export filter {
1040 if source = RTS_BGP then {
1041 ospf_metric1 = 100;
1042 accept;
1043 }
1044 reject;
1045 };
8fd12e6b
OF
1046 area 0.0.0.0 {
1047 tick 8;
1048 interface "eth*" {
1049 cost 11;
1050 hello 15;
1051 priority 100;
1052 retransmit 7;
1053 authentication simple;
1054 password "aaa";
1055 };
1056 interface "ppp*" {
1057 cost 100;
1058 };
1059 };
1060 area 120 {
1061 stub yes;
1062 interface "-arc0" , "arc*" {
1063 type nonbroadcast;
1064 authentication none;
1065 wait 50;
1066 dead count 6;
1067 neighbors {
1068 192.168.120.1;
1069 192.168.120.2;
1070 192.168.120.10;
1071 };
1072 };
1073 };
1074}
1075</code>
1076
371adba6 1077<sect>Pipe
1b55b1a3 1078
371adba6 1079<sect1>Introduction
a2a3ced8
MM
1080
1081<p>The Pipe protocol serves as a link between two routing tables, allowing routes to be
1082passed from a table declared as primary (i.e., the one the pipe is connected using the
1083<cf/table/ configuration keyword) to the secondary one (declared using <cf/peer table/)
1084and vice versa, depending on what's allowed by the filters. Export filters control export
1085of routes from the primary table to the secondary one, import filters control the opposite
1086direction.
1087
326e33f5 1088<p>The primary use of multiple routing tables and the pipe protocol is for policy routing,
a2a3ced8
MM
1089where handling of a single packet doesn't depend only on its destination address, but also
1090on its source address, source interface, protocol type and other similar parameters.
326e33f5 1091In many systems (Linux 2.2 being a good example) the kernel allows to enforce routing policies
a2a3ced8
MM
1092by defining routing rules which choose one of several routing tables to be used for a packet
1093according to its parameters. Setting of these rules is outside the scope of BIRD's work
1094(you can use the <tt/ip/ command), but you can create several routing tables in BIRD,
1095connect them to the kernel ones, use filters to control which routes appear in which tables
1096and also you can employ the Pipe protocol to export a selected subset of one table in
1097another one.
1098
371adba6 1099<sect1>Configuration
a2a3ced8
MM
1100
1101<p><descrip>
1102 <tag>peer table <m/table/</tag> Define secondary routing table to connect to. The
1103 primary one is selected by the <cf/table/ keyword.
1104</descrip>
1105
371adba6 1106<sect1>Attributes
a2a3ced8
MM
1107
1108<p>The Pipe protocol doesn't define any route attributes.
1109
371adba6 1110<sect1>Example
a2a3ced8
MM
1111
1112<p>Let's consider a router which serves as a boundary router of two different autonomous
1113systems, each of them connected to a subset of interfaces of the router, having its own
1114exterior connectivity and wishing to use the other AS as a backup connectivity in case
1115of outage of its own exterior line.
1116
1117<p>Probably the simplest solution to this situation is to use two routing tables (we'll
1118call them <cf/as1/ and <cf/as2/) and set up kernel routing rules, so that packets having
1119arrived from interfaces belonging to the first AS will be routed according to <cf/as1/
1120and similarly for the second AS. Thus we have split our router to two logical routers,
1121each one acting on its own routing table, having its own routing protocols on its own
1122interfaces. In order to use the other AS's routes for backup purposes, we can pass
1123the routes between the tables through a Pipe protocol while decreasing their preferences
1124and correcting their BGP paths to reflect AS boundary crossing.
1125
1126<code>
1127table as1; # Define the tables
1128table as2;
1129
1130protocol kernel kern1 { # Synchronize them with the kernel
1131 table as1;
1132 kernel table 1;
1133}
1134
1135protocol kernel kern2 {
1136 table as2;
1137 kernel table 2;
1138}
1139
1140protocol bgp bgp1 { # The outside connections
1141 table as1;
1142 local as 1;
1143 neighbor 192.168.0.1 as 1001;
1144 export all;
1145 import all;
1146}
1147
1148protocol bgp bgp2 {
1149 table as2;
1150 local as 2;
1151 neighbor 10.0.0.1 as 1002;
1152 export all;
1153 import all;
1154}
1155
1156protocol pipe { # The Pipe
1157 table as1;
1158 peer table as2;
1159 export filter {
1160 if net ~ [ 1.0.0.0/8+] then { # Only AS1 networks
1161 if preference>10 then preference = preference-10;
1162 if source=RTS_BGP then bgp_path.prepend(1);
1163 accept;
1164 }
1165 reject;
1166 };
1167 import filter {
1168 if net ~ [ 2.0.0.0/8+] then { # Only AS2 networks
1169 if preference>10 then preference = preference-10;
1170 if source=RTS_BGP then bgp_path.prepend(2);
1171 accept;
1172 }
1173 reject;
1174 };
1175}
1176</code>
1177
1532a244 1178<sect>RIP
d37f899b 1179
371adba6 1180<sect1>Introduction
d37f899b 1181
1532a244
PM
1182<p>The RIP protocol (also sometimes called Rest In Pieces) is a simple protocol, where each router broadcasts (to all its neighbors)
1183distances to all networks it can reach. When a router hears distance to another network, it increments
d37f899b 1184it and broadcasts it back. Broadcasts are done in regular intervals. Therefore, if some network goes
1532a244
PM
1185unreachable, routers keep telling each other that its distance is the original distance plus 1 (actually, plus
1186interface metric, which is usually one). After some time, the distance reaches infinity (that's 15 in
1187RIP) and all routers know that network is unreachable. RIP tries to minimize situations where
a7c9f7c0 1188counting to infinity is necessary, because it is slow. Due to infinity being 16, you can't use
1532a244 1189RIP on networks where maximal distance is higher than 15 hosts. You can read more about rip at <HTMLURL
25696edb 1190URL="http://www.ietf.org/html.charters/rip-charter.html" name="http://www.ietf.org/html.charters/rip-charter.html">. Both IPv4
1532a244 1191and IPv6 versions of RIP are supported by BIRD, historical RIPv1 is
326e33f5 1192currently not fully supported.
440439e3 1193
1532a244
PM
1194<p>RIP is a very simple protocol, and it has a lot of shortcomings. Slow
1195convergence, big network load and inability to handle larger networks
440439e3 1196makes it pretty much obsolete in IPv4 world. (It is still usable on
1532a244
PM
1197very small networks.) It is widely used in IPv6 networks,
1198because there are no good implementations of OSPFv3.
d37f899b 1199
371adba6 1200<sect1>Configuration
d37f899b 1201
1532a244 1202<p>In addition to options common for all to other protocols, RIP supports the following ones:
d37f899b
PM
1203
1204<descrip>
1532a244
PM
1205 <tag/authentication none|password|md5/ selects authentication method to be used. <cf/none/ means that
1206 packets are not authenticated at all, <cf/password/ means that a plaintext password is embedded
1207 into each packet, and <cf/md5/ means that packets are authenticated using a md5 cryptographic
1208 hash. If you set authentication to not-none, it is a good idea to add <cf>passwords { }</cf>
0e7a720a 1209 section.
7581b81b 1210
1532a244
PM
1211 <tag>honor always|neighbor|never </tag>specifies when should requests for dumping routing table
1212 be honored. (Always, when sent from a host on a directly connected
1213 network or never.) Routing table updates are honored only from
2d6627a7 1214 neighbors, that is not configurable.
d37f899b
PM
1215</descrip>
1216
1217<p>There are two options that can be specified per-interface. First is <cf>metric</cf>, with
7581b81b 1218default one. Second is <cf>mode multicast|broadcast|quiet|nolisten|version1</cf>, it selects mode for
1b55b1a3 1219rip to work in. If nothing is specified, rip runs in multicast mode. <cf>version1</cf> is
1532a244
PM
1220currently equivalent to <cf>broadcast</cf>, and it makes RIP talk to a broadcast address even
1221through multicast mode is possible. <cf>quiet</cf> option means that RIP will not transmit
1222any periodic messages to this interface and <cf>nolisten</cf> means that RIP will send to this
1223interface but not listen to it.
d37f899b 1224
1532a244
PM
1225<p>The following options generally override behavior specified in RFC. If you use any of these
1226options, BIRD will no longer be RFC-compliant, which means it will not be able to talk to anything
1227other than equally configured BIRD. I have warned you.
d37f899b
PM
1228
1229<descrip>
0e7a720a 1230 <tag>port <M>number</M></tag>
d150c637 1231 selects IP port to operate on, default 520. (This is useful when testing BIRD, if you
1532a244 1232 set this to an address &gt;1024, you will not need to run bird with UID==0).
d37f899b 1233
0e7a720a 1234 <tag>infinity <M>number</M></tag>
1532a244 1235 selects the value of infinity, default is 16. Bigger values will make protocol convergence
d37f899b
PM
1236 even slower.
1237
0e7a720a 1238 <tag>period <M>number</M>
1532a244 1239 </tag>specifies the number of seconds between periodic updates. Default is 30 seconds. A lower
326e33f5
PM
1240 number will mean faster convergence but bigger network
1241 load. Do not use values lower than 10.
d37f899b 1242
f3b33928 1243 <tag>timeout time <M>number</M>
1532a244 1244 </tag>specifies how old route has to be to be considered unreachable. Default is 4*<cf/period/.
d37f899b 1245
f3b33928 1246 <tag>garbage time <M>number</M>
1532a244 1247 </tag>specifies how old route has to be to be discarded. Default is 10*<cf/period/.
d37f899b
PM
1248</descrip>
1249
371adba6 1250<sect1>Attributes
d37f899b 1251
1b55b1a3
MM
1252<p>RIP defines two route attributes:
1253
1254<descrip>
1255 <tag>int <cf/rip_metric/</tag> RIP metric of the route (ranging from 0 to <cf/infinity/).
1256 When routes from different RIP instances are available and all of them have the same
1257 preference, BIRD prefers the route with lowest <cf/rip_metric/.
1258
1259 <tag>int <cf/rip_tag/</tag> RIP route tag: a 16-bit number which can be used
1260 to carry additional information with the route (for example, an originating AS number
1261 in case of external routes).
1262</descrip>
1263
371adba6 1264<sect1>Example
1b55b1a3
MM
1265
1266<p><code>
d37f899b
PM
1267protocol rip MyRIP_test {
1268 debug all;
1269 port 1520;
326e33f5
PM
1270 period 10;
1271 garbage time 60;
22080a86
PM
1272 interface "eth0" { metric 3; mode multicast; }
1273 "eth1" { metric 2; mode broadcast; };
326e33f5 1274 honor neighbor;
d37f899b
PM
1275 authentication none;
1276 import filter { print "importing"; accept; };
1277 export filter { print "exporting"; accept; };
1278}
a0dd1c74 1279</code>
d37f899b 1280
371adba6 1281<sect>Static
1b55b1a3 1282
0e4789c2 1283<p>The Static protocol doesn't communicate with other routers in the network,
f8e2d916 1284but instead it allows you to define routes manually. This is often used for
79a2b697
MM
1285specifying how to forward packets to parts of the network which don't use
1286dynamic routing at all and also for defining sink routes (i.e., those
1287telling to return packets as undeliverable if they are in your IP block,
1288you don't have any specific destination for them and you don't want to send
1289them out through the default route to prevent routing loops).
1290
1291<p>There are three types of static routes: `classical' routes telling to
1292forward packets to a neighboring router, device routes specifying forwarding
1293to hosts on a directly connected network and special routes (sink, blackhole
1294etc.) which specify a special action to be done instead of forwarding the
1295packet.
1296
1297<p>When the particular destination is not available (the interface is down or
1298the next hop of the route is not a neighbor at the moment), Static just
326e33f5 1299uninstalls the route from the table it is connected to and adds it again as soon
a00c7a18 1300as the destination becomes adjacent again.
79a2b697 1301
79a2b697 1302<p>The Static protocol has no configuration options. Instead, the
326e33f5 1303definition of the protocol contains a list of static routes:
79a2b697
MM
1304
1305<descrip>
1306 <tag>route <m/prefix/ via <m/ip/</tag> Static route through
1307 a neighboring router.
1308 <tag>route <m/prefix/ via <m/"interface"/</tag> Static device
1309 route through an interface to hosts on a directly connected network.
1310 <tag>route <m/prefix/ drop|reject|prohibit</tag> Special routes
1311 specifying to drop the packet, return it as unreachable or return
1312 it as administratively prohibited.
1313</descrip>
1314
79a2b697
MM
1315<p>Static routes have no specific attributes.
1316
4f88ac47 1317<p>Example static config might look like this:
79a2b697
MM
1318
1319<p><code>
1320protocol static {
a00c7a18 1321 table testable; # Connect to a non-default routing table
79a2b697
MM
1322 route 0.0.0.0/0 via 62.168.0.13; # Default route
1323 route 62.168.0.0/25 reject; # Sink route
1324 route 10.2.0.0/24 via "arc0"; # Secondary network
1325}
1326</code>
1327
371adba6 1328<chapt>Problems
69477cad 1329
c184d9d0 1330<p>BIRD is relatively young system, and probably contains some
25696edb 1331bugs. You can report bugs at bird-users mailing list (<HTMLURL URL="mailto:bird-users@bird.network.cz" name="bird-users@bird.network.cz">), but before you do,
75317ab8 1332please make sure you have read available documentation, make sure are running latest version (available at <HTMLURL
25696edb 1333URL="ftp://bird.network.cz/pub/bird" name="bird.network.cz:/pub/bird">). (Of course, patch
326e33f5 1334which fixes the bug along with bug report is always welcome). If you
a7c9f7c0 1335want to use BIRD, join mailing list by sending
25696edb 1336<tt/subscribe bird-users/ to <HTMLURL URL="mailto:majordomo@bird.network.cz" name="majordomo@bird.network.cz">. Main home page of bird is <HTMLURL URL="http://bird.network.cz/" name="http://bird.network.cz/">. When
c184d9d0 1337trying to understand, what is going on, Internet standards are
25696edb 1338relevant reading; you can get them from <HTMLURL URL="ftp://ftp.rfc-editor.org/" name="ftp.rfc-editor.org"> (or nicely sorted version from <HTMLURL URL="ftp://atrey.karlin.mff.cuni.cz/pub/rfc" name="atrey.karlin.mff.cuni.cz:/pub/rfc">).
69477cad 1339
c184d9d0 1340<p><it/Good luck!/
69477cad 1341
371adba6 1342</book>
7581b81b 1343
a0dd1c74 1344<!--
75317ab8
MM
1345LocalWords: GPL IPv GateD BGPv RIPv OSPFv Linux sgml html dvi sgmltools Pavel
1346LocalWords: linuxdoc dtd descrip config conf syslog stderr auth ospf bgp Mbps
1347LocalWords: router's eval expr num birdc ctl unix if's enums bool int ip GCC
1348LocalWords: len ipaddress pxlen netmask enum bgppath bgpmask clist gw md eth
1349LocalWords: RTS printn quitbird iBGP AS'es eBGP RFC multiprotocol IGP Machek
4e8ec666
MM
1350LocalWords: EGP misconfigurations keepalive pref aggr aggregator BIRD's RTC
1351LocalWords: OS'es AS's multicast nolisten misconfigured UID blackhole MRTD
1352LocalWords: uninstalls ethernets IP binutils ANYCAST anycast dest RTD ICMP rfc
1353LocalWords: compat multicasts nonbroadcast pointopoint
3caca73f 1354 -->