Skip to content

Commit

Permalink
Merge pull request #3286 from donaldsharp/late_registration
Browse files Browse the repository at this point in the history
bgpd: Late registration of Extended Nexthop should allow RA's to happen
  • Loading branch information
eqvinox authored Nov 13, 2018
2 parents 50daf9a + 1ea03b9 commit 8bed7a8
Show file tree
Hide file tree
Showing 3 changed files with 60 additions and 0 deletions.
45 changes: 45 additions & 0 deletions bgpd/bgp_nht.c
Original file line number Diff line number Diff line change
Expand Up @@ -838,3 +838,48 @@ void bgp_nht_register_nexthops(struct bgp *bgp)
}
}
}

void bgp_nht_register_enhe_capability_interfaces(struct peer *peer)
{
struct bgp *bgp;
struct bgp_node *rn;
struct bgp_nexthop_cache *bnc;
struct nexthop *nhop;
struct interface *ifp;
struct prefix p;

if (peer->ifp)
return;

bgp = peer->bgp;

if (!bgp->nexthop_cache_table[AFI_IP6])
return;

if (!sockunion2hostprefix(&peer->su, &p)) {
if (BGP_DEBUG(nht, NHT))
zlog_debug("%s: Unable to convert prefix to sockunion",
__PRETTY_FUNCTION__);
return;
}

if (p.family != AF_INET6)
return;
rn = bgp_node_lookup(bgp->nexthop_cache_table[AFI_IP6], &p);

bnc = bgp_nexthop_get_node_info(rn);
if (!bnc)
return;

if (peer != bnc->nht_info)
return;

for (nhop = bnc->nexthop; nhop; nhop = nhop->next) {
ifp = if_lookup_by_index(nhop->ifindex,
nhop->vrf_id);
zclient_send_interface_radv_req(zclient,
nhop->vrf_id,
ifp, true,
BGP_UNNUM_DEFAULT_RA_INTERVAL);
}
}
9 changes: 9 additions & 0 deletions bgpd/bgp_nht.h
Original file line number Diff line number Diff line change
Expand Up @@ -88,4 +88,13 @@ extern void path_nh_map(struct bgp_path_info *path,
*/
extern void bgp_nht_register_nexthops(struct bgp *bgp);

/*
* When we have the the PEER_FLAG_CAPABILITY_ENHE flag
* set on a peer *after* it has been brought up we need
* to notice and setup the interface based RA,
* this code can walk the registered nexthops and
* register the important ones with zebra for RA.
*/
extern void bgp_nht_register_enhe_capability_interfaces(struct peer *peer);

#endif /* _BGP_NHT_H */
6 changes: 6 additions & 0 deletions bgpd/bgpd.c
Original file line number Diff line number Diff line change
Expand Up @@ -3905,6 +3905,9 @@ static int peer_flag_modify(struct peer *peer, uint32_t flag, int set)
return 0;
}

if (set && flag == PEER_FLAG_CAPABILITY_ENHE)
bgp_nht_register_enhe_capability_interfaces(peer);

/*
* Update peer-group members, unless they are explicitely overriding
* peer-group configuration.
Expand All @@ -3928,6 +3931,9 @@ static int peer_flag_modify(struct peer *peer, uint32_t flag, int set)
/* Update flag on peer-group member. */
COND_FLAG(member->flags, flag, set != member_invert);

if (set && flag == PEER_FLAG_CAPABILITY_ENHE)
bgp_nht_register_enhe_capability_interfaces(member);

/* Execute flag action on peer-group member. */
if (action.type == peer_change_reset)
peer_flag_modify_action(member, flag);
Expand Down

0 comments on commit 8bed7a8

Please sign in to comment.