mirror of
https://git.proxmox.com/git/mirror_frr
synced 2025-08-08 19:37:46 +00:00
bgpd: Fix graceful-restart for peer-groups
Slipped somehow that peer-groups with GR is just completely broken, but it was
working before.
Strikes again, that we MUST have more and more topotests.
Fixes: 15403f521a
("bgpd: Streamline GR config, act on change immediately")
Signed-off-by: Donatas Abraitis <donatas@opensourcerouting.org>
This commit is contained in:
parent
28b45fd553
commit
0a85b1ba04
@ -2726,10 +2726,11 @@ static void bgp_gr_update_mode_of_all_peers(struct bgp *bgp,
|
|||||||
struct listnode *node = {0};
|
struct listnode *node = {0};
|
||||||
struct listnode *nnode = {0};
|
struct listnode *nnode = {0};
|
||||||
enum peer_mode peer_old_state = PEER_INVALID;
|
enum peer_mode peer_old_state = PEER_INVALID;
|
||||||
|
struct peer_group *group;
|
||||||
/* TODO: Need to handle peer-groups. */
|
struct peer *member;
|
||||||
|
|
||||||
for (ALL_LIST_ELEMENTS(bgp->peer, node, nnode, peer)) {
|
for (ALL_LIST_ELEMENTS(bgp->peer, node, nnode, peer)) {
|
||||||
|
if (!CHECK_FLAG(peer->sflags, PEER_STATUS_GROUP)) {
|
||||||
peer_old_state = bgp_peer_gr_mode_get(peer);
|
peer_old_state = bgp_peer_gr_mode_get(peer);
|
||||||
if (peer_old_state != PEER_GLOBAL_INHERIT)
|
if (peer_old_state != PEER_GLOBAL_INHERIT)
|
||||||
continue;
|
continue;
|
||||||
@ -2740,19 +2741,40 @@ static void bgp_gr_update_mode_of_all_peers(struct bgp *bgp,
|
|||||||
if (BGP_DEBUG(graceful_restart, GRACEFUL_RESTART))
|
if (BGP_DEBUG(graceful_restart, GRACEFUL_RESTART))
|
||||||
zlog_debug("%pBP: Inherited Global GR mode, GR flags 0x%x peer flags 0x%" PRIx64
|
zlog_debug("%pBP: Inherited Global GR mode, GR flags 0x%x peer flags 0x%" PRIx64
|
||||||
"...resetting session",
|
"...resetting session",
|
||||||
peer, peer->peer_gr_new_status_flag,
|
peer, peer->peer_gr_new_status_flag, peer->flags);
|
||||||
peer->flags);
|
|
||||||
|
|
||||||
peer->last_reset = PEER_DOWN_CAPABILITY_CHANGE;
|
peer->last_reset = PEER_DOWN_CAPABILITY_CHANGE;
|
||||||
|
|
||||||
/* Reset session to match with behavior for other peer
|
|
||||||
* configs that require the session to be re-setup.
|
|
||||||
*/
|
|
||||||
if (BGP_IS_VALID_STATE_FOR_NOTIF(peer->connection->status))
|
if (BGP_IS_VALID_STATE_FOR_NOTIF(peer->connection->status))
|
||||||
bgp_notify_send(peer->connection, BGP_NOTIFY_CEASE,
|
bgp_notify_send(peer->connection, BGP_NOTIFY_CEASE,
|
||||||
BGP_NOTIFY_CEASE_CONFIG_CHANGE);
|
BGP_NOTIFY_CEASE_CONFIG_CHANGE);
|
||||||
else
|
else
|
||||||
bgp_session_reset_safe(peer, &nnode);
|
bgp_session_reset_safe(peer, &nnode);
|
||||||
|
} else {
|
||||||
|
group = peer->group;
|
||||||
|
for (ALL_LIST_ELEMENTS(group->peer, node, nnode, member)) {
|
||||||
|
peer_old_state = bgp_peer_gr_mode_get(member);
|
||||||
|
if (peer_old_state != PEER_GLOBAL_INHERIT)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
bgp_peer_inherit_global_gr_mode(member, global_new_state);
|
||||||
|
bgp_peer_gr_flags_update(member);
|
||||||
|
|
||||||
|
if (BGP_DEBUG(graceful_restart, GRACEFUL_RESTART))
|
||||||
|
zlog_debug("%pBP: Inherited Global GR mode, GR flags 0x%x peer flags 0x%" PRIx64
|
||||||
|
"...resetting session",
|
||||||
|
member, member->peer_gr_new_status_flag,
|
||||||
|
member->flags);
|
||||||
|
|
||||||
|
member->last_reset = PEER_DOWN_CAPABILITY_CHANGE;
|
||||||
|
|
||||||
|
if (BGP_IS_VALID_STATE_FOR_NOTIF(member->connection->status))
|
||||||
|
bgp_notify_send(member->connection, BGP_NOTIFY_CEASE,
|
||||||
|
BGP_NOTIFY_CEASE_CONFIG_CHANGE);
|
||||||
|
else
|
||||||
|
bgp_session_reset(member);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2911,6 +2933,9 @@ unsigned int bgp_peer_gr_action(struct peer *peer, enum peer_mode old_state,
|
|||||||
{
|
{
|
||||||
enum global_mode global_gr_mode;
|
enum global_mode global_gr_mode;
|
||||||
bool session_reset = true;
|
bool session_reset = true;
|
||||||
|
struct peer_group *group;
|
||||||
|
struct peer *member;
|
||||||
|
struct listnode *node, *nnode;
|
||||||
|
|
||||||
if (old_state == new_state)
|
if (old_state == new_state)
|
||||||
return BGP_GR_NO_OPERATION;
|
return BGP_GR_NO_OPERATION;
|
||||||
@ -2945,16 +2970,27 @@ unsigned int bgp_peer_gr_action(struct peer *peer, enum peer_mode old_state,
|
|||||||
bgp_peer_move_to_gr_mode(peer, new_state);
|
bgp_peer_move_to_gr_mode(peer, new_state);
|
||||||
|
|
||||||
if (session_reset) {
|
if (session_reset) {
|
||||||
|
if (!CHECK_FLAG(peer->sflags, PEER_STATUS_GROUP)) {
|
||||||
peer->last_reset = PEER_DOWN_CAPABILITY_CHANGE;
|
peer->last_reset = PEER_DOWN_CAPABILITY_CHANGE;
|
||||||
|
|
||||||
/* Reset session to match with behavior for other peer
|
|
||||||
* configs that require the session to be re-setup.
|
|
||||||
*/
|
|
||||||
if (BGP_IS_VALID_STATE_FOR_NOTIF(peer->connection->status))
|
if (BGP_IS_VALID_STATE_FOR_NOTIF(peer->connection->status))
|
||||||
bgp_notify_send(peer->connection, BGP_NOTIFY_CEASE,
|
bgp_notify_send(peer->connection, BGP_NOTIFY_CEASE,
|
||||||
BGP_NOTIFY_CEASE_CONFIG_CHANGE);
|
BGP_NOTIFY_CEASE_CONFIG_CHANGE);
|
||||||
else
|
else
|
||||||
bgp_session_reset(peer);
|
bgp_session_reset(peer);
|
||||||
|
} else {
|
||||||
|
group = peer->group;
|
||||||
|
for (ALL_LIST_ELEMENTS(group->peer, node, nnode, member)) {
|
||||||
|
member->last_reset = PEER_DOWN_CAPABILITY_CHANGE;
|
||||||
|
bgp_peer_move_to_gr_mode(member, new_state);
|
||||||
|
|
||||||
|
if (BGP_IS_VALID_STATE_FOR_NOTIF(member->connection->status))
|
||||||
|
bgp_notify_send(member->connection, BGP_NOTIFY_CEASE,
|
||||||
|
BGP_NOTIFY_CEASE_CONFIG_CHANGE);
|
||||||
|
else
|
||||||
|
bgp_session_reset(member);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return BGP_GR_SUCCESS;
|
return BGP_GR_SUCCESS;
|
||||||
|
@ -3519,11 +3519,6 @@ DEFUN (bgp_neighbor_graceful_restart_set,
|
|||||||
peer = peer_and_group_lookup_vty(vty, argv[idx_peer]->arg);
|
peer = peer_and_group_lookup_vty(vty, argv[idx_peer]->arg);
|
||||||
if (!peer)
|
if (!peer)
|
||||||
return CMD_WARNING_CONFIG_FAILED;
|
return CMD_WARNING_CONFIG_FAILED;
|
||||||
if (CHECK_FLAG(peer->sflags, PEER_STATUS_GROUP)) {
|
|
||||||
vty_out(vty,
|
|
||||||
"Per peer-group graceful-restart configuration is not yet supported\n");
|
|
||||||
return CMD_WARNING_CONFIG_FAILED;
|
|
||||||
}
|
|
||||||
|
|
||||||
result = bgp_neighbor_graceful_restart(peer, PEER_GR_CMD);
|
result = bgp_neighbor_graceful_restart(peer, PEER_GR_CMD);
|
||||||
if (result == BGP_GR_SUCCESS) {
|
if (result == BGP_GR_SUCCESS) {
|
||||||
@ -3554,11 +3549,6 @@ DEFUN (no_bgp_neighbor_graceful_restart,
|
|||||||
peer = peer_and_group_lookup_vty(vty, argv[idx_peer]->arg);
|
peer = peer_and_group_lookup_vty(vty, argv[idx_peer]->arg);
|
||||||
if (!peer)
|
if (!peer)
|
||||||
return CMD_WARNING_CONFIG_FAILED;
|
return CMD_WARNING_CONFIG_FAILED;
|
||||||
if (CHECK_FLAG(peer->sflags, PEER_STATUS_GROUP)) {
|
|
||||||
vty_out(vty,
|
|
||||||
"Per peer-group graceful-restart configuration is not yet supported\n");
|
|
||||||
return CMD_WARNING_CONFIG_FAILED;
|
|
||||||
}
|
|
||||||
|
|
||||||
result = bgp_neighbor_graceful_restart(peer, NO_PEER_GR_CMD);
|
result = bgp_neighbor_graceful_restart(peer, NO_PEER_GR_CMD);
|
||||||
if (ret == BGP_GR_SUCCESS) {
|
if (ret == BGP_GR_SUCCESS) {
|
||||||
@ -3588,11 +3578,6 @@ DEFUN (bgp_neighbor_graceful_restart_helper_set,
|
|||||||
peer = peer_and_group_lookup_vty(vty, argv[idx_peer]->arg);
|
peer = peer_and_group_lookup_vty(vty, argv[idx_peer]->arg);
|
||||||
if (!peer)
|
if (!peer)
|
||||||
return CMD_WARNING_CONFIG_FAILED;
|
return CMD_WARNING_CONFIG_FAILED;
|
||||||
if (CHECK_FLAG(peer->sflags, PEER_STATUS_GROUP)) {
|
|
||||||
vty_out(vty,
|
|
||||||
"Per peer-group graceful-restart configuration is not yet supported\n");
|
|
||||||
return CMD_WARNING_CONFIG_FAILED;
|
|
||||||
}
|
|
||||||
|
|
||||||
ret = bgp_neighbor_graceful_restart(peer, PEER_HELPER_CMD);
|
ret = bgp_neighbor_graceful_restart(peer, PEER_HELPER_CMD);
|
||||||
if (ret == BGP_GR_SUCCESS) {
|
if (ret == BGP_GR_SUCCESS) {
|
||||||
@ -3623,11 +3608,6 @@ DEFUN (no_bgp_neighbor_graceful_restart_helper,
|
|||||||
peer = peer_and_group_lookup_vty(vty, argv[idx_peer]->arg);
|
peer = peer_and_group_lookup_vty(vty, argv[idx_peer]->arg);
|
||||||
if (!peer)
|
if (!peer)
|
||||||
return CMD_WARNING_CONFIG_FAILED;
|
return CMD_WARNING_CONFIG_FAILED;
|
||||||
if (CHECK_FLAG(peer->sflags, PEER_STATUS_GROUP)) {
|
|
||||||
vty_out(vty,
|
|
||||||
"Per peer-group graceful-restart configuration is not yet supported\n");
|
|
||||||
return CMD_WARNING_CONFIG_FAILED;
|
|
||||||
}
|
|
||||||
|
|
||||||
ret = bgp_neighbor_graceful_restart(peer, NO_PEER_HELPER_CMD);
|
ret = bgp_neighbor_graceful_restart(peer, NO_PEER_HELPER_CMD);
|
||||||
if (ret == BGP_GR_SUCCESS) {
|
if (ret == BGP_GR_SUCCESS) {
|
||||||
@ -3657,11 +3637,6 @@ DEFUN (bgp_neighbor_graceful_restart_disable_set,
|
|||||||
peer = peer_and_group_lookup_vty(vty, argv[idx_peer]->arg);
|
peer = peer_and_group_lookup_vty(vty, argv[idx_peer]->arg);
|
||||||
if (!peer)
|
if (!peer)
|
||||||
return CMD_WARNING_CONFIG_FAILED;
|
return CMD_WARNING_CONFIG_FAILED;
|
||||||
if (CHECK_FLAG(peer->sflags, PEER_STATUS_GROUP)) {
|
|
||||||
vty_out(vty,
|
|
||||||
"Per peer-group graceful-restart configuration is not yet supported\n");
|
|
||||||
return CMD_WARNING_CONFIG_FAILED;
|
|
||||||
}
|
|
||||||
|
|
||||||
ret = bgp_neighbor_graceful_restart(peer, PEER_DISABLE_CMD);
|
ret = bgp_neighbor_graceful_restart(peer, PEER_DISABLE_CMD);
|
||||||
if (ret == BGP_GR_SUCCESS) {
|
if (ret == BGP_GR_SUCCESS) {
|
||||||
@ -3693,11 +3668,6 @@ DEFUN (no_bgp_neighbor_graceful_restart_disable,
|
|||||||
peer = peer_and_group_lookup_vty(vty, argv[idx_peer]->arg);
|
peer = peer_and_group_lookup_vty(vty, argv[idx_peer]->arg);
|
||||||
if (!peer)
|
if (!peer)
|
||||||
return CMD_WARNING_CONFIG_FAILED;
|
return CMD_WARNING_CONFIG_FAILED;
|
||||||
if (CHECK_FLAG(peer->sflags, PEER_STATUS_GROUP)) {
|
|
||||||
vty_out(vty,
|
|
||||||
"Per peer-group graceful-restart configuration is not yet supported\n");
|
|
||||||
return CMD_WARNING_CONFIG_FAILED;
|
|
||||||
}
|
|
||||||
|
|
||||||
ret = bgp_neighbor_graceful_restart(peer, NO_PEER_DISABLE_CMD);
|
ret = bgp_neighbor_graceful_restart(peer, NO_PEER_DISABLE_CMD);
|
||||||
if (ret == BGP_GR_SUCCESS) {
|
if (ret == BGP_GR_SUCCESS) {
|
||||||
|
@ -3022,6 +3022,7 @@ static void peer_group2peer_config_copy(struct peer_group *group,
|
|||||||
PEER_ATTR_INHERIT(peer, group, local_role);
|
PEER_ATTR_INHERIT(peer, group, local_role);
|
||||||
|
|
||||||
/* Update GR flags for the peer. */
|
/* Update GR flags for the peer. */
|
||||||
|
PEER_ATTR_INHERIT(peer, group, peer_gr_new_status_flag);
|
||||||
bgp_peer_gr_flags_update(peer);
|
bgp_peer_gr_flags_update(peer);
|
||||||
|
|
||||||
/* Apply BFD settings from group to peer if it exists. */
|
/* Apply BFD settings from group to peer if it exists. */
|
||||||
|
Loading…
Reference in New Issue
Block a user