From 3f3971a911668ab1d60a090ba1fff92f6ab8ce44 Mon Sep 17 00:00:00 2001 From: Donald Sharp Date: Wed, 1 Feb 2017 10:31:40 -0500 Subject: [PATCH] bgpd: Allow views to 'pretend' resolve nexthops Views are supposed to be independent tables that have no connection to routing tables. Since View's are 'independent' there is no way to do 'real' nexthop resolution since connected routes and interfaces are associated with a particular table (or really vrf). So when we have a bgp instance assume that nexthops specified are actually valid, since we are propagating what our neighbors are telling us. Signed-off-by: Donald Sharp [cherry-picked from master 6fa1ab2eecb39b35256739f7083196d6f556f639] Signed-off-by: David Lamparter --- bgpd/bgp_nht.c | 28 +++++++++++++++++++++++----- 1 file changed, 23 insertions(+), 5 deletions(-) diff --git a/bgpd/bgp_nht.c b/bgpd/bgp_nht.c index 1ca0483678..4c4fbc09b5 100644 --- a/bgpd/bgp_nht.c +++ b/bgpd/bgp_nht.c @@ -69,6 +69,14 @@ bgp_find_nexthop (struct bgp_info *path, int connected) if (!bnc) return 0; + /* + * We are cheating here. Views have no associated underlying + * ability to detect nexthops. So when we have a view + * just tell everyone the nexthop is valid + */ + if (path->peer && path->peer->bgp->inst_type == BGP_INSTANCE_TYPE_VIEW) + return 1; + if (connected && !(CHECK_FLAG(bnc->flags, BGP_NEXTHOP_CONNECTED))) return 0; @@ -196,7 +204,6 @@ bgp_find_or_add_nexthop (struct bgp *bgp, afi_t afi, struct bgp_info *ri, bnc = rn->info; bgp_unlock_node (rn); - if (is_bgp_static_route) { SET_FLAG(bnc->flags, BGP_STATIC_ROUTE); @@ -239,10 +246,13 @@ bgp_find_or_add_nexthop (struct bgp *bgp, afi_t afi, struct bgp_info *ri, UNSET_FLAG(bnc->flags, BGP_NEXTHOP_REGISTERED); UNSET_FLAG(bnc->flags, BGP_NEXTHOP_VALID); } - - if (!CHECK_FLAG(bnc->flags, BGP_NEXTHOP_REGISTERED)) + if (bgp->inst_type == BGP_INSTANCE_TYPE_VIEW) + { + bnc->flags |= BGP_NEXTHOP_REGISTERED; + bnc->flags |= BGP_NEXTHOP_VALID; + } + else if (!CHECK_FLAG(bnc->flags, BGP_NEXTHOP_REGISTERED)) register_zebra_rnh(bnc, is_bgp_static_route); - if (ri && ri->nexthop != bnc) { /* Unlink from existing nexthop cache, if any. This will also free @@ -260,7 +270,15 @@ bgp_find_or_add_nexthop (struct bgp *bgp, afi_t afi, struct bgp_info *ri, else if (peer) bnc->nht_info = (void *)peer; /* NHT peer reference */ - return (bgp_isvalid_nexthop(bnc)); + /* + * We are cheating here. Views have no associated underlying + * ability to detect nexthops. So when we have a view + * just tell everyone the nexthop is valid + */ + if (bgp->inst_type == BGP_INSTANCE_TYPE_VIEW) + return 1; + else + return (bgp_isvalid_nexthop(bnc)); } void