]> git.ipfire.org Git - thirdparty/bird.git/log
thirdparty/bird.git
22 months agoFilter: Improve handling of stack frames in filter bytecode
Ondrej Zajicek (work) [Wed, 9 Mar 2022 01:32:29 +0000 (02:32 +0100)] 
Filter: Improve handling of stack frames in filter bytecode

When f_line is done, we have to pop the stack frame. The old code just
removed nominal number of args/vars. Change it to use stored ventry value
modified by number of returned values. This allows to allocate variables
on a stack frame during execution of f_lines instead of just at start.

But we need to know the number of returned values for a f_line. It is 1
for term, 0 for cmd. Store that to f_line during linearization.

22 months agoFilter: Simplify handling of command sequences
Ondrej Zajicek (work) [Tue, 8 Mar 2022 23:31:39 +0000 (00:31 +0100)] 
Filter: Simplify handling of command sequences

Command sequences in curly braces used a separate nonterminal in grammar.
Handle them as a regular command.

22 months agoFilter: Fix bug in variable shadowing
Ondrej Zajicek (work) [Sun, 6 Mar 2022 21:57:33 +0000 (22:57 +0100)] 
Filter: Fix bug in variable shadowing

When a new variable used the same name as an existing symbol in an outer
scope, then offset number was defined based on a scope of the existing
symbol ($3) instead of a scope of the new symbol (sym_). That can lead
to two variables sharing the same memory slot.

22 months agoFilter: Implement soft scopes
Ondrej Zajicek (work) [Sun, 6 Mar 2022 15:37:30 +0000 (16:37 +0100)] 
Filter: Implement soft scopes

Soft scopes are anonymous scopes that most likely do not contain any
symbol, so allocating regular scope is postponed when it is really
needed.

22 months agoFilter: Implement direct recursion
Ondrej Zajicek (work) [Sun, 6 Mar 2022 01:18:01 +0000 (02:18 +0100)] 
Filter: Implement direct recursion

Direct recursion almost worked, just crashed on function signature check.
Split function parsing such that function signature is saved before
function body is processed. Recursive calls are marked so they can be
avoided during f_same() and similar code walking.

Also, include tower of hanoi solver as a test case.

22 months agoFilter: Apply constant promotion for FI_EQ / FI_NEQ
Ondrej Zajicek (work) [Fri, 4 Mar 2022 16:51:50 +0000 (17:51 +0100)] 
Filter: Apply constant promotion for FI_EQ / FI_NEQ

Equality comparison is defined on all values, even of different
types, but we still want to do constant promotion if possible.

22 months agoFilter: Add literal for empty set
Alexander Zubkov [Fri, 4 Mar 2022 13:07:58 +0000 (14:07 +0100)] 
Filter: Add literal for empty set

Add literal for empty set [], which works both for tree-based sets
and prefix sets by using existing constant promotion mechanism.

Minor changes by committer.

22 months agoNest: Cleanups in as_path_filter()
Ondrej Zajicek (work) [Fri, 4 Mar 2022 01:01:34 +0000 (02:01 +0100)] 
Nest: Cleanups in as_path_filter()

Use struct f_val as a common argument for as_path_filter(), as suggested
by Alexander Zubkov. That allows to use NULL sets as valid arguments.

22 months agoFilter: Ensure that all expressions declared return type
Ondrej Zajicek (work) [Thu, 3 Mar 2022 19:34:44 +0000 (20:34 +0100)] 
Filter: Ensure that all expressions declared return type

All instructions with a return value (i.e. expressions, ones with
non-zero outval, third argument in INST()) should declare their return
type. Check that automatically by M4 macros.

Set outval of FI_RETURN to 0. The instruction adds one value to stack,
but syntactically it is a statement, not an expression.

Add fake return type declaration to FI_CALL, otherwise the automatic
check would fail builds.

22 months agoFilter: Improve description of type system
Ondrej Zajicek (work) [Thu, 3 Mar 2022 14:11:05 +0000 (15:11 +0100)] 
Filter: Improve description of type system

22 months agoFilter: Implement type checks for function calls
Ondrej Zajicek (work) [Thu, 3 Mar 2022 02:38:12 +0000 (03:38 +0100)] 
Filter: Implement type checks for function calls

Keep list of function parameters in f_line and use it to verify
types of arguments for function calls. Only static type checks
are implemented.

22 months agoFilter: Clean up function call instruction
Ondrej Zajicek (work) [Tue, 1 Mar 2022 01:04:35 +0000 (02:04 +0100)] 
Filter: Clean up function call instruction

Pass instructions of function call arguments as vararg arguments to
FI_CALL instruction constructor and move necessary magic from parser
code to interpreter / instruction code.

22 months agoPreexport callback now takes the channel instead of protocol as argument next-preexport
Maria Matejka [Mon, 27 Jun 2022 17:04:22 +0000 (19:04 +0200)] 
Preexport callback now takes the channel instead of protocol as argument

Passing protocol to preexport was in fact a historical relic from the
old times when channels weren't a thing. Refactoring that to match
current extensibility needs.

