Skip to content
GitLab
Projects
Groups
Snippets
Help
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
B
BIRD Internet Routing Daemon
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Labels
Merge Requests
3
Merge Requests
3
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Operations
Operations
Environments
Packages & Registries
Packages & Registries
Container Registry
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Jobs
Commits
Open sidebar
labs
BIRD Internet Routing Daemon
Commits
1ec52253
Commit
1ec52253
authored
Nov 19, 2013
by
Ondřej Zajíček
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
BFD protocol, ready for release.
Supports OSPF and BGP and also statically configured sessions.
parent
0e175f9f
Changes
25
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
25 changed files
with
1044 additions
and
228 deletions
+1044
-228
aclocal.m4
aclocal.m4
+12
-0
configure.in
configure.in
+28
-7
doc/bird.sgml
doc/bird.sgml
+192
-3
lib/birdlib.h
lib/birdlib.h
+2
-0
lib/printf.c
lib/printf.c
+1
-1
nest/proto.c
nest/proto.c
+6
-1
proto/bfd/bfd.c
proto/bfd/bfd.c
+555
-130
proto/bfd/bfd.h
proto/bfd/bfd.h
+28
-14
proto/bfd/config.Y
proto/bfd/config.Y
+52
-30
proto/bfd/io.c
proto/bfd/io.c
+33
-3
proto/bfd/io.h
proto/bfd/io.h
+10
-1
proto/bfd/packets.c
proto/bfd/packets.c
+4
-33
proto/bgp/bgp.c
proto/bgp/bgp.c
+46
-2
proto/bgp/bgp.h
proto/bgp/bgp.h
+5
-0
proto/bgp/config.Y
proto/bgp/config.Y
+2
-1
proto/ospf/config.Y
proto/ospf/config.Y
+1
-0
proto/ospf/hello.c
proto/ospf/hello.c
+3
-0
proto/ospf/iface.c
proto/ospf/iface.c
+14
-0
proto/ospf/neighbor.c
proto/ospf/neighbor.c
+30
-0
proto/ospf/neighbor.h
proto/ospf/neighbor.h
+1
-0
proto/ospf/ospf.h
proto/ospf/ospf.h
+4
-0
proto/radv/radv.c
proto/radv/radv.c
+1
-1
sysdep/autoconf.h.in
sysdep/autoconf.h.in
+4
-0
sysdep/unix/io.c
sysdep/unix/io.c
+2
-0
sysdep/unix/log.c
sysdep/unix/log.c
+8
-1
No files found.
aclocal.m4
View file @
1ec52253
...
...
@@ -133,6 +133,18 @@ if test "$bird_cv_struct_ip_mreqn" = yes ; then
fi
])
AC_DEFUN(BIRD_CHECK_PTHREADS,
[
bird_tmp_cflags="$CFLAGS"
CFLAGS="$CFLAGS -pthread"
AC_CACHE_CHECK([whether POSIX threads are available], bird_cv_lib_pthreads,
[AC_LINK_IFELSE([AC_LANG_PROGRAM([[#include <pthread.h>]], [[pthread_t pt; pthread_create(&pt, NULL, NULL, NULL); pthread_spinlock_t lock; pthread_spin_lock(&lock); ]])],
[bird_cv_lib_pthreads=yes], [bird_cv_lib_pthreads=no])])
CFLAGS="$bird_tmp_cflags"
])
AC_DEFUN(BIRD_CHECK_GCC_OPTION,
[
bird_tmp_cflags="$CFLAGS"
...
...
configure.in
View file @
1ec52253
...
...
@@ -10,6 +10,7 @@ AC_ARG_ENABLE(debug, [ --enable-debug enable internal debugging routin
AC_ARG_ENABLE(memcheck, [ --enable-memcheck check memory allocations when debugging (default: enabled)],,enable_memcheck=yes)
AC_ARG_ENABLE(client, [ --enable-client enable building of BIRD client (default: enabled)],,enable_client=yes)
AC_ARG_ENABLE(ipv6, [ --enable-ipv6 enable building of IPv6 version (default: disabled)],,enable_ipv6=no)
AC_ARG_ENABLE(pthreads, [ --enable-pthreads enable POSIX threads support (default: detect)],,enable_pthreads=try)
AC_ARG_WITH(suffix, [ --with-suffix=STRING use specified suffix for BIRD files (default: 6 for IPv6 version)],[given_suffix="yes"])
AC_ARG_WITH(sysconfig, [ --with-sysconfig=FILE use specified BIRD system configuration file])
AC_ARG_WITH(protocols, [ --with-protocols=LIST include specified routing protocols (default: all)],,[with_protocols="all"])
...
...
@@ -47,11 +48,10 @@ AC_SUBST(runtimedir)
if test "$enable_ipv6" = yes ; then
ip=ipv6
SUFFIX=6
all_protocols=bfd,bgp,ospf,pipe,radv,rip,static
proto_radv=radv
else
ip=ipv4
SUFFIX=""
all_protocols=bfd,bgp,ospf,pipe,rip,static
fi
if test "$given_suffix" = yes ; then
...
...
@@ -59,10 +59,6 @@ if test "$given_suffix" = yes ; then
fi
AC_SUBST(SUFFIX)
if test "$with_protocols" = all ; then
with_protocols="$all_protocols"
fi
if test "$enable_debug" = yes ; then
CONFIG_FILE="bird$SUFFIX.conf"
CONTROL_SOCKET="bird$SUFFIX.ctl"
...
...
@@ -87,12 +83,29 @@ if test -z "$GCC" ; then
AC_MSG_ERROR([This program requires the GNU C Compiler.])
fi
if test "$enable_pthreads" != no ; then
BIRD_CHECK_PTHREADS
if test "$bird_cv_lib_pthreads" = yes ; then
AC_DEFINE(USE_PTHREADS)
CFLAGS="$CFLAGS -pthread"
LDFLAGS="$LDFLAGS -pthread"
proto_bfd=bfd
elif test "$enable_pthreads" = yes ; then
AC_MSG_ERROR([POSIX threads not available.])
fi
if test "$enable_pthreads" = try ; then
enable_pthreads="$bird_cv_lib_pthreads"
fi
fi
if test "$bird_cflags_default" = yes ; then
BIRD_CHECK_GCC_OPTION(bird_cv_c_option_wno_pointer_sign, -Wno-pointer-sign, -Wall)
BIRD_CHECK_GCC_OPTION(bird_cv_c_option_fno_strict_aliasing, -fno-strict-aliasing)
BIRD_CHECK_GCC_OPTION(bird_cv_c_option_fno_strict_overflow, -fno-strict-overflow)
CFLAGS="$CFLAGS -
pthread -
Wall -Wstrict-prototypes -Wno-parentheses"
CFLAGS="$CFLAGS -Wall -Wstrict-prototypes -Wno-parentheses"
BIRD_ADD_GCC_OPTION(bird_cv_c_option_wno_pointer_sign, -Wno-pointer-sign)
BIRD_ADD_GCC_OPTION(bird_cv_c_option_fno_strict_aliasing, -fno-strict-aliasing)
BIRD_ADD_GCC_OPTION(bird_cv_c_option_fno_strict_overflow, -fno-strict-overflow)
...
...
@@ -183,6 +196,13 @@ fi
AC_SUBST(iproutedir)
all_protocols="$proto_bfd bgp ospf pipe $proto_radv rip static"
all_protocols=`echo $all_protocols | sed 's/ /,/g'`
if test "$with_protocols" = all ; then
with_protocols="$all_protocols"
fi
AC_MSG_CHECKING([protocols])
protocols=`echo "$with_protocols" | sed 's/,/ /g'`
if test "$protocols" = no ; then protocols= ; fi
...
...
@@ -272,6 +292,7 @@ BIRD was configured with the following options:
Iproute2 directory: $iproutedir
System configuration: $sysdesc
Debugging: $enable_debug
POSIX threads: $enable_pthreads
Routing protocols: $protocols
Client: $enable_client
EOF
...
...
doc/bird.sgml
View file @
1ec52253
...
...
@@ -1244,6 +1244,178 @@ undefined value is regarded as empty clist for most purposes.
<chapt>Protocols
<sect><label id="sect-bfd">BFD
<sect1>Introduction
<p>Bidirectional Forwarding Detection (BFD) is not a routing protocol itself, it
is an independent tool providing liveness and failure detection. Routing
protocols like OSPF and BGP use integrated periodic "hello" messages to monitor
liveness of neighbors, but detection times of these mechanisms are high (e.g. 40
seconds by default in OSPF, could be set down to several seconds). BFD offers
universal, fast and low-overhead mechanism for failure detection, which could be
attached to any routing protocol in an advisory role.
<p>BFD consists of mostly independent BFD sessions. Each session monitors an
unicast bidirectional path between two BFD-enabled routers. This is done by
periodically sending control packets in both directions. BFD does not handle
neighbor discovery, BFD sessions are created on demand by request of other
protocols (like OSPF or BGP), which supply appropriate information like IP
addresses and associated interfaces. When a session changes its state, these
protocols are notified and act accordingly (e.g. break an OSPF adjacency when
the BFD session went down).
<p>BIRD implements basic BFD behavior as defined in
RFC 5880<htmlurl url="ftp://ftp.rfc-editor.org/in-notes/rfc5880.txt">
(some advanced features like the echo mode or authentication are not implemented),
IP transport for BFD as defined in
RFC 5881<htmlurl url="ftp://ftp.rfc-editor.org/in-notes/rfc5881.txt"> and
RFC 5883<htmlurl url="ftp://ftp.rfc-editor.org/in-notes/rfc5883.txt">
and interaction with client protocols as defined in
RFC 5882<htmlurl url="ftp://ftp.rfc-editor.org/in-notes/rfc5882.txt">.
<p>Note that BFD implementation in BIRD is currently a new feature in
development, expect some rough edges and possible UI and configuration changes
in the future. Also note that we currently support at most one protocol instance.
<sect1>Configuration
<p>BFD configuration consists mainly of multiple definitions of interfaces.
Most BFD config options are session specific. When a new session is requested
and dynamically created, it is configured from one of these definitions. For
sessions to directly connected neighbors, <cf/interface/ definitions are chosen
based on the interface associated with the session, while <cf/multihop/
definition is used for multihop sessions. If no definition is relevant, the
session is just created with the default configuration. Therefore, an empty BFD
configuration is often sufficient.
<p>Note that to use BFD for other protocols like OSPF or BGP, these protocols
also have to be configured to request BFD sessions, usually by <cf/bfd/ option.
<p>Some of BFD session options require <m/time/ value, which has to be specified
with the appropriate unit: <m/num/ <cf/s/|<cf/ms/|<cf/us/. Although microseconds
are allowed as units, practical minimum values are usually in order of tens of
milliseconds.
<code>
protocol bfd [<name>] {
interface <interface pattern> {
interval <time>;
min rx interval <time>;
min tx interval <time>;
idle tx interval <time>;
multiplier <num>;
passive <switch>;
};
multihop {
interval <time>;
min rx interval <time>;
min tx interval <time>;
idle tx interval <time>;
multiplier <num>;
passive <switch>;
};
neighbor <ip> [dev "<interface>"] [local <ip>] [multihop <switch>];
}
</code>
<descrip>
<tag>interface <m/pattern [, ...]/ { <m/options/ }</tag>
Interface definitions allow to specify options for sessions associated
with such interfaces and also may contain interface specific options.
See <ref id="dsc-iface" name="interface"> common option for a detailed
description of interface patterns. Note that contrary to the behavior of
<cf/interface/ definitions of other protocols, BFD protocol would accept
sessions (in default configuration) even on interfaces not covered by
such definitions.
<tag>multihop { <m/options/ }</tag>
Multihop definitions allow to specify options for multihop BFD sessions,
in the same manner as <cf/interface/ definitions are used for directly
connected sessions. Currently only one such definition (for all multihop
sessions) could be used.
<tag>neighbor <m/ip/ [dev "<m/interface/"] [local <m/ip/] [multihop <m/switch/]</tag>
BFD sessions are usually created on demand as requested by other
protocols (like OSPF or BGP). This option allows to explicitly add
a BFD session to the specified neighbor regardless of such requests.
The session is identified by the IP address of the neighbor, with
optional specification of used interface and local IP. By default
the neighbor must be directly connected, unless the the session is
configured as multihop. Note that local IP must be specified for
multihop sessions.
</descrip>
<p>Session specific options (part of <cf/interface/ and <cf/multihop/ definitions):
<descrip>
<tag>interval <m/time/</tag>
BFD ensures availability of the forwarding path associated with the
session by periodically sending BFD control packets in both
directions. The rate of such packets is controlled by two options,
<cf/min rx interval/ and <cf/min tx interval/ (see below). This option
is just a shorthand to set both of these options together.
<tag>min rx interval <m/time/</tag>
This option specifies the minimum RX interval, which is announced to the
neighbor and used there to limit the neighbor's rate of generated BFD
control packets. Default: 10 ms.
<tag>min tx interval <m/time/</tag>
This option specifies the desired TX interval, which controls the rate
of generated BFD control packets (together with <cf/min rx interval/
announced by the neighbor). Note that this value is used only if the BFD
session is up, otherwise the value of <cf/idle tx interval/ is used
instead. Default: 100 ms.
<tag>idle tx interval <m/time/</tag>
In order to limit unnecessary traffic in cases where a neighbor is not
available or not running BFD, the rate of generated BFD control packets
is lower when the BFD session is not up. This option specifies the
desired TX interval in such cases instead of <cf/min tx interval/.
Default: 1 s.
<tag>multiplier <m/num/</tag>
Failure detection time for BFD sessions is based on established rate of
BFD control packets (<cf>min rx/tx interval</cf>) multiplied by this
multiplier, which is essentially (ignoring jitter) a number of missed
packets after which the session is declared down. Note that rates and
multipliers could be different in each direction of a BFD session.
Default: 5.
<tag>passive <m/switch/</tag>
Generally, both BFD session endpoinds try to establish the session by
sending control packets to the other side. This option allows to enable
passive mode, which means that the router does not send BFD packets
until it has received one from the other side. Default: disabled.
</descrip>
<sect1>Example
<p><code>
protocol bfd {
interface "eth*" {
min rx interval 20 ms;
min tx interval 50 ms;
idle tx interval 300 ms;
};
interface "gre*" {
interval 200 ms;
multiplier 10;
passive;
};
multihop {
interval 200 ms;
multiplier 10;
};
neighbor 192.168.1.10;
neighbor 192.168.2.2 dev "eth2";
neighbor 192.168.10.1 local 192.168.1.1 multihop;
}
</code>
<sect>BGP
<p>The Border Gateway Protocol is the routing protocol used for backbone
...
...
@@ -1258,8 +1430,8 @@ AS). Each AS is a part of the network with common management and
common routing policy. It is identified by a unique 16-bit number
(ASN). Routers within each AS usually exchange AS-internal routing
information with each other using an interior gateway protocol (IGP,
such as OSPF or RIP). Boundary routers at the border of
the AS
communicate global (inter-AS) network reachability information with
such as OSPF or RIP). Boundary routers at the border of
the AS
communicate global (inter-AS) network reachability information with
their neighbors in the neighboring AS'es via exterior BGP (eBGP) and
redistribute received information to other routers in the AS via
interior BGP (iBGP).
...
...
@@ -1412,7 +1584,15 @@ for each neighbor using the following configuration parameters:
<tag>igp table <m/name/</tag> Specifies a table that is used
as an IGP routing table. Default: the same as the table BGP is
connected to.
<tag>bfd <M>switch</M></tag>
BGP could use BFD protocol as an advisory mechanism for neighbor
liveness and failure detection. If enabled, BIRD setups a BFD session
for the BGP neighbor and tracks its liveness by it. This has an
advantage of an order of magnitude lower detection times in case of
failure. Note that BFD protocol also has to be configured, see
<ref id="sect-bfd" name="BFD"> section for details. Default: disabled.
<tag>ttl security <m/switch/</tag> Use GTSM (RFC 5082 - the
generalized TTL security mechanism). GTSM protects against
spoofed packets by ignoring received packets with a smaller
...
...
@@ -1986,6 +2166,7 @@ protocol ospf <name> {
real broadcast <switch>;
ptp netmask <switch>;
check link <switch>;
bfd <switch>;
ecmp weight <num>;
ttl security [<switch>; | tx only]
tx class|dscp <num>;
...
...
@@ -2260,6 +2441,14 @@ protocol ospf <name> {
prefix) is propagated. It is possible that some hardware
drivers or platforms do not implement this feature. Default value is no.
<tag>bfd <M>switch</M></tag>
OSPF could use BFD protocol as an advisory mechanism for neighbor
liveness and failure detection. If enabled, BIRD setups a BFD session
for each OSPF neighbor and tracks its liveness by it. This has an
advantage of an order of magnitude lower detection times in case of
failure. Note that BFD protocol also has to be configured, see
<ref id="sect-bfd" name="BFD"> section for details. Default value is no.
<tag>ttl security [<m/switch/ | tx only]</tag>
TTL security is a feature that protects routing protocols
from remote spoofed packets by using TTL 255 instead of TTL 1
...
...
lib/birdlib.h
View file @
1ec52253
...
...
@@ -24,6 +24,8 @@
#define _MAX(a,b) (((a)>(b))?(a):(b))
#ifndef PARSER
#undef MIN
#undef MAX
#define MIN(a,b) _MIN(a,b)
#define MAX(a,b) _MAX(a,b)
#endif
...
...
lib/printf.c
View file @
1ec52253
...
...
@@ -276,7 +276,7 @@ int bvsnprintf(char *buf, int size, const char *fmt, va_list args)
ip_ntox
(
va_arg
(
args
,
ip_addr
),
ipbuf
);
else
{
ip_ntop
(
va_arg
(
args
,
ip_addr
),
ipbuf
);
if
(
field_width
>
0
)
if
(
field_width
==
1
)
field_width
=
STD_ADDRESS_P_LENGTH
;
}
s
=
ipbuf
;
...
...
nest/proto.c
View file @
1ec52253
...
...
@@ -681,6 +681,9 @@ proto_build(struct protocol *p)
}
}
/* FIXME: convert this call to some protocol hook */
extern
void
bfd_init_all
(
void
);
/**
* protos_build - build a protocol list
*
...
...
@@ -718,8 +721,10 @@ protos_build(void)
#ifdef CONFIG_BGP
proto_build
(
&
proto_bgp
);
#endif
// XXX
#ifdef CONFIG_BFD
proto_build
(
&
proto_bfd
);
bfd_init_all
();
#endif
proto_pool
=
rp_new
(
&
root_pool
,
"Protocols"
);
proto_flush_event
=
ev_new
(
proto_pool
);
...
...
proto/bfd/bfd.c
View file @
1ec52253
This diff is collapsed.
Click to expand it.
proto/bfd/bfd.h
View file @
1ec52253
...
...
@@ -20,6 +20,7 @@
#include "lib/socket.h"
#include "lib/string.h"
#include "nest/bfd.h"
#include "io.h"
...
...
@@ -33,19 +34,23 @@
#define BFD_DEFAULT_MULTIPLIER 5
struct
bfd_iface_config
;
struct
bfd_config
{
struct
proto_config
c
;
list
neigh_list
;
/* List of struct bfd_neighbor */
list
patt_list
;
/* List of iface configs (struct bfd_iface_config) */
list
neigh_list
;
/* List of configured neighbors (struct bfd_neighbor) */
struct
bfd_iface_config
*
multihop
;
/* Multihop pseudoiface config */
};
struct
bfd_
session
_config
struct
bfd_
iface
_config
{
struct
iface_patt
i
;
u32
min_rx_int
;
u32
min_tx_int
;
u32
idle_tx_int
;
u8
multiplier
;
u8
multihop
;
u8
passive
;
};
...
...
@@ -55,9 +60,12 @@ struct bfd_neighbor
ip_addr
addr
;
ip_addr
local
;
struct
iface
*
iface
;
struct
bfd_session_config
*
opts
;
struct
bfd_session
*
session
;
struct
neighbor
*
neigh
;
struct
bfd_request
*
req
;
u8
multihop
;
u8
active
;
};
struct
bfd_proto
...
...
@@ -66,6 +74,7 @@ struct bfd_proto
struct
birdloop
*
loop
;
pool
*
tpool
;
pthread_spinlock_t
lock
;
node
bfd_node
;
slab
*
session_slab
;
HASH
(
struct
bfd_session
)
session_hash_id
;
...
...
@@ -77,25 +86,31 @@ struct bfd_proto
sock
*
rx_1
;
sock
*
rx_m
;
list
sock
_list
;
list
iface
_list
;
};
struct
bfd_
socket
struct
bfd_
iface
{
node
n
;
ip_addr
local
;
struct
iface
*
iface
;
struct
bfd_iface_config
*
cf
;
struct
bfd_proto
*
bfd
;
sock
*
sk
;
u32
uc
;
u8
changed
;
};
struct
bfd_session
{
node
n
;
ip_addr
addr
;
/* Address of session */
struct
bfd_iface
*
ifa
;
/* Iface associated with session */
struct
bfd_session
*
next_id
;
/* Next in bfd.session_hash_id */
struct
bfd_session
*
next_ip
;
/* Next in bfd.session_hash_ip */
struct
bfd_proto
*
bfd
;
u8
opened
;
u8
opened
_unused
;
u8
passive
;
u8
poll_active
;
u8
poll_scheduled
;
...
...
@@ -123,7 +138,9 @@ struct bfd_session
timer2
*
tx_timer
;
/* Periodic control packet timer */
timer2
*
hold_timer
;
/* Timer for session down detection time */
struct
bfd_socket
*
bsock
;
/* Socket associated with session */
list
request_list
;
/* List of client requests (struct bfd_request) */
bird_clock_t
last_state_change
;
/* Time of last state change */
u8
notify_running
;
/* 1 if notify hooks are running */
};
...
...
@@ -168,10 +185,7 @@ void bfd_show_sessions(struct proto *P);
/* packets.c */
void
bfd_send_ctl
(
struct
bfd_proto
*
p
,
struct
bfd_session
*
s
,
int
final
);
sock
*
bfd_open_rx_sk
(
struct
bfd_proto
*
p
,
int
multihop
);
struct
bfd_socket
*
bfd_get_socket
(
struct
bfd_proto
*
p
,
ip_addr
local
,
struct
iface
*
ifa
);
void
bfd_free_socket
(
struct
bfd_socket
*
sk
);
sock
*
bfd_open_tx_sk
(
struct
bfd_proto
*
p
,
ip_addr
local
,
struct
iface
*
ifa
);
#endif
/* _BIRD_BFD_H_ */
proto/bfd/config.Y
View file @
1ec52253
...
...
@@ -12,20 +12,21 @@ CF_HDR
CF_DEFINES
#define BFD_CFG ((struct bfd_config *) this_proto)
#define BFD_
SESSION this_bfd_session
#define BFD_
IFACE ((struct bfd_iface_config *) this_ipatt)
#define BFD_NEIGHBOR this_bfd_neighbor
static struct bfd_session_config *this_bfd_session;
static struct bfd_neighbor *this_bfd_neighbor;
extern struct bfd_config *bfd_cf;
CF_DECLS
CF_KEYWORDS(BFD, MIN, IDLE, RX, TX, INTERVAL, MULTIPLIER,
MULTIHOP,
PASSIVE,
NEIGHBOR, DEV
)
CF_KEYWORDS(BFD, MIN, IDLE, RX, TX, INTERVAL, MULTIPLIER, PASSIVE,
INTERFACE, MULTIHOP, NEIGHBOR, DEV, LOCAL
)
%type <iface> bfd_neigh_iface
%type <a> bfd_neigh_local
%type <i> bfd_neigh_multihop
CF_GRAMMAR
...
...
@@ -34,12 +35,19 @@ CF_ADDTO(proto, bfd_proto)
bfd_proto_start: proto_start BFD
{
this_proto = proto_config_new(&proto_bfd, sizeof(struct bfd_config), $1);
init_list(&BFD_CFG->patt_list);
init_list(&BFD_CFG->neigh_list);
if (bfd_cf)
cf_error("Only one BFD instance allowed");
bfd_cf = BFD_CFG;
};
bfd_proto_item:
proto_item
| bfd_neighbor
| INTERFACE bfd_iface
| MULTIHOP bfd_multihop
| NEIGHBOR bfd_neighbor
;
bfd_proto_opts:
...
...
@@ -51,38 +59,41 @@ bfd_proto:
bfd_proto_start proto_name '{' bfd_proto_opts '}';
bfd_
session
_start:
bfd_
iface
_start:
{
this_bfd_session = cfg_allocz(sizeof(struct bfd_session_config));
this_ipatt = cfg_allocz(sizeof(struct bfd_iface_config));
init_list(&this_ipatt->ipn_list);
BFD_
SESSION
->min_rx_int = BFD_DEFAULT_MIN_RX_INT;
BFD_
SESSION
->min_tx_int = BFD_DEFAULT_MIN_TX_INT;
BFD_
SESSION
->idle_tx_int = BFD_DEFAULT_IDLE_TX_INT;
BFD_
SESSION
->multiplier = BFD_DEFAULT_MULTIPLIER;
BFD_
IFACE
->min_rx_int = BFD_DEFAULT_MIN_RX_INT;
BFD_
IFACE
->min_tx_int = BFD_DEFAULT_MIN_TX_INT;
BFD_
IFACE
->idle_tx_int = BFD_DEFAULT_IDLE_TX_INT;
BFD_
IFACE
->multiplier = BFD_DEFAULT_MULTIPLIER;
};
bfd_session_item:
INTERVAL expr_us { BFD_SESSION->min_rx_int = BFD_SESSION->min_tx_int = $2; }
| MIN RX INTERVAL expr_us { BFD_SESSION->min_rx_int = $4; }
| MIN TX INTERVAL expr_us { BFD_SESSION->min_tx_int = $4; }
| IDLE TX INTERVAL expr_us { BFD_SESSION->idle_tx_int = $4; }
| MULTIPLIER expr { BFD_SESSION->multiplier = $2; }
| MULTIHOP bool { BFD_SESSION->multihop = $2; }
| PASSIVE bool { BFD_SESSION->passive = $2; }
bfd_iface_item:
INTERVAL expr_us { BFD_IFACE->min_rx_int = BFD_IFACE->min_tx_int = $2; }
| MIN RX INTERVAL expr_us { BFD_IFACE->min_rx_int = $4; }
| MIN TX INTERVAL expr_us { BFD_IFACE->min_tx_int = $4; }
| IDLE TX INTERVAL expr_us { BFD_IFACE->idle_tx_int = $4; }
| MULTIPLIER expr { BFD_IFACE->multiplier = $2; }
| PASSIVE bool { BFD_IFACE->passive = $2; }
;
bfd_
session
_opts:
bfd_
iface
_opts:
/* empty */
| bfd_
session_opts bfd_session
_item ';'
| bfd_
iface_opts bfd_iface
_item ';'
;
bfd_
session
_opt_list:
bfd_
iface
_opt_list:
/* empty */
| '{' bfd_
session
_opts '}'
| '{' bfd_
iface
_opts '}'
;
bfd_session:
bfd_session_start bfd_session_opt_list;
bfd_iface: bfd_iface_start iface_patt_list bfd_iface_opt_list
{ add_tail(&BFD_CFG->patt_list, NODE this_ipatt); };
bfd_multihop: bfd_iface_start bfd_iface_opt_list
{ BFD_CFG->multihop = BFD_IFACE; };
bfd_neigh_iface:
...
...
@@ -96,15 +107,26 @@ bfd_neigh_local:
| LOCAL ipa { $$ = $2; }
;
bfd_neighbor: NEIGHBOR ipa bfd_neigh_iface bfd_neigh_local bfd_session
bfd_neigh_multihop:
/* empty */ { $$ = 0; }
| MULTIHOP bool { $$ = $2; }
;
bfd_neighbor: ipa bfd_neigh_iface bfd_neigh_local bfd_neigh_multihop
{
this_bfd_neighbor = cfg_allocz(sizeof(struct bfd_neighbor));
add_tail(&BFD_CFG->neigh_list, NODE this_bfd_neighbor);
BFD_NEIGHBOR->addr = $2;
BFD_NEIGHBOR->local = $4;
BFD_NEIGHBOR->iface = $3;
BFD_NEIGHBOR->opts = BFD_SESSION;
BFD_NEIGHBOR->addr = $1;
BFD_NEIGHBOR->local = $3;
BFD_NEIGHBOR->iface = $2;
BFD_NEIGHBOR->multihop = $4;
if ($4 && $2)
cf_error("Neighbor cannot set both interface and multihop");
if ($4 && ipa_zero($3))
cf_error("Multihop neighbor requires specified local address");
};
...
...
proto/bfd/io.c
View file @
1ec52253
...
...
@@ -52,6 +52,9 @@ struct birdloop
};
/*
* Current thread context
*/
static
pthread_key_t
current_loop_key
;
...
...
@@ -74,6 +77,9 @@ birdloop_init_current(void)
}
/*
* Time clock
*/
static
void
times_update_alt
(
struct
birdloop
*
loop
);
...
...
@@ -163,6 +169,9 @@ current_time(void)
}
/*
* Wakeup code for birdloop
*/
static
void
pipe_new
(
int
*
pfds
)
...
...
@@ -244,6 +253,9 @@ wakeup_kick(struct birdloop *loop)
}
/*
* Events
*/
static
inline
uint
events_waiting
(
struct
birdloop
*
loop
)
...
...
@@ -279,12 +291,14 @@ ev2_schedule(event *e)
}
/*
* Timers
*/
#define TIMER_LESS(a,b) ((a)->expires < (b)->expires)
#define TIMER_SWAP(heap,a,b,t) (t = heap[a], heap[a] = heap[b], heap[b] = t, \
heap[a]->index = (a), heap[b]->index = (b))
static
inline
uint
timers_count
(
struct
birdloop
*
loop
)