summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDonatas Abraitis <donatas.abraitis@gmail.com>2019-10-31 09:53:18 +0200
committerDonatas Abraitis <donatas.abraitis@gmail.com>2019-10-31 09:53:18 +0200
commita612fb77d59dbf066814534085269a4553f7f757 (patch)
treed4970e98ba76339ba84cd4ee1489d3e943601071
parentf149ebd9a764ce786eda6242d3b395bf07a3415c (diff)
bgpd: Reflect the distance in RIB when it is changed for an arbitrary afi/safi
debian-9# show ip route 192.168.255.2/32 longer-prefixes Codes: K - kernel route, C - connected, S - static, R - RIP, O - OSPF, I - IS-IS, B - BGP, E - EIGRP, N - NHRP, T - Table, v - VNC, V - VNC-Direct, A - Babel, D - SHARP, F - PBR, f - OpenFabric, > - selected route, * - FIB route, q - queued route, r - rejected route B>* 192.168.255.2/32 [20/0] via 192.168.0.1, eth1, 00:15:22 debian-9# conf debian-9(config)# router bgp 100 debian-9(config-router)# address-family ipv4 debian-9(config-router-af)# distance bgp 123 123 123 debian-9(config-router-af)# do show ip route 192.168.255.2/32 longer-prefixes Codes: K - kernel route, C - connected, S - static, R - RIP, O - OSPF, I - IS-IS, B - BGP, E - EIGRP, N - NHRP, T - Table, v - VNC, V - VNC-Direct, A - Babel, D - SHARP, F - PBR, f - OpenFabric, > - selected route, * - FIB route, q - queued route, r - rejected route B>* 192.168.255.2/32 [123/0] via 192.168.0.1, eth1, 00:00:09 debian-9(config-router-af)# no distance bgp debian-9(config-router-af)# do show ip route 192.168.255.2/32 longer-prefixes Codes: K - kernel route, C - connected, S - static, R - RIP, O - OSPF, I - IS-IS, B - BGP, E - EIGRP, N - NHRP, T - Table, v - VNC, V - VNC-Direct, A - Babel, D - SHARP, F - PBR, f - OpenFabric, > - selected route, * - FIB route, q - queued route, r - rejected route B>* 192.168.255.2/32 [20/0] via 192.168.0.1, eth1, 00:00:02 debian-9(config-router-af)# Signed-off-by: Donatas Abraitis <donatas.abraitis@gmail.com>
-rw-r--r--bgpd/bgp_route.c27
1 files changed, 27 insertions, 0 deletions
diff --git a/bgpd/bgp_route.c b/bgpd/bgp_route.c
index 41e32b3112..53854b0860 100644
--- a/bgpd/bgp_route.c
+++ b/bgpd/bgp_route.c
@@ -11926,6 +11926,31 @@ uint8_t bgp_distance_apply(struct prefix *p, struct bgp_path_info *pinfo,
}
}
+/* If we enter `distance bgp (1-255) (1-255) (1-255)`,
+ * we should tell ZEBRA update the routes for a specific
+ * AFI/SAFI to reflect changes in RIB.
+ */
+static void bgp_announce_routes_distance_update(struct bgp *bgp)
+{
+ afi_t afi;
+ safi_t safi;
+
+ FOREACH_AFI_SAFI (afi, safi) {
+ if (!bgp_fibupd_safi(safi))
+ continue;
+
+ if (bgp->distance_ebgp[afi][safi]
+ && bgp->distance_ibgp[afi][safi]
+ && bgp->distance_local[afi][safi]) {
+ if (BGP_DEBUG(zebra, ZEBRA))
+ zlog_debug(
+ "%s: Announcing routes due to distance change afi/safi (%d/%d)",
+ __func__, afi, safi);
+ bgp_zebra_announce_table(bgp, afi, safi);
+ }
+ }
+}
+
DEFUN (bgp_distance,
bgp_distance_cmd,
"distance bgp (1-255) (1-255) (1-255)",
@@ -11948,6 +11973,7 @@ DEFUN (bgp_distance,
bgp->distance_ebgp[afi][safi] = atoi(argv[idx_number]->arg);
bgp->distance_ibgp[afi][safi] = atoi(argv[idx_number_2]->arg);
bgp->distance_local[afi][safi] = atoi(argv[idx_number_3]->arg);
+ bgp_announce_routes_distance_update(bgp);
return CMD_SUCCESS;
}
@@ -11971,6 +11997,7 @@ DEFUN (no_bgp_distance,
bgp->distance_ebgp[afi][safi] = 0;
bgp->distance_ibgp[afi][safi] = 0;
bgp->distance_local[afi][safi] = 0;
+ bgp_announce_routes_distance_update(bgp);
return CMD_SUCCESS;
}