Merge remote-tracking branch 'origin/cmaster' into cmaster-next

This commit is contained in:
Donald Sharp 2016-09-08 19:37:42 -04:00
commit dfee47aa92
6 changed files with 68 additions and 3 deletions

View File

@ -73,7 +73,7 @@ bgp_bfd_peer_group2peer_copy(struct peer *conf, struct peer *peer)
/*
* bgp_bfd_is_peer_multihop - returns whether BFD peer is multi-hop or single hop.
*/
static int
int
bgp_bfd_is_peer_multihop(struct peer *peer)
{
struct bfd_info *bfd_info;

View File

@ -42,4 +42,7 @@ bgp_bfd_peer_config_write(struct vty *vty, struct peer *peer, char *addr);
extern void
bgp_bfd_show_info(struct vty *vty, struct peer *peer, u_char use_json, json_object *json_neigh);
extern int
bgp_bfd_is_peer_multihop(struct peer *peer);
#endif /* _QUAGGA_BGP_BFD_H */

View File

@ -371,8 +371,8 @@ bgp_parse_nexthop_update (int command, vrf_id_t vrf_id)
{
char buf[PREFIX2STR_BUFFER];
prefix2str(&p, buf, sizeof (buf));
zlog_debug("parse nexthop update(%s): metric=%d, #nexthop=%d", buf,
metric, nexthop_num);
zlog_debug("%d: NH update for %s - metric %d (cur %d) #nhops %d (cur %d)",
vrf_id, buf, metric, bnc->metric, nexthop_num, bnc->nexthop_num);
}
if (metric != bnc->metric)
@ -419,6 +419,13 @@ bgp_parse_nexthop_update (int command, vrf_id_t vrf_id)
break;
}
if (BGP_DEBUG(nht, NHT))
{
char buf[NEXTHOP_STRLEN];
zlog_debug(" nhop via %s",
nexthop2str (nexthop, buf, sizeof (buf)));
}
if (nhlist_tail)
{
nhlist_tail->next = nexthop;
@ -641,6 +648,14 @@ evaluate_paths (struct bgp_nexthop_cache *bnc)
int afi;
struct peer *peer = (struct peer *)bnc->nht_info;
if (BGP_DEBUG(nht, NHT))
{
char buf[PREFIX2STR_BUFFER];
bnc_str(bnc, buf, PREFIX2STR_BUFFER);
zlog_debug("NH update for %s - flags 0x%x chgflags 0x%x - evaluate paths",
buf, bnc->flags, bnc->change_flags);
}
LIST_FOREACH(path, &(bnc->paths), nh_thread)
{
if (!(path->type == ZEBRA_ROUTE_BGP &&

View File

@ -45,6 +45,7 @@ Boston, MA 02111-1307, USA. */
#include "bgpd/bgp_mpath.h"
#include "bgpd/bgp_nexthop.h"
#include "bgpd/bgp_nht.h"
#include "bgpd/bgp_bfd.h"
/* All information about zebra. */
struct zclient *zclient = NULL;
@ -359,7 +360,16 @@ bgp_interface_down (int command, struct zclient *zclient, zebra_size_t length,
for (ALL_LIST_ELEMENTS (bgp->peer, node, nnode, peer))
{
#if defined(HAVE_CUMULUS)
/* Take down directly connected EBGP peers as well as 1-hop BFD
* tracked (directly connected) IBGP peers.
*/
if ((peer->ttl != 1) && (peer->gtsm_hops != 1) &&
(!peer->bfd_info || bgp_bfd_is_peer_multihop(peer)))
#else
/* Take down directly connected EBGP peers */
if ((peer->ttl != 1) && (peer->gtsm_hops != 1))
#endif
continue;
if (ifp == peer->nexthop.ifp)

View File

@ -153,3 +153,36 @@ nexthops_free (struct nexthop *nexthop)
nexthop_free (nh);
}
}
const char *
nexthop2str (struct nexthop *nexthop, char *str, int size)
{
switch (nexthop->type)
{
case NEXTHOP_TYPE_IFINDEX:
snprintf (str, size, "if %u", nexthop->ifindex);
break;
case NEXTHOP_TYPE_IPV4:
snprintf (str, size, "%s", inet_ntoa (nexthop->gate.ipv4));
break;
case NEXTHOP_TYPE_IPV4_IFINDEX:
snprintf (str, size, "%s if %u",
inet_ntoa (nexthop->gate.ipv4), nexthop->ifindex);
break;
case NEXTHOP_TYPE_IPV6:
snprintf (str, size, "%s", inet6_ntoa (nexthop->gate.ipv6));
break;
case NEXTHOP_TYPE_IPV6_IFINDEX:
snprintf (str, size, "%s if %u",
inet6_ntoa (nexthop->gate.ipv6), nexthop->ifindex);
break;
case NEXTHOP_TYPE_BLACKHOLE:
snprintf (str, size, "blackhole");
break;
default:
snprintf (str, size, "unknown");
break;
}
return str;
}

View File

@ -26,6 +26,9 @@
#include "prefix.h"
/* Maximum next hop string length - gateway + ifindex */
#define NEXTHOP_STRLEN (INET6_ADDRSTRLEN + 30)
union g_addr {
struct in_addr ipv4;
struct in6_addr ipv6;
@ -97,4 +100,5 @@ void nexthops_free (struct nexthop *nexthop);
extern const char *nexthop_type_to_str (enum nexthop_types_t nh_type);
extern int nexthop_same_no_recurse (struct nexthop *next1, struct nexthop *next2);
extern const char * nexthop2str (struct nexthop *nexthop, char *str, int size);
#endif /*_LIB_NEXTHOP_H */