mirror of
https://git.proxmox.com/git/mirror_frr
synced 2025-08-07 15:33:56 +00:00
Merge remote-tracking branch 'origin/cmaster' into cmaster-next
This commit is contained in:
commit
dfee47aa92
@ -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.
|
* 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)
|
bgp_bfd_is_peer_multihop(struct peer *peer)
|
||||||
{
|
{
|
||||||
struct bfd_info *bfd_info;
|
struct bfd_info *bfd_info;
|
||||||
|
@ -42,4 +42,7 @@ bgp_bfd_peer_config_write(struct vty *vty, struct peer *peer, char *addr);
|
|||||||
extern void
|
extern void
|
||||||
bgp_bfd_show_info(struct vty *vty, struct peer *peer, u_char use_json, json_object *json_neigh);
|
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 */
|
#endif /* _QUAGGA_BGP_BFD_H */
|
||||||
|
@ -371,8 +371,8 @@ bgp_parse_nexthop_update (int command, vrf_id_t vrf_id)
|
|||||||
{
|
{
|
||||||
char buf[PREFIX2STR_BUFFER];
|
char buf[PREFIX2STR_BUFFER];
|
||||||
prefix2str(&p, buf, sizeof (buf));
|
prefix2str(&p, buf, sizeof (buf));
|
||||||
zlog_debug("parse nexthop update(%s): metric=%d, #nexthop=%d", buf,
|
zlog_debug("%d: NH update for %s - metric %d (cur %d) #nhops %d (cur %d)",
|
||||||
metric, nexthop_num);
|
vrf_id, buf, metric, bnc->metric, nexthop_num, bnc->nexthop_num);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (metric != bnc->metric)
|
if (metric != bnc->metric)
|
||||||
@ -419,6 +419,13 @@ bgp_parse_nexthop_update (int command, vrf_id_t vrf_id)
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (BGP_DEBUG(nht, NHT))
|
||||||
|
{
|
||||||
|
char buf[NEXTHOP_STRLEN];
|
||||||
|
zlog_debug(" nhop via %s",
|
||||||
|
nexthop2str (nexthop, buf, sizeof (buf)));
|
||||||
|
}
|
||||||
|
|
||||||
if (nhlist_tail)
|
if (nhlist_tail)
|
||||||
{
|
{
|
||||||
nhlist_tail->next = nexthop;
|
nhlist_tail->next = nexthop;
|
||||||
@ -641,6 +648,14 @@ evaluate_paths (struct bgp_nexthop_cache *bnc)
|
|||||||
int afi;
|
int afi;
|
||||||
struct peer *peer = (struct peer *)bnc->nht_info;
|
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)
|
LIST_FOREACH(path, &(bnc->paths), nh_thread)
|
||||||
{
|
{
|
||||||
if (!(path->type == ZEBRA_ROUTE_BGP &&
|
if (!(path->type == ZEBRA_ROUTE_BGP &&
|
||||||
|
@ -45,6 +45,7 @@ Boston, MA 02111-1307, USA. */
|
|||||||
#include "bgpd/bgp_mpath.h"
|
#include "bgpd/bgp_mpath.h"
|
||||||
#include "bgpd/bgp_nexthop.h"
|
#include "bgpd/bgp_nexthop.h"
|
||||||
#include "bgpd/bgp_nht.h"
|
#include "bgpd/bgp_nht.h"
|
||||||
|
#include "bgpd/bgp_bfd.h"
|
||||||
|
|
||||||
/* All information about zebra. */
|
/* All information about zebra. */
|
||||||
struct zclient *zclient = NULL;
|
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))
|
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))
|
if ((peer->ttl != 1) && (peer->gtsm_hops != 1))
|
||||||
|
#endif
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
if (ifp == peer->nexthop.ifp)
|
if (ifp == peer->nexthop.ifp)
|
||||||
|
@ -153,3 +153,36 @@ nexthops_free (struct nexthop *nexthop)
|
|||||||
nexthop_free (nh);
|
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;
|
||||||
|
}
|
||||||
|
@ -26,6 +26,9 @@
|
|||||||
|
|
||||||
#include "prefix.h"
|
#include "prefix.h"
|
||||||
|
|
||||||
|
/* Maximum next hop string length - gateway + ifindex */
|
||||||
|
#define NEXTHOP_STRLEN (INET6_ADDRSTRLEN + 30)
|
||||||
|
|
||||||
union g_addr {
|
union g_addr {
|
||||||
struct in_addr ipv4;
|
struct in_addr ipv4;
|
||||||
struct in6_addr ipv6;
|
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 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 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 */
|
#endif /*_LIB_NEXTHOP_H */
|
||||||
|
Loading…
Reference in New Issue
Block a user