ip_addr addr;
ip_addr local;
struct iface *iface;
+ struct iface *vrf;
void (*hook)(struct bfd_request *);
void *data;
#ifdef CONFIG_BFD
-struct bfd_request * bfd_request_session(pool *p, ip_addr addr, ip_addr local, struct iface *iface, void (*hook)(struct bfd_request *), void *data);
+struct bfd_request * bfd_request_session(pool *p, ip_addr addr, ip_addr local, struct iface *iface, struct iface *vrf, void (*hook)(struct bfd_request *), void *data);
static inline void cf_check_bfd(int use UNUSED) { }
#else
-static inline struct bfd_request * bfd_request_session(pool *p UNUSED, ip_addr addr UNUSED, ip_addr local UNUSED, struct iface *iface UNUSED, void (*hook)(struct bfd_request *) UNUSED, void *data UNUSED) { return NULL; }
+static inline struct bfd_request * bfd_request_session(pool *p UNUSED, ip_addr addr UNUSED, ip_addr local UNUSED, struct iface *iface UNUSED, struct iface *vrf UNUSED, void (*hook)(struct bfd_request *) UNUSED, void *data UNUSED) { return NULL; }
static inline void cf_check_bfd(int use) { if (use) cf_error("BFD not available"); }
static int
bfd_add_request(struct bfd_proto *p, struct bfd_request *req)
{
+ if (p->p.vrf && (p->p.vrf != req->vrf))
+ return 0;
+
struct bfd_session *s = bfd_find_session_by_addr(p, req->addr);
u8 state, diag;
static struct resclass bfd_request_class;
struct bfd_request *
-bfd_request_session(pool *p, ip_addr addr, ip_addr local, struct iface *iface,
+bfd_request_session(pool *p, ip_addr addr, ip_addr local,
+ struct iface *iface, struct iface *vrf,
void (*hook)(struct bfd_request *), void *data)
{
struct bfd_request *req = ralloc(p, &bfd_request_class);
req->addr = addr;
req->local = local;
req->iface = iface;
+ req->vrf = vrf;
bfd_submit_request(req);
if ((nb->scope > 0) && !n->req)
{
ip_addr local = ipa_nonzero(n->local) ? n->local : nb->ifa->ip;
- n->req = bfd_request_session(p->p.pool, n->addr, local, nb->iface, NULL, NULL);
+ n->req = bfd_request_session(p->p.pool, n->addr, local, nb->iface, p->p.vrf, NULL, NULL);
}
if ((nb->scope <= 0) && n->req)
if (n->multihop)
{
- n->req = bfd_request_session(p->p.pool, n->addr, n->local, NULL, NULL, NULL);
+ n->req = bfd_request_session(p->p.pool, n->addr, n->local, NULL, p->p.vrf, NULL, NULL);
return;
}
return 1;
}
-/* Ensure one instance */
-struct bfd_config *bfd_cf;
-
-static void
-bfd_preconfig(struct protocol *P UNUSED, struct config *c UNUSED)
-{
- bfd_cf = NULL;
-}
-
static void
bfd_copy_config(struct proto_config *dest, struct proto_config *src UNUSED)
{
.start = bfd_start,
.shutdown = bfd_shutdown,
.reconfigure = bfd_reconfigure,
- .preconfig = bfd_preconfig,
.copy_config = bfd_copy_config,
};
this_proto = proto_config_new(&proto_bfd, $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:
sk->type = SK_UDP;
sk->subtype = af;
sk->sport = !multihop ? BFD_CONTROL_PORT : BFD_MULTI_CTL_PORT;
+ sk->vrf = p->p.vrf;
sk->data = p;
sk->rbsize = BFD_MAX_LEN;
sk->saddr = local;
sk->dport = ifa ? BFD_CONTROL_PORT : BFD_MULTI_CTL_PORT;
sk->iface = ifa;
+ sk->vrf = p->p.vrf;
sk->data = p;
sk->tbsize = BFD_MAX_LEN;
if (use_bfd && !p->bfd_req && !bgp_is_dynamic(p))
p->bfd_req = bfd_request_session(p->p.pool, p->remote_ip, p->local_ip,
p->cf->multihop ? NULL : p->neigh->iface,
- bgp_bfd_notify, p);
+ p->p.vrf, bgp_bfd_notify, p);
if (!use_bfd && p->bfd_req)
{
void
ospf_neigh_update_bfd(struct ospf_neighbor *n, int use_bfd)
{
+ struct ospf_proto *p = n->ifa->oa->po;
+
if (use_bfd && !n->bfd_req)
- n->bfd_req = bfd_request_session(n->pool, n->ip, n->ifa->addr->ip, n->ifa->iface,
+ n->bfd_req = bfd_request_session(n->pool, n->ip, n->ifa->addr->ip,
+ n->ifa->iface, p->p.vrf,
ospf_neigh_bfd_hook, n);
if (!use_bfd && n->bfd_req)
*/
ip_addr saddr = rip_is_v2(p) ? n->ifa->sk->saddr : n->nbr->ifa->ip;
n->bfd_req = bfd_request_session(p->p.pool, n->nbr->addr, saddr,
- n->nbr->iface, rip_bfd_notify, n);
+ n->nbr->iface, p->p.vrf,
+ rip_bfd_notify, n);
}
if (!use_bfd && n->bfd_req)
if (bfd_up && !r->bfd_req)
{
// ip_addr local = ipa_nonzero(r->local) ? r->local : nb->ifa->ip;
- r->bfd_req = bfd_request_session(p->p.pool, r->via, nb->ifa->ip, nb->iface,
+ r->bfd_req = bfd_request_session(p->p.pool, r->via, nb->ifa->ip,
+ nb->iface, p->p.vrf,
static_bfd_notify, r);
}