bgpd: Add peer_notify_config_change() function

We have about a bajillion tests of if we can
notify the peer and then we send a config change
notification.  Let's just make a function that
does this.

Signed-off-by: Donald Sharp <sharpd@nvidia.com>
This commit is contained in:
Donald Sharp 2024-11-06 08:15:06 -05:00
parent 2e5b4e32c4
commit ba0edb9545
4 changed files with 52 additions and 103 deletions

View File

@ -2746,8 +2746,7 @@ static void bgp_gr_update_mode_of_all_peers(struct bgp *bgp,
peer->last_reset = PEER_DOWN_CAPABILITY_CHANGE;
if (BGP_IS_VALID_STATE_FOR_NOTIF(peer->connection->status))
bgp_notify_send(peer->connection, BGP_NOTIFY_CEASE,
BGP_NOTIFY_CEASE_CONFIG_CHANGE);
peer_notify_config_change(peer->connection);
else
bgp_session_reset_safe(peer, &nnode);
} else {
@ -2769,8 +2768,7 @@ static void bgp_gr_update_mode_of_all_peers(struct bgp *bgp,
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);
peer_notify_config_change(member->connection);
else
bgp_session_reset(member);
}
@ -2974,8 +2972,7 @@ unsigned int bgp_peer_gr_action(struct peer *peer, enum peer_mode old_state,
peer->last_reset = PEER_DOWN_CAPABILITY_CHANGE;
if (BGP_IS_VALID_STATE_FOR_NOTIF(peer->connection->status))
bgp_notify_send(peer->connection, BGP_NOTIFY_CEASE,
BGP_NOTIFY_CEASE_CONFIG_CHANGE);
peer_notify_config_change(peer->connection);
else
bgp_session_reset(peer);
} else {
@ -2985,8 +2982,7 @@ unsigned int bgp_peer_gr_action(struct peer *peer, enum peer_mode old_state,
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);
peer_notify_config_change(member->connection);
else
bgp_session_reset(member);
}

View File

