mirror of
https://git.proxmox.com/git/mirror_frr
synced 2025-08-07 15:24:43 +00:00
bgpd: bgp_announce_route should know if we should force the update or not
When calling bgp_announce_route allow it to properly set the flag to force an update to go out or not. Signed-off-by: Donald Sharp <sharpd@nvidia.com>
This commit is contained in:
parent
31df775552
commit
e1a32ec1c5
@ -1961,6 +1961,7 @@ static int bgp_route_refresh_receive(struct peer *peer, bgp_size_t size)
|
|||||||
struct update_group *updgrp;
|
struct update_group *updgrp;
|
||||||
struct peer *updgrp_peer;
|
struct peer *updgrp_peer;
|
||||||
uint8_t subtype;
|
uint8_t subtype;
|
||||||
|
bool force_update = false;
|
||||||
bgp_size_t msg_length =
|
bgp_size_t msg_length =
|
||||||
size - (BGP_MSG_ROUTE_REFRESH_MIN_SIZE - BGP_HEADER_SIZE);
|
size - (BGP_MSG_ROUTE_REFRESH_MIN_SIZE - BGP_HEADER_SIZE);
|
||||||
|
|
||||||
@ -2222,7 +2223,7 @@ static int bgp_route_refresh_receive(struct peer *peer, bgp_size_t size)
|
|||||||
/* Avoid supressing duplicate routes later
|
/* Avoid supressing duplicate routes later
|
||||||
* when processing in subgroup_announce_table().
|
* when processing in subgroup_announce_table().
|
||||||
*/
|
*/
|
||||||
SET_FLAG(paf->subgroup->sflags, SUBGRP_STATUS_FORCE_UPDATES);
|
force_update = true;
|
||||||
|
|
||||||
/* If the peer is configured for default-originate clear the
|
/* If the peer is configured for default-originate clear the
|
||||||
* SUBGRP_STATUS_DEFAULT_ORIGINATE flag so that we will
|
* SUBGRP_STATUS_DEFAULT_ORIGINATE flag so that we will
|
||||||
@ -2354,7 +2355,7 @@ static int bgp_route_refresh_receive(struct peer *peer, bgp_size_t size)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Perform route refreshment to the peer */
|
/* Perform route refreshment to the peer */
|
||||||
bgp_announce_route(peer, afi, safi);
|
bgp_announce_route(peer, afi, safi, force_update);
|
||||||
|
|
||||||
/* No FSM action necessary */
|
/* No FSM action necessary */
|
||||||
return BGP_PACKET_NOOP;
|
return BGP_PACKET_NOOP;
|
||||||
@ -2457,7 +2458,8 @@ static int bgp_capability_msg_parse(struct peer *peer, uint8_t *pnt,
|
|||||||
peer->afc_recv[afi][safi] = 1;
|
peer->afc_recv[afi][safi] = 1;
|
||||||
if (peer->afc[afi][safi]) {
|
if (peer->afc[afi][safi]) {
|
||||||
peer->afc_nego[afi][safi] = 1;
|
peer->afc_nego[afi][safi] = 1;
|
||||||
bgp_announce_route(peer, afi, safi);
|
bgp_announce_route(peer, afi, safi,
|
||||||
|
false);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
peer->afc_recv[afi][safi] = 0;
|
peer->afc_recv[afi][safi] = 0;
|
||||||
|
@ -4588,8 +4588,11 @@ static int bgp_announce_route_timer_expired(struct thread *t)
|
|||||||
* bgp_announce_route
|
* bgp_announce_route
|
||||||
*
|
*
|
||||||
* *Triggers* announcement of routes of a given AFI/SAFI to a peer.
|
* *Triggers* announcement of routes of a given AFI/SAFI to a peer.
|
||||||
|
*
|
||||||
|
* if force is true we will force an update even if the update
|
||||||
|
* limiting code is attempted to kick in.
|
||||||
*/
|
*/
|
||||||
void bgp_announce_route(struct peer *peer, afi_t afi, safi_t safi)
|
void bgp_announce_route(struct peer *peer, afi_t afi, safi_t safi, bool force)
|
||||||
{
|
{
|
||||||
struct peer_af *paf;
|
struct peer_af *paf;
|
||||||
struct update_subgroup *subgrp;
|
struct update_subgroup *subgrp;
|
||||||
@ -4606,6 +4609,9 @@ void bgp_announce_route(struct peer *peer, afi_t afi, safi_t safi)
|
|||||||
if (!subgrp || paf->t_announce_route)
|
if (!subgrp || paf->t_announce_route)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
if (force)
|
||||||
|
SET_FLAG(subgrp->sflags, SUBGRP_STATUS_FORCE_UPDATES);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Start a timer to stagger/delay the announce. This serves
|
* Start a timer to stagger/delay the announce. This serves
|
||||||
* two purposes - announcement can potentially be combined for
|
* two purposes - announcement can potentially be combined for
|
||||||
@ -4634,7 +4640,7 @@ void bgp_announce_route_all(struct peer *peer)
|
|||||||
safi_t safi;
|
safi_t safi;
|
||||||
|
|
||||||
FOREACH_AFI_SAFI (afi, safi)
|
FOREACH_AFI_SAFI (afi, safi)
|
||||||
bgp_announce_route(peer, afi, safi);
|
bgp_announce_route(peer, afi, safi, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Flag or unflag bgp_dest to determine whether it should be treated by
|
/* Flag or unflag bgp_dest to determine whether it should be treated by
|
||||||
@ -4772,7 +4778,7 @@ static int bgp_soft_reconfig_table_task(struct thread *thread)
|
|||||||
table->soft_reconfig_peers,
|
table->soft_reconfig_peers,
|
||||||
peer);
|
peer);
|
||||||
bgp_announce_route(peer, table->afi,
|
bgp_announce_route(peer, table->afi,
|
||||||
table->safi);
|
table->safi, false);
|
||||||
if (list_isempty(
|
if (list_isempty(
|
||||||
table->soft_reconfig_peers)) {
|
table->soft_reconfig_peers)) {
|
||||||
list_delete(
|
list_delete(
|
||||||
@ -4800,7 +4806,7 @@ static int bgp_soft_reconfig_table_task(struct thread *thread)
|
|||||||
*/
|
*/
|
||||||
for (ALL_LIST_ELEMENTS(table->soft_reconfig_peers, node, nnode, peer)) {
|
for (ALL_LIST_ELEMENTS(table->soft_reconfig_peers, node, nnode, peer)) {
|
||||||
listnode_delete(table->soft_reconfig_peers, peer);
|
listnode_delete(table->soft_reconfig_peers, peer);
|
||||||
bgp_announce_route(peer, table->afi, table->safi);
|
bgp_announce_route(peer, table->afi, table->safi, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
list_delete(&table->soft_reconfig_peers);
|
list_delete(&table->soft_reconfig_peers);
|
||||||
|
@ -608,7 +608,8 @@ extern void bgp_process_queue_init(struct bgp *bgp);
|
|||||||
extern void bgp_route_init(void);
|
extern void bgp_route_init(void);
|
||||||
extern void bgp_route_finish(void);
|
extern void bgp_route_finish(void);
|
||||||
extern void bgp_cleanup_routes(struct bgp *);
|
extern void bgp_cleanup_routes(struct bgp *);
|
||||||
extern void bgp_announce_route(struct peer *, afi_t, safi_t);
|
extern void bgp_announce_route(struct peer *peer, afi_t afi, safi_t safi,
|
||||||
|
bool force);
|
||||||
extern void bgp_stop_announce_route_timer(struct peer_af *paf);
|
extern void bgp_stop_announce_route_timer(struct peer_af *paf);
|
||||||
extern void bgp_announce_route_all(struct peer *);
|
extern void bgp_announce_route_all(struct peer *);
|
||||||
extern void bgp_default_originate(struct peer *, afi_t, safi_t, int);
|
extern void bgp_default_originate(struct peer *, afi_t, safi_t, int);
|
||||||
|
17
bgpd/bgpd.c
17
bgpd/bgpd.c
@ -2156,7 +2156,8 @@ static int peer_activate_af(struct peer *peer, afi_t afi, safi_t safi)
|
|||||||
CAPABILITY_ACTION_SET);
|
CAPABILITY_ACTION_SET);
|
||||||
if (peer->afc_recv[afi][safi]) {
|
if (peer->afc_recv[afi][safi]) {
|
||||||
peer->afc_nego[afi][safi] = 1;
|
peer->afc_nego[afi][safi] = 1;
|
||||||
bgp_announce_route(peer, afi, safi);
|
bgp_announce_route(peer, afi, safi,
|
||||||
|
false);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
peer->last_reset = PEER_DOWN_AF_ACTIVATE;
|
peer->last_reset = PEER_DOWN_AF_ACTIVATE;
|
||||||
@ -4142,7 +4143,7 @@ void peer_change_action(struct peer *peer, afi_t afi, safi_t safi,
|
|||||||
SUBGRP_STATUS_FORCE_UPDATES);
|
SUBGRP_STATUS_FORCE_UPDATES);
|
||||||
|
|
||||||
update_group_adjust_peer(paf);
|
update_group_adjust_peer(paf);
|
||||||
bgp_announce_route(peer, afi, safi);
|
bgp_announce_route(peer, afi, safi, false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -5058,7 +5059,7 @@ int peer_default_originate_set(struct peer *peer, afi_t afi, safi_t safi,
|
|||||||
if (peer_established(peer) && peer->afc_nego[afi][safi]) {
|
if (peer_established(peer) && peer->afc_nego[afi][safi]) {
|
||||||
update_group_adjust_peer(peer_af_find(peer, afi, safi));
|
update_group_adjust_peer(peer_af_find(peer, afi, safi));
|
||||||
bgp_default_originate(peer, afi, safi, 0);
|
bgp_default_originate(peer, afi, safi, 0);
|
||||||
bgp_announce_route(peer, afi, safi);
|
bgp_announce_route(peer, afi, safi, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Skip peer-group mechanics for regular peers. */
|
/* Skip peer-group mechanics for regular peers. */
|
||||||
@ -5095,7 +5096,7 @@ int peer_default_originate_set(struct peer *peer, afi_t afi, safi_t safi,
|
|||||||
update_group_adjust_peer(
|
update_group_adjust_peer(
|
||||||
peer_af_find(member, afi, safi));
|
peer_af_find(member, afi, safi));
|
||||||
bgp_default_originate(member, afi, safi, 0);
|
bgp_default_originate(member, afi, safi, 0);
|
||||||
bgp_announce_route(member, afi, safi);
|
bgp_announce_route(member, afi, safi, false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -5134,7 +5135,7 @@ int peer_default_originate_unset(struct peer *peer, afi_t afi, safi_t safi)
|
|||||||
if (peer_established(peer) && peer->afc_nego[afi][safi]) {
|
if (peer_established(peer) && peer->afc_nego[afi][safi]) {
|
||||||
update_group_adjust_peer(peer_af_find(peer, afi, safi));
|
update_group_adjust_peer(peer_af_find(peer, afi, safi));
|
||||||
bgp_default_originate(peer, afi, safi, 1);
|
bgp_default_originate(peer, afi, safi, 1);
|
||||||
bgp_announce_route(peer, afi, safi);
|
bgp_announce_route(peer, afi, safi, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Skip peer-group mechanics for regular peers. */
|
/* Skip peer-group mechanics for regular peers. */
|
||||||
@ -5165,7 +5166,7 @@ int peer_default_originate_unset(struct peer *peer, afi_t afi, safi_t safi)
|
|||||||
if (peer_established(member) && member->afc_nego[afi][safi]) {
|
if (peer_established(member) && member->afc_nego[afi][safi]) {
|
||||||
update_group_adjust_peer(peer_af_find(member, afi, safi));
|
update_group_adjust_peer(peer_af_find(member, afi, safi));
|
||||||
bgp_default_originate(member, afi, safi, 1);
|
bgp_default_originate(member, afi, safi, 1);
|
||||||
bgp_announce_route(member, afi, safi);
|
bgp_announce_route(member, afi, safi, false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -5213,7 +5214,7 @@ static void peer_on_policy_change(struct peer *peer, afi_t afi, safi_t safi,
|
|||||||
if (outbound) {
|
if (outbound) {
|
||||||
update_group_adjust_peer(peer_af_find(peer, afi, safi));
|
update_group_adjust_peer(peer_af_find(peer, afi, safi));
|
||||||
if (peer_established(peer))
|
if (peer_established(peer))
|
||||||
bgp_announce_route(peer, afi, safi);
|
bgp_announce_route(peer, afi, safi, false);
|
||||||
} else {
|
} else {
|
||||||
if (!peer_established(peer))
|
if (!peer_established(peer))
|
||||||
return;
|
return;
|
||||||
@ -7480,7 +7481,7 @@ int peer_clear_soft(struct peer *peer, afi_t afi, safi_t safi,
|
|||||||
UNSET_FLAG(paf->subgroup->sflags,
|
UNSET_FLAG(paf->subgroup->sflags,
|
||||||
SUBGRP_STATUS_DEFAULT_ORIGINATE);
|
SUBGRP_STATUS_DEFAULT_ORIGINATE);
|
||||||
|
|
||||||
bgp_announce_route(peer, afi, safi);
|
bgp_announce_route(peer, afi, safi, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (stype == BGP_CLEAR_SOFT_IN_ORF_PREFIX) {
|
if (stype == BGP_CLEAR_SOFT_IN_ORF_PREFIX) {
|
||||||
|
Loading…
Reference in New Issue
Block a user