mirror of
https://gitlab.labs.nic.cz/labs/bird.git
synced 2024-05-11 16:54:54 +00:00
BFD protocol, ready for release.
Supports OSPF and BGP and also statically configured sessions.
This commit is contained in:
@@ -59,8 +59,9 @@
|
||||
#include "nest/iface.h"
|
||||
#include "nest/protocol.h"
|
||||
#include "nest/route.h"
|
||||
#include "nest/locks.h"
|
||||
#include "nest/bfd.h"
|
||||
#include "nest/cli.h"
|
||||
#include "nest/locks.h"
|
||||
#include "conf/conf.h"
|
||||
#include "lib/socket.h"
|
||||
#include "lib/resource.h"
|
||||
@@ -76,6 +77,7 @@ static void bgp_close(struct bgp_proto *p, int apply_md5);
|
||||
static void bgp_connect(struct bgp_proto *p);
|
||||
static void bgp_active(struct bgp_proto *p);
|
||||
static sock *bgp_setup_listen_sk(ip_addr addr, unsigned port, u32 flags);
|
||||
static void bgp_update_bfd(struct bgp_proto *p, int use_bfd);
|
||||
|
||||
|
||||
/**
|
||||
@@ -153,8 +155,12 @@ bgp_initiate(struct bgp_proto *p)
|
||||
if (rv < 0)
|
||||
return;
|
||||
|
||||
if (p->cf->bfd)
|
||||
bgp_update_bfd(p, p->cf->bfd);
|
||||
|
||||
if (p->startup_delay)
|
||||
{
|
||||
p->start_state = BSS_DELAY;
|
||||
BGP_TRACE(D_EVENTS, "Startup delayed by %d seconds", p->startup_delay);
|
||||
bgp_start_timer(p->startup_timer, p->startup_delay);
|
||||
}
|
||||
@@ -765,6 +771,37 @@ bgp_neigh_notify(neighbor *n)
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
bgp_bfd_notify(struct bfd_request *req)
|
||||
{
|
||||
struct bgp_proto *p = req->data;
|
||||
int ps = p->p.proto_state;
|
||||
|
||||
if (req->down && ((ps == PS_START) || (ps == PS_UP)))
|
||||
{
|
||||
BGP_TRACE(D_EVENTS, "BFD session down");
|
||||
bgp_store_error(p, NULL, BE_MISC, BEM_BFD_DOWN);
|
||||
if (ps == PS_UP)
|
||||
bgp_update_startup_delay(p);
|
||||
bgp_stop(p, 0);
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
bgp_update_bfd(struct bgp_proto *p, int use_bfd)
|
||||
{
|
||||
if (use_bfd && !p->bfd_req)
|
||||
p->bfd_req = bfd_request_session(p->p.pool, p->cf->remote_ip, p->source_addr,
|
||||
p->cf->multihop ? NULL : p->neigh->iface,
|
||||
bgp_bfd_notify, p);
|
||||
|
||||
if (!use_bfd && p->bfd_req)
|
||||
{
|
||||
rfree(p->bfd_req);
|
||||
p->bfd_req = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
static int
|
||||
bgp_reload_routes(struct proto *P)
|
||||
{
|
||||
@@ -825,6 +862,7 @@ bgp_start(struct proto *P)
|
||||
p->outgoing_conn.state = BS_IDLE;
|
||||
p->incoming_conn.state = BS_IDLE;
|
||||
p->neigh = NULL;
|
||||
p->bfd_req = NULL;
|
||||
|
||||
rt_lock_table(p->igp_table);
|
||||
|
||||
@@ -992,6 +1030,9 @@ bgp_check_config(struct bgp_config *c)
|
||||
ipa_has_link_scope(c->source_addr)))
|
||||
cf_error("Multihop BGP cannot be used with link-local addresses");
|
||||
|
||||
if (c->multihop && c->bfd && ipa_zero(c->source_addr))
|
||||
cf_error("Multihop BGP with BFD requires specified source address");
|
||||
|
||||
|
||||
/* Different default based on rs_client */
|
||||
if (!c->missing_lladdr)
|
||||
@@ -1034,6 +1075,9 @@ bgp_reconfigure(struct proto *P, struct proto_config *C)
|
||||
|| (old->password && new->password && !strcmp(old->password, new->password)))
|
||||
&& (get_igp_table(old) == get_igp_table(new));
|
||||
|
||||
if (same && (p->start_state > BSS_PREPARE))
|
||||
bgp_update_bfd(p, new->bfd);
|
||||
|
||||
/* We should update our copy of configuration ptr as old configuration will be freed */
|
||||
if (same)
|
||||
p->cf = new;
|
||||
@@ -1115,7 +1159,7 @@ bgp_store_error(struct bgp_proto *p, struct bgp_conn *c, u8 class, u32 code)
|
||||
|
||||
static char *bgp_state_names[] = { "Idle", "Connect", "Active", "OpenSent", "OpenConfirm", "Established", "Close" };
|
||||
static char *bgp_err_classes[] = { "", "Error: ", "Socket: ", "Received: ", "BGP Error: ", "Automatic shutdown: ", ""};
|
||||
static char *bgp_misc_errors[] = { "", "Neighbor lost", "Invalid next hop", "Kernel MD5 auth failed", "No listening socket" };
|
||||
static char *bgp_misc_errors[] = { "", "Neighbor lost", "Invalid next hop", "Kernel MD5 auth failed", "No listening socket", "BFD session down" };
|
||||
static char *bgp_auto_errors[] = { "", "Route limit exceeded"};
|
||||
|
||||
static const char *
|
||||
|
||||
Reference in New Issue
Block a user