23 months agoNEWS and version update v2.0.10
Ondrej Zajicek [Thu, 16 Jun 2022 00:58:37 +0000 (02:58 +0200)] 
NEWS and version update

23 months agoIPv4 flowspec literals should reject IPv6 prefices in a well-behaved way
Maria Matejka [Tue, 7 Jun 2022 08:35:48 +0000 (10:35 +0200)] 
IPv4 flowspec literals should reject IPv6 prefices in a well-behaved way

When writing flow4 { dst 2001:db8::dead:beef/128; }, BIRD crashed on an
not-well-debuggable segfault as it tried to copy the whole 128-bit
prefix into an IPv4-sized memory.

23 months agoBabel: Do not try to remove multicast seqno request objects from neighbour list
Ondrej Zajicek [Sun, 5 Jun 2022 02:03:43 +0000 (04:03 +0200)] 
Babel: Do not try to remove multicast seqno request objects from neighbour list

The Babel seqno request code keeps track of which seqno requests are
outstanding for a neighbour by putting them onto a per-neighbour list. When
reusing a seqno request, it will try to remove this node, but if the seqno
request in question was a multicast request with no neighbour attached this
will result in a crash because it tries to remove a list node that wasn't
added to any list.

Fix this by making the list remove conditional. Also fix neighbor removal
which were changing seqno requests to multicast ones instead of removing
them.

