bgpd, doc: Allow route-map policy modifications to also affect route reflectors.
By default, attribute modification via route-map policy out is ignored on
reflected routes. This patch provides an option to allow this modification
to occur. Once enabled, it affects all reflected routes.
Signed-off-by: Dinesh G Dutt <ddutt@cumulusnetworks.com>
diff --git a/bgpd/bgp_route.c b/bgpd/bgp_route.c
index d3f1270..e5224dc 100644
--- a/bgpd/bgp_route.c
+++ b/bgpd/bgp_route.c
@@ -1078,9 +1078,9 @@
info.attr = attr;
/* The route reflector is not allowed to modify the attributes
- of the reflected IBGP routes. */
- if (from->sort == BGP_PEER_IBGP
- && peer->sort == BGP_PEER_IBGP)
+ of the reflected IBGP routes, unless configured to allow it */
+ if ((from->sort == BGP_PEER_IBGP && peer->sort == BGP_PEER_IBGP) &&
+ !bgp_flag_check(bgp, BGP_FLAG_RR_ALLOW_OUTBOUND_POLICY))
{
bgp_attr_dup (&dummy_attr, attr);
info.attr = &dummy_attr;
diff --git a/bgpd/bgp_vty.c b/bgpd/bgp_vty.c
index cd3d9a0..4cd8c5e 100644
--- a/bgpd/bgp_vty.c
+++ b/bgpd/bgp_vty.c
@@ -1527,6 +1527,80 @@
"local preference (higher=more preferred)\n"
"Configure default local preference value\n")
+static void
+peer_announce_routes_if_rmap_out (struct bgp *bgp)
+{
+ struct peer *peer;
+ struct listnode *node, *nnode;
+ struct bgp_filter *filter;
+ afi_t afi;
+ safi_t safi;
+
+ /* Reannounce all routes to appropriate neighbors */
+ for (ALL_LIST_ELEMENTS (bgp->peer, node, nnode, peer))
+ {
+ for (afi = AFI_IP; afi < AFI_MAX; afi++)
+ for (safi = SAFI_UNICAST; safi < SAFI_MAX; safi++)
+ {
+ if (CHECK_FLAG(peer->af_flags[afi][safi], PEER_FLAG_REFLECTOR_CLIENT))
+ {
+ /* check if there's an out route-map on this client */
+ filter = &peer->filter[afi][safi];
+ if (ROUTE_MAP_OUT_NAME(filter))
+ {
+ if (BGP_DEBUG(update, UPDATE_OUT))
+ zlog_debug("%s: Announcing routes again for peer %s"
+ "(afi=%d, safi=%d", __func__, peer->host, afi,
+ safi);
+
+ bgp_announce_route_all(peer);
+ }
+ }
+ }
+ }
+}
+
+DEFUN (bgp_rr_allow_outbound_policy,
+ bgp_rr_allow_outbound_policy_cmd,
+ "bgp route-reflector allow-outbound-policy",
+ "BGP specific commands\n"
+ "Allow modifications made by out route-map\n"
+ "on ibgp neighbors\n")
+{
+ struct bgp *bgp;
+
+ bgp = vty->index;
+
+ if (!bgp_flag_check(bgp, BGP_FLAG_RR_ALLOW_OUTBOUND_POLICY))
+ {
+ bgp_flag_set(bgp, BGP_FLAG_RR_ALLOW_OUTBOUND_POLICY);
+ peer_announce_routes_if_rmap_out(bgp);
+ }
+
+ return CMD_SUCCESS;
+}
+
+DEFUN (no_bgp_rr_allow_outbound_policy,
+ no_bgp_rr_allow_outbound_policy_cmd,
+ "no bgp route-reflector allow-outbound-policy",
+ NO_STR
+ "BGP specific commands\n"
+ "Allow modifications made by out route-map\n"
+ "on ibgp neighbors\n")
+{
+ struct bgp *bgp;
+
+ bgp = vty->index;
+
+ if (bgp_flag_check(bgp, BGP_FLAG_RR_ALLOW_OUTBOUND_POLICY))
+ {
+ bgp_flag_unset(bgp, BGP_FLAG_RR_ALLOW_OUTBOUND_POLICY);
+ peer_announce_routes_if_rmap_out(bgp);
+ }
+
+ return CMD_SUCCESS;
+}
+
static int
peer_remote_as_vty (struct vty *vty, const char *peer_str,
const char *as_str, afi_t afi, safi_t safi)
@@ -10006,6 +10080,10 @@
install_element (BGP_NODE, &no_bgp_default_local_preference_cmd);
install_element (BGP_NODE, &no_bgp_default_local_preference_val_cmd);
+ /* bgp ibgp-allow-policy-mods command */
+ install_element (BGP_NODE, &bgp_rr_allow_outbound_policy_cmd);
+ install_element (BGP_NODE, &no_bgp_rr_allow_outbound_policy_cmd);
+
/* "neighbor remote-as" commands. */
install_element (BGP_NODE, &neighbor_remote_as_cmd);
install_element (BGP_NODE, &no_neighbor_cmd);
diff --git a/bgpd/bgpd.c b/bgpd/bgpd.c
index db952c7..7f472c5 100644
--- a/bgpd/bgpd.c
+++ b/bgpd/bgpd.c
@@ -5528,6 +5528,10 @@
if (bgp_flag_check (bgp, BGP_FLAG_ASPATH_MULTIPATH_RELAX)) {
vty_out (vty, " bgp bestpath as-path multipath-relax%s", VTY_NEWLINE);
}
+ if (bgp_flag_check (bgp, BGP_FLAG_RR_ALLOW_OUTBOUND_POLICY)) {
+ vty_out (vty, " bgp route-reflector allow-outbound-policy%s",
+ VTY_NEWLINE);
+ }
if (bgp_flag_check (bgp, BGP_FLAG_COMPARE_ROUTER_ID))
vty_out (vty, " bgp bestpath compare-routerid%s", VTY_NEWLINE);
if (bgp_flag_check (bgp, BGP_FLAG_MED_CONFED)
diff --git a/bgpd/bgpd.h b/bgpd/bgpd.h
index a6ced5b..7bd5a78 100644
--- a/bgpd/bgpd.h
+++ b/bgpd/bgpd.h
@@ -107,7 +107,7 @@
struct thread *t_startup;
/* BGP flags. */
- u_int16_t flags;
+ u_int32_t flags;
#define BGP_FLAG_ALWAYS_COMPARE_MED (1 << 0)
#define BGP_FLAG_DETERMINISTIC_MED (1 << 1)
#define BGP_FLAG_MED_MISSING_AS_WORST (1 << 2)
@@ -124,6 +124,7 @@
#define BGP_FLAG_ASPATH_CONFED (1 << 13)
#define BGP_FLAG_ASPATH_MULTIPATH_RELAX (1 << 14)
#define BGP_FLAG_DELETING (1 << 15)
+#define BGP_FLAG_RR_ALLOW_OUTBOUND_POLICY (1 << 16)
/* BGP Per AF flags */
u_int16_t af_flags[AFI_MAX][SAFI_MAX];
diff --git a/doc/bgpd.texi b/doc/bgpd.texi
index 5735111..d5aa30c 100644
--- a/doc/bgpd.texi
+++ b/doc/bgpd.texi
@@ -753,6 +753,12 @@
@code{out}.
@end deffn
+@deffn {BGP} {bgp route-reflector allow-outbound-policy} {}
+By default, attribute modification via route-map policy out is not reflected
+on reflected routes. This option allows the modifications to be reflected as
+well. Once enabled, it affects all reflected routes.
+@end deffn
+
@c -----------------------------------------------------------------------
@node BGP Peer Group
@section BGP Peer Group