@ -2940,9 +2940,7 @@ DEFUN(bgp_reject_as_sets, bgp_reject_as_sets_cmd,
*/
for (ALL_LIST_ELEMENTS(bgp->peer, node, nnode, peer)) {
peer->last_reset = PEER_DOWN_AS_SETS_REJECT;
if (BGP_IS_VALID_STATE_FOR_NOTIF(peer->connection->status))
bgp_notify_send(peer->connection, BGP_NOTIFY_CEASE,
BGP_NOTIFY_CEASE_CONFIG_CHANGE);
peer_notify_config_change(peer->connection);
}
return CMD_SUCCESS;
@ -2965,9 +2963,7 @@ DEFUN(no_bgp_reject_as_sets, no_bgp_reject_as_sets_cmd,
*/
for (ALL_LIST_ELEMENTS(bgp->peer, node, nnode, peer)) {
peer->last_reset = PEER_DOWN_AS_SETS_REJECT;
if (BGP_IS_VALID_STATE_FOR_NOTIF(peer->connection->status))
bgp_notify_send(peer->connection, BGP_NOTIFY_CEASE,
BGP_NOTIFY_CEASE_CONFIG_CHANGE);
peer_notify_config_change(peer->connection);
}
return CMD_SUCCESS;
@ -5101,8 +5097,7 @@ static int peer_conf_interface_get(struct vty *vty, const char *conf_if,
/* v6only flag changed. Reset bgp seesion */
if (BGP_IS_VALID_STATE_FOR_NOTIF(peer->connection->status))
bgp_notify_send(peer->connection, BGP_NOTIFY_CEASE,
BGP_NOTIFY_CEASE_CONFIG_CHANGE);
peer_notify_config_change(peer->connection);
else
bgp_session_reset(peer);
}

View File

@ -309,9 +309,7 @@ static int bgp_router_id_set(struct bgp *bgp, const struct in_addr *id,
peer->last_reset = PEER_DOWN_RID_CHANGE;
if (BGP_IS_VALID_STATE_FOR_NOTIF(peer->connection->status))
bgp_notify_send(peer->connection, BGP_NOTIFY_CEASE,
BGP_NOTIFY_CEASE_CONFIG_CHANGE);
peer_notify_config_change(peer->connection);
}
/* EVPN uses router id in RD, update them */
@ -447,8 +445,7 @@ void bm_wait_for_fib_set(bool set)
peer->connection->status))
continue;
bgp_notify_send(peer->connection, BGP_NOTIFY_CEASE,
BGP_NOTIFY_CEASE_CONFIG_CHANGE);
peer_notify_config_change(peer->connection);
}
}
}
@ -507,8 +504,7 @@ void bgp_suppress_fib_pending_set(struct bgp *bgp, bool set)
if (!BGP_IS_VALID_STATE_FOR_NOTIF(peer->connection->status))
continue;
bgp_notify_send(peer->connection, BGP_NOTIFY_CEASE,
BGP_NOTIFY_CEASE_CONFIG_CHANGE);
peer_notify_config_change(peer->connection);
}
}
@ -532,9 +528,7 @@ void bgp_cluster_id_set(struct bgp *bgp, struct in_addr *cluster_id)
peer->last_reset = PEER_DOWN_CLID_CHANGE;
if (BGP_IS_VALID_STATE_FOR_NOTIF(peer->connection->status))
bgp_notify_send(peer->connection, BGP_NOTIFY_CEASE,
BGP_NOTIFY_CEASE_CONFIG_CHANGE);
peer_notify_config_change(peer->connection);
}
}
@ -556,9 +550,7 @@ void bgp_cluster_id_unset(struct bgp *bgp)
peer->last_reset = PEER_DOWN_CLID_CHANGE;
if (BGP_IS_VALID_STATE_FOR_NOTIF(peer->connection->status))
bgp_notify_send(peer->connection, BGP_NOTIFY_CEASE,
BGP_NOTIFY_CEASE_CONFIG_CHANGE);
peer_notify_config_change(peer->connection);
}
}
@ -641,9 +633,7 @@ void bgp_confederation_id_set(struct bgp *bgp, as_t as, const char *as_str)
peer->connection->status)) {
peer->last_reset =
PEER_DOWN_CONFED_ID_CHANGE;
bgp_notify_send(peer->connection,
BGP_NOTIFY_CEASE,
BGP_NOTIFY_CEASE_CONFIG_CHANGE);
peer_notify_config_change(peer->connection);
} else
bgp_session_reset_safe(peer, &nnode);
}
@ -659,9 +649,7 @@ void bgp_confederation_id_set(struct bgp *bgp, as_t as, const char *as_str)
peer->connection->status)) {
peer->last_reset =
PEER_DOWN_CONFED_ID_CHANGE;
bgp_notify_send(peer->connection,
BGP_NOTIFY_CEASE,
BGP_NOTIFY_CEASE_CONFIG_CHANGE);
peer_notify_config_change(peer->connection);
} else
bgp_session_reset_safe(peer, &nnode);
}
@ -686,9 +674,7 @@ void bgp_confederation_id_unset(struct bgp *bgp)
peer->last_reset = PEER_DOWN_CONFED_ID_CHANGE;
if (BGP_IS_VALID_STATE_FOR_NOTIF(
peer->connection->status))
bgp_notify_send(peer->connection,
BGP_NOTIFY_CEASE,
BGP_NOTIFY_CEASE_CONFIG_CHANGE);
peer_notify_config_change(peer->connection);
else
bgp_session_reset_safe(peer, &nnode);
}
@ -740,9 +726,7 @@ void bgp_confederation_peers_add(struct bgp *bgp, as_t as, const char *as_str)
peer->connection->status)) {
peer->last_reset =
PEER_DOWN_CONFED_PEER_CHANGE;
bgp_notify_send(peer->connection,
BGP_NOTIFY_CEASE,
BGP_NOTIFY_CEASE_CONFIG_CHANGE);
peer_notify_config_change(peer->connection);
} else
bgp_session_reset_safe(peer, &nnode);
}
@ -797,9 +781,7 @@ void bgp_confederation_peers_remove(struct bgp *bgp, as_t as)
peer->connection->status)) {
peer->last_reset =
PEER_DOWN_CONFED_PEER_CHANGE;
bgp_notify_send(peer->connection,
BGP_NOTIFY_CEASE,
BGP_NOTIFY_CEASE_CONFIG_CHANGE);
peer_notify_config_change(peer->connection);
} else
bgp_session_reset_safe(peer, &nnode);
}
@ -2100,8 +2082,7 @@ void peer_as_change(struct peer *peer, as_t as, enum peer_asn_type as_type,
if (!CHECK_FLAG(peer->sflags, PEER_STATUS_GROUP)) {
peer->last_reset = PEER_DOWN_REMOTE_AS_CHANGE;
if (BGP_IS_VALID_STATE_FOR_NOTIF(peer->connection->status))
bgp_notify_send(peer->connection, BGP_NOTIFY_CEASE,
BGP_NOTIFY_CEASE_CONFIG_CHANGE);
peer_notify_config_change(peer->connection);
else
bgp_session_reset(peer);
}
@ -2467,15 +2448,11 @@ static int peer_activate_af(struct peer *peer, afi_t afi, safi_t safi)
false);
}
} else {
bgp_notify_send(peer->connection,
BGP_NOTIFY_CEASE,
BGP_NOTIFY_CEASE_CONFIG_CHANGE);
peer_notify_config_change(peer->connection);
}
}
if (peer->connection->status == OpenSent ||
peer->connection->status == OpenConfirm)
bgp_notify_send(peer->connection, BGP_NOTIFY_CEASE,
BGP_NOTIFY_CEASE_CONFIG_CHANGE);
peer_notify_config_change(peer->connection);
/*
* If we are turning on a AFI/SAFI locally and we've
* started bringing a peer up, we need to tell
@ -2488,8 +2465,7 @@ static int peer_activate_af(struct peer *peer, afi_t afi, safi_t safi)
other = peer->doppelganger;
if (other && (other->connection->status == OpenSent ||
other->connection->status == OpenConfirm))
bgp_notify_send(other->connection, BGP_NOTIFY_CEASE,
BGP_NOTIFY_CEASE_CONFIG_CHANGE);
peer_notify_config_change(other->connection);
}
return 0;
@ -2596,14 +2572,10 @@ static bool non_peergroup_deactivate_af(struct peer *peer, afi_t afi,
bgp_clear_route(peer, afi, safi);
peer->pcount[afi][safi] = 0;
} else {
bgp_notify_send(peer->connection,
BGP_NOTIFY_CEASE,
BGP_NOTIFY_CEASE_CONFIG_CHANGE);
peer_notify_config_change(peer->connection);
}
} else {
bgp_notify_send(peer->connection, BGP_NOTIFY_CEASE,
BGP_NOTIFY_CEASE_CONFIG_CHANGE);
}
} else
peer_notify_config_change(peer->connection);
}
return false;
@ -3076,6 +3048,12 @@ int peer_group_remote_as(struct bgp *bgp, const char *group_name, as_t *as,
return 0;
}
void peer_notify_config_change(struct peer_connection *connection)
{
if (BGP_IS_VALID_STATE_FOR_NOTIF(connection->status))
bgp_notify_send(connection, BGP_NOTIFY_CEASE, BGP_NOTIFY_CEASE_CONFIG_CHANGE);
}
void peer_notify_unconfig(struct peer_connection *connection)
{
if (BGP_IS_VALID_STATE_FOR_NOTIF(connection->status))
@ -3356,8 +3334,7 @@ int peer_group_bind(struct bgp *bgp, union sockunion *su, struct peer *peer,
peer->last_reset = PEER_DOWN_RMAP_BIND;
if (BGP_IS_VALID_STATE_FOR_NOTIF(peer->connection->status))
bgp_notify_send(peer->connection, BGP_NOTIFY_CEASE,
BGP_NOTIFY_CEASE_CONFIG_CHANGE);
peer_notify_config_change(peer->connection);
else
bgp_session_reset(peer);
}
@ -4725,8 +4702,7 @@ void peer_change_action(struct peer *peer, afi_t afi, safi_t safi,
PEER_FLAG_CONFIG_NODE)))
peer_delete(peer->doppelganger);
bgp_notify_send(peer->connection, BGP_NOTIFY_CEASE,
BGP_NOTIFY_CEASE_CONFIG_CHANGE);
peer_notify_config_change(peer->connection);
} else if (type == peer_change_reset_in) {
if (CHECK_FLAG(peer->cap, PEER_CAP_REFRESH_RCV))
bgp_route_refresh_send(peer, afi, safi, 0, 0, 0,
@ -4738,8 +4714,7 @@ void peer_change_action(struct peer *peer, afi_t afi, safi_t safi,
PEER_FLAG_CONFIG_NODE)))
peer_delete(peer->doppelganger);
bgp_notify_send(peer->connection, BGP_NOTIFY_CEASE,
BGP_NOTIFY_CEASE_CONFIG_CHANGE);
peer_notify_config_change(peer->connection);
}
} else if (type == peer_change_reset_out) {
paf = peer_af_find(peer, afi, safi);
@ -4939,8 +4914,7 @@ static void peer_flag_modify_action(struct peer *peer, uint64_t flag)
BGP_EVENT_ADD(peer->connection, BGP_Stop);
}
} else if (BGP_IS_VALID_STATE_FOR_NOTIF(peer->connection->status)) {
bgp_notify_send(peer->connection, BGP_NOTIFY_CEASE,
BGP_NOTIFY_CEASE_CONFIG_CHANGE);
peer_notify_config_change(peer->connection);
} else
bgp_session_reset(peer);
}
@ -5427,9 +5401,7 @@ int peer_ebgp_multihop_set(struct peer *peer, int ttl)
if (peer->sort != BGP_PEER_IBGP) {
if (BGP_IS_VALID_STATE_FOR_NOTIF(
peer->connection->status))
bgp_notify_send(peer->connection,
BGP_NOTIFY_CEASE,
BGP_NOTIFY_CEASE_CONFIG_CHANGE);
peer_notify_config_change(peer->connection);
else
bgp_session_reset(peer);
@ -5446,8 +5418,7 @@ int peer_ebgp_multihop_set(struct peer *peer, int ttl)
member->ttl = group->conf->ttl;
if (BGP_IS_VALID_STATE_FOR_NOTIF(member->connection->status))
bgp_notify_send(member->connection, BGP_NOTIFY_CEASE,
BGP_NOTIFY_CEASE_CONFIG_CHANGE);
peer_notify_config_change(member->connection);
else
bgp_session_reset(member);
@ -5484,8 +5455,7 @@ int peer_ebgp_multihop_unset(struct peer *peer)
if (!CHECK_FLAG(peer->sflags, PEER_STATUS_GROUP)) {
if (BGP_IS_VALID_STATE_FOR_NOTIF(peer->connection->status))
bgp_notify_send(peer->connection, BGP_NOTIFY_CEASE,
BGP_NOTIFY_CEASE_CONFIG_CHANGE);
peer_notify_config_change(peer->connection);
else
bgp_session_reset(peer);
@ -5502,8 +5472,7 @@ int peer_ebgp_multihop_unset(struct peer *peer)
if (member->connection->fd >= 0) {
if (BGP_IS_VALID_STATE_FOR_NOTIF(member->connection->status))
bgp_notify_send(member->connection, BGP_NOTIFY_CEASE,
BGP_NOTIFY_CEASE_CONFIG_CHANGE);
peer_notify_config_change(member->connection);
else
bgp_session_reset(member);
}
@ -5657,8 +5626,7 @@ int peer_update_source_if_set(struct peer *peer, const char *ifname)
peer->last_reset = PEER_DOWN_UPDATE_SOURCE_CHANGE;
/* Send notification or reset peer depending on state. */
if (BGP_IS_VALID_STATE_FOR_NOTIF(peer->connection->status))
bgp_notify_send(peer->connection, BGP_NOTIFY_CEASE,
BGP_NOTIFY_CEASE_CONFIG_CHANGE);
peer_notify_config_change(peer->connection);
else
bgp_session_reset(peer);
@ -5695,8 +5663,7 @@ int peer_update_source_if_set(struct peer *peer, const char *ifname)
/* Send notification or reset peer depending on state. */
if (BGP_IS_VALID_STATE_FOR_NOTIF(member->connection->status))
bgp_notify_send(member->connection, BGP_NOTIFY_CEASE,
BGP_NOTIFY_CEASE_CONFIG_CHANGE);
peer_notify_config_change(member->connection);
else
bgp_session_reset(member);
@ -5728,8 +5695,7 @@ void peer_update_source_addr_set(struct peer *peer, const union sockunion *su)
peer->last_reset = PEER_DOWN_UPDATE_SOURCE_CHANGE;
/* Send notification or reset peer depending on state. */
if (BGP_IS_VALID_STATE_FOR_NOTIF(peer->connection->status))
bgp_notify_send(peer->connection, BGP_NOTIFY_CEASE,
BGP_NOTIFY_CEASE_CONFIG_CHANGE);
peer_notify_config_change(peer->connection);
else
bgp_session_reset(peer);
@ -5765,8 +5731,7 @@ void peer_update_source_addr_set(struct peer *peer, const union sockunion *su)
/* Send notification or reset peer depending on state. */
if (BGP_IS_VALID_STATE_FOR_NOTIF(member->connection->status))
bgp_notify_send(member->connection, BGP_NOTIFY_CEASE,
BGP_NOTIFY_CEASE_CONFIG_CHANGE);
peer_notify_config_change(peer->connection);
else
bgp_session_reset(member);
@ -5816,8 +5781,7 @@ void peer_update_source_unset(struct peer *peer)
peer->last_reset = PEER_DOWN_UPDATE_SOURCE_CHANGE;
/* Send notification or reset peer depending on state. */
if (BGP_IS_VALID_STATE_FOR_NOTIF(peer->connection->status))
bgp_notify_send(peer->connection, BGP_NOTIFY_CEASE,
BGP_NOTIFY_CEASE_CONFIG_CHANGE);
peer_notify_config_change(peer->connection);
else
bgp_session_reset(peer);
@ -5852,8 +5816,7 @@ void peer_update_source_unset(struct peer *peer)
/* Send notification or reset peer depending on state. */
if (BGP_IS_VALID_STATE_FOR_NOTIF(member->connection->status))
bgp_notify_send(member->connection, BGP_NOTIFY_CEASE,
BGP_NOTIFY_CEASE_CONFIG_CHANGE);
peer_notify_config_change(member->connection);
else
bgp_session_reset(member);
@ -6885,8 +6848,7 @@ int peer_local_as_unset(struct peer *peer)
peer->last_reset = PEER_DOWN_LOCAL_AS_CHANGE;
/* Send notification or stop peer depending on state. */
if (BGP_IS_VALID_STATE_FOR_NOTIF(peer->connection->status))
bgp_notify_send(peer->connection, BGP_NOTIFY_CEASE,
BGP_NOTIFY_CEASE_CONFIG_CHANGE);
peer_notify_config_change(peer->connection);
else
BGP_EVENT_ADD(peer->connection, BGP_Stop);
@ -6914,8 +6876,7 @@ int peer_local_as_unset(struct peer *peer)
/* Send notification or stop peer depending on state. */
if (BGP_IS_VALID_STATE_FOR_NOTIF(member->connection->status))
bgp_notify_send(member->connection, BGP_NOTIFY_CEASE,
BGP_NOTIFY_CEASE_CONFIG_CHANGE);
peer_notify_config_change(member->connection);
else
bgp_session_reset(member);
}
@ -6946,8 +6907,7 @@ int peer_password_set(struct peer *peer, const char *password)
peer->last_reset = PEER_DOWN_PASSWORD_CHANGE;
/* Send notification or reset peer depending on state. */
if (BGP_IS_VALID_STATE_FOR_NOTIF(peer->connection->status))
bgp_notify_send(peer->connection, BGP_NOTIFY_CEASE,
BGP_NOTIFY_CEASE_CONFIG_CHANGE);
peer_notify_config_change(peer->connection);
else
bgp_session_reset(peer);
@ -6984,8 +6944,7 @@ int peer_password_set(struct peer *peer, const char *password)
member->last_reset = PEER_DOWN_PASSWORD_CHANGE;
/* Send notification or reset peer depending on state. */
if (BGP_IS_VALID_STATE_FOR_NOTIF(member->connection->status))
bgp_notify_send(member->connection, BGP_NOTIFY_CEASE,
BGP_NOTIFY_CEASE_CONFIG_CHANGE);
peer_notify_config_change(member->connection);
else
bgp_session_reset(member);
@ -7030,8 +6989,7 @@ int peer_password_unset(struct peer *peer)
if (!CHECK_FLAG(peer->sflags, PEER_STATUS_GROUP)) {
/* Send notification or reset peer depending on state. */
if (BGP_IS_VALID_STATE_FOR_NOTIF(peer->connection->status))
bgp_notify_send(peer->connection, BGP_NOTIFY_CEASE,
BGP_NOTIFY_CEASE_CONFIG_CHANGE);
peer_notify_config_change(peer->connection);
else
bgp_session_reset(peer);
@ -7057,8 +7015,7 @@ int peer_password_unset(struct peer *peer)
/* Send notification or reset peer depending on state. */
if (BGP_IS_VALID_STATE_FOR_NOTIF(member->connection->status))
bgp_notify_send(member->connection, BGP_NOTIFY_CEASE,
BGP_NOTIFY_CEASE_CONFIG_CHANGE);
peer_notify_config_change(member->connection);
else
bgp_session_reset(member);

View File

@ -2386,6 +2386,7 @@ extern int peer_group_remote_as(struct bgp *bgp, const char *peer_str, as_t *as,
enum peer_asn_type as_type, const char *as_str);
extern int peer_delete(struct peer *peer);
extern void peer_notify_unconfig(struct peer_connection *connection);
extern void peer_notify_config_change(struct peer_connection *connection);
extern int peer_group_delete(struct peer_group *);
extern int peer_group_remote_as_delete(struct peer_group *);
extern int peer_group_listen_range_add(struct peer_group *, struct prefix *);