Fixes: ebd5751cdeb4 ("Babel: Seqno requests are properly decoupled from
neighbors when the underlying interface disappears").

Based on the patch from Toke Høiland-Jørgensen <toke@toke.dk>,
bug reported by Stefan Haller <stefan.haller@stha.de>, thanks.

23 months agoIO: Improve resolution of latency debugging messages
Ondrej Zajicek [Sat, 4 Jun 2022 15:54:08 +0000 (17:54 +0200)] 
IO: Improve resolution of latency debugging messages

23 months agoNest: Improve GC strategy for rtables
Ondrej Zajicek [Sat, 4 Jun 2022 15:34:57 +0000 (17:34 +0200)] 
Nest: Improve GC strategy for rtables

Use timer (configurable as 'gc period') to schedule routing table
GC/pruning to ensure that prune is done on time but not too often.

Randomize GC timers to avoid concentration of GC events from different
tables in one loop cycle.

Fix a bug that caused minimum inter-GC interval be 5 us instead of 5 s.

Make default 'gc period' adaptive based on number of routing tables,
from 10 s for small setups to 600 s for large ones.

In marge multi-table RS setup, the patch improved time of flushing
a downed peer from 20-30 min to <2 min and removed 40s latencies.

23 months agoCI: Remove broken FreeBSD builds
Ondrej Zajicek [Fri, 27 May 2022 14:07:24 +0000 (16:07 +0200)] 
CI: Remove broken FreeBSD builds

We currently do not have FreeBSD CI workers.

2 years agoBGP: Display neighbor port on show protocol
Ondrej Zajicek [Sat, 21 May 2022 14:21:34 +0000 (16:21 +0200)] 
BGP: Display neighbor port on show protocol

2 years agoRPKI: Display cache server port on show protocol
Ondrej Zajicek [Sat, 21 May 2022 14:03:08 +0000 (16:03 +0200)] 
RPKI: Display cache server port on show protocol

Thanks to Luiz Amaral for the idea.

2 years agoRPKI: Implement VRF support
Luiz Amaral [Thu, 19 May 2022 17:43:59 +0000 (19:43 +0200)] 
RPKI: Implement VRF support

2 years agoBGP: Improve tx performance during feed/flush
Ondrej Zajicek [Sun, 15 May 2022 13:05:13 +0000 (15:05 +0200)] 
BGP: Improve tx performance during feed/flush

The prefix hash table in BGP used the same hash function as the rtable.
When a batch of routes are exported during feed/flush to the BGP, they
all have similar hash values, so they are all crowded in a few slots in
the BGP prefix table (which is much smaller - around the size of the
batch - and uses higher bits from hash values), making it much slower due
to excessive collisions. Use a different hash function to avoid this.

Also, increase the batch size to fill 4k BGP packets and increase minimum
BGP bucket and prefix hash sizes to avoid back and forth resizing during
flushes.

This leads to order of magnitude faster flushes (on my test data).

2 years agoDoc: fix mating -> matching in flowspec section
Vincent Bernat [Fri, 22 Apr 2022 15:06:27 +0000 (17:06 +0200)] 
Doc: fix mating -> matching in flowspec section

2 years agoBabel: Fix compilation when LOCAL_DEBUG is set in packets.c
Toke Høiland-Jørgensen [Fri, 22 Apr 2022 15:04:56 +0000 (17:04 +0200)] 
Babel: Fix compilation when LOCAL_DEBUG is set in packets.c

The debug output was not updated with the rest of the code, so packets.c
fails to compile if LOCAL_DEBUG is set.

2 years agoBabel: Send out low-interval hello on shutdown
Toke Høiland-Jørgensen [Fri, 22 Apr 2022 14:41:52 +0000 (16:41 +0200)] 
Babel: Send out low-interval hello on shutdown

When shutting down a Babel instance we send a wildcard retraction to make
sure all peers can quickly switch to other route origins. Add another small
optimisation borrowed from babeld: sending a Hello message (along with the
retraction) with a very low interval.

This will cause neighbours to modify their expiry timers for the node's
state to quickly time it out, thus conserving resources in the network.

2 years agoFixed a munmap abort bug
Maria Matejka [Wed, 13 Apr 2022 09:28:15 +0000 (11:28 +0200)] 
Fixed a munmap abort bug

When BIRD was munmapping too many pages, it sometimes aborted, saying
that munmap failed with "Not enough memory" as the address space was
getting more and more fragmented.

There is a workaround in place, simply keeping that page for future use,
yet it has never been compiled in because I somehow forgot to include
errno.h. And because I also thought that somebody may have ENOMEM not
defined (why?!), there was a check which quietly omitted that
workaround.

Anyway, ENOMEM is POSIX. It's an utter nonsense to check for its
existence. If it doesn't exist, something is broken.

2 years agoBFD: Add 'strict bind' option
Ondrej Zajicek (work) [Thu, 7 Apr 2022 17:33:40 +0000 (19:33 +0200)] 
BFD: Add 'strict bind' option

Add BFD protocol option 'strict bind' to use separate listening socket
for each BFD interface bound to its address instead of using shared
listening sockets.

2 years agoNetlink: Remove superfluous sysdep/linux/netlink.c.orig
Ondrej Zajicek (work) [Wed, 16 Mar 2022 22:16:26 +0000 (23:16 +0100)] 
Netlink: Remove superfluous sysdep/linux/netlink.c.orig

Thanks to Vincent Bernat for notice.

2 years agoLib: Allow use of 240.0.0.0/4 as a private range
Ondrej Zajicek (work) [Wed, 16 Mar 2022 18:50:16 +0000 (19:50 +0100)] 
Lib: Allow use of 240.0.0.0/4 as a private range

There were several requests to allow use of 240.0.0.0/4 as a private
range, and Linux kernel already allows such routes, so perhaps we can
allow that too.

Thanks to Vincent Bernat and others for suggestion and patches.

2 years agoPkg: Improve RPM package unit file
Vincent Bernat [Fri, 11 Mar 2022 14:47:00 +0000 (15:47 +0100)] 
Pkg: Improve RPM package unit file

Update the RPM package unit file to check configuration before start and
to use "birdc configure" instead of "kill -HUP".

2 years agoClient: Use exit status to report errors
Ondrej Zajicek (work) [Fri, 11 Mar 2022 02:40:03 +0000 (03:40 +0100)] 
Client: Use exit status to report errors

When birdc is called with a command as an argument, it should set exit
status to non-zero when BIRD replied with an error reply code.

Thanks to Vincent Bernat and others for suggestion.

2 years agoSmall improvement in directory test
Ondrej Filip [Wed, 2 Mar 2022 09:52:09 +0000 (10:52 +0100)] 
Small improvement in directory test

2 years agoBabel: Fix bug in iface reconfiguration
Ondrej Zajicek (work) [Sun, 27 Feb 2022 02:10:38 +0000 (03:10 +0100)] 
Babel: Fix bug in iface reconfiguration

A recent change in Babel causes ifaces to disappear after
reconfiguration. The patch fixes that.

Thanks to Johannes Kimmel for an insightful bugreport.

2 years agoSmall change to fix doc building on Debian v2.0.9
Ondrej Filip [Sun, 20 Feb 2022 14:30:47 +0000 (15:30 +0100)] 
Small change to fix doc building on Debian

2 years agoSmall changes related to the new release
Ondrej Filip [Sun, 20 Feb 2022 13:28:06 +0000 (14:28 +0100)] 
Small changes related to the new release

2 years agoNEWS: Fix formatting and add some notes
Ondrej Zajicek (work) [Sun, 13 Feb 2022 15:45:49 +0000 (16:45 +0100)] 
NEWS: Fix formatting and add some notes

2 years agoNEWS and version update
Ondrej Zajicek (work) [Wed, 9 Feb 2022 02:47:49 +0000 (03:47 +0100)] 
NEWS and version update

2 years agoAlloc: Use posix_memalign() instead of aligned_alloc()
Ondrej Zajicek (work) [Tue, 8 Feb 2022 21:42:00 +0000 (22:42 +0100)] 
Alloc: Use posix_memalign() instead of aligned_alloc()

For compatibility with older systems use posix_memalign(). We can
switch to aligned_alloc() when we commit to C11 for multithreading.

2 years agoNetlink: Minor cleanup
Ondrej Zajicek (work) [Tue, 8 Feb 2022 21:21:08 +0000 (22:21 +0100)] 
Netlink: Minor cleanup

2 years agoLib: Update alignment of slabs
Ondrej Zajicek (work) [Mon, 7 Feb 2022 03:39:49 +0000 (04:39 +0100)] 
Lib: Update alignment of slabs

Alignment of slabs should be at least sizeof(ptr) to avoid unaligned
pointers in slab structures. Fixme: Use proper way to choose alignment
for internal allocators.

2 years agoMerge branch 'oz-trie-table'
Ondrej Zajicek (work) [Sun, 6 Feb 2022 22:32:15 +0000 (23:32 +0100)] 
Merge branch 'oz-trie-table'

2 years agoTrie: Fix trie format
Ondrej Zajicek (work) [Sun, 6 Feb 2022 21:53:55 +0000 (22:53 +0100)] 
Trie: Fix trie format

After switching to 16-way tries, trie format ignored unaligned / internal
prefixes and only reported the primary prefix of a trie node.

Fix trie format by showing internal prefixes based on the 'local' bitmask
of a node. Also do basic (intra-node) reconstruction of prefix patterns
by finding common subtrees in 'local' bitmask.

In future, we could improve that by doing inter-node reconstruction, so
prefixes entered as one pattern for a subtree (e.g. 192.168.0.0/18+)
would be reported as such, like with aligned prefixes.

2 years agoNest: Implement locking of prefix tries during walks
Ondrej Zajicek (work) [Fri, 4 Feb 2022 04:34:02 +0000 (05:34 +0100)] 
Nest: Implement locking of prefix tries during walks

The prune loop may may rebuild the prefix trie and therefore invalidate
walk state for asynchronous walks (used in 'show route in' cmd). Fix it
by adding locking that keeps the old trie in memory until current walks
are done.

In future this could be improved by rebuilding trie walk states (by
lookup for last found prefix) after the prefix trie rebuild.

2 years agoNest: Implement prefix trie pruning
Ondrej Zajicek (work) [Thu, 3 Feb 2022 05:08:51 +0000 (06:08 +0100)] 
Nest: Implement prefix trie pruning

When rtable is pruned and network fib nodes are removed, we also need to
prune prefix trie. Unfortunately, rebuilding prefix trie takes long time
(got about 400 ms for 1M networks), so must not be atomic, we have to
rebuild a new trie while current one is still active. That may require
some considerable amount of temporary memory, so we do that only if
we expect significant trie size reduction.

2 years agoTrie: Add prefix counter
Ondrej Zajicek (work) [Wed, 2 Feb 2022 04:06:49 +0000 (05:06 +0100)] 
Trie: Add prefix counter

Add counter of prefixes stored in trie. Works only for 'restricted' tries
composed of explicit prefixes (pxlen == l == h), like ones used in rtables.

2 years agoDoc: Describe routing table options
Ondrej Zajicek (work) [Fri, 31 Dec 2021 17:42:50 +0000 (18:42 +0100)] 
Doc: Describe routing table options

2 years agoBGP: Implement flowspec validation procedure
Ondrej Zajicek (work) [Mon, 20 Dec 2021 19:25:35 +0000 (20:25 +0100)] 
BGP: Implement flowspec validation procedure

Implement flowspec validation procedure as described in RFC 8955 sec. 6
and RFC 9117. The Validation procedure enforces that only routers in the
forwarding path for a network can originate flowspec rules for that
network.

The patch adds new mechanism for tracking inter-table dependencies, which
is necessary as the flowspec validation depends on IP routes, and flowspec
rules must be revalidated when best IP routes change.

The validation procedure is disabled by default and requires that
relevant IP table uses trie, as it uses interval queries for subnets.

2 years agoNest: Add routing table configuration blocks
Ondrej Zajicek (work) [Wed, 22 Dec 2021 03:32:26 +0000 (04:32 +0100)] 
Nest: Add routing table configuration blocks

Allow to specify sorted flag, trie fla, and min/max settle time.

Also do not enable trie by default, it must be explicitly enabled.

2 years agoNest: Add convenience functions to check rtable net type
Ondrej Zajicek (work) [Mon, 20 Dec 2021 19:44:36 +0000 (20:44 +0100)] 
Nest: Add convenience functions to check rtable net type

2 years agoNest: Avoid unnecessary net_format() in 'show route' command
Ondrej Zajicek (work) [Thu, 2 Dec 2021 03:05:17 +0000 (04:05 +0100)] 
Nest: Avoid unnecessary net_format() in 'show route' command

When output of 'show route' command was generated, the net_format() was
called for each network prematurely, even if the result was not needed.

Fix the code to call net_format() only when needed. This makes queries
that process many networks but show only few (e.g. 'show route where ..',
or 'show route count') much faster (like 5x - 10x faster).

2 years agoNest: Add trie iteration code to 'show route'
Ondrej Zajicek (work) [Thu, 2 Dec 2021 02:30:39 +0000 (03:30 +0100)] 
Nest: Add trie iteration code to 'show route'

Add trie iteration code to rt_show_cont() CLI hook and use it to
accelerate 'show route in <addr>' commands using interval queries.

2 years agoNest: Implement 'show route in <addr>' command
Ondrej Zajicek (work) [Thu, 2 Dec 2021 01:22:30 +0000 (02:22 +0100)] 
Nest: Implement 'show route in <addr>' command

Implement 'show route in <addr>' command, which shows all routes in
networks that are subnets of given network. Currently limited to IP
network types.

2 years agoNest: Attach prefix trie to rtable for faster LPM and interval queries
Ondrej Zajicek (work) [Mon, 29 Nov 2021 18:23:42 +0000 (19:23 +0100)] 
Nest: Attach prefix trie to rtable for faster LPM and interval queries

Attach a prefix trie to IP/VPN/ROA tables. Use it for net_route() and
net_roa_check(). This leads to 3-5x speedups for IPv4 and 5-10x
speedup for IPv6 of these calls.

TODO:
 - Rebuild the trie during rt_prune_table()
 - Better way to avoid trie_add_prefix() in net_get() for existing tables
 - Make it configurable (?)

2 years agoBGP: Make routing loops silent
Ondrej Zajicek (work) [Fri, 28 Jan 2022 17:13:18 +0000 (18:13 +0100)] 
BGP: Make routing loops silent

One of previous commits added error logging of invalid routes. This
also inadvertently caused error logging of route loops, which should
be ignored silently. Fix that.

2 years agoBGP: Use proper class in attribute error messages
Ondrej Zajicek (work) [Fri, 28 Jan 2022 04:35:22 +0000 (05:35 +0100)] 
BGP: Use proper class in attribute error messages

Most error messages in attribute processing are in rx/decode step and
these use L_REMOTE log class. But there are few that are in tx/export
step and these should use L_ERR log class.

Use tx-specific macro (REJECT()) in tx/export code and rename field
err_withdraw to err_reject in struct bgp_export_state to ensure that
appropriate error reporting macros are called in proper contexts.

2 years agoBGP: Improve 'invalid next hop' error reporting
Ondrej Zajicek (work) [Fri, 28 Jan 2022 04:03:03 +0000 (05:03 +0100)] 
BGP: Improve 'invalid next hop' error reporting

Distinguish multiple causes of 'invalid next hop' message and report
the relevant next hop address.

Thanks to Simon Ruderich for the original patch.

2 years agoBGP: Log route updates that were changed to withdraws
Ondrej Zajicek (work) [Mon, 24 Jan 2022 02:44:21 +0000 (03:44 +0100)] 
BGP: Log route updates that were changed to withdraws

Typical BGP error handling is treat-as-withdraw, where an invalid route
is replaced with a withdraw. Log route network when it happens.

2 years ago.gitlab-ci.yml: minor changes inside the .yml file.
Matous Holinka [Thu, 6 Jan 2022 08:53:23 +0000 (09:53 +0100)] 
.gitlab-ci.yml: minor changes inside the .yml file.

+ ubuntu:21.10 added into the pipeline,
- ubuntu:20.10 removed from the pipeline,

+ misc/docker/ubuntu-21.10-amd64/Dockerfile added,
- misc/docker/ubuntu-20.10-amd64/Dockerfile removed.

2 years agoNetlink: Add option to specify netlink socket receive buffer size
Ondrej Zajicek (work) [Mon, 17 Jan 2022 04:11:29 +0000 (05:11 +0100)] 
Netlink: Add option to specify netlink socket receive buffer size

Add option 'netlink rx buffer' to specify netlink socket receive buffer
size. Uses SO_RCVBUFFORCE, so it can override rmem_max limit.

Thanks to Trisha Biswas and Michal for the original patches.

2 years agoNetlink: Add another workaround for older kernel headers
Ondrej Zajicek (work) [Sat, 15 Jan 2022 21:39:40 +0000 (22:39 +0100)] 
Netlink: Add another workaround for older kernel headers

Unfortunately, SOL_NETLINK is both recently added and arch-dependent,
so we cannot just define it.

2 years agoNetlink: Add workaround for older kernel headers
Ondrej Zajicek (work) [Fri, 14 Jan 2022 22:15:05 +0000 (23:15 +0100)] 
Netlink: Add workaround for older kernel headers

2 years agoNetlink: Enable strict checking for KRT dumps
Ondrej Zajicek (work) [Fri, 14 Jan 2022 20:53:40 +0000 (21:53 +0100)] 
Netlink: Enable strict checking for KRT dumps

Add strict checking for netlink KRT dumps to avoid PMTU cache records
from FNHE table dump along with KRT.

Linux Kernel added FNHE table dump to the netlink API in patch:

https://patchwork.ozlabs.org/project/netdev/patch/8d3b68cd37fb5fddc470904cdd6793fcf480c6c1.1561131177.git.sbrivio@redhat.com/

Therefore, since Linux 5.3 these route cache entries are dumped together
with regular routes during periodic KRT scans, which in some cases may be
huge amount of useless data. This can be avoided by using strict checking
for netlink dumps:

https://lore.kernel.org/netdev/20181008031644.15989-1-dsahern@kernel.org/

The patch mitigates the risk of receiving unknown and potentially large
number of FNHE records that would block BIRD I/O in each sync. There is a
known issue caused by the GRE tunnels on Linux that seems to be creating
one FNHE record for each destination IP address that is routed through
the tunnel, even when the PMTU equals to GRE interface MTU.

Thanks to Tomas Hlavacek for the original patch.

2 years agoNetlink: Explicitly skip received cloned routes
Ondrej Zajicek (work) [Fri, 14 Jan 2022 18:07:57 +0000 (19:07 +0100)] 
Netlink: Explicitly skip received cloned routes

Kernel uses cloned routes to keep route cache entries, but reports them
together with regular routes. They were skipped implicitly as they
do not have rtm_protocol filled. Add explicit check for cloned flag
and skip such routes explicitly.

Also, improve debug logs of skipped routes.

2 years agoBGP: Add option 'free bind'
Ondrej Zajicek (work) [Sun, 9 Jan 2022 01:40:58 +0000 (02:40 +0100)] 
BGP: Add option 'free bind'

The BGP 'free bind' option applies the IP_FREEBIND/IPV6_FREEBIND
socket option for the BGP listening socket.

Thanks to Alexander Zubkov for the idea.

2 years agoIO: Support nonlocal bind in socket interface
Alexander Zubkov [Sat, 8 Jan 2022 17:31:56 +0000 (18:31 +0100)] 
IO: Support nonlocal bind in socket interface

Add option to socket interface for nonlocal binding, i.e. binding to an
IP address that is not present on interfaces. This behaviour is enabled
when SKF_FREEBIND socket flag is set. For Linux systems, it is
implemented by IP_FREEBIND socket flag.

Minor changes done by commiter.

2 years agoTest: Activate some remaining build tests
Ondrej Zajicek (work) [Wed, 5 Jan 2022 19:07:27 +0000 (20:07 +0100)] 
Test: Activate some remaining build tests

2 years agoNetlink: Do not ignore dead routes from BIRD
Ondrej Zajicek (work) [Wed, 5 Jan 2022 18:25:42 +0000 (19:25 +0100)] 
Netlink: Do not ignore dead routes from BIRD

Currently, BIRD ignores dead routes to consider them absent. But it also
ignores its own routes and thus it can not correctly manage such routes
in some cases. This patch makes an exception for routes with proto bird
when ignoring dead routes, so they can be properly updated or removed.

Thanks to Alexander Zubkov for the original patch.

2 years agoNetlink: Improve multipath parsing errors
Ondrej Zajicek (work) [Wed, 5 Jan 2022 17:46:41 +0000 (18:46 +0100)] 
Netlink: Improve multipath parsing errors

Function nl_parse_multipath() should handle errors internally.

2 years agoConf: Fix parsing full-length IPv6 addresses
Ondrej Zajicek (work) [Wed, 5 Jan 2022 15:38:49 +0000 (16:38 +0100)] 
Conf: Fix parsing full-length IPv6 addresses

Lexer expression for bytestring was too loose, accepting also
full-length IPv6 addresses. It should be restricted such that
colon is used between every byte or never.

Fix the regex and also add some test cases for it.

Thanks to Alexander Zubkov for the bugreport

2 years agogitlab-ci.yml: failing gitlab runner fixed.
Matous [Thu, 14 Oct 2021 10:16:46 +0000 (12:16 +0200)] 
gitlab-ci.yml: failing gitlab runner fixed.

'registry.labs.nic.cz' -> 'registry.nic.cz' changed

2 years agoDoc: Document min/max operators for lists
Alexander Zubkov [Tue, 28 Dec 2021 03:09:36 +0000 (04:09 +0100)] 
Doc: Document min/max operators for lists

2 years agoFilter: Add operators to find minimum and maximum element of sets
Alexander Zubkov [Tue, 28 Dec 2021 03:05:05 +0000 (04:05 +0100)] 
Filter: Add operators to find minimum and maximum element of sets

Add operators .min and .max to find minumum or maximum element in sets
of types: clist, eclist, lclist. Example usage:

bgp_community.min
bgp_ext_community.max
filter(bgp_large_community, [(as1, as2, *)]).min

Signed-off-by: Alexander Zubkov <green@qrator.net>
2 years agoDoc: Document community components access operators
Alexander Zubkov [Tue, 28 Dec 2021 02:48:42 +0000 (03:48 +0100)] 
Doc: Document community components access operators

2 years agoFilter: Add operators to pick community components
Alexander Zubkov [Tue, 28 Dec 2021 02:46:13 +0000 (03:46 +0100)] 
Filter: Add operators to pick community components

Add operators that can be used to pick components from
pair (standard community) or lc (large community) types.
For example:

(10, 20).asn --> 10
(10, 20).data --> 20

(10, 20, 30).asn --> 10
(10, 20, 30).data1 --> 20
(10, 20, 30).data2 --> 30

Signed-off-by: Alexander Zubkov <green@qrator.net>
2 years agoBSD: Assume onlink flag on ifaces with only host addresses
Ondrej Zajicek (work) [Mon, 27 Dec 2021 18:10:35 +0000 (19:10 +0100)] 
BSD: Assume onlink flag on ifaces with only host addresses

The BSD kernel does not support the onlink flag and BIRD does not use
direct routes for next hop validation, instead depends on interface
address ranges. We would like to handle PtMP cases with only host
addresses configured, like:

  ifconfig wg0 192.168.0.10/32
  route add 192.168.0.4 -iface wg0
  route add 192.168.0.8 -iface wg0

To accept BIRD routes with onlink next-hop, like:

  route 192.168.42.0/24 via 192.168.0.4%wg0 onlink

BIRD would dismiss the route when receiving from the kernel, as the
next-hop 192.168.0.4 is not part of any interface subnet and onlink
flag is not kept by the BSD kernel.

The commit fixes this by assuming that for routes received from the
kernel, any next-hop is onlink on ifaces with only host addresses.

Thanks to Stefan Haller for the original patch.

2 years agoRPKI: Add contextual out-of-bound checks in RTR Prefix PDU handler
Job Snijders [Sat, 18 Dec 2021 15:35:28 +0000 (16:35 +0100)] 
RPKI: Add contextual out-of-bound checks in RTR Prefix PDU handler

RFC 6810 and RFC 8210 specify that the "Max Length" value MUST NOT be
less than the Prefix Length element (underflow). On the other side,
overflow of the Max Length element also is possible, it being an 8-bit
unsigned integer allows for values larger than 32 or 128. This also
implicitly ensures there is no overflow of "Length" value.

When a PDU is received where the Max Length field is corrputed, the RTR
client (BIRD) should immediately terminate the session, flush all data
learned from that cache, and log an error for the operator.

Minor changes done by commiter.

2 years agoDoc: bgp: remove "advertise ipv4"
Simon Ruderich [Sat, 18 Dec 2021 02:17:48 +0000 (03:17 +0100)] 
Doc: bgp: remove "advertise ipv4"

The option was removed in d15b0b0a ("BGP redesign", 2016-12-07)
but the documentation wasn't updated.

2 years agoNest: Do not ignore secondary flag changes in ifa updates
Ondrej Zajicek (work) [Fri, 17 Dec 2021 23:58:47 +0000 (00:58 +0100)] 
Nest: Do not ignore secondary flag changes in ifa updates

Compare all IA_* flags that are set by sysdep iface code.

The old code ignores IA_SECONDARY flag when comparing whether iface
address updates from kernel changed anything. This is usually not an
issue as kernel removes all secondary addresses due to removal of the
primary one, but it breaks when sysctl 'promote_secondaries' is enabled
and kernel promotes secondary addresses to primary ones.

Thanks to 'Alexander' for the bugreport.

2 years agoTrie: Clarify handling of less-common net types
Ondrej Zajicek (work) [Mon, 29 Nov 2021 18:00:24 +0000 (19:00 +0100)] 
Trie: Clarify handling of less-common net types

For convenience, Trie functions generally accept as input values not only
NET_IPx types of nets, but also NET_VPNx and NET_ROAx types. But returned
values are always NET_IPx types.

2 years agoMemory statistics split into Effective and Overhead
Maria Matejka [Fri, 26 Nov 2021 23:21:12 +0000 (00:21 +0100)] 
Memory statistics split into Effective and Overhead

This feature is intended mostly for checking that BIRD's allocation
strategies don't consume much memory space. There are some cases where
withdrawing routes in a specific order lead to memory fragmentation and
this output should give the user at least a notion of how much memory is
actually used for data storage and how much memory is "just allocated"
or used for overhead.

Also raising the "system allocator overhead estimation" from 8 to 16
bytes; it is probably even more. I've found 16 as a local minimum in
best scenarios among reachable machines. I couldn't find any reasonable
method to estimate this value when BIRD starts up.

This commit also fixes the inaccurate computation of memory overhead for
slabs where the "system allocater overhead estimation" was improperly
added to the size of mmap-ed memory.

2 years agoTrie: Implement longest-prefix-match queries and walks
Ondrej Zajicek (work) [Fri, 26 Nov 2021 02:26:36 +0000 (03:26 +0100)] 
Trie: Implement longest-prefix-match queries and walks

The prefix trie now supports longest-prefix-match query by function
trie_match_longest_ipX() and it can be extended to iteration over all
covering prefixes for a given prefix (from longest to shortest) using
TRIE_WALK_TO_ROOT_IPx() macro.

2 years agoDirectly mapped pages are kept for future use if temporarily not needed
Maria Matejka [Wed, 24 Nov 2021 16:30:13 +0000 (17:30 +0100)] 
Directly mapped pages are kept for future use if temporarily not needed

2 years agoTrie: Implement trie walking code
Ondrej Zajicek (work) [Fri, 19 Nov 2021 17:04:32 +0000 (18:04 +0100)] 
Trie: Implement trie walking code

Trie walking allows enumeration of prefixes in a trie in the usual
lexicographic order. Optionally, trie enumeration can be restricted
to a chosen subnet (and its descendants).

2 years agoTrie: Simplify network matching code
Ondrej Zajicek (work) [Sat, 13 Nov 2021 20:11:18 +0000 (21:11 +0100)] 
Trie: Simplify network matching code

Introduce ipX_prefix_equal() and use it to simplify network matching code.

2 years agoConf: Fix crash during shutdown
Ondrej Zajicek (work) [Tue, 19 Oct 2021 23:51:28 +0000 (01:51 +0200)] 
Conf: Fix crash during shutdown

BIRD implements shutdown by reconfiguring to fake empty configuration.
Such fake config structure is created from the last running config and
shares some data, including symbol table. This allows access to (removed)
routing tables and causes crash when 'show route' command is used during
shutdown.

Clean up symbol table, table list and links to default tables, so removed
routing tables cannot be accessed during shutdown.

2 years agoFilter: Add prefix trie benchmarks
Ondrej Zajicek (work) [Sat, 25 Sep 2021 14:00:30 +0000 (16:00 +0200)] 
Filter: Add prefix trie benchmarks

Add trie tests intended as benchmarks that use external datasets
instead of generated prefixes. As datasets are not included, they
are commented out by default.

2 years agoFilter: Improve prefix trie tests
Ondrej Zajicek (work) [Tue, 21 Apr 2020 11:49:29 +0000 (13:49 +0200)] 
Filter: Improve prefix trie tests

Add tests explicitly matching insides and outsides of trie and update
tests to do testing of both IPv4 and IPv6 tries.

2 years agoFilter: Update trie documentation
Ondrej Zajicek (work) [Mon, 6 Apr 2020 12:20:16 +0000 (14:20 +0200)] 
Filter: Update trie documentation

2 years agoFilter: Fix trie test
Ondrej Zajicek (work) [Sun, 5 Apr 2020 01:56:07 +0000 (03:56 +0200)] 
Filter: Fix trie test

Generated prefixes must be valid.

2 years agoFilter: Faster prefix sets
Ondrej Zajicek (work) [Sun, 5 Apr 2020 01:24:46 +0000 (03:24 +0200)] 
Filter: Faster prefix sets

Use 16-way (4bit) branching in prefix trie instead of basic binary
branching. The change makes IPv4 prefix sets almost 3x faster, but
with more memory consumption and much more complicated algorithm.

Together with a previous filter change, it makes IPv4 prefix sets
about ~4.3x faster and slightly smaller (on my test data).

2 years agoNest: Clean up main channel handling 1/merge 23/merge
Ondrej Zajicek (work) [Thu, 17 Jun 2021 14:56:51 +0000 (16:56 +0200)] 
Nest: Clean up main channel handling

Remove assumption that main channel is the only channel.

2 years agoNest: Fix export of tmpattrs through pipes
Ondrej Zajicek (work) [Mon, 14 Jun 2021 18:02:50 +0000 (20:02 +0200)] 
Nest: Fix export of tmpattrs through pipes

Pipes copy the original rte with old values, so they require rte to be
exported with stored tmpattrs. Other protocols access stored attributes
using eattr list, so they require rte to be exported with expanded
tmpattrs. This is temporary hack, we plan to remove whoe tmpattr mechanism.

Thanks to Paul Donohue for the bugreport.

2 years agoRevert "Nest: Fix export of tmpattrs through pipes"
Ondrej Zajicek (work) [Mon, 14 Jun 2021 15:58:37 +0000 (17:58 +0200)] 
Revert "Nest: Fix export of tmpattrs through pipes"

This reverts commit f8e273b5e7a3c721f4a30cf27a0b4fe54602e83f.

2 years agoNest: Fix export of tmpattrs through pipes
Ondrej Zajicek (work) [Mon, 14 Jun 2021 14:30:59 +0000 (16:30 +0200)] 
Nest: Fix export of tmpattrs through pipes

In most cases of export there is no need to store back temporary
attributes to rte, as receivers (protocols) access eattr list anyway.
But pipe copies the original rte with old values, so we should store
tmpattrs also during export.

Thanks to Paul Donohue for the bugreport.

2 years agoCI: Allow Babel tests
Ondrej Zajicek (work) [Thu, 10 Jun 2021 23:31:10 +0000 (01:31 +0200)] 
CI: Allow Babel tests

2 years agoNest: Allow both 'password' and 'key' keywords for authentication keys
Ondrej Zajicek (work) [Wed, 9 Jun 2021 17:54:01 +0000 (19:54 +0200)] 
Nest: Allow both 'password' and 'key' keywords for authentication keys

2 years agoBabel: Simplify auth expiration
Ondrej Zajicek (work) [Wed, 9 Jun 2021 17:31:55 +0000 (19:31 +0200)] 
Babel: Simplify auth expiration

Just use hello_expiry for that, keep init_expiry for initial
unauthentized neighbors.

2 years agoNest: Fix password list parsing code
Ondrej Zajicek (work) [Sun, 6 Jun 2021 17:10:33 +0000 (19:10 +0200)] 
Nest: Fix password list parsing code

One of previous patches broke password list parsing code, fix that.

2 years agoLib: Fix static assert macro
Ondrej Zajicek (work) [Sun, 6 Jun 2021 15:23:45 +0000 (17:23 +0200)] 
Lib: Fix static assert macro