summaryrefslogtreecommitdiff
path: root/doc
diff options
context:
space:
mode:
Diffstat (limited to 'doc')
-rw-r--r--doc/LinuxDocTools.pm2
-rw-r--r--doc/Makefile73
-rw-r--r--doc/bird.conf.example3
-rw-r--r--doc/bird.conf.example2267
-rw-r--r--doc/bird.sgml360
-rwxr-xr-xdoc/sgml2html8
-rwxr-xr-xdoc/sgml2latex8
-rwxr-xr-xdoc/sgml2txt8
8 files changed, 665 insertions, 64 deletions
diff --git a/doc/LinuxDocTools.pm b/doc/LinuxDocTools.pm
index 51d4a04c..39bb401d 100644
--- a/doc/LinuxDocTools.pm
+++ b/doc/LinuxDocTools.pm
@@ -372,6 +372,8 @@ sub process_file
}
}
#
+
+ local $ENV{PATH} = "$ENV{PATH}:/usr/lib/linuxdoc-tools";
my($precmd) = "|sgmlpre output=$global->{format} $global->{define}";
#
diff --git a/doc/Makefile b/doc/Makefile
index 70b73943..4e7e91eb 100644
--- a/doc/Makefile
+++ b/doc/Makefile
@@ -1,50 +1,49 @@
-root-rel=../
-dir-name=doc
-
-ifneq ($(wildcard ../Rules),)
-include ../Rules
-else
-srcdir=$(shell cd $(root-rel) ; pwd)
-srcdir_abs=$(srcdir)
-endif
-
# Force rebuilds
-.PHONY: prog.sgml bird.sgml
+.PHONY: progspell docs progdocs userdocs
+
+doc-srcdir := $(shell cd $(s) && pwd)
+sgml2 := $(doc-srcdir)/sgml2
docs: progdocs userdocs
-progdocs: prog.html prog.ps
-userdocs: bird.html bird.pdf
-prog.sgml:
- $(srcdir)/tools/progdoc $(srcdir_abs)
+doc-fmt = $(1): $(o)prog.$(1) $(o)bird.$(1)
+$(call doc-fmt,html)
+$(call doc-fmt,dvi)
+$(call doc-fmt,ps)
+$(call doc-fmt,pdf)
-%.html: %.sgml
- ./sgml2html $<
+progdocs: $(o)prog.html $(o)prog.pdf
+userdocs: $(o)bird.html $(o)bird.pdf
+progspell: $(o)prog.spell
-%.dvi: %.tex
- latex $<
- latex $<
+$(o)prog.sgml: $(srcdir)/tools/progdoc $(objdir)/.dir-stamp
+ $(srcdir)/tools/progdoc $(srcdir) $@
-%.ps: %.dvi
- dvips -D600 -ta4 -o $@ $<
+$(o)%.sgml: $(s)%.sgml $(objdir)/.dir-stamp
+ cp $< $@
-%.pdf: %.tex
- pdflatex $<
- pdflatex $<
+$(o)%.html: $(o)%.sgml
+ cd $(dir $@) && $(sgml2)html $(notdir $<)
-%.tex: %.sgml
- ./sgml2latex --output=tex $<
+$(o)%.tex: $(o)%.sgml
+ cd $(dir $@) && $(sgml2)latex --output=tex $(notdir $<)
+
+$(o)%.dvi: $(o)%.tex
+ cd $(dir $@) && TEXINPUTS=$(TEXINPUTS):$(doc-srcdir)/tex latex $(notdir $<)
+ cd $(dir $@) && TEXINPUTS=$(TEXINPUTS):$(doc-srcdir)/tex latex $(notdir $<)
+
+$(o)%.ps: $(o)%.dvi
+ dvips -D600 -ta4 -o $@ $<
-%.txt: %.sgml
- ./sgml2txt $<
+$(o)%.pdf: $(o)%.tex
+ pdflatex -output-directory=$(dir $@) $<
+ pdflatex -output-directory=$(dir $@) $<
-progspell: prog.sgml
- sed -f prog-spell.sed <prog.sgml >prog.spell
- ispell prog.spell
+$(o)%.txt: $(o)%.sgml
+ cd $(dir $@) && $(sgml2)txt $(notdir $<)
-clean:
- rm -f *.tex *.dvi *.log *.txt *.aux *.toc *.spell
- rm -f prog.sgml
+$(o)prog.spell: $(o)prog.sgml $(s)prog-spell.sed
+ sed -f $(lastword $^) <$< >$@
+ ispell $@
-distclean: clean
- rm -f *.html *.ps
+$(call clean,prog.spell $(addprefix *.,html dvi ps pdf sgml tex txt aux log toc))
diff --git a/doc/bird.conf.example b/doc/bird.conf.example
index bbfe0020..62c65ce9 100644
--- a/doc/bird.conf.example
+++ b/doc/bird.conf.example
@@ -1,5 +1,6 @@
/*
- * This is an example configuration file.
+ * This is an example configuration file
+ * (for version 1.x.x, obsolete)
*/
# Yes, even shell-like comments work...
diff --git a/doc/bird.conf.example2 b/doc/bird.conf.example2
new file mode 100644
index 00000000..6e8988b9
--- /dev/null
+++ b/doc/bird.conf.example2
@@ -0,0 +1,267 @@
+/*
+ * This is an example configuration file for MB-BGP setting
+ */
+
+
+log "bird.log" all;
+# debug protocols all;
+
+router id 192.168.1.1;
+
+ipv4 table master4;
+ipv6 table master6;
+
+ipv4 table mcast4;
+ipv6 table mcast6;
+
+flow4 table flowtab4;
+flow6 table flowtab6;
+
+
+protocol device {
+ scan time 10;
+}
+
+protocol kernel kernel4 {
+ scan time 20;
+
+ ipv4 {
+ export all;
+ };
+}
+
+protocol kernel kernel6 {
+ scan time 20;
+
+ ipv6 {
+ export all;
+ };
+}
+
+
+protocol static static4 {
+ ipv4;
+
+ route 10.10.0.0/24 via 192.168.1.2;
+ route 10.10.1.0/24 via 192.168.1.2 { bgp_large_community.add((10,20,30)); bgp_large_community.add((10,(20*3),10)); };
+}
+
+protocol static static6 {
+ ipv6;
+
+ route 2001:db8:10:10::/64 via 2001:db8:1:1::10;
+ route 2001:db8:10:11::/64 via 2001:db8:1:1::10;
+
+ route 2001:db8:1:1::/64 via fe80::ec9b:67ff:fe60:fd5d % ve1;
+}
+
+# RFC 5575 flow specification
+protocol static flowstat4 {
+ flow4;
+
+ route flow4 {
+ dst 10.0.0.0/8;
+ proto = 23;
+ dport > 24 && < 30 || 40..50,60..70,80;
+ sport > 24 && < 30 || = 40 || 50,60..70,80;
+ icmp type 80;
+ icmp code 90;
+ tcp flags 0x03/0x0f;
+ length 2048..65535;
+ dscp = 63;
+ fragment dont_fragment, is_fragment || !first_fragment;
+ } drop;
+
+ route flow4 {
+ dst 11.0.0.0/8;
+ proto = 0x12;
+ sport > 0x5678 && < 0x9abc || 0xdef0 || 0x1234,0x5678,0x9abc..0xdef0;
+ dport = 50;
+ tcp flags 0xabcd/0xbbdd;
+ } drop;
+
+ route flow4 {
+ dst 12.0.0.0/32;
+ tcp flags ! 0 / 0x9999;
+ } drop;
+
+ route flow4 {
+ dst 220.0.254.0/24;
+ tcp flags 0x99 / 0x9999;
+ } drop;
+
+ route flow4 {
+ dst 220.0.254.192/28;
+ tcp flags !0xffff / 0xFFFF;
+ } drop;
+
+ route flow4 {
+ dst 15.0.0.0/8;
+ tcp flags !0x9999/0x9999;
+ } drop;
+}
+
+protocol static flowstat6 {
+ flow6;
+
+ route flow6 {
+ dst fec0:1122:3344:5566::1/128;
+ src 0000:0000:0000:0001:1234:5678:9800:0000/101 offset 63;
+ next header = 23;
+ sport 24..30, 42 || 50,60,70..80;
+ dport = 50;
+ tcp flags 0x03/0x0f, !0/0xff || 0x33/0x33;
+ fragment !is_fragment || !first_fragment;
+ label 0xaaaa/0xaaaa && 0x33/0x33;
+ } drop;
+
+ route flow6 {
+ dst fec0:1122:3344:5566::1/128;
+ src ::1:1234:5678:9800:0/101 offset 63;
+ next header = 23;
+ dport = 50;
+ sport > 24 && < 30 || = 40 || = 50 || = 60 || >= 70 && <= 80;
+ tcp flags 0x3/0x3 && 0x0/0xc;
+ } drop;
+}
+
+
+protocol pipe {
+ table master4;
+ peer table mcast4;
+ import none;
+ export where source = RTS_OSPF;
+}
+
+protocol pipe {
+ table master6;
+ peer table mcast6;
+ import none;
+ export where source = RTS_OSPF;
+}
+
+protocol ospf2 ospf4 {
+# ecmp;
+
+ ipv4 {
+ import all;
+# export where source = RTS_STATIC;
+ };
+
+ area 0 {
+ interface "ve0" { stub; };
+ interface "ve1" { hello 5; type ptp; };
+ interface "ve2" { hello 5; type bcast; ttl security; };
+ interface "ve3" { hello 5; type bcast; ttl security; };
+ };
+}
+
+
+protocol ospf3 ospf6 {
+# ecmp;
+
+ ipv6 {
+ import all;
+# export where source = RTS_STATIC;
+ };
+
+ area 0 {
+ interface "ve0" { stub; };
+ interface "ve1" { hello 5; type ptp; };
+ interface "ve2" { hello 5; type bcast; };
+ };
+}
+
+protocol bgp {
+ local 192.168.11.1 as 1000;
+ neighbor 192.168.11.2 as 2000;
+# local 192.168.1.1 as 1000;
+# neighbor 192.168.2.1 as 2000;
+# multihop;
+# rr client;
+# strict bind;
+# debug all;
+
+ # regular IPv4 unicast (1/1)
+ ipv4 {
+ # connects to master4 table by default
+ import all;
+ export where source ~ [ RTS_STATIC, RTS_BGP ];
+ };
+
+ # regular IPv6 unicast (2/1)
+ ipv6 {
+ # connects to master6 table by default
+ import all;
+ export where source ~ [ RTS_STATIC, RTS_BGP ];
+# next hop address 2001:db8:1:1::1;
+ };
+
+ # IPv4 multicast topology (1/2)
+ ipv4 multicast {
+ # explicit IPv4 table
+ table mcast4;
+ import all;
+ export all;
+ };
+
+ # IPv6 multicast topology (2/2)
+ ipv6 multicast {
+ # explicit IPv6 table
+ table mcast6;
+ import all;
+ export all;
+# next hop address 2001:db8:1:1::1;
+ };
+
+ # IPv4 Flowspec (1/133)
+ flow4 {
+ # connects to flowtab4 table by default
+ import all;
+ export all;
+ };
+
+ # IPv6 Flowspec (2/133)
+ flow6 {
+ # connects to flowtab6 table by default
+ import all;
+ export all;
+ };
+}
+
+protocol bgp {
+ local 192.168.1.1 as 1000;
+ neighbor 192.168.3.1 as 1000;
+ multihop;
+ rr client;
+
+ ipv4 {
+ import all;
+ export where source ~ [ RTS_STATIC, RTS_BGP ];
+ };
+
+ ipv6 {
+ import all;
+ export where source ~ [ RTS_STATIC, RTS_BGP ];
+ next hop address 2001:db8:1:1::1;
+ };
+}
+
+protocol bgp {
+ local 2001:db8:1:1::1 as 1000;
+ neighbor 2001:db8:4:1::1 as 1000;
+ multihop;
+ rr client;
+
+ ipv4 {
+ import all;
+ export where source ~ [ RTS_STATIC, RTS_BGP ];
+ next hop address 192.168.4.1;
+ };
+
+ ipv6 {
+ import all;
+ export where source ~ [ RTS_STATIC, RTS_BGP ];
+ };
+}
+
diff --git a/doc/bird.sgml b/doc/bird.sgml
index 6af0e0f6..3ab9dee9 100644
--- a/doc/bird.sgml
+++ b/doc/bird.sgml
@@ -715,6 +715,137 @@ agreement").
</descrip>
+
+<sect>Flowspec network type
+<label id="flowspec-network-type">
+
+<p>The flow specification are rules for routers and firewalls for filtering
+purpose. It is described by <rfc id="5575">. There are 3 types of arguments:
+<m/inet4/ or <m/inet6/ prefixes, bitmasks matching expressions and numbers
+matching expressions.
+
+Bitmasks matching is written using <m/value/<cf>/</cf><m/mask/ or
+<cf/!/<m/value/<cf>/</cf><m/mask/ pairs. It means that <cf/(/<m/data/ <cf/&/
+<m/mask/<cf/)/ is or is not equal to <m/value/.
+
+Numbers matching is a matching sequence of numbers and ranges separeted by a
+commas (<cf/,/) (e.g. <cf/10,20,30/). Ranges can be written using double dots
+<cf/../ notation (e.g. <cf/80..90,120..124/). An alternative notation are
+sequence of one or more pairs of relational operators and values separated by
+logical operators <cf/&&/ or <cf/||/. Allowed relational operators are <cf/=/,
+<cf/!=/, <cf/</, <cf/<=/, <cf/>/, <cf/>=/, <cf/true/ and <cf/false/.
+
+<sect1>IPv4 Flowspec
+
+<p><descrip>
+ <tag><label id="flow-dst">dst <m/inet4/</tag>
+ Set a matching destination prefix (e.g. <cf>dst 192.168.0.0/16</cf>).
+ Only this option is mandatory in IPv4 Flowspec.
+
+ <tag><label id="flow-src">src <m/inet4/</tag>
+ Set a matching source prefix (e.g. <cf>src 10.0.0.0/8</cf>).
+
+ <tag><label id="flow-proto">proto <m/numbers-match/</tag>
+ Set a matching IP protocol numbers (e.g. <cf/proto 6/).
+
+ <tag><label id="flow-port">port <m/numbers-match/</tag>
+ Set a matching source or destination TCP/UDP port numbers (e.g.
+ <cf>port 1..1023,1194,3306</cf>).
+
+ <tag><label id="flow-dport">dport <m/numbers-match/</tag>
+ Set a mating destination port numbers (e.g. <cf>dport 49151</cf>).
+
+ <tag><label id="flow-sport">sport <m/numbers-match/</tag>
+ Set a matching source port numbers (e.g. <cf>sport = 0</cf>).
+
+ <tag><label id="flow-icmp-type">icmp type <m/numbers-match/</tag>
+ Set a matching type field number of an ICMP packet (e.g. <cf>icmp type
+ 3</cf>)
+
+ <tag><label id="flow-icmp-code">icmp code <m/numbers-match/</tag>
+ Set a matching code field number of an ICMP packet (e.g. <cf>icmp code
+ 1</cf>)
+
+ <tag><label id="flow-tcp-flags">tcp flags <m/bitmask-match/</tag>
+ Set a matching bitmask for TCP header flags (aka control bits) (e.g.
+ <cf>tcp flags 0x03/0x0f;</cf>).
+
+ <tag><label id="flow-length">length <m/numbers-match/</tag>
+ Set a matching packet length (e.g. <cf>length > 1500;</cf>)
+
+ <tag><label id="flow-dscp">dscp <m/numbers-match/</tag>
+ Set a matching DiffServ Code Point number (e.g. <cf>length > 1500;</cf>).
+
+ <tag><label id="flow-fragment">fragment <m/fragmentation-type/</tag>
+ Set a matching type of packet fragmentation. Allowed fragmentation
+ types are <cf/dont_fragment/, <cf/is_fragment/, <cf/first_fragment/,
+ <cf/last_fragment/ (e.g. <cf>fragment is_fragment &&
+ !dont_fragment</cf>).
+</descrip>
+
+<p><code>
+protocol static {
+ flow4;
+
+ route flow4 {
+ dst 10.0.0.0/8;
+ port > 24 && < 30 || 40..50,60..70,80 && >= 90;
+ tcp flags 0x03/0x0f;
+ length > 1024;
+ dscp = 63;
+ fragment dont_fragment, is_fragment || !first_fragment;
+ } drop;
+}
+</code>
+
+<sect1>Differences for IPv6 Flowspec
+
+<p>Flowspec IPv6 are same as Flowspec IPv4 with a few exceptions.
+<itemize>
+ <item>Prefixes <m/inet6/ can be specified not only with prefix length,
+ but with prefix <cf/offset/ <m/num/ too (e.g.
+ <cf>::1234:5678:9800:0000/101 offset 64</cf>). Offset means to don't
+ care of <m/num/ first bits.
+ <item>IPv6 Flowspec hasn't mandatory any flowspec component.
+ <item>In IPv6 packets, there is a matching the last next header value
+ for a matching IP protocol number (e.g. <cf>next header 6</cf>).
+ <item>It is not possible to set <cf>dont_fragment</cf> as a type of
+ packet fragmentation.
+</itemize>
+
+<p><descrip>
+ <tag><label id="flow6-dst">dst <m/inet6/ [offset <m/num/]</tag>
+ Set a matching destination IPv6 prefix (e.g. <cf>dst
+ ::1c77:3769:27ad:a11a/128 offset 64</cf>).
+
+ <tag><label id="flow6-src">src <m/inet6/ [offset <m/num/]</tag>
+ Set a matching source IPv6 prefix (e.g. <cf>src fe80::/64</cf>).
+
+ <tag><label id="flow6-next-header">next header <m/numbers-match/</tag>
+ Set a matching IP protocol numbers (e.g. <cf>next header != 6</cf>).
+
+ <tag><label id="flow6-label">label <m/bitmask-match/</tag>
+ Set a 20-bit bitmask for matching Flow Label field in IPv6 packets
+ (e.g. <cf>label 0x8e5/0x8e5</cf>).
+</descrip>
+
+<p><code>
+protocol static {
+ flow6;
+
+ route flow6 {
+ dst fec0:1122:3344:5566:7788:99aa:bbcc:ddee/128;
+ src 0000:0000:0000:0001:1234:5678:9800:0000/101 offset 63;
+ next header = 23;
+ sport > 24 && < 30 || = 40 || 50,60,70..80;
+ dport = 50;
+ tcp flags 0x03/0x0f, !0/0xff || 0x33/0x33;
+ fragment !is_fragment || !first_fragment;
+ label 0xaaaa/0xaaaa && 0x33/0x33;
+ } drop;
+}
+</code>
+
<chapt>Remote control
<label id="remote-control">
@@ -1253,7 +1384,7 @@ foot).
<cf/!&tilde;/ membership operators) can be used to modify or test
eclists, with ECs instead of pairs as arguments.
- <tag/lclist/
+ <tag><label id="type-lclist">lclist/</tag>
Lclist is a data type used for BGP large community lists. Like eclists,
lclists are very similar to clists, but they are sets of LCs instead of
pairs. The same operations (like <cf/add/, <cf/delete/ or <cf/&tilde;/
@@ -1814,12 +1945,11 @@ avoid routing loops.
<p>BIRD supports all requirements of the BGP4 standard as defined in
<rfc id="4271"> It also supports the community attributes (<rfc id="1997">),
-capability negotiation (<rfc id="5492">), MD5 password authentication (<rfc
-id="2385">), extended communities (<rfc id="4360">), route reflectors (<rfc
-id="4456">), graceful restart (<rfc id="4724">), multiprotocol extensions
-(<rfc id="4760">), 4B AS numbers (<rfc id="4893">), and 4B AS numbers in
-extended communities (<rfc id="5668">).
-
+capability negotiation (<rfc id="5492">), MD5 password authentication
+(<rfc id="2385">), extended communities (<rfc id="4360">), route reflectors
+(<rfc id="4456">), AS confederations (<rfc id="5065">), graceful restart
+(<rfc id="4724">), multiprotocol extensions (<rfc id="4760">), 4B AS numbers
+(<rfc id="4893">), and 4B AS numbers in extended communities (<rfc id="5668">).
For IPv6, it uses the standard multiprotocol extensions defined in
<rfc id="4760"> and applied to IPv6 according to <rfc id="2545">.
@@ -1910,6 +2040,16 @@ using the following configuration parameters:
source address for the BGP session. Default: the address of the local
end of the interface our neighbor is connected to.
+ <tag><label id="bgp-strict-bind">strict bind <m/switch/</tag>
+ Specify whether BGP listening socket should be bound to a specific local
+ address (the same as the <cf/source address/) and associated interface,
+ or to all addresses. Binding to a specific address could be useful in
+ cases like running multiple BIRD instances on a machine, each using its
+ IP address. Note that listening sockets bound to a specific address and
+ to all addresses collide, therefore either all BGP protocols (of the
+ same address family and using the same local port) should have set
+ <cf/strict bind/, or none of them. Default: disabled.
+
<tag><label id="bgp-next-hop-self">next hop self</tag>
Avoid calculation of the Next Hop attribute and always advertise our own
source address as a next hop. This needs to be used only occasionally to
@@ -1982,7 +2122,7 @@ using the following configuration parameters:
Note that full (ICMP protection, for example) <rfc id="5082"> support is
provided by Linux only. Default: disabled.
- <tag><label id="bgp-pass">password <m/string/</tag>
+ <tag><label id="bgp-password">password <m/string/</tag>
Use this password for MD5 authentication of BGP sessions (<rfc id="2385">). When
used on BSD systems, see also <cf/setkey/ option below. Default: no
authentication.
@@ -2003,6 +2143,21 @@ using the following configuration parameters:
accepting incoming connections. In passive mode, outgoing connections
are not initiated. Default: off.
+ <tag><label id="bgp-confederation">confederation <m/number/</tag>
+ BGP confederations (<rfc id="5065">) are collections of autonomous
+ systems that act as one entity to external systems, represented by one
+ confederation identifier (instead of AS numbers). This option allows to
+ enable BGP confederation behavior and to specify the local confederation
+ identifier. When BGP confederations are used, all BGP speakers that are
+ members of the BGP confederation should have the same confederation
+ identifier configured. Default: 0 (no confederation).
+
+ <tag><label id="bgp-confederation-member">confederation member <m/switch/</tag>
+ When BGP confederations are used, this option allows to specify whether
+ the BGP neighbor is a member of the same confederation as the local BGP
+ speaker. The option is unnecessary (and ignored) for IBGP sessions, as
+ the same AS number implies the same confederation. Default: no.
+
<tag><label id="bgp-rr-client">rr client</tag>
Be a route reflector and treat the neighbor as a route reflection
client. Default: disabled.
@@ -2125,13 +2280,6 @@ using the following configuration parameters:
This option is relevant to IPv4 mode with enabled capability
advertisement only. Default: on.
- <tag><label id="bgp-route-limit">route limit <m/number/</tag>
- The maximal number of routes that may be imported from the protocol. If
- the route limit is exceeded, the connection is closed with an error.
- Limit is currently implemented as <cf>import limit <m/number/ action
- restart</cf>. This option is obsolete and it is replaced by
- <ref id="proto-import-limit" name="import limit option">. Default: no limit.
-
<tag><label id="bgp-disable-after-error">disable after error <m/switch/</tag>
When an error is encountered (either locally or by the other side),
disable the instance automatically and wait for an administrator to fix
@@ -3788,8 +3936,8 @@ protocol rip [&lt;name&gt;] {
<p>RIP defines two route attributes:
<descrip>
- <tag><label id="rta-rip-metric">int rip_metric/</tag>
- RIP metric of the route (ranging from 0 to <cf/infinity/). When routes
+ <tag>int <cf/rip_metric/</tag>
+ RIP metric of the route (ranging from 0 to <cf/infinity/). When routes
from different RIP instances are available and all of them have the same
preference, BIRD prefers the route with lowest <cf/rip_metric/. When a
non-RIP route is exported to RIP, the default metric is 1.
@@ -3819,6 +3967,184 @@ protocol rip {
}
</code>
+<sect>RPKI
+
+<sect1>Introduction
+
+<p>The Resource Public Key Infrastructure (RPKI) is mechanism for origin
+validation of BGP routes (RFC 6480). BIRD supports only so-called RPKI-based
+origin validation. There is implemented RPKI to Router (RPKI-RTR) protocol (RFC
+6810). It uses some of the RPKI data to allow a router to verify that the
+autonomous system announcing an IP address prefix is in fact authorized to do
+so. This is not crypto checked so can be violated. But it should prevent the
+vast majority of accidental hijackings on the Internet today, e.g. the famous
+Pakastani accidental announcement of YouTube's address space.
+
+<p>The RPKI-RTR protocol receives and maintains a set of ROAs from a cache
+server (also called validator). You can validate routes (RFC 6483) using
+function <cf/roa_check()/ in filter and set it as import filter at the BGP
+protocol. BIRD should re-validate all of affected routes after RPKI update by
+RFC 6811, but we don't support it yet! You can use a BIRD's client command
+<cf>reload in <m/bgp_protocol_name/</cf> for manual call of revalidation of all
+routes.
+
+<sect1>Supported transports
+<itemize>
+ <item>Unprotected transport over TCP uses a port 323. The cache server
+ and BIRD router should be on the same trusted and controlled network
+ for security reasons.
+ <item>SSHv2 encrypted transport connection uses the normal SSH port
+ 22.
+</itemize>
+
+<sect1>Configuration
+
+<p>We currently support just one cache server per protocol. However you can
+define more RPKI protocols generally.
+
+<code>
+protocol rpki [&lt;name&gt;] {
+ roa4 { table &lt;tab&gt;; };
+ roa6 { table &lt;tab&gt;; };
+ remote &lt;ip&gt; | "&lt;domain&gt;" [port &lt;num&gt;];
+ port &lt;num&gt;;
+ refresh [keep] &lt;num&gt;;
+ retry [keep] &lt;num&gt;;
+ expire [keep] &lt;num&gt;;
+ transport tcp;
+ transport ssh {
+ bird private key "&lt;/path/to/id_rsa&gt;";
+ remote public key "&lt;/path/to/known_host&gt;";
+ user "&lt;name&gt;";
+ };
+}
+</code>
+
+<p>Alse note that you have to specify ROA table into which will be imported
+routes from a cache server. If you want to import only IPv4 prefixes you have
+to specify only roa4 table. Similarly with IPv6 prefixes only. If you want to
+fetch both IPv4 and even IPv6 ROAs you have to specify both types of ROA
+tables.
+
+<sect2>RPKI protocol options
+
+<descrip>
+ <tag>remote <m/ip/ | "<m/hostname/" [port <m/num/]</tag> Specifies
+ a destination address of the cache server. Can be specified by an IP
+ address or by full domain name string. Only one cache can be specified
+ per protocol. This option is required.
+
+ <tag>port <m/num/</tag> Specifies the port number. The default port
+ number is 323 for transport without any encryption and 22 for transport
+ with SSH encryption.
+
+ <tag>refresh [keep] <m/num/</tag> Time period in seconds. Tells how
+ long to wait before next attempting to poll the cache using a Serial
+ Query or a Reset Query packet. Must be lower than 86400 seconds (one
+ day). Too low value can caused a false positive detection of
+ network connection problems. A keyword <cf/keep/ suppresses updating
+ this value by a cache server.
+ Default: 3600 seconds
+
+ <tag>retry [keep] <m/num/</tag> Time period in seconds between a failed
+ Serial/Reset Query and a next attempt. Maximum allowed value is 7200
+ seconds (two hours). Too low value can caused a false positive
+ detection of network connection problems. A keyword <cf/keep/
+ suppresses updating this value by a cache server.
+ Default: 600 seconds
+
+ <tag>expire [keep] <m/num/</tag> Time period in seconds. Received
+ records are deleted if the client was unable to successfully refresh
+ data for this time period. Must be in range from 600 seconds (ten
+ minutes) to 172800 seconds (two days). A keyword <cf/keep/
+ suppresses updating this value by a cache server.
+ Default: 7200 seconds
+
+ <tag>transport tcp</tag> Unprotected transport over TCP. It's a default
+ transport. Should be used only on secure private networks.
+ Default: tcp
+
+ <tag>transport ssh { <m/SSH transport options.../ }</tag> It enables a
+ SSHv2 transport encryption. Cannot be combined with a TCP transport.
+ Default: off
+</descrip>
+
+<sect3>SSH transport options
+<descrip>
+ <tag>bird private key "<m>/path/to/id_rsa</m>"</tag>
+ A path to the BIRD's private SSH key for authentication.
+ It can be a <cf><m>id_rsa</m></cf> file.
+
+ <tag>remote public key "<m>/path/to/known_host</m>"</tag>
+ A path to the cache's public SSH key for verification identity
+ of the cache server. It could be a path to <cf><m>known_host</m></cf> file.
+
+ <tag>user "<m/name/"</tag>
+ A SSH user name for authentication. This option is a required.
+</descrip>
+
+<sect1>Examples
+<sect2>BGP origin validation
+<p>Policy: Don't import <cf/ROA_INVALID/ routes.
+<code>
+roa4 table r4;
+roa6 table r6;
+
+protocol rpki {
+ debug all;
+
+ roa4 { table r4; };
+ roa6 { table r6; };
+
+ # Please, do not use rpki-validator.realmv6.org in production
+ remote "rpki-validator.realmv6.org" port 8282;
+
+ retry keep 5;
+ refresh keep 30;
+ expire 600;
+}
+
+filter peer_in {
+ if (roa_check(r4, net, bgp_path.last) = ROA_INVALID ||
+ roa_check(r6, net, bgp_path.last) = ROA_INVALID) then
+ {
+ print "Ignore invalid ROA ", net, " for ASN ", bgp_path.last;
+ reject;
+ }
+ accept;
+}
+
+protocol bgp {
+ debug all;
+ local as 65000;
+ neighbor 192.168.2.1 as 65001;
+ import filter peer_in;
+}
+</code>
+
+<sect2>SSHv2 transport encryption
+<code>
+roa4 table r4;
+roa6 table r6;
+
+protocol rpki {
+ debug all;
+
+ roa4 { table r4; };
+ roa6 { table r6; };
+
+ remote 127.0.0.1 port 2345;
+ transport ssh {
+ bird private key "/home/birdgeek/.ssh/id_rsa";
+ remote public key "/home/birdgeek/.ssh/known_hosts";
+ user "birdgeek";
+ };
+
+ # Default interval values
+}
+</code>
+
+
<sect>Static
<label id="static">
diff --git a/doc/sgml2html b/doc/sgml2html
index 774a03d5..a5bbee9e 100755
--- a/doc/sgml2html
+++ b/doc/sgml2html
@@ -17,8 +17,10 @@ use strict;
use vars qw($prefix $DataDir $BinDir $progs);
+use FindBin;
+
$prefix = "/usr";
-$DataDir = "sbase";
+$DataDir = "$FindBin::Bin/sbase";
$BinDir = "/usr/bin";
use lib "/usr/share/linuxdoc-tools";
@@ -32,9 +34,9 @@ $progs = {
"GROFFMACRO" => "-ms",
"AWK" => "/usr/share/linuxdoc-tools/awkwhich"
};
-$ENV{"SGML_CATALOG_FILES"} = "sbase/dtd/catalog";
+$ENV{"SGML_CATALOG_FILES"} = "$DataDir/dtd/catalog";
-require "./LinuxDocTools.pm";
+require "$FindBin::Bin/LinuxDocTools.pm";
&LinuxDocTools::init;
my @FileList = LinuxDocTools::process_options ("html", @ARGV);
diff --git a/doc/sgml2latex b/doc/sgml2latex
index 27aae4c8..02b60d94 100755
--- a/doc/sgml2latex
+++ b/doc/sgml2latex
@@ -17,8 +17,10 @@ use strict;
use vars qw($prefix $DataDir $BinDir $progs);
+use FindBin;
+
$prefix = "/usr";
-$DataDir = "sbase";
+$DataDir = "$FindBin::Bin/sbase";
$BinDir = "/usr/bin";
use lib "/usr/share/linuxdoc-tools";
@@ -32,9 +34,9 @@ $progs = {
"GROFFMACRO" => "-ms",
"AWK" => "/usr/share/linuxdoc-tools/awkwhich"
};
-$ENV{"SGML_CATALOG_FILES"} = "sbase/dtd/catalog";
+$ENV{"SGML_CATALOG_FILES"} = "$DataDir/dtd/catalog";
-require "./LinuxDocTools.pm";
+require "$FindBin::Bin/LinuxDocTools.pm";
&LinuxDocTools::init;
my @FileList = LinuxDocTools::process_options ("latex", @ARGV);
diff --git a/doc/sgml2txt b/doc/sgml2txt
index 90dc4855..dfc017de 100755
--- a/doc/sgml2txt
+++ b/doc/sgml2txt
@@ -17,8 +17,10 @@ use strict;
use vars qw($prefix $DataDir $BinDir $progs);
+use FindBin;
+
$prefix = "/usr";
-$DataDir = "sbase";
+$DataDir = "$FindBin::Bin/sbase";
$BinDir = "/usr/bin";
use lib "/usr/share/linuxdoc-tools";
@@ -32,9 +34,9 @@ $progs = {
"GROFFMACRO" => "-ms",
"AWK" => "/usr/share/linuxdoc-tools/awkwhich"
};
-$ENV{"SGML_CATALOG_FILES"} = "sbase/dtd/catalog";
+$ENV{"SGML_CATALOG_FILES"} = "$DataDir/dtd/catalog";
-require "./LinuxDocTools.pm";
+require "$FindBin::Bin/LinuxDocTools.pm";
&LinuxDocTools::init;
my @FileList = LinuxDocTools::process_options ("txt", @ARGV);