Annotation of embedaddon/bird/doc/bird-5.html, revision 1.1.1.1
1.1 misho 1: <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
2: <HTML>
3: <HEAD>
4: <META NAME="GENERATOR" CONTENT="LinuxDoc-Tools 1.0.9">
5: <TITLE>BIRD User's Guide: Filters</TITLE>
6: <LINK HREF="bird-6.html" REL=next>
7: <LINK HREF="bird-4.html" REL=previous>
8: <LINK HREF="bird.html#toc5" REL=contents>
9: </HEAD>
10: <BODY>
11: <A HREF="bird-6.html">Next</A>
12: <A HREF="bird-4.html">Previous</A>
13: <A HREF="bird.html#toc5">Contents</A>
14: <HR>
15: <H2><A NAME="filters"></A> <A NAME="s5">5.</A> <A HREF="bird.html#toc5">Filters</A></H2>
16:
17: <H2><A NAME="filters-intro"></A> <A NAME="ss5.1">5.1</A> <A HREF="bird.html#toc5.1">Introduction</A>
18: </H2>
19:
20: <P>BIRD contains a simple programming language. (No, it can't yet read mail :-).
21: There are two objects in this language: filters and functions. Filters are
22: interpreted by BIRD core when a route is being passed between protocols and
23: routing tables. The filter language contains control structures such as if's and
24: switches, but it allows no loops. An example of a filter using many features can
25: be found in <CODE>filter/test.conf</CODE>.
26: <P>
27: <P>Filter gets the route, looks at its attributes and modifies some of them if
28: it wishes. At the end, it decides whether to pass the changed route through
29: (using <CODE>accept</CODE>) or whether to <CODE>reject</CODE> it. A simple filter looks like
30: this:
31: <P>
32: <HR>
33: <PRE>
34: filter not_too_far
35: int var;
36: {
37: if defined( rip_metric ) then
38: var = rip_metric;
39: else {
40: var = 1;
41: rip_metric = 1;
42: }
43: if rip_metric > 10 then
44: reject "RIP metric is too big";
45: else
46: accept "ok";
47: }
48: </PRE>
49: <HR>
50: <P>
51: <P>As you can see, a filter has a header, a list of local variables, and a body.
52: The header consists of the <CODE>filter</CODE> keyword followed by a (unique) name of
53: filter. The list of local variables consists of <CODE><I>type name</I>;</CODE>
54: pairs where each pair defines one local variable. The body consists of <CODE>{ <I>statements</I> }</CODE>. Each <I>statement</I> is terminated by a <CODE>;</CODE>. You
55: can group several statements to a single compound statement by using braces
56: (<CODE>{ <I>statements</I> }</CODE>) which is useful if you want to make a bigger
57: block of code conditional.
58: <P>
59: <P>BIRD supports functions, so that you don't have to repeat the same blocks of
60: code over and over. Functions can have zero or more parameters and they can have
61: local variables. Recursion is not allowed. Function definitions look like this:
62: <P>
63: <HR>
64: <PRE>
65: function name ()
66: int local_variable;
67: {
68: local_variable = 5;
69: }
70:
71: function with_parameters (int parameter)
72: {
73: print parameter;
74: }
75: </PRE>
76: <HR>
77: <P>
78: <P>Unlike in C, variables are declared after the <CODE>function</CODE> line, but before
79: the first <CODE>{</CODE>. You can't declare variables in nested blocks. Functions are
80: called like in C: <CODE>name(); with_parameters(5);</CODE>. Function may return
81: values using the <CODE>return <I>[expr]</I></CODE> command. Returning a value exits
82: from current function (this is similar to C).
83: <P>
84: <P>Filters are declared in a way similar to functions except they can't have
85: explicit parameters. They get a route table entry as an implicit parameter, it
86: is also passed automatically to any functions called. The filter must terminate
87: with either <CODE>accept</CODE> or <CODE>reject</CODE> statement. If there's a runtime error in
88: filter, the route is rejected.
89: <P>
90: <P>A nice trick to debug filters is to use <CODE>show route filter <I>name</I></CODE>
91: from the command line client. An example session might look like:
92: <P>
93: <HR>
94: <PRE>
95: pavel@bug:~/bird$ ./birdc -s bird.ctl
96: BIRD 0.0.0 ready.
97: bird> show route
98: 10.0.0.0/8 dev eth0 [direct1 23:21] (240)
99: 195.113.30.2/32 dev tunl1 [direct1 23:21] (240)
100: 127.0.0.0/8 dev lo [direct1 23:21] (240)
101: bird> show route ?
102: show route [<prefix>] [table <t>] [filter <f>] [all] [primary]...
103: bird> show route filter { if 127.0.0.5 ~ net then accept; }
104: 127.0.0.0/8 dev lo [direct1 23:21] (240)
105: bird>
106: </PRE>
107: <HR>
108: <P>
109: <P>
110: <H2><A NAME="data-types"></A> <A NAME="ss5.2">5.2</A> <A HREF="bird.html#toc5.2">Data types</A>
111: </H2>
112:
113: <P>Each variable and each value has certain type. Booleans, integers and enums
114: are incompatible with each other (that is to prevent you from shooting in the
115: foot).
116: <P>
117: <DL>
118: <DT><CODE>
119: <A NAME="type-bool"></A> bool</CODE><DD><P>This is a boolean type, it can have only two values, <CODE>true</CODE> and
120: <CODE>false</CODE>. Boolean is the only type you can use in <CODE>if</CODE> statements.
121: <P>
122: <DT><CODE>
123: <A NAME="type-int"></A> int</CODE><DD><P>This is a general integer type. It is an unsigned 32bit type; i.e., you
124: can expect it to store values from 0 to 4294967295. Overflows are not
125: checked. You can use <CODE>0x1234</CODE> syntax to write hexadecimal values.
126: <P>
127: <DT><CODE>
128: <A NAME="type-pair"></A> pair</CODE><DD><P>This is a pair of two short integers. Each component can have values
129: from 0 to 65535. Literals of this type are written as <CODE>(1234,5678)</CODE>.
130: The same syntax can also be used to construct a pair from two arbitrary
131: integer expressions (for example <CODE>(1+2,a)</CODE>).
132: <P>
133: <DT><CODE>
134: <A NAME="type-quad"></A> quad</CODE><DD><P>This is a dotted quad of numbers used to represent router IDs (and
135: others). Each component can have a value from 0 to 255. Literals of
136: this type are written like IPv4 addresses.
137: <P>
138: <DT><CODE>
139: <A NAME="type-string"></A> string</CODE><DD><P>This is a string of characters. There are no ways to modify strings in
140: filters. You can pass them between functions, assign them to variables
141: of type <CODE>string</CODE>, print such variables, use standard string
142: comparison operations (e.g. <CODE>=, !=, <, >, <=, >=</CODE>), but
143: you can't concatenate two strings. String literals are written as
144: <CODE>"This is a string constant"</CODE>. Additionally matching (<CODE>~,
145: !~</CODE>) operators could be used to match a string value against
146: a shell pattern (represented also as a string).
147: <P>
148: <DT><CODE>
149: <A NAME="type-ip"></A> ip</CODE><DD><P>This type can hold a single IP address. Depending on the compile-time
150: configuration of BIRD you are using, it is either an IPv4 or IPv6
151: address. IP addresses are written in the standard notation
152: (<CODE>10.20.30.40</CODE> or <CODE>fec0:3:4::1</CODE>). You can apply special operator
153: <CODE>.mask(<I>num</I>)</CODE> on values of type ip. It masks out all but
154: first <CODE><I>num</I></CODE> bits from the IP address. So
155: <CODE>1.2.3.4.mask(8) = 1.0.0.0</CODE> is true.
156: <P>
157: <DT><CODE>
158: <A NAME="type-prefix"></A> prefix</CODE><DD><P>This type can hold a network prefix consisting of IP address and prefix
159: length. Prefix literals are written as <CODE><I>ipaddress</I>/<I>pxlen</I></CODE>,
160: or <CODE><I>ipaddress</I>/<I>netmask</I></CODE>. There are two special
161: operators on prefixes: <CODE>.ip</CODE> which extracts the IP address from the
162: pair, and <CODE>.len</CODE>, which separates prefix length from the pair.
163: So <CODE>1.2.0.0/16.len = 16</CODE> is true.
164: <P>
165: <DT><CODE>
166: <A NAME="type-ec"></A> ec</CODE><DD><P>This is a specialized type used to represent BGP extended community
167: values. It is essentially a 64bit value, literals of this type are
168: usually written as <CODE>(<I>kind</I>, <I>key</I>, <I>value</I>)</CODE>, where
169: <CODE>kind</CODE> is a kind of extended community (e.g. <CODE>rt</CODE> / <CODE>ro</CODE> for a
170: route target / route origin communities), the format and possible values
171: of <CODE>key</CODE> and <CODE>value</CODE> are usually integers, but it depends on the
172: used kind. Similarly to pairs, ECs can be constructed using expressions
173: for <CODE>key</CODE> and <CODE>value</CODE> parts, (e.g. <CODE>(ro, myas, 3*10)</CODE>, where
174: <CODE>myas</CODE> is an integer variable).
175: <P>
176: <DT><CODE>
177: <A NAME="type-lc"></A> lc</CODE><DD><P>This is a specialized type used to represent BGP large community
178: values. It is essentially a triplet of 32bit values, where the first
179: value is reserved for the AS number of the issuer, while meaning of
180: remaining parts is defined by the issuer. Literals of this type are
181: written as <CODE>(123, 456, 789)</CODE>, with any integer values. Similarly to
182: pairs, LCs can be constructed using expressions for its parts, (e.g.
183: <CODE>(myas, 10+20, 3*10)</CODE>, where <CODE>myas</CODE> is an integer variable).
184: <P>
185: <DT><CODE>
186: <A NAME="type-set"></A> int|pair|quad|ip|prefix|ec|lc|enum set</CODE><DD><P>Filters recognize four types of sets. Sets are similar to strings: you
187: can pass them around but you can't modify them. Literals of type <CODE>int
188: set</CODE> look like <CODE> [ 1, 2, 5..7 ]</CODE>. As you can see, both simple
189: values and ranges are permitted in sets.
190: <P>For pair sets, expressions like <CODE>(123,*)</CODE> can be used to denote
191: ranges (in that case <CODE>(123,0)..(123,65535)</CODE>). You can also use
192: <CODE>(123,5..100)</CODE> for range <CODE>(123,5)..(123,100)</CODE>. You can also use
193: <CODE>*</CODE> and <CODE>a..b</CODE> expressions in the first part of a pair, note that
194: such expressions are translated to a set of intervals, which may be
195: memory intensive. E.g. <CODE>(*,4..20)</CODE> is translated to <CODE>(0,4..20),
196: (1,4..20), (2,4..20), ... (65535, 4..20)</CODE>.
197: <P>EC sets use similar expressions like pair sets, e.g. <CODE>(rt, 123,
198: 10..20)</CODE> or <CODE>(ro, 123, *)</CODE>. Expressions requiring the translation
199: (like <CODE>(rt, *, 3)</CODE>) are not allowed (as they usually have 4B range
200: for ASNs).
201: <P>Also LC sets use similar expressions like pair sets. You can use ranges
202: and wildcards, but if one field uses that, more specific (later) fields
203: must be wildcards. E.g., <CODE>(10, 20..30, *)</CODE> or <CODE>(10, 20, 30..40)</CODE>
204: is valid, while <CODE>(10, *, 20..30)</CODE> or <CODE>(10, 20..30, 40)</CODE> is not
205: valid.
206: <P>You can also use expressions for int, pair, EC and LC set values.
207: However, it must be possible to evaluate these expressions before daemon
208: boots. So you can use only constants inside them. E.g.
209: <P>
210: <HR>
211: <PRE>
212: define one=1;
213: define myas=64500;
214: int set odds;
215: pair set ps;
216: ec set es;
217:
218: odds = [ one, 2+1, 6-one, 2*2*2-1, 9, 11 ];
219: ps = [ (1,one+one), (3,4)..(4,8), (5,*), (6,3..6), (7..9,*) ];
220: es = [ (rt, myas, 3*10), (rt, myas+one, 0..16*16*16-1), (ro, myas+2, *) ];
221:
222: </PRE>
223: <HR>
224: <P>Sets of prefixes are special: their literals does not allow ranges, but
225: allows prefix patterns that are written
226: as <CODE><I>ipaddress</I>/<I>pxlen</I>{<I>low</I>,<I>high</I>}</CODE>.
227: Prefix <CODE><I>ip1</I>/<I>len1</I></CODE> matches prefix
228: pattern <CODE><I>ip2</I>/<I>len2</I>{<I>l</I>,<I>h</I>}</CODE> if the
229: first <CODE>min(len1, len2)</CODE> bits of <CODE>ip1</CODE> and <CODE>ip2</CODE> are
230: identical and <CODE>len1 <= ip1 <= len2</CODE>. A valid prefix pattern
231: has to satisfy <CODE>low <= high</CODE>, but <CODE>pxlen</CODE> is not
232: constrained by <CODE>low</CODE> or <CODE>high</CODE>. Obviously, a prefix matches a
233: prefix set literal if it matches any prefix pattern in the prefix set
234: literal.
235: <P>There are also two shorthands for prefix patterns: <CODE><I>address</I>/<I>len</I>+</CODE>
236: is a shorthand for <CODE><I>address</I>/<I>len</I>{<I>len</I>,<I>maxlen</I>}</CODE>
237: (where <CODE><I>maxlen</I></CODE> is 32 for IPv4 and 128 for IPv6), that means
238: network prefix <CODE><I>address</I>/<I>len</I></CODE> and all its subnets.
239: <CODE><I>address</I>/<I>len</I>-</CODE> is a shorthand for
240: <CODE><I>address</I>/<I>len</I>{0,<I>len</I>}</CODE>, that means network prefix
241: <CODE><I>address</I>/<I>len</I></CODE> and all its supernets (network prefixes
242: that contain it).
243: <P>For example, <CODE>[ 1.0.0.0/8, 2.0.0.0/8+, 3.0.0.0/8-, 4.0.0.0/8{16,24}
244: ]</CODE> matches prefix <CODE>1.0.0.0/8</CODE>, all subprefixes of
245: <CODE>2.0.0.0/8</CODE>, all superprefixes of <CODE>3.0.0.0/8</CODE> and prefixes
246: <CODE>4.X.X.X</CODE> whose prefix length is 16 to 24. <CODE>[ 0.0.0.0/0{20,24} ]</CODE>
247: matches all prefixes (regardless of IP address) whose prefix length is
248: 20 to 24, <CODE>[ 1.2.3.4/32- ]</CODE> matches any prefix that contains IP
249: address <CODE>1.2.3.4</CODE>. <CODE>1.2.0.0/16 ~ [ 1.0.0.0/8{15,17} ]</CODE>
250: is true, but <CODE>1.0.0.0/16 ~ [ 1.0.0.0/8- ]</CODE> is false.
251: <P>Cisco-style patterns like <CODE>10.0.0.0/8 ge 16 le 24</CODE> can be expressed
252: in BIRD as <CODE>10.0.0.0/8{16,24}</CODE>, <CODE>192.168.0.0/16 le 24</CODE> as
253: <CODE>192.168.0.0/16{16,24}</CODE> and <CODE>192.168.0.0/16 ge 24</CODE> as
254: <CODE>192.168.0.0/16{24,32}</CODE>.
255: <P>
256: <DT><CODE>
257: <A NAME="type-enum"></A> enum</CODE><DD><P>Enumeration types are fixed sets of possibilities. You can't define your
258: own variables of such type, but some route attributes are of enumeration
259: type. Enumeration types are incompatible with each other.
260: <P>
261: <DT><CODE>
262: <A NAME="type-bgppath"></A> bgppath</CODE><DD><P>BGP path is a list of autonomous system numbers. You can't write
263: literals of this type. There are several special operators on bgppaths:
264: <P><CODE><I>P</I>.first</CODE> returns the first ASN (the neighbor ASN) in path <I>P</I>.
265: <P><CODE><I>P</I>.last</CODE> returns the last ASN (the source ASN) in path <I>P</I>.
266: <P><CODE><I>P</I>.last_nonaggregated</CODE> returns the last ASN in the non-aggregated part of the path <I>P</I>.
267: <P>Both <CODE>first</CODE> and <CODE>last</CODE> return zero if there is no appropriate
268: ASN, for example if the path contains an AS set element as the first (or
269: the last) part. If the path ends with an AS set, <CODE>last_nonaggregated</CODE>
270: may be used to get last ASN before any AS set.
271: <P><CODE><I>P</I>.len</CODE> returns the length of path <I>P</I>.
272: <P><CODE>prepend(<I>P</I>,<I>A</I>)</CODE> prepends ASN <I>A</I> to path <I>P</I> and
273: returns the result.
274: <P><CODE>delete(<I>P</I>,<I>A</I>)</CODE> deletes all instances of ASN <I>A</I> from
275: from path <I>P</I> and returns the result. <I>A</I> may also be an integer
276: set, in that case the operator deletes all ASNs from path <I>P</I> that are
277: also members of set <I>A</I>.
278: <P><CODE>filter(<I>P</I>,<I>A</I>)</CODE> deletes all ASNs from path <I>P</I> that are
279: not members of integer set <I>A</I>. I.e., <CODE>filter</CODE> do the same as
280: <CODE>delete</CODE> with inverted set <I>A</I>.
281: <P>Statement <CODE><I>P</I> = prepend(<I>P</I>, <I>A</I>);</CODE> can be shortened to
282: <CODE><I>P</I>.prepend(<I>A</I>);</CODE> if <I>P</I> is appropriate route attribute
283: (for example <CODE>bgp_path</CODE>). Similarly for <CODE>delete</CODE> and <CODE>filter</CODE>.
284: <P>
285: <DT><CODE>
286: <A NAME="type-bgpmask"></A> bgpmask</CODE><DD><P>BGP masks are patterns used for BGP path matching (using <CODE>path
287: ~ [= 2 3 5 * =]</CODE> syntax). The masks resemble wildcard patterns
288: as used by UNIX shells. Autonomous system numbers match themselves,
289: <CODE>*</CODE> matches any (even empty) sequence of arbitrary AS numbers and
290: <CODE>?</CODE> matches one arbitrary AS number. For example, if <CODE>bgp_path</CODE>
291: is 4 3 2 1, then: <CODE>bgp_path ~ [= * 4 3 * =]</CODE> is true,
292: but <CODE>bgp_path ~ [= * 4 5 * =]</CODE> is false. BGP mask
293: expressions can also contain integer expressions enclosed in parenthesis
294: and integer variables, for example <CODE>[= * 4 (1+2) a =]</CODE>. You can
295: also use ranges, for example <CODE>[= * 3..5 2 100..200 * =]</CODE>.
296: There is also old (deprecated) syntax that uses / .. / instead of [= .. =]
297: and ? instead of *.
298: <P>
299: <DT><CODE>
300: <A NAME="type-clist"></A> clist</CODE><DD><P>Clist is similar to a set, except that unlike other sets, it can be
301: modified. The type is used for community list (a set of pairs) and for
302: cluster list (a set of quads). There exist no literals of this type.
303: There are three special operators on clists:
304: <P><CODE><I>C</I>.len</CODE> returns the length of clist <I>C</I>.
305: <P><CODE>add(<I>C</I>,<I>P</I>)</CODE> adds pair (or quad) <I>P</I> to clist <I>C</I> and
306: returns the result. If item <I>P</I> is already in clist <I>C</I>, it does
307: nothing. <I>P</I> may also be a clist, in that case all its members are
308: added; i.e., it works as clist union.
309: <P><CODE>delete(<I>C</I>,<I>P</I>)</CODE> deletes pair (or quad) <I>P</I> from clist
310: <I>C</I> and returns the result. If clist <I>C</I> does not contain item
311: <I>P</I>, it does nothing. <I>P</I> may also be a pair (or quad) set, in that
312: case the operator deletes all items from clist <I>C</I> that are also
313: members of set <I>P</I>. Moreover, <I>P</I> may also be a clist, which works
314: analogously; i.e., it works as clist difference.
315: <P><CODE>filter(<I>C</I>,<I>P</I>)</CODE> deletes all items from clist <I>C</I> that are
316: not members of pair (or quad) set <I>P</I>. I.e., <CODE>filter</CODE> do the same
317: as <CODE>delete</CODE> with inverted set <I>P</I>. <I>P</I> may also be a clist, which
318: works analogously; i.e., it works as clist intersection.
319: <P>Statement <CODE><I>C</I> = add(<I>C</I>, <I>P</I>);</CODE> can be shortened to
320: <CODE><I>C</I>.add(<I>P</I>);</CODE> if <I>C</I> is appropriate route attribute (for
321: example <CODE>bgp_community</CODE>). Similarly for <CODE>delete</CODE> and <CODE>filter</CODE>.
322: <P>
323: <DT><CODE>
324: <A NAME="type-eclist"></A> eclist</CODE><DD><P>Eclist is a data type used for BGP extended community lists. Eclists
325: are very similar to clists, but they are sets of ECs instead of pairs.
326: The same operations (like <CODE>add</CODE>, <CODE>delete</CODE> or <CODE>~</CODE> and
327: <CODE>!~</CODE> membership operators) can be used to modify or test
328: eclists, with ECs instead of pairs as arguments.
329: <P>
330: <DT><CODE>lclist</CODE><DD><P>Lclist is a data type used for BGP large community lists. Like eclists,
331: lclists are very similar to clists, but they are sets of LCs instead of
332: pairs. The same operations (like <CODE>add</CODE>, <CODE>delete</CODE> or <CODE>~</CODE>
333: and <CODE>!~</CODE> membership operators) can be used to modify or test
334: lclists, with LCs instead of pairs as arguments.
335: </DL>
336: <P>
337: <P>
338: <H2><A NAME="operators"></A> <A NAME="ss5.3">5.3</A> <A HREF="bird.html#toc5.3">Operators</A>
339: </H2>
340:
341: <P>The filter language supports common integer operators <CODE>(+,-,*,/)</CODE>,
342: parentheses <CODE>(a*(b+c))</CODE>, comparison <CODE>(a=b, a!=b, a<b, a>=b)</CODE>.
343: Logical operations include unary not (<CODE>!</CODE>), and (<CODE>&&</CODE>) and or
344: (<CODE>||</CODE>). Special operators include (<CODE>~</CODE>,
345: <CODE>!~</CODE>) for "is (not) element of a set" operation - it can be used on
346: element and set of elements of the same type (returning true if element is
347: contained in the given set), or on two strings (returning true if first string
348: matches a shell-like pattern stored in second string) or on IP and prefix
349: (returning true if IP is within the range defined by that prefix), or on prefix
350: and prefix (returning true if first prefix is more specific than second one) or
351: on bgppath and bgpmask (returning true if the path matches the mask) or on
352: number and bgppath (returning true if the number is in the path) or on bgppath
353: and int (number) set (returning true if any ASN from the path is in the set) or
354: on pair/quad and clist (returning true if the pair/quad is element of the
355: clist) or on clist and pair/quad set (returning true if there is an element of
356: the clist that is also a member of the pair/quad set).
357: <P>
358: <P>There is one operator related to ROA infrastructure - <CODE>roa_check()</CODE>. It
359: examines a ROA table and does <A HREF="http://www.rfc-editor.org/info/rfc6483">RFC 6483</A> route origin validation for a
360: given network prefix. The basic usage is <CODE>roa_check(<I>table</I>)</CODE>, which
361: checks current route (which should be from BGP to have AS_PATH argument) in the
362: specified ROA table and returns ROA_UNKNOWN if there is no relevant ROA,
363: ROA_VALID if there is a matching ROA, or ROA_INVALID if there are some relevant
364: ROAs but none of them match. There is also an extended variant
365: <CODE>roa_check(<I>table</I>, <I>prefix</I>, <I>asn</I>)</CODE>, which allows to specify a
366: prefix and an ASN as arguments.
367: <P>
368: <P>
369: <H2><A NAME="control-structures"></A> <A NAME="ss5.4">5.4</A> <A HREF="bird.html#toc5.4">Control structures</A>
370: </H2>
371:
372: <P>Filters support two control structures: conditions and case switches.
373: <P>
374: <P>Syntax of a condition is: <CODE>if <I>boolean expression</I> then <I>command1</I>;
375: else <I>command2</I>;</CODE> and you can use <CODE>{ <I>command_1</I>; <I>command_2</I>;
376: <I>...</I> }</CODE> instead of either command. The <CODE>else</CODE> clause may be
377: omitted. If the <CODE><I>boolean expression</I></CODE> is true, <I>command1</I> is
378: executed, otherwise <I>command2</I> is executed.
379: <P>
380: <P>The <CODE>case</CODE> is similar to case from Pascal. Syntax is <CODE>case
381: <I>expr</I> { else: | <I>num_or_prefix [ .. num_or_prefix]</I>: <I>statement</I> ; [
382: ... ] }</CODE>. The expression after <CODE>case</CODE> can be of any type which can be
383: on the left side of the ~ operator and anything that could be a member of
384: a set is allowed before <CODE>:</CODE>. Multiple commands are allowed without <CODE>{}</CODE>
385: grouping. If <CODE><I>expr</I></CODE> matches one of the <CODE>:</CODE> clauses, statements
386: between it and next <CODE>:</CODE> statement are executed. If <CODE><I>expr</I></CODE> matches
387: neither of the <CODE>:</CODE> clauses, the statements after <CODE>else:</CODE> are executed.
388: <P>
389: <P>Here is example that uses <CODE>if</CODE> and <CODE>case</CODE> structures:
390: <P>
391: <HR>
392: <PRE>
393: case arg1 {
394: 2: print "two"; print "I can do more commands without {}";
395: 3 .. 5: print "three to five";
396: else: print "something else";
397: }
398:
399: if 1234 = i then printn "."; else {
400: print "not 1234";
401: print "You need {} around multiple commands";
402: }
403: </PRE>
404: <HR>
405: <P>
406: <P>
407: <H2><A NAME="route-attributes"></A> <A NAME="ss5.5">5.5</A> <A HREF="bird.html#toc5.5">Route attributes</A>
408: </H2>
409:
410: <P>A filter is implicitly passed a route, and it can access its attributes just
411: like it accesses variables. Attempts to access undefined attribute result in a
412: runtime error; you can check if an attribute is defined by using the
413: <CODE>defined( <I>attribute</I> )</CODE> operator. One notable exception to this
414: rule are attributes of clist type, where undefined value is regarded as empty
415: clist for most purposes.
416: <P>
417: <DL>
418: <DT><CODE>
419: <A NAME="rta-net"></A> <I>prefix</I> net</CODE><DD><P>Network the route is talking about. Read-only. (See the chapter about
420: routing tables.)
421: <P>
422: <DT><CODE>
423: <A NAME="rta-scope"></A> <I>enum</I> scope</CODE><DD><P>The scope of the route. Possible values: <CODE>SCOPE_HOST</CODE> for routes
424: local to this host, <CODE>SCOPE_LINK</CODE> for those specific for a physical
425: link, <CODE>SCOPE_SITE</CODE> and <CODE>SCOPE_ORGANIZATION</CODE> for private routes and
426: <CODE>SCOPE_UNIVERSE</CODE> for globally visible routes. This attribute is not
427: interpreted by BIRD and can be used to mark routes in filters. The
428: default value for new routes is <CODE>SCOPE_UNIVERSE</CODE>.
429: <P>
430: <DT><CODE>
431: <A NAME="rta-preference"></A> <I>int</I> preference</CODE><DD><P>Preference of the route. Valid values are 0-65535. (See the chapter
432: about routing tables.)
433: <P>
434: <DT><CODE>
435: <A NAME="rta-from"></A> <I>ip</I> from</CODE><DD><P>The router which the route has originated from.
436: <P>
437: <DT><CODE>
438: <A NAME="rta-gw"></A> <I>ip</I> gw</CODE><DD><P>Next hop packets routed using this route should be forwarded to.
439: <P>
440: <DT><CODE>
441: <A NAME="rta-proto"></A> <I>string</I> proto</CODE><DD><P>The name of the protocol which the route has been imported from.
442: Read-only.
443: <P>
444: <DT><CODE>
445: <A NAME="rta-source"></A> <I>enum</I> source</CODE><DD><P>what protocol has told me about this route. Possible values:
446: <CODE>RTS_DUMMY</CODE>, <CODE>RTS_STATIC</CODE>, <CODE>RTS_INHERIT</CODE>, <CODE>RTS_DEVICE</CODE>,
447: <CODE>RTS_STATIC_DEVICE</CODE>, <CODE>RTS_REDIRECT</CODE>, <CODE>RTS_RIP</CODE>, <CODE>RTS_OSPF</CODE>,
448: <CODE>RTS_OSPF_IA</CODE>, <CODE>RTS_OSPF_EXT1</CODE>, <CODE>RTS_OSPF_EXT2</CODE>, <CODE>RTS_BGP</CODE>,
449: <CODE>RTS_PIPE</CODE>, <CODE>RTS_BABEL</CODE>.
450: <P>
451: <DT><CODE>
452: <A NAME="rta-cast"></A> <I>enum</I> cast</CODE><DD><P>Route type (Currently <CODE>RTC_UNICAST</CODE> for normal routes,
453: <CODE>RTC_BROADCAST</CODE>, <CODE>RTC_MULTICAST</CODE>, <CODE>RTC_ANYCAST</CODE> will be used in
454: the future for broadcast, multicast and anycast routes). Read-only.
455: <P>
456: <DT><CODE>
457: <A NAME="rta-dest"></A> <I>enum</I> dest</CODE><DD><P>Type of destination the packets should be sent to
458: (<CODE>RTD_ROUTER</CODE> for forwarding to a neighboring router,
459: <CODE>RTD_DEVICE</CODE> for routing to a directly-connected network,
460: <CODE>RTD_MULTIPATH</CODE> for multipath destinations,
461: <CODE>RTD_BLACKHOLE</CODE> for packets to be silently discarded,
462: <CODE>RTD_UNREACHABLE</CODE>, <CODE>RTD_PROHIBIT</CODE> for packets that should be
463: returned with ICMP host unreachable / ICMP administratively prohibited
464: messages). Can be changed, but only to <CODE>RTD_BLACKHOLE</CODE>,
465: <CODE>RTD_UNREACHABLE</CODE> or <CODE>RTD_PROHIBIT</CODE>.
466: <P>
467: <DT><CODE>
468: <A NAME="rta-ifname"></A> <I>string</I> ifname</CODE><DD><P>Name of the outgoing interface. Sink routes (like blackhole, unreachable
469: or prohibit) and multipath routes have no interface associated with
470: them, so <CODE>ifname</CODE> returns an empty string for such routes. Read-only.
471: <P>
472: <DT><CODE>
473: <A NAME="rta-ifindex"></A> <I>int</I> ifindex</CODE><DD><P>Index of the outgoing interface. System wide index of the interface. May
474: be used for interface matching, however indexes might change on interface
475: creation/removal. Zero is returned for routes with undefined outgoing
476: interfaces. Read-only.
477: <P>
478: <DT><CODE>
479: <A NAME="rta-igp-metric"></A> <I>int</I> igp_metric</CODE><DD><P>The optional attribute that can be used to specify a distance to the
480: network for routes that do not have a native protocol metric attribute
481: (like <CODE>ospf_metric1</CODE> for OSPF routes). It is used mainly by BGP to
482: compare internal distances to boundary routers (see below). It is also
483: used when the route is exported to OSPF as a default value for OSPF type
484: 1 metric.
485: </DL>
486: <P>
487: <P>There also exist some protocol-specific attributes which are described in the
488: corresponding protocol sections.
489: <P>
490: <P>
491: <H2><A NAME="other-statements"></A> <A NAME="ss5.6">5.6</A> <A HREF="bird.html#toc5.6">Other statements</A>
492: </H2>
493:
494: <P>The following statements are available:
495: <P>
496: <DL>
497: <DT><CODE>
498: <A NAME="assignment"></A> <I>variable</I> = <I>expr</I></CODE><DD><P>Set variable to a given value.
499: <P>
500: <DT><CODE>
501: <A NAME="filter-accept-reject"></A> accept|reject [ <I>expr</I> ]</CODE><DD><P>Accept or reject the route, possibly printing <CODE><I>expr</I></CODE>.
502: <P>
503: <DT><CODE>
504: <A NAME="return"></A> return <I>expr</I></CODE><DD><P>Return <CODE><I>expr</I></CODE> from the current function, the function ends
505: at this point.
506: <P>
507: <DT><CODE>
508: <A NAME="print"></A> print|printn <I>expr</I> [<I>, expr...</I>]</CODE><DD><P>Prints given expressions; useful mainly while debugging filters. The
509: <CODE>printn</CODE> variant does not terminate the line.
510: <P>
511: <DT><CODE>
512: <A NAME="quitbird"></A> quitbird</CODE><DD><P>Terminates BIRD. Useful when debugging the filter interpreter.
513: </DL>
514: <P>
515: <P>
516: <HR>
517: <A HREF="bird-6.html">Next</A>
518: <A HREF="bird-4.html">Previous</A>
519: <A HREF="bird.html#toc5">Contents</A>
520: </BODY>
521: </HTML>
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>