mirror of
https://git.proxmox.com/git/mirror_frr
synced 2025-05-29 23:09:34 +00:00
Merge pull request #9972 from opensourcerouting/bfd-bgp-fixes
bfdd,bgpd: fix some integration bugs
This commit is contained in:
commit
208a07a8b8
@ -150,6 +150,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 = p->bfd_config->session;
|
||||||
|
const union sockunion *source;
|
||||||
bool changed = false;
|
bool changed = false;
|
||||||
int family;
|
int family;
|
||||||
union {
|
union {
|
||||||
@ -161,44 +162,45 @@ void bgp_peer_bfd_update_source(struct peer *p)
|
|||||||
if (CHECK_FLAG(p->sflags, PEER_STATUS_GROUP))
|
if (CHECK_FLAG(p->sflags, PEER_STATUS_GROUP))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
/* Figure out the correct source to use. */
|
||||||
|
if (CHECK_FLAG(p->flags, PEER_FLAG_UPDATE_SOURCE))
|
||||||
|
source = p->update_source;
|
||||||
|
else
|
||||||
|
source = p->su_local;
|
||||||
|
|
||||||
/* Update peer's source/destination addresses. */
|
/* Update peer's source/destination addresses. */
|
||||||
bfd_sess_addresses(session, &family, &src.v6, &dst.v6);
|
bfd_sess_addresses(session, &family, &src.v6, &dst.v6);
|
||||||
if (family == AF_INET) {
|
if (family == AF_INET) {
|
||||||
if ((p->su_local
|
if ((source && source->sin.sin_addr.s_addr != src.v4.s_addr)
|
||||||
&& p->su_local->sin.sin_addr.s_addr != src.v4.s_addr)
|
|
||||||
|| p->su.sin.sin_addr.s_addr != dst.v4.s_addr) {
|
|| p->su.sin.sin_addr.s_addr != dst.v4.s_addr) {
|
||||||
if (BGP_DEBUG(bfd, BFD_LIB))
|
if (BGP_DEBUG(bfd, BFD_LIB))
|
||||||
zlog_debug(
|
zlog_debug(
|
||||||
"%s: address [%pI4->%pI4] to [%pI4->%pI4]",
|
"%s: address [%pI4->%pI4] to [%pI4->%pI4]",
|
||||||
__func__, &src.v4, &dst.v4,
|
__func__, &src.v4, &dst.v4,
|
||||||
p->su_local ? &p->su_local->sin.sin_addr
|
source ? &source->sin.sin_addr
|
||||||
: &src.v4,
|
: &src.v4,
|
||||||
&p->su.sin.sin_addr);
|
&p->su.sin.sin_addr);
|
||||||
|
|
||||||
bfd_sess_set_ipv4_addrs(
|
bfd_sess_set_ipv4_addrs(
|
||||||
session,
|
session, source ? &source->sin.sin_addr : NULL,
|
||||||
p->su_local ? &p->su_local->sin.sin_addr : NULL,
|
|
||||||
&p->su.sin.sin_addr);
|
&p->su.sin.sin_addr);
|
||||||
changed = true;
|
changed = true;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if ((p->su_local
|
if ((source && memcmp(&source->sin6, &src.v6, sizeof(src.v6)))
|
||||||
&& memcmp(&p->su_local->sin6, &src.v6, sizeof(src.v6)))
|
|
||||||
|| memcmp(&p->su.sin6, &dst.v6, sizeof(dst.v6))) {
|
|| memcmp(&p->su.sin6, &dst.v6, sizeof(dst.v6))) {
|
||||||
if (BGP_DEBUG(bfd, BFD_LIB))
|
if (BGP_DEBUG(bfd, BFD_LIB))
|
||||||
zlog_debug(
|
zlog_debug(
|
||||||
"%s: address [%pI6->%pI6] to [%pI6->%pI6]",
|
"%s: address [%pI6->%pI6] to [%pI6->%pI6]",
|
||||||
__func__, &src.v6, &dst.v6,
|
__func__, &src.v6, &dst.v6,
|
||||||
p->su_local
|
source ? &source->sin6.sin6_addr
|
||||||
? &p->su_local->sin6.sin6_addr
|
: &src.v6,
|
||||||
: &src.v6,
|
|
||||||
&p->su.sin6.sin6_addr);
|
&p->su.sin6.sin6_addr);
|
||||||
|
|
||||||
bfd_sess_set_ipv6_addrs(
|
bfd_sess_set_ipv6_addrs(session,
|
||||||
session,
|
source ? &source->sin6.sin6_addr
|
||||||
p->su_local ? &p->su_local->sin6.sin6_addr
|
: NULL,
|
||||||
: NULL,
|
&p->su.sin6.sin6_addr);
|
||||||
&p->su.sin6.sin6_addr);
|
|
||||||
changed = true;
|
changed = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
40
bgpd/bgpd.c
40
bgpd/bgpd.c
@ -4753,6 +4753,10 @@ int peer_ebgp_multihop_set(struct peer *peer, int ttl)
|
|||||||
BGP_NOTIFY_CEASE_CONFIG_CHANGE);
|
BGP_NOTIFY_CEASE_CONFIG_CHANGE);
|
||||||
else
|
else
|
||||||
bgp_session_reset(peer);
|
bgp_session_reset(peer);
|
||||||
|
|
||||||
|
/* Reconfigure BFD peer with new TTL. */
|
||||||
|
if (peer->bfd_config)
|
||||||
|
bgp_peer_bfd_update_source(peer);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
group = peer->group;
|
group = peer->group;
|
||||||
@ -4767,6 +4771,10 @@ int peer_ebgp_multihop_set(struct peer *peer, int ttl)
|
|||||||
BGP_NOTIFY_CEASE_CONFIG_CHANGE);
|
BGP_NOTIFY_CEASE_CONFIG_CHANGE);
|
||||||
else
|
else
|
||||||
bgp_session_reset(peer);
|
bgp_session_reset(peer);
|
||||||
|
|
||||||
|
/* Reconfigure BFD peer with new TTL. */
|
||||||
|
if (peer->bfd_config)
|
||||||
|
bgp_peer_bfd_update_source(peer);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
@ -4800,6 +4808,10 @@ int peer_ebgp_multihop_unset(struct peer *peer)
|
|||||||
BGP_NOTIFY_CEASE_CONFIG_CHANGE);
|
BGP_NOTIFY_CEASE_CONFIG_CHANGE);
|
||||||
else
|
else
|
||||||
bgp_session_reset(peer);
|
bgp_session_reset(peer);
|
||||||
|
|
||||||
|
/* Reconfigure BFD peer with new TTL. */
|
||||||
|
if (peer->bfd_config)
|
||||||
|
bgp_peer_bfd_update_source(peer);
|
||||||
} else {
|
} else {
|
||||||
group = peer->group;
|
group = peer->group;
|
||||||
for (ALL_LIST_ELEMENTS(group->peer, node, nnode, peer)) {
|
for (ALL_LIST_ELEMENTS(group->peer, node, nnode, peer)) {
|
||||||
@ -4816,6 +4828,10 @@ int peer_ebgp_multihop_unset(struct peer *peer)
|
|||||||
else
|
else
|
||||||
bgp_session_reset(peer);
|
bgp_session_reset(peer);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Reconfigure BFD peer with new TTL. */
|
||||||
|
if (peer->bfd_config)
|
||||||
|
bgp_peer_bfd_update_source(peer);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
@ -4861,6 +4877,10 @@ int peer_update_source_if_set(struct peer *peer, const char *ifname)
|
|||||||
} else
|
} else
|
||||||
bgp_session_reset(peer);
|
bgp_session_reset(peer);
|
||||||
|
|
||||||
|
/* Apply new source configuration to BFD session. */
|
||||||
|
if (peer->bfd_config)
|
||||||
|
bgp_peer_bfd_update_source(peer);
|
||||||
|
|
||||||
/* Skip peer-group mechanics for regular peers. */
|
/* Skip peer-group mechanics for regular peers. */
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@ -4894,6 +4914,10 @@ int peer_update_source_if_set(struct peer *peer, const char *ifname)
|
|||||||
BGP_NOTIFY_CEASE_CONFIG_CHANGE);
|
BGP_NOTIFY_CEASE_CONFIG_CHANGE);
|
||||||
} else
|
} else
|
||||||
bgp_session_reset(member);
|
bgp_session_reset(member);
|
||||||
|
|
||||||
|
/* Apply new source configuration to BFD session. */
|
||||||
|
if (member->bfd_config)
|
||||||
|
bgp_peer_bfd_update_source(member);
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
@ -4924,6 +4948,10 @@ int peer_update_source_addr_set(struct peer *peer, const union sockunion *su)
|
|||||||
} else
|
} else
|
||||||
bgp_session_reset(peer);
|
bgp_session_reset(peer);
|
||||||
|
|
||||||
|
/* Apply new source configuration to BFD session. */
|
||||||
|
if (peer->bfd_config)
|
||||||
|
bgp_peer_bfd_update_source(peer);
|
||||||
|
|
||||||
/* Skip peer-group mechanics for regular peers. */
|
/* Skip peer-group mechanics for regular peers. */
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@ -4956,6 +4984,10 @@ int peer_update_source_addr_set(struct peer *peer, const union sockunion *su)
|
|||||||
BGP_NOTIFY_CEASE_CONFIG_CHANGE);
|
BGP_NOTIFY_CEASE_CONFIG_CHANGE);
|
||||||
} else
|
} else
|
||||||
bgp_session_reset(member);
|
bgp_session_reset(member);
|
||||||
|
|
||||||
|
/* Apply new source configuration to BFD session. */
|
||||||
|
if (member->bfd_config)
|
||||||
|
bgp_peer_bfd_update_source(member);
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
@ -4993,6 +5025,10 @@ int peer_update_source_unset(struct peer *peer)
|
|||||||
} else
|
} else
|
||||||
bgp_session_reset(peer);
|
bgp_session_reset(peer);
|
||||||
|
|
||||||
|
/* Apply new source configuration to BFD session. */
|
||||||
|
if (peer->bfd_config)
|
||||||
|
bgp_peer_bfd_update_source(peer);
|
||||||
|
|
||||||
/* Skip peer-group mechanics for regular peers. */
|
/* Skip peer-group mechanics for regular peers. */
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@ -5024,6 +5060,10 @@ int peer_update_source_unset(struct peer *peer)
|
|||||||
BGP_NOTIFY_CEASE_CONFIG_CHANGE);
|
BGP_NOTIFY_CEASE_CONFIG_CHANGE);
|
||||||
} else
|
} else
|
||||||
bgp_session_reset(member);
|
bgp_session_reset(member);
|
||||||
|
|
||||||
|
/* Apply new source configuration to BFD session. */
|
||||||
|
if (member->bfd_config)
|
||||||
|
bgp_peer_bfd_update_source(member);
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -552,7 +552,8 @@ static bool bfd_sess_address_changed(const struct bfd_session_params *bsp,
|
|||||||
}
|
}
|
||||||
|
|
||||||
void bfd_sess_set_ipv4_addrs(struct bfd_session_params *bsp,
|
void bfd_sess_set_ipv4_addrs(struct bfd_session_params *bsp,
|
||||||
struct in_addr *src, struct in_addr *dst)
|
const struct in_addr *src,
|
||||||
|
const struct in_addr *dst)
|
||||||
{
|
{
|
||||||
if (!bfd_sess_address_changed(bsp, AF_INET, (struct in6_addr *)src,
|
if (!bfd_sess_address_changed(bsp, AF_INET, (struct in6_addr *)src,
|
||||||
(struct in6_addr *)dst))
|
(struct in6_addr *)dst))
|
||||||
@ -576,10 +577,10 @@ void bfd_sess_set_ipv4_addrs(struct bfd_session_params *bsp,
|
|||||||
}
|
}
|
||||||
|
|
||||||
void bfd_sess_set_ipv6_addrs(struct bfd_session_params *bsp,
|
void bfd_sess_set_ipv6_addrs(struct bfd_session_params *bsp,
|
||||||
struct in6_addr *src, struct in6_addr *dst)
|
const struct in6_addr *src,
|
||||||
|
const struct in6_addr *dst)
|
||||||
{
|
{
|
||||||
if (!bfd_sess_address_changed(bsp, AF_INET, (struct in6_addr *)src,
|
if (!bfd_sess_address_changed(bsp, AF_INET6, src, dst))
|
||||||
(struct in6_addr *)dst))
|
|
||||||
return;
|
return;
|
||||||
|
|
||||||
/* If already installed, remove the old setting. */
|
/* If already installed, remove the old setting. */
|
||||||
|
@ -124,7 +124,8 @@ void bfd_sess_free(struct bfd_session_params **bsp);
|
|||||||
* \param dst remote address (mandatory).
|
* \param dst remote address (mandatory).
|
||||||
*/
|
*/
|
||||||
void bfd_sess_set_ipv4_addrs(struct bfd_session_params *bsp,
|
void bfd_sess_set_ipv4_addrs(struct bfd_session_params *bsp,
|
||||||
struct in_addr *src, struct in_addr *dst);
|
const struct in_addr *src,
|
||||||
|
const struct in_addr *dst);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Set the local and peer address of the BFD session.
|
* Set the local and peer address of the BFD session.
|
||||||
@ -138,7 +139,8 @@ void bfd_sess_set_ipv4_addrs(struct bfd_session_params *bsp,
|
|||||||
* \param dst remote address (mandatory).
|
* \param dst remote address (mandatory).
|
||||||
*/
|
*/
|
||||||
void bfd_sess_set_ipv6_addrs(struct bfd_session_params *bsp,
|
void bfd_sess_set_ipv6_addrs(struct bfd_session_params *bsp,
|
||||||
struct in6_addr *src, struct in6_addr *dst);
|
const struct in6_addr *src,
|
||||||
|
const struct in6_addr *dst);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Configure the BFD session interface.
|
* Configure the BFD session interface.
|
||||||
|
Loading…
Reference in New Issue
Block a user