From 46c4f05bb6bf7a3f708ce06cf400fe6a0c987366 Mon Sep 17 00:00:00 2001 From: Iqra Siddiqui Date: Wed, 25 May 2022 23:45:57 -0700 Subject: [PATCH] bgpd: Inconsistencies in SNT counters with default-originate Description: Change is intended for fixing the inconsistencies present while adjusting the SNT counters with default originate. - SNT counter gets incremented on every change of policy associated with default-originate, leading to inconsistencies. - This fix has been added to ensure that the SNT counters gets incremented and decremented only once during the creation and deletion workflow of default-originate, and prevents incrementing the counter during update flow. Co-authored-by: Abhinay Ramesh Signed-off-by: Iqra Siddiqui --- bgpd/bgp_updgrp.h | 7 +++++++ bgpd/bgp_updgrp_packet.c | 14 ++++++++++++-- 2 files changed, 19 insertions(+), 2 deletions(-) diff --git a/bgpd/bgp_updgrp.h b/bgpd/bgp_updgrp.h index e3309ab7c5..473017c809 100644 --- a/bgpd/bgp_updgrp.h +++ b/bgpd/bgp_updgrp.h @@ -252,6 +252,13 @@ struct update_subgroup { #define SUBGRP_STATUS_DEFAULT_ORIGINATE (1 << 0) #define SUBGRP_STATUS_FORCE_UPDATES (1 << 1) #define SUBGRP_STATUS_TABLE_REPARSING (1 << 2) +/* + * This flag has been added to ensure that the SNT counters + * gets incremented and decremented only during the creation + * and deletion workflows of default originate, + * not during the update workflow. + */ +#define SUBGRP_STATUS_PEER_DEFAULT_ORIGINATED (1 << 3) uint16_t flags; #define SUBGRP_FLAG_NEEDS_REFRESH (1 << 0) diff --git a/bgpd/bgp_updgrp_packet.c b/bgpd/bgp_updgrp_packet.c index c4a3ca7500..88a81f255d 100644 --- a/bgpd/bgp_updgrp_packet.c +++ b/bgpd/bgp_updgrp_packet.c @@ -1142,7 +1142,12 @@ void subgroup_default_update_packet(struct update_subgroup *subgrp, (void)bpacket_queue_add(SUBGRP_PKTQ(subgrp), s, &vecarr); subgroup_trigger_write(subgrp); - subgrp->scount++; + + if (!CHECK_FLAG(subgrp->sflags, + SUBGRP_STATUS_PEER_DEFAULT_ORIGINATED)) { + subgrp->scount++; + SET_FLAG(subgrp->sflags, SUBGRP_STATUS_PEER_DEFAULT_ORIGINATED); + } } void subgroup_default_withdraw_packet(struct update_subgroup *subgrp) @@ -1235,7 +1240,12 @@ void subgroup_default_withdraw_packet(struct update_subgroup *subgrp) (void)bpacket_queue_add(SUBGRP_PKTQ(subgrp), s, NULL); subgroup_trigger_write(subgrp); - subgrp->scount--; + + if (CHECK_FLAG(subgrp->sflags, SUBGRP_STATUS_PEER_DEFAULT_ORIGINATED)) { + subgrp->scount--; + UNSET_FLAG(subgrp->sflags, + SUBGRP_STATUS_PEER_DEFAULT_ORIGINATED); + } } static void -- 2.39.5