mirror of
https://git.proxmox.com/git/mirror_frr
synced 2025-08-16 00:25:01 +00:00
bgpd: Allow bfd to work if peer known but interface address not yet
If bgp is coming up and bgp has not received the interface address yet but bgp has knowledge about a bfd peering, allow it to set the peering data appropriately. Signed-off-by: Donald Sharp <sharpd@nvidia.com>
This commit is contained in:
parent
6a945b4104
commit
c1c6298dd3
@ -151,7 +151,7 @@ void bgp_peer_config_apply(struct peer *p, struct peer_group *pg)
|
|||||||
|
|
||||||
void bgp_peer_bfd_update_source(struct peer *p)
|
void bgp_peer_bfd_update_source(struct peer *p)
|
||||||
{
|
{
|
||||||
struct bfd_session_params *session = p->bfd_config->session;
|
struct bfd_session_params *session;
|
||||||
const union sockunion *source = NULL;
|
const union sockunion *source = NULL;
|
||||||
bool changed = false;
|
bool changed = false;
|
||||||
int family;
|
int family;
|
||||||
@ -162,6 +162,10 @@ void bgp_peer_bfd_update_source(struct peer *p)
|
|||||||
struct interface *ifp;
|
struct interface *ifp;
|
||||||
union sockunion addr;
|
union sockunion addr;
|
||||||
|
|
||||||
|
if (!p->bfd_config)
|
||||||
|
return;
|
||||||
|
|
||||||
|
session = p->bfd_config->session;
|
||||||
/* Nothing to do for groups. */
|
/* Nothing to do for groups. */
|
||||||
if (CHECK_FLAG(p->sflags, PEER_STATUS_GROUP))
|
if (CHECK_FLAG(p->sflags, PEER_STATUS_GROUP))
|
||||||
return;
|
return;
|
||||||
|
@ -32,6 +32,7 @@
|
|||||||
#include "bgpd/bgp_vty.h"
|
#include "bgpd/bgp_vty.h"
|
||||||
#include "bgpd/bgp_rd.h"
|
#include "bgpd/bgp_rd.h"
|
||||||
#include "bgpd/bgp_mplsvpn.h"
|
#include "bgpd/bgp_mplsvpn.h"
|
||||||
|
#include "bgpd/bgp_bfd.h"
|
||||||
|
|
||||||
DEFINE_MTYPE_STATIC(BGPD, MARTIAN_STRING, "BGP Martian Addr Intf String");
|
DEFINE_MTYPE_STATIC(BGPD, MARTIAN_STRING, "BGP Martian Addr Intf String");
|
||||||
|
|
||||||
@ -409,17 +410,6 @@ void bgp_connected_add(struct bgp *bgp, struct connected *ifc)
|
|||||||
bgp_dest_set_bgp_connected_ref_info(dest, bc);
|
bgp_dest_set_bgp_connected_ref_info(dest, bc);
|
||||||
}
|
}
|
||||||
|
|
||||||
for (ALL_LIST_ELEMENTS(bgp->peer, node, nnode, peer)) {
|
|
||||||
if (peer->conf_if &&
|
|
||||||
(strcmp(peer->conf_if, ifc->ifp->name) == 0) &&
|
|
||||||
!peer_established(peer->connection) &&
|
|
||||||
!CHECK_FLAG(peer->flags, PEER_FLAG_IFPEER_V6ONLY)) {
|
|
||||||
connection = peer->connection;
|
|
||||||
if (peer_active(peer))
|
|
||||||
BGP_EVENT_ADD(connection, BGP_Stop);
|
|
||||||
BGP_EVENT_ADD(connection, BGP_Start);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else if (addr->family == AF_INET6) {
|
} else if (addr->family == AF_INET6) {
|
||||||
apply_mask_ipv6((struct prefix_ipv6 *)&p);
|
apply_mask_ipv6((struct prefix_ipv6 *)&p);
|
||||||
|
|
||||||
@ -443,6 +433,22 @@ void bgp_connected_add(struct bgp *bgp, struct connected *ifc)
|
|||||||
bgp_dest_set_bgp_connected_ref_info(dest, bc);
|
bgp_dest_set_bgp_connected_ref_info(dest, bc);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Iterate over all the peers and attempt to set the bfd session
|
||||||
|
* data and if it's a bgp unnumbered get her flowing if necessary
|
||||||
|
*/
|
||||||
|
for (ALL_LIST_ELEMENTS(bgp->peer, node, nnode, peer)) {
|
||||||
|
bgp_peer_bfd_update_source(peer);
|
||||||
|
if (peer->conf_if && (strcmp(peer->conf_if, ifc->ifp->name) == 0) &&
|
||||||
|
!peer_established(peer->connection) &&
|
||||||
|
!CHECK_FLAG(peer->flags, PEER_FLAG_IFPEER_V6ONLY)) {
|
||||||
|
connection = peer->connection;
|
||||||
|
if (peer_active(peer))
|
||||||
|
BGP_EVENT_ADD(connection, BGP_Stop);
|
||||||
|
BGP_EVENT_ADD(connection, BGP_Start);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void bgp_connected_delete(struct bgp *bgp, struct connected *ifc)
|
void bgp_connected_delete(struct bgp *bgp, struct connected *ifc)
|
||||||
|
Loading…
Reference in New Issue
Block a user