summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDonald Sharp <donaldsharp72@gmail.com>2021-11-06 16:49:24 -0400
committerGitHub <noreply@github.com>2021-11-06 16:49:24 -0400
commit3691c9d2d0b22e4fa27d7a49b302f28b1af9ede0 (patch)
treeeb06c35cdfbab96015be0b3830d57d58a0eb4d80
parent41adf5b4ba8f59bea9ffa31e4b5096fd101e256f (diff)
parent3795733e5f0885bef5bae1a2ab7d6afbfe968718 (diff)
Merge pull request #9990 from FRRouting/mergify/bp/stable/8.1/pr-9972
bfdd,bgpd: fix some integration bugs (backport #9972)
-rw-r--r--bgpd/bgp_bfd.c34
-rw-r--r--bgpd/bgpd.c40
-rw-r--r--lib/bfd.c9
-rw-r--r--lib/bfd.h6
4 files changed, 67 insertions, 22 deletions
diff --git a/bgpd/bgp_bfd.c b/bgpd/bgp_bfd.c
index 4995f9a1fd..f23e6b2e9b 100644
--- a/bgpd/bgp_bfd.c
+++ b/bgpd/bgp_bfd.c
@@ -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)
{
struct bfd_session_params *session = p->bfd_config->session;
+ const union sockunion *source;
bool changed = false;
int family;
union {
@@ -161,44 +162,45 @@ void bgp_peer_bfd_update_source(struct peer *p)
if (CHECK_FLAG(p->sflags, PEER_STATUS_GROUP))
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. */
bfd_sess_addresses(session, &family, &src.v6, &dst.v6);
if (family == AF_INET) {
- if ((p->su_local
- && p->su_local->sin.sin_addr.s_addr != src.v4.s_addr)
+ if ((source && source->sin.sin_addr.s_addr != src.v4.s_addr)
|| p->su.sin.sin_addr.s_addr != dst.v4.s_addr) {
if (BGP_DEBUG(bfd, BFD_LIB))
zlog_debug(
"%s: address [%pI4->%pI4] to [%pI4->%pI4]",
__func__, &src.v4, &dst.v4,
- p->su_local ? &p->su_local->sin.sin_addr
- : &src.v4,
+ source ? &source->sin.sin_addr
+ : &src.v4,
&p->su.sin.sin_addr);
bfd_sess_set_ipv4_addrs(
- session,
- p->su_local ? &p->su_local->sin.sin_addr : NULL,
+ session, source ? &source->sin.sin_addr : NULL,
&p->su.sin.sin_addr);
changed = true;
}
} else {
- if ((p->su_local
- && memcmp(&p->su_local->sin6, &src.v6, sizeof(src.v6)))
+ if ((source && memcmp(&source->sin6, &src.v6, sizeof(src.v6)))
|| memcmp(&p->su.sin6, &dst.v6, sizeof(dst.v6))) {
if (BGP_DEBUG(bfd, BFD_LIB))
zlog_debug(
"%s: address [%pI6->%pI6] to [%pI6->%pI6]",
__func__, &src.v6, &dst.v6,
- p->su_local
- ? &p->su_local->sin6.sin6_addr
- : &src.v6,
+ source ? &source->sin6.sin6_addr
+ : &src.v6,
&p->su.sin6.sin6_addr);
- bfd_sess_set_ipv6_addrs(
- session,
- p->su_local ? &p->su_local->sin6.sin6_addr
- : NULL,
- &p->su.sin6.sin6_addr);
+ bfd_sess_set_ipv6_addrs(session,
+ source ? &source->sin6.sin6_addr
+ : NULL,
+ &p->su.sin6.sin6_addr);
changed = true;
}
}
diff --git a/bgpd/bgpd.c b/bgpd/bgpd.c
index a823009179..0416186171 100644
--- a/bgpd/bgpd.c
+++ b/bgpd/bgpd.c
@@ -4751,6 +4751,10 @@ int peer_ebgp_multihop_set(struct peer *peer, int ttl)
BGP_NOTIFY_CEASE_CONFIG_CHANGE);
else
bgp_session_reset(peer);
+
+ /* Reconfigure BFD peer with new TTL. */
+ if (peer->bfd_config)
+ bgp_peer_bfd_update_source(peer);
}
} else {
group = peer->group;
@@ -4765,6 +4769,10 @@ int peer_ebgp_multihop_set(struct peer *peer, int ttl)
BGP_NOTIFY_CEASE_CONFIG_CHANGE);
else
bgp_session_reset(peer);
+
+ /* Reconfigure BFD peer with new TTL. */
+ if (peer->bfd_config)
+ bgp_peer_bfd_update_source(peer);
}
}
return 0;
@@ -4798,6 +4806,10 @@ int peer_ebgp_multihop_unset(struct peer *peer)
BGP_NOTIFY_CEASE_CONFIG_CHANGE);
else
bgp_session_reset(peer);
+
+ /* Reconfigure BFD peer with new TTL. */
+ if (peer->bfd_config)
+ bgp_peer_bfd_update_source(peer);
} else {
group = peer->group;
for (ALL_LIST_ELEMENTS(group->peer, node, nnode, peer)) {
@@ -4814,6 +4826,10 @@ int peer_ebgp_multihop_unset(struct peer *peer)
else
bgp_session_reset(peer);
}
+
+ /* Reconfigure BFD peer with new TTL. */
+ if (peer->bfd_config)
+ bgp_peer_bfd_update_source(peer);
}
}
return 0;
@@ -4859,6 +4875,10 @@ int peer_update_source_if_set(struct peer *peer, const char *ifname)
} else
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. */
return 0;
}
@@ -4892,6 +4912,10 @@ int peer_update_source_if_set(struct peer *peer, const char *ifname)
BGP_NOTIFY_CEASE_CONFIG_CHANGE);
} else
bgp_session_reset(member);
+
+ /* Apply new source configuration to BFD session. */
+ if (member->bfd_config)
+ bgp_peer_bfd_update_source(member);
}
return 0;
@@ -4922,6 +4946,10 @@ int peer_update_source_addr_set(struct peer *peer, const union sockunion *su)
} else
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. */
return 0;
}
@@ -4954,6 +4982,10 @@ int peer_update_source_addr_set(struct peer *peer, const union sockunion *su)
BGP_NOTIFY_CEASE_CONFIG_CHANGE);
} else
bgp_session_reset(member);
+
+ /* Apply new source configuration to BFD session. */
+ if (member->bfd_config)
+ bgp_peer_bfd_update_source(member);
}
return 0;
@@ -4991,6 +5023,10 @@ int peer_update_source_unset(struct peer *peer)
} else
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. */
return 0;
}
@@ -5022,6 +5058,10 @@ int peer_update_source_unset(struct peer *peer)
BGP_NOTIFY_CEASE_CONFIG_CHANGE);
} else
bgp_session_reset(member);
+
+ /* Apply new source configuration to BFD session. */
+ if (member->bfd_config)
+ bgp_peer_bfd_update_source(member);
}
return 0;
diff --git a/lib/bfd.c b/lib/bfd.c
index ea363b7ca4..6672c75a24 100644
--- a/lib/bfd.c
+++ b/lib/bfd.c
@@ -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,
- 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,
(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,
- 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,
- (struct in6_addr *)dst))
+ if (!bfd_sess_address_changed(bsp, AF_INET6, src, dst))
return;
/* If already installed, remove the old setting. */
diff --git a/lib/bfd.h b/lib/bfd.h
index 6c0d1c177e..cc9659ff79 100644
--- a/lib/bfd.h
+++ b/lib/bfd.h
@@ -124,7 +124,8 @@ void bfd_sess_free(struct bfd_session_params **bsp);
* \param dst remote address (mandatory).
*/
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.
@@ -138,7 +139,8 @@ void bfd_sess_set_ipv4_addrs(struct bfd_session_params *bsp,
* \param dst remote address (mandatory).
*/
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.