summaryrefslogtreecommitdiffstats
path: root/bgpd/bgp_vty.c
diff options
context:
space:
mode:
authorTimo Teräs <timo.teras@iki.fi>2014-04-24 10:22:37 +0300
committerTimo Teräs <timo.teras@iki.fi>2014-06-25 21:20:20 +0300
commit9e7a53c179f6897128b24435452b5d3d0f8c715a (patch)
tree80a5cc6e9e6dc411587764d865a2bf5f489000ba /bgpd/bgp_vty.c
parent2aa640bd78b64821bde9a53ecdd1e96e91b20ae4 (diff)
downloadquagga-9e7a53c179f6897128b24435452b5d3d0f8c715a.tar.bz2
quagga-9e7a53c179f6897128b24435452b5d3d0f8c715a.tar.xz
bgpd: implement "next-hop-self all"
As specified in: http://www.cisco.com/c/en/us/td/docs/ios-xml/ios/iproute_bgp/command/irg-cr-book/bgp-m1.html#wp4972925610 This allows overriding next-hop for ibgp learned routes on an RR for reflected routes. Especially useful for using iBGP in DMVPN setups. See: http://blog.ipspace.net/2014/04/changes-in-ibgp-next-hop-processing.html Signed-off-by: Timo Teräs <timo.teras@iki.fi>
Diffstat (limited to 'bgpd/bgp_vty.c')
-rw-r--r--bgpd/bgp_vty.c30
1 files changed, 23 insertions, 7 deletions
diff --git a/bgpd/bgp_vty.c b/bgpd/bgp_vty.c
index 3c6973b0..a818fe7a 100644
--- a/bgpd/bgp_vty.c
+++ b/bgpd/bgp_vty.c
@@ -2093,25 +2093,41 @@ DEFUN (no_neighbor_capability_orf_prefix,
/* neighbor next-hop-self. */
DEFUN (neighbor_nexthop_self,
neighbor_nexthop_self_cmd,
- NEIGHBOR_CMD2 "next-hop-self",
+ NEIGHBOR_CMD2 "next-hop-self {all}",
NEIGHBOR_STR
NEIGHBOR_ADDR_STR2
- "Disable the next hop calculation for this neighbor\n")
+ "Disable the next hop calculation for this neighbor\n"
+ "Apply also to ibgp-learned routes when acting as a route reflector\n")
{
- return peer_af_flag_set_vty (vty, argv[0], bgp_node_afi (vty),
- bgp_node_safi (vty), PEER_FLAG_NEXTHOP_SELF);
+ u_int32_t flags = PEER_FLAG_NEXTHOP_SELF, unset = 0;
+ int rc;
+
+ /* Check if "all" is specified */
+ if (argv[1] != NULL)
+ flags |= PEER_FLAG_NEXTHOP_SELF_ALL;
+ else
+ unset |= PEER_FLAG_NEXTHOP_SELF_ALL;
+
+ rc = peer_af_flag_set_vty (vty, argv[0], bgp_node_afi (vty),
+ bgp_node_safi (vty), flags);
+ if ( rc == CMD_SUCCESS && unset )
+ rc = peer_af_flag_unset_vty (vty, argv[0], bgp_node_afi (vty),
+ bgp_node_safi (vty), unset);
+ return rc;
}
DEFUN (no_neighbor_nexthop_self,
no_neighbor_nexthop_self_cmd,
- NO_NEIGHBOR_CMD2 "next-hop-self",
+ NO_NEIGHBOR_CMD2 "next-hop-self {all}",
NO_STR
NEIGHBOR_STR
NEIGHBOR_ADDR_STR2
- "Disable the next hop calculation for this neighbor\n")
+ "Disable the next hop calculation for this neighbor\n"
+ "Apply also to ibgp-learned routes when acting as a route reflector\n")
{
return peer_af_flag_unset_vty (vty, argv[0], bgp_node_afi (vty),
- bgp_node_safi (vty), PEER_FLAG_NEXTHOP_SELF);
+ bgp_node_safi (vty),
+ PEER_FLAG_NEXTHOP_SELF|PEER_FLAG_NEXTHOP_SELF_ALL);
}
/* neighbor remove-private-AS. */