Updated docs about filters, and added fixme.
This commit is contained in:
parent
bd215f8bab
commit
70844a6a46
2 changed files with 63 additions and 3 deletions
|
@ -35,7 +35,7 @@ beggining of file. If you want to view documentation, you can either launch your
|
||||||
master copy (and hope that browser does not have incompatible extensions from our), or you can
|
master copy (and hope that browser does not have incompatible extensions from our), or you can
|
||||||
generate nice printed copy.
|
generate nice printed copy.
|
||||||
|
|
||||||
<h1>Bird configuration</h1>
|
<h1>Configuration</h1>
|
||||||
|
|
||||||
<p>Bird is configured using text configuration file. At startup, bird reads <TT file>bird.conf</TT>
|
<p>Bird is configured using text configuration file. At startup, bird reads <TT file>bird.conf</TT>
|
||||||
(unless -c command line parameter is given). Really simple configuration file might look like this:
|
(unless -c command line parameter is given). Really simple configuration file might look like this:
|
||||||
|
@ -68,7 +68,11 @@ protocol rip {
|
||||||
two objects in this language: filters and functions. Filters are called by bird core when route is
|
two objects in this language: filters and functions. Filters are called by bird core when route is
|
||||||
being passed between protocol and main routing table, and filters may call functions. Functions may
|
being passed between protocol and main routing table, and filters may call functions. Functions may
|
||||||
call other functions but recursion is not allowed. Filter language contains control structures such
|
call other functions but recursion is not allowed. Filter language contains control structures such
|
||||||
as if's and switches, but it allows no loops. Filters are interpretted.
|
as if's and switches, but it allows no loops. Filters are
|
||||||
|
interpretted. Filter using many features can be found in <TT file>filter/test.conf</TT>.
|
||||||
|
|
||||||
|
<p>There's one strange thing with filter language: it does not permit you to create loops. There's
|
||||||
|
no equivalent of while() or for() command, and recursive functions are not permitted.
|
||||||
|
|
||||||
<p pgm>You can find sources of filters language in <TT file>filter/</TT> directory. <TT
|
<p pgm>You can find sources of filters language in <TT file>filter/</TT> directory. <TT
|
||||||
file>filter/config.Y</TT> contains filter gramar, and basically translates source from user into
|
file>filter/config.Y</TT> contains filter gramar, and basically translates source from user into
|
||||||
|
@ -145,7 +149,9 @@ booleans (that is to prevent you from shooting in the foot).
|
||||||
but you can not modify them. Constant of type <TT filt>set int</TT> looks like <TT filt>
|
but you can not modify them. Constant of type <TT filt>set int</TT> looks like <TT filt>
|
||||||
[ 1, 2, 5..7 ]</TT>. As you can see, both simple values and ranges are permitted in
|
[ 1, 2, 5..7 ]</TT>. As you can see, both simple values and ranges are permitted in
|
||||||
sets. Sets of prefixes are special: you can specify which prefixes should match them by
|
sets. Sets of prefixes are special: you can specify which prefixes should match them by
|
||||||
using <TT filt>[ 1.0.0.0/8+, 2.0.0.0/8-, 3.0.0.0/8{5,6} ]</TT>.
|
using <TT filt>[ 1.0.0.0/8+, 2.0.0.0/8-, 3.0.0.0/8{5,6} ]</TT>. 3.0.0.0/8{5,6} matches
|
||||||
|
prefixes 3.X.X.X, whose prefixlength is 5 to 6. 3.0.0.0/8+ is shorthand for 3.0.0.0/{0,8},
|
||||||
|
3.0.0.0/8- is shorthand for 3.0.0.0/{0,7}.
|
||||||
|
|
||||||
<DT>enum
|
<DT>enum
|
||||||
<DD>enumerational types are halfway-internal in the bird. You can not define your own
|
<DD>enumerational types are halfway-internal in the bird. You can not define your own
|
||||||
|
@ -154,6 +160,58 @@ booleans (that is to prevent you from shooting in the foot).
|
||||||
protection.
|
protection.
|
||||||
</DL>
|
</DL>
|
||||||
|
|
||||||
|
<h2>Operations</h2>
|
||||||
|
|
||||||
|
<p>Filter language supports common integer operations (+,-,*,/), parenthesis (a*(b+c)), comparation
|
||||||
|
(a=b, a!=b, a<b, a>=b). Special operators include ~ for "in" operation. In operation can be
|
||||||
|
used on element and set of that elements, or on ip and prefix, or on prefix and prefix. Its result
|
||||||
|
is true if element is in given set or if ip adress is inside given prefix.
|
||||||
|
|
||||||
|
<h2>Functions</h2>
|
||||||
|
|
||||||
|
<p>Bird supports functions, so that you don't have to repeat same blocks of code over and
|
||||||
|
over. Functions can have zero or more parameters, and can have local variables. Function basically
|
||||||
|
looks like this:
|
||||||
|
|
||||||
|
<PRE filt>
|
||||||
|
function name ()
|
||||||
|
int local_variable;
|
||||||
|
{
|
||||||
|
local_variable = 5;
|
||||||
|
}
|
||||||
|
|
||||||
|
function with_parameters (int parameter)
|
||||||
|
{
|
||||||
|
print parameter;
|
||||||
|
}
|
||||||
|
</PRE>
|
||||||
|
|
||||||
|
<p>Unlike C, variables are declared after function line but before first {. You can not declare
|
||||||
|
variables in nested blocks. Functions are called like in C: <TT filt>name(); with_parameters(5);</TT>.
|
||||||
|
|
||||||
|
<p>Filters are declared in similar way to functions, except they can not have explicit
|
||||||
|
parameters. They get route table entry as implicit parameter.
|
||||||
|
|
||||||
|
<h2>Control structures</h2>
|
||||||
|
|
||||||
|
<p>Filters support two control structures: if/then/else and case. Syntax of if/then/else is <TT
|
||||||
|
filt>if <I>expression</I> then <I>command</I>; else <I>command</I>;<TT> and you can use <TT filt>{
|
||||||
|
<I>command_1</I>; <I>command_2</I>; <I>...</I> }</TT> instead of one or both commands. <TT
|
||||||
|
filt>else</TT> clause may be ommited. Case is used like this:
|
||||||
|
|
||||||
|
<PRE filt>
|
||||||
|
case <I>argument</I> {
|
||||||
|
2: print "dva"; print "jeste jednou dva";
|
||||||
|
3 .. 5: print "tri az pet";
|
||||||
|
else: print "neco jineho";
|
||||||
|
}
|
||||||
|
</PRE>
|
||||||
|
|
||||||
|
where <I>argument</I> is any argument that can be on the left side of ~ operator, and anything that
|
||||||
|
could be member of set is allowed before :. Multiple commands are allowed without {} grouping. If
|
||||||
|
argument matches neither of : clauses, else: clause is used. (Case is actually implemented as set
|
||||||
|
matching, internally.)
|
||||||
|
|
||||||
<h1>Protocols</h1>
|
<h1>Protocols</h1>
|
||||||
|
|
||||||
<h2>Rip</h2>
|
<h2>Rip</h2>
|
||||||
|
|
|
@ -10,6 +10,8 @@
|
||||||
FIXME: create community lists
|
FIXME: create community lists
|
||||||
FIXME: '! =' should not be permitted. Ze `!=' by nemelo byt totez jako `! =' Nadefinujes si pres %token novy token a do cf-lex.l pridas nove pravidlo, ktere jej rozpoznava. Napriklad != return NEQ;
|
FIXME: '! =' should not be permitted. Ze `!=' by nemelo byt totez jako `! =' Nadefinujes si pres %token novy token a do cf-lex.l pridas nove pravidlo, ktere jej rozpoznava. Napriklad != return NEQ;
|
||||||
FIXME: IP addresses in ipv6
|
FIXME: IP addresses in ipv6
|
||||||
|
|
||||||
|
FIXME: how can functions return value?
|
||||||
*/
|
*/
|
||||||
|
|
||||||
CF_HDR
|
CF_HDR
|
||||||
|
|
Loading…
Reference in a new issue