Skip to content

Commit

Permalink
bgpd, doc: Allow route-map policy modifications to also affect route …
Browse files Browse the repository at this point in the history
…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>
  • Loading branch information
Dinesh Dutt authored and pjakma committed Sep 13, 2016
1 parent 5cf768a commit 083e5e2
Show file tree
Hide file tree
Showing 5 changed files with 93 additions and 4 deletions.
6 changes: 3 additions & 3 deletions bgpd/bgp_route.c
Expand Up @@ -1078,9 +1078,9 @@ bgp_announce_check (struct bgp_info *ri, struct peer *peer, struct prefix *p,
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;
Expand Down
78 changes: 78 additions & 0 deletions bgpd/bgp_vty.c
Expand Up @@ -1527,6 +1527,80 @@ ALIAS (no_bgp_default_local_preference,
"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)
Expand Down Expand Up @@ -10006,6 +10080,10 @@ bgp_vty_init (void)
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);
Expand Down
4 changes: 4 additions & 0 deletions bgpd/bgpd.c
Expand Up @@ -5528,6 +5528,10 @@ bgp_config_write (struct vty *vty)
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)
Expand Down
3 changes: 2 additions & 1 deletion bgpd/bgpd.h
Expand Up @@ -107,7 +107,7 @@ struct bgp
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)
Expand All @@ -124,6 +124,7 @@ struct bgp
#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];
Expand Down
6 changes: 6 additions & 0 deletions doc/bgpd.texi
Expand Up @@ -753,6 +753,12 @@ Apply a route-map on the neighbor. @var{direct} must be @code{in} or
@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
Expand Down

0 comments on commit 083e5e2

Please sign in to comment.