diff options
521 files changed, 20987 insertions, 8523 deletions
diff --git a/alpine/APKBUILD.in b/alpine/APKBUILD.in index 43a77832a9..d6c6c5f0af 100644 --- a/alpine/APKBUILD.in +++ b/alpine/APKBUILD.in @@ -6,7 +6,7 @@ pkgrel=0 pkgdesc="FRRouting is a fork of quagga" url="https://frrouting.org/" license="GPL-2.0" -depends="json-c c-ares ipsec-tools iproute2 python3 py-ipaddr bash" +depends="json-c c-ares iproute2 python3 bash" makedepends="ncurses-dev net-snmp-dev gawk texinfo perl acct autoconf automake bash binutils bison bsd-compat-headers build-base c-ares c-ares-dev ca-certificates cryptsetup-libs curl device-mapper-libs diff --git a/babeld/babel_filter.c b/babeld/babel_filter.c index 28ba8e16a2..731ad1ba8b 100644 --- a/babeld/babel_filter.c +++ b/babeld/babel_filter.c @@ -59,24 +59,16 @@ babel_filter(int output, const unsigned char *prefix, unsigned short plen, if (access_list_apply (babel_ifp->list[distribute], &p) == FILTER_DENY) { debugf(BABEL_DEBUG_FILTER, - "%s/%d filtered by distribute %s", - p.family == AF_INET ? - inet_ntoa(p.u.prefix4) : - inet6_ntoa (p.u.prefix6), - p.prefixlen, - output ? "out" : "in"); + "%pFX filtered by distribute %s", + &p, output ? "out" : "in"); return INFINITY; } } if (babel_ifp != NULL && babel_ifp->prefix[distribute]) { if (prefix_list_apply (babel_ifp->prefix[distribute], &p) == PREFIX_DENY) { - debugf(BABEL_DEBUG_FILTER, "%s/%d filtered by distribute %s", - p.family == AF_INET ? - inet_ntoa(p.u.prefix4) : - inet6_ntoa (p.u.prefix6), - p.prefixlen, - output ? "out" : "in"); + debugf(BABEL_DEBUG_FILTER, "%pFX filtered by distribute %s", + &p, output ? "out" : "in"); return INFINITY; } } @@ -91,12 +83,8 @@ babel_filter(int output, const unsigned char *prefix, unsigned short plen, if (alist) { if (access_list_apply (alist, &p) == FILTER_DENY) { - debugf(BABEL_DEBUG_FILTER,"%s/%d filtered by distribute %s", - p.family == AF_INET ? - inet_ntoa(p.u.prefix4) : - inet6_ntoa (p.u.prefix6), - p.prefixlen, - output ? "out" : "in"); + debugf(BABEL_DEBUG_FILTER,"%pFX filtered by distribute %s", + &p, output ? "out" : "in"); return INFINITY; } } @@ -105,12 +93,8 @@ babel_filter(int output, const unsigned char *prefix, unsigned short plen, plist = prefix_list_lookup (p.family, dist->prefix[distribute]); if (plist) { if (prefix_list_apply (plist, &p) == PREFIX_DENY) { - debugf(BABEL_DEBUG_FILTER,"%s/%d filtered by distribute %s", - p.family == AF_INET ? - inet_ntoa(p.u.prefix4) : - inet6_ntoa (p.u.prefix6), - p.prefixlen, - output ? "out" : "in"); + debugf(BABEL_DEBUG_FILTER,"%pFX filtered by distribute %s", + &p, output ? "out" : "in"); return INFINITY; } } diff --git a/babeld/babel_interface.c b/babeld/babel_interface.c index 1702d9277c..ae8b161b01 100644 --- a/babeld/babel_interface.c +++ b/babeld/babel_interface.c @@ -1106,6 +1106,7 @@ DEFUN (show_babel_route_addr, { struct in_addr addr; char buf[INET_ADDRSTRLEN + 8]; + char buf1[INET_ADDRSTRLEN + 8]; struct route_stream *routes = NULL; struct xroute_stream *xroutes = NULL; struct prefix prefix; @@ -1118,7 +1119,8 @@ DEFUN (show_babel_route_addr, } /* Quagga has no convenient prefix constructors. */ - snprintf(buf, sizeof(buf), "%s/%d", inet_ntoa(addr), 32); + snprintf(buf, sizeof(buf), "%s/%d", + inet_ntop(AF_INET, &addr, buf1, sizeof(buf1)), 32); ret = str2prefix(buf, &prefix); if (ret == 0) { diff --git a/babeld/babeld.c b/babeld/babeld.c index 09955cfbef..895ede7040 100644 --- a/babeld/babeld.c +++ b/babeld/babeld.c @@ -317,13 +317,9 @@ babel_clean_routing_process(void) flush_all_routes(); babel_interface_close_all(); - /* cancel threads */ - if (babel_routing_process->t_read != NULL) { - thread_cancel(babel_routing_process->t_read); - } - if (babel_routing_process->t_update != NULL) { - thread_cancel(babel_routing_process->t_update); - } + /* cancel events */ + thread_cancel(&babel_routing_process->t_read); + thread_cancel(&babel_routing_process->t_update); distribute_list_delete(&babel_routing_process->distribute_ctx); XFREE(MTYPE_BABEL, babel_routing_process); @@ -503,9 +499,7 @@ static void babel_set_timer(struct timeval *timeout) { long msecs = timeout->tv_sec * 1000 + timeout->tv_usec / 1000; - if (babel_routing_process->t_update != NULL) { - thread_cancel(babel_routing_process->t_update); - } + thread_cancel(&(babel_routing_process->t_update)); thread_add_timer_msec(master, babel_main_loop, NULL, msecs, &babel_routing_process->t_update); } diff --git a/bfdd/control.c b/bfdd/control.c index 3b954c64f8..4929bf1998 100644 --- a/bfdd/control.c +++ b/bfdd/control.c @@ -145,10 +145,7 @@ void control_shutdown(void) { struct bfd_control_socket *bcs; - if (bglobal.bg_csockev) { - thread_cancel(bglobal.bg_csockev); - bglobal.bg_csockev = NULL; - } + thread_cancel(&bglobal.bg_csockev); socket_close(&bglobal.bg_csock); @@ -204,15 +201,8 @@ static void control_free(struct bfd_control_socket *bcs) struct bfd_control_queue *bcq; struct bfd_notify_peer *bnp; - if (bcs->bcs_ev) { - thread_cancel(bcs->bcs_ev); - bcs->bcs_ev = NULL; - } - - if (bcs->bcs_outev) { - thread_cancel(bcs->bcs_outev); - bcs->bcs_outev = NULL; - } + thread_cancel(&(bcs->bcs_ev)); + thread_cancel(&(bcs->bcs_outev)); close(bcs->bcs_sd); @@ -318,10 +308,7 @@ static int control_queue_dequeue(struct bfd_control_socket *bcs) return 1; empty_list: - if (bcs->bcs_outev) { - thread_cancel(bcs->bcs_outev); - bcs->bcs_outev = NULL; - } + thread_cancel(&(bcs->bcs_outev)); bcs->bcs_bout = NULL; return 0; } diff --git a/bgpd/bgp_bfd.c b/bgpd/bgp_bfd.c index 7e1d64056d..11e9344d1c 100644 --- a/bgpd/bgp_bfd.c +++ b/bgpd/bgp_bfd.c @@ -598,6 +598,7 @@ static int bgp_bfd_peer_param_type_set(struct peer *peer, return 0; } +#if HAVE_BFDD > 0 /** * Set peer BFD profile configuration. */ @@ -652,6 +653,7 @@ static int bgp_bfd_peer_set_profile(struct peer *peer, const char *profile) return 0; } +#endif /* * bgp_bfd_peer_config_write - Write the peer BFD configuration. diff --git a/bgpd/bgp_conditional_adv.c b/bgpd/bgp_conditional_adv.c new file mode 100644 index 0000000000..0731adcb84 --- /dev/null +++ b/bgpd/bgp_conditional_adv.c @@ -0,0 +1,343 @@ +/* + * BGP Conditional advertisement + * Copyright (C) 2020 Samsung R&D Institute India - Bangalore. + * Madhurilatha Kuruganti + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the Free + * Software Foundation; either version 2 of the License, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; see the file COPYING; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include "bgpd/bgp_conditional_adv.h" + +const char *get_afi_safi_str(afi_t afi, safi_t safi, bool for_json); + +static route_map_result_t +bgp_check_rmap_prefixes_in_bgp_table(struct bgp_table *table, + struct route_map *rmap) +{ + struct attr dummy_attr = {0}; + struct bgp_dest *dest; + struct bgp_path_info *pi; + struct bgp_path_info path = {0}; + struct bgp_path_info_extra path_extra = {0}; + const struct prefix *dest_p; + route_map_result_t ret = RMAP_DENYMATCH; + + for (dest = bgp_table_top(table); dest; dest = bgp_route_next(dest)) { + dest_p = bgp_dest_get_prefix(dest); + assert(dest_p); + + for (pi = bgp_dest_get_bgp_path_info(dest); pi; pi = pi->next) { + dummy_attr = *pi->attr; + + /* Fill temp path_info */ + prep_for_rmap_apply(&path, &path_extra, dest, pi, + pi->peer, &dummy_attr); + + RESET_FLAG(dummy_attr.rmap_change_flags); + + ret = route_map_apply(rmap, dest_p, RMAP_BGP, &path); + if (ret != RMAP_PERMITMATCH) + bgp_attr_flush(&dummy_attr); + else { + if (BGP_DEBUG(update, UPDATE_OUT)) + zlog_debug( + "%s: Condition map routes present in BGP table", + __func__); + + return ret; + } + } + } + + if (BGP_DEBUG(update, UPDATE_OUT)) + zlog_debug("%s: Condition map routes not present in BGP table", + __func__); + + return ret; +} + +static void bgp_conditional_adv_routes(struct peer *peer, afi_t afi, + safi_t safi, struct bgp_table *table, + struct route_map *rmap, + enum update_type update_type) +{ + int addpath_capable; + struct bgp_dest *dest; + struct bgp_path_info *pi; + struct bgp_path_info path; + struct peer_af *paf; + const struct prefix *dest_p; + struct update_subgroup *subgrp; + struct attr dummy_attr = {0}, attr = {0}; + struct bgp_path_info_extra path_extra = {0}; + + paf = peer_af_find(peer, afi, safi); + if (!paf) + return; + + subgrp = PAF_SUBGRP(paf); + /* Ignore if subgroup doesn't exist (implies AF is not negotiated) */ + if (!subgrp) + return; + + if (BGP_DEBUG(update, UPDATE_OUT)) + zlog_debug("%s: %s routes to/from %s for %s", __func__, + update_type == ADVERTISE ? "Advertise" : "Withdraw", + peer->host, get_afi_safi_str(afi, safi, false)); + + addpath_capable = bgp_addpath_encode_tx(peer, afi, safi); + + for (dest = bgp_table_top(table); dest; dest = bgp_route_next(dest)) { + dest_p = bgp_dest_get_prefix(dest); + assert(dest_p); + + for (pi = bgp_dest_get_bgp_path_info(dest); pi; pi = pi->next) { + dummy_attr = *pi->attr; + + /* Fill temp path_info */ + prep_for_rmap_apply(&path, &path_extra, dest, pi, + pi->peer, &dummy_attr); + + RESET_FLAG(dummy_attr.rmap_change_flags); + + if (route_map_apply(rmap, dest_p, RMAP_BGP, &path) + != RMAP_PERMITMATCH) { + bgp_attr_flush(&dummy_attr); + continue; + } + + if (CHECK_FLAG(pi->flags, BGP_PATH_SELECTED) + || (addpath_capable + && bgp_addpath_tx_path( + peer->addpath_type[afi][safi], + pi))) { + + /* Skip route-map checks in + * subgroup_announce_check while executing from + * the conditional advertise scanner process. + * otherwise when route-map is also configured + * on same peer, routes in advertise-map may not + * be advertised as expected. + */ + if ((update_type == ADVERTISE) + && subgroup_announce_check(dest, pi, subgrp, + dest_p, &attr, + true)) + bgp_adj_out_set_subgroup(dest, subgrp, + &attr, pi); + else { + /* If default originate is enabled for + * the peer, do not send explicit + * withdraw. This will prevent deletion + * of default route advertised through + * default originate. + */ + if (CHECK_FLAG( + peer->af_flags[afi][safi], + PEER_FLAG_DEFAULT_ORIGINATE) + && is_default_prefix(dest_p)) + break; + + bgp_adj_out_unset_subgroup( + dest, subgrp, 1, + bgp_addpath_id_for_peer( + peer, afi, safi, + &pi->tx_addpath)); + } + } + } + } +} + +/* Handler of conditional advertisement timer event. + * Each route in the condition-map is evaluated. + */ +static int bgp_conditional_adv_timer(struct thread *t) +{ + afi_t afi; + safi_t safi; + int pfx_rcd_safi; + struct bgp *bgp = NULL; + struct peer *peer = NULL; + struct peer_af *paf = NULL; + struct bgp_table *table = NULL; + struct bgp_filter *filter = NULL; + struct listnode *node, *nnode = NULL; + struct update_subgroup *subgrp = NULL; + route_map_result_t ret; + + bgp = THREAD_ARG(t); + assert(bgp); + + thread_add_timer(bm->master, bgp_conditional_adv_timer, bgp, + CONDITIONAL_ROUTES_POLL_TIME, &bgp->t_condition_check); + + /* loop through each peer and advertise or withdraw routes if + * advertise-map is configured and prefix(es) in condition-map + * does exist(exist-map)/not exist(non-exist-map) in BGP table + * based on condition(exist-map or non-exist map) + */ + for (ALL_LIST_ELEMENTS(bgp->peer, node, nnode, peer)) { + if (!CHECK_FLAG(peer->flags, PEER_FLAG_CONFIG_NODE)) + continue; + + if (peer->status != Established) + continue; + + FOREACH_AFI_SAFI (afi, safi) { + if (strmatch(get_afi_safi_str(afi, safi, true), + "Unknown")) + continue; + + if (!peer->afc_nego[afi][safi]) + continue; + + /* labeled-unicast routes are installed in the unicast + * table so in order to display the correct PfxRcd value + * we must look at SAFI_UNICAST + */ + pfx_rcd_safi = (safi == SAFI_LABELED_UNICAST) + ? SAFI_UNICAST + : safi; + + table = bgp->rib[afi][pfx_rcd_safi]; + if (!table) + continue; + + filter = &peer->filter[afi][safi]; + + if (!filter->advmap.aname || !filter->advmap.cname + || !filter->advmap.amap || !filter->advmap.cmap) + continue; + + if (!peer->advmap_config_change[afi][safi] + && !peer->advmap_table_change) + continue; + + if (BGP_DEBUG(update, UPDATE_OUT)) { + if (peer->advmap_table_change) + zlog_debug( + "%s: %s - routes changed in BGP table.", + __func__, peer->host); + if (peer->advmap_config_change[afi][safi]) + zlog_debug( + "%s: %s for %s - advertise/condition map configuration is changed.", + __func__, peer->host, + get_afi_safi_str(afi, safi, + false)); + } + + /* cmap (route-map attached to exist-map or + * non-exist-map) map validation + */ + ret = bgp_check_rmap_prefixes_in_bgp_table( + table, filter->advmap.cmap); + + /* Derive conditional advertisement status from + * condition and return value of condition-map + * validation. + */ + if (filter->advmap.condition == CONDITION_EXIST) + filter->advmap.update_type = + (ret == RMAP_PERMITMATCH) ? ADVERTISE + : WITHDRAW; + else + filter->advmap.update_type = + (ret == RMAP_PERMITMATCH) ? WITHDRAW + : ADVERTISE; + + /* Send regular update as per the existing policy. + * There is a change in route-map, match-rule, ACLs, + * or route-map filter configuration on the same peer. + */ + if (peer->advmap_config_change[afi][safi]) { + + if (BGP_DEBUG(update, UPDATE_OUT)) + zlog_debug( + "%s: Configuration is changed on peer %s for %s, send the normal update first.", + __func__, peer->host, + get_afi_safi_str(afi, safi, + false)); + + paf = peer_af_find(peer, afi, safi); + if (paf) { + update_subgroup_split_peer(paf, NULL); + subgrp = paf->subgroup; + if (subgrp && subgrp->update_group) + subgroup_announce_table( + paf->subgroup, NULL); + } + peer->advmap_config_change[afi][safi] = false; + } + + /* Send update as per the conditional advertisement */ + bgp_conditional_adv_routes(peer, afi, safi, table, + filter->advmap.amap, + filter->advmap.update_type); + } + peer->advmap_table_change = false; + } + return 0; +} + +void bgp_conditional_adv_enable(struct peer *peer, afi_t afi, safi_t safi) +{ + struct bgp *bgp = peer->bgp; + + assert(bgp); + + /* This flag is used to monitor conditional routes status in BGP table, + * and advertise/withdraw routes only when there is a change in BGP + * table w.r.t conditional routes + */ + peer->advmap_config_change[afi][safi] = true; + + /* advertise-map is already configured on atleast one of its + * neighbors (AFI/SAFI). So just increment the counter. + */ + if (++bgp->condition_filter_count > 1) { + if (BGP_DEBUG(update, UPDATE_OUT)) + zlog_debug("%s: condition_filter_count %d", __func__, + bgp->condition_filter_count); + + return; + } + + /* Register for conditional routes polling timer */ + thread_add_timer(bm->master, bgp_conditional_adv_timer, bgp, + CONDITIONAL_ROUTES_POLL_TIME, &bgp->t_condition_check); +} + +void bgp_conditional_adv_disable(struct peer *peer, afi_t afi, safi_t safi) +{ + struct bgp *bgp = peer->bgp; + + assert(bgp); + + /* advertise-map is not configured on any of its neighbors or + * it is configured on more than one neighbor(AFI/SAFI). + * So there's nothing to do except decrementing the counter. + */ + if (--bgp->condition_filter_count != 0) { + if (BGP_DEBUG(update, UPDATE_OUT)) + zlog_debug("%s: condition_filter_count %d", __func__, + bgp->condition_filter_count); + + return; + } + + /* Last filter removed. So cancel conditional routes polling thread. */ + THREAD_OFF(bgp->t_condition_check); +} diff --git a/bgpd/bgp_conditional_adv.h b/bgpd/bgp_conditional_adv.h new file mode 100644 index 0000000000..7b5053de76 --- /dev/null +++ b/bgpd/bgp_conditional_adv.h @@ -0,0 +1,47 @@ +/* + * BGP Conditional advertisement + * Copyright (C) 2020 Samsung R&D Institute India - Bangalore. + * Madhurilatha Kuruganti + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the Free + * Software Foundation; either version 2 of the License, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; see the file COPYING; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef _FRR_BGP_CONDITION_ADV_H +#define _FRR_BGP_CONDITION_ADV_H +#include <zebra.h> +#include "prefix.h" +#include "bgpd/bgp_addpath.h" +#include "bgpd/bgp_attr.h" +#include "bgpd/bgpd.h" +#include "bgpd/bgp_debug.h" +#include "bgpd/bgp_route.h" +#include "bgpd/bgp_updgrp.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/* Polling time for monitoring condition-map routes in route table */ +#define CONDITIONAL_ROUTES_POLL_TIME 60 + +extern void bgp_conditional_adv_enable(struct peer *peer, afi_t afi, + safi_t safi); +extern void bgp_conditional_adv_disable(struct peer *peer, afi_t afi, + safi_t safi); +#ifdef __cplusplus +} +#endif + +#endif /* _FRR_BGP_CONDITION_ADV_H */ diff --git a/bgpd/bgp_damp.c b/bgpd/bgp_damp.c index 9992168182..94a27ead0e 100644 --- a/bgpd/bgp_damp.c +++ b/bgpd/bgp_damp.c @@ -467,10 +467,8 @@ int bgp_damp_disable(struct bgp *bgp, afi_t afi, safi_t safi) if (!CHECK_FLAG(bgp->af_flags[afi][safi], BGP_CONFIG_DAMPENING)) return 0; - /* Cancel reuse thread. */ - if (bdc->t_reuse) - thread_cancel(bdc->t_reuse); - bdc->t_reuse = NULL; + /* Cancel reuse event. */ + thread_cancel(&(bdc->t_reuse)); /* Clean BGP dampening information. */ bgp_damp_info_clean(afi, safi); diff --git a/bgpd/bgp_dump.c b/bgpd/bgp_dump.c index abd349a188..975bba9314 100644 --- a/bgpd/bgp_dump.c +++ b/bgpd/bgp_dump.c @@ -677,11 +677,8 @@ static int bgp_dump_unset(struct bgp_dump *bgp_dump) bgp_dump->fp = NULL; } - /* Removing interval thread. */ - if (bgp_dump->t_interval) { - thread_cancel(bgp_dump->t_interval); - bgp_dump->t_interval = NULL; - } + /* Removing interval event. */ + thread_cancel(&bgp_dump->t_interval); bgp_dump->interval = 0; diff --git a/bgpd/bgp_evpn_mh.c b/bgpd/bgp_evpn_mh.c index 1a58541a71..8f81278dee 100644 --- a/bgpd/bgp_evpn_mh.c +++ b/bgpd/bgp_evpn_mh.c @@ -2911,7 +2911,7 @@ void bgp_evpn_mh_finish(void) es_next) { bgp_evpn_es_local_info_clear(es); } - thread_cancel(bgp_mh_info->t_cons_check); + thread_cancel(&bgp_mh_info->t_cons_check); list_delete(&bgp_mh_info->local_es_list); list_delete(&bgp_mh_info->pend_es_list); diff --git a/bgpd/bgp_fsm.c b/bgpd/bgp_fsm.c index 61119ced80..4468408415 100644 --- a/bgpd/bgp_fsm.c +++ b/bgpd/bgp_fsm.c @@ -704,8 +704,8 @@ bool bgp_update_delay_configured(struct bgp *bgp) on ending the update delay. */ void bgp_update_delay_end(struct bgp *bgp) { - THREAD_TIMER_OFF(bgp->t_update_delay); - THREAD_TIMER_OFF(bgp->t_establish_wait); + THREAD_OFF(bgp->t_update_delay); + THREAD_OFF(bgp->t_establish_wait); /* Reset update-delay related state */ bgp->update_delay_over = 1; @@ -924,7 +924,7 @@ static int bgp_maxmed_onstartup_timer(struct thread *thread) zlog_info("Max med on startup ended - timer expired."); bgp = THREAD_ARG(thread); - THREAD_TIMER_OFF(bgp->t_maxmed_onstartup); + THREAD_OFF(bgp->t_maxmed_onstartup); bgp->maxmed_onstartup_over = 1; bgp_maxmed_update(bgp); @@ -968,7 +968,7 @@ static int bgp_update_delay_timer(struct thread *thread) zlog_info("Update delay ended - timer expired."); bgp = THREAD_ARG(thread); - THREAD_TIMER_OFF(bgp->t_update_delay); + THREAD_OFF(bgp->t_update_delay); bgp_update_delay_end(bgp); return 0; @@ -982,7 +982,7 @@ static int bgp_establish_wait_timer(struct thread *thread) zlog_info("Establish wait - timer expired."); bgp = THREAD_ARG(thread); - THREAD_TIMER_OFF(bgp->t_establish_wait); + THREAD_OFF(bgp->t_establish_wait); bgp_check_update_delay(bgp); return 0; diff --git a/bgpd/bgp_fsm.h b/bgpd/bgp_fsm.h index aa98515c3f..b9156df617 100644 --- a/bgpd/bgp_fsm.h +++ b/bgpd/bgp_fsm.h @@ -31,7 +31,7 @@ #define BGP_TIMER_OFF(T) \ do { \ - THREAD_TIMER_OFF(T); \ + THREAD_OFF(T); \ } while (0) #define BGP_EVENT_ADD(P, E) \ diff --git a/bgpd/bgp_io.c b/bgpd/bgp_io.c index 412c8e3e5e..38455b5e02 100644 --- a/bgpd/bgp_io.c +++ b/bgpd/bgp_io.c @@ -31,7 +31,7 @@ #include "network.h" // for ERRNO_IO_RETRY #include "stream.h" // for stream_get_endp, stream_getw_from, str... #include "ringbuf.h" // for ringbuf_remain, ringbuf_peek, ringbuf_... -#include "thread.h" // for THREAD_OFF, THREAD_ARG, thread, thread... +#include "thread.h" // for THREAD_OFF, THREAD_ARG, thread... #include "zassert.h" // for assert #include "bgpd/bgp_io.h" @@ -39,6 +39,7 @@ #include "bgpd/bgp_errors.h" // for expanded error reference information #include "bgpd/bgp_fsm.h" // for BGP_EVENT_ADD, bgp_event #include "bgpd/bgp_packet.h" // for bgp_notify_send_with_data, bgp_notify... +#include "bgpd/bgp_trace.h" // for frrtraces #include "bgpd/bgpd.h" // for peer, BGP_MARKER_SIZE, bgp_master, bm /* clang-format on */ @@ -234,6 +235,7 @@ static int bgp_process_reads(struct thread *thread) assert(ringbuf_get(ibw, pkt->data, pktsize) == pktsize); stream_set_endp(pkt, pktsize); + frrtrace(2, frr_bgp, packet_read, peer, pkt); frr_with_mutex(&peer->io_mtx) { stream_fifo_push(peer->ibuf, pkt); } diff --git a/bgpd/bgp_mplsvpn.c b/bgpd/bgp_mplsvpn.c index f1aeafced7..0c527efb8c 100644 --- a/bgpd/bgp_mplsvpn.c +++ b/bgpd/bgp_mplsvpn.c @@ -2687,8 +2687,7 @@ void bgp_vpn_leak_export(struct bgp *from_bgp) idir = BGP_VPN_POLICY_DIR_FROMVPN; edir = BGP_VPN_POLICY_DIR_TOVPN; - export_name = (from_bgp->name ? XSTRDUP(MTYPE_TMP, from_bgp->name) - : XSTRDUP(MTYPE_TMP, VRF_DEFAULT_NAME)); + export_name = from_bgp->name ? from_bgp->name : VRF_DEFAULT_NAME; for (afi = 0; afi < AFI_MAX; ++afi) { /* vrf leak is for IPv4 and IPv6 Unicast only */ diff --git a/bgpd/bgp_nb.c b/bgpd/bgp_nb.c index 551bdb0c2b..333ca3cce9 100644 --- a/bgpd/bgp_nb.c +++ b/bgpd/bgp_nb.c @@ -458,6 +458,8 @@ const struct frr_yang_module_info frr_bgp_info = { .cbs = { .create = bgp_global_afi_safis_afi_safi_create, .destroy = bgp_global_afi_safis_afi_safi_destroy, + .cli_show = cli_show_bgp_global_afi_safi_header, + .cli_show_end = cli_show_bgp_global_afi_safi_header_end, } }, { @@ -1279,8 +1281,10 @@ const struct frr_yang_module_info frr_bgp_info = { { .xpath = "/frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-bgp:bgp/global/afi-safis/afi-safi/ipv4-unicast/network-config", .cbs = { + .apply_finish = bgp_global_afi_safis_afi_safi_network_config_apply_finish, .create = bgp_global_afi_safis_afi_safi_ipv4_unicast_network_config_create, .destroy = bgp_global_afi_safis_afi_safi_ipv4_unicast_network_config_destroy, + .cli_show = cli_show_bgp_global_afi_safi_network_config, } }, { @@ -1306,8 +1310,10 @@ const struct frr_yang_module_info frr_bgp_info = { { .xpath = "/frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-bgp:bgp/global/afi-safis/afi-safi/ipv4-unicast/aggregate-route", .cbs = { + .apply_finish = bgp_global_afi_safi_aggregate_route_apply_finish, .create = bgp_global_afi_safis_afi_safi_ipv4_unicast_aggregate_route_create, .destroy = bgp_global_afi_safis_afi_safi_ipv4_unicast_aggregate_route_destroy, + .cli_show = cli_show_bgp_global_afi_safi_unicast_aggregate_route, } }, { @@ -1330,10 +1336,31 @@ const struct frr_yang_module_info frr_bgp_info = { } }, { + .xpath = "/frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-bgp:bgp/global/afi-safis/afi-safi/ipv4-unicast/aggregate-route/origin", + .cbs = { + .modify = bgp_global_afi_safis_afi_safi_ipv4_unicast_aggregate_route_origin_modify, + } + }, + { + .xpath = "/frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-bgp:bgp/global/afi-safis/afi-safi/ipv4-unicast/aggregate-route/match-med", + .cbs = { + .modify = bgp_global_afi_safis_afi_safi_ipv4_unicast_aggregate_route_match_med_modify, + } + }, + { + .xpath = "/frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-bgp:bgp/global/afi-safis/afi-safi/ipv4-unicast/aggregate-route/suppress-map", + .cbs = { + .modify = bgp_global_afi_safis_afi_safi_ipv4_unicast_aggregate_route_suppress_map_modify, + .destroy = bgp_global_afi_safis_afi_safi_ipv4_unicast_aggregate_route_suppress_map_destroy, + } + }, + { .xpath = "/frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-bgp:bgp/global/afi-safis/afi-safi/ipv4-unicast/admin-distance-route", .cbs = { + .apply_finish = bgp_global_afi_safi_admin_distance_route_apply_finish, .create = bgp_global_afi_safis_afi_safi_ipv4_unicast_admin_distance_route_create, .destroy = bgp_global_afi_safis_afi_safi_ipv4_unicast_admin_distance_route_destroy, + .cli_show = cli_show_bgp_global_afi_safi_unicast_admin_distance_route, } }, { @@ -1350,6 +1377,13 @@ const struct frr_yang_module_info frr_bgp_info = { } }, { + .xpath = "/frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-bgp:bgp/global/afi-safis/afi-safi/ipv4-unicast/route-flap-dampening", + .cbs = { + .apply_finish = bgp_global_afi_safis_afi_safi_route_flap_dampening_apply_finish, + .cli_show = cli_show_bgp_global_afi_safi_route_flap_dampening, + } + }, + { .xpath = "/frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-bgp:bgp/global/afi-safis/afi-safi/ipv4-unicast/route-flap-dampening/enable", .cbs = { .modify = bgp_global_afi_safis_afi_safi_ipv4_unicast_route_flap_dampening_enable_modify, @@ -1387,6 +1421,14 @@ const struct frr_yang_module_info frr_bgp_info = { .xpath = "/frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-bgp:bgp/global/afi-safis/afi-safi/ipv4-unicast/use-multiple-paths/ebgp/maximum-paths", .cbs = { .modify = bgp_global_afi_safis_afi_safi_ipv4_unicast_use_multiple_paths_ebgp_maximum_paths_modify, + .cli_show = cli_show_bgp_global_afi_safi_unicast_use_multiple_paths_ebgp_maximum_paths, + } + }, + { + .xpath = "/frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-bgp:bgp/global/afi-safis/afi-safi/ipv4-unicast/use-multiple-paths/ibgp", + .cbs = { + .apply_finish = bgp_global_afi_safi_ip_unicast_use_multiple_paths_ibgp_maximum_paths_apply_finish, + .cli_show = cli_show_bgp_global_afi_safi_ip_unicast_use_multiple_paths_ibgp_maximum_paths, } }, { @@ -1405,8 +1447,10 @@ const struct frr_yang_module_info frr_bgp_info = { { .xpath = "/frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-bgp:bgp/global/afi-safis/afi-safi/ipv4-unicast/redistribution-list", .cbs = { + .apply_finish = bgp_global_afi_safi_ip_unicast_redistribution_list_apply_finish, .create = bgp_global_afi_safis_afi_safi_ipv4_unicast_redistribution_list_create, .destroy = bgp_global_afi_safis_afi_safi_ipv4_unicast_redistribution_list_destroy, + .cli_show = cli_show_bgp_global_afi_safi_ip_unicast_redistribution_list, } }, { @@ -1424,24 +1468,28 @@ const struct frr_yang_module_info frr_bgp_info = { } }, { + .xpath = "/frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-bgp:bgp/global/afi-safis/afi-safi/ipv4-unicast/admin-distance", + .cbs = { + .apply_finish = bgp_global_afi_safis_afi_safi_ipv4_unicast_admin_distance_apply_finish, + .cli_show = cli_show_bgp_global_afi_safi_admin_distance_config, + } + }, + { .xpath = "/frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-bgp:bgp/global/afi-safis/afi-safi/ipv4-unicast/admin-distance/external", .cbs = { .modify = bgp_global_afi_safis_afi_safi_ipv4_unicast_admin_distance_external_modify, - .destroy = bgp_global_afi_safis_afi_safi_ipv4_unicast_admin_distance_external_destroy, } }, { .xpath = "/frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-bgp:bgp/global/afi-safis/afi-safi/ipv4-unicast/admin-distance/internal", .cbs = { .modify = bgp_global_afi_safis_afi_safi_ipv4_unicast_admin_distance_internal_modify, - .destroy = bgp_global_afi_safis_afi_safi_ipv4_unicast_admin_distance_internal_destroy, } }, { .xpath = "/frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-bgp:bgp/global/afi-safis/afi-safi/ipv4-unicast/admin-distance/local", .cbs = { .modify = bgp_global_afi_safis_afi_safi_ipv4_unicast_admin_distance_local_modify, - .destroy = bgp_global_afi_safis_afi_safi_ipv4_unicast_admin_distance_local_destroy, } }, { @@ -1456,6 +1504,7 @@ const struct frr_yang_module_info frr_bgp_info = { .cbs = { .modify = bgp_global_afi_safis_afi_safi_ipv4_unicast_vpn_config_rd_modify, .destroy = bgp_global_afi_safis_afi_safi_ipv4_unicast_vpn_config_rd_destroy, + .cli_show = cli_show_bgp_global_afi_safi_ip_unicast_vpn_config_rd, } }, { @@ -1477,18 +1526,21 @@ const struct frr_yang_module_info frr_bgp_info = { .cbs = { .modify = bgp_global_afi_safis_afi_safi_ipv4_unicast_vpn_config_nexthop_modify, .destroy = bgp_global_afi_safis_afi_safi_ipv4_unicast_vpn_config_nexthop_destroy, + .cli_show = cli_show_bgp_global_afi_safi_ip_unicast_vpn_config_nexthop, } }, { .xpath = "/frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-bgp:bgp/global/afi-safis/afi-safi/ipv4-unicast/vpn-config/import-vpn", .cbs = { .modify = bgp_global_afi_safis_afi_safi_ipv4_unicast_vpn_config_import_vpn_modify, + .cli_show = cli_show_bgp_global_afi_safi_ip_unicast_vpn_config_import_vpn, } }, { .xpath = "/frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-bgp:bgp/global/afi-safis/afi-safi/ipv4-unicast/vpn-config/export-vpn", .cbs = { .modify = bgp_global_afi_safis_afi_safi_ipv4_unicast_vpn_config_export_vpn_modify, + .cli_show = cli_show_bgp_global_afi_safi_ip_unicast_vpn_config_export_vpn, } }, { @@ -1496,6 +1548,7 @@ const struct frr_yang_module_info frr_bgp_info = { .cbs = { .create = bgp_global_afi_safis_afi_safi_ipv4_unicast_vpn_config_import_vrf_list_create, .destroy = bgp_global_afi_safis_afi_safi_ipv4_unicast_vpn_config_import_vrf_list_destroy, + .cli_show = cli_show_bgp_global_afi_safi_ip_unicast_vpn_config_import_vrfs, } }, { @@ -1503,6 +1556,7 @@ const struct frr_yang_module_info frr_bgp_info = { .cbs = { .modify = bgp_global_afi_safis_afi_safi_ipv4_unicast_vpn_config_rmap_import_modify, .destroy = bgp_global_afi_safis_afi_safi_ipv4_unicast_vpn_config_rmap_import_destroy, + .cli_show = cli_show_bgp_global_afi_safi_ip_unicast_vpn_config_rmap_import, } }, { @@ -1510,6 +1564,7 @@ const struct frr_yang_module_info frr_bgp_info = { .cbs = { .modify = bgp_global_afi_safis_afi_safi_ipv4_unicast_vpn_config_rmap_export_modify, .destroy = bgp_global_afi_safis_afi_safi_ipv4_unicast_vpn_config_rmap_export_destroy, + .cli_show = cli_show_bgp_global_afi_safi_ip_unicast_vpn_config_rmap_export, } }, { @@ -1543,8 +1598,10 @@ const struct frr_yang_module_info frr_bgp_info = { { .xpath = "/frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-bgp:bgp/global/afi-safis/afi-safi/ipv6-unicast/network-config", .cbs = { + .apply_finish = bgp_global_afi_safis_afi_safi_network_config_apply_finish, .create = bgp_global_afi_safis_afi_safi_ipv6_unicast_network_config_create, .destroy = bgp_global_afi_safis_afi_safi_ipv6_unicast_network_config_destroy, + .cli_show = cli_show_bgp_global_afi_safi_network_config, } }, { @@ -1570,8 +1627,10 @@ const struct frr_yang_module_info frr_bgp_info = { { .xpath = "/frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-bgp:bgp/global/afi-safis/afi-safi/ipv6-unicast/aggregate-route", .cbs = { + .apply_finish = bgp_global_afi_safi_aggregate_route_apply_finish, .create = bgp_global_afi_safis_afi_safi_ipv6_unicast_aggregate_route_create, .destroy = bgp_global_afi_safis_afi_safi_ipv6_unicast_aggregate_route_destroy, + .cli_show = cli_show_bgp_global_afi_safi_unicast_aggregate_route, } }, { @@ -1594,10 +1653,31 @@ const struct frr_yang_module_info frr_bgp_info = { } }, { + .xpath = "/frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-bgp:bgp/global/afi-safis/afi-safi/ipv6-unicast/aggregate-route/origin", + .cbs = { + .modify = bgp_global_afi_safis_afi_safi_ipv6_unicast_aggregate_route_origin_modify, + } + }, + { + .xpath = "/frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-bgp:bgp/global/afi-safis/afi-safi/ipv6-unicast/aggregate-route/match-med", + .cbs = { + .modify = bgp_global_afi_safis_afi_safi_ipv6_unicast_aggregate_route_match_med_modify, + } + }, + { + .xpath = "/frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-bgp:bgp/global/afi-safis/afi-safi/ipv6-unicast/aggregate-route/suppress-map", + .cbs = { + .modify = bgp_global_afi_safis_afi_safi_ipv6_unicast_aggregate_route_suppress_map_modify, + .destroy = bgp_global_afi_safis_afi_safi_ipv6_unicast_aggregate_route_suppress_map_destroy, + } + }, + { .xpath = "/frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-bgp:bgp/global/afi-safis/afi-safi/ipv6-unicast/admin-distance-route", .cbs = { + .apply_finish = bgp_global_afi_safi_admin_distance_route_apply_finish, .create = bgp_global_afi_safis_afi_safi_ipv6_unicast_admin_distance_route_create, .destroy = bgp_global_afi_safis_afi_safi_ipv6_unicast_admin_distance_route_destroy, + .cli_show = cli_show_bgp_global_afi_safi_unicast_admin_distance_route, } }, { @@ -1614,9 +1694,58 @@ const struct frr_yang_module_info frr_bgp_info = { } }, { + .xpath = "/frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-bgp:bgp/global/afi-safis/afi-safi/ipv6-unicast/route-flap-dampening", + .cbs = { + .apply_finish = bgp_global_afi_safis_afi_safi_route_flap_dampening_apply_finish, + .cli_show = cli_show_bgp_global_afi_safi_route_flap_dampening, + } + }, + { + .xpath = "/frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-bgp:bgp/global/afi-safis/afi-safi/ipv6-unicast/route-flap-dampening/enable", + .cbs = { + .modify = bgp_global_afi_safis_afi_safi_ipv6_unicast_route_flap_dampening_enable_modify, + } + }, + { + .xpath = "/frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-bgp:bgp/global/afi-safis/afi-safi/ipv6-unicast/route-flap-dampening/reach-decay", + .cbs = { + .modify = bgp_global_afi_safis_afi_safi_ipv6_unicast_route_flap_dampening_reach_decay_modify, + .destroy = bgp_global_afi_safis_afi_safi_ipv6_unicast_route_flap_dampening_reach_decay_destroy, + } + }, + { + .xpath = "/frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-bgp:bgp/global/afi-safis/afi-safi/ipv6-unicast/route-flap-dampening/reuse-above", + .cbs = { + .modify = bgp_global_afi_safis_afi_safi_ipv6_unicast_route_flap_dampening_reuse_above_modify, + .destroy = bgp_global_afi_safis_afi_safi_ipv6_unicast_route_flap_dampening_reuse_above_destroy, + } + }, + { + .xpath = "/frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-bgp:bgp/global/afi-safis/afi-safi/ipv6-unicast/route-flap-dampening/suppress-above", + .cbs = { + .modify = bgp_global_afi_safis_afi_safi_ipv6_unicast_route_flap_dampening_suppress_above_modify, + .destroy = bgp_global_afi_safis_afi_safi_ipv6_unicast_route_flap_dampening_suppress_above_destroy, + } + }, + { + .xpath = "/frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-bgp:bgp/global/afi-safis/afi-safi/ipv6-unicast/route-flap-dampening/unreach-decay", + .cbs = { + .modify = bgp_global_afi_safis_afi_safi_ipv6_unicast_route_flap_dampening_unreach_decay_modify, + .destroy = bgp_global_afi_safis_afi_safi_ipv6_unicast_route_flap_dampening_unreach_decay_destroy, + } + }, + { .xpath = "/frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-bgp:bgp/global/afi-safis/afi-safi/ipv6-unicast/use-multiple-paths/ebgp/maximum-paths", .cbs = { .modify = bgp_global_afi_safis_afi_safi_ipv6_unicast_use_multiple_paths_ebgp_maximum_paths_modify, + .cli_show = cli_show_bgp_global_afi_safi_unicast_use_multiple_paths_ebgp_maximum_paths, + } + }, + { + .xpath = "/frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-bgp:bgp/global/afi-safis/afi-safi/ipv6-unicast/use-multiple-paths/ibgp", + .cbs = { + .apply_finish = bgp_global_afi_safi_ip_unicast_use_multiple_paths_ibgp_maximum_paths_apply_finish, + .cli_show = cli_show_bgp_global_afi_safi_ip_unicast_use_multiple_paths_ibgp_maximum_paths, } }, { @@ -1635,8 +1764,10 @@ const struct frr_yang_module_info frr_bgp_info = { { .xpath = "/frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-bgp:bgp/global/afi-safis/afi-safi/ipv6-unicast/redistribution-list", .cbs = { + .apply_finish = bgp_global_afi_safi_ip_unicast_redistribution_list_apply_finish, .create = bgp_global_afi_safis_afi_safi_ipv6_unicast_redistribution_list_create, .destroy = bgp_global_afi_safis_afi_safi_ipv6_unicast_redistribution_list_destroy, + .cli_show = cli_show_bgp_global_afi_safi_ip_unicast_redistribution_list, } }, { @@ -1654,24 +1785,28 @@ const struct frr_yang_module_info frr_bgp_info = { } }, { + .xpath = "/frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-bgp:bgp/global/afi-safis/afi-safi/ipv6-unicast/admin-distance", + .cbs = { + .apply_finish = bgp_global_afi_safis_afi_safi_ipv6_unicast_admin_distance_apply_finish, + .cli_show = cli_show_bgp_global_afi_safi_admin_distance_config, + } + }, + { .xpath = "/frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-bgp:bgp/global/afi-safis/afi-safi/ipv6-unicast/admin-distance/external", .cbs = { .modify = bgp_global_afi_safis_afi_safi_ipv6_unicast_admin_distance_external_modify, - .destroy = bgp_global_afi_safis_afi_safi_ipv6_unicast_admin_distance_external_destroy, } }, { .xpath = "/frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-bgp:bgp/global/afi-safis/afi-safi/ipv6-unicast/admin-distance/internal", .cbs = { .modify = bgp_global_afi_safis_afi_safi_ipv6_unicast_admin_distance_internal_modify, - .destroy = bgp_global_afi_safis_afi_safi_ipv6_unicast_admin_distance_internal_destroy, } }, { .xpath = "/frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-bgp:bgp/global/afi-safis/afi-safi/ipv6-unicast/admin-distance/local", .cbs = { .modify = bgp_global_afi_safis_afi_safi_ipv6_unicast_admin_distance_local_modify, - .destroy = bgp_global_afi_safis_afi_safi_ipv6_unicast_admin_distance_local_destroy, } }, { @@ -1733,6 +1868,7 @@ const struct frr_yang_module_info frr_bgp_info = { .cbs = { .modify = bgp_global_afi_safis_afi_safi_ipv6_unicast_vpn_config_rmap_import_modify, .destroy = bgp_global_afi_safis_afi_safi_ipv6_unicast_vpn_config_rmap_import_destroy, + .cli_show = cli_show_bgp_global_afi_safi_ip_unicast_vpn_config_rmap_import, } }, { @@ -1740,6 +1876,7 @@ const struct frr_yang_module_info frr_bgp_info = { .cbs = { .modify = bgp_global_afi_safis_afi_safi_ipv6_unicast_vpn_config_rmap_export_modify, .destroy = bgp_global_afi_safis_afi_safi_ipv6_unicast_vpn_config_rmap_export_destroy, + .cli_show = cli_show_bgp_global_afi_safi_ip_unicast_vpn_config_rmap_export, } }, { @@ -1774,6 +1911,14 @@ const struct frr_yang_module_info frr_bgp_info = { .xpath = "/frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-bgp:bgp/global/afi-safis/afi-safi/ipv4-labeled-unicast/use-multiple-paths/ebgp/maximum-paths", .cbs = { .modify = bgp_global_afi_safis_afi_safi_ipv4_labeled_unicast_use_multiple_paths_ebgp_maximum_paths_modify, + .cli_show = cli_show_bgp_global_afi_safi_unicast_use_multiple_paths_ebgp_maximum_paths, + } + }, + { + .xpath = "/frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-bgp:bgp/global/afi-safis/afi-safi/ipv4-labeled-unicast/use-multiple-paths/ibgp", + .cbs = { + .apply_finish = bgp_global_afi_safi_ip_unicast_use_multiple_paths_ibgp_maximum_paths_apply_finish, + .cli_show = cli_show_bgp_global_afi_safi_ip_unicast_use_multiple_paths_ibgp_maximum_paths, } }, { @@ -1790,9 +1935,58 @@ const struct frr_yang_module_info frr_bgp_info = { } }, { + .xpath = "/frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-bgp:bgp/global/afi-safis/afi-safi/ipv4-labeled-unicast/route-flap-dampening", + .cbs = { + .apply_finish = bgp_global_afi_safis_afi_safi_route_flap_dampening_apply_finish, + .cli_show = cli_show_bgp_global_afi_safi_route_flap_dampening, + } + }, + { + .xpath = "/frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-bgp:bgp/global/afi-safis/afi-safi/ipv4-labeled-unicast/route-flap-dampening/enable", + .cbs = { + .modify = bgp_global_afi_safis_afi_safi_ipv4_labeled_unicast_route_flap_dampening_enable_modify, + } + }, + { + .xpath = "/frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-bgp:bgp/global/afi-safis/afi-safi/ipv4-labeled-unicast/route-flap-dampening/reach-decay", + .cbs = { + .modify = bgp_global_afi_safis_afi_safi_ipv4_labeled_unicast_route_flap_dampening_reach_decay_modify, + .destroy = bgp_global_afi_safis_afi_safi_ipv4_labeled_unicast_route_flap_dampening_reach_decay_destroy, + } + }, + { + .xpath = "/frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-bgp:bgp/global/afi-safis/afi-safi/ipv4-labeled-unicast/route-flap-dampening/reuse-above", + .cbs = { + .modify = bgp_global_afi_safis_afi_safi_ipv4_labeled_unicast_route_flap_dampening_reuse_above_modify, + .destroy = bgp_global_afi_safis_afi_safi_ipv4_labeled_unicast_route_flap_dampening_reuse_above_destroy, + } + }, + { + .xpath = "/frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-bgp:bgp/global/afi-safis/afi-safi/ipv4-labeled-unicast/route-flap-dampening/suppress-above", + .cbs = { + .modify = bgp_global_afi_safis_afi_safi_ipv4_labeled_unicast_route_flap_dampening_suppress_above_modify, + .destroy = bgp_global_afi_safis_afi_safi_ipv4_labeled_unicast_route_flap_dampening_suppress_above_destroy, + } + }, + { + .xpath = "/frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-bgp:bgp/global/afi-safis/afi-safi/ipv4-labeled-unicast/route-flap-dampening/unreach-decay", + .cbs = { + .modify = bgp_global_afi_safis_afi_safi_ipv4_labeled_unicast_route_flap_dampening_unreach_decay_modify, + .destroy = bgp_global_afi_safis_afi_safi_ipv4_labeled_unicast_route_flap_dampening_unreach_decay_destroy, + } + }, + { .xpath = "/frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-bgp:bgp/global/afi-safis/afi-safi/ipv6-labeled-unicast/use-multiple-paths/ebgp/maximum-paths", .cbs = { .modify = bgp_global_afi_safis_afi_safi_ipv6_labeled_unicast_use_multiple_paths_ebgp_maximum_paths_modify, + .cli_show = cli_show_bgp_global_afi_safi_unicast_use_multiple_paths_ebgp_maximum_paths, + } + }, + { + .xpath = "/frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-bgp:bgp/global/afi-safis/afi-safi/ipv6-labeled-unicast/use-multiple-paths/ibgp", + .cbs = { + .apply_finish = bgp_global_afi_safi_ip_unicast_use_multiple_paths_ibgp_maximum_paths_apply_finish, + .cli_show = cli_show_bgp_global_afi_safi_ip_unicast_use_multiple_paths_ibgp_maximum_paths, } }, { @@ -1809,10 +2003,53 @@ const struct frr_yang_module_info frr_bgp_info = { } }, { + .xpath = "/frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-bgp:bgp/global/afi-safis/afi-safi/ipv6-labeled-unicast/route-flap-dampening", + .cbs = { + .apply_finish = bgp_global_afi_safis_afi_safi_route_flap_dampening_apply_finish, + .cli_show = cli_show_bgp_global_afi_safi_route_flap_dampening, + } + }, + { + .xpath = "/frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-bgp:bgp/global/afi-safis/afi-safi/ipv6-labeled-unicast/route-flap-dampening/enable", + .cbs = { + .modify = bgp_global_afi_safis_afi_safi_ipv6_labeled_unicast_route_flap_dampening_enable_modify, + } + }, + { + .xpath = "/frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-bgp:bgp/global/afi-safis/afi-safi/ipv6-labeled-unicast/route-flap-dampening/reach-decay", + .cbs = { + .modify = bgp_global_afi_safis_afi_safi_ipv6_labeled_unicast_route_flap_dampening_reach_decay_modify, + .destroy = bgp_global_afi_safis_afi_safi_ipv6_labeled_unicast_route_flap_dampening_reach_decay_destroy, + } + }, + { + .xpath = "/frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-bgp:bgp/global/afi-safis/afi-safi/ipv6-labeled-unicast/route-flap-dampening/reuse-above", + .cbs = { + .modify = bgp_global_afi_safis_afi_safi_ipv6_labeled_unicast_route_flap_dampening_reuse_above_modify, + .destroy = bgp_global_afi_safis_afi_safi_ipv6_labeled_unicast_route_flap_dampening_reuse_above_destroy, + } + }, + { + .xpath = "/frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-bgp:bgp/global/afi-safis/afi-safi/ipv6-labeled-unicast/route-flap-dampening/suppress-above", + .cbs = { + .modify = bgp_global_afi_safis_afi_safi_ipv6_labeled_unicast_route_flap_dampening_suppress_above_modify, + .destroy = bgp_global_afi_safis_afi_safi_ipv6_labeled_unicast_route_flap_dampening_suppress_above_destroy, + } + }, + { + .xpath = "/frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-bgp:bgp/global/afi-safis/afi-safi/ipv6-labeled-unicast/route-flap-dampening/unreach-decay", + .cbs = { + .modify = bgp_global_afi_safis_afi_safi_ipv6_labeled_unicast_route_flap_dampening_unreach_decay_modify, + .destroy = bgp_global_afi_safis_afi_safi_ipv6_labeled_unicast_route_flap_dampening_unreach_decay_destroy, + } + }, + { .xpath = "/frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-bgp:bgp/global/afi-safis/afi-safi/ipv4-multicast/network-config", .cbs = { + .apply_finish = bgp_global_afi_safis_afi_safi_network_config_apply_finish, .create = bgp_global_afi_safis_afi_safi_ipv4_multicast_network_config_create, .destroy = bgp_global_afi_safis_afi_safi_ipv4_multicast_network_config_destroy, + .cli_show = cli_show_bgp_global_afi_safi_network_config, } }, { @@ -1838,6 +2075,7 @@ const struct frr_yang_module_info frr_bgp_info = { { .xpath = "/frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-bgp:bgp/global/afi-safis/afi-safi/ipv4-multicast/aggregate-route", .cbs = { + .apply_finish = bgp_global_afi_safi_aggregate_route_apply_finish, .create = bgp_global_afi_safis_afi_safi_ipv4_multicast_aggregate_route_create, .destroy = bgp_global_afi_safis_afi_safi_ipv4_multicast_aggregate_route_destroy, } @@ -1862,31 +2100,75 @@ const struct frr_yang_module_info frr_bgp_info = { } }, { + .xpath = "/frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-bgp:bgp/global/afi-safis/afi-safi/ipv4-multicast/aggregate-route/origin", + .cbs = { + .modify = bgp_global_afi_safis_afi_safi_ipv4_multicast_aggregate_route_origin_modify, + } + }, + { + .xpath = "/frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-bgp:bgp/global/afi-safis/afi-safi/ipv4-multicast/aggregate-route/match-med", + .cbs = { + .modify = bgp_global_afi_safis_afi_safi_ipv4_multicast_aggregate_route_match_med_modify, + } + }, + { + .xpath = "/frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-bgp:bgp/global/afi-safis/afi-safi/ipv4-multicast/aggregate-route/suppress-map", + .cbs = { + .modify = bgp_global_afi_safis_afi_safi_ipv4_multicast_aggregate_route_suppress_map_modify, + .destroy = bgp_global_afi_safis_afi_safi_ipv4_multicast_aggregate_route_suppress_map_destroy, + } + }, + { .xpath = "/frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-bgp:bgp/global/afi-safis/afi-safi/ipv4-multicast/admin-distance-route", .cbs = { + .apply_finish = bgp_global_afi_safi_admin_distance_route_apply_finish, .create = bgp_global_afi_safis_afi_safi_ipv4_multicast_admin_distance_route_create, .destroy = bgp_global_afi_safis_afi_safi_ipv4_multicast_admin_distance_route_destroy, + .cli_show = cli_show_bgp_global_afi_safi_unicast_admin_distance_route, + } + }, + { + .xpath = "/frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-bgp:bgp/global/afi-safis/afi-safi/ipv4-multicast/admin-distance-route/distance", + .cbs = { + .modify = bgp_global_afi_safis_afi_safi_ipv4_multicast_admin_distance_route_distance_modify, + } + }, + { + .xpath = "/frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-bgp:bgp/global/afi-safis/afi-safi/ipv4-multicast/admin-distance-route/access-list-policy-export", + .cbs = { + .modify = bgp_global_afi_safis_afi_safi_ipv4_multicast_admin_distance_route_access_list_policy_export_modify, + .destroy = bgp_global_afi_safis_afi_safi_ipv4_multicast_admin_distance_route_access_list_policy_export_destroy, + } + }, + { + .xpath = "/frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-bgp:bgp/global/afi-safis/afi-safi/ipv4-multicast/admin-distance", + .cbs = { + .apply_finish = bgp_global_afi_safis_afi_safi_ipv4_multicast_admin_distance_apply_finish, } }, { .xpath = "/frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-bgp:bgp/global/afi-safis/afi-safi/ipv4-multicast/admin-distance/external", .cbs = { .modify = bgp_global_afi_safis_afi_safi_ipv4_multicast_admin_distance_external_modify, - .destroy = bgp_global_afi_safis_afi_safi_ipv4_multicast_admin_distance_external_destroy, } }, { .xpath = "/frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-bgp:bgp/global/afi-safis/afi-safi/ipv4-multicast/admin-distance/internal", .cbs = { .modify = bgp_global_afi_safis_afi_safi_ipv4_multicast_admin_distance_internal_modify, - .destroy = bgp_global_afi_safis_afi_safi_ipv4_multicast_admin_distance_internal_destroy, } }, { .xpath = "/frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-bgp:bgp/global/afi-safis/afi-safi/ipv4-multicast/admin-distance/local", .cbs = { .modify = bgp_global_afi_safis_afi_safi_ipv4_multicast_admin_distance_local_modify, - .destroy = bgp_global_afi_safis_afi_safi_ipv4_multicast_admin_distance_local_destroy, + } + }, + { + .xpath = "/frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-bgp:bgp/global/afi-safis/afi-safi/ipv4-multicast/route-flap-dampening", + .cbs = { + .apply_finish = bgp_global_afi_safis_afi_safi_route_flap_dampening_apply_finish, + .cli_show = cli_show_bgp_global_afi_safi_route_flap_dampening, } }, { @@ -1933,8 +2215,10 @@ const struct frr_yang_module_info frr_bgp_info = { { .xpath = "/frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-bgp:bgp/global/afi-safis/afi-safi/ipv6-multicast/network-config", .cbs = { + .apply_finish = bgp_global_afi_safis_afi_safi_network_config_apply_finish, .create = bgp_global_afi_safis_afi_safi_ipv6_multicast_network_config_create, .destroy = bgp_global_afi_safis_afi_safi_ipv6_multicast_network_config_destroy, + .cli_show = cli_show_bgp_global_afi_safi_network_config, } }, { @@ -1960,6 +2244,7 @@ const struct frr_yang_module_info frr_bgp_info = { { .xpath = "/frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-bgp:bgp/global/afi-safis/afi-safi/ipv6-multicast/aggregate-route", .cbs = { + .apply_finish = bgp_global_afi_safi_aggregate_route_apply_finish, .create = bgp_global_afi_safis_afi_safi_ipv6_multicast_aggregate_route_create, .destroy = bgp_global_afi_safis_afi_safi_ipv6_multicast_aggregate_route_destroy, } @@ -1984,31 +2269,109 @@ const struct frr_yang_module_info frr_bgp_info = { } }, { + .xpath = "/frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-bgp:bgp/global/afi-safis/afi-safi/ipv6-multicast/aggregate-route/origin", + .cbs = { + .modify = bgp_global_afi_safis_afi_safi_ipv6_multicast_aggregate_route_origin_modify, + } + }, + { + .xpath = "/frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-bgp:bgp/global/afi-safis/afi-safi/ipv6-multicast/aggregate-route/match-med", + .cbs = { + .modify = bgp_global_afi_safis_afi_safi_ipv6_multicast_aggregate_route_match_med_modify, + } + }, + { + .xpath = "/frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-bgp:bgp/global/afi-safis/afi-safi/ipv6-multicast/aggregate-route/suppress-map", + .cbs = { + .modify = bgp_global_afi_safis_afi_safi_ipv6_multicast_aggregate_route_suppress_map_modify, + .destroy = bgp_global_afi_safis_afi_safi_ipv6_multicast_aggregate_route_suppress_map_destroy, + } + }, + { .xpath = "/frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-bgp:bgp/global/afi-safis/afi-safi/ipv6-multicast/admin-distance-route", .cbs = { + .apply_finish = bgp_global_afi_safi_admin_distance_route_apply_finish, .create = bgp_global_afi_safis_afi_safi_ipv6_multicast_admin_distance_route_create, .destroy = bgp_global_afi_safis_afi_safi_ipv6_multicast_admin_distance_route_destroy, + .cli_show = cli_show_bgp_global_afi_safi_unicast_admin_distance_route, + } + }, + { + .xpath = "/frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-bgp:bgp/global/afi-safis/afi-safi/ipv6-multicast/admin-distance-route/distance", + .cbs = { + .modify = bgp_global_afi_safis_afi_safi_ipv6_multicast_admin_distance_route_distance_modify, + } + }, + { + .xpath = "/frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-bgp:bgp/global/afi-safis/afi-safi/ipv6-multicast/admin-distance-route/access-list-policy-export", + .cbs = { + .modify = bgp_global_afi_safis_afi_safi_ipv6_multicast_admin_distance_route_access_list_policy_export_modify, + .destroy = bgp_global_afi_safis_afi_safi_ipv6_multicast_admin_distance_route_access_list_policy_export_destroy, + } + }, + { + .xpath = "/frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-bgp:bgp/global/afi-safis/afi-safi/ipv6-multicast/route-flap-dampening", + .cbs = { + .apply_finish = bgp_global_afi_safis_afi_safi_route_flap_dampening_apply_finish, + .cli_show = cli_show_bgp_global_afi_safi_route_flap_dampening, + } + }, + { + .xpath = "/frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-bgp:bgp/global/afi-safis/afi-safi/ipv6-multicast/route-flap-dampening/enable", + .cbs = { + .modify = bgp_global_afi_safis_afi_safi_ipv6_multicast_route_flap_dampening_enable_modify, + } + }, + { + .xpath = "/frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-bgp:bgp/global/afi-safis/afi-safi/ipv6-multicast/route-flap-dampening/reach-decay", + .cbs = { + .modify = bgp_global_afi_safis_afi_safi_ipv6_multicast_route_flap_dampening_reach_decay_modify, + .destroy = bgp_global_afi_safis_afi_safi_ipv6_multicast_route_flap_dampening_reach_decay_destroy, + } + }, + { + .xpath = "/frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-bgp:bgp/global/afi-safis/afi-safi/ipv6-multicast/route-flap-dampening/reuse-above", + .cbs = { + .modify = bgp_global_afi_safis_afi_safi_ipv6_multicast_route_flap_dampening_reuse_above_modify, + .destroy = bgp_global_afi_safis_afi_safi_ipv6_multicast_route_flap_dampening_reuse_above_destroy, + } + }, + { + .xpath = "/frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-bgp:bgp/global/afi-safis/afi-safi/ipv6-multicast/route-flap-dampening/suppress-above", + .cbs = { + .modify = bgp_global_afi_safis_afi_safi_ipv6_multicast_route_flap_dampening_suppress_above_modify, + .destroy = bgp_global_afi_safis_afi_safi_ipv6_multicast_route_flap_dampening_suppress_above_destroy, + } + }, + { + .xpath = "/frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-bgp:bgp/global/afi-safis/afi-safi/ipv6-multicast/route-flap-dampening/unreach-decay", + .cbs = { + .modify = bgp_global_afi_safis_afi_safi_ipv6_multicast_route_flap_dampening_unreach_decay_modify, + .destroy = bgp_global_afi_safis_afi_safi_ipv6_multicast_route_flap_dampening_unreach_decay_destroy, + } + }, + { + .xpath = "/frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-bgp:bgp/global/afi-safis/afi-safi/ipv6-multicast/admin-distance", + .cbs = { + .apply_finish = bgp_global_afi_safis_afi_safi_ipv6_multicast_admin_distance_apply_finish, } }, { .xpath = "/frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-bgp:bgp/global/afi-safis/afi-safi/ipv6-multicast/admin-distance/external", .cbs = { .modify = bgp_global_afi_safis_afi_safi_ipv6_multicast_admin_distance_external_modify, - .destroy = bgp_global_afi_safis_afi_safi_ipv6_multicast_admin_distance_external_destroy, } }, { .xpath = "/frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-bgp:bgp/global/afi-safis/afi-safi/ipv6-multicast/admin-distance/internal", .cbs = { .modify = bgp_global_afi_safis_afi_safi_ipv6_multicast_admin_distance_internal_modify, - .destroy = bgp_global_afi_safis_afi_safi_ipv6_multicast_admin_distance_internal_destroy, } }, { .xpath = "/frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-bgp:bgp/global/afi-safis/afi-safi/ipv6-multicast/admin-distance/local", .cbs = { .modify = bgp_global_afi_safis_afi_safi_ipv6_multicast_admin_distance_local_modify, - .destroy = bgp_global_afi_safis_afi_safi_ipv6_multicast_admin_distance_local_destroy, } }, { @@ -2021,8 +2384,10 @@ const struct frr_yang_module_info frr_bgp_info = { { .xpath = "/frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-bgp:bgp/global/afi-safis/afi-safi/l3vpn-ipv4-unicast/network-config", .cbs = { + .apply_finish = bgp_global_afi_safis_afi_safi_network_config_apply_finish, .create = bgp_global_afi_safis_afi_safi_l3vpn_ipv4_unicast_network_config_create, .destroy = bgp_global_afi_safis_afi_safi_l3vpn_ipv4_unicast_network_config_destroy, + .cli_show = cli_show_bgp_global_afi_safi_network_config, } }, { diff --git a/bgpd/bgp_nb.h b/bgpd/bgp_nb.h index 341666c7ed..532021425f 100644 --- a/bgpd/bgp_nb.h +++ b/bgpd/bgp_nb.h @@ -568,6 +568,14 @@ int bgp_global_afi_safis_afi_safi_ipv4_unicast_aggregate_route_rmap_policy_expor struct nb_cb_modify_args *args); int bgp_global_afi_safis_afi_safi_ipv4_unicast_aggregate_route_rmap_policy_export_destroy( struct nb_cb_destroy_args *args); +int bgp_global_afi_safis_afi_safi_ipv4_unicast_aggregate_route_origin_modify( + struct nb_cb_modify_args *args); +int bgp_global_afi_safis_afi_safi_ipv4_unicast_aggregate_route_match_med_modify( + struct nb_cb_modify_args *args); +int bgp_global_afi_safis_afi_safi_ipv4_unicast_aggregate_route_suppress_map_modify( + struct nb_cb_modify_args *args); +int bgp_global_afi_safis_afi_safi_ipv4_unicast_aggregate_route_suppress_map_destroy( + struct nb_cb_destroy_args *args); int bgp_global_afi_safis_afi_safi_ipv4_unicast_admin_distance_route_create( struct nb_cb_create_args *args); int bgp_global_afi_safis_afi_safi_ipv4_unicast_admin_distance_route_destroy( @@ -618,16 +626,10 @@ int bgp_global_afi_safis_afi_safi_ipv4_unicast_redistribution_list_rmap_policy_i struct nb_cb_destroy_args *args); int bgp_global_afi_safis_afi_safi_ipv4_unicast_admin_distance_external_modify( struct nb_cb_modify_args *args); -int bgp_global_afi_safis_afi_safi_ipv4_unicast_admin_distance_external_destroy( - struct nb_cb_destroy_args *args); int bgp_global_afi_safis_afi_safi_ipv4_unicast_admin_distance_internal_modify( struct nb_cb_modify_args *args); -int bgp_global_afi_safis_afi_safi_ipv4_unicast_admin_distance_internal_destroy( - struct nb_cb_destroy_args *args); int bgp_global_afi_safis_afi_safi_ipv4_unicast_admin_distance_local_modify( struct nb_cb_modify_args *args); -int bgp_global_afi_safis_afi_safi_ipv4_unicast_admin_distance_local_destroy( - struct nb_cb_destroy_args *args); int bgp_global_afi_safis_afi_safi_ipv4_unicast_filter_config_rmap_export_modify( struct nb_cb_modify_args *args); int bgp_global_afi_safis_afi_safi_ipv4_unicast_filter_config_rmap_export_destroy( @@ -706,6 +708,14 @@ int bgp_global_afi_safis_afi_safi_ipv6_unicast_aggregate_route_rmap_policy_expor struct nb_cb_modify_args *args); int bgp_global_afi_safis_afi_safi_ipv6_unicast_aggregate_route_rmap_policy_export_destroy( struct nb_cb_destroy_args *args); +int bgp_global_afi_safis_afi_safi_ipv6_unicast_aggregate_route_origin_modify( + struct nb_cb_modify_args *args); +int bgp_global_afi_safis_afi_safi_ipv6_unicast_aggregate_route_match_med_modify( + struct nb_cb_modify_args *args); +int bgp_global_afi_safis_afi_safi_ipv6_unicast_aggregate_route_suppress_map_modify( + struct nb_cb_modify_args *args); +int bgp_global_afi_safis_afi_safi_ipv6_unicast_aggregate_route_suppress_map_destroy( + struct nb_cb_destroy_args *args); int bgp_global_afi_safis_afi_safi_ipv6_unicast_admin_distance_route_create( struct nb_cb_create_args *args); int bgp_global_afi_safis_afi_safi_ipv6_unicast_admin_distance_route_destroy( @@ -716,6 +726,24 @@ int bgp_global_afi_safis_afi_safi_ipv6_unicast_admin_distance_route_access_list_ struct nb_cb_modify_args *args); int bgp_global_afi_safis_afi_safi_ipv6_unicast_admin_distance_route_access_list_policy_export_destroy( struct nb_cb_destroy_args *args); +int bgp_global_afi_safis_afi_safi_ipv6_unicast_route_flap_dampening_enable_modify( + struct nb_cb_modify_args *args); +int bgp_global_afi_safis_afi_safi_ipv6_unicast_route_flap_dampening_reach_decay_modify( + struct nb_cb_modify_args *args); +int bgp_global_afi_safis_afi_safi_ipv6_unicast_route_flap_dampening_reach_decay_destroy( + struct nb_cb_destroy_args *args); +int bgp_global_afi_safis_afi_safi_ipv6_unicast_route_flap_dampening_reuse_above_modify( + struct nb_cb_modify_args *args); +int bgp_global_afi_safis_afi_safi_ipv6_unicast_route_flap_dampening_reuse_above_destroy( + struct nb_cb_destroy_args *args); +int bgp_global_afi_safis_afi_safi_ipv6_unicast_route_flap_dampening_suppress_above_modify( + struct nb_cb_modify_args *args); +int bgp_global_afi_safis_afi_safi_ipv6_unicast_route_flap_dampening_suppress_above_destroy( + struct nb_cb_destroy_args *args); +int bgp_global_afi_safis_afi_safi_ipv6_unicast_route_flap_dampening_unreach_decay_modify( + struct nb_cb_modify_args *args); +int bgp_global_afi_safis_afi_safi_ipv6_unicast_route_flap_dampening_unreach_decay_destroy( + struct nb_cb_destroy_args *args); int bgp_global_afi_safis_afi_safi_ipv6_unicast_use_multiple_paths_ebgp_maximum_paths_modify( struct nb_cb_modify_args *args); int bgp_global_afi_safis_afi_safi_ipv6_unicast_use_multiple_paths_ibgp_maximum_paths_modify( @@ -738,16 +766,10 @@ int bgp_global_afi_safis_afi_safi_ipv6_unicast_redistribution_list_rmap_policy_i struct nb_cb_destroy_args *args); int bgp_global_afi_safis_afi_safi_ipv6_unicast_admin_distance_external_modify( struct nb_cb_modify_args *args); -int bgp_global_afi_safis_afi_safi_ipv6_unicast_admin_distance_external_destroy( - struct nb_cb_destroy_args *args); int bgp_global_afi_safis_afi_safi_ipv6_unicast_admin_distance_internal_modify( struct nb_cb_modify_args *args); -int bgp_global_afi_safis_afi_safi_ipv6_unicast_admin_distance_internal_destroy( - struct nb_cb_destroy_args *args); int bgp_global_afi_safis_afi_safi_ipv6_unicast_admin_distance_local_modify( struct nb_cb_modify_args *args); -int bgp_global_afi_safis_afi_safi_ipv6_unicast_admin_distance_local_destroy( - struct nb_cb_destroy_args *args); int bgp_global_afi_safis_afi_safi_ipv6_unicast_filter_config_rmap_export_modify( struct nb_cb_modify_args *args); int bgp_global_afi_safis_afi_safi_ipv6_unicast_filter_config_rmap_export_destroy( @@ -808,6 +830,26 @@ int bgp_global_afi_safis_afi_safi_ipv4_labeled_unicast_use_multiple_paths_ibgp_c struct nb_cb_modify_args *args); int bgp_global_afi_safis_afi_safi_ipv4_labeled_unicast_use_multiple_paths_ibgp_cluster_length_list_destroy( struct nb_cb_destroy_args *args); +int bgp_global_afi_safis_afi_safi_ipv4_labeled_unicast_use_multiple_paths_ibgp_cluster_length_list_destroy( + struct nb_cb_destroy_args *args); +int bgp_global_afi_safis_afi_safi_ipv4_labeled_unicast_route_flap_dampening_enable_modify( + struct nb_cb_modify_args *args); +int bgp_global_afi_safis_afi_safi_ipv4_labeled_unicast_route_flap_dampening_reach_decay_modify( + struct nb_cb_modify_args *args); +int bgp_global_afi_safis_afi_safi_ipv4_labeled_unicast_route_flap_dampening_reach_decay_destroy( + struct nb_cb_destroy_args *args); +int bgp_global_afi_safis_afi_safi_ipv4_labeled_unicast_route_flap_dampening_reuse_above_modify( + struct nb_cb_modify_args *args); +int bgp_global_afi_safis_afi_safi_ipv4_labeled_unicast_route_flap_dampening_reuse_above_destroy( + struct nb_cb_destroy_args *args); +int bgp_global_afi_safis_afi_safi_ipv4_labeled_unicast_route_flap_dampening_suppress_above_modify( + struct nb_cb_modify_args *args); +int bgp_global_afi_safis_afi_safi_ipv4_labeled_unicast_route_flap_dampening_suppress_above_destroy( + struct nb_cb_destroy_args *args); +int bgp_global_afi_safis_afi_safi_ipv4_labeled_unicast_route_flap_dampening_unreach_decay_modify( + struct nb_cb_modify_args *args); +int bgp_global_afi_safis_afi_safi_ipv4_labeled_unicast_route_flap_dampening_unreach_decay_destroy( + struct nb_cb_destroy_args *args); int bgp_global_afi_safis_afi_safi_ipv6_labeled_unicast_use_multiple_paths_ebgp_maximum_paths_modify( struct nb_cb_modify_args *args); int bgp_global_afi_safis_afi_safi_ipv6_labeled_unicast_use_multiple_paths_ibgp_maximum_paths_modify( @@ -816,6 +858,24 @@ int bgp_global_afi_safis_afi_safi_ipv6_labeled_unicast_use_multiple_paths_ibgp_c struct nb_cb_modify_args *args); int bgp_global_afi_safis_afi_safi_ipv6_labeled_unicast_use_multiple_paths_ibgp_cluster_length_list_destroy( struct nb_cb_destroy_args *args); +int bgp_global_afi_safis_afi_safi_ipv6_labeled_unicast_route_flap_dampening_enable_modify( + struct nb_cb_modify_args *args); +int bgp_global_afi_safis_afi_safi_ipv6_labeled_unicast_route_flap_dampening_reach_decay_modify( + struct nb_cb_modify_args *args); +int bgp_global_afi_safis_afi_safi_ipv6_labeled_unicast_route_flap_dampening_reach_decay_destroy( + struct nb_cb_destroy_args *args); +int bgp_global_afi_safis_afi_safi_ipv6_labeled_unicast_route_flap_dampening_reuse_above_modify( + struct nb_cb_modify_args *args); +int bgp_global_afi_safis_afi_safi_ipv6_labeled_unicast_route_flap_dampening_reuse_above_destroy( + struct nb_cb_destroy_args *args); +int bgp_global_afi_safis_afi_safi_ipv6_labeled_unicast_route_flap_dampening_suppress_above_modify( + struct nb_cb_modify_args *args); +int bgp_global_afi_safis_afi_safi_ipv6_labeled_unicast_route_flap_dampening_suppress_above_destroy( + struct nb_cb_destroy_args *args); +int bgp_global_afi_safis_afi_safi_ipv6_labeled_unicast_route_flap_dampening_unreach_decay_modify( + struct nb_cb_modify_args *args); +int bgp_global_afi_safis_afi_safi_ipv6_labeled_unicast_route_flap_dampening_unreach_decay_destroy( + struct nb_cb_destroy_args *args); int bgp_global_afi_safis_afi_safi_ipv4_multicast_network_config_create( struct nb_cb_create_args *args); int bgp_global_afi_safis_afi_safi_ipv4_multicast_network_config_destroy( @@ -842,22 +902,30 @@ int bgp_global_afi_safis_afi_safi_ipv4_multicast_aggregate_route_rmap_policy_exp struct nb_cb_modify_args *args); int bgp_global_afi_safis_afi_safi_ipv4_multicast_aggregate_route_rmap_policy_export_destroy( struct nb_cb_destroy_args *args); +int bgp_global_afi_safis_afi_safi_ipv4_multicast_aggregate_route_origin_modify( + struct nb_cb_modify_args *args); +int bgp_global_afi_safis_afi_safi_ipv4_multicast_aggregate_route_match_med_modify( + struct nb_cb_modify_args *args); +int bgp_global_afi_safis_afi_safi_ipv4_multicast_aggregate_route_suppress_map_modify( + struct nb_cb_modify_args *args); +int bgp_global_afi_safis_afi_safi_ipv4_multicast_aggregate_route_suppress_map_destroy( + struct nb_cb_destroy_args *args); int bgp_global_afi_safis_afi_safi_ipv4_multicast_admin_distance_route_create( struct nb_cb_create_args *args); int bgp_global_afi_safis_afi_safi_ipv4_multicast_admin_distance_route_destroy( struct nb_cb_destroy_args *args); -int bgp_global_afi_safis_afi_safi_ipv4_multicast_admin_distance_external_modify( +int bgp_global_afi_safis_afi_safi_ipv4_multicast_admin_distance_route_distance_modify( + struct nb_cb_modify_args *args); +int bgp_global_afi_safis_afi_safi_ipv4_multicast_admin_distance_route_access_list_policy_export_modify( struct nb_cb_modify_args *args); -int bgp_global_afi_safis_afi_safi_ipv4_multicast_admin_distance_external_destroy( +int bgp_global_afi_safis_afi_safi_ipv4_multicast_admin_distance_route_access_list_policy_export_destroy( struct nb_cb_destroy_args *args); +int bgp_global_afi_safis_afi_safi_ipv4_multicast_admin_distance_external_modify( + struct nb_cb_modify_args *args); int bgp_global_afi_safis_afi_safi_ipv4_multicast_admin_distance_internal_modify( struct nb_cb_modify_args *args); -int bgp_global_afi_safis_afi_safi_ipv4_multicast_admin_distance_internal_destroy( - struct nb_cb_destroy_args *args); int bgp_global_afi_safis_afi_safi_ipv4_multicast_admin_distance_local_modify( struct nb_cb_modify_args *args); -int bgp_global_afi_safis_afi_safi_ipv4_multicast_admin_distance_local_destroy( - struct nb_cb_destroy_args *args); int bgp_global_afi_safis_afi_safi_ipv4_multicast_route_flap_dampening_enable_modify( struct nb_cb_modify_args *args); int bgp_global_afi_safis_afi_safi_ipv4_multicast_route_flap_dampening_reach_decay_modify( @@ -906,22 +974,48 @@ int bgp_global_afi_safis_afi_safi_ipv6_multicast_aggregate_route_rmap_policy_exp struct nb_cb_modify_args *args); int bgp_global_afi_safis_afi_safi_ipv6_multicast_aggregate_route_rmap_policy_export_destroy( struct nb_cb_destroy_args *args); +int bgp_global_afi_safis_afi_safi_ipv6_multicast_aggregate_route_origin_modify( + struct nb_cb_modify_args *args); +int bgp_global_afi_safis_afi_safi_ipv6_multicast_aggregate_route_match_med_modify( + struct nb_cb_modify_args *args); +int bgp_global_afi_safis_afi_safi_ipv6_multicast_aggregate_route_suppress_map_modify( + struct nb_cb_modify_args *args); +int bgp_global_afi_safis_afi_safi_ipv6_multicast_aggregate_route_suppress_map_destroy( + struct nb_cb_destroy_args *args); int bgp_global_afi_safis_afi_safi_ipv6_multicast_admin_distance_route_create( struct nb_cb_create_args *args); int bgp_global_afi_safis_afi_safi_ipv6_multicast_admin_distance_route_destroy( struct nb_cb_destroy_args *args); -int bgp_global_afi_safis_afi_safi_ipv6_multicast_admin_distance_external_modify( +int bgp_global_afi_safis_afi_safi_ipv6_multicast_admin_distance_route_distance_modify( + struct nb_cb_modify_args *args); +int bgp_global_afi_safis_afi_safi_ipv6_multicast_admin_distance_route_access_list_policy_export_modify( struct nb_cb_modify_args *args); -int bgp_global_afi_safis_afi_safi_ipv6_multicast_admin_distance_external_destroy( +int bgp_global_afi_safis_afi_safi_ipv6_multicast_admin_distance_route_access_list_policy_export_destroy( struct nb_cb_destroy_args *args); -int bgp_global_afi_safis_afi_safi_ipv6_multicast_admin_distance_internal_modify( +int bgp_global_afi_safis_afi_safi_ipv6_multicast_route_flap_dampening_enable_modify( + struct nb_cb_modify_args *args); +int bgp_global_afi_safis_afi_safi_ipv6_multicast_route_flap_dampening_reach_decay_modify( struct nb_cb_modify_args *args); -int bgp_global_afi_safis_afi_safi_ipv6_multicast_admin_distance_internal_destroy( +int bgp_global_afi_safis_afi_safi_ipv6_multicast_route_flap_dampening_reach_decay_destroy( struct nb_cb_destroy_args *args); -int bgp_global_afi_safis_afi_safi_ipv6_multicast_admin_distance_local_modify( +int bgp_global_afi_safis_afi_safi_ipv6_multicast_route_flap_dampening_reuse_above_modify( struct nb_cb_modify_args *args); -int bgp_global_afi_safis_afi_safi_ipv6_multicast_admin_distance_local_destroy( +int bgp_global_afi_safis_afi_safi_ipv6_multicast_route_flap_dampening_reuse_above_destroy( struct nb_cb_destroy_args *args); +int bgp_global_afi_safis_afi_safi_ipv6_multicast_route_flap_dampening_suppress_above_modify( + struct nb_cb_modify_args *args); +int bgp_global_afi_safis_afi_safi_ipv6_multicast_route_flap_dampening_suppress_above_destroy( + struct nb_cb_destroy_args *args); +int bgp_global_afi_safis_afi_safi_ipv6_multicast_route_flap_dampening_unreach_decay_modify( + struct nb_cb_modify_args *args); +int bgp_global_afi_safis_afi_safi_ipv6_multicast_route_flap_dampening_unreach_decay_destroy( + struct nb_cb_destroy_args *args); +int bgp_global_afi_safis_afi_safi_ipv6_multicast_admin_distance_external_modify( + struct nb_cb_modify_args *args); +int bgp_global_afi_safis_afi_safi_ipv6_multicast_admin_distance_internal_modify( + struct nb_cb_modify_args *args); +int bgp_global_afi_safis_afi_safi_ipv6_multicast_admin_distance_local_modify( + struct nb_cb_modify_args *args); int bgp_global_afi_safis_afi_safi_ipv4_flowspec_flow_spec_config_interface_modify( struct nb_cb_modify_args *args); int bgp_global_afi_safis_afi_safi_ipv4_flowspec_flow_spec_config_interface_destroy( @@ -3421,10 +3515,68 @@ void cli_show_router_bgp_graceful_shutdown(struct vty *vty, bool show_defaults); void cli_show_router_bgp_med_config(struct vty *vty, struct lyd_node *dnode, bool show_defaults); +void cli_show_bgp_global_afi_safi_header(struct vty *vty, + struct lyd_node *dnode, + bool show_defaults); +void cli_show_bgp_global_afi_safi_header_end(struct vty *vty, + struct lyd_node *dnode); +void cli_show_bgp_global_afi_safi_network_config(struct vty *vty, + struct lyd_node *dnode, + bool show_defaults); +void cli_show_bgp_global_afi_safi_unicast_aggregate_route( + struct vty *vty, struct lyd_node *dnode, bool show_defaults); +void cli_show_bgp_global_afi_safi_admin_distance_config(struct vty *vty, + struct lyd_node *dnode, + bool show_defaults); +void cli_show_bgp_global_afi_safi_route_flap_dampening(struct vty *vty, + struct lyd_node *dnode, + bool show_defaults); +void cli_show_bgp_global_afi_safi_unicast_admin_distance_route( + struct vty *vty, struct lyd_node *dnode, bool show_defaults); +void cli_show_bgp_global_afi_safi_unicast_use_multiple_paths_ebgp_maximum_paths( + struct vty *vty, struct lyd_node *dnode, bool show_defaults); +void cli_show_bgp_global_afi_safi_ip_unicast_use_multiple_paths_ibgp_maximum_paths( + struct vty *vty, struct lyd_node *dnode, bool show_defaults); +void cli_show_bgp_global_afi_safi_ip_unicast_redistribution_list( + struct vty *vty, struct lyd_node *dnode, bool show_defaults); +void cli_show_bgp_global_afi_safi_ip_unicast_vpn_config_nexthop( + struct vty *vty, struct lyd_node *dnode, bool show_defaults); +void cli_show_bgp_global_afi_safi_ip_unicast_vpn_config_rd( + struct vty *vty, struct lyd_node *dnode, bool show_defaults); +void cli_show_bgp_global_afi_safi_ip_unicast_vpn_config_import_vpn( + struct vty *vty, struct lyd_node *dnode, bool show_defaults); +void cli_show_bgp_global_afi_safi_ip_unicast_vpn_config_export_vpn( + struct vty *vty, struct lyd_node *dnode, bool show_defaults); +void cli_show_bgp_global_afi_safi_ip_unicast_vpn_config_import_vrfs( + struct vty *vty, struct lyd_node *dnode, bool show_defaults); +void cli_show_bgp_global_afi_safi_ip_unicast_vpn_config_rmap_import( + struct vty *vty, struct lyd_node *dnode, bool show_defaults); +void cli_show_bgp_global_afi_safi_ip_unicast_vpn_config_rmap_export( + struct vty *vty, struct lyd_node *dnode, bool show_defaults); void bgp_global_route_selection_options_apply_finish( struct nb_cb_apply_finish_args *args); void bgp_global_med_config_apply_finish(struct nb_cb_apply_finish_args *args); +void bgp_global_afi_safis_afi_safi_network_config_apply_finish( + struct nb_cb_apply_finish_args *args); +void bgp_global_afi_safi_aggregate_route_apply_finish( + struct nb_cb_apply_finish_args *args); +void bgp_global_afi_safis_afi_safi_ipv4_unicast_admin_distance_apply_finish( + struct nb_cb_apply_finish_args *args); +void bgp_global_afi_safis_afi_safi_ipv6_unicast_admin_distance_apply_finish( + struct nb_cb_apply_finish_args *args); +void bgp_global_afi_safis_afi_safi_ipv4_multicast_admin_distance_apply_finish( + struct nb_cb_apply_finish_args *args); +void bgp_global_afi_safis_afi_safi_ipv6_multicast_admin_distance_apply_finish( + struct nb_cb_apply_finish_args *args); +void bgp_global_afi_safi_admin_distance_route_apply_finish( + struct nb_cb_apply_finish_args *args); +void bgp_global_afi_safi_ip_unicast_use_multiple_paths_ibgp_maximum_paths_apply_finish( + struct nb_cb_apply_finish_args *args); +void bgp_global_afi_safi_ip_unicast_redistribution_list_apply_finish( + struct nb_cb_apply_finish_args *args); +void bgp_global_afi_safis_afi_safi_route_flap_dampening_apply_finish( + struct nb_cb_apply_finish_args *args); /* xpath macros */ /* route-list */ @@ -3437,5 +3589,8 @@ void bgp_global_med_config_apply_finish(struct nb_cb_apply_finish_args *args); "/frr-routing:routing/control-plane-protocols/" \ "control-plane-protocol[type='%s'][name='%s'][vrf='%s']/" \ "frr-bgp:bgp/local-as" +#define FRR_BGP_AFI_SAFI_REDIST_XPATH \ + "./global/afi-safis/afi-safi[afi-safi-name='%s']/%s/" \ + "redistribution-list[route-type='%s'][route-instance='%s']" #endif diff --git a/bgpd/bgp_nb_config.c b/bgpd/bgp_nb_config.c index f01325577c..66dfa2aea7 100644 --- a/bgpd/bgp_nb_config.c +++ b/bgpd/bgp_nb_config.c @@ -30,6 +30,7 @@ #include "bgpd/bgp_addpath.h" #include "bgpd/bgp_updgrp.h" #include "bgpd/bgp_io.h" +#include "bgpd/bgp_damp.h" FRR_CFG_DEFAULT_ULONG(BGP_CONNECT_RETRY, { .val_ulong = 10, .match_profile = "datacenter", }, @@ -244,7 +245,6 @@ int bgp_global_local_as_modify(struct nb_cb_modify_args *args) bgp->as); return NB_ERR_INCONSISTENCY; } - break; } @@ -509,7 +509,7 @@ int bgp_global_med_config_max_med_onstart_up_time_destroy( /* Cancel max-med onstartup if its on */ if (bgp->t_maxmed_onstartup) { - THREAD_TIMER_OFF(bgp->t_maxmed_onstartup); + THREAD_OFF(bgp->t_maxmed_onstartup); bgp->maxmed_onstartup_over = 1; } @@ -2042,8 +2042,30 @@ int bgp_global_bmp_config_mirror_buffer_limit_destroy( */ int bgp_global_afi_safis_afi_safi_create(struct nb_cb_create_args *args) { + const struct lyd_node *vrf_dnode; + const char *vrf_name; + const char *af_name; + afi_t afi; + safi_t safi; + switch (args->event) { case NB_EV_VALIDATE: + vrf_dnode = yang_dnode_get_parent(args->dnode, + "control-plane-protocol"); + vrf_name = yang_dnode_get_string(vrf_dnode, "./vrf"); + af_name = yang_dnode_get_string(args->dnode, "./afi-safi-name"); + yang_afi_safi_identity2value(af_name, &afi, &safi); + + if ((!strmatch(vrf_name, VRF_DEFAULT_NAME)) + && safi != SAFI_UNICAST && safi != SAFI_MULTICAST + && safi != SAFI_EVPN) { + snprintf( + args->errmsg, args->errmsg_len, + "Only Unicast/Multicast/EVPN SAFIs supported in non-core instances."); + return NB_ERR_VALIDATION; + } + + break; case NB_EV_PREPARE: case NB_EV_ABORT: case NB_EV_APPLY: @@ -5483,6 +5505,81 @@ int bgp_peer_groups_peer_group_afi_safis_afi_safi_enabled_modify( return NB_OK; } +void bgp_global_afi_safis_afi_safi_network_config_apply_finish( + struct nb_cb_apply_finish_args *args) +{ + const struct lyd_node *af_dnode; + struct bgp *bgp; + const char *af_name; + struct prefix prefix; + bool is_backdoor = false; + uint32_t label_index = BGP_INVALID_LABEL_INDEX; + const char *rmap_name = NULL; + afi_t afi; + safi_t safi; + + af_dnode = yang_dnode_get_parent(args->dnode, "afi-safi"); + af_name = yang_dnode_get_string(af_dnode, "./afi-safi-name"); + yang_afi_safi_identity2value(af_name, &afi, &safi); + bgp = nb_running_get_entry(af_dnode, NULL, true); + + yang_dnode_get_prefix(&prefix, args->dnode, "./prefix"); + + is_backdoor = yang_dnode_get_bool(args->dnode, "./backdoor"); + + if (yang_dnode_exists(args->dnode, "./label-index")) + label_index = + yang_dnode_get_uint32(args->dnode, "./label-index"); + + if (yang_dnode_exists(args->dnode, "./rmap-policy-export")) + rmap_name = yang_dnode_get_string(args->dnode, + "./rmap-policy-export"); + + bgp_static_set(bgp, NULL, &prefix, afi, safi, rmap_name, is_backdoor, + label_index, args->errmsg, args->errmsg_len); +} + +static int bgp_global_afi_safis_afi_safi_network_config_destroy( + struct nb_cb_destroy_args *args) +{ + const struct lyd_node *af_dnode; + struct bgp *bgp; + const char *af_name; + struct prefix prefix; + uint32_t label_index = BGP_INVALID_LABEL_INDEX; + const char *rmap_name = NULL; + bool is_backdoor = false; + afi_t afi; + safi_t safi; + int ret; + + af_dnode = yang_dnode_get_parent(args->dnode, "afi-safi"); + af_name = yang_dnode_get_string(af_dnode, "./afi-safi-name"); + yang_afi_safi_identity2value(af_name, &afi, &safi); + bgp = nb_running_get_entry(af_dnode, NULL, true); + + yang_dnode_get_prefix(&prefix, args->dnode, "./prefix"); + + if (yang_dnode_exists(args->dnode, "./rmap-policy-export")) + rmap_name = yang_dnode_get_string(args->dnode, + "./rmap-policy-export"); + + if (yang_dnode_exists(args->dnode, "./label-index")) + label_index = + yang_dnode_get_uint32(args->dnode, "./label-index"); + + if (yang_dnode_exists(args->dnode, "./backdoor")) + is_backdoor = yang_dnode_get_bool(args->dnode, "./backdoor"); + + ret = bgp_static_set(bgp, "no", &prefix, afi, safi, rmap_name, + is_backdoor, label_index, args->errmsg, + args->errmsg_len); + if (ret < 0) + return NB_ERR_INCONSISTENCY; + + return NB_OK; +} + /* * XPath: * /frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-bgp:bgp/global/afi-safis/afi-safi/ipv4-unicast/network-config @@ -5490,40 +5587,120 @@ int bgp_peer_groups_peer_group_afi_safis_afi_safi_enabled_modify( int bgp_global_afi_safis_afi_safi_ipv4_unicast_network_config_create( struct nb_cb_create_args *args) { + /* Handled in network_config_apply_finish callback */ + + return NB_OK; +} + +int bgp_global_afi_safis_afi_safi_ipv4_unicast_network_config_destroy( + struct nb_cb_destroy_args *args) +{ switch (args->event) { case NB_EV_VALIDATE: case NB_EV_PREPARE: case NB_EV_ABORT: + return NB_OK; case NB_EV_APPLY: - /* TODO: implement me. */ + return bgp_global_afi_safis_afi_safi_network_config_destroy( + args); + break; } return NB_OK; } -int bgp_global_afi_safis_afi_safi_ipv4_unicast_network_config_destroy( - struct nb_cb_destroy_args *args) +/* + * XPath: + * /frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-bgp:bgp/global/afi-safis/afi-safi/ipv4-unicast/network-config/backdoor + */ +int bgp_global_afi_safis_afi_safi_ipv4_unicast_network_config_backdoor_modify( + struct nb_cb_modify_args *args) +{ + /* Handled in unicast_network_config_apply_finish callback */ + + return NB_OK; +} + +/* + * XPath: + * /frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-bgp:bgp/global/afi-safis/afi-safi/ipv4-unicast/network-config/label-index + */ +int bgp_global_afi_safis_afi_safi_ipv4_unicast_network_config_label_index_modify( + struct nb_cb_modify_args *args) { + const struct lyd_node *af_dnode; + struct bgp *bgp; + const char *af_name; + struct prefix prefix; + uint32_t label_index; + afi_t afi; + safi_t safi; + struct bgp_dest *dest; + struct bgp_static *bgp_static; + switch (args->event) { case NB_EV_VALIDATE: + bgp = nb_running_get_entry(args->dnode, NULL, false); + if (!bgp) + return NB_OK; + + af_dnode = yang_dnode_get_parent(args->dnode, "afi-safi"); + af_name = yang_dnode_get_string(af_dnode, "./afi-safi-name"); + yang_afi_safi_identity2value(af_name, &afi, &safi); + yang_dnode_get_prefix(&prefix, args->dnode, "../prefix"); + apply_mask(&prefix); + + label_index = yang_dnode_get_uint32(args->dnode, NULL); + + dest = bgp_node_get(bgp->route[afi][safi], &prefix); + bgp_static = bgp_dest_get_bgp_static_info(dest); + if (bgp_static) { + if (bgp_static->label_index != label_index) { + snprintf( + args->errmsg, args->errmsg_len, + "Cannot change label-index: curr %u input %u\n", + bgp_static->label_index, label_index); + return NB_ERR_VALIDATION; + } + } + + break; case NB_EV_PREPARE: case NB_EV_ABORT: case NB_EV_APPLY: - /* TODO: implement me. */ break; } return NB_OK; } +int bgp_global_afi_safis_afi_safi_ipv4_unicast_network_config_label_index_destroy( + struct nb_cb_destroy_args *args) +{ + /* Handled in unicast_network_config_apply_finish callback */ + + return NB_OK; +} + /* * XPath: - * /frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-bgp:bgp/global/afi-safis/afi-safi/ipv4-unicast/network-config/backdoor + * /frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-bgp:bgp/global/afi-safis/afi-safi/ipv4-unicast/network-config/rmap-policy-export */ -int bgp_global_afi_safis_afi_safi_ipv4_unicast_network_config_backdoor_modify( +int bgp_global_afi_safis_afi_safi_ipv4_unicast_network_config_rmap_policy_export_modify( struct nb_cb_modify_args *args) { + /* Handled in unicast_network_config_apply_finish callback */ + + return NB_OK; +} + +int bgp_global_afi_safis_afi_safi_ipv4_unicast_network_config_rmap_policy_export_destroy( + struct nb_cb_destroy_args *args) +{ + /* rmap destory alone is not supported by backend, the entire network + * config needs to be destroyed. + */ switch (args->event) { case NB_EV_VALIDATE: case NB_EV_PREPARE: @@ -5536,12 +5713,82 @@ int bgp_global_afi_safis_afi_safi_ipv4_unicast_network_config_backdoor_modify( return NB_OK; } +void bgp_global_afi_safi_aggregate_route_apply_finish( + struct nb_cb_apply_finish_args *args) +{ + const struct lyd_node *af_dnode; + struct bgp *bgp; + const char *af_name; + struct prefix prefix; + const char *rmap_name = NULL; + afi_t afi; + safi_t safi; + uint8_t as_set = 0; + int summary_only = 0; + uint8_t origin = BGP_ORIGIN_UNSPECIFIED; + bool match_med = false; + const char *suppress_map = NULL; + + af_dnode = yang_dnode_get_parent(args->dnode, "afi-safi"); + af_name = yang_dnode_get_string(af_dnode, "./afi-safi-name"); + yang_afi_safi_identity2value(af_name, &afi, &safi); + bgp = nb_running_get_entry(af_dnode, NULL, true); + + yang_dnode_get_prefix(&prefix, args->dnode, "./prefix"); + + if (yang_dnode_exists(args->dnode, "./as-set")) + as_set = yang_dnode_get_bool(args->dnode, "./as-set"); + + summary_only = yang_dnode_get_bool(args->dnode, "./summary-only"); + + if (yang_dnode_exists(args->dnode, "./rmap-policy-export")) + rmap_name = yang_dnode_get_string(args->dnode, + "./rmap-policy-export"); + + origin = yang_dnode_get_enum(args->dnode, "./origin"); + match_med = yang_dnode_get_bool(args->dnode, "./match-med"); + if (yang_dnode_exists(args->dnode, "./suppress-map")) + suppress_map = + yang_dnode_get_string(args->dnode, "./suppress-map"); + + bgp_aggregate_set(bgp, &prefix, afi, safi, rmap_name, summary_only, + as_set, origin, match_med, suppress_map, args->errmsg, + args->errmsg_len); +} + +static int +bgp_global_afi_safi_aggregate_route_destroy(struct nb_cb_destroy_args *args) +{ + const struct lyd_node *af_dnode; + struct bgp *bgp; + const char *af_name; + struct prefix prefix; + afi_t afi; + safi_t safi; + int ret; + + af_dnode = yang_dnode_get_parent(args->dnode, "afi-safi"); + af_name = yang_dnode_get_string(af_dnode, "./afi-safi-name"); + yang_afi_safi_identity2value(af_name, &afi, &safi); + bgp = nb_running_get_entry(af_dnode, NULL, true); + + yang_dnode_get_prefix(&prefix, args->dnode, "./prefix"); + + ret = bgp_aggregate_unset(bgp, &prefix, afi, safi, args->errmsg, + args->errmsg_len); + + if (ret < 0) + return NB_ERR_INCONSISTENCY; + + return NB_OK; +} + /* * XPath: - * /frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-bgp:bgp/global/afi-safis/afi-safi/ipv4-unicast/network-config/label-index + * /frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-bgp:bgp/global/afi-safis/afi-safi/ipv4-unicast/aggregate-route */ -int bgp_global_afi_safis_afi_safi_ipv4_unicast_network_config_label_index_modify( - struct nb_cb_modify_args *args) +int bgp_global_afi_safis_afi_safi_ipv4_unicast_aggregate_route_create( + struct nb_cb_create_args *args) { switch (args->event) { case NB_EV_VALIDATE: @@ -5555,16 +5802,16 @@ int bgp_global_afi_safis_afi_safi_ipv4_unicast_network_config_label_index_modify return NB_OK; } -int bgp_global_afi_safis_afi_safi_ipv4_unicast_network_config_label_index_destroy( +int bgp_global_afi_safis_afi_safi_ipv4_unicast_aggregate_route_destroy( struct nb_cb_destroy_args *args) { switch (args->event) { case NB_EV_VALIDATE: case NB_EV_PREPARE: case NB_EV_ABORT: + return NB_OK; case NB_EV_APPLY: - /* TODO: implement me. */ - break; + return bgp_global_afi_safi_aggregate_route_destroy(args); } return NB_OK; @@ -5572,9 +5819,9 @@ int bgp_global_afi_safis_afi_safi_ipv4_unicast_network_config_label_index_destro /* * XPath: - * /frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-bgp:bgp/global/afi-safis/afi-safi/ipv4-unicast/network-config/rmap-policy-export + * /frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-bgp:bgp/global/afi-safis/afi-safi/ipv4-unicast/aggregate-route/as-set */ -int bgp_global_afi_safis_afi_safi_ipv4_unicast_network_config_rmap_policy_export_modify( +int bgp_global_afi_safis_afi_safi_ipv4_unicast_aggregate_route_as_set_modify( struct nb_cb_modify_args *args) { switch (args->event) { @@ -5589,8 +5836,12 @@ int bgp_global_afi_safis_afi_safi_ipv4_unicast_network_config_rmap_policy_export return NB_OK; } -int bgp_global_afi_safis_afi_safi_ipv4_unicast_network_config_rmap_policy_export_destroy( - struct nb_cb_destroy_args *args) +/* + * XPath: + * /frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-bgp:bgp/global/afi-safis/afi-safi/ipv4-unicast/aggregate-route/summary-only + */ +int bgp_global_afi_safis_afi_safi_ipv4_unicast_aggregate_route_summary_only_modify( + struct nb_cb_modify_args *args) { switch (args->event) { case NB_EV_VALIDATE: @@ -5606,10 +5857,10 @@ int bgp_global_afi_safis_afi_safi_ipv4_unicast_network_config_rmap_policy_export /* * XPath: - * /frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-bgp:bgp/global/afi-safis/afi-safi/ipv4-unicast/aggregate-route + * /frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-bgp:bgp/global/afi-safis/afi-safi/ipv4-unicast/aggregate-route/rmap-policy-export */ -int bgp_global_afi_safis_afi_safi_ipv4_unicast_aggregate_route_create( - struct nb_cb_create_args *args) +int bgp_global_afi_safis_afi_safi_ipv4_unicast_aggregate_route_rmap_policy_export_modify( + struct nb_cb_modify_args *args) { switch (args->event) { case NB_EV_VALIDATE: @@ -5623,7 +5874,7 @@ int bgp_global_afi_safis_afi_safi_ipv4_unicast_aggregate_route_create( return NB_OK; } -int bgp_global_afi_safis_afi_safi_ipv4_unicast_aggregate_route_destroy( +int bgp_global_afi_safis_afi_safi_ipv4_unicast_aggregate_route_rmap_policy_export_destroy( struct nb_cb_destroy_args *args) { switch (args->event) { @@ -5640,9 +5891,9 @@ int bgp_global_afi_safis_afi_safi_ipv4_unicast_aggregate_route_destroy( /* * XPath: - * /frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-bgp:bgp/global/afi-safis/afi-safi/ipv4-unicast/aggregate-route/as-set + * /frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-bgp:bgp/global/afi-safis/afi-safi/ipv4-unicast/aggregate-route/origin */ -int bgp_global_afi_safis_afi_safi_ipv4_unicast_aggregate_route_as_set_modify( +int bgp_global_afi_safis_afi_safi_ipv4_unicast_aggregate_route_origin_modify( struct nb_cb_modify_args *args) { switch (args->event) { @@ -5659,9 +5910,9 @@ int bgp_global_afi_safis_afi_safi_ipv4_unicast_aggregate_route_as_set_modify( /* * XPath: - * /frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-bgp:bgp/global/afi-safis/afi-safi/ipv4-unicast/aggregate-route/summary-only + * /frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-bgp:bgp/global/afi-safis/afi-safi/ipv4-unicast/aggregate-route/match-med */ -int bgp_global_afi_safis_afi_safi_ipv4_unicast_aggregate_route_summary_only_modify( +int bgp_global_afi_safis_afi_safi_ipv4_unicast_aggregate_route_match_med_modify( struct nb_cb_modify_args *args) { switch (args->event) { @@ -5678,9 +5929,9 @@ int bgp_global_afi_safis_afi_safi_ipv4_unicast_aggregate_route_summary_only_modi /* * XPath: - * /frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-bgp:bgp/global/afi-safis/afi-safi/ipv4-unicast/aggregate-route/rmap-policy-export + * /frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-bgp:bgp/global/afi-safis/afi-safi/ipv4-unicast/aggregate-route/suppress-map */ -int bgp_global_afi_safis_afi_safi_ipv4_unicast_aggregate_route_rmap_policy_export_modify( +int bgp_global_afi_safis_afi_safi_ipv4_unicast_aggregate_route_suppress_map_modify( struct nb_cb_modify_args *args) { switch (args->event) { @@ -5695,7 +5946,7 @@ int bgp_global_afi_safis_afi_safi_ipv4_unicast_aggregate_route_rmap_policy_expor return NB_OK; } -int bgp_global_afi_safis_afi_safi_ipv4_unicast_aggregate_route_rmap_policy_export_destroy( +int bgp_global_afi_safis_afi_safi_ipv4_unicast_aggregate_route_suppress_map_destroy( struct nb_cb_destroy_args *args) { switch (args->event) { @@ -5710,6 +5961,60 @@ int bgp_global_afi_safis_afi_safi_ipv4_unicast_aggregate_route_rmap_policy_expor return NB_OK; } +void bgp_global_afi_safi_admin_distance_route_apply_finish( + struct nb_cb_apply_finish_args *args) +{ + const struct lyd_node *af_dnode; + const char *af_name; + const char *prefix_str = NULL; + const char *access_list_str = NULL; + uint8_t distance; + afi_t afi; + safi_t safi; + + af_dnode = yang_dnode_get_parent(args->dnode, "afi-safi"); + af_name = yang_dnode_get_string(af_dnode, "./afi-safi-name"); + yang_afi_safi_identity2value(af_name, &afi, &safi); + + prefix_str = yang_dnode_get_string(args->dnode, "./prefix"); + distance = yang_dnode_get_uint8(args->dnode, "./distance"); + if (yang_dnode_exists(args->dnode, "./access-list-policy-export")) + access_list_str = yang_dnode_get_string( + args->dnode, "./access-list-policy-export"); + + bgp_distance_set(distance, prefix_str, access_list_str, afi, safi, + args->errmsg, args->errmsg_len); +} + +static int bgp_global_afi_safi_admin_distance_route_destroy( + struct nb_cb_destroy_args *args) +{ + const struct lyd_node *af_dnode; + const char *af_name; + const char *prefix_str = NULL; + const char *access_list_str = NULL; + uint8_t distance; + afi_t afi; + safi_t safi; + + af_dnode = yang_dnode_get_parent(args->dnode, "afi-safi"); + af_name = yang_dnode_get_string(af_dnode, "./afi-safi-name"); + yang_afi_safi_identity2value(af_name, &afi, &safi); + + prefix_str = yang_dnode_get_string(args->dnode, "./prefix"); + distance = yang_dnode_get_uint8(args->dnode, "./distance"); + if (yang_dnode_exists(args->dnode, "./access-list-policy-export")) + access_list_str = yang_dnode_get_string( + args->dnode, "./access-list-policy-export"); + + if (bgp_distance_unset(distance, prefix_str, access_list_str, afi, safi, + args->errmsg, args->errmsg_len) + != CMD_SUCCESS) + return NB_ERR_INCONSISTENCY; + + return NB_OK; +} + /* * XPath: * /frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-bgp:bgp/global/afi-safis/afi-safi/ipv4-unicast/admin-distance-route @@ -5736,9 +6041,9 @@ int bgp_global_afi_safis_afi_safi_ipv4_unicast_admin_distance_route_destroy( case NB_EV_VALIDATE: case NB_EV_PREPARE: case NB_EV_ABORT: + return NB_OK; case NB_EV_APPLY: - /* TODO: implement me. */ - break; + return bgp_global_afi_safi_admin_distance_route_destroy(args); } return NB_OK; @@ -5797,6 +6102,68 @@ int bgp_global_afi_safis_afi_safi_ipv4_unicast_admin_distance_route_access_list_ return NB_OK; } +void bgp_global_afi_safis_afi_safi_route_flap_dampening_apply_finish( + struct nb_cb_apply_finish_args *args) +{ + const struct lyd_node *af_dnode; + struct bgp *bgp; + const char *af_name; + afi_t afi; + safi_t safi; + int half = DEFAULT_HALF_LIFE * 60; + int reuse = DEFAULT_REUSE; + int suppress = DEFAULT_SUPPRESS; + int max; + char ab_xpath[XPATH_MAXLEN]; + + af_dnode = yang_dnode_get_parent(args->dnode, "afi-safi"); + af_name = yang_dnode_get_string(af_dnode, "./afi-safi-name"); + yang_afi_safi_identity2value(af_name, &afi, &safi); + bgp = nb_running_get_entry(af_dnode, NULL, true); + + if (!yang_dnode_get_bool(args->dnode, "./enable")) { + bgp_damp_disable(bgp, afi, safi); + } else { + half = yang_dnode_get_uint8(args->dnode, "./reach-decay"); + half *= 60; + reuse = yang_dnode_get_uint16(args->dnode, "./reuse-above"); + + suppress = + yang_dnode_get_uint16(args->dnode, "./suppress-above"); + + max = yang_dnode_get_uint8(args->dnode, "./unreach-decay"); + yang_dnode_get_path(args->dnode, ab_xpath, sizeof(ab_xpath)); + strlcat(ab_xpath, "/unreach-decay", sizeof(ab_xpath)); + if (yang_get_default_uint8(ab_xpath) == max) + max = half * 4; + else + max *= 60; + + bgp_damp_enable(bgp, afi, safi, half, reuse, suppress, max); + } +} + +static int +bgp_global_afi_safi_route_flap_validation(struct nb_cb_modify_args *args) +{ + int reuse; + int suppress; + + if (yang_dnode_exists(args->dnode, "../supress-above") + && yang_dnode_exists(args->dnode, "../reuse-above")) { + suppress = + yang_dnode_get_uint16(args->dnode, "../suppress-above"); + reuse = yang_dnode_get_uint16(args->dnode, "../reuse-above"); + if (suppress < reuse) { + snprintf( + args->errmsg, args->errmsg_len, + "Suppress value cannot be less than reuse value \n"); + return NB_ERR_VALIDATION; + } + } + return NB_OK; +} + /* * XPath: * /frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-bgp:bgp/global/afi-safis/afi-safi/ipv4-unicast/route-flap-dampening/enable @@ -5806,10 +6173,10 @@ int bgp_global_afi_safis_afi_safi_ipv4_unicast_route_flap_dampening_enable_modif { switch (args->event) { case NB_EV_VALIDATE: + return bgp_global_afi_safi_route_flap_validation(args); case NB_EV_PREPARE: case NB_EV_ABORT: case NB_EV_APPLY: - /* TODO: implement me. */ break; } @@ -5857,8 +6224,22 @@ int bgp_global_afi_safis_afi_safi_ipv4_unicast_route_flap_dampening_reach_decay_ int bgp_global_afi_safis_afi_safi_ipv4_unicast_route_flap_dampening_reuse_above_modify( struct nb_cb_modify_args *args) { + int reuse = DEFAULT_REUSE; + int suppress = DEFAULT_SUPPRESS; + switch (args->event) { case NB_EV_VALIDATE: + if (yang_dnode_exists(args->dnode, "../suppress-above")) + suppress = yang_dnode_get_uint16(args->dnode, + "../suppress-above"); + reuse = yang_dnode_get_uint16(args->dnode, "../reuse-above"); + if (suppress < reuse) { + snprintf( + args->errmsg, args->errmsg_len, + "Suppress value cannot be less than reuse value \n"); + return NB_ERR_VALIDATION; + } + break; case NB_EV_PREPARE: case NB_EV_ABORT: case NB_EV_APPLY: @@ -5952,6 +6333,45 @@ int bgp_global_afi_safis_afi_safi_ipv4_unicast_route_flap_dampening_unreach_deca return NB_OK; } +static int +bgp_global_afi_safi_ip_unicast_use_multiple_paths_ebgp_maximum_paths_modify( + struct nb_cb_modify_args *args) +{ + const struct lyd_node *af_dnode; + struct bgp *bgp; + const char *af_name; + afi_t afi; + safi_t safi; + uint16_t maxpaths, default_maxpaths; + int ret; + char xpath[XPATH_MAXLEN]; + char afi_xpath[XPATH_MAXLEN]; + + af_dnode = yang_dnode_get_parent(args->dnode, "afi-safi"); + af_name = yang_dnode_get_string(af_dnode, "./afi-safi-name"); + yang_afi_safi_identity2value(af_name, &afi, &safi); + bgp = nb_running_get_entry(af_dnode, NULL, true); + maxpaths = yang_dnode_get_uint16(args->dnode, NULL); + + snprintf(xpath, sizeof(xpath), FRR_BGP_GLOBAL_XPATH, "frr-bgp:bgp", + "bgp", bgp->name ? bgp->name : VRF_DEFAULT_NAME); + snprintf( + afi_xpath, sizeof(afi_xpath), + "/global/afi-safis/afi-safi[afi-safi-name='%s']/%s/use-multiple-paths/ebgp/maximum-paths", + yang_afi_safi_value2identity(afi, safi), + bgp_afi_safi_get_container_str(afi, safi)); + strlcat(xpath, afi_xpath, sizeof(xpath)); + default_maxpaths = yang_get_default_uint16(xpath); + + ret = bgp_maxpaths_config_vty(bgp, afi, safi, BGP_PEER_EBGP, maxpaths, + 0, maxpaths != default_maxpaths ? 1 : 0, + args->errmsg, args->errmsg_len); + if (ret != CMD_SUCCESS) + return NB_ERR_INCONSISTENCY; + + return NB_OK; +} + /* * XPath: * /frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-bgp:bgp/global/afi-safis/afi-safi/ipv4-unicast/use-multiple-paths/ebgp/maximum-paths @@ -5959,13 +6379,24 @@ int bgp_global_afi_safis_afi_safi_ipv4_unicast_route_flap_dampening_unreach_deca int bgp_global_afi_safis_afi_safi_ipv4_unicast_use_multiple_paths_ebgp_maximum_paths_modify( struct nb_cb_modify_args *args) { + uint16_t maxpaths; + switch (args->event) { case NB_EV_VALIDATE: + maxpaths = yang_dnode_get_uint16(args->dnode, NULL); + if (maxpaths > MULTIPATH_NUM) { + snprintf(args->errmsg, args->errmsg_len, + "maxpaths %u is out of range %u", maxpaths, + MULTIPATH_NUM); + return NB_ERR_VALIDATION; + } + break; case NB_EV_PREPARE: case NB_EV_ABORT: + return NB_OK; case NB_EV_APPLY: - /* TODO: implement me. */ - break; + return bgp_global_afi_safi_ip_unicast_use_multiple_paths_ebgp_maximum_paths_modify( + args); } return NB_OK; @@ -5973,17 +6404,68 @@ int bgp_global_afi_safis_afi_safi_ipv4_unicast_use_multiple_paths_ebgp_maximum_p /* * XPath: + * /frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-bgp:bgp/global/afi-safis/afi-safi/ipv4-unicast/use-multiple-paths/ibgp + */ +void bgp_global_afi_safi_ip_unicast_use_multiple_paths_ibgp_maximum_paths_apply_finish( + struct nb_cb_apply_finish_args *args) +{ + const struct lyd_node *af_dnode; + struct bgp *bgp; + const char *af_name; + afi_t afi; + safi_t safi; + uint16_t maxpaths, default_maxpaths; + char xpath[XPATH_MAXLEN]; + char afi_xpath[XPATH_MAXLEN]; + uint16_t options = 0; + + af_dnode = yang_dnode_get_parent(args->dnode, "afi-safi"); + af_name = yang_dnode_get_string(af_dnode, "./afi-safi-name"); + yang_afi_safi_identity2value(af_name, &afi, &safi); + bgp = nb_running_get_entry(af_dnode, NULL, true); + + maxpaths = yang_dnode_get_uint16(args->dnode, "./maximum-paths"); + if (yang_dnode_get_bool(args->dnode, "./cluster-length-list")) + options = BGP_FLAG_IBGP_MULTIPATH_SAME_CLUSTERLEN; + + snprintf(xpath, sizeof(xpath), FRR_BGP_GLOBAL_XPATH, "frr-bgp:bgp", + "bgp", bgp->name ? bgp->name : VRF_DEFAULT_NAME); + snprintf( + afi_xpath, sizeof(afi_xpath), + "/global/afi-safis/afi-safi[afi-safi-name='%s']/%s/use-multiple-paths/ibgp/maximum-paths", + yang_afi_safi_value2identity(afi, safi), + bgp_afi_safi_get_container_str(afi, safi)); + strlcat(xpath, afi_xpath, sizeof(xpath)); + default_maxpaths = yang_get_default_uint16(xpath); + + bgp_maxpaths_config_vty(bgp, afi, safi, BGP_PEER_IBGP, maxpaths, + options, maxpaths != default_maxpaths ? 1 : 0, + args->errmsg, args->errmsg_len); +} + +/* + * XPath: * /frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-bgp:bgp/global/afi-safis/afi-safi/ipv4-unicast/use-multiple-paths/ibgp/maximum-paths */ int bgp_global_afi_safis_afi_safi_ipv4_unicast_use_multiple_paths_ibgp_maximum_paths_modify( struct nb_cb_modify_args *args) { + uint16_t maxpaths; + switch (args->event) { case NB_EV_VALIDATE: + maxpaths = yang_dnode_get_uint16(args->dnode, NULL); + if (maxpaths > MULTIPATH_NUM) { + snprintf(args->errmsg, args->errmsg_len, + "maxpaths %u is out of range %u", maxpaths, + MULTIPATH_NUM); + return NB_ERR_VALIDATION; + } + break; case NB_EV_PREPARE: case NB_EV_ABORT: + return NB_OK; case NB_EV_APPLY: - /* TODO: implement me. */ break; } @@ -6024,6 +6506,49 @@ int bgp_global_afi_safis_afi_safi_ipv4_unicast_use_multiple_paths_ibgp_cluster_l return NB_OK; } +void bgp_global_afi_safi_ip_unicast_redistribution_list_apply_finish( + struct nb_cb_apply_finish_args *args) +{ + const struct lyd_node *af_dnode; + struct bgp *bgp; + const char *af_name; + afi_t afi; + safi_t safi; + int route_type; + int route_instance; + struct bgp_redist *red; + bool changed = false; + struct route_map *route_map = NULL; + const char *rmap_name = NULL; + uint32_t metric = 0; + + af_dnode = yang_dnode_get_parent(args->dnode, "afi-safi"); + af_name = yang_dnode_get_string(af_dnode, "./afi-safi-name"); + yang_afi_safi_identity2value(af_name, &afi, &safi); + bgp = nb_running_get_entry(af_dnode, NULL, true); + + route_type = yang_dnode_get_enum(args->dnode, "./route-type"); + route_instance = yang_dnode_get_uint16(args->dnode, "./route-instance"); + + red = bgp_redist_add(bgp, afi, route_type, route_instance); + + if (yang_dnode_exists(args->dnode, "./rmap-policy-import")) { + rmap_name = yang_dnode_get_string(args->dnode, + "./rmap-policy-import"); + route_map = route_map_lookup_by_name(rmap_name); + + changed = bgp_redistribute_rmap_set(red, rmap_name, route_map); + } + + if (yang_dnode_exists(args->dnode, "./metric")) { + metric = yang_dnode_get_uint32(args->dnode, "./metric"); + changed |= bgp_redistribute_metric_set(bgp, red, afi, + route_type, metric); + } + + bgp_redistribute_set(bgp, afi, route_type, route_instance, changed); +} + /* * XPath: * /frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-bgp:bgp/global/afi-safis/afi-safi/ipv4-unicast/redistribution-list @@ -6046,12 +6571,31 @@ int bgp_global_afi_safis_afi_safi_ipv4_unicast_redistribution_list_create( int bgp_global_afi_safis_afi_safi_ipv4_unicast_redistribution_list_destroy( struct nb_cb_destroy_args *args) { + const struct lyd_node *af_dnode; + struct bgp *bgp; + const char *af_name; + afi_t afi; + safi_t safi; + int route_type; + int route_instance; + switch (args->event) { case NB_EV_VALIDATE: case NB_EV_PREPARE: case NB_EV_ABORT: + return NB_OK; case NB_EV_APPLY: - /* TODO: implement me. */ + af_dnode = yang_dnode_get_parent(args->dnode, "afi-safi"); + af_name = yang_dnode_get_string(af_dnode, "./afi-safi-name"); + yang_afi_safi_identity2value(af_name, &afi, &safi); + bgp = nb_running_get_entry(af_dnode, NULL, true); + + route_type = yang_dnode_get_enum(args->dnode, "./route-type"); + route_instance = + yang_dnode_get_uint16(args->dnode, "./route-instance"); + + bgp_redistribute_unset(bgp, afi, route_type, route_instance); + break; } @@ -6126,36 +6670,52 @@ int bgp_global_afi_safis_afi_safi_ipv4_unicast_redistribution_list_rmap_policy_i return NB_OK; } +static int +bgp_global_afi_safis_admin_distance_modify(struct nb_cb_apply_finish_args *args) +{ + struct bgp *bgp; + const struct lyd_node *af_dnode; + const char *af_name; + afi_t afi; + safi_t safi; + uint8_t distance_ebgp, distance_ibgp, distance_local; + + af_dnode = yang_dnode_get_parent(args->dnode, "afi-safi"); + af_name = yang_dnode_get_string(af_dnode, "./afi-safi-name"); + yang_afi_safi_identity2value(af_name, &afi, &safi); + bgp = nb_running_get_entry(af_dnode, NULL, true); + + distance_ebgp = yang_dnode_get_uint8(args->dnode, "./external"); + distance_ibgp = yang_dnode_get_uint8(args->dnode, "./internal"); + distance_local = yang_dnode_get_uint8(args->dnode, "./local"); + + bgp->distance_ebgp[afi][safi] = distance_ebgp; + bgp->distance_ibgp[afi][safi] = distance_ibgp; + bgp->distance_local[afi][safi] = distance_local; + + bgp_announce_routes_distance_update(bgp, afi, safi); + + return NB_OK; +} + /* * XPath: - * /frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-bgp:bgp/global/afi-safis/afi-safi/ipv4-unicast/admin-distance/external + * /frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-bgp:bgp/global/afi-safis/afi-safi/ipv4-unicast/admin-distance */ -int bgp_global_afi_safis_afi_safi_ipv4_unicast_admin_distance_external_modify( - struct nb_cb_modify_args *args) +void bgp_global_afi_safis_afi_safi_ipv4_unicast_admin_distance_apply_finish( + struct nb_cb_apply_finish_args *args) { - switch (args->event) { - case NB_EV_VALIDATE: - case NB_EV_PREPARE: - case NB_EV_ABORT: - case NB_EV_APPLY: - /* TODO: implement me. */ - break; - } - - return NB_OK; + bgp_global_afi_safis_admin_distance_modify(args); } -int bgp_global_afi_safis_afi_safi_ipv4_unicast_admin_distance_external_destroy( - struct nb_cb_destroy_args *args) +/* + * XPath: + * /frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-bgp:bgp/global/afi-safis/afi-safi/ipv4-unicast/admin-distance/external + */ +int bgp_global_afi_safis_afi_safi_ipv4_unicast_admin_distance_external_modify( + struct nb_cb_modify_args *args) { - switch (args->event) { - case NB_EV_VALIDATE: - case NB_EV_PREPARE: - case NB_EV_ABORT: - case NB_EV_APPLY: - /* TODO: implement me. */ - break; - } + /* Handled in admin_distance_apply_finish callback */ return NB_OK; } @@ -6167,38 +6727,28 @@ int bgp_global_afi_safis_afi_safi_ipv4_unicast_admin_distance_external_destroy( int bgp_global_afi_safis_afi_safi_ipv4_unicast_admin_distance_internal_modify( struct nb_cb_modify_args *args) { - switch (args->event) { - case NB_EV_VALIDATE: - case NB_EV_PREPARE: - case NB_EV_ABORT: - case NB_EV_APPLY: - /* TODO: implement me. */ - break; - } + /* Handled in admin_distance_apply_finish callback */ return NB_OK; } -int bgp_global_afi_safis_afi_safi_ipv4_unicast_admin_distance_internal_destroy( - struct nb_cb_destroy_args *args) +/* + * XPath: + * /frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-bgp:bgp/global/afi-safis/afi-safi/ipv4-unicast/admin-distance/local + */ +int bgp_global_afi_safis_afi_safi_ipv4_unicast_admin_distance_local_modify( + struct nb_cb_modify_args *args) { - switch (args->event) { - case NB_EV_VALIDATE: - case NB_EV_PREPARE: - case NB_EV_ABORT: - case NB_EV_APPLY: - /* TODO: implement me. */ - break; - } + /* Handled in admin_distance_apply_finish callback */ return NB_OK; } /* * XPath: - * /frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-bgp:bgp/global/afi-safis/afi-safi/ipv4-unicast/admin-distance/local + * /frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-bgp:bgp/global/afi-safis/afi-safi/ipv4-unicast/filter-config/rmap-export */ -int bgp_global_afi_safis_afi_safi_ipv4_unicast_admin_distance_local_modify( +int bgp_global_afi_safis_afi_safi_ipv4_unicast_filter_config_rmap_export_modify( struct nb_cb_modify_args *args) { switch (args->event) { @@ -6213,7 +6763,7 @@ int bgp_global_afi_safis_afi_safi_ipv4_unicast_admin_distance_local_modify( return NB_OK; } -int bgp_global_afi_safis_afi_safi_ipv4_unicast_admin_distance_local_destroy( +int bgp_global_afi_safis_afi_safi_ipv4_unicast_filter_config_rmap_export_destroy( struct nb_cb_destroy_args *args) { switch (args->event) { @@ -6228,37 +6778,80 @@ int bgp_global_afi_safis_afi_safi_ipv4_unicast_admin_distance_local_destroy( return NB_OK; } -/* - * XPath: - * /frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-bgp:bgp/global/afi-safis/afi-safi/ipv4-unicast/filter-config/rmap-export - */ -int bgp_global_afi_safis_afi_safi_ipv4_unicast_filter_config_rmap_export_modify( +static int bgp_global_afi_safi_ip_unicast_vpn_config_rd_modify( struct nb_cb_modify_args *args) { - switch (args->event) { - case NB_EV_VALIDATE: - case NB_EV_PREPARE: - case NB_EV_ABORT: - case NB_EV_APPLY: - /* TODO: implement me. */ - break; + struct bgp *bgp; + const struct lyd_node *af_dnode; + const char *af_name; + afi_t afi; + safi_t safi; + const char *rd_str = NULL; + struct prefix_rd prd; + + bgp = nb_running_get_entry(args->dnode, NULL, true); + + af_dnode = yang_dnode_get_parent(args->dnode, "afi-safi"); + af_name = yang_dnode_get_string(af_dnode, "./afi-safi-name"); + yang_afi_safi_identity2value(af_name, &afi, &safi); + + rd_str = yang_dnode_get_string(args->dnode, NULL); + if (!str2prefix_rd(rd_str, &prd)) { + snprintf(args->errmsg, args->errmsg_len, "Malformed rd %s\n", + rd_str); + return NB_ERR_INCONSISTENCY; } + /* + * pre-change: un-export vpn routes (vpn->vrf routes unaffected) + */ + vpn_leak_prechange(BGP_VPN_POLICY_DIR_TOVPN, afi, bgp_get_default(), + bgp); + + bgp->vpn_policy[afi].tovpn_rd = prd; + SET_FLAG(bgp->vpn_policy[afi].flags, BGP_VPN_POLICY_TOVPN_RD_SET); + + /* post-change: re-export vpn routes */ + vpn_leak_postchange(BGP_VPN_POLICY_DIR_TOVPN, afi, bgp_get_default(), + bgp); + return NB_OK; } -int bgp_global_afi_safis_afi_safi_ipv4_unicast_filter_config_rmap_export_destroy( +static int bgp_global_afi_safi_ip_unicast_vpn_config_rd_destroy( struct nb_cb_destroy_args *args) { - switch (args->event) { - case NB_EV_VALIDATE: - case NB_EV_PREPARE: - case NB_EV_ABORT: - case NB_EV_APPLY: - /* TODO: implement me. */ - break; + struct bgp *bgp; + const struct lyd_node *af_dnode; + const char *af_name; + afi_t afi; + safi_t safi; + const char *rd_str = NULL; + struct prefix_rd prd; + + af_dnode = yang_dnode_get_parent(args->dnode, "afi-safi"); + af_name = yang_dnode_get_string(af_dnode, "./afi-safi-name"); + yang_afi_safi_identity2value(af_name, &afi, &safi); + bgp = nb_running_get_entry(af_dnode, NULL, true); + + rd_str = yang_dnode_get_string(args->dnode, NULL); + if (str2prefix_rd(rd_str, &prd)) { + snprintf(args->errmsg, args->errmsg_len, "Malformed rd %s \n", + rd_str); + return NB_ERR_INCONSISTENCY; } + /* + * pre-change: un-export vpn routes (vpn->vrf routes unaffected) + */ + vpn_leak_prechange(BGP_VPN_POLICY_DIR_TOVPN, afi, bgp_get_default(), + bgp); + + UNSET_FLAG(bgp->vpn_policy[afi].flags, BGP_VPN_POLICY_TOVPN_RD_SET); + + /* post-change: re-export vpn routes */ + vpn_leak_postchange(BGP_VPN_POLICY_DIR_TOVPN, afi, bgp_get_default(), + bgp); return NB_OK; } @@ -6269,12 +6862,34 @@ int bgp_global_afi_safis_afi_safi_ipv4_unicast_filter_config_rmap_export_destroy int bgp_global_afi_safis_afi_safi_ipv4_unicast_vpn_config_rd_modify( struct nb_cb_modify_args *args) { + struct bgp *bgp; + const struct lyd_node *af_dnode; + const char *af_name; + afi_t afi; + safi_t safi; + switch (args->event) { case NB_EV_VALIDATE: + bgp = nb_running_get_entry(args->dnode, NULL, false); + if (!bgp) + return NB_OK; + + af_dnode = yang_dnode_get_parent(args->dnode, "afi-safi"); + af_name = yang_dnode_get_string(af_dnode, "./afi-safi-name"); + yang_afi_safi_identity2value(af_name, &afi, &safi); + + if (!vpn_policy_check_import(bgp, afi, safi, false, + args->errmsg, args->errmsg_len)) + return NB_ERR_VALIDATION; + break; case NB_EV_PREPARE: case NB_EV_ABORT: + return NB_OK; case NB_EV_APPLY: - /* TODO: implement me. */ + + return bgp_global_afi_safi_ip_unicast_vpn_config_rd_modify( + args); + break; } @@ -6288,9 +6903,10 @@ int bgp_global_afi_safis_afi_safi_ipv4_unicast_vpn_config_rd_destroy( case NB_EV_VALIDATE: case NB_EV_PREPARE: case NB_EV_ABORT: + return NB_OK; case NB_EV_APPLY: - /* TODO: implement me. */ - break; + return bgp_global_afi_safi_ip_unicast_vpn_config_rd_destroy( + args); } return NB_OK; @@ -6364,6 +6980,69 @@ int bgp_global_afi_safis_afi_safi_ipv4_unicast_vpn_config_label_auto_destroy( return NB_OK; } +static int bgp_global_afi_safi_ip_unicast_vpn_config_nexthop_modify( + struct nb_cb_modify_args *args) +{ + struct bgp *bgp; + const struct lyd_node *af_dnode; + const char *af_name; + afi_t afi; + safi_t safi; + struct prefix p; + + af_dnode = yang_dnode_get_parent(args->dnode, "afi-safi"); + af_name = yang_dnode_get_string(af_dnode, "./afi-safi-name"); + yang_afi_safi_identity2value(af_name, &afi, &safi); + bgp = nb_running_get_entry(af_dnode, NULL, true); + + yang_dnode_get_prefix(&p, args->dnode, NULL); + + /* + * pre-change: un-export vpn routes (vpn->vrf routes unaffected) + */ + vpn_leak_prechange(BGP_VPN_POLICY_DIR_TOVPN, afi, bgp_get_default(), + bgp); + + bgp->vpn_policy[afi].tovpn_nexthop = p; + SET_FLAG(bgp->vpn_policy[afi].flags, BGP_VPN_POLICY_TOVPN_NEXTHOP_SET); + + /* post-change: re-export vpn routes */ + vpn_leak_postchange(BGP_VPN_POLICY_DIR_TOVPN, afi, bgp_get_default(), + bgp); + + return NB_OK; +} + +static int bgp_global_afi_safi_ip_unicast_vpn_config_nexthop_destroy( + struct nb_cb_destroy_args *args) +{ + struct bgp *bgp; + const struct lyd_node *af_dnode; + const char *af_name; + afi_t afi; + safi_t safi; + struct prefix p; + + af_dnode = yang_dnode_get_parent(args->dnode, "afi-safi"); + af_name = yang_dnode_get_string(af_dnode, "./afi-safi-name"); + yang_afi_safi_identity2value(af_name, &afi, &safi); + bgp = nb_running_get_entry(af_dnode, NULL, true); + + yang_dnode_get_prefix(&p, args->dnode, NULL); + + /* + * pre-change: un-export vpn routes (vpn->vrf routes unaffected) + */ + vpn_leak_prechange(BGP_VPN_POLICY_DIR_TOVPN, afi, bgp_get_default(), + bgp); + UNSET_FLAG(bgp->vpn_policy[afi].flags, + BGP_VPN_POLICY_TOVPN_NEXTHOP_SET); + /* post-change: re-export vpn routes */ + vpn_leak_postchange(BGP_VPN_POLICY_DIR_TOVPN, afi, bgp_get_default(), + bgp); + return NB_OK; +} + /* * XPath: * /frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-bgp:bgp/global/afi-safis/afi-safi/ipv4-unicast/vpn-config/nexthop @@ -6371,13 +7050,32 @@ int bgp_global_afi_safis_afi_safi_ipv4_unicast_vpn_config_label_auto_destroy( int bgp_global_afi_safis_afi_safi_ipv4_unicast_vpn_config_nexthop_modify( struct nb_cb_modify_args *args) { + struct bgp *bgp; + const struct lyd_node *af_dnode; + const char *af_name; + afi_t afi; + safi_t safi; + switch (args->event) { case NB_EV_VALIDATE: + bgp = nb_running_get_entry(args->dnode, NULL, false); + if (!bgp) + return NB_OK; + af_dnode = yang_dnode_get_parent(args->dnode, "afi-safi"); + af_name = yang_dnode_get_string(af_dnode, "./afi-safi-name"); + yang_afi_safi_identity2value(af_name, &afi, &safi); + + if (!vpn_policy_check_import(bgp, afi, safi, false, + args->errmsg, args->errmsg_len)) + return NB_ERR_VALIDATION; + + break; case NB_EV_PREPARE: case NB_EV_ABORT: + return NB_OK; case NB_EV_APPLY: - /* TODO: implement me. */ - break; + return bgp_global_afi_safi_ip_unicast_vpn_config_nexthop_modify( + args); } return NB_OK; @@ -6390,9 +7088,59 @@ int bgp_global_afi_safis_afi_safi_ipv4_unicast_vpn_config_nexthop_destroy( case NB_EV_VALIDATE: case NB_EV_PREPARE: case NB_EV_ABORT: + return NB_OK; case NB_EV_APPLY: - /* TODO: implement me. */ - break; + return bgp_global_afi_safi_ip_unicast_vpn_config_nexthop_destroy( + args); + } + + return NB_OK; +} + +static int bgp_global_afi_safi_ip_unicast_vpn_config_import_export_vpn_modify( + struct nb_cb_modify_args *args, const char *direction_str, + bool is_enable) +{ + struct bgp *bgp; + const struct lyd_node *af_dnode; + const char *af_name; + afi_t afi; + safi_t safi; + int previous_state; + int flag; + vpn_policy_direction_t dir; + + af_dnode = yang_dnode_get_parent(args->dnode, "afi-safi"); + af_name = yang_dnode_get_string(af_dnode, "./afi-safi-name"); + yang_afi_safi_identity2value(af_name, &afi, &safi); + bgp = nb_running_get_entry(af_dnode, NULL, true); + + if (!strcmp(direction_str, "import")) { + flag = BGP_CONFIG_MPLSVPN_TO_VRF_IMPORT; + dir = BGP_VPN_POLICY_DIR_FROMVPN; + } else if (!strcmp(direction_str, "export")) { + flag = BGP_CONFIG_VRF_TO_MPLSVPN_EXPORT; + dir = BGP_VPN_POLICY_DIR_TOVPN; + } else { + snprintf(args->errmsg, args->errmsg_len, + "unknown direction %s\n", direction_str); + return NB_ERR_INCONSISTENCY; + } + + previous_state = CHECK_FLAG(bgp->af_flags[afi][safi], flag); + + if (is_enable) { + SET_FLAG(bgp->af_flags[afi][safi], flag); + if (!previous_state) { + /* trigger export current vrf */ + vpn_leak_postchange(dir, afi, bgp_get_default(), bgp); + } + } else { + if (previous_state) { + /* trigger un-export current vrf */ + vpn_leak_prechange(dir, afi, bgp_get_default(), bgp); + } + UNSET_FLAG(bgp->af_flags[afi][safi], flag); } return NB_OK; @@ -6405,13 +7153,33 @@ int bgp_global_afi_safis_afi_safi_ipv4_unicast_vpn_config_nexthop_destroy( int bgp_global_afi_safis_afi_safi_ipv4_unicast_vpn_config_import_vpn_modify( struct nb_cb_modify_args *args) { + bool is_enable = false; + struct bgp *bgp; + switch (args->event) { case NB_EV_VALIDATE: + bgp = nb_running_get_entry(args->dnode, NULL, false); + if (!bgp) + return NB_OK; + + if (BGP_INSTANCE_TYPE_VRF != bgp->inst_type + && BGP_INSTANCE_TYPE_DEFAULT != bgp->inst_type) { + snprintf( + args->errmsg, args->errmsg_len, + "import|export vpn valid only for bgp vrf or default instance"); + return NB_ERR_VALIDATION; + } + + break; case NB_EV_PREPARE: case NB_EV_ABORT: + return NB_OK; case NB_EV_APPLY: - /* TODO: implement me. */ - break; + if (yang_dnode_get_bool(args->dnode, NULL)) + is_enable = true; + + return bgp_global_afi_safi_ip_unicast_vpn_config_import_export_vpn_modify( + args, "import", is_enable); } return NB_OK; @@ -6424,18 +7192,184 @@ int bgp_global_afi_safis_afi_safi_ipv4_unicast_vpn_config_import_vpn_modify( int bgp_global_afi_safis_afi_safi_ipv4_unicast_vpn_config_export_vpn_modify( struct nb_cb_modify_args *args) { + bool is_enable = false; + struct bgp *bgp; + switch (args->event) { case NB_EV_VALIDATE: + bgp = nb_running_get_entry(args->dnode, NULL, false); + if (!bgp) + return NB_OK; + + if (BGP_INSTANCE_TYPE_VRF != bgp->inst_type + && BGP_INSTANCE_TYPE_DEFAULT != bgp->inst_type) { + snprintf( + args->errmsg, args->errmsg_len, + "import|export vpn valid only for bgp vrf or default instance"); + return NB_ERR_VALIDATION; + } + break; case NB_EV_PREPARE: case NB_EV_ABORT: + return NB_OK; case NB_EV_APPLY: - /* TODO: implement me. */ - break; + if (yang_dnode_get_bool(args->dnode, NULL)) + is_enable = true; + + return bgp_global_afi_safi_ip_unicast_vpn_config_import_export_vpn_modify( + args, "export", is_enable); } return NB_OK; } + +static int bgp_global_afi_safi_ip_unicast_vpn_config_import_vrfs_create( + struct nb_cb_create_args *args) +{ + struct bgp *bgp; + const struct lyd_node *af_dnode; + const char *af_name; + afi_t afi; + safi_t safi; + int ret = 0; + as_t as; + struct bgp *vrf_bgp, *bgp_default; + const char *import_name; + char *vname; + enum bgp_instance_type bgp_type = BGP_INSTANCE_TYPE_VRF; + struct listnode *node; + + af_dnode = yang_dnode_get_parent(args->dnode, "afi-safi"); + af_name = yang_dnode_get_string(af_dnode, "./afi-safi-name"); + yang_afi_safi_identity2value(af_name, &afi, &safi); + bgp = nb_running_get_entry(af_dnode, NULL, true); + + as = bgp->as; + import_name = yang_dnode_get_string(args->dnode, "./vrf"); + + if (((BGP_INSTANCE_TYPE_DEFAULT == bgp->inst_type) + && (strcmp(import_name, VRF_DEFAULT_NAME) == 0)) + || (bgp->name && (strcmp(import_name, bgp->name) == 0))) { + snprintf(args->errmsg, args->errmsg_len, + "Cannot %s vrf %s into itself\n", "import", + import_name); + return NB_ERR_INCONSISTENCY; + } + + bgp_default = bgp_get_default(); + if (!bgp_default) { + /* Auto-create assuming the same AS */ + ret = bgp_get_vty(&bgp_default, &as, NULL, + BGP_INSTANCE_TYPE_DEFAULT); + + if (ret) { + snprintf( + args->errmsg, args->errmsg_len, + "VRF default is not configured as a bgp instance"); + return NB_ERR_INCONSISTENCY; + } + } + + vrf_bgp = bgp_lookup_by_name(import_name); + if (!vrf_bgp) { + if (strcmp(import_name, VRF_DEFAULT_NAME) == 0) + vrf_bgp = bgp_default; + else + /* Auto-create assuming the same AS */ + ret = bgp_get_vty(&vrf_bgp, &as, import_name, bgp_type); + + if (ret) { + snprintf(args->errmsg, args->errmsg_len, + "VRF %s is not configured as a bgp instance\n", + import_name); + return NB_ERR_INCONSISTENCY; + } + } + + /* Already importing from "import_vrf"? */ + for (ALL_LIST_ELEMENTS_RO(bgp->vpn_policy[afi].import_vrf, node, + vname)) { + if (strcmp(vname, import_name) == 0) { + snprintf(args->errmsg, args->errmsg_len, + "already importing from vrf %s", import_name); + return NB_ERR_INCONSISTENCY; + } + } + + vrf_import_from_vrf(bgp, vrf_bgp, afi, safi); + + return NB_OK; +} + + +static int bgp_global_afi_safi_ip_unicast_vpn_config_import_vrf_list_destroy( + struct nb_cb_destroy_args *args) +{ + struct bgp *bgp; + const struct lyd_node *af_dnode; + const char *af_name; + afi_t afi; + safi_t safi; + int ret = 0; + as_t as; + struct bgp *vrf_bgp, *bgp_default; + const char *import_name; + enum bgp_instance_type bgp_type = BGP_INSTANCE_TYPE_VRF; + + af_dnode = yang_dnode_get_parent(args->dnode, "afi-safi"); + af_name = yang_dnode_get_string(af_dnode, "./afi-safi-name"); + yang_afi_safi_identity2value(af_name, &afi, &safi); + bgp = nb_running_get_entry(af_dnode, NULL, true); + + as = bgp->as; + import_name = yang_dnode_get_string(args->dnode, "./vrf"); + + if (((BGP_INSTANCE_TYPE_DEFAULT == bgp->inst_type) + && (strcmp(import_name, VRF_DEFAULT_NAME) == 0)) + || (bgp->name && (strcmp(import_name, bgp->name) == 0))) { + snprintf(args->errmsg, args->errmsg_len, + "Cannot %s vrf %s into itself\n", "unimport", + import_name); + return NB_ERR_INCONSISTENCY; + } + + bgp_default = bgp_get_default(); + if (!bgp_default) { + /* Auto-create assuming the same AS */ + ret = bgp_get_vty(&bgp_default, &as, NULL, + BGP_INSTANCE_TYPE_DEFAULT); + + if (ret) { + snprintf( + args->errmsg, args->errmsg_len, "%s", + "VRF default is not configured as a bgp instance"); + return NB_ERR_INCONSISTENCY; + } + } + + vrf_bgp = bgp_lookup_by_name(import_name); + if (!vrf_bgp) { + if (strcmp(import_name, VRF_DEFAULT_NAME) == 0) + vrf_bgp = bgp_default; + else + /* Auto-create assuming the same AS */ + ret = bgp_get_vty(&vrf_bgp, &as, import_name, bgp_type); + + if (ret) { + snprintf(args->errmsg, args->errmsg_len, + "VRF %s is not configured as a bgp instance\n", + import_name); + return NB_ERR_INCONSISTENCY; + } + } + + vrf_unimport_from_vrf(bgp, vrf_bgp, afi, safi); + + return NB_OK; +} + + /* * XPath: * /frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-bgp:bgp/global/afi-safis/afi-safi/ipv4-unicast/vpn-config/import-vrf-list @@ -6443,13 +7377,32 @@ int bgp_global_afi_safis_afi_safi_ipv4_unicast_vpn_config_export_vpn_modify( int bgp_global_afi_safis_afi_safi_ipv4_unicast_vpn_config_import_vrf_list_create( struct nb_cb_create_args *args) { + struct bgp *bgp; + const struct lyd_node *af_dnode; + const char *af_name; + afi_t afi; + safi_t safi; + switch (args->event) { case NB_EV_VALIDATE: + bgp = nb_running_get_entry(args->dnode, NULL, false); + if (!bgp) + return NB_OK; + af_dnode = yang_dnode_get_parent(args->dnode, "afi-safi"); + af_name = yang_dnode_get_string(af_dnode, "./afi-safi-name"); + yang_afi_safi_identity2value(af_name, &afi, &safi); + + if (!vpn_policy_check_import(bgp, afi, safi, true, args->errmsg, + args->errmsg_len)) + return NB_ERR_VALIDATION; + + break; case NB_EV_PREPARE: case NB_EV_ABORT: + return NB_OK; case NB_EV_APPLY: - /* TODO: implement me. */ - break; + return bgp_global_afi_safi_ip_unicast_vpn_config_import_vrfs_create( + args); } return NB_OK; @@ -6462,9 +7415,104 @@ int bgp_global_afi_safis_afi_safi_ipv4_unicast_vpn_config_import_vrf_list_destro case NB_EV_VALIDATE: case NB_EV_PREPARE: case NB_EV_ABORT: + return NB_OK; case NB_EV_APPLY: - /* TODO: implement me. */ - break; + return bgp_global_afi_safi_ip_unicast_vpn_config_import_vrf_list_destroy( + args); + } + + return NB_OK; +} + +static int bgp_global_afi_safi_ip_unicast_vpn_config_rmap_import_modify( + struct nb_cb_modify_args *args, const char *dstr) +{ + struct bgp *bgp; + const struct lyd_node *af_dnode; + const char *af_name; + afi_t afi; + safi_t safi; + const char *rmap_str = NULL; + int dodir[BGP_VPN_POLICY_DIR_MAX] = {0}; + vpn_policy_direction_t dir; + + af_dnode = yang_dnode_get_parent(args->dnode, "afi-safi"); + af_name = yang_dnode_get_string(af_dnode, "./afi-safi-name"); + yang_afi_safi_identity2value(af_name, &afi, &safi); + bgp = nb_running_get_entry(af_dnode, NULL, true); + + if (!strcmp(dstr, "import")) { + rmap_str = yang_dnode_get_string(args->dnode, NULL); + dodir[BGP_VPN_POLICY_DIR_FROMVPN] = 1; + } else if (!strcmp(dstr, "export")) { + rmap_str = yang_dnode_get_string(args->dnode, NULL); + dodir[BGP_VPN_POLICY_DIR_TOVPN] = 1; + } else if (!strcmp(dstr, "both")) { + dodir[BGP_VPN_POLICY_DIR_FROMVPN] = 1; + dodir[BGP_VPN_POLICY_DIR_TOVPN] = 1; + } + + for (dir = 0; dir < BGP_VPN_POLICY_DIR_MAX; ++dir) { + if (!dodir[dir]) + continue; + + vpn_leak_prechange(dir, afi, bgp_get_default(), bgp); + + if (bgp->vpn_policy[afi].rmap_name[dir]) + XFREE(MTYPE_ROUTE_MAP_NAME, + bgp->vpn_policy[afi].rmap_name[dir]); + bgp->vpn_policy[afi].rmap_name[dir] = + XSTRDUP(MTYPE_ROUTE_MAP_NAME, rmap_str); + bgp->vpn_policy[afi].rmap[dir] = + route_map_lookup_by_name(rmap_str); + if (!bgp->vpn_policy[afi].rmap[dir]) + return NB_OK; + + + vpn_leak_postchange(dir, afi, bgp_get_default(), bgp); + } + + return NB_OK; +} + +static int bgp_global_afi_safi_ip_unicast_vpn_config_rmap_import_destroy( + struct nb_cb_destroy_args *args, const char *dstr) +{ + struct bgp *bgp; + const struct lyd_node *af_dnode; + const char *af_name; + afi_t afi; + safi_t safi; + int dodir[BGP_VPN_POLICY_DIR_MAX] = {0}; + vpn_policy_direction_t dir; + + af_dnode = yang_dnode_get_parent(args->dnode, "afi-safi"); + af_name = yang_dnode_get_string(af_dnode, "./afi-safi-name"); + yang_afi_safi_identity2value(af_name, &afi, &safi); + bgp = nb_running_get_entry(af_dnode, NULL, true); + + if (!strcmp(dstr, "import")) { + dodir[BGP_VPN_POLICY_DIR_FROMVPN] = 1; + } else if (!strcmp(dstr, "export")) { + dodir[BGP_VPN_POLICY_DIR_TOVPN] = 1; + } else if (!strcmp(dstr, "both")) { + dodir[BGP_VPN_POLICY_DIR_FROMVPN] = 1; + dodir[BGP_VPN_POLICY_DIR_TOVPN] = 1; + } + + for (dir = 0; dir < BGP_VPN_POLICY_DIR_MAX; ++dir) { + if (!dodir[dir]) + continue; + + vpn_leak_prechange(dir, afi, bgp_get_default(), bgp); + + if (bgp->vpn_policy[afi].rmap_name[dir]) + XFREE(MTYPE_ROUTE_MAP_NAME, + bgp->vpn_policy[afi].rmap_name[dir]); + bgp->vpn_policy[afi].rmap_name[dir] = NULL; + bgp->vpn_policy[afi].rmap[dir] = NULL; + + vpn_leak_postchange(dir, afi, bgp_get_default(), bgp); } return NB_OK; @@ -6477,13 +7525,31 @@ int bgp_global_afi_safis_afi_safi_ipv4_unicast_vpn_config_import_vrf_list_destro int bgp_global_afi_safis_afi_safi_ipv4_unicast_vpn_config_rmap_import_modify( struct nb_cb_modify_args *args) { + struct bgp *bgp; + const struct lyd_node *af_dnode; + const char *af_name; + afi_t afi; + safi_t safi; + switch (args->event) { case NB_EV_VALIDATE: + bgp = nb_running_get_entry(args->dnode, NULL, false); + if (!bgp) + return NB_OK; + af_dnode = yang_dnode_get_parent(args->dnode, "afi-safi"); + af_name = yang_dnode_get_string(af_dnode, "./afi-safi-name"); + yang_afi_safi_identity2value(af_name, &afi, &safi); + + if (!vpn_policy_check_import(bgp, afi, safi, false, + args->errmsg, args->errmsg_len)) + return NB_ERR_VALIDATION; + break; case NB_EV_PREPARE: case NB_EV_ABORT: + return NB_OK; case NB_EV_APPLY: - /* TODO: implement me. */ - break; + return bgp_global_afi_safi_ip_unicast_vpn_config_rmap_import_modify( + args, "import"); } return NB_OK; @@ -6492,13 +7558,31 @@ int bgp_global_afi_safis_afi_safi_ipv4_unicast_vpn_config_rmap_import_modify( int bgp_global_afi_safis_afi_safi_ipv4_unicast_vpn_config_rmap_import_destroy( struct nb_cb_destroy_args *args) { + struct bgp *bgp; + const struct lyd_node *af_dnode; + const char *af_name; + afi_t afi; + safi_t safi; + switch (args->event) { case NB_EV_VALIDATE: + bgp = nb_running_get_entry(args->dnode, NULL, false); + if (!bgp) + return NB_OK; + af_dnode = yang_dnode_get_parent(args->dnode, "afi-safi"); + af_name = yang_dnode_get_string(af_dnode, "./afi-safi-name"); + yang_afi_safi_identity2value(af_name, &afi, &safi); + + if (!vpn_policy_check_import(bgp, afi, safi, false, + args->errmsg, args->errmsg_len)) + return NB_ERR_VALIDATION; + break; case NB_EV_PREPARE: case NB_EV_ABORT: + return NB_OK; case NB_EV_APPLY: - /* TODO: implement me. */ - break; + return bgp_global_afi_safi_ip_unicast_vpn_config_rmap_import_destroy( + args, "import"); } return NB_OK; @@ -6515,9 +7599,10 @@ int bgp_global_afi_safis_afi_safi_ipv4_unicast_vpn_config_rmap_export_modify( case NB_EV_VALIDATE: case NB_EV_PREPARE: case NB_EV_ABORT: + return NB_OK; case NB_EV_APPLY: - /* TODO: implement me. */ - break; + return bgp_global_afi_safi_ip_unicast_vpn_config_rmap_import_modify( + args, "export"); } return NB_OK; @@ -6530,8 +7615,10 @@ int bgp_global_afi_safis_afi_safi_ipv4_unicast_vpn_config_rmap_export_destroy( case NB_EV_VALIDATE: case NB_EV_PREPARE: case NB_EV_ABORT: + return NB_OK; case NB_EV_APPLY: - /* TODO: implement me. */ + return bgp_global_afi_safi_ip_unicast_vpn_config_rmap_import_destroy( + args, "export"); break; } @@ -6681,19 +7768,53 @@ int bgp_global_afi_safis_afi_safi_ipv4_unicast_vpn_config_rt_list_destroy( int bgp_global_afi_safis_afi_safi_ipv6_unicast_network_config_create( struct nb_cb_create_args *args) { + /* Handled in network_config_apply_finish callback */ + + return NB_OK; +} + +int bgp_global_afi_safis_afi_safi_ipv6_unicast_network_config_destroy( + struct nb_cb_destroy_args *args) +{ switch (args->event) { case NB_EV_VALIDATE: case NB_EV_PREPARE: case NB_EV_ABORT: + return NB_OK; case NB_EV_APPLY: - /* TODO: implement me. */ + return bgp_global_afi_safis_afi_safi_network_config_destroy( + args); break; } return NB_OK; } -int bgp_global_afi_safis_afi_safi_ipv6_unicast_network_config_destroy( +/* + * XPath: + * /frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-bgp:bgp/global/afi-safis/afi-safi/ipv6-unicast/network-config/backdoor + */ +int bgp_global_afi_safis_afi_safi_ipv6_unicast_network_config_backdoor_modify( + struct nb_cb_modify_args *args) +{ + /* Handled in unicast_network_config_apply_finish callback */ + + return NB_OK; +} + +/* + * XPath: + * /frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-bgp:bgp/global/afi-safis/afi-safi/ipv6-unicast/network-config/label-index + */ +int bgp_global_afi_safis_afi_safi_ipv6_unicast_network_config_label_index_modify( + struct nb_cb_modify_args *args) +{ + /* Handled in unicast_network_config_apply_finish callback */ + + return NB_OK; +} + +int bgp_global_afi_safis_afi_safi_ipv6_unicast_network_config_label_index_destroy( struct nb_cb_destroy_args *args) { switch (args->event) { @@ -6710,11 +7831,19 @@ int bgp_global_afi_safis_afi_safi_ipv6_unicast_network_config_destroy( /* * XPath: - * /frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-bgp:bgp/global/afi-safis/afi-safi/ipv6-unicast/network-config/backdoor + * /frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-bgp:bgp/global/afi-safis/afi-safi/ipv6-unicast/network-config/rmap-policy-export */ -int bgp_global_afi_safis_afi_safi_ipv6_unicast_network_config_backdoor_modify( +int bgp_global_afi_safis_afi_safi_ipv6_unicast_network_config_rmap_policy_export_modify( struct nb_cb_modify_args *args) { + /* Handled in unicast_network_config_apply_finish callback */ + + return NB_OK; +} + +int bgp_global_afi_safis_afi_safi_ipv6_unicast_network_config_rmap_policy_export_destroy( + struct nb_cb_destroy_args *args) +{ switch (args->event) { case NB_EV_VALIDATE: case NB_EV_PREPARE: @@ -6729,10 +7858,10 @@ int bgp_global_afi_safis_afi_safi_ipv6_unicast_network_config_backdoor_modify( /* * XPath: - * /frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-bgp:bgp/global/afi-safis/afi-safi/ipv6-unicast/network-config/label-index + * /frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-bgp:bgp/global/afi-safis/afi-safi/ipv6-unicast/aggregate-route */ -int bgp_global_afi_safis_afi_safi_ipv6_unicast_network_config_label_index_modify( - struct nb_cb_modify_args *args) +int bgp_global_afi_safis_afi_safi_ipv6_unicast_aggregate_route_create( + struct nb_cb_create_args *args) { switch (args->event) { case NB_EV_VALIDATE: @@ -6746,16 +7875,16 @@ int bgp_global_afi_safis_afi_safi_ipv6_unicast_network_config_label_index_modify return NB_OK; } -int bgp_global_afi_safis_afi_safi_ipv6_unicast_network_config_label_index_destroy( +int bgp_global_afi_safis_afi_safi_ipv6_unicast_aggregate_route_destroy( struct nb_cb_destroy_args *args) { switch (args->event) { case NB_EV_VALIDATE: case NB_EV_PREPARE: case NB_EV_ABORT: + return NB_OK; case NB_EV_APPLY: - /* TODO: implement me. */ - break; + return bgp_global_afi_safi_aggregate_route_destroy(args); } return NB_OK; @@ -6763,9 +7892,9 @@ int bgp_global_afi_safis_afi_safi_ipv6_unicast_network_config_label_index_destro /* * XPath: - * /frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-bgp:bgp/global/afi-safis/afi-safi/ipv6-unicast/network-config/rmap-policy-export + * /frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-bgp:bgp/global/afi-safis/afi-safi/ipv6-unicast/aggregate-route/as-set */ -int bgp_global_afi_safis_afi_safi_ipv6_unicast_network_config_rmap_policy_export_modify( +int bgp_global_afi_safis_afi_safi_ipv6_unicast_aggregate_route_as_set_modify( struct nb_cb_modify_args *args) { switch (args->event) { @@ -6780,8 +7909,12 @@ int bgp_global_afi_safis_afi_safi_ipv6_unicast_network_config_rmap_policy_export return NB_OK; } -int bgp_global_afi_safis_afi_safi_ipv6_unicast_network_config_rmap_policy_export_destroy( - struct nb_cb_destroy_args *args) +/* + * XPath: + * /frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-bgp:bgp/global/afi-safis/afi-safi/ipv6-unicast/aggregate-route/summary-only + */ +int bgp_global_afi_safis_afi_safi_ipv6_unicast_aggregate_route_summary_only_modify( + struct nb_cb_modify_args *args) { switch (args->event) { case NB_EV_VALIDATE: @@ -6797,10 +7930,10 @@ int bgp_global_afi_safis_afi_safi_ipv6_unicast_network_config_rmap_policy_export /* * XPath: - * /frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-bgp:bgp/global/afi-safis/afi-safi/ipv6-unicast/aggregate-route + * /frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-bgp:bgp/global/afi-safis/afi-safi/ipv6-unicast/aggregate-route/rmap-policy-export */ -int bgp_global_afi_safis_afi_safi_ipv6_unicast_aggregate_route_create( - struct nb_cb_create_args *args) +int bgp_global_afi_safis_afi_safi_ipv6_unicast_aggregate_route_rmap_policy_export_modify( + struct nb_cb_modify_args *args) { switch (args->event) { case NB_EV_VALIDATE: @@ -6814,7 +7947,7 @@ int bgp_global_afi_safis_afi_safi_ipv6_unicast_aggregate_route_create( return NB_OK; } -int bgp_global_afi_safis_afi_safi_ipv6_unicast_aggregate_route_destroy( +int bgp_global_afi_safis_afi_safi_ipv6_unicast_aggregate_route_rmap_policy_export_destroy( struct nb_cb_destroy_args *args) { switch (args->event) { @@ -6831,9 +7964,9 @@ int bgp_global_afi_safis_afi_safi_ipv6_unicast_aggregate_route_destroy( /* * XPath: - * /frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-bgp:bgp/global/afi-safis/afi-safi/ipv6-unicast/aggregate-route/as-set + * /frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-bgp:bgp/global/afi-safis/afi-safi/ipv6-unicast/aggregate-route/origin */ -int bgp_global_afi_safis_afi_safi_ipv6_unicast_aggregate_route_as_set_modify( +int bgp_global_afi_safis_afi_safi_ipv6_unicast_aggregate_route_origin_modify( struct nb_cb_modify_args *args) { switch (args->event) { @@ -6850,9 +7983,9 @@ int bgp_global_afi_safis_afi_safi_ipv6_unicast_aggregate_route_as_set_modify( /* * XPath: - * /frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-bgp:bgp/global/afi-safis/afi-safi/ipv6-unicast/aggregate-route/summary-only + * /frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-bgp:bgp/global/afi-safis/afi-safi/ipv6-unicast/aggregate-route/match-med */ -int bgp_global_afi_safis_afi_safi_ipv6_unicast_aggregate_route_summary_only_modify( +int bgp_global_afi_safis_afi_safi_ipv6_unicast_aggregate_route_match_med_modify( struct nb_cb_modify_args *args) { switch (args->event) { @@ -6869,9 +8002,9 @@ int bgp_global_afi_safis_afi_safi_ipv6_unicast_aggregate_route_summary_only_modi /* * XPath: - * /frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-bgp:bgp/global/afi-safis/afi-safi/ipv6-unicast/aggregate-route/rmap-policy-export + * /frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-bgp:bgp/global/afi-safis/afi-safi/ipv6-unicast/aggregate-route/suppress-map */ -int bgp_global_afi_safis_afi_safi_ipv6_unicast_aggregate_route_rmap_policy_export_modify( +int bgp_global_afi_safis_afi_safi_ipv6_unicast_aggregate_route_suppress_map_modify( struct nb_cb_modify_args *args) { switch (args->event) { @@ -6886,7 +8019,7 @@ int bgp_global_afi_safis_afi_safi_ipv6_unicast_aggregate_route_rmap_policy_expor return NB_OK; } -int bgp_global_afi_safis_afi_safi_ipv6_unicast_aggregate_route_rmap_policy_export_destroy( +int bgp_global_afi_safis_afi_safi_ipv6_unicast_aggregate_route_suppress_map_destroy( struct nb_cb_destroy_args *args) { switch (args->event) { @@ -6927,9 +8060,9 @@ int bgp_global_afi_safis_afi_safi_ipv6_unicast_admin_distance_route_destroy( case NB_EV_VALIDATE: case NB_EV_PREPARE: case NB_EV_ABORT: + return NB_OK; case NB_EV_APPLY: - /* TODO: implement me. */ - break; + return bgp_global_afi_safi_admin_distance_route_destroy(args); } return NB_OK; @@ -6990,17 +8123,17 @@ int bgp_global_afi_safis_afi_safi_ipv6_unicast_admin_distance_route_access_list_ /* * XPath: - * /frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-bgp:bgp/global/afi-safis/afi-safi/ipv6-unicast/use-multiple-paths/ebgp/maximum-paths + * /frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-bgp:bgp/global/afi-safis/afi-safi/ipv6-unicast/route-flap-dampening/enable */ -int bgp_global_afi_safis_afi_safi_ipv6_unicast_use_multiple_paths_ebgp_maximum_paths_modify( +int bgp_global_afi_safis_afi_safi_ipv6_unicast_route_flap_dampening_enable_modify( struct nb_cb_modify_args *args) { switch (args->event) { case NB_EV_VALIDATE: + return bgp_global_afi_safi_route_flap_validation(args); case NB_EV_PREPARE: case NB_EV_ABORT: case NB_EV_APPLY: - /* TODO: implement me. */ break; } @@ -7009,9 +8142,9 @@ int bgp_global_afi_safis_afi_safi_ipv6_unicast_use_multiple_paths_ebgp_maximum_p /* * XPath: - * /frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-bgp:bgp/global/afi-safis/afi-safi/ipv6-unicast/use-multiple-paths/ibgp/maximum-paths + * /frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-bgp:bgp/global/afi-safis/afi-safi/ipv6-unicast/route-flap-dampening/reach-decay */ -int bgp_global_afi_safis_afi_safi_ipv6_unicast_use_multiple_paths_ibgp_maximum_paths_modify( +int bgp_global_afi_safis_afi_safi_ipv6_unicast_route_flap_dampening_reach_decay_modify( struct nb_cb_modify_args *args) { switch (args->event) { @@ -7026,15 +8159,44 @@ int bgp_global_afi_safis_afi_safi_ipv6_unicast_use_multiple_paths_ibgp_maximum_p return NB_OK; } +int bgp_global_afi_safis_afi_safi_ipv6_unicast_route_flap_dampening_reach_decay_destroy( + struct nb_cb_destroy_args *args) +{ + switch (args->event) { + case NB_EV_VALIDATE: + case NB_EV_PREPARE: + case NB_EV_ABORT: + case NB_EV_APPLY: + /* TODO: implement me. */ + break; + } + + return NB_OK; +} + /* * XPath: - * /frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-bgp:bgp/global/afi-safis/afi-safi/ipv6-unicast/use-multiple-paths/ibgp/cluster-length-list + * /frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-bgp:bgp/global/afi-safis/afi-safi/ipv6-unicast/route-flap-dampening/reuse-above */ -int bgp_global_afi_safis_afi_safi_ipv6_unicast_use_multiple_paths_ibgp_cluster_length_list_modify( +int bgp_global_afi_safis_afi_safi_ipv6_unicast_route_flap_dampening_reuse_above_modify( struct nb_cb_modify_args *args) { + int reuse = DEFAULT_REUSE; + int suppress = DEFAULT_SUPPRESS; + switch (args->event) { case NB_EV_VALIDATE: + if (yang_dnode_exists(args->dnode, "../suppress-above")) + suppress = yang_dnode_get_uint16(args->dnode, + "../suppress-above"); + reuse = yang_dnode_get_uint16(args->dnode, "../reuse-above"); + if (suppress < reuse) { + snprintf( + args->errmsg, args->errmsg_len, + "Suppress value cannot be less than reuse value \n"); + return NB_ERR_VALIDATION; + } + break; case NB_EV_PREPARE: case NB_EV_ABORT: case NB_EV_APPLY: @@ -7045,7 +8207,7 @@ int bgp_global_afi_safis_afi_safi_ipv6_unicast_use_multiple_paths_ibgp_cluster_l return NB_OK; } -int bgp_global_afi_safis_afi_safi_ipv6_unicast_use_multiple_paths_ibgp_cluster_length_list_destroy( +int bgp_global_afi_safis_afi_safi_ipv6_unicast_route_flap_dampening_reuse_above_destroy( struct nb_cb_destroy_args *args) { switch (args->event) { @@ -7062,10 +8224,10 @@ int bgp_global_afi_safis_afi_safi_ipv6_unicast_use_multiple_paths_ibgp_cluster_l /* * XPath: - * /frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-bgp:bgp/global/afi-safis/afi-safi/ipv6-unicast/redistribution-list + * /frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-bgp:bgp/global/afi-safis/afi-safi/ipv6-unicast/route-flap-dampening/suppress-above */ -int bgp_global_afi_safis_afi_safi_ipv6_unicast_redistribution_list_create( - struct nb_cb_create_args *args) +int bgp_global_afi_safis_afi_safi_ipv6_unicast_route_flap_dampening_suppress_above_modify( + struct nb_cb_modify_args *args) { switch (args->event) { case NB_EV_VALIDATE: @@ -7079,7 +8241,7 @@ int bgp_global_afi_safis_afi_safi_ipv6_unicast_redistribution_list_create( return NB_OK; } -int bgp_global_afi_safis_afi_safi_ipv6_unicast_redistribution_list_destroy( +int bgp_global_afi_safis_afi_safi_ipv6_unicast_route_flap_dampening_suppress_above_destroy( struct nb_cb_destroy_args *args) { switch (args->event) { @@ -7096,9 +8258,9 @@ int bgp_global_afi_safis_afi_safi_ipv6_unicast_redistribution_list_destroy( /* * XPath: - * /frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-bgp:bgp/global/afi-safis/afi-safi/ipv6-unicast/redistribution-list/metric + * /frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-bgp:bgp/global/afi-safis/afi-safi/ipv6-unicast/route-flap-dampening/unreach-decay */ -int bgp_global_afi_safis_afi_safi_ipv6_unicast_redistribution_list_metric_modify( +int bgp_global_afi_safis_afi_safi_ipv6_unicast_route_flap_dampening_unreach_decay_modify( struct nb_cb_modify_args *args) { switch (args->event) { @@ -7113,7 +8275,7 @@ int bgp_global_afi_safis_afi_safi_ipv6_unicast_redistribution_list_metric_modify return NB_OK; } -int bgp_global_afi_safis_afi_safi_ipv6_unicast_redistribution_list_metric_destroy( +int bgp_global_afi_safis_afi_safi_ipv6_unicast_route_flap_dampening_unreach_decay_destroy( struct nb_cb_destroy_args *args) { switch (args->event) { @@ -7130,9 +8292,39 @@ int bgp_global_afi_safis_afi_safi_ipv6_unicast_redistribution_list_metric_destro /* * XPath: - * /frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-bgp:bgp/global/afi-safis/afi-safi/ipv6-unicast/redistribution-list/rmap-policy-import + * /frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-bgp:bgp/global/afi-safis/afi-safi/ipv6-unicast/use-multiple-paths/ebgp/maximum-paths */ -int bgp_global_afi_safis_afi_safi_ipv6_unicast_redistribution_list_rmap_policy_import_modify( +int bgp_global_afi_safis_afi_safi_ipv6_unicast_use_multiple_paths_ebgp_maximum_paths_modify( + struct nb_cb_modify_args *args) +{ + uint16_t maxpaths; + + switch (args->event) { + case NB_EV_VALIDATE: + maxpaths = yang_dnode_get_uint16(args->dnode, NULL); + if (maxpaths > MULTIPATH_NUM) { + snprintf(args->errmsg, args->errmsg_len, + "maxpaths %u is out of range %u", maxpaths, + MULTIPATH_NUM); + return NB_ERR_VALIDATION; + } + break; + case NB_EV_PREPARE: + case NB_EV_ABORT: + return NB_OK; + case NB_EV_APPLY: + return bgp_global_afi_safi_ip_unicast_use_multiple_paths_ebgp_maximum_paths_modify( + args); + } + + return NB_OK; +} + +/* + * XPath: + * /frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-bgp:bgp/global/afi-safis/afi-safi/ipv6-unicast/use-multiple-paths/ibgp/maximum-paths + */ +int bgp_global_afi_safis_afi_safi_ipv6_unicast_use_multiple_paths_ibgp_maximum_paths_modify( struct nb_cb_modify_args *args) { switch (args->event) { @@ -7147,7 +8339,26 @@ int bgp_global_afi_safis_afi_safi_ipv6_unicast_redistribution_list_rmap_policy_i return NB_OK; } -int bgp_global_afi_safis_afi_safi_ipv6_unicast_redistribution_list_rmap_policy_import_destroy( +/* + * XPath: + * /frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-bgp:bgp/global/afi-safis/afi-safi/ipv6-unicast/use-multiple-paths/ibgp/cluster-length-list + */ +int bgp_global_afi_safis_afi_safi_ipv6_unicast_use_multiple_paths_ibgp_cluster_length_list_modify( + struct nb_cb_modify_args *args) +{ + switch (args->event) { + case NB_EV_VALIDATE: + case NB_EV_PREPARE: + case NB_EV_ABORT: + case NB_EV_APPLY: + /* TODO: implement me. */ + break; + } + + return NB_OK; +} + +int bgp_global_afi_safis_afi_safi_ipv6_unicast_use_multiple_paths_ibgp_cluster_length_list_destroy( struct nb_cb_destroy_args *args) { switch (args->event) { @@ -7164,10 +8375,10 @@ int bgp_global_afi_safis_afi_safi_ipv6_unicast_redistribution_list_rmap_policy_i /* * XPath: - * /frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-bgp:bgp/global/afi-safis/afi-safi/ipv6-unicast/admin-distance/external + * /frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-bgp:bgp/global/afi-safis/afi-safi/ipv6-unicast/redistribution-list */ -int bgp_global_afi_safis_afi_safi_ipv6_unicast_admin_distance_external_modify( - struct nb_cb_modify_args *args) +int bgp_global_afi_safis_afi_safi_ipv6_unicast_redistribution_list_create( + struct nb_cb_create_args *args) { switch (args->event) { case NB_EV_VALIDATE: @@ -7181,15 +8392,34 @@ int bgp_global_afi_safis_afi_safi_ipv6_unicast_admin_distance_external_modify( return NB_OK; } -int bgp_global_afi_safis_afi_safi_ipv6_unicast_admin_distance_external_destroy( +int bgp_global_afi_safis_afi_safi_ipv6_unicast_redistribution_list_destroy( struct nb_cb_destroy_args *args) { + const struct lyd_node *af_dnode; + struct bgp *bgp; + const char *af_name; + afi_t afi; + safi_t safi; + int route_type; + int route_instance; + switch (args->event) { case NB_EV_VALIDATE: case NB_EV_PREPARE: case NB_EV_ABORT: + return NB_OK; case NB_EV_APPLY: - /* TODO: implement me. */ + af_dnode = yang_dnode_get_parent(args->dnode, "afi-safi"); + af_name = yang_dnode_get_string(af_dnode, "./afi-safi-name"); + yang_afi_safi_identity2value(af_name, &afi, &safi); + bgp = nb_running_get_entry(af_dnode, NULL, true); + + route_type = yang_dnode_get_enum(args->dnode, "./route-type"); + route_instance = + yang_dnode_get_uint16(args->dnode, "./route-instance"); + + bgp_redistribute_unset(bgp, afi, route_type, route_instance); + break; } @@ -7198,9 +8428,9 @@ int bgp_global_afi_safis_afi_safi_ipv6_unicast_admin_distance_external_destroy( /* * XPath: - * /frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-bgp:bgp/global/afi-safis/afi-safi/ipv6-unicast/admin-distance/internal + * /frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-bgp:bgp/global/afi-safis/afi-safi/ipv6-unicast/redistribution-list/metric */ -int bgp_global_afi_safis_afi_safi_ipv6_unicast_admin_distance_internal_modify( +int bgp_global_afi_safis_afi_safi_ipv6_unicast_redistribution_list_metric_modify( struct nb_cb_modify_args *args) { switch (args->event) { @@ -7215,7 +8445,7 @@ int bgp_global_afi_safis_afi_safi_ipv6_unicast_admin_distance_internal_modify( return NB_OK; } -int bgp_global_afi_safis_afi_safi_ipv6_unicast_admin_distance_internal_destroy( +int bgp_global_afi_safis_afi_safi_ipv6_unicast_redistribution_list_metric_destroy( struct nb_cb_destroy_args *args) { switch (args->event) { @@ -7232,9 +8462,9 @@ int bgp_global_afi_safis_afi_safi_ipv6_unicast_admin_distance_internal_destroy( /* * XPath: - * /frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-bgp:bgp/global/afi-safis/afi-safi/ipv6-unicast/admin-distance/local + * /frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-bgp:bgp/global/afi-safis/afi-safi/ipv6-unicast/redistribution-list/rmap-policy-import */ -int bgp_global_afi_safis_afi_safi_ipv6_unicast_admin_distance_local_modify( +int bgp_global_afi_safis_afi_safi_ipv6_unicast_redistribution_list_rmap_policy_import_modify( struct nb_cb_modify_args *args) { switch (args->event) { @@ -7249,7 +8479,7 @@ int bgp_global_afi_safis_afi_safi_ipv6_unicast_admin_distance_local_modify( return NB_OK; } -int bgp_global_afi_safis_afi_safi_ipv6_unicast_admin_distance_local_destroy( +int bgp_global_afi_safis_afi_safi_ipv6_unicast_redistribution_list_rmap_policy_import_destroy( struct nb_cb_destroy_args *args) { switch (args->event) { @@ -7266,6 +8496,52 @@ int bgp_global_afi_safis_afi_safi_ipv6_unicast_admin_distance_local_destroy( /* * XPath: + * /frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-bgp:bgp/global/afi-safis/afi-safi/ipv6-unicast/admin-distance + */ +void bgp_global_afi_safis_afi_safi_ipv6_unicast_admin_distance_apply_finish( + struct nb_cb_apply_finish_args *args) +{ + bgp_global_afi_safis_admin_distance_modify(args); +} + +/* + * XPath: + * /frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-bgp:bgp/global/afi-safis/afi-safi/ipv6-unicast/admin-distance/external + */ +int bgp_global_afi_safis_afi_safi_ipv6_unicast_admin_distance_external_modify( + struct nb_cb_modify_args *args) +{ + /* Handled in admin_distance_apply_finish callback */ + + return NB_OK; +} + +/* + * XPath: + * /frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-bgp:bgp/global/afi-safis/afi-safi/ipv6-unicast/admin-distance/internal + */ +int bgp_global_afi_safis_afi_safi_ipv6_unicast_admin_distance_internal_modify( + struct nb_cb_modify_args *args) +{ + /* Handled in admin_distance_apply_finish callback */ + + return NB_OK; +} + +/* + * XPath: + * /frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-bgp:bgp/global/afi-safis/afi-safi/ipv6-unicast/admin-distance/local + */ +int bgp_global_afi_safis_afi_safi_ipv6_unicast_admin_distance_local_modify( + struct nb_cb_modify_args *args) +{ + /* Handled in admin_distance_apply_finish callback */ + + return NB_OK; +} + +/* + * XPath: * /frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-bgp:bgp/global/afi-safis/afi-safi/ipv6-unicast/filter-config/rmap-export */ int bgp_global_afi_safis_afi_safi_ipv6_unicast_filter_config_rmap_export_modify( @@ -7305,13 +8581,33 @@ int bgp_global_afi_safis_afi_safi_ipv6_unicast_filter_config_rmap_export_destroy int bgp_global_afi_safis_afi_safi_ipv6_unicast_vpn_config_rd_modify( struct nb_cb_modify_args *args) { + struct bgp *bgp; + const struct lyd_node *af_dnode; + const char *af_name; + afi_t afi; + safi_t safi; + switch (args->event) { case NB_EV_VALIDATE: + bgp = nb_running_get_entry(args->dnode, NULL, false); + if (!bgp) + return NB_OK; + + af_dnode = yang_dnode_get_parent(args->dnode, "afi-safi"); + af_name = yang_dnode_get_string(af_dnode, "./afi-safi-name"); + yang_afi_safi_identity2value(af_name, &afi, &safi); + + if (!vpn_policy_check_import(bgp, afi, safi, false, + args->errmsg, args->errmsg_len)) + return NB_ERR_VALIDATION; + + break; case NB_EV_PREPARE: case NB_EV_ABORT: + return NB_OK; case NB_EV_APPLY: - /* TODO: implement me. */ - break; + return bgp_global_afi_safi_ip_unicast_vpn_config_rd_modify( + args); } return NB_OK; @@ -7324,9 +8620,10 @@ int bgp_global_afi_safis_afi_safi_ipv6_unicast_vpn_config_rd_destroy( case NB_EV_VALIDATE: case NB_EV_PREPARE: case NB_EV_ABORT: + return NB_OK; case NB_EV_APPLY: - /* TODO: implement me. */ - break; + return bgp_global_afi_safi_ip_unicast_vpn_config_rd_destroy( + args); } return NB_OK; @@ -7407,13 +8704,33 @@ int bgp_global_afi_safis_afi_safi_ipv6_unicast_vpn_config_label_auto_destroy( int bgp_global_afi_safis_afi_safi_ipv6_unicast_vpn_config_nexthop_modify( struct nb_cb_modify_args *args) { + struct bgp *bgp; + const struct lyd_node *af_dnode; + const char *af_name; + afi_t afi; + safi_t safi; + switch (args->event) { case NB_EV_VALIDATE: + bgp = nb_running_get_entry(args->dnode, NULL, false); + if (!bgp) + return NB_OK; + + af_dnode = yang_dnode_get_parent(args->dnode, "afi-safi"); + af_name = yang_dnode_get_string(af_dnode, "./afi-safi-name"); + yang_afi_safi_identity2value(af_name, &afi, &safi); + + if (!vpn_policy_check_import(bgp, afi, safi, false, + args->errmsg, args->errmsg_len)) + return NB_ERR_VALIDATION; + + break; case NB_EV_PREPARE: case NB_EV_ABORT: + return NB_OK; case NB_EV_APPLY: - /* TODO: implement me. */ - break; + return bgp_global_afi_safi_ip_unicast_vpn_config_nexthop_modify( + args); } return NB_OK; @@ -7426,9 +8743,10 @@ int bgp_global_afi_safis_afi_safi_ipv6_unicast_vpn_config_nexthop_destroy( case NB_EV_VALIDATE: case NB_EV_PREPARE: case NB_EV_ABORT: + return NB_OK; case NB_EV_APPLY: - /* TODO: implement me. */ - break; + return bgp_global_afi_safi_ip_unicast_vpn_config_nexthop_destroy( + args); } return NB_OK; @@ -7479,13 +8797,32 @@ int bgp_global_afi_safis_afi_safi_ipv6_unicast_vpn_config_export_vpn_modify( int bgp_global_afi_safis_afi_safi_ipv6_unicast_vpn_config_import_vrf_list_create( struct nb_cb_create_args *args) { + struct bgp *bgp; + const struct lyd_node *af_dnode; + const char *af_name; + afi_t afi; + safi_t safi; + switch (args->event) { case NB_EV_VALIDATE: + bgp = nb_running_get_entry(args->dnode, NULL, false); + if (!bgp) + return NB_OK; + af_dnode = yang_dnode_get_parent(args->dnode, "afi-safi"); + af_name = yang_dnode_get_string(af_dnode, "./afi-safi-name"); + yang_afi_safi_identity2value(af_name, &afi, &safi); + + if (!vpn_policy_check_import(bgp, afi, safi, true, args->errmsg, + args->errmsg_len)) + return NB_ERR_VALIDATION; + + break; case NB_EV_PREPARE: case NB_EV_ABORT: + return NB_OK; case NB_EV_APPLY: - /* TODO: implement me. */ - break; + return bgp_global_afi_safi_ip_unicast_vpn_config_import_vrfs_create( + args); } return NB_OK; @@ -7498,9 +8835,10 @@ int bgp_global_afi_safis_afi_safi_ipv6_unicast_vpn_config_import_vrf_list_destro case NB_EV_VALIDATE: case NB_EV_PREPARE: case NB_EV_ABORT: + return NB_OK; case NB_EV_APPLY: - /* TODO: implement me. */ - break; + return bgp_global_afi_safi_ip_unicast_vpn_config_import_vrf_list_destroy( + args); } return NB_OK; @@ -7517,9 +8855,10 @@ int bgp_global_afi_safis_afi_safi_ipv6_unicast_vpn_config_rmap_import_modify( case NB_EV_VALIDATE: case NB_EV_PREPARE: case NB_EV_ABORT: + return NB_OK; case NB_EV_APPLY: - /* TODO: implement me. */ - break; + return bgp_global_afi_safi_ip_unicast_vpn_config_rmap_import_modify( + args, "import"); } return NB_OK; @@ -7532,9 +8871,10 @@ int bgp_global_afi_safis_afi_safi_ipv6_unicast_vpn_config_rmap_import_destroy( case NB_EV_VALIDATE: case NB_EV_PREPARE: case NB_EV_ABORT: + return NB_OK; case NB_EV_APPLY: - /* TODO: implement me. */ - break; + return bgp_global_afi_safi_ip_unicast_vpn_config_rmap_import_destroy( + args, "import"); } return NB_OK; @@ -7551,9 +8891,10 @@ int bgp_global_afi_safis_afi_safi_ipv6_unicast_vpn_config_rmap_export_modify( case NB_EV_VALIDATE: case NB_EV_PREPARE: case NB_EV_ABORT: + return NB_OK; case NB_EV_APPLY: - /* TODO: implement me. */ - break; + return bgp_global_afi_safi_ip_unicast_vpn_config_rmap_import_modify( + args, "export"); } return NB_OK; @@ -7566,9 +8907,10 @@ int bgp_global_afi_safis_afi_safi_ipv6_unicast_vpn_config_rmap_export_destroy( case NB_EV_VALIDATE: case NB_EV_PREPARE: case NB_EV_ABORT: + return NB_OK; case NB_EV_APPLY: - /* TODO: implement me. */ - break; + return bgp_global_afi_safi_ip_unicast_vpn_config_rmap_import_destroy( + args, "export"); } return NB_OK; @@ -7717,13 +9059,24 @@ int bgp_global_afi_safis_afi_safi_ipv6_unicast_vpn_config_rt_list_destroy( int bgp_global_afi_safis_afi_safi_ipv4_labeled_unicast_use_multiple_paths_ebgp_maximum_paths_modify( struct nb_cb_modify_args *args) { + uint16_t maxpaths; + switch (args->event) { case NB_EV_VALIDATE: + maxpaths = yang_dnode_get_uint16(args->dnode, NULL); + if (maxpaths > MULTIPATH_NUM) { + snprintf(args->errmsg, args->errmsg_len, + "maxpaths %u is out of range %u", maxpaths, + MULTIPATH_NUM); + return NB_ERR_VALIDATION; + } + break; case NB_EV_PREPARE: case NB_EV_ABORT: + return NB_OK; case NB_EV_APPLY: - /* TODO: implement me. */ - break; + return bgp_global_afi_safi_ip_unicast_use_multiple_paths_ebgp_maximum_paths_modify( + args); } return NB_OK; @@ -7784,9 +9137,130 @@ int bgp_global_afi_safis_afi_safi_ipv4_labeled_unicast_use_multiple_paths_ibgp_c /* * XPath: - * /frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-bgp:bgp/global/afi-safis/afi-safi/ipv6-labeled-unicast/use-multiple-paths/ebgp/maximum-paths + * /frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-bgp:bgp/global/afi-safis/afi-safi/ipv4-labeled-unicast/route-flap-dampening/enable */ -int bgp_global_afi_safis_afi_safi_ipv6_labeled_unicast_use_multiple_paths_ebgp_maximum_paths_modify( +int bgp_global_afi_safis_afi_safi_ipv4_labeled_unicast_route_flap_dampening_enable_modify( + struct nb_cb_modify_args *args) +{ + switch (args->event) { + case NB_EV_VALIDATE: + return bgp_global_afi_safi_route_flap_validation(args); + case NB_EV_PREPARE: + case NB_EV_ABORT: + case NB_EV_APPLY: + break; + } + + return NB_OK; +} + +/* + * XPath: + * /frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-bgp:bgp/global/afi-safis/afi-safi/ipv4-labeled-unicast/route-flap-dampening/reach-decay + */ +int bgp_global_afi_safis_afi_safi_ipv4_labeled_unicast_route_flap_dampening_reach_decay_modify( + struct nb_cb_modify_args *args) +{ + switch (args->event) { + case NB_EV_VALIDATE: + case NB_EV_PREPARE: + case NB_EV_ABORT: + case NB_EV_APPLY: + /* TODO: implement me. */ + break; + } + + return NB_OK; +} + +int bgp_global_afi_safis_afi_safi_ipv4_labeled_unicast_route_flap_dampening_reach_decay_destroy( + struct nb_cb_destroy_args *args) +{ + switch (args->event) { + case NB_EV_VALIDATE: + case NB_EV_PREPARE: + case NB_EV_ABORT: + case NB_EV_APPLY: + /* TODO: implement me. */ + break; + } + + return NB_OK; +} + +/* + * XPath: + * /frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-bgp:bgp/global/afi-safis/afi-safi/ipv4-labeled-unicast/route-flap-dampening/reuse-above + */ +int bgp_global_afi_safis_afi_safi_ipv4_labeled_unicast_route_flap_dampening_reuse_above_modify( + struct nb_cb_modify_args *args) +{ + switch (args->event) { + case NB_EV_VALIDATE: + case NB_EV_PREPARE: + case NB_EV_ABORT: + case NB_EV_APPLY: + /* TODO: implement me. */ + break; + } + + return NB_OK; +} + +int bgp_global_afi_safis_afi_safi_ipv4_labeled_unicast_route_flap_dampening_reuse_above_destroy( + struct nb_cb_destroy_args *args) +{ + switch (args->event) { + case NB_EV_VALIDATE: + case NB_EV_PREPARE: + case NB_EV_ABORT: + case NB_EV_APPLY: + /* TODO: implement me. */ + break; + } + + return NB_OK; +} + +/* + * XPath: + * /frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-bgp:bgp/global/afi-safis/afi-safi/ipv4-labeled-unicast/route-flap-dampening/suppress-above + */ +int bgp_global_afi_safis_afi_safi_ipv4_labeled_unicast_route_flap_dampening_suppress_above_modify( + struct nb_cb_modify_args *args) +{ + switch (args->event) { + case NB_EV_VALIDATE: + case NB_EV_PREPARE: + case NB_EV_ABORT: + case NB_EV_APPLY: + /* TODO: implement me. */ + break; + } + + return NB_OK; +} + +int bgp_global_afi_safis_afi_safi_ipv4_labeled_unicast_route_flap_dampening_suppress_above_destroy( + struct nb_cb_destroy_args *args) +{ + switch (args->event) { + case NB_EV_VALIDATE: + case NB_EV_PREPARE: + case NB_EV_ABORT: + case NB_EV_APPLY: + /* TODO: implement me. */ + break; + } + + return NB_OK; +} + +/* + * XPath: + * /frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-bgp:bgp/global/afi-safis/afi-safi/ipv4-labeled-unicast/route-flap-dampening/unreach-decay + */ +int bgp_global_afi_safis_afi_safi_ipv4_labeled_unicast_route_flap_dampening_unreach_decay_modify( struct nb_cb_modify_args *args) { switch (args->event) { @@ -7801,6 +9275,51 @@ int bgp_global_afi_safis_afi_safi_ipv6_labeled_unicast_use_multiple_paths_ebgp_m return NB_OK; } +int bgp_global_afi_safis_afi_safi_ipv4_labeled_unicast_route_flap_dampening_unreach_decay_destroy( + struct nb_cb_destroy_args *args) +{ + switch (args->event) { + case NB_EV_VALIDATE: + case NB_EV_PREPARE: + case NB_EV_ABORT: + case NB_EV_APPLY: + /* TODO: implement me. */ + break; + } + + return NB_OK; +} + +/* + * XPath: + * /frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-bgp:bgp/global/afi-safis/afi-safi/ipv6-labeled-unicast/use-multiple-paths/ebgp/maximum-paths + */ +int bgp_global_afi_safis_afi_safi_ipv6_labeled_unicast_use_multiple_paths_ebgp_maximum_paths_modify( + struct nb_cb_modify_args *args) +{ + uint16_t maxpaths; + + switch (args->event) { + case NB_EV_VALIDATE: + maxpaths = yang_dnode_get_uint16(args->dnode, NULL); + if (maxpaths > MULTIPATH_NUM) { + snprintf(args->errmsg, args->errmsg_len, + "maxpaths %u is out of range %u", maxpaths, + MULTIPATH_NUM); + return NB_ERR_VALIDATION; + } + break; + case NB_EV_PREPARE: + case NB_EV_ABORT: + return NB_OK; + case NB_EV_APPLY: + return bgp_global_afi_safi_ip_unicast_use_multiple_paths_ebgp_maximum_paths_modify( + args); + } + + return NB_OK; +} + /* * XPath: * /frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-bgp:bgp/global/afi-safis/afi-safi/ipv6-labeled-unicast/use-multiple-paths/ibgp/maximum-paths @@ -7808,8 +9327,18 @@ int bgp_global_afi_safis_afi_safi_ipv6_labeled_unicast_use_multiple_paths_ebgp_m int bgp_global_afi_safis_afi_safi_ipv6_labeled_unicast_use_multiple_paths_ibgp_maximum_paths_modify( struct nb_cb_modify_args *args) { + uint16_t maxpaths; + switch (args->event) { case NB_EV_VALIDATE: + maxpaths = yang_dnode_get_uint16(args->dnode, NULL); + if (maxpaths > MULTIPATH_NUM) { + snprintf(args->errmsg, args->errmsg_len, + "maxpaths %u is out of range %u", maxpaths, + MULTIPATH_NUM); + return NB_ERR_VALIDATION; + } + break; case NB_EV_PREPARE: case NB_EV_ABORT: case NB_EV_APPLY: @@ -7856,10 +9385,29 @@ int bgp_global_afi_safis_afi_safi_ipv6_labeled_unicast_use_multiple_paths_ibgp_c /* * XPath: - * /frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-bgp:bgp/global/afi-safis/afi-safi/ipv4-multicast/network-config + * /frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-bgp:bgp/global/afi-safis/afi-safi/ipv6-labeled-unicast/route-flap-dampening/enable */ -int bgp_global_afi_safis_afi_safi_ipv4_multicast_network_config_create( - struct nb_cb_create_args *args) +int bgp_global_afi_safis_afi_safi_ipv6_labeled_unicast_route_flap_dampening_enable_modify( + struct nb_cb_modify_args *args) +{ + switch (args->event) { + case NB_EV_VALIDATE: + return bgp_global_afi_safi_route_flap_validation(args); + case NB_EV_PREPARE: + case NB_EV_ABORT: + case NB_EV_APPLY: + break; + } + + return NB_OK; +} + +/* + * XPath: + * /frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-bgp:bgp/global/afi-safis/afi-safi/ipv6-labeled-unicast/route-flap-dampening/reach-decay + */ +int bgp_global_afi_safis_afi_safi_ipv6_labeled_unicast_route_flap_dampening_reach_decay_modify( + struct nb_cb_modify_args *args) { switch (args->event) { case NB_EV_VALIDATE: @@ -7873,7 +9421,7 @@ int bgp_global_afi_safis_afi_safi_ipv4_multicast_network_config_create( return NB_OK; } -int bgp_global_afi_safis_afi_safi_ipv4_multicast_network_config_destroy( +int bgp_global_afi_safis_afi_safi_ipv6_labeled_unicast_route_flap_dampening_reach_decay_destroy( struct nb_cb_destroy_args *args) { switch (args->event) { @@ -7890,6 +9438,137 @@ int bgp_global_afi_safis_afi_safi_ipv4_multicast_network_config_destroy( /* * XPath: + * /frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-bgp:bgp/global/afi-safis/afi-safi/ipv6-labeled-unicast/route-flap-dampening/reuse-above + */ +int bgp_global_afi_safis_afi_safi_ipv6_labeled_unicast_route_flap_dampening_reuse_above_modify( + struct nb_cb_modify_args *args) +{ + switch (args->event) { + case NB_EV_VALIDATE: + case NB_EV_PREPARE: + case NB_EV_ABORT: + case NB_EV_APPLY: + /* TODO: implement me. */ + break; + } + + return NB_OK; +} + +int bgp_global_afi_safis_afi_safi_ipv6_labeled_unicast_route_flap_dampening_reuse_above_destroy( + struct nb_cb_destroy_args *args) +{ + switch (args->event) { + case NB_EV_VALIDATE: + case NB_EV_PREPARE: + case NB_EV_ABORT: + case NB_EV_APPLY: + /* TODO: implement me. */ + break; + } + + return NB_OK; +} + +/* + * XPath: + * /frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-bgp:bgp/global/afi-safis/afi-safi/ipv6-labeled-unicast/route-flap-dampening/suppress-above + */ +int bgp_global_afi_safis_afi_safi_ipv6_labeled_unicast_route_flap_dampening_suppress_above_modify( + struct nb_cb_modify_args *args) +{ + switch (args->event) { + case NB_EV_VALIDATE: + case NB_EV_PREPARE: + case NB_EV_ABORT: + case NB_EV_APPLY: + /* TODO: implement me. */ + break; + } + + return NB_OK; +} + +int bgp_global_afi_safis_afi_safi_ipv6_labeled_unicast_route_flap_dampening_suppress_above_destroy( + struct nb_cb_destroy_args *args) +{ + switch (args->event) { + case NB_EV_VALIDATE: + case NB_EV_PREPARE: + case NB_EV_ABORT: + case NB_EV_APPLY: + /* TODO: implement me. */ + break; + } + + return NB_OK; +} + +/* + * XPath: + * /frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-bgp:bgp/global/afi-safis/afi-safi/ipv6-labeled-unicast/route-flap-dampening/unreach-decay + */ +int bgp_global_afi_safis_afi_safi_ipv6_labeled_unicast_route_flap_dampening_unreach_decay_modify( + struct nb_cb_modify_args *args) +{ + switch (args->event) { + case NB_EV_VALIDATE: + case NB_EV_PREPARE: + case NB_EV_ABORT: + case NB_EV_APPLY: + /* TODO: implement me. */ + break; + } + + return NB_OK; +} + +int bgp_global_afi_safis_afi_safi_ipv6_labeled_unicast_route_flap_dampening_unreach_decay_destroy( + struct nb_cb_destroy_args *args) +{ + switch (args->event) { + case NB_EV_VALIDATE: + case NB_EV_PREPARE: + case NB_EV_ABORT: + case NB_EV_APPLY: + /* TODO: implement me. */ + break; + } + + return NB_OK; +} + +/* + * XPath: + * /frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-bgp:bgp/global/afi-safis/afi-safi/ipv4-multicast/network-config + */ +int bgp_global_afi_safis_afi_safi_ipv4_multicast_network_config_create( + struct nb_cb_create_args *args) +{ + /* Handled in network_config_apply_finish callback */ + + return NB_OK; +} + +int bgp_global_afi_safis_afi_safi_ipv4_multicast_network_config_destroy( + struct nb_cb_destroy_args *args) +{ + switch (args->event) { + case NB_EV_VALIDATE: + case NB_EV_PREPARE: + case NB_EV_ABORT: + return NB_OK; + case NB_EV_APPLY: + return bgp_global_afi_safis_afi_safi_network_config_destroy( + args); + break; + } + + return NB_OK; +} + +/* + * XPath: * /frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-bgp:bgp/global/afi-safis/afi-safi/ipv4-multicast/network-config/backdoor */ int bgp_global_afi_safis_afi_safi_ipv4_multicast_network_config_backdoor_modify( @@ -8083,6 +9762,78 @@ int bgp_global_afi_safis_afi_safi_ipv4_multicast_aggregate_route_rmap_policy_exp /* * XPath: + * /frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-bgp:bgp/global/afi-safis/afi-safi/ipv4-multicast/aggregate-route/origin + */ +int bgp_global_afi_safis_afi_safi_ipv4_multicast_aggregate_route_origin_modify( + struct nb_cb_modify_args *args) +{ + switch (args->event) { + case NB_EV_VALIDATE: + case NB_EV_PREPARE: + case NB_EV_ABORT: + case NB_EV_APPLY: + /* TODO: implement me. */ + break; + } + + return NB_OK; +} + +/* + * XPath: + * /frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-bgp:bgp/global/afi-safis/afi-safi/ipv4-multicast/aggregate-route/match-med + */ +int bgp_global_afi_safis_afi_safi_ipv4_multicast_aggregate_route_match_med_modify( + struct nb_cb_modify_args *args) +{ + switch (args->event) { + case NB_EV_VALIDATE: + case NB_EV_PREPARE: + case NB_EV_ABORT: + case NB_EV_APPLY: + /* TODO: implement me. */ + break; + } + + return NB_OK; +} + +/* + * XPath: + * /frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-bgp:bgp/global/afi-safis/afi-safi/ipv4-multicast/aggregate-route/suppress-map + */ +int bgp_global_afi_safis_afi_safi_ipv4_multicast_aggregate_route_suppress_map_modify( + struct nb_cb_modify_args *args) +{ + switch (args->event) { + case NB_EV_VALIDATE: + case NB_EV_PREPARE: + case NB_EV_ABORT: + case NB_EV_APPLY: + /* TODO: implement me. */ + break; + } + + return NB_OK; +} + +int bgp_global_afi_safis_afi_safi_ipv4_multicast_aggregate_route_suppress_map_destroy( + struct nb_cb_destroy_args *args) +{ + switch (args->event) { + case NB_EV_VALIDATE: + case NB_EV_PREPARE: + case NB_EV_ABORT: + case NB_EV_APPLY: + /* TODO: implement me. */ + break; + } + + return NB_OK; +} + +/* + * XPath: * /frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-bgp:bgp/global/afi-safis/afi-safi/ipv4-multicast/admin-distance-route */ int bgp_global_afi_safis_afi_safi_ipv4_multicast_admin_distance_route_create( @@ -8107,6 +9858,25 @@ int bgp_global_afi_safis_afi_safi_ipv4_multicast_admin_distance_route_destroy( case NB_EV_VALIDATE: case NB_EV_PREPARE: case NB_EV_ABORT: + return NB_OK; + case NB_EV_APPLY: + return bgp_global_afi_safi_admin_distance_route_destroy(args); + } + + return NB_OK; +} + +/* + * XPath: + * /frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-bgp:bgp/global/afi-safis/afi-safi/ipv4-multicast/admin-distance-route/distance + */ +int bgp_global_afi_safis_afi_safi_ipv4_multicast_admin_distance_route_distance_modify( + struct nb_cb_modify_args *args) +{ + switch (args->event) { + case NB_EV_VALIDATE: + case NB_EV_PREPARE: + case NB_EV_ABORT: case NB_EV_APPLY: /* TODO: implement me. */ break; @@ -8117,9 +9887,9 @@ int bgp_global_afi_safis_afi_safi_ipv4_multicast_admin_distance_route_destroy( /* * XPath: - * /frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-bgp:bgp/global/afi-safis/afi-safi/ipv4-multicast/admin-distance/external + * /frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-bgp:bgp/global/afi-safis/afi-safi/ipv4-multicast/admin-distance-route/access-list-policy-export */ -int bgp_global_afi_safis_afi_safi_ipv4_multicast_admin_distance_external_modify( +int bgp_global_afi_safis_afi_safi_ipv4_multicast_admin_distance_route_access_list_policy_export_modify( struct nb_cb_modify_args *args) { switch (args->event) { @@ -8134,7 +9904,7 @@ int bgp_global_afi_safis_afi_safi_ipv4_multicast_admin_distance_external_modify( return NB_OK; } -int bgp_global_afi_safis_afi_safi_ipv4_multicast_admin_distance_external_destroy( +int bgp_global_afi_safis_afi_safi_ipv4_multicast_admin_distance_route_access_list_policy_export_destroy( struct nb_cb_destroy_args *args) { switch (args->event) { @@ -8151,9 +9921,9 @@ int bgp_global_afi_safis_afi_safi_ipv4_multicast_admin_distance_external_destroy /* * XPath: - * /frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-bgp:bgp/global/afi-safis/afi-safi/ipv4-multicast/admin-distance/internal + * /frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-bgp:bgp/global/afi-safis/afi-safi/ipv6-multicast/admin-distance-route/distance */ -int bgp_global_afi_safis_afi_safi_ipv4_multicast_admin_distance_internal_modify( +int bgp_global_afi_safis_afi_safi_ipv6_multicast_admin_distance_route_distance_modify( struct nb_cb_modify_args *args) { switch (args->event) { @@ -8168,7 +9938,26 @@ int bgp_global_afi_safis_afi_safi_ipv4_multicast_admin_distance_internal_modify( return NB_OK; } -int bgp_global_afi_safis_afi_safi_ipv4_multicast_admin_distance_internal_destroy( +/* + * XPath: + * /frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-bgp:bgp/global/afi-safis/afi-safi/ipv6-multicast/admin-distance-route/access-list-policy-export + */ +int bgp_global_afi_safis_afi_safi_ipv6_multicast_admin_distance_route_access_list_policy_export_modify( + struct nb_cb_modify_args *args) +{ + switch (args->event) { + case NB_EV_VALIDATE: + case NB_EV_PREPARE: + case NB_EV_ABORT: + case NB_EV_APPLY: + /* TODO: implement me. */ + break; + } + + return NB_OK; +} + +int bgp_global_afi_safis_afi_safi_ipv6_multicast_admin_distance_route_access_list_policy_export_destroy( struct nb_cb_destroy_args *args) { switch (args->event) { @@ -8185,9 +9974,28 @@ int bgp_global_afi_safis_afi_safi_ipv4_multicast_admin_distance_internal_destroy /* * XPath: - * /frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-bgp:bgp/global/afi-safis/afi-safi/ipv4-multicast/admin-distance/local + * /frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-bgp:bgp/global/afi-safis/afi-safi/ipv6-multicast/route-flap-dampening/enable */ -int bgp_global_afi_safis_afi_safi_ipv4_multicast_admin_distance_local_modify( +int bgp_global_afi_safis_afi_safi_ipv6_multicast_route_flap_dampening_enable_modify( + struct nb_cb_modify_args *args) +{ + switch (args->event) { + case NB_EV_VALIDATE: + return bgp_global_afi_safi_route_flap_validation(args); + case NB_EV_PREPARE: + case NB_EV_ABORT: + case NB_EV_APPLY: + break; + } + + return NB_OK; +} + +/* + * XPath: + * /frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-bgp:bgp/global/afi-safis/afi-safi/ipv6-multicast/route-flap-dampening/reach-decay + */ +int bgp_global_afi_safis_afi_safi_ipv6_multicast_route_flap_dampening_reach_decay_modify( struct nb_cb_modify_args *args) { switch (args->event) { @@ -8202,7 +10010,7 @@ int bgp_global_afi_safis_afi_safi_ipv4_multicast_admin_distance_local_modify( return NB_OK; } -int bgp_global_afi_safis_afi_safi_ipv4_multicast_admin_distance_local_destroy( +int bgp_global_afi_safis_afi_safi_ipv6_multicast_route_flap_dampening_reach_decay_destroy( struct nb_cb_destroy_args *args) { switch (args->event) { @@ -8219,6 +10027,154 @@ int bgp_global_afi_safis_afi_safi_ipv4_multicast_admin_distance_local_destroy( /* * XPath: + * /frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-bgp:bgp/global/afi-safis/afi-safi/ipv6-multicast/route-flap-dampening/reuse-above + */ +int bgp_global_afi_safis_afi_safi_ipv6_multicast_route_flap_dampening_reuse_above_modify( + struct nb_cb_modify_args *args) +{ + switch (args->event) { + case NB_EV_VALIDATE: + case NB_EV_PREPARE: + case NB_EV_ABORT: + case NB_EV_APPLY: + /* TODO: implement me. */ + break; + } + + return NB_OK; +} + +int bgp_global_afi_safis_afi_safi_ipv6_multicast_route_flap_dampening_reuse_above_destroy( + struct nb_cb_destroy_args *args) +{ + switch (args->event) { + case NB_EV_VALIDATE: + case NB_EV_PREPARE: + case NB_EV_ABORT: + case NB_EV_APPLY: + /* TODO: implement me. */ + break; + } + + return NB_OK; +} + +/* + * XPath: + * /frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-bgp:bgp/global/afi-safis/afi-safi/ipv6-multicast/route-flap-dampening/suppress-above + */ +int bgp_global_afi_safis_afi_safi_ipv6_multicast_route_flap_dampening_suppress_above_modify( + struct nb_cb_modify_args *args) +{ + switch (args->event) { + case NB_EV_VALIDATE: + case NB_EV_PREPARE: + case NB_EV_ABORT: + case NB_EV_APPLY: + /* TODO: implement me. */ + break; + } + + return NB_OK; +} + +int bgp_global_afi_safis_afi_safi_ipv6_multicast_route_flap_dampening_suppress_above_destroy( + struct nb_cb_destroy_args *args) +{ + switch (args->event) { + case NB_EV_VALIDATE: + case NB_EV_PREPARE: + case NB_EV_ABORT: + case NB_EV_APPLY: + /* TODO: implement me. */ + break; + } + + return NB_OK; +} + +/* + * XPath: + * /frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-bgp:bgp/global/afi-safis/afi-safi/ipv6-multicast/route-flap-dampening/unreach-decay + */ +int bgp_global_afi_safis_afi_safi_ipv6_multicast_route_flap_dampening_unreach_decay_modify( + struct nb_cb_modify_args *args) +{ + switch (args->event) { + case NB_EV_VALIDATE: + case NB_EV_PREPARE: + case NB_EV_ABORT: + case NB_EV_APPLY: + /* TODO: implement me. */ + break; + } + + return NB_OK; +} + +int bgp_global_afi_safis_afi_safi_ipv6_multicast_route_flap_dampening_unreach_decay_destroy( + struct nb_cb_destroy_args *args) +{ + switch (args->event) { + case NB_EV_VALIDATE: + case NB_EV_PREPARE: + case NB_EV_ABORT: + case NB_EV_APPLY: + /* TODO: implement me. */ + break; + } + + return NB_OK; +} + +/* + * XPath: + * /frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-bgp:bgp/global/afi-safis/afi-safi/ipv4-multicast/admin-distance + */ +void bgp_global_afi_safis_afi_safi_ipv4_multicast_admin_distance_apply_finish( + struct nb_cb_apply_finish_args *args) +{ + bgp_global_afi_safis_admin_distance_modify(args); +} + +/* + * XPath: + * /frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-bgp:bgp/global/afi-safis/afi-safi/ipv4-multicast/admin-distance/external + */ +int bgp_global_afi_safis_afi_safi_ipv4_multicast_admin_distance_external_modify( + struct nb_cb_modify_args *args) +{ + /* Handled in admin_distance_apply_finish callback */ + + return NB_OK; +} + +/* + * XPath: + * /frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-bgp:bgp/global/afi-safis/afi-safi/ipv4-multicast/admin-distance/internal + */ +int bgp_global_afi_safis_afi_safi_ipv4_multicast_admin_distance_internal_modify( + struct nb_cb_modify_args *args) +{ + /* Handled in admin_distance_apply_finish callback */ + + return NB_OK; +} + +/* + * XPath: + * /frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-bgp:bgp/global/afi-safis/afi-safi/ipv4-multicast/admin-distance/local + */ +int bgp_global_afi_safis_afi_safi_ipv4_multicast_admin_distance_local_modify( + struct nb_cb_modify_args *args) +{ + /* Handled in admin_distance_apply_finish callback */ + + return NB_OK; +} + +/* + * XPath: * /frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-bgp:bgp/global/afi-safis/afi-safi/ipv4-multicast/route-flap-dampening/enable */ int bgp_global_afi_safis_afi_safi_ipv4_multicast_route_flap_dampening_enable_modify( @@ -8226,10 +10182,10 @@ int bgp_global_afi_safis_afi_safi_ipv4_multicast_route_flap_dampening_enable_mod { switch (args->event) { case NB_EV_VALIDATE: + return bgp_global_afi_safi_route_flap_validation(args); case NB_EV_PREPARE: case NB_EV_ABORT: case NB_EV_APPLY: - /* TODO: implement me. */ break; } @@ -8413,14 +10369,7 @@ int bgp_global_afi_safis_afi_safi_ipv4_multicast_filter_config_rmap_export_destr int bgp_global_afi_safis_afi_safi_ipv6_multicast_network_config_create( struct nb_cb_create_args *args) { - switch (args->event) { - case NB_EV_VALIDATE: - case NB_EV_PREPARE: - case NB_EV_ABORT: - case NB_EV_APPLY: - /* TODO: implement me. */ - break; - } + /* Handled in network_config_apply_finish callback */ return NB_OK; } @@ -8432,8 +10381,11 @@ int bgp_global_afi_safis_afi_safi_ipv6_multicast_network_config_destroy( case NB_EV_VALIDATE: case NB_EV_PREPARE: case NB_EV_ABORT: + return NB_OK; case NB_EV_APPLY: - /* TODO: implement me. */ + return bgp_global_afi_safis_afi_safi_network_config_destroy( + args); + break; } @@ -8635,10 +10587,10 @@ int bgp_global_afi_safis_afi_safi_ipv6_multicast_aggregate_route_rmap_policy_exp /* * XPath: - * /frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-bgp:bgp/global/afi-safis/afi-safi/ipv6-multicast/admin-distance-route + * /frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-bgp:bgp/global/afi-safis/afi-safi/ipv6-multicast/aggregate-route/origin */ -int bgp_global_afi_safis_afi_safi_ipv6_multicast_admin_distance_route_create( - struct nb_cb_create_args *args) +int bgp_global_afi_safis_afi_safi_ipv6_multicast_aggregate_route_origin_modify( + struct nb_cb_modify_args *args) { switch (args->event) { case NB_EV_VALIDATE: @@ -8652,8 +10604,12 @@ int bgp_global_afi_safis_afi_safi_ipv6_multicast_admin_distance_route_create( return NB_OK; } -int bgp_global_afi_safis_afi_safi_ipv6_multicast_admin_distance_route_destroy( - struct nb_cb_destroy_args *args) +/* + * XPath: + * /frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-bgp:bgp/global/afi-safis/afi-safi/ipv6-multicast/aggregate-route/match-med + */ +int bgp_global_afi_safis_afi_safi_ipv6_multicast_aggregate_route_match_med_modify( + struct nb_cb_modify_args *args) { switch (args->event) { case NB_EV_VALIDATE: @@ -8669,9 +10625,9 @@ int bgp_global_afi_safis_afi_safi_ipv6_multicast_admin_distance_route_destroy( /* * XPath: - * /frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-bgp:bgp/global/afi-safis/afi-safi/ipv6-multicast/admin-distance/external + * /frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-bgp:bgp/global/afi-safis/afi-safi/ipv6-multicast/aggregate-route/suppress-map */ -int bgp_global_afi_safis_afi_safi_ipv6_multicast_admin_distance_external_modify( +int bgp_global_afi_safis_afi_safi_ipv6_multicast_aggregate_route_suppress_map_modify( struct nb_cb_modify_args *args) { switch (args->event) { @@ -8686,7 +10642,7 @@ int bgp_global_afi_safis_afi_safi_ipv6_multicast_admin_distance_external_modify( return NB_OK; } -int bgp_global_afi_safis_afi_safi_ipv6_multicast_admin_distance_external_destroy( +int bgp_global_afi_safis_afi_safi_ipv6_multicast_aggregate_route_suppress_map_destroy( struct nb_cb_destroy_args *args) { switch (args->event) { @@ -8703,10 +10659,10 @@ int bgp_global_afi_safis_afi_safi_ipv6_multicast_admin_distance_external_destroy /* * XPath: - * /frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-bgp:bgp/global/afi-safis/afi-safi/ipv6-multicast/admin-distance/internal + * /frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-bgp:bgp/global/afi-safis/afi-safi/ipv6-multicast/admin-distance-route */ -int bgp_global_afi_safis_afi_safi_ipv6_multicast_admin_distance_internal_modify( - struct nb_cb_modify_args *args) +int bgp_global_afi_safis_afi_safi_ipv6_multicast_admin_distance_route_create( + struct nb_cb_create_args *args) { switch (args->event) { case NB_EV_VALIDATE: @@ -8720,16 +10676,16 @@ int bgp_global_afi_safis_afi_safi_ipv6_multicast_admin_distance_internal_modify( return NB_OK; } -int bgp_global_afi_safis_afi_safi_ipv6_multicast_admin_distance_internal_destroy( +int bgp_global_afi_safis_afi_safi_ipv6_multicast_admin_distance_route_destroy( struct nb_cb_destroy_args *args) { switch (args->event) { case NB_EV_VALIDATE: case NB_EV_PREPARE: case NB_EV_ABORT: + return NB_OK; case NB_EV_APPLY: - /* TODO: implement me. */ - break; + return bgp_global_afi_safi_admin_distance_route_destroy(args); } return NB_OK; @@ -8737,34 +10693,46 @@ int bgp_global_afi_safis_afi_safi_ipv6_multicast_admin_distance_internal_destroy /* * XPath: - * /frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-bgp:bgp/global/afi-safis/afi-safi/ipv6-multicast/admin-distance/local + * /frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-bgp:bgp/global/afi-safis/afi-safi/ipv4-multicast/admin-distance */ -int bgp_global_afi_safis_afi_safi_ipv6_multicast_admin_distance_local_modify( +void bgp_global_afi_safis_afi_safi_ipv6_multicast_admin_distance_apply_finish( + struct nb_cb_apply_finish_args *args) +{ + bgp_global_afi_safis_admin_distance_modify(args); +} + +/* + * XPath: + * /frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-bgp:bgp/global/afi-safis/afi-safi/ipv6-multicast/admin-distance/external + */ +int bgp_global_afi_safis_afi_safi_ipv6_multicast_admin_distance_external_modify( struct nb_cb_modify_args *args) { - switch (args->event) { - case NB_EV_VALIDATE: - case NB_EV_PREPARE: - case NB_EV_ABORT: - case NB_EV_APPLY: - /* TODO: implement me. */ - break; - } + /* Handled in admin_distance_apply_finish callback */ return NB_OK; } -int bgp_global_afi_safis_afi_safi_ipv6_multicast_admin_distance_local_destroy( - struct nb_cb_destroy_args *args) +/* + * XPath: + * /frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-bgp:bgp/global/afi-safis/afi-safi/ipv6-multicast/admin-distance/internal + */ +int bgp_global_afi_safis_afi_safi_ipv6_multicast_admin_distance_internal_modify( + struct nb_cb_modify_args *args) { - switch (args->event) { - case NB_EV_VALIDATE: - case NB_EV_PREPARE: - case NB_EV_ABORT: - case NB_EV_APPLY: - /* TODO: implement me. */ - break; - } + /* Handled in admin_distance_apply_finish callback */ + + return NB_OK; +} + +/* + * XPath: + * /frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-bgp:bgp/global/afi-safis/afi-safi/ipv6-multicast/admin-distance/local + */ +int bgp_global_afi_safis_afi_safi_ipv6_multicast_admin_distance_local_modify( + struct nb_cb_modify_args *args) +{ + /* Handled in admin_distance_apply_finish callback */ return NB_OK; } diff --git a/bgpd/bgp_packet.c b/bgpd/bgp_packet.c index ed22f6711c..a23acda0a8 100644 --- a/bgpd/bgp_packet.c +++ b/bgpd/bgp_packet.c @@ -63,6 +63,7 @@ #include "bgpd/bgp_io.h" #include "bgpd/bgp_keepalives.h" #include "bgpd/bgp_flowspec.h" +#include "bgpd/bgp_trace.h" DEFINE_HOOK(bgp_packet_dump, (struct peer *peer, uint8_t type, bgp_size_t size, @@ -402,12 +403,13 @@ int bgp_generate_updgrp_packets(struct thread *thread) /* * The code beyond this part deals with update packets, proceed only * if peer is Established and updates are not on hold (as part of - * update-delay post processing). + * update-delay processing). */ if (peer->status != Established) return 0; - if (peer->bgp->main_peers_update_hold) + if ((peer->bgp->main_peers_update_hold) + || bgp_update_delay_active(peer->bgp)) return 0; if (peer->t_routeadv) @@ -1781,6 +1783,9 @@ static int bgp_update_receive(struct peer *peer, bgp_size_t size) peer->update_time = bgp_clock(); + /* Notify BGP Conditional advertisement scanner process */ + peer->advmap_table_change = true; + return Receive_UPDATE_message; } @@ -2366,6 +2371,7 @@ int bgp_process_packet(struct thread *thread) */ switch (type) { case BGP_MSG_OPEN: + frrtrace(2, frr_bgp, open_process, peer, size); atomic_fetch_add_explicit(&peer->open_in, 1, memory_order_relaxed); mprc = bgp_open_receive(peer, size); @@ -2376,6 +2382,7 @@ int bgp_process_packet(struct thread *thread) __func__, peer->host); break; case BGP_MSG_UPDATE: + frrtrace(2, frr_bgp, update_process, peer, size); atomic_fetch_add_explicit(&peer->update_in, 1, memory_order_relaxed); peer->readtime = monotime(NULL); @@ -2387,6 +2394,7 @@ int bgp_process_packet(struct thread *thread) __func__, peer->host); break; case BGP_MSG_NOTIFY: + frrtrace(2, frr_bgp, notification_process, peer, size); atomic_fetch_add_explicit(&peer->notify_in, 1, memory_order_relaxed); mprc = bgp_notify_receive(peer, size); @@ -2397,6 +2405,7 @@ int bgp_process_packet(struct thread *thread) __func__, peer->host); break; case BGP_MSG_KEEPALIVE: + frrtrace(2, frr_bgp, keepalive_process, peer, size); peer->readtime = monotime(NULL); atomic_fetch_add_explicit(&peer->keepalive_in, 1, memory_order_relaxed); @@ -2409,6 +2418,7 @@ int bgp_process_packet(struct thread *thread) break; case BGP_MSG_ROUTE_REFRESH_NEW: case BGP_MSG_ROUTE_REFRESH_OLD: + frrtrace(2, frr_bgp, refresh_process, peer, size); atomic_fetch_add_explicit(&peer->refresh_in, 1, memory_order_relaxed); mprc = bgp_route_refresh_receive(peer, size); @@ -2419,6 +2429,7 @@ int bgp_process_packet(struct thread *thread) __func__, peer->host); break; case BGP_MSG_CAPABILITY: + frrtrace(2, frr_bgp, capability_process, peer, size); atomic_fetch_add_explicit(&peer->dynamic_cap_in, 1, memory_order_relaxed); mprc = bgp_capability_receive(peer, size); diff --git a/bgpd/bgp_route.c b/bgpd/bgp_route.c index ae50808b6d..52e90f5c6a 100644 --- a/bgpd/bgp_route.c +++ b/bgpd/bgp_route.c @@ -70,6 +70,7 @@ #include "bgpd/bgp_addpath.h" #include "bgpd/bgp_mac.h" #include "bgpd/bgp_network.h" +#include "bgpd/bgp_trace.h" #ifdef ENABLE_BGP_VNC #include "bgpd/rfapi/rfapi_backend.h" @@ -84,6 +85,9 @@ #include "bgpd/bgp_flowspec.h" #include "bgpd/bgp_flowspec_util.h" #include "bgpd/bgp_pbr.h" +#include "northbound.h" +#include "northbound_cli.h" +#include "bgpd/bgp_nb.h" #ifndef VTYSH_EXTRACT_PL #include "bgpd/bgp_route_clippy.c" @@ -115,6 +119,14 @@ DEFINE_HOOK(bgp_process, struct peer *peer, bool withdraw), (bgp, afi, safi, bn, peer, withdraw)) +/** Test if path is suppressed. */ +static bool bgp_path_suppressed(struct bgp_path_info *pi) +{ + if (pi->extra == NULL || pi->extra->aggr_suppressors == NULL) + return false; + + return listcount(pi->extra->aggr_suppressors) > 0; +} struct bgp_dest *bgp_afi_node_get(struct bgp_table *table, afi_t afi, safi_t safi, const struct prefix *p, @@ -1288,6 +1300,7 @@ static enum filter_type bgp_input_filter(struct peer *peer, safi_t safi) { struct bgp_filter *filter; + enum filter_type ret = FILTER_PERMIT; filter = &peer->filter[afi][safi]; @@ -1299,26 +1312,43 @@ static enum filter_type bgp_input_filter(struct peer *peer, if (DISTRIBUTE_IN_NAME(filter)) { FILTER_EXIST_WARN(DISTRIBUTE, distribute, filter); - if (access_list_apply(DISTRIBUTE_IN(filter), p) == FILTER_DENY) - return FILTER_DENY; + if (access_list_apply(DISTRIBUTE_IN(filter), p) + == FILTER_DENY) { + ret = FILTER_DENY; + goto done; + } } if (PREFIX_LIST_IN_NAME(filter)) { FILTER_EXIST_WARN(PREFIX_LIST, prefix, filter); - if (prefix_list_apply(PREFIX_LIST_IN(filter), p) == PREFIX_DENY) - return FILTER_DENY; + if (prefix_list_apply(PREFIX_LIST_IN(filter), p) + == PREFIX_DENY) { + ret = FILTER_DENY; + goto done; + } } if (FILTER_LIST_IN_NAME(filter)) { FILTER_EXIST_WARN(FILTER_LIST, as, filter); if (as_list_apply(FILTER_LIST_IN(filter), attr->aspath) - == AS_FILTER_DENY) - return FILTER_DENY; + == AS_FILTER_DENY) { + ret = FILTER_DENY; + goto done; + } } - return FILTER_PERMIT; +done: + if (frrtrace_enabled(frr_bgp, input_filter)) { + char pfxprint[PREFIX2STR_BUFFER]; + + prefix2str(p, pfxprint, sizeof(pfxprint)); + frrtrace(5, frr_bgp, input_filter, peer, pfxprint, afi, safi, + ret == FILTER_PERMIT ? "permit" : "deny"); + } + + return ret; #undef FILTER_EXIST_WARN } @@ -1328,6 +1358,7 @@ static enum filter_type bgp_output_filter(struct peer *peer, safi_t safi) { struct bgp_filter *filter; + enum filter_type ret = FILTER_PERMIT; filter = &peer->filter[afi][safi]; @@ -1339,27 +1370,43 @@ static enum filter_type bgp_output_filter(struct peer *peer, if (DISTRIBUTE_OUT_NAME(filter)) { FILTER_EXIST_WARN(DISTRIBUTE, distribute, filter); - if (access_list_apply(DISTRIBUTE_OUT(filter), p) == FILTER_DENY) - return FILTER_DENY; + if (access_list_apply(DISTRIBUTE_OUT(filter), p) + == FILTER_DENY) { + ret = FILTER_DENY; + goto done; + } } if (PREFIX_LIST_OUT_NAME(filter)) { FILTER_EXIST_WARN(PREFIX_LIST, prefix, filter); if (prefix_list_apply(PREFIX_LIST_OUT(filter), p) - == PREFIX_DENY) - return FILTER_DENY; + == PREFIX_DENY) { + ret = FILTER_DENY; + goto done; + } } if (FILTER_LIST_OUT_NAME(filter)) { FILTER_EXIST_WARN(FILTER_LIST, as, filter); if (as_list_apply(FILTER_LIST_OUT(filter), attr->aspath) - == AS_FILTER_DENY) - return FILTER_DENY; + == AS_FILTER_DENY) { + ret = FILTER_DENY; + goto done; + } + } + + if (frrtrace_enabled(frr_bgp, output_filter)) { + char pfxprint[PREFIX2STR_BUFFER]; + + prefix2str(p, pfxprint, sizeof(pfxprint)); + frrtrace(5, frr_bgp, output_filter, peer, pfxprint, afi, safi, + ret == FILTER_PERMIT ? "permit" : "deny"); } - return FILTER_PERMIT; +done: + return ret; #undef FILTER_EXIST_WARN } @@ -1613,6 +1660,33 @@ void bgp_attr_add_gshut_community(struct attr *attr) } +/* Notify BGP Conditional advertisement scanner process. */ +void bgp_notify_conditional_adv_scanner(struct update_subgroup *subgrp) +{ + struct peer *temp_peer; + struct peer *peer = SUBGRP_PEER(subgrp); + struct listnode *temp_node, *temp_nnode = NULL; + afi_t afi = SUBGRP_AFI(subgrp); + safi_t safi = SUBGRP_SAFI(subgrp); + struct bgp *bgp = SUBGRP_INST(subgrp); + struct bgp_filter *filter = &peer->filter[afi][safi]; + + if (!ADVERTISE_MAP_NAME(filter)) + return; + + for (ALL_LIST_ELEMENTS(bgp->peer, temp_node, temp_nnode, temp_peer)) { + if (!CHECK_FLAG(peer->flags, PEER_FLAG_CONFIG_NODE)) + continue; + + if (peer != temp_peer) + continue; + + temp_peer->advmap_table_change = true; + break; + } +} + + static void subgroup_announce_reset_nhop(uint8_t family, struct attr *attr) { if (family == AF_INET) { @@ -1627,7 +1701,8 @@ static void subgroup_announce_reset_nhop(uint8_t family, struct attr *attr) bool subgroup_announce_check(struct bgp_dest *dest, struct bgp_path_info *pi, struct update_subgroup *subgrp, - const struct prefix *p, struct attr *attr) + const struct prefix *p, struct attr *attr, + bool skip_rmap_check) { struct bgp_filter *filter; struct peer *from; @@ -1704,10 +1779,8 @@ bool subgroup_announce_check(struct bgp_dest *dest, struct bgp_path_info *pi, } /* Aggregate-address suppress check. */ - if (pi->extra && pi->extra->suppress) - if (!UNSUPPRESS_MAP_NAME(filter)) { - return false; - } + if (bgp_path_suppressed(pi) && !UNSUPPRESS_MAP_NAME(filter)) + return false; /* * If we are doing VRF 2 VRF leaking via the import @@ -1944,7 +2017,8 @@ bool subgroup_announce_check(struct bgp_dest *dest, struct bgp_path_info *pi, bgp_peer_as_override(bgp, afi, safi, peer, attr); /* Route map & unsuppress-map apply. */ - if (ROUTE_MAP_OUT_NAME(filter) || (pi->extra && pi->extra->suppress)) { + if (!skip_rmap_check + && (ROUTE_MAP_OUT_NAME(filter) || bgp_path_suppressed(pi))) { struct bgp_path_info rmap_path = {0}; struct bgp_path_info_extra dummy_rmap_path_extra = {0}; struct attr dummy_attr = {0}; @@ -1969,7 +2043,7 @@ bool subgroup_announce_check(struct bgp_dest *dest, struct bgp_path_info *pi, SET_FLAG(peer->rmap_type, PEER_RMAP_TYPE_OUT); - if (pi->extra && pi->extra->suppress) + if (bgp_path_suppressed(pi)) ret = route_map_apply(UNSUPPRESS_MAP(filter), p, RMAP_BGP, &rmap_path); else @@ -2442,7 +2516,8 @@ void subgroup_process_announce_selected(struct update_subgroup *subgrp, /* Announcement to the subgroup. If the route is filtered withdraw it. */ if (selected) { - if (subgroup_announce_check(dest, selected, subgrp, p, &attr)) + if (subgroup_announce_check(dest, selected, subgrp, p, &attr, + false)) bgp_adj_out_set_subgroup(dest, subgrp, &attr, selected); else bgp_adj_out_unset_subgroup(dest, subgrp, 1, @@ -3426,6 +3501,14 @@ int bgp_update(struct peer *peer, const struct prefix *p, uint32_t addpath_id, uint8_t pi_type = 0; uint8_t pi_sub_type = 0; + if (frrtrace_enabled(frr_bgp, process_update)) { + char pfxprint[PREFIX2STR_BUFFER]; + + prefix2str(p, pfxprint, sizeof(pfxprint)); + frrtrace(6, frr_bgp, process_update, peer, pfxprint, addpath_id, + afi, safi, attr); + } + #ifdef ENABLE_BGP_VNC int vnc_implicit_withdraw = 0; #endif @@ -4283,7 +4366,7 @@ void bgp_stop_announce_route_timer(struct peer_af *paf) if (!paf->t_announce_route) return; - THREAD_TIMER_OFF(paf->t_announce_route); + thread_cancel(&paf->t_announce_route); } /* @@ -4307,6 +4390,10 @@ static int bgp_announce_route_timer_expired(struct thread *t) return 0; peer_af_announce_route(paf, 1); + + /* Notify BGP conditional advertisement scanner percess */ + peer->advmap_config_change[paf->afi][paf->safi] = true; + return 0; } @@ -5534,28 +5621,16 @@ static void bgp_static_update_safi(struct bgp *bgp, const struct prefix *p, /* Configure static BGP network. When user don't run zebra, static route should be installed as valid. */ -static int bgp_static_set(struct vty *vty, const char *negate, - const char *ip_str, afi_t afi, safi_t safi, - const char *rmap, int backdoor, uint32_t label_index) +int bgp_static_set(struct bgp *bgp, const char *negate, struct prefix *pfx, + afi_t afi, safi_t safi, const char *rmap, int backdoor, + uint32_t label_index, char *errmsg, size_t errmsg_len) { - VTY_DECLVAR_CONTEXT(bgp, bgp); - int ret; struct prefix p; struct bgp_static *bgp_static; struct bgp_dest *dest; uint8_t need_update = 0; - /* Convert IP prefix string to struct prefix. */ - ret = str2prefix(ip_str, &p); - if (!ret) { - vty_out(vty, "%% Malformed prefix\n"); - return CMD_WARNING_CONFIG_FAILED; - } - if (afi == AFI_IP6 && IN6_IS_ADDR_LINKLOCAL(&p.u.prefix6)) { - vty_out(vty, "%% Malformed prefix (link-local address)\n"); - return CMD_WARNING_CONFIG_FAILED; - } - + prefix_copy(&p, pfx); apply_mask(&p); if (negate) { @@ -5564,24 +5639,25 @@ static int bgp_static_set(struct vty *vty, const char *negate, dest = bgp_node_lookup(bgp->route[afi][safi], &p); if (!dest) { - vty_out(vty, "%% Can't find static route specified\n"); - return CMD_WARNING_CONFIG_FAILED; + snprintf(errmsg, errmsg_len, + "Can't find static route specified\n"); + return -1; } bgp_static = bgp_dest_get_bgp_static_info(dest); if ((label_index != BGP_INVALID_LABEL_INDEX) && (label_index != bgp_static->label_index)) { - vty_out(vty, - "%% label-index doesn't match static route\n"); - return CMD_WARNING_CONFIG_FAILED; + snprintf(errmsg, errmsg_len, + "label-index doesn't match static route\n"); + return -1; } if ((rmap && bgp_static->rmap.name) && strcmp(rmap, bgp_static->rmap.name)) { - vty_out(vty, - "%% route-map name doesn't match static route\n"); - return CMD_WARNING_CONFIG_FAILED; + snprintf(errmsg, errmsg_len, + "route-map name doesn't match static route\n"); + return -1; } /* Update BGP RIB. */ @@ -5602,8 +5678,9 @@ static int bgp_static_set(struct vty *vty, const char *negate, /* Configuration change. */ /* Label index cannot be changed. */ if (bgp_static->label_index != label_index) { - vty_out(vty, "%% cannot change label-index\n"); - return CMD_WARNING_CONFIG_FAILED; + snprintf(errmsg, errmsg_len, + "cannot change label-index\n"); + return -1; } /* Check previous routes are installed into BGP. */ @@ -5665,7 +5742,7 @@ static int bgp_static_set(struct vty *vty, const char *negate, bgp_static_update(bgp, &p, bgp_static, afi, safi); } - return CMD_SUCCESS; + return 0; } void bgp_static_add(struct bgp *bgp) @@ -5741,9 +5818,9 @@ void bgp_static_delete(struct bgp *bgp) bgp_dest_get_prefix( dest)); bgp_static_free(bgp_static); - bgp_dest_set_bgp_static_info(dest, + bgp_dest_set_bgp_static_info(rm, NULL); - bgp_dest_unlock_node(dest); + bgp_dest_unlock_node(rm); } } else { bgp_static = bgp_dest_get_bgp_static_info(dest); @@ -6115,25 +6192,27 @@ DEFUN (no_bgp_table_map, argv[idx_word]->arg); } -DEFPY(bgp_network, - bgp_network_cmd, - "[no] network \ - <A.B.C.D/M$prefix|A.B.C.D$address [mask A.B.C.D$netmask]> \ - [{route-map WORD$map_name|label-index (0-1048560)$label_index| \ - backdoor$backdoor}]", - NO_STR - "Specify a network to announce via BGP\n" - "IPv4 prefix\n" - "Network number\n" - "Network mask\n" - "Network mask\n" - "Route-map to modify the attributes\n" - "Name of the route map\n" - "Label index to associate with the prefix\n" - "Label index value\n" - "Specify a BGP backdoor route\n") -{ - char addr_prefix_str[BUFSIZ]; +DEFPY_YANG (bgp_network, bgp_network_cmd, + "[no] network \ + <A.B.C.D/M$prefix|A.B.C.D$address [mask A.B.C.D$netmask]> \ + [{route-map WORD$map_name|label-index (0-1048560)$label_index| \ + backdoor$backdoor}]", + NO_STR + "Specify a network to announce via BGP\n" + "IPv4 prefix\n" + "Network number\n" + "Network mask\n" + "Network mask\n" + "Route-map to modify the attributes\n" + "Name of the route map\n" + "Label index to associate with the prefix\n" + "Label index value\n" + "Specify a BGP backdoor route\n") +{ + char addr_prefix_str[PREFIX_STRLEN]; + char base_xpath[XPATH_MAXLEN]; + afi_t afi; + safi_t safi; if (address_str) { int ret; @@ -6146,27 +6225,102 @@ DEFPY(bgp_network, } } - return bgp_static_set( - vty, no, address_str ? addr_prefix_str : prefix_str, AFI_IP, - bgp_node_safi(vty), map_name, backdoor ? 1 : 0, - label_index ? (uint32_t)label_index : BGP_INVALID_LABEL_INDEX); + afi = bgp_node_afi(vty); + safi = bgp_node_safi(vty); + + if (no) { + nb_cli_enqueue_change(vty, ".", NB_OP_DESTROY, NULL); + } else { + nb_cli_enqueue_change(vty, ".", NB_OP_CREATE, NULL); + + if (map_name) + nb_cli_enqueue_change(vty, "./rmap-policy-export", + NB_OP_CREATE, map_name); + else + nb_cli_enqueue_change(vty, "./rmap-policy-export", + NB_OP_DESTROY, NULL); + + if (label_index_str) + nb_cli_enqueue_change(vty, "./label-index", + NB_OP_MODIFY, label_index_str); + + nb_cli_enqueue_change(vty, "./backdoor", NB_OP_MODIFY, + backdoor ? "true" : "false"); + } + + snprintf( + base_xpath, sizeof(base_xpath), + "./global/afi-safis/afi-safi[afi-safi-name='%s']/%s/network-config[prefix='%s']", + yang_afi_safi_value2identity(afi, safi), + bgp_afi_safi_get_container_str(afi, safi), + address_str ? addr_prefix_str : prefix_str); + + return nb_cli_apply_changes(vty, base_xpath); } -DEFPY(ipv6_bgp_network, - ipv6_bgp_network_cmd, - "[no] network X:X::X:X/M$prefix \ - [{route-map WORD$map_name|label-index (0-1048560)$label_index}]", - NO_STR - "Specify a network to announce via BGP\n" - "IPv6 prefix\n" - "Route-map to modify the attributes\n" - "Name of the route map\n" - "Label index to associate with the prefix\n" - "Label index value\n") +DEFPY_YANG (ipv6_bgp_network, + ipv6_bgp_network_cmd, + "[no] network X:X::X:X/M$prefix \ + [{route-map WORD$map_name|label-index (0-1048560)$label_index}]", + NO_STR + "Specify a network to announce via BGP\n" + "IPv6 prefix\n" + "Route-map to modify the attributes\n" + "Name of the route map\n" + "Label index to associate with the prefix\n" + "Label index value\n") +{ + char base_xpath[XPATH_MAXLEN]; + afi_t afi; + safi_t safi; + + afi = bgp_node_afi(vty); + safi = bgp_node_safi(vty); + + if (no) { + nb_cli_enqueue_change(vty, ".", NB_OP_DESTROY, NULL); + } else { + nb_cli_enqueue_change(vty, ".", NB_OP_CREATE, NULL); + + if (map_name) + nb_cli_enqueue_change(vty, "./rmap-policy-export", + NB_OP_MODIFY, map_name); + else + nb_cli_enqueue_change(vty, "./rmap-policy-export", + NB_OP_DESTROY, NULL); + + if (label_index_str) + nb_cli_enqueue_change(vty, "./label-index", + NB_OP_MODIFY, label_index_str); + } + + snprintf( + base_xpath, sizeof(base_xpath), + "./global/afi-safis/afi-safi[afi-safi-name='%s']/%s/network-config[prefix='%s']", + yang_afi_safi_value2identity(afi, safi), + bgp_afi_safi_get_container_str(afi, safi), prefix_str); + + return nb_cli_apply_changes(vty, base_xpath); +} + +void cli_show_bgp_global_afi_safi_network_config(struct vty *vty, + struct lyd_node *dnode, + bool show_defaults) { - return bgp_static_set( - vty, no, prefix_str, AFI_IP6, bgp_node_safi(vty), map_name, 0, - label_index ? (uint32_t)label_index : BGP_INVALID_LABEL_INDEX); + vty_out(vty, " network %s", yang_dnode_get_string(dnode, "./prefix")); + + if (yang_dnode_exists(dnode, "./label-index")) + vty_out(vty, " label-index %s", + yang_dnode_get_string(dnode, "./label-index")); + + if (yang_dnode_exists(dnode, "./rmap-policy-export")) + vty_out(vty, " route-map %s", + yang_dnode_get_string(dnode, "./rmap-policy-export")); + + if (yang_dnode_get_bool(dnode, "./backdoor")) + vty_out(vty, " backdoor"); + + vty_out(vty, "\n"); } static struct bgp_aggregate *bgp_aggregate_new(void) @@ -6176,11 +6330,119 @@ static struct bgp_aggregate *bgp_aggregate_new(void) static void bgp_aggregate_free(struct bgp_aggregate *aggregate) { + XFREE(MTYPE_ROUTE_MAP_NAME, aggregate->suppress_map_name); + route_map_counter_decrement(aggregate->suppress_map); XFREE(MTYPE_ROUTE_MAP_NAME, aggregate->rmap.name); route_map_counter_decrement(aggregate->rmap.map); XFREE(MTYPE_BGP_AGGREGATE, aggregate); } +/** + * Helper function to avoid repeated code: prepare variables for a + * `route_map_apply` call. + * + * \returns `true` on route map match, otherwise `false`. + */ +static bool aggr_suppress_map_test(struct bgp *bgp, + struct bgp_aggregate *aggregate, + struct bgp_path_info *pi) +{ + const struct prefix *p = bgp_dest_get_prefix(pi->net); + route_map_result_t rmr = RMAP_DENYMATCH; + struct bgp_path_info rmap_path = {}; + struct attr attr = {}; + + /* No route map entries created, just don't match. */ + if (aggregate->suppress_map == NULL) + return false; + + /* Call route map matching and return result. */ + attr.aspath = aspath_empty(); + rmap_path.peer = bgp->peer_self; + rmap_path.attr = &attr; + + SET_FLAG(bgp->peer_self->rmap_type, PEER_RMAP_TYPE_AGGREGATE); + rmr = route_map_apply(aggregate->suppress_map, p, RMAP_BGP, &rmap_path); + bgp->peer_self->rmap_type = 0; + + bgp_attr_flush(&attr); + + return rmr == RMAP_PERMITMATCH; +} + +/** Test whether the aggregation has suppressed this path or not. */ +static bool aggr_suppress_exists(struct bgp_aggregate *aggregate, + struct bgp_path_info *pi) +{ + if (pi->extra == NULL || pi->extra->aggr_suppressors == NULL) + return false; + + return listnode_lookup(pi->extra->aggr_suppressors, aggregate) != NULL; +} + +/** + * Suppress this path and keep the reference. + * + * \returns `true` if needs processing otherwise `false`. + */ +static bool aggr_suppress_path(struct bgp_aggregate *aggregate, + struct bgp_path_info *pi) +{ + struct bgp_path_info_extra *pie; + + /* Path is already suppressed by this aggregation. */ + if (aggr_suppress_exists(aggregate, pi)) + return false; + + pie = bgp_path_info_extra_get(pi); + + /* This is the first suppression, allocate memory and list it. */ + if (pie->aggr_suppressors == NULL) + pie->aggr_suppressors = list_new(); + + listnode_add(pie->aggr_suppressors, aggregate); + + /* Only mark for processing if suppressed. */ + if (listcount(pie->aggr_suppressors) == 1) { + if (BGP_DEBUG(update, UPDATE_OUT)) + zlog_debug("aggregate-address suppressing: %pFX", + bgp_dest_get_prefix(pi->net)); + + bgp_path_info_set_flag(pi->net, pi, BGP_PATH_ATTR_CHANGED); + return true; + } + + return false; +} + +/** + * Unsuppress this path and remove the reference. + * + * \returns `true` if needs processing otherwise `false`. + */ +static bool aggr_unsuppress_path(struct bgp_aggregate *aggregate, + struct bgp_path_info *pi) +{ + /* Path wasn't suppressed. */ + if (!aggr_suppress_exists(aggregate, pi)) + return false; + + listnode_delete(pi->extra->aggr_suppressors, aggregate); + + /* Unsuppress and free extra memory if last item. */ + if (listcount(pi->extra->aggr_suppressors) == 0) { + if (BGP_DEBUG(update, UPDATE_OUT)) + zlog_debug("aggregate-address unsuppressing: %pFX", + bgp_dest_get_prefix(pi->net)); + + list_delete(&pi->extra->aggr_suppressors); + bgp_path_info_set_flag(pi->net, pi, BGP_PATH_ATTR_CHANGED); + return true; + } + + return false; +} + static bool bgp_aggregate_info_same(struct bgp_path_info *pi, uint8_t origin, struct aspath *aspath, struct community *comm, @@ -6375,13 +6637,11 @@ static bool bgp_aggregate_test_all_med(struct bgp_aggregate *aggregate, * Toggles the route suppression status for this aggregate address * configuration. */ -static void bgp_aggregate_toggle_suppressed(struct bgp_aggregate *aggregate, - struct bgp *bgp, - const struct prefix *p, afi_t afi, - safi_t safi, bool suppress) +void bgp_aggregate_toggle_suppressed(struct bgp_aggregate *aggregate, + struct bgp *bgp, const struct prefix *p, + afi_t afi, safi_t safi, bool suppress) { struct bgp_table *table = bgp->rib[afi][safi]; - struct bgp_path_info_extra *pie; const struct prefix *dest_p; struct bgp_dest *dest, *top; struct bgp_path_info *pi; @@ -6402,32 +6662,17 @@ static void bgp_aggregate_toggle_suppressed(struct bgp_aggregate *aggregate, if (pi->sub_type == BGP_ROUTE_AGGREGATE) continue; - /* - * On installation it is possible that pi->extra is - * set to NULL, otherwise it must exists. - */ - assert(!suppress && pi->extra != NULL); - /* We are toggling suppression back. */ if (suppress) { - pie = bgp_path_info_extra_get(pi); /* Suppress route if not suppressed already. */ - pie->suppress++; - bgp_path_info_set_flag(dest, pi, - BGP_PATH_ATTR_CHANGED); - toggle_suppression = true; + if (aggr_suppress_path(aggregate, pi)) + toggle_suppression = true; continue; } - pie = pi->extra; - assert(pie->suppress > 0); - pie->suppress--; /* Install route if there is no more suppression. */ - if (pie->suppress == 0) { - bgp_path_info_set_flag(dest, pi, - BGP_PATH_ATTR_CHANGED); + if (aggr_unsuppress_path(aggregate, pi)) toggle_suppression = true; - } } if (toggle_suppression) @@ -6514,6 +6759,17 @@ void bgp_aggregate_route(struct bgp *bgp, const struct prefix *p, afi_t afi, if (aggregate->match_med) bgp_aggregate_test_all_med(aggregate, bgp, p, afi, safi); + /* + * Reset aggregate count: we might've been called from route map + * update so in that case we must retest all more specific routes. + * + * \see `bgp_route_map_process_update`. + */ + aggregate->count = 0; + aggregate->incomplete_origin_count = 0; + aggregate->incomplete_origin_count = 0; + aggregate->egp_origin_count = 0; + /* ORIGIN attribute: If at least one route among routes that are aggregated has ORIGIN with the value INCOMPLETE, then the aggregated route must have the ORIGIN attribute with the value @@ -6558,10 +6814,24 @@ void bgp_aggregate_route(struct bgp *bgp, const struct prefix *p, afi_t afi, */ if (aggregate->summary_only && AGGREGATE_MED_VALID(aggregate)) { - (bgp_path_info_extra_get(pi))->suppress++; - bgp_path_info_set_flag(dest, pi, - BGP_PATH_ATTR_CHANGED); - match++; + if (aggr_suppress_path(aggregate, pi)) + match++; + } + + /* + * Suppress more specific routes that match the route + * map results. + * + * MED matching: + * Don't suppress routes if MED matching is enabled and + * it mismatched otherwise we might end up with no + * routes for this path. + */ + if (aggregate->suppress_map_name + && AGGREGATE_MED_VALID(aggregate) + && aggr_suppress_map_test(bgp, aggregate, pi)) { + if (aggr_suppress_path(aggregate, pi)) + match++; } aggregate->count++; @@ -6701,15 +6971,17 @@ void bgp_aggregate_delete(struct bgp *bgp, const struct prefix *p, afi_t afi, if (aggregate->summary_only && pi->extra && AGGREGATE_MED_VALID(aggregate)) { - pi->extra->suppress--; + if (aggr_unsuppress_path(aggregate, pi)) + match++; + } - if (pi->extra->suppress == 0) { - bgp_path_info_set_flag( - dest, pi, - BGP_PATH_ATTR_CHANGED); + if (aggregate->suppress_map_name + && AGGREGATE_MED_VALID(aggregate) + && aggr_suppress_map_test(bgp, aggregate, pi)) { + if (aggr_unsuppress_path(aggregate, pi)) match++; - } } + aggregate->count--; if (pi->attr->origin == BGP_ORIGIN_INCOMPLETE) @@ -6800,7 +7072,11 @@ static void bgp_add_route_to_aggregate(struct bgp *bgp, pinew, true); if (aggregate->summary_only && AGGREGATE_MED_VALID(aggregate)) - (bgp_path_info_extra_get(pinew))->suppress++; + aggr_suppress_path(aggregate, pinew); + + if (aggregate->suppress_map_name && AGGREGATE_MED_VALID(aggregate) + && aggr_suppress_map_test(bgp, aggregate, pinew)) + aggr_suppress_path(aggregate, pinew); switch (pinew->attr->origin) { case BGP_ORIGIN_INCOMPLETE: @@ -6896,19 +7172,17 @@ static void bgp_remove_route_from_aggregate(struct bgp *bgp, afi_t afi, if (pi->sub_type == BGP_ROUTE_AGGREGATE) return; - if (aggregate->summary_only && pi->extra && pi->extra->suppress > 0 - && AGGREGATE_MED_VALID(aggregate)) { - pi->extra->suppress--; + if (aggregate->summary_only && AGGREGATE_MED_VALID(aggregate)) + if (aggr_unsuppress_path(aggregate, pi)) + match++; - if (pi->extra->suppress == 0) { - bgp_path_info_set_flag(pi->net, pi, - BGP_PATH_ATTR_CHANGED); + if (aggregate->suppress_map_name && AGGREGATE_MED_VALID(aggregate) + && aggr_suppress_map_test(bgp, aggregate, pi)) + if (aggr_unsuppress_path(aggregate, pi)) match++; - } - } /* - * This must be called after `summary` check to avoid + * This must be called after `summary`, `suppress-map` check to avoid * "unsuppressing" twice. */ if (aggregate->match_med) @@ -7076,35 +7350,25 @@ static const char *bgp_origin2str(uint8_t origin) return "n/a"; } -static int bgp_aggregate_unset(struct vty *vty, const char *prefix_str, - afi_t afi, safi_t safi) +int bgp_aggregate_unset(struct bgp *bgp, struct prefix *prefix, afi_t afi, + safi_t safi, char *errmsg, size_t errmsg_len) { - VTY_DECLVAR_CONTEXT(bgp, bgp); - int ret; - struct prefix p; struct bgp_dest *dest; struct bgp_aggregate *aggregate; - /* Convert string to prefix structure. */ - ret = str2prefix(prefix_str, &p); - if (!ret) { - vty_out(vty, "Malformed prefix\n"); - return CMD_WARNING_CONFIG_FAILED; - } - apply_mask(&p); - + apply_mask(prefix); /* Old configuration check. */ - dest = bgp_node_lookup(bgp->aggregate[afi][safi], &p); + dest = bgp_node_lookup(bgp->aggregate[afi][safi], prefix); if (!dest) { - vty_out(vty, - "%% There is no aggregate-address configuration.\n"); - return CMD_WARNING_CONFIG_FAILED; + snprintf(errmsg, errmsg_len, + "There is no aggregate-address configuration.\n"); + return -1; } aggregate = bgp_dest_get_bgp_aggregate_info(dest); - bgp_aggregate_delete(bgp, &p, afi, safi, aggregate); - bgp_aggregate_install(bgp, afi, safi, &p, 0, NULL, NULL, - NULL, NULL, 0, aggregate); + bgp_aggregate_delete(bgp, prefix, afi, safi, aggregate); + bgp_aggregate_install(bgp, afi, safi, prefix, 0, NULL, NULL, NULL, NULL, + 0, aggregate); /* Unlock aggregate address configuration. */ bgp_dest_set_bgp_aggregate_info(dest, NULL); @@ -7165,48 +7429,53 @@ static int bgp_aggregate_unset(struct vty *vty, const char *prefix_str, bgp_dest_unlock_node(dest); bgp_dest_unlock_node(dest); - return CMD_SUCCESS; + return 0; } -static int bgp_aggregate_set(struct vty *vty, const char *prefix_str, afi_t afi, - safi_t safi, const char *rmap, - uint8_t summary_only, uint8_t as_set, - uint8_t origin, bool match_med) +int bgp_aggregate_set(struct bgp *bgp, struct prefix *prefix, afi_t afi, + safi_t safi, const char *rmap, uint8_t summary_only, + uint8_t as_set, uint8_t origin, bool match_med, + const char *suppress_map, + char *errmsg, size_t errmsg_len) { - VTY_DECLVAR_CONTEXT(bgp, bgp); int ret; - struct prefix p; struct bgp_dest *dest; struct bgp_aggregate *aggregate; uint8_t as_set_new = as_set; + char buf[PREFIX2STR_BUFFER]; - /* Convert string to prefix structure. */ - ret = str2prefix(prefix_str, &p); - if (!ret) { - vty_out(vty, "Malformed prefix\n"); - return CMD_WARNING_CONFIG_FAILED; + if (suppress_map && summary_only) { + snprintf(errmsg, errmsg_len, + "'summary-only' and 'suppress-map' can't be used at the same time\n"); + return -1; } - apply_mask(&p); - if ((afi == AFI_IP && p.prefixlen == IPV4_MAX_BITLEN) || - (afi == AFI_IP6 && p.prefixlen == IPV6_MAX_BITLEN)) { - vty_out(vty, "Specified prefix: %s will not result in any useful aggregation, disallowing\n", - prefix_str); - return CMD_WARNING_CONFIG_FAILED; + apply_mask(prefix); + + if ((afi == AFI_IP && prefix->prefixlen == IPV4_MAX_BITLEN) + || (afi == AFI_IP6 && prefix->prefixlen == IPV6_MAX_BITLEN)) { + snprintf( + errmsg, errmsg_len, + "Specified prefix: %s will not result in any useful aggregation, disallowing\n", + prefix2str(prefix, buf, PREFIX_STRLEN)); + return -1; } /* Old configuration check. */ - dest = bgp_node_get(bgp->aggregate[afi][safi], &p); + dest = bgp_node_get(bgp->aggregate[afi][safi], prefix); aggregate = bgp_dest_get_bgp_aggregate_info(dest); if (aggregate) { - vty_out(vty, "There is already same aggregate network.\n"); + snprintf(errmsg, errmsg_len, + "There is already same aggregate network.\n"); /* try to remove the old entry */ - ret = bgp_aggregate_unset(vty, prefix_str, afi, safi); + ret = bgp_aggregate_unset(bgp, prefix, afi, safi, errmsg, + errmsg_len); if (ret) { - vty_out(vty, "Error deleting aggregate.\n"); + snprintf(errmsg, errmsg_len, + "Error deleting aggregate.\n"); bgp_dest_unlock_node(dest); - return CMD_WARNING_CONFIG_FAILED; + return -1; } } @@ -7229,7 +7498,8 @@ static int bgp_aggregate_set(struct vty *vty, const char *prefix_str, afi_t afi, zlog_warn( "%s: Ignoring as-set because `bgp reject-as-sets` is enabled.", __func__); - vty_out(vty, + snprintf( + errmsg, errmsg_len, "Ignoring as-set because `bgp reject-as-sets` is enabled.\n"); } } @@ -7251,39 +7521,55 @@ static int bgp_aggregate_set(struct vty *vty, const char *prefix_str, afi_t afi, aggregate->rmap.map = route_map_lookup_by_name(rmap); route_map_counter_increment(aggregate->rmap.map); } + + if (suppress_map) { + XFREE(MTYPE_ROUTE_MAP_NAME, aggregate->suppress_map_name); + route_map_counter_decrement(aggregate->suppress_map); + + aggregate->suppress_map_name = + XSTRDUP(MTYPE_ROUTE_MAP_NAME, suppress_map); + aggregate->suppress_map = + route_map_lookup_by_name(aggregate->suppress_map_name); + route_map_counter_increment(aggregate->suppress_map); + } + bgp_dest_set_bgp_aggregate_info(dest, aggregate); /* Aggregate address insert into BGP routing table. */ - bgp_aggregate_route(bgp, &p, afi, safi, aggregate); + bgp_aggregate_route(bgp, prefix, afi, safi, aggregate); - return CMD_SUCCESS; + return 0; } -DEFPY(aggregate_addressv4, aggregate_addressv4_cmd, - "[no] aggregate-address <A.B.C.D/M$prefix|A.B.C.D$addr A.B.C.D$mask> {" - "as-set$as_set_s" - "|summary-only$summary_only" - "|route-map WORD$rmap_name" - "|origin <egp|igp|incomplete>$origin_s" - "|matching-MED-only$match_med" - "}", - NO_STR - "Configure BGP aggregate entries\n" - "Aggregate prefix\n" "Aggregate address\n" "Aggregate mask\n" - "Generate AS set path information\n" - "Filter more specific routes from updates\n" - "Apply route map to aggregate network\n" - "Route map name\n" - "BGP origin code\n" - "Remote EGP\n" - "Local IGP\n" - "Unknown heritage\n" - "Only aggregate routes with matching MED\n") -{ - const char *prefix_s = NULL; +DEFPY_YANG( + aggregate_addressv4, aggregate_addressv4_cmd, + "[no] aggregate-address <A.B.C.D/M$prefix|A.B.C.D$addr A.B.C.D$mask> {" + "as-set$as_set_s" + "|summary-only$summary_only" + "|route-map WORD$rmap_name" + "|origin <egp|igp|incomplete>$origin_s" + "|matching-MED-only$match_med" + "|suppress-map WORD$suppress_map" + "}", + NO_STR + "Configure BGP aggregate entries\n" + "Aggregate prefix\n" + "Aggregate address\n" + "Aggregate mask\n" + "Generate AS set path information\n" + "Filter more specific routes from updates\n" + "Apply route map to aggregate network\n" + "Route map name\n" + "BGP origin code\n" + "Remote EGP\n" + "Local IGP\n" + "Unknown heritage\n" + "Only aggregate routes with matching MED\n" + "Suppress the selected more specific routes\n" + "Route map with the route selectors\n") +{ + char base_xpath[XPATH_MAXLEN]; safi_t safi = bgp_node_safi(vty); - uint8_t origin = BGP_ORIGIN_UNSPECIFIED; - int as_set = AGGREGATE_AS_UNSET; char prefix_buf[PREFIX2STR_BUFFER]; if (addr_str) { @@ -7292,75 +7578,158 @@ DEFPY(aggregate_addressv4, aggregate_addressv4_cmd, vty_out(vty, "%% Inconsistent address and mask\n"); return CMD_WARNING_CONFIG_FAILED; } - prefix_s = prefix_buf; - } else - prefix_s = prefix_str; - - if (origin_s) { - if (strcmp(origin_s, "egp") == 0) - origin = BGP_ORIGIN_EGP; - else if (strcmp(origin_s, "igp") == 0) - origin = BGP_ORIGIN_IGP; - else if (strcmp(origin_s, "incomplete") == 0) - origin = BGP_ORIGIN_INCOMPLETE; + } else { + strlcpy(prefix_buf, prefix_str, sizeof(prefix_buf)); } - if (as_set_s) - as_set = AGGREGATE_AS_SET; + if (!no && origin_s) + nb_cli_enqueue_change(vty, "./origin", NB_OP_MODIFY, origin_s); + + if (!no && as_set_s) + nb_cli_enqueue_change(vty, "./as-set", NB_OP_MODIFY, "true"); + else + nb_cli_enqueue_change(vty, "./as-set", NB_OP_MODIFY, "false"); + + if (!no && summary_only) + nb_cli_enqueue_change(vty, "./summary-only", NB_OP_MODIFY, + "true"); + else + nb_cli_enqueue_change(vty, "./summary-only", NB_OP_MODIFY, + "false"); + + if (!no && match_med) + nb_cli_enqueue_change(vty, "./match-med", NB_OP_MODIFY, "true"); + else + nb_cli_enqueue_change(vty, "./match-med", NB_OP_MODIFY, + "false"); + + if (rmap_name) + nb_cli_enqueue_change(vty, "./rmap-policy-export", NB_OP_MODIFY, + rmap_name); + else + nb_cli_enqueue_change(vty, "./rmap-policy-export", + NB_OP_DESTROY, NULL); + + if (suppress_map) + nb_cli_enqueue_change(vty, "./suppress-map", NB_OP_MODIFY, + suppress_map); + else + nb_cli_enqueue_change(vty, "./suppress-map", NB_OP_DESTROY, + NULL); + + snprintf( + base_xpath, sizeof(base_xpath), + "./global/afi-safis/afi-safi[afi-safi-name='%s']/%s/aggregate-route[prefix='%s']", + yang_afi_safi_value2identity(AFI_IP, safi), + bgp_afi_safi_get_container_str(AFI_IP, safi), prefix_buf); - /* Handle configuration removal, otherwise installation. */ if (no) - return bgp_aggregate_unset(vty, prefix_s, AFI_IP, safi); - - return bgp_aggregate_set(vty, prefix_s, AFI_IP, safi, rmap_name, - summary_only != NULL, as_set, origin, - match_med != NULL); -} - -DEFPY(aggregate_addressv6, aggregate_addressv6_cmd, - "[no] aggregate-address X:X::X:X/M$prefix {" - "as-set$as_set_s" - "|summary-only$summary_only" - "|route-map WORD$rmap_name" - "|origin <egp|igp|incomplete>$origin_s" - "|matching-MED-only$match_med" - "}", - NO_STR - "Configure BGP aggregate entries\n" - "Aggregate prefix\n" - "Generate AS set path information\n" - "Filter more specific routes from updates\n" - "Apply route map to aggregate network\n" - "Route map name\n" - "BGP origin code\n" - "Remote EGP\n" - "Local IGP\n" - "Unknown heritage\n" - "Only aggregate routes with matching MED\n") -{ - uint8_t origin = BGP_ORIGIN_UNSPECIFIED; - int as_set = AGGREGATE_AS_UNSET; - - if (origin_s) { - if (strcmp(origin_s, "egp") == 0) - origin = BGP_ORIGIN_EGP; - else if (strcmp(origin_s, "igp") == 0) - origin = BGP_ORIGIN_IGP; - else if (strcmp(origin_s, "incomplete") == 0) - origin = BGP_ORIGIN_INCOMPLETE; - } - - if (as_set_s) - as_set = AGGREGATE_AS_SET; - - /* Handle configuration removal, otherwise installation. */ + nb_cli_enqueue_change(vty, ".", NB_OP_DESTROY, NULL); + else + nb_cli_enqueue_change(vty, ".", NB_OP_CREATE, NULL); + + return nb_cli_apply_changes(vty, base_xpath); +} + +DEFPY_YANG(aggregate_addressv6, aggregate_addressv6_cmd, + "[no] aggregate-address X:X::X:X/M$prefix {" + "as-set$as_set_s" + "|summary-only$summary_only" + "|route-map WORD$rmap_name" + "|origin <egp|igp|incomplete>$origin_s" + "|matching-MED-only$match_med" + "|suppress-map WORD$suppress_map" + "}", + NO_STR + "Configure BGP aggregate entries\n" + "Aggregate prefix\n" + "Generate AS set path information\n" + "Filter more specific routes from updates\n" + "Apply route map to aggregate network\n" + "Route map name\n" + "BGP origin code\n" + "Remote EGP\n" + "Local IGP\n" + "Unknown heritage\n" + "Only aggregate routes with matching MED\n" + "Suppress the selected more specific routes\n" + "Route map with the route selectors\n") +{ + char base_xpath[XPATH_MAXLEN]; + safi_t safi = bgp_node_safi(vty); + + if (!no && origin_s) + nb_cli_enqueue_change(vty, "./origin", NB_OP_MODIFY, origin_s); + + if (!no && as_set_s) + nb_cli_enqueue_change(vty, "./as-set", NB_OP_MODIFY, "true"); + else + nb_cli_enqueue_change(vty, "./as-set", NB_OP_MODIFY, "false"); + + if (!no && summary_only) + nb_cli_enqueue_change(vty, "./summary-only", NB_OP_MODIFY, + "true"); + else + nb_cli_enqueue_change(vty, "./summary-only", NB_OP_MODIFY, + "false"); + + if (!no && match_med) + nb_cli_enqueue_change(vty, "./match-med", NB_OP_MODIFY, "true"); + else + nb_cli_enqueue_change(vty, "./match-med", NB_OP_MODIFY, + "false"); + + if (rmap_name) + nb_cli_enqueue_change(vty, "./rmap-policy-export", NB_OP_MODIFY, + rmap_name); + + if (suppress_map) + nb_cli_enqueue_change(vty, "./suppress-map", NB_OP_MODIFY, + suppress_map); + else + nb_cli_enqueue_change(vty, "./suppress-map", NB_OP_DESTROY, + NULL); + + snprintf( + base_xpath, sizeof(base_xpath), + "./global/afi-safis/afi-safi[afi-safi-name='%s']/%s/aggregate-route[prefix='%s']", + yang_afi_safi_value2identity(AFI_IP6, safi), + bgp_afi_safi_get_container_str(AFI_IP6, safi), prefix_str); + if (no) - return bgp_aggregate_unset(vty, prefix_str, AFI_IP6, - SAFI_UNICAST); + nb_cli_enqueue_change(vty, ".", NB_OP_DESTROY, NULL); + else + nb_cli_enqueue_change(vty, ".", NB_OP_CREATE, NULL); - return bgp_aggregate_set(vty, prefix_str, AFI_IP6, SAFI_UNICAST, - rmap_name, summary_only != NULL, as_set, - origin, match_med != NULL); + return nb_cli_apply_changes(vty, base_xpath); +} + +void cli_show_bgp_global_afi_safi_unicast_aggregate_route( + struct vty *vty, struct lyd_node *dnode, bool show_defaults) +{ + uint8_t origin; + + vty_out(vty, " aggregate-address %s", + yang_dnode_get_string(dnode, "./prefix")); + + if (yang_dnode_get_bool(dnode, "./as-set")) + vty_out(vty, " as-set"); + + if (yang_dnode_get_bool(dnode, "./summary-only")) + vty_out(vty, " summary-only"); + + if (yang_dnode_exists(dnode, "./rmap-policy-export")) + vty_out(vty, " route-map %s", + yang_dnode_get_string(dnode, "./rmap-policy-export")); + + origin = yang_dnode_get_enum(dnode, "./origin"); + if (origin != BGP_ORIGIN_UNSPECIFIED) + vty_out(vty, " origin %s", bgp_origin2str(origin)); + + if (yang_dnode_get_bool(dnode, "./match-med")) + vty_out(vty, " matching-MED-only"); + + vty_out(vty, "\n"); } /* Redistribute route treatment. */ @@ -7668,7 +8037,7 @@ static void route_vty_short_status_out(struct vty *vty, if (CHECK_FLAG(path->flags, BGP_PATH_STALE)) json_object_boolean_true_add(json_path, "stale"); - if (path->extra && path->extra->suppress) + if (path->extra && bgp_path_suppressed(path)) json_object_boolean_true_add(json_path, "suppressed"); if (CHECK_FLAG(path->flags, BGP_PATH_VALID) @@ -7705,7 +8074,7 @@ static void route_vty_short_status_out(struct vty *vty, vty_out(vty, "R"); else if (CHECK_FLAG(path->flags, BGP_PATH_STALE)) vty_out(vty, "S"); - else if (path->extra && path->extra->suppress) + else if (bgp_path_suppressed(path)) vty_out(vty, "s"); else if (CHECK_FLAG(path->flags, BGP_PATH_VALID) && !CHECK_FLAG(path->flags, BGP_PATH_HISTORY)) @@ -10433,7 +10802,7 @@ void route_vty_out_detail_header(struct vty *vty, struct bgp *bgp, count++; if (CHECK_FLAG(pi->flags, BGP_PATH_SELECTED)) { best = count; - if (pi->extra && pi->extra->suppress) + if (bgp_path_suppressed(pi)) suppress = 1; if (pi->attr->community == NULL) @@ -13190,28 +13559,21 @@ static void bgp_distance_free(struct bgp_distance *bdistance) XFREE(MTYPE_BGP_DISTANCE, bdistance); } -static int bgp_distance_set(struct vty *vty, const char *distance_str, - const char *ip_str, const char *access_list_str) +int bgp_distance_set(uint8_t distance, const char *ip_str, + const char *access_list_str, afi_t afi, safi_t safi, + char *errmsg, size_t errmsg_len) { int ret; - afi_t afi; - safi_t safi; struct prefix p; - uint8_t distance; struct bgp_dest *dest; struct bgp_distance *bdistance; - afi = bgp_node_afi(vty); - safi = bgp_node_safi(vty); - ret = str2prefix(ip_str, &p); if (ret == 0) { - vty_out(vty, "Malformed prefix\n"); + snprintf(errmsg, errmsg_len, "Malformed prefix\n"); return CMD_WARNING_CONFIG_FAILED; } - distance = atoi(distance_str); - /* Get BGP distance node. */ dest = bgp_node_get(bgp_distance_table[afi][safi], &p); bdistance = bgp_dest_get_bgp_distance_info(dest); @@ -13234,37 +13596,32 @@ static int bgp_distance_set(struct vty *vty, const char *distance_str, return CMD_SUCCESS; } -static int bgp_distance_unset(struct vty *vty, const char *distance_str, - const char *ip_str, const char *access_list_str) +int bgp_distance_unset(uint8_t distance, const char *ip_str, + const char *access_list_str, afi_t afi, safi_t safi, + char *errmsg, size_t errmsg_len) { int ret; - afi_t afi; - safi_t safi; struct prefix p; - int distance; struct bgp_dest *dest; struct bgp_distance *bdistance; - afi = bgp_node_afi(vty); - safi = bgp_node_safi(vty); - ret = str2prefix(ip_str, &p); if (ret == 0) { - vty_out(vty, "Malformed prefix\n"); + snprintf(errmsg, errmsg_len, "Malformed prefix\n"); return CMD_WARNING_CONFIG_FAILED; } dest = bgp_node_lookup(bgp_distance_table[afi][safi], &p); if (!dest) { - vty_out(vty, "Can't find specified prefix\n"); + snprintf(errmsg, errmsg_len, "Can't find specified prefix\n"); return CMD_WARNING_CONFIG_FAILED; } bdistance = bgp_dest_get_bgp_distance_info(dest); - distance = atoi(distance_str); if (bdistance->distance != distance) { - vty_out(vty, "Distance does not match configured\n"); + snprintf(errmsg, errmsg_len, + "Distance does not match configured\n"); return CMD_WARNING_CONFIG_FAILED; } @@ -13342,9 +13699,8 @@ uint8_t bgp_distance_apply(const struct prefix *p, struct bgp_path_info *pinfo, * we should tell ZEBRA update the routes for a specific * AFI/SAFI to reflect changes in RIB. */ -static void bgp_announce_routes_distance_update(struct bgp *bgp, - afi_t update_afi, - safi_t update_safi) +void bgp_announce_routes_distance_update(struct bgp *bgp, afi_t update_afi, + safi_t update_safi) { afi_t afi; safi_t safi; @@ -13364,237 +13720,227 @@ static void bgp_announce_routes_distance_update(struct bgp *bgp, } } -DEFUN (bgp_distance, - bgp_distance_cmd, - "distance bgp (1-255) (1-255) (1-255)", - "Define an administrative distance\n" - "BGP distance\n" - "Distance for routes external to the AS\n" - "Distance for routes internal to the AS\n" - "Distance for local routes\n") +DEFUN_YANG(bgp_distance, bgp_distance_cmd, + "distance bgp (1-255) (1-255) (1-255)", + "Define an administrative distance\n" + "BGP distance\n" + "Distance for routes external to the AS\n" + "Distance for routes internal to the AS\n" + "Distance for local routes\n") { - VTY_DECLVAR_CONTEXT(bgp, bgp); int idx_number = 2; int idx_number_2 = 3; int idx_number_3 = 4; - int distance_ebgp = atoi(argv[idx_number]->arg); - int distance_ibgp = atoi(argv[idx_number_2]->arg); - int distance_local = atoi(argv[idx_number_3]->arg); afi_t afi; safi_t safi; + char xpath[XPATH_MAXLEN]; afi = bgp_node_afi(vty); safi = bgp_node_safi(vty); - if (bgp->distance_ebgp[afi][safi] != distance_ebgp - || bgp->distance_ibgp[afi][safi] != distance_ibgp - || bgp->distance_local[afi][safi] != distance_local) { - bgp->distance_ebgp[afi][safi] = distance_ebgp; - bgp->distance_ibgp[afi][safi] = distance_ibgp; - bgp->distance_local[afi][safi] = distance_local; - bgp_announce_routes_distance_update(bgp, afi, safi); - } - return CMD_SUCCESS; -} - -DEFUN (no_bgp_distance, - no_bgp_distance_cmd, - "no distance bgp [(1-255) (1-255) (1-255)]", - NO_STR - "Define an administrative distance\n" - "BGP distance\n" - "Distance for routes external to the AS\n" - "Distance for routes internal to the AS\n" - "Distance for local routes\n") + snprintf( + xpath, sizeof(xpath), + "./global/afi-safis/afi-safi[afi-safi-name='%s']/%s/admin-distance/external", + yang_afi_safi_value2identity(afi, safi), + bgp_afi_safi_get_container_str(afi, safi)); + nb_cli_enqueue_change(vty, xpath, NB_OP_MODIFY, argv[idx_number]->arg); + snprintf( + xpath, sizeof(xpath), + "./global/afi-safis/afi-safi[afi-safi-name='%s']/%s/admin-distance/internal", + yang_afi_safi_value2identity(afi, safi), + bgp_afi_safi_get_container_str(afi, safi)); + nb_cli_enqueue_change(vty, xpath, NB_OP_MODIFY, + argv[idx_number_2]->arg); + snprintf( + xpath, sizeof(xpath), + "./global/afi-safis/afi-safi[afi-safi-name='%s']/%s/admin-distance/local", + yang_afi_safi_value2identity(afi, safi), + bgp_afi_safi_get_container_str(afi, safi)); + + nb_cli_enqueue_change(vty, xpath, NB_OP_MODIFY, + argv[idx_number_3]->arg); + + return nb_cli_apply_changes(vty, NULL); +} + +DEFUN_YANG(no_bgp_distance, no_bgp_distance_cmd, + "no distance bgp [(1-255) (1-255) (1-255)]", + NO_STR + "Define an administrative distance\n" + "BGP distance\n" + "Distance for routes external to the AS\n" + "Distance for routes internal to the AS\n" + "Distance for local routes\n") { - VTY_DECLVAR_CONTEXT(bgp, bgp); afi_t afi; safi_t safi; + char xpath[XPATH_MAXLEN]; afi = bgp_node_afi(vty); safi = bgp_node_safi(vty); - if (bgp->distance_ebgp[afi][safi] != 0 - || bgp->distance_ibgp[afi][safi] != 0 - || bgp->distance_local[afi][safi] != 0) { - bgp->distance_ebgp[afi][safi] = 0; - bgp->distance_ibgp[afi][safi] = 0; - bgp->distance_local[afi][safi] = 0; - bgp_announce_routes_distance_update(bgp, afi, safi); - } - return CMD_SUCCESS; -} + snprintf( + xpath, sizeof(xpath), + "./global/afi-safis/afi-safi[afi-safi-name='%s']/%s/admin-distance/external", + yang_afi_safi_value2identity(afi, safi), + bgp_afi_safi_get_container_str(afi, safi)); + nb_cli_enqueue_change(vty, xpath, NB_OP_MODIFY, NULL); + snprintf( + xpath, sizeof(xpath), + "./global/afi-safis/afi-safi[afi-safi-name='%s']/%s/admin-distance/internal", + yang_afi_safi_value2identity(afi, safi), + bgp_afi_safi_get_container_str(afi, safi)); + nb_cli_enqueue_change(vty, xpath, NB_OP_MODIFY, NULL); + snprintf( + xpath, sizeof(xpath), + "./global/afi-safis/afi-safi[afi-safi-name='%s']/%s/admin-distance/local", + yang_afi_safi_value2identity(afi, safi), + bgp_afi_safi_get_container_str(afi, safi)); + nb_cli_enqueue_change(vty, xpath, NB_OP_MODIFY, NULL); -DEFUN (bgp_distance_source, - bgp_distance_source_cmd, - "distance (1-255) A.B.C.D/M", - "Define an administrative distance\n" - "Administrative distance\n" - "IP source prefix\n") -{ - int idx_number = 1; - int idx_ipv4_prefixlen = 2; - bgp_distance_set(vty, argv[idx_number]->arg, - argv[idx_ipv4_prefixlen]->arg, NULL); - return CMD_SUCCESS; + return nb_cli_apply_changes(vty, NULL); } -DEFUN (no_bgp_distance_source, - no_bgp_distance_source_cmd, - "no distance (1-255) A.B.C.D/M", - NO_STR - "Define an administrative distance\n" - "Administrative distance\n" - "IP source prefix\n") +void cli_show_bgp_global_afi_safi_admin_distance_config(struct vty *vty, + struct lyd_node *dnode, + bool show_defaults) { - int idx_number = 2; - int idx_ipv4_prefixlen = 3; - bgp_distance_unset(vty, argv[idx_number]->arg, - argv[idx_ipv4_prefixlen]->arg, NULL); - return CMD_SUCCESS; -} + uint8_t distance_ebgp, distance_ibgp, distance_local; -DEFUN (bgp_distance_source_access_list, - bgp_distance_source_access_list_cmd, - "distance (1-255) A.B.C.D/M WORD", - "Define an administrative distance\n" - "Administrative distance\n" - "IP source prefix\n" - "Access list name\n") -{ - int idx_number = 1; - int idx_ipv4_prefixlen = 2; - int idx_word = 3; - bgp_distance_set(vty, argv[idx_number]->arg, - argv[idx_ipv4_prefixlen]->arg, argv[idx_word]->arg); - return CMD_SUCCESS; -} + distance_ebgp = yang_dnode_get_uint8(dnode, "./external"); + distance_ibgp = yang_dnode_get_uint8(dnode, "./internal"); + distance_local = yang_dnode_get_uint8(dnode, "./local"); -DEFUN (no_bgp_distance_source_access_list, - no_bgp_distance_source_access_list_cmd, - "no distance (1-255) A.B.C.D/M WORD", - NO_STR - "Define an administrative distance\n" - "Administrative distance\n" - "IP source prefix\n" - "Access list name\n") -{ - int idx_number = 2; - int idx_ipv4_prefixlen = 3; - int idx_word = 4; - bgp_distance_unset(vty, argv[idx_number]->arg, - argv[idx_ipv4_prefixlen]->arg, argv[idx_word]->arg); - return CMD_SUCCESS; + vty_out(vty, " distance bgp %d %d %d\n", distance_ebgp, distance_ibgp, + distance_local); } -DEFUN (ipv6_bgp_distance_source, - ipv6_bgp_distance_source_cmd, - "distance (1-255) X:X::X:X/M", - "Define an administrative distance\n" - "Administrative distance\n" - "IP source prefix\n") +DEFPY_YANG(bgp_distance_source, + bgp_distance_source_cmd, + "[no] distance (1-255) <A.B.C.D/M | X:X::X:X/M>$prefix [WORD$acl]", + NO_STR + "Define an administrative distance\n" + "Distance value\n" + "IP source prefix\n" + "Access list name\n") { - bgp_distance_set(vty, argv[1]->arg, argv[2]->arg, NULL); - return CMD_SUCCESS; -} + afi_t afi; + safi_t safi; + char xpath[XPATH_MAXLEN]; -DEFUN (no_ipv6_bgp_distance_source, - no_ipv6_bgp_distance_source_cmd, - "no distance (1-255) X:X::X:X/M", - NO_STR - "Define an administrative distance\n" - "Administrative distance\n" - "IP source prefix\n") -{ - bgp_distance_unset(vty, argv[2]->arg, argv[3]->arg, NULL); - return CMD_SUCCESS; -} + afi = bgp_node_afi(vty); + safi = bgp_node_safi(vty); -DEFUN (ipv6_bgp_distance_source_access_list, - ipv6_bgp_distance_source_access_list_cmd, - "distance (1-255) X:X::X:X/M WORD", - "Define an administrative distance\n" - "Administrative distance\n" - "IP source prefix\n" - "Access list name\n") -{ - bgp_distance_set(vty, argv[1]->arg, argv[2]->arg, argv[3]->arg); - return CMD_SUCCESS; + if (!no) { + nb_cli_enqueue_change(vty, ".", NB_OP_CREATE, NULL); + nb_cli_enqueue_change(vty, "./distance", NB_OP_MODIFY, + distance_str); + if (acl) + nb_cli_enqueue_change(vty, + "./access-list-policy-export", + NB_OP_CREATE, acl); + else + nb_cli_enqueue_change(vty, + "./access-list-policy-export", + NB_OP_DESTROY, NULL); + } else { + nb_cli_enqueue_change(vty, ".", NB_OP_DESTROY, NULL); + } + + snprintf( + xpath, sizeof(xpath), + "./global/afi-safis/afi-safi[afi-safi-name='%s']/%s/admin-distance-route[prefix='%s']", + yang_afi_safi_value2identity(afi, safi), + bgp_afi_safi_get_container_str(afi, safi), prefix_str); + + return nb_cli_apply_changes(vty, xpath); } -DEFUN (no_ipv6_bgp_distance_source_access_list, - no_ipv6_bgp_distance_source_access_list_cmd, - "no distance (1-255) X:X::X:X/M WORD", - NO_STR - "Define an administrative distance\n" - "Administrative distance\n" - "IP source prefix\n" - "Access list name\n") +void cli_show_bgp_global_afi_safi_unicast_admin_distance_route( + struct vty *vty, struct lyd_node *dnode, bool show_defaults) { - bgp_distance_unset(vty, argv[2]->arg, argv[3]->arg, argv[4]->arg); - return CMD_SUCCESS; + vty_out(vty, " distance %d %s %s\n", + yang_dnode_get_uint8(dnode, "./distance"), + yang_dnode_get_string(dnode, "./prefix"), + (yang_dnode_exists(dnode, "./access-list-policy-export")) + ? yang_dnode_get_string(dnode, + "./access-list-policy-export") + : ""); } -DEFUN (bgp_damp_set, - bgp_damp_set_cmd, - "bgp dampening [(1-45) [(1-20000) (1-20000) (1-255)]]", - "BGP Specific commands\n" - "Enable route-flap dampening\n" - "Half-life time for the penalty\n" - "Value to start reusing a route\n" - "Value to start suppressing a route\n" - "Maximum duration to suppress a stable route\n") +DEFPY_YANG(bgp_dampening, + bgp_dampening_cmd, + "[no] bgp dampening [(1-45)$halflife [(1-20000)$reuse (1-20000)$suppress (1-255)$max_supress]]", + NO_STR + "BGP Specific commands\n" + "Enable route-flap dampening\n" + "Half-life time for the penalty\n" + "Value to start reusing a route\n" + "Value to start suppressing a route\n" + "Maximum duration to suppress a stable route\n") { - VTY_DECLVAR_CONTEXT(bgp, bgp); - int idx_half_life = 2; - int idx_reuse = 3; - int idx_suppress = 4; - int idx_max_suppress = 5; - int half = DEFAULT_HALF_LIFE * 60; - int reuse = DEFAULT_REUSE; - int suppress = DEFAULT_SUPPRESS; - int max = 4 * half; + afi_t afi; + safi_t safi; + char xpath[XPATH_MAXLEN]; - if (argc == 6) { - half = atoi(argv[idx_half_life]->arg) * 60; - reuse = atoi(argv[idx_reuse]->arg); - suppress = atoi(argv[idx_suppress]->arg); - max = atoi(argv[idx_max_suppress]->arg) * 60; - } else if (argc == 3) { - half = atoi(argv[idx_half_life]->arg) * 60; - max = 4 * half; - } + afi = bgp_node_afi(vty); + safi = bgp_node_safi(vty); - /* - * These can't be 0 but our SA doesn't understand the - * way our cli is constructed - */ - assert(reuse); - assert(half); - if (suppress < reuse) { - vty_out(vty, - "Suppress value cannot be less than reuse value \n"); - return 0; + if (!no) { + nb_cli_enqueue_change(vty, "./enable", NB_OP_MODIFY, "true"); + if (argc == 6) { + nb_cli_enqueue_change(vty, "./reach-decay", + NB_OP_MODIFY, halflife_str); + nb_cli_enqueue_change(vty, "./reuse-above", + NB_OP_MODIFY, reuse_str); + nb_cli_enqueue_change(vty, "./suppress-above", + NB_OP_MODIFY, suppress_str); + nb_cli_enqueue_change(vty, "./unreach-decay", + NB_OP_MODIFY, max_supress_str); + } if (argc == 3) { + nb_cli_enqueue_change(vty, "./reach-decay", + NB_OP_MODIFY, halflife_str); + } + } else { + nb_cli_enqueue_change(vty, "./enable", NB_OP_MODIFY, "false"); } - return bgp_damp_enable(bgp, bgp_node_afi(vty), bgp_node_safi(vty), half, - reuse, suppress, max); + snprintf( + xpath, sizeof(xpath), + "./global/afi-safis/afi-safi[afi-safi-name='%s']/%s/route-flap-dampening", + yang_afi_safi_value2identity(afi, safi), + bgp_afi_safi_get_container_str(afi, safi)); + + return nb_cli_apply_changes(vty, xpath); } -DEFUN (bgp_damp_unset, - bgp_damp_unset_cmd, - "no bgp dampening [(1-45) [(1-20000) (1-20000) (1-255)]]", - NO_STR - "BGP Specific commands\n" - "Enable route-flap dampening\n" - "Half-life time for the penalty\n" - "Value to start reusing a route\n" - "Value to start suppressing a route\n" - "Maximum duration to suppress a stable route\n") +void cli_show_bgp_global_afi_safi_route_flap_dampening(struct vty *vty, + struct lyd_node *dnode, + bool show_defaults) { - VTY_DECLVAR_CONTEXT(bgp, bgp); - return bgp_damp_disable(bgp, bgp_node_afi(vty), bgp_node_safi(vty)); + if (!yang_dnode_get_bool(dnode, "./enable")) + return; + + int half = DEFAULT_HALF_LIFE * 60; + int reuse = DEFAULT_REUSE; + int suppress = DEFAULT_SUPPRESS; + int max; + + half = yang_dnode_get_uint8(dnode, "../reach-decay"); + reuse = yang_dnode_get_uint16(dnode, "../reuse-above"); + suppress = yang_dnode_get_uint16(dnode, "../suppress-above"); + max = yang_dnode_get_uint8(dnode, "../unreach-decay"); + + if (half == DEFAULT_HALF_LIFE * 60 && reuse == DEFAULT_REUSE + && suppress == DEFAULT_SUPPRESS && max == half * 4) + vty_out(vty, " bgp dampening\n"); + else if (half != DEFAULT_HALF_LIFE * 60 && reuse == DEFAULT_REUSE + && suppress == DEFAULT_SUPPRESS && max == half * 4) + vty_out(vty, " bgp dampening %u\n", half); + else + vty_out(vty, " bgp dampening %u %d %d %d\n", half, reuse, + suppress, max); } /* Display specified route of BGP table. */ @@ -13998,6 +14344,10 @@ void bgp_config_write_network(struct vty *vty, struct bgp *bgp, afi_t afi, if (bgp_aggregate->match_med) vty_out(vty, " matching-MED-only"); + if (bgp_aggregate->suppress_map_name) + vty_out(vty, " suppress-map %s", + bgp_aggregate->suppress_map_name); + vty_out(vty, "\n"); } } @@ -14120,54 +14470,27 @@ void bgp_route_init(void) install_element(BGP_NODE, &bgp_distance_cmd); install_element(BGP_NODE, &no_bgp_distance_cmd); install_element(BGP_NODE, &bgp_distance_source_cmd); - install_element(BGP_NODE, &no_bgp_distance_source_cmd); - install_element(BGP_NODE, &bgp_distance_source_access_list_cmd); - install_element(BGP_NODE, &no_bgp_distance_source_access_list_cmd); install_element(BGP_IPV4_NODE, &bgp_distance_cmd); install_element(BGP_IPV4_NODE, &no_bgp_distance_cmd); install_element(BGP_IPV4_NODE, &bgp_distance_source_cmd); - install_element(BGP_IPV4_NODE, &no_bgp_distance_source_cmd); - install_element(BGP_IPV4_NODE, &bgp_distance_source_access_list_cmd); - install_element(BGP_IPV4_NODE, &no_bgp_distance_source_access_list_cmd); install_element(BGP_IPV4M_NODE, &bgp_distance_cmd); install_element(BGP_IPV4M_NODE, &no_bgp_distance_cmd); install_element(BGP_IPV4M_NODE, &bgp_distance_source_cmd); - install_element(BGP_IPV4M_NODE, &no_bgp_distance_source_cmd); - install_element(BGP_IPV4M_NODE, &bgp_distance_source_access_list_cmd); - install_element(BGP_IPV4M_NODE, - &no_bgp_distance_source_access_list_cmd); install_element(BGP_IPV6_NODE, &bgp_distance_cmd); install_element(BGP_IPV6_NODE, &no_bgp_distance_cmd); - install_element(BGP_IPV6_NODE, &ipv6_bgp_distance_source_cmd); - install_element(BGP_IPV6_NODE, &no_ipv6_bgp_distance_source_cmd); - install_element(BGP_IPV6_NODE, - &ipv6_bgp_distance_source_access_list_cmd); - install_element(BGP_IPV6_NODE, - &no_ipv6_bgp_distance_source_access_list_cmd); + install_element(BGP_IPV6_NODE, &bgp_distance_source_cmd); install_element(BGP_IPV6M_NODE, &bgp_distance_cmd); install_element(BGP_IPV6M_NODE, &no_bgp_distance_cmd); - install_element(BGP_IPV6M_NODE, &ipv6_bgp_distance_source_cmd); - install_element(BGP_IPV6M_NODE, &no_ipv6_bgp_distance_source_cmd); - install_element(BGP_IPV6M_NODE, - &ipv6_bgp_distance_source_access_list_cmd); - install_element(BGP_IPV6M_NODE, - &no_ipv6_bgp_distance_source_access_list_cmd); + install_element(BGP_IPV6M_NODE, &bgp_distance_source_cmd); /* BGP dampening */ - install_element(BGP_NODE, &bgp_damp_set_cmd); - install_element(BGP_NODE, &bgp_damp_unset_cmd); - install_element(BGP_IPV4_NODE, &bgp_damp_set_cmd); - install_element(BGP_IPV4_NODE, &bgp_damp_unset_cmd); - install_element(BGP_IPV4M_NODE, &bgp_damp_set_cmd); - install_element(BGP_IPV4M_NODE, &bgp_damp_unset_cmd); - install_element(BGP_IPV4L_NODE, &bgp_damp_set_cmd); - install_element(BGP_IPV4L_NODE, &bgp_damp_unset_cmd); - install_element(BGP_IPV6_NODE, &bgp_damp_set_cmd); - install_element(BGP_IPV6_NODE, &bgp_damp_unset_cmd); - install_element(BGP_IPV6M_NODE, &bgp_damp_set_cmd); - install_element(BGP_IPV6M_NODE, &bgp_damp_unset_cmd); - install_element(BGP_IPV6L_NODE, &bgp_damp_set_cmd); - install_element(BGP_IPV6L_NODE, &bgp_damp_unset_cmd); + install_element(BGP_NODE, &bgp_dampening_cmd); + install_element(BGP_IPV4_NODE, &bgp_dampening_cmd); + install_element(BGP_IPV4M_NODE, &bgp_dampening_cmd); + install_element(BGP_IPV4L_NODE, &bgp_dampening_cmd); + install_element(BGP_IPV6_NODE, &bgp_dampening_cmd); + install_element(BGP_IPV6M_NODE, &bgp_dampening_cmd); + install_element(BGP_IPV6L_NODE, &bgp_dampening_cmd); /* Large Communities */ install_element(VIEW_NODE, &show_ip_bgp_large_community_list_cmd); diff --git a/bgpd/bgp_route.h b/bgpd/bgp_route.h index 09a0402099..43744044b4 100644 --- a/bgpd/bgp_route.h +++ b/bgpd/bgp_route.h @@ -110,8 +110,8 @@ struct bgp_path_info_extra { /* Pointer to dampening structure. */ struct bgp_damp_info *damp_info; - /* This route is suppressed with aggregation. */ - int suppress; + /** List of aggregations that suppress this path. */ + struct list *aggr_suppressors; /* Nexthop reachability check. */ uint32_t igpmetric; @@ -398,6 +398,11 @@ struct bgp_aggregate { #define AGGREGATE_MED_VALID(aggregate) \ (((aggregate)->match_med && !(aggregate)->med_mismatched) \ || !(aggregate)->match_med) + + /** Suppress map route map name (`NULL` when disabled). */ + char *suppress_map_name; + /** Suppress map route map pointer. */ + struct route_map *suppress_map; }; #define BGP_NEXTHOP_AFI_FROM_NHLEN(nhlen) \ @@ -449,6 +454,14 @@ struct bgp_aggregate { #define UNSUPPRESS_MAP_NAME(F) ((F)->usmap.name) #define UNSUPPRESS_MAP(F) ((F)->usmap.map) +#define ADVERTISE_MAP_NAME(F) ((F)->advmap.aname) +#define ADVERTISE_MAP(F) ((F)->advmap.amap) + +#define ADVERTISE_CONDITION(F) ((F)->advmap.condition) + +#define CONDITION_MAP_NAME(F) ((F)->advmap.cname) +#define CONDITION_MAP(F) ((F)->advmap.cmap) + /* path PREFIX (addpath rxid NUMBER) */ #define PATH_ADDPATH_STR_BUFFER PREFIX2STR_BUFFER + 32 @@ -658,6 +671,8 @@ extern void route_vty_out_overlay(struct vty *vty, const struct prefix *p, struct bgp_path_info *path, int display, json_object *json); +extern void bgp_notify_conditional_adv_scanner(struct update_subgroup *subgrp); + extern void subgroup_process_announce_selected(struct update_subgroup *subgrp, struct bgp_path_info *selected, struct bgp_dest *dest, @@ -666,7 +681,8 @@ extern void subgroup_process_announce_selected(struct update_subgroup *subgrp, extern bool subgroup_announce_check(struct bgp_dest *dest, struct bgp_path_info *pi, struct update_subgroup *subgrp, - const struct prefix *p, struct attr *attr); + const struct prefix *p, struct attr *attr, + bool skip_rmap_check); extern void bgp_peer_clear_node_queue_drain_immediate(struct peer *peer); extern void bgp_process_queues_drain_immediate(void); @@ -710,4 +726,36 @@ extern bool bgp_update_martian_nexthop(struct bgp *bgp, afi_t afi, safi_t safi, struct attr *attr, struct bgp_dest *dest); extern int bgp_evpn_path_info_cmp(struct bgp *bgp, struct bgp_path_info *new, struct bgp_path_info *exist, int *paths_eq); +extern void bgp_aggregate_toggle_suppressed(struct bgp_aggregate *aggregate, + struct bgp *bgp, + const struct prefix *p, afi_t afi, + safi_t safi, bool suppress); +extern int bgp_static_set(struct bgp *bgp, const char *negate, + struct prefix *pfx, afi_t afi, safi_t safi, + const char *rmap, int backdoor, uint32_t label_index, + char *errmsg, size_t errmsg_len); + +extern int bgp_aggregate_set(struct bgp *bgp, struct prefix *prefix, afi_t afi, + safi_t safi, const char *rmap, + uint8_t summary_only, uint8_t as_set, + uint8_t origin, bool match_med, + const char *suppress_map, char *errmsg, + size_t errmsg_len); + +extern int bgp_aggregate_unset(struct bgp *bgp, struct prefix *prefix, + afi_t afi, safi_t safi, char *errmsg, + size_t errmsg_len); + +extern void bgp_announce_routes_distance_update(struct bgp *bgp, + afi_t update_afi, + safi_t update_safi); + +extern int bgp_distance_set(uint8_t distance, const char *ip_str, + const char *access_list_str, afi_t afi, safi_t safi, + char *errmsg, size_t errmsg_len); + +extern int bgp_distance_unset(uint8_t distance, const char *ip_str, + const char *access_list_str, afi_t afi, + safi_t safi, char *errmsg, size_t errmsg_len); + #endif /* _QUAGGA_BGP_ROUTE_H */ diff --git a/bgpd/bgp_routemap.c b/bgpd/bgp_routemap.c index 0e26576c1b..e4a9c29000 100644 --- a/bgpd/bgp_routemap.c +++ b/bgpd/bgp_routemap.c @@ -3695,9 +3695,22 @@ static void bgp_route_map_process_peer(const char *rmap_name, if (filter->usmap.name && (strcmp(rmap_name, filter->usmap.name) == 0)) filter->usmap.map = map; + if (filter->advmap.aname + && (strcmp(rmap_name, filter->advmap.aname) == 0)) { + filter->advmap.amap = map; + } + + if (filter->advmap.cname + && (strcmp(rmap_name, filter->advmap.cname) == 0)) { + filter->advmap.cmap = map; + } + if (peer->default_rmap[afi][safi].name && (strcmp(rmap_name, peer->default_rmap[afi][safi].name) == 0)) peer->default_rmap[afi][safi].map = map; + + /* Notify BGP conditional advertisement scanner percess */ + peer->advmap_config_change[afi][safi] = true; } static void bgp_route_map_update_peer_group(const char *rmap_name, @@ -3746,6 +3759,7 @@ static void bgp_route_map_process_update(struct bgp *bgp, const char *rmap_name, int route_update) { int i; + bool matched; afi_t afi; safi_t safi; struct peer *peer; @@ -3845,16 +3859,35 @@ static void bgp_route_map_process_update(struct bgp *bgp, const char *rmap_name, if (!aggregate) continue; - if (!aggregate->rmap.name - || (strcmp(rmap_name, aggregate->rmap.name) != 0)) - continue; + matched = false; - if (!aggregate->rmap.map) - route_map_counter_increment(map); + /* Update suppress map pointer. */ + if (aggregate->suppress_map_name + && strmatch(aggregate->suppress_map_name, + rmap_name)) { + if (aggregate->rmap.map == NULL) + route_map_counter_increment(map); - aggregate->rmap.map = map; + aggregate->suppress_map = map; + + bgp_aggregate_toggle_suppressed( + aggregate, bgp, bgp_dest_get_prefix(bn), + afi, safi, false); + + matched = true; + } + + if (aggregate->rmap.name + && strmatch(rmap_name, aggregate->rmap.name)) { + if (aggregate->rmap.map == NULL) + route_map_counter_increment(map); + + aggregate->rmap.map = map; + + matched = true; + } - if (route_update) { + if (matched && route_update) { const struct prefix *bn_p = bgp_dest_get_prefix(bn); diff --git a/bgpd/bgp_trace.c b/bgpd/bgp_trace.c new file mode 100644 index 0000000000..2ebc63b6b5 --- /dev/null +++ b/bgpd/bgp_trace.c @@ -0,0 +1,4 @@ +#define TRACEPOINT_CREATE_PROBES +#define TRACEPOINT_DEFINE + +#include "bgp_trace.h" diff --git a/bgpd/bgp_trace.h b/bgpd/bgp_trace.h new file mode 100644 index 0000000000..2566ffb928 --- /dev/null +++ b/bgpd/bgp_trace.h @@ -0,0 +1,131 @@ +/* Tracing for BGP + * + * Copyright (C) 2020 NVIDIA Corporation + * Quentin Young + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the Free + * Software Foundation; either version 2 of the License, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; see the file COPYING; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#if !defined(_BGP_TRACE_H) || defined(TRACEPOINT_HEADER_MULTI_READ) +#define _BGP_TRACE_H + +#include "lib/trace.h" + +#ifdef HAVE_LTTNG + +#undef TRACEPOINT_PROVIDER +#define TRACEPOINT_PROVIDER frr_bgp + +#undef TRACEPOINT_INCLUDE +#define TRACEPOINT_INCLUDE "bgpd/bgp_trace.h" + +#include <lttng/tracepoint.h> + +#include "bgpd/bgpd.h" +#include "lib/stream.h" + +/* clang-format off */ + +TRACEPOINT_EVENT_CLASS( + frr_bgp, + packet_process, + TP_ARGS(struct peer *, peer, bgp_size_t, size), + TP_FIELDS( + ctf_string(peer, peer->host ? peer->host : "(unknown peer)") + ) +) + +#define PKT_PROCESS_TRACEPOINT_INSTANCE(name) \ + TRACEPOINT_EVENT_INSTANCE( \ + frr_bgp, packet_process, name, \ + TP_ARGS(struct peer *, peer, bgp_size_t, size)) \ + TRACEPOINT_LOGLEVEL(frr_bgp, name, TRACE_INFO) + +PKT_PROCESS_TRACEPOINT_INSTANCE(open_process) +PKT_PROCESS_TRACEPOINT_INSTANCE(keepalive_process) +PKT_PROCESS_TRACEPOINT_INSTANCE(update_process) +PKT_PROCESS_TRACEPOINT_INSTANCE(notification_process) +PKT_PROCESS_TRACEPOINT_INSTANCE(capability_process) +PKT_PROCESS_TRACEPOINT_INSTANCE(refresh_process) + +TRACEPOINT_EVENT( + frr_bgp, + packet_read, + TP_ARGS(struct peer *, peer, struct stream *, pkt), + TP_FIELDS( + ctf_string(peer, peer->host ? peer->host : "(unknown peer)") + ctf_sequence_hex(uint8_t, packet, pkt->data, size_t, + STREAM_READABLE(pkt)) + ) +) + +TRACEPOINT_LOGLEVEL(frr_bgp, packet_read, TRACE_INFO) + +TRACEPOINT_EVENT( + frr_bgp, + process_update, + TP_ARGS(struct peer *, peer, char *, pfx, uint32_t, addpath_id, afi_t, + afi, safi_t, safi, struct attr *, attr), + TP_FIELDS( + ctf_string(peer, peer->host ? peer->host : "(unknown peer)") + ctf_string(prefix, pfx) + ctf_integer(uint32_t, addpath_id, addpath_id) + ctf_integer(afi_t, afi, afi) + ctf_integer(safi_t, safi, safi) + ctf_integer_hex(intptr_t, attribute_ptr, attr) + ) +) + +TRACEPOINT_LOGLEVEL(frr_bgp, process_update, TRACE_INFO) + +TRACEPOINT_EVENT( + frr_bgp, + input_filter, + TP_ARGS(struct peer *, peer, char *, pfx, afi_t, afi, safi_t, safi, + const char *, result), + TP_FIELDS( + ctf_string(peer, peer->host ? peer->host : "(unknown peer)") + ctf_string(prefix, pfx) + ctf_integer(afi_t, afi, afi) + ctf_integer(safi_t, safi, safi) + ctf_string(action, result) + ) +) + +TRACEPOINT_LOGLEVEL(frr_bgp, input_filter, TRACE_INFO) + +TRACEPOINT_EVENT( + frr_bgp, + output_filter, + TP_ARGS(struct peer *, peer, char *, pfx, afi_t, afi, safi_t, safi, + const char *, result), + TP_FIELDS( + ctf_string(peer, peer->host ? peer->host : "(unknown peer)") + ctf_string(prefix, pfx) + ctf_integer(afi_t, afi, afi) + ctf_integer(safi_t, safi, safi) + ctf_string(action, result) + ) +) + +TRACEPOINT_LOGLEVEL(frr_bgp, output_filter, TRACE_INFO) + +/* clang-format on */ + +#include <lttng/tracepoint-event.h> + +#endif /* HAVE_LTTNG */ + +#endif /* _BGP_TRACE_H */ diff --git a/bgpd/bgp_updgrp.c b/bgpd/bgp_updgrp.c index 1685f98181..2788a8ea4f 100644 --- a/bgpd/bgp_updgrp.c +++ b/bgpd/bgp_updgrp.c @@ -195,6 +195,19 @@ static void conf_copy(struct peer *dst, struct peer *src, afi_t afi, MTYPE_BGP_FILTER_NAME, UNSUPPRESS_MAP_NAME(srcfilter)); UNSUPPRESS_MAP(dstfilter) = UNSUPPRESS_MAP(srcfilter); } + + if (ADVERTISE_MAP_NAME(srcfilter)) { + ADVERTISE_MAP_NAME(dstfilter) = XSTRDUP( + MTYPE_BGP_FILTER_NAME, ADVERTISE_MAP_NAME(srcfilter)); + ADVERTISE_MAP(dstfilter) = ADVERTISE_MAP(srcfilter); + ADVERTISE_CONDITION(dstfilter) = ADVERTISE_CONDITION(srcfilter); + } + + if (CONDITION_MAP_NAME(srcfilter)) { + CONDITION_MAP_NAME(dstfilter) = XSTRDUP( + MTYPE_BGP_FILTER_NAME, CONDITION_MAP_NAME(srcfilter)); + CONDITION_MAP(dstfilter) = CONDITION_MAP(srcfilter); + } } /** @@ -218,6 +231,10 @@ static void conf_release(struct peer *src, afi_t afi, safi_t safi) XFREE(MTYPE_BGP_FILTER_NAME, srcfilter->usmap.name); + XFREE(MTYPE_BGP_FILTER_NAME, srcfilter->advmap.aname); + + XFREE(MTYPE_BGP_FILTER_NAME, srcfilter->advmap.cname); + XFREE(MTYPE_BGP_PEER_HOST, src->host); } @@ -353,6 +370,11 @@ static unsigned int updgrp_hash_key_make(const void *p) strlen(filter->usmap.name), SEED1), key); + if (filter->advmap.aname) + key = jhash_1word(jhash(filter->advmap.aname, + strlen(filter->advmap.aname), SEED1), + key); + if (peer->default_rmap[afi][safi].name) key = jhash_1word( jhash(peer->default_rmap[afi][safi].name, @@ -481,6 +503,12 @@ static bool updgrp_hash_cmp(const void *p1, const void *p2) && strcmp(fl1->usmap.name, fl2->usmap.name))) return false; + if ((fl1->advmap.aname && !fl2->advmap.aname) + || (!fl1->advmap.aname && fl2->advmap.aname) + || (fl1->advmap.aname && fl2->advmap.aname + && strcmp(fl1->advmap.aname, fl2->advmap.aname))) + return false; + if ((pe1->default_rmap[afi][safi].name && !pe2->default_rmap[afi][safi].name) || (!pe1->default_rmap[afi][safi].name @@ -796,13 +824,11 @@ static void update_subgroup_delete(struct update_subgroup *subgrp) UPDGRP_INCR_STAT(subgrp->update_group, subgrps_deleted); THREAD_OFF(subgrp->t_merge_check); - - THREAD_TIMER_OFF(subgrp->t_coalesce); + THREAD_OFF(subgrp->t_coalesce); bpacket_queue_cleanup(SUBGRP_PKTQ(subgrp)); subgroup_clear_table(subgrp); - THREAD_TIMER_OFF(subgrp->t_coalesce); sync_delete(subgrp); if (BGP_DEBUG(update_groups, UPDATE_GROUPS) && subgrp->update_group) @@ -1768,7 +1794,7 @@ int update_group_refresh_default_originate_route_map(struct thread *thread) bgp = THREAD_ARG(thread); update_group_walk(bgp, update_group_default_originate_route_map_walkcb, reason); - THREAD_TIMER_OFF(bgp->t_rmap_def_originate_eval); + thread_cancel(&bgp->t_rmap_def_originate_eval); bgp_unlock(bgp); return 0; diff --git a/bgpd/bgp_updgrp_adv.c b/bgpd/bgp_updgrp_adv.c index 2e59bb3a5f..ac77ccd8a4 100644 --- a/bgpd/bgp_updgrp_adv.c +++ b/bgpd/bgp_updgrp_adv.c @@ -215,6 +215,9 @@ static int group_announce_route_walkcb(struct update_group *updgrp, void *arg) } } } + + /* Notify BGP Conditional advertisement */ + bgp_notify_conditional_adv_scanner(subgrp); } return UPDWALK_CONTINUE; @@ -642,7 +645,8 @@ void subgroup_announce_table(struct update_subgroup *subgrp, peer->addpath_type[afi][safi], ri))) { if (subgroup_announce_check(dest, ri, subgrp, - dest_p, &attr)) + dest_p, &attr, + false)) bgp_adj_out_set_subgroup(dest, subgrp, &attr, ri); else { @@ -827,7 +831,7 @@ void subgroup_default_originate(struct update_subgroup *subgrp, int withdraw) if (subgroup_announce_check( dest, pi, subgrp, bgp_dest_get_prefix(dest), - &attr)) + &attr, false)) bgp_adj_out_set_subgroup( dest, subgrp, &attr, pi); diff --git a/bgpd/bgp_vty.c b/bgpd/bgp_vty.c index a1ef8e23f2..00e781d804 100644 --- a/bgpd/bgp_vty.c +++ b/bgpd/bgp_vty.c @@ -273,6 +273,37 @@ static const char *get_afi_safi_json_str(afi_t afi, safi_t safi) return "Unknown"; } +/* return string maps to afi-safi specific container names + * defined in bgp yang file. + */ +const char *bgp_afi_safi_get_container_str(afi_t afi, safi_t safi) +{ + if (afi == AFI_IP && safi == SAFI_UNICAST) + return "ipv4-unicast"; + else if (afi == AFI_IP && safi == SAFI_MULTICAST) + return "ipv4-multicast"; + else if (afi == AFI_IP && safi == SAFI_LABELED_UNICAST) + return "ipv4-labeled-unicast"; + else if (afi == AFI_IP && safi == SAFI_MPLS_VPN) + return "l3vpn-ipv4-unicast"; + else if (afi == AFI_IP && safi == SAFI_FLOWSPEC) + return "ipv4-flowspec"; + else if (afi == AFI_IP6 && safi == SAFI_UNICAST) + return "ipv6-unicast"; + else if (afi == AFI_IP6 && safi == SAFI_MULTICAST) + return "ipv6-multicast"; + else if (afi == AFI_IP6 && safi == SAFI_LABELED_UNICAST) + return "ipv6-labeled-unicast"; + else if (afi == AFI_IP6 && safi == SAFI_MPLS_VPN) + return "l3vpn-ipv6-unicast"; + else if (afi == AFI_IP6 && safi == SAFI_FLOWSPEC) + return "ipv6-flowspec"; + else if (afi == AFI_L2VPN && safi == SAFI_EVPN) + return "l2vpn-evpn"; + else + return "Unknown"; +} + /* Utility function to get address family from current node. */ afi_t bgp_node_afi(struct vty *vty) { @@ -1585,23 +1616,16 @@ void cli_show_router_bgp_confederation_member_as(struct vty *vty, * @peer_type: BGP_PEER_EBGP or BGP_PEER_IBGP * @set: 1 for setting values, 0 for removing the max-paths config. */ -static int bgp_maxpaths_config_vty(struct vty *vty, int peer_type, - const char *mpaths, uint16_t options, - int set) +int bgp_maxpaths_config_vty(struct bgp *bgp, afi_t afi, safi_t safi, + int peer_type, uint16_t maxpaths, uint16_t options, + int set, char *errmsg, size_t errmsg_len) { - VTY_DECLVAR_CONTEXT(bgp, bgp); - uint16_t maxpaths = 0; int ret; - afi_t afi; - safi_t safi; - - afi = bgp_node_afi(vty); - safi = bgp_node_safi(vty); if (set) { - maxpaths = strtol(mpaths, NULL, 10); if (maxpaths > multipath_num) { - vty_out(vty, + snprintf( + errmsg, errmsg_len, "%% Maxpaths Specified: %d is > than multipath num specified on bgp command line %d", maxpaths, multipath_num); return CMD_WARNING_CONFIG_FAILED; @@ -1612,7 +1636,8 @@ static int bgp_maxpaths_config_vty(struct vty *vty, int peer_type, ret = bgp_maximum_paths_unset(bgp, afi, safi, peer_type); if (ret < 0) { - vty_out(vty, + snprintf( + errmsg, errmsg_len, "%% Failed to %sset maximum-paths %s %u for afi %u, safi %u\n", (set == 1) ? "" : "un", (peer_type == BGP_PEER_EBGP) ? "ebgp" : "ibgp", @@ -1703,14 +1728,14 @@ DEFUN_YANG(no_bgp_maxmed_admin, return nb_cli_apply_changes(vty, NULL); } -DEFUN_YANG(bgp_maxmed_onstartup, - bgp_maxmed_onstartup_cmd, - "bgp max-med on-startup (5-86400) [(0-4294967295)]", - BGP_STR - "Advertise routes with max-med\n" - "Effective on a startup\n" - "Time (seconds) period for max-med\n" - "Max MED value to be used\n") +DEFUN_YANG (bgp_maxmed_onstartup, + bgp_maxmed_onstartup_cmd, + "bgp max-med on-startup (5-86400) [(0-4294967295)]", + BGP_STR + "Advertise routes with max-med\n" + "Effective on a startup\n" + "Time (seconds) period for max-med\n" + "Max MED value to be used\n") { int idx = 0; @@ -1731,14 +1756,14 @@ DEFUN_YANG(bgp_maxmed_onstartup, return nb_cli_apply_changes(vty, NULL); } -DEFUN_YANG(no_bgp_maxmed_onstartup, - no_bgp_maxmed_onstartup_cmd, - "no bgp max-med on-startup [(5-86400) [(0-4294967295)]]", - NO_STR BGP_STR - "Advertise routes with max-med\n" - "Effective on a startup\n" - "Time (seconds) period for max-med\n" - "Max MED value to be used\n") +DEFUN_YANG (no_bgp_maxmed_onstartup, + no_bgp_maxmed_onstartup_cmd, + "no bgp max-med on-startup [(5-86400) [(0-4294967295)]]", + NO_STR BGP_STR + "Advertise routes with max-med\n" + "Effective on a startup\n" + "Time (seconds) period for max-med\n" + "Max MED value to be used\n") { nb_cli_enqueue_change(vty, "./global/med-config/max-med-onstart-up-time", @@ -1972,12 +1997,12 @@ void bgp_config_write_rpkt_quanta(struct vty *vty, struct bgp *bgp) * Furthermore, the maximums used here should correspond to * BGP_WRITE_PACKET_MAX and BGP_READ_PACKET_MAX. */ -DEFPY_YANG(bgp_wpkt_quanta, - bgp_wpkt_quanta_cmd, - "[no] write-quanta (1-64)$quanta", - NO_STR - "How many packets to write to peer socket per run\n" - "Number of packets\n") +DEFPY_YANG (bgp_wpkt_quanta, + bgp_wpkt_quanta_cmd, + "[no] write-quanta (1-64)$quanta", + NO_STR + "How many packets to write to peer socket per run\n" + "Number of packets\n") { if (!no) nb_cli_enqueue_change( @@ -1993,12 +2018,12 @@ DEFPY_YANG(bgp_wpkt_quanta, return nb_cli_apply_changes(vty, NULL); } -DEFPY_YANG(bgp_rpkt_quanta, - bgp_rpkt_quanta_cmd, - "[no] read-quanta (1-10)$quanta", - NO_STR - "How many packets to read from peer socket per I/O cycle\n" - "Number of packets\n") +DEFPY_YANG (bgp_rpkt_quanta, + bgp_rpkt_quanta_cmd, + "[no] read-quanta (1-10)$quanta", + NO_STR + "How many packets to read from peer socket per I/O cycle\n" + "Number of packets\n") { if (!no) nb_cli_enqueue_change( @@ -2027,11 +2052,11 @@ void cli_show_router_global_update_group_config_coalesce_time( } -DEFUN_YANG(bgp_coalesce_time, - bgp_coalesce_time_cmd, - "coalesce-time (0-4294967295)", - "Subgroup coalesce timer\n" - "Subgroup coalesce timer value (in ms)\n") +DEFUN_YANG (bgp_coalesce_time, + bgp_coalesce_time_cmd, + "coalesce-time (0-4294967295)", + "Subgroup coalesce timer\n" + "Subgroup coalesce timer value (in ms)\n") { int idx = 0; @@ -2058,15 +2083,37 @@ DEFUN_YANG(no_bgp_coalesce_time, } /* Maximum-paths configuration */ -DEFUN (bgp_maxpaths, - bgp_maxpaths_cmd, - "maximum-paths " CMD_RANGE_STR(1, MULTIPATH_NUM), - "Forward packets over multiple paths\n" - "Number of paths\n") +DEFUN_YANG (bgp_maxpaths, + bgp_maxpaths_cmd, + "maximum-paths " CMD_RANGE_STR(1, MULTIPATH_NUM), + "Forward packets over multiple paths\n" + "Number of paths\n") { int idx_number = 1; - return bgp_maxpaths_config_vty(vty, BGP_PEER_EBGP, - argv[idx_number]->arg, 0, 1); + char base_xpath[XPATH_MAXLEN]; + afi_t afi; + safi_t safi; + + afi = bgp_node_afi(vty); + safi = bgp_node_safi(vty); + + snprintf( + base_xpath, sizeof(base_xpath), + "./global/afi-safis/afi-safi[afi-safi-name='%s']/%s/use-multiple-paths/ebgp/maximum-paths", + yang_afi_safi_value2identity(afi, safi), + bgp_afi_safi_get_container_str(afi, safi)); + + nb_cli_enqueue_change(vty, base_xpath, NB_OP_MODIFY, + argv[idx_number]->arg); + + return nb_cli_apply_changes(vty, NULL); +} + +void cli_show_bgp_global_afi_safi_unicast_use_multiple_paths_ebgp_maximum_paths( + struct vty *vty, struct lyd_node *dnode, bool show_defaults) +{ + vty_out(vty, " maximum-paths %d\n", + yang_dnode_get_uint16(dnode, NULL)); } ALIAS_HIDDEN(bgp_maxpaths, bgp_maxpaths_hidden_cmd, @@ -2074,16 +2121,31 @@ ALIAS_HIDDEN(bgp_maxpaths, bgp_maxpaths_hidden_cmd, "Forward packets over multiple paths\n" "Number of paths\n") -DEFUN (bgp_maxpaths_ibgp, - bgp_maxpaths_ibgp_cmd, - "maximum-paths ibgp " CMD_RANGE_STR(1, MULTIPATH_NUM), - "Forward packets over multiple paths\n" - "iBGP-multipath\n" - "Number of paths\n") +DEFUN_YANG (bgp_maxpaths_ibgp, + bgp_maxpaths_ibgp_cmd, + "maximum-paths ibgp " CMD_RANGE_STR(1, MULTIPATH_NUM), + "Forward packets over multiple paths\n" + "iBGP-multipath\n" + "Number of paths\n") { int idx_number = 2; - return bgp_maxpaths_config_vty(vty, BGP_PEER_IBGP, - argv[idx_number]->arg, 0, 1); + char base_xpath[XPATH_MAXLEN]; + afi_t afi; + safi_t safi; + + afi = bgp_node_afi(vty); + safi = bgp_node_safi(vty); + + snprintf( + base_xpath, sizeof(base_xpath), + "./global/afi-safis/afi-safi[afi-safi-name='%s']/%s/use-multiple-paths/ibgp/maximum-paths", + yang_afi_safi_value2identity(afi, safi), + bgp_afi_safi_get_container_str(afi, safi)); + + nb_cli_enqueue_change(vty, base_xpath, NB_OP_MODIFY, + argv[idx_number]->arg); + + return nb_cli_apply_changes(vty, NULL); } ALIAS_HIDDEN(bgp_maxpaths_ibgp, bgp_maxpaths_ibgp_hidden_cmd, @@ -2092,18 +2154,50 @@ ALIAS_HIDDEN(bgp_maxpaths_ibgp, bgp_maxpaths_ibgp_hidden_cmd, "iBGP-multipath\n" "Number of paths\n") -DEFUN (bgp_maxpaths_ibgp_cluster, - bgp_maxpaths_ibgp_cluster_cmd, - "maximum-paths ibgp " CMD_RANGE_STR(1, MULTIPATH_NUM) " equal-cluster-length", - "Forward packets over multiple paths\n" - "iBGP-multipath\n" - "Number of paths\n" - "Match the cluster length\n") +DEFUN_YANG (bgp_maxpaths_ibgp_cluster, + bgp_maxpaths_ibgp_cluster_cmd, + "maximum-paths ibgp " CMD_RANGE_STR(1, MULTIPATH_NUM) " equal-cluster-length", + "Forward packets over multiple paths\n" + "iBGP-multipath\n" + "Number of paths\n" + "Match the cluster length\n") { int idx_number = 2; - return bgp_maxpaths_config_vty( - vty, BGP_PEER_IBGP, argv[idx_number]->arg, - BGP_FLAG_IBGP_MULTIPATH_SAME_CLUSTERLEN, 1); + char base_xpath[XPATH_MAXLEN]; + afi_t afi; + safi_t safi; + + afi = bgp_node_afi(vty); + safi = bgp_node_safi(vty); + + snprintf( + base_xpath, sizeof(base_xpath), + "./global/afi-safis/afi-safi[afi-safi-name='%s']/%s/use-multiple-paths/ibgp/maximum-paths", + yang_afi_safi_value2identity(afi, safi), + bgp_afi_safi_get_container_str(afi, safi)); + + nb_cli_enqueue_change(vty, base_xpath, NB_OP_MODIFY, + argv[idx_number]->arg); + + snprintf( + base_xpath, sizeof(base_xpath), + "./global/afi-safis/afi-safi[afi-safi-name='%s']/%s/use-multiple-paths/ibgp/cluster-length-list", + yang_afi_safi_value2identity(afi, safi), + bgp_afi_safi_get_container_str(afi, safi)); + + nb_cli_enqueue_change(vty, base_xpath, NB_OP_MODIFY, "true"); + + return nb_cli_apply_changes(vty, NULL); +} + +void cli_show_bgp_global_afi_safi_ip_unicast_use_multiple_paths_ibgp_maximum_paths( + struct vty *vty, struct lyd_node *dnode, bool show_defaults) +{ + vty_out(vty, " maximum-paths ibgp %d", + yang_dnode_get_uint16(dnode, "./maximum-paths")); + if (yang_dnode_get_bool(dnode, "./cluster-length-list")) + vty_out(vty, " equal-cluster-length"); + vty_out(vty, "\n"); } ALIAS_HIDDEN(bgp_maxpaths_ibgp_cluster, bgp_maxpaths_ibgp_cluster_hidden_cmd, @@ -2114,14 +2208,29 @@ ALIAS_HIDDEN(bgp_maxpaths_ibgp_cluster, bgp_maxpaths_ibgp_cluster_hidden_cmd, "Number of paths\n" "Match the cluster length\n") -DEFUN (no_bgp_maxpaths, - no_bgp_maxpaths_cmd, - "no maximum-paths [" CMD_RANGE_STR(1, MULTIPATH_NUM) "]", - NO_STR - "Forward packets over multiple paths\n" - "Number of paths\n") +DEFUN_YANG (no_bgp_maxpaths, + no_bgp_maxpaths_cmd, + "no maximum-paths [" CMD_RANGE_STR(1, MULTIPATH_NUM) "]", + NO_STR + "Forward packets over multiple paths\n" + "Number of paths\n") { - return bgp_maxpaths_config_vty(vty, BGP_PEER_EBGP, NULL, 0, 0); + char base_xpath[XPATH_MAXLEN]; + afi_t afi; + safi_t safi; + + afi = bgp_node_afi(vty); + safi = bgp_node_safi(vty); + + snprintf( + base_xpath, sizeof(base_xpath), + "./global/afi-safis/afi-safi[afi-safi-name='%s']/%s/use-multiple-paths/ebgp/maximum-paths", + yang_afi_safi_value2identity(afi, safi), + bgp_afi_safi_get_container_str(afi, safi)); + + nb_cli_enqueue_change(vty, base_xpath, NB_OP_MODIFY, NULL); + + return nb_cli_apply_changes(vty, NULL); } ALIAS_HIDDEN(no_bgp_maxpaths, no_bgp_maxpaths_hidden_cmd, @@ -2129,16 +2238,39 @@ ALIAS_HIDDEN(no_bgp_maxpaths, no_bgp_maxpaths_hidden_cmd, "Forward packets over multiple paths\n" "Number of paths\n") -DEFUN (no_bgp_maxpaths_ibgp, - no_bgp_maxpaths_ibgp_cmd, - "no maximum-paths ibgp [" CMD_RANGE_STR(1, MULTIPATH_NUM) " [equal-cluster-length]]", - NO_STR - "Forward packets over multiple paths\n" - "iBGP-multipath\n" - "Number of paths\n" - "Match the cluster length\n") +DEFUN_YANG (no_bgp_maxpaths_ibgp, + no_bgp_maxpaths_ibgp_cmd, + "no maximum-paths ibgp [" CMD_RANGE_STR(1, MULTIPATH_NUM) " [equal-cluster-length]]", + NO_STR + "Forward packets over multiple paths\n" + "iBGP-multipath\n" + "Number of paths\n" + "Match the cluster length\n") { - return bgp_maxpaths_config_vty(vty, BGP_PEER_IBGP, NULL, 0, 0); + char base_xpath[XPATH_MAXLEN]; + afi_t afi; + safi_t safi; + + afi = bgp_node_afi(vty); + safi = bgp_node_safi(vty); + + snprintf( + base_xpath, sizeof(base_xpath), + "./global/afi-safis/afi-safi[afi-safi-name='%s']/%s/use-multiple-paths/ibgp/maximum-paths", + yang_afi_safi_value2identity(afi, safi), + bgp_afi_safi_get_container_str(afi, safi)); + + nb_cli_enqueue_change(vty, base_xpath, NB_OP_MODIFY, NULL); + + snprintf( + base_xpath, sizeof(base_xpath), + "./global/afi-safis/afi-safi[afi-safi-name='%s']/%s/use-multiple-paths/ibgp/cluster-length-list", + yang_afi_safi_value2identity(afi, safi), + bgp_afi_safi_get_container_str(afi, safi)); + + nb_cli_enqueue_change(vty, base_xpath, NB_OP_MODIFY, "false"); + + return nb_cli_apply_changes(vty, NULL); } ALIAS_HIDDEN(no_bgp_maxpaths_ibgp, no_bgp_maxpaths_ibgp_hidden_cmd, @@ -2170,13 +2302,13 @@ static void bgp_config_write_maxpaths(struct vty *vty, struct bgp *bgp, /* BGP timers. */ -DEFUN_YANG(bgp_timers, - bgp_timers_cmd, - "timers bgp (0-65535) (0-65535)", - "Adjust routing timers\n" - "BGP timers\n" - "Keepalive interval\n" - "Holdtime\n") +DEFUN_YANG (bgp_timers, + bgp_timers_cmd, + "timers bgp (0-65535) (0-65535)", + "Adjust routing timers\n" + "BGP timers\n" + "Keepalive interval\n" + "Holdtime\n") { int idx_number = 2; int idx_number_2 = 3; @@ -2189,14 +2321,14 @@ DEFUN_YANG(bgp_timers, return nb_cli_apply_changes(vty, NULL); } -DEFUN_YANG(no_bgp_timers, - no_bgp_timers_cmd, - "no timers bgp [(0-65535) (0-65535)]", - NO_STR - "Adjust routing timers\n" - "BGP timers\n" - "Keepalive interval\n" - "Holdtime\n") +DEFUN_YANG (no_bgp_timers, + no_bgp_timers_cmd, + "no timers bgp [(0-65535) (0-65535)]", + NO_STR + "Adjust routing timers\n" + "BGP timers\n" + "Keepalive interval\n" + "Holdtime\n") { nb_cli_enqueue_change(vty, "./global/global-config-timers/keepalive", NB_OP_DESTROY, NULL); @@ -7043,6 +7175,68 @@ ALIAS_HIDDEN(no_neighbor_filter_list, no_neighbor_filter_list_hidden_cmd, "Filter incoming routes\n" "Filter outgoing routes\n") +/* Set advertise-map to the peer. */ +static int peer_advertise_map_set_vty(struct vty *vty, const char *ip_str, + afi_t afi, safi_t safi, + const char *advertise_str, + const char *condition_str, bool condition, + bool set) +{ + int ret = CMD_WARNING_CONFIG_FAILED; + struct peer *peer; + struct route_map *advertise_map; + struct route_map *condition_map; + + peer = peer_and_group_lookup_vty(vty, ip_str); + if (!peer) + return ret; + + condition_map = route_map_lookup_warn_noexist(vty, condition_str); + advertise_map = route_map_lookup_warn_noexist(vty, advertise_str); + + if (set) + ret = peer_advertise_map_set(peer, afi, safi, advertise_str, + advertise_map, condition_str, + condition_map, condition); + else + ret = peer_advertise_map_unset(peer, afi, safi, advertise_str, + advertise_map, condition_str, + condition_map, condition); + + return bgp_vty_return(vty, ret); +} + +DEFPY (neighbor_advertise_map, + neighbor_advertise_map_cmd, + "[no$no] neighbor <A.B.C.D|X:X::X:X|WORD>$neighbor advertise-map WORD$advertise_str <exist-map|non-exist-map>$exist WORD$condition_str", + NO_STR + NEIGHBOR_STR + NEIGHBOR_ADDR_STR2 + "Route-map to conditionally advertise routes\n" + "Name of advertise map\n" + "Advertise routes only if prefixes in exist-map are installed in BGP table\n" + "Advertise routes only if prefixes in non-exist-map are not installed in BGP table\n" + "Name of the exist or non exist map\n") +{ + bool condition = CONDITION_EXIST; + + if (!strcmp(exist, "non-exist-map")) + condition = CONDITION_NON_EXIST; + + return peer_advertise_map_set_vty(vty, neighbor, bgp_node_afi(vty), + bgp_node_safi(vty), advertise_str, + condition_str, condition, !no); +} + +ALIAS_HIDDEN(neighbor_advertise_map, neighbor_advertise_map_hidden_cmd, + "[no$no] neighbor <A.B.C.D|X:X::X:X|WORD>$neighbor advertise-map WORD$advertise_str <exist-map|non-exist-map>$exist WORD$condition_str", + NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2 + "Route-map to conditionally advertise routes\n" + "Name of advertise map\n" + "Advertise routes only if prefixes in exist-map are installed in BGP table\n" + "Advertise routes only if prefixes in non-exist-map are not installed in BGP table\n" + "Name of the exist or non exist map\n") + /* Set route-map to the peer. */ static int peer_route_map_set_vty(struct vty *vty, const char *ip_str, afi_t afi, safi_t safi, const char *name_str, @@ -7890,6 +8084,33 @@ static int set_ecom_list(struct vty *vty, int argc, struct cmd_token **argv, return CMD_SUCCESS; } +bool vpn_policy_check_import(struct bgp *bgp, afi_t afi, safi_t safi, + bool v2vimport, char *errmsg, size_t errmsg_len) +{ + if (!v2vimport) { + if (CHECK_FLAG(bgp->af_flags[afi][SAFI_UNICAST], + BGP_CONFIG_VRF_TO_VRF_IMPORT) + || CHECK_FLAG(bgp->af_flags[afi][SAFI_UNICAST], + BGP_CONFIG_VRF_TO_VRF_EXPORT)) { + snprintf( + errmsg, errmsg_len, "%s", + "%% error: Please unconfigure import vrf commands before using vpn commands"); + return false; + } + } else { + if (CHECK_FLAG(bgp->af_flags[afi][SAFI_UNICAST], + BGP_CONFIG_VRF_TO_MPLSVPN_EXPORT) + || CHECK_FLAG(bgp->af_flags[afi][SAFI_UNICAST], + BGP_CONFIG_MPLSVPN_TO_VRF_IMPORT)) { + snprintf( + errmsg, errmsg_len, "%s", + "%% error: Please unconfigure vpn to vrf commands before using import vrf commands"); + return false; + } + } + return true; +} + /* * v2vimport is true if we are handling a `import vrf ...` command */ @@ -7932,57 +8153,45 @@ static afi_t vpn_policy_getafi(struct vty *vty, struct bgp *bgp, bool v2vimport) return afi; } -DEFPY (af_rd_vpn_export, - af_rd_vpn_export_cmd, - "[no] rd vpn export ASN:NN_OR_IP-ADDRESS:NN$rd_str", - NO_STR - "Specify route distinguisher\n" - "Between current address-family and vpn\n" - "For routes leaked from current address-family to vpn\n" - "Route Distinguisher (<as-number>:<number> | <ip-address>:<number>)\n") +DEFPY_YANG( + af_rd_vpn_export, + af_rd_vpn_export_cmd, + "[no] rd vpn export ASN:NN_OR_IP-ADDRESS:NN$rd_str", + NO_STR + "Specify route distinguisher\n" + "Between current address-family and vpn\n" + "For routes leaked from current address-family to vpn\n" + "Route Distinguisher (<as-number>:<number> | <ip-address>:<number>)\n") { - VTY_DECLVAR_CONTEXT(bgp, bgp); - struct prefix_rd prd; - int ret; + char base_xpath[XPATH_MAXLEN]; afi_t afi; + safi_t safi; int idx = 0; - bool yes = true; - - if (argv_find(argv, argc, "no", &idx)) - yes = false; - if (yes) { - ret = str2prefix_rd(rd_str, &prd); - if (!ret) { - vty_out(vty, "%% Malformed rd\n"); - return CMD_WARNING_CONFIG_FAILED; - } - } + afi = bgp_node_afi(vty); + safi = bgp_node_safi(vty); - afi = vpn_policy_getafi(vty, bgp, false); - if (afi == AFI_MAX) - return CMD_WARNING_CONFIG_FAILED; + snprintf( + base_xpath, sizeof(base_xpath), + "./global/afi-safis/afi-safi[afi-safi-name='%s']/%s/vpn-config", + yang_afi_safi_value2identity(afi, safi), + bgp_afi_safi_get_container_str(afi, safi)); - /* - * pre-change: un-export vpn routes (vpn->vrf routes unaffected) - */ - vpn_leak_prechange(BGP_VPN_POLICY_DIR_TOVPN, afi, - bgp_get_default(), bgp); + if (argv_find(argv, argc, "no", &idx)) + nb_cli_enqueue_change(vty, "./rd", NB_OP_DESTROY, NULL); + else + nb_cli_enqueue_change(vty, "./rd", NB_OP_MODIFY, rd_str); - if (yes) { - bgp->vpn_policy[afi].tovpn_rd = prd; - SET_FLAG(bgp->vpn_policy[afi].flags, - BGP_VPN_POLICY_TOVPN_RD_SET); - } else { - UNSET_FLAG(bgp->vpn_policy[afi].flags, - BGP_VPN_POLICY_TOVPN_RD_SET); - } + return nb_cli_apply_changes(vty, base_xpath); +} - /* post-change: re-export vpn routes */ - vpn_leak_postchange(BGP_VPN_POLICY_DIR_TOVPN, afi, - bgp_get_default(), bgp); +void cli_show_bgp_global_afi_safi_ip_unicast_vpn_config_rd( + struct vty *vty, struct lyd_node *dnode, bool show_defaults) +{ + int indent = 2; - return CMD_SUCCESS; + vty_out(vty, "%*srd vpn export %s\n", indent, "", + yang_dnode_get_string(dnode, NULL)); } ALIAS (af_rd_vpn_export, @@ -8083,7 +8292,7 @@ ALIAS (af_label_vpn_export, "Between current address-family and vpn\n" "For routes leaked from current address-family to vpn\n") -DEFPY (af_nexthop_vpn_export, +DEFPY_YANG (af_nexthop_vpn_export, af_nexthop_vpn_export_cmd, "[no] nexthop vpn export [<A.B.C.D|X:X::X:X>$nexthop_su]", NO_STR @@ -8093,8 +8302,10 @@ DEFPY (af_nexthop_vpn_export, "IPv4 prefix\n" "IPv6 prefix\n") { - VTY_DECLVAR_CONTEXT(bgp, bgp); + char base_xpath[XPATH_MAXLEN]; afi_t afi; + safi_t safi; + int idx = 0; struct prefix p; if (!no) { @@ -8106,30 +8317,31 @@ DEFPY (af_nexthop_vpn_export, return CMD_WARNING_CONFIG_FAILED; } - afi = vpn_policy_getafi(vty, bgp, false); - if (afi == AFI_MAX) - return CMD_WARNING_CONFIG_FAILED; + afi = bgp_node_afi(vty); + safi = bgp_node_safi(vty); - /* - * pre-change: un-export vpn routes (vpn->vrf routes unaffected) - */ - vpn_leak_prechange(BGP_VPN_POLICY_DIR_TOVPN, afi, - bgp_get_default(), bgp); + snprintf( + base_xpath, sizeof(base_xpath), + "./global/afi-safis/afi-safi[afi-safi-name='%s']/%s/vpn-config", + yang_afi_safi_value2identity(afi, safi), + bgp_afi_safi_get_container_str(afi, safi)); - if (!no) { - bgp->vpn_policy[afi].tovpn_nexthop = p; - SET_FLAG(bgp->vpn_policy[afi].flags, - BGP_VPN_POLICY_TOVPN_NEXTHOP_SET); - } else { - UNSET_FLAG(bgp->vpn_policy[afi].flags, - BGP_VPN_POLICY_TOVPN_NEXTHOP_SET); - } + if (argv_find(argv, argc, "no", &idx)) + nb_cli_enqueue_change(vty, "./nexthop", NB_OP_DESTROY, NULL); + else + nb_cli_enqueue_change(vty, "./nexthop", NB_OP_MODIFY, + nexthop_su_str); - /* post-change: re-export vpn routes */ - vpn_leak_postchange(BGP_VPN_POLICY_DIR_TOVPN, afi, - bgp_get_default(), bgp); + return nb_cli_apply_changes(vty, base_xpath); +} - return CMD_SUCCESS; +void cli_show_bgp_global_afi_safi_ip_unicast_vpn_config_nexthop( + struct vty *vty, struct lyd_node *dnode, bool show_defaults) +{ + int indent = 2; + + vty_out(vty, "%*snexthop vpn export %s\n", indent, "", + yang_dnode_get_string(dnode, NULL)); } static int vpn_policy_getdirs(struct vty *vty, const char *dstr, int *dodir) @@ -8230,7 +8442,7 @@ ALIAS (af_rt_vpn_imexport, "For routes leaked from current address-family to vpn\n" "both import and export\n") -DEFPY (af_route_map_vpn_imexport, +DEFPY_YANG (af_route_map_vpn_imexport, af_route_map_vpn_imexport_cmd, /* future: "route-map <vpn|evpn|vrf NAME> <import|export> RMAP" */ "[no] route-map vpn <import|export>$direction_str RMAP$rmap_str", @@ -8241,53 +8453,54 @@ DEFPY (af_route_map_vpn_imexport, "For routes leaked from current address-family to vpn\n" "name of route-map\n") { - VTY_DECLVAR_CONTEXT(bgp, bgp); - int ret; - int dodir[BGP_VPN_POLICY_DIR_MAX] = {0}; - vpn_policy_direction_t dir; + char base_xpath[XPATH_MAXLEN]; afi_t afi; + safi_t safi; int idx = 0; - bool yes = true; - - if (argv_find(argv, argc, "no", &idx)) - yes = false; - - afi = vpn_policy_getafi(vty, bgp, false); - if (afi == AFI_MAX) - return CMD_WARNING_CONFIG_FAILED; - ret = vpn_policy_getdirs(vty, direction_str, dodir); - if (ret != CMD_SUCCESS) - return ret; + afi = bgp_node_afi(vty); + safi = bgp_node_safi(vty); - for (dir = 0; dir < BGP_VPN_POLICY_DIR_MAX; ++dir) { - if (!dodir[dir]) - continue; + snprintf( + base_xpath, sizeof(base_xpath), + "./global/afi-safis/afi-safi[afi-safi-name='%s']/%s/vpn-config", + yang_afi_safi_value2identity(afi, safi), + bgp_afi_safi_get_container_str(afi, safi)); + + if (argv_find(argv, argc, "no", &idx)) { + if (!strcmp(direction_str, "import")) + nb_cli_enqueue_change(vty, "./rmap-import", + NB_OP_DESTROY, NULL); + else if (!strcmp(direction_str, "export")) + nb_cli_enqueue_change(vty, "./rmap-export", + NB_OP_DESTROY, NULL); + } else { + if (!strcmp(direction_str, "import")) + nb_cli_enqueue_change(vty, "./rmap-import", + NB_OP_MODIFY, rmap_str); + if (!strcmp(direction_str, "export")) + nb_cli_enqueue_change(vty, "./rmap-export", + NB_OP_MODIFY, rmap_str); + } + return nb_cli_apply_changes(vty, base_xpath); +} - vpn_leak_prechange(dir, afi, bgp_get_default(), bgp); +void cli_show_bgp_global_afi_safi_ip_unicast_vpn_config_rmap_import( + struct vty *vty, struct lyd_node *dnode, bool show_defaults) +{ + int indent = 2; - if (yes) { - if (bgp->vpn_policy[afi].rmap_name[dir]) - XFREE(MTYPE_ROUTE_MAP_NAME, - bgp->vpn_policy[afi].rmap_name[dir]); - bgp->vpn_policy[afi].rmap_name[dir] = XSTRDUP( - MTYPE_ROUTE_MAP_NAME, rmap_str); - bgp->vpn_policy[afi].rmap[dir] = - route_map_lookup_warn_noexist(vty, rmap_str); - if (!bgp->vpn_policy[afi].rmap[dir]) - return CMD_SUCCESS; - } else { - if (bgp->vpn_policy[afi].rmap_name[dir]) - XFREE(MTYPE_ROUTE_MAP_NAME, - bgp->vpn_policy[afi].rmap_name[dir]); - bgp->vpn_policy[afi].rmap_name[dir] = NULL; - bgp->vpn_policy[afi].rmap[dir] = NULL; - } + vty_out(vty, "%*sroute-map vpn import %s\n", indent, "", + yang_dnode_get_string(dnode, NULL)); +} - vpn_leak_postchange(dir, afi, bgp_get_default(), bgp); - } +void cli_show_bgp_global_afi_safi_ip_unicast_vpn_config_rmap_export( + struct vty *vty, struct lyd_node *dnode, bool show_defaults) +{ + int indent = 2; - return CMD_SUCCESS; + vty_out(vty, "%*sroute-map vpn import %s\n", indent, "", + yang_dnode_get_string(dnode, NULL)); } ALIAS (af_route_map_vpn_imexport, @@ -8384,24 +8597,18 @@ DEFPY(af_no_import_vrf_route_map, af_no_import_vrf_route_map_cmd, return CMD_SUCCESS; } -DEFPY(bgp_imexport_vrf, bgp_imexport_vrf_cmd, - "[no] import vrf VIEWVRFNAME$import_name", - NO_STR - "Import routes from another VRF\n" - "VRF to import from\n" - "The name of the VRF\n") +DEFPY_YANG(bgp_imexport_vrf, + bgp_imexport_vrf_cmd, + "[no] import vrf VIEWVRFNAME$import_name", + NO_STR + "Import routes from another VRF\n" + "VRF to import from\n" + "The name of the VRF\n") { - VTY_DECLVAR_CONTEXT(bgp, bgp); - struct listnode *node; - struct bgp *vrf_bgp, *bgp_default; - int32_t ret = 0; - as_t as = bgp->as; - bool remove = false; - int32_t idx = 0; - char *vname; - enum bgp_instance_type bgp_type = BGP_INSTANCE_TYPE_VRF; + char base_xpath[XPATH_MAXLEN]; safi_t safi; afi_t afi; + int32_t idx = 0; if (import_name == NULL) { vty_out(vty, "%% Missing import name\n"); @@ -8413,70 +8620,32 @@ DEFPY(bgp_imexport_vrf, bgp_imexport_vrf_cmd, return CMD_WARNING; } - if (argv_find(argv, argc, "no", &idx)) - remove = true; - - afi = vpn_policy_getafi(vty, bgp, true); - if (afi == AFI_MAX) - return CMD_WARNING_CONFIG_FAILED; - + afi = bgp_node_afi(vty); safi = bgp_node_safi(vty); - if (((BGP_INSTANCE_TYPE_DEFAULT == bgp->inst_type) - && (strcmp(import_name, VRF_DEFAULT_NAME) == 0)) - || (bgp->name && (strcmp(import_name, bgp->name) == 0))) { - vty_out(vty, "%% Cannot %s vrf %s into itself\n", - remove ? "unimport" : "import", import_name); - return CMD_WARNING; - } - - bgp_default = bgp_get_default(); - if (!bgp_default) { - /* Auto-create assuming the same AS */ - ret = bgp_get_vty(&bgp_default, &as, NULL, - BGP_INSTANCE_TYPE_DEFAULT); - - if (ret) { - vty_out(vty, - "VRF default is not configured as a bgp instance\n"); - return CMD_WARNING; - } - } - - vrf_bgp = bgp_lookup_by_name(import_name); - if (!vrf_bgp) { - if (strcmp(import_name, VRF_DEFAULT_NAME) == 0) - vrf_bgp = bgp_default; - else - /* Auto-create assuming the same AS */ - ret = bgp_get_vty(&vrf_bgp, &as, import_name, bgp_type); + snprintf( + base_xpath, sizeof(base_xpath), + "./global/afi-safis/afi-safi[afi-safi-name='%s']/%s/vpn-config/import-vrf-list[vrf='%s']", + yang_afi_safi_value2identity(afi, safi), + bgp_afi_safi_get_container_str(afi, safi), import_name); - if (ret) { - vty_out(vty, - "VRF %s is not configured as a bgp instance\n", - import_name); - return CMD_WARNING; - } - } - - if (remove) { - vrf_unimport_from_vrf(bgp, vrf_bgp, afi, safi); - } else { - /* Already importing from "import_vrf"? */ - for (ALL_LIST_ELEMENTS_RO(bgp->vpn_policy[afi].import_vrf, node, - vname)) { - if (strcmp(vname, import_name) == 0) - return CMD_WARNING; - } + if (argv_find(argv, argc, "no", &idx)) + nb_cli_enqueue_change(vty, ".", NB_OP_DESTROY, NULL); + else + nb_cli_enqueue_change(vty, ".", NB_OP_CREATE, NULL); - vrf_import_from_vrf(bgp, vrf_bgp, afi, safi); - } + return nb_cli_apply_changes(vty, base_xpath); +} - return CMD_SUCCESS; +void cli_show_bgp_global_afi_safi_ip_unicast_vpn_config_import_vrfs( + struct vty *vty, struct lyd_node *dnode, bool show_defaults) +{ + vty_out(vty, " import vrf %s\n", + yang_dnode_get_string(dnode, "./vrf")); } /* This command is valid only in a bgp vrf instance or the default instance */ -DEFPY (bgp_imexport_vpn, +DEFPY_YANG (bgp_imexport_vpn, bgp_imexport_vpn_cmd, "[no] <import|export>$direction_str vpn", NO_STR @@ -8484,60 +8653,51 @@ DEFPY (bgp_imexport_vpn, "Export routes from this address-family\n" "to/from default instance VPN RIB\n") { - VTY_DECLVAR_CONTEXT(bgp, bgp); - int previous_state; - afi_t afi; + char base_xpath[XPATH_MAXLEN]; safi_t safi; - int idx = 0; - bool yes = true; - int flag; - vpn_policy_direction_t dir; - - if (argv_find(argv, argc, "no", &idx)) - yes = false; - - if (BGP_INSTANCE_TYPE_VRF != bgp->inst_type && - BGP_INSTANCE_TYPE_DEFAULT != bgp->inst_type) { - - vty_out(vty, "%% import|export vpn valid only for bgp vrf or default instance\n"); - return CMD_WARNING_CONFIG_FAILED; - } + afi_t afi; + int32_t idx = 0; afi = bgp_node_afi(vty); safi = bgp_node_safi(vty); - if ((SAFI_UNICAST != safi) || ((AFI_IP != afi) && (AFI_IP6 != afi))) { - vty_out(vty, "%% import|export vpn valid only for unicast ipv4|ipv6\n"); - return CMD_WARNING_CONFIG_FAILED; - } if (!strcmp(direction_str, "import")) { - flag = BGP_CONFIG_MPLSVPN_TO_VRF_IMPORT; - dir = BGP_VPN_POLICY_DIR_FROMVPN; + snprintf( + base_xpath, sizeof(base_xpath), + "./global/afi-safis/afi-safi[afi-safi-name='%s']/%s/vpn-config/import-vpn", + yang_afi_safi_value2identity(afi, safi), + bgp_afi_safi_get_container_str(afi, safi)); } else if (!strcmp(direction_str, "export")) { - flag = BGP_CONFIG_VRF_TO_MPLSVPN_EXPORT; - dir = BGP_VPN_POLICY_DIR_TOVPN; + snprintf( + base_xpath, sizeof(base_xpath), + "./global/afi-safis/afi-safi[afi-safi-name='%s']/%s/vpn-config/export-vpn", + yang_afi_safi_value2identity(afi, safi), + bgp_afi_safi_get_container_str(afi, safi)); } else { vty_out(vty, "%% unknown direction %s\n", direction_str); return CMD_WARNING_CONFIG_FAILED; } - previous_state = CHECK_FLAG(bgp->af_flags[afi][safi], flag); + if (argv_find(argv, argc, "no", &idx)) + nb_cli_enqueue_change(vty, ".", NB_OP_DESTROY, NULL); + else + nb_cli_enqueue_change(vty, ".", NB_OP_CREATE, "true"); - if (yes) { - SET_FLAG(bgp->af_flags[afi][safi], flag); - if (!previous_state) { - /* trigger export current vrf */ - vpn_leak_postchange(dir, afi, bgp_get_default(), bgp); - } - } else { - if (previous_state) { - /* trigger un-export current vrf */ - vpn_leak_prechange(dir, afi, bgp_get_default(), bgp); - } - UNSET_FLAG(bgp->af_flags[afi][safi], flag); - } + return nb_cli_apply_changes(vty, base_xpath); +} - return CMD_SUCCESS; +void cli_show_bgp_global_afi_safi_ip_unicast_vpn_config_import_vpn( + struct vty *vty, struct lyd_node *dnode, bool show_defaults) +{ + if (yang_dnode_get_bool(dnode, NULL)) + vty_out(vty, " import vpn\n"); +} + +void cli_show_bgp_global_afi_safi_ip_unicast_vpn_config_export_vpn( + struct vty *vty, struct lyd_node *dnode, bool show_defaults) +{ + if (yang_dnode_get_bool(dnode, NULL)) + vty_out(vty, " export vpn\n"); } DEFPY (af_routetarget_import, @@ -8603,6 +8763,51 @@ DEFPY (af_routetarget_import, return CMD_SUCCESS; } +void cli_show_bgp_global_afi_safi_header(struct vty *vty, + struct lyd_node *dnode, + bool show_defaults) +{ + const char *af_name; + afi_t afi; + safi_t safi; + + af_name = yang_dnode_get_string(dnode, "./afi-safi-name"); + yang_afi_safi_identity2value(af_name, &afi, &safi); + + vty_out(vty, " !\n address-family "); + if (afi == AFI_IP) { + if (safi == SAFI_UNICAST) + vty_out(vty, "ipv4 unicast"); + else if (safi == SAFI_LABELED_UNICAST) + vty_out(vty, "ipv4 labeled-unicast"); + else if (safi == SAFI_MULTICAST) + vty_out(vty, "ipv4 multicast"); + else if (safi == SAFI_MPLS_VPN) + vty_out(vty, "ipv4 vpn"); + else if (safi == SAFI_ENCAP) + vty_out(vty, "ipv4 encap"); + else if (safi == SAFI_FLOWSPEC) + vty_out(vty, "ipv4 flowspec"); + } else if (afi == AFI_IP6) { + if (safi == SAFI_UNICAST) + vty_out(vty, "ipv6 unicast"); + else if (safi == SAFI_LABELED_UNICAST) + vty_out(vty, "ipv6 labeled-unicast"); + else if (safi == SAFI_MULTICAST) + vty_out(vty, "ipv6 multicast"); + else if (safi == SAFI_MPLS_VPN) + vty_out(vty, "ipv6 vpn"); + else if (safi == SAFI_ENCAP) + vty_out(vty, "ipv6 encap"); + else if (safi == SAFI_FLOWSPEC) + vty_out(vty, "ipv6 flowspec"); + } else if (afi == AFI_L2VPN) { + if (safi == SAFI_EVPN) + vty_out(vty, "l2vpn evpn"); + } + vty_out(vty, "\n"); +} + DEFUN_NOSH (address_family_ipv4_safi, address_family_ipv4_safi_cmd, "address-family ipv4 [<unicast|multicast|vpn|labeled-unicast|flowspec>]", @@ -8611,19 +8816,28 @@ DEFUN_NOSH (address_family_ipv4_safi, BGP_SAFI_WITH_LABEL_HELP_STR) { + safi_t safi = SAFI_UNICAST; + const struct lyd_node *vrf_dnode, *bgp_glb_dnode; + const char *vrf_name = NULL; + if (argc == 3) { - VTY_DECLVAR_CONTEXT(bgp, bgp); - safi_t safi = bgp_vty_safi_from_str(argv[2]->text); - if (bgp->inst_type != BGP_INSTANCE_TYPE_DEFAULT + safi = bgp_vty_safi_from_str(argv[2]->text); + + bgp_glb_dnode = yang_dnode_get(vty->candidate_config->dnode, + VTY_CURR_XPATH); + vrf_dnode = yang_dnode_get_parent(bgp_glb_dnode, + "control-plane-protocol"); + vrf_name = yang_dnode_get_string(vrf_dnode, "./vrf"); + + if (!strmatch(vrf_name, VRF_DEFAULT_NAME) && safi != SAFI_UNICAST && safi != SAFI_MULTICAST && safi != SAFI_EVPN) { vty_out(vty, "Only Unicast/Multicast/EVPN SAFIs supported in non-core instances.\n"); return CMD_WARNING_CONFIG_FAILED; } - vty->node = bgp_node_type(AFI_IP, safi); - } else - vty->node = BGP_IPV4_NODE; + } + vty->node = bgp_node_type(AFI_IP, safi); return CMD_SUCCESS; } @@ -8635,19 +8849,27 @@ DEFUN_NOSH (address_family_ipv6_safi, "Address Family\n" BGP_SAFI_WITH_LABEL_HELP_STR) { + safi_t safi = SAFI_UNICAST; + const struct lyd_node *vrf_dnode, *bgp_glb_dnode; + const char *vrf_name = NULL; + if (argc == 3) { - VTY_DECLVAR_CONTEXT(bgp, bgp); - safi_t safi = bgp_vty_safi_from_str(argv[2]->text); - if (bgp->inst_type != BGP_INSTANCE_TYPE_DEFAULT + safi = bgp_vty_safi_from_str(argv[2]->text); + bgp_glb_dnode = yang_dnode_get(vty->candidate_config->dnode, + VTY_CURR_XPATH); + vrf_dnode = yang_dnode_get_parent(bgp_glb_dnode, + "control-plane-protocol"); + vrf_name = yang_dnode_get_string(vrf_dnode, "./vrf"); + + if (!strmatch(vrf_name, VRF_DEFAULT_NAME) && safi != SAFI_UNICAST && safi != SAFI_MULTICAST && safi != SAFI_EVPN) { vty_out(vty, "Only Unicast/Multicast/EVPN SAFIs supported in non-core instances.\n"); return CMD_WARNING_CONFIG_FAILED; } - vty->node = bgp_node_type(AFI_IP6, safi); - } else - vty->node = BGP_IPV6_NODE; + } + vty->node = bgp_node_type(AFI_IP6, safi); return CMD_SUCCESS; } @@ -8704,6 +8926,13 @@ DEFUN_NOSH (exit_address_family, return CMD_SUCCESS; } +void cli_show_bgp_global_afi_safi_header_end(struct vty *vty, + struct lyd_node *dnode + __attribute__((__unused__))) +{ + vty_out(vty, " exit-address-family\n"); +} + /* Recalculate bestpath and re-advertise a prefix */ static int bgp_clear_prefix(struct vty *vty, const char *view_name, const char *ip_str, afi_t afi, safi_t safi, @@ -10712,6 +10941,7 @@ static void bgp_show_peer_afi(struct vty *vty, struct peer *p, afi_t afi, json_object *json_prefA = NULL; json_object *json_prefB = NULL; json_object *json_addr = NULL; + json_object *json_advmap = NULL; if (use_json) { json_addr = json_object_new_object(); @@ -10986,6 +11216,26 @@ static void bgp_show_peer_afi(struct vty *vty, struct peer *p, afi_t afi, "selectiveUnsuppressRouteMap", filter->usmap.name); + /* advertise-map */ + if (filter->advmap.aname) { + json_advmap = json_object_new_object(); + json_object_string_add(json_advmap, "condition", + filter->advmap.condition + ? "EXIST" + : "NON_EXIST"); + json_object_string_add(json_advmap, "conditionMap", + filter->advmap.cname); + json_object_string_add(json_advmap, "advertiseMap", + filter->advmap.aname); + json_object_string_add(json_advmap, "advertiseStatus", + filter->advmap.update_type + == ADVERTISE + ? "Advertise" + : "Withdraw"); + json_object_object_add(json_addr, "advertiseMap", + json_advmap); + } + /* Receive prefix count */ json_object_int_add(json_addr, "acceptedPrefixCounter", p->pcount[afi][safi]); @@ -11281,6 +11531,20 @@ static void bgp_show_peer_afi(struct vty *vty, struct peer *p, afi_t afi, filter->usmap.map ? "*" : "", filter->usmap.name); + /* advertise-map */ + if (filter->advmap.aname && filter->advmap.cname) + vty_out(vty, + " Condition %s, Condition-map %s%s, Advertise-map %s%s, status: %s\n", + filter->advmap.condition ? "EXIST" + : "NON_EXIST", + filter->advmap.cmap ? "*" : "", + filter->advmap.cname, + filter->advmap.amap ? "*" : "", + filter->advmap.aname, + filter->advmap.update_type == ADVERTISE + ? "Advertise" + : "Withdraw"); + /* Receive prefix count */ vty_out(vty, " %u accepted prefixes\n", p->pcount[afi][safi]); @@ -14247,24 +14511,23 @@ DEFUN (show_ip_bgp_peer_groups, /* Redistribute VTY commands. */ -DEFUN (bgp_redistribute_ipv4, - bgp_redistribute_ipv4_cmd, - "redistribute " FRR_IP_REDIST_STR_BGPD, - "Redistribute information from another routing protocol\n" - FRR_IP_REDIST_HELP_STR_BGPD) +DEFUN_YANG (bgp_redistribute_ipv4, + bgp_redistribute_ipv4_cmd, + "redistribute " FRR_IP_REDIST_STR_BGPD, + "Redistribute information from another routing protocol\n" + FRR_IP_REDIST_HELP_STR_BGPD) { - VTY_DECLVAR_CONTEXT(bgp, bgp); int idx_protocol = 1; - int type; + char base_xpath[XPATH_MAXLEN]; - type = proto_redistnum(AFI_IP, argv[idx_protocol]->text); - if (type < 0) { - vty_out(vty, "%% Invalid route type\n"); - return CMD_WARNING_CONFIG_FAILED; - } + snprintf(base_xpath, sizeof(base_xpath), FRR_BGP_AFI_SAFI_REDIST_XPATH, + yang_afi_safi_value2identity(AFI_IP, SAFI_UNICAST), + bgp_afi_safi_get_container_str(AFI_IP, SAFI_UNICAST), + argv[idx_protocol]->text, "0"); + + nb_cli_enqueue_change(vty, ".", NB_OP_CREATE, NULL); - bgp_redist_add(bgp, AFI_IP, type, 0); - return bgp_redistribute_set(bgp, AFI_IP, type, 0, false); + return nb_cli_apply_changes(vty, base_xpath); } ALIAS_HIDDEN( @@ -14272,33 +14535,28 @@ ALIAS_HIDDEN( "redistribute " FRR_IP_REDIST_STR_BGPD, "Redistribute information from another routing protocol\n" FRR_IP_REDIST_HELP_STR_BGPD) -DEFUN (bgp_redistribute_ipv4_rmap, - bgp_redistribute_ipv4_rmap_cmd, - "redistribute " FRR_IP_REDIST_STR_BGPD " route-map WORD", - "Redistribute information from another routing protocol\n" - FRR_IP_REDIST_HELP_STR_BGPD - "Route map reference\n" - "Pointer to route-map entries\n") +DEFUN_YANG (bgp_redistribute_ipv4_rmap, + bgp_redistribute_ipv4_rmap_cmd, + "redistribute " FRR_IP_REDIST_STR_BGPD " route-map WORD", + "Redistribute information from another routing protocol\n" + FRR_IP_REDIST_HELP_STR_BGPD + "Route map reference\n" + "Pointer to route-map entries\n") { - VTY_DECLVAR_CONTEXT(bgp, bgp); int idx_protocol = 1; int idx_word = 3; - int type; - struct bgp_redist *red; - bool changed; - struct route_map *route_map = route_map_lookup_warn_noexist( - vty, argv[idx_word]->arg); - - type = proto_redistnum(AFI_IP, argv[idx_protocol]->text); - if (type < 0) { - vty_out(vty, "%% Invalid route type\n"); - return CMD_WARNING_CONFIG_FAILED; - } + char base_xpath[XPATH_MAXLEN]; + + snprintf(base_xpath, sizeof(base_xpath), FRR_BGP_AFI_SAFI_REDIST_XPATH, + yang_afi_safi_value2identity(AFI_IP, SAFI_UNICAST), + bgp_afi_safi_get_container_str(AFI_IP, SAFI_UNICAST), + argv[idx_protocol]->text, "0"); - red = bgp_redist_add(bgp, AFI_IP, type, 0); - changed = - bgp_redistribute_rmap_set(red, argv[idx_word]->arg, route_map); - return bgp_redistribute_set(bgp, AFI_IP, type, 0, changed); + nb_cli_enqueue_change(vty, ".", NB_OP_CREATE, NULL); + nb_cli_enqueue_change(vty, "./rmap-policy-import", NB_OP_CREATE, + argv[idx_word]->arg); + + return nb_cli_apply_changes(vty, base_xpath); } ALIAS_HIDDEN( @@ -14308,32 +14566,28 @@ ALIAS_HIDDEN( "Route map reference\n" "Pointer to route-map entries\n") -DEFUN (bgp_redistribute_ipv4_metric, - bgp_redistribute_ipv4_metric_cmd, - "redistribute " FRR_IP_REDIST_STR_BGPD " metric (0-4294967295)", - "Redistribute information from another routing protocol\n" - FRR_IP_REDIST_HELP_STR_BGPD - "Metric for redistributed routes\n" - "Default metric\n") +DEFUN_YANG (bgp_redistribute_ipv4_metric, + bgp_redistribute_ipv4_metric_cmd, + "redistribute " FRR_IP_REDIST_STR_BGPD " metric (0-4294967295)", + "Redistribute information from another routing protocol\n" + FRR_IP_REDIST_HELP_STR_BGPD + "Metric for redistributed routes\n" + "Default metric\n") { - VTY_DECLVAR_CONTEXT(bgp, bgp); int idx_protocol = 1; int idx_number = 3; - int type; - uint32_t metric; - struct bgp_redist *red; - bool changed; - - type = proto_redistnum(AFI_IP, argv[idx_protocol]->text); - if (type < 0) { - vty_out(vty, "%% Invalid route type\n"); - return CMD_WARNING_CONFIG_FAILED; - } - metric = strtoul(argv[idx_number]->arg, NULL, 10); + char base_xpath[XPATH_MAXLEN]; + + snprintf(base_xpath, sizeof(base_xpath), FRR_BGP_AFI_SAFI_REDIST_XPATH, + yang_afi_safi_value2identity(AFI_IP, SAFI_UNICAST), + bgp_afi_safi_get_container_str(AFI_IP, SAFI_UNICAST), + argv[idx_protocol]->text, "0"); - red = bgp_redist_add(bgp, AFI_IP, type, 0); - changed = bgp_redistribute_metric_set(bgp, red, AFI_IP, type, metric); - return bgp_redistribute_set(bgp, AFI_IP, type, 0, changed); + nb_cli_enqueue_change(vty, ".", NB_OP_CREATE, NULL); + nb_cli_enqueue_change(vty, "./metric", NB_OP_CREATE, + argv[idx_number]->arg); + + return nb_cli_apply_changes(vty, base_xpath); } ALIAS_HIDDEN( @@ -14343,39 +14597,34 @@ ALIAS_HIDDEN( "Metric for redistributed routes\n" "Default metric\n") -DEFUN (bgp_redistribute_ipv4_rmap_metric, - bgp_redistribute_ipv4_rmap_metric_cmd, - "redistribute " FRR_IP_REDIST_STR_BGPD " route-map WORD metric (0-4294967295)", - "Redistribute information from another routing protocol\n" - FRR_IP_REDIST_HELP_STR_BGPD - "Route map reference\n" - "Pointer to route-map entries\n" - "Metric for redistributed routes\n" - "Default metric\n") +DEFUN_YANG( + bgp_redistribute_ipv4_rmap_metric, + bgp_redistribute_ipv4_rmap_metric_cmd, + "redistribute " FRR_IP_REDIST_STR_BGPD + " route-map WORD metric (0-4294967295)", + "Redistribute information from another routing protocol\n" FRR_IP_REDIST_HELP_STR_BGPD + "Route map reference\n" + "Pointer to route-map entries\n" + "Metric for redistributed routes\n" + "Default metric\n") { - VTY_DECLVAR_CONTEXT(bgp, bgp); int idx_protocol = 1; int idx_word = 3; int idx_number = 5; - int type; - uint32_t metric; - struct bgp_redist *red; - bool changed; - struct route_map *route_map = - route_map_lookup_warn_noexist(vty, argv[idx_word]->arg); - - type = proto_redistnum(AFI_IP, argv[idx_protocol]->text); - if (type < 0) { - vty_out(vty, "%% Invalid route type\n"); - return CMD_WARNING_CONFIG_FAILED; - } - metric = strtoul(argv[idx_number]->arg, NULL, 10); + char base_xpath[XPATH_MAXLEN]; + + snprintf(base_xpath, sizeof(base_xpath), FRR_BGP_AFI_SAFI_REDIST_XPATH, + yang_afi_safi_value2identity(AFI_IP, SAFI_UNICAST), + bgp_afi_safi_get_container_str(AFI_IP, SAFI_UNICAST), + argv[idx_protocol]->text, "0"); + + nb_cli_enqueue_change(vty, ".", NB_OP_CREATE, NULL); + nb_cli_enqueue_change(vty, "./rmap-policy-import", NB_OP_CREATE, + argv[idx_word]->arg); + nb_cli_enqueue_change(vty, "./metric", NB_OP_CREATE, + argv[idx_number]->arg); - red = bgp_redist_add(bgp, AFI_IP, type, 0); - changed = - bgp_redistribute_rmap_set(red, argv[idx_word]->arg, route_map); - changed |= bgp_redistribute_metric_set(bgp, red, AFI_IP, type, metric); - return bgp_redistribute_set(bgp, AFI_IP, type, 0, changed); + return nb_cli_apply_changes(vty, base_xpath); } ALIAS_HIDDEN( @@ -14389,39 +14638,34 @@ ALIAS_HIDDEN( "Metric for redistributed routes\n" "Default metric\n") -DEFUN (bgp_redistribute_ipv4_metric_rmap, - bgp_redistribute_ipv4_metric_rmap_cmd, - "redistribute " FRR_IP_REDIST_STR_BGPD " metric (0-4294967295) route-map WORD", - "Redistribute information from another routing protocol\n" - FRR_IP_REDIST_HELP_STR_BGPD - "Metric for redistributed routes\n" - "Default metric\n" - "Route map reference\n" - "Pointer to route-map entries\n") +DEFUN_YANG( + bgp_redistribute_ipv4_metric_rmap, + bgp_redistribute_ipv4_metric_rmap_cmd, + "redistribute " FRR_IP_REDIST_STR_BGPD + " metric (0-4294967295) route-map WORD", + "Redistribute information from another routing protocol\n" FRR_IP_REDIST_HELP_STR_BGPD + "Metric for redistributed routes\n" + "Default metric\n" + "Route map reference\n" + "Pointer to route-map entries\n") { - VTY_DECLVAR_CONTEXT(bgp, bgp); int idx_protocol = 1; - int idx_number = 3; int idx_word = 5; - int type; - uint32_t metric; - struct bgp_redist *red; - bool changed; - struct route_map *route_map = - route_map_lookup_warn_noexist(vty, argv[idx_word]->arg); - - type = proto_redistnum(AFI_IP, argv[idx_protocol]->text); - if (type < 0) { - vty_out(vty, "%% Invalid route type\n"); - return CMD_WARNING_CONFIG_FAILED; - } - metric = strtoul(argv[idx_number]->arg, NULL, 10); + int idx_number = 3; + char base_xpath[XPATH_MAXLEN]; + + snprintf(base_xpath, sizeof(base_xpath), FRR_BGP_AFI_SAFI_REDIST_XPATH, + yang_afi_safi_value2identity(AFI_IP, SAFI_UNICAST), + bgp_afi_safi_get_container_str(AFI_IP, SAFI_UNICAST), + argv[idx_protocol]->text, "0"); + + nb_cli_enqueue_change(vty, ".", NB_OP_CREATE, NULL); + nb_cli_enqueue_change(vty, "./metric", NB_OP_CREATE, + argv[idx_number]->arg); + nb_cli_enqueue_change(vty, "./rmap-policy-import", NB_OP_CREATE, + argv[idx_word]->arg); - red = bgp_redist_add(bgp, AFI_IP, type, 0); - changed = bgp_redistribute_metric_set(bgp, red, AFI_IP, type, metric); - changed |= - bgp_redistribute_rmap_set(red, argv[idx_word]->arg, route_map); - return bgp_redistribute_set(bgp, AFI_IP, type, 0, changed); + return nb_cli_apply_changes(vty, base_xpath); } ALIAS_HIDDEN( @@ -14435,29 +14679,26 @@ ALIAS_HIDDEN( "Route map reference\n" "Pointer to route-map entries\n") -DEFUN (bgp_redistribute_ipv4_ospf, - bgp_redistribute_ipv4_ospf_cmd, - "redistribute <ospf|table> (1-65535)", - "Redistribute information from another routing protocol\n" - "Open Shortest Path First (OSPFv2)\n" - "Non-main Kernel Routing Table\n" - "Instance ID/Table ID\n") +DEFUN_YANG (bgp_redistribute_ipv4_ospf, + bgp_redistribute_ipv4_ospf_cmd, + "redistribute <ospf|table> (1-65535)", + "Redistribute information from another routing protocol\n" + "Open Shortest Path First (OSPFv2)\n" + "Non-main Kernel Routing Table\n" + "Instance ID/Table ID\n") { - VTY_DECLVAR_CONTEXT(bgp, bgp); - int idx_ospf_table = 1; + int idx_protocol = 1; int idx_number = 2; - unsigned short instance; - unsigned short protocol; + char base_xpath[XPATH_MAXLEN]; - instance = strtoul(argv[idx_number]->arg, NULL, 10); + snprintf(base_xpath, sizeof(base_xpath), FRR_BGP_AFI_SAFI_REDIST_XPATH, + yang_afi_safi_value2identity(AFI_IP, SAFI_UNICAST), + bgp_afi_safi_get_container_str(AFI_IP, SAFI_UNICAST), + argv[idx_protocol]->text, argv[idx_number]->arg); - if (strncmp(argv[idx_ospf_table]->arg, "o", 1) == 0) - protocol = ZEBRA_ROUTE_OSPF; - else - protocol = ZEBRA_ROUTE_TABLE; + nb_cli_enqueue_change(vty, ".", NB_OP_CREATE, NULL); - bgp_redist_add(bgp, AFI_IP, protocol, instance); - return bgp_redistribute_set(bgp, AFI_IP, protocol, instance, false); + return nb_cli_apply_changes(vty, base_xpath); } ALIAS_HIDDEN(bgp_redistribute_ipv4_ospf, bgp_redistribute_ipv4_ospf_hidden_cmd, @@ -14467,37 +14708,32 @@ ALIAS_HIDDEN(bgp_redistribute_ipv4_ospf, bgp_redistribute_ipv4_ospf_hidden_cmd, "Non-main Kernel Routing Table\n" "Instance ID/Table ID\n") -DEFUN (bgp_redistribute_ipv4_ospf_rmap, - bgp_redistribute_ipv4_ospf_rmap_cmd, - "redistribute <ospf|table> (1-65535) route-map WORD", - "Redistribute information from another routing protocol\n" - "Open Shortest Path First (OSPFv2)\n" - "Non-main Kernel Routing Table\n" - "Instance ID/Table ID\n" - "Route map reference\n" - "Pointer to route-map entries\n") +DEFUN_YANG (bgp_redistribute_ipv4_ospf_rmap, + bgp_redistribute_ipv4_ospf_rmap_cmd, + "redistribute <ospf|table> (1-65535) route-map WORD", + "Redistribute information from another routing protocol\n" + "Open Shortest Path First (OSPFv2)\n" + "Non-main Kernel Routing Table\n" + "Instance ID/Table ID\n" + "Route map reference\n" + "Pointer to route-map entries\n") { - VTY_DECLVAR_CONTEXT(bgp, bgp); - int idx_ospf_table = 1; + int idx_protocol = 1; int idx_number = 2; int idx_word = 4; - struct bgp_redist *red; - unsigned short instance; - int protocol; - bool changed; - struct route_map *route_map = - route_map_lookup_warn_noexist(vty, argv[idx_word]->arg); - - if (strncmp(argv[idx_ospf_table]->arg, "o", 1) == 0) - protocol = ZEBRA_ROUTE_OSPF; - else - protocol = ZEBRA_ROUTE_TABLE; + char base_xpath[XPATH_MAXLEN]; + + snprintf(base_xpath, sizeof(base_xpath), FRR_BGP_AFI_SAFI_REDIST_XPATH, + yang_afi_safi_value2identity(AFI_IP, SAFI_UNICAST), + bgp_afi_safi_get_container_str(AFI_IP, SAFI_UNICAST), + argv[idx_protocol]->text, argv[idx_number]->arg); - instance = strtoul(argv[idx_number]->arg, NULL, 10); - red = bgp_redist_add(bgp, AFI_IP, protocol, instance); - changed = - bgp_redistribute_rmap_set(red, argv[idx_word]->arg, route_map); - return bgp_redistribute_set(bgp, AFI_IP, protocol, instance, changed); + nb_cli_enqueue_change(vty, ".", NB_OP_CREATE, NULL); + + nb_cli_enqueue_change(vty, "./rmap-policy-import", NB_OP_CREATE, + argv[idx_word]->arg); + + return nb_cli_apply_changes(vty, base_xpath); } ALIAS_HIDDEN(bgp_redistribute_ipv4_ospf_rmap, @@ -14510,38 +14746,32 @@ ALIAS_HIDDEN(bgp_redistribute_ipv4_ospf_rmap, "Route map reference\n" "Pointer to route-map entries\n") -DEFUN (bgp_redistribute_ipv4_ospf_metric, - bgp_redistribute_ipv4_ospf_metric_cmd, - "redistribute <ospf|table> (1-65535) metric (0-4294967295)", - "Redistribute information from another routing protocol\n" - "Open Shortest Path First (OSPFv2)\n" - "Non-main Kernel Routing Table\n" - "Instance ID/Table ID\n" - "Metric for redistributed routes\n" - "Default metric\n") +DEFUN_YANG(bgp_redistribute_ipv4_ospf_metric, + bgp_redistribute_ipv4_ospf_metric_cmd, + "redistribute <ospf|table> (1-65535) metric (0-4294967295)", + "Redistribute information from another routing protocol\n" + "Open Shortest Path First (OSPFv2)\n" + "Non-main Kernel Routing Table\n" + "Instance ID/Table ID\n" + "Metric for redistributed routes\n" + "Default metric\n") { - VTY_DECLVAR_CONTEXT(bgp, bgp); - int idx_ospf_table = 1; + int idx_protocol = 1; int idx_number = 2; int idx_number_2 = 4; - uint32_t metric; - struct bgp_redist *red; - unsigned short instance; - int protocol; - bool changed; - - if (strncmp(argv[idx_ospf_table]->arg, "o", 1) == 0) - protocol = ZEBRA_ROUTE_OSPF; - else - protocol = ZEBRA_ROUTE_TABLE; + char base_xpath[XPATH_MAXLEN]; - instance = strtoul(argv[idx_number]->arg, NULL, 10); - metric = strtoul(argv[idx_number_2]->arg, NULL, 10); + snprintf(base_xpath, sizeof(base_xpath), FRR_BGP_AFI_SAFI_REDIST_XPATH, + yang_afi_safi_value2identity(AFI_IP, SAFI_UNICAST), + bgp_afi_safi_get_container_str(AFI_IP, SAFI_UNICAST), + argv[idx_protocol]->text, argv[idx_number]->arg); - red = bgp_redist_add(bgp, AFI_IP, protocol, instance); - changed = bgp_redistribute_metric_set(bgp, red, AFI_IP, protocol, - metric); - return bgp_redistribute_set(bgp, AFI_IP, protocol, instance, changed); + nb_cli_enqueue_change(vty, ".", NB_OP_CREATE, NULL); + + nb_cli_enqueue_change(vty, "./metric", NB_OP_CREATE, + argv[idx_number_2]->arg); + + return nb_cli_apply_changes(vty, base_xpath); } ALIAS_HIDDEN(bgp_redistribute_ipv4_ospf_metric, @@ -14554,45 +14784,38 @@ ALIAS_HIDDEN(bgp_redistribute_ipv4_ospf_metric, "Metric for redistributed routes\n" "Default metric\n") -DEFUN (bgp_redistribute_ipv4_ospf_rmap_metric, - bgp_redistribute_ipv4_ospf_rmap_metric_cmd, - "redistribute <ospf|table> (1-65535) route-map WORD metric (0-4294967295)", - "Redistribute information from another routing protocol\n" - "Open Shortest Path First (OSPFv2)\n" - "Non-main Kernel Routing Table\n" - "Instance ID/Table ID\n" - "Route map reference\n" - "Pointer to route-map entries\n" - "Metric for redistributed routes\n" - "Default metric\n") +DEFUN_YANG( + bgp_redistribute_ipv4_ospf_rmap_metric, + bgp_redistribute_ipv4_ospf_rmap_metric_cmd, + "redistribute <ospf|table> (1-65535) route-map WORD metric (0-4294967295)", + "Redistribute information from another routing protocol\n" + "Open Shortest Path First (OSPFv2)\n" + "Non-main Kernel Routing Table\n" + "Instance ID/Table ID\n" + "Route map reference\n" + "Pointer to route-map entries\n" + "Metric for redistributed routes\n" + "Default metric\n") { - VTY_DECLVAR_CONTEXT(bgp, bgp); - int idx_ospf_table = 1; + int idx_protocol = 1; int idx_number = 2; int idx_word = 4; int idx_number_2 = 6; - uint32_t metric; - struct bgp_redist *red; - unsigned short instance; - int protocol; - bool changed; - struct route_map *route_map = - route_map_lookup_warn_noexist(vty, argv[idx_word]->arg); - - if (strncmp(argv[idx_ospf_table]->arg, "o", 1) == 0) - protocol = ZEBRA_ROUTE_OSPF; - else - protocol = ZEBRA_ROUTE_TABLE; + char base_xpath[XPATH_MAXLEN]; - instance = strtoul(argv[idx_number]->arg, NULL, 10); - metric = strtoul(argv[idx_number_2]->arg, NULL, 10); + snprintf(base_xpath, sizeof(base_xpath), FRR_BGP_AFI_SAFI_REDIST_XPATH, + yang_afi_safi_value2identity(AFI_IP, SAFI_UNICAST), + bgp_afi_safi_get_container_str(AFI_IP, SAFI_UNICAST), + argv[idx_protocol]->text, argv[idx_number]->arg); - red = bgp_redist_add(bgp, AFI_IP, protocol, instance); - changed = - bgp_redistribute_rmap_set(red, argv[idx_word]->arg, route_map); - changed |= bgp_redistribute_metric_set(bgp, red, AFI_IP, protocol, - metric); - return bgp_redistribute_set(bgp, AFI_IP, protocol, instance, changed); + nb_cli_enqueue_change(vty, ".", NB_OP_CREATE, NULL); + + nb_cli_enqueue_change(vty, "./rmap-policy-import", NB_OP_CREATE, + argv[idx_word]->arg); + nb_cli_enqueue_change(vty, "./metric", NB_OP_CREATE, + argv[idx_number_2]->arg); + + return nb_cli_apply_changes(vty, base_xpath); } ALIAS_HIDDEN( @@ -14608,45 +14831,38 @@ ALIAS_HIDDEN( "Metric for redistributed routes\n" "Default metric\n") -DEFUN (bgp_redistribute_ipv4_ospf_metric_rmap, - bgp_redistribute_ipv4_ospf_metric_rmap_cmd, - "redistribute <ospf|table> (1-65535) metric (0-4294967295) route-map WORD", - "Redistribute information from another routing protocol\n" - "Open Shortest Path First (OSPFv2)\n" - "Non-main Kernel Routing Table\n" - "Instance ID/Table ID\n" - "Metric for redistributed routes\n" - "Default metric\n" - "Route map reference\n" - "Pointer to route-map entries\n") +DEFUN_YANG( + bgp_redistribute_ipv4_ospf_metric_rmap, + bgp_redistribute_ipv4_ospf_metric_rmap_cmd, + "redistribute <ospf|table> (1-65535) metric (0-4294967295) route-map WORD", + "Redistribute information from another routing protocol\n" + "Open Shortest Path First (OSPFv2)\n" + "Non-main Kernel Routing Table\n" + "Instance ID/Table ID\n" + "Metric for redistributed routes\n" + "Default metric\n" + "Route map reference\n" + "Pointer to route-map entries\n") { - VTY_DECLVAR_CONTEXT(bgp, bgp); - int idx_ospf_table = 1; + int idx_protocol = 1; int idx_number = 2; int idx_number_2 = 4; int idx_word = 6; - uint32_t metric; - struct bgp_redist *red; - unsigned short instance; - int protocol; - bool changed; - struct route_map *route_map = - route_map_lookup_warn_noexist(vty, argv[idx_word]->arg); - - if (strncmp(argv[idx_ospf_table]->arg, "o", 1) == 0) - protocol = ZEBRA_ROUTE_OSPF; - else - protocol = ZEBRA_ROUTE_TABLE; + char base_xpath[XPATH_MAXLEN]; + + snprintf(base_xpath, sizeof(base_xpath), FRR_BGP_AFI_SAFI_REDIST_XPATH, + yang_afi_safi_value2identity(AFI_IP, SAFI_UNICAST), + bgp_afi_safi_get_container_str(AFI_IP, SAFI_UNICAST), + argv[idx_protocol]->text, argv[idx_number]->arg); - instance = strtoul(argv[idx_number]->arg, NULL, 10); - metric = strtoul(argv[idx_number_2]->arg, NULL, 10); + nb_cli_enqueue_change(vty, ".", NB_OP_CREATE, NULL); - red = bgp_redist_add(bgp, AFI_IP, protocol, instance); - changed = bgp_redistribute_metric_set(bgp, red, AFI_IP, protocol, - metric); - changed |= - bgp_redistribute_rmap_set(red, argv[idx_word]->arg, route_map); - return bgp_redistribute_set(bgp, AFI_IP, protocol, instance, changed); + nb_cli_enqueue_change(vty, "./metric", NB_OP_CREATE, + argv[idx_number_2]->arg); + nb_cli_enqueue_change(vty, "./rmap-policy-import", NB_OP_CREATE, + argv[idx_word]->arg); + + return nb_cli_apply_changes(vty, base_xpath); } ALIAS_HIDDEN( @@ -14662,32 +14878,31 @@ ALIAS_HIDDEN( "Route map reference\n" "Pointer to route-map entries\n") -DEFUN (no_bgp_redistribute_ipv4_ospf, - no_bgp_redistribute_ipv4_ospf_cmd, - "no redistribute <ospf|table> (1-65535) [{metric (0-4294967295)|route-map WORD}]", - NO_STR - "Redistribute information from another routing protocol\n" - "Open Shortest Path First (OSPFv2)\n" - "Non-main Kernel Routing Table\n" - "Instance ID/Table ID\n" - "Metric for redistributed routes\n" - "Default metric\n" - "Route map reference\n" - "Pointer to route-map entries\n") +DEFUN_YANG (no_bgp_redistribute_ipv4_ospf, + no_bgp_redistribute_ipv4_ospf_cmd, + "no redistribute <ospf|table> (1-65535) [{metric (0-4294967295)|route-map WORD}]", + NO_STR + "Redistribute information from another routing protocol\n" + "Open Shortest Path First (OSPFv2)\n" + "Non-main Kernel Routing Table\n" + "Instance ID/Table ID\n" + "Metric for redistributed routes\n" + "Default metric\n" + "Route map reference\n" + "Pointer to route-map entries\n") { - VTY_DECLVAR_CONTEXT(bgp, bgp); - int idx_ospf_table = 2; + int idx_protocol = 2; int idx_number = 3; - unsigned short instance; - int protocol; + char base_xpath[XPATH_MAXLEN]; - if (strncmp(argv[idx_ospf_table]->arg, "o", 1) == 0) - protocol = ZEBRA_ROUTE_OSPF; - else - protocol = ZEBRA_ROUTE_TABLE; + snprintf(base_xpath, sizeof(base_xpath), FRR_BGP_AFI_SAFI_REDIST_XPATH, + yang_afi_safi_value2identity(AFI_IP, SAFI_UNICAST), + bgp_afi_safi_get_container_str(AFI_IP, SAFI_UNICAST), + argv[idx_protocol]->text, argv[idx_number]->arg); + + nb_cli_enqueue_change(vty, ".", NB_OP_DESTROY, NULL); - instance = strtoul(argv[idx_number]->arg, NULL, 10); - return bgp_redistribute_unset(bgp, AFI_IP, protocol, instance); + return nb_cli_apply_changes(vty, base_xpath); } ALIAS_HIDDEN( @@ -14703,27 +14918,28 @@ ALIAS_HIDDEN( "Route map reference\n" "Pointer to route-map entries\n") -DEFUN (no_bgp_redistribute_ipv4, - no_bgp_redistribute_ipv4_cmd, - "no redistribute " FRR_IP_REDIST_STR_BGPD " [{metric (0-4294967295)|route-map WORD}]", - NO_STR - "Redistribute information from another routing protocol\n" - FRR_IP_REDIST_HELP_STR_BGPD - "Metric for redistributed routes\n" - "Default metric\n" - "Route map reference\n" - "Pointer to route-map entries\n") +DEFUN_YANG (no_bgp_redistribute_ipv4, + no_bgp_redistribute_ipv4_cmd, + "no redistribute " FRR_IP_REDIST_STR_BGPD " [{metric (0-4294967295)|route-map WORD}]", + NO_STR + "Redistribute information from another routing protocol\n" + FRR_IP_REDIST_HELP_STR_BGPD + "Metric for redistributed routes\n" + "Default metric\n" + "Route map reference\n" + "Pointer to route-map entries\n") { - VTY_DECLVAR_CONTEXT(bgp, bgp); int idx_protocol = 2; - int type; + char base_xpath[XPATH_MAXLEN]; - type = proto_redistnum(AFI_IP, argv[idx_protocol]->text); - if (type < 0) { - vty_out(vty, "%% Invalid route type\n"); - return CMD_WARNING_CONFIG_FAILED; - } - return bgp_redistribute_unset(bgp, AFI_IP, type, 0); + snprintf(base_xpath, sizeof(base_xpath), FRR_BGP_AFI_SAFI_REDIST_XPATH, + yang_afi_safi_value2identity(AFI_IP, SAFI_UNICAST), + bgp_afi_safi_get_container_str(AFI_IP, SAFI_UNICAST), + argv[idx_protocol]->text, "0"); + + nb_cli_enqueue_change(vty, ".", NB_OP_DESTROY, NULL); + + return nb_cli_apply_changes(vty, base_xpath); } ALIAS_HIDDEN( @@ -14737,56 +14953,50 @@ ALIAS_HIDDEN( "Route map reference\n" "Pointer to route-map entries\n") -DEFUN (bgp_redistribute_ipv6, - bgp_redistribute_ipv6_cmd, - "redistribute " FRR_IP6_REDIST_STR_BGPD, - "Redistribute information from another routing protocol\n" - FRR_IP6_REDIST_HELP_STR_BGPD) +DEFUN_YANG (bgp_redistribute_ipv6, + bgp_redistribute_ipv6_cmd, + "redistribute " FRR_IP6_REDIST_STR_BGPD, + "Redistribute information from another routing protocol\n" + FRR_IP6_REDIST_HELP_STR_BGPD) { - VTY_DECLVAR_CONTEXT(bgp, bgp); int idx_protocol = 1; - int type; + char base_xpath[XPATH_MAXLEN]; - type = proto_redistnum(AFI_IP6, argv[idx_protocol]->text); - if (type < 0) { - vty_out(vty, "%% Invalid route type\n"); - return CMD_WARNING_CONFIG_FAILED; - } + snprintf(base_xpath, sizeof(base_xpath), FRR_BGP_AFI_SAFI_REDIST_XPATH, + yang_afi_safi_value2identity(AFI_IP6, SAFI_UNICAST), + bgp_afi_safi_get_container_str(AFI_IP6, SAFI_UNICAST), + argv[idx_protocol]->text, "0"); - bgp_redist_add(bgp, AFI_IP6, type, 0); - return bgp_redistribute_set(bgp, AFI_IP6, type, 0, false); + nb_cli_enqueue_change(vty, ".", NB_OP_CREATE, NULL); + + return nb_cli_apply_changes(vty, base_xpath); } -DEFUN (bgp_redistribute_ipv6_rmap, - bgp_redistribute_ipv6_rmap_cmd, - "redistribute " FRR_IP6_REDIST_STR_BGPD " route-map WORD", - "Redistribute information from another routing protocol\n" - FRR_IP6_REDIST_HELP_STR_BGPD - "Route map reference\n" - "Pointer to route-map entries\n") +DEFUN_YANG (bgp_redistribute_ipv6_rmap, + bgp_redistribute_ipv6_rmap_cmd, + "redistribute " FRR_IP6_REDIST_STR_BGPD " route-map WORD", + "Redistribute information from another routing protocol\n" + FRR_IP6_REDIST_HELP_STR_BGPD + "Route map reference\n" + "Pointer to route-map entries\n") { - VTY_DECLVAR_CONTEXT(bgp, bgp); int idx_protocol = 1; int idx_word = 3; - int type; - struct bgp_redist *red; - bool changed; - struct route_map *route_map = - route_map_lookup_warn_noexist(vty, argv[idx_word]->arg); - - type = proto_redistnum(AFI_IP6, argv[idx_protocol]->text); - if (type < 0) { - vty_out(vty, "%% Invalid route type\n"); - return CMD_WARNING_CONFIG_FAILED; - } + char base_xpath[XPATH_MAXLEN]; + + snprintf(base_xpath, sizeof(base_xpath), FRR_BGP_AFI_SAFI_REDIST_XPATH, + yang_afi_safi_value2identity(AFI_IP6, SAFI_UNICAST), + bgp_afi_safi_get_container_str(AFI_IP6, SAFI_UNICAST), + argv[idx_protocol]->text, "0"); + + nb_cli_enqueue_change(vty, ".", NB_OP_CREATE, NULL); + nb_cli_enqueue_change(vty, "./rmap-policy-import", NB_OP_CREATE, + argv[idx_word]->arg); - red = bgp_redist_add(bgp, AFI_IP6, type, 0); - changed = - bgp_redistribute_rmap_set(red, argv[idx_word]->arg, route_map); - return bgp_redistribute_set(bgp, AFI_IP6, type, 0, changed); + return nb_cli_apply_changes(vty, base_xpath); } -DEFUN (bgp_redistribute_ipv6_metric, +DEFUN_YANG (bgp_redistribute_ipv6_metric, bgp_redistribute_ipv6_metric_cmd, "redistribute " FRR_IP6_REDIST_STR_BGPD " metric (0-4294967295)", "Redistribute information from another routing protocol\n" @@ -14794,120 +15004,123 @@ DEFUN (bgp_redistribute_ipv6_metric, "Metric for redistributed routes\n" "Default metric\n") { - VTY_DECLVAR_CONTEXT(bgp, bgp); int idx_protocol = 1; int idx_number = 3; - int type; - uint32_t metric; - struct bgp_redist *red; - bool changed; - - type = proto_redistnum(AFI_IP6, argv[idx_protocol]->text); - if (type < 0) { - vty_out(vty, "%% Invalid route type\n"); - return CMD_WARNING_CONFIG_FAILED; - } - metric = strtoul(argv[idx_number]->arg, NULL, 10); + char base_xpath[XPATH_MAXLEN]; + + snprintf(base_xpath, sizeof(base_xpath), FRR_BGP_AFI_SAFI_REDIST_XPATH, + yang_afi_safi_value2identity(AFI_IP6, SAFI_UNICAST), + bgp_afi_safi_get_container_str(AFI_IP6, SAFI_UNICAST), + argv[idx_protocol]->text, "0"); + + nb_cli_enqueue_change(vty, ".", NB_OP_CREATE, NULL); + nb_cli_enqueue_change(vty, "./metric", NB_OP_CREATE, + argv[idx_number]->arg); - red = bgp_redist_add(bgp, AFI_IP6, type, 0); - changed = bgp_redistribute_metric_set(bgp, red, AFI_IP6, type, metric); - return bgp_redistribute_set(bgp, AFI_IP6, type, 0, changed); + return nb_cli_apply_changes(vty, base_xpath); } -DEFUN (bgp_redistribute_ipv6_rmap_metric, - bgp_redistribute_ipv6_rmap_metric_cmd, - "redistribute " FRR_IP6_REDIST_STR_BGPD " route-map WORD metric (0-4294967295)", - "Redistribute information from another routing protocol\n" - FRR_IP6_REDIST_HELP_STR_BGPD - "Route map reference\n" - "Pointer to route-map entries\n" - "Metric for redistributed routes\n" - "Default metric\n") +DEFUN_YANG( + bgp_redistribute_ipv6_rmap_metric, + bgp_redistribute_ipv6_rmap_metric_cmd, + "redistribute " FRR_IP6_REDIST_STR_BGPD + " route-map WORD metric (0-4294967295)", + "Redistribute information from another routing protocol\n" FRR_IP6_REDIST_HELP_STR_BGPD + "Route map reference\n" + "Pointer to route-map entries\n" + "Metric for redistributed routes\n" + "Default metric\n") { - VTY_DECLVAR_CONTEXT(bgp, bgp); int idx_protocol = 1; int idx_word = 3; int idx_number = 5; - int type; - uint32_t metric; - struct bgp_redist *red; - bool changed; - struct route_map *route_map = - route_map_lookup_warn_noexist(vty, argv[idx_word]->arg); - - type = proto_redistnum(AFI_IP6, argv[idx_protocol]->text); - if (type < 0) { - vty_out(vty, "%% Invalid route type\n"); - return CMD_WARNING_CONFIG_FAILED; - } - metric = strtoul(argv[idx_number]->arg, NULL, 10); + char base_xpath[XPATH_MAXLEN]; - red = bgp_redist_add(bgp, AFI_IP6, type, 0); - changed = - bgp_redistribute_rmap_set(red, argv[idx_word]->arg, route_map); - changed |= bgp_redistribute_metric_set(bgp, red, AFI_IP6, type, - metric); - return bgp_redistribute_set(bgp, AFI_IP6, type, 0, changed); + snprintf(base_xpath, sizeof(base_xpath), FRR_BGP_AFI_SAFI_REDIST_XPATH, + yang_afi_safi_value2identity(AFI_IP6, SAFI_UNICAST), + bgp_afi_safi_get_container_str(AFI_IP6, SAFI_UNICAST), + argv[idx_protocol]->text, "0"); + + nb_cli_enqueue_change(vty, ".", NB_OP_CREATE, NULL); + nb_cli_enqueue_change(vty, "./rmap-policy-import", NB_OP_CREATE, + argv[idx_word]->arg); + nb_cli_enqueue_change(vty, "./metric", NB_OP_CREATE, + argv[idx_number]->arg); + + return nb_cli_apply_changes(vty, base_xpath); } -DEFUN (bgp_redistribute_ipv6_metric_rmap, - bgp_redistribute_ipv6_metric_rmap_cmd, - "redistribute " FRR_IP6_REDIST_STR_BGPD " metric (0-4294967295) route-map WORD", - "Redistribute information from another routing protocol\n" - FRR_IP6_REDIST_HELP_STR_BGPD - "Metric for redistributed routes\n" - "Default metric\n" - "Route map reference\n" - "Pointer to route-map entries\n") +DEFUN_YANG( + bgp_redistribute_ipv6_metric_rmap, + bgp_redistribute_ipv6_metric_rmap_cmd, + "redistribute " FRR_IP6_REDIST_STR_BGPD + " metric (0-4294967295) route-map WORD", + "Redistribute information from another routing protocol\n" FRR_IP6_REDIST_HELP_STR_BGPD + "Metric for redistributed routes\n" + "Default metric\n" + "Route map reference\n" + "Pointer to route-map entries\n") { - VTY_DECLVAR_CONTEXT(bgp, bgp); int idx_protocol = 1; - int idx_number = 3; int idx_word = 5; - int type; - uint32_t metric; - struct bgp_redist *red; - bool changed; - struct route_map *route_map = - route_map_lookup_warn_noexist(vty, argv[idx_word]->arg); - - type = proto_redistnum(AFI_IP6, argv[idx_protocol]->text); - if (type < 0) { - vty_out(vty, "%% Invalid route type\n"); - return CMD_WARNING_CONFIG_FAILED; - } - metric = strtoul(argv[idx_number]->arg, NULL, 10); + int idx_number = 3; + char base_xpath[XPATH_MAXLEN]; + + snprintf(base_xpath, sizeof(base_xpath), FRR_BGP_AFI_SAFI_REDIST_XPATH, + yang_afi_safi_value2identity(AFI_IP6, SAFI_UNICAST), + bgp_afi_safi_get_container_str(AFI_IP6, SAFI_UNICAST), + argv[idx_protocol]->text, "0"); + + nb_cli_enqueue_change(vty, ".", NB_OP_CREATE, NULL); + nb_cli_enqueue_change(vty, "./metric", NB_OP_CREATE, + argv[idx_number]->arg); + nb_cli_enqueue_change(vty, "./rmap-policy-import", NB_OP_CREATE, + argv[idx_word]->arg); - red = bgp_redist_add(bgp, AFI_IP6, type, 0); - changed = bgp_redistribute_metric_set(bgp, red, AFI_IP6, SAFI_UNICAST, - metric); - changed |= - bgp_redistribute_rmap_set(red, argv[idx_word]->arg, route_map); - return bgp_redistribute_set(bgp, AFI_IP6, type, 0, changed); + return nb_cli_apply_changes(vty, base_xpath); } -DEFUN (no_bgp_redistribute_ipv6, - no_bgp_redistribute_ipv6_cmd, - "no redistribute " FRR_IP6_REDIST_STR_BGPD " [{metric (0-4294967295)|route-map WORD}]", - NO_STR - "Redistribute information from another routing protocol\n" - FRR_IP6_REDIST_HELP_STR_BGPD - "Metric for redistributed routes\n" - "Default metric\n" - "Route map reference\n" - "Pointer to route-map entries\n") +DEFUN_YANG( + no_bgp_redistribute_ipv6, + no_bgp_redistribute_ipv6_cmd, + "no redistribute " FRR_IP6_REDIST_STR_BGPD + " [{metric (0-4294967295)|route-map WORD}]", + NO_STR + "Redistribute information from another routing protocol\n" FRR_IP6_REDIST_HELP_STR_BGPD + "Metric for redistributed routes\n" + "Default metric\n" + "Route map reference\n" + "Pointer to route-map entries\n") { - VTY_DECLVAR_CONTEXT(bgp, bgp); int idx_protocol = 2; - int type; + char base_xpath[XPATH_MAXLEN]; - type = proto_redistnum(AFI_IP6, argv[idx_protocol]->text); - if (type < 0) { - vty_out(vty, "%% Invalid route type\n"); - return CMD_WARNING_CONFIG_FAILED; - } + snprintf(base_xpath, sizeof(base_xpath), FRR_BGP_AFI_SAFI_REDIST_XPATH, + yang_afi_safi_value2identity(AFI_IP6, SAFI_UNICAST), + bgp_afi_safi_get_container_str(AFI_IP6, SAFI_UNICAST), + argv[idx_protocol]->text, "0"); + + nb_cli_enqueue_change(vty, ".", NB_OP_DESTROY, NULL); - return bgp_redistribute_unset(bgp, AFI_IP6, type, 0); + return nb_cli_apply_changes(vty, base_xpath); +} + +void cli_show_bgp_global_afi_safi_ip_unicast_redistribution_list( + struct vty *vty, struct lyd_node *dnode, bool show_defaults) +{ + uint32_t instance = 0; + + vty_out(vty, " redistribute %s", + yang_dnode_get_string(dnode, "./route-type")); + if ((instance = yang_dnode_get_uint16(dnode, "./route-instance"))) + vty_out(vty, " %d", instance); + if (yang_dnode_exists(dnode, "./metric")) + vty_out(vty, " metric %u", + yang_dnode_get_uint32(dnode, "./metric")); + if (yang_dnode_exists(dnode, "./rmap-policy-import")) + vty_out(vty, " route-map %s", + yang_dnode_get_string(dnode, "./rmap-policy-import")); + vty_out(vty, "\n"); } static void bgp_config_write_redistribute(struct vty *vty, struct bgp *bgp, @@ -14996,6 +15209,10 @@ static bool peergroup_filter_check(struct peer *peer, afi_t afi, safi_t safi, return !!(filter->map[direct].name); case PEER_FT_UNSUPPRESS_MAP: return !!(filter->usmap.name); + case PEER_FT_ADVERTISE_MAP: + return !!(filter->advmap.aname + && ((filter->advmap.condition == direct) + && filter->advmap.cname)); default: return false; } @@ -15181,6 +15398,18 @@ static void bgp_config_write_filter(struct vty *vty, struct peer *peer, vty_out(vty, " neighbor %s unsuppress-map %s\n", addr, filter->usmap.name); + /* advertise-map : always applied in OUT direction*/ + if (peergroup_filter_check(peer, afi, safi, PEER_FT_ADVERTISE_MAP, + CONDITION_NON_EXIST)) + vty_out(vty, + " neighbor %s advertise-map %s non-exist-map %s\n", + addr, filter->advmap.aname, filter->advmap.cname); + + if (peergroup_filter_check(peer, afi, safi, PEER_FT_ADVERTISE_MAP, + CONDITION_EXIST)) + vty_out(vty, " neighbor %s advertise-map %s exist-map %s\n", + addr, filter->advmap.aname, filter->advmap.cname); + /* filter-list. */ if (peergroup_filter_check(peer, afi, safi, PEER_FT_FILTER_LIST, FILTER_IN)) @@ -17385,6 +17614,17 @@ void bgp_vty_init(void) install_element(BGP_VPNV6_NODE, &neighbor_unsuppress_map_cmd); install_element(BGP_VPNV6_NODE, &no_neighbor_unsuppress_map_cmd); + /* "neighbor advertise-map" commands. */ + install_element(BGP_NODE, &neighbor_advertise_map_hidden_cmd); + install_element(BGP_IPV4_NODE, &neighbor_advertise_map_cmd); + install_element(BGP_IPV4M_NODE, &neighbor_advertise_map_cmd); + install_element(BGP_IPV4L_NODE, &neighbor_advertise_map_cmd); + install_element(BGP_IPV6_NODE, &neighbor_advertise_map_cmd); + install_element(BGP_IPV6M_NODE, &neighbor_advertise_map_cmd); + install_element(BGP_IPV6L_NODE, &neighbor_advertise_map_cmd); + install_element(BGP_VPNV4_NODE, &neighbor_advertise_map_cmd); + install_element(BGP_VPNV6_NODE, &neighbor_advertise_map_cmd); + /* neighbor maximum-prefix-out commands. */ install_element(BGP_NODE, &neighbor_maximum_prefix_out_cmd); install_element(BGP_NODE, &no_neighbor_maximum_prefix_out_cmd); @@ -17932,9 +18172,10 @@ DEFUN (no_community_list_expanded_all, return CMD_SUCCESS; } -ALIAS(no_community_list_expanded_all, no_bgp_community_list_expanded_all_list_cmd, +ALIAS(no_community_list_expanded_all, + no_bgp_community_list_expanded_all_list_cmd, "no bgp community-list <(100-500)|expanded WORD>", - NO_STR IP_STR COMMUNITY_LIST_STR + NO_STR BGP_STR COMMUNITY_LIST_STR "Community list number (expanded)\n" "Add an expanded community-list entry\n" "Community list name\n") @@ -18553,7 +18794,7 @@ DEFUN (no_extcommunity_list_standard_all, ALIAS(no_extcommunity_list_standard_all, no_bgp_extcommunity_list_standard_all_list_cmd, "no bgp extcommunity-list <(1-99)|standard WORD>", - NO_STR IP_STR EXTCOMMUNITY_LIST_STR + NO_STR BGP_STR EXTCOMMUNITY_LIST_STR "Extended Community list number (standard)\n" "Specify standard extcommunity-list\n" "Community list name\n") @@ -18618,7 +18859,7 @@ DEFUN (no_extcommunity_list_expanded_all, ALIAS(no_extcommunity_list_expanded_all, no_bgp_extcommunity_list_expanded_all_list_cmd, "no bgp extcommunity-list <(100-500)|expanded WORD>", - NO_STR IP_STR EXTCOMMUNITY_LIST_STR + NO_STR BGP_STR EXTCOMMUNITY_LIST_STR "Extended Community list number (expanded)\n" "Specify expanded extcommunity-list\n" "Extended Community list name\n") diff --git a/bgpd/bgp_vty.h b/bgpd/bgp_vty.h index a9e86ec09a..349efbac45 100644 --- a/bgpd/bgp_vty.h +++ b/bgpd/bgp_vty.h @@ -186,6 +186,13 @@ extern int bgp_clear_star_soft_out(const char *name, char *errmsg, size_t errmsg_len); int bgp_wpkt_quanta_config_vty(struct bgp *bgp, uint32_t quanta, bool set); int bgp_rpkt_quanta_config_vty(struct bgp *bgp, uint32_t quanta, bool set); - +extern int bgp_maxpaths_config_vty(struct bgp *bgp, afi_t afi, safi_t safi, + int peer_type, uint16_t maxpaths, + uint16_t options, int set, char *errmsg, + size_t errmsg_len); +extern const char *bgp_afi_safi_get_container_str(afi_t afi, safi_t safi); +extern bool vpn_policy_check_import(struct bgp *bgp, afi_t afi, safi_t safi, + bool v2vimport, char *errmsg, + size_t errmsg_len); #endif /* _QUAGGA_BGP_VTY_H */ diff --git a/bgpd/bgpd.c b/bgpd/bgpd.c index be3322e468..cf16378de1 100644 --- a/bgpd/bgpd.c +++ b/bgpd/bgpd.c @@ -54,6 +54,7 @@ #include "bgpd/bgp_debug.h" #include "bgpd/bgp_errors.h" #include "bgpd/bgp_community.h" +#include "bgpd/bgp_conditional_adv.h" #include "bgpd/bgp_attr.h" #include "bgpd/bgp_regex.h" #include "bgpd/bgp_clist.h" @@ -6585,6 +6586,172 @@ int peer_unsuppress_map_unset(struct peer *peer, afi_t afi, safi_t safi) return 0; } +static void peer_advertise_map_filter_update(struct peer *peer, afi_t afi, + safi_t safi, const char *amap_name, + struct route_map *amap, + const char *cmap_name, + struct route_map *cmap, + bool condition, bool set) +{ + struct bgp_filter *filter; + bool filter_exists = false; + + filter = &peer->filter[afi][safi]; + + /* advertise-map is already configured. */ + if (filter->advmap.aname) { + filter_exists = true; + XFREE(MTYPE_BGP_FILTER_NAME, filter->advmap.aname); + XFREE(MTYPE_BGP_FILTER_NAME, filter->advmap.cname); + } + + route_map_counter_decrement(filter->advmap.amap); + + /* Removed advertise-map configuration */ + if (!set) { + memset(filter, 0, sizeof(struct bgp_filter)); + + /* decrement condition_filter_count delete timer if + * this is the last advertise-map to be removed. + */ + if (filter_exists) + bgp_conditional_adv_disable(peer, afi, safi); + + return; + } + + /* Update filter data with newly configured values. */ + filter->advmap.aname = XSTRDUP(MTYPE_BGP_FILTER_NAME, amap_name); + filter->advmap.cname = XSTRDUP(MTYPE_BGP_FILTER_NAME, cmap_name); + filter->advmap.amap = amap; + filter->advmap.cmap = cmap; + filter->advmap.condition = condition; + route_map_counter_increment(filter->advmap.amap); + peer->advmap_config_change[afi][safi] = true; + + /* Increment condition_filter_count and/or create timer. */ + if (!filter_exists) { + filter->advmap.update_type = ADVERTISE; + bgp_conditional_adv_enable(peer, afi, safi); + } +} + +/* Set advertise-map to the peer but do not process peer route updates here. * + * Hold filter changes until the conditional routes polling thread is called * + * AS we need to advertise/withdraw prefixes (in advertise-map) based on the * + * condition (exist-map/non-exist-map) and routes(specified in condition-map) * + * in BGP table. So do not call peer_on_policy_change() here, only create * + * polling timer thread, update filters and increment condition_filter_count. + */ +int peer_advertise_map_set(struct peer *peer, afi_t afi, safi_t safi, + const char *advertise_name, + struct route_map *advertise_map, + const char *condition_name, + struct route_map *condition_map, bool condition) +{ + struct peer *member; + struct listnode *node, *nnode; + + /* Set configuration on peer. */ + peer_advertise_map_filter_update(peer, afi, safi, advertise_name, + advertise_map, condition_name, + condition_map, condition, true); + + /* Check if handling a regular peer & Skip peer-group mechanics. */ + if (!CHECK_FLAG(peer->sflags, PEER_STATUS_GROUP)) { + /* Set override-flag and process peer route updates. */ + SET_FLAG(peer->filter_override[afi][safi][RMAP_OUT], + PEER_FT_ADVERTISE_MAP); + return 0; + } + + /* + * Set configuration on all peer-group members, unless they are + * explicitely overriding peer-group configuration. + */ + for (ALL_LIST_ELEMENTS(peer->group->peer, node, nnode, member)) { + /* Skip peers with overridden configuration. */ + if (CHECK_FLAG(member->filter_override[afi][safi][RMAP_OUT], + PEER_FT_ADVERTISE_MAP)) + continue; + + /* Set configuration on peer-group member. */ + peer_advertise_map_filter_update( + member, afi, safi, advertise_name, advertise_map, + condition_name, condition_map, condition, true); + } + + return 0; +} + +/* Unset advertise-map from the peer. */ +int peer_advertise_map_unset(struct peer *peer, afi_t afi, safi_t safi, + const char *advertise_name, + struct route_map *advertise_map, + const char *condition_name, + struct route_map *condition_map, bool condition) +{ + struct peer *member; + struct listnode *node, *nnode; + + /* advertise-map is not configured */ + if (!peer->filter[afi][safi].advmap.aname) + return 0; + + /* Unset override-flag unconditionally. */ + UNSET_FLAG(peer->filter_override[afi][safi][RMAP_OUT], + PEER_FT_ADVERTISE_MAP); + + /* Inherit configuration from peer-group if peer is member. */ + if (peer_group_active(peer)) { + PEER_STR_ATTR_INHERIT(peer, peer->group, + filter[afi][safi].advmap.aname, + MTYPE_BGP_FILTER_NAME); + PEER_ATTR_INHERIT(peer, peer->group, + filter[afi][safi].advmap.amap); + } else + peer_advertise_map_filter_update( + peer, afi, safi, advertise_name, advertise_map, + condition_name, condition_map, condition, false); + + /* Check if handling a regular peer and skip peer-group mechanics. */ + if (!CHECK_FLAG(peer->sflags, PEER_STATUS_GROUP)) { + /* Process peer route updates. */ + if (BGP_DEBUG(update, UPDATE_OUT)) + zlog_debug("%s: Send normal update to %s for %s", + __func__, peer->host, + get_afi_safi_str(afi, safi, false)); + + peer_on_policy_change(peer, afi, safi, 1); + return 0; + } + + /* + * Remove configuration on all peer-group members, unless they are + * explicitely overriding peer-group configuration. + */ + for (ALL_LIST_ELEMENTS(peer->group->peer, node, nnode, member)) { + /* Skip peers with overridden configuration. */ + if (CHECK_FLAG(member->filter_override[afi][safi][RMAP_OUT], + PEER_FT_ADVERTISE_MAP)) + continue; + /* Remove configuration on peer-group member. */ + peer_advertise_map_filter_update( + member, afi, safi, advertise_name, advertise_map, + condition_name, condition_map, condition, false); + + /* Process peer route updates. */ + if (BGP_DEBUG(update, UPDATE_OUT)) + zlog_debug("%s: Send normal update to %s for %s ", + __func__, member->host, + get_afi_safi_str(afi, safi, false)); + + peer_on_policy_change(member, afi, safi, 1); + } + + return 0; +} + int peer_maximum_prefix_set(struct peer *peer, afi_t afi, safi_t safi, uint32_t max, uint8_t threshold, int warning, uint16_t restart, bool force) diff --git a/bgpd/bgpd.h b/bgpd/bgpd.h index eae3d97730..74828e91df 100644 --- a/bgpd/bgpd.h +++ b/bgpd/bgpd.h @@ -682,6 +682,10 @@ struct bgp { /* Process Queue for handling routes */ struct work_queue *process_queue; + /* BGP Conditional advertisement */ + uint32_t condition_filter_count; + struct thread *t_condition_check; + QOBJ_FIELDS }; DECLARE_QOBJ_TYPE(bgp) @@ -759,6 +763,12 @@ struct bgp_nexthop { #define BGP_GTSM_HOPS_DISABLED 0 #define BGP_GTSM_HOPS_CONNECTED 1 +/* Advertise map */ +#define CONDITION_NON_EXIST false +#define CONDITION_EXIST true + +enum update_type { WITHDRAW, ADVERTISE }; + #include "filter.h" /* BGP filter structure. */ @@ -792,6 +802,19 @@ struct bgp_filter { char *name; struct route_map *map; } usmap; + + /* Advertise-map */ + struct { + char *aname; + struct route_map *amap; + + bool condition; + + char *cname; + struct route_map *cmap; + + enum update_type update_type; + } advmap; }; /* IBGP/EBGP identifier. We also have a CONFED peer, which is to say, @@ -1355,6 +1378,7 @@ struct peer { #define PEER_FT_PREFIX_LIST (1U << 2) /* prefix-list */ #define PEER_FT_ROUTE_MAP (1U << 3) /* route-map */ #define PEER_FT_UNSUPPRESS_MAP (1U << 4) /* unsuppress-map */ +#define PEER_FT_ADVERTISE_MAP (1U << 5) /* advertise-map */ /* ORF Prefix-list */ struct prefix_list *orf_plist[AFI_MAX][SAFI_MAX]; @@ -1448,6 +1472,10 @@ struct peer { /* Sender side AS path loop detection. */ bool as_path_loop_detection; + /* Conditional advertisement */ + bool advmap_config_change[AFI_MAX][SAFI_MAX]; + bool advmap_table_change; + QOBJ_FIELDS }; DECLARE_QOBJ_TYPE(peer) @@ -1939,11 +1967,25 @@ extern int peer_unsuppress_map_set(struct peer *peer, afi_t afi, safi_t safi, const char *name, struct route_map *route_map); +extern int peer_advertise_map_set(struct peer *peer, afi_t afi, safi_t safi, + const char *advertise_name, + struct route_map *advertise_map, + const char *condition_name, + struct route_map *condition_map, + bool condition); + extern int peer_password_set(struct peer *, const char *); extern int peer_password_unset(struct peer *); extern int peer_unsuppress_map_unset(struct peer *, afi_t, safi_t); +extern int peer_advertise_map_unset(struct peer *peer, afi_t afi, safi_t safi, + const char *advertise_name, + struct route_map *advertise_map, + const char *condition_name, + struct route_map *condition_map, + bool condition); + extern int peer_maximum_prefix_set(struct peer *, afi_t, safi_t, uint32_t, uint8_t, int, uint16_t, bool force); extern int peer_maximum_prefix_unset(struct peer *, afi_t, safi_t); diff --git a/bgpd/rfapi/rfapi_import.c b/bgpd/rfapi/rfapi_import.c index 68d4f622ed..e3581addee 100644 --- a/bgpd/rfapi/rfapi_import.c +++ b/bgpd/rfapi/rfapi_import.c @@ -858,9 +858,9 @@ static void rfapiBgpInfoChainFree(struct bgp_path_info *bpi) if (CHECK_FLAG(bpi->flags, BGP_PATH_REMOVED) && bpi->extra->vnc.import.timer) { - struct thread *t = - (struct thread *)bpi->extra->vnc.import.timer; - struct rfapi_withdraw *wcb = t->arg; + struct thread **t = + &(bpi->extra->vnc.import.timer); + struct rfapi_withdraw *wcb = (*t)->arg; XFREE(MTYPE_RFAPI_WITHDRAW, wcb); thread_cancel(t); @@ -3093,10 +3093,9 @@ static void rfapiBgpInfoFilteredImportEncap( if (CHECK_FLAG(bpi->flags, BGP_PATH_REMOVED) && bpi->extra->vnc.import.timer) { - struct thread *t = - (struct thread *)bpi->extra->vnc - .import.timer; - struct rfapi_withdraw *wcb = t->arg; + struct thread **t = + &(bpi->extra->vnc.import.timer); + struct rfapi_withdraw *wcb = (*t)->arg; XFREE(MTYPE_RFAPI_WITHDRAW, wcb); thread_cancel(t); @@ -3186,9 +3185,9 @@ static void rfapiBgpInfoFilteredImportEncap( "%s: removing holddown bpi matching NVE of new route", __func__); if (bpi->extra->vnc.import.timer) { - struct thread *t = - (struct thread *)bpi->extra->vnc.import.timer; - struct rfapi_withdraw *wcb = t->arg; + struct thread **t = + &(bpi->extra->vnc.import.timer); + struct rfapi_withdraw *wcb = (*t)->arg; XFREE(MTYPE_RFAPI_WITHDRAW, wcb); thread_cancel(t); @@ -3549,10 +3548,9 @@ void rfapiBgpInfoFilteredImportVPN( if (CHECK_FLAG(bpi->flags, BGP_PATH_REMOVED) && bpi->extra->vnc.import.timer) { - struct thread *t = - (struct thread *)bpi->extra->vnc - .import.timer; - struct rfapi_withdraw *wcb = t->arg; + struct thread **t = + &(bpi->extra->vnc.import.timer); + struct rfapi_withdraw *wcb = (*t)->arg; XFREE(MTYPE_RFAPI_WITHDRAW, wcb); thread_cancel(t); @@ -3768,9 +3766,9 @@ void rfapiBgpInfoFilteredImportVPN( "%s: removing holddown bpi matching NVE of new route", __func__); if (bpi->extra->vnc.import.timer) { - struct thread *t = - (struct thread *)bpi->extra->vnc.import.timer; - struct rfapi_withdraw *wcb = t->arg; + struct thread **t = + &(bpi->extra->vnc.import.timer); + struct rfapi_withdraw *wcb = (*t)->arg; XFREE(MTYPE_RFAPI_WITHDRAW, wcb); thread_cancel(t); @@ -4498,12 +4496,11 @@ static void rfapiDeleteRemotePrefixesIt( continue; if (bpi->extra->vnc.import.timer) { - struct thread *t = - (struct thread *)bpi - ->extra->vnc - .import.timer; + struct thread **t = + &(bpi->extra->vnc + .import.timer); struct rfapi_withdraw *wcb = - t->arg; + (*t)->arg; wcb->import_table ->holddown_count[afi] -= diff --git a/bgpd/rfapi/rfapi_monitor.c b/bgpd/rfapi/rfapi_monitor.c index a4b0eff03e..ce916c104b 100644 --- a/bgpd/rfapi/rfapi_monitor.c +++ b/bgpd/rfapi/rfapi_monitor.c @@ -620,10 +620,7 @@ void rfapiMonitorDel(struct bgp *bgp, struct rfapi_descriptor *rfd, rfapiMonitorDetachImport(m); } - if (m->timer) { - thread_cancel(m->timer); - m->timer = NULL; - } + thread_cancel(&m->timer); /* * remove from rfd list @@ -660,10 +657,7 @@ int rfapiMonitorDelHd(struct rfapi_descriptor *rfd) rfapiMonitorDetachImport(m); } - if (m->timer) { - thread_cancel(m->timer); - m->timer = NULL; - } + thread_cancel(&m->timer); XFREE(MTYPE_RFAPI_MONITOR, m); rn->info = NULL; @@ -697,10 +691,7 @@ int rfapiMonitorDelHd(struct rfapi_descriptor *rfd) #endif } - if (mon_eth->timer) { - thread_cancel(mon_eth->timer); - mon_eth->timer = NULL; - } + thread_cancel(&mon_eth->timer); /* * remove from rfd list @@ -766,8 +757,7 @@ static void rfapiMonitorTimerRestart(struct rfapi_monitor_vpn *m) if (m->rfd->response_lifetime - remain < 2) return; - thread_cancel(m->timer); - m->timer = NULL; + thread_cancel(&m->timer); } { @@ -1078,8 +1068,7 @@ static void rfapiMonitorEthTimerRestart(struct rfapi_monitor_eth *m) if (m->rfd->response_lifetime - remain < 2) return; - thread_cancel(m->timer); - m->timer = NULL; + thread_cancel(&m->timer); } { @@ -1418,10 +1407,7 @@ void rfapiMonitorEthDel(struct bgp *bgp, struct rfapi_descriptor *rfd, rfapiMonitorEthDetachImport(bgp, val); } - if (val->timer) { - thread_cancel(val->timer); - val->timer = NULL; - } + thread_cancel(&val->timer); /* * remove from rfd list diff --git a/bgpd/rfapi/rfapi_rib.c b/bgpd/rfapi/rfapi_rib.c index 09832b32ac..630a379ec2 100644 --- a/bgpd/rfapi/rfapi_rib.c +++ b/bgpd/rfapi/rfapi_rib.c @@ -269,9 +269,8 @@ static void rfapi_info_free(struct rfapi_info *goner) struct rfapi_rib_tcb *tcb; tcb = goner->timer->arg; - thread_cancel(goner->timer); + thread_cancel(&goner->timer); XFREE(MTYPE_RFAPI_RECENT_DELETE, tcb); - goner->timer = NULL; } XFREE(MTYPE_RFAPI_INFO, goner); } @@ -338,13 +337,11 @@ static void rfapiRibStartTimer(struct rfapi_descriptor *rfd, struct agg_node *rn, /* route node attached to */ int deleted) { - struct thread *t = ri->timer; struct rfapi_rib_tcb *tcb = NULL; - if (t) { - tcb = t->arg; - thread_cancel(t); - ri->timer = NULL; + if (ri->timer) { + tcb = ri->timer->arg; + thread_cancel(&ri->timer); } else { tcb = XCALLOC(MTYPE_RFAPI_RECENT_DELETE, sizeof(struct rfapi_rib_tcb)); @@ -917,10 +914,9 @@ static void process_pending_node(struct bgp *bgp, struct rfapi_descriptor *rfd, if (ri->timer) { struct rfapi_rib_tcb *tcb; - tcb = ((struct thread *)ri->timer)->arg; - thread_cancel(ri->timer); + tcb = ri->timer->arg; + thread_cancel(&ri->timer); XFREE(MTYPE_RFAPI_RECENT_DELETE, tcb); - ri->timer = NULL; } vnc_zlog_debug_verbose( @@ -1003,11 +999,9 @@ static void process_pending_node(struct bgp *bgp, struct rfapi_descriptor *rfd, if (ori->timer) { struct rfapi_rib_tcb *tcb; - tcb = ((struct thread *)ori->timer) - ->arg; - thread_cancel(ori->timer); + tcb = ori->timer->arg; + thread_cancel(&ori->timer); XFREE(MTYPE_RFAPI_RECENT_DELETE, tcb); - ori->timer = NULL; } #if DEBUG_PROCESS_PENDING_NODE @@ -1351,11 +1345,9 @@ callback: if (ri->timer) { struct rfapi_rib_tcb *tcb; - tcb = ((struct thread *)ri->timer)->arg; - thread_cancel( - (struct thread *)ri->timer); + tcb = ri->timer->arg; + thread_cancel(&ri->timer); XFREE(MTYPE_RFAPI_RECENT_DELETE, tcb); - ri->timer = NULL; } RFAPI_RIB_CHECK_COUNTS(0, delete_list->count); diff --git a/bgpd/rfapi/vnc_export_bgp.c b/bgpd/rfapi/vnc_export_bgp.c index b56261669c..11f39b2b82 100644 --- a/bgpd/rfapi/vnc_export_bgp.c +++ b/bgpd/rfapi/vnc_export_bgp.c @@ -1711,14 +1711,11 @@ void vnc_direct_bgp_rh_add_route(struct bgp *bgp, afi_t afi, rfapiGetVncLifetime(attr, &eti->lifetime); eti->lifetime = rfapiGetHolddownFromLifetime(eti->lifetime); - if (eti->timer) { - /* - * export expiration timer is already running on - * this route: cancel it - */ - thread_cancel(eti->timer); - eti->timer = NULL; - } + /* + * export expiration timer is already running on + * this route: cancel it + */ + thread_cancel(&eti->timer); bgp_update(peer, prefix, /* prefix */ 0, /* addpath_id */ @@ -1947,15 +1944,12 @@ void vnc_direct_bgp_rh_vpn_enable(struct bgp *bgp, afi_t afi) rfapiGetVncLifetime(ri->attr, &eti->lifetime); - if (eti->timer) { - /* - * export expiration timer is - * already running on - * this route: cancel it - */ - thread_cancel(eti->timer); - eti->timer = NULL; - } + /* + * export expiration timer is + * already running on + * this route: cancel it + */ + thread_cancel(&eti->timer); vnc_zlog_debug_verbose( "%s: calling bgp_update", @@ -2024,8 +2018,7 @@ void vnc_direct_bgp_rh_vpn_disable(struct bgp *bgp, afi_t afi) ZEBRA_ROUTE_VNC_DIRECT_RH, BGP_ROUTE_REDISTRIBUTE); if (eti) { - if (eti->timer) - thread_cancel(eti->timer); + thread_cancel(&eti->timer); vnc_eti_delete(eti); } diff --git a/bgpd/subdir.am b/bgpd/subdir.am index 717e157078..ea60b921d1 100644 --- a/bgpd/subdir.am +++ b/bgpd/subdir.am @@ -61,6 +61,7 @@ bgpd_libbgp_a_SOURCES = \ bgpd/bgp_bfd.c \ bgpd/bgp_clist.c \ bgpd/bgp_community.c \ + bgpd/bgp_conditional_adv.c \ bgpd/bgp_damp.c \ bgpd/bgp_debug.c \ bgpd/bgp_dump.c \ @@ -104,6 +105,7 @@ bgpd_libbgp_a_SOURCES = \ bgpd/bgpd.c \ bgpd/bgp_nb.c \ bgpd/bgp_nb_config.c \ + bgpd/bgp_trace.c \ # end if ENABLE_BGP_VNC @@ -136,6 +138,7 @@ noinst_HEADERS += \ bgpd/bgp_bfd.h \ bgpd/bgp_clist.h \ bgpd/bgp_community.h \ + bgpd/bgp_conditional_adv.h \ bgpd/bgp_damp.h \ bgpd/bgp_debug.h \ bgpd/bgp_dump.h \ @@ -178,6 +181,7 @@ noinst_HEADERS += \ bgpd/bgp_zebra.h \ bgpd/bgpd.h \ bgpd/bgp_nb.h \ + bgpd/bgp_trace.h \ \ bgpd/rfapi/bgp_rfapi_cfg.h \ bgpd/rfapi/rfapi_import.h \ @@ -208,8 +212,8 @@ bgpd_bgpd_CFLAGS = $(AM_CFLAGS) bgpd_bgp_btoa_CFLAGS = $(AM_CFLAGS) # RFPLDADD is set in bgpd/rfp-example/librfp/subdir.am -bgpd_bgpd_LDADD = bgpd/libbgp.a $(RFPLDADD) lib/libfrr.la $(LIBCAP) $(LIBM) -bgpd_bgp_btoa_LDADD = bgpd/libbgp.a $(RFPLDADD) lib/libfrr.la $(LIBCAP) $(LIBM) +bgpd_bgpd_LDADD = bgpd/libbgp.a $(RFPLDADD) lib/libfrr.la $(LIBCAP) $(LIBM) $(UST_LIBS) +bgpd_bgp_btoa_LDADD = bgpd/libbgp.a $(RFPLDADD) lib/libfrr.la $(LIBCAP) $(LIBM) $(UST_LIBS) bgpd_bgpd_snmp_la_SOURCES = bgpd/bgp_snmp.c bgpd_bgpd_snmp_la_CFLAGS = $(WERROR) $(SNMP_CFLAGS) -std=gnu99 diff --git a/configure.ac b/configure.ac index 8e86ba87ff..bda9a34504 100755 --- a/configure.ac +++ b/configure.ac @@ -566,6 +566,10 @@ AC_ARG_ENABLE([grpc], AS_HELP_STRING([--enable-grpc], [enable the gRPC northbound plugin])) AC_ARG_ENABLE([zeromq], AS_HELP_STRING([--enable-zeromq], [enable ZeroMQ handler (libfrrzmq)])) +AC_ARG_ENABLE([lttng], + AS_HELP_STRING([--enable-lttng], [enable LTTng tracing])) +AC_ARG_ENABLE([usdt], + AS_HELP_STRING([--enable-usdt], [enable USDT probes])) AC_ARG_WITH([libpam], AS_HELP_STRING([--with-libpam], [use libpam for PAM support in vtysh])) AC_ARG_ENABLE([ospfapi], @@ -1851,6 +1855,30 @@ if test "$enable_grpc" = "yes"; then ]) fi +dnl ----- +dnl LTTng +dnl ----- +if test "$enable_lttng" = "yes"; then + PKG_CHECK_MODULES([UST], [lttng-ust >= 2.12.0], [ + AC_DEFINE([HAVE_LTTNG], [1], [Enable LTTng support]) + LTTNG=true + ], [ + AC_MSG_ERROR([configuration specifies --enable-lttng but lttng-ust was not found]) + ]) +fi + +dnl ---- +dnl USDT +dnl ---- +if test "$enable_usdt" = "yes"; then + AC_CHECK_HEADERS([sys/sdt.h], [ + AC_DEFINE([HAVE_USDT], [1], [Enable USDT probes]) + USDT=true + ], [ + AC_MSG_ERROR([configuration specifies --enable-usdt but no USDT kernel headers (sys/sdt.h) found]) + ]) +fi + dnl ------ dnl ZeroMQ dnl ------ diff --git a/doc/developer/index.rst b/doc/developer/index.rst index 1f803b3772..1ba0f31c8a 100644 --- a/doc/developer/index.rst +++ b/doc/developer/index.rst @@ -9,6 +9,7 @@ FRRouting Developer's Guide packaging process-architecture library + tracing testing bgpd fpm diff --git a/doc/developer/tracing.rst b/doc/developer/tracing.rst new file mode 100644 index 0000000000..ee0a6be008 --- /dev/null +++ b/doc/developer/tracing.rst @@ -0,0 +1,314 @@ +.. _tracing: + +Tracing +======= + +FRR has a small but growing number of static tracepoints available for use with +various tracing systems. These tracepoints can assist with debugging, +performance analysis and to help understand program flow. They can also be used +for monitoring. + +Developers are encouraged to write new static tracepoints where sensible. They +are not compiled in by default, and even when they are, they have no overhead +unless enabled by a tracer, so it is okay to be liberal with them. + + +Supported tracers +----------------- + +Presently two types of tracepoints are supported: + +- `LTTng tracepoints <https://lttng.org/>`_ +- `USDT probes <http://dtrace.org/guide/chp-usdt.html>`_ + +LTTng is a tracing framework for Linux only. It offers extremely low overhead +and very rich tracing capabilities. FRR supports LTTng-UST, which is the +userspace implementation. LTTng tracepoints are very rich in detail. No kernel +modules are needed. Besides only being available for Linux, the primary +downside of LTTng is the need to link to ``lttng-ust``. + +USDT probes originate from Solaris, where they were invented for use with +dtrace. They are a kernel feature. At least Linux and FreeBSD support them. No +library is needed; support is compiled in via a system header +(``<sys/sdt.h>``). USDT probes are much slower than LTTng tracepoints and offer +less flexibility in what information can be gleaned from them. + +LTTng is capable of tracing USDT probes but has limited support for them. +SystemTap and dtrace both work only with USDT probes. + + +Usage +----- + +To compile with tracepoints, use one of the following configure flags: + +.. program:: configure.ac + +.. option:: --enable-lttng=yes + + Generate LTTng tracepoints + +.. option:: --enable-usdt=yes + + Generate USDT probes + +To trace with LTTng, compile with either one (prefer :option:`--enable-lttng` +run the target in non-forking mode (no ``-d``) and use LTTng as usual (refer to +LTTng user manual). When using USDT probes with LTTng, follow the example in +`this article +<https://lttng.org/blog/2019/10/15/new-dynamic-user-space-tracing-in-lttng/>`_. +To trace with dtrace or SystemTap, compile with :option:`--enable-usdt=yes` and +use your tracer as usual. + +To see available USDT probes:: + + readelf -n /usr/lib/frr/bgpd + +Example:: + + root@host ~> readelf -n /usr/lib/frr/bgpd + + Displaying notes found in: .note.ABI-tag + Owner Data size Description + GNU 0x00000010 NT_GNU_ABI_TAG (ABI version tag) + OS: Linux, ABI: 3.2.0 + + Displaying notes found in: .note.gnu.build-id + Owner Data size Description + GNU 0x00000014 NT_GNU_BUILD_ID (unique build ID bitstring) + Build ID: 4f42933a69dcb42a519bc459b2105177c8adf55d + + Displaying notes found in: .note.stapsdt + Owner Data size Description + stapsdt 0x00000045 NT_STAPSDT (SystemTap probe descriptors) + Provider: frr_bgp + Name: packet_read + Location: 0x000000000045ee48, Base: 0x00000000005a09d2, Semaphore: 0x0000000000000000 + Arguments: 8@-96(%rbp) 8@-104(%rbp) + stapsdt 0x00000047 NT_STAPSDT (SystemTap probe descriptors) + Provider: frr_bgp + Name: open_process + Location: 0x000000000047c43b, Base: 0x00000000005a09d2, Semaphore: 0x0000000000000000 + Arguments: 8@-224(%rbp) 2@-226(%rbp) + stapsdt 0x00000049 NT_STAPSDT (SystemTap probe descriptors) + Provider: frr_bgp + Name: update_process + Location: 0x000000000047c4bf, Base: 0x00000000005a09d2, Semaphore: 0x0000000000000000 + Arguments: 8@-208(%rbp) 2@-210(%rbp) + stapsdt 0x0000004f NT_STAPSDT (SystemTap probe descriptors) + Provider: frr_bgp + Name: notification_process + Location: 0x000000000047c557, Base: 0x00000000005a09d2, Semaphore: 0x0000000000000000 + Arguments: 8@-192(%rbp) 2@-194(%rbp) + stapsdt 0x0000004c NT_STAPSDT (SystemTap probe descriptors) + Provider: frr_bgp + Name: keepalive_process + Location: 0x000000000047c5db, Base: 0x00000000005a09d2, Semaphore: 0x0000000000000000 + Arguments: 8@-176(%rbp) 2@-178(%rbp) + stapsdt 0x0000004a NT_STAPSDT (SystemTap probe descriptors) + Provider: frr_bgp + Name: refresh_process + Location: 0x000000000047c673, Base: 0x00000000005a09d2, Semaphore: 0x0000000000000000 + Arguments: 8@-160(%rbp) 2@-162(%rbp) + stapsdt 0x0000004d NT_STAPSDT (SystemTap probe descriptors) + Provider: frr_bgp + Name: capability_process + Location: 0x000000000047c6f7, Base: 0x00000000005a09d2, Semaphore: 0x0000000000000000 + Arguments: 8@-144(%rbp) 2@-146(%rbp) + stapsdt 0x0000006f NT_STAPSDT (SystemTap probe descriptors) + Provider: frr_bgp + Name: output_filter + Location: 0x000000000048e33a, Base: 0x00000000005a09d2, Semaphore: 0x0000000000000000 + Arguments: 8@-144(%rbp) 8@-152(%rbp) 4@-156(%rbp) 4@-160(%rbp) 8@-168(%rbp) + stapsdt 0x0000007d NT_STAPSDT (SystemTap probe descriptors) + Provider: frr_bgp + Name: process_update + Location: 0x0000000000491f10, Base: 0x00000000005a09d2, Semaphore: 0x0000000000000000 + Arguments: 8@-800(%rbp) 8@-808(%rbp) 4@-812(%rbp) 4@-816(%rbp) 4@-820(%rbp) 8@-832(%rbp) + stapsdt 0x0000006e NT_STAPSDT (SystemTap probe descriptors) + Provider: frr_bgp + Name: input_filter + Location: 0x00000000004940ed, Base: 0x00000000005a09d2, Semaphore: 0x0000000000000000 + Arguments: 8@-144(%rbp) 8@-152(%rbp) 4@-156(%rbp) 4@-160(%rbp) 8@-168(%rbp) + + +To see available LTTng probes, run the target, create a session and then:: + + lttng list --userspace | grep frr + +Example:: + + root@host ~> lttng list --userspace | grep frr + PID: 11157 - Name: /usr/lib/frr/bgpd + frr_libfrr:route_node_get (loglevel: TRACE_DEBUG_LINE (13)) (type: tracepoint) + frr_libfrr:list_sort (loglevel: TRACE_DEBUG_LINE (13)) (type: tracepoint) + frr_libfrr:list_delete_node (loglevel: TRACE_DEBUG_LINE (13)) (type: tracepoint) + frr_libfrr:list_remove (loglevel: TRACE_DEBUG_LINE (13)) (type: tracepoint) + frr_libfrr:list_add (loglevel: TRACE_DEBUG_LINE (13)) (type: tracepoint) + frr_libfrr:memfree (loglevel: TRACE_DEBUG_LINE (13)) (type: tracepoint) + frr_libfrr:memalloc (loglevel: TRACE_DEBUG_LINE (13)) (type: tracepoint) + frr_libfrr:frr_pthread_stop (loglevel: TRACE_DEBUG_LINE (13)) (type: tracepoint) + frr_libfrr:frr_pthread_run (loglevel: TRACE_DEBUG_LINE (13)) (type: tracepoint) + frr_libfrr:thread_call (loglevel: TRACE_INFO (6)) (type: tracepoint) + frr_libfrr:thread_cancel_async (loglevel: TRACE_INFO (6)) (type: tracepoint) + frr_libfrr:thread_cancel (loglevel: TRACE_INFO (6)) (type: tracepoint) + frr_libfrr:schedule_write (loglevel: TRACE_INFO (6)) (type: tracepoint) + frr_libfrr:schedule_read (loglevel: TRACE_INFO (6)) (type: tracepoint) + frr_libfrr:schedule_event (loglevel: TRACE_INFO (6)) (type: tracepoint) + frr_libfrr:schedule_timer (loglevel: TRACE_INFO (6)) (type: tracepoint) + frr_libfrr:hash_release (loglevel: TRACE_INFO (6)) (type: tracepoint) + frr_libfrr:hash_insert (loglevel: TRACE_INFO (6)) (type: tracepoint) + frr_libfrr:hash_get (loglevel: TRACE_INFO (6)) (type: tracepoint) + frr_bgp:output_filter (loglevel: TRACE_INFO (6)) (type: tracepoint) + frr_bgp:input_filter (loglevel: TRACE_INFO (6)) (type: tracepoint) + frr_bgp:process_update (loglevel: TRACE_INFO (6)) (type: tracepoint) + frr_bgp:packet_read (loglevel: TRACE_INFO (6)) (type: tracepoint) + frr_bgp:refresh_process (loglevel: TRACE_INFO (6)) (type: tracepoint) + frr_bgp:capability_process (loglevel: TRACE_INFO (6)) (type: tracepoint) + frr_bgp:notification_process (loglevel: TRACE_INFO (6)) (type: tracepoint) + frr_bgp:update_process (loglevel: TRACE_INFO (6)) (type: tracepoint) + frr_bgp:keepalive_process (loglevel: TRACE_INFO (6)) (type: tracepoint) + frr_bgp:open_process (loglevel: TRACE_INFO (6)) (type: tracepoint) + +When using LTTng, you can also get zlogs as trace events by enabling +the ``lttng_ust_tracelog:*`` event class. + +Concepts +-------- + +Tracepoints are statically defined points in code where a developer has +determined that outside observers might gain something from knowing what is +going on at that point. It's like logging but with the ability to dump large +amounts of internal data with much higher performance. LTTng has a good summary +`here <https://lttng.org/docs/#doc-what-is-tracing>`_. + +Each tracepoint has a "provider" and name. The provider is basically a +namespace; for example, ``bgpd`` uses the provider name ``frr_bgp``. The name +is arbitrary, but because providers share a global namespace on the user's +system, all providers from FRR should be prefixed by ``frr_``. The tracepoint +name is just the name of the event. Events are globally named by their provider +and name. For example, the event when BGP reads a packet from a peer is +``frr_bgp:packet_read``. + +To do tracing, the tracing tool of choice is told which events to listen to. +For example, to listen to all events from FRR's BGP implementation, you would +enable the events ``frr_bgp:*``. In the same tracing session you could also +choose to record all memory allocations by enabling the ``malloc`` tracepoints +in ``libc`` as well as all kernel skb operations using the various in-kernel +tracepoints. This allows you to build as complete a view as desired of what the +system is doing during the tracing window (subject to what tracepoints are +available). + +Of particular use are the tracepoints for FRR's internal event scheduler; +tracing these allows you to see all events executed by all event loops for the +target(s) in question. Here's a couple events selected from a trace of BGP +during startup:: + + ... + + [18:41:35.750131763] (+0.000048901) host frr_libfrr:thread_call: { cpu_id = + 1 }, { threadmaster_name = "default", function_name = "zclient_connect", + scheduled_from = "lib/zclient.c", scheduled_on_line = 3877, thread_addr = + 0x0, file_descriptor = 0, event_value = 0, argument_ptr = 0xA37F70, timer = + 0 } + + [18:41:35.750175124] (+0.000020001) host frr_libfrr:thread_call: { cpu_id = + 1 }, { threadmaster_name = "default", function_name = "frr_config_read_in", + scheduled_from = "lib/libfrr.c", scheduled_on_line = 934, thread_addr = 0x0, + file_descriptor = 0, event_value = 0, argument_ptr = 0x0, timer = 0 } + + [18:41:35.753341264] (+0.000010532) host frr_libfrr:thread_call: { cpu_id = + 1 }, { threadmaster_name = "default", function_name = "bgp_event", + scheduled_from = "bgpd/bgpd.c", scheduled_on_line = 142, thread_addr = 0x0, + file_descriptor = 2, event_value = 2, argument_ptr = 0xE4D780, timer = 2 } + + [18:41:35.753404186] (+0.000004910) host frr_libfrr:thread_call: { cpu_id = + 1 }, { threadmaster_name = "default", function_name = "zclient_read", + scheduled_from = "lib/zclient.c", scheduled_on_line = 3891, thread_addr = + 0x0, file_descriptor = 40, event_value = 40, argument_ptr = 0xA37F70, timer + = 40 } + + ... + + +Very useful for getting a time-ordered look into what the process is doing. + + +Adding Tracepoints +------------------ + +Adding new tracepoints is a two step process: + +1. Define the tracepoint +2. Use the tracepoint + +Tracepoint definitions state the "provider" and name of the tracepoint, along +with any values it will produce, and how to format them. This is done with +macros provided by LTTng. USDT probes do not use definitions and are inserted +at the trace site with a single macro. However, to maintain support for both +platforms, you must define an LTTng tracepoint when adding a new one. +``frrtrace()`` will expand to the appropriate ``DTRACE_PROBEn`` macro when USDT +is in use. + +If you are adding new tracepoints to a daemon that has no tracepoints, that +daemon's ``subdir.am`` must be updated to conditionally link ``lttng-ust``. +Look at ``bgpd/subdir.am`` for an example of how to do this; grep for +``UST_LIBS``. Create new files named ``<daemon>_trace.[ch]``. Use +``bgpd/bgp_trace.[h]`` as boilerplate. If you are adding tracepoints to a +daemon that already has them, look for the ``<daemon>_trace.h`` file; +tracepoints are written here. + +Refer to the `LTTng developer docs +<https://lttng.org/docs/#doc-c-application>`_ for details on how to define +tracepoints. + +To use them, simply add a call to ``frrtrace()`` at the point you'd like the +event to be emitted, like so: + +.. code-block:: c + + ... + + switch (type) { + case BGP_MSG_OPEN: + frrtrace(2, frr_bgp, open_process, peer, size); /* tracepoint */ + atomic_fetch_add_explicit(&peer->open_in, 1, + memory_order_relaxed); + mprc = bgp_open_receive(peer, size); + + ... + +After recompiling this tracepoint will now be available, either as a USDT probe +or LTTng tracepoint, depending on your compilation choice. + + +trace.h +^^^^^^^ + +Because FRR supports multiple types of tracepoints, the code for creating them +abstracts away the underlying system being used. This abstraction code is in +``lib/trace.h``. There are 2 function-like macros that are used for working +with tracepoints. + +- ``frrtrace()`` defines tracepoints +- ``frrtrace_enabled()`` checks whether a tracepoint is enabled + +There is also ``frrtracelog()``, which is used in zlog core code to make zlog +messages available as trace events to LTTng. This should not be used elsewhere. + +There is additional documentation in the header. The key thing to note is that +you should never include ``trace.h`` in source where you plan to put +tracepoints; include the tracepoint definition header instead (e.g. +:file:`bgp_trace.h`). + + +Limitations +----------- + +Tracers do not like ``fork()`` or ``dlopen()``. LTTng has some workarounds for +this involving interceptor libraries using ``LD_PRELOAD``. + +USDT tracepoints are relatively high overhead and probably shouldn't be used +for "flight recorder" functionality, i.e. enabling and passively recording all +events for monitoring purposes. It's generally okay to use LTTng like this, +though. diff --git a/doc/user/bgp.rst b/doc/user/bgp.rst index fb0ca10da4..339be7f4d6 100644 --- a/doc/user/bgp.rst +++ b/doc/user/bgp.rst @@ -1005,6 +1005,12 @@ Route Aggregation-IPv4 Address Family Configure the aggregated address to only be created when the routes MED match, otherwise no aggregated route will be created. +.. index:: aggregate-address A.B.C.D/M suppress-map NAME +.. clicmd:: aggregate-address A.B.C.D/M suppress-map NAME + + Similar to `summary-only`, but will only suppress more specific routes that + are matched by the selected route-map. + .. index:: no aggregate-address A.B.C.D/M .. clicmd:: no aggregate-address A.B.C.D/M @@ -1063,6 +1069,11 @@ Route Aggregation-IPv6 Address Family Configure the aggregated address to only be created when the routes MED match, otherwise no aggregated route will be created. +.. index:: aggregate-address X:X::X:X/M suppress-map NAME +.. clicmd:: aggregate-address X:X::X:X/M suppress-map NAME + + Similar to `summary-only`, but will only suppress more specific routes that + are matched by the selected route-map. .. index:: no aggregate-address X:X::X:X/M .. clicmd:: no aggregate-address X:X::X:X/M @@ -2584,6 +2595,194 @@ This makes it possible to separate not only layer 3 networks like VRF-lite netwo Also, VRF netns based make possible to separate layer 2 networks on separate VRF instances. +.. _bgp-conditional-advertisement: + +BGP Conditional Advertisement +----------------------------- +The BGP conditional advertisement feature uses the ``non-exist-map`` or the +``exist-map`` and the ``advertise-map`` keywords of the neighbor advertise-map +command in order to track routes by the route prefix. + +``non-exist-map`` + 1. If a route prefix is not present in the output of non-exist-map command, + then advertise the route specified by the advertise-map command. + + 2. If a route prefix is present in the output of non-exist-map command, + then do not advertise the route specified by the addvertise-map command. + +``exist-map`` + 1. If a route prefix is present in the output of exist-map command, + then advertise the route specified by the advertise-map command. + + 2. If a route prefix is not present in the output of exist-map command, + then do not advertise the route specified by the advertise-map command. + +This feature is useful when some prefixes are advertised to one of its peers +only if the information from the other peer is not present (due to failure in +peering session or partial reachability etc). + +The conditional BGP announcements are sent in addition to the normal +announcements that a BGP router sends to its peer. + +The conditional advertisement process is triggered by the BGP scanner process, +which runs every 60 seconds. This means that the maximum time for the conditional +advertisement to take effect is 60 seconds. The conditional advertisement can take +effect depending on when the tracked route is removed from the BGP table and +when the next instance of the BGP scanner occurs. + +.. index:: [no] neighbor A.B.C.D advertise-map NAME [exist-map|non-exist-map] NAME +.. clicmd:: [no] neighbor A.B.C.D advertise-map NAME [exist-map|non-exist-map] NAME + + This command enables BGP scanner process to monitor routes specified by + exist-map or non-exist-map command in BGP table and conditionally advertises + the routes specified by advertise-map command. + +Sample Configuration +^^^^^^^^^^^^^^^^^^^^^ +.. code-block:: frr + + interface enp0s9 + ip address 10.10.10.2/24 + ! + interface enp0s10 + ip address 10.10.20.2/24 + ! + interface lo + ip address 203.0.113.1/32 + ! + router bgp 2 + bgp log-neighbor-changes + no bgp ebgp-requires-policy + neighbor 10.10.10.1 remote-as 1 + neighbor 10.10.20.3 remote-as 3 + ! + address-family ipv4 unicast + neighbor 10.10.10.1 soft-reconfiguration inbound + neighbor 10.10.20.3 soft-reconfiguration inbound + neighbor 10.10.20.3 advertise-map ADV-MAP non-exist-map EXIST-MAP + exit-address-family + ! + ip prefix-list DEFAULT seq 5 permit 192.0.2.5/32 + ip prefix-list DEFAULT seq 10 permit 192.0.2.1/32 + ip prefix-list EXIST seq 5 permit 10.10.10.10/32 + ip prefix-list DEFAULT-ROUTE seq 5 permit 0.0.0.0/0 + ip prefix-list IP1 seq 5 permit 10.139.224.0/20 + ! + bgp community-list standard DC-ROUTES seq 5 permit 64952:3008 + bgp community-list standard DC-ROUTES seq 10 permit 64671:501 + bgp community-list standard DC-ROUTES seq 15 permit 64950:3009 + bgp community-list standard DEFAULT-ROUTE seq 5 permit 65013:200 + ! + route-map ADV-MAP permit 10 + match ip address prefix-list IP1 + ! + route-map ADV-MAP permit 20 + match community DC-ROUTES + ! + route-map EXIST-MAP permit 10 + match community DEFAULT-ROUTE + match ip address prefix-list DEFAULT-ROUTE + ! + +Sample Output +^^^^^^^^^^^^^ + +When default route is present in R2'2 BGP table, 10.139.224.0/20 and 192.0.2.1/32 are not advertised to R3. + +.. code-block:: frr + + Router2# show ip bgp + BGP table version is 20, local router ID is 203.0.113.1, vrf id 0 + Default local pref 100, local AS 2 + Status codes: s suppressed, d damped, h history, * valid, > best, = multipath, + i internal, r RIB-failure, S Stale, R Removed + Nexthop codes: @NNN nexthop's vrf id, < announce-nh-self + Origin codes: i - IGP, e - EGP, ? - incomplete + + Network Next Hop Metric LocPrf Weight Path + *> 0.0.0.0/0 10.10.10.1 0 0 1 i + *> 10.139.224.0/20 10.10.10.1 0 0 1 ? + *> 192.0.2.1/32 10.10.10.1 0 0 1 i + *> 192.0.2.5/32 10.10.10.1 0 0 1 i + + Displayed 4 routes and 4 total paths + Router2# show ip bgp neighbors 10.10.20.3 + + !--- Output suppressed. + + For address family: IPv4 Unicast + Update group 7, subgroup 7 + Packet Queue length 0 + Inbound soft reconfiguration allowed + Community attribute sent to this neighbor(all) + Condition NON_EXIST, Condition-map *EXIST-MAP, Advertise-map *ADV-MAP, status: Withdraw + 0 accepted prefixes + + !--- Output suppressed. + + Router2# show ip bgp neighbors 10.10.20.3 advertised-routes + BGP table version is 20, local router ID is 203.0.113.1, vrf id 0 + Default local pref 100, local AS 2 + Status codes: s suppressed, d damped, h history, * valid, > best, = multipath, + i internal, r RIB-failure, S Stale, R Removed + Nexthop codes: @NNN nexthop's vrf id, < announce-nh-self + Origin codes: i - IGP, e - EGP, ? - incomplete + + Network Next Hop Metric LocPrf Weight Path + *> 0.0.0.0/0 0.0.0.0 0 1 i + *> 192.0.2.5/32 0.0.0.0 0 1 i + + Total number of prefixes 2 + +When default route is not present in R2'2 BGP table, 10.139.224.0/20 and 192.0.2.1/32 are advertised to R3. + +.. code-block:: frr + + Router2# show ip bgp + BGP table version is 21, local router ID is 203.0.113.1, vrf id 0 + Default local pref 100, local AS 2 + Status codes: s suppressed, d damped, h history, * valid, > best, = multipath, + i internal, r RIB-failure, S Stale, R Removed + Nexthop codes: @NNN nexthop's vrf id, < announce-nh-self + Origin codes: i - IGP, e - EGP, ? - incomplete + + Network Next Hop Metric LocPrf Weight Path + *> 10.139.224.0/20 10.10.10.1 0 0 1 ? + *> 192.0.2.1/32 10.10.10.1 0 0 1 i + *> 192.0.2.5/32 10.10.10.1 0 0 1 i + + Displayed 3 routes and 3 total paths + + Router2# show ip bgp neighbors 10.10.20.3 + + !--- Output suppressed. + + For address family: IPv4 Unicast + Update group 7, subgroup 7 + Packet Queue length 0 + Inbound soft reconfiguration allowed + Community attribute sent to this neighbor(all) + Condition NON_EXIST, Condition-map *EXIST-MAP, Advertise-map *ADV-MAP, status: Advertise + 0 accepted prefixes + + !--- Output suppressed. + + Router2# show ip bgp neighbors 10.10.20.3 advertised-routes + BGP table version is 21, local router ID is 203.0.113.1, vrf id 0 + Default local pref 100, local AS 2 + Status codes: s suppressed, d damped, h history, * valid, > best, = multipath, + i internal, r RIB-failure, S Stale, R Removed + Nexthop codes: @NNN nexthop's vrf id, < announce-nh-self + Origin codes: i - IGP, e - EGP, ? - incomplete + + Network Next Hop Metric LocPrf Weight Path + *> 10.139.224.0/20 0.0.0.0 0 1 ? + *> 192.0.2.1/32 0.0.0.0 0 1 i + *> 192.0.2.5/32 0.0.0.0 0 1 i + + Total number of prefixes 3 + Router2# + .. _bgp-debugging: Debugging diff --git a/doc/user/isisd.rst b/doc/user/isisd.rst index df7c72f8dc..98f5aff7db 100644 --- a/doc/user/isisd.rst +++ b/doc/user/isisd.rst @@ -423,8 +423,8 @@ Showing ISIS information Show topology IS-IS paths to Intermediate Systems, globally, in area (level-1) or domain (level-2). -.. index:: show isis route [level-1|level-2] [backup] -.. clicmd:: show isis route [level-1|level-2] [backup] +.. index:: show isis route [level-1|level-2] [prefix-sid|backup] +.. clicmd:: show isis route [level-1|level-2] [prefix-sid|backup] Show the ISIS routing table, as determined by the most recent SPF calculation. @@ -515,14 +515,16 @@ Known limitations: MPLS dataplane. E.g. for Linux kernel, since version 4.13 the maximum value is 32. -.. index:: [no] segment-routing prefix <A.B.C.D/M|X:X::X:X/M> <absolute (16-1048575)|index (0-65535)> [no-php-flag|explicit-null] -.. clicmd:: [no] segment-routing prefix <A.B.C.D/M|X:X::X:X/M> <absolute (16-1048575)|index (0-65535) [no-php-flag|explicit-null] +.. index:: [no] segment-routing prefix <A.B.C.D/M|X:X::X:X/M> <absolute (16-1048575)|index (0-65535)> [no-php-flag|explicit-null] [n-flag-clear] +.. clicmd:: [no] segment-routing prefix <A.B.C.D/M|X:X::X:X/M> <absolute (16-1048575)|index (0-65535) [no-php-flag|explicit-null] [n-flag-clear] Set the Segment Routing index or absolute label value for the specified prefix. The 'no-php-flag' means NO Penultimate Hop Popping that allows SR node to request to its neighbor to not pop the label. The 'explicit-null' flag allows SR node to request to its neighbor to send IP packet with the - EXPLICIT-NULL label. + EXPLICIT-NULL label. The 'n-flag-clear' option can be used to explicitly + clear the Node flag that is set by default for Prefix-SIDs associated to + loopback addresses. This option is necessary to configure Anycast-SIDs. .. index:: show isis segment-routing prefix-sids .. clicmd:: show isis segment-routing prefix-sids diff --git a/eigrpd/eigrp_filter.c b/eigrpd/eigrp_filter.c index 9d5d45ca50..009b57e05f 100644 --- a/eigrpd/eigrp_filter.c +++ b/eigrpd/eigrp_filter.c @@ -159,13 +159,10 @@ void eigrp_distribute_update(struct distribute_ctx *ctx, #endif // TODO: check Graceful restart after 10sec - /* check if there is already GR scheduled */ - if (e->t_distribute != NULL) { - /* if is, cancel schedule */ - thread_cancel(e->t_distribute); - } + /* cancel GR scheduled */ + thread_cancel(&(e->t_distribute)); + /* schedule Graceful restart for whole process in 10sec */ - e->t_distribute = NULL; thread_add_timer(master, eigrp_distribute_timer_process, e, (10), &e->t_distribute); @@ -267,11 +264,8 @@ void eigrp_distribute_update(struct distribute_ctx *ctx, #endif // TODO: check Graceful restart after 10sec - /* check if there is already GR scheduled */ - if (ei->t_distribute != NULL) { - /* if is, cancel schedule */ - thread_cancel(ei->t_distribute); - } + /* Cancel GR scheduled */ + thread_cancel(&(ei->t_distribute)); /* schedule Graceful restart for interface in 10sec */ e->t_distribute = NULL; thread_add_timer(master, eigrp_distribute_timer_interface, ei, 10, diff --git a/eigrpd/eigrp_interface.c b/eigrpd/eigrp_interface.c index 2f3f347423..dd43dd0478 100644 --- a/eigrpd/eigrp_interface.c +++ b/eigrpd/eigrp_interface.c @@ -358,7 +358,7 @@ void eigrp_if_stream_unset(struct eigrp_interface *ei) if (ei->on_write_q) { listnode_delete(eigrp->oi_write_q, ei); if (list_isempty(eigrp->oi_write_q)) - thread_cancel(eigrp->t_write); + thread_cancel(&(eigrp->t_write)); ei->on_write_q = 0; } } @@ -420,7 +420,7 @@ void eigrp_if_free(struct eigrp_interface *ei, int source) struct eigrp *eigrp = ei->eigrp; if (source == INTERFACE_DOWN_BY_VTY) { - THREAD_OFF(ei->t_hello); + thread_cancel(&ei->t_hello); eigrp_hello_send(ei, EIGRP_HELLO_GRACEFUL_SHUTDOWN, NULL); } diff --git a/eigrpd/eigrp_northbound.c b/eigrpd/eigrp_northbound.c index 13887368f7..5b87f72640 100644 --- a/eigrpd/eigrp_northbound.c +++ b/eigrpd/eigrp_northbound.c @@ -243,10 +243,12 @@ static int eigrpd_instance_active_time_modify(struct nb_cb_modify_args *args) switch (args->event) { case NB_EV_VALIDATE: /* TODO: Not implemented. */ - return NB_ERR_INCONSISTENCY; case NB_EV_PREPARE: case NB_EV_ABORT: + return NB_OK; case NB_EV_APPLY: + snprintf(args->errmsg, args->errmsg_len, + "active time not implemented yet"); /* NOTHING */ break; } @@ -677,11 +679,12 @@ static int eigrpd_instance_neighbor_create(struct nb_cb_create_args *args) switch (args->event) { case NB_EV_VALIDATE: /* TODO: Not implemented. */ - return NB_ERR_INCONSISTENCY; case NB_EV_PREPARE: case NB_EV_ABORT: + return NB_OK; case NB_EV_APPLY: - /* NOTHING */ + snprintf(args->errmsg, args->errmsg_len, + "neighbor Command is not implemented yet"); break; } @@ -693,11 +696,12 @@ static int eigrpd_instance_neighbor_destroy(struct nb_cb_destroy_args *args) switch (args->event) { case NB_EV_VALIDATE: /* TODO: Not implemented. */ - return NB_ERR_INCONSISTENCY; case NB_EV_PREPARE: case NB_EV_ABORT: + return NB_OK; case NB_EV_APPLY: - /* NOTHING */ + snprintf(args->errmsg, args->errmsg_len, + "no neighbor Command is not implemented yet"); break; } @@ -768,11 +772,13 @@ eigrpd_instance_redistribute_route_map_modify(struct nb_cb_modify_args *args) switch (args->event) { case NB_EV_VALIDATE: /* TODO: Not implemented. */ - return NB_ERR_INCONSISTENCY; case NB_EV_PREPARE: case NB_EV_ABORT: + return NB_OK; case NB_EV_APPLY: - /* NOTHING */ + snprintf( + args->errmsg, args->errmsg_len, + "'redistribute X route-map FOO' command not implemented yet"); break; } @@ -785,11 +791,13 @@ eigrpd_instance_redistribute_route_map_destroy(struct nb_cb_destroy_args *args) switch (args->event) { case NB_EV_VALIDATE: /* TODO: Not implemented. */ - return NB_ERR_INCONSISTENCY; case NB_EV_PREPARE: case NB_EV_ABORT: + return NB_OK; case NB_EV_APPLY: - /* NOTHING */ + snprintf( + args->errmsg, args->errmsg_len, + "'no redistribute X route-map FOO' command not implemented yet"); break; } @@ -1079,10 +1087,12 @@ lib_interface_eigrp_split_horizon_modify(struct nb_cb_modify_args *args) switch (args->event) { case NB_EV_VALIDATE: /* TODO: Not implemented. */ - return NB_ERR_INCONSISTENCY; case NB_EV_PREPARE: case NB_EV_ABORT: + return NB_OK; case NB_EV_APPLY: + snprintf(args->errmsg, args->errmsg_len, + "split-horizon command not implemented yet"); /* NOTHING */ break; } @@ -1161,11 +1171,12 @@ static int lib_interface_eigrp_instance_summarize_addresses_create( switch (args->event) { case NB_EV_VALIDATE: /* TODO: Not implemented. */ - return NB_ERR_INCONSISTENCY; case NB_EV_PREPARE: case NB_EV_ABORT: + return NB_OK; case NB_EV_APPLY: - /* NOTHING */ + snprintf(args->errmsg, args->errmsg_len, + "summary command not implemented yet"); break; } @@ -1178,10 +1189,12 @@ static int lib_interface_eigrp_instance_summarize_addresses_destroy( switch (args->event) { case NB_EV_VALIDATE: /* TODO: Not implemented. */ - return NB_ERR_INCONSISTENCY; case NB_EV_PREPARE: case NB_EV_ABORT: + return NB_OK; case NB_EV_APPLY: + snprintf(args->errmsg, args->errmsg_len, + "no summary command not implemented yet"); /* NOTHING */ break; } diff --git a/isisd/fabricd.c b/isisd/fabricd.c index 1a081bbea6..57e9e91c15 100644 --- a/isisd/fabricd.c +++ b/isisd/fabricd.c @@ -239,14 +239,11 @@ struct fabricd *fabricd_new(struct isis_area *area) void fabricd_finish(struct fabricd *f) { - if (f->initial_sync_timeout) - thread_cancel(f->initial_sync_timeout); + thread_cancel(&(f->initial_sync_timeout)); - if (f->tier_calculation_timer) - thread_cancel(f->tier_calculation_timer); + thread_cancel(&(f->tier_calculation_timer)); - if (f->tier_set_timer) - thread_cancel(f->tier_set_timer); + thread_cancel(&(f->tier_set_timer)); isis_spftree_del(f->spftree); neighbor_lists_clear(f); @@ -340,8 +337,7 @@ void fabricd_initial_sync_finish(struct isis_area *area) f->initial_sync_circuit->interface->name); f->initial_sync_state = FABRICD_SYNC_COMPLETE; f->initial_sync_circuit = NULL; - thread_cancel(f->initial_sync_timeout); - f->initial_sync_timeout = NULL; + thread_cancel(&(f->initial_sync_timeout)); } static void fabricd_bump_tier_calculation_timer(struct fabricd *f); @@ -437,22 +433,15 @@ static int fabricd_tier_calculation_cb(struct thread *thread) static void fabricd_bump_tier_calculation_timer(struct fabricd *f) { /* Cancel timer if we already know our tier */ - if (f->tier != ISIS_TIER_UNDEFINED - || f->tier_set_timer) { - if (f->tier_calculation_timer) { - thread_cancel(f->tier_calculation_timer); - f->tier_calculation_timer = NULL; - } + if (f->tier != ISIS_TIER_UNDEFINED || f->tier_set_timer) { + thread_cancel(&(f->tier_calculation_timer)); return; } /* If we need to calculate the tier, wait some * time for the topology to settle before running * the calculation */ - if (f->tier_calculation_timer) { - thread_cancel(f->tier_calculation_timer); - f->tier_calculation_timer = NULL; - } + thread_cancel(&(f->tier_calculation_timer)); thread_add_timer(master, fabricd_tier_calculation_cb, f, 2 * f->area->lsp_gen_interval[ISIS_LEVEL2 - 1], @@ -737,7 +726,7 @@ void fabricd_trigger_csnp(struct isis_area *area, bool circuit_scoped) if (!circuit->t_send_csnp[1]) continue; - thread_cancel(circuit->t_send_csnp[ISIS_LEVEL2 - 1]); + thread_cancel(&(circuit->t_send_csnp[ISIS_LEVEL2 - 1])); thread_add_timer_msec(master, send_l2_csnp, circuit, isis_jitter(f->csnp_delay, CSNP_JITTER), &circuit->t_send_csnp[ISIS_LEVEL2 - 1]); diff --git a/isisd/isis_adjacency.c b/isisd/isis_adjacency.c index 5bfbb2cf7e..71d4758163 100644 --- a/isisd/isis_adjacency.c +++ b/isisd/isis_adjacency.c @@ -147,7 +147,7 @@ void isis_delete_adj(void *arg) if (!adj) return; - THREAD_TIMER_OFF(adj->t_expire); + thread_cancel(&adj->t_expire); if (adj->adj_state != ISIS_ADJ_DOWN) adj->adj_state = ISIS_ADJ_DOWN; @@ -393,7 +393,7 @@ void isis_adj_print(struct isis_adjacency *adj) if (adj->ipv4_address_count) { zlog_debug("IPv4 Address(es):"); for (unsigned int i = 0; i < adj->ipv4_address_count; i++) - zlog_debug("%s", inet_ntoa(adj->ipv4_addresses[i])); + zlog_debug("%pI4", &adj->ipv4_addresses[i]); } if (adj->ipv6_address_count) { @@ -562,8 +562,8 @@ void isis_adj_print_vty(struct isis_adjacency *adj, struct vty *vty, vty_out(vty, " IPv4 Address(es):\n"); for (unsigned int i = 0; i < adj->ipv4_address_count; i++) - vty_out(vty, " %s\n", - inet_ntoa(adj->ipv4_addresses[i])); + vty_out(vty, " %pI4\n", + &adj->ipv4_addresses[i]); } if (adj->ipv6_address_count) { vty_out(vty, " IPv6 Address(es):\n"); diff --git a/isisd/isis_circuit.c b/isisd/isis_circuit.c index 3eb3b900a5..730d224cb8 100644 --- a/isisd/isis_circuit.c +++ b/isisd/isis_circuit.c @@ -788,12 +788,12 @@ void isis_circuit_down(struct isis_circuit *circuit) memset(circuit->u.bc.l2_desig_is, 0, ISIS_SYS_ID_LEN + 1); memset(circuit->u.bc.snpa, 0, ETH_ALEN); - THREAD_TIMER_OFF(circuit->u.bc.t_send_lan_hello[0]); - THREAD_TIMER_OFF(circuit->u.bc.t_send_lan_hello[1]); - THREAD_TIMER_OFF(circuit->u.bc.t_run_dr[0]); - THREAD_TIMER_OFF(circuit->u.bc.t_run_dr[1]); - THREAD_TIMER_OFF(circuit->u.bc.t_refresh_pseudo_lsp[0]); - THREAD_TIMER_OFF(circuit->u.bc.t_refresh_pseudo_lsp[1]); + thread_cancel(&circuit->u.bc.t_send_lan_hello[0]); + thread_cancel(&circuit->u.bc.t_send_lan_hello[1]); + thread_cancel(&circuit->u.bc.t_run_dr[0]); + thread_cancel(&circuit->u.bc.t_run_dr[1]); + thread_cancel(&circuit->u.bc.t_refresh_pseudo_lsp[0]); + thread_cancel(&circuit->u.bc.t_refresh_pseudo_lsp[1]); circuit->lsp_regenerate_pending[0] = 0; circuit->lsp_regenerate_pending[1] = 0; @@ -803,15 +803,15 @@ void isis_circuit_down(struct isis_circuit *circuit) } else if (circuit->circ_type == CIRCUIT_T_P2P) { isis_delete_adj(circuit->u.p2p.neighbor); circuit->u.p2p.neighbor = NULL; - THREAD_TIMER_OFF(circuit->u.p2p.t_send_p2p_hello); + thread_cancel(&circuit->u.p2p.t_send_p2p_hello); } /* Cancel all active threads */ - THREAD_TIMER_OFF(circuit->t_send_csnp[0]); - THREAD_TIMER_OFF(circuit->t_send_csnp[1]); - THREAD_TIMER_OFF(circuit->t_send_psnp[0]); - THREAD_TIMER_OFF(circuit->t_send_psnp[1]); - THREAD_OFF(circuit->t_read); + thread_cancel(&circuit->t_send_csnp[0]); + thread_cancel(&circuit->t_send_csnp[1]); + thread_cancel(&circuit->t_send_psnp[0]); + thread_cancel(&circuit->t_send_psnp[1]); + thread_cancel(&circuit->t_read); if (circuit->tx_queue) { isis_tx_queue_free(circuit->tx_queue); diff --git a/isisd/isis_cli.c b/isisd/isis_cli.c index a270636dde..383f23758a 100644 --- a/isisd/isis_cli.c +++ b/isisd/isis_cli.c @@ -1628,7 +1628,7 @@ DEFPY_YANG (isis_sr_prefix_sid, "segment-routing prefix\ <A.B.C.D/M|X:X::X:X/M>$prefix\ <absolute$sid_type (16-1048575)$sid_value|index$sid_type (0-65535)$sid_value>\ - [<no-php-flag|explicit-null>$lh_behavior]", + [<no-php-flag|explicit-null>$lh_behavior] [n-flag-clear$n_flag_clear]", SR_STR "Prefix SID\n" "IPv4 Prefix\n" @@ -1638,7 +1638,8 @@ DEFPY_YANG (isis_sr_prefix_sid, "Specify the index of Prefix Segement ID\n" "The Prefix Segment ID index\n" "Don't request Penultimate Hop Popping (PHP)\n" - "Upstream neighbor must replace prefix-sid with explicit null label\n") + "Upstream neighbor must replace prefix-sid with explicit null label\n" + "Not a node SID\n") { nb_cli_enqueue_change(vty, ".", NB_OP_CREATE, NULL); nb_cli_enqueue_change(vty, "./sid-value-type", NB_OP_MODIFY, sid_type); @@ -1656,6 +1657,8 @@ DEFPY_YANG (isis_sr_prefix_sid, } else nb_cli_enqueue_change(vty, "./last-hop-behavior", NB_OP_MODIFY, NULL); + nb_cli_enqueue_change(vty, "./n-flag-clear", NB_OP_MODIFY, + n_flag_clear ? "true" : "false"); return nb_cli_apply_changes( vty, "./segment-routing/prefix-sid-map/prefix-sid[prefix='%s']", @@ -1665,7 +1668,8 @@ DEFPY_YANG (isis_sr_prefix_sid, DEFPY_YANG (no_isis_sr_prefix_sid, no_isis_sr_prefix_sid_cmd, "no segment-routing prefix <A.B.C.D/M|X:X::X:X/M>$prefix\ - [<absolute$sid_type (16-1048575)|index (0-65535)> [<no-php-flag|explicit-null>]]", + [<absolute$sid_type (16-1048575)|index (0-65535)> [<no-php-flag|explicit-null>]]\ + [n-flag-clear]", NO_STR SR_STR "Prefix SID\n" @@ -1676,7 +1680,8 @@ DEFPY_YANG (no_isis_sr_prefix_sid, "Specify the index of Prefix Segement ID\n" "The Prefix Segment ID index\n" "Don't request Penultimate Hop Popping (PHP)\n" - "Upstream neighbor must replace prefix-sid with explicit null label\n") + "Upstream neighbor must replace prefix-sid with explicit null label\n" + "Not a node SID\n") { nb_cli_enqueue_change(vty, ".", NB_OP_DESTROY, NULL); @@ -1692,11 +1697,13 @@ void cli_show_isis_prefix_sid(struct vty *vty, struct lyd_node *dnode, const char *lh_behavior; const char *sid_value_type; const char *sid_value; + bool n_flag_clear; prefix = yang_dnode_get_string(dnode, "./prefix"); lh_behavior = yang_dnode_get_string(dnode, "./last-hop-behavior"); sid_value_type = yang_dnode_get_string(dnode, "./sid-value-type"); sid_value = yang_dnode_get_string(dnode, "./sid-value"); + n_flag_clear = yang_dnode_get_bool(dnode, "./n-flag-clear"); vty_out(vty, " segment-routing prefix %s", prefix); if (strmatch(sid_value_type, "absolute")) @@ -1708,6 +1715,8 @@ void cli_show_isis_prefix_sid(struct vty *vty, struct lyd_node *dnode, vty_out(vty, " no-php-flag"); else if (strmatch(lh_behavior, "explicit-null")) vty_out(vty, " explicit-null"); + if (n_flag_clear) + vty_out(vty, " n-flag-clear"); vty_out(vty, "\n"); } diff --git a/isisd/isis_dr.c b/isisd/isis_dr.c index 3324d74e0f..d03f857a0c 100644 --- a/isisd/isis_dr.c +++ b/isisd/isis_dr.c @@ -221,8 +221,8 @@ int isis_dr_resign(struct isis_circuit *circuit, int level) circuit->u.bc.is_dr[level - 1] = 0; circuit->u.bc.run_dr_elect[level - 1] = 0; - THREAD_TIMER_OFF(circuit->u.bc.t_run_dr[level - 1]); - THREAD_TIMER_OFF(circuit->u.bc.t_refresh_pseudo_lsp[level - 1]); + thread_cancel(&circuit->u.bc.t_run_dr[level - 1]); + thread_cancel(&circuit->u.bc.t_refresh_pseudo_lsp[level - 1]); circuit->lsp_regenerate_pending[level - 1] = 0; memcpy(id, circuit->isis->sysid, ISIS_SYS_ID_LEN); @@ -246,7 +246,7 @@ int isis_dr_resign(struct isis_circuit *circuit, int level) &circuit->t_send_psnp[1]); } - THREAD_TIMER_OFF(circuit->t_send_csnp[level - 1]); + thread_cancel(&circuit->t_send_csnp[level - 1]); thread_add_timer(master, isis_run_dr, &circuit->level_arg[level - 1], diff --git a/isisd/isis_events.c b/isisd/isis_events.c index c4c95138c4..0b987fc5cf 100644 --- a/isisd/isis_events.c +++ b/isisd/isis_events.c @@ -109,13 +109,13 @@ static void circuit_resign_level(struct isis_circuit *circuit, int level) circuit->area->area_tag, circuit->circuit_id, circuit->interface->name, level); - THREAD_TIMER_OFF(circuit->t_send_csnp[idx]); - THREAD_TIMER_OFF(circuit->t_send_psnp[idx]); + thread_cancel(&circuit->t_send_csnp[idx]); + thread_cancel(&circuit->t_send_psnp[idx]); if (circuit->circ_type == CIRCUIT_T_BROADCAST) { - THREAD_TIMER_OFF(circuit->u.bc.t_send_lan_hello[idx]); - THREAD_TIMER_OFF(circuit->u.bc.t_run_dr[idx]); - THREAD_TIMER_OFF(circuit->u.bc.t_refresh_pseudo_lsp[idx]); + thread_cancel(&circuit->u.bc.t_send_lan_hello[idx]); + thread_cancel(&circuit->u.bc.t_run_dr[idx]); + thread_cancel(&circuit->u.bc.t_refresh_pseudo_lsp[idx]); circuit->lsp_regenerate_pending[idx] = 0; circuit->u.bc.run_dr_elect[idx] = 0; circuit->u.bc.is_dr[idx] = 0; diff --git a/isisd/isis_ldp_sync.c b/isisd/isis_ldp_sync.c index 8360dfc59e..988af64c48 100644 --- a/isisd/isis_ldp_sync.c +++ b/isisd/isis_ldp_sync.c @@ -135,8 +135,8 @@ int isis_ldp_sync_announce_update(struct ldp_igp_sync_announce announce) } } - THREAD_TIMER_OFF(isis->ldp_sync_cmd.t_hello); - isis->ldp_sync_cmd.t_hello = NULL; + THREAD_OFF(isis->ldp_sync_cmd.t_hello); + isis->ldp_sync_cmd.sequence = 0; isis_ldp_sync_hello_timer_add(); @@ -186,7 +186,7 @@ int isis_ldp_sync_hello_update(struct ldp_igp_sync_hello hello) } } } else { - THREAD_TIMER_OFF(isis->ldp_sync_cmd.t_hello); + THREAD_OFF(isis->ldp_sync_cmd.t_hello); isis_ldp_sync_hello_timer_add(); } isis->ldp_sync_cmd.sequence = hello.sequence; @@ -280,8 +280,9 @@ void isis_ldp_sync_if_complete(struct isis_circuit *circuit) if (ldp_sync_info && ldp_sync_info->enabled == LDP_IGP_SYNC_ENABLED) { if (ldp_sync_info->state == LDP_IGP_SYNC_STATE_REQUIRED_NOT_UP) ldp_sync_info->state = LDP_IGP_SYNC_STATE_REQUIRED_UP; - THREAD_TIMER_OFF(ldp_sync_info->t_holddown); - ldp_sync_info->t_holddown = NULL; + + THREAD_OFF(ldp_sync_info->t_holddown); + isis_ldp_sync_set_if_metric(circuit, true); } } @@ -300,7 +301,7 @@ void isis_ldp_sync_ldp_fail(struct isis_circuit *circuit) if (ldp_sync_info && ldp_sync_info->enabled == LDP_IGP_SYNC_ENABLED && ldp_sync_info->state != LDP_IGP_SYNC_STATE_NOT_REQUIRED) { - THREAD_TIMER_OFF(ldp_sync_info->t_holddown); + THREAD_OFF(ldp_sync_info->t_holddown); ldp_sync_info->state = LDP_IGP_SYNC_STATE_REQUIRED_NOT_UP; isis_ldp_sync_set_if_metric(circuit, true); } @@ -323,7 +324,7 @@ void isis_ldp_sync_if_remove(struct isis_circuit *circuit, bool remove) ils_debug("ldp_sync: remove if %s", circuit->interface ? circuit->interface->name : ""); - THREAD_TIMER_OFF(ldp_sync_info->t_holddown); + THREAD_OFF(ldp_sync_info->t_holddown); ldp_sync_info->state = LDP_IGP_SYNC_STATE_NOT_REQUIRED; isis_ldp_sync_set_if_metric(circuit, true); if (remove) { @@ -662,8 +663,7 @@ void isis_ldp_sync_gbl_exit(bool remove) UNSET_FLAG(isis->ldp_sync_cmd.flags, LDP_SYNC_FLAG_ENABLE); UNSET_FLAG(isis->ldp_sync_cmd.flags, LDP_SYNC_FLAG_HOLDDOWN); isis->ldp_sync_cmd.holddown = LDP_IGP_SYNC_HOLDDOWN_DEFAULT; - THREAD_TIMER_OFF(isis->ldp_sync_cmd.t_hello); - isis->ldp_sync_cmd.t_hello = NULL; + THREAD_OFF(isis->ldp_sync_cmd.t_hello); /* remove LDP-SYNC on all ISIS interfaces */ FOR_ALL_INTERFACES (vrf, ifp) { diff --git a/isisd/isis_lfa.c b/isisd/isis_lfa.c index 8ca432f895..f22e4a7085 100644 --- a/isisd/isis_lfa.c +++ b/isisd/isis_lfa.c @@ -180,23 +180,6 @@ bool isis_lfa_excise_node_check(const struct isis_spftree *spftree, return false; } -/* Find SRGB associated to a System ID. */ -static struct isis_sr_block *tilfa_find_srgb(struct lspdb_head *lspdb, - const uint8_t *sysid) -{ - struct isis_lsp *lsp; - - lsp = isis_root_system_lsp(lspdb, sysid); - if (!lsp) - return NULL; - - if (!lsp->tlvs->router_cap - || lsp->tlvs->router_cap->srgb.range_size == 0) - return NULL; - - return &lsp->tlvs->router_cap->srgb; -} - struct tilfa_find_pnode_prefix_sid_args { uint32_t sid_index; }; @@ -308,25 +291,30 @@ tilfa_compute_label_stack(struct lspdb_head *lspdb, label_stack->num_labels = listcount(repair_list); for (ALL_LIST_ELEMENTS_RO(repair_list, node, sid)) { + const uint8_t *target_node; struct isis_sr_block *srgb; mpls_label_t label; switch (sid->type) { case TILFA_SID_PREFIX: - srgb = tilfa_find_srgb(lspdb, sadj->id); + if (sid->value.index.remote) + target_node = sid->value.index.remote_sysid; + else + target_node = sadj->id; + srgb = isis_sr_find_srgb(lspdb, target_node); if (!srgb) { zlog_warn("%s: SRGB not found for node %s", __func__, - print_sys_hostname(sadj->id)); + print_sys_hostname(target_node)); goto error; } /* Check if the SID index falls inside the SRGB. */ - if (sid->value.index >= srgb->range_size) { + if (sid->value.index.value >= srgb->range_size) { flog_warn( EC_ISIS_SID_OVERFLOW, "%s: SID index %u falls outside remote SRGB range", - __func__, sid->value.index); + __func__, sid->value.index.value); goto error; } @@ -334,7 +322,7 @@ tilfa_compute_label_stack(struct lspdb_head *lspdb, * Prefix-SID: map SID index to label value within the * SRGB. */ - label = srgb->lower_bound + sid->value.index; + label = srgb->lower_bound + sid->value.index.value; break; case TILFA_SID_ADJ: /* Adj-SID: absolute label value can be used directly */ @@ -446,7 +434,8 @@ static int tilfa_build_repair_list(struct isis_spftree *spftree_pc, struct listnode *node; bool is_pnode, is_qnode; char buf[VID2STR_BUFFER]; - struct isis_tilfa_sid sid_qnode, sid_pnode; + struct isis_tilfa_sid sid_dest = {}, sid_qnode = {}, sid_pnode = {}; + uint32_t sid_index; mpls_label_t label_qnode; if (IS_DEBUG_TILFA) { @@ -455,6 +444,24 @@ static int tilfa_build_repair_list(struct isis_spftree *spftree_pc, vtype2string(vertex->type), buf); } + /* Push original Prefix-SID label when necessary. */ + if (VTYPE_IP(vertex->type) && vertex->N.ip.sr.present) { + pvertex = listnode_head(vertex->parents); + assert(pvertex); + + sid_index = vertex->N.ip.sr.sid.value; + if (IS_DEBUG_TILFA) + zlog_debug( + "ISIS-TI-LFA: pushing Prefix-SID to %pFX (index %u)", + &vertex->N.ip.p.dest, sid_index); + sid_dest.type = TILFA_SID_PREFIX; + sid_dest.value.index.value = sid_index; + sid_dest.value.index.remote = true; + memcpy(sid_dest.value.index.remote_sysid, pvertex->N.id, + sizeof(sid_dest.value.index.remote_sysid)); + listnode_add_head(repair_list, &sid_dest); + } + if (!vertex_child) goto parents; if (vertex->type != VTYPE_NONPSEUDO_IS @@ -492,8 +499,6 @@ static int tilfa_build_repair_list(struct isis_spftree *spftree_pc, /* Push Prefix-SID label when necessary. */ if (is_pnode) { - uint32_t sid_index; - /* The same P-node can't be used more than once. */ if (isis_spf_node_find(used_pnodes, vertex->N.id)) { if (IS_DEBUG_TILFA) @@ -521,10 +526,10 @@ static int tilfa_build_repair_list(struct isis_spftree *spftree_pc, if (IS_DEBUG_TILFA) zlog_debug( - "ISIS-TI-LFA: pushing Prefix-SID to %s (index %u)", + "ISIS-TI-LFA: pushing Node-SID to %s (index %u)", print_sys_hostname(vertex->N.id), sid_index); sid_pnode.type = TILFA_SID_PREFIX; - sid_pnode.value.index = sid_index; + sid_pnode.value.index.value = sid_index; listnode_add_head(repair_list, &sid_pnode); /* Apply repair list. */ @@ -614,6 +619,10 @@ static bool lfa_check_needs_protection(const struct isis_spftree *spftree_pc, size_t affected_nhs = 0; struct isis_vertex_adj *vadj; + /* Local routes don't need protection. */ + if (VTYPE_IP(vertex->type) && vertex->depth == 1) + return false; + /* Only local adjacencies need Adj-SID protection. */ if (VTYPE_IS(vertex->type) && !isis_adj_find(spftree_pc->area, spftree_pc->level, @@ -700,7 +709,7 @@ int isis_lfa_check(struct isis_spftree *spftree_pc, struct isis_vertex *vertex) struct route_table *route_table; route_table = spftree_pc->lfa.old.spftree->route_table_backup; - if (route_node_lookup(route_table, &vertex->N.ip.dest)) { + if (route_node_lookup(route_table, &vertex->N.ip.p.dest)) { if (IS_DEBUG_TILFA) zlog_debug( "ISIS-TI-LFA: %s %s already covered by node protection", diff --git a/isisd/isis_lfa.h b/isisd/isis_lfa.h index 62a7666f9c..835618760c 100644 --- a/isisd/isis_lfa.h +++ b/isisd/isis_lfa.h @@ -28,7 +28,11 @@ enum isis_tilfa_sid_type { struct isis_tilfa_sid { enum isis_tilfa_sid_type type; union { - uint32_t index; + struct { + uint32_t value; + bool remote; + uint8_t remote_sysid[ISIS_SYS_ID_LEN]; + } index; mpls_label_t label; } value; }; diff --git a/isisd/isis_lsp.c b/isisd/isis_lsp.c index 2e38663d3f..d8ad4cd510 100644 --- a/isisd/isis_lsp.c +++ b/isisd/isis_lsp.c @@ -1241,7 +1241,7 @@ int lsp_generate(struct isis_area *area, int level) refresh_time = lsp_refresh_time(newlsp, rem_lifetime); - THREAD_TIMER_OFF(area->t_lsp_refresh[level - 1]); + thread_cancel(&area->t_lsp_refresh[level - 1]); area->lsp_regenerate_pending[level - 1] = 0; thread_add_timer(master, lsp_refresh, &area->lsp_refresh_arg[level - 1], refresh_time, @@ -1451,7 +1451,7 @@ int _lsp_regenerate_schedule(struct isis_area *area, int level, "ISIS (%s): Will schedule regen timer. Last run was: %lld, Now is: %lld", area->area_tag, (long long)lsp->last_generated, (long long)now); - THREAD_TIMER_OFF(area->t_lsp_refresh[lvl - 1]); + thread_cancel(&area->t_lsp_refresh[lvl - 1]); diff = now - lsp->last_generated; if (diff < area->lsp_gen_interval[lvl - 1] && !(area->bfd_signalled_down)) { @@ -1628,7 +1628,7 @@ int lsp_generate_pseudo(struct isis_circuit *circuit, int level) lsp_flood(lsp, NULL); refresh_time = lsp_refresh_time(lsp, rem_lifetime); - THREAD_TIMER_OFF(circuit->u.bc.t_refresh_pseudo_lsp[level - 1]); + thread_cancel(&circuit->u.bc.t_refresh_pseudo_lsp[level - 1]); circuit->lsp_regenerate_pending[level - 1] = 0; if (level == IS_LEVEL_1) thread_add_timer( @@ -1819,7 +1819,7 @@ int lsp_regenerate_schedule_pseudo(struct isis_circuit *circuit, int level) "ISIS (%s): Will schedule PSN regen timer. Last run was: %lld, Now is: %lld", area->area_tag, (long long)lsp->last_generated, (long long)now); - THREAD_TIMER_OFF(circuit->u.bc.t_refresh_pseudo_lsp[lvl - 1]); + thread_cancel(&circuit->u.bc.t_refresh_pseudo_lsp[lvl - 1]); diff = now - lsp->last_generated; if (diff < circuit->area->lsp_gen_interval[lvl - 1]) { timeout = diff --git a/isisd/isis_nb.c b/isisd/isis_nb.c index d04012c4da..2d3c7e1e38 100644 --- a/isisd/isis_nb.c +++ b/isisd/isis_nb.c @@ -538,6 +538,12 @@ const struct frr_yang_module_info frr_isisd_info = { }, }, { + .xpath = "/frr-isisd:isis/instance/segment-routing/prefix-sid-map/prefix-sid/n-flag-clear", + .cbs = { + .modify = isis_instance_segment_routing_prefix_sid_map_prefix_sid_n_flag_clear_modify, + } + }, + { .xpath = "/frr-isisd:isis/instance/mpls/ldp-sync", .cbs = { .cli_show = cli_show_isis_mpls_ldp_sync, diff --git a/isisd/isis_nb.h b/isisd/isis_nb.h index 303a7b4696..fb843131d9 100644 --- a/isisd/isis_nb.h +++ b/isisd/isis_nb.h @@ -206,6 +206,8 @@ int isis_instance_segment_routing_prefix_sid_map_prefix_sid_sid_value_modify( struct nb_cb_modify_args *args); int isis_instance_segment_routing_prefix_sid_map_prefix_sid_last_hop_behavior_modify( struct nb_cb_modify_args *args); +int isis_instance_segment_routing_prefix_sid_map_prefix_sid_n_flag_clear_modify( + struct nb_cb_modify_args *args); int isis_instance_mpls_ldp_sync_destroy(struct nb_cb_destroy_args *args); int isis_instance_mpls_ldp_sync_create(struct nb_cb_create_args *args); int isis_instance_mpls_ldp_sync_holddown_modify(struct nb_cb_modify_args *args); diff --git a/isisd/isis_nb_config.c b/isisd/isis_nb_config.c index 2710c3c13f..6cb7d32c25 100644 --- a/isisd/isis_nb_config.c +++ b/isisd/isis_nb_config.c @@ -1838,6 +1838,23 @@ int isis_instance_segment_routing_prefix_sid_map_prefix_sid_last_hop_behavior_mo } /* + * XPath: /frr-isisd:isis/instance/segment-routing/prefix-sid-map/prefix-sid/n-flag-clear + */ +int isis_instance_segment_routing_prefix_sid_map_prefix_sid_n_flag_clear_modify( + struct nb_cb_modify_args *args) +{ + struct sr_prefix_cfg *pcfg; + + if (args->event != NB_EV_APPLY) + return NB_OK; + + pcfg = nb_running_get_entry(args->dnode, NULL, true); + pcfg->n_flag_clear = yang_dnode_get_bool(args->dnode, NULL); + + return NB_OK; +} + +/* * XPath: /frr-isisd:isis/instance/mpls/ldp-sync */ int isis_instance_mpls_ldp_sync_create(struct nb_cb_create_args *args) @@ -2844,8 +2861,7 @@ int lib_interface_isis_mpls_ldp_sync_modify(struct nb_cb_modify_args *args) SET_FLAG(ldp_sync_info->flags, LDP_SYNC_FLAG_IF_CONFIG); ldp_sync_info->enabled = LDP_IGP_SYNC_DEFAULT; ldp_sync_info->state = LDP_IGP_SYNC_STATE_NOT_REQUIRED; - THREAD_TIMER_OFF(ldp_sync_info->t_holddown); - ldp_sync_info->t_holddown = NULL; + THREAD_OFF(ldp_sync_info->t_holddown); isis_ldp_sync_set_if_metric(circuit, true); } break; diff --git a/isisd/isis_pdu.c b/isisd/isis_pdu.c index d6f2571178..72de5d6543 100644 --- a/isisd/isis_pdu.c +++ b/isisd/isis_pdu.c @@ -205,7 +205,7 @@ static int process_p2p_hello(struct iih_info *iih) adj); /* lets take care of the expiry */ - THREAD_TIMER_OFF(adj->t_expire); + thread_cancel(&adj->t_expire); thread_add_timer(master, isis_adj_expire, adj, (long)adj->hold_time, &adj->t_expire); @@ -497,7 +497,7 @@ static int process_lan_hello(struct iih_info *iih) adj); /* lets take care of the expiry */ - THREAD_TIMER_OFF(adj->t_expire); + thread_cancel(&adj->t_expire); thread_add_timer(master, isis_adj_expire, adj, (long)adj->hold_time, &adj->t_expire); @@ -1987,7 +1987,7 @@ static void _send_hello_sched(struct isis_circuit *circuit, if (thread_timer_remain_msec(*threadp) < (unsigned long)delay) return; - thread_cancel(*threadp); + thread_cancel(threadp); } thread_add_timer_msec(master, send_hello_cb, diff --git a/isisd/isis_route.c b/isisd/isis_route.c index 7e8c877bd0..d664a6f896 100644 --- a/isisd/isis_route.c +++ b/isisd/isis_route.c @@ -71,7 +71,6 @@ static struct isis_nexthop *isis_nexthop_create(int family, union g_addr *ip, nexthop->family = family; nexthop->ifindex = ifindex; nexthop->ip = *ip; - isis_sr_nexthop_reset(&nexthop->sr); return nexthop; } @@ -117,7 +116,7 @@ static struct isis_nexthop *nexthoplookup(struct list *nexthops, int family, } void adjinfo2nexthop(int family, struct list *nexthops, - struct isis_adjacency *adj, + struct isis_adjacency *adj, struct isis_sr_psid_info *sr, struct mpls_label_stack *label_stack) { struct isis_nexthop *nh; @@ -134,6 +133,8 @@ void adjinfo2nexthop(int family, struct list *nexthops, AF_INET, &ip, adj->circuit->interface->ifindex); memcpy(nh->sysid, adj->sysid, sizeof(nh->sysid)); + if (sr) + nh->sr = *sr; nh->label_stack = label_stack; listnode_add(nexthops, nh); break; @@ -150,6 +151,8 @@ void adjinfo2nexthop(int family, struct list *nexthops, AF_INET6, &ip, adj->circuit->interface->ifindex); memcpy(nh->sysid, adj->sysid, sizeof(nh->sysid)); + if (sr) + nh->sr = *sr; nh->label_stack = label_stack; listnode_add(nexthops, nh); break; @@ -165,22 +168,22 @@ void adjinfo2nexthop(int family, struct list *nexthops, static void isis_route_add_dummy_nexthops(struct isis_route_info *rinfo, const uint8_t *sysid, + struct isis_sr_psid_info *sr, struct mpls_label_stack *label_stack) { struct isis_nexthop *nh; nh = XCALLOC(MTYPE_ISIS_NEXTHOP, sizeof(struct isis_nexthop)); memcpy(nh->sysid, sysid, sizeof(nh->sysid)); - isis_sr_nexthop_reset(&nh->sr); + nh->sr = *sr; nh->label_stack = label_stack; listnode_add(rinfo->nexthops, nh); } -static struct isis_route_info *isis_route_info_new(struct prefix *prefix, - struct prefix_ipv6 *src_p, - uint32_t cost, - uint32_t depth, - struct list *adjacencies) +static struct isis_route_info * +isis_route_info_new(struct prefix *prefix, struct prefix_ipv6 *src_p, + uint32_t cost, uint32_t depth, struct isis_sr_psid_info *sr, + struct list *adjacencies) { struct isis_route_info *rinfo; struct isis_vertex_adj *vadj; @@ -192,6 +195,7 @@ static struct isis_route_info *isis_route_info_new(struct prefix *prefix, for (ALL_LIST_ELEMENTS_RO(adjacencies, node, vadj)) { struct isis_spf_adj *sadj = vadj->sadj; struct isis_adjacency *adj = sadj->adj; + struct isis_sr_psid_info *sr = &vadj->sr; struct mpls_label_stack *label_stack = vadj->label_stack; /* @@ -199,7 +203,7 @@ static struct isis_route_info *isis_route_info_new(struct prefix *prefix, * environment. */ if (CHECK_FLAG(im->options, F_ISIS_UNIT_TEST)) { - isis_route_add_dummy_nexthops(rinfo, sadj->id, + isis_route_add_dummy_nexthops(rinfo, sadj->id, sr, label_stack); continue; } @@ -227,12 +231,13 @@ static struct isis_route_info *isis_route_info_new(struct prefix *prefix, prefix->family); exit(1); } - adjinfo2nexthop(prefix->family, rinfo->nexthops, adj, + adjinfo2nexthop(prefix->family, rinfo->nexthops, adj, sr, label_stack); } rinfo->cost = cost; rinfo->depth = depth; + rinfo->sr = *sr; return rinfo; } @@ -254,12 +259,28 @@ void isis_route_node_cleanup(struct route_table *table, struct route_node *node) isis_route_info_delete(node->info); } +static bool isis_sr_psid_info_same(struct isis_sr_psid_info *new, + struct isis_sr_psid_info *old) +{ + if (new->present != old->present) + return false; + + if (new->label != old->label) + return false; + + if (new->sid.flags != old->sid.flags + || new->sid.value != old->sid.value) + return false; + + return true; +} + static int isis_route_info_same(struct isis_route_info *new, struct isis_route_info *old, char *buf, size_t buf_size) { struct listnode *node; - struct isis_nexthop *nexthop; + struct isis_nexthop *new_nh, *old_nh; if (new->cost != old->cost) { if (buf) @@ -275,6 +296,12 @@ static int isis_route_info_same(struct isis_route_info *new, return 0; } + if (!isis_sr_psid_info_same(&new->sr, &old->sr)) { + if (buf) + snprintf(buf, buf_size, "SR input label"); + return 0; + } + if (new->nexthops->count != old->nexthops->count) { if (buf) snprintf(buf, buf_size, "nhops num (old: %u, new: %u)", @@ -282,14 +309,20 @@ static int isis_route_info_same(struct isis_route_info *new, return 0; } - for (ALL_LIST_ELEMENTS_RO(new->nexthops, node, nexthop)) { - if (!nexthoplookup(old->nexthops, nexthop->family, &nexthop->ip, - nexthop->ifindex)) { + for (ALL_LIST_ELEMENTS_RO(new->nexthops, node, new_nh)) { + old_nh = nexthoplookup(old->nexthops, new_nh->family, + &new_nh->ip, new_nh->ifindex); + if (!old_nh) { if (buf) snprintf(buf, buf_size, "new nhop"); /* TODO: print nhop */ return 0; } + if (!isis_sr_psid_info_same(&new_nh->sr, &old_nh->sr)) { + if (buf) + snprintf(buf, buf_size, "nhop SR label"); + return 0; + } } /* only the resync flag needs to be checked */ @@ -303,13 +336,11 @@ static int isis_route_info_same(struct isis_route_info *new, return 1; } -struct isis_route_info *isis_route_create(struct prefix *prefix, - struct prefix_ipv6 *src_p, - uint32_t cost, - uint32_t depth, - struct list *adjacencies, - struct isis_area *area, - struct route_table *table) +struct isis_route_info * +isis_route_create(struct prefix *prefix, struct prefix_ipv6 *src_p, + uint32_t cost, uint32_t depth, struct isis_sr_psid_info *sr, + struct list *adjacencies, struct isis_area *area, + struct route_table *table) { struct route_node *route_node; struct isis_route_info *rinfo_new, *rinfo_old, *route_info = NULL; @@ -318,8 +349,8 @@ struct isis_route_info *isis_route_create(struct prefix *prefix, if (!table) return NULL; - rinfo_new = isis_route_info_new(prefix, src_p, cost, - depth, adjacencies); + rinfo_new = isis_route_info_new(prefix, src_p, cost, depth, sr, + adjacencies); route_node = srcdest_rnode_get(table, prefix, src_p); rinfo_old = route_node->info; @@ -351,6 +382,7 @@ struct isis_route_info *isis_route_create(struct prefix *prefix, zlog_debug( "ISIS-Rte (%s): route changed: %pFX, change: %s", area->area_tag, prefix, change_buf); + rinfo_new->sr_previous = rinfo_old->sr; isis_route_info_delete(rinfo_old); route_info = rinfo_new; UNSET_FLAG(route_info->flag, @@ -406,7 +438,25 @@ static void isis_route_update(struct isis_area *area, struct prefix *prefix, if (CHECK_FLAG(route_info->flag, ISIS_ROUTE_FLAG_ZEBRA_SYNCED)) return; - isis_zebra_route_add_route(area->isis, prefix, src_p, route_info); + /* + * Explicitly uninstall previous Prefix-SID label if it has + * changed or was removed. + */ + if (route_info->sr_previous.present + && (!route_info->sr.present + || route_info->sr_previous.label + != route_info->sr.label)) + isis_zebra_prefix_sid_uninstall( + area, prefix, route_info, + &route_info->sr_previous); + + /* Install route. */ + isis_zebra_route_add_route(area->isis, prefix, src_p, + route_info); + /* Install/reinstall Prefix-SID label. */ + if (route_info->sr.present) + isis_zebra_prefix_sid_install(area, prefix, route_info, + &route_info->sr); hook_call(isis_route_update_hook, area, prefix, route_info); SET_FLAG(route_info->flag, ISIS_ROUTE_FLAG_ZEBRA_SYNCED); @@ -415,7 +465,13 @@ static void isis_route_update(struct isis_area *area, struct prefix *prefix, if (!CHECK_FLAG(route_info->flag, ISIS_ROUTE_FLAG_ZEBRA_SYNCED)) return; - isis_zebra_route_del_route(area->isis, prefix, src_p, route_info); + /* Uninstall Prefix-SID label. */ + if (route_info->sr.present) + isis_zebra_prefix_sid_uninstall( + area, prefix, route_info, &route_info->sr); + /* Uninstall route. */ + isis_zebra_route_del_route(area->isis, prefix, src_p, + route_info); hook_call(isis_route_update_hook, area, prefix, route_info); UNSET_FLAG(route_info->flag, ISIS_ROUTE_FLAG_ZEBRA_SYNCED); diff --git a/isisd/isis_route.h b/isisd/isis_route.h index fbb548a79e..b5e4aed6cc 100644 --- a/isisd/isis_route.h +++ b/isisd/isis_route.h @@ -32,7 +32,7 @@ struct isis_nexthop { int family; union g_addr ip; uint8_t sysid[ISIS_SYS_ID_LEN]; - struct sr_nexthop_info sr; + struct isis_sr_psid_info sr; struct mpls_label_stack *label_stack; }; @@ -43,6 +43,8 @@ struct isis_route_info { uint8_t flag; uint32_t cost; uint32_t depth; + struct isis_sr_psid_info sr; + struct isis_sr_psid_info sr_previous; struct list *nexthops; struct isis_route_info *backup; }; @@ -54,15 +56,13 @@ DECLARE_HOOK(isis_route_update_hook, void isis_nexthop_delete(struct isis_nexthop *nexthop); void adjinfo2nexthop(int family, struct list *nexthops, - struct isis_adjacency *adj, + struct isis_adjacency *adj, struct isis_sr_psid_info *sr, struct mpls_label_stack *label_stack); -struct isis_route_info *isis_route_create(struct prefix *prefix, - struct prefix_ipv6 *src_p, - uint32_t cost, - uint32_t depth, - struct list *adjacencies, - struct isis_area *area, - struct route_table *table); +struct isis_route_info * +isis_route_create(struct prefix *prefix, struct prefix_ipv6 *src_p, + uint32_t cost, uint32_t depth, struct isis_sr_psid_info *sr, + struct list *adjacencies, struct isis_area *area, + struct route_table *table); /* Walk the given table and install new routes to zebra and remove old ones. * route status is tracked using ISIS_ROUTE_FLAG_ACTIVE */ diff --git a/isisd/isis_spf.c b/isisd/isis_spf.c index 39a1c9ebe9..690ea9f1a5 100644 --- a/isisd/isis_spf.c +++ b/isisd/isis_spf.c @@ -176,9 +176,8 @@ const char *vid2string(const struct isis_vertex *vertex, char *buff, int size) } if (VTYPE_IP(vertex->type)) { - srcdest2str(&vertex->N.ip.dest, - &vertex->N.ip.src, - buff, size); + srcdest2str(&vertex->N.ip.p.dest, &vertex->N.ip.p.src, buff, + size); return buff; } @@ -215,13 +214,33 @@ static struct isis_vertex *isis_vertex_new(struct isis_spftree *spftree, return vertex; } -static struct isis_vertex_adj *isis_vertex_adj_add(struct isis_vertex *vertex, - struct isis_spf_adj *sadj) +static struct isis_vertex_adj *isis_vertex_adj_add(struct isis_spftree *spftree, + struct isis_vertex *vertex, + struct isis_spf_adj *sadj, + struct isis_prefix_sid *psid) { struct isis_vertex_adj *vadj; vadj = XCALLOC(MTYPE_ISIS_VERTEX_ADJ, sizeof(*vadj)); vadj->sadj = sadj; + if (psid) { + if (vertex->N.ip.sr.present + && vertex->N.ip.sr.sid.value != psid->value) + zlog_warn( + "ISIS-SPF: ignoring different Prefix-SID for route %pFX", + &vertex->N.ip.p.dest); + else { + bool last_hop; + + last_hop = (vertex->depth == 2); + vadj->sr.sid = *psid; + vadj->sr.label = sr_prefix_out_label( + spftree->lspdb, vertex->N.ip.p.dest.family, + psid, sadj->id, last_hop); + if (vadj->sr.label != MPLS_INVALID_LABEL) + vadj->sr.present = true; + } + } listnode_add(vertex->Adj_N, vadj); return vadj; @@ -466,11 +485,10 @@ static void vertex_update_firsthops(struct isis_vertex *vertex, /* * Add a vertex to TENT sorted by cost and by vertextype on tie break situation */ -static struct isis_vertex *isis_spf_add2tent(struct isis_spftree *spftree, - enum vertextype vtype, void *id, - uint32_t cost, int depth, - struct isis_spf_adj *sadj, - struct isis_vertex *parent) +static struct isis_vertex * +isis_spf_add2tent(struct isis_spftree *spftree, enum vertextype vtype, void *id, + uint32_t cost, int depth, struct isis_spf_adj *sadj, + struct isis_prefix_sid *psid, struct isis_vertex *parent) { struct isis_vertex *vertex; struct listnode *node; @@ -496,6 +514,16 @@ static struct isis_vertex *isis_spf_add2tent(struct isis_spftree *spftree, vertex = isis_vertex_new(spftree, id, vtype); vertex->d_N = cost; vertex->depth = depth; + if (VTYPE_IP(vtype) && psid) { + bool local; + + local = (vertex->depth == 1); + vertex->N.ip.sr.sid = *psid; + vertex->N.ip.sr.label = + sr_prefix_in_label(spftree->area, psid, local); + if (vertex->N.ip.sr.label != MPLS_INVALID_LABEL) + vertex->N.ip.sr.present = true; + } if (parent) { listnode_add(vertex->parents, parent); @@ -508,9 +536,10 @@ static struct isis_vertex *isis_spf_add2tent(struct isis_spftree *spftree, struct isis_vertex_adj *parent_vadj; for (ALL_LIST_ELEMENTS_RO(parent->Adj_N, node, parent_vadj)) - isis_vertex_adj_add(vertex, parent_vadj->sadj); + isis_vertex_adj_add(spftree, vertex, parent_vadj->sadj, + psid); } else if (sadj) { - isis_vertex_adj_add(vertex, sadj); + isis_vertex_adj_add(spftree, vertex, sadj, psid); } #ifdef EXTREME_DEBUG @@ -528,6 +557,7 @@ static struct isis_vertex *isis_spf_add2tent(struct isis_spftree *spftree, static void isis_spf_add_local(struct isis_spftree *spftree, enum vertextype vtype, void *id, struct isis_spf_adj *sadj, uint32_t cost, + struct isis_prefix_sid *psid, struct isis_vertex *parent) { struct isis_vertex *vertex; @@ -538,7 +568,8 @@ static void isis_spf_add_local(struct isis_spftree *spftree, /* C.2.5 c) */ if (vertex->d_N == cost) { if (sadj) - isis_vertex_adj_add(vertex, sadj); + isis_vertex_adj_add(spftree, vertex, sadj, + psid); /* d) */ if (!CHECK_FLAG(spftree->flags, F_SPFTREE_NO_ADJACENCIES) @@ -558,13 +589,13 @@ static void isis_spf_add_local(struct isis_spftree *spftree, } } - isis_spf_add2tent(spftree, vtype, id, cost, 1, sadj, parent); + isis_spf_add2tent(spftree, vtype, id, cost, 1, sadj, psid, parent); return; } static void process_N(struct isis_spftree *spftree, enum vertextype vtype, void *id, uint32_t dist, uint16_t depth, - struct isis_vertex *parent) + struct isis_prefix_sid *psid, struct isis_vertex *parent) { struct isis_vertex *vertex; #ifdef EXTREME_DEBUG @@ -628,8 +659,9 @@ static void process_N(struct isis_spftree *spftree, enum vertextype vtype, parent_vadj)) if (!isis_vertex_adj_exists(spftree, vertex, parent_vadj->sadj)) - isis_vertex_adj_add(vertex, - parent_vadj->sadj); + isis_vertex_adj_add(spftree, vertex, + parent_vadj->sadj, + psid); if (CHECK_FLAG(spftree->flags, F_SPFTREE_HOPCOUNT_METRIC)) vertex_update_firsthops(vertex, parent); @@ -656,7 +688,7 @@ static void process_N(struct isis_spftree *spftree, enum vertextype vtype, (parent ? print_sys_hostname(parent->N.id) : "null")); #endif /* EXTREME_DEBUG */ - isis_spf_add2tent(spftree, vtype, id, dist, depth, NULL, parent); + isis_spf_add2tent(spftree, vtype, id, dist, depth, NULL, psid, parent); return; } @@ -675,6 +707,7 @@ static int isis_spf_process_lsp(struct isis_spftree *spftree, static const uint8_t null_sysid[ISIS_SYS_ID_LEN]; struct isis_mt_router_info *mt_router_info = NULL; struct prefix_pair ip_info; + bool has_valid_psid; if (isis_lfa_excise_node_check(spftree, lsp->hdr.lsp_id)) { if (IS_DEBUG_TILFA) @@ -739,7 +772,7 @@ lspfragloop: LSP_PSEUDO_ID(r->id) ? VTYPE_PSEUDO_IS : VTYPE_NONPSEUDO_IS, - (void *)r->id, dist, depth + 1, + (void *)r->id, dist, depth + 1, NULL, parent); } } @@ -773,7 +806,8 @@ lspfragloop: process_N(spftree, LSP_PSEUDO_ID(er->id) ? VTYPE_PSEUDO_TE_IS : VTYPE_NONPSEUDO_TE_IS, - (void *)er->id, dist, depth + 1, parent); + (void *)er->id, dist, depth + 1, NULL, + parent); } } @@ -798,7 +832,7 @@ lspfragloop: ip_info.dest.u.prefix4 = r->prefix.prefix; ip_info.dest.prefixlen = r->prefix.prefixlen; process_N(spftree, vtype, &ip_info, - dist, depth + 1, parent); + dist, depth + 1, NULL, parent); } } } @@ -823,8 +857,34 @@ lspfragloop: dist = cost + r->metric; ip_info.dest.u.prefix4 = r->prefix.prefix; ip_info.dest.prefixlen = r->prefix.prefixlen; - process_N(spftree, VTYPE_IPREACH_TE, &ip_info, - dist, depth + 1, parent); + + /* Parse list of Prefix-SID subTLVs */ + has_valid_psid = false; + if (r->subtlvs) { + for (struct isis_item *i = + r->subtlvs->prefix_sids.head; + i; i = i->next) { + struct isis_prefix_sid *psid = + (struct isis_prefix_sid *)i; + + if (psid->algorithm != SR_ALGORITHM_SPF) + continue; + + has_valid_psid = true; + process_N(spftree, VTYPE_IPREACH_TE, + &ip_info, dist, depth + 1, + psid, parent); + /* + * Stop the Prefix-SID iteration since + * we only support the SPF algorithm for + * now. + */ + break; + } + } + if (!has_valid_psid) + process_N(spftree, VTYPE_IPREACH_TE, &ip_info, + dist, depth + 1, NULL, parent); } } @@ -865,8 +925,34 @@ lspfragloop: } ip_info.src = *r->subtlvs->source_prefix; } - process_N(spftree, vtype, &ip_info, dist, - depth + 1, parent); + + /* Parse list of Prefix-SID subTLVs */ + has_valid_psid = false; + if (r->subtlvs) { + for (struct isis_item *i = + r->subtlvs->prefix_sids.head; + i; i = i->next) { + struct isis_prefix_sid *psid = + (struct isis_prefix_sid *)i; + + if (psid->algorithm != SR_ALGORITHM_SPF) + continue; + + has_valid_psid = true; + process_N(spftree, vtype, &ip_info, + dist, depth + 1, psid, + parent); + /* + * Stop the Prefix-SID iteration since + * we only support the SPF algorithm for + * now. + */ + break; + } + } + if (!has_valid_psid) + process_N(spftree, vtype, &ip_info, dist, + depth + 1, NULL, parent); } } @@ -922,6 +1008,7 @@ static int isis_spf_preload_tent_ip_reach_cb(const struct prefix *prefix, struct isis_vertex *parent = args->parent; struct prefix_pair ip_info; enum vertextype vtype; + bool has_valid_psid = false; if (external) return LSP_ITER_CONTINUE; @@ -936,7 +1023,30 @@ static int isis_spf_preload_tent_ip_reach_cb(const struct prefix *prefix, else vtype = VTYPE_IP6REACH_INTERNAL; - isis_spf_add_local(spftree, vtype, &ip_info, NULL, 0, parent); + /* Parse list of Prefix-SID subTLVs */ + if (subtlvs) { + for (struct isis_item *i = subtlvs->prefix_sids.head; i; + i = i->next) { + struct isis_prefix_sid *psid = + (struct isis_prefix_sid *)i; + + if (psid->algorithm != SR_ALGORITHM_SPF) + continue; + + has_valid_psid = true; + isis_spf_add_local(spftree, vtype, &ip_info, NULL, 0, + psid, parent); + + /* + * Stop the Prefix-SID iteration since we only support + * the SPF algorithm for now. + */ + break; + } + } + if (!has_valid_psid) + isis_spf_add_local(spftree, vtype, &ip_info, NULL, 0, NULL, + parent); return LSP_ITER_CONTINUE; } @@ -985,7 +1095,8 @@ static void isis_spf_preload_tent(struct isis_spftree *spftree, F_ISIS_SPF_ADJ_OLDMETRIC) ? VTYPE_NONPSEUDO_IS : VTYPE_NONPSEUDO_TE_IS, - sadj->id, sadj, metric, parent); + sadj->id, sadj, metric, NULL, + parent); } else if (sadj->lan.lsp_pseudo) { isis_spf_process_lsp(spftree, sadj->lan.lsp_pseudo, metric, 0, spftree->sysid, parent); @@ -1222,8 +1333,9 @@ static void isis_spf_build_adj_list(struct isis_spftree *spftree, static void add_to_paths(struct isis_spftree *spftree, struct isis_vertex *vertex) { - struct isis_area *area = spftree->area; +#ifdef EXTREME_DEBUG char buff[VID2STR_BUFFER]; +#endif /* EXTREME_DEBUG */ if (isis_find_vertex(&spftree->paths, &vertex->N, vertex->type)) return; @@ -1235,6 +1347,24 @@ static void add_to_paths(struct isis_spftree *spftree, vid2string(vertex, buff, sizeof(buff)), vertex->depth, vertex->d_N); #endif /* EXTREME_DEBUG */ +} + +static void init_spt(struct isis_spftree *spftree, int mtid) +{ + /* Clear data from previous run. */ + isis_spf_node_list_clear(&spftree->adj_nodes); + list_delete_all_node(spftree->sadj_list); + isis_vertex_queue_clear(&spftree->tents); + isis_vertex_queue_clear(&spftree->paths); + + spftree->mtid = mtid; +} + +static void spf_path_process(struct isis_spftree *spftree, + struct isis_vertex *vertex) +{ + struct isis_area *area = spftree->area; + char buff[VID2STR_BUFFER]; if (VTYPE_IS(vertex->type) && !CHECK_FLAG(spftree->flags, F_SPFTREE_NO_ADJACENCIES)) { @@ -1261,7 +1391,7 @@ static void add_to_paths(struct isis_spftree *spftree, if (VTYPE_IP(vertex->type) && !CHECK_FLAG(spftree->flags, F_SPFTREE_NO_ROUTES)) { - if (listcount(vertex->Adj_N) > 0) { + if (vertex->depth == 1 || listcount(vertex->Adj_N) > 0) { struct route_table *route_table; if (spftree->type == SPF_TYPE_TI_LFA) { @@ -1272,8 +1402,9 @@ static void add_to_paths(struct isis_spftree *spftree, } else route_table = spftree->route_table; - isis_route_create(&vertex->N.ip.dest, &vertex->N.ip.src, - vertex->d_N, vertex->depth, + isis_route_create(&vertex->N.ip.p.dest, + &vertex->N.ip.p.src, vertex->d_N, + vertex->depth, &vertex->N.ip.sr, vertex->Adj_N, area, route_table); } else if (IS_DEBUG_SPF_EVENTS) zlog_debug( @@ -1281,19 +1412,6 @@ static void add_to_paths(struct isis_spftree *spftree, vid2string(vertex, buff, sizeof(buff)), vertex->depth, vertex->d_N); } - - return; -} - -static void init_spt(struct isis_spftree *spftree, int mtid) -{ - /* Clear data from previous run. */ - isis_spf_node_list_clear(&spftree->adj_nodes); - list_delete_all_node(spftree->sadj_list); - isis_vertex_queue_clear(&spftree->tents); - isis_vertex_queue_clear(&spftree->paths); - - spftree->mtid = mtid; } static void isis_spf_loop(struct isis_spftree *spftree, @@ -1301,6 +1419,7 @@ static void isis_spf_loop(struct isis_spftree *spftree, { struct isis_vertex *vertex; struct isis_lsp *lsp; + struct listnode *node; while (isis_vertex_queue_count(&spftree->tents)) { vertex = isis_vertex_queue_pop(&spftree->tents); @@ -1327,6 +1446,23 @@ static void isis_spf_loop(struct isis_spftree *spftree, isis_spf_process_lsp(spftree, lsp, vertex->d_N, vertex->depth, root_sysid, vertex); } + + /* Generate routes once the SPT is formed. */ + for (ALL_QUEUE_ELEMENTS_RO(&spftree->paths, node, vertex)) { + /* New-style TLVs take precedence over the old-style TLVs. */ + switch (vertex->type) { + case VTYPE_IPREACH_INTERNAL: + case VTYPE_IPREACH_EXTERNAL: + if (isis_find_vertex(&spftree->paths, &vertex->N, + VTYPE_IPREACH_TE)) + continue; + break; + default: + break; + } + + spf_path_process(spftree, vertex); + } } struct isis_spftree *isis_run_hopcount_spf(struct isis_area *area, @@ -1508,8 +1644,6 @@ static int isis_run_spf_cb(struct thread *thread) isis_area_verify_routes(area); - isis_area_verify_sr(area); - /* walk all circuits and reset any spf specific flags */ struct listnode *node; struct isis_circuit *circuit; @@ -1800,12 +1934,126 @@ DEFUN(show_isis_topology, show_isis_topology_cmd, return CMD_SUCCESS; } +static void isis_print_route(struct ttable *tt, const struct prefix *prefix, + struct isis_route_info *rinfo, bool prefix_sid, + bool no_adjacencies) +{ + struct isis_nexthop *nexthop; + struct listnode *node; + bool first = true; + char buf_prefix[BUFSIZ]; + + (void)prefix2str(prefix, buf_prefix, sizeof(buf_prefix)); + for (ALL_LIST_ELEMENTS_RO(rinfo->nexthops, node, nexthop)) { + struct interface *ifp; + char buf_iface[BUFSIZ]; + char buf_nhop[BUFSIZ]; + + if (!no_adjacencies) { + inet_ntop(nexthop->family, &nexthop->ip, buf_nhop, + sizeof(buf_nhop)); + ifp = if_lookup_by_index(nexthop->ifindex, VRF_DEFAULT); + if (ifp) + strlcpy(buf_iface, ifp->name, + sizeof(buf_iface)); + else + snprintf(buf_iface, sizeof(buf_iface), + "ifindex %u", nexthop->ifindex); + } else { + strlcpy(buf_nhop, print_sys_hostname(nexthop->sysid), + sizeof(buf_nhop)); + strlcpy(buf_iface, "-", sizeof(buf_iface)); + } + + if (prefix_sid) { + char buf_sid[BUFSIZ] = {}; + char buf_lblop[BUFSIZ] = {}; + + if (nexthop->sr.present) { + snprintf(buf_sid, sizeof(buf_sid), "%u", + nexthop->sr.sid.value); + sr_op2str(buf_lblop, sizeof(buf_lblop), + rinfo->sr.label, nexthop->sr.label); + } else { + strlcpy(buf_sid, "-", sizeof(buf_sid)); + strlcpy(buf_lblop, "-", sizeof(buf_lblop)); + } + + if (first) { + ttable_add_row(tt, "%s|%u|%s|%s|%s|%s", + buf_prefix, rinfo->cost, + buf_iface, buf_nhop, buf_sid, + buf_lblop); + first = false; + } else + ttable_add_row(tt, "||%s|%s|%s|%s", buf_iface, + buf_nhop, buf_sid, buf_lblop); + } else { + char buf_labels[BUFSIZ] = {}; + + if (nexthop->label_stack) { + for (int i = 0; + i < nexthop->label_stack->num_labels; + i++) { + char buf_label[BUFSIZ]; + + label2str( + nexthop->label_stack->label[i], + buf_label, sizeof(buf_label)); + if (i != 0) + strlcat(buf_labels, "/", + sizeof(buf_labels)); + strlcat(buf_labels, buf_label, + sizeof(buf_labels)); + } + } else if (nexthop->sr.present) + label2str(nexthop->sr.label, buf_labels, + sizeof(buf_labels)); + else + strlcpy(buf_labels, "-", sizeof(buf_labels)); + + if (first) { + ttable_add_row(tt, "%s|%u|%s|%s|%s", buf_prefix, + rinfo->cost, buf_iface, buf_nhop, + buf_labels); + first = false; + } else + ttable_add_row(tt, "||%s|%s|%s", buf_iface, + buf_nhop, buf_labels); + } + } + if (list_isempty(rinfo->nexthops)) { + if (prefix_sid) { + char buf_sid[BUFSIZ] = {}; + char buf_lblop[BUFSIZ] = {}; + + if (rinfo->sr.present) { + snprintf(buf_sid, sizeof(buf_sid), "%u", + rinfo->sr.sid.value); + sr_op2str(buf_lblop, sizeof(buf_lblop), + rinfo->sr.label, + MPLS_LABEL_IMPLICIT_NULL); + } else { + strlcpy(buf_sid, "-", sizeof(buf_sid)); + strlcpy(buf_lblop, "-", sizeof(buf_lblop)); + } + + ttable_add_row(tt, "%s|%u|%s|%s|%s|%s", buf_prefix, + rinfo->cost, "-", "-", buf_sid, + buf_lblop); + } else + ttable_add_row(tt, "%s|%u|%s|%s|%s", buf_prefix, + rinfo->cost, "-", "-", "-"); + } +} + void isis_print_routes(struct vty *vty, struct isis_spftree *spftree, - bool backup) + bool prefix_sid, bool backup) { struct route_table *route_table; struct ttable *tt; struct route_node *rn; + bool no_adjacencies = false; const char *tree_id_text = NULL; if (!spftree) @@ -1831,82 +2079,28 @@ void isis_print_routes(struct vty *vty, struct isis_spftree *spftree, /* Prepare table. */ tt = ttable_new(&ttable_styles[TTSTYLE_BLANK]); - ttable_add_row(tt, "Prefix|Metric|Interface|Nexthop|Label(s)"); + if (prefix_sid) + ttable_add_row(tt, "Prefix|Metric|Interface|Nexthop|SID|Label Op."); + else + ttable_add_row(tt, "Prefix|Metric|Interface|Nexthop|Label(s)"); tt->style.cell.rpad = 2; tt->style.corner = '+'; ttable_restyle(tt); ttable_rowseps(tt, 0, BOTTOM, true, '-'); + if (CHECK_FLAG(spftree->flags, F_SPFTREE_NO_ADJACENCIES)) + no_adjacencies = true; + route_table = (backup) ? spftree->route_table_backup : spftree->route_table; for (rn = route_top(route_table); rn; rn = route_next(rn)) { struct isis_route_info *rinfo; - struct isis_nexthop *nexthop; - struct listnode *node; - bool first = true; - char buf_prefix[BUFSIZ]; rinfo = rn->info; if (!rinfo) continue; - (void)prefix2str(&rn->p, buf_prefix, sizeof(buf_prefix)); - for (ALL_LIST_ELEMENTS_RO(rinfo->nexthops, node, nexthop)) { - struct interface *ifp; - char buf_iface[BUFSIZ]; - char buf_nhop[BUFSIZ]; - char buf_labels[BUFSIZ] = {}; - - if (!CHECK_FLAG(spftree->flags, - F_SPFTREE_NO_ADJACENCIES)) { - inet_ntop(nexthop->family, &nexthop->ip, - buf_nhop, sizeof(buf_nhop)); - ifp = if_lookup_by_index(nexthop->ifindex, - VRF_DEFAULT); - if (ifp) - strlcpy(buf_iface, ifp->name, - sizeof(buf_iface)); - else - snprintf(buf_iface, sizeof(buf_iface), - "ifindex %u", - nexthop->ifindex); - } else { - strlcpy(buf_nhop, - print_sys_hostname(nexthop->sysid), - sizeof(buf_nhop)); - strlcpy(buf_iface, "-", sizeof(buf_iface)); - } - - if (nexthop->label_stack) { - for (int i = 0; - i < nexthop->label_stack->num_labels; - i++) { - char buf_label[BUFSIZ]; - - label2str( - nexthop->label_stack->label[i], - buf_label, sizeof(buf_label)); - if (i != 0) - strlcat(buf_labels, "/", - sizeof(buf_labels)); - strlcat(buf_labels, buf_label, - sizeof(buf_labels)); - } - } else if (nexthop->sr.label != MPLS_INVALID_LABEL) - label2str(nexthop->sr.label, buf_labels, - sizeof(buf_labels)); - else - strlcpy(buf_labels, "-", sizeof(buf_labels)); - - if (first) { - ttable_add_row(tt, "%s|%u|%s|%s|%s", buf_prefix, - rinfo->cost, buf_iface, buf_nhop, - buf_labels); - first = false; - } else - ttable_add_row(tt, "||%s|%s|%s", buf_iface, - buf_nhop, buf_labels); - } + isis_print_route(tt, &rn->p, rinfo, prefix_sid, no_adjacencies); } /* Dump the generated table. */ @@ -1921,7 +2115,8 @@ void isis_print_routes(struct vty *vty, struct isis_spftree *spftree, } static void show_isis_route_common(struct vty *vty, int levels, - struct isis *isis, bool backup) + struct isis *isis, bool prefix_sid, + bool backup) { struct listnode *node; struct isis_area *area; @@ -1941,19 +2136,19 @@ static void show_isis_route_common(struct vty *vty, int levels, isis_print_routes( vty, area->spftree[SPFTREE_IPV4][level - 1], - backup); + prefix_sid, backup); } if (area->ipv6_circuits > 0) { isis_print_routes( vty, area->spftree[SPFTREE_IPV6][level - 1], - backup); + prefix_sid, backup); } if (isis_area_ipv6_dstsrc_enabled(area)) { isis_print_routes(vty, area->spftree[SPFTREE_DSTSRC] [level - 1], - backup); + prefix_sid, backup); } } } @@ -1965,13 +2160,14 @@ DEFUN(show_isis_route, show_isis_route_cmd, #ifndef FABRICD " [<level-1|level-2>]" #endif - " [backup]", + " [<prefix-sid|backup>]", SHOW_STR PROTO_HELP VRF_FULL_CMD_HELP_STR "IS-IS routing table\n" #ifndef FABRICD "level-1 routes\n" "level-2 routes\n" #endif + "Show Prefix-SID information\n" "Show backup routes\n") { int levels; @@ -1979,6 +2175,7 @@ DEFUN(show_isis_route, show_isis_route_cmd, struct listnode *node; const char *vrf_name = VRF_DEFAULT_NAME; bool all_vrf = false; + bool prefix_sid = false; bool backup = false; int idx = 0; @@ -1995,6 +2192,8 @@ DEFUN(show_isis_route, show_isis_route_cmd, } ISIS_FIND_VRF_ARGS(argv, argc, idx, vrf_name, all_vrf); + if (argv_find(argv, argc, "prefix-sid", &idx)) + prefix_sid = true; if (argv_find(argv, argc, "backup", &idx)) backup = true; @@ -2002,12 +2201,13 @@ DEFUN(show_isis_route, show_isis_route_cmd, if (all_vrf) { for (ALL_LIST_ELEMENTS_RO(im->isis, node, isis)) show_isis_route_common(vty, levels, isis, - backup); + prefix_sid, backup); return CMD_SUCCESS; } isis = isis_lookup_by_vrfname(vrf_name); if (isis != NULL) - show_isis_route_common(vty, levels, isis, backup); + show_isis_route_common(vty, levels, isis, prefix_sid, + backup); } return CMD_SUCCESS; diff --git a/isisd/isis_spf.h b/isisd/isis_spf.h index 5d07c80d20..15d3ff9272 100644 --- a/isisd/isis_spf.h +++ b/isisd/isis_spf.h @@ -68,7 +68,7 @@ int _isis_spf_schedule(struct isis_area *area, int level, const char *func, const char *file, int line); void isis_print_spftree(struct vty *vty, struct isis_spftree *spftree); void isis_print_routes(struct vty *vty, struct isis_spftree *spftree, - bool backup); + bool prefix_sid, bool backup); void isis_spf_init(void); void isis_spf_print(struct isis_spftree *spftree, struct vty *vty); void isis_run_spf(struct isis_spftree *spftree); diff --git a/isisd/isis_spf_private.h b/isisd/isis_spf_private.h index 1a2e969bd9..e999f96539 100644 --- a/isisd/isis_spf_private.h +++ b/isisd/isis_spf_private.h @@ -52,6 +52,7 @@ struct prefix_pair { struct isis_vertex_adj { struct isis_spf_adj *sadj; + struct isis_sr_psid_info sr; struct mpls_label_stack *label_stack; }; @@ -62,7 +63,10 @@ struct isis_vertex { enum vertextype type; union { uint8_t id[ISIS_SYS_ID_LEN + 1]; - struct prefix_pair ip; + struct { + struct prefix_pair p; + struct isis_sr_psid_info sr; + } ip; } N; uint32_t d_N; /* d(N) Distance from this IS */ uint16_t depth; /* The depth in the imaginary tree */ @@ -91,8 +95,8 @@ static unsigned isis_vertex_queue_hash_key(const void *vp) if (VTYPE_IP(vertex->type)) { uint32_t key; - key = prefix_hash_key(&vertex->N.ip.dest); - key = jhash_1word(prefix_hash_key(&vertex->N.ip.src), key); + key = prefix_hash_key(&vertex->N.ip.p.dest); + key = jhash_1word(prefix_hash_key(&vertex->N.ip.p.src), key); return key; } @@ -108,11 +112,12 @@ static bool isis_vertex_queue_hash_cmp(const void *a, const void *b) return false; if (VTYPE_IP(va->type)) { - if (prefix_cmp(&va->N.ip.dest, &vb->N.ip.dest)) + if (prefix_cmp(&va->N.ip.p.dest, &vb->N.ip.p.dest)) return false; - return prefix_cmp((const struct prefix *)&va->N.ip.src, - (const struct prefix *)&vb->N.ip.src) == 0; + return prefix_cmp((const struct prefix *)&va->N.ip.p.src, + (const struct prefix *)&vb->N.ip.p.src) + == 0; } return memcmp(va->N.id, vb->N.id, ISIS_SYS_ID_LEN + 1) == 0; @@ -351,7 +356,7 @@ static void isis_vertex_id_init(struct isis_vertex *vertex, const void *id, if (VTYPE_IS(vtype) || VTYPE_ES(vtype)) { memcpy(vertex->N.id, id, ISIS_SYS_ID_LEN + 1); } else if (VTYPE_IP(vtype)) { - memcpy(&vertex->N.ip, id, sizeof(vertex->N.ip)); + memcpy(&vertex->N.ip.p, id, sizeof(vertex->N.ip.p)); } else { flog_err(EC_LIB_DEVELOPMENT, "Unknown Vertex Type"); } diff --git a/isisd/isis_sr.c b/isisd/isis_sr.c index 842103de1e..89fa2018b9 100644 --- a/isisd/isis_sr.c +++ b/isisd/isis_sr.c @@ -31,6 +31,7 @@ #include "memory.h" #include "prefix.h" #include "table.h" +#include "srcdest_table.h" #include "vty.h" #include "zclient.h" #include "lib/lib_errors.h" @@ -50,8 +51,6 @@ /* Local variables and functions */ DEFINE_MTYPE_STATIC(ISISD, ISIS_SR_INFO, "ISIS segment routing information") -static void sr_prefix_uninstall(struct sr_prefix *srp); -static void sr_prefix_reinstall(struct sr_prefix *srp, bool make_before_break); static void sr_local_block_delete(struct isis_area *area); static int sr_local_block_init(struct isis_area *area); static void sr_adj_sid_update(struct sr_adjacency *sra, @@ -61,53 +60,149 @@ static void sr_adj_sid_del(struct sr_adjacency *sra); /* --- RB-Tree Management functions ----------------------------------------- */ /** - * SR Prefix comparison for RB-Tree. + * Configured SR Prefix comparison for RB-Tree. * * @param a First SR prefix * @param b Second SR prefix * * @return -1 (a < b), 0 (a == b) or +1 (a > b) */ -static inline int sr_prefix_sid_compare(const struct sr_prefix *a, - const struct sr_prefix *b) +static inline int sr_prefix_sid_cfg_compare(const struct sr_prefix_cfg *a, + const struct sr_prefix_cfg *b) { return prefix_cmp(&a->prefix, &b->prefix); } -DECLARE_RBTREE_UNIQ(srdb_node_prefix, struct sr_prefix, node_entry, - sr_prefix_sid_compare) -DECLARE_RBTREE_UNIQ(srdb_area_prefix, struct sr_prefix, area_entry, - sr_prefix_sid_compare) +DECLARE_RBTREE_UNIQ(srdb_prefix_cfg, struct sr_prefix_cfg, entry, + sr_prefix_sid_cfg_compare) /** - * Configured SR Prefix comparison for RB-Tree. + * Find SRGB associated to a System ID. * - * @param a First SR prefix - * @param b Second SR prefix + * @param area IS-IS LSP database + * @param sysid System ID to lookup * - * @return -1 (a < b), 0 (a == b) or +1 (a > b) + * @return Pointer to SRGB if found, NULL otherwise */ -static inline int sr_prefix_sid_cfg_compare(const struct sr_prefix_cfg *a, - const struct sr_prefix_cfg *b) +struct isis_sr_block *isis_sr_find_srgb(struct lspdb_head *lspdb, + const uint8_t *sysid) { - return prefix_cmp(&a->prefix, &b->prefix); + struct isis_lsp *lsp; + + lsp = isis_root_system_lsp(lspdb, sysid); + if (!lsp) + return NULL; + + if (!lsp->tlvs->router_cap + || lsp->tlvs->router_cap->srgb.range_size == 0) + return NULL; + + return &lsp->tlvs->router_cap->srgb; } -DECLARE_RBTREE_UNIQ(srdb_prefix_cfg, struct sr_prefix_cfg, entry, - sr_prefix_sid_cfg_compare) /** - * SR Node comparison for RB-Tree. + * Compute input label for the given Prefix-SID. * - * @param a First SR node - * @param b Second SR node + * @param area IS-IS area + * @param psid IS-IS Prefix-SID Sub-TLV + * @param local Indicates whether the Prefix-SID is local or not * - * @return -1 (a < b), 0 (a == b) or +1 (a > b) + * @return MPLS label or MPLS_INVALID_LABEL in case of SRGB overflow */ -static inline int sr_node_compare(const struct sr_node *a, - const struct sr_node *b) +mpls_label_t sr_prefix_in_label(struct isis_area *area, + struct isis_prefix_sid *psid, bool local) { - return memcmp(a->sysid, b->sysid, ISIS_SYS_ID_LEN); + /* + * No need to assign a label for local Prefix-SIDs unless the no-PHP + * flag is set. + */ + if (local + && (!CHECK_FLAG(psid->flags, ISIS_PREFIX_SID_NO_PHP) + || CHECK_FLAG(psid->flags, ISIS_PREFIX_SID_EXPLICIT_NULL))) + return MPLS_INVALID_LABEL; + + /* Return SID value as MPLS label if it is an Absolute SID */ + if (CHECK_FLAG(psid->flags, + ISIS_PREFIX_SID_VALUE | ISIS_PREFIX_SID_LOCAL)) + return psid->value; + + /* Check that SID index falls inside the SRGB */ + if (psid->value >= (area->srdb.config.srgb_upper_bound + - area->srdb.config.srgb_lower_bound + 1)) { + flog_warn(EC_ISIS_SID_OVERFLOW, + "%s: SID index %u falls outside local SRGB range", + __func__, psid->value); + return MPLS_INVALID_LABEL; + } + + /* Return MPLS label as SID index + SRGB_lower_bound as per RFC 8667 */ + return (area->srdb.config.srgb_lower_bound + psid->value); +} + +/** + * Compute output label for the given Prefix-SID. + * + * @param lspdb IS-IS LSP database + * @param family Prefix-SID address family + * @param psid Prefix-SID Sub-TLV + * @param nh_sysid System ID of the nexthop node + * @param last_hop Indicates whether the nexthop node is the last hop + * + * @return MPLS label or MPLS_INVALID_LABEL in case of error + */ +mpls_label_t sr_prefix_out_label(struct lspdb_head *lspdb, int family, + struct isis_prefix_sid *psid, + const uint8_t *nh_sysid, bool last_hop) +{ + struct isis_sr_block *nh_srgb; + + if (last_hop) { + if (!CHECK_FLAG(psid->flags, ISIS_PREFIX_SID_NO_PHP)) + return MPLS_LABEL_IMPLICIT_NULL; + + if (CHECK_FLAG(psid->flags, ISIS_PREFIX_SID_EXPLICIT_NULL)) { + if (family == AF_INET) + return MPLS_LABEL_IPV4_EXPLICIT_NULL; + else + return MPLS_LABEL_IPV6_EXPLICIT_NULL; + } + /* Fallthrough */ + } + + /* Return SID value as MPLS label if it is an Absolute SID */ + if (CHECK_FLAG(psid->flags, + ISIS_PREFIX_SID_VALUE | ISIS_PREFIX_SID_LOCAL)) { + /* + * V/L SIDs have local significance, so only adjacent routers + * can use them (RFC8667 section #2.1.1.1) + */ + if (!last_hop) + return MPLS_INVALID_LABEL; + return psid->value; + } + + /* Check that SID index falls inside the SRGB */ + nh_srgb = isis_sr_find_srgb(lspdb, nh_sysid); + if (!nh_srgb) + return MPLS_INVALID_LABEL; + + /* + * Check if the nexthop can handle SR-MPLS encapsulated IPv4 or + * IPv6 packets. + */ + if ((family == AF_INET && !IS_SR_IPV4(nh_srgb)) + || (family == AF_INET6 && !IS_SR_IPV6(nh_srgb))) + return MPLS_INVALID_LABEL; + + if (psid->value >= nh_srgb->range_size) { + flog_warn(EC_ISIS_SID_OVERFLOW, + "%s: SID index %u falls outside remote SRGB range", + __func__, psid->value); + return MPLS_INVALID_LABEL; + } + + /* Return MPLS label as SID index + SRGB_lower_bound as per RFC 8667 */ + return (nh_srgb->lower_bound + psid->value); } -DECLARE_RBTREE_UNIQ(srdb_node, struct sr_node, entry, sr_node_compare) /* --- Functions used for Yang model and CLI to configure Segment Routing --- */ @@ -162,8 +257,6 @@ int isis_sr_cfg_srgb_update(struct isis_area *area, uint32_t lower_bound, srdb->config.srgb_upper_bound = upper_bound; if (srdb->enabled) { - struct sr_prefix *srp; - /* then request new SRGB if SR is enabled. */ if (isis_zebra_request_label_range( srdb->config.srgb_lower_bound, @@ -179,14 +272,6 @@ int isis_sr_cfg_srgb_update(struct isis_area *area, uint32_t lower_bound, srdb->config.srgb_lower_bound, srdb->config.srgb_upper_bound); - /* Reinstall local Prefix-SIDs to update their input labels. */ - for (int level = ISIS_LEVEL1; level <= ISIS_LEVELS; level++) { - frr_each (srdb_area_prefix, - &area->srdb.prefix_sids[level - 1], srp) { - sr_prefix_reinstall(srp, false); - } - } - lsp_regenerate_schedule(area, area->is_type, 0); } else if (srdb->config.enabled) { /* Try to enable SR again using the new SRGB. */ @@ -278,7 +363,7 @@ struct sr_prefix_cfg *isis_sr_cfg_prefix_add(struct isis_area *area, /* Set the N-flag when appropriate. */ ifp = if_lookup_prefix(prefix, VRF_DEFAULT); - if (ifp && sr_prefix_is_node_sid(ifp, prefix)) + if (ifp && sr_prefix_is_node_sid(ifp, prefix) && !pcfg->n_flag_clear) pcfg->node_sid = true; /* Save prefix-sid configuration. */ @@ -364,897 +449,6 @@ void isis_sr_prefix_cfg2subtlv(const struct sr_prefix_cfg *pcfg, bool external, } } -/* --- Segment Routing Prefix Management functions -------------------------- */ - -/** - * Add Segment Routing Prefix to a given Segment Routing Node. - * - * @param area IS-IS area - * @param srn Segment Routing Node - * @param prefix Prefix to be added - * @param local True if prefix is locally configured, false otherwise - * @param psid Prefix-SID sub-TLVs - * - * @return New Segment Routing Prefix structure - */ -static struct sr_prefix *sr_prefix_add(struct isis_area *area, - struct sr_node *srn, - union prefixconstptr prefix, bool local, - const struct isis_prefix_sid *psid) -{ - struct sr_prefix *srp; - - srp = XCALLOC(MTYPE_ISIS_SR_INFO, sizeof(*srp)); - prefix_copy(&srp->prefix, prefix.p); - srp->sid = *psid; - srp->input_label = MPLS_INVALID_LABEL; - if (local) { - srp->type = ISIS_SR_PREFIX_LOCAL; - isis_sr_nexthop_reset(&srp->u.local.info); - } else { - srp->type = ISIS_SR_PREFIX_REMOTE; - srp->u.remote.rinfo = NULL; - } - srp->srn = srn; - srdb_node_prefix_add(&srn->prefix_sids, srp); - /* TODO: this might fail if we have Anycast SIDs in the IS-IS area. */ - srdb_area_prefix_add(&area->srdb.prefix_sids[srn->level - 1], srp); - - sr_debug(" |- Added new SR Prefix-SID %pFX %s %u to SR Node %s", - &srp->prefix, IS_SID_VALUE(srp->sid.flags) ? "label" : "index", - srp->sid.value, sysid_print(srn->sysid)); - - return srp; -} - -/** - * Remove given Segment Prefix from given Segment Routing Node. - * Prefix-SID is un-installed first. - * - * @param area IS-IS area - * @param srn Segment Routing Node - * @param srp Segment Routing Prefix - */ -static void sr_prefix_del(struct isis_area *area, struct sr_node *srn, - struct sr_prefix *srp) -{ - sr_debug(" |- Delete SR Prefix-SID %pFX %s %u to SR Node %s", - &srp->prefix, IS_SID_VALUE(srp->sid.flags) ? "label" : "index", - srp->sid.value, sysid_print(srn->sysid)); - - sr_prefix_uninstall(srp); - srdb_node_prefix_del(&srn->prefix_sids, srp); - srdb_area_prefix_del(&area->srdb.prefix_sids[srn->level - 1], srp); - XFREE(MTYPE_ISIS_SR_INFO, srp); -} - -/** - * Find Segment Routing Prefix by Area. - * - * @param area IS-IS area - * @param level IS-IS level - * @param prefix Prefix to lookup - * - * @return Segment Routing Prefix structure if found, NULL otherwise - */ -static struct sr_prefix *sr_prefix_find_by_area(struct isis_area *area, - int level, - union prefixconstptr prefix) -{ - struct sr_prefix srp = {}; - - prefix_copy(&srp.prefix, prefix.p); - return srdb_area_prefix_find(&area->srdb.prefix_sids[level - 1], &srp); -} - -/** - * Find Segment Routing Prefix by Segment Routing Node. - * - * @param srn Segment Routing Node - * @param prefix Prefix to lookup - * - * @return Segment Routing Prefix structure if found, NULL otherwise - */ -static struct sr_prefix *sr_prefix_find_by_node(struct sr_node *srn, - union prefixconstptr prefix) -{ - struct sr_prefix srp = {}; - - prefix_copy(&srp.prefix, prefix.p); - return srdb_node_prefix_find(&srn->prefix_sids, &srp); -} - -/* --- Segment Routing Node Management functions ---------------------------- */ - -/** - * Add Segment Routing Node to the Segment Routing Data Base. - * - * @param area IS-IS area - * @param level IS-IS level - * @param sysid Node System ID - * @param cap Segment Routing Capability sub-TLVs - * - * @return New Segment Routing Node structure - */ -static struct sr_node *sr_node_add(struct isis_area *area, int level, - const uint8_t *sysid) -{ - struct sr_node *srn; - - srn = XCALLOC(MTYPE_ISIS_SR_INFO, sizeof(*srn)); - srn->level = level; - memcpy(srn->sysid, sysid, ISIS_SYS_ID_LEN); - srn->area = area; - srdb_node_prefix_init(&srn->prefix_sids); - srdb_node_add(&area->srdb.sr_nodes[level - 1], srn); - - sr_debug(" |- Added new SR Node %s", sysid_print(srn->sysid)); - - return srn; -} - -static void sr_node_del(struct isis_area *area, int level, struct sr_node *srn) -/** - * Remove Segment Routing Node from the Segment Routing Data Base. - * All Prefix-SID attached to this Segment Routing Node are removed first. - * - * @param area IS-IS area - * @param level IS-IS level - * @param srn Segment Routing Node to be deleted - */ -{ - - sr_debug(" |- Delete SR Node %s", sysid_print(srn->sysid)); - - /* Remove and uninstall Prefix-SIDs. */ - while (srdb_node_prefix_count(&srn->prefix_sids) > 0) { - struct sr_prefix *srp; - - srp = srdb_node_prefix_first(&srn->prefix_sids); - sr_prefix_del(area, srn, srp); - } - - srdb_node_del(&area->srdb.sr_nodes[level - 1], srn); - XFREE(MTYPE_ISIS_SR_INFO, srn); -} - -/** - * Find Segment Routing Node in the Segment Routing Data Base per system ID. - * - * @param area IS-IS area - * @param level IS-IS level - * @param sysid Node System ID to lookup - * - * @return Segment Routing Node structure if found, NULL otherwise - */ -static struct sr_node *sr_node_find(struct isis_area *area, int level, - const uint8_t *sysid) -{ - struct sr_node srn = {}; - - memcpy(srn.sysid, sysid, ISIS_SYS_ID_LEN); - return srdb_node_find(&area->srdb.sr_nodes[level - 1], &srn); -} - -/** - * Update Segment Routing Node following an SRGB update. This function - * is called when a neighbor SR Node has updated its SRGB. - * - * @param area IS-IS area - * @param level IS-IS level - * @param sysid Segment Routing Node system ID - */ -static void sr_node_srgb_update(struct isis_area *area, int level, - uint8_t *sysid) -{ - struct sr_prefix *srp; - - sr_debug("ISIS-Sr (%s): Update neighbors SR Node with new SRGB", - area->area_tag); - - frr_each (srdb_area_prefix, &area->srdb.prefix_sids[level - 1], srp) { - struct listnode *node; - struct isis_nexthop *nh; - - if (srp->type == ISIS_SR_PREFIX_LOCAL) - continue; - - if (srp->u.remote.rinfo == NULL) - continue; - - for (ALL_LIST_ELEMENTS_RO(srp->u.remote.rinfo->nexthops, node, - nh)) { - if (memcmp(nh->sysid, sysid, ISIS_SYS_ID_LEN) != 0) - continue; - - /* - * The Prefix-SID input label hasn't changed. We could - * re-install all Prefix-SID with "Make Before Break" - * option. Zebra layer will update output label(s) by - * adding new entry before removing the old one(s). - */ - sr_prefix_reinstall(srp, true); - break; - } - } -} - -/* --- Segment Routing Nexthop information Management functions ------------- */ - -/** - * Update Segment Routing Nexthop. - * - * @param srnh Segment Routing next hop - * @param label Output MPLS label - */ -void isis_sr_nexthop_update(struct sr_nexthop_info *srnh, mpls_label_t label) -{ - srnh->label = label; - if (srnh->uptime == 0) - srnh->uptime = time(NULL); -} - -/** - * Reset Segment Routing Nexthop. - * - * @param srnh Segment Routing Nexthop - */ -void isis_sr_nexthop_reset(struct sr_nexthop_info *srnh) -{ - srnh->label = MPLS_INVALID_LABEL; - srnh->uptime = 0; -} - -/* --- Segment Routing Prefix-SID Management functions to configure LFIB ---- */ - -/** - * Lookup IS-IS route in the Shortest Path Tree. - * - * @param area IS-IS area - * @param tree_id Shortest Path Tree identifier - * @param srp Segment Routing Prefix to lookup - * - * @return Route Information for this prefix if found, NULL otherwise - */ -static struct isis_route_info *sr_prefix_lookup_route(struct isis_area *area, - enum spf_tree_id tree_id, - struct sr_prefix *srp) -{ - struct route_node *rn; - int level = srp->srn->level; - - rn = route_node_lookup(area->spftree[tree_id][level - 1]->route_table, - &srp->prefix); - if (rn) { - route_unlock_node(rn); - if (rn->info) - return rn->info; - } - - return NULL; -} - -/** - * Compute input label for the given Prefix-SID. - * - * @param srp Segment Routing Prefix - * - * @return MPLS label or MPLS_INVALID_LABEL in case of SRGB overflow - */ -static mpls_label_t sr_prefix_in_label(const struct sr_prefix *srp) -{ - const struct sr_node *srn = srp->srn; - struct isis_area *area = srn->area; - - /* Return SID value as MPLS label if it is an Absolute SID */ - if (CHECK_FLAG(srp->sid.flags, - ISIS_PREFIX_SID_VALUE | ISIS_PREFIX_SID_LOCAL)) - return srp->sid.value; - - /* Check that SID index falls inside the SRGB */ - if (srp->sid.value >= (area->srdb.config.srgb_upper_bound - - area->srdb.config.srgb_lower_bound + 1)) { - flog_warn(EC_ISIS_SID_OVERFLOW, - "%s: SID index %u falls outside local SRGB range", - __func__, srp->sid.value); - return MPLS_INVALID_LABEL; - } - - /* Return MPLS label as SID index + SRGB_lower_bound as per RFC 8667 */ - return (area->srdb.config.srgb_lower_bound + srp->sid.value); -} - -/** - * Compute output label for the given Prefix-SID. - * - * @param srp Segment Routing Prefix - * @param srn_nexthop Segment Routing nexthop node - * @param sysid System ID of the SR node which advertised the Prefix-SID - * - * @return MPLS label or MPLS_INVALID_LABEL in case of error - */ -static mpls_label_t sr_prefix_out_label(const struct sr_prefix *srp, - const struct sr_node *srn_nexthop, - const uint8_t *sysid) -{ - const struct sr_node *srn = srp->srn; - - /* Check if the nexthop SR Node is the last hop? */ - if (memcmp(sysid, srn->sysid, ISIS_SYS_ID_LEN) == 0) { - /* SR-Node doesn't request NO-PHP. Return Implicit NULL label */ - if (!CHECK_FLAG(srp->sid.flags, ISIS_PREFIX_SID_NO_PHP)) - return MPLS_LABEL_IMPLICIT_NULL; - - /* SR-Node requests Implicit NULL Label */ - if (CHECK_FLAG(srp->sid.flags, ISIS_PREFIX_SID_EXPLICIT_NULL)) { - if (srp->prefix.family == AF_INET) - return MPLS_LABEL_IPV4_EXPLICIT_NULL; - else - return MPLS_LABEL_IPV6_EXPLICIT_NULL; - } - /* Fallthrough */ - } - - /* Return SID value as MPLS label if it is an Absolute SID */ - if (CHECK_FLAG(srp->sid.flags, - ISIS_PREFIX_SID_VALUE | ISIS_PREFIX_SID_LOCAL)) { - /* - * V/L SIDs have local significance, so only adjacent routers - * can use them (RFC8667 section #2.1.1.1) - */ - if (srp->srn != srn_nexthop) - return MPLS_INVALID_LABEL; - return srp->sid.value; - } - - /* Check that SID index falls inside the SRGB */ - if (srp->sid.value >= srn_nexthop->cap.srgb.range_size) { - flog_warn(EC_ISIS_SID_OVERFLOW, - "%s: SID index %u falls outside remote SRGB range", - __func__, srp->sid.value); - return MPLS_INVALID_LABEL; - } - - /* Return MPLS label as SID index + SRGB_lower_bound as per RFC 8667 */ - return (srn_nexthop->cap.srgb.lower_bound + srp->sid.value); -} - -/** - * Process local Prefix-SID and install it if possible. Input label is - * computed before installing it in LFIB. - * - * @param srp Segment Routing Prefix - * - * @return 0 on success, -1 otherwise - */ -static int sr_prefix_install_local(struct sr_prefix *srp) -{ - mpls_label_t input_label; - const struct sr_node *srn = srp->srn; - - /* - * No need to install Label for local Prefix-SID unless the - * no-PHP option is configured. - */ - if (!CHECK_FLAG(srp->sid.flags, ISIS_PREFIX_SID_NO_PHP) - || CHECK_FLAG(srp->sid.flags, ISIS_PREFIX_SID_EXPLICIT_NULL)) - return -1; - - sr_debug(" |- Installing Prefix-SID %pFX %s %u (%s) with nexthop self", - &srp->prefix, IS_SID_VALUE(srp->sid.flags) ? "label" : "index", - srp->sid.value, circuit_t2string(srn->level)); - - /* Compute input label and check that is valid. */ - input_label = sr_prefix_in_label(srp); - if (input_label == MPLS_INVALID_LABEL) - return -1; - - /* Update internal state. */ - srp->input_label = input_label; - isis_sr_nexthop_update(&srp->u.local.info, MPLS_LABEL_IMPLICIT_NULL); - - /* Install Prefix-SID in the forwarding plane. */ - isis_zebra_send_prefix_sid(ZEBRA_MPLS_LABELS_REPLACE, srp); - - return 0; -} - -/** - * Process remote Prefix-SID and install it if possible. Input and Output - * labels are computed before installing them in LFIB. - * - * @param srp Segment Routing Prefix - * - * @return 0 on success, -1 otherwise - */ -static int sr_prefix_install_remote(struct sr_prefix *srp) -{ - const struct sr_node *srn = srp->srn; - struct isis_area *area = srn->area; - enum spf_tree_id tree_id; - struct listnode *node; - struct isis_nexthop *nexthop; - mpls_label_t input_label; - size_t nexthop_num = 0; - - /* Lookup to associated IS-IS route. */ - tree_id = (srp->prefix.family == AF_INET) ? SPFTREE_IPV4 : SPFTREE_IPV6; - srp->u.remote.rinfo = sr_prefix_lookup_route(area, tree_id, srp); - if (!srp->u.remote.rinfo) - /* SPF hasn't converged for this route yet. */ - return -1; - - /* Compute input label and check that is valid. */ - input_label = sr_prefix_in_label(srp); - if (input_label == MPLS_INVALID_LABEL) - return -1; - - sr_debug(" |- Installing Prefix-SID %pFX %s %u (%s)", &srp->prefix, - IS_SID_VALUE(srp->sid.flags) ? "label" : "index", - srp->sid.value, circuit_t2string(srn->level)); - - /* Process all SPF nexthops */ - for (ALL_LIST_ELEMENTS_RO(srp->u.remote.rinfo->nexthops, node, - nexthop)) { - struct sr_node *srn_nexthop; - mpls_label_t output_label; - - /* Check if the nexthop advertised a SRGB. */ - srn_nexthop = sr_node_find(area, srn->level, nexthop->sysid); - if (!srn_nexthop) - goto next; - - /* - * Check if the nexthop can handle SR-MPLS encapsulated IPv4 or - * IPv6 packets. - */ - if ((nexthop->family == AF_INET - && !IS_SR_IPV4(srn_nexthop->cap.srgb)) - || (nexthop->family == AF_INET6 - && !IS_SR_IPV6(srn_nexthop->cap.srgb))) - goto next; - - /* Compute output label and check if it is valid */ - output_label = - sr_prefix_out_label(srp, srn_nexthop, nexthop->sysid); - if (output_label == MPLS_INVALID_LABEL) - goto next; - - if (IS_DEBUG_SR) { - static char buf[INET6_ADDRSTRLEN]; - - inet_ntop(nexthop->family, &nexthop->ip, buf, - sizeof(buf)); - zlog_debug(" |- nexthop %s label %u", buf, - output_label); - } - - isis_sr_nexthop_update(&nexthop->sr, output_label); - nexthop_num++; - continue; - next: - isis_sr_nexthop_reset(&nexthop->sr); - } - - /* Check that we found at least one valid nexthop */ - if (nexthop_num == 0) { - sr_debug(" |- no valid nexthops"); - return -1; - } - - /* Update internal state. */ - srp->input_label = input_label; - - /* Install Prefix-SID in the forwarding plane. */ - isis_zebra_send_prefix_sid(ZEBRA_MPLS_LABELS_REPLACE, srp); - - return 0; -} - -/** - * Process local or remote Prefix-SID and install it if possible. - * - * @param srp Segment Routing Prefix - */ -static void sr_prefix_install(struct sr_prefix *srp) -{ - const struct sr_node *srn = srp->srn; - struct isis_area *area = srn->area; - int ret; - - sr_debug("ISIS-Sr (%s): Install Prefix-SID %pFX %s %u", area->area_tag, - &srp->prefix, IS_SID_VALUE(srp->sid.flags) ? "label" : "index", - srp->sid.value); - - /* L1 routes are preferred over the L2 ones. */ - if (area->is_type == IS_LEVEL_1_AND_2) { - struct sr_prefix *srp_l1, *srp_l2; - - switch (srn->level) { - case ISIS_LEVEL1: - srp_l2 = sr_prefix_find_by_area(area, ISIS_LEVEL2, - &srp->prefix); - if (srp_l2) - sr_prefix_uninstall(srp_l2); - break; - case ISIS_LEVEL2: - srp_l1 = sr_prefix_find_by_area(area, ISIS_LEVEL1, - &srp->prefix); - if (srp_l1) - return; - break; - default: - break; - } - } - - /* Install corresponding LFIB entry */ - if (srp->type == ISIS_SR_PREFIX_LOCAL) - ret = sr_prefix_install_local(srp); - else - ret = sr_prefix_install_remote(srp); - if (ret != 0) - sr_prefix_uninstall(srp); -} - -/** - * Uninstall local or remote Prefix-SID. - * - * @param srp Segment Routing Prefix - */ -static void sr_prefix_uninstall(struct sr_prefix *srp) -{ - struct listnode *node; - struct isis_nexthop *nexthop; - - /* Check that Input Label is valid */ - if (srp->input_label == MPLS_INVALID_LABEL) - return; - - sr_debug("ISIS-Sr: Un-install Prefix-SID %pFX %s %u", &srp->prefix, - IS_SID_VALUE(srp->sid.flags) ? "label" : "index", - srp->sid.value); - - /* Uninstall Prefix-SID from the forwarding plane. */ - isis_zebra_send_prefix_sid(ZEBRA_MPLS_LABELS_DELETE, srp); - - /* Reset internal state. */ - srp->input_label = MPLS_INVALID_LABEL; - switch (srp->type) { - case ISIS_SR_PREFIX_LOCAL: - isis_sr_nexthop_reset(&srp->u.local.info); - break; - case ISIS_SR_PREFIX_REMOTE: - if (srp->u.remote.rinfo) { - for (ALL_LIST_ELEMENTS_RO(srp->u.remote.rinfo->nexthops, - node, nexthop)) - isis_sr_nexthop_reset(&nexthop->sr); - } - break; - } -} - -/** - * Reinstall local or remote Prefix-SID. - * - * @param srp Segment Routing Prefix - */ -static inline void sr_prefix_reinstall(struct sr_prefix *srp, - bool make_before_break) -{ - /* - * Make Before Break can be used only when we know for sure that - * the Prefix-SID input label hasn't changed. Otherwise we need to - * uninstall the Prefix-SID first using the old input label before - * reinstalling it. - */ - if (!make_before_break) - sr_prefix_uninstall(srp); - - /* New input label is computed in sr_prefix_install() function */ - sr_prefix_install(srp); -} - -/* --- IS-IS LSP Parse functions -------------------------------------------- */ - -/** - * Compare Router Capabilities. Only Flags, SRGB and Algorithm are used for the - * comparison. MSD and SRLB modification must not trigger and SR-Prefix update. - * - * @param r1 First Router Capabilities to compare - * @param r2 Second Router Capabilities to compare - * @return 0 if r1 and r2 are equal or -1 otherwise - */ -static int router_cap_cmp(const struct isis_router_cap *r1, - const struct isis_router_cap *r2) -{ - if (r1->flags == r2->flags - && r1->srgb.lower_bound == r2->srgb.lower_bound - && r1->srgb.range_size == r2->srgb.range_size - && r1->algo[0] == r2->algo[0]) - return 0; - else - return -1; -} - -/** - * Parse all SR-related information from the given Router Capabilities TLV. - * - * @param area IS-IS area - * @param level IS-IS level - * @param sysid System ID of the LSP - * @param router_cap Router Capability subTLVs - * - * @return Segment Routing Node structure for this System ID - */ -static struct sr_node * -parse_router_cap_tlv(struct isis_area *area, int level, const uint8_t *sysid, - const struct isis_router_cap *router_cap) -{ - struct sr_node *srn; - - if (!router_cap || router_cap->srgb.range_size == 0) - return NULL; - - sr_debug("ISIS-Sr (%s): Parse Router Capability TLV", area->area_tag); - - srn = sr_node_find(area, level, sysid); - if (srn) { - if (router_cap_cmp(&srn->cap, router_cap) != 0) { - srn->state = SRDB_STATE_MODIFIED; - } else - srn->state = SRDB_STATE_UNCHANGED; - sr_debug(" |- Found %s SR Node %s", - srn->state == SRDB_STATE_MODIFIED ? "Modified" - : "Unchanged", - sysid_print(srn->sysid)); - } else { - srn = sr_node_add(area, level, sysid); - srn->state = SRDB_STATE_NEW; - } - - /* - * Update Router Capabilities in any case as SRLB or MSD - * modification are not take into account for comparison. - */ - srn->cap = *router_cap; - - return srn; -} - -/** - * Parse list of Prefix-SID Sub-TLVs. - * - * @param srn Segment Routing Node - * @param prefix Prefix to be parsed - * @param local True if prefix comes from own LSP, false otherwise - * @param prefix_sids Prefix SID subTLVs - */ -static void parse_prefix_sid_subtlvs(struct sr_node *srn, - union prefixconstptr prefix, bool local, - struct isis_item_list *prefix_sids) -{ - struct isis_area *area = srn->area; - struct isis_item *i; - - sr_debug("ISIS-Sr (%s): Parse Prefix SID TLV", area->area_tag); - - /* Parse list of Prefix SID subTLVs */ - for (i = prefix_sids->head; i; i = i->next) { - struct isis_prefix_sid *psid = (struct isis_prefix_sid *)i; - struct sr_prefix *srp; - - /* Only SPF algorithm is supported right now */ - if (psid->algorithm != SR_ALGORITHM_SPF) - continue; - - /* Compute corresponding Segment Routing Prefix */ - srp = sr_prefix_find_by_node(srn, prefix); - if (srp) { - if (srp->sid.flags != psid->flags - || srp->sid.algorithm != psid->algorithm - || srp->sid.value != psid->value) { - srp->sid = *psid; - srp->state = SRDB_STATE_MODIFIED; - } else if (srp->state == SRDB_STATE_VALIDATED) - srp->state = SRDB_STATE_UNCHANGED; - sr_debug(" |- Found %s Prefix-SID %pFX", - srp->state == SRDB_STATE_MODIFIED - ? "Modified" - : "Unchanged", - &srp->prefix); - - } else { - srp = sr_prefix_add(area, srn, prefix, local, psid); - srp->state = SRDB_STATE_NEW; - } - /* - * Stop the Prefix-SID iteration since we only support the SPF - * algorithm for now. - */ - break; - } -} - -/** - * Parse all SR-related information from the given LSP. - * - * @param area IS-IS area - * @param level IS-IS level - * @param srn Segment Routing Node - * @param lsp IS-IS LSP - */ -static void parse_lsp(struct isis_area *area, int level, struct sr_node **srn, - struct isis_lsp *lsp) -{ - struct isis_item_list *items; - struct isis_item *i; - bool local = lsp->own_lsp; - - /* Check LSP sequence number */ - if (lsp->hdr.seqno == 0) { - zlog_warn("%s: lsp with 0 seq_num - ignore", __func__); - return; - } - - sr_debug("ISIS-Sr (%s): Parse LSP from node %s", area->area_tag, - sysid_print(lsp->hdr.lsp_id)); - - /* Parse the Router Capability TLV. */ - if (*srn == NULL) { - *srn = parse_router_cap_tlv(area, level, lsp->hdr.lsp_id, - lsp->tlvs->router_cap); - if (!*srn) - return; - } - - /* Parse the Extended IP Reachability TLV. */ - items = &lsp->tlvs->extended_ip_reach; - for (i = items->head; i; i = i->next) { - struct isis_extended_ip_reach *ir; - - ir = (struct isis_extended_ip_reach *)i; - if (!ir->subtlvs) - continue; - - parse_prefix_sid_subtlvs(*srn, &ir->prefix, local, - &ir->subtlvs->prefix_sids); - } - - /* Parse Multi Topology Reachable IPv6 Prefixes TLV. */ - items = isis_lookup_mt_items(&lsp->tlvs->mt_ipv6_reach, - ISIS_MT_IPV6_UNICAST); - for (i = items ? items->head : NULL; i; i = i->next) { - struct isis_ipv6_reach *ir; - - ir = (struct isis_ipv6_reach *)i; - if (!ir->subtlvs) - continue; - - parse_prefix_sid_subtlvs(*srn, &ir->prefix, local, - &ir->subtlvs->prefix_sids); - } -} - -/** - * Parse all SR-related information from the entire LSPDB. - * - * @param area IS-IS area - */ -static void parse_lspdb(struct isis_area *area) -{ - struct isis_lsp *lsp; - - sr_debug("ISIS-Sr (%s): Parse LSP Data Base", area->area_tag); - - /* Process all LSP from Level 1 & 2 */ - for (int level = ISIS_LEVEL1; level <= ISIS_LEVELS; level++) { - frr_each (lspdb, &area->lspdb[level - 1], lsp) { - struct isis_lsp *frag; - struct listnode *node; - struct sr_node *srn = NULL; - - /* Skip Pseudo ID LSP and LSP without TLVs */ - if (LSP_PSEUDO_ID(lsp->hdr.lsp_id)) - continue; - if (!lsp->tlvs) - continue; - - /* Parse LSP, then fragment */ - parse_lsp(area, level, &srn, lsp); - for (ALL_LIST_ELEMENTS_RO(lsp->lspu.frags, node, frag)) - parse_lsp(area, level, &srn, frag); - } - } -} - -/** - * Process any new/deleted/modified Prefix-SID in the LSPDB. - * - * @param srn Segment Routing Node - * @param srp Segment Routing Prefix - */ -static void process_prefix_changes(struct sr_node *srn, struct sr_prefix *srp) -{ - struct isis_area *area = srn->area; - - /* Install/reinstall/uninstall Prefix-SID if necessary. */ - switch (srp->state) { - case SRDB_STATE_NEW: - sr_debug("ISIS-Sr (%s): Created Prefix-SID %pFX for SR node %s", - area->area_tag, &srp->prefix, sysid_print(srn->sysid)); - sr_prefix_install(srp); - break; - case SRDB_STATE_MODIFIED: - sr_debug( - "ISIS-Sr (%s): Modified Prefix-SID %pFX for SR node %s", - area->area_tag, &srp->prefix, sysid_print(srn->sysid)); - sr_prefix_reinstall(srp, false); - break; - case SRDB_STATE_UNCHANGED: - break; - default: - sr_debug("ISIS-Sr (%s): Removed Prefix-SID %pFX for SR node %s", - area->area_tag, &srp->prefix, sysid_print(srn->sysid)); - sr_prefix_del(area, srn, srp); - return; - } - - /* Validate SRDB State for next LSPDB parsing */ - srp->state = SRDB_STATE_VALIDATED; -} - -/** - * Process any new/deleted/modified SRGB in the LSPDB. - * - * @param area IS-IS area - * @param level IS-IS level - * @param srn Segment Routing Node - */ -static void process_node_changes(struct isis_area *area, int level, - struct sr_node *srn) -{ - struct sr_prefix *srp; - uint8_t sysid[ISIS_SYS_ID_LEN]; - bool adjacent; - - memcpy(sysid, srn->sysid, sizeof(sysid)); - - /* - * If an neighbor router's SRGB was changed or created, then reinstall - * all Prefix-SIDs from all nodes that use this neighbor as nexthop. - */ - adjacent = !!isis_adj_find(area, level, sysid); - switch (srn->state) { - case SRDB_STATE_NEW: - case SRDB_STATE_MODIFIED: - sr_debug("ISIS-Sr (%s): Create/Update SR node %s", - area->area_tag, sysid_print(srn->sysid)); - if (adjacent) - sr_node_srgb_update(area, level, sysid); - break; - case SRDB_STATE_UNCHANGED: - break; - default: - /* SR capabilities have been removed. Delete SR-Node */ - sr_debug("ISIS-Sr (%s): Remove SR node %s", area->area_tag, - sysid_print(srn->sysid)); - - sr_node_del(area, level, srn); - /* and Update remaining Prefix-SID from all remaining SR Node */ - if (adjacent) - sr_node_srgb_update(area, level, sysid); - return; - } - - /* Validate SRDB State for next LSPDB parsing */ - srn->state = SRDB_STATE_VALIDATED; - - /* Finally, process all Prefix-SID of this SR Node */ - frr_each_safe (srdb_node_prefix, &srn->prefix_sids, srp) - process_prefix_changes(srn, srp); -} - /** * Delete all backup Adj-SIDs. * @@ -1272,89 +466,6 @@ void isis_area_delete_backup_adj_sids(struct isis_area *area, int level) sr_adj_sid_del(sra); } -/** - * Parse and process all SR-related Sub-TLVs after running the SPF algorithm. - * - * @param area IS-IS area - */ -void isis_area_verify_sr(struct isis_area *area) -{ - struct sr_node *srn; - - if (!area->srdb.enabled) - return; - - /* Parse LSPDB to detect new/deleted/modified SR (sub-)TLVs. */ - parse_lspdb(area); - - /* Process possible SR-related changes in the LDPSB. */ - for (int level = ISIS_LEVEL1; level <= ISIS_LEVELS; level++) { - frr_each_safe (srdb_node, &area->srdb.sr_nodes[level - 1], srn) - process_node_changes(area, level, srn); - } -} - -/** - * Once a route is updated in the SPT, reinstall or uninstall its corresponding - * Prefix-SID (if any). - * - * @param area IS-IS area - * @param prefix Prefix to be updated - * @param route_info New Route Information - * - * @return 0 - */ -static int sr_route_update(struct isis_area *area, struct prefix *prefix, - struct isis_route_info *route_info) -{ - struct sr_prefix *srp; - - if (!area->srdb.enabled) - return 0; - - sr_debug("ISIS-Sr (%s): Update route for prefix %pFX", area->area_tag, - prefix); - - /* Lookup to Segment Routing Prefix for this prefix */ - switch (area->is_type) { - case IS_LEVEL_1: - srp = sr_prefix_find_by_area(area, ISIS_LEVEL1, prefix); - break; - case IS_LEVEL_2: - srp = sr_prefix_find_by_area(area, ISIS_LEVEL2, prefix); - break; - case IS_LEVEL_1_AND_2: - srp = sr_prefix_find_by_area(area, ISIS_LEVEL1, prefix); - if (!srp) - srp = sr_prefix_find_by_area(area, ISIS_LEVEL2, prefix); - break; - default: - flog_err(EC_LIB_DEVELOPMENT, "%s: unknown area level", - __func__); - exit(1); - } - - /* Skip NULL or local Segment Routing Prefix */ - if (!srp || srp->type == ISIS_SR_PREFIX_LOCAL) - return 0; - - /* Install or unintall Prefix-SID if route is Active or not */ - if (CHECK_FLAG(route_info->flag, ISIS_ROUTE_FLAG_ACTIVE)) { - /* - * The Prefix-SID input label hasn't changed. We could use the - * "Make Before Break" option. Zebra layer will update output - * label by adding new label(s) before removing old one(s). - */ - sr_prefix_reinstall(srp, true); - srp->u.remote.rinfo = route_info; - } else { - sr_prefix_uninstall(srp); - srp->u.remote.rinfo = NULL; - } - - return 0; -} - /* --- Segment Routing Local Block management functions --------------------- */ /** @@ -1588,7 +699,7 @@ void sr_adj_sid_add_single(struct isis_adjacency *adj, int family, bool backup, struct mpls_label_stack *label_stack; label_stack = vadj->label_stack; - adjinfo2nexthop(family, sra->backup_nexthops, adj, + adjinfo2nexthop(family, sra->backup_nexthops, adj, NULL, label_stack); } } @@ -1838,7 +949,7 @@ static int sr_if_new_hook(struct interface *ifp) continue; if (sr_prefix_is_node_sid(ifp, &pcfg->prefix) - && !pcfg->node_sid) { + && !pcfg->n_flag_clear) { pcfg->node_sid = true; lsp_regenerate_schedule(area, area->is_type, 0); } @@ -1847,8 +958,6 @@ static int sr_if_new_hook(struct interface *ifp) return 0; } -/* --- Segment Routing Show information functions --------------------------- */ - /** * Show LFIB operation in human readable format. * @@ -1856,13 +965,11 @@ static int sr_if_new_hook(struct interface *ifp) * @param size Size of the buffer * @param label_in Input Label * @param label_out Output Label - * @param label_stack Output Label Stack (TI-LFA) * * @return String containing LFIB operation in human readable format */ -static char *sr_op2str(char *buf, size_t size, mpls_label_t label_in, - mpls_label_t label_out, - const struct mpls_label_stack *label_stack) +char *sr_op2str(char *buf, size_t size, mpls_label_t label_in, + mpls_label_t label_out) { if (size < 24) return NULL; @@ -1872,16 +979,6 @@ static char *sr_op2str(char *buf, size_t size, mpls_label_t label_in, return buf; } - if (label_stack) { - char buf_labels[256]; - - mpls_label2str(label_stack->num_labels, &label_stack->label[0], - buf_labels, sizeof(buf_labels), 1); - - snprintf(buf, size, "Swap(%u, %s)", label_in, buf_labels); - return buf; - } - switch (label_out) { case MPLS_LABEL_IMPLICIT_NULL: snprintf(buf, size, "Pop(%u)", label_in); @@ -1901,215 +998,6 @@ static char *sr_op2str(char *buf, size_t size, mpls_label_t label_in, } /** - * Show Local Prefix-SID. - * - * @param vty VTY output - * @param tt Table format - * @param area IS-IS area - * @param srp Segment Routing Prefix - */ -static void show_prefix_sid_local(struct vty *vty, struct ttable *tt, - const struct isis_area *area, - const struct sr_prefix *srp) -{ - const struct sr_nexthop_info *srnh = &srp->u.local.info; - char buf_prefix[BUFSIZ]; - char buf_oper[BUFSIZ]; - char buf_iface[BUFSIZ]; - char buf_uptime[BUFSIZ]; - - if (srnh->label != MPLS_INVALID_LABEL) { - struct interface *ifp; - ifp = if_lookup_prefix(&srp->prefix, VRF_DEFAULT); - if (ifp) - strlcpy(buf_iface, ifp->name, sizeof(buf_iface)); - else - snprintf(buf_iface, sizeof(buf_iface), "-"); - log_uptime(srnh->uptime, buf_uptime, sizeof(buf_uptime)); - } else { - snprintf(buf_iface, sizeof(buf_iface), "-"); - snprintf(buf_uptime, sizeof(buf_uptime), "-"); - } - sr_op2str(buf_oper, sizeof(buf_oper), srp->input_label, - MPLS_LABEL_IMPLICIT_NULL, NULL); - - ttable_add_row(tt, "%s|%u|%s|-|%s|%s", - prefix2str(&srp->prefix, buf_prefix, sizeof(buf_prefix)), - srp->sid.value, buf_oper, buf_iface, buf_uptime); -} - -/** - * Show Remote Prefix-SID. - * - * @param vty VTY output - * @param tt Table format - * @param area IS-IS area - * @param srp Segment Routing Prefix - */ -static void show_prefix_sid_remote(struct vty *vty, struct ttable *tt, - const struct isis_area *area, - const struct sr_prefix *srp, bool backup) -{ - struct isis_nexthop *nexthop; - struct listnode *node; - char buf_prefix[BUFSIZ]; - char buf_oper[BUFSIZ]; - char buf_nhop[BUFSIZ]; - char buf_iface[BUFSIZ]; - char buf_uptime[BUFSIZ]; - bool first = true; - struct isis_route_info *rinfo; - - (void)prefix2str(&srp->prefix, buf_prefix, sizeof(buf_prefix)); - - rinfo = srp->u.remote.rinfo; - if (rinfo && backup) - rinfo = rinfo->backup; - if (!rinfo) { - ttable_add_row(tt, "%s|%u|%s|-|-|-", buf_prefix, srp->sid.value, - sr_op2str(buf_oper, sizeof(buf_oper), - srp->input_label, - MPLS_LABEL_IMPLICIT_NULL, NULL)); - return; - } - - for (ALL_LIST_ELEMENTS_RO(rinfo->nexthops, node, nexthop)) { - struct interface *ifp; - - inet_ntop(nexthop->family, &nexthop->ip, buf_nhop, - sizeof(buf_nhop)); - ifp = if_lookup_by_index(nexthop->ifindex, VRF_DEFAULT); - if (ifp) - strlcpy(buf_iface, ifp->name, sizeof(buf_iface)); - else - snprintf(buf_iface, sizeof(buf_iface), "ifindex %u", - nexthop->ifindex); - if (nexthop->sr.label == MPLS_INVALID_LABEL) - snprintf(buf_uptime, sizeof(buf_uptime), "-"); - else - log_uptime(nexthop->sr.uptime, buf_uptime, - sizeof(buf_uptime)); - sr_op2str(buf_oper, sizeof(buf_oper), srp->input_label, - nexthop->sr.label, nexthop->label_stack); - - if (first) - ttable_add_row(tt, "%s|%u|%s|%s|%s|%s", buf_prefix, - srp->sid.value, buf_oper, buf_nhop, - buf_iface, buf_uptime); - else - ttable_add_row(tt, "|||%s|%s|%s|%s", buf_oper, buf_nhop, - buf_iface, buf_uptime); - first = false; - } -} - -/** - * Show Prefix-SIDs. - * - * @param vty VTY output - * @param area IS-IS area - * @param level IS-IS level - */ -static void show_prefix_sids(struct vty *vty, struct isis_area *area, int level, - bool backup) -{ - struct sr_prefix *srp; - struct ttable *tt; - - if (srdb_area_prefix_count(&area->srdb.prefix_sids[level - 1]) == 0) - return; - - vty_out(vty, " IS-IS %s Prefix-SIDs:\n\n", circuit_t2string(level)); - - /* Prepare table. */ - tt = ttable_new(&ttable_styles[TTSTYLE_BLANK]); - ttable_add_row(tt, "Prefix|SID|Label Op.|Nexthop|Interface|Uptime"); - tt->style.cell.rpad = 2; - tt->style.corner = '+'; - ttable_restyle(tt); - ttable_rowseps(tt, 0, BOTTOM, true, '-'); - - /* Process all Prefix-SID from the SRDB */ - frr_each (srdb_area_prefix, &area->srdb.prefix_sids[level - 1], srp) { - switch (srp->type) { - case ISIS_SR_PREFIX_LOCAL: - show_prefix_sid_local(vty, tt, area, srp); - break; - case ISIS_SR_PREFIX_REMOTE: - show_prefix_sid_remote(vty, tt, area, srp, backup); - break; - } - } - - /* Dump the generated table. */ - if (tt->nrows > 1) { - char *table; - - table = ttable_dump(tt, "\n"); - vty_out(vty, "%s\n", table); - XFREE(MTYPE_TMP, table); - } - ttable_del(tt); -} - -/** - * Declaration of new show commands. - */ -DEFUN(show_sr_prefix_sids, show_sr_prefix_sids_cmd, - "show isis [vrf <NAME|all>] segment-routing prefix-sids [backup]", - SHOW_STR PROTO_HELP VRF_CMD_HELP_STR - "All VRFs\n" - "Segment-Routing\n" - "Segment-Routing Prefix-SIDs\n" - "Show backup Prefix-SIDs\n") -{ - struct listnode *node, *inode; - struct isis_area *area; - struct isis *isis = NULL; - const char *vrf_name = VRF_DEFAULT_NAME; - bool all_vrf = false; - bool backup = false; - int idx = 0; - - ISIS_FIND_VRF_ARGS(argv, argc, idx, vrf_name, all_vrf); - if (argv_find(argv, argc, "backup", &idx)) - backup = true; - - if (vrf_name) { - if (all_vrf) { - for (ALL_LIST_ELEMENTS_RO(im->isis, inode, isis)) { - for (ALL_LIST_ELEMENTS_RO(isis->area_list, node, - area)) { - vty_out(vty, "Area %s:\n", - area->area_tag ? area->area_tag - : "null"); - for (int level = ISIS_LEVEL1; - level <= ISIS_LEVELS; level++) - show_prefix_sids(vty, area, - level, backup); - } - } - return 0; - } - isis = isis_lookup_by_vrfname(vrf_name); - if (isis != NULL) { - for (ALL_LIST_ELEMENTS_RO(isis->area_list, node, - area)) { - vty_out(vty, "Area %s:\n", - area->area_tag ? area->area_tag - : "null"); - for (int level = ISIS_LEVEL1; - level <= ISIS_LEVELS; level++) - show_prefix_sids(vty, area, level, - backup); - } - } - } - - return CMD_SUCCESS; -} - -/** * Show Segment Routing Node. * * @param vty VTY output @@ -2118,13 +1006,10 @@ DEFUN(show_sr_prefix_sids, show_sr_prefix_sids_cmd, */ static void show_node(struct vty *vty, struct isis_area *area, int level) { - struct sr_node *srn; + struct isis_lsp *lsp; struct ttable *tt; - if (srdb_area_prefix_count(&area->srdb.prefix_sids[level - 1]) == 0) - return; - - vty_out(vty, " IS-IS %s SR-Node:\n\n", circuit_t2string(level)); + vty_out(vty, " IS-IS %s SR-Nodes:\n\n", circuit_t2string(level)); /* Prepare table. */ tt = ttable_new(&ttable_styles[TTSTYLE_BLANK]); @@ -2134,19 +1019,23 @@ static void show_node(struct vty *vty, struct isis_area *area, int level) ttable_restyle(tt); ttable_rowseps(tt, 0, BOTTOM, true, '-'); - /* Process all SR-Node from the SRDB */ - frr_each (srdb_node, &area->srdb.sr_nodes[level - 1], srn) { + frr_each (lspdb, &area->lspdb[level - 1], lsp) { + struct isis_router_cap *cap; + + if (!lsp->tlvs) + continue; + cap = lsp->tlvs->router_cap; + if (!cap) + continue; + ttable_add_row( tt, "%s|%u - %u|%u - %u|%s|%u", - sysid_print(srn->sysid), - srn->cap.srgb.lower_bound, - srn->cap.srgb.lower_bound + srn->cap.srgb.range_size - - 1, - srn->cap.srlb.lower_bound, - srn->cap.srlb.lower_bound + srn->cap.srlb.range_size - - 1, - srn->cap.algo[0] == SR_ALGORITHM_SPF ? "SPF" : "S-SPF", - srn->cap.msd); + sysid_print(lsp->hdr.lsp_id), cap->srgb.lower_bound, + cap->srgb.lower_bound + cap->srgb.range_size - 1, + cap->srlb.lower_bound, + cap->srlb.lower_bound + cap->srlb.range_size - 1, + cap->algo[0] == SR_ALGORITHM_SPF ? "SPF" : "S-SPF", + cap->msd); } /* Dump the generated table. */ @@ -2184,7 +1073,6 @@ DEFUN(show_sr_node, show_sr_node_cmd, return CMD_SUCCESS; } - /* --- IS-IS Segment Routing Management function ---------------------------- */ /** @@ -2284,22 +1172,12 @@ void isis_sr_stop(struct isis_area *area) area->area_tag); /* Disable any re-attempt to connect to Label Manager */ - THREAD_TIMER_OFF(srdb->t_start_lm); + thread_cancel(&srdb->t_start_lm); /* Uninstall all local Adjacency-SIDs. */ for (ALL_LIST_ELEMENTS(area->srdb.adj_sids, node, nnode, sra)) sr_adj_sid_del(sra); - /* Uninstall all Prefix-SIDs from all SR Node. */ - for (int level = ISIS_LEVEL1; level <= ISIS_LEVELS; level++) { - while (srdb_node_count(&srdb->sr_nodes[level - 1]) > 0) { - struct sr_node *srn; - - srn = srdb_node_first(&srdb->sr_nodes[level - 1]); - sr_node_del(area, level, srn); - } - } - /* Release SRGB if active. */ if (srdb->srgb_active) { isis_zebra_release_label_range(srdb->config.srgb_lower_bound, @@ -2332,11 +1210,6 @@ void isis_sr_area_init(struct isis_area *area) memset(srdb, 0, sizeof(*srdb)); srdb->adj_sids = list_new(); - for (int level = ISIS_LEVEL1; level <= ISIS_LEVELS; level++) { - srdb_node_init(&srdb->sr_nodes[level - 1]); - srdb_area_prefix_init(&srdb->prefix_sids[level - 1]); - } - /* Pull defaults from the YANG module. */ #ifndef FABRICD srdb->config.enabled = yang_get_default_bool("%s/enabled", ISIS_SR); @@ -2386,14 +1259,12 @@ void isis_sr_area_term(struct isis_area *area) */ void isis_sr_init(void) { - install_element(VIEW_NODE, &show_sr_prefix_sids_cmd); install_element(VIEW_NODE, &show_sr_node_cmd); /* Register hooks. */ hook_register(isis_adj_state_change_hook, sr_adj_state_change); hook_register(isis_adj_ip_enabled_hook, sr_adj_ip_enabled); hook_register(isis_adj_ip_disabled_hook, sr_adj_ip_disabled); - hook_register(isis_route_update_hook, sr_route_update); hook_register(isis_if_new_hook, sr_if_new_hook); } @@ -2406,6 +1277,5 @@ void isis_sr_term(void) hook_unregister(isis_adj_state_change_hook, sr_adj_state_change); hook_unregister(isis_adj_ip_enabled_hook, sr_adj_ip_enabled); hook_unregister(isis_adj_ip_disabled_hook, sr_adj_ip_disabled); - hook_unregister(isis_route_update_hook, sr_route_update); hook_unregister(isis_if_new_hook, sr_if_new_hook); } diff --git a/isisd/isis_sr.h b/isisd/isis_sr.h index 2e4f3a69f7..b012dfb00a 100644 --- a/isisd/isis_sr.h +++ b/isisd/isis_sr.h @@ -57,11 +57,25 @@ #define SRLB_UPPER_BOUND 15999 /* Segment Routing Data Base (SRDB) RB-Tree structure */ -PREDECL_RBTREE_UNIQ(srdb_node) -PREDECL_RBTREE_UNIQ(srdb_node_prefix) -PREDECL_RBTREE_UNIQ(srdb_area_prefix) PREDECL_RBTREE_UNIQ(srdb_prefix_cfg) +/* + * Segment Routing Prefix-SID information. + * + * This structure is intended to be embedded inside other structures that + * might or might not contain Prefix-SID information. + */ +struct isis_sr_psid_info { + /* Prefix-SID Sub-TLV information. */ + struct isis_prefix_sid sid; + + /* Resolved input/output label. */ + mpls_label_t label; + + /* Indicates whether the Prefix-SID is present or not. */ + bool present; +}; + /* Segment Routing Local Block allocation */ struct sr_local_block { bool active; @@ -106,85 +120,6 @@ struct sr_adjacency { struct isis_adjacency *adj; }; -/* Segment Routing Prefix-SID type. */ -enum sr_prefix_type { - ISIS_SR_PREFIX_LOCAL = 0, - ISIS_SR_PREFIX_REMOTE, -}; - -/* Segment Routing Nexthop Information. */ -struct sr_nexthop_info { - mpls_label_t label; - time_t uptime; -}; - -/* State of Object (SR-Node and SR-Prefix) stored in SRDB */ -enum srdb_state { - SRDB_STATE_VALIDATED = 0, - SRDB_STATE_NEW, - SRDB_STATE_MODIFIED, - SRDB_STATE_UNCHANGED -}; - -/* Segment Routing Prefix-SID. */ -struct sr_prefix { - /* SRDB RB-tree entries. */ - struct srdb_node_prefix_item node_entry; - struct srdb_area_prefix_item area_entry; - - /* IP prefix. */ - struct prefix prefix; - - /* SID value, algorithm and flags subTLVs. */ - struct isis_prefix_sid sid; - - /* Input label value. */ - mpls_label_t input_label; - - /* Prefix-SID type. */ - enum sr_prefix_type type; - union { - struct { - /* Information about this local Prefix-SID. */ - struct sr_nexthop_info info; - } local; - struct { - /* Route associated to this remote Prefix-SID. */ - struct isis_route_info *rinfo; - } remote; - } u; - - /* Backpointer to Segment Routing node. */ - struct sr_node *srn; - - /* SR-Prefix State used while the LSPDB is being parsed. */ - enum srdb_state state; -}; - -/* Segment Routing node. */ -struct sr_node { - /* SRDB RB-tree entry. */ - struct srdb_node_item entry; - - /* IS-IS level: ISIS_LEVEL1 or ISIS_LEVEL2. */ - int level; - - /* IS-IS node identifier. */ - uint8_t sysid[ISIS_SYS_ID_LEN]; - - /* Segment Routing node capabilities (SRGB, SR Algorithms) subTLVs. */ - struct isis_router_cap cap; - - /* List of Prefix-SIDs advertised by this node. */ - struct srdb_node_prefix_head prefix_sids; - - /* Backpointer to IS-IS area. */ - struct isis_area *area; - - /* SR-Node State used while the LSPDB is being parsed. */ - enum srdb_state state; -}; - /* SID type. NOTE: these values must be in sync with the YANG module. */ enum sr_sid_value_type { SR_SID_VALUE_TYPE_INDEX = 0, @@ -217,6 +152,9 @@ struct sr_prefix_cfg { /* SID last hop behavior. */ enum sr_last_hop_behavior last_hop_behavior; + /* Indicates whether the node flag must be explicitly unset. */ + bool n_flag_clear; + /* Does this Prefix-SID refer to a loopback address (Node-SID)? */ bool node_sid; @@ -235,12 +173,6 @@ struct isis_sr_db { /* List of local Adjacency-SIDs. */ struct list *adj_sids; - /* Segment Routing Node information per IS-IS level. */ - struct srdb_node_head sr_nodes[ISIS_LEVELS]; - - /* Segment Routing Prefix-SIDs per IS-IS level. */ - struct srdb_area_prefix_head prefix_sids[ISIS_LEVELS]; - /* Management of SRLB & SRGB allocation */ struct sr_local_block srlb; bool srgb_active; @@ -267,6 +199,14 @@ struct isis_sr_db { }; /* Prototypes. */ +extern struct isis_sr_block *isis_sr_find_srgb(struct lspdb_head *lspdb, + const uint8_t *sysid); +extern mpls_label_t sr_prefix_in_label(struct isis_area *area, + struct isis_prefix_sid *psid, + bool local); +extern mpls_label_t sr_prefix_out_label(struct lspdb_head *lspdb, int family, + struct isis_prefix_sid *psid, + const uint8_t *nh_sysid, bool last_hop); extern int isis_sr_cfg_srgb_update(struct isis_area *area, uint32_t lower_bound, uint32_t upper_bound); extern int isis_sr_cfg_srlb_update(struct isis_area *area, uint32_t lower_bound, @@ -279,16 +219,14 @@ isis_sr_cfg_prefix_find(struct isis_area *area, union prefixconstptr prefix); extern void isis_sr_prefix_cfg2subtlv(const struct sr_prefix_cfg *pcfg, bool external, struct isis_prefix_sid *psid); -extern void isis_sr_nexthop_update(struct sr_nexthop_info *srnh, - mpls_label_t label); -extern void isis_sr_nexthop_reset(struct sr_nexthop_info *srnh); extern void sr_adj_sid_add_single(struct isis_adjacency *adj, int family, bool backup, struct list *nexthops); extern struct sr_adjacency *isis_sr_adj_sid_find(struct isis_adjacency *adj, int family, enum sr_adj_type type); extern void isis_area_delete_backup_adj_sids(struct isis_area *area, int level); -extern void isis_area_verify_sr(struct isis_area *area); +extern char *sr_op2str(char *buf, size_t size, mpls_label_t label_in, + mpls_label_t label_out); extern int isis_sr_start(struct isis_area *area); extern void isis_sr_stop(struct isis_area *area); extern void isis_sr_area_init(struct isis_area *area); diff --git a/isisd/isis_te.c b/isisd/isis_te.c index 87c4428155..8daa2b36bf 100644 --- a/isisd/isis_te.c +++ b/isisd/isis_te.c @@ -336,10 +336,8 @@ DEFUN(show_isis_mpls_te_router, if (ntohs(area->mta->router_id.s_addr) != 0) vty_out(vty, - " MPLS-TE Router-Address: %s\n", - inet_ntoa( - area->mta - ->router_id)); + " MPLS-TE Router-Address: %pI4\n", + &area->mta->router_id); else vty_out(vty, " N/A\n"); } @@ -357,9 +355,8 @@ DEFUN(show_isis_mpls_te_router, vty_out(vty, "Area %s:\n", area->area_tag); if (ntohs(area->mta->router_id.s_addr) != 0) vty_out(vty, - " MPLS-TE Router-Address: %s\n", - inet_ntoa( - area->mta->router_id)); + " MPLS-TE Router-Address: %pI4\n", + &area->mta->router_id); else vty_out(vty, " N/A\n"); } @@ -394,11 +391,11 @@ static void show_ext_sub(struct vty *vty, char *name, ext->remote_llri); } if (IS_SUBTLV(ext, EXT_LOCAL_ADDR)) - sbuf_push(&buf, 4, "Local Interface IP Address(es): %s\n", - inet_ntoa(ext->local_addr)); + sbuf_push(&buf, 4, "Local Interface IP Address(es): %pI4\n", + &ext->local_addr); if (IS_SUBTLV(ext, EXT_NEIGH_ADDR)) - sbuf_push(&buf, 4, "Remote Interface IP Address(es): %s\n", - inet_ntoa(ext->neigh_addr)); + sbuf_push(&buf, 4, "Remote Interface IP Address(es): %pI4\n", + &ext->neigh_addr); if (IS_SUBTLV(ext, EXT_LOCAL_ADDR6)) sbuf_push(&buf, 4, "Local Interface IPv6 Address(es): %s\n", inet_ntop(AF_INET6, &ext->local_addr6, ibuf, @@ -432,8 +429,8 @@ static void show_ext_sub(struct vty *vty, char *name, ext->remote_as); if (IS_SUBTLV(ext, EXT_RMT_IP)) sbuf_push(&buf, 4, - "Inter-AS TE Remote ASBR IP address: %s\n", - inet_ntoa(ext->remote_ip)); + "Inter-AS TE Remote ASBR IP address: %pI4\n", + &ext->remote_ip); if (IS_SUBTLV(ext, EXT_DELAY)) sbuf_push(&buf, 4, "%s Average Link Delay: %u (micro-sec)\n", diff --git a/isisd/isis_tlvs.c b/isisd/isis_tlvs.c index a1f9cc236f..a5c2fd5894 100644 --- a/isisd/isis_tlvs.c +++ b/isisd/isis_tlvs.c @@ -209,11 +209,11 @@ static void format_item_ext_subtlvs(struct isis_ext_subtlvs *exts, exts->remote_llri); } if (IS_SUBTLV(exts, EXT_LOCAL_ADDR)) - sbuf_push(buf, indent, "Local Interface IP Address(es): %s\n", - inet_ntoa(exts->local_addr)); + sbuf_push(buf, indent, "Local Interface IP Address(es): %pI4\n", + &exts->local_addr); if (IS_SUBTLV(exts, EXT_NEIGH_ADDR)) - sbuf_push(buf, indent, "Remote Interface IP Address(es): %s\n", - inet_ntoa(exts->neigh_addr)); + sbuf_push(buf, indent, "Remote Interface IP Address(es): %pI4\n", + &exts->neigh_addr); if (IS_SUBTLV(exts, EXT_LOCAL_ADDR6)) sbuf_push(buf, indent, "Local Interface IPv6 Address(es): %s\n", inet_ntop(AF_INET6, &exts->local_addr6, ibuf, @@ -247,8 +247,8 @@ static void format_item_ext_subtlvs(struct isis_ext_subtlvs *exts, exts->remote_as); if (IS_SUBTLV(exts, EXT_RMT_IP)) sbuf_push(buf, indent, - "Inter-AS TE Remote ASBR IP address: %s\n", - inet_ntoa(exts->remote_ip)); + "Inter-AS TE Remote ASBR IP address: %pI4\n", + &exts->remote_ip); /* Extended metrics */ if (IS_SUBTLV(exts, EXT_DELAY)) sbuf_push(buf, indent, @@ -2603,8 +2603,8 @@ static void format_tlv_router_cap(const struct isis_router_cap *router_cap, sbuf_push( buf, indent, " Segment Routing: I:%s V:%s, Global Block Base: %u Range: %u\n", - IS_SR_IPV4(router_cap->srgb) ? "1" : "0", - IS_SR_IPV6(router_cap->srgb) ? "1" : "0", + IS_SR_IPV4(&router_cap->srgb) ? "1" : "0", + IS_SR_IPV6(&router_cap->srgb) ? "1" : "0", router_cap->srgb.lower_bound, router_cap->srgb.range_size); diff --git a/isisd/isis_tlvs.h b/isisd/isis_tlvs.h index 1c0d97f2c3..54ded8121d 100644 --- a/isisd/isis_tlvs.h +++ b/isisd/isis_tlvs.h @@ -138,8 +138,8 @@ struct isis_threeway_adj { /* Segment Routing subTLV's as per RFC8667 */ #define ISIS_SUBTLV_SRGB_FLAG_I 0x80 #define ISIS_SUBTLV_SRGB_FLAG_V 0x40 -#define IS_SR_IPV4(srgb) (srgb.flags & ISIS_SUBTLV_SRGB_FLAG_I) -#define IS_SR_IPV6(srgb) (srgb.flags & ISIS_SUBTLV_SRGB_FLAG_V) +#define IS_SR_IPV4(srgb) ((srgb)->flags & ISIS_SUBTLV_SRGB_FLAG_I) +#define IS_SR_IPV6(srgb) ((srgb)->flags & ISIS_SUBTLV_SRGB_FLAG_V) #define SUBTLV_SR_BLOCK_SIZE 6 #define SUBTLV_RANGE_INDEX_SIZE 10 #define SUBTLV_RANGE_LABEL_SIZE 9 diff --git a/isisd/isis_tx_queue.c b/isisd/isis_tx_queue.c index 1424b55bdc..5c87e39157 100644 --- a/isisd/isis_tx_queue.c +++ b/isisd/isis_tx_queue.c @@ -93,8 +93,7 @@ static void tx_queue_element_free(void *element) { struct isis_tx_queue_entry *e = element; - if (e->retry) - thread_cancel(e->retry); + thread_cancel(&(e->retry)); XFREE(MTYPE_TX_QUEUE_ENTRY, e); } @@ -166,8 +165,7 @@ void _isis_tx_queue_add(struct isis_tx_queue *queue, e->type = type; - if (e->retry) - thread_cancel(e->retry); + thread_cancel(&(e->retry)); thread_add_event(master, tx_queue_send_event, e, 0, &e->retry); e->is_retry = false; @@ -190,8 +188,7 @@ void _isis_tx_queue_del(struct isis_tx_queue *queue, struct isis_lsp *lsp, func, file, line); } - if (e->retry) - thread_cancel(e->retry); + thread_cancel(&(e->retry)); hash_release(queue->hash, e); XFREE(MTYPE_TX_QUEUE_ENTRY, e); diff --git a/isisd/isis_zebra.c b/isisd/isis_zebra.c index aeb54fce28..805ede1e44 100644 --- a/isisd/isis_zebra.c +++ b/isisd/isis_zebra.c @@ -155,16 +155,14 @@ static int isis_zebra_link_params(ZAPI_CALLBACK_ARGS) } enum isis_zebra_nexthop_type { - ISIS_ROUTE_NEXTHOP_MAIN = 0, - ISIS_ROUTE_NEXTHOP_BACKUP, - ISIS_MPLS_NEXTHOP_MAIN, - ISIS_MPLS_NEXTHOP_BACKUP, + ISIS_NEXTHOP_MAIN = 0, + ISIS_NEXTHOP_BACKUP, }; static int isis_zebra_add_nexthops(struct isis *isis, struct list *nexthops, struct zapi_nexthop zapi_nexthops[], enum isis_zebra_nexthop_type type, - uint8_t backup_nhs) + bool mpls_lsp, uint8_t backup_nhs) { struct isis_nexthop *nexthop; struct listnode *node; @@ -210,23 +208,18 @@ static int isis_zebra_add_nexthops(struct isis *isis, struct list *nexthops, /* Add MPLS label(s). */ switch (type) { - case ISIS_ROUTE_NEXTHOP_MAIN: - case ISIS_ROUTE_NEXTHOP_BACKUP: - /* - * SR/TI-LFA labels are installed using separate - * messages. - */ - break; - case ISIS_MPLS_NEXTHOP_MAIN: - if (nexthop->sr.label != MPLS_INVALID_LABEL) { + case ISIS_NEXTHOP_MAIN: + if (nexthop->sr.present) { api_nh->label_num = 1; api_nh->labels[0] = nexthop->sr.label; - } else { - api_nh->label_num = 1; - api_nh->labels[0] = MPLS_LABEL_IMPLICIT_NULL; - } + } else if (mpls_lsp) + /* + * Do not use non-SR enabled nexthops to prevent + * broken LSPs from being formed. + */ + continue; break; - case ISIS_MPLS_NEXTHOP_BACKUP: + case ISIS_NEXTHOP_BACKUP: if (nexthop->label_stack) { api_nh->label_num = nexthop->label_stack->num_labels; @@ -234,7 +227,11 @@ static int isis_zebra_add_nexthops(struct isis *isis, struct list *nexthops, nexthop->label_stack->label, sizeof(mpls_label_t) * api_nh->label_num); - } else { + } else if (mpls_lsp) { + /* + * This is necessary because zebra requires + * the nexthops of MPLS LSPs to be labeled. + */ api_nh->label_num = 1; api_nh->labels[0] = MPLS_LABEL_IMPLICIT_NULL; } @@ -266,7 +263,7 @@ void isis_zebra_route_add_route(struct isis *isis, struct prefix *prefix, struct zapi_route api; int count = 0; - if (zclient->sock < 0) + if (zclient->sock < 0 || list_isempty(route_info->nexthops)) return; memset(&api, 0, sizeof(api)); @@ -286,7 +283,7 @@ void isis_zebra_route_add_route(struct isis *isis, struct prefix *prefix, if (route_info->backup) { count = isis_zebra_add_nexthops( isis, route_info->backup->nexthops, api.backup_nexthops, - ISIS_ROUTE_NEXTHOP_BACKUP, 0); + ISIS_NEXTHOP_BACKUP, false, 0); if (count > 0) { SET_FLAG(api.message, ZAPI_MESSAGE_BACKUP_NEXTHOPS); api.backup_nexthop_num = count; @@ -295,7 +292,7 @@ void isis_zebra_route_add_route(struct isis *isis, struct prefix *prefix, /* Add primary nexthops. */ count = isis_zebra_add_nexthops(isis, route_info->nexthops, - api.nexthops, ISIS_ROUTE_NEXTHOP_MAIN, + api.nexthops, ISIS_NEXTHOP_MAIN, false, count); if (!count) return; @@ -328,31 +325,39 @@ void isis_zebra_route_del_route(struct isis *isis, } /** - * Install Prefix-SID in the forwarding plane through Zebra. + * Install Prefix-SID label entry in the forwarding plane through Zebra. * - * @param srp Segment Routing Prefix-SID + * @param area IS-IS area + * @param prefix Route prefix + * @param rinfo Route information + * @param psid Prefix-SID information */ -static void isis_zebra_prefix_install_prefix_sid(const struct sr_prefix *srp) +void isis_zebra_prefix_sid_install(struct isis_area *area, + struct prefix *prefix, + struct isis_route_info *rinfo, + struct isis_sr_psid_info *psid) { - struct isis *isis = srp->srn->area->isis; struct zapi_labels zl; - struct zapi_nexthop *znh; - struct interface *ifp; - struct isis_route_info *rinfo; int count = 0; + sr_debug("ISIS-Sr (%s): update label %u for prefix %pFX", + area->area_tag, psid->label, prefix); + /* Prepare message. */ memset(&zl, 0, sizeof(zl)); zl.type = ZEBRA_LSP_ISIS_SR; - zl.local_label = srp->input_label; + zl.local_label = psid->label; + + /* Local routes don't have any nexthop and require special handling. */ + if (list_isempty(rinfo->nexthops)) { + struct zapi_nexthop *znh; + struct interface *ifp; - switch (srp->type) { - case ISIS_SR_PREFIX_LOCAL: ifp = if_lookup_by_name("lo", VRF_DEFAULT); if (!ifp) { zlog_warn( "%s: couldn't install Prefix-SID %pFX: loopback interface not found", - __func__, &srp->prefix); + __func__, prefix); return; } @@ -361,21 +366,12 @@ static void isis_zebra_prefix_install_prefix_sid(const struct sr_prefix *srp) znh->ifindex = ifp->ifindex; znh->label_num = 1; znh->labels[0] = MPLS_LABEL_IMPLICIT_NULL; - break; - case ISIS_SR_PREFIX_REMOTE: - /* Update route in the RIB too. */ - SET_FLAG(zl.message, ZAPI_LABELS_FTN); - zl.route.prefix = srp->prefix; - zl.route.type = ZEBRA_ROUTE_ISIS; - zl.route.instance = 0; - - rinfo = srp->u.remote.rinfo; - + } else { /* Add backup nexthops first. */ if (rinfo->backup) { count = isis_zebra_add_nexthops( - isis, rinfo->backup->nexthops, - zl.backup_nexthops, ISIS_MPLS_NEXTHOP_BACKUP, + area->isis, rinfo->backup->nexthops, + zl.backup_nexthops, ISIS_NEXTHOP_BACKUP, true, 0); if (count > 0) { SET_FLAG(zl.message, ZAPI_LABELS_HAS_BACKUPS); @@ -384,13 +380,12 @@ static void isis_zebra_prefix_install_prefix_sid(const struct sr_prefix *srp) } /* Add primary nexthops. */ - count = isis_zebra_add_nexthops(isis, rinfo->nexthops, - zl.nexthops, - ISIS_MPLS_NEXTHOP_MAIN, count); + count = isis_zebra_add_nexthops(area->isis, rinfo->nexthops, + zl.nexthops, ISIS_NEXTHOP_MAIN, + true, count); if (!count) return; zl.nexthop_num = count; - break; } /* Send message to zebra. */ @@ -398,58 +393,33 @@ static void isis_zebra_prefix_install_prefix_sid(const struct sr_prefix *srp) } /** - * Uninstall Prefix-SID from the forwarding plane through Zebra. + * Uninstall Prefix-SID label entry from the forwarding plane through Zebra. * - * @param srp Segment Routing Prefix-SID + * @param area IS-IS area + * @param prefix Route prefix + * @param rinfo Route information + * @param psid Prefix-SID information */ -static void isis_zebra_uninstall_prefix_sid(const struct sr_prefix *srp) +void isis_zebra_prefix_sid_uninstall(struct isis_area *area, + struct prefix *prefix, + struct isis_route_info *rinfo, + struct isis_sr_psid_info *psid) { struct zapi_labels zl; + sr_debug("ISIS-Sr (%s): delete label %u for prefix %pFX", + area->area_tag, psid->label, prefix); + /* Prepare message. */ memset(&zl, 0, sizeof(zl)); zl.type = ZEBRA_LSP_ISIS_SR; - zl.local_label = srp->input_label; - - if (srp->type == ISIS_SR_PREFIX_REMOTE) { - /* Update route in the RIB too. */ - SET_FLAG(zl.message, ZAPI_LABELS_FTN); - zl.route.prefix = srp->prefix; - zl.route.type = ZEBRA_ROUTE_ISIS; - zl.route.instance = 0; - } + zl.local_label = psid->label; /* Send message to zebra. */ (void)zebra_send_mpls_labels(zclient, ZEBRA_MPLS_LABELS_DELETE, &zl); } /** - * Send Prefix-SID to ZEBRA for installation or deletion. - * - * @param cmd ZEBRA_MPLS_LABELS_REPLACE or ZEBRA_ROUTE_DELETE - * @param srp Segment Routing Prefix-SID - */ -void isis_zebra_send_prefix_sid(int cmd, const struct sr_prefix *srp) -{ - - if (cmd != ZEBRA_MPLS_LABELS_REPLACE - && cmd != ZEBRA_MPLS_LABELS_DELETE) { - flog_warn(EC_LIB_DEVELOPMENT, "%s: wrong ZEBRA command", - __func__); - return; - } - - sr_debug(" |- %s label %u for prefix %pFX", - cmd == ZEBRA_MPLS_LABELS_REPLACE ? "Update" : "Delete", - srp->input_label, &srp->prefix); - - if (cmd == ZEBRA_MPLS_LABELS_REPLACE) - isis_zebra_prefix_install_prefix_sid(srp); - else - isis_zebra_uninstall_prefix_sid(srp); -} - -/** * Send (LAN)-Adjacency-SID to ZEBRA for installation or deletion. * * @param cmd ZEBRA_MPLS_LABELS_ADD or ZEBRA_ROUTE_DELETE @@ -490,7 +460,7 @@ void isis_zebra_send_adjacency_sid(int cmd, const struct sr_adjacency *sra) count = isis_zebra_add_nexthops(isis, sra->backup_nexthops, zl.backup_nexthops, - ISIS_MPLS_NEXTHOP_BACKUP, 0); + ISIS_NEXTHOP_BACKUP, true, 0); if (count > 0) { SET_FLAG(zl.message, ZAPI_LABELS_HAS_BACKUPS); zl.backup_nexthop_num = count; diff --git a/isisd/isis_zebra.h b/isisd/isis_zebra.h index 768919ff46..c5c52a6bc6 100644 --- a/isisd/isis_zebra.h +++ b/isisd/isis_zebra.h @@ -37,7 +37,6 @@ void isis_zebra_init(struct thread_master *master, int instance); void isis_zebra_stop(void); struct isis_route_info; -struct sr_prefix; struct sr_adjacency; void isis_zebra_route_add_route(struct isis *isis, @@ -48,7 +47,14 @@ void isis_zebra_route_del_route(struct isis *isis, struct prefix *prefix, struct prefix_ipv6 *src_p, struct isis_route_info *route_info); -void isis_zebra_send_prefix_sid(int cmd, const struct sr_prefix *srp); +void isis_zebra_prefix_sid_install(struct isis_area *area, + struct prefix *prefix, + struct isis_route_info *rinfo, + struct isis_sr_psid_info *psid); +void isis_zebra_prefix_sid_uninstall(struct isis_area *area, + struct prefix *prefix, + struct isis_route_info *rinfo, + struct isis_sr_psid_info *psid); void isis_zebra_send_adjacency_sid(int cmd, const struct sr_adjacency *sra); int isis_distribute_list_update(int routetype); void isis_zebra_redistribute_set(afi_t afi, int type); diff --git a/isisd/isisd.c b/isisd/isisd.c index 57d3e9c7c0..057ede0e38 100644 --- a/isisd/isisd.c +++ b/isisd/isisd.c @@ -442,8 +442,8 @@ void isis_area_destroy(struct isis_area *area) spftree_area_del(area); - THREAD_TIMER_OFF(area->spf_timer[0]); - THREAD_TIMER_OFF(area->spf_timer[1]); + thread_cancel(&area->spf_timer[0]); + thread_cancel(&area->spf_timer[1]); spf_backoff_free(area->spf_delay_ietf[0]); spf_backoff_free(area->spf_delay_ietf[1]); @@ -457,9 +457,9 @@ void isis_area_destroy(struct isis_area *area) } area->area_addrs = NULL; - THREAD_TIMER_OFF(area->t_tick); - THREAD_TIMER_OFF(area->t_lsp_refresh[0]); - THREAD_TIMER_OFF(area->t_lsp_refresh[1]); + thread_cancel(&area->t_tick); + thread_cancel(&area->t_lsp_refresh[0]); + thread_cancel(&area->t_lsp_refresh[1]); thread_cancel_event(master, area); @@ -583,6 +583,8 @@ void isis_finish(struct isis *isis) isis_vrf_unlink(isis, vrf); } + list_delete(&isis->area_list); + list_delete(&isis->init_circ_list); XFREE(MTYPE_ISIS, isis); } @@ -2373,12 +2375,12 @@ static void area_resign_level(struct isis_area *area, int level) } } - THREAD_TIMER_OFF(area->spf_timer[level - 1]); + thread_cancel(&area->spf_timer[level - 1]); sched_debug( "ISIS (%s): Resigned from L%d - canceling LSP regeneration timer.", area->area_tag, level); - THREAD_TIMER_OFF(area->t_lsp_refresh[level - 1]); + thread_cancel(&area->t_lsp_refresh[level - 1]); area->lsp_regenerate_pending[level - 1] = 0; } diff --git a/ldpd/accept.c b/ldpd/accept.c index 323558d7fd..9bba0f5ddd 100644 --- a/ldpd/accept.c +++ b/ldpd/accept.c @@ -74,7 +74,7 @@ accept_del(int fd) LIST_FOREACH(av, &accept_queue.queue, entry) if (av->fd == fd) { log_debug("%s: %d removed from queue", __func__, fd); - THREAD_READ_OFF(av->ev); + thread_cancel(&av->ev); LIST_REMOVE(av, entry); free(av); return; @@ -95,7 +95,7 @@ accept_unpause(void) { if (accept_queue.evt != NULL) { log_debug(__func__); - THREAD_TIMER_OFF(accept_queue.evt); + thread_cancel(&accept_queue.evt); accept_arm(); } } @@ -115,7 +115,7 @@ accept_unarm(void) { struct accept_ev *av; LIST_FOREACH(av, &accept_queue.queue, entry) - THREAD_READ_OFF(av->ev); + thread_cancel(&av->ev); } static int diff --git a/ldpd/address.c b/ldpd/address.c index 74a3f5a309..c3e27357b5 100644 --- a/ldpd/address.c +++ b/ldpd/address.c @@ -410,8 +410,8 @@ static void log_msg_address(int out, uint16_t msg_type, struct nbr *nbr, int af, union ldpd_addr *addr) { - debug_msg(out, "%s: lsr-id %s, address %s", msg_name(msg_type), - inet_ntoa(nbr->id), log_addr(af, addr)); + debug_msg(out, "%s: lsr-id %pI4, address %s", msg_name(msg_type), + &nbr->id, log_addr(af, addr)); } static void @@ -419,7 +419,7 @@ log_msg_mac_withdrawal(int out, struct nbr *nbr, uint8_t *mac) { char buf[ETHER_ADDR_STRLEN]; - debug_msg(out, "mac withdrawal: lsr-id %s, mac %s", inet_ntoa(nbr->id), + debug_msg(out, "mac withdrawal: lsr-id %pI4, mac %s", &nbr->id, (mac) ? prefix_mac2str((struct ethaddr *)mac, buf, sizeof(buf)) : "wildcard"); } diff --git a/ldpd/adjacency.c b/ldpd/adjacency.c index 4e09a6c4c9..795a41491c 100644 --- a/ldpd/adjacency.c +++ b/ldpd/adjacency.c @@ -84,7 +84,7 @@ adj_new(struct in_addr lsr_id, struct hello_source *source, { struct adj *adj; - log_debug("%s: lsr-id %s, %s", __func__, inet_ntoa(lsr_id), + log_debug("%s: lsr-id %pI4, %s", __func__, &lsr_id, log_hello_src(source)); if ((adj = calloc(1, sizeof(*adj))) == NULL) @@ -114,7 +114,7 @@ adj_del(struct adj *adj, uint32_t notif_status) { struct nbr *nbr = adj->nbr; - log_debug("%s: lsr-id %s, %s (%s)", __func__, inet_ntoa(adj->lsr_id), + log_debug("%s: lsr-id %pI4, %s (%s)", __func__, &adj->lsr_id, log_hello_src(&adj->source), af_name(adj_get_af(adj))); adj_stop_itimer(adj); @@ -179,7 +179,7 @@ adj_itimer(struct thread *thread) adj->inactivity_timer = NULL; - log_debug("%s: lsr-id %s", __func__, inet_ntoa(adj->lsr_id)); + log_debug("%s: lsr-id %pI4", __func__, &adj->lsr_id); if (adj->source.type == HELLO_TARGETED) { if (!(adj->source.target->flags & F_TNBR_CONFIGURED) && @@ -198,7 +198,7 @@ adj_itimer(struct thread *thread) void adj_start_itimer(struct adj *adj) { - THREAD_TIMER_OFF(adj->inactivity_timer); + thread_cancel(&adj->inactivity_timer); adj->inactivity_timer = NULL; thread_add_timer(master, adj_itimer, adj, adj->holdtime, &adj->inactivity_timer); @@ -207,7 +207,7 @@ adj_start_itimer(struct adj *adj) void adj_stop_itimer(struct adj *adj) { - THREAD_TIMER_OFF(adj->inactivity_timer); + thread_cancel(&adj->inactivity_timer); } /* targeted neighbors */ @@ -359,7 +359,7 @@ tnbr_hello_timer(struct thread *thread) static void tnbr_start_hello_timer(struct tnbr *tnbr) { - THREAD_TIMER_OFF(tnbr->hello_timer); + thread_cancel(&tnbr->hello_timer); tnbr->hello_timer = NULL; thread_add_timer(master, tnbr_hello_timer, tnbr, tnbr_get_hello_interval(tnbr), &tnbr->hello_timer); @@ -368,7 +368,7 @@ tnbr_start_hello_timer(struct tnbr *tnbr) static void tnbr_stop_hello_timer(struct tnbr *tnbr) { - THREAD_TIMER_OFF(tnbr->hello_timer); + thread_cancel(&tnbr->hello_timer); } struct ctl_adj * diff --git a/ldpd/control.c b/ldpd/control.c index 6554f0a6f1..3b77765952 100644 --- a/ldpd/control.c +++ b/ldpd/control.c @@ -183,8 +183,8 @@ control_close(int fd) msgbuf_clear(&c->iev.ibuf.w); TAILQ_REMOVE(&ctl_conns, c, entry); - THREAD_READ_OFF(c->iev.ev_read); - THREAD_WRITE_OFF(c->iev.ev_write); + thread_cancel(&c->iev.ev_read); + thread_cancel(&c->iev.ev_write); close(c->iev.ibuf.fd); accept_unpause(); free(c); diff --git a/ldpd/hello.c b/ldpd/hello.c index caf63c13d7..327cb32434 100644 --- a/ldpd/hello.c +++ b/ldpd/hello.c @@ -179,24 +179,24 @@ recv_hello(struct in_addr lsr_id, struct ldp_msg *msg, int af, r = tlv_decode_hello_prms(buf, len, &holdtime, &flags); if (r == -1) { - log_debug("%s: lsr-id %s: failed to decode params", __func__, - inet_ntoa(lsr_id)); + log_debug("%s: lsr-id %pI4: failed to decode params", __func__, + &lsr_id); return; } /* safety checks */ if (holdtime != 0 && holdtime < MIN_HOLDTIME) { - log_debug("%s: lsr-id %s: invalid hello holdtime (%u)", - __func__, inet_ntoa(lsr_id), holdtime); + log_debug("%s: lsr-id %pI4: invalid hello holdtime (%u)", + __func__, &lsr_id, holdtime); return; } if (multicast && (flags & F_HELLO_TARGETED)) { - log_debug("%s: lsr-id %s: multicast targeted hello", __func__, - inet_ntoa(lsr_id)); + log_debug("%s: lsr-id %pI4: multicast targeted hello", __func__, + &lsr_id); return; } if (!multicast && !((flags & F_HELLO_TARGETED))) { - log_debug("%s: lsr-id %s: unicast link hello", __func__, - inet_ntoa(lsr_id)); + log_debug("%s: lsr-id %pI4: unicast link hello", __func__, + &lsr_id); return; } buf += r; @@ -205,13 +205,13 @@ recv_hello(struct in_addr lsr_id, struct ldp_msg *msg, int af, r = tlv_decode_opt_hello_prms(buf, len, &tlvs_rcvd, af, &trans_addr, &conf_seqnum, &trans_pref); if (r == -1) { - log_debug("%s: lsr-id %s: failed to decode optional params", - __func__, inet_ntoa(lsr_id)); + log_debug("%s: lsr-id %pI4: failed to decode optional params", + __func__, &lsr_id); return; } if (r != len) { - log_debug("%s: lsr-id %s: unexpected data in message", - __func__, inet_ntoa(lsr_id)); + log_debug("%s: lsr-id %pI4: unexpected data in message", + __func__, &lsr_id); return; } ds_tlv = (tlvs_rcvd & F_HELLO_TLV_RCVD_DS) ? 1 : 0; @@ -220,8 +220,8 @@ recv_hello(struct in_addr lsr_id, struct ldp_msg *msg, int af, if (!(tlvs_rcvd & F_HELLO_TLV_RCVD_ADDR)) trans_addr = *src; if (bad_addr(af, &trans_addr)) { - log_debug("%s: lsr-id %s: invalid transport address %s", - __func__, inet_ntoa(lsr_id), log_addr(af, &trans_addr)); + log_debug("%s: lsr-id %pI4: invalid transport address %s", + __func__, &lsr_id, log_addr(af, &trans_addr)); return; } if (af == AF_INET6 && IN6_IS_SCOPE_EMBED(&trans_addr.v6)) { @@ -234,7 +234,7 @@ recv_hello(struct in_addr lsr_id, struct ldp_msg *msg, int af, * check)". */ if (flags & F_HELLO_TARGETED) { - log_debug("%s: lsr-id %s: invalid targeted hello transport address %s", __func__, inet_ntoa(lsr_id), + log_debug("%s: lsr-id %pI4: invalid targeted hello transport address %s", __func__, &lsr_id, log_addr(af, &trans_addr)); return; } @@ -249,8 +249,8 @@ recv_hello(struct in_addr lsr_id, struct ldp_msg *msg, int af, * targeted LDP Hello packet's source or destination addresses". */ if (af == AF_INET6 && IN6_IS_SCOPE_EMBED(&src->v6)) { - log_debug("%s: lsr-id %s: targeted hello with link-local source address", __func__, - inet_ntoa(lsr_id)); + log_debug("%s: lsr-id %pI4: targeted hello with link-local source address", __func__, + &lsr_id); return; } @@ -290,8 +290,8 @@ recv_hello(struct in_addr lsr_id, struct ldp_msg *msg, int af, source.link.src_addr = *src; } - debug_hello_recv("%s lsr-id %s transport-address %s holdtime %u%s", - log_hello_src(&source), inet_ntoa(lsr_id), log_addr(af, &trans_addr), + debug_hello_recv("%s lsr-id %pI4 transport-address %s holdtime %u%s", + log_hello_src(&source), &lsr_id, log_addr(af, &trans_addr), holdtime, (ds_tlv) ? " (dual stack TLV present)" : ""); adj = adj_find(lsr_id, &source); @@ -316,7 +316,7 @@ recv_hello(struct in_addr lsr_id, struct ldp_msg *msg, int af, * send a fatal Notification message with status code of * 'Transport Connection Mismatch' and reset the session". */ - log_debug("%s: lsr-id %s: remote transport preference does not match the local preference", __func__, inet_ntoa(lsr_id)); + log_debug("%s: lsr-id %pI4: remote transport preference does not match the local preference", __func__, &lsr_id); if (nbr) session_shutdown(nbr, S_TRANS_MISMTCH, msg->id, msg->type); @@ -356,7 +356,7 @@ recv_hello(struct in_addr lsr_id, struct ldp_msg *msg, int af, if (nbr && nbr->af == af && (ldp_addrcmp(af, &nbr->raddr, &trans_addr) || nbr->raddr_scope != scope_id)) { - log_warnx("%s: lsr-id %s: hello packet advertising a different transport address", __func__, inet_ntoa(lsr_id)); + log_warnx("%s: lsr-id %pI4: hello packet advertising a different transport address", __func__, &lsr_id); if (adj) adj_del(adj, S_SHUTDOWN); return; @@ -364,8 +364,8 @@ recv_hello(struct in_addr lsr_id, struct ldp_msg *msg, int af, if (nbr == NULL) { nbrt = nbr_find_addr(af, &trans_addr); if (nbrt) { - log_debug("%s: transport address %s is already being used by lsr-id %s", __func__, log_addr(af, - &trans_addr), inet_ntoa(nbrt->id)); + log_debug("%s: transport address %s is already being used by lsr-id %pI4", __func__, log_addr(af, + &trans_addr), &nbrt->id); if (adj) adj_del(adj, S_SHUTDOWN); return; diff --git a/ldpd/init.c b/ldpd/init.c index 30b78315f9..d394fb08ea 100644 --- a/ldpd/init.c +++ b/ldpd/init.c @@ -35,7 +35,7 @@ send_init(struct nbr *nbr) uint16_t size; int err = 0; - debug_msg_send("initialization: lsr-id %s", inet_ntoa(nbr->id)); + debug_msg_send("initialization: lsr-id %pI4", &nbr->id); size = LDP_HDR_SIZE + LDP_MSG_SIZE + SESS_PRMS_SIZE + CAP_TLV_DYNAMIC_SIZE + CAP_TLV_TWCARD_SIZE + CAP_TLV_UNOTIF_SIZE; @@ -65,7 +65,7 @@ recv_init(struct nbr *nbr, char *buf, uint16_t len) uint16_t max_pdu_len; int caps_rcvd = 0; - debug_msg_recv("initialization: lsr-id %s", inet_ntoa(nbr->id)); + debug_msg_recv("initialization: lsr-id %pI4", &nbr->id); memcpy(&msg, buf, sizeof(msg)); buf += LDP_MSG_SIZE; @@ -146,8 +146,8 @@ recv_init(struct nbr *nbr, char *buf, uint16_t len) nbr->flags |= F_NBR_CAP_DYNAMIC; - log_debug("%s: lsr-id %s announced the Dynamic Capability Announcement capability", __func__, - inet_ntoa(nbr->id)); + log_debug("%s: lsr-id %pI4 announced the Dynamic Capability Announcement capability", __func__, + &nbr->id); break; case TLV_TYPE_TWCARD_CAP: if (tlv_len != CAP_TLV_TWCARD_LEN) { @@ -165,7 +165,7 @@ recv_init(struct nbr *nbr, char *buf, uint16_t len) nbr->flags |= F_NBR_CAP_TWCARD; - log_debug("%s: lsr-id %s announced the Typed Wildcard FEC capability", __func__, inet_ntoa(nbr->id)); + log_debug("%s: lsr-id %pI4 announced the Typed Wildcard FEC capability", __func__, &nbr->id); break; case TLV_TYPE_UNOTIF_CAP: if (tlv_len != CAP_TLV_UNOTIF_LEN) { @@ -183,8 +183,8 @@ recv_init(struct nbr *nbr, char *buf, uint16_t len) nbr->flags |= F_NBR_CAP_UNOTIF; - log_debug("%s: lsr-id %s announced the Unrecognized Notification capability", __func__, - inet_ntoa(nbr->id)); + log_debug("%s: lsr-id %pI4 announced the Unrecognized Notification capability", __func__, + &nbr->id); break; default: if (!(ntohs(tlv.type) & UNKNOWN_FLAG)) @@ -222,7 +222,7 @@ send_capability(struct nbr *nbr, uint16_t capability, int enable) uint16_t size; int err = 0; - log_debug("%s: lsr-id %s", __func__, inet_ntoa(nbr->id)); + log_debug("%s: lsr-id %pI4", __func__, &nbr->id); size = LDP_HDR_SIZE + LDP_MSG_SIZE + CAP_TLV_DYNAMIC_SIZE; if ((buf = ibuf_open(size)) == NULL) @@ -268,7 +268,7 @@ recv_capability(struct nbr *nbr, char *buf, uint16_t len) int enable = 0; int caps_rcvd = 0; - log_debug("%s: lsr-id %s", __func__, inet_ntoa(nbr->id)); + log_debug("%s: lsr-id %pI4", __func__, &nbr->id); memcpy(&msg, buf, sizeof(msg)); buf += LDP_MSG_SIZE; @@ -318,7 +318,7 @@ recv_capability(struct nbr *nbr, char *buf, uint16_t len) else nbr->flags &= ~F_NBR_CAP_TWCARD; - log_debug("%s: lsr-id %s %s the Typed Wildcard FEC capability", __func__, inet_ntoa(nbr->id), + log_debug("%s: lsr-id %pI4 %s the Typed Wildcard FEC capability", __func__, &nbr->id, (enable) ? "announced" : "withdrew"); break; case TLV_TYPE_UNOTIF_CAP: @@ -342,8 +342,8 @@ recv_capability(struct nbr *nbr, char *buf, uint16_t len) else nbr->flags &= ~F_NBR_CAP_UNOTIF; - log_debug("%s: lsr-id %s %s the Unrecognized Notification capability", __func__, - inet_ntoa(nbr->id), (enable) ? "announced" : + log_debug("%s: lsr-id %pI4 %s the Unrecognized Notification capability", __func__, + &nbr->id, (enable) ? "announced" : "withdrew"); break; case TLV_TYPE_DYNAMIC_CAP: diff --git a/ldpd/interface.c b/ldpd/interface.c index bc8f26bc58..3e9f2fa991 100644 --- a/ldpd/interface.c +++ b/ldpd/interface.c @@ -470,7 +470,7 @@ if_hello_timer(struct thread *thread) static void if_start_hello_timer(struct iface_af *ia) { - THREAD_TIMER_OFF(ia->hello_timer); + thread_cancel(&ia->hello_timer); ia->hello_timer = NULL; thread_add_timer(master, if_hello_timer, ia, if_get_hello_interval(ia), &ia->hello_timer); @@ -479,7 +479,7 @@ if_start_hello_timer(struct iface_af *ia) static void if_stop_hello_timer(struct iface_af *ia) { - THREAD_TIMER_OFF(ia->hello_timer); + thread_cancel(&ia->hello_timer); } struct ctl_iface * @@ -578,15 +578,15 @@ if_join_ipv4_group(struct iface *iface, struct in_addr *addr) { struct in_addr if_addr; - log_debug("%s: interface %s addr %s", __func__, iface->name, - inet_ntoa(*addr)); + log_debug("%s: interface %s addr %pI4", __func__, iface->name, + addr); if_addr.s_addr = if_get_ipv4_addr(iface); if (setsockopt_ipv4_multicast(global.ipv4.ldp_disc_socket, IP_ADD_MEMBERSHIP, if_addr, addr->s_addr, iface->ifindex) < 0) { - log_warn("%s: error IP_ADD_MEMBERSHIP, interface %s address %s", - __func__, iface->name, inet_ntoa(*addr)); + log_warn("%s: error IP_ADD_MEMBERSHIP, interface %s address %pI4", + __func__, iface->name, addr); return (-1); } return (0); @@ -597,14 +597,14 @@ if_leave_ipv4_group(struct iface *iface, struct in_addr *addr) { struct in_addr if_addr; - log_debug("%s: interface %s addr %s", __func__, iface->name, - inet_ntoa(*addr)); + log_debug("%s: interface %s addr %pI4", __func__, iface->name, + addr); if_addr.s_addr = if_get_ipv4_addr(iface); if (setsockopt_ipv4_multicast(global.ipv4.ldp_disc_socket, IP_DROP_MEMBERSHIP, if_addr, addr->s_addr, iface->ifindex) < 0) { - log_warn("%s: error IP_DROP_MEMBERSHIP, interface %s address %s", __func__, iface->name, inet_ntoa(*addr)); + log_warn("%s: error IP_DROP_MEMBERSHIP, interface %s address %pI4", __func__, iface->name, addr); return (-1); } @@ -753,8 +753,7 @@ static void start_wait_for_ldp_sync_timer(struct iface *iface) if (iface->ldp_sync.wait_for_sync_timer) return; - THREAD_TIMER_OFF(iface->ldp_sync.wait_for_sync_timer); - iface->ldp_sync.wait_for_sync_timer = NULL; + THREAD_OFF(iface->ldp_sync.wait_for_sync_timer); thread_add_timer(master, iface_wait_for_ldp_sync_timer, iface, if_get_wait_for_sync_interval(), &iface->ldp_sync.wait_for_sync_timer); @@ -762,8 +761,7 @@ static void start_wait_for_ldp_sync_timer(struct iface *iface) static void stop_wait_for_ldp_sync_timer(struct iface *iface) { - THREAD_TIMER_OFF(iface->ldp_sync.wait_for_sync_timer); - iface->ldp_sync.wait_for_sync_timer = NULL; + THREAD_OFF(iface->ldp_sync.wait_for_sync_timer); } static int @@ -828,14 +826,14 @@ ldp_sync_fsm_adj_event(struct adj *adj, enum ldp_sync_event event) } debug_evt_ldp_sync("%s: event %s, " - "adj iface %s (%d) lsr-id %s " - "source address %s transport address %s", - __func__, ldp_sync_event_names[event], - adj->source.link.ia->iface->name, - adj->source.link.ia->iface->ifindex, - inet_ntoa(adj->lsr_id), - log_addr(adj_get_af(adj), &adj->source.link.src_addr), - log_addr(adj_get_af(adj), &adj->trans_addr)); + "adj iface %s (%d) lsr-id %pI4 " + "source address %s transport address %s", + __func__, ldp_sync_event_names[event], + adj->source.link.ia->iface->name, + adj->source.link.ia->iface->ifindex, + &adj->lsr_id, + log_addr(adj_get_af(adj), &adj->source.link.src_addr), + log_addr(adj_get_af(adj), &adj->trans_addr)); return ldp_sync_fsm(iface, event); } @@ -861,9 +859,9 @@ ldp_sync_fsm_nbr_event(struct nbr *nbr, enum ldp_sync_event event) */ continue; - debug_evt_ldp_sync("%s: event %s, iface %s, lsr-id %s", + debug_evt_ldp_sync("%s: event %s, iface %s, lsr-id %pI4", __func__, ldp_sync_event_names[event], - iface->name, inet_ntoa(nbr->id)); + iface->name, &nbr->id); ldp_sync_fsm(iface, event); } diff --git a/ldpd/keepalive.c b/ldpd/keepalive.c index ba5f223316..b03127109f 100644 --- a/ldpd/keepalive.c +++ b/ldpd/keepalive.c @@ -37,7 +37,7 @@ send_keepalive(struct nbr *nbr) size -= LDP_HDR_SIZE; gen_msg_hdr(buf, MSG_TYPE_KEEPALIVE, size); - debug_kalive_send("keepalive: lsr-id %s", inet_ntoa(nbr->id)); + debug_kalive_send("keepalive: lsr-id %pI4", &nbr->id); evbuf_enqueue(&nbr->tcp->wbuf, buf); nbr->stats.kalive_sent++; @@ -54,7 +54,7 @@ recv_keepalive(struct nbr *nbr, char *buf, uint16_t len) return (-1); } - debug_kalive_recv("keepalive: lsr-id %s", inet_ntoa(nbr->id)); + debug_kalive_recv("keepalive: lsr-id %pI4", &nbr->id); if (nbr->state != NBR_STA_OPER) nbr_fsm(nbr, NBR_EVT_KEEPALIVE_RCVD); diff --git a/ldpd/labelmapping.c b/ldpd/labelmapping.c index a656626356..cee9d527e8 100644 --- a/ldpd/labelmapping.c +++ b/ldpd/labelmapping.c @@ -910,6 +910,6 @@ tlv_decode_fec_elm(struct nbr *nbr, struct ldp_msg *msg, char *buf, static void log_msg_mapping(int out, uint16_t msg_type, struct nbr *nbr, struct map *map) { - debug_msg(out, "%s: lsr-id %s, fec %s, label %s", msg_name(msg_type), - inet_ntoa(nbr->id), log_map(map), log_label(map->label)); + debug_msg(out, "%s: lsr-id %pI4, fec %s, label %s", msg_name(msg_type), + &nbr->id, log_map(map), log_label(map->label)); } diff --git a/ldpd/lde.c b/ldpd/lde.c index df64f908ea..67b695150e 100644 --- a/ldpd/lde.c +++ b/ldpd/lde.c @@ -415,8 +415,8 @@ lde_dispatch_imsg(struct thread *thread) imsg_event_add(iev); else { /* this pipe is dead, so remove the event handlers and exit */ - THREAD_READ_OFF(iev->ev_read); - THREAD_WRITE_OFF(iev->ev_write); + thread_cancel(&iev->ev_read); + thread_cancel(&iev->ev_write); lde_shutdown(); } @@ -661,8 +661,8 @@ lde_dispatch_parent(struct thread *thread) imsg_event_add(iev); else { /* this pipe is dead, so remove the event handlers and exit */ - THREAD_READ_OFF(iev->ev_read); - THREAD_WRITE_OFF(iev->ev_write); + thread_cancel(&iev->ev_read); + thread_cancel(&iev->ev_write); lde_shutdown(); } diff --git a/ldpd/lde_lib.c b/ldpd/lde_lib.c index bed276c7b1..9db931677d 100644 --- a/ldpd/lde_lib.c +++ b/ldpd/lde_lib.c @@ -1060,7 +1060,7 @@ lde_gc_timer(struct thread *thread) void lde_gc_start_timer(void) { - THREAD_TIMER_OFF(gc_timer); + thread_cancel(&gc_timer); gc_timer = NULL; thread_add_timer(master, lde_gc_timer, NULL, LDE_GC_INTERVAL, &gc_timer); @@ -1069,5 +1069,5 @@ lde_gc_start_timer(void) void lde_gc_stop_timer(void) { - THREAD_TIMER_OFF(gc_timer); + thread_cancel(&gc_timer); } diff --git a/ldpd/ldp_vty_conf.c b/ldpd/ldp_vty_conf.c index c217cfc78a..d21e3c0409 100644 --- a/ldpd/ldp_vty_conf.c +++ b/ldpd/ldp_vty_conf.c @@ -255,7 +255,7 @@ ldp_config_write(struct vty *vty) vty_out (vty, "mpls ldp\n"); if (ldpd_conf->rtr_id.s_addr != INADDR_ANY) - vty_out(vty, " router-id %s\n", inet_ntoa(ldpd_conf->rtr_id)); + vty_out(vty, " router-id %pI4\n", &ldpd_conf->rtr_id); if (ldpd_conf->lhello_holdtime != LINK_DFLT_HOLDTIME && ldpd_conf->lhello_holdtime != 0) @@ -292,20 +292,20 @@ ldp_config_write(struct vty *vty) RB_FOREACH(nbrp, nbrp_head, &ldpd_conf->nbrp_tree) { if (nbrp->flags & F_NBRP_KEEPALIVE) - vty_out (vty, " neighbor %s session holdtime %u\n", - inet_ntoa(nbrp->lsr_id),nbrp->keepalive); + vty_out (vty, " neighbor %pI4 session holdtime %u\n", + &nbrp->lsr_id,nbrp->keepalive); if (nbrp->flags & F_NBRP_GTSM) { if (nbrp->gtsm_enabled) - vty_out (vty, " neighbor %s ttl-security hops %u\n", inet_ntoa(nbrp->lsr_id), + vty_out (vty, " neighbor %pI4 ttl-security hops %u\n", &nbrp->lsr_id, nbrp->gtsm_hops); else - vty_out (vty, " neighbor %s ttl-security disable\n",inet_ntoa(nbrp->lsr_id)); + vty_out (vty, " neighbor %pI4 ttl-security disable\n",&nbrp->lsr_id); } if (nbrp->auth.method == AUTH_MD5SIG) - vty_out (vty, " neighbor %s password %s\n", - inet_ntoa(nbrp->lsr_id),nbrp->auth.md5key); + vty_out (vty, " neighbor %pI4 password %s\n", + &nbrp->lsr_id,nbrp->auth.md5key); } ldp_af_config_write(vty, AF_INET, ldpd_conf, &ldpd_conf->ipv4); @@ -326,7 +326,7 @@ ldp_l2vpn_pw_config_write(struct vty *vty, struct l2vpn_pw *pw) vty_out (vty, " member pseudowire %s\n", pw->ifname); if (pw->lsr_id.s_addr != INADDR_ANY) - vty_out (vty, " neighbor lsr-id %s\n",inet_ntoa(pw->lsr_id)); + vty_out (vty, " neighbor lsr-id %pI4\n",&pw->lsr_id); else missing_lsrid = 1; diff --git a/ldpd/ldp_vty_exec.c b/ldpd/ldp_vty_exec.c index 609598a768..09b820e3f6 100644 --- a/ldpd/ldp_vty_exec.c +++ b/ldpd/ldp_vty_exec.c @@ -19,6 +19,7 @@ #include <zebra.h> #include <sys/un.h> +#include "lib/printfrr.h" #include "ldpd.h" #include "ldpe.h" @@ -237,8 +238,8 @@ show_ldp_sync_msg(struct vty *vty, struct imsg *imsg, } if (iface->peer_ldp_id.s_addr) - vty_out (vty, " Peer LDP Identifier: %s:0\n", - inet_ntoa(iface->peer_ldp_id)); + vty_out (vty, " Peer LDP Identifier: %pI4:0\n", + &iface->peer_ldp_id); break; case IMSG_CTL_END: @@ -256,6 +257,7 @@ show_ldp_sync_msg_json(struct imsg *imsg, struct show_params *params, { struct ctl_ldp_sync *iface; json_object *json_iface; + char buf[PREFIX_STRLEN]; switch (imsg->hdr.type) { case IMSG_CTL_SHOW_LDP_SYNC: @@ -278,7 +280,8 @@ show_ldp_sync_msg_json(struct imsg *imsg, struct show_params *params, json_object_string_add(json_iface, "peerLdpId", iface->peer_ldp_id.s_addr ? - inet_ntoa(iface->peer_ldp_id) : ""); + inet_ntop(AF_INET, &iface->peer_ldp_id, buf, sizeof(buf)) : + ""); json_object_object_add(json, iface->name, json_iface); break; @@ -305,8 +308,7 @@ show_discovery_msg(struct vty *vty, struct imsg *imsg, if (params->family != AF_UNSPEC && params->family != adj->af) break; - vty_out(vty, "%-4s %-15s ", af_name(adj->af), - inet_ntoa(adj->id)); + vty_out(vty, "%-4s %-15pI4 ", af_name(adj->af), &adj->id); switch(adj->type) { case HELLO_LINK: vty_out(vty, "%-8s %-15s ", "Link", adj->ifname); @@ -336,8 +338,8 @@ show_discovery_detail_adj(struct vty *vty, char *buffer, struct ctl_adj *adj) { size_t buflen = strlen(buffer); - snprintf(buffer + buflen, LDPBUFSIZ - buflen, - " LSR Id: %s:0\n", inet_ntoa(adj->id)); + snprintfrr(buffer + buflen, LDPBUFSIZ - buflen, + " LSR Id: %pI4:0\n", &adj->id); buflen = strlen(buffer); snprintf(buffer + buflen, LDPBUFSIZ - buflen, " Source address: %s\n", @@ -419,7 +421,7 @@ show_discovery_detail_msg(struct vty *vty, struct imsg *imsg, case IMSG_CTL_END: rtr_id.s_addr = ldp_rtr_id_get(ldpd_conf); vty_out (vty, "Local:\n"); - vty_out (vty, " LSR Id: %s:0\n",inet_ntoa(rtr_id)); + vty_out (vty, " LSR Id: %pI4:0\n",&rtr_id); if (ldpd_conf->ipv4.flags & F_LDPD_AF_ENABLED) vty_out (vty, " Transport Address (IPv4): %s\n", log_addr(AF_INET, &ldpd_conf->ipv4.trans_addr)); @@ -445,6 +447,7 @@ show_discovery_msg_json(struct imsg *imsg, struct show_params *params, json_object *json) { struct ctl_adj *adj; + char buf[PREFIX_STRLEN]; json_object *json_array; json_object *json_adj; @@ -465,7 +468,8 @@ show_discovery_msg_json(struct imsg *imsg, struct show_params *params, json_object_string_add(json_adj, "addressFamily", af_name(adj->af)); json_object_string_add(json_adj, "neighborId", - inet_ntoa(adj->id)); + inet_ntop(AF_INET, &adj->id, buf, + sizeof(buf))); switch(adj->type) { case HELLO_LINK: json_object_string_add(json_adj, "type", "link"); @@ -494,6 +498,7 @@ show_discovery_msg_json(struct imsg *imsg, struct show_params *params, static void show_discovery_detail_adj_json(json_object *json, struct ctl_adj *adj) { + char buf[PREFIX_STRLEN]; json_object *json_adj; json_object *json_array; @@ -504,7 +509,8 @@ show_discovery_detail_adj_json(json_object *json, struct ctl_adj *adj) } json_adj = json_object_new_object(); - json_object_string_add(json_adj, "lsrId", inet_ntoa(adj->id)); + json_object_string_add(json_adj, "lsrId", inet_ntop(AF_INET, &adj->id, + buf, sizeof(buf))); json_object_string_add(json_adj, "sourceAddress", log_addr(adj->af, &adj->src_addr)); json_object_string_add(json_adj, "transportAddress", log_addr(adj->af, @@ -526,6 +532,7 @@ show_discovery_detail_msg_json(struct imsg *imsg, struct show_params *params, struct ctl_disc_tnbr *tnbr; struct in_addr rtr_id; union ldpd_addr *trans_addr; + char buf[PREFIX_STRLEN]; json_object *json_interface; json_object *json_target; static json_object *json_interfaces; @@ -535,7 +542,9 @@ show_discovery_detail_msg_json(struct imsg *imsg, struct show_params *params, switch (imsg->hdr.type) { case IMSG_CTL_SHOW_DISCOVERY: rtr_id.s_addr = ldp_rtr_id_get(ldpd_conf); - json_object_string_add(json, "lsrId", inet_ntoa(rtr_id)); + json_object_string_add(json, "lsrId", + inet_ntop(AF_INET, &rtr_id, buf, + sizeof(buf))); if (ldpd_conf->ipv4.flags & F_LDPD_AF_ENABLED) json_object_string_add(json, "transportAddressIPv4", log_addr(AF_INET, &ldpd_conf->ipv4.trans_addr)); @@ -612,9 +621,9 @@ show_nbr_msg(struct vty *vty, struct imsg *imsg, struct show_params *params) addr = log_addr(nbr->af, &nbr->raddr); - vty_out(vty, "%-4s %-15s %-11s %-15s", - af_name(nbr->af), inet_ntoa(nbr->id), - nbr_state_name(nbr->nbr_state), addr); + vty_out(vty, "%-4s %-15pI4 %-11s %-15s", + af_name(nbr->af), &nbr->id, + nbr_state_name(nbr->nbr_state), addr); if (strlen(addr) > 15) vty_out(vty, "\n%48s", " "); vty_out (vty, " %8s\n", log_time(nbr->uptime)); @@ -662,8 +671,8 @@ show_nbr_detail_msg(struct vty *vty, struct imsg *imsg, v4adjs_buffer[0] = '\0'; v6adjs_buffer[0] = '\0'; - vty_out (vty, "Peer LDP Identifier: %s:0\n", - inet_ntoa(nbr->id)); + vty_out (vty, "Peer LDP Identifier: %pI4:0\n", + &nbr->id); vty_out (vty, " TCP connection: %s:%u - %s:%u\n", log_addr(nbr->af, &nbr->laddr), ntohs(nbr->lport), log_addr(nbr->af, &nbr->raddr),ntohs(nbr->rport)); @@ -740,6 +749,7 @@ show_nbr_msg_json(struct imsg *imsg, struct show_params *params, json_object *json) { struct ctl_nbr *nbr; + char buf[PREFIX_STRLEN]; json_object *json_array; json_object *json_nbr; @@ -757,7 +767,8 @@ show_nbr_msg_json(struct imsg *imsg, struct show_params *params, json_object_string_add(json_nbr, "addressFamily", af_name(nbr->af)); json_object_string_add(json_nbr, "neighborId", - inet_ntoa(nbr->id)); + inet_ntop(AF_INET, &nbr->id, buf, + sizeof(buf))); json_object_string_add(json_nbr, "state", nbr_state_name(nbr->nbr_state)); json_object_string_add(json_nbr, "transportAddress", @@ -803,6 +814,7 @@ show_nbr_detail_msg_json(struct imsg *imsg, struct show_params *params, struct ctl_nbr *nbr; struct ldp_stats *stats; struct ctl_adj *adj; + char buf[PREFIX_STRLEN]; json_object *json_nbr; json_object *json_array; json_object *json_counter; @@ -815,9 +827,12 @@ show_nbr_detail_msg_json(struct imsg *imsg, struct show_params *params, nbr = imsg->data; json_nbr = json_object_new_object(); - json_object_object_add(json, inet_ntoa(nbr->id), json_nbr); - - json_object_string_add(json_nbr, "peerId", inet_ntoa(nbr->id)); + json_object_object_add(json, + inet_ntop(AF_INET, &nbr->id, buf, + sizeof(buf)), json_nbr); + json_object_string_add(json_nbr, "peerId", + inet_ntop(AF_INET, &nbr->id, buf, + sizeof(buf))); json_object_string_add(json_nbr, "tcpLocalAddress", log_addr(nbr->af, &nbr->laddr)); json_object_int_add(json_nbr, "tcpLocalPort", @@ -998,8 +1013,8 @@ show_nbr_capabilities_msg(struct vty *vty, struct imsg *imsg, struct show_params if (nbr->nbr_state != NBR_STA_OPER) break; - vty_out (vty, "Peer LDP Identifier: %s:0\n", - inet_ntoa(nbr->id)); + vty_out (vty, "Peer LDP Identifier: %pI4:0\n", + &nbr->id); show_nbr_capabilities(vty, nbr); vty_out (vty, "\n"); break; @@ -1079,6 +1094,7 @@ show_nbr_capabilities_msg_json(struct imsg *imsg, struct show_params *params, json_object *json) { struct ctl_nbr *nbr; + char buf[PREFIX_STRLEN]; json_object *json_nbr; switch (imsg->hdr.type) { @@ -1089,7 +1105,8 @@ show_nbr_capabilities_msg_json(struct imsg *imsg, struct show_params *params, break; json_nbr = json_object_new_object(); - json_object_object_add(json, inet_ntoa(nbr->id), json_nbr); + json_object_object_add(json, inet_ntop(AF_INET, &nbr->id, buf, + sizeof(buf)), json_nbr); show_nbr_capabilities_json(nbr, json_nbr); break; case IMSG_CTL_END: @@ -1128,9 +1145,10 @@ show_lib_msg(struct vty *vty, struct imsg *imsg, struct show_params *params) vty_out(vty, "%-4s %-20s", af_name(rt->af), dstnet); if (strlen(dstnet) > 20) vty_out(vty, "\n%25s", " "); - vty_out (vty, " %-15s %-11s %-13s %6s\n", inet_ntoa(rt->nexthop), - log_label(rt->local_label), log_label(rt->remote_label), - rt->in_use ? "yes" : "no"); + vty_out (vty, " %-15pI4 %-11s %-13s %6s\n", + &rt->nexthop, log_label(rt->local_label), + log_label(rt->remote_label), + rt->in_use ? "yes" : "no"); break; case IMSG_CTL_END: vty_out (vty, "\n"); @@ -1168,17 +1186,17 @@ show_lib_detail_msg(struct vty *vty, struct imsg *imsg, struct show_params *para upstream = 1; buflen = strlen(sent_buffer); - snprintf(sent_buffer + buflen, LDPBUFSIZ - buflen, - "%12s%s:0\n", "", inet_ntoa(rt->nexthop)); + snprintfrr(sent_buffer + buflen, LDPBUFSIZ - buflen, + "%12s%pI4:0\n", "", &rt->nexthop); break; case IMSG_CTL_SHOW_LIB_RCVD: rt = imsg->data; downstream = 1; buflen = strlen(rcvd_buffer); - snprintf(rcvd_buffer + buflen, LDPBUFSIZ - buflen, - "%12s%s:0, label %s%s\n", "", inet_ntoa(rt->nexthop), - log_label(rt->remote_label), - rt->in_use ? " (in use)" : ""); + snprintfrr(rcvd_buffer + buflen, LDPBUFSIZ - buflen, + "%12s%pI4:0, label %s%s\n", "", &rt->nexthop, + log_label(rt->remote_label), + rt->in_use ? " (in use)" : ""); break; case IMSG_CTL_SHOW_LIB_END: rt = imsg->data; @@ -1217,6 +1235,7 @@ show_lib_msg_json(struct imsg *imsg, struct show_params *params, json_object *json_array; json_object *json_lib_entry; char dstnet[BUFSIZ]; + char buf[PREFIX_STRLEN]; switch (imsg->hdr.type) { case IMSG_CTL_SHOW_LIB_BEGIN: @@ -1240,11 +1259,12 @@ show_lib_msg_json(struct imsg *imsg, struct show_params *params, log_addr(rt->af, &rt->prefix), rt->prefixlen); json_object_string_add(json_lib_entry, "prefix", dstnet); json_object_string_add(json_lib_entry, "neighborId", - inet_ntoa(rt->nexthop)); + inet_ntop(AF_INET, &rt->nexthop, buf, + sizeof(buf))); json_object_string_add(json_lib_entry, "localLabel", - log_label(rt->local_label)); + log_label(rt->local_label)); json_object_string_add(json_lib_entry, "remoteLabel", - log_label(rt->remote_label)); + log_label(rt->remote_label)); json_object_int_add(json_lib_entry, "inUse", rt->in_use); json_object_array_add(json_array, json_lib_entry); @@ -1264,6 +1284,7 @@ show_lib_detail_msg_json(struct imsg *imsg, struct show_params *params, { struct ctl_rt *rt = NULL; char dstnet[BUFSIZ]; + char buf[PREFIX_STRLEN]; static json_object *json_lib_entry; static json_object *json_adv_labels; json_object *json_adv_label; @@ -1296,7 +1317,8 @@ show_lib_detail_msg_json(struct imsg *imsg, struct show_params *params, json_adv_label = json_object_new_object(); json_object_string_add(json_adv_label, "neighborId", - inet_ntoa(rt->nexthop)); + inet_ntop(AF_INET, &rt->nexthop, buf, + sizeof(buf))); json_object_array_add(json_adv_labels, json_adv_label); break; case IMSG_CTL_SHOW_LIB_RCVD: @@ -1304,9 +1326,10 @@ show_lib_detail_msg_json(struct imsg *imsg, struct show_params *params, json_remote_label = json_object_new_object(); json_object_string_add(json_remote_label, "neighborId", - inet_ntoa(rt->nexthop)); + inet_ntop(AF_INET, &rt->nexthop, + buf, sizeof(buf))); json_object_string_add(json_remote_label, "label", - log_label(rt->remote_label)); + log_label(rt->remote_label)); json_object_int_add(json_remote_label, "inUse", rt->in_use); json_object_array_add(json_remote_labels, json_remote_label); break; @@ -1329,8 +1352,8 @@ show_l2vpn_binding_msg(struct vty *vty, struct imsg *imsg, case IMSG_CTL_SHOW_L2VPN_BINDING: pw = imsg->data; - vty_out (vty, " Destination Address: %s, VC ID: %u\n", - inet_ntoa(pw->lsr_id), pw->pwid); + vty_out (vty, " Destination Address: %pI4, VC ID: %u\n", + &pw->lsr_id, pw->pwid); /* local binding */ if (pw->local_label != NO_LABEL) { @@ -1371,6 +1394,7 @@ show_l2vpn_binding_msg_json(struct imsg *imsg, struct show_params *params, struct ctl_pw *pw; json_object *json_pw; char key_name[64]; + char buf[PREFIX_STRLEN]; switch (imsg->hdr.type) { case IMSG_CTL_SHOW_L2VPN_BINDING: @@ -1378,7 +1402,8 @@ show_l2vpn_binding_msg_json(struct imsg *imsg, struct show_params *params, json_pw = json_object_new_object(); json_object_string_add(json_pw, "destination", - inet_ntoa(pw->lsr_id)); + inet_ntop(AF_INET, &pw->lsr_id, buf, + sizeof(buf))); json_object_int_add(json_pw, "vcId", pw->pwid); /* local binding */ @@ -1415,8 +1440,8 @@ show_l2vpn_binding_msg_json(struct imsg *imsg, struct show_params *params, json_object_string_add(json_pw, "remoteLabel", "unassigned"); - snprintf(key_name, sizeof(key_name), "%s: %u", - inet_ntoa(pw->lsr_id), pw->pwid); + snprintfrr(key_name, sizeof(key_name), "%pI4: %u", + &pw->lsr_id, pw->pwid); json_object_object_add(json, key_name, json_pw); break; case IMSG_CTL_END: @@ -1437,9 +1462,9 @@ show_l2vpn_pw_msg(struct vty *vty, struct imsg *imsg, struct show_params *params case IMSG_CTL_SHOW_L2VPN_PW: pw = imsg->data; - vty_out (vty, "%-9s %-15s %-10u %-16s %-10s\n", pw->ifname, - inet_ntoa(pw->lsr_id), pw->pwid, pw->l2vpn_name, - (pw->status == PW_FORWARDING ? "UP" : "DOWN")); + vty_out (vty, "%-9s %-15pI4 %-10u %-16s %-10s\n", pw->ifname, + &pw->lsr_id, pw->pwid, pw->l2vpn_name, + (pw->status == PW_FORWARDING ? "UP" : "DOWN")); break; case IMSG_CTL_END: vty_out (vty, "\n"); @@ -1456,6 +1481,7 @@ show_l2vpn_pw_msg_json(struct imsg *imsg, struct show_params *params, json_object *json) { struct ctl_pw *pw; + char buf[PREFIX_STRLEN]; json_object *json_pw; switch (imsg->hdr.type) { @@ -1463,7 +1489,9 @@ show_l2vpn_pw_msg_json(struct imsg *imsg, struct show_params *params, pw = imsg->data; json_pw = json_object_new_object(); - json_object_string_add(json_pw, "peerId", inet_ntoa(pw->lsr_id)); + json_object_string_add(json_pw, "peerId", + inet_ntop(AF_INET, &pw->lsr_id, + buf, sizeof(buf))); json_object_int_add(json_pw, "vcId", pw->pwid); json_object_string_add(json_pw, "VpnName", pw->l2vpn_name); if (pw->status == PW_FORWARDING) diff --git a/ldpd/ldp_zebra.c b/ldpd/ldp_zebra.c index 16e9adc9d9..3852d8d23b 100644 --- a/ldpd/ldp_zebra.c +++ b/ldpd/ldp_zebra.c @@ -359,7 +359,7 @@ ldp_router_id_update(ZAPI_CALLBACK_ARGS) if (bad_addr_v4(router_id.u.prefix4)) return (0); - debug_zebra_in("router-id update %s", inet_ntoa(router_id.u.prefix4)); + debug_zebra_in("router-id update %pI4", &router_id.u.prefix4); global.rtr_id.s_addr = router_id.u.prefix4.s_addr; main_imsg_compose_ldpe(IMSG_RTRID_UPDATE, 0, &global.rtr_id, diff --git a/ldpd/ldpd.c b/ldpd/ldpd.c index 940333f83c..d6da45c862 100644 --- a/ldpd/ldpd.c +++ b/ldpd/ldpd.c @@ -604,8 +604,8 @@ main_dispatch_ldpe(struct thread *thread) imsg_event_add(iev); else { /* this pipe is dead, so remove the event handlers and exit */ - THREAD_READ_OFF(iev->ev_read); - THREAD_WRITE_OFF(iev->ev_write); + thread_cancel(&iev->ev_read); + thread_cancel(&iev->ev_write); ldpe_pid = 0; if (lde_pid == 0) ldpd_shutdown(); @@ -702,8 +702,8 @@ main_dispatch_lde(struct thread *thread) imsg_event_add(iev); else { /* this pipe is dead, so remove the event handlers and exit */ - THREAD_READ_OFF(iev->ev_read); - THREAD_WRITE_OFF(iev->ev_write); + thread_cancel(&iev->ev_read); + thread_cancel(&iev->ev_write); lde_pid = 0; if (ldpe_pid == 0) ldpd_shutdown(); @@ -728,8 +728,8 @@ ldp_write_handler(struct thread *thread) fatal("msgbuf_write"); if (n == 0) { /* this pipe is dead, so remove the event handlers */ - THREAD_READ_OFF(iev->ev_read); - THREAD_WRITE_OFF(iev->ev_write); + thread_cancel(&iev->ev_read); + thread_cancel(&iev->ev_write); return (0); } @@ -816,7 +816,7 @@ evbuf_init(struct evbuf *eb, int fd, int (*handler)(struct thread *), void evbuf_clear(struct evbuf *eb) { - THREAD_WRITE_OFF(eb->ev); + thread_cancel(&eb->ev); msgbuf_clear(&eb->wbuf); eb->wbuf.fd = -1; } diff --git a/ldpd/ldpe.c b/ldpd/ldpe.c index d3374a62db..ffc1d17f51 100644 --- a/ldpd/ldpe.c +++ b/ldpd/ldpe.c @@ -208,7 +208,7 @@ ldpe_shutdown(void) #ifdef __OpenBSD__ if (sysdep.no_pfkey == 0) { - THREAD_READ_OFF(pfkey_ev); + thread_cancel(&pfkey_ev); close(global.pfkeysock); } #endif @@ -580,8 +580,8 @@ ldpe_dispatch_main(struct thread *thread) imsg_event_add(iev); else { /* this pipe is dead, so remove the event handlers and exit */ - THREAD_READ_OFF(iev->ev_read); - THREAD_WRITE_OFF(iev->ev_write); + thread_cancel(&iev->ev_read); + thread_cancel(&iev->ev_write); ldpe_shutdown(); } @@ -719,8 +719,8 @@ ldpe_dispatch_lde(struct thread *thread) imsg_event_add(iev); else { /* this pipe is dead, so remove the event handlers and exit */ - THREAD_READ_OFF(iev->ev_read); - THREAD_WRITE_OFF(iev->ev_write); + thread_cancel(&iev->ev_read); + thread_cancel(&iev->ev_write); ldpe_shutdown(); } @@ -778,14 +778,14 @@ ldpe_close_sockets(int af) af_global = ldp_af_global_get(&global, af); /* discovery socket */ - THREAD_READ_OFF(af_global->disc_ev); + thread_cancel(&af_global->disc_ev); if (af_global->ldp_disc_socket != -1) { close(af_global->ldp_disc_socket); af_global->ldp_disc_socket = -1; } /* extended discovery socket */ - THREAD_READ_OFF(af_global->edisc_ev); + thread_cancel(&af_global->edisc_ev); if (af_global->ldp_edisc_socket != -1) { close(af_global->ldp_edisc_socket); af_global->ldp_edisc_socket = -1; diff --git a/ldpd/logmsg.c b/ldpd/logmsg.c index 6427d0e13b..ff9294f9d2 100644 --- a/ldpd/logmsg.c +++ b/ldpd/logmsg.c @@ -17,6 +17,7 @@ */ #include <zebra.h> +#include "lib/printfrr.h" #include "mpls.h" @@ -254,10 +255,10 @@ log_fec(const struct fec *fec) return ("???"); break; case FEC_TYPE_PWID: - if (snprintf(buf, sizeof(buf), - "pwid %u (%s) - %s", - fec->u.pwid.pwid, pw_type_name(fec->u.pwid.type), - inet_ntoa(fec->u.pwid.lsr_id)) == -1) + if (snprintfrr(buf, sizeof(buf), + "pwid %u (%s) - %pI4", + fec->u.pwid.pwid, pw_type_name(fec->u.pwid.type), + &fec->u.pwid.lsr_id) == -1) return ("???"); break; default: diff --git a/ldpd/neighbor.c b/ldpd/neighbor.c index 236d3eaa58..75deaad2c0 100644 --- a/ldpd/neighbor.c +++ b/ldpd/neighbor.c @@ -143,7 +143,7 @@ nbr_fsm(struct nbr *nbr, enum nbr_event event) if (nbr_fsm_tbl[i].state == -1) { /* event outside of the defined fsm, ignore it. */ - log_warnx("%s: lsr-id %s, event %s not expected in state %s", __func__, inet_ntoa(nbr->id), + log_warnx("%s: lsr-id %pI4, event %s not expected in state %s", __func__, &nbr->id, nbr_event_names[event], nbr_state_name(old_state)); return (0); } @@ -152,10 +152,10 @@ nbr_fsm(struct nbr *nbr, enum nbr_event event) nbr->state = new_state; if (old_state != nbr->state) { - log_debug("%s: event %s resulted in action %s and changing state for lsr-id %s from %s to %s", + log_debug("%s: event %s resulted in action %s and changing state for lsr-id %pI4 from %s to %s", __func__, nbr_event_names[event], nbr_action_names[nbr_fsm_tbl[i].action], - inet_ntoa(nbr->id), nbr_state_name(old_state), + &nbr->id, nbr_state_name(old_state), nbr_state_name(nbr->state)); if (nbr->state == NBR_STA_OPER) { @@ -223,8 +223,8 @@ nbr_new(struct in_addr id, int af, int ds_tlv, union ldpd_addr *addr, struct adj *adj; struct pending_conn *pconn; - log_debug("%s: lsr-id %s transport-address %s", __func__, - inet_ntoa(id), log_addr(af, addr)); + log_debug("%s: lsr-id %pI4 transport-address %s", __func__, + &id, log_addr(af, addr)); if ((nbr = calloc(1, sizeof(*nbr))) == NULL) fatal(__func__); @@ -289,7 +289,7 @@ nbr_del(struct nbr *nbr) { struct adj *adj; - log_debug("%s: lsr-id %s", __func__, inet_ntoa(nbr->id)); + log_debug("%s: lsr-id %pI4", __func__, &nbr->id); nbr_fsm(nbr, NBR_EVT_CLOSE_SESSION); #ifdef __OpenBSD__ @@ -302,7 +302,7 @@ nbr_del(struct nbr *nbr) nbr->auth.method = AUTH_NONE; if (nbr_pending_connect(nbr)) - THREAD_WRITE_OFF(nbr->ev_connect); + thread_cancel(&nbr->ev_connect); nbr_stop_ktimer(nbr); nbr_stop_ktimeout(nbr); nbr_stop_itimeout(nbr); @@ -416,7 +416,7 @@ nbr_start_ktimer(struct nbr *nbr) /* send three keepalives per period */ secs = nbr->keepalive / KEEPALIVE_PER_PERIOD; - THREAD_TIMER_OFF(nbr->keepalive_timer); + thread_cancel(&nbr->keepalive_timer); nbr->keepalive_timer = NULL; thread_add_timer(master, nbr_ktimer, nbr, secs, &nbr->keepalive_timer); } @@ -424,7 +424,7 @@ nbr_start_ktimer(struct nbr *nbr) void nbr_stop_ktimer(struct nbr *nbr) { - THREAD_TIMER_OFF(nbr->keepalive_timer); + thread_cancel(&nbr->keepalive_timer); } /* Keepalive timeout: if the nbr hasn't sent keepalive */ @@ -436,7 +436,7 @@ nbr_ktimeout(struct thread *thread) nbr->keepalive_timeout = NULL; - log_debug("%s: lsr-id %s", __func__, inet_ntoa(nbr->id)); + log_debug("%s: lsr-id %pI4", __func__, &nbr->id); session_shutdown(nbr, S_KEEPALIVE_TMR, 0, 0); @@ -446,7 +446,7 @@ nbr_ktimeout(struct thread *thread) static void nbr_start_ktimeout(struct nbr *nbr) { - THREAD_TIMER_OFF(nbr->keepalive_timeout); + thread_cancel(&nbr->keepalive_timeout); nbr->keepalive_timeout = NULL; thread_add_timer(master, nbr_ktimeout, nbr, nbr->keepalive, &nbr->keepalive_timeout); @@ -455,7 +455,7 @@ nbr_start_ktimeout(struct nbr *nbr) void nbr_stop_ktimeout(struct nbr *nbr) { - THREAD_TIMER_OFF(nbr->keepalive_timeout); + thread_cancel(&nbr->keepalive_timeout); } /* Session initialization timeout: if nbr got stuck in the initialization FSM */ @@ -465,7 +465,7 @@ nbr_itimeout(struct thread *thread) { struct nbr *nbr = THREAD_ARG(thread); - log_debug("%s: lsr-id %s", __func__, inet_ntoa(nbr->id)); + log_debug("%s: lsr-id %pI4", __func__, &nbr->id); nbr_fsm(nbr, NBR_EVT_CLOSE_SESSION); @@ -478,7 +478,7 @@ nbr_start_itimeout(struct nbr *nbr) int secs; secs = INIT_FSM_TIMEOUT; - THREAD_TIMER_OFF(nbr->init_timeout); + thread_cancel(&nbr->init_timeout); nbr->init_timeout = NULL; thread_add_timer(master, nbr_itimeout, nbr, secs, &nbr->init_timeout); } @@ -486,7 +486,7 @@ nbr_start_itimeout(struct nbr *nbr) void nbr_stop_itimeout(struct nbr *nbr) { - THREAD_TIMER_OFF(nbr->init_timeout); + thread_cancel(&nbr->init_timeout); } /* Init delay timer: timer to retry to iniziatize session */ @@ -498,7 +498,7 @@ nbr_idtimer(struct thread *thread) nbr->initdelay_timer = NULL; - log_debug("%s: lsr-id %s", __func__, inet_ntoa(nbr->id)); + log_debug("%s: lsr-id %pI4", __func__, &nbr->id); nbr_establish_connection(nbr); @@ -527,7 +527,7 @@ nbr_start_idtimer(struct nbr *nbr) break; } - THREAD_TIMER_OFF(nbr->initdelay_timer); + thread_cancel(&nbr->initdelay_timer); nbr->initdelay_timer = NULL; thread_add_timer(master, nbr_idtimer, nbr, secs, &nbr->initdelay_timer); @@ -536,7 +536,7 @@ nbr_start_idtimer(struct nbr *nbr) void nbr_stop_idtimer(struct nbr *nbr) { - THREAD_TIMER_OFF(nbr->initdelay_timer); + thread_cancel(&nbr->initdelay_timer); } int @@ -619,12 +619,12 @@ nbr_establish_connection(struct nbr *nbr) if (nbr->af == AF_INET) { if (sock_set_ipv4_tos(nbr->fd, IPTOS_PREC_INTERNETCONTROL) == -1) - log_warn("%s: lsr-id %s, sock_set_ipv4_tos error", - __func__, inet_ntoa(nbr->id)); + log_warn("%s: lsr-id %pI4, sock_set_ipv4_tos error", + __func__, &nbr->id); } else if (nbr->af == AF_INET6) { if (sock_set_ipv6_dscp(nbr->fd, IPTOS_PREC_INTERNETCONTROL) == -1) - log_warn("%s: lsr-id %s, sock_set_ipv6_dscp error", - __func__, inet_ntoa(nbr->id)); + log_warn("%s: lsr-id %pI4, sock_set_ipv6_dscp error", + __func__, &nbr->id); } addr2sa(nbr->af, &nbr->laddr, 0, &local_su); @@ -746,8 +746,8 @@ nbr_gtsm_check(int fd, struct nbr *nbr, struct nbr_params *nbrp) } if (nbr_gtsm_setup(fd, nbr->af, nbrp) == -1) { - log_warnx("%s: error enabling GTSM for lsr-id %s", __func__, - inet_ntoa(nbr->id)); + log_warnx("%s: error enabling GTSM for lsr-id %pI4", __func__, + &nbr->id); return (-1); } diff --git a/ldpd/notification.c b/ldpd/notification.c index 93be9d3cb0..f84e0f893b 100644 --- a/ldpd/notification.c +++ b/ldpd/notification.c @@ -309,13 +309,13 @@ void log_msg_notification(int out, struct nbr *nbr, struct notify_msg *nm) { if (nm->status_code & STATUS_FATAL) { - debug_msg(out, "notification: lsr-id %s, status %s (fatal error)", inet_ntoa(nbr->id), + debug_msg(out, "notification: lsr-id %pI4, status %s (fatal error)", &nbr->id, status_code_name(nm->status_code)); return; } - debug_msg(out, "notification: lsr-id %s, status %s", - inet_ntoa(nbr->id), status_code_name(nm->status_code)); + debug_msg(out, "notification: lsr-id %pI4, status %s", + &nbr->id, status_code_name(nm->status_code)); if (nm->flags & F_NOTIF_FEC) debug_msg(out, "notification: fec %s", log_map(&nm->fec)); if (nm->flags & F_NOTIF_PW_STATUS) diff --git a/ldpd/packet.c b/ldpd/packet.c index 3f73f8cd88..fdcaa79d23 100644 --- a/ldpd/packet.c +++ b/ldpd/packet.c @@ -366,7 +366,7 @@ session_accept(struct thread *thread) return (0); } if (nbr->state != NBR_STA_PRESENT) { - log_debug("%s: lsr-id %s: rejecting additional transport connection", __func__, inet_ntoa(nbr->id)); + log_debug("%s: lsr-id %pI4: rejecting additional transport connection", __func__, &nbr->id); close(newfd); return (0); } @@ -558,8 +558,8 @@ session_read(struct thread *thread) type); break; default: - log_debug("%s: unknown LDP message from nbr %s", - __func__, inet_ntoa(nbr->id)); + log_debug("%s: unknown LDP message from nbr %pI4", + __func__, &nbr->id); if (!(ntohs(msg->type) & UNKNOWN_FLAG)) send_notification(nbr->tcp, S_UNKNOWN_MSG, msg->id, msg->type); @@ -662,7 +662,7 @@ session_shutdown(struct nbr *nbr, uint32_t status, uint32_t msg_id, switch (nbr->state) { case NBR_STA_PRESENT: if (nbr_pending_connect(nbr)) - THREAD_WRITE_OFF(nbr->ev_connect); + thread_cancel(&nbr->ev_connect); break; case NBR_STA_INITIAL: case NBR_STA_OPENREC: @@ -680,8 +680,8 @@ session_shutdown(struct nbr *nbr, uint32_t status, uint32_t msg_id, void session_close(struct nbr *nbr) { - log_debug("%s: closing session with lsr-id %s", __func__, - inet_ntoa(nbr->id)); + log_debug("%s: closing session with lsr-id %pI4", __func__, + &nbr->id); ldp_sync_fsm_nbr_event(nbr, LDP_SYNC_EVT_SESSION_CLOSE); @@ -762,7 +762,7 @@ tcp_close(struct tcp_conn *tcp) evbuf_clear(&tcp->wbuf); if (tcp->nbr) { - THREAD_READ_OFF(tcp->rev); + thread_cancel(&tcp->rev); free(tcp->rbuf); tcp->nbr->tcp = NULL; } @@ -794,7 +794,7 @@ pending_conn_new(int fd, int af, union ldpd_addr *addr) void pending_conn_del(struct pending_conn *pconn) { - THREAD_TIMER_OFF(pconn->ev_timeout); + thread_cancel(&pconn->ev_timeout); TAILQ_REMOVE(&global.pending_conns, pconn, entry); free(pconn); } diff --git a/lib/agentx.c b/lib/agentx.c index 7c4bdcbe27..603d8d6172 100644 --- a/lib/agentx.c +++ b/lib/agentx.c @@ -107,7 +107,7 @@ static void agentx_events_update(void) struct thread *thr; int fd, thr_fd; - THREAD_OFF(timeout_thr); + thread_cancel(&timeout_thr); FD_ZERO(&fds); snmp_select_info(&maxfd, &fds, &timeout, &block); @@ -130,7 +130,7 @@ static void agentx_events_update(void) if (thr_fd == fd) { struct listnode *nextln = listnextnode(ln); if (!FD_ISSET(fd, &fds)) { - thread_cancel(thr); + thread_cancel(&thr); list_delete_node(events, ln); } ln = nextln; @@ -151,7 +151,8 @@ static void agentx_events_update(void) */ while (ln) { struct listnode *nextln = listnextnode(ln); - thread_cancel(listgetdata(ln)); + thr = listgetdata(ln); + thread_cancel(&thr); list_delete_node(events, ln); ln = nextln; } diff --git a/lib/command.c b/lib/command.c index 1e950fe483..7d335e1c36 100644 --- a/lib/command.c +++ b/lib/command.c @@ -139,6 +139,27 @@ static struct cmd_node config_node = { .node_exit = vty_config_node_exit, }; +static bool vty_check_node_for_xpath_decrement(enum node_type target_node, + enum node_type node) +{ + /* bgp afi-safi (`address-family <afi> <safi>`) node + * does not increment xpath_index. + * In order to use (`router bgp`) BGP_NODE's xpath as a base, + * retain xpath_index as 1 upon exiting from + * afi-safi node. + */ + + if (target_node == BGP_NODE + && (node == BGP_IPV4_NODE || node == BGP_IPV6_NODE + || node == BGP_IPV4M_NODE || node == BGP_IPV6M_NODE + || node == BGP_VPNV4_NODE || node == BGP_VPNV6_NODE + || node == BGP_EVPN_NODE || node == BGP_IPV4L_NODE + || node == BGP_IPV6L_NODE )) + return false; + + return true; +} + /* This is called from main when a daemon is invoked with -v or --version. */ void print_version(const char *progname) { @@ -985,7 +1006,9 @@ int cmd_execute_command(vector vline, struct vty *vty, while (vty->node > CONFIG_NODE) { try_node = node_parent(try_node); vty->node = try_node; - if (vty->xpath_index > 0) + if (vty->xpath_index > 0 + && vty_check_node_for_xpath_decrement(try_node, + onode)) vty->xpath_index--; ret = cmd_execute_command_real(vline, FILTER_RELAXED, vty, cmd); @@ -1194,7 +1217,9 @@ int command_config_read_one_line(struct vty *vty, && ret != CMD_SUCCESS && ret != CMD_WARNING && vty->node > CONFIG_NODE) { vty->node = node_parent(vty->node); - if (vty->xpath_index > 0) + if (vty->xpath_index > 0 + && vty_check_node_for_xpath_decrement(vty->node, + saved_node)) vty->xpath_index--; ret = cmd_execute_command_strict(vline, vty, cmd); } @@ -1316,7 +1341,8 @@ void cmd_exit(struct vty *vty) } if (cnode->parent_node) vty->node = cnode->parent_node; - if (vty->xpath_index > 0) + if (vty->xpath_index > 0 + && vty_check_node_for_xpath_decrement(vty->node, cnode->node)) vty->xpath_index--; } diff --git a/lib/filter.c b/lib/filter.c index e6add0462b..f5ae9ee2b7 100644 --- a/lib/filter.c +++ b/lib/filter.c @@ -576,14 +576,12 @@ static int filter_show(struct vty *vty, const char *name, afi_t afi) if (filter->addr_mask.s_addr == 0xffffffff) vty_out(vty, " any\n"); else { - vty_out(vty, " %s", - inet_ntoa(filter->addr)); + vty_out(vty, " %pI4", &filter->addr); if (filter->addr_mask.s_addr != INADDR_ANY) vty_out(vty, - ", wildcard bits %s", - inet_ntoa( - filter->addr_mask)); + ", wildcard bits %pI4", + &filter->addr_mask); vty_out(vty, "\n"); } } @@ -625,14 +623,12 @@ static int filter_show(struct vty *vty, const char *name, afi_t afi) if (filter->addr_mask.s_addr == 0xffffffff) vty_out(vty, " any\n"); else { - vty_out(vty, " %s", - inet_ntoa(filter->addr)); + vty_out(vty, " %pI4", &filter->addr); if (filter->addr_mask.s_addr != INADDR_ANY) vty_out(vty, - ", wildcard bits %s", - inet_ntoa( - filter->addr_mask)); + ", wildcard bits %pI4", + &filter->addr_mask); vty_out(vty, "\n"); } } @@ -722,29 +718,28 @@ static void config_write_access_cisco(struct vty *vty, struct filter *mfilter) if (filter->addr_mask.s_addr == 0xffffffff) vty_out(vty, " any"); else if (filter->addr_mask.s_addr == INADDR_ANY) - vty_out(vty, " host %s", inet_ntoa(filter->addr)); + vty_out(vty, " host %pI4", &filter->addr); else { - vty_out(vty, " %s", inet_ntoa(filter->addr)); - vty_out(vty, " %s", inet_ntoa(filter->addr_mask)); + vty_out(vty, " %pI4", &filter->addr); + vty_out(vty, " %pI4", &filter->addr_mask); } if (filter->mask_mask.s_addr == 0xffffffff) vty_out(vty, " any"); else if (filter->mask_mask.s_addr == INADDR_ANY) - vty_out(vty, " host %s", inet_ntoa(filter->mask)); + vty_out(vty, " host %pI4", &filter->mask); else { - vty_out(vty, " %s", inet_ntoa(filter->mask)); - vty_out(vty, " %s", inet_ntoa(filter->mask_mask)); + vty_out(vty, " %pI4", &filter->mask); + vty_out(vty, " %pI4", &filter->mask_mask); } vty_out(vty, "\n"); } else { if (filter->addr_mask.s_addr == 0xffffffff) vty_out(vty, " any\n"); else { - vty_out(vty, " %s", inet_ntoa(filter->addr)); + vty_out(vty, " %pI4", &filter->addr); if (filter->addr_mask.s_addr != INADDR_ANY) - vty_out(vty, " %s", - inet_ntoa(filter->addr_mask)); + vty_out(vty, " %pI4", &filter->addr_mask); vty_out(vty, "\n"); } } diff --git a/lib/frr_pthread.c b/lib/frr_pthread.c index da9594ed80..3f0179fbc1 100644 --- a/lib/frr_pthread.c +++ b/lib/frr_pthread.c @@ -28,6 +28,7 @@ #include "memory.h" #include "linklist.h" #include "zlog.h" +#include "libfrr_trace.h" DEFINE_MTYPE_STATIC(LIB, FRR_PTHREAD, "FRR POSIX Thread") DEFINE_MTYPE_STATIC(LIB, PTHREAD_PRIM, "POSIX sync primitives") @@ -167,6 +168,8 @@ int frr_pthread_run(struct frr_pthread *fpt, const pthread_attr_t *attr) sigfillset(&blocksigs); pthread_sigmask(SIG_BLOCK, &blocksigs, &oldsigs); + frrtrace(1, frr_libfrr, frr_pthread_run, fpt->name); + fpt->rcu_thread = rcu_thread_prepare(); ret = pthread_create(&fpt->thread, attr, frr_pthread_inner, fpt); @@ -204,6 +207,8 @@ void frr_pthread_notify_running(struct frr_pthread *fpt) int frr_pthread_stop(struct frr_pthread *fpt, void **result) { + frrtrace(1, frr_libfrr, frr_pthread_stop, fpt->name); + int ret = (*fpt->attr.stop)(fpt, result); memset(&fpt->thread, 0x00, sizeof(fpt->thread)); return ret; diff --git a/lib/frr_zmq.c b/lib/frr_zmq.c index 565936a410..cc11d76700 100644 --- a/lib/frr_zmq.c +++ b/lib/frr_zmq.c @@ -190,10 +190,8 @@ int funcname_frrzmq_thread_add_read(struct thread_master *master, cb->read.cancelled = false; if (events & ZMQ_POLLIN) { - if (cb->read.thread) { - thread_cancel(cb->read.thread); - cb->read.thread = NULL; - } + thread_cancel(&cb->read.thread); + funcname_thread_add_event(master, frrzmq_read_msg, cbp, fd, &cb->read.thread, funcname, schedfrom, fromln); @@ -298,10 +296,8 @@ int funcname_frrzmq_thread_add_write(struct thread_master *master, cb->write.cancelled = false; if (events & ZMQ_POLLOUT) { - if (cb->write.thread) { - thread_cancel(cb->write.thread); - cb->write.thread = NULL; - } + thread_cancel(&cb->write.thread); + funcname_thread_add_event(master, frrzmq_write_msg, cbp, fd, &cb->write.thread, funcname, schedfrom, fromln); @@ -317,10 +313,8 @@ void frrzmq_thread_cancel(struct frrzmq_cb **cb, struct cb_core *core) if (!cb || !*cb) return; core->cancelled = true; - if (core->thread) { - thread_cancel(core->thread); - core->thread = NULL; - } + thread_cancel(&core->thread); + if ((*cb)->read.cancelled && !(*cb)->read.thread && (*cb)->write.cancelled && (*cb)->write.thread) XFREE(MTYPE_ZEROMQ_CB, *cb); @@ -344,8 +338,8 @@ void frrzmq_check_events(struct frrzmq_cb **cbp, struct cb_core *core, return; if (events & event && core->thread && !core->cancelled) { struct thread_master *tm = core->thread->master; - thread_cancel(core->thread); - core->thread = NULL; + thread_cancel(&core->thread); + thread_add_event(tm, (event == ZMQ_POLLIN ? frrzmq_read_msg : frrzmq_write_msg), cbp, cb->fd, &core->thread); diff --git a/lib/hash.c b/lib/hash.c index 85982774ac..ed429b77d0 100644 --- a/lib/hash.c +++ b/lib/hash.c @@ -29,6 +29,7 @@ #include "command.h" #include "libfrr.h" #include "frr_pthread.h" +#include "libfrr_trace.h" DEFINE_MTYPE_STATIC(LIB, HASH, "Hash") DEFINE_MTYPE_STATIC(LIB, HASH_BACKET, "Hash Bucket") @@ -138,6 +139,8 @@ static void hash_expand(struct hash *hash) void *hash_get(struct hash *hash, void *data, void *(*alloc_func)(void *)) { + frrtrace(2, frr_libfrr, hash_get, hash, data); + unsigned int key; unsigned int index; void *newdata; @@ -172,6 +175,8 @@ void *hash_get(struct hash *hash, void *data, void *(*alloc_func)(void *)) hash->index[index] = bucket; hash->count++; + frrtrace(3, frr_libfrr, hash_insert, hash, data, key); + int oldlen = bucket->next ? bucket->next->len : 0; int newlen = oldlen + 1; @@ -206,7 +211,7 @@ unsigned int string_hash_make(const char *str) void *hash_release(struct hash *hash, void *data) { - void *ret; + void *ret = NULL; unsigned int key; unsigned int index; struct hash_bucket *bucket; @@ -236,11 +241,14 @@ void *hash_release(struct hash *hash, void *data) ret = bucket->data; XFREE(MTYPE_HASH_BACKET, bucket); hash->count--; - return ret; + break; } pp = bucket; } - return NULL; + + frrtrace(3, frr_libfrr, hash_release, hash, data, ret); + + return ret; } void hash_iterate(struct hash *hash, void (*func)(struct hash_bucket *, void *), @@ -1106,8 +1106,8 @@ ifaddr_ipv4_add (struct in_addr *ifaddr, struct interface *ifp) if (rn) { route_unlock_node (rn); - zlog_info ("ifaddr_ipv4_add(): address %s is already added", - inet_ntoa (*ifaddr)); + zlog_info("ifaddr_ipv4_add(): address %pI4 is already added", + ifaddr); return; } rn->info = ifp; @@ -1126,8 +1126,7 @@ ifaddr_ipv4_delete (struct in_addr *ifaddr, struct interface *ifp) rn = route_node_lookup (ifaddr_ipv4_table, (struct prefix *) &p); if (! rn) { - zlog_info ("ifaddr_ipv4_delete(): can't find address %s", - inet_ntoa (*ifaddr)); + zlog_info("%s: can't find address %pI4", __func__, ifaddr); return; } rn->info = NULL; diff --git a/lib/ldp_sync.c b/lib/ldp_sync.c index 9657f0b1df..c9d7eb37cf 100644 --- a/lib/ldp_sync.c +++ b/lib/ldp_sync.c @@ -79,7 +79,7 @@ bool ldp_sync_if_down(struct ldp_sync_info *ldp_sync_info) * update state */ if (ldp_sync_info && ldp_sync_info->enabled == LDP_IGP_SYNC_ENABLED) { - THREAD_TIMER_OFF(ldp_sync_info->t_holddown); + THREAD_OFF(ldp_sync_info->t_holddown); if (ldp_sync_info->state == LDP_IGP_SYNC_STATE_REQUIRED_UP) ldp_sync_info->state = diff --git a/lib/libfrr_trace.c b/lib/libfrr_trace.c new file mode 100644 index 0000000000..2f300e6ee1 --- /dev/null +++ b/lib/libfrr_trace.c @@ -0,0 +1,4 @@ +#define TRACEPOINT_CREATE_PROBES +#define TRACEPOINT_DEFINE + +#include "libfrr_trace.h" diff --git a/lib/libfrr_trace.h b/lib/libfrr_trace.h new file mode 100644 index 0000000000..7215007ffb --- /dev/null +++ b/lib/libfrr_trace.h @@ -0,0 +1,240 @@ +/* Tracing + * + * Copyright (C) 2020 NVIDIA Corporation + * Quentin Young + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the Free + * Software Foundation; either version 2 of the License, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; see the file COPYING; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#if !defined(_LIBFRR_TRACE_H_) || defined(TRACEPOINT_HEADER_MULTI_READ) +#define _LIBFRR_TRACE_H_ + +#include "trace.h" + +#ifdef HAVE_LTTNG + +#undef TRACEPOINT_PROVIDER +#define TRACEPOINT_PROVIDER frr_libfrr + +#undef TRACEPOINT_INCLUDE +#define TRACEPOINT_INCLUDE "./libfrr_trace.h" + +#include <lttng/tracepoint.h> + +#include "hash.h" +#include "thread.h" +#include "memory.h" +#include "linklist.h" +#include "table.h" + +/* clang-format off */ + +TRACEPOINT_EVENT( + frr_libfrr, + hash_get, + TP_ARGS(struct hash *, hash, void *, data), + TP_FIELDS( + ctf_string(name, hash->name ? hash->name : "(unnamed)") + ctf_integer(unsigned int, index_size, hash->size) + ctf_integer(unsigned long, item_count, hash->count) + ctf_integer_hex(intptr_t, data_ptr, data) + ) +) + +TRACEPOINT_LOGLEVEL(frr_libfrr, hash_get, TRACE_INFO) + +TRACEPOINT_EVENT( + frr_libfrr, + hash_insert, + TP_ARGS(struct hash *, hash, void *, data, unsigned int, key), + TP_FIELDS( + ctf_string(name, hash->name ? hash->name : "(unnamed)") + ctf_integer(unsigned int, key, hash->size) + ctf_integer(unsigned int, index_size, hash->size) + ctf_integer(unsigned long, item_count, hash->count) + ctf_integer_hex(intptr_t, data_ptr, data) + ) +) + +TRACEPOINT_LOGLEVEL(frr_libfrr, hash_insert, TRACE_INFO) + +TRACEPOINT_EVENT( + frr_libfrr, + hash_release, + TP_ARGS(struct hash *, hash, void *, data, void *, released_item), + TP_FIELDS( + ctf_string(name, hash->name ? hash->name : "(unnamed)") + ctf_integer(unsigned int, index_size, hash->size) + ctf_integer(unsigned long, item_count, hash->count) + ctf_integer_hex(intptr_t, data_ptr, data) + ctf_integer_hex(intptr_t, released_item, data) + ) +) + +TRACEPOINT_LOGLEVEL(frr_libfrr, hash_release, TRACE_INFO) + +#define THREAD_SCHEDULE_ARGS \ + TP_ARGS(struct thread_master *, master, const char *, funcname, \ + const char *, schedfrom, int, fromln, struct thread **, \ + thread_ptr, int, fd, int, val, void *, arg, long, time) + +TRACEPOINT_EVENT_CLASS( + frr_libfrr, + thread_operation, + THREAD_SCHEDULE_ARGS, + TP_FIELDS( + ctf_string(threadmaster_name, master->name) + ctf_string(function_name, funcname ? funcname : "(unknown function)") + ctf_string(scheduled_from, schedfrom ? schedfrom : "(unknown file)") + ctf_integer(int, scheduled_on_line, fromln) + ctf_integer_hex(intptr_t, thread_addr, thread_ptr ? *thread_ptr : NULL) + ctf_integer(int, file_descriptor, fd) + ctf_integer(int, event_value, val) + ctf_integer_hex(intptr_t, argument_ptr, arg) + ctf_integer(long, timer, time) + ) +) + +#define THREAD_OPERATION_TRACEPOINT_INSTANCE(name) \ + TRACEPOINT_EVENT_INSTANCE(frr_libfrr, thread_operation, name, \ + THREAD_SCHEDULE_ARGS) \ + TRACEPOINT_LOGLEVEL(frr_libfrr, name, TRACE_INFO) + +THREAD_OPERATION_TRACEPOINT_INSTANCE(schedule_timer) +THREAD_OPERATION_TRACEPOINT_INSTANCE(schedule_event) +THREAD_OPERATION_TRACEPOINT_INSTANCE(schedule_read) +THREAD_OPERATION_TRACEPOINT_INSTANCE(schedule_write) +THREAD_OPERATION_TRACEPOINT_INSTANCE(thread_cancel) +THREAD_OPERATION_TRACEPOINT_INSTANCE(thread_cancel_async) +THREAD_OPERATION_TRACEPOINT_INSTANCE(thread_call) + +TRACEPOINT_EVENT( + frr_libfrr, + frr_pthread_run, + TP_ARGS( + char *, name + ), + TP_FIELDS( + ctf_string(frr_pthread_name, name) + ) +) + +TRACEPOINT_EVENT( + frr_libfrr, + frr_pthread_stop, + TP_ARGS( + char *, name + ), + TP_FIELDS( + ctf_string(frr_pthread_name, name) + ) +) + +TRACEPOINT_EVENT( + frr_libfrr, + memalloc, + TP_ARGS( + struct memtype *, mt, void *, ptr, size_t, size + ), + TP_FIELDS( + ctf_string(memtype, mt->name) + ctf_integer(size_t, size, size) + ctf_integer_hex(intptr_t, ptr, ptr) + ) +) + +TRACEPOINT_EVENT( + frr_libfrr, + memfree, + TP_ARGS( + struct memtype *, mt, void *, ptr + ), + TP_FIELDS( + ctf_string(memtype, mt->name) + ctf_integer_hex(intptr_t, ptr, ptr) + ) +) + +TRACEPOINT_EVENT( + frr_libfrr, + list_add, + TP_ARGS( + struct list *, list, const void *, ptr + ), + TP_FIELDS( + ctf_integer_hex(intptr_t, list, list) + ctf_integer(unsigned int, count, list->count) + ctf_integer_hex(intptr_t, ptr, ptr) + ) +) + +TRACEPOINT_EVENT( + frr_libfrr, + list_remove, + TP_ARGS( + struct list *, list, const void *, ptr + ), + TP_FIELDS( + ctf_integer_hex(intptr_t, list, list) + ctf_integer(unsigned int, count, list->count) + ctf_integer_hex(intptr_t, ptr, ptr) + ) +) + +TRACEPOINT_EVENT( + frr_libfrr, + list_delete_node, + TP_ARGS( + struct list *, list, const void *, node + ), + TP_FIELDS( + ctf_integer_hex(intptr_t, list, list) + ctf_integer(unsigned int, count, list->count) + ctf_integer_hex(intptr_t, node, node) + ) +) + +TRACEPOINT_EVENT( + frr_libfrr, + list_sort, + TP_ARGS( + struct list *, list + ), + TP_FIELDS( + ctf_integer_hex(intptr_t, list, list) + ctf_integer(unsigned int, count, list->count) + ) +) + +TRACEPOINT_EVENT( + frr_libfrr, + route_node_get, + TP_ARGS( + struct route_table *, table, char *, prefix + ), + TP_FIELDS( + ctf_integer_hex(intptr_t, table, table) + ctf_string(prefix, prefix) + ) +) + +/* clang-format on */ + +#include <lttng/tracepoint-event.h> +#include <lttng/tracelog.h> + +#endif /* HAVE_LTTNG */ + +#endif /* _LIBFRR_TRACE_H_ */ diff --git a/lib/linklist.c b/lib/linklist.c index 84dc6e1419..43c2002231 100644 --- a/lib/linklist.c +++ b/lib/linklist.c @@ -23,6 +23,7 @@ #include "linklist.h" #include "memory.h" +#include "libfrr_trace.h" DEFINE_MTYPE_STATIC(LIB, LINK_LIST, "Link List") DEFINE_MTYPE_STATIC(LIB, LINK_NODE, "Link Node") @@ -66,6 +67,8 @@ static void listnode_free(struct list *list, struct listnode *node) struct listnode *listnode_add(struct list *list, void *val) { + frrtrace(2, frr_libfrr, list_add, list, val); + struct listnode *node; assert(val != NULL); @@ -281,6 +284,8 @@ void listnode_move_to_tail(struct list *l, struct listnode *n) void listnode_delete(struct list *list, const void *val) { + frrtrace(2, frr_libfrr, list_remove, list, val); + struct listnode *node = listnode_lookup(list, val); if (node) @@ -360,6 +365,8 @@ struct listnode *listnode_lookup_nocheck(struct list *list, void *data) void list_delete_node(struct list *list, struct listnode *node) { + frrtrace(2, frr_libfrr, list_delete_node, list, node); + if (node->prev) node->prev->next = node->next; else @@ -374,6 +381,8 @@ void list_delete_node(struct list *list, struct listnode *node) void list_sort(struct list *list, int (*cmp)(const void **, const void **)) { + frrtrace(1, frr_libfrr, list_sort, list); + struct listnode *ln, *nn; int i = -1; void *data; diff --git a/lib/memory.c b/lib/memory.c index 2c902d123b..f715044ea3 100644 --- a/lib/memory.c +++ b/lib/memory.c @@ -29,6 +29,7 @@ #include "memory.h" #include "log.h" +#include "libfrr_trace.h" static struct memgroup *mg_first = NULL; struct memgroup **mg_insert = &mg_first; @@ -77,6 +78,8 @@ static inline void mt_count_alloc(struct memtype *mt, size_t size, void *ptr) static inline void mt_count_free(struct memtype *mt, void *ptr) { + frrtrace(2, frr_libfrr, memfree, mt, ptr); + assert(mt->n_alloc); atomic_fetch_sub_explicit(&mt->n_alloc, 1, memory_order_relaxed); @@ -89,6 +92,8 @@ static inline void mt_count_free(struct memtype *mt, void *ptr) static inline void *mt_checkalloc(struct memtype *mt, void *ptr, size_t size) { + frrtrace(3, frr_libfrr, memalloc, mt, ptr, size); + if (__builtin_expect(ptr == NULL, 0)) { if (size) { /* malloc(0) is allowed to return NULL */ diff --git a/lib/nexthop.c b/lib/nexthop.c index f1575649b1..b2fa945690 100644 --- a/lib/nexthop.c +++ b/lib/nexthop.c @@ -431,13 +431,13 @@ const char *nexthop2str(const struct nexthop *nexthop, char *str, int size) break; case NEXTHOP_TYPE_IPV4: case NEXTHOP_TYPE_IPV4_IFINDEX: - snprintf(str, size, "%s if %u", inet_ntoa(nexthop->gate.ipv4), - nexthop->ifindex); + snprintfrr(str, size, "%pI4 if %u", &nexthop->gate.ipv4, + nexthop->ifindex); break; case NEXTHOP_TYPE_IPV6: case NEXTHOP_TYPE_IPV6_IFINDEX: - snprintf(str, size, "%s if %u", inet6_ntoa(nexthop->gate.ipv6), - nexthop->ifindex); + snprintfrr(str, size, "%pI6 if %u", &nexthop->gate.ipv6, + nexthop->ifindex); break; case NEXTHOP_TYPE_BLACKHOLE: snprintf(str, size, "blackhole"); diff --git a/lib/nexthop_group.c b/lib/nexthop_group.c index 4afb1d642a..dee98ad8d7 100644 --- a/lib/nexthop_group.c +++ b/lib/nexthop_group.c @@ -975,7 +975,6 @@ void nexthop_group_write_nexthop_simple(struct vty *vty, const struct nexthop *nh, char *altifname) { - char buf[100]; char *ifname; vty_out(vty, "nexthop "); @@ -990,19 +989,16 @@ void nexthop_group_write_nexthop_simple(struct vty *vty, vty_out(vty, "%s", ifname); break; case NEXTHOP_TYPE_IPV4: - vty_out(vty, "%s", inet_ntoa(nh->gate.ipv4)); + vty_out(vty, "%pI4", &nh->gate.ipv4); break; case NEXTHOP_TYPE_IPV4_IFINDEX: - vty_out(vty, "%s %s", inet_ntoa(nh->gate.ipv4), ifname); + vty_out(vty, "%pI4 %s", &nh->gate.ipv4, ifname); break; case NEXTHOP_TYPE_IPV6: - vty_out(vty, "%s", - inet_ntop(AF_INET6, &nh->gate.ipv6, buf, sizeof(buf))); + vty_out(vty, "%pI6", &nh->gate.ipv6); break; case NEXTHOP_TYPE_IPV6_IFINDEX: - vty_out(vty, "%s %s", - inet_ntop(AF_INET6, &nh->gate.ipv6, buf, sizeof(buf)), - ifname); + vty_out(vty, "%pI6 %s", &nh->gate.ipv6, ifname); break; case NEXTHOP_TYPE_BLACKHOLE: break; @@ -1056,10 +1052,14 @@ void nexthop_group_json_nexthop(json_object *j, const struct nexthop *nh) ifindex2ifname(nh->ifindex, nh->vrf_id)); break; case NEXTHOP_TYPE_IPV4: - json_object_string_add(j, "nexthop", inet_ntoa(nh->gate.ipv4)); + json_object_string_add( + j, "nexthop", + inet_ntop(AF_INET, &nh->gate.ipv4, buf, sizeof(buf))); break; case NEXTHOP_TYPE_IPV4_IFINDEX: - json_object_string_add(j, "nexthop", inet_ntoa(nh->gate.ipv4)); + json_object_string_add( + j, "nexthop", + inet_ntop(AF_INET, &nh->gate.ipv4, buf, sizeof(buf))); json_object_string_add(j, "vrfId", ifindex2ifname(nh->ifindex, nh->vrf_id)); break; diff --git a/lib/northbound.c b/lib/northbound.c index c99f993ea5..ecfa2c9d11 100644 --- a/lib/northbound.c +++ b/lib/northbound.c @@ -152,20 +152,22 @@ static int nb_node_del_cb(const struct lys_node *snode, void *arg) struct nb_node *nb_node; nb_node = snode->priv; - lys_set_private(snode, NULL); - XFREE(MTYPE_NB_NODE, nb_node); + if (nb_node) { + lys_set_private(snode, NULL); + XFREE(MTYPE_NB_NODE, nb_node); + } return YANG_ITER_CONTINUE; } void nb_nodes_create(void) { - yang_snodes_iterate_all(nb_node_new_cb, 0, NULL); + yang_snodes_iterate(NULL, nb_node_new_cb, 0, NULL); } void nb_nodes_delete(void) { - yang_snodes_iterate_all(nb_node_del_cb, 0, NULL); + yang_snodes_iterate(NULL, nb_node_del_cb, 0, NULL); } struct nb_node *nb_node_find(const char *xpath) @@ -273,8 +275,10 @@ static int nb_node_validate(const struct lys_node *snode, void *arg) unsigned int *errors = arg; /* Validate callbacks and priority. */ - *errors += nb_node_validate_cbs(nb_node); - *errors += nb_node_validate_priority(nb_node); + if (nb_node) { + *errors += nb_node_validate_cbs(nb_node); + *errors += nb_node_validate_priority(nb_node); + } return YANG_ITER_CONTINUE; } @@ -2232,25 +2236,11 @@ static void nb_load_callbacks(const struct frr_yang_module_info *module) } } -void nb_init(struct thread_master *tm, - const struct frr_yang_module_info *const modules[], - size_t nmodules, bool db_enabled) +void nb_validate_callbacks(void) { unsigned int errors = 0; - /* Load YANG modules. */ - for (size_t i = 0; i < nmodules; i++) - yang_module_load(modules[i]->name); - - /* Create a nb_node for all YANG schema nodes. */ - nb_nodes_create(); - - /* Load northbound callbacks. */ - for (size_t i = 0; i < nmodules; i++) - nb_load_callbacks(modules[i]); - - /* Validate northbound callbacks. */ - yang_snodes_iterate_all(nb_node_validate, 0, &errors); + yang_snodes_iterate(NULL, nb_node_validate, 0, &errors); if (errors > 0) { flog_err( EC_LIB_NB_CBS_VALIDATION, @@ -2258,9 +2248,33 @@ void nb_init(struct thread_master *tm, __func__, errors); exit(1); } +} +void nb_load_module(const struct frr_yang_module_info *module_info) +{ + struct yang_module *module; + + DEBUGD(&nb_dbg_events, "northbound: loading %s.yang", + module_info->name); + + module = yang_module_load(module_info->name); + yang_snodes_iterate(module->info, nb_node_new_cb, 0, NULL); + nb_load_callbacks(module_info); +} + +void nb_init(struct thread_master *tm, + const struct frr_yang_module_info *const modules[], + size_t nmodules, bool db_enabled) +{ nb_db_enabled = db_enabled; + /* Load YANG modules and their corresponding northbound callbacks. */ + for (size_t i = 0; i < nmodules; i++) + nb_load_module(modules[i]); + + /* Validate northbound callbacks. */ + nb_validate_callbacks(); + /* Create an empty running configuration. */ running_config = nb_config_new(NULL); running_config_entries = hash_create(running_config_entry_key_make, diff --git a/lib/northbound.h b/lib/northbound.h index 16f19b3d5b..3f6e4dc46e 100644 --- a/lib/northbound.h +++ b/lib/northbound.h @@ -1238,6 +1238,29 @@ extern const char *nb_err_name(enum nb_error error); extern const char *nb_client_name(enum nb_client client); /* + * Validate all northbound callbacks. + * + * Some errors, like missing callbacks or invalid priorities, are fatal and + * can't be recovered from. Other errors, like unneeded callbacks, are logged + * but otherwise ignored. + * + * Whenever a YANG module is loaded after startup, *all* northbound callbacks + * need to be validated and not only the callbacks from the newly loaded module. + * This is because augmentations can change the properties of the augmented + * module, making mandatory the implementation of additional callbacks. + */ +void nb_validate_callbacks(void); + +/* + * Load a YANG module with its corresponding northbound callbacks. + * + * module_info + * Pointer to structure containing the module name and its northbound + * callbacks. + */ +void nb_load_module(const struct frr_yang_module_info *module_info); + +/* * Initialize the northbound layer. Should be called only once during the * daemon initialization process. * diff --git a/lib/northbound_cli.c b/lib/northbound_cli.c index a7f3a1b305..7048df99fb 100644 --- a/lib/northbound_cli.c +++ b/lib/northbound_cli.c @@ -89,7 +89,7 @@ static int nb_cli_classic_commit(struct vty *vty) static void nb_cli_pending_commit_clear(struct vty *vty) { - THREAD_TIMER_OFF(vty->t_pending_commit); + THREAD_OFF(vty->t_pending_commit); vty->backoff_cmd_count = 0; XFREE(MTYPE_TMP, vty->pending_cmds_buf); vty->pending_cmds_buflen = 0; @@ -154,7 +154,7 @@ static int nb_cli_schedule_command(struct vty *vty) vty->pending_cmds_buflen); /* Schedule the commit operation. */ - THREAD_TIMER_OFF(vty->t_pending_commit); + THREAD_OFF(vty->t_pending_commit); thread_add_timer_msec(master, nb_cli_pending_commit_cb, vty, 100, &vty->t_pending_commit); @@ -312,7 +312,7 @@ int nb_cli_rpc(struct vty *vty, const char *xpath, struct list *input, void nb_cli_confirmed_commit_clean(struct vty *vty) { - THREAD_TIMER_OFF(vty->t_confirmed_commit_timeout); + thread_cancel(&vty->t_confirmed_commit_timeout); nb_config_free(vty->confirmed_commit_rollback); vty->confirmed_commit_rollback = NULL; } @@ -377,7 +377,7 @@ static int nb_cli_commit(struct vty *vty, bool force, "%% Resetting confirmed-commit timeout to %u minute(s)\n\n", confirmed_timeout); - THREAD_TIMER_OFF(vty->t_confirmed_commit_timeout); + thread_cancel(&vty->t_confirmed_commit_timeout); thread_add_timer(master, nb_cli_confirmed_commit_timeout, vty, confirmed_timeout * 60, diff --git a/lib/northbound_confd.c b/lib/northbound_confd.c index c1cb0fc11d..8acba9fd2b 100644 --- a/lib/northbound_confd.c +++ b/lib/northbound_confd.c @@ -550,6 +550,9 @@ static int frr_confd_init_cdb(void) continue; nb_node = snode->priv; + if (!nb_node) + continue; + DEBUGD(&nb_dbg_client_confd, "%s: subscribing to '%s'", __func__, nb_node->xpath); @@ -1189,7 +1192,7 @@ static int frr_confd_subscribe_state(const struct lys_node *snode, void *arg) struct nb_node *nb_node = snode->priv; struct confd_data_cbs *data_cbs = arg; - if (!CHECK_FLAG(snode->flags, LYS_CONFIG_R)) + if (!nb_node || !CHECK_FLAG(snode->flags, LYS_CONFIG_R)) return YANG_ITER_CONTINUE; /* We only need to subscribe to the root of the state subtrees. */ if (snode->parent && CHECK_FLAG(snode->parent->flags, LYS_CONFIG_R)) @@ -1276,7 +1279,7 @@ static int frr_confd_init_dp(const char *program_name) * Iterate over all loaded YANG modules and subscribe to the paths * referent to state data. */ - yang_snodes_iterate_all(frr_confd_subscribe_state, 0, &data_cbs); + yang_snodes_iterate(NULL, frr_confd_subscribe_state, 0, &data_cbs); /* Register notification stream. */ memset(&ncbs, 0, sizeof(ncbs)); @@ -1393,7 +1396,8 @@ static int frr_confd_calculate_snode_hash(const struct lys_node *snode, { struct nb_node *nb_node = snode->priv; - nb_node->confd_hash = confd_str2hash(snode->name); + if (nb_node) + nb_node->confd_hash = confd_str2hash(snode->name); return YANG_ITER_CONTINUE; } @@ -1426,7 +1430,7 @@ static int frr_confd_init(const char *program_name) goto error; } - yang_snodes_iterate_all(frr_confd_calculate_snode_hash, 0, NULL); + yang_snodes_iterate(NULL, frr_confd_calculate_snode_hash, 0, NULL); hook_register(nb_notification_send, frr_confd_notification_send); diff --git a/lib/northbound_sysrepo.c b/lib/northbound_sysrepo.c index 3cd310c5a7..c027f4de72 100644 --- a/lib/northbound_sysrepo.c +++ b/lib/northbound_sysrepo.c @@ -575,6 +575,8 @@ static int frr_sr_subscribe_state(const struct lys_node *snode, void *arg) return YANG_ITER_CONTINUE; nb_node = snode->priv; + if (!nb_node) + return YANG_ITER_CONTINUE; DEBUGD(&nb_dbg_client_sysrepo, "sysrepo: providing data to '%s'", nb_node->xpath); @@ -599,6 +601,8 @@ static int frr_sr_subscribe_rpc(const struct lys_node *snode, void *arg) return YANG_ITER_CONTINUE; nb_node = snode->priv; + if (!nb_node) + return YANG_ITER_CONTINUE; DEBUGD(&nb_dbg_client_sysrepo, "sysrepo: providing RPC to '%s'", nb_node->xpath); @@ -686,10 +690,10 @@ static int frr_sr_init(void) int event_pipe; frr_sr_subscribe_config(module); - yang_snodes_iterate_module(module->info, frr_sr_subscribe_state, - 0, module); - yang_snodes_iterate_module(module->info, frr_sr_subscribe_rpc, - 0, module); + yang_snodes_iterate(module->info, frr_sr_subscribe_state, 0, + module); + yang_snodes_iterate(module->info, frr_sr_subscribe_rpc, 0, + module); /* Watch subscriptions. */ ret = sr_get_event_pipe(module->sr_subscription, &event_pipe); diff --git a/lib/sockunion.c b/lib/sockunion.c index d77229797c..c999845659 100644 --- a/lib/sockunion.c +++ b/lib/sockunion.c @@ -587,15 +587,11 @@ static void __attribute__((unused)) sockunion_print(const union sockunion *su) switch (su->sa.sa_family) { case AF_INET: - printf("%s\n", inet_ntoa(su->sin.sin_addr)); + printf("%pI4\n", &su->sin.sin_addr); + break; + case AF_INET6: + printf("%pI6\n", &su->sin6.sin6_addr); break; - case AF_INET6: { - char buf[SU_ADDRSTRLEN]; - - printf("%s\n", inet_ntop(AF_INET6, &(su->sin6.sin6_addr), buf, - sizeof(buf))); - } break; - #ifdef AF_LINK case AF_LINK: { struct sockaddr_dl *sdl; diff --git a/lib/spf_backoff.c b/lib/spf_backoff.c index acb208e5e7..ac6dd29f06 100644 --- a/lib/spf_backoff.c +++ b/lib/spf_backoff.c @@ -110,8 +110,8 @@ void spf_backoff_free(struct spf_backoff *backoff) if (!backoff) return; - THREAD_TIMER_OFF(backoff->t_holddown); - THREAD_TIMER_OFF(backoff->t_timetolearn); + thread_cancel(&backoff->t_holddown); + thread_cancel(&backoff->t_timetolearn); XFREE(MTYPE_SPF_BACKOFF_NAME, backoff->name); XFREE(MTYPE_SPF_BACKOFF, backoff); @@ -121,7 +121,6 @@ static int spf_backoff_timetolearn_elapsed(struct thread *thread) { struct spf_backoff *backoff = THREAD_ARG(thread); - backoff->t_timetolearn = NULL; backoff->state = SPF_BACKOFF_LONG_WAIT; backoff_debug("SPF Back-off(%s) TIMETOLEARN elapsed, move to state %s", backoff->name, spf_backoff_state2str(backoff->state)); @@ -132,7 +131,7 @@ static int spf_backoff_holddown_elapsed(struct thread *thread) { struct spf_backoff *backoff = THREAD_ARG(thread); - THREAD_TIMER_OFF(backoff->t_timetolearn); + THREAD_OFF(backoff->t_timetolearn); timerclear(&backoff->first_event_time); backoff->state = SPF_BACKOFF_QUIET; backoff_debug("SPF Back-off(%s) HOLDDOWN elapsed, move to state %s", @@ -166,7 +165,7 @@ long spf_backoff_schedule(struct spf_backoff *backoff) break; case SPF_BACKOFF_SHORT_WAIT: case SPF_BACKOFF_LONG_WAIT: - THREAD_TIMER_OFF(backoff->t_holddown); + thread_cancel(&backoff->t_holddown); thread_add_timer_msec(backoff->m, spf_backoff_holddown_elapsed, backoff, backoff->holddown, &backoff->t_holddown); diff --git a/lib/subdir.am b/lib/subdir.am index 55f127b019..ed3c30799d 100644 --- a/lib/subdir.am +++ b/lib/subdir.am @@ -3,7 +3,7 @@ # lib_LTLIBRARIES += lib/libfrr.la lib_libfrr_la_LDFLAGS = -version-info 0:0:0 -Xlinker -e_libfrr_version -lib_libfrr_la_LIBADD = $(LIBCAP) $(UNWIND_LIBS) $(LIBYANG_LIBS) $(LUA_LIB) $(LIBM) +lib_libfrr_la_LIBADD = $(LIBCAP) $(UNWIND_LIBS) $(LIBYANG_LIBS) $(LUA_LIB) $(UST_LIBS) $(LIBM) lib_libfrr_la_SOURCES = \ lib/agg_table.c \ @@ -46,6 +46,7 @@ lib_libfrr_la_SOURCES = \ lib/lib_errors.c \ lib/lib_vty.c \ lib/libfrr.c \ + lib/libfrr_trace.c \ lib/linklist.c \ lib/log.c \ lib/log_filter.c \ @@ -204,6 +205,7 @@ pkginclude_HEADERS += \ lib/lib_errors.h \ lib/lib_vty.h \ lib/libfrr.h \ + lib/libfrr_trace.h \ lib/libospf.h \ lib/linklist.h \ lib/log.h \ @@ -251,6 +253,7 @@ pkginclude_HEADERS += \ lib/table.h \ lib/termtable.h \ lib/thread.h \ + lib/trace.h \ lib/typerb.h \ lib/typesafe.h \ lib/vector.h \ @@ -401,7 +404,7 @@ lib_grammar_sandbox_LDADD = \ lib_clippy_CPPFLAGS = $(AM_CPPFLAGS) -D_GNU_SOURCE -DBUILDING_CLIPPY lib_clippy_CFLAGS = $(PYTHON_CFLAGS) -lib_clippy_LDADD = $(PYTHON_LIBS) +lib_clippy_LDADD = $(PYTHON_LIBS) $(UST_LIBS) lib_clippy_LDFLAGS = -export-dynamic lib_clippy_SOURCES = \ lib/clippy.c \ @@ -411,6 +414,7 @@ lib_clippy_SOURCES = \ lib/command_py.c \ lib/defun_lex.l \ lib/graph.c \ + lib/libfrr_trace.c \ lib/memory.c \ lib/vector.c \ # end diff --git a/lib/table.c b/lib/table.c index b315637f19..89e32182b5 100644 --- a/lib/table.c +++ b/lib/table.c @@ -27,6 +27,7 @@ #include "table.h" #include "memory.h" #include "sockunion.h" +#include "libfrr_trace.h" DEFINE_MTYPE_STATIC(LIB, ROUTE_TABLE, "Route table") DEFINE_MTYPE(LIB, ROUTE_NODE, "Route node") @@ -276,6 +277,12 @@ struct route_node *route_node_lookup_maynull(struct route_table *table, struct route_node *route_node_get(struct route_table *table, union prefixconstptr pu) { + if (frrtrace_enabled(frr_libfrr, route_node_get)) { + char buf[PREFIX2STR_BUFFER]; + prefix2str(pu, buf, sizeof(buf)); + frrtrace(2, frr_libfrr, route_node_get, table, buf); + } + struct route_node search; struct prefix *p = &search.p; diff --git a/lib/thread.c b/lib/thread.c index db35a3f031..1765de9573 100644 --- a/lib/thread.c +++ b/lib/thread.c @@ -35,6 +35,7 @@ #include "frratomic.h" #include "frr_pthread.h" #include "lib_errors.h" +#include "libfrr_trace.h" DEFINE_MTYPE_STATIC(LIB, THREAD, "Thread") DEFINE_MTYPE_STATIC(LIB, THREAD_MASTER, "Thread master") @@ -787,6 +788,13 @@ struct thread *funcname_thread_add_read_write(int dir, struct thread_master *m, struct thread *thread = NULL; struct thread **thread_array; + if (dir == THREAD_READ) + frrtrace(9, frr_libfrr, schedule_read, m, funcname, schedfrom, + fromln, t_ptr, fd, 0, arg, 0); + else + frrtrace(9, frr_libfrr, schedule_write, m, funcname, schedfrom, + fromln, t_ptr, fd, 0, arg, 0); + assert(fd >= 0 && fd < m->fd_limit); frr_with_mutex(&m->mtx) { if (t_ptr && *t_ptr) @@ -861,6 +869,9 @@ funcname_thread_add_timer_timeval(struct thread_master *m, assert(type == THREAD_TIMER); assert(time_relative); + frrtrace(9, frr_libfrr, schedule_timer, m, funcname, schedfrom, fromln, + t_ptr, 0, 0, arg, (long)time_relative->tv_sec); + frr_with_mutex(&m->mtx) { if (t_ptr && *t_ptr) /* thread is already scheduled; don't reschedule */ @@ -939,6 +950,9 @@ struct thread *funcname_thread_add_event(struct thread_master *m, { struct thread *thread = NULL; + frrtrace(9, frr_libfrr, schedule_event, m, funcname, schedfrom, fromln, + t_ptr, 0, val, arg, 0); + assert(m != NULL); frr_with_mutex(&m->mtx) { @@ -1163,19 +1177,30 @@ void thread_cancel_event(struct thread_master *master, void *arg) * * @param thread task to cancel */ -void thread_cancel(struct thread *thread) +void thread_cancel(struct thread **thread) { - struct thread_master *master = thread->master; + struct thread_master *master; + + if (thread == NULL || *thread == NULL) + return; + + master = (*thread)->master; + + frrtrace(9, frr_libfrr, thread_cancel, master, thread->funcname, + thread->schedfrom, thread->schedfrom_line, NULL, thread->u.fd, + thread->u.val, thread->arg, thread->u.sands.tv_sec); assert(master->owner == pthread_self()); frr_with_mutex(&master->mtx) { struct cancel_req *cr = XCALLOC(MTYPE_TMP, sizeof(struct cancel_req)); - cr->thread = thread; + cr->thread = *thread; listnode_add(master->cancel_req, cr); do_thread_cancel(master); } + + *thread = NULL; } /** @@ -1206,6 +1231,17 @@ void thread_cancel_async(struct thread_master *master, struct thread **thread, void *eventobj) { assert(!(thread && eventobj) && (thread || eventobj)); + + if (thread && *thread) + frrtrace(9, frr_libfrr, thread_cancel_async, master, + (*thread)->funcname, (*thread)->schedfrom, + (*thread)->schedfrom_line, NULL, (*thread)->u.fd, + (*thread)->u.val, (*thread)->arg, + (*thread)->u.sands.tv_sec); + else + frrtrace(9, frr_libfrr, thread_cancel_async, master, NULL, NULL, + 0, NULL, 0, 0, eventobj, 0); + assert(master->owner != pthread_self()); frr_with_mutex(&master->mtx) { @@ -1227,6 +1263,9 @@ void thread_cancel_async(struct thread_master *master, struct thread **thread, while (!master->canceled) pthread_cond_wait(&master->cancel_cond, &master->mtx); } + + if (thread) + *thread = NULL; } /* ------------------------------------------------------------------------- */ @@ -1581,6 +1620,10 @@ void thread_call(struct thread *thread) GETRUSAGE(&before); thread->real = before.real; + frrtrace(9, frr_libfrr, thread_call, thread->master, thread->funcname, + thread->schedfrom, thread->schedfrom_line, NULL, thread->u.fd, + thread->u.val, thread->arg, thread->u.sands.tv_sec); + pthread_setspecific(thread_current, thread); (*thread->func)(thread); pthread_setspecific(thread_current, NULL); diff --git a/lib/thread.h b/lib/thread.h index c22b2105cd..e2b7763c51 100644 --- a/lib/thread.h +++ b/lib/thread.h @@ -147,18 +147,15 @@ struct cpu_thread_history { #define THREAD_FD(X) ((X)->u.fd) #define THREAD_VAL(X) ((X)->u.val) -#define THREAD_OFF(thread) \ - do { \ - if (thread) { \ - thread_cancel(thread); \ - thread = NULL; \ - } \ +/* + * Please consider this macro deprecated, and do not use it in new code. + */ +#define THREAD_OFF(thread) \ + do { \ + if ((thread)) \ + thread_cancel(&(thread)); \ } while (0) -#define THREAD_READ_OFF(thread) THREAD_OFF(thread) -#define THREAD_WRITE_OFF(thread) THREAD_OFF(thread) -#define THREAD_TIMER_OFF(thread) THREAD_OFF(thread) - #define debugargdef const char *funcname, const char *schedfrom, int fromln #define thread_add_read(m,f,a,v,t) funcname_thread_add_read_write(THREAD_READ,m,f,a,v,t,#f,__FILE__,__LINE__) @@ -207,7 +204,7 @@ extern void funcname_thread_execute(struct thread_master *, debugargdef); #undef debugargdef -extern void thread_cancel(struct thread *); +extern void thread_cancel(struct thread **event); extern void thread_cancel_async(struct thread_master *, struct thread **, void *); extern void thread_cancel_event(struct thread_master *, void *); diff --git a/lib/trace.h b/lib/trace.h new file mode 100644 index 0000000000..73fc10a556 --- /dev/null +++ b/lib/trace.h @@ -0,0 +1,80 @@ +/* Tracing macros + * + * Wraps tracepoint macros for different tracing systems to allow switching + * between them at compile time. + * + * This should not be included directly by source files wishing to provide + * tracepoints. Instead, write a header that defines LTTng tracepoints and + * which includes this header, and include your new header in your source. USDT + * probes do not need tracepoint definitions, but are less capable than LTTng + * tracepoints. + * + * Copyright (C) 2020 NVIDIA Corporation + * Quentin Young + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the Free + * Software Foundation; either version 2 of the License, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; see the file COPYING; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef _TRACE_H_ +#define _TRACE_H_ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif /* HAVE_CONFIG_H */ + +/* + * Provided here: + * - frrtrace(n, provider, name, ...args...) + * - frrtrace_enabled(provider, name) + * - frrtracelog(level, msg, ...) + * + * Use frrtrace() to define tracepoints. n is the number of arguments; this is + * needed because USDT probe definitions use DTRACE_PROBEn macros, so the + * number of args must be passed in order to expand the correct macro. + * + * frrtrace_enabled() maps to tracepoint_enabled() under LTTng and is always + * true when using USDT. In the future it could be mapped to USDT semaphores + * but this is not implemented at present. + * + * frrtracelog() maps to tracelog() under LTTng and should only be used in zlog + * core code, to propagate zlog messages to LTTng. It expands to nothing + * otherwise. + */ + +#if defined(HAVE_LTTNG) + +#define frrtrace(nargs, provider, name, ...) \ + tracepoint(provider, name, ## __VA_ARGS__) +#define frrtrace_enabled(...) tracepoint_enabled(__VA_ARGS__) +#define frrtracelog(...) tracelog(__VA_ARGS__) + +#elif defined(HAVE_USDT) + +#include "sys/sdt.h" + +#define frrtrace(nargs, provider, name, ...) \ + DTRACE_PROBE##nargs(provider, name, ## __VA_ARGS__) +#define frrtrace_enabled(...) true +#define frrtracelog(...) + +#else + +#define frrtrace(nargs, provider, name, ...) (void)0 +#define frrtrace_enabled(...) false +#define frrtracelog(...) (void)0 + +#endif + +#endif /* _TRACE_H_ */ diff --git a/lib/workqueue.c b/lib/workqueue.c index 54090d0d0f..f8e4677220 100644 --- a/lib/workqueue.c +++ b/lib/workqueue.c @@ -104,7 +104,7 @@ void work_queue_free_and_null(struct work_queue **wqp) struct work_queue *wq = *wqp; if (wq->thread != NULL) - thread_cancel(wq->thread); + thread_cancel(&(wq->thread)); while (!work_queue_empty(wq)) { struct work_queue_item *item = work_queue_last_item(wq); @@ -215,7 +215,7 @@ void workqueue_cmd_init(void) void work_queue_plug(struct work_queue *wq) { if (wq->thread) - thread_cancel(wq->thread); + thread_cancel(&(wq->thread)); wq->thread = NULL; diff --git a/lib/yang.c b/lib/yang.c index 5bf7758e18..c59cb642f0 100644 --- a/lib/yang.c +++ b/lib/yang.c @@ -227,40 +227,22 @@ next: return ret; } -int yang_snodes_iterate_module(const struct lys_module *module, - yang_iterate_cb cb, uint16_t flags, void *arg) +int yang_snodes_iterate(const struct lys_module *module, yang_iterate_cb cb, + uint16_t flags, void *arg) { - struct lys_node *snode; - int ret = YANG_ITER_CONTINUE; - - LY_TREE_FOR (module->data, snode) { - ret = yang_snodes_iterate_subtree(snode, module, cb, flags, - arg); - if (ret == YANG_ITER_STOP) - return ret; - } - - for (uint8_t i = 0; i < module->augment_size; i++) { - ret = yang_snodes_iterate_subtree( - (const struct lys_node *)&module->augment[i], module, - cb, flags, arg); - if (ret == YANG_ITER_STOP) - return ret; - } - - return ret; -} - -int yang_snodes_iterate_all(yang_iterate_cb cb, uint16_t flags, void *arg) -{ - struct yang_module *module; + const struct lys_module *module_iter; + uint32_t idx = 0; int ret = YANG_ITER_CONTINUE; - RB_FOREACH (module, yang_modules, &yang_modules) { + idx = ly_ctx_internal_modules_count(ly_native_ctx); + while ((module_iter = ly_ctx_get_module_iter(ly_native_ctx, &idx))) { struct lys_node *snode; - LY_TREE_FOR (module->info->data, snode) { - ret = yang_snodes_iterate_subtree(snode, NULL, cb, + if (!module_iter->implemented) + continue; + + LY_TREE_FOR (module_iter->data, snode) { + ret = yang_snodes_iterate_subtree(snode, module, cb, flags, arg); if (ret == YANG_ITER_STOP) return ret; diff --git a/lib/yang.h b/lib/yang.h index 867ade9676..0cd6a4a6f2 100644 --- a/lib/yang.h +++ b/lib/yang.h @@ -186,29 +186,11 @@ extern int yang_snodes_iterate_subtree(const struct lys_node *snode, void *arg); /* - * Iterate over all libyang schema nodes from the given YANG module. + * Iterate over all libyang schema nodes from all loeaded modules of from the + * given YANG module. * * module - * YANG module to operate on. - * - * cb - * Function to call with each schema node. - * - * flags - * YANG_ITER_* flags to control how the iteration is performed. - * - * arg - * Arbitrary argument passed as the second parameter in each call to 'cb'. - * - * Returns: - * The return value of the last called callback. - */ -extern int yang_snodes_iterate_module(const struct lys_module *module, - yang_iterate_cb cb, uint16_t flags, - void *arg); - -/* - * Iterate over all libyang schema nodes from all loaded YANG modules. + * When set, iterate over all nodes of the specified module only. * * cb * Function to call with each schema node. @@ -222,8 +204,8 @@ extern int yang_snodes_iterate_module(const struct lys_module *module, * Returns: * The return value of the last called callback. */ -extern int yang_snodes_iterate_all(yang_iterate_cb cb, uint16_t flags, - void *arg); +extern int yang_snodes_iterate(const struct lys_module *module, + yang_iterate_cb cb, uint16_t flags, void *arg); /* * Build schema path or data path of the schema node. diff --git a/lib/yang_translator.c b/lib/yang_translator.c index 7dbb1f3f1a..1f64675d6a 100644 --- a/lib/yang_translator.c +++ b/lib/yang_translator.c @@ -469,12 +469,12 @@ static unsigned int yang_translator_validate(struct yang_translator *translator) args.errors = 0; for (ALL_LIST_ELEMENTS_RO(translator->modules, ln, tmodule)) { - yang_snodes_iterate_module( - tmodule->module, yang_translator_validate_cb, - YANG_ITER_FILTER_NPCONTAINERS - | YANG_ITER_FILTER_LIST_KEYS - | YANG_ITER_FILTER_INPUT_OUTPUT, - &args); + yang_snodes_iterate(tmodule->module, + yang_translator_validate_cb, + YANG_ITER_FILTER_NPCONTAINERS + | YANG_ITER_FILTER_LIST_KEYS + | YANG_ITER_FILTER_INPUT_OUTPUT, + &args); } if (args.errors) @@ -500,11 +500,11 @@ static unsigned int yang_module_nodes_count(const struct lys_module *module) { unsigned int total = 0; - yang_snodes_iterate_module(module, yang_module_nodes_count_cb, - YANG_ITER_FILTER_NPCONTAINERS - | YANG_ITER_FILTER_LIST_KEYS - | YANG_ITER_FILTER_INPUT_OUTPUT, - &total); + yang_snodes_iterate(module, yang_module_nodes_count_cb, + YANG_ITER_FILTER_NPCONTAINERS + | YANG_ITER_FILTER_LIST_KEYS + | YANG_ITER_FILTER_INPUT_OUTPUT, + &total); return total; } diff --git a/lib/zassert.h b/lib/zassert.h index e50a88f407..e6b254ee8d 100644 --- a/lib/zassert.h +++ b/lib/zassert.h @@ -27,6 +27,8 @@ extern void _zlog_assert_failed(const char *assertion, const char *file, unsigned int line, const char *function) __attribute__((noreturn)); +#undef __ASSERT_FUNCTION + #if defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L #define __ASSERT_FUNCTION __func__ #elif defined(__GNUC__) diff --git a/lib/zlog.c b/lib/zlog.c index 8dfd20371b..e77feec5f2 100644 --- a/lib/zlog.c +++ b/lib/zlog.c @@ -52,6 +52,7 @@ #include "printfrr.h" #include "frrcu.h" #include "zlog.h" +#include "libfrr_trace.h" DEFINE_MTYPE_STATIC(LIB, LOG_MESSAGE, "log message") DEFINE_MTYPE_STATIC(LIB, LOG_TLSBUF, "log thread-local buffer") @@ -450,6 +451,34 @@ void vzlog(int prio, const char *fmt, va_list ap) { struct zlog_tls *zlog_tls = zlog_tls_get(); +#ifdef HAVE_LTTNG + va_list copy; + va_copy(copy, ap); + char *msg = vasprintfrr(MTYPE_LOG_MESSAGE, fmt, copy); + + switch (prio) { + case LOG_ERR: + frrtracelog(TRACE_ERR, msg); + break; + case LOG_WARNING: + frrtracelog(TRACE_WARNING, msg); + break; + case LOG_DEBUG: + frrtracelog(TRACE_DEBUG, msg); + break; + case LOG_NOTICE: + frrtracelog(TRACE_DEBUG, msg); + break; + case LOG_INFO: + default: + frrtracelog(TRACE_INFO, msg); + break; + } + + va_end(copy); + XFREE(MTYPE_LOG_MESSAGE, msg); +#endif + if (zlog_tls) vzlog_tls(zlog_tls, prio, fmt, ap); else diff --git a/nhrpd/netlink_arp.c b/nhrpd/netlink_arp.c index cf338a0876..309f733526 100644 --- a/nhrpd/netlink_arp.c +++ b/nhrpd/netlink_arp.c @@ -257,7 +257,7 @@ static int netlink_log_recv(struct thread *t) void netlink_set_nflog_group(int nlgroup) { if (netlink_log_fd >= 0) { - THREAD_OFF(netlink_log_thread); + thread_cancel(&netlink_log_thread); close(netlink_log_fd); netlink_log_fd = -1; } diff --git a/nhrpd/nhrp_nhs.c b/nhrpd/nhrp_nhs.c index 8509cedcee..085cab347f 100644 --- a/nhrpd/nhrp_nhs.c +++ b/nhrpd/nhrp_nhs.c @@ -137,7 +137,7 @@ static void nhrp_reg_peer_notify(struct notifier_block *n, unsigned long cmd) debugf(NHRP_DEBUG_COMMON, "NHS: Flush timer for %s", sockunion2str(&r->peer->vc->remote.nbma, buf, sizeof(buf))); - THREAD_TIMER_OFF(r->t_register); + THREAD_OFF(r->t_register); thread_add_timer_msec(master, nhrp_reg_send_req, r, 10, &r->t_register); break; diff --git a/ospfclient/ospfclient.c b/ospfclient/ospfclient.c index f5f994517e..3ca1e132bd 100644 --- a/ospfclient/ospfclient.c +++ b/ospfclient/ospfclient.c @@ -30,6 +30,7 @@ #include "prefix.h" /* needed by ospf_asbr.h */ #include "privs.h" #include "log.h" +#include "lib/printfrr.h" /* work around gcc bug 69981, disable MTYPEs in libospf */ #define _QUAGGA_OSPF_MEMORY_H @@ -186,8 +187,8 @@ static void lsa_update_callback(struct in_addr ifaddr, struct in_addr area_id, struct lsa_header *lsa) { printf("lsa_update_callback: "); - printf("ifaddr: %s ", inet_ntoa(ifaddr)); - printf("area: %s\n", inet_ntoa(area_id)); + printfrr("ifaddr: %pI4 ", &ifaddr); + printfrr("area: %pI4\n", &area_id); printf("is_self_origin: %u\n", is_self_originated); /* It is important to note that lsa_header does indeed include the @@ -211,8 +212,8 @@ static void lsa_delete_callback(struct in_addr ifaddr, struct in_addr area_id, struct lsa_header *lsa) { printf("lsa_delete_callback: "); - printf("ifaddr: %s ", inet_ntoa(ifaddr)); - printf("area: %s\n", inet_ntoa(area_id)); + printf("ifaddr: %pI4 ", &ifaddr); + printf("area: %pI4\n", &area_id); printf("is_self_origin: %u\n", is_self_originated); ospf_lsa_header_dump(lsa); @@ -221,8 +222,8 @@ static void lsa_delete_callback(struct in_addr ifaddr, struct in_addr area_id, static void ready_callback(uint8_t lsa_type, uint8_t opaque_type, struct in_addr addr) { - printf("ready_callback: lsa_type: %d opaque_type: %d addr=%s\n", - lsa_type, opaque_type, inet_ntoa(addr)); + printfrr("ready_callback: lsa_type: %d opaque_type: %d addr=%pI4\n", + lsa_type, opaque_type, &addr); /* Schedule opaque LSA originate in 5 secs */ thread_add_timer(master, lsa_inject, oclient, 5, NULL); @@ -236,20 +237,20 @@ static void ready_callback(uint8_t lsa_type, uint8_t opaque_type, static void new_if_callback(struct in_addr ifaddr, struct in_addr area_id) { - printf("new_if_callback: ifaddr: %s ", inet_ntoa(ifaddr)); - printf("area_id: %s\n", inet_ntoa(area_id)); + printfrr("new_if_callback: ifaddr: %pI4 ", &ifaddr); + printfrr("area_id: %pI4\n", &area_id); } static void del_if_callback(struct in_addr ifaddr) { - printf("new_if_callback: ifaddr: %s\n ", inet_ntoa(ifaddr)); + printfrr("new_if_callback: ifaddr: %pI4\n ", &ifaddr); } static void ism_change_callback(struct in_addr ifaddr, struct in_addr area_id, uint8_t state) { - printf("ism_change: ifaddr: %s ", inet_ntoa(ifaddr)); - printf("area_id: %s\n", inet_ntoa(area_id)); + printfrr("ism_change: ifaddr: %pI4 ", &ifaddr); + printfrr("area_id: %pI4\n", &area_id); printf("state: %d [%s]\n", state, lookup_msg(ospf_ism_state_msg, state, NULL)); } @@ -257,9 +258,9 @@ static void ism_change_callback(struct in_addr ifaddr, struct in_addr area_id, static void nsm_change_callback(struct in_addr ifaddr, struct in_addr nbraddr, struct in_addr router_id, uint8_t state) { - printf("nsm_change: ifaddr: %s ", inet_ntoa(ifaddr)); - printf("nbraddr: %s\n", inet_ntoa(nbraddr)); - printf("router_id: %s\n", inet_ntoa(router_id)); + printfrr("nsm_change: ifaddr: %pI4 ", &ifaddr); + printfrr("nbraddr: %pI4\n", &nbraddr); + printfrr("router_id: %pI4\n", &router_id); printf("state: %d [%s]\n", state, lookup_msg(ospf_nsm_state_msg, state, NULL)); } diff --git a/ospfd/ospf_abr.c b/ospfd/ospf_abr.c index 28afee31a3..634418ec5a 100644 --- a/ospfd/ospf_abr.c +++ b/ospfd/ospf_abr.c @@ -331,6 +331,7 @@ static int ospf_abr_nssa_am_elected(struct ospf_area *area) struct ospf_lsa *lsa; struct router_lsa *rlsa; struct in_addr *best = NULL; + char buf[PREFIX_STRLEN]; LSDB_LOOP (ROUTER_LSDB(area), rn, lsa) { /* sanity checks */ @@ -348,8 +349,8 @@ static int ospf_abr_nssa_am_elected(struct ospf_area *area) if (IS_ROUTER_LSA_NT(rlsa)) { if (IS_DEBUG_OSPF_NSSA) zlog_debug( - "ospf_abr_nssa_am_elected: router %s asserts Nt", - inet_ntoa(lsa->data->id)); + "ospf_abr_nssa_am_elected: router %pI4 asserts Nt", + &lsa->data->id); return 0; } @@ -363,7 +364,8 @@ static int ospf_abr_nssa_am_elected(struct ospf_area *area) if (IS_DEBUG_OSPF_NSSA) zlog_debug( "ospf_abr_nssa_am_elected: best electable ABR is: %s", - (best) ? inet_ntoa(*best) : "<none>"); + (best) ? inet_ntop(AF_INET, best, buf, sizeof(buf)) : + "<none>"); if (best == NULL) return 1; @@ -390,8 +392,8 @@ static void ospf_abr_nssa_check_status(struct ospf *ospf) if (IS_DEBUG_OSPF(nssa, NSSA)) zlog_debug( - "ospf_abr_nssa_check_status: checking area %s", - inet_ntoa(area->area_id)); + "ospf_abr_nssa_check_status: checking area %pI4", + &area->area_id); if (!IS_OSPF_ABR(area->ospf)) { if (IS_DEBUG_OSPF(nssa, NSSA)) @@ -615,15 +617,15 @@ static int ospf_abr_translate_nssa(struct ospf_area *area, struct ospf_lsa *lsa) if (!CHECK_FLAG(lsa->data->options, OSPF_OPTION_NP)) { if (IS_DEBUG_OSPF_NSSA) zlog_debug( - "ospf_abr_translate_nssa(): LSA Id %s, P-bit off, NO Translation", - inet_ntoa(lsa->data->id)); + "ospf_abr_translate_nssa(): LSA Id %pI4, P-bit off, NO Translation", + &lsa->data->id); return 1; } if (IS_DEBUG_OSPF_NSSA) zlog_debug( - "ospf_abr_translate_nssa(): LSA Id %s, TRANSLATING 7 to 5", - inet_ntoa(lsa->data->id)); + "ospf_abr_translate_nssa(): LSA Id %pI4, TRANSLATING 7 to 5", + &lsa->data->id); ext7 = (struct as_external_lsa *)(lsa->data); p.prefix = lsa->data->id; @@ -632,8 +634,8 @@ static int ospf_abr_translate_nssa(struct ospf_area *area, struct ospf_lsa *lsa) if (ext7->e[0].fwd_addr.s_addr == OSPF_DEFAULT_DESTINATION) { if (IS_DEBUG_OSPF_NSSA) zlog_debug( - "ospf_abr_translate_nssa(): LSA Id %s, Forward address is 0, NO Translation", - inet_ntoa(lsa->data->id)); + "ospf_abr_translate_nssa(): LSA Id %pI4, Forward address is 0, NO Translation", + &lsa->data->id); return 1; } @@ -646,8 +648,8 @@ static int ospf_abr_translate_nssa(struct ospf_area *area, struct ospf_lsa *lsa) UNSET_FLAG(old->flags, OSPF_LSA_APPROVED); if (IS_DEBUG_OSPF_NSSA) zlog_debug( - "ospf_abr_translate_nssa(): remove old translated LSA id %s", - inet_ntoa(old->data->id)); + "ospf_abr_translate_nssa(): remove old translated LSA id %pI4", + &old->data->id); } /* if type-7 is removed and type-5 does not exist, do not * originate */ @@ -657,16 +659,16 @@ static int ospf_abr_translate_nssa(struct ospf_area *area, struct ospf_lsa *lsa) if (old && CHECK_FLAG(old->flags, OSPF_LSA_APPROVED)) { if (IS_DEBUG_OSPF_NSSA) zlog_debug( - "ospf_abr_translate_nssa(): found old translated LSA Id %s, refreshing", - inet_ntoa(old->data->id)); + "ospf_abr_translate_nssa(): found old translated LSA Id %pI4, refreshing", + &old->data->id); /* refresh */ new = ospf_translated_nssa_refresh(area->ospf, lsa, old); if (!new) { if (IS_DEBUG_OSPF_NSSA) zlog_debug( - "ospf_abr_translate_nssa(): could not refresh translated LSA Id %s", - inet_ntoa(old->data->id)); + "ospf_abr_translate_nssa(): could not refresh translated LSA Id %pI4", + &old->data->id); } } else { /* no existing external route for this LSA Id @@ -676,8 +678,8 @@ static int ospf_abr_translate_nssa(struct ospf_area *area, struct ospf_lsa *lsa) if (ospf_translated_nssa_originate(area->ospf, lsa) == NULL) { if (IS_DEBUG_OSPF_NSSA) zlog_debug( - "ospf_abr_translate_nssa(): Could not translate Type-7 for %s to Type-5", - inet_ntoa(lsa->data->id)); + "ospf_abr_translate_nssa(): Could not translate Type-7 for %pI4 to Type-5", + &lsa->data->id); return 1; } } @@ -741,9 +743,9 @@ void ospf_abr_announce_network_to_area(struct prefix_ipv4 *p, uint32_t cost, if (!lsa) { flog_warn(EC_OSPF_LSA_MISSING, - "%s: Could not refresh %pFX to %s", + "%s: Could not refresh %pFX to %pI4", __func__, (struct prefix *)p, - inet_ntoa(area->area_id)); + &area->area_id); return; } @@ -759,9 +761,9 @@ void ospf_abr_announce_network_to_area(struct prefix_ipv4 *p, uint32_t cost, if (!lsa) { flog_warn(EC_OSPF_LSA_MISSING, - "%s: Could not originate %pFX to %s", + "%s: Could not originate %pFX to %pi4", __func__, (struct prefix *)p, - inet_ntoa(area->area_id)); + &area->area_id); return; } @@ -854,8 +856,8 @@ static void ospf_abr_announce_network(struct ospf *ospf, struct prefix_ipv4 *p, for (ALL_LIST_ELEMENTS_RO(ospf->areas, node, area)) { if (IS_DEBUG_OSPF_EVENT) zlog_debug( - "ospf_abr_announce_network(): looking at area %s", - inet_ntoa(area->area_id)); + "ospf_abr_announce_network(): looking at area %pI4", + &area->area_id); if (IPV4_ADDR_SAME(& or->u.std.area_id, &area->area_id)) continue; @@ -883,8 +885,8 @@ static void ospf_abr_announce_network(struct ospf *ospf, struct prefix_ipv4 *p, && area->no_summary) { if (IS_DEBUG_OSPF_EVENT) zlog_debug( - "ospf_abr_announce_network(): area %s is stub and no_summary", - inet_ntoa(area->area_id)); + "ospf_abr_announce_network(): area %pI4 is stub and no_summary", + &area->area_id); continue; } @@ -962,8 +964,8 @@ static void ospf_abr_process_nssa_translates(struct ospf *ospf) if (IS_DEBUG_OSPF_NSSA) zlog_debug( - "ospf_abr_process_nssa_translates(): looking at area %s", - inet_ntoa(area->area_id)); + "ospf_abr_process_nssa_translates(): looking at area %pI4", + &area->area_id); LSDB_LOOP (NSSA_LSDB(area), rn, lsa) ospf_abr_translate_nssa(area, lsa); @@ -991,15 +993,15 @@ static void ospf_abr_process_network_rt(struct ospf *ospf, or->u.std.area_id))) { if (IS_DEBUG_OSPF_EVENT) zlog_debug( - "ospf_abr_process_network_rt(): area %s no longer exists", - inet_ntoa(or->u.std.area_id)); + "ospf_abr_process_network_rt(): area %pI4 no longer exists", + &or->u.std.area_id); continue; } if (IS_DEBUG_OSPF_EVENT) zlog_debug( - "ospf_abr_process_network_rt(): this is a route to %s/%d", - inet_ntoa(rn->p.u.prefix4), rn->p.prefixlen); + "ospf_abr_process_network_rt(): this is a route to %pFX", + &rn->p); if (or->path_type >= OSPF_PATH_TYPE1_EXTERNAL) { if (IS_DEBUG_OSPF_EVENT) zlog_debug( @@ -1113,9 +1115,9 @@ static void ospf_abr_announce_rtr_to_area(struct prefix_ipv4 *p, uint32_t cost, lsa = ospf_summary_asbr_lsa_originate(p, cost, area); if (!lsa) { flog_warn(EC_OSPF_LSA_MISSING, - "%s: Could not refresh/originate %pFX to %s", + "%s: Could not refresh/originate %pFX to %pI4", __func__, (struct prefix *)p, - inet_ntoa(area->area_id)); + &area->area_id); return; } @@ -1149,8 +1151,8 @@ static void ospf_abr_announce_rtr(struct ospf *ospf, struct prefix_ipv4 *p, for (ALL_LIST_ELEMENTS_RO(ospf->areas, node, area)) { if (IS_DEBUG_OSPF_EVENT) zlog_debug( - "ospf_abr_announce_rtr(): looking at area %s", - inet_ntoa(area->area_id)); + "ospf_abr_announce_rtr(): looking at area %pI4", + &area->area_id); if (IPV4_ADDR_SAME(& or->u.std.area_id, &area->area_id)) continue; @@ -1162,24 +1164,24 @@ static void ospf_abr_announce_rtr(struct ospf *ospf, struct prefix_ipv4 *p, if (or->u.std.external_routing == OSPF_AREA_NSSA) { if (IS_DEBUG_OSPF_EVENT) zlog_debug( - "ospf_abr_announce_rtr(): do not generate LSA Type-4 %s from NSSA", - inet_ntoa(p->prefix)); + "ospf_abr_announce_rtr(): do not generate LSA Type-4 %pI4 from NSSA", + &p->prefix); continue; } if (area->external_routing != OSPF_AREA_DEFAULT) { if (IS_DEBUG_OSPF_EVENT) zlog_debug( - "ospf_abr_announce_rtr(): area %s doesn't support external routing", - inet_ntoa(area->area_id)); + "ospf_abr_announce_rtr(): area %pI4 doesn't support external routing", + &area->area_id); continue; } if (or->path_type == OSPF_PATH_INTER_AREA) { if (IS_DEBUG_OSPF_EVENT) zlog_debug( - "ospf_abr_announce_rtr(): this is inter-area route to %s", - inet_ntoa(p->prefix)); + "ospf_abr_announce_rtr(): this is inter-area route to %pI4", + &p->prefix); if (!OSPF_IS_AREA_BACKBONE(area)) ospf_abr_announce_rtr_to_area(p, or->cost, area); @@ -1188,8 +1190,8 @@ static void ospf_abr_announce_rtr(struct ospf *ospf, struct prefix_ipv4 *p, if (or->path_type == OSPF_PATH_INTRA_AREA) { if (IS_DEBUG_OSPF_EVENT) zlog_debug( - "ospf_abr_announce_rtr(): this is intra-area route to %s", - inet_ntoa(p->prefix)); + "ospf_abr_announce_rtr(): this is intra-area route to %pI4", + &p->prefix); ospf_abr_announce_rtr_to_area(p, or->cost, area); } } @@ -1220,16 +1222,16 @@ static void ospf_abr_process_router_rt(struct ospf *ospf, if (IS_DEBUG_OSPF_EVENT) zlog_debug( - "ospf_abr_process_router_rt(): this is a route to %s", - inet_ntoa(rn->p.u.prefix4)); + "ospf_abr_process_router_rt(): this is a route to %pI4", + &rn->p.u.prefix4); for (ALL_LIST_ELEMENTS(l, node, nnode, or)) { if (!ospf_area_lookup_by_area_id(ospf, or->u.std.area_id)) { if (IS_DEBUG_OSPF_EVENT) zlog_debug( - "ospf_abr_process_router_rt(): area %s no longer exists", - inet_ntoa(or->u.std.area_id)); + "ospf_abr_process_router_rt(): area %pI4 no longer exists", + &or->u.std.area_id); continue; } @@ -1310,8 +1312,8 @@ ospf_abr_unapprove_translates(struct ospf *ospf) /* For NSSA Translations */ UNSET_FLAG(lsa->flags, OSPF_LSA_APPROVED); if (IS_DEBUG_OSPF_NSSA) zlog_debug( - "ospf_abr_unapprove_translates(): approved unset on link id %s", - inet_ntoa(lsa->data->id)); + "ospf_abr_unapprove_translates(): approved unset on link id %pI4", + &lsa->data->id); } if (IS_DEBUG_OSPF_NSSA) @@ -1331,14 +1333,14 @@ static void ospf_abr_unapprove_summaries(struct ospf *ospf) for (ALL_LIST_ELEMENTS_RO(ospf->areas, node, area)) { if (IS_DEBUG_OSPF_EVENT) zlog_debug( - "ospf_abr_unapprove_summaries(): considering area %s", - inet_ntoa(area->area_id)); + "ospf_abr_unapprove_summaries(): considering area %pI4", + &area->area_id); LSDB_LOOP (SUMMARY_LSDB(area), rn, lsa) if (ospf_lsa_is_self_originated(ospf, lsa)) { if (IS_DEBUG_OSPF_EVENT) zlog_debug( - "ospf_abr_unapprove_summaries(): approved unset on summary link id %s", - inet_ntoa(lsa->data->id)); + "ospf_abr_unapprove_summaries(): approved unset on summary link id %pI4", + &lsa->data->id); UNSET_FLAG(lsa->flags, OSPF_LSA_APPROVED); } @@ -1346,8 +1348,8 @@ static void ospf_abr_unapprove_summaries(struct ospf *ospf) if (ospf_lsa_is_self_originated(ospf, lsa)) { if (IS_DEBUG_OSPF_EVENT) zlog_debug( - "ospf_abr_unapprove_summaries(): approved unset on asbr-summary link id %s", - inet_ntoa(lsa->data->id)); + "ospf_abr_unapprove_summaries(): approved unset on asbr-summary link id %pI4", + &lsa->data->id); UNSET_FLAG(lsa->flags, OSPF_LSA_APPROVED); } } @@ -1392,8 +1394,8 @@ static void ospf_abr_announce_aggregates(struct ospf *ospf) for (ALL_LIST_ELEMENTS_RO(ospf->areas, node, area)) { if (IS_DEBUG_OSPF_EVENT) zlog_debug( - "ospf_abr_announce_aggregates(): looking at area %s", - inet_ntoa(area->area_id)); + "ospf_abr_announce_aggregates(): looking at area %pI4", + &area->area_id); for (rn = route_top(area->ranges); rn; rn = route_next(rn)) if ((range = rn->info)) { @@ -1411,9 +1413,8 @@ static void ospf_abr_announce_aggregates(struct ospf *ospf) if (IS_DEBUG_OSPF_EVENT) zlog_debug( - "ospf_abr_announce_aggregates(): this is range: %s/%d", - inet_ntoa(p.u.prefix4), - p.prefixlen); + "ospf_abr_announce_aggregates(): this is range: %pFX", + &p); if (CHECK_FLAG(range->flags, OSPF_AREA_RANGE_SUBSTITUTE)) { @@ -1482,8 +1483,8 @@ ospf_abr_send_nssa_aggregates(struct ospf *ospf) /* temporarily turned off */ if (IS_DEBUG_OSPF_NSSA) zlog_debug( - "ospf_abr_send_nssa_aggregates(): looking at area %s", - inet_ntoa(area->area_id)); + "ospf_abr_send_nssa_aggregates(): looking at area %pI4", + &area->area_id); for (rn = route_top(area->ranges); rn; rn = route_next(rn)) { if (rn->info == NULL) @@ -1505,8 +1506,8 @@ ospf_abr_send_nssa_aggregates(struct ospf *ospf) /* temporarily turned off */ if (IS_DEBUG_OSPF_NSSA) zlog_debug( - "ospf_abr_send_nssa_aggregates(): this is range: %s/%d", - inet_ntoa(p.prefix), p.prefixlen); + "ospf_abr_send_nssa_aggregates(): this is range: %pFX", + &p); if (CHECK_FLAG(range->flags, OSPF_AREA_RANGE_SUBSTITUTE)) { @@ -1553,8 +1554,8 @@ static void ospf_abr_announce_stub_defaults(struct ospf *ospf) for (ALL_LIST_ELEMENTS_RO(ospf->areas, node, area)) { if (IS_DEBUG_OSPF_EVENT) zlog_debug( - "ospf_abr_announce_stub_defaults(): looking at area %s", - inet_ntoa(area->area_id)); + "ospf_abr_announce_stub_defaults(): looking at area %pI4", + &area->area_id); if ((area->external_routing != OSPF_AREA_STUB) && (area->external_routing != OSPF_AREA_NSSA)) @@ -1565,8 +1566,8 @@ static void ospf_abr_announce_stub_defaults(struct ospf *ospf) if (IS_DEBUG_OSPF_EVENT) zlog_debug( - "ospf_abr_announce_stub_defaults(): announcing 0.0.0.0/0 to area %s", - inet_ntoa(area->area_id)); + "ospf_abr_announce_stub_defaults(): announcing 0.0.0.0/0 to area %pI4", + &area->area_id); ospf_abr_announce_network_to_area(&p, area->default_cost, area); } @@ -1580,8 +1581,8 @@ static int ospf_abr_remove_unapproved_translates_apply(struct ospf *ospf, if (CHECK_FLAG(lsa->flags, OSPF_LSA_LOCAL_XLT) && !CHECK_FLAG(lsa->flags, OSPF_LSA_APPROVED)) { zlog_info( - "ospf_abr_remove_unapproved_translates(): removing unapproved translates, ID: %s", - inet_ntoa(lsa->data->id)); + "ospf_abr_remove_unapproved_translates(): removing unapproved translates, ID: %pI4", + &lsa->data->id); /* FLUSH THROUGHOUT AS */ ospf_lsa_flush_as(ospf, lsa); @@ -1621,8 +1622,8 @@ static void ospf_abr_remove_unapproved_summaries(struct ospf *ospf) for (ALL_LIST_ELEMENTS_RO(ospf->areas, node, area)) { if (IS_DEBUG_OSPF_EVENT) zlog_debug( - "ospf_abr_remove_unapproved_summaries(): looking at area %s", - inet_ntoa(area->area_id)); + "ospf_abr_remove_unapproved_summaries(): looking at area %pI4", + &area->area_id); LSDB_LOOP (SUMMARY_LSDB(area), rn, lsa) if (ospf_lsa_is_self_originated(ospf, lsa)) diff --git a/ospfd/ospf_apiserver.c b/ospfd/ospf_apiserver.c index 73ce606504..c01ecdd1d4 100644 --- a/ospfd/ospf_apiserver.c +++ b/ospfd/ospf_apiserver.c @@ -317,21 +317,12 @@ void ospf_apiserver_free(struct ospf_apiserver *apiserv) struct listnode *node; /* Cancel read and write threads. */ - if (apiserv->t_sync_read) { - thread_cancel(apiserv->t_sync_read); - } + thread_cancel(&apiserv->t_sync_read); #ifdef USE_ASYNC_READ - if (apiserv->t_async_read) { - thread_cancel(apiserv->t_async_read); - } + thread_cancel(&apiserv->t_async_read); #endif /* USE_ASYNC_READ */ - if (apiserv->t_sync_write) { - thread_cancel(apiserv->t_sync_write); - } - - if (apiserv->t_async_write) { - thread_cancel(apiserv->t_async_write); - } + thread_cancel(&apiserv->t_sync_write); + thread_cancel(&apiserv->t_async_write); /* Unregister all opaque types that application registered and flush opaque LSAs if still in LSDB. */ @@ -387,8 +378,8 @@ int ospf_apiserver_read(struct thread *thread) apiserv->t_sync_read = NULL; if (IS_DEBUG_OSPF_EVENT) - zlog_debug("API: ospf_apiserver_read: Peer: %s/%u", - inet_ntoa(apiserv->peer_sync.sin_addr), + zlog_debug("API: ospf_apiserver_read: Peer: %pI4/%u", + &apiserv->peer_sync.sin_addr, ntohs(apiserv->peer_sync.sin_port)); } #ifdef USE_ASYNC_READ @@ -397,8 +388,8 @@ int ospf_apiserver_read(struct thread *thread) apiserv->t_async_read = NULL; if (IS_DEBUG_OSPF_EVENT) - zlog_debug("API: ospf_apiserver_read: Peer: %s/%u", - inet_ntoa(apiserv->peer_async.sin_addr), + zlog_debug("API: ospf_apiserver_read: Peer: %pI4/%u", + &apiserv->peer_async.sin_addr, ntohs(apiserv->peer_async.sin_port)); } #endif /* USE_ASYNC_READ */ @@ -455,8 +446,8 @@ int ospf_apiserver_sync_write(struct thread *thread) } if (IS_DEBUG_OSPF_EVENT) - zlog_debug("API: ospf_apiserver_sync_write: Peer: %s/%u", - inet_ntoa(apiserv->peer_sync.sin_addr), + zlog_debug("API: ospf_apiserver_sync_write: Peer: %pI4/%u", + &apiserv->peer_sync.sin_addr, ntohs(apiserv->peer_sync.sin_port)); /* Check whether there is really a message in the fifo. */ @@ -519,8 +510,8 @@ int ospf_apiserver_async_write(struct thread *thread) } if (IS_DEBUG_OSPF_EVENT) - zlog_debug("API: ospf_apiserver_async_write: Peer: %s/%u", - inet_ntoa(apiserv->peer_async.sin_addr), + zlog_debug("API: ospf_apiserver_async_write: Peer: %pI4/%u", + &apiserv->peer_async.sin_addr, ntohs(apiserv->peer_async.sin_port)); /* Check whether there is really a message in the fifo. */ @@ -645,8 +636,8 @@ int ospf_apiserver_accept(struct thread *thread) } if (IS_DEBUG_OSPF_EVENT) - zlog_debug("API: ospf_apiserver_accept: New peer: %s/%u", - inet_ntoa(peer_sync.sin_addr), + zlog_debug("API: ospf_apiserver_accept: New peer: %pI4/%u", + &peer_sync.sin_addr, ntohs(peer_sync.sin_port)); /* Create new socket for asynchronous messages. */ @@ -657,8 +648,8 @@ int ospf_apiserver_accept(struct thread *thread) */ if (ntohs(peer_async.sin_port) == ospf_apiserver_getport()) { zlog_warn( - "API: ospf_apiserver_accept: Peer(%s/%u): Invalid async port number?", - inet_ntoa(peer_async.sin_addr), + "API: ospf_apiserver_accept: Peer(%pI4/%u): Invalid async port number?", + &peer_async.sin_addr, ntohs(peer_async.sin_port)); close(new_sync_sock); return -1; @@ -1409,8 +1400,8 @@ struct ospf_lsa *ospf_apiserver_opaque_lsa_new(struct ospf_area *area, options |= OSPF_OPTION_O; /* Don't forget to set option bit */ if (IS_DEBUG_OSPF(lsa, LSA_GENERATE)) { - zlog_debug("LSA[Type%d:%s]: Creating an Opaque-LSA instance", - protolsa->type, inet_ntoa(protolsa->id)); + zlog_debug("LSA[Type%d:%pI4]: Creating an Opaque-LSA instance", + protolsa->type, &protolsa->id); } /* Set opaque-LSA header fields. */ @@ -1510,8 +1501,8 @@ int ospf_apiserver_handle_originate_request(struct ospf_apiserver *apiserv, case OSPF_OPAQUE_LINK_LSA: oi = ospf_apiserver_if_lookup_by_addr(omsg->ifaddr); if (!oi) { - zlog_warn("apiserver_originate: unknown interface %s", - inet_ntoa(omsg->ifaddr)); + zlog_warn("apiserver_originate: unknown interface %pI4", + &omsg->ifaddr); rc = OSPF_API_NOSUCHINTERFACE; goto out; } @@ -1521,8 +1512,8 @@ int ospf_apiserver_handle_originate_request(struct ospf_apiserver *apiserv, case OSPF_OPAQUE_AREA_LSA: area = ospf_area_lookup_by_area_id(ospf, omsg->area_id); if (!area) { - zlog_warn("apiserver_originate: unknown area %s", - inet_ntoa(omsg->area_id)); + zlog_warn("apiserver_originate: unknown area %pI4", + &omsg->area_id); rc = OSPF_API_NOSUCHAREA; goto out; } @@ -1791,8 +1782,8 @@ struct ospf_lsa *ospf_apiserver_lsa_refresher(struct ospf_lsa *lsa) /* Debug logging. */ if (IS_DEBUG_OSPF(lsa, LSA_GENERATE)) { - zlog_debug("LSA[Type%d:%s]: Refresh Opaque LSA", - new->data->type, inet_ntoa(new->data->id)); + zlog_debug("LSA[Type%d:%pI4]: Refresh Opaque LSA", + new->data->type, &new->data->id); ospf_lsa_header_dump(new->data); } @@ -1829,8 +1820,8 @@ int ospf_apiserver_handle_delete_request(struct ospf_apiserver *apiserv, case OSPF_OPAQUE_AREA_LSA: area = ospf_area_lookup_by_area_id(ospf, dmsg->area_id); if (!area) { - zlog_warn("ospf_apiserver_lsa_delete: unknown area %s", - inet_ntoa(dmsg->area_id)); + zlog_warn("ospf_apiserver_lsa_delete: unknown area %pI4", + &dmsg->area_id); rc = OSPF_API_NOSUCHAREA; goto out; } @@ -1872,8 +1863,8 @@ int ospf_apiserver_handle_delete_request(struct ospf_apiserver *apiserv, old = ospf_lsa_lookup(ospf, area, dmsg->lsa_type, id, ospf->router_id); if (!old) { zlog_warn( - "ospf_apiserver_lsa_delete: LSA[Type%d:%s] not in LSDB", - dmsg->lsa_type, inet_ntoa(id)); + "ospf_apiserver_lsa_delete: LSA[Type%d:%pI4] not in LSDB", + dmsg->lsa_type, &id); rc = OSPF_API_NOSUCHLSA; goto out; } diff --git a/ospfd/ospf_asbr.c b/ospfd/ospf_asbr.c index b64ec981be..fd9b166433 100644 --- a/ospfd/ospf_asbr.c +++ b/ospfd/ospf_asbr.c @@ -131,13 +131,12 @@ ospf_external_info_add(struct ospf *ospf, uint8_t type, unsigned short instance, } inet_ntop(AF_INET, (void *)&nexthop.s_addr, inetbuf, - INET6_BUFSIZ); + sizeof(inetbuf)); if (IS_DEBUG_OSPF(lsa, LSA_GENERATE)) zlog_debug( - "Redistribute[%s][%d][%u]: %s/%d discarding old info with NH %s.", + "Redistribute[%s][%d][%u]: %pFX discarding old info with NH %s.", ospf_redist_string(type), instance, - ospf->vrf_id, inet_ntoa(p.prefix), - p.prefixlen, inetbuf); + ospf->vrf_id, &p, inetbuf); XFREE(MTYPE_OSPF_EXTERNAL_INFO, rn->info); } @@ -155,11 +154,11 @@ ospf_external_info_add(struct ospf *ospf, uint8_t type, unsigned short instance, if (IS_DEBUG_OSPF(lsa, LSA_GENERATE)) { inet_ntop(AF_INET, (void *)&nexthop.s_addr, inetbuf, - INET6_BUFSIZ); + sizeof(inetbuf)); zlog_debug( - "Redistribute[%s][%u]: %s/%d external info created, with NH %s", + "Redistribute[%s][%u]: %pFX external info created, with NH %s", ospf_redist_string(type), ospf->vrf_id, - inet_ntoa(p.prefix), p.prefixlen, inetbuf); + &p, inetbuf); } return new; } @@ -290,8 +289,9 @@ void ospf_asbr_nssa_redist_task(struct ospf *ospf) continue; for (ALL_LIST_ELEMENTS_RO(red_list, node, red)) - ospf_external_lsa_refresh_type( - ospf, type, red->instance, LSA_REFRESH_FORCE); + ospf_external_lsa_refresh_type(ospf, type, + red->instance, + LSA_REFRESH_IF_CHANGED); } ospf_external_lsa_refresh_default(ospf); diff --git a/ospfd/ospf_ase.c b/ospfd/ospf_ase.c index d2a30477b0..3606efc76f 100644 --- a/ospfd/ospf_ase.c +++ b/ospfd/ospf_ase.c @@ -179,8 +179,8 @@ ospf_ase_calculate_asbr_route (struct ospf *ospf, if (asbr_route == NULL) { if (IS_DEBUG_OSPF (lsa, LSA)) - zlog_debug ("ospf_ase_calculate(): Route to ASBR %s not found", - inet_ntoa (asbr.prefix)); + zlog_debug ("ospf_ase_calculate(): Route to ASBR %pI4 not found", + &asbr.prefix); return NULL; } @@ -283,7 +283,6 @@ int ospf_ase_calculate_route(struct ospf *ospf, struct ospf_lsa *lsa) struct prefix_ipv4 asbr, p; struct route_node *rn; struct ospf_route *new, * or ; - char buf1[INET_ADDRSTRLEN]; int ret; assert(lsa); @@ -301,11 +300,10 @@ int ospf_ase_calculate_route(struct ospf *ospf, struct ospf_lsa *lsa) } if (IS_DEBUG_OSPF(lsa, LSA)) { - snprintf(buf1, sizeof(buf1), "%s", - inet_ntoa(al->header.adv_router)); zlog_debug( - "Route[External]: Calculate AS-external-LSA to %s/%d adv_router %s", - inet_ntoa(al->header.id), ip_masklen(al->mask), buf1); + "Route[External]: Calculate AS-external-LSA to %pI4/%d adv_router %pI4", + &al->header.id, ip_masklen(al->mask), + &al->header.adv_router); } /* (1) If the cost specified by the LSA is LSInfinity, or if the @@ -457,9 +455,8 @@ int ospf_ase_calculate_route(struct ospf *ospf, struct ospf_lsa *lsa) if (!rn || (or = rn->info) == NULL) { if (IS_DEBUG_OSPF(lsa, LSA)) - zlog_debug("Route[External]: Adding a new route %s/%d with paths %u", - inet_ntoa(p.prefix), p.prefixlen, - listcount(asbr_route->paths)); + zlog_debug("Route[External]: Adding a new route %pFX with paths %u", + &p, listcount(asbr_route->paths)); ospf_route_add(ospf->new_external_route, &p, new, asbr_route); @@ -658,8 +655,8 @@ static int ospf_ase_calculate_timer(struct thread *t) for (ALL_LIST_ELEMENTS_RO(ospf->areas, node, area)) { if (IS_DEBUG_OSPF_NSSA) zlog_debug( - "ospf_ase_calculate_timer(): looking at area %s", - inet_ntoa(area->area_id)); + "ospf_ase_calculate_timer(): looking at area %pI4", + &area->area_id); if (area->external_routing == OSPF_AREA_NSSA) LSDB_LOOP (NSSA_LSDB(area), rn, lsa) diff --git a/ospfd/ospf_bfd.c b/ospfd/ospf_bfd.c index 46ad94c3de..4640720952 100644 --- a/ospfd/ospf_bfd.c +++ b/ospfd/ospf_bfd.c @@ -76,9 +76,9 @@ static void ospf_bfd_reg_dereg_nbr(struct ospf_neighbor *nbr, int command) bfd_info = (struct bfd_info *)params->bfd_info; if (IS_DEBUG_OSPF(zebra, ZEBRA_INTERFACE)) - zlog_debug("%s nbr (%s) with BFD. OSPF vrf %s", + zlog_debug("%s nbr (%pI4) with BFD. OSPF vrf %s", bfd_get_command_dbg_str(command), - inet_ntoa(nbr->src), + &nbr->src, ospf_vrf_id_to_name(oi->ospf->vrf_id)); cbit = CHECK_FLAG(bfd_info->flags, BFD_FLAG_BFD_CBIT_ON); @@ -180,8 +180,8 @@ static int ospf_bfd_nbr_replay(ZAPI_CALLBACK_ARGS) continue; if (IS_DEBUG_OSPF(zebra, ZEBRA_INTERFACE)) - zlog_debug("Replaying nbr (%s) to BFD", - inet_ntoa(nbr->src)); + zlog_debug("Replaying nbr (%pI4) to BFD", + &nbr->src); ospf_bfd_reg_dereg_nbr(nbr, ZEBRA_BFD_DEST_UPDATE); @@ -266,18 +266,18 @@ static int ospf_bfd_interface_dest_update(ZAPI_CALLBACK_ARGS) if ((status == BFD_STATUS_DOWN) && (old_status == BFD_STATUS_UP)) { if (IS_DEBUG_OSPF(nsm, NSM_EVENTS)) - zlog_debug("NSM[%s:%s]: BFD Down", + zlog_debug("NSM[%s:%pI4]: BFD Down", IF_NAME(nbr->oi), - inet_ntoa(nbr->address.u.prefix4)); + &nbr->address.u.prefix4); OSPF_NSM_EVENT_SCHEDULE(nbr, NSM_InactivityTimer); } if ((status == BFD_STATUS_UP) && (old_status == BFD_STATUS_DOWN)) { if (IS_DEBUG_OSPF(nsm, NSM_EVENTS)) - zlog_debug("NSM[%s:%s]: BFD Up", + zlog_debug("NSM[%s:%pI4]: BFD Up", IF_NAME(nbr->oi), - inet_ntoa(nbr->address.u.prefix4)); + &nbr->address.u.prefix4); } } diff --git a/ospfd/ospf_dump.c b/ospfd/ospf_dump.c index 7fd1b5c64e..ba045e0418 100644 --- a/ospfd/ospf_dump.c +++ b/ospfd/ospf_dump.c @@ -242,20 +242,20 @@ static void ospf_packet_hello_dump(struct stream *s, uint16_t length) hello = (struct ospf_hello *)stream_pnt(s); zlog_debug("Hello"); - zlog_debug(" NetworkMask %s", inet_ntoa(hello->network_mask)); + zlog_debug(" NetworkMask %pI4", &hello->network_mask); zlog_debug(" HelloInterval %d", ntohs(hello->hello_interval)); zlog_debug(" Options %d (%s)", hello->options, ospf_options_dump(hello->options)); zlog_debug(" RtrPriority %d", hello->priority); zlog_debug(" RtrDeadInterval %ld", (unsigned long)ntohl(hello->dead_interval)); - zlog_debug(" DRouter %s", inet_ntoa(hello->d_router)); - zlog_debug(" BDRouter %s", inet_ntoa(hello->bd_router)); + zlog_debug(" DRouter %pI4", &hello->d_router); + zlog_debug(" BDRouter %pI4", &hello->bd_router); length -= OSPF_HEADER_SIZE + OSPF_HELLO_MIN_SIZE; zlog_debug(" # Neighbors %d", length / 4); for (i = 0; length > 0; i++, length -= sizeof(struct in_addr)) - zlog_debug(" Neighbor %s", inet_ntoa(hello->neighbors[i])); + zlog_debug(" Neighbor %pI4", &hello->neighbors[i]); } static char *ospf_dd_flags_dump(uint8_t flags, char *buf, size_t size) @@ -292,9 +292,9 @@ static void ospf_router_lsa_dump(struct stream *s, uint16_t length) len = ntohs(rl->header.length) - OSPF_LSA_HEADER_SIZE - 4; for (i = 0; len > 0; i++) { - zlog_debug(" Link ID %s", inet_ntoa(rl->link[i].link_id)); - zlog_debug(" Link Data %s", - inet_ntoa(rl->link[i].link_data)); + zlog_debug(" Link ID %pI4", &rl->link[i].link_id); + zlog_debug(" Link Data %pI4", + &rl->link[i].link_data); zlog_debug(" Type %d", (uint8_t)rl->link[i].type); zlog_debug(" TOS %d", (uint8_t)rl->link[i].tos); zlog_debug(" metric %d", ntohs(rl->link[i].metric)); @@ -317,11 +317,11 @@ static void ospf_network_lsa_dump(struct stream *s, uint16_t length) zlog_debug ("Network-LSA size %d", ntohs (nl->header.length) - OSPF_LSA_HEADER_SIZE); */ - zlog_debug(" Network Mask %s", inet_ntoa(nl->mask)); + zlog_debug(" Network Mask %pI4", &nl->mask); zlog_debug(" # Attached Routers %d", cnt); for (i = 0; i < cnt; i++) - zlog_debug(" Attached Router %s", - inet_ntoa(nl->routers[i])); + zlog_debug(" Attached Router %pI4", + &nl->routers[i]); } static void ospf_summary_lsa_dump(struct stream *s, uint16_t length) @@ -333,7 +333,7 @@ static void ospf_summary_lsa_dump(struct stream *s, uint16_t length) sl = (struct summary_lsa *)stream_pnt(s); zlog_debug(" Summary-LSA"); - zlog_debug(" Network Mask %s", inet_ntoa(sl->mask)); + zlog_debug(" Network Mask %pI4", &sl->mask); size = ntohs(sl->header.length) - OSPF_LSA_HEADER_SIZE - 4; for (i = 0; size > 0; size -= 4, i++) @@ -349,15 +349,15 @@ static void ospf_as_external_lsa_dump(struct stream *s, uint16_t length) al = (struct as_external_lsa *)stream_pnt(s); zlog_debug(" %s", ospf_lsa_type_msg[al->header.type].str); - zlog_debug(" Network Mask %s", inet_ntoa(al->mask)); + zlog_debug(" Network Mask %pI4", &al->mask); size = ntohs(al->header.length) - OSPF_LSA_HEADER_SIZE - 4; for (i = 0; size > 0; size -= 12, i++) { zlog_debug(" bit %s TOS=%d metric %d", IS_EXTERNAL_METRIC(al->e[i].tos) ? "E" : "-", al->e[i].tos & 0x7f, GET_METRIC(al->e[i].metric)); - zlog_debug(" Forwarding address %s", - inet_ntoa(al->e[i].fwd_addr)); + zlog_debug(" Forwarding address %pI4", + &al->e[i].fwd_addr); zlog_debug(" External Route Tag %" ROUTE_TAG_PRI, al->e[i].route_tag); } @@ -427,8 +427,8 @@ static void ospf_packet_ls_req_dump(struct stream *s, uint16_t length) adv_router.s_addr = stream_get_ipv4(s); zlog_debug(" LS type %d", ls_type); - zlog_debug(" Link State ID %s", inet_ntoa(ls_id)); - zlog_debug(" Advertising Router %s", inet_ntoa(adv_router)); + zlog_debug(" Link State ID %pI4", &ls_id); + zlog_debug(" Advertising Router %pI4", &adv_router); } stream_set_getp(s, sp); @@ -519,8 +519,8 @@ static void ospf_header_dump(struct ospf_header *ospfh) zlog_debug(" Type %d (%s)", ospfh->type, lookup_msg(ospf_packet_type_str, ospfh->type, NULL)); zlog_debug(" Packet Len %d", ntohs(ospfh->length)); - zlog_debug(" Router ID %s", inet_ntoa(ospfh->router_id)); - zlog_debug(" Area ID %s", inet_ntoa(ospfh->area_id)); + zlog_debug(" Router ID %pI4", &ospfh->router_id); + zlog_debug(" Area ID %pI4", &ospfh->area_id); zlog_debug(" Checksum 0x%x", ntohs(ospfh->checksum)); zlog_debug(" AuType %s", lookup_msg(ospf_auth_type_str, auth_type, NULL)); diff --git a/ospfd/ospf_dump_api.c b/ospfd/ospf_dump_api.c index e24936a473..4b68b006e2 100644 --- a/ospfd/ospf_dump_api.c +++ b/ospfd/ospf_dump_api.c @@ -127,8 +127,8 @@ void ospf_lsa_header_dump(struct lsa_header *lsah) ospf_options_dump(lsah->options)); zlog_debug(" LS type %d (%s)", lsah->type, (lsah->type ? lsah_type : "unknown type")); - zlog_debug(" Link State ID %s", inet_ntoa(lsah->id)); - zlog_debug(" Advertising Router %s", inet_ntoa(lsah->adv_router)); + zlog_debug(" Link State ID %pI4", &lsah->id); + zlog_debug(" Advertising Router %pI4", &lsah->adv_router); zlog_debug(" LS sequence number 0x%lx", (unsigned long)ntohl(lsah->ls_seqnum)); zlog_debug(" LS checksum 0x%x", ntohs(lsah->checksum)); diff --git a/ospfd/ospf_ext.c b/ospfd/ospf_ext.c index 90dc108c0e..4fa61221a6 100644 --- a/ospfd/ospf_ext.c +++ b/ospfd/ospf_ext.c @@ -462,6 +462,10 @@ static void set_rmt_itf_addr(struct ext_itf *exti, struct in_addr rmtif) static void ospf_extended_lsa_delete(struct ext_itf *exti) { + /* Avoid deleting LSA if Extended is not enable */ + if (!OspfEXT.enabled) + return; + /* Process only Active Extended Prefix/Link LSA */ if (!CHECK_FLAG(exti->flags, EXT_LPFLG_LSA_ACTIVE)) return; @@ -755,16 +759,16 @@ static void ospf_ext_ism_change(struct ospf_interface *oi, int old_status) if (oi->type == OSPF_IFTYPE_LOOPBACK) { exti->stype = PREF_SID; exti->type = OPAQUE_TYPE_EXTENDED_PREFIX_LSA; - exti->flags = EXT_LPFLG_LSA_ACTIVE; exti->instance = get_ext_pref_instance_value(); exti->area = oi->area; - osr_debug("EXT (%s): Set Prefix SID to interface %s ", - __func__, oi->ifp->name); - /* Complete SRDB if the interface belongs to a Prefix */ - if (OspfEXT.enabled) + if (OspfEXT.enabled) { + osr_debug("EXT (%s): Set Prefix SID to interface %s ", + __func__, oi->ifp->name); + exti->flags = EXT_LPFLG_LSA_ACTIVE; ospf_sr_update_local_prefix(oi->ifp, oi->address); + } } else { /* Determine if interface is related to Adj. or LAN Adj. SID */ if (oi->state == ISM_DR) @@ -780,9 +784,11 @@ static void ospf_ext_ism_change(struct ospf_interface *oi, int old_status) * Note: Adjacency SID information are completed when ospf * adjacency become up see ospf_ext_link_nsm_change() */ - osr_debug("EXT (%s): Set %sAdjacency SID for interface %s ", - __func__, exti->stype == ADJ_SID ? "" : "LAN-", - oi->ifp->name); + if (OspfEXT.enabled) + osr_debug( + "EXT (%s): Set %sAdjacency SID for interface %s ", + __func__, exti->stype == ADJ_SID ? "" : "LAN-", + oi->ifp->name); } } @@ -817,7 +823,8 @@ static void ospf_ext_link_nsm_change(struct ospf_neighbor *nbr, int old_status) } /* Remove Extended Link if Neighbor State goes Down or Deleted */ - if (nbr->state == NSM_Down || nbr->state == NSM_Deleted) { + if (OspfEXT.enabled + && (nbr->state == NSM_Down || nbr->state == NSM_Deleted)) { ospf_ext_link_delete_adj_sid(exti); if (CHECK_FLAG(exti->flags, EXT_LPFLG_LSA_ENGAGED)) ospf_ext_link_lsa_schedule(exti, FLUSH_THIS_LSA); @@ -1716,8 +1723,8 @@ static uint16_t show_vty_ext_link_rmt_itf_addr(struct vty *vty, top = (struct ext_subtlv_rmt_itf_addr *)tlvh; vty_out(vty, - " Remote Interface Address Sub-TLV: Length %u\n Address: %s\n", - ntohs(top->header.length), inet_ntoa(top->value)); + " Remote Interface Address Sub-TLV: Length %u\n Address: %pI4\n", + ntohs(top->header.length), &top->value); return TLV_SIZE(tlvh); } @@ -1748,9 +1755,9 @@ static uint16_t show_vty_ext_link_lan_adj_sid(struct vty *vty, (struct ext_subtlv_lan_adj_sid *)tlvh; vty_out(vty, - " LAN-Adj-SID Sub-TLV: Length %u\n\tFlags: 0x%x\n\tMT-ID:0x%x\n\tWeight: 0x%x\n\tNeighbor ID: %s\n\t%s: %u\n", + " LAN-Adj-SID Sub-TLV: Length %u\n\tFlags: 0x%x\n\tMT-ID:0x%x\n\tWeight: 0x%x\n\tNeighbor ID: %pI4\n\t%s: %u\n", ntohs(top->header.length), top->flags, top->mtid, top->weight, - inet_ntoa(top->neighbor_id), + &top->neighbor_id, CHECK_FLAG(top->flags, EXT_SUBTLV_LINK_ADJ_SID_VFLG) ? "Label" : "Index", CHECK_FLAG(top->flags, EXT_SUBTLV_LINK_ADJ_SID_VFLG) @@ -1778,10 +1785,10 @@ static uint16_t show_vty_link_info(struct vty *vty, struct tlv_header *ext) vty_out(vty, " Extended Link TLV: Length %u\n Link Type: 0x%x\n" - " Link ID: %s\n", + " Link ID: %pI4\n", ntohs(top->header.length), top->link_type, - inet_ntoa(top->link_id)); - vty_out(vty, " Link data: %s\n", inet_ntoa(top->link_data)); + &top->link_id); + vty_out(vty, " Link data: %pI4\n", &top->link_data); tlvh = (struct tlv_header *)((char *)(ext) + TLV_HDR_SIZE + EXT_TLV_LINK_SIZE); @@ -1858,9 +1865,9 @@ static uint16_t show_vty_pref_info(struct vty *vty, struct tlv_header *ext) vty_out(vty, " Extended Prefix TLV: Length %u\n\tRoute Type: %u\n" - "\tAddress Family: 0x%x\n\tFlags: 0x%x\n\tAddress: %s/%u\n", + "\tAddress Family: 0x%x\n\tFlags: 0x%x\n\tAddress: %pI4/%u\n", ntohs(top->header.length), top->route_type, top->af, top->flags, - inet_ntoa(top->address), top->pref_length); + &top->address, top->pref_length); tlvh = (struct tlv_header *)((char *)(ext) + TLV_HDR_SIZE + EXT_TLV_PREFIX_SIZE); diff --git a/ospfd/ospf_flood.c b/ospfd/ospf_flood.c index 7d461d4587..0f43553c01 100644 --- a/ospfd/ospf_flood.c +++ b/ospfd/ospf_flood.c @@ -157,9 +157,9 @@ static void ospf_process_self_originated_lsa(struct ospf *ospf, if (IS_DEBUG_OSPF_EVENT) zlog_debug( - "%s:LSA[Type%d:%s]: Process self-originated LSA seq 0x%x", + "%s:LSA[Type%d:%pI4]: Process self-originated LSA seq 0x%x", ospf_get_name(ospf), new->data->type, - inet_ntoa(new->data->id), ntohl(new->data->ls_seqnum)); + &new->data->id, ntohl(new->data->ls_seqnum)); /* If we're here, we installed a self-originated LSA that we received from a neighbor, i.e. it's more recent. We must see whether we want @@ -276,8 +276,8 @@ int ospf_flood(struct ospf *ospf, struct ospf_neighbor *nbr, if (IS_DEBUG_OSPF_EVENT) zlog_debug( - "%s:LSA[Flooding]: start, NBR %s (%s), cur(%p), New-LSA[%s]", - ospf_get_name(ospf), inet_ntoa(nbr->router_id), + "%s:LSA[Flooding]: start, NBR %pI4 (%s), cur(%p), New-LSA[%s]", + ospf_get_name(ospf), &nbr->router_id, lookup_msg(ospf_nsm_state_msg, nbr->state, NULL), (void *)current, dump_lsa_key(new)); @@ -345,9 +345,9 @@ int ospf_flood(struct ospf *ospf, struct ospf_neighbor *nbr, /* Handling Max age grace LSA.*/ if (IS_DEBUG_OSPF_GR_HELPER) zlog_debug( - "%s, Received a maxage GRACE-LSA from router %s", + "%s, Received a maxage GRACE-LSA from router %pI4", __PRETTY_FUNCTION__, - inet_ntoa(new->data->adv_router)); + &new->data->adv_router); if (current) { ospf_process_maxage_grace_lsa(ospf, new, nbr); @@ -361,9 +361,9 @@ int ospf_flood(struct ospf *ospf, struct ospf_neighbor *nbr, } else { if (IS_DEBUG_OSPF_GR_HELPER) zlog_debug( - "%s, Received a GRACE-LSA from router %s", + "%s, Received a GRACE-LSA from router %pI4", __PRETTY_FUNCTION__, - inet_ntoa(new->data->adv_router)); + &new->data->adv_router); if (ospf_process_grace_lsa(ospf, new, nbr) == OSPF_GR_NOT_HELPER) { @@ -412,11 +412,15 @@ static int ospf_flood_through_interface(struct ospf_interface *oi, struct ospf_neighbor *onbr; struct route_node *rn; int retx_flag; + char buf[PREFIX_STRLEN]; if (IS_DEBUG_OSPF_EVENT) zlog_debug( "%s:ospf_flood_through_interface(): considering int %s, INBR(%s), LSA[%s] AGE %u", - ospf_get_name(oi->ospf), IF_NAME(oi), inbr ? inet_ntoa(inbr->router_id) : "NULL", + ospf_get_name(oi->ospf), IF_NAME(oi), + inbr ? + inet_ntop(AF_INET, &inbr->router_id, buf, sizeof(buf)) : + "NULL", dump_lsa_key(lsa), ntohs(lsa->data->ls_age)); if (!ospf_if_is_enable(oi)) @@ -437,8 +441,8 @@ static int ospf_flood_through_interface(struct ospf_interface *oi, onbr = rn->info; if (IS_DEBUG_OSPF_EVENT) zlog_debug( - "ospf_flood_through_interface(): considering nbr %s(%s) (%s)", - inet_ntoa(onbr->router_id), + "ospf_flood_through_interface(): considering nbr %pI4(%s) (%s)", + &onbr->router_id, ospf_get_name(oi->ospf), lookup_msg(ospf_nsm_state_msg, onbr->state, NULL)); @@ -773,9 +777,9 @@ void ospf_ls_request_add(struct ospf_neighbor *nbr, struct ospf_lsa *lsa) * the common function "ospf_lsdb_add()" -- endo. */ if (IS_DEBUG_OSPF(lsa, LSA_FLOODING)) - zlog_debug("RqstL(%lu)++, NBR(%s(%s)), LSA[%s]", + zlog_debug("RqstL(%lu)++, NBR(%pI4(%s)), LSA[%s]", ospf_ls_request_count(nbr), - inet_ntoa(nbr->router_id), + &nbr->router_id, ospf_get_name(nbr->oi->ospf), dump_lsa_key(lsa)); ospf_lsdb_add(&nbr->ls_req, lsa); @@ -800,9 +804,9 @@ void ospf_ls_request_delete(struct ospf_neighbor *nbr, struct ospf_lsa *lsa) } if (IS_DEBUG_OSPF(lsa, LSA_FLOODING)) /* -- endo. */ - zlog_debug("RqstL(%lu)--, NBR(%s(%s)), LSA[%s]", + zlog_debug("RqstL(%lu)--, NBR(%pI4(%s)), LSA[%s]", ospf_ls_request_count(nbr), - inet_ntoa(nbr->router_id), + &nbr->router_id, ospf_get_name(nbr->oi->ospf), dump_lsa_key(lsa)); ospf_lsdb_delete(&nbr->ls_req, lsa); @@ -862,9 +866,9 @@ void ospf_ls_retransmit_add(struct ospf_neighbor *nbr, struct ospf_lsa *lsa) if (old) { old->retransmit_counter--; if (IS_DEBUG_OSPF(lsa, LSA_FLOODING)) - zlog_debug("RXmtL(%lu)--, NBR(%s(%s)), LSA[%s]", + zlog_debug("RXmtL(%lu)--, NBR(%pI4(%s)), LSA[%s]", ospf_ls_retransmit_count(nbr), - inet_ntoa(nbr->router_id), + &nbr->router_id, ospf_get_name(nbr->oi->ospf), dump_lsa_key(old)); ospf_lsdb_delete(&nbr->ls_rxmt, old); @@ -879,9 +883,9 @@ void ospf_ls_retransmit_add(struct ospf_neighbor *nbr, struct ospf_lsa *lsa) * the common function "ospf_lsdb_add()" -- endo. */ if (IS_DEBUG_OSPF(lsa, LSA_FLOODING)) - zlog_debug("RXmtL(%lu)++, NBR(%s(%s)), LSA[%s]", + zlog_debug("RXmtL(%lu)++, NBR(%pI4(%s)), LSA[%s]", ospf_ls_retransmit_count(nbr), - inet_ntoa(nbr->router_id), + &nbr->router_id, ospf_get_name(nbr->oi->ospf), dump_lsa_key(lsa)); ospf_lsdb_add(&nbr->ls_rxmt, lsa); @@ -894,9 +898,9 @@ void ospf_ls_retransmit_delete(struct ospf_neighbor *nbr, struct ospf_lsa *lsa) if (ospf_ls_retransmit_lookup(nbr, lsa)) { lsa->retransmit_counter--; if (IS_DEBUG_OSPF(lsa, LSA_FLOODING)) /* -- endo. */ - zlog_debug("RXmtL(%lu)--, NBR(%s(%s)), LSA[%s]", + zlog_debug("RXmtL(%lu)--, NBR(%pI4(%s)), LSA[%s]", ospf_ls_retransmit_count(nbr), - inet_ntoa(nbr->router_id), + &nbr->router_id, ospf_get_name(nbr->oi->ospf), dump_lsa_key(lsa)); ospf_lsdb_delete(&nbr->ls_rxmt, lsa); @@ -984,8 +988,8 @@ void ospf_lsa_flush_area(struct ospf_lsa *lsa, struct ospf_area *area) retransmissions */ lsa->data->ls_age = htons(OSPF_LSA_MAXAGE); if (IS_DEBUG_OSPF_EVENT) - zlog_debug("%s: MAXAGE set to LSA %s", __func__, - inet_ntoa(lsa->data->id)); + zlog_debug("%s: MAXAGE set to LSA %pI4", __func__, + &lsa->data->id); monotime(&lsa->tv_recv); lsa->tv_orig = lsa->tv_recv; ospf_flood_through_area(area, NULL, lsa); diff --git a/ospfd/ospf_gr_helper.c b/ospfd/ospf_gr_helper.c index 616013fb9e..9c029a49ba 100644 --- a/ospfd/ospf_gr_helper.c +++ b/ospfd/ospf_gr_helper.c @@ -377,8 +377,8 @@ int ospf_process_grace_lsa(struct ospf *ospf, struct ospf_lsa *lsa, if (IS_DEBUG_OSPF_GR_HELPER) zlog_debug( - "%s, Grace LSA received from %s, grace interval:%u, restartreason :%s", - __PRETTY_FUNCTION__, inet_ntoa(restart_addr), + "%s, Grace LSA received from %pI4, grace interval:%u, restartreason :%s", + __PRETTY_FUNCTION__, &restart_addr, grace_interval, ospf_restart_reason2str(restart_reason)); @@ -392,9 +392,9 @@ int ospf_process_grace_lsa(struct ospf *ospf, struct ospf_lsa *lsa, if (!restarter) { if (IS_DEBUG_OSPF_GR_HELPER) zlog_debug( - "%s, Restarter is not a nbr(%s) for this router.", + "%s, Restarter is not a nbr(%pI4) for this router.", __PRETTY_FUNCTION__, - inet_ntoa(restart_addr)); + &restart_addr); return OSPF_GR_NOT_HELPER; } } else @@ -425,8 +425,8 @@ int ospf_process_grace_lsa(struct ospf *ospf, struct ospf_lsa *lsa, if (!IS_NBR_STATE_FULL(restarter)) { if (IS_DEBUG_OSPF_GR_HELPER) zlog_debug( - "%s, This Neighbour %s is not in FULL state.", - __PRETTY_FUNCTION__, inet_ntoa(restarter->src)); + "%s, This Neighbour %pI4 is not in FULL state.", + __PRETTY_FUNCTION__, &restarter->src); restarter->gr_helper_info.rejected_reason = OSPF_HELPER_NOT_A_VALID_NEIGHBOUR; return OSPF_GR_NOT_HELPER; @@ -501,8 +501,8 @@ int ospf_process_grace_lsa(struct ospf *ospf, struct ospf_lsa *lsa, } else { if (IS_DEBUG_OSPF_GR_HELPER) zlog_debug( - "%s, This Router becomes a HELPER for the neighbour %s", - __PRETTY_FUNCTION__, inet_ntoa(restarter->src)); + "%s, This Router becomes a HELPER for the neighbour %pI4", + __PRETTY_FUNCTION__, &restarter->src); } /* Became a Helper to the RESTART neighbour. @@ -606,8 +606,8 @@ void ospf_helper_handle_topo_chg(struct ospf *ospf, struct ospf_lsa *lsa) if (IS_DEBUG_OSPF_GR_HELPER) zlog_debug( - "%s, Topo change detected due to lsa LSID:%s type:%d", - __PRETTY_FUNCTION__, inet_ntoa(lsa->data->id), + "%s, Topo change detected due to lsa LSID:%pI4 type:%d", + __PRETTY_FUNCTION__, &lsa->data->id, lsa->data->type); lsa->to_be_acknowledged = OSPF_GR_TRUE; @@ -670,8 +670,8 @@ void ospf_gr_helper_exit(struct ospf_neighbor *nbr, return; if (IS_DEBUG_OSPF_GR_HELPER) - zlog_debug("%s, Exiting from HELPER support to %s, due to %s", - __PRETTY_FUNCTION__, inet_ntoa(nbr->src), + zlog_debug("%s, Exiting from HELPER support to %pI4, due to %s", + __PRETTY_FUNCTION__, &nbr->src, ospf_exit_reason2str(reason)); /* Reset helper status*/ @@ -758,8 +758,8 @@ void ospf_process_maxage_grace_lsa(struct ospf *ospf, struct ospf_lsa *lsa, } if (IS_DEBUG_OSPF_GR_HELPER) - zlog_debug("%s, GraceLSA received for neighbour %s.", - __PRETTY_FUNCTION__, inet_ntoa(restartAddr)); + zlog_debug("%s, GraceLSA received for neighbour %pI4", + __PRETTY_FUNCTION__, &restartAddr); /* In case of broadcast links, if RESTARTER is DR_OTHER, * grace LSA might be received from DR, so fetching the @@ -1066,8 +1066,8 @@ static void show_ospf_grace_lsa_info(struct vty *vty, struct ospf_lsa *lsa) restartAddr = (struct grace_tlv_restart_addr *)tlvh; sum += TLV_SIZE(tlvh); - vty_out(vty, " Restarter address:%s\n", - inet_ntoa(restartAddr->addr)); + vty_out(vty, " Restarter address:%pI4\n", + &restartAddr->addr); break; default: vty_out(vty, " Unknown TLV type %d\n", diff --git a/ospfd/ospf_ia.c b/ospfd/ospf_ia.c index 7d6a19524a..f805899b81 100644 --- a/ospfd/ospf_ia.c +++ b/ospfd/ospf_ia.c @@ -130,6 +130,7 @@ static void ospf_ia_router_route(struct ospf *ospf, struct route_table *rtrs, if (IS_DEBUG_OSPF_EVENT) zlog_debug("ospf_ia_router_route(): considering %pFX", p); + /* Find a route to the same dest */ rn = route_node_get(rtrs, (struct prefix *)p); @@ -201,8 +202,8 @@ static int process_summary_lsa(struct ospf_area *area, struct route_table *rt, sl = (struct summary_lsa *)lsa->data; if (IS_DEBUG_OSPF_EVENT) - zlog_debug("process_summary_lsa(): LS ID: %s", - inet_ntoa(sl->header.id)); + zlog_debug("process_summary_lsa(): LS ID: %pI4", + &sl->header.id); metric = GET_METRIC(sl->metric); @@ -523,8 +524,8 @@ static int process_transit_summary_lsa(struct ospf_area *area, sl = (struct summary_lsa *)lsa->data; if (IS_DEBUG_OSPF_EVENT) - zlog_debug("process_transit_summaries(): LS ID: %s", - inet_ntoa(lsa->data->id)); + zlog_debug("process_transit_summaries(): LS ID: %pI4", + &lsa->data->id); metric = GET_METRIC(sl->metric); if (metric == OSPF_LS_INFINITY) { diff --git a/ospfd/ospf_interface.c b/ospfd/ospf_interface.c index 3d2c28b1e4..6e34740166 100644 --- a/ospfd/ospf_interface.c +++ b/ospfd/ospf_interface.c @@ -977,17 +977,17 @@ struct ospf_vl_data *ospf_vl_lookup(struct ospf *ospf, struct ospf_area *area, struct listnode *node; if (IS_DEBUG_OSPF_EVENT) { - zlog_debug("%s: Looking for %s", __func__, inet_ntoa(vl_peer)); + zlog_debug("%s: Looking for %pI4", __func__, &vl_peer); if (area) - zlog_debug("%s: in area %s", __func__, - inet_ntoa(area->area_id)); + zlog_debug("%s: in area %pI4", __func__, + &area->area_id); } for (ALL_LIST_ELEMENTS_RO(ospf->vlinks, node, vl_data)) { if (IS_DEBUG_OSPF_EVENT) - zlog_debug("%s: VL %s, peer %s", __func__, + zlog_debug("%s: VL %s, peer %pI4", __func__, vl_data->vl_oi->ifp->name, - inet_ntoa(vl_data->vl_peer)); + &vl_data->vl_peer); if (area && !IPV4_ADDR_SAME(&vl_data->vl_area_id, &area->area_id)) @@ -1109,9 +1109,9 @@ static int ospf_vl_set_params(struct ospf_area *area, } if (IS_DEBUG_OSPF_EVENT) - zlog_debug("%s: %s peer address: %s, cost: %d,%schanged", + zlog_debug("%s: %s peer address: %pI4, cost: %d,%schanged", __func__, vl_data->vl_oi->ifp->name, - inet_ntoa(vl_data->peer_addr), voi->output_cost, + &vl_data->peer_addr, voi->output_cost, (changed ? " " : " un")); return changed; @@ -1128,19 +1128,19 @@ void ospf_vl_up_check(struct ospf_area *area, struct in_addr rid, if (IS_DEBUG_OSPF_EVENT) { zlog_debug("ospf_vl_up_check(): Start"); - zlog_debug("ospf_vl_up_check(): Router ID is %s", - inet_ntoa(rid)); - zlog_debug("ospf_vl_up_check(): Area is %s", - inet_ntoa(area->area_id)); + zlog_debug("ospf_vl_up_check(): Router ID is %pI4", + &rid); + zlog_debug("ospf_vl_up_check(): Area is %pI4", + &area->area_id); } for (ALL_LIST_ELEMENTS_RO(ospf->vlinks, node, vl_data)) { if (IS_DEBUG_OSPF_EVENT) { - zlog_debug("%s: considering VL, %s in area %s", + zlog_debug("%s: considering VL, %s in area %pI4", __func__, vl_data->vl_oi->ifp->name, - inet_ntoa(vl_data->vl_area_id)); - zlog_debug("%s: peer ID: %s", __func__, - inet_ntoa(vl_data->vl_peer)); + &vl_data->vl_area_id); + zlog_debug("%s: peer ID: %pI4", __func__, + &vl_data->vl_peer); } if (IPV4_ADDR_SAME(&vl_data->vl_peer, &rid) @@ -1198,8 +1198,8 @@ int ospf_full_virtual_nbrs(struct ospf_area *area) { if (IS_DEBUG_OSPF_EVENT) { zlog_debug( - "counting fully adjacent virtual neighbors in area %s", - inet_ntoa(area->area_id)); + "counting fully adjacent virtual neighbors in area %pI4", + &area->area_id); zlog_debug("there are %d of them", area->full_vls); } diff --git a/ospfd/ospf_ism.c b/ospfd/ospf_ism.c index e9faa415fe..36e97f8779 100644 --- a/ospfd/ospf_ism.c +++ b/ospfd/ospf_ism.c @@ -223,8 +223,8 @@ int ospf_dr_election(struct ospf_interface *oi) new_state = ospf_ism_state(oi); - zlog_debug("DR-Election[1st]: Backup %s", inet_ntoa(BDR(oi))); - zlog_debug("DR-Election[1st]: DR %s", inet_ntoa(DR(oi))); + zlog_debug("DR-Election[1st]: Backup %pI4", &BDR(oi)); + zlog_debug("DR-Election[1st]: DR %pI4", &DR(oi)); if (new_state != old_state && !(new_state == ISM_DROther && old_state < ISM_DROther)) { @@ -233,8 +233,8 @@ int ospf_dr_election(struct ospf_interface *oi) new_state = ospf_ism_state(oi); - zlog_debug("DR-Election[2nd]: Backup %s", inet_ntoa(BDR(oi))); - zlog_debug("DR-Election[2nd]: DR %s", inet_ntoa(DR(oi))); + zlog_debug("DR-Election[2nd]: Backup %pI4", &BDR(oi)); + zlog_debug("DR-Election[2nd]: DR %pI4", &DR(oi)); } list_delete(&el_list); diff --git a/ospfd/ospf_ism.h b/ospfd/ospf_ism.h index 67ea4c4684..c41ba6c843 100644 --- a/ospfd/ospf_ism.h +++ b/ospfd/ospf_ism.h @@ -79,13 +79,7 @@ } while (0) /* Macro for OSPF ISM timer turn off. */ -#define OSPF_ISM_TIMER_OFF(X) \ - do { \ - if (X) { \ - thread_cancel(X); \ - (X) = NULL; \ - } \ - } while (0) +#define OSPF_ISM_TIMER_OFF(X) thread_cancel(&(X)) /* Macro for OSPF schedule event. */ #define OSPF_ISM_EVENT_SCHEDULE(I, E) \ diff --git a/ospfd/ospf_ldp_sync.c b/ospfd/ospf_ldp_sync.c index 96fa04b588..68792ebcc2 100644 --- a/ospfd/ospf_ldp_sync.c +++ b/ospfd/ospf_ldp_sync.c @@ -99,8 +99,7 @@ int ospf_ldp_sync_announce_update(struct ldp_igp_sync_announce announce) FOR_ALL_INTERFACES (vrf, ifp) ospf_ldp_sync_if_start(ifp, true); - THREAD_TIMER_OFF(ospf->ldp_sync_cmd.t_hello); - ospf->ldp_sync_cmd.t_hello = NULL; + THREAD_OFF(ospf->ldp_sync_cmd.t_hello); ospf->ldp_sync_cmd.sequence = 0; ospf_ldp_sync_hello_timer_add(ospf); @@ -140,7 +139,7 @@ int ospf_ldp_sync_hello_update(struct ldp_igp_sync_hello hello) FOR_ALL_INTERFACES (vrf, ifp) ospf_ldp_sync_if_start(ifp, true); } else { - THREAD_TIMER_OFF(ospf->ldp_sync_cmd.t_hello); + THREAD_OFF(ospf->ldp_sync_cmd.t_hello); ospf_ldp_sync_hello_timer_add(ospf); } ospf->ldp_sync_cmd.sequence = hello.sequence; @@ -249,8 +248,7 @@ void ospf_ldp_sync_if_complete(struct interface *ifp) if (ldp_sync_info && ldp_sync_info->enabled == LDP_IGP_SYNC_ENABLED) { if (ldp_sync_info->state == LDP_IGP_SYNC_STATE_REQUIRED_NOT_UP) ldp_sync_info->state = LDP_IGP_SYNC_STATE_REQUIRED_UP; - THREAD_TIMER_OFF(ldp_sync_info->t_holddown); - ldp_sync_info->t_holddown = NULL; + THREAD_OFF(ldp_sync_info->t_holddown); ospf_if_recalculate_output_cost(ifp); } } @@ -274,7 +272,7 @@ void ospf_ldp_sync_ldp_fail(struct interface *ifp) if (ldp_sync_info && ldp_sync_info->enabled == LDP_IGP_SYNC_ENABLED && ldp_sync_info->state != LDP_IGP_SYNC_STATE_NOT_REQUIRED) { - THREAD_TIMER_OFF(ldp_sync_info->t_holddown); + THREAD_OFF(ldp_sync_info->t_holddown); ldp_sync_info->state = LDP_IGP_SYNC_STATE_REQUIRED_NOT_UP; ospf_if_recalculate_output_cost(ifp); } @@ -337,7 +335,9 @@ void ospf_ldp_sync_if_remove(struct interface *ifp, bool remove) * restore cost */ ols_debug("ldp_sync: Removed from if %s", ifp->name); - THREAD_TIMER_OFF(ldp_sync_info->t_holddown); + + THREAD_OFF(ldp_sync_info->t_holddown); + ldp_sync_info->state = LDP_IGP_SYNC_STATE_NOT_REQUIRED; ospf_if_recalculate_output_cost(ifp); if (!CHECK_FLAG(ldp_sync_info->flags, LDP_SYNC_FLAG_IF_CONFIG)) @@ -386,7 +386,6 @@ static int ospf_ldp_sync_holddown_timer(struct thread *thread) ldp_sync_info = params->ldp_sync_info; ldp_sync_info->state = LDP_IGP_SYNC_STATE_REQUIRED_UP; - ldp_sync_info->t_holddown = NULL; ols_debug("ldp_sync: holddown timer expired for %s state: %s", ifp->name, "Sync achieved"); @@ -436,7 +435,6 @@ static int ospf_ldp_sync_hello_timer(struct thread *thread) */ ospf = ospf_lookup_by_vrf_id(VRF_DEFAULT); if (ospf) { - ospf->ldp_sync_cmd.t_hello = NULL; vrf = vrf_lookup_by_id(ospf->vrf_id); FOR_ALL_INTERFACES (vrf, ifp) @@ -486,8 +484,8 @@ void ospf_ldp_sync_gbl_exit(struct ospf *ospf, bool remove) UNSET_FLAG(ospf->ldp_sync_cmd.flags, LDP_SYNC_FLAG_ENABLE); UNSET_FLAG(ospf->ldp_sync_cmd.flags, LDP_SYNC_FLAG_HOLDDOWN); ospf->ldp_sync_cmd.holddown = LDP_IGP_SYNC_HOLDDOWN_DEFAULT; - THREAD_TIMER_OFF(ospf->ldp_sync_cmd.t_hello); - ospf->ldp_sync_cmd.t_hello = NULL; + + THREAD_OFF(ospf->ldp_sync_cmd.t_hello); /* turn off LDP-IGP Sync on all OSPF interfaces */ vrf = vrf_lookup_by_id(ospf->vrf_id); @@ -980,8 +978,7 @@ DEFPY (no_mpls_ldp_sync, SET_FLAG(ldp_sync_info->flags, LDP_SYNC_FLAG_IF_CONFIG); ldp_sync_info->enabled = LDP_IGP_SYNC_DEFAULT; ldp_sync_info->state = LDP_IGP_SYNC_STATE_NOT_REQUIRED; - THREAD_TIMER_OFF(ldp_sync_info->t_holddown); - ldp_sync_info->t_holddown = NULL; + THREAD_OFF(ldp_sync_info->t_holddown); ospf_if_recalculate_output_cost(ifp); return CMD_SUCCESS; diff --git a/ospfd/ospf_lsa.c b/ospfd/ospf_lsa.c index 2f72642bce..9ad7f2c4d7 100644 --- a/ospfd/ospf_lsa.c +++ b/ospfd/ospf_lsa.c @@ -98,8 +98,8 @@ int ospf_lsa_refresh_delay(struct ospf_lsa *lsa) if (IS_DEBUG_OSPF(lsa, LSA_GENERATE)) zlog_debug( - "LSA[Type%d:%s]: Refresh timer delay %d seconds", - lsa->data->type, inet_ntoa(lsa->data->id), + "LSA[Type%d:%pI4]: Refresh timer delay %d seconds", + lsa->data->type, &lsa->data->id, delay); assert(delay > 0); @@ -281,8 +281,8 @@ struct lsa_header *ospf_lsa_data_dup(struct lsa_header *lsah) void ospf_lsa_data_free(struct lsa_header *lsah) { if (IS_DEBUG_OSPF(lsa, LSA)) - zlog_debug("LSA[Type%d:%s]: data freed %p", lsah->type, - inet_ntoa(lsah->id), (void *)lsah); + zlog_debug("LSA[Type%d:%pI4]: data freed %p", lsah->type, + &lsah->id, (void *)lsah); XFREE(MTYPE_OSPF_LSA_DATA, lsah); } @@ -297,8 +297,8 @@ const char *dump_lsa_key(struct ospf_lsa *lsa) if (lsa != NULL && (lsah = lsa->data) != NULL) { char id[INET_ADDRSTRLEN], ar[INET_ADDRSTRLEN]; - strlcpy(id, inet_ntoa(lsah->id), sizeof(id)); - strlcpy(ar, inet_ntoa(lsah->adv_router), sizeof(ar)); + inet_ntop(AF_INET, &lsah->id, id, sizeof(id)); + inet_ntop(AF_INET, &lsah->adv_router, ar, sizeof(ar)); snprintf(buf, sizeof(buf), "Type%d,id(%s),ar(%s)", lsah->type, id, ar); @@ -628,10 +628,8 @@ static int lsa_link_ptomp_set(struct stream **s, struct ospf_interface *oi) cost); if (IS_DEBUG_OSPF(lsa, LSA_GENERATE)) zlog_debug( - "PointToMultipoint: set link to %s", - inet_ntoa( - oi->address->u - .prefix4)); + "PointToMultipoint: set link to %pI4", + &oi->address->u.prefix4); } return links; @@ -837,8 +835,8 @@ static struct ospf_lsa *ospf_router_lsa_originate(struct ospf_area *area) ospf_flood_through_area(area, NULL, new); if (IS_DEBUG_OSPF(lsa, LSA_GENERATE)) { - zlog_debug("LSA[Type%d:%s]: Originate router-LSA %p", - new->data->type, inet_ntoa(new->data->id), + zlog_debug("LSA[Type%d:%pI4]: Originate router-LSA %p", + new->data->type, &new->data->id, (void *)new); ospf_lsa_header_dump(new->data); } @@ -876,8 +874,8 @@ static struct ospf_lsa *ospf_router_lsa_refresh(struct ospf_lsa *lsa) /* Debug logging. */ if (IS_DEBUG_OSPF(lsa, LSA_GENERATE)) { - zlog_debug("LSA[Type%d:%s]: router-LSA refresh", - new->data->type, inet_ntoa(new->data->id)); + zlog_debug("LSA[Type%d:%pI4]: router-LSA refresh", + new->data->type, &new->data->id); ospf_lsa_header_dump(new->data); } @@ -929,9 +927,9 @@ int ospf_router_lsa_update(struct ospf *ospf) else if (!IPV4_ADDR_SAME(&lsa->data->id, &ospf->router_id)) { if (IS_DEBUG_OSPF(lsa, LSA_GENERATE)) zlog_debug( - "LSA[Type%d:%s]: Refresh router-LSA for Area %s", + "LSA[Type%d:%pI4]: Refresh router-LSA for Area %s", lsa->data->type, - inet_ntoa(lsa->data->id), area_str); + &lsa->data->id, area_str); ospf_refresher_unregister_lsa(ospf, lsa); ospf_lsa_flush_area(lsa, area); ospf_lsa_unlock(&area->router_lsa_self); @@ -1059,8 +1057,8 @@ void ospf_network_lsa_update(struct ospf_interface *oi) ospf_flood_through_area(oi->area, NULL, new); if (IS_DEBUG_OSPF(lsa, LSA_GENERATE)) { - zlog_debug("LSA[Type%d:%s]: Originate network-LSA %p", - new->data->type, inet_ntoa(new->data->id), + zlog_debug("LSA[Type%d:%pI4]: Originate network-LSA %p", + new->data->type, &new->data->id, (void *)new); ospf_lsa_header_dump(new->data); } @@ -1082,8 +1080,8 @@ static struct ospf_lsa *ospf_network_lsa_refresh(struct ospf_lsa *lsa) if (oi == NULL) { if (IS_DEBUG_OSPF(lsa, LSA_GENERATE)) { zlog_debug( - "LSA[Type%d:%s]: network-LSA refresh: no oi found, ick, ignoring.", - lsa->data->type, inet_ntoa(lsa->data->id)); + "LSA[Type%d:%pI4]: network-LSA refresh: no oi found, ick, ignoring.", + lsa->data->type, &lsa->data->id); ospf_lsa_header_dump(lsa->data); } return NULL; @@ -1112,8 +1110,8 @@ static struct ospf_lsa *ospf_network_lsa_refresh(struct ospf_lsa *lsa) ospf_flood_through_area(area, NULL, new); if (IS_DEBUG_OSPF(lsa, LSA_GENERATE)) { - zlog_debug("LSA[Type%d:%s]: network-LSA refresh", - new->data->type, inet_ntoa(new->data->id)); + zlog_debug("LSA[Type%d:%pI4]: network-LSA refresh", + new->data->type, &new->data->id); ospf_lsa_header_dump(new->data); } @@ -1231,8 +1229,8 @@ struct ospf_lsa *ospf_summary_lsa_originate(struct prefix_ipv4 *p, ospf_flood_through_area(area, NULL, new); if (IS_DEBUG_OSPF(lsa, LSA_GENERATE)) { - zlog_debug("LSA[Type%d:%s]: Originate summary-LSA %p", - new->data->type, inet_ntoa(new->data->id), + zlog_debug("LSA[Type%d:%pI4]: Originate summary-LSA %p", + new->data->type, &new->data->id, (void *)new); ospf_lsa_header_dump(new->data); } @@ -1267,8 +1265,8 @@ static struct ospf_lsa *ospf_summary_lsa_refresh(struct ospf *ospf, /* Debug logging. */ if (IS_DEBUG_OSPF(lsa, LSA_GENERATE)) { - zlog_debug("LSA[Type%d:%s]: summary-LSA refresh", - new->data->type, inet_ntoa(new->data->id)); + zlog_debug("LSA[Type%d:%pI4]: summary-LSA refresh", + new->data->type, &new->data->id); ospf_lsa_header_dump(new->data); } @@ -1374,8 +1372,8 @@ struct ospf_lsa *ospf_summary_asbr_lsa_originate(struct prefix_ipv4 *p, ospf_flood_through_area(area, NULL, new); if (IS_DEBUG_OSPF(lsa, LSA_GENERATE)) { - zlog_debug("LSA[Type%d:%s]: Originate summary-ASBR-LSA %p", - new->data->type, inet_ntoa(new->data->id), + zlog_debug("LSA[Type%d:%pI4]: Originate summary-ASBR-LSA %p", + new->data->type, &new->data->id, (void *)new); ospf_lsa_header_dump(new->data); } @@ -1408,8 +1406,8 @@ static struct ospf_lsa *ospf_summary_asbr_lsa_refresh(struct ospf *ospf, ospf_flood_through_area(new->area, NULL, new); if (IS_DEBUG_OSPF(lsa, LSA_GENERATE)) { - zlog_debug("LSA[Type%d:%s]: summary-ASBR-LSA refresh", - new->data->type, inet_ntoa(new->data->id)); + zlog_debug("LSA[Type%d:%pI4]: summary-ASBR-LSA refresh", + new->data->type, &new->data->id); ospf_lsa_header_dump(new->data); } @@ -1758,8 +1756,8 @@ static struct ospf_lsa *ospf_lsa_translated_nssa_new(struct ospf *ospf, == NULL) { if (IS_DEBUG_OSPF_NSSA) zlog_debug( - "ospf_nssa_translate_originate(): Could not originate Translated Type-5 for %s", - inet_ntoa(ei.p.prefix)); + "ospf_nssa_translate_originate(): Could not originate Translated Type-5 for %pI4", + &ei.p.prefix); return NULL; } @@ -1792,8 +1790,8 @@ struct ospf_lsa *ospf_translated_nssa_originate(struct ospf *ospf, if ((new = ospf_lsa_translated_nssa_new(ospf, type7)) == NULL) { if (IS_DEBUG_OSPF_NSSA) zlog_debug( - "ospf_translated_nssa_originate(): Could not translate Type-7, Id %s, to Type-5", - inet_ntoa(type7->data->id)); + "ospf_translated_nssa_originate(): Could not translate Type-7, Id %pI4, to Type-5", + &type7->data->id); return NULL; } @@ -1802,8 +1800,8 @@ struct ospf_lsa *ospf_translated_nssa_originate(struct ospf *ospf, if ((new = ospf_lsa_install(ospf, NULL, new)) == NULL) { flog_warn( EC_OSPF_LSA_INSTALL_FAILURE, - "ospf_lsa_translated_nssa_originate(): Could not install LSA id %s", - inet_ntoa(type7->data->id)); + "ospf_lsa_translated_nssa_originate(): Could not install LSA id %pI4", + &type7->data->id); return NULL; } @@ -1812,8 +1810,8 @@ struct ospf_lsa *ospf_translated_nssa_originate(struct ospf *ospf, "ospf_translated_nssa_originate(): translated Type 7, installed:"); ospf_lsa_header_dump(new->data); zlog_debug(" Network mask: %d", ip_masklen(extnew->mask)); - zlog_debug(" Forward addr: %s", - inet_ntoa(extnew->e[0].fwd_addr)); + zlog_debug(" Forward addr: %pI4", + &extnew->e[0].fwd_addr); } ospf->lsa_originate_count++; @@ -1878,8 +1876,8 @@ struct ospf_lsa *ospf_translated_nssa_refresh(struct ospf *ospf, if (!type7) { if (IS_DEBUG_OSPF_NSSA) zlog_debug( - "ospf_translated_nssa_refresh(): no Type-7 found for Type-5 LSA Id %s", - inet_ntoa(type5->data->id)); + "ospf_translated_nssa_refresh(): no Type-7 found for Type-5 LSA Id %pI4", + &type5->data->id); return NULL; } @@ -1887,8 +1885,8 @@ struct ospf_lsa *ospf_translated_nssa_refresh(struct ospf *ospf, if (type5 == NULL || !CHECK_FLAG(type5->flags, OSPF_LSA_LOCAL_XLT)) { if (IS_DEBUG_OSPF_NSSA) zlog_debug( - "ospf_translated_nssa_refresh(): No translated Type-5 found for Type-7 with Id %s", - inet_ntoa(type7->data->id)); + "ospf_translated_nssa_refresh(): No translated Type-5 found for Type-7 with Id %pI4", + &type7->data->id); return NULL; } @@ -1899,16 +1897,16 @@ struct ospf_lsa *ospf_translated_nssa_refresh(struct ospf *ospf, if ((new = ospf_lsa_translated_nssa_new(ospf, type7)) == NULL) { if (IS_DEBUG_OSPF_NSSA) zlog_debug( - "ospf_translated_nssa_refresh(): Could not translate Type-7 for %s to Type-5", - inet_ntoa(type7->data->id)); + "ospf_translated_nssa_refresh(): Could not translate Type-7 for %pI4 to Type-5", + &type7->data->id); return NULL; } if (!(new = ospf_lsa_install(ospf, NULL, new))) { flog_warn( EC_OSPF_LSA_INSTALL_FAILURE, - "ospf_translated_nssa_refresh(): Could not install translated LSA, Id %s", - inet_ntoa(type7->data->id)); + "ospf_translated_nssa_refresh(): Could not install translated LSA, Id %pI4", + &type7->data->id); return NULL; } @@ -1987,8 +1985,8 @@ struct ospf_lsa *ospf_external_lsa_originate(struct ospf *ospf, if ((new = ospf_external_lsa_new(ospf, ei, NULL)) == NULL) { if (IS_DEBUG_OSPF_EVENT) zlog_debug( - "LSA[Type5:%s]: Could not originate AS-external-LSA", - inet_ntoa(ei->p.prefix)); + "LSA[Type5:%pI4]: Could not originate AS-external-LSA", + &ei->p.prefix); return NULL; } @@ -2010,8 +2008,8 @@ struct ospf_lsa *ospf_external_lsa_originate(struct ospf *ospf, /* Debug logging. */ if (IS_DEBUG_OSPF(lsa, LSA_GENERATE)) { - zlog_debug("LSA[Type%d:%s]: Originate AS-external-LSA %p", - new->data->type, inet_ntoa(new->data->id), + zlog_debug("LSA[Type%d:%pI4]: Originate AS-external-LSA %p", + new->data->type, &new->data->id, (void *)new); ospf_lsa_header_dump(new->data); } @@ -2254,8 +2252,8 @@ struct ospf_lsa *ospf_external_lsa_refresh(struct ospf *ospf, if (!ospf_redistribute_check(ospf, ei, &changed)) { if (IS_DEBUG_OSPF(lsa, LSA_GENERATE)) zlog_debug( - "LSA[Type%d:%s]: Could not be refreshed, redist check fail", - lsa->data->type, inet_ntoa(lsa->data->id)); + "LSA[Type%d:%pI4]: Could not be refreshed, redist check fail", + lsa->data->type, &lsa->data->id); ospf_external_lsa_flush(ospf, ei->type, &ei->p, ei->ifindex /*, ei->nexthop */); return NULL; @@ -2264,8 +2262,8 @@ struct ospf_lsa *ospf_external_lsa_refresh(struct ospf *ospf, if (!changed && !force) { if (IS_DEBUG_OSPF(lsa, LSA_GENERATE)) zlog_debug( - "LSA[Type%d:%s]: Not refreshed, not changed/forced", - lsa->data->type, inet_ntoa(lsa->data->id)); + "LSA[Type%d:%pI4]: Not refreshed, not changed/forced", + lsa->data->type, &lsa->data->id); return NULL; } @@ -2279,8 +2277,8 @@ struct ospf_lsa *ospf_external_lsa_refresh(struct ospf *ospf, if (new == NULL) { if (IS_DEBUG_OSPF(lsa, LSA_GENERATE)) - zlog_debug("LSA[Type%d:%s]: Could not be refreshed", - lsa->data->type, inet_ntoa(lsa->data->id)); + zlog_debug("LSA[Type%d:%pI4]: Could not be refreshed", + lsa->data->type, &lsa->data->id); return NULL; } @@ -2305,8 +2303,8 @@ struct ospf_lsa *ospf_external_lsa_refresh(struct ospf *ospf, /* Debug logging. */ if (IS_DEBUG_OSPF(lsa, LSA_GENERATE)) { - zlog_debug("LSA[Type%d:%s]: AS-external-LSA refresh", - new->data->type, inet_ntoa(new->data->id)); + zlog_debug("LSA[Type%d:%pI4]: AS-external-LSA refresh", + new->data->type, &new->data->id); ospf_lsa_header_dump(new->data); } @@ -2681,8 +2679,6 @@ struct ospf_lsa *ospf_lsa_install(struct ospf *ospf, struct ospf_interface *oi, /* Debug logs. */ if (IS_DEBUG_OSPF(lsa, LSA_INSTALL)) { - char area_str[INET_ADDRSTRLEN]; - switch (lsa->data->type) { case OSPF_AS_EXTERNAL_LSA: case OSPF_OPAQUE_AS_LSA: @@ -2692,13 +2688,11 @@ struct ospf_lsa *ospf_lsa_install(struct ospf *ospf, struct ospf_interface *oi, new->data->type, NULL)); break; default: - strlcpy(area_str, inet_ntoa(new->area->area_id), - sizeof(area_str)); - zlog_debug("LSA[%s]: Install %s to Area %s", + zlog_debug("LSA[%s]: Install %s to Area %pI4", dump_lsa_key(new), lookup_msg(ospf_lsa_type_msg, new->data->type, NULL), - area_str); + &new->area->area_id); break; } } @@ -2709,8 +2703,8 @@ struct ospf_lsa *ospf_lsa_install(struct ospf *ospf, struct ospf_interface *oi, */ if (IS_LSA_MAXAGE(new)) { if (IS_DEBUG_OSPF(lsa, LSA_INSTALL)) - zlog_debug("LSA[Type%d:%s]: Install LSA 0x%p, MaxAge", - new->data->type, inet_ntoa(new->data->id), + zlog_debug("LSA[Type%d:%pI4]: Install LSA 0x%p, MaxAge", + new->data->type, &new->data->id, (void *)lsa); ospf_lsa_maxage(ospf, lsa); } @@ -2786,16 +2780,16 @@ static int ospf_maxage_lsa_remover(struct thread *thread) if (IS_LSA_SELF(lsa)) if (IS_DEBUG_OSPF(lsa, LSA_FLOODING)) zlog_debug( - "LSA[Type%d:%s]: LSA 0x%lx is self-originated: ", + "LSA[Type%d:%pI4]: LSA 0x%lx is self-originated: ", lsa->data->type, - inet_ntoa(lsa->data->id), + &lsa->data->id, (unsigned long)lsa); if (IS_DEBUG_OSPF(lsa, LSA_FLOODING)) zlog_debug( - "LSA[Type%d:%s]: MaxAge LSA removed from list", + "LSA[Type%d:%pI4]: MaxAge LSA removed from list", lsa->data->type, - inet_ntoa(lsa->data->id)); + &lsa->data->id); if (CHECK_FLAG(lsa->flags, OSPF_LSA_PREMATURE_AGE)) { if (IS_DEBUG_OSPF(lsa, LSA_FLOODING)) @@ -2812,9 +2806,9 @@ static int ospf_maxage_lsa_remover(struct thread *thread) } else { if (IS_DEBUG_OSPF(lsa, LSA_FLOODING)) zlog_debug( - "%s: LSA[Type%d:%s]: No associated LSDB!", + "%s: LSA[Type%d:%pI4]: No associated LSDB!", __func__, lsa->data->type, - inet_ntoa(lsa->data->id)); + &lsa->data->id); } } @@ -2871,8 +2865,8 @@ void ospf_lsa_maxage(struct ospf *ospf, struct ospf_lsa *lsa) if (CHECK_FLAG(lsa->flags, OSPF_LSA_IN_MAXAGE)) { if (IS_DEBUG_OSPF(lsa, LSA_FLOODING)) zlog_debug( - "LSA[Type%d:%s]: %p already exists on MaxAge LSA list", - lsa->data->type, inet_ntoa(lsa->data->id), + "LSA[Type%d:%pI4]: %p already exists on MaxAge LSA list", + lsa->data->type, &lsa->data->id, (void *)lsa); return; } @@ -3107,8 +3101,8 @@ struct ospf_lsa *ospf_lsa_lookup_by_header(struct ospf_area *area, if (match == NULL) if (IS_DEBUG_OSPF(lsa, LSA) == OSPF_DEBUG_LSA) - zlog_debug("LSA[Type%d:%s]: Lookup by header, NO MATCH", - lsah->type, inet_ntoa(lsah->id)); + zlog_debug("LSA[Type%d:%pI4]: Lookup by header, NO MATCH", + lsah->type, &lsah->id); return match; } @@ -3204,8 +3198,8 @@ int ospf_lsa_flush_schedule(struct ospf *ospf, struct ospf_lsa *lsa) if (IS_DEBUG_OSPF_EVENT) zlog_debug( - "LSA[Type%d:%s]: Schedule self-originated LSA to FLUSH", - lsa->data->type, inet_ntoa(lsa->data->id)); + "LSA[Type%d:%pI4]: Schedule self-originated LSA to FLUSH", + lsa->data->type, &lsa->data->id); /* Force given lsa's age to MaxAge. */ lsa->data->ls_age = htons(OSPF_LSA_MAXAGE); @@ -3242,9 +3236,9 @@ void ospf_flush_self_originated_lsas_now(struct ospf *ospf) if ((lsa = area->router_lsa_self) != NULL) { if (IS_DEBUG_OSPF_EVENT) zlog_debug( - "LSA[Type%d:%s]: Schedule self-originated LSA to FLUSH", + "LSA[Type%d:%pI4]: Schedule self-originated LSA to FLUSH", lsa->data->type, - inet_ntoa(lsa->data->id)); + &lsa->data->id); ospf_refresher_unregister_lsa(ospf, lsa); ospf_lsa_flush_area(lsa, area); @@ -3257,9 +3251,9 @@ void ospf_flush_self_originated_lsas_now(struct ospf *ospf) && oi->state == ISM_DR && oi->full_nbrs > 0) { if (IS_DEBUG_OSPF_EVENT) zlog_debug( - "LSA[Type%d:%s]: Schedule self-originated LSA to FLUSH", + "LSA[Type%d:%pI4]: Schedule self-originated LSA to FLUSH", lsa->data->type, - inet_ntoa(lsa->data->id)); + &lsa->data->id); ospf_refresher_unregister_lsa( ospf, oi->network_lsa_self); @@ -3527,8 +3521,8 @@ void ospf_refresher_register_lsa(struct ospf *ospf, struct ospf_lsa *lsa) if (IS_DEBUG_OSPF(lsa, LSA_REFRESH)) zlog_debug( - "LSA[Refresh:Type%d:%s]: age %d, added to index %d", - lsa->data->type, inet_ntoa(lsa->data->id), + "LSA[Refresh:Type%d:%pI4]: age %d, added to index %d", + lsa->data->type, &lsa->data->id, LS_AGE(lsa), index); if (!ospf->lsa_refresh_queue.qs[index]) @@ -3540,8 +3534,8 @@ void ospf_refresher_register_lsa(struct ospf *ospf, struct ospf_lsa *lsa) if (IS_DEBUG_OSPF(lsa, LSA_REFRESH)) zlog_debug( - "LSA[Refresh:Type%d:%s]: ospf_refresher_register_lsa(): setting refresh_list on lsa %p (slod %d)", - lsa->data->type, inet_ntoa(lsa->data->id), + "LSA[Refresh:Type%d:%pI4]: ospf_refresher_register_lsa(): setting refresh_list on lsa %p (slod %d)", + lsa->data->type, &lsa->data->id, (void *)lsa, index); } } @@ -3612,9 +3606,9 @@ int ospf_lsa_refresh_walker(struct thread *t) lsa)) { if (IS_DEBUG_OSPF(lsa, LSA_REFRESH)) zlog_debug( - "LSA[Refresh:Type%d:%s]: ospf_lsa_refresh_walker(): refresh lsa %p (slot %d)", + "LSA[Refresh:Type%d:%pI4]: ospf_lsa_refresh_walker(): refresh lsa %p (slot %d)", lsa->data->type, - inet_ntoa(lsa->data->id), + &lsa->data->id, (void *)lsa, i); assert(lsa->lock > 0); @@ -3645,3 +3639,34 @@ int ospf_lsa_refresh_walker(struct thread *t) return 0; } + +/* Flush the LSAs for the specific area */ +void ospf_flush_lsa_from_area(struct ospf *ospf, struct in_addr area_id, + int type) +{ + struct ospf_area *area; + struct route_node *rn; + struct ospf_lsa *lsa; + + area = ospf_area_get(ospf, area_id); + + switch (type) { + case OSPF_AS_EXTERNAL_LSA: + if ((area->external_routing == OSPF_AREA_NSSA) || + (area->external_routing == OSPF_AREA_STUB)) { + LSDB_LOOP (EXTERNAL_LSDB(ospf), rn, lsa) + if (IS_LSA_SELF(lsa) && + !(CHECK_FLAG(lsa->flags, + OSPF_LSA_LOCAL_XLT))) + ospf_lsa_flush_area(lsa, area); + } + break; + case OSPF_AS_NSSA_LSA: + LSDB_LOOP (NSSA_LSDB(area), rn, lsa) + if (IS_LSA_SELF(lsa)) + ospf_lsa_flush_area(lsa, area); + break; + default: + break; + } +} diff --git a/ospfd/ospf_lsa.h b/ospfd/ospf_lsa.h index 90f7b53632..e63af4b347 100644 --- a/ospfd/ospf_lsa.h +++ b/ospfd/ospf_lsa.h @@ -339,5 +339,6 @@ extern struct ospf_lsa *ospf_translated_nssa_refresh(struct ospf *, struct ospf_lsa *); extern struct ospf_lsa *ospf_translated_nssa_originate(struct ospf *, struct ospf_lsa *); - +extern void ospf_flush_lsa_from_area(struct ospf *ospf, struct in_addr area_id, + int type); #endif /* _ZEBRA_OSPF_LSA_H */ diff --git a/ospfd/ospf_neighbor.c b/ospfd/ospf_neighbor.c index 52ee21473d..2fa43923ab 100644 --- a/ospfd/ospf_neighbor.c +++ b/ospfd/ospf_neighbor.c @@ -184,8 +184,8 @@ void ospf_nbr_delete(struct ospf_neighbor *nbr) rn->info = NULL; route_unlock_node(rn); } else - zlog_info("Can't find neighbor %s in the interface %s", - inet_ntoa(nbr->src), IF_NAME(oi)); + zlog_info("Can't find neighbor %pI4 in the interface %s", + &nbr->src, IF_NAME(oi)); route_unlock_node(rn); } else { @@ -284,9 +284,8 @@ void ospf_nbr_add_self(struct ospf_interface *oi, struct in_addr router_id) /* There is already pseudo neighbor. */ if (IS_DEBUG_OSPF_EVENT) zlog_debug( - "router_id %s already present in neighbor table. node refcount %u", - inet_ntoa(router_id), - route_node_get_lock_count(rn)); + "router_id %pI4 already present in neighbor table. node refcount %u", + &router_id, route_node_get_lock_count(rn)); route_unlock_node(rn); } else rn->info = oi->nbr_self; @@ -402,8 +401,8 @@ void ospf_renegotiate_optional_capabilities(struct ospf *top) if (IS_DEBUG_OSPF_EVENT) zlog_debug( - "Renegotiate optional capabilities with neighbor(%s)", - inet_ntoa(nbr->router_id)); + "Renegotiate optional capabilities with neighbor(%pI4)", + &nbr->router_id); OSPF_NSM_EVENT_SCHEDULE(nbr, NSM_SeqNumberMismatch); } @@ -460,8 +459,8 @@ static struct ospf_neighbor *ospf_nbr_add(struct ospf_interface *oi, nbr->crypt_seqnum = ospfh->u.crypt.crypt_seqnum; if (IS_DEBUG_OSPF_EVENT) - zlog_debug("NSM[%s:%s]: start", IF_NAME(oi), - inet_ntoa(nbr->router_id)); + zlog_debug("NSM[%s:%pI4]: start", IF_NAME(oi), + &nbr->router_id); return nbr; } diff --git a/ospfd/ospf_network.c b/ospfd/ospf_network.c index 28aec41eba..00fbdc21a1 100644 --- a/ospfd/ospf_network.c +++ b/ospfd/ospf_network.c @@ -53,14 +53,14 @@ int ospf_if_add_allspfrouters(struct ospf *top, struct prefix *p, if (ret < 0) flog_err( EC_LIB_SOCKET, - "can't setsockopt IP_ADD_MEMBERSHIP (fd %d, addr %s, ifindex %u, AllSPFRouters): %s; perhaps a kernel limit on # of multicast group memberships has been exceeded?", - top->fd, inet_ntoa(p->u.prefix4), ifindex, + "can't setsockopt IP_ADD_MEMBERSHIP (fd %d, addr %pI4, ifindex %u, AllSPFRouters): %s; perhaps a kernel limit on # of multicast group memberships has been exceeded?", + top->fd, &p->u.prefix4, ifindex, safe_strerror(errno)); else { if (IS_DEBUG_OSPF_EVENT) zlog_debug( - "interface %s [%u] join AllSPFRouters Multicast group.", - inet_ntoa(p->u.prefix4), ifindex); + "interface %pI4 [%u] join AllSPFRouters Multicast group.", + &p->u.prefix4, ifindex); } return ret; @@ -76,14 +76,14 @@ int ospf_if_drop_allspfrouters(struct ospf *top, struct prefix *p, ifindex); if (ret < 0) flog_err(EC_LIB_SOCKET, - "can't setsockopt IP_DROP_MEMBERSHIP (fd %d, addr %s, ifindex %u, AllSPFRouters): %s", - top->fd, inet_ntoa(p->u.prefix4), ifindex, + "can't setsockopt IP_DROP_MEMBERSHIP (fd %d, addr %pI4, ifindex %u, AllSPFRouters): %s", + top->fd, &p->u.prefix4, ifindex, safe_strerror(errno)); else { if (IS_DEBUG_OSPF_EVENT) zlog_debug( - "interface %s [%u] leave AllSPFRouters Multicast group.", - inet_ntoa(p->u.prefix4), ifindex); + "interface %pI4 [%u] leave AllSPFRouters Multicast group.", + &p->u.prefix4, ifindex); } return ret; @@ -101,13 +101,13 @@ int ospf_if_add_alldrouters(struct ospf *top, struct prefix *p, if (ret < 0) flog_err( EC_LIB_SOCKET, - "can't setsockopt IP_ADD_MEMBERSHIP (fd %d, addr %s, ifindex %u, AllDRouters): %s; perhaps a kernel limit on # of multicast group memberships has been exceeded?", - top->fd, inet_ntoa(p->u.prefix4), ifindex, + "can't setsockopt IP_ADD_MEMBERSHIP (fd %d, addr %pI4, ifindex %u, AllDRouters): %s; perhaps a kernel limit on # of multicast group memberships has been exceeded?", + top->fd, &p->u.prefix4, ifindex, safe_strerror(errno)); else zlog_debug( - "interface %s [%u] join AllDRouters Multicast group.", - inet_ntoa(p->u.prefix4), ifindex); + "interface %pI4 [%u] join AllDRouters Multicast group.", + &p->u.prefix4, ifindex); return ret; } @@ -122,13 +122,13 @@ int ospf_if_drop_alldrouters(struct ospf *top, struct prefix *p, ifindex); if (ret < 0) flog_err(EC_LIB_SOCKET, - "can't setsockopt IP_DROP_MEMBERSHIP (fd %d, addr %s, ifindex %u, AllDRouters): %s", - top->fd, inet_ntoa(p->u.prefix4), ifindex, + "can't setsockopt IP_DROP_MEMBERSHIP (fd %d, addr %pI4, ifindex %u, AllDRouters): %s", + top->fd, &p->u.prefix4, ifindex, safe_strerror(errno)); else zlog_debug( - "interface %s [%u] leave AllDRouters Multicast group.", - inet_ntoa(p->u.prefix4), ifindex); + "interface %pI4 [%u] leave AllDRouters Multicast group.", + &p->u.prefix4, ifindex); return ret; } @@ -161,8 +161,8 @@ int ospf_if_ipmulticast(struct ospf *top, struct prefix *p, ifindex_t ifindex) ret = setsockopt_ipv4_multicast_if(top->fd, p->u.prefix4, ifindex); if (ret < 0) flog_err(EC_LIB_SOCKET, - "can't setsockopt IP_MULTICAST_IF(fd %d, addr %s, ifindex %u): %s", - top->fd, inet_ntoa(p->u.prefix4), ifindex, + "can't setsockopt IP_MULTICAST_IF(fd %d, addr %pI4, ifindex %u): %s", + top->fd, &p->u.prefix4, ifindex, safe_strerror(errno)); #endif diff --git a/ospfd/ospf_nsm.c b/ospfd/ospf_nsm.c index 2931831826..26e7855e8c 100644 --- a/ospfd/ospf_nsm.c +++ b/ospfd/ospf_nsm.c @@ -66,8 +66,8 @@ static int ospf_inactivity_timer(struct thread *thread) nbr->t_inactivity = NULL; if (IS_DEBUG_OSPF(nsm, NSM_TIMERS)) - zlog_debug("NSM[%s:%s:%s]: Timer (Inactivity timer expire)", - IF_NAME(nbr->oi), inet_ntoa(nbr->router_id), + zlog_debug("NSM[%s:%pI4:%s]: Timer (Inactivity timer expire)", + IF_NAME(nbr->oi), &nbr->router_id, ospf_get_name(nbr->oi->ospf)); /* Dont trigger NSM_InactivityTimer event , if the current @@ -91,8 +91,8 @@ static int ospf_db_desc_timer(struct thread *thread) nbr->t_db_desc = NULL; if (IS_DEBUG_OSPF(nsm, NSM_TIMERS)) - zlog_debug("NSM[%s:%s:%s]: Timer (DD Retransmit timer expire)", - IF_NAME(nbr->oi), inet_ntoa(nbr->src), + zlog_debug("NSM[%s:%pI4:%s]: Timer (DD Retransmit timer expire)", + IF_NAME(nbr->oi), &nbr->src, ospf_get_name(nbr->oi->ospf)); /* resent last send DD packet. */ @@ -398,9 +398,9 @@ static int nsm_kill_nbr(struct ospf_neighbor *nbr) if (IS_DEBUG_OSPF(nsm, NSM_EVENTS)) zlog_debug( - "NSM[%s:%s:%s]: Down (PollIntervalTimer scheduled)", + "NSM[%s:%pI4:%s]: Down (PollIntervalTimer scheduled)", IF_NAME(nbr->oi), - inet_ntoa(nbr->address.u.prefix4), + &nbr->address.u.prefix4, ospf_get_name(nbr->oi->ospf)); } @@ -597,8 +597,8 @@ static void nsm_notice_state_change(struct ospf_neighbor *nbr, int next_state, { /* Logging change of status. */ if (IS_DEBUG_OSPF(nsm, NSM_STATUS)) - zlog_debug("NSM[%s:%s:%s]: State change %s -> %s (%s)", - IF_NAME(nbr->oi), inet_ntoa(nbr->router_id), + zlog_debug("NSM[%s:%pI4:%s]: State change %s -> %s (%s)", + IF_NAME(nbr->oi), &nbr->router_id, ospf_get_name(nbr->oi->ospf), lookup_msg(ospf_nsm_state_msg, nbr->state, NULL), lookup_msg(ospf_nsm_state_msg, next_state, NULL), @@ -608,8 +608,8 @@ static void nsm_notice_state_change(struct ospf_neighbor *nbr, int next_state, if (CHECK_FLAG(nbr->oi->ospf->config, OSPF_LOG_ADJACENCY_CHANGES) && (CHECK_FLAG(nbr->oi->ospf->config, OSPF_LOG_ADJACENCY_DETAIL) || (next_state == NSM_Full) || (next_state < nbr->state))) - zlog_notice("AdjChg: Nbr %s(%s) on %s: %s -> %s (%s)", - inet_ntoa(nbr->router_id), + zlog_notice("AdjChg: Nbr %pI4(%s) on %s: %s -> %s (%s)", + &nbr->router_id, ospf_get_name(nbr->oi->ospf), IF_NAME(nbr->oi), lookup_msg(ospf_nsm_state_msg, nbr->state, NULL), lookup_msg(ospf_nsm_state_msg, next_state, NULL), @@ -691,8 +691,8 @@ static void nsm_change_state(struct ospf_neighbor *nbr, int state) if (CHECK_FLAG(oi->ospf->config, OSPF_LOG_ADJACENCY_DETAIL)) zlog_info( - "%s:[%s:%s], %s -> %s): scheduling new router-LSA origination", - __func__, inet_ntoa(nbr->router_id), + "%s:[%pI4:%s], %s -> %s): scheduling new router-LSA origination", + __func__, &nbr->router_id, ospf_get_name(oi->ospf), lookup_msg(ospf_nsm_state_msg, old_state, NULL), lookup_msg(ospf_nsm_state_msg, state, NULL)); @@ -749,10 +749,10 @@ static void nsm_change_state(struct ospf_neighbor *nbr, int state) OSPF_DD_FLAG_I | OSPF_DD_FLAG_M | OSPF_DD_FLAG_MS; if (CHECK_FLAG(oi->ospf->config, OSPF_LOG_ADJACENCY_DETAIL)) zlog_info( - "%s: Initializing [DD]: %s with seqnum:%x , flags:%x", + "%s: Initializing [DD]: %pI4 with seqnum:%x , flags:%x", (oi->ospf->name) ? oi->ospf->name : VRF_DEFAULT_NAME, - inet_ntoa(nbr->router_id), nbr->dd_seqnum, + &nbr->router_id, nbr->dd_seqnum, nbr->dd_flags); ospf_db_desc_send(nbr); } @@ -777,8 +777,8 @@ int ospf_nsm_event(struct thread *thread) event = THREAD_VAL(thread); if (IS_DEBUG_OSPF(nsm, NSM_EVENTS)) - zlog_debug("NSM[%s:%s:%s]: %s (%s)", IF_NAME(nbr->oi), - inet_ntoa(nbr->router_id), + zlog_debug("NSM[%s:%pI4:%s]: %s (%s)", IF_NAME(nbr->oi), + &nbr->router_id, ospf_get_name(nbr->oi->ospf), lookup_msg(ospf_nsm_state_msg, nbr->state, NULL), ospf_nsm_event_str[event]); @@ -802,8 +802,8 @@ int ospf_nsm_event(struct thread *thread) */ flog_err( EC_OSPF_FSM_INVALID_STATE, - "NSM[%s:%s:%s]: %s (%s): Warning: action tried to change next_state to %s", - IF_NAME(nbr->oi), inet_ntoa(nbr->router_id), + "NSM[%s:%pI4:%s]: %s (%s): Warning: action tried to change next_state to %s", + IF_NAME(nbr->oi), &nbr->router_id, ospf_get_name(nbr->oi->ospf), lookup_msg(ospf_nsm_state_msg, nbr->state, NULL), diff --git a/ospfd/ospf_nsm.h b/ospfd/ospf_nsm.h index c219ba7386..24cf05009c 100644 --- a/ospfd/ospf_nsm.h +++ b/ospfd/ospf_nsm.h @@ -59,13 +59,7 @@ #define OSPF_NSM_TIMER_ON(T,F,V) thread_add_timer (master, (F), nbr, (V), &(T)) /* Macro for OSPF NSM timer turn off. */ -#define OSPF_NSM_TIMER_OFF(X) \ - do { \ - if (X) { \ - thread_cancel(X); \ - (X) = NULL; \ - } \ - } while (0) +#define OSPF_NSM_TIMER_OFF(X) thread_cancel(&(X)) /* Macro for OSPF NSM schedule event. */ #define OSPF_NSM_EVENT_SCHEDULE(N, E) \ diff --git a/ospfd/ospf_opaque.c b/ospfd/ospf_opaque.c index 061ada5b16..5ba61b3184 100644 --- a/ospfd/ospf_opaque.c +++ b/ospfd/ospf_opaque.c @@ -1469,8 +1469,8 @@ static int ospf_opaque_type10_lsa_originate(struct thread *t) if (IS_DEBUG_OSPF_EVENT) zlog_debug( - "Timer[Type10-LSA]: Originate Opaque-LSAs for Area %s", - inet_ntoa(area->area_id)); + "Timer[Type10-LSA]: Originate Opaque-LSAs for Area %pI4", + &area->area_id); rc = opaque_lsa_originate_callback(ospf_opaque_type10_funclist, area); @@ -1626,8 +1626,8 @@ struct ospf_lsa *ospf_opaque_lsa_refresh(struct ospf_lsa *lsa) * LSA from the routing domain. */ if (IS_DEBUG_OSPF_EVENT) - zlog_debug("LSA[Type%d:%s]: Flush stray Opaque-LSA", - lsa->data->type, inet_ntoa(lsa->data->id)); + zlog_debug("LSA[Type%d:%pI4]: Flush stray Opaque-LSA", + lsa->data->type, &lsa->data->id); lsa->data->ls_age = htons(OSPF_LSA_MAXAGE); ospf_lsa_flush(ospf, lsa); @@ -1701,8 +1701,8 @@ void ospf_opaque_lsa_reoriginate_schedule(void *lsa_type_dependent, if ((top = area->ospf) == NULL) { flog_warn( EC_OSPF_LSA, - "ospf_opaque_lsa_reoriginate_schedule: AREA(%s) -> TOP?", - inet_ntoa(area->area_id)); + "ospf_opaque_lsa_reoriginate_schedule: AREA(%pI4) -> TOP?", + &area->area_id); goto out; } if (!list_isempty(ospf_opaque_type10_funclist) @@ -1710,8 +1710,8 @@ void ospf_opaque_lsa_reoriginate_schedule(void *lsa_type_dependent, && area->t_opaque_lsa_self != NULL) { flog_warn( EC_OSPF_LSA, - "Type-10 Opaque-LSA (opaque_type=%u): Common origination for AREA(%s) has already started", - opaque_type, inet_ntoa(area->area_id)); + "Type-10 Opaque-LSA (opaque_type=%u): Common origination for AREA(%pI4) has already started", + opaque_type, &area->area_id); goto out; } func = ospf_opaque_type10_lsa_reoriginate_timer; @@ -1927,8 +1927,8 @@ static int ospf_opaque_type10_lsa_reoriginate_timer(struct thread *t) if (IS_DEBUG_OSPF_EVENT) zlog_debug( - "Timer[Type10-LSA]: Re-originate Opaque-LSAs (opaque-type=%u) for Area %s", - oipt->opaque_type, inet_ntoa(area->area_id)); + "Timer[Type10-LSA]: Re-originate Opaque-LSAs (opaque-type=%u) for Area %pI4", + oipt->opaque_type, &area->area_id); rc = (*functab->lsa_originator)(area); out: diff --git a/ospfd/ospf_packet.c b/ospfd/ospf_packet.c index 160982a238..ef39b6c2f6 100644 --- a/ospfd/ospf_packet.c +++ b/ospfd/ospf_packet.c @@ -468,11 +468,7 @@ static int ospf_ls_req_timer(struct thread *thread) void ospf_ls_req_event(struct ospf_neighbor *nbr) { - if (nbr->t_ls_req) { - thread_cancel(nbr->t_ls_req); - nbr->t_ls_req = NULL; - } - nbr->t_ls_req = NULL; + thread_cancel(&nbr->t_ls_req); thread_add_event(master, ospf_ls_req_timer, nbr, 0, &nbr->t_ls_req); } @@ -606,15 +602,15 @@ static void ospf_write_frags(int fd, struct ospf_packet *op, struct ip *iph, if (ret < 0) flog_err( EC_LIB_SOCKET, - "*** ospf_write_frags: sendmsg failed to %s, id %d, off %d, len %d, mtu %u failed with %s", - inet_ntoa(iph->ip_dst), iph->ip_id, iph->ip_off, + "*** ospf_write_frags: sendmsg failed to %pI4, id %d, off %d, len %d, mtu %u failed with %s", + &iph->ip_dst, iph->ip_id, iph->ip_off, iph->ip_len, mtu, safe_strerror(errno)); if (IS_DEBUG_OSPF_PACKET(type - 1, SEND)) { zlog_debug( - "ospf_write_frags: sent id %d, off %d, len %d to %s", + "ospf_write_frags: sent id %d, off %d, len %d to %pI4", iph->ip_id, iph->ip_off, iph->ip_len, - inet_ntoa(iph->ip_dst)); + &iph->ip_dst); } iph->ip_off += offset; @@ -659,8 +655,8 @@ static int ospf_write(struct thread *thread) if (ospf->fd < 0 || ospf->oi_running == 0) { if (IS_DEBUG_OSPF_EVENT) zlog_debug( - "ospf_write failed to send, fd %d, instance %u" - ,ospf->fd, ospf->oi_running); + "ospf_write failed to send, fd %d, instance %u", + ospf->fd, ospf->oi_running); return -1; } @@ -799,15 +795,15 @@ static int ospf_write(struct thread *thread) sockopt_iphdrincl_swab_systoh(&iph); if (IS_DEBUG_OSPF_EVENT) zlog_debug( - "ospf_write to %s, id %d, off %d, len %d, interface %s, mtu %u:", - inet_ntoa(iph.ip_dst), iph.ip_id, iph.ip_off, + "ospf_write to %pI4, id %d, off %d, len %d, interface %s, mtu %u:", + &iph.ip_dst, iph.ip_id, iph.ip_off, iph.ip_len, oi->ifp->name, oi->ifp->mtu); if (ret < 0) flog_err( EC_LIB_SOCKET, - "*** sendmsg in ospf_write failed to %s, id %d, off %d, len %d, interface %s, mtu %u: %s", - inet_ntoa(iph.ip_dst), iph.ip_id, iph.ip_off, + "*** sendmsg in ospf_write failed to %pI4, id %d, off %d, len %d, interface %s, mtu %u: %s", + &iph.ip_dst, iph.ip_id, iph.ip_off, iph.ip_len, oi->ifp->name, oi->ifp->mtu, safe_strerror(errno)); @@ -820,9 +816,9 @@ static int ospf_write(struct thread *thread) ospf_packet_dump(op->s); } - zlog_debug("%s sent to [%s] via [%s].", + zlog_debug("%s sent to [%pI4] via [%s].", lookup_msg(ospf_packet_type_str, type, NULL), - inet_ntoa(op->dst), IF_NAME(oi)); + &op->dst, IF_NAME(oi)); if (IS_DEBUG_OSPF_PACKET(type - 1, DETAIL)) zlog_debug( @@ -896,10 +892,10 @@ static void ospf_hello(struct ip *iph, struct ospf_header *ospfh, if (IPV4_ADDR_SAME(&ospfh->router_id, &oi->ospf->router_id)) { if (IS_DEBUG_OSPF_PACKET(ospfh->type - 1, RECV)) { zlog_debug( - "ospf_header[%s/%s]: selforiginated, dropping.", + "ospf_header[%s/%pI4]: selforiginated, dropping.", lookup_msg(ospf_packet_type_str, ospfh->type, NULL), - inet_ntoa(iph->ip_src)); + &iph->ip_src); } return; } @@ -916,8 +912,8 @@ static void ospf_hello(struct ip *iph, struct ospf_header *ospfh, if (oi->address->prefixlen != p.prefixlen) { flog_warn( EC_OSPF_PACKET, - "Packet %s [Hello:RECV]: NetworkMask mismatch on %s (configured prefix length is %d, but hello packet indicates %d).", - inet_ntoa(ospfh->router_id), IF_NAME(oi), + "Packet %pI4 [Hello:RECV]: NetworkMask mismatch on %s (configured prefix length is %d, but hello packet indicates %d).", + &ospfh->router_id, IF_NAME(oi), (int)oi->address->prefixlen, (int)p.prefixlen); return; } @@ -925,8 +921,8 @@ static void ospf_hello(struct ip *iph, struct ospf_header *ospfh, /* Compare Router Dead Interval. */ if (OSPF_IF_PARAM(oi, v_wait) != ntohl(hello->dead_interval)) { flog_warn(EC_OSPF_PACKET, - "Packet %s [Hello:RECV]: RouterDeadInterval mismatch (expected %u, but received %u).", - inet_ntoa(ospfh->router_id), + "Packet %pI4 [Hello:RECV]: RouterDeadInterval mismatch (expected %u, but received %u).", + &ospfh->router_id, OSPF_IF_PARAM(oi, v_wait), ntohl(hello->dead_interval)); return; @@ -938,8 +934,8 @@ static void ospf_hello(struct ip *iph, struct ospf_header *ospfh, != ntohs(hello->hello_interval)) { flog_warn( EC_OSPF_PACKET, - "Packet %s [Hello:RECV]: HelloInterval mismatch (expected %u, but received %u).", - inet_ntoa(ospfh->router_id), + "Packet %pI4 [Hello:RECV]: HelloInterval mismatch (expected %u, but received %u).", + &ospfh->router_id, OSPF_IF_PARAM(oi, v_hello), ntohs(hello->hello_interval)); return; @@ -947,8 +943,8 @@ static void ospf_hello(struct ip *iph, struct ospf_header *ospfh, } if (IS_DEBUG_OSPF_EVENT) - zlog_debug("Packet %s [Hello:RECV]: Options %s vrf %s", - inet_ntoa(ospfh->router_id), + zlog_debug("Packet %pI4 [Hello:RECV]: Options %s vrf %s", + &ospfh->router_id, ospf_options_dump(hello->options), ospf_vrf_id_to_name(oi->ospf->vrf_id)); @@ -962,8 +958,8 @@ static void ospf_hello(struct ip *iph, struct ospf_header *ospfh, * relationship. */ flog_warn(EC_OSPF_PACKET, - "Packet %s [Hello:RECV]: T-bit on, drop it.", - inet_ntoa(ospfh->router_id)); + "Packet %pI4 [Hello:RECV]: T-bit on, drop it.", + &ospfh->router_id); return; } #endif /* REJECT_IF_TBIT_ON */ @@ -975,8 +971,8 @@ static void ospf_hello(struct ip *iph, struct ospf_header *ospfh, * the bit should be set in DD packet only. */ flog_warn(EC_OSPF_PACKET, - "Packet %s [Hello:RECV]: O-bit abuse?", - inet_ntoa(ospfh->router_id)); + "Packet %pI4 [Hello:RECV]: O-bit abuse?", + &ospfh->router_id); #ifdef STRICT_OBIT_USAGE_CHECK return; /* Reject this packet. */ #else /* STRICT_OBIT_USAGE_CHECK */ @@ -993,14 +989,14 @@ static void ospf_hello(struct ip *iph, struct ospf_header *ospfh, && !CHECK_FLAG(hello->options, OSPF_OPTION_E))) { flog_warn( EC_OSPF_PACKET, - "NSSA-Packet-%s[Hello:RECV]: my options: %x, his options %x", - inet_ntoa(ospfh->router_id), OPTIONS(oi), + "NSSA-Packet-%pI4[Hello:RECV]: my options: %x, his options %x", + &ospfh->router_id, OPTIONS(oi), hello->options); return; } if (IS_DEBUG_OSPF_NSSA) - zlog_debug("NSSA-Hello:RECV:Packet from %s:", - inet_ntoa(ospfh->router_id)); + zlog_debug("NSSA-Hello:RECV:Packet from %pI4:", + &ospfh->router_id); } else /* The setting of the E-bit found in the Hello Packet's Options field must match this area's ExternalRoutingCapability A @@ -1011,8 +1007,8 @@ static void ospf_hello(struct ip *iph, struct ospf_header *ospfh, != CHECK_FLAG(hello->options, OSPF_OPTION_E)) { flog_warn( EC_OSPF_PACKET, - "Packet %s [Hello:RECV]: my options: %x, his options %x", - inet_ntoa(ospfh->router_id), OPTIONS(oi), + "Packet %pI4 [Hello:RECV]: my options: %x, his options %x", + &ospfh->router_id, OPTIONS(oi), hello->options); return; } @@ -1147,8 +1143,8 @@ static void ospf_db_desc_proc(struct stream *s, struct ospf_interface *oi, if (IS_OPAQUE_LSA(lsah->type) && !CHECK_FLAG(nbr->options, OSPF_OPTION_O)) { flog_warn(EC_OSPF_PACKET, - "LSA[Type%d:%s]: Opaque capability mismatch?", - lsah->type, inet_ntoa(lsah->id)); + "LSA[Type%d:%pI4]: Opaque capability mismatch?", + lsah->type, &lsah->id); OSPF_NSM_EVENT_SCHEDULE(nbr, NSM_SeqNumberMismatch); return; } @@ -1162,8 +1158,8 @@ static void ospf_db_desc_proc(struct stream *s, struct ospf_interface *oi, if (oi->area->external_routing == OSPF_AREA_STUB) { flog_warn( EC_OSPF_PACKET, - "Packet [DD:RECV]: LSA[Type%d:%s] from %s area.", - lsah->type, inet_ntoa(lsah->id), + "Packet [DD:RECV]: LSA[Type%d:%pI4] from %s area.", + lsah->type, &lsah->id, (oi->area->external_routing == OSPF_AREA_STUB) ? "STUB" @@ -1218,8 +1214,8 @@ static void ospf_db_desc_proc(struct stream *s, struct ospf_interface *oi, */ if (IS_DEBUG_OSPF_EVENT) zlog_debug( - "Packet [DD:RECV]: LSA received Type %d, ID %s is not recent.", - lsah->type, inet_ntoa(lsah->id)); + "Packet [DD:RECV]: LSA received Type %d, ID %pI4 is not recent.", + lsah->type, &lsah->id); ospf_lsa_discard(new); } } @@ -1287,8 +1283,8 @@ static void ospf_db_desc(struct ip *iph, struct ospf_header *ospfh, nbr = ospf_nbr_lookup(oi, iph, ospfh); if (nbr == NULL) { - flog_warn(EC_OSPF_PACKET, "Packet[DD]: Unknown Neighbor %s", - inet_ntoa(ospfh->router_id)); + flog_warn(EC_OSPF_PACKET, "Packet[DD]: Unknown Neighbor %pI4", + &ospfh->router_id); return; } @@ -1297,8 +1293,8 @@ static void ospf_db_desc(struct ip *iph, struct ospf_header *ospfh, && (ntohs(dd->mtu) > oi->ifp->mtu)) { flog_warn( EC_OSPF_PACKET, - "Packet[DD]: Neighbor %s MTU %u is larger than [%s]'s MTU %u", - inet_ntoa(nbr->router_id), ntohs(dd->mtu), IF_NAME(oi), + "Packet[DD]: Neighbor %pI4 MTU %u is larger than [%s]'s MTU %u", + &nbr->router_id, ntohs(dd->mtu), IF_NAME(oi), oi->ifp->mtu); return; } @@ -1324,8 +1320,8 @@ static void ospf_db_desc(struct ip *iph, struct ospf_header *ospfh, && (!CHECK_FLAG(dd->options, OSPF_OPTION_NP))) { if (IS_DEBUG_OSPF_EVENT) zlog_debug( - "Packet[DD]: Neighbour %s: Has NSSA capability, sends with N bit clear in DD options", - inet_ntoa(nbr->router_id)); + "Packet[DD]: Neighbour %pI4: Has NSSA capability, sends with N bit clear in DD options", + &nbr->router_id); SET_FLAG(dd->options, OSPF_OPTION_NP); } @@ -1335,8 +1331,8 @@ static void ospf_db_desc(struct ip *iph, struct ospf_header *ospfh, * In Hello protocol, optional capability must have checked * to prevent this T-bit enabled router be my neighbor. */ - flog_warn(EC_OSPF_PACKET, "Packet[DD]: Neighbor %s: T-bit on?", - inet_ntoa(nbr->router_id)); + flog_warn(EC_OSPF_PACKET, "Packet[DD]: Neighbor %pI4: T-bit on?", + &nbr->router_id); return; } #endif /* REJECT_IF_TBIT_ON */ @@ -1356,9 +1352,9 @@ static void ospf_db_desc(struct ip *iph, struct ospf_header *ospfh, if (CHECK_FLAG(oi->ospf->config, OSPF_LOG_ADJACENCY_DETAIL)) zlog_info( - "%s:Packet[DD]: Neighbor %s state is %s, seq_num:0x%x, local:0x%x", + "%s:Packet[DD]: Neighbor %pI4 state is %s, seq_num:0x%x, local:0x%x", (oi->ospf->name) ? oi->ospf->name : VRF_DEFAULT_NAME, - inet_ntoa(nbr->router_id), + &nbr->router_id, lookup_msg(ospf_nsm_state_msg, nbr->state, NULL), ntohl(dd->dd_seqnum), nbr->dd_seqnum); @@ -1369,8 +1365,8 @@ static void ospf_db_desc(struct ip *iph, struct ospf_header *ospfh, case NSM_TwoWay: if (CHECK_FLAG(oi->ospf->config, OSPF_LOG_ADJACENCY_DETAIL)) zlog_info( - "Packet[DD]: Neighbor %s state is %s, packet discarded.", - inet_ntoa(nbr->router_id), + "Packet[DD]: Neighbor %pI4 state is %s, packet discarded.", + &nbr->router_id, lookup_msg(ospf_nsm_state_msg, nbr->state, NULL)); break; @@ -1392,8 +1388,8 @@ static void ospf_db_desc(struct ip *iph, struct ospf_header *ospfh, if (CHECK_FLAG(oi->ospf->config, OSPF_LOG_ADJACENCY_DETAIL)) zlog_info( - "Packet[DD]: Neighbor %s Negotiation done (Slave).", - inet_ntoa(nbr->router_id)); + "Packet[DD]: Neighbor %pI4 Negotiation done (Slave).", + &nbr->router_id); nbr->dd_seqnum = ntohl(dd->dd_seqnum); @@ -1406,8 +1402,8 @@ static void ospf_db_desc(struct ip *iph, struct ospf_header *ospfh, if (CHECK_FLAG(oi->ospf->config, OSPF_LOG_ADJACENCY_DETAIL)) zlog_info( - "Packet[DD]: Neighbor %s: Initial DBD from Slave, ignoring.", - inet_ntoa(nbr->router_id)); + "Packet[DD]: Neighbor %pI4: Initial DBD from Slave, ignoring.", + &nbr->router_id); break; } } @@ -1417,14 +1413,14 @@ static void ospf_db_desc(struct ip *iph, struct ospf_header *ospfh, && IPV4_ADDR_CMP(&nbr->router_id, &oi->ospf->router_id) < 0) { zlog_info( - "Packet[DD]: Neighbor %s Negotiation done (Master).", - inet_ntoa(nbr->router_id)); + "Packet[DD]: Neighbor %pI4 Negotiation done (Master).", + &nbr->router_id); /* Reset I, leaving MS */ UNSET_FLAG(nbr->dd_flags, OSPF_DD_FLAG_I); } else { flog_warn(EC_OSPF_PACKET, - "Packet[DD]: Neighbor %s Negotiation fails.", - inet_ntoa(nbr->router_id)); + "Packet[DD]: Neighbor %pI4 Negotiation fails.", + &nbr->router_id); break; } @@ -1434,8 +1430,8 @@ static void ospf_db_desc(struct ip *iph, struct ospf_header *ospfh, if (CHECK_FLAG(oi->ospf->config, OSPF_OPAQUE_CAPABLE)) { if (IS_DEBUG_OSPF_EVENT) zlog_debug( - "Neighbor[%s] is %sOpaque-capable.", - inet_ntoa(nbr->router_id), + "Neighbor[%pI4] is %sOpaque-capable.", + &nbr->router_id, CHECK_FLAG(nbr->options, OSPF_OPTION_O) ? "" : "NOT "); @@ -1445,8 +1441,8 @@ static void ospf_db_desc(struct ip *iph, struct ospf_header *ospfh, &nbr->address.u.prefix4)) { flog_warn( EC_OSPF_PACKET, - "DR-neighbor[%s] is NOT opaque-capable; Opaque-LSAs cannot be reliably advertised in this network.", - inet_ntoa(nbr->router_id)); + "DR-neighbor[%pI4] is NOT opaque-capable; Opaque-LSAs cannot be reliably advertised in this network.", + &nbr->router_id); /* This situation is undesirable, but not a real * error. */ } @@ -1462,15 +1458,15 @@ static void ospf_db_desc(struct ip *iph, struct ospf_header *ospfh, if (IS_SET_DD_MS(nbr->dd_flags)) /* Master: discard duplicated DD packet. */ zlog_info( - "Packet[DD] (Master): Neighbor %s packet duplicated.", - inet_ntoa(nbr->router_id)); + "Packet[DD] (Master): Neighbor %pI4 packet duplicated.", + &nbr->router_id); else /* Slave: cause to retransmit the last Database Description. */ { zlog_info( - "Packet[DD] [Slave]: Neighbor %s packet duplicated.", - inet_ntoa(nbr->router_id)); + "Packet[DD] [Slave]: Neighbor %pI4 packet duplicated.", + &nbr->router_id); ospf_db_desc_resend(nbr); } break; @@ -1481,8 +1477,8 @@ static void ospf_db_desc(struct ip *iph, struct ospf_header *ospfh, if (IS_SET_DD_MS(dd->flags) != IS_SET_DD_MS(nbr->last_recv.flags)) { flog_warn(EC_OSPF_PACKET, - "Packet[DD]: Neighbor %s MS-bit mismatch.", - inet_ntoa(nbr->router_id)); + "Packet[DD]: Neighbor %pI4 MS-bit mismatch.", + &nbr->router_id); OSPF_NSM_EVENT_SCHEDULE(nbr, NSM_SeqNumberMismatch); if (IS_DEBUG_OSPF_EVENT) zlog_debug( @@ -1493,8 +1489,8 @@ static void ospf_db_desc(struct ip *iph, struct ospf_header *ospfh, /* Check initialize bit is set. */ if (IS_SET_DD_I(dd->flags)) { - zlog_info("Packet[DD]: Neighbor %s I-bit set.", - inet_ntoa(nbr->router_id)); + zlog_info("Packet[DD]: Neighbor %pI4 I-bit set.", + &nbr->router_id); OSPF_NSM_EVENT_SCHEDULE(nbr, NSM_SeqNumberMismatch); break; } @@ -1502,8 +1498,8 @@ static void ospf_db_desc(struct ip *iph, struct ospf_header *ospfh, /* Check DD Options. */ if (dd->options != nbr->options) { flog_warn(EC_OSPF_PACKET, - "Packet[DD]: Neighbor %s options mismatch.", - inet_ntoa(nbr->router_id)); + "Packet[DD]: Neighbor %pI4 options mismatch.", + &nbr->router_id); OSPF_NSM_EVENT_SCHEDULE(nbr, NSM_SeqNumberMismatch); break; } @@ -1515,8 +1511,8 @@ static void ospf_db_desc(struct ip *iph, struct ospf_header *ospfh, && ntohl(dd->dd_seqnum) != nbr->dd_seqnum + 1)) { flog_warn( EC_OSPF_PACKET, - "Packet[DD]: Neighbor %s sequence number mismatch.", - inet_ntoa(nbr->router_id)); + "Packet[DD]: Neighbor %pI4 sequence number mismatch.", + &nbr->router_id); OSPF_NSM_EVENT_SCHEDULE(nbr, NSM_SeqNumberMismatch); break; } @@ -1530,8 +1526,8 @@ static void ospf_db_desc(struct ip *iph, struct ospf_header *ospfh, if (IS_SET_DD_MS(nbr->dd_flags)) { /* Master should discard duplicate DD packet. */ zlog_info( - "Packet[DD]: Neighbor %s duplicated, packet discarded.", - inet_ntoa(nbr->router_id)); + "Packet[DD]: Neighbor %pI4 duplicated, packet discarded.", + &nbr->router_id); break; } else { if (monotime_since(&nbr->last_send_ts, NULL) @@ -1564,8 +1560,8 @@ static void ospf_db_desc(struct ip *iph, struct ospf_header *ospfh, break; default: flog_warn(EC_OSPF_PACKET, - "Packet[DD]: Neighbor %s NSM illegal status %u.", - inet_ntoa(nbr->router_id), nbr->state); + "Packet[DD]: Neighbor %pI4 NSM illegal status %u.", + &nbr->router_id, nbr->state); break; } } @@ -1591,8 +1587,8 @@ static void ospf_ls_req(struct ip *iph, struct ospf_header *ospfh, nbr = ospf_nbr_lookup(oi, iph, ospfh); if (nbr == NULL) { flog_warn(EC_OSPF_PACKET, - "Link State Request: Unknown Neighbor %s.", - inet_ntoa(ospfh->router_id)); + "Link State Request: Unknown Neighbor %pI4", + &ospfh->router_id); return; } @@ -1604,8 +1600,8 @@ static void ospf_ls_req(struct ip *iph, struct ospf_header *ospfh, && nbr->state != NSM_Full) { flog_warn( EC_OSPF_PACKET, - "Link State Request received from %s: Neighbor state is %s, packet discarded.", - inet_ntoa(ospfh->router_id), + "Link State Request received from %pI4: Neighbor state is %s, packet discarded.", + &ospfh->router_id, lookup_msg(ospf_nsm_state_msg, nbr->state, NULL)); return; } @@ -1712,10 +1708,10 @@ static struct list *ospf_ls_upd_list_lsa(struct ospf_neighbor *nbr, * other */ flog_warn( EC_OSPF_PACKET, - "Link State Update: LSA checksum error %x/%x, ID=%s from: nbr %s, router ID %s, adv router %s", - sum, lsah->checksum, inet_ntoa(lsah->id), - inet_ntoa(nbr->src), inet_ntoa(nbr->router_id), - inet_ntoa(lsah->adv_router)); + "Link State Update: LSA checksum error %x/%x, ID=%pI4 from: nbr %pI4, router ID %pI4, adv router %pI4", + sum, lsah->checksum, &lsah->id, + &nbr->src, &nbr->router_id, + &lsah->adv_router); continue; } @@ -1747,8 +1743,8 @@ static struct list *ospf_ls_upd_list_lsa(struct ospf_neighbor *nbr, * only. */ flog_warn(EC_OSPF_PACKET, - "LSA[Type%d:%s]: O-bit abuse?", - lsah->type, inet_ntoa(lsah->id)); + "LSA[Type%d:%pI4]: O-bit abuse?", + lsah->type, &lsah->id); continue; } #endif /* STRICT_OBIT_USAGE_CHECK */ @@ -1760,15 +1756,15 @@ static struct list *ospf_ls_upd_list_lsa(struct ospf_neighbor *nbr, != OSPF_AREA_DEFAULT) { if (IS_DEBUG_OSPF_EVENT) zlog_debug( - "LSA[Type%d:%s]: We are a stub, don't take this LSA.", + "LSA[Type%d:%pI4]: We are a stub, don't take this LSA.", lsah->type, - inet_ntoa(lsah->id)); + &lsah->id); continue; } } else if (IS_OPAQUE_LSA(lsah->type)) { flog_warn(EC_OSPF_PACKET, - "LSA[Type%d:%s]: Opaque capability mismatch?", - lsah->type, inet_ntoa(lsah->id)); + "LSA[Type%d:%pI4]: Opaque capability mismatch?", + lsah->type, &lsah->id); continue; } @@ -1796,8 +1792,8 @@ static struct list *ospf_ls_upd_list_lsa(struct ospf_neighbor *nbr, if (IS_DEBUG_OSPF_EVENT) zlog_debug( - "LSA[Type%d:%s]: %p new LSA created with Link State Update", - lsa->data->type, inet_ntoa(lsa->data->id), + "LSA[Type%d:%pI4]: %p new LSA created with Link State Update", + lsa->data->type, &lsa->data->id, (void *)lsa); listnode_add(lsas, lsa); } @@ -1838,8 +1834,8 @@ static void ospf_ls_upd(struct ospf *ospf, struct ip *iph, nbr = ospf_nbr_lookup(oi, iph, ospfh); if (nbr == NULL) { flog_warn(EC_OSPF_PACKET, - "Link State Update: Unknown Neighbor %s on int: %s", - inet_ntoa(ospfh->router_id), IF_NAME(oi)); + "Link State Update: Unknown Neighbor %pI4 on int: %s", + &ospfh->router_id, IF_NAME(oi)); return; } @@ -1850,8 +1846,8 @@ static void ospf_ls_upd(struct ospf *ospf, struct ip *iph, if (nbr->state < NSM_Exchange) { if (IS_DEBUG_OSPF(nsm, NSM_EVENTS)) zlog_debug( - "Link State Update: Neighbor[%s] state %s is less than Exchange", - inet_ntoa(ospfh->router_id), + "Link State Update: Neighbor[%pI4] state %s is less than Exchange", + &ospfh->router_id, lookup_msg(ospf_nsm_state_msg, nbr->state, NULL)); return; @@ -2241,8 +2237,8 @@ static void ospf_ls_ack(struct ip *iph, struct ospf_header *ospfh, nbr = ospf_nbr_lookup(oi, iph, ospfh); if (nbr == NULL) { flog_warn(EC_OSPF_PACKET, - "Link State Acknowledgment: Unknown Neighbor %s.", - inet_ntoa(ospfh->router_id)); + "Link State Acknowledgment: Unknown Neighbor %pI4", + &ospfh->router_id); return; } @@ -2252,8 +2248,8 @@ static void ospf_ls_ack(struct ip *iph, struct ospf_header *ospfh, if (nbr->state < NSM_Exchange) { if (IS_DEBUG_OSPF(nsm, NSM_EVENTS)) zlog_debug( - "Link State Acknowledgment: Neighbor[%s] state %s is less than Exchange", - inet_ntoa(ospfh->router_id), + "Link State Acknowledgment: Neighbor[%pI4] state %s is less than Exchange", + &ospfh->router_id, lookup_msg(ospf_nsm_state_msg, nbr->state, NULL)); return; @@ -2485,9 +2481,9 @@ static int ospf_check_auth(struct ospf_interface *oi, struct ospf_header *ospfh) if (IS_DEBUG_OSPF_PACKET(ospfh->type - 1, RECV)) flog_warn( EC_OSPF_PACKET, - "interface %s: Null auth OK, but checksum error, Router-ID %s", + "interface %s: Null auth OK, but checksum error, Router-ID %pI4", IF_NAME(oi), - inet_ntoa(ospfh->router_id)); + &ospfh->router_id); return 0; } return 1; @@ -2515,9 +2511,9 @@ static int ospf_check_auth(struct ospf_interface *oi, struct ospf_header *ospfh) if (IS_DEBUG_OSPF_PACKET(ospfh->type - 1, RECV)) flog_warn( EC_OSPF_PACKET, - "interface %s: Simple auth OK, checksum error, Router-ID %s", + "interface %s: Simple auth OK, checksum error, Router-ID %pI4", IF_NAME(oi), - inet_ntoa(ospfh->router_id)); + &ospfh->router_id); return 0; } return 1; @@ -2916,8 +2912,8 @@ static int ospf_verify_header(struct stream *ibuf, struct ospf_interface *oi, /* Check Area ID. */ if (!ospf_check_area_id(oi, ospfh)) { flog_warn(EC_OSPF_PACKET, - "interface %s: ospf_read invalid Area ID %s.", - IF_NAME(oi), inet_ntoa(ospfh->area_id)); + "interface %s: ospf_read invalid Area ID %pI4", + IF_NAME(oi), &ospfh->area_id); return -1; } @@ -2925,8 +2921,8 @@ static int ospf_verify_header(struct stream *ibuf, struct ospf_interface *oi, if (!ospf_check_network_mask(oi, iph->ip_src)) { flog_warn( EC_OSPF_PACKET, - "interface %s: ospf_read network address is not same [%s]", - IF_NAME(oi), inet_ntoa(iph->ip_src)); + "interface %s: ospf_read network address is not same [%pI4]", + IF_NAME(oi), &iph->ip_src); return -1; } @@ -2984,8 +2980,8 @@ static enum ospf_read_return_enum ospf_read_helper(struct ospf *ospf) if (ifp == NULL) { if (IS_DEBUG_OSPF_PACKET(0, RECV)) zlog_debug( - "%s: Unable to determine incoming interface from: %s(%s)", - __func__, inet_ntoa(iph->ip_src), + "%s: Unable to determine incoming interface from: %pI4(%s)", + __func__, &iph->ip_src, ospf_get_name(ospf)); return OSPF_READ_CONTINUE; } @@ -2995,8 +2991,8 @@ static enum ospf_read_return_enum ospf_read_helper(struct ospf *ospf) if (ospf_if_lookup_by_local_addr(ospf, NULL, iph->ip_src)) { if (IS_DEBUG_OSPF_PACKET(0, RECV)) { zlog_debug( - "ospf_read[%s]: Dropping self-originated packet", - inet_ntoa(iph->ip_src)); + "ospf_read[%pI4]: Dropping self-originated packet", + &iph->ip_src); } return OSPF_READ_CONTINUE; } @@ -3074,8 +3070,8 @@ static enum ospf_read_return_enum ospf_read_helper(struct ospf *ospf) == NULL) { if (!ospf->instance && IS_DEBUG_OSPF_EVENT) zlog_debug( - "Packet from [%s] received on link %s but no ospf_interface", - inet_ntoa(iph->ip_src), ifp->name); + "Packet from [%pI4] received on link %s but no ospf_interface", + &iph->ip_src, ifp->name); return OSPF_READ_CONTINUE; } } @@ -3087,8 +3083,8 @@ static enum ospf_read_return_enum ospf_read_helper(struct ospf *ospf) else if (oi->ifp != ifp) { if (IS_DEBUG_OSPF_EVENT) flog_warn(EC_OSPF_PACKET, - "Packet from [%s] received on wrong link %s", - inet_ntoa(iph->ip_src), ifp->name); + "Packet from [%pI4] received on wrong link %s", + &iph->ip_src, ifp->name); return OSPF_READ_CONTINUE; } else if (oi->state == ISM_Down) { char buf[2][INET_ADDRSTRLEN]; @@ -3122,8 +3118,8 @@ static enum ospf_read_return_enum ospf_read_helper(struct ospf *ospf) && (oi->state != ISM_DR && oi->state != ISM_Backup)) { flog_warn( EC_OSPF_PACKET, - "Dropping packet for AllDRouters from [%s] via [%s] (ISM: %s)", - inet_ntoa(iph->ip_src), IF_NAME(oi), + "Dropping packet for AllDRouters from [%pI4] via [%s] (ISM: %s)", + &iph->ip_src, IF_NAME(oi), lookup_msg(ospf_ism_state_msg, oi->state, NULL)); /* Try to fix multicast membership. */ SET_FLAG(oi->multicast_memberships, MEMBER_DROUTERS); @@ -3136,8 +3132,8 @@ static enum ospf_read_return_enum ospf_read_helper(struct ospf *ospf) if (ret < 0) { if (IS_DEBUG_OSPF_PACKET(0, RECV)) zlog_debug( - "ospf_read[%s]: Header check failed, dropping.", - inet_ntoa(iph->ip_src)); + "ospf_read[%pI4]: Header check failed, dropping.", + &iph->ip_src); return OSPF_READ_CONTINUE; } @@ -3149,11 +3145,11 @@ static enum ospf_read_return_enum ospf_read_helper(struct ospf *ospf) ospf_packet_dump(ibuf); } - zlog_debug("%s received from [%s] via [%s]", + zlog_debug("%s received from [%pI4] via [%s]", lookup_msg(ospf_packet_type_str, ospfh->type, NULL), - inet_ntoa(ospfh->router_id), IF_NAME(oi)); - zlog_debug(" src [%s],", inet_ntoa(iph->ip_src)); - zlog_debug(" dst [%s]", inet_ntoa(iph->ip_dst)); + &ospfh->router_id, IF_NAME(oi)); + zlog_debug(" src [%pI4],", &iph->ip_src); + zlog_debug(" dst [%pI4]", &iph->ip_dst); if (IS_DEBUG_OSPF_PACKET(ospfh->type - 1, DETAIL)) zlog_debug( @@ -3736,8 +3732,8 @@ int ospf_poll_timer(struct thread *thread) nbr_nbma->t_poll = NULL; if (IS_DEBUG_OSPF(nsm, NSM_TIMERS)) - zlog_debug("NSM[%s:%s]: Timer (Poll timer expire)", - IF_NAME(nbr_nbma->oi), inet_ntoa(nbr_nbma->addr)); + zlog_debug("NSM[%s:%pI4]: Timer (Poll timer expire)", + IF_NAME(nbr_nbma->oi), &nbr_nbma->addr); ospf_poll_send(nbr_nbma); @@ -3757,8 +3753,8 @@ int ospf_hello_reply_timer(struct thread *thread) nbr->t_hello_reply = NULL; if (IS_DEBUG_OSPF(nsm, NSM_TIMERS)) - zlog_debug("NSM[%s:%s]: Timer (hello-reply timer expire)", - IF_NAME(nbr->oi), inet_ntoa(nbr->router_id)); + zlog_debug("NSM[%s:%pI4]: Timer (hello-reply timer expire)", + IF_NAME(nbr->oi), &nbr->router_id); ospf_hello_send_sub(nbr->oi, nbr->address.u.prefix4.s_addr); @@ -3875,9 +3871,9 @@ void ospf_db_desc_send(struct ospf_neighbor *nbr) monotime(&nbr->last_send_ts); if (CHECK_FLAG(oi->ospf->config, OSPF_LOG_ADJACENCY_DETAIL)) zlog_info( - "%s:Packet[DD]: %s DB Desc send with seqnum:%x , flags:%x", + "%s:Packet[DD]: %pI4 DB Desc send with seqnum:%x , flags:%x", (oi->ospf->name) ? oi->ospf->name : VRF_DEFAULT_NAME, - inet_ntoa(nbr->router_id), nbr->dd_seqnum, + &nbr->router_id, nbr->dd_seqnum, nbr->dd_flags); } @@ -3895,9 +3891,9 @@ void ospf_db_desc_resend(struct ospf_neighbor *nbr) OSPF_ISM_WRITE_ON(oi->ospf); if (CHECK_FLAG(oi->ospf->config, OSPF_LOG_ADJACENCY_DETAIL)) zlog_info( - "%s:Packet[DD]: %s DB Desc resend with seqnum:%x , flags:%x", + "%s:Packet[DD]: %pI4 DB Desc resend with seqnum:%x , flags:%x", (oi->ospf->name) ? oi->ospf->name : VRF_DEFAULT_NAME, - inet_ntoa(nbr->router_id), nbr->dd_seqnum, + &nbr->router_id, nbr->dd_seqnum, nbr->dd_flags); } @@ -3992,10 +3988,10 @@ static struct ospf_packet *ospf_ls_upd_packet_new(struct list *update, if (IS_DEBUG_OSPF_PACKET(0, SEND)) zlog_debug( - "ospf_ls_upd_packet_new: oversized LSA id:%s, %d bytes originated by %s, will be fragmented!", - inet_ntoa(lsa->data->id), + "ospf_ls_upd_packet_new: oversized LSA id:%pI4, %d bytes originated by %pI4, will be fragmented!", + &lsa->data->id, ntohs(lsa->data->length), - inet_ntoa(lsa->data->adv_router)); + &lsa->data->adv_router); /* * Allocate just enough to fit this LSA only, to avoid including @@ -4010,8 +4006,8 @@ static struct ospf_packet *ospf_ls_upd_packet_new(struct list *update, if (size > OSPF_MAX_PACKET_SIZE) { flog_warn(EC_OSPF_LARGE_LSA, - "ospf_ls_upd_packet_new: oversized LSA id:%s too big, %d bytes, packet size %ld, dropping it completely. OSPF routing is broken!", - inet_ntoa(lsa->data->id), ntohs(lsa->data->length), + "ospf_ls_upd_packet_new: oversized LSA id:%pI4 too big, %d bytes, packet size %ld, dropping it completely. OSPF routing is broken!", + &lsa->data->id, ntohs(lsa->data->length), (long int)size); list_delete_node(update, ln); return NULL; @@ -4043,8 +4039,8 @@ static void ospf_ls_upd_queue_send(struct ospf_interface *oi, uint16_t length = OSPF_HEADER_SIZE; if (IS_DEBUG_OSPF_EVENT) - zlog_debug("listcount = %d, [%s]dst %s", listcount(update), - IF_NAME(oi), inet_ntoa(addr)); + zlog_debug("listcount = %d, [%s]dst %pI4", listcount(update), + IF_NAME(oi), &addr); /* Check that we have really something to process */ if (listcount(update) == 0) diff --git a/ospfd/ospf_ri.c b/ospfd/ospf_ri.c index fc9c8f6be6..3145d16161 100644 --- a/ospfd/ospf_ri.c +++ b/ospfd/ospf_ri.c @@ -544,8 +544,8 @@ static void initialize_params(struct ospf_router_info *ori) if (!list_isempty(OspfRI.area_info)) list_delete_all_node(OspfRI.area_info); for (ALL_LIST_ELEMENTS(top->areas, node, nnode, area)) { - zlog_debug("RI (%s): Add area %s to Router Information", - __func__, inet_ntoa(area->area_id)); + zlog_debug("RI (%s): Add area %pI4 to Router Information", + __func__, &area->area_id); new = XCALLOC(MTYPE_OSPF_ROUTER_INFO, sizeof(struct ospf_ri_area_info)); new->area = area; @@ -795,8 +795,8 @@ static struct ospf_lsa *ospf_router_info_lsa_new(struct ospf_area *area) if (IS_DEBUG_OSPF(lsa, LSA_GENERATE)) zlog_debug( - "LSA[Type%d:%s]: Create an Opaque-LSA/ROUTER INFORMATION instance", - lsa_type, inet_ntoa(lsa_id)); + "LSA[Type%d:%pI4]: Create an Opaque-LSA/ROUTER INFORMATION instance", + lsa_type, &lsa_id); top = ospf_lookup_by_vrf_id(VRF_DEFAULT); @@ -874,8 +874,8 @@ static int ospf_router_info_lsa_originate_as(void *arg) if (IS_DEBUG_OSPF(lsa, LSA_GENERATE)) { zlog_debug( - "LSA[Type%d:%s]: Originate Opaque-LSA/ROUTER INFORMATION", - new->data->type, inet_ntoa(new->data->id)); + "LSA[Type%d:%pI4]: Originate Opaque-LSA/ROUTER INFORMATION", + new->data->type, &new->data->id); ospf_lsa_header_dump(new->data); } @@ -943,8 +943,8 @@ static int ospf_router_info_lsa_originate_area(void *arg) if (IS_DEBUG_OSPF(lsa, LSA_GENERATE)) { zlog_debug( - "LSA[Type%d:%s]: Originate Opaque-LSA/ROUTER INFORMATION", - new->data->type, inet_ntoa(new->data->id)); + "LSA[Type%d:%pI4]: Originate Opaque-LSA/ROUTER INFORMATION", + new->data->type, &new->data->id); ospf_lsa_header_dump(new->data); } @@ -1094,8 +1094,8 @@ static struct ospf_lsa *ospf_router_info_lsa_refresh(struct ospf_lsa *lsa) /* Debug logging. */ if (IS_DEBUG_OSPF(lsa, LSA_GENERATE)) { zlog_debug( - "LSA[Type%d:%s]: Refresh Opaque-LSA/ROUTER INFORMATION", - new->data->type, inet_ntoa(new->data->id)); + "LSA[Type%d:%pI4]: Refresh Opaque-LSA/ROUTER INFORMATION", + new->data->type, &new->data->id); ospf_lsa_header_dump(new->data); } @@ -1247,11 +1247,11 @@ static uint16_t show_vty_pce_subtlv_address(struct vty *vty, if (ntohs(top->address.type) == PCE_ADDRESS_TYPE_IPV4) { if (vty != NULL) - vty_out(vty, " PCE Address: %s\n", - inet_ntoa(top->address.value)); + vty_out(vty, " PCE Address: %pI4\n", + &top->address.value); else - zlog_debug(" PCE Address: %s", - inet_ntoa(top->address.value)); + zlog_debug(" PCE Address: %pI4", + &top->address.value); } else { /* TODO: Add support to IPv6 with inet_ntop() */ if (vty != NULL) @@ -1288,9 +1288,9 @@ static uint16_t show_vty_pce_subtlv_domain(struct vty *vty, if (ntohs(top->type) == PCE_DOMAIN_TYPE_AREA) { tmp.s_addr = top->value; if (vty != NULL) - vty_out(vty, " PCE domain Area: %s\n", inet_ntoa(tmp)); + vty_out(vty, " PCE domain Area: %pI4\n", &tmp); else - zlog_debug(" PCE domain Area: %s", inet_ntoa(tmp)); + zlog_debug(" PCE domain Area: %pI4", &tmp); } else { if (vty != NULL) vty_out(vty, " PCE domain AS: %d\n", @@ -1312,10 +1312,10 @@ static uint16_t show_vty_pce_subtlv_neighbor(struct vty *vty, if (ntohs(top->type) == PCE_DOMAIN_TYPE_AREA) { tmp.s_addr = top->value; if (vty != NULL) - vty_out(vty, " PCE neighbor Area: %s\n", - inet_ntoa(tmp)); + vty_out(vty, " PCE neighbor Area: %pI4\n", + &tmp); else - zlog_debug(" PCE neighbor Area: %s", inet_ntoa(tmp)); + zlog_debug(" PCE neighbor Area: %pI4", &tmp); } else { if (vty != NULL) vty_out(vty, " PCE neighbor AS: %d\n", @@ -1543,8 +1543,8 @@ static void ospf_router_info_config_write_router(struct vty *vty) if (OspfRI.pce_info.enabled) { if (pce->pce_address.header.type != 0) - vty_out(vty, " pce address %s\n", - inet_ntoa(pce->pce_address.address.value)); + vty_out(vty, " pce address %pI4\n", + &pce->pce_address.address.value); if (pce->pce_cap_flag.header.type != 0) vty_out(vty, " pce flag 0x%x\n", @@ -1554,8 +1554,8 @@ static void ospf_router_info_config_write_router(struct vty *vty) if (domain->header.type != 0) { if (domain->type == PCE_DOMAIN_TYPE_AREA) { tmp.s_addr = domain->value; - vty_out(vty, " pce domain area %s\n", - inet_ntoa(tmp)); + vty_out(vty, " pce domain area %pI4\n", + &tmp); } else { vty_out(vty, " pce domain as %d\n", ntohl(domain->value)); @@ -1567,8 +1567,9 @@ static void ospf_router_info_config_write_router(struct vty *vty) if (neighbor->header.type != 0) { if (neighbor->type == PCE_DOMAIN_TYPE_AREA) { tmp.s_addr = neighbor->value; - vty_out(vty, " pce neighbor area %s\n", - inet_ntoa(tmp)); + vty_out(vty, + " pce neighbor area %pI4\n", + &tmp); } else { vty_out(vty, " pce neighbor as %d\n", ntohl(neighbor->value)); diff --git a/ospfd/ospf_route.c b/ospfd/ospf_route.c index e3e6f68a82..bcf563a5ba 100644 --- a/ospfd/ospf_route.c +++ b/ospfd/ospf_route.c @@ -307,8 +307,8 @@ void ospf_intra_add_router(struct route_table *rt, struct vertex *v, lsa = (struct router_lsa *)v->lsa; if (IS_DEBUG_OSPF_EVENT) - zlog_debug("ospf_intra_add_router: LS ID: %s", - inet_ntoa(lsa->header.id)); + zlog_debug("ospf_intra_add_router: LS ID: %pI4", + &lsa->header.id); if (!OSPF_IS_AREA_BACKBONE(area)) ospf_vl_up_check(area, lsa->header.id, v); @@ -364,8 +364,7 @@ void ospf_intra_add_router(struct route_table *rt, struct vertex *v, apply_mask_ipv4(&p); if (IS_DEBUG_OSPF_EVENT) - zlog_debug("ospf_intra_add_router: talking about %s/%d", - inet_ntoa(p.prefix), p.prefixlen); + zlog_debug("ospf_intra_add_router: talking about %pFX", &p); rn = route_node_get(rt, (struct prefix *)&p); @@ -467,8 +466,8 @@ void ospf_intra_add_stub(struct route_table *rt, struct router_lsa_link *link, apply_mask_ipv4(&p); if (IS_DEBUG_OSPF_EVENT) - zlog_debug("ospf_intra_add_stub(): processing route to %s/%d", - inet_ntoa(p.prefix), p.prefixlen); + zlog_debug("ospf_intra_add_stub(): processing route to %pFX", + &p); /* (1) Calculate the distance D of stub network from the root. D is equal to the distance from the root to the router vertex @@ -488,8 +487,8 @@ void ospf_intra_add_stub(struct route_table *rt, struct router_lsa_link *link, if (parent_is_root && link->link_data.s_addr == 0xffffffff && ospf_if_lookup_by_local_addr(area->ospf, NULL, link->link_id)) { if (IS_DEBUG_OSPF_EVENT) - zlog_debug("%s: ignoring host route %s/32 to self.", - __func__, inet_ntoa(link->link_id)); + zlog_debug("%s: ignoring host route %pI4/32 to self.", + __func__, &link->link_id); return; } @@ -653,8 +652,8 @@ void ospf_route_table_dump(struct route_table *rt) or->cost); for (ALL_LIST_ELEMENTS_RO(or->paths, pnode, path)) - zlog_debug(" -> %s", - inet_ntoa(path->nexthop)); + zlog_debug(" -> %pI4", + &path->nexthop); } else zlog_debug("R %-18pI4 %-15pI4 %s %d", &rn->p.u.prefix4, @@ -682,11 +681,12 @@ void ospf_route_table_print(struct vty *vty, struct route_table *rt) or->cost); for (ALL_LIST_ELEMENTS_RO(or->paths, pnode, path)) - vty_out(vty, " -> %s\n", - path->nexthop.s_addr != 0 - ? inet_ntoa( - path->nexthop) - : "directly connected"); + if (path->nexthop.s_addr != 0) + vty_out(vty, " -> %pI4\n", + &path->nexthop); + else + vty_out(vty, " -> %s\n", + "directly connected"); } else vty_out(vty, "R %-18pI4 %-15pI4 %s %d\n", &rn->p.u.prefix4, & or->u.std.area_id, @@ -896,9 +896,8 @@ void ospf_prune_unreachable_networks(struct route_table *rt) or = rn->info; if (listcount(or->paths) == 0) { if (IS_DEBUG_OSPF_EVENT) - zlog_debug("Pruning route to %s/%d", - inet_ntoa(rn->p.u.prefix4), - rn->p.prefixlen); + zlog_debug("Pruning route to %pFX", + &rn->p); ospf_route_free(or); rn->info = NULL; @@ -926,11 +925,11 @@ void ospf_prune_unreachable_routers(struct route_table *rtrs) for (ALL_LIST_ELEMENTS(paths, node, nnode, or)) { if (listcount(or->paths) == 0) { if (IS_DEBUG_OSPF_EVENT) { - zlog_debug("Pruning route to rtr %s", - inet_ntoa(rn->p.u.prefix4)); + zlog_debug("Pruning route to rtr %pI4", + &rn->p.u.prefix4); zlog_debug( - " via area %s", - inet_ntoa(or->u.std.area_id)); + " via area %pI4", + &or->u.std.area_id); } listnode_delete(paths, or); @@ -940,8 +939,8 @@ void ospf_prune_unreachable_routers(struct route_table *rtrs) if (listcount(paths) == 0) { if (IS_DEBUG_OSPF_EVENT) - zlog_debug("Pruning router node %s", - inet_ntoa(rn->p.u.prefix4)); + zlog_debug("Pruning router node %pI4", + &rn->p.u.prefix4); list_delete(&paths); rn->info = NULL; diff --git a/ospfd/ospf_snmp.c b/ospfd/ospf_snmp.c index 8e5cb5bb36..033046da0a 100644 --- a/ospfd/ospf_snmp.c +++ b/ospfd/ospf_snmp.c @@ -2455,8 +2455,8 @@ static void ospfTrapNbrStateChange(struct ospf_neighbor *on) ospf_nbr_state_message(on, msgbuf, sizeof(msgbuf)); if (IS_DEBUG_OSPF_EVENT) - zlog_info("%s: trap sent: %s now %s", __func__, - inet_ntoa(on->address.u.prefix4), msgbuf); + zlog_info("%s: trap sent: %pI4 now %s", __func__, + &on->address.u.prefix4, msgbuf); oid_copy_addr(index, &(on->address.u.prefix4), IN_ADDR_SIZE); index[IN_ADDR_SIZE] = 0; @@ -2513,8 +2513,8 @@ static void ospfTrapIfStateChange(struct ospf_interface *oi) oid index[sizeof(oid) * (IN_ADDR_SIZE + 1)]; if (IS_DEBUG_OSPF_EVENT) - zlog_info("%s: trap sent: %s now %s", __func__, - inet_ntoa(oi->address->u.prefix4), + zlog_info("%s: trap sent: %pI4 now %s", __func__, + &oi->address->u.prefix4, lookup_msg(ospf_ism_state_msg, oi->state, NULL)); oid_copy_addr(index, &(oi->address->u.prefix4), IN_ADDR_SIZE); diff --git a/ospfd/ospf_spf.c b/ospfd/ospf_spf.c index f5e393a13c..b53719a402 100644 --- a/ospfd/ospf_spf.c +++ b/ospfd/ospf_spf.c @@ -200,10 +200,10 @@ static struct vertex *ospf_vertex_new(struct ospf_area *area, listnode_add(area->spf_vertex_list, new); if (IS_DEBUG_OSPF_EVENT) - zlog_debug("%s: Created %s vertex %s", __func__, + zlog_debug("%s: Created %s vertex %pI4", __func__, new->type == OSPF_VERTEX_ROUTER ? "Router" : "Network", - inet_ntoa(new->lsa->id)); + &new->lsa->id); return new; } @@ -213,9 +213,9 @@ static void ospf_vertex_free(void *data) struct vertex *v = data; if (IS_DEBUG_OSPF_EVENT) - zlog_debug("%s: Free %s vertex %s", __func__, + zlog_debug("%s: Free %s vertex %pI4", __func__, v->type == OSPF_VERTEX_ROUTER ? "Router" : "Network", - inet_ntoa(v->lsa->id)); + &v->lsa->id); if (v->children) list_delete(&v->children); @@ -234,9 +234,9 @@ static void ospf_vertex_dump(const char *msg, struct vertex *v, if (!IS_DEBUG_OSPF_EVENT) return; - zlog_debug("%s %s vertex %s distance %u flags %u", msg, + zlog_debug("%s %s vertex %pI4 distance %u flags %u", msg, v->type == OSPF_VERTEX_ROUTER ? "Router" : "Network", - inet_ntoa(v->lsa->id), v->distance, (unsigned int)v->flags); + &v->lsa->id, v->distance, (unsigned int)v->flags); if (print_parents) { struct listnode *node; @@ -247,8 +247,8 @@ static void ospf_vertex_dump(const char *msg, struct vertex *v, if (vp) { zlog_debug( - "parent %s backlink %d nexthop %s lsa pos %d", - inet_ntoa(vp->parent->lsa->id), + "parent %pI4 backlink %d nexthop %s lsa pos %d", + &vp->parent->lsa->id, vp->backlink, inet_ntop(AF_INET, &vp->nexthop->router, buf1, BUFSIZ), @@ -826,9 +826,9 @@ static void ospf_spf_next(struct vertex *v, struct ospf_area *area, } if (IS_DEBUG_OSPF_EVENT) - zlog_debug("%s: Next vertex of %s vertex %s", __func__, + zlog_debug("%s: Next vertex of %s vertex %pI4", __func__, v->type == OSPF_VERTEX_ROUTER ? "Router" : "Network", - inet_ntoa(v->lsa->id)); + &v->lsa->id); p = ((uint8_t *)v->lsa) + OSPF_LSA_HEADER_SIZE + 4; lim = ((uint8_t *)v->lsa) + ntohs(v->lsa->length); @@ -868,20 +868,20 @@ static void ospf_spf_next(struct vertex *v, struct ospf_area *area, if (type == LSA_LINK_TYPE_VIRTUALLINK && IS_DEBUG_OSPF_EVENT) zlog_debug( - "looking up LSA through VL: %s", - inet_ntoa(l->link_id)); + "looking up LSA through VL: %pI4", + &l->link_id); w_lsa = ospf_lsa_lookup(area->ospf, area, OSPF_ROUTER_LSA, l->link_id, l->link_id); if (w_lsa && IS_DEBUG_OSPF_EVENT) - zlog_debug("found Router LSA %s", - inet_ntoa(l->link_id)); + zlog_debug("found Router LSA %pI4", + &l->link_id); break; case LSA_LINK_TYPE_TRANSIT: if (IS_DEBUG_OSPF_EVENT) zlog_debug( - "Looking up Network LSA, ID: %s", - inet_ntoa(l->link_id)); + "Looking up Network LSA, ID: %pI4", + &l->link_id); w_lsa = ospf_lsa_lookup_by_id( area, OSPF_NETWORK_LSA, l->link_id); if (w_lsa && IS_DEBUG_OSPF_EVENT) @@ -904,8 +904,8 @@ static void ospf_spf_next(struct vertex *v, struct ospf_area *area, w_lsa = ospf_lsa_lookup_by_id(area, OSPF_ROUTER_LSA, *r); if (w_lsa && IS_DEBUG_OSPF_EVENT) - zlog_debug("found Router LSA %s", - inet_ntoa(w_lsa->data->id)); + zlog_debug("found Router LSA %pI4", + &w_lsa->data->id); /* step (d) below */ distance = v->distance; @@ -1003,20 +1003,21 @@ static void ospf_spf_dump(struct vertex *v, int i) if (v->type == OSPF_VERTEX_ROUTER) { if (IS_DEBUG_OSPF_EVENT) - zlog_debug("SPF Result: %d [R] %s", i, - inet_ntoa(v->lsa->id)); + zlog_debug("SPF Result: %d [R] %pI4", i, + &v->lsa->id); } else { struct network_lsa *lsa = (struct network_lsa *)v->lsa; if (IS_DEBUG_OSPF_EVENT) - zlog_debug("SPF Result: %d [N] %s/%d", i, - inet_ntoa(v->lsa->id), + zlog_debug("SPF Result: %d [N] %pI4/%d", i, + &v->lsa->id, ip_masklen(lsa->mask)); } if (IS_DEBUG_OSPF_EVENT) for (ALL_LIST_ELEMENTS_RO(v->parents, nnode, parent)) { - zlog_debug(" nexthop %p %s %d", (void *)parent->nexthop, - inet_ntoa(parent->nexthop->router), + zlog_debug(" nexthop %p %pI4 %d", + (void *)parent->nexthop, + &parent->nexthop->router, parent->nexthop->lsa_pos); } @@ -1033,17 +1034,17 @@ void ospf_spf_print(struct vty *vty, struct vertex *v, int i) struct vertex_parent *parent; if (v->type == OSPF_VERTEX_ROUTER) { - vty_out(vty, "SPF Result: depth %d [R] %s\n", i, - inet_ntoa(v->lsa->id)); + vty_out(vty, "SPF Result: depth %d [R] %pI4\n", i, + &v->lsa->id); } else { struct network_lsa *lsa = (struct network_lsa *)v->lsa; - vty_out(vty, "SPF Result: depth %d [N] %s/%d\n", i, - inet_ntoa(v->lsa->id), ip_masklen(lsa->mask)); + vty_out(vty, "SPF Result: depth %d [N] %pI4/%d\n", i, + &v->lsa->id, ip_masklen(lsa->mask)); } for (ALL_LIST_ELEMENTS_RO(v->parents, nnode, parent)) { - vty_out(vty, " nexthop %s lsa pos %d\n", - inet_ntoa(parent->nexthop->router), + vty_out(vty, " nexthop %pI4 lsa pos %d\n", + &parent->nexthop->router, parent->nexthop->lsa_pos); } @@ -1061,8 +1062,8 @@ static void ospf_spf_process_stubs(struct ospf_area *area, struct vertex *v, struct vertex *child; if (IS_DEBUG_OSPF_EVENT) - zlog_debug("ospf_process_stub():processing stubs for area %s", - inet_ntoa(area->area_id)); + zlog_debug("ospf_process_stub():processing stubs for area %pI4", + &area->area_id); if (v->type == OSPF_VERTEX_ROUTER) { uint8_t *p; @@ -1073,8 +1074,8 @@ static void ospf_spf_process_stubs(struct ospf_area *area, struct vertex *v, if (IS_DEBUG_OSPF_EVENT) zlog_debug( - "ospf_process_stubs():processing router LSA, id: %s", - inet_ntoa(v->lsa->id)); + "ospf_process_stubs():processing router LSA, id: %pI4", + &v->lsa->id); router_lsa = (struct router_lsa *)v->lsa; @@ -1211,8 +1212,8 @@ ospf_rtrs_print (struct route_table *rtrs) else { if (IS_DEBUG_OSPF_EVENT) - zlog_debug (" via %s, %s\r", - inet_ntoa (path->nexthop), + zlog_debug (" via %pI4, %s\r", + &path->nexthop, ifindex2ifname (path->ifindex), VRF_DEFAULT); } } @@ -1233,8 +1234,8 @@ void ospf_spf_calculate(struct ospf_area *area, struct ospf_lsa *root_lsa, if (IS_DEBUG_OSPF_EVENT) { zlog_debug("ospf_spf_calculate: Start"); - zlog_debug("ospf_spf_calculate: running Dijkstra for area %s", - inet_ntoa(area->area_id)); + zlog_debug("ospf_spf_calculate: running Dijkstra for area %pI4", + &area->area_id); } /* @@ -1245,8 +1246,8 @@ void ospf_spf_calculate(struct ospf_area *area, struct ospf_lsa *root_lsa, if (!root_lsa) { if (IS_DEBUG_OSPF_EVENT) zlog_debug( - "ospf_spf_calculate: Skip area %s's calculation due to empty root LSA", - inet_ntoa(area->area_id)); + "ospf_spf_calculate: Skip area %pI4's calculation due to empty root LSA", + &area->area_id); return; } @@ -1444,20 +1445,19 @@ static int ospf_spf_calculate_schedule_worker(struct thread *thread) rbuf[0] = '\0'; if (spf_reason_flags) { if (spf_reason_flags & SPF_FLAG_ROUTER_LSA_INSTALL) - strncat(rbuf, "R, ", sizeof(rbuf) - strlen(rbuf) - 1); + strlcat(rbuf, "R, ", sizeof(rbuf)); if (spf_reason_flags & SPF_FLAG_NETWORK_LSA_INSTALL) - strncat(rbuf, "N, ", sizeof(rbuf) - strlen(rbuf) - 1); + strlcat(rbuf, "N, ", sizeof(rbuf)); if (spf_reason_flags & SPF_FLAG_SUMMARY_LSA_INSTALL) - strncat(rbuf, "S, ", sizeof(rbuf) - strlen(rbuf) - 1); + strlcat(rbuf, "S, ", sizeof(rbuf)); if (spf_reason_flags & SPF_FLAG_ASBR_SUMMARY_LSA_INSTALL) - strncat(rbuf, "AS, ", sizeof(rbuf) - strlen(rbuf) - 1); + strlcat(rbuf, "AS, ", sizeof(rbuf)); if (spf_reason_flags & SPF_FLAG_ABR_STATUS_CHANGE) - strncat(rbuf, "ABR, ", sizeof(rbuf) - strlen(rbuf) - 1); + strlcat(rbuf, "ABR, ", sizeof(rbuf)); if (spf_reason_flags & SPF_FLAG_ASBR_STATUS_CHANGE) - strncat(rbuf, "ASBR, ", - sizeof(rbuf) - strlen(rbuf) - 1); + strlcat(rbuf, "ASBR, ", sizeof(rbuf)); if (spf_reason_flags & SPF_FLAG_MAXAGE) - strncat(rbuf, "M, ", sizeof(rbuf) - strlen(rbuf) - 1); + strlcat(rbuf, "M, ", sizeof(rbuf)); size_t rbuflen = strlen(rbuf); if (rbuflen >= 2) diff --git a/ospfd/ospf_sr.c b/ospfd/ospf_sr.c index 64d7b39acd..e2218957d2 100644 --- a/ospfd/ospf_sr.c +++ b/ospfd/ospf_sr.c @@ -516,10 +516,13 @@ static int ospf_sr_start(struct ospf *ospf) static void ospf_sr_stop(void) { + if (OspfSR.status == SR_OFF) + return; + osr_debug("SR (%s): Stop Segment Routing", __func__); /* Disable any re-attempt to connect to Label Manager */ - THREAD_TIMER_OFF(OspfSR.t_start_lm); + THREAD_OFF(OspfSR.t_start_lm); /* Release SRGB & SRLB if active. */ if (OspfSR.srgb.reserved) @@ -1883,7 +1886,8 @@ void ospf_sr_update_task(struct ospf *ospf) struct timeval start_time, stop_time; - if (ospf == NULL) + /* Check ospf and SR status */ + if ((ospf == NULL) || (OspfSR.status != SR_UP)) return; monotime(&start_time); @@ -1947,10 +1951,8 @@ void ospf_sr_config_write_router(struct vty *vty) for (ALL_LIST_ELEMENTS_RO(OspfSR.self->ext_prefix, node, srp)) { vty_out(vty, - " segment-routing prefix %s/%u " - "index %u", - inet_ntoa(srp->prefv4.prefix), - srp->prefv4.prefixlen, srp->sid); + " segment-routing prefix %pFX index %u", + &srp->prefv4, srp->sid); if (CHECK_FLAG(srp->flags, EXT_SUBTLV_PREFIX_SID_EFLG)) vty_out(vty, " explicit-null\n"); @@ -2449,8 +2451,8 @@ DEFUN (sr_prefix_sid, new->instance = ospf_ext_schedule_prefix_index( ifp, new->sid, &new->prefv4, new->flags); if (new->instance == 0) { - vty_out(vty, "Unable to set index %u for prefix %s/%u\n", index, - inet_ntoa(p.u.prefix4), p.prefixlen); + vty_out(vty, "Unable to set index %u for prefix %pFX\n", + index, &p); return CMD_WARNING; } @@ -2572,6 +2574,7 @@ static void show_sr_prefix(struct sbuf *sbuf, struct json_object *json, char pref[19]; char sid[22]; char op[32]; + char buf[PREFIX_STRLEN]; int indent = 0; snprintfrr(pref, 19, "%pFX", (struct prefix *)&srp->prefv4); @@ -2598,15 +2601,18 @@ static void show_sr_prefix(struct sbuf *sbuf, struct json_object *json, srp->nhlfe.label_out); json_object_string_add(json_obj, "interface", itf ? itf->name : "-"); - json_object_string_add(json_obj, "nexthop", - inet_ntoa(srp->nhlfe.nexthop)); + json_object_string_add( + json_obj, "nexthop", + inet_ntop(AF_INET, &srp->nhlfe.nexthop, + buf, sizeof(buf))); json_object_array_add(json_route, json_obj); } else { sbuf_push(sbuf, 0, "%20s %9s %15s\n", sr_op2str(op, 32, srp->label_in, srp->nhlfe.label_out), itf ? itf->name : "-", - inet_ntoa(srp->nhlfe.nexthop)); + inet_ntop(AF_INET, &srp->nhlfe.nexthop, + buf, sizeof(buf))); } return; } @@ -2633,15 +2639,18 @@ static void show_sr_prefix(struct sbuf *sbuf, struct json_object *json, path->srni.label_out); json_object_string_add(json_obj, "interface", itf ? itf->name : "-"); - json_object_string_add(json_obj, "nexthop", - inet_ntoa(path->nexthop)); + json_object_string_add( + json_obj, "nexthop", + inet_ntop(AF_INET, &path->nexthop, + buf, sizeof(buf))); json_object_array_add(json_route, json_obj); } else { sbuf_push(sbuf, indent, "%20s %9s %15s\n", sr_op2str(op, 32, srp->label_in, path->srni.label_out), itf ? itf->name : "-", - inet_ntoa(path->nexthop)); + inet_ntop(AF_INET, &path->nexthop, buf, + sizeof(buf))); /* Offset to align information for ECMP */ indent = 43; } @@ -2660,6 +2669,7 @@ static void show_sr_node(struct vty *vty, struct json_object *json, char pref[19]; char sid[22]; char op[32]; + char buf[PREFIX_STRLEN]; uint32_t upper; json_object *json_node = NULL, *json_algo, *json_obj; json_object *json_prefix = NULL, *json_link = NULL; @@ -2673,7 +2683,8 @@ static void show_sr_node(struct vty *vty, struct json_object *json, if (json) { json_node = json_object_new_object(); json_object_string_add(json_node, "routerID", - inet_ntoa(srn->adv_router)); + inet_ntop(AF_INET, &srn->adv_router, + buf, sizeof(buf))); json_object_int_add(json_node, "srgbSize", srn->srgb.range_size); json_object_int_add(json_node, "srgbLabel", @@ -2700,7 +2711,7 @@ static void show_sr_node(struct vty *vty, struct json_object *json, if (srn->msd != 0) json_object_int_add(json_node, "nodeMsd", srn->msd); } else { - sbuf_push(&sbuf, 0, "SR-Node: %s", inet_ntoa(srn->adv_router)); + sbuf_push(&sbuf, 0, "SR-Node: %pI4", &srn->adv_router); upper = srn->srgb.lower_bound + srn->srgb.range_size - 1; sbuf_push(&sbuf, 0, "\tSRGB: [%u/%u]", srn->srgb.lower_bound, upper); @@ -2764,7 +2775,8 @@ static void show_sr_node(struct vty *vty, struct json_object *json, itf ? itf->name : "-"); json_object_string_add( json_obj, "nexthop", - inet_ntoa(srl->nhlfe[0].nexthop)); + inet_ntop(AF_INET, &srl->nhlfe[0].nexthop, + buf, sizeof(buf))); json_object_array_add(json_link, json_obj); /* Backup Link */ json_obj = json_object_new_object(); @@ -2779,7 +2791,8 @@ static void show_sr_node(struct vty *vty, struct json_object *json, itf ? itf->name : "-"); json_object_string_add( json_obj, "nexthop", - inet_ntoa(srl->nhlfe[1].nexthop)); + inet_ntop(AF_INET, &srl->nhlfe[1].nexthop, + buf, sizeof(buf))); json_object_array_add(json_link, json_obj); } else { sbuf_push(&sbuf, 0, "%18s %21s %20s %9s %15s\n", @@ -2787,14 +2800,16 @@ static void show_sr_node(struct vty *vty, struct json_object *json, sr_op2str(op, 32, srl->nhlfe[0].label_in, srl->nhlfe[0].label_out), itf ? itf->name : "-", - inet_ntoa(srl->nhlfe[0].nexthop)); + inet_ntop(AF_INET, &srl->nhlfe[0].nexthop, + buf, sizeof(buf))); snprintf(sid, 22, "SR Adj. (lbl %u)", srl->sid[1]); sbuf_push(&sbuf, 0, "%18s %21s %20s %9s %15s\n", pref, sid, sr_op2str(op, 32, srl->nhlfe[1].label_in, srl->nhlfe[1].label_out), itf ? itf->name : "-", - inet_ntoa(srl->nhlfe[1].nexthop)); + inet_ntop(AF_INET, &srl->nhlfe[1].nexthop, + buf, sizeof(buf))); } } if (json) @@ -2837,6 +2852,7 @@ DEFUN (show_ip_opsf_srdb, int idx = 0; struct in_addr rid; struct sr_node *srn; + char buf[PREFIX_STRLEN]; bool uj = use_json(argc, argv); json_object *json = NULL, *json_node_array = NULL; @@ -2848,13 +2864,15 @@ DEFUN (show_ip_opsf_srdb, if (uj) { json = json_object_new_object(); json_node_array = json_object_new_array(); - json_object_string_add(json, "srdbID", - inet_ntoa(OspfSR.self->adv_router)); + json_object_string_add( + json, "srdbID", + inet_ntop(AF_INET, &OspfSR.self->adv_router, + buf, sizeof(buf))); json_object_object_add(json, "srNodes", json_node_array); } else { vty_out(vty, - "\n\t\tOSPF Segment Routing database for ID %s\n\n", - inet_ntoa(OspfSR.self->adv_router)); + "\n\t\tOSPF Segment Routing database for ID %pI4\n\n", + &OspfSR.self->adv_router); } if (argv_find(argv, argc, "self-originate", &idx)) { diff --git a/ospfd/ospf_te.c b/ospfd/ospf_te.c index 1009c7577e..e3c554c530 100644 --- a/ospfd/ospf_te.c +++ b/ospfd/ospf_te.c @@ -1043,8 +1043,8 @@ static void ospf_mpls_te_nsm_change(struct ospf_neighbor *nbr, int old_state) if (IS_DEBUG_OSPF_TE) zlog_debug( - "MPLS-TE (%s): Add Link-ID %s for interface %s ", - __func__, inet_ntoa(lp->link_id.value), oi->ifp->name); + "MPLS-TE (%s): Add Link-ID %pI4 for interface %s ", + __func__, &lp->link_id.value, oi->ifp->name); /* Try to Schedule LSA */ if (OspfMplsTE.enabled) { @@ -1187,8 +1187,8 @@ static struct ospf_lsa *ospf_mpls_te_lsa_new(struct ospf *ospf, if (IS_DEBUG_OSPF(lsa, LSA_GENERATE)) zlog_debug( - "LSA[Type%d:%s]: Create an Opaque-LSA/MPLS-TE instance", - lsa_type, inet_ntoa(lsa_id)); + "LSA[Type%d:%pI4]: Create an Opaque-LSA/MPLS-TE instance", + lsa_type, &lsa_id); /* Set opaque-LSA body fields. */ ospf_mpls_te_lsa_body_set(s, lp); @@ -1243,11 +1243,9 @@ static int ospf_mpls_te_lsa_originate1(struct ospf_area *area, ospf_flood_through_area(area, NULL /*nbr*/, new); if (IS_DEBUG_OSPF(lsa, LSA_GENERATE)) { - char area_id[INET_ADDRSTRLEN]; - strlcpy(area_id, inet_ntoa(area->area_id), sizeof(area_id)); zlog_debug( - "LSA[Type%d:%s]: Originate Opaque-LSA/MPLS-TE: Area(%s), Link(%s)", - new->data->type, inet_ntoa(new->data->id), area_id, + "LSA[Type%d:%pI4]: Originate Opaque-LSA/MPLS-TE: Area(%pI4), Link(%s)", + new->data->type, &new->data->id, &area->area_id, lp->ifp->name); ospf_lsa_header_dump(new->data); } @@ -1302,8 +1300,8 @@ static int ospf_mpls_te_lsa_originate_area(void *arg) /* Ok, let's try to originate an LSA for this area and Link. */ if (IS_DEBUG_OSPF_TE) zlog_debug( - "MPLS-TE(ospf_mpls_te_lsa_originate_area) Let's finally reoriginate the LSA %d through the Area %s for Link %s", - lp->instance, inet_ntoa(area->area_id), + "MPLS-TE(ospf_mpls_te_lsa_originate_area) Let's finally reoriginate the LSA %d through the Area %pI4 for Link %s", + lp->instance, &area->area_id, lp->ifp ? lp->ifp->name : "?"); if (ospf_mpls_te_lsa_originate1(area, lp) != 0) return rc; @@ -1347,8 +1345,8 @@ static int ospf_mpls_te_lsa_originate2(struct ospf *top, if (IS_DEBUG_OSPF(lsa, LSA_GENERATE)) { zlog_debug( - "LSA[Type%d:%s]: Originate Opaque-LSA/MPLS-TE Inter-AS", - new->data->type, inet_ntoa(new->data->id)); + "LSA[Type%d:%pI4]: Originate Opaque-LSA/MPLS-TE Inter-AS", + new->data->type, &new->data->id); ospf_lsa_header_dump(new->data); } @@ -1490,8 +1488,8 @@ static struct ospf_lsa *ospf_mpls_te_lsa_refresh(struct ospf_lsa *lsa) /* Debug logging. */ if (IS_DEBUG_OSPF(lsa, LSA_GENERATE)) { - zlog_debug("LSA[Type%d:%s]: Refresh Opaque-LSA/MPLS-TE", - new->data->type, inet_ntoa(new->data->id)); + zlog_debug("LSA[Type%d:%pI4]: Refresh Opaque-LSA/MPLS-TE", + new->data->type, &new->data->id); ospf_lsa_header_dump(new->data); } @@ -1593,9 +1591,9 @@ static uint16_t show_vty_router_addr(struct vty *vty, struct tlv_header *tlvh) struct te_tlv_router_addr *top = (struct te_tlv_router_addr *)tlvh; if (vty != NULL) - vty_out(vty, " Router-Address: %s\n", inet_ntoa(top->value)); + vty_out(vty, " Router-Address: %pI4\n", &top->value); else - zlog_debug(" Router-Address: %s", inet_ntoa(top->value)); + zlog_debug(" Router-Address: %pI4", &top->value); return TLV_SIZE(tlvh); } @@ -1648,9 +1646,9 @@ static uint16_t show_vty_link_subtlv_link_id(struct vty *vty, top = (struct te_link_subtlv_link_id *)tlvh; if (vty != NULL) - vty_out(vty, " Link-ID: %s\n", inet_ntoa(top->value)); + vty_out(vty, " Link-ID: %pI4\n", &top->value); else - zlog_debug(" Link-ID: %s", inet_ntoa(top->value)); + zlog_debug(" Link-ID: %pI4", &top->value); return TLV_SIZE(tlvh); } @@ -1671,11 +1669,9 @@ static uint16_t show_vty_link_subtlv_lclif_ipaddr(struct vty *vty, for (i = 0; i < n; i++) { if (vty != NULL) - vty_out(vty, " #%d: %s\n", i, - inet_ntoa(top->value[i])); + vty_out(vty, " #%d: %pI4\n", i, &top->value[i]); else - zlog_debug(" #%d: %s", i, - inet_ntoa(top->value[i])); + zlog_debug(" #%d: %pI4", i, &top->value[i]); } return TLV_SIZE(tlvh); } @@ -1695,11 +1691,9 @@ static uint16_t show_vty_link_subtlv_rmtif_ipaddr(struct vty *vty, for (i = 0; i < n; i++) { if (vty != NULL) - vty_out(vty, " #%d: %s\n", i, - inet_ntoa(top->value[i])); + vty_out(vty, " #%d: %pI4\n", i, &top->value[i]); else - zlog_debug(" #%d: %s", i, - inet_ntoa(top->value[i])); + zlog_debug(" #%d: %pI4", i, &top->value[i]); } return TLV_SIZE(tlvh); } @@ -1811,15 +1805,15 @@ static uint16_t show_vty_link_subtlv_lrrid(struct vty *vty, top = (struct te_link_subtlv_lrrid *)tlvh; if (vty != NULL) { - vty_out(vty, " Local TE Router ID: %s\n", - inet_ntoa(top->local)); - vty_out(vty, " Remote TE Router ID: %s\n", - inet_ntoa(top->remote)); + vty_out(vty, " Local TE Router ID: %pI4\n", + &top->local); + vty_out(vty, " Remote TE Router ID: %pI4\n", + &top->remote); } else { - zlog_debug(" Local TE Router ID: %s", - inet_ntoa(top->local)); - zlog_debug(" Remote TE Router ID: %s", - inet_ntoa(top->remote)); + zlog_debug(" Local TE Router ID: %pI4", + &top->local); + zlog_debug(" Remote TE Router ID: %pI4", + &top->remote); } return TLV_SIZE(tlvh); @@ -1855,11 +1849,11 @@ static uint16_t show_vty_link_subtlv_rip(struct vty *vty, top = (struct te_link_subtlv_rip *)tlvh; if (vty != NULL) - vty_out(vty, " Inter-AS TE Remote ASBR IP address: %s\n", - inet_ntoa(top->value)); + vty_out(vty, " Inter-AS TE Remote ASBR IP address: %pI4\n", + &top->value); else - zlog_debug(" Inter-AS TE Remote ASBR IP address: %s", - inet_ntoa(top->value)); + zlog_debug(" Inter-AS TE Remote ASBR IP address: %pI4", + &top->value); return TLV_SIZE(tlvh); } @@ -2160,15 +2154,15 @@ static void ospf_mpls_te_config_write_router(struct vty *vty) if (OspfMplsTE.enabled) { vty_out(vty, " mpls-te on\n"); - vty_out(vty, " mpls-te router-address %s\n", - inet_ntoa(OspfMplsTE.router_addr.value)); + vty_out(vty, " mpls-te router-address %pI4\n", + &OspfMplsTE.router_addr.value); } if (OspfMplsTE.inter_as == AS) vty_out(vty, " mpls-te inter-as as\n"); if (OspfMplsTE.inter_as == Area) - vty_out(vty, " mpls-te inter-as area %s \n", - inet_ntoa(OspfMplsTE.interas_areaid)); + vty_out(vty, " mpls-te inter-as area %pI4 \n", + &OspfMplsTE.interas_areaid); return; } diff --git a/ospfd/ospf_vty.c b/ospfd/ospf_vty.c index 870c9dd0a8..1060f20bdf 100644 --- a/ospfd/ospf_vty.c +++ b/ospfd/ospf_vty.c @@ -34,6 +34,7 @@ #include "zclient.h" #include <lib/json.h> #include "defaults.h" +#include "lib/printfrr.h" #include "ospfd/ospfd.h" #include "ospfd/ospf_asbr.h" @@ -921,7 +922,7 @@ ospf_find_vl_data(struct ospf *ospf, struct ospf_vl_config_data *vl_config) if (area->external_routing != OSPF_AREA_DEFAULT) { if (vl_config->area_id_fmt == OSPF_AREA_ID_FMT_DOTTEDQUAD) - vty_out(vty, "Area %s is %s\n", inet_ntoa(area_id), + vty_out(vty, "Area %pI4 is %s\n", &area_id, area->external_routing == OSPF_AREA_NSSA ? "nssa" : "stub"); @@ -1445,6 +1446,8 @@ DEFUN (ospf_area_stub, return CMD_WARNING_CONFIG_FAILED; } + /* Flush the external LSAs from the specified area */ + ospf_flush_lsa_from_area(ospf, area_id, OSPF_AS_EXTERNAL_LSA); ospf_area_no_summary_unset(ospf, area_id); return CMD_SUCCESS; @@ -1567,6 +1570,8 @@ static int ospf_area_nssa_cmd_handler(struct vty *vty, int argc, ospf_area_no_summary_unset(ospf, area_id); } + /* Flush the external LSA for the specified area */ + ospf_flush_lsa_from_area(ospf, area_id, OSPF_AS_EXTERNAL_LSA); ospf_schedule_abr_task(ospf); return CMD_SUCCESS; @@ -1672,6 +1677,8 @@ DEFUN (no_ospf_area_nssa, VTY_GET_OSPF_AREA_ID_NO_BB("NSSA", area_id, format, argv[idx_ipv4_number]->arg); + /* Flush the NSSA LSA for the specified area */ + ospf_flush_lsa_from_area(ospf, area_id, OSPF_AS_NSSA_LSA); ospf_area_nssa_unset(ospf, area_id, argc); ospf_schedule_abr_task(ospf); @@ -1717,8 +1724,8 @@ DEFUN (ospf_area_default_cost, p.prefixlen = 0; if (IS_DEBUG_OSPF_EVENT) zlog_debug( - "ospf_abr_announce_stub_defaults(): announcing 0.0.0.0/0 to area %s", - inet_ntoa(area->area_id)); + "ospf_abr_announce_stub_defaults(): announcing 0.0.0.0/0 to area %pI4", + &area->area_id); ospf_abr_announce_network_to_area(&p, area->default_cost, area); return CMD_SUCCESS; @@ -1760,8 +1767,8 @@ DEFUN (no_ospf_area_default_cost, p.prefixlen = 0; if (IS_DEBUG_OSPF_EVENT) zlog_debug( - "ospf_abr_announce_stub_defaults(): announcing 0.0.0.0/0 to area %s", - inet_ntoa(area->area_id)); + "ospf_abr_announce_stub_defaults(): announcing 0.0.0.0/0 to area %pI4", + &area->area_id); ospf_abr_announce_network_to_area(&p, area->default_cost, area); @@ -2643,13 +2650,14 @@ static void show_ip_ospf_area(struct vty *vty, struct ospf_area *area, json_object *json_areas, bool use_json) { json_object *json_area = NULL; + char buf[PREFIX_STRLEN]; if (use_json) json_area = json_object_new_object(); /* Show Area ID. */ if (!use_json) - vty_out(vty, " Area ID: %s", inet_ntoa(area->area_id)); + vty_out(vty, " Area ID: %pI4", &area->area_id); /* Show Area type/mode. */ if (OSPF_IS_AREA_BACKBONE(area)) { @@ -2936,7 +2944,9 @@ static void show_ip_ospf_area(struct vty *vty, struct ospf_area *area, } if (use_json) - json_object_object_add(json_areas, inet_ntoa(area->area_id), + json_object_object_add(json_areas, + inet_ntop(AF_INET, &area->area_id, + buf, sizeof(buf)), json_area); else vty_out(vty, "\n"); @@ -2949,6 +2959,7 @@ static int show_ip_ospf_common(struct vty *vty, struct ospf *ospf, struct ospf_area *area; struct timeval result; char timebuf[OSPF_TIME_DUMP_SIZE]; + char buf[PREFIX_STRLEN]; json_object *json_vrf = NULL; json_object *json_areas = NULL; @@ -2974,10 +2985,11 @@ static int show_ip_ospf_common(struct vty *vty, struct ospf *ospf, /* Show Router ID. */ if (json) { json_object_string_add(json_vrf, "routerId", - inet_ntoa(ospf->router_id)); + inet_ntop(AF_INET, &ospf->router_id, + buf, sizeof(buf))); } else { - vty_out(vty, " OSPF Routing Process, Router ID: %s\n", - inet_ntoa(ospf->router_id)); + vty_out(vty, " OSPF Routing Process, Router ID: %pI4\n", + &ospf->router_id); } /* Graceful shutdown */ @@ -3389,6 +3401,7 @@ static void show_ip_ospf_interface_sub(struct vty *vty, struct ospf *ospf, int is_up; struct ospf_neighbor *nbr; struct route_node *rn; + char buf[PREFIX_STRLEN]; uint32_t bandwidth = ifp->bandwidth ? ifp->bandwidth : ifp->speed; /* Is interface up? */ @@ -3460,7 +3473,9 @@ static void show_ip_ospf_interface_sub(struct vty *vty, struct ospf *ospf, if (use_json) { json_object_string_add( json_interface_sub, "ipAddress", - inet_ntoa(oi->address->u.prefix4)); + inet_ntop(AF_INET, + &oi->address->u.prefix4, + buf, sizeof(buf))); json_object_int_add(json_interface_sub, "ipAddressPrefixlen", oi->address->prefixlen); @@ -3493,15 +3508,17 @@ static void show_ip_ospf_interface_sub(struct vty *vty, struct ospf *ospf, json_object_string_add( json_interface_sub, "vlinkPeer", - inet_ntoa(dest)); + inet_ntop(AF_INET, &dest, + buf, sizeof(buf))); else json_object_string_add( json_interface_sub, "localIfUsed", - inet_ntoa(dest)); + inet_ntop(AF_INET, &dest, + buf, sizeof(buf))); } else - vty_out(vty, " %s %s,", dstr, - inet_ntoa(dest)); + vty_out(vty, " %s %pI4,", dstr, + &dest); } if (use_json) { json_object_string_add(json_interface_sub, "area", @@ -3510,8 +3527,10 @@ static void show_ip_ospf_interface_sub(struct vty *vty, struct ospf *ospf, json_object_boolean_true_add( json_interface_sub, "mtuMismatchDetect"); - json_object_string_add(json_interface_sub, "routerId", - inet_ntoa(ospf->router_id)); + json_object_string_add( + json_interface_sub, "routerId", + inet_ntop(AF_INET, &ospf->router_id, + buf, sizeof(buf))); json_object_string_add(json_interface_sub, "networkType", ospf_network_type_str[oi->type]); @@ -3534,8 +3553,8 @@ static void show_ip_ospf_interface_sub(struct vty *vty, struct ospf *ospf, : "enabled"); vty_out(vty, - " Router ID %s, Network Type %s, Cost: %d\n", - inet_ntoa(ospf->router_id), + " Router ID %pI4, Network Type %s, Cost: %d\n", + &ospf->router_id, ospf_network_type_str[oi->type], oi->output_cost); @@ -3561,19 +3580,22 @@ static void show_ip_ospf_interface_sub(struct vty *vty, struct ospf *ospf, if (use_json) { json_object_string_add( json_interface_sub, "bdrId", - inet_ntoa(nbr->router_id)); + inet_ntop(AF_INET, + &nbr->router_id, + buf, sizeof(buf))); json_object_string_add( json_interface_sub, "bdrAddress", - inet_ntoa(nbr->address.u - .prefix4)); + inet_ntop(AF_INET, + &nbr->address.u + .prefix4, + buf, sizeof(buf))); } else { vty_out(vty, - " Backup Designated Router (ID) %s,", - inet_ntoa(nbr->router_id)); - vty_out(vty, " Interface Address %s\n", - inet_ntoa(nbr->address.u - .prefix4)); + " Backup Designated Router (ID) %pI4,", + &nbr->router_id); + vty_out(vty, " Interface Address %pI4\n", + &nbr->address.u.prefix4); } } } @@ -4173,6 +4195,7 @@ static void show_ip_ospf_neighbor_sub(struct vty *vty, struct route_node *rn; struct ospf_neighbor *nbr, *prev_nbr = NULL; char msgbuf[16]; + char buf[PREFIX_STRLEN]; char timebuf[OSPF_TIME_DUMP_SIZE]; json_object *json_neighbor = NULL, *json_neigh_array = NULL; @@ -4199,9 +4222,8 @@ static void show_ip_ospf_neighbor_sub(struct vty *vty, strlcpy(neigh_str, "neighbor", sizeof(neigh_str)); else - strlcpy(neigh_str, - inet_ntoa(nbr->router_id), - sizeof(neigh_str)); + inet_ntop(AF_INET, &nbr->router_id, + neigh_str, sizeof(neigh_str)); json_object_object_get_ex(json, neigh_str, &json_neigh_array); @@ -4233,8 +4255,10 @@ static void show_ip_ospf_neighbor_sub(struct vty *vty, json_object_int_add(json_neighbor, "deadTimeMsecs", time_store); - json_object_string_add(json_neighbor, "address", - inet_ntoa(nbr->src)); + json_object_string_add( + json_neighbor, "address", + inet_ntop(AF_INET, &nbr->src, + buf, sizeof(buf))); json_object_string_add(json_neighbor, "ifaceName", IF_NAME(oi)); @@ -4258,15 +4282,15 @@ static void show_ip_ospf_neighbor_sub(struct vty *vty, vty_out(vty, "%-15s %3d %-15s ", "-", nbr->priority, msgbuf); else - vty_out(vty, "%-15s %3d %-15s ", - inet_ntoa(nbr->router_id), + vty_out(vty, "%-15pI4 %3d %-15s ", + &nbr->router_id, nbr->priority, msgbuf); vty_out(vty, "%9s ", ospf_timer_dump(nbr->t_inactivity, timebuf, sizeof(timebuf))); - vty_out(vty, "%-15s ", inet_ntoa(nbr->src)); + vty_out(vty, "%-15pI4 ", &nbr->src); vty_out(vty, "%-32s %5ld %5ld %5d\n", IF_NAME(oi), ospf_ls_retransmit_count(nbr), @@ -4469,6 +4493,7 @@ static int show_ip_ospf_neighbor_all_common(struct vty *vty, struct ospf *ospf, { struct listnode *node; struct ospf_interface *oi; + char buf[PREFIX_STRLEN]; json_object *json_vrf = NULL; json_object *json_neighbor_sub = NULL; @@ -4524,15 +4549,17 @@ static int show_ip_ospf_neighbor_all_common(struct vty *vty, struct ospf *ospf, "nbrNbmaDbSummaryCounter", 0); json_object_object_add( json_vrf, - inet_ntoa(nbr_nbma->addr), + inet_ntop(AF_INET, + &nbr_nbma->addr, buf, + sizeof(buf)), json_neighbor_sub); } else { vty_out(vty, "%-15s %3d %-15s %9s ", "-", nbr_nbma->priority, "Down", "-"); vty_out(vty, - "%-32s %-20s %5d %5d %5d\n", - inet_ntoa(nbr_nbma->addr), + "%-32pI4 %-20s %5d %5d %5d\n", + &nbr_nbma->addr, IF_NAME(oi), 0, 0, 0); } } @@ -4814,6 +4841,7 @@ static void show_ip_ospf_nbr_nbma_detail_sub(struct vty *vty, bool use_json, json_object *json) { char timebuf[OSPF_TIME_DUMP_SIZE]; + char buf[PREFIX_STRLEN]; json_object *json_sub = NULL; if (use_json) @@ -4824,10 +4852,11 @@ static void show_ip_ospf_nbr_nbma_detail_sub(struct vty *vty, /* Show interface address. */ if (use_json) json_object_string_add(json_sub, "ifaceAddress", - inet_ntoa(nbr_nbma->addr)); + inet_ntop(AF_INET, &nbr_nbma->addr, + buf, sizeof(buf))); else - vty_out(vty, " interface address %s\n", - inet_ntoa(nbr_nbma->addr)); + vty_out(vty, " interface address %pI4\n", + &nbr_nbma->addr); /* Show Area ID. */ if (use_json) { @@ -4897,6 +4926,7 @@ static void show_ip_ospf_neighbor_detail_sub(struct vty *vty, char timebuf[OSPF_TIME_DUMP_SIZE]; json_object *json_neigh = NULL, *json_neigh_array = NULL; char neigh_str[INET_ADDRSTRLEN] = {0}; + char buf[PREFIX_STRLEN]; if (use_json) { if (prev_nbr && @@ -4908,8 +4938,8 @@ static void show_ip_ospf_neighbor_detail_sub(struct vty *vty, && nbr->router_id.s_addr == INADDR_ANY) strlcpy(neigh_str, "noNbrId", sizeof(neigh_str)); else - strlcpy(neigh_str, inet_ntoa(nbr->router_id), - sizeof(neigh_str)); + inet_ntop(AF_INET, &nbr->router_id, + neigh_str, sizeof(neigh_str)); json_object_object_get_ex(json, neigh_str, &json_neigh_array); @@ -4927,17 +4957,19 @@ static void show_ip_ospf_neighbor_detail_sub(struct vty *vty, && nbr->router_id.s_addr == INADDR_ANY) vty_out(vty, " Neighbor %s,", "-"); else - vty_out(vty, " Neighbor %s,", - inet_ntoa(nbr->router_id)); + vty_out(vty, " Neighbor %pI4,", + &nbr->router_id); } /* Show interface address. */ if (use_json) json_object_string_add(json_neigh, "ifaceAddress", - inet_ntoa(nbr->address.u.prefix4)); + inet_ntop(AF_INET, + &nbr->address.u.prefix4, + buf, sizeof(buf))); else - vty_out(vty, " interface address %s\n", - inet_ntoa(nbr->address.u.prefix4)); + vty_out(vty, " interface address %pI4\n", + &nbr->address.u.prefix4); /* Show Area ID. */ if (use_json) { @@ -5012,16 +5044,18 @@ static void show_ip_ospf_neighbor_detail_sub(struct vty *vty, /* Show Designated Rotuer ID. */ if (use_json) json_object_string_add(json_neigh, "routerDesignatedId", - inet_ntoa(nbr->d_router)); + inet_ntop(AF_INET, &nbr->d_router, + buf, sizeof(buf))); else - vty_out(vty, " DR is %s,", inet_ntoa(nbr->d_router)); + vty_out(vty, " DR is %pI4,", &nbr->d_router); /* Show Backup Designated Rotuer ID. */ if (use_json) json_object_string_add(json_neigh, "routerDesignatedBackupId", - inet_ntoa(nbr->bd_router)); + inet_ntop(AF_INET, &nbr->bd_router, + buf, sizeof(buf))); else - vty_out(vty, " BDR is %s\n", inet_ntoa(nbr->bd_router)); + vty_out(vty, " BDR is %pI4\n", &nbr->bd_router); /* Show options. */ if (use_json) { @@ -5788,9 +5822,9 @@ static int show_lsa_summary(struct vty *vty, struct ospf_lsa *lsa, int self) /* If self option is set, check LSA self flag. */ if (self == 0 || IS_LSA_SELF(lsa)) { /* LSA common part show. */ - vty_out(vty, "%-15s ", inet_ntoa(lsa->data->id)); - vty_out(vty, "%-15s %4d 0x%08lx 0x%04x", - inet_ntoa(lsa->data->adv_router), LS_AGE(lsa), + vty_out(vty, "%-15pI4 ", &lsa->data->id); + vty_out(vty, "%-15pI4 %4d 0x%08lx 0x%04x", + &lsa->data->adv_router, LS_AGE(lsa), (unsigned long)ntohl(lsa->data->ls_seqnum), ntohs(lsa->data->checksum)); /* LSA specific part show. */ @@ -5807,8 +5841,7 @@ static int show_lsa_summary(struct vty *vty, struct ospf_lsa *lsa, int self) p.prefixlen = ip_masklen(sl->mask); apply_mask_ipv4(&p); - vty_out(vty, " %s/%d", inet_ntoa(p.prefix), - p.prefixlen); + vty_out(vty, " %pFX", &p); break; case OSPF_AS_EXTERNAL_LSA: case OSPF_AS_NSSA_LSA: @@ -5819,11 +5852,11 @@ static int show_lsa_summary(struct vty *vty, struct ospf_lsa *lsa, int self) p.prefixlen = ip_masklen(asel->mask); apply_mask_ipv4(&p); - vty_out(vty, " %s %s/%d [0x%lx]", + vty_out(vty, " %s %pFX [0x%lx]", IS_EXTERNAL_METRIC(asel->e[0].tos) ? "E2" : "E1", - inet_ntoa(p.prefix), p.prefixlen, + &p, (unsigned long)ntohl( asel->e[0].route_tag)); break; @@ -5898,10 +5931,10 @@ static void show_ip_ospf_database_header(struct vty *vty, struct ospf_lsa *lsa) } vty_out(vty, " LS Type: %s\n", lookup_msg(ospf_lsa_type_msg, lsa->data->type, NULL)); - vty_out(vty, " Link State ID: %s %s\n", inet_ntoa(lsa->data->id), + vty_out(vty, " Link State ID: %pI4 %s\n", &lsa->data->id, lookup_msg(ospf_link_state_id_type_msg, lsa->data->type, NULL)); - vty_out(vty, " Advertising Router: %s\n", - inet_ntoa(lsa->data->adv_router)); + vty_out(vty, " Advertising Router: %pI4\n", + &lsa->data->adv_router); vty_out(vty, " LS Seq Number: %08lx\n", (unsigned long)ntohl(lsa->data->ls_seqnum)); vty_out(vty, " Checksum: 0x%04x\n", ntohs(lsa->data->checksum)); @@ -5939,10 +5972,10 @@ static void show_ip_ospf_database_router_links(struct vty *vty, vty_out(vty, " Link connected to: %s\n", link_type_desc[type]); - vty_out(vty, " (Link ID) %s: %s\n", link_id_desc[type], - inet_ntoa(rl->link[i].link_id)); - vty_out(vty, " (Link Data) %s: %s\n", link_data_desc[type], - inet_ntoa(rl->link[i].link_data)); + vty_out(vty, " (Link ID) %s: %pI4\n", link_id_desc[type], + &rl->link[i].link_id); + vty_out(vty, " (Link Data) %s: %pI4\n", + link_data_desc[type], &rl->link[i].link_data); vty_out(vty, " Number of TOS metrics: 0\n"); vty_out(vty, " TOS 0 Metric: %d\n", ntohs(rl->link[i].metric)); @@ -5982,8 +6015,8 @@ static int show_network_lsa_detail(struct vty *vty, struct ospf_lsa *lsa) length = ntohs(lsa->data->length) - OSPF_LSA_HEADER_SIZE - 4; for (i = 0; length > 0; i++, length -= 4) - vty_out(vty, " Attached Router: %s\n", - inet_ntoa(nl->routers[i])); + vty_out(vty, " Attached Router: %pI4\n", + &nl->routers[i]); vty_out(vty, "\n"); } @@ -6042,8 +6075,8 @@ static int show_as_external_lsa_detail(struct vty *vty, struct ospf_lsa *lsa) vty_out(vty, " TOS: 0\n"); vty_out(vty, " Metric: %d\n", GET_METRIC(al->e[0].metric)); - vty_out(vty, " Forward Address: %s\n", - inet_ntoa(al->e[0].fwd_addr)); + vty_out(vty, " Forward Address: %pI4\n", + &al->e[0].fwd_addr); vty_out(vty, " External Route Tag: %" ROUTE_TAG_PRI "\n\n", @@ -6068,8 +6101,8 @@ show_as_external_lsa_stdvty (struct ospf_lsa *lsa) zlog_debug( " TOS: 0%s", "\n"); zlog_debug( " Metric: %d%s", GET_METRIC (al->e[0].metric), "\n"); - zlog_debug( " Forward Address: %s%s", - inet_ntoa (al->e[0].fwd_addr), "\n"); + zlog_debug( " Forward Address: %pI4%s", + &al->e[0].fwd_addr, "\n"); zlog_debug( " External Route Tag: %"ROUTE_TAG_PRI"%s%s", (route_tag_t)ntohl (al->e[0].route_tag), "\n", "\n"); @@ -6094,8 +6127,8 @@ static int show_as_nssa_lsa_detail(struct vty *vty, struct ospf_lsa *lsa) vty_out(vty, " TOS: 0\n"); vty_out(vty, " Metric: %d\n", GET_METRIC(al->e[0].metric)); - vty_out(vty, " NSSA: Forward Address: %s\n", - inet_ntoa(al->e[0].fwd_addr)); + vty_out(vty, " NSSA: Forward Address: %pI4\n", + &al->e[0].fwd_addr); vty_out(vty, " External Route Tag: %" ROUTE_TAG_PRI "\n\n", @@ -6317,10 +6350,10 @@ static void show_ip_ospf_database_maxage(struct vty *vty, struct ospf *ospf) if ((lsa = rn->info) != NULL) { vty_out(vty, "Link type: %d\n", lsa->data->type); - vty_out(vty, "Link State ID: %s\n", - inet_ntoa(lsa->data->id)); - vty_out(vty, "Advertising Router: %s\n", - inet_ntoa(lsa->data->adv_router)); + vty_out(vty, "Link State ID: %pI4\n", + &lsa->data->id); + vty_out(vty, "Advertising Router: %pI4\n", + &lsa->data->adv_router); vty_out(vty, "LSA lock count: %d\n", lsa->lock); vty_out(vty, "\n"); } @@ -6358,8 +6391,8 @@ static int show_ip_ospf_database_common(struct vty *vty, struct ospf *ospf, ospf_show_vrf_name(ospf, vty, NULL, use_vrf); - vty_out(vty, "\n OSPF Router with ID (%s)\n\n", - inet_ntoa(ospf->router_id)); + vty_out(vty, "\n OSPF Router with ID (%pI4)\n\n", + &ospf->router_id); /* Show all LSA. */ if (argc == arg_base + 4) { @@ -6608,8 +6641,8 @@ static int show_ip_ospf_database_type_adv_router_common(struct vty *vty, ospf_show_vrf_name(ospf, vty, NULL, use_vrf); - vty_out(vty, "\n OSPF Router with ID (%s)\n\n", - inet_ntoa(ospf->router_id)); + vty_out(vty, "\n OSPF Router with ID (%pI4)\n\n", + &ospf->router_id); /* Set database type to show. */ if (strncmp(argv[arg_base + idx_type]->text, "r", 1) == 0) @@ -9214,7 +9247,7 @@ static int ospf_print_vty_helper_dis_rtr_walkcb(struct hash_bucket *backet, struct vty *vty = (struct vty *)arg; static unsigned int count; - vty_out(vty, "%-6s,", inet_ntoa(rtr->advRtrAddr)); + vty_out(vty, "%-6pI4,", &rtr->advRtrAddr); count++; if (count % 5 == 0) @@ -9229,6 +9262,7 @@ static int ospf_show_gr_helper_details(struct vty *vty, struct ospf *ospf, { struct listnode *node; struct ospf_interface *oi; + char buf[PREFIX_STRLEN]; json_object *json_vrf = NULL; if (uj) { @@ -9263,10 +9297,11 @@ static int ospf_show_gr_helper_details(struct vty *vty, struct ospf *ospf, /* Show Router ID. */ if (uj) { json_object_string_add(json_vrf, "routerId", - inet_ntoa(ospf->router_id)); + inet_ntop(AF_INET, &ospf->router_id, + buf, sizeof(buf))); } else { - vty_out(vty, "\n OSPF Router with ID (%s)\n\n", - inet_ntoa(ospf->router_id)); + vty_out(vty, "\n OSPF Router with ID (%pI4)\n\n", + &ospf->router_id); } if (!uj) { @@ -9378,11 +9413,10 @@ static int ospf_show_gr_helper_details(struct vty *vty, struct ospf *ospf, if (!uj) { vty_out(vty, " Neighbour %d :\n", cnt); - vty_out(vty, " Address : %s\n", - inet_ntoa(nbr->address.u - .prefix4)); - vty_out(vty, " Routerid : %s\n", - inet_ntoa(nbr->router_id)); + vty_out(vty, " Address : %pI4\n", + &nbr->address.u.prefix4); + vty_out(vty, " Routerid : %pI4\n", + &nbr->router_id); vty_out(vty, " Received Grace period : %d(in seconds).\n", nbr->gr_helper_info @@ -9406,11 +9440,14 @@ static int ospf_show_gr_helper_details(struct vty *vty, struct ospf *ospf, json_neigh = json_object_new_object(); json_object_string_add( json_neigh, "srcAddr", - inet_ntoa(nbr->src)); + inet_ntop(AF_INET, &nbr->src, + buf, sizeof(buf))); json_object_string_add( json_neigh, "routerid", - inet_ntoa(nbr->router_id)); + inet_ntop(AF_INET, + &nbr->router_id, + buf, sizeof(buf))); json_object_int_add( json_neigh, "recvdGraceInterval", @@ -9433,7 +9470,8 @@ static int ospf_show_gr_helper_details(struct vty *vty, struct ospf *ospf, .gr_restart_reason)); json_object_object_add( json_neighbors, - inet_ntoa(nbr->src), + inet_ntop(AF_INET, &nbr->src, + buf, sizeof(buf)), json_neigh); } } @@ -9575,6 +9613,7 @@ static void show_ip_ospf_route_network(struct vty *vty, struct ospf *ospf, struct ospf_route * or ; struct listnode *pnode, *pnnode; struct ospf_path *path; + char buf[PREFIX_STRLEN]; json_object *json_route = NULL, *json_nexthop_array = NULL, *json_nexthop = NULL; @@ -9583,11 +9622,11 @@ static void show_ip_ospf_route_network(struct vty *vty, struct ospf *ospf, "============ OSPF network routing table ============\n"); for (rn = route_top(rt); rn; rn = route_next(rn)) { + char buf1[PREFIX2STR_BUFFER]; + if ((or = rn->info) == NULL) continue; - char buf1[PREFIX2STR_BUFFER]; - memset(buf1, 0, sizeof(buf1)); prefix2str(&rn->p, buf1, sizeof(buf1)); json_route = json_object_new_object(); @@ -9608,12 +9647,14 @@ static void show_ip_ospf_route_network(struct vty *vty, struct ospf *ospf, or->cost); json_object_string_add( json_route, "area", - inet_ntoa(or->u.std.area_id)); + inet_ntop(AF_INET, + &or->u.std.area_id, + buf1, sizeof(buf1))); } else { vty_out(vty, - "N IA %-18s [%d] area: %s\n", + "N IA %-18s [%d] area: %pI4\n", buf1, or->cost, - inet_ntoa(or->u.std.area_id)); + &or->u.std.area_id); } } else if (or->type == OSPF_DESTINATION_DISCARD) { if (json) { @@ -9635,11 +9676,12 @@ static void show_ip_ospf_route_network(struct vty *vty, struct ospf *ospf, or->cost); json_object_string_add( json_route, "area", - inet_ntoa(or->u.std.area_id)); + inet_ntop(AF_INET, &or->u.std.area_id, + buf1, sizeof(buf1))); } else { - vty_out(vty, "N %-18s [%d] area: %s\n", + vty_out(vty, "N %-18s [%d] area: %pI4\n", buf1, or->cost, - inet_ntoa(or->u.std.area_id)); + &or->u.std.area_id); } break; default: @@ -9688,8 +9730,11 @@ static void show_ip_ospf_route_network(struct vty *vty, struct ospf *ospf, json_object_string_add( json_nexthop, "ip", - inet_ntoa( - path->nexthop)); + inet_ntop( + AF_INET, + &path->nexthop, + buf, + sizeof(buf))); json_object_string_add( json_nexthop, "via", @@ -9698,10 +9743,9 @@ static void show_ip_ospf_route_network(struct vty *vty, struct ospf *ospf, ospf->vrf_id)); } else { vty_out(vty, - "%24s via %s, %s\n", + "%24s via %pI4, %s\n", "", - inet_ntoa( - path->nexthop), + &path->nexthop, ifindex2ifname( path->ifindex, ospf->vrf_id)); @@ -9726,6 +9770,7 @@ static void show_ip_ospf_route_router(struct vty *vty, struct ospf *ospf, struct listnode *pnode; struct listnode *node; struct ospf_path *path; + char buf[PREFIX_STRLEN]; json_object *json_route = NULL, *json_nexthop_array = NULL, *json_nexthop = NULL; @@ -9740,12 +9785,14 @@ static void show_ip_ospf_route_router(struct vty *vty, struct ospf *ospf, json_route = json_object_new_object(); if (json) { - json_object_object_add(json, inet_ntoa(rn->p.u.prefix4), - json_route); + json_object_object_add( + json, inet_ntop(AF_INET, &rn->p.u.prefix4, + buf, sizeof(buf)), + json_route); json_object_string_add(json_route, "routeType", "R "); } else { - vty_out(vty, "R %-15s ", - inet_ntoa(rn->p.u.prefix4)); + vty_out(vty, "R %-15pI4 ", + &rn->p.u.prefix4); } for (ALL_LIST_ELEMENTS_RO((struct list *)rn->info, node, or)) { @@ -9760,7 +9807,8 @@ static void show_ip_ospf_route_router(struct vty *vty, struct ospf *ospf, or->cost); json_object_string_add( json_route, "area", - inet_ntoa(or->u.std.area_id)); + inet_ntop(AF_INET, &or->u.std.area_id, + buf, sizeof(buf))); if (or->path_type == OSPF_PATH_INTER_AREA) json_object_boolean_true_add(json_route, "IA"); @@ -9773,11 +9821,11 @@ static void show_ip_ospf_route_router(struct vty *vty, struct ospf *ospf, "routerType", "asbr"); } else { - vty_out(vty, "%s [%d] area: %s", + vty_out(vty, "%s [%d] area: %pI4", (or->path_type == OSPF_PATH_INTER_AREA ? "IA" : " "), - or->cost, inet_ntoa(or->u.std.area_id)); + or->cost, &or->u.std.area_id); /* Show flags. */ vty_out(vty, "%s%s\n", (or->u.std.flags & ROUTER_LSA_BORDER @@ -9827,8 +9875,10 @@ static void show_ip_ospf_route_router(struct vty *vty, struct ospf *ospf, json_object_string_add( json_nexthop, "ip", - inet_ntoa( - path->nexthop)); + inet_ntop( + AF_INET, + &path->nexthop, + buf, sizeof(buf))); json_object_string_add( json_nexthop, "via", @@ -9837,10 +9887,9 @@ static void show_ip_ospf_route_router(struct vty *vty, struct ospf *ospf, ospf->vrf_id)); } else { vty_out(vty, - "%24s via %s, %s\n", + "%24s via %pI4, %s\n", "", - inet_ntoa( - path->nexthop), + &path->nexthop, ifindex2ifname( path->ifindex, ospf->vrf_id)); @@ -9864,6 +9913,7 @@ static void show_ip_ospf_route_external(struct vty *vty, struct ospf *ospf, struct ospf_route *er; struct listnode *pnode, *pnnode; struct ospf_path *path; + char buf[PREFIX_STRLEN]; json_object *json_route = NULL, *json_nexthop_array = NULL, *json_nexthop = NULL; @@ -9877,8 +9927,7 @@ static void show_ip_ospf_route_external(struct vty *vty, struct ospf *ospf, char buf1[19]; - snprintf(buf1, sizeof(buf1), "%s/%d", - inet_ntoa(rn->p.u.prefix4), rn->p.prefixlen); + snprintfrr(buf1, sizeof(buf1), "%pFX", &rn->p); json_route = json_object_new_object(); if (json) { json_object_object_add(json, buf1, json_route); @@ -9953,8 +10002,11 @@ static void show_ip_ospf_route_external(struct vty *vty, struct ospf *ospf, if (json) { json_object_string_add( json_nexthop, "ip", - inet_ntoa( - path->nexthop)); + inet_ntop( + AF_INET, + &path->nexthop, + buf, + sizeof(buf))); json_object_string_add( json_nexthop, "via", ifindex2ifname( @@ -9962,10 +10014,9 @@ static void show_ip_ospf_route_external(struct vty *vty, struct ospf *ospf, ospf->vrf_id)); } else { vty_out(vty, - "%24s via %s, %s\n", + "%24s via %pI4, %s\n", "", - inet_ntoa( - path->nexthop), + &path->nexthop, ifindex2ifname( path->ifindex, ospf->vrf_id)); @@ -10275,6 +10326,7 @@ DEFUN (show_ip_ospf_vrfs, struct ospf *ospf = NULL; struct listnode *node = NULL; int count = 0; + char buf[PREFIX_STRLEN]; static const char header[] = "Name Id RouterId "; if (uj) { @@ -10305,14 +10357,16 @@ DEFUN (show_ip_ospf_vrfs, if (uj) { json_object_int_add(json_vrf, "vrfId", vrf_id_ui); - json_object_string_add(json_vrf, "routerId", - inet_ntoa(ospf->router_id)); + json_object_string_add( + json_vrf, "routerId", + inet_ntop(AF_INET, &ospf->router_id, + buf, sizeof(buf))); json_object_object_add(json_vrfs, name, json_vrf); } else { - vty_out(vty, "%-25s %-5d %-16s \n", name, - ospf->vrf_id, inet_ntoa(ospf->router_id)); + vty_out(vty, "%-25s %-5d %-16pI4 \n", name, + ospf->vrf_id, &ospf->router_id); } } @@ -10387,9 +10441,8 @@ static int config_write_interface_one(struct vty *vty, struct vrf *vrf) ospf_int_type_str [params->type]); if (params != IF_DEF_PARAMS(ifp) && rn) - vty_out(vty, " %s", - inet_ntoa( - rn->p.u.prefix4)); + vty_out(vty, " %pI4", + &rn->p.u.prefix4); vty_out(vty, "\n"); } } @@ -10424,8 +10477,8 @@ static int config_write_interface_one(struct vty *vty, struct vrf *vrf) vty_out(vty, " ip ospf authentication%s", auth_str); if (params != IF_DEF_PARAMS(ifp) && rn) - vty_out(vty, " %s", - inet_ntoa(rn->p.u.prefix4)); + vty_out(vty, " %pI4", + &rn->p.u.prefix4); vty_out(vty, "\n"); } @@ -10435,8 +10488,8 @@ static int config_write_interface_one(struct vty *vty, struct vrf *vrf) vty_out(vty, " ip ospf authentication-key %s", params->auth_simple); if (params != IF_DEF_PARAMS(ifp) && rn) - vty_out(vty, " %s", - inet_ntoa(rn->p.u.prefix4)); + vty_out(vty, " %pI4", + &rn->p.u.prefix4); vty_out(vty, "\n"); } @@ -10448,9 +10501,8 @@ static int config_write_interface_one(struct vty *vty, struct vrf *vrf) " ip ospf message-digest-key %d md5 %s", ck->key_id, ck->auth_key); if (params != IF_DEF_PARAMS(ifp) && rn) - vty_out(vty, " %s", - inet_ntoa( - rn->p.u.prefix4)); + vty_out(vty, " %pI4", + &rn->p.u.prefix4); vty_out(vty, "\n"); } } @@ -10460,8 +10512,8 @@ static int config_write_interface_one(struct vty *vty, struct vrf *vrf) vty_out(vty, " ip ospf cost %u", params->output_cost_cmd); if (params != IF_DEF_PARAMS(ifp) && rn) - vty_out(vty, " %s", - inet_ntoa(rn->p.u.prefix4)); + vty_out(vty, " %pI4", + &rn->p.u.prefix4); vty_out(vty, "\n"); } @@ -10471,8 +10523,8 @@ static int config_write_interface_one(struct vty *vty, struct vrf *vrf) vty_out(vty, " ip ospf hello-interval %u", params->v_hello); if (params != IF_DEF_PARAMS(ifp) && rn) - vty_out(vty, " %s", - inet_ntoa(rn->p.u.prefix4)); + vty_out(vty, " %pI4", + &rn->p.u.prefix4); vty_out(vty, "\n"); } @@ -10493,8 +10545,8 @@ static int config_write_interface_one(struct vty *vty, struct vrf *vrf) vty_out(vty, "%u", params->v_wait); if (params != IF_DEF_PARAMS(ifp) && rn) - vty_out(vty, " %s", - inet_ntoa(rn->p.u.prefix4)); + vty_out(vty, " %pI4", + &rn->p.u.prefix4); vty_out(vty, "\n"); } @@ -10505,8 +10557,8 @@ static int config_write_interface_one(struct vty *vty, struct vrf *vrf) vty_out(vty, " ip ospf priority %u", params->priority); if (params != IF_DEF_PARAMS(ifp) && rn) - vty_out(vty, " %s", - inet_ntoa(rn->p.u.prefix4)); + vty_out(vty, " %pI4", + &rn->p.u.prefix4); vty_out(vty, "\n"); } @@ -10518,8 +10570,8 @@ static int config_write_interface_one(struct vty *vty, struct vrf *vrf) vty_out(vty, " ip ospf retransmit-interval %u", params->retransmit_interval); if (params != IF_DEF_PARAMS(ifp) && rn) - vty_out(vty, " %s", - inet_ntoa(rn->p.u.prefix4)); + vty_out(vty, " %pI4", + &rn->p.u.prefix4); vty_out(vty, "\n"); } @@ -10530,8 +10582,8 @@ static int config_write_interface_one(struct vty *vty, struct vrf *vrf) vty_out(vty, " ip ospf transmit-delay %u", params->transmit_delay); if (params != IF_DEF_PARAMS(ifp) && rn) - vty_out(vty, " %s", - inet_ntoa(rn->p.u.prefix4)); + vty_out(vty, " %pI4", + &rn->p.u.prefix4); vty_out(vty, "\n"); } @@ -10549,8 +10601,8 @@ static int config_write_interface_one(struct vty *vty, struct vrf *vrf) params->if_area_id_fmt); vty_out(vty, " area %s", buf); if (params != IF_DEF_PARAMS(ifp) && rn) - vty_out(vty, " %s", - inet_ntoa(rn->p.u.prefix4)); + vty_out(vty, " %pI4", + &rn->p.u.prefix4); vty_out(vty, "\n"); } @@ -10566,8 +10618,8 @@ static int config_write_interface_one(struct vty *vty, struct vrf *vrf) else vty_out(vty, " ip ospf mtu-ignore"); if (params != IF_DEF_PARAMS(ifp) && rn) - vty_out(vty, " %s", - inet_ntoa(rn->p.u.prefix4)); + vty_out(vty, " %pI4", + &rn->p.u.prefix4); vty_out(vty, "\n"); } @@ -10631,9 +10683,7 @@ static int config_write_network_area(struct vty *vty, struct ospf *ospf) n->area_id.s_addr)); /* Network print. */ - vty_out(vty, " network %s/%d area %s\n", - inet_ntoa(rn->p.u.prefix4), rn->p.prefixlen, - buf); + vty_out(vty, " network %pFX area %s\n", &rn->p, buf); } return 0; @@ -10704,9 +10754,8 @@ static int config_write_ospf_area(struct vty *vty, struct ospf *ospf) if (rn1->info) { struct ospf_area_range *range = rn1->info; - vty_out(vty, " area %s range %s/%d", buf, - inet_ntoa(rn1->p.u.prefix4), - rn1->p.prefixlen); + vty_out(vty, " area %s range %pFX", buf, + &rn1->p); if (range->cost_config != OSPF_AREA_RANGE_COST_UNSPEC) @@ -10719,8 +10768,8 @@ static int config_write_ospf_area(struct vty *vty, struct ospf *ospf) if (CHECK_FLAG(range->flags, OSPF_AREA_RANGE_SUBSTITUTE)) - vty_out(vty, " substitute %s/%d", - inet_ntoa(range->subst_addr), + vty_out(vty, " substitute %pI4/%d", + &range->subst_addr, range->subst_masklen); vty_out(vty, "\n"); @@ -10754,7 +10803,7 @@ static int config_write_ospf_nbr_nbma(struct vty *vty, struct ospf *ospf) /* Static Neighbor configuration print. */ for (rn = route_top(ospf->nbr_nbma); rn; rn = route_next(rn)) if ((nbr_nbma = rn->info)) { - vty_out(vty, " neighbor %s", inet_ntoa(nbr_nbma->addr)); + vty_out(vty, " neighbor %pI4", &nbr_nbma->addr); if (nbr_nbma->priority != OSPF_NEIGHBOR_PRIORITY_DEFAULT) @@ -10798,21 +10847,21 @@ static int config_write_virtual_link(struct vty *vty, struct ospf *ospf) || OSPF_IF_PARAM(oi, transmit_delay) != OSPF_TRANSMIT_DELAY_DEFAULT) vty_out(vty, - " area %s virtual-link %s hello-interval %d retransmit-interval %d transmit-delay %d dead-interval %d\n", - buf, inet_ntoa(vl_data->vl_peer), + " area %s virtual-link %pI4 hello-interval %d retransmit-interval %d transmit-delay %d dead-interval %d\n", + buf, &vl_data->vl_peer, OSPF_IF_PARAM(oi, v_hello), OSPF_IF_PARAM(oi, retransmit_interval), OSPF_IF_PARAM(oi, transmit_delay), OSPF_IF_PARAM(oi, v_wait)); else - vty_out(vty, " area %s virtual-link %s\n", buf, - inet_ntoa(vl_data->vl_peer)); + vty_out(vty, " area %s virtual-link %pI4\n", buf, + &vl_data->vl_peer); /* Auth key */ if (IF_DEF_PARAMS(vl_data->vl_oi->ifp)->auth_simple[0] != '\0') vty_out(vty, - " area %s virtual-link %s authentication-key %s\n", - buf, inet_ntoa(vl_data->vl_peer), + " area %s virtual-link %pI4 authentication-key %s\n", + buf, &vl_data->vl_peer, IF_DEF_PARAMS(vl_data->vl_oi->ifp) ->auth_simple); /* md5 keys */ @@ -10821,8 +10870,8 @@ static int config_write_virtual_link(struct vty *vty, struct ospf *ospf) ->auth_crypt, n2, ck)) vty_out(vty, - " area %s virtual-link %s message-digest-key %d md5 %s\n", - buf, inet_ntoa(vl_data->vl_peer), + " area %s virtual-link %pI4 message-digest-key %d md5 %s\n", + buf, &vl_data->vl_peer, ck->key_id, ck->auth_key); } } @@ -10874,8 +10923,8 @@ static int ospf_cfg_write_helper_dis_rtr_walkcb(struct hash_bucket *backet, struct advRtr *rtr = backet->data; struct vty *vty = (struct vty *)arg; - vty_out(vty, " graceful-restart helper-only %s\n", - inet_ntoa(rtr->advRtrAddr)); + vty_out(vty, " graceful-restart helper-only %pI4\n", + &rtr->advRtrAddr); return HASHWALK_CONTINUE; } @@ -10885,7 +10934,8 @@ static int config_write_ospf_gr_helper(struct vty *vty, struct ospf *ospf) vty_out(vty, " graceful-restart helper-only\n"); if (!ospf->strict_lsa_check) - vty_out(vty, " no graceful-restart helper strict-lsa-checking\n"); + vty_out(vty, + " no graceful-restart helper strict-lsa-checking\n"); if (ospf->only_planned_restart) vty_out(vty, " graceful-restart helper planned-only\n"); @@ -10974,9 +11024,8 @@ static int config_write_ospf_distance(struct vty *vty, struct ospf *ospf) for (rn = route_top(ospf->distance_table); rn; rn = route_next(rn)) if ((odistance = rn->info) != NULL) { - vty_out(vty, " distance %d %s/%d %s\n", - odistance->distance, inet_ntoa(rn->p.u.prefix4), - rn->p.prefixlen, + vty_out(vty, " distance %d %pFX %s\n", + odistance->distance, &rn->p, odistance->access_list ? odistance->access_list : ""); } @@ -11009,8 +11058,8 @@ static int ospf_config_write_one(struct vty *vty, struct ospf *ospf) /* Router ID print. */ if (ospf->router_id_static.s_addr != 0) - vty_out(vty, " ospf router-id %s\n", - inet_ntoa(ospf->router_id_static)); + vty_out(vty, " ospf router-id %pI4\n", + &ospf->router_id_static); /* ABR type print. */ if (ospf->abr_type != OSPF_ABR_DEFAULT) @@ -11107,9 +11156,9 @@ static int ospf_config_write_one(struct vty *vty, struct ospf *ospf) == ospf->passive_interface_default) continue; - vty_out(vty, " %spassive-interface %s %s\n", + vty_out(vty, " %spassive-interface %s %pI4\n", oi->params->passive_interface ? "" : "no ", - oi->ifp->name, inet_ntoa(oi->address->u.prefix4)); + oi->ifp->name, &oi->address->u.prefix4); } /* Network area print. */ diff --git a/ospfd/ospf_zebra.c b/ospfd/ospf_zebra.c index 5aacbc9061..9fa6a59a72 100644 --- a/ospfd/ospf_zebra.c +++ b/ospfd/ospf_zebra.c @@ -408,8 +408,8 @@ bool ospf_external_default_routemap_apply_walk(struct ospf *ospf, if (ret && ei) { if (IS_DEBUG_OSPF_DEFAULT_INFO) - zlog_debug("Default originate routemap permit ei: %s", - inet_ntoa(ei->p.prefix)); + zlog_debug("Default originate routemap permit ei: %pI4", + &ei->p.prefix); return true; } @@ -850,8 +850,8 @@ static int ospf_external_lsa_originate_check(struct ospf *ospf, /* If prefix is multicast, then do not originate LSA. */ if (IN_MULTICAST(htonl(ei->p.prefix.s_addr))) { zlog_info( - "LSA[Type5:%s]: Not originate AS-external-LSA, Prefix belongs multicast", - inet_ntoa(ei->p.prefix)); + "LSA[Type5:%pI4]: Not originate AS-external-LSA, Prefix belongs multicast", + &ei->p.prefix); return 0; } @@ -943,16 +943,16 @@ static bool ospf_external_lsa_default_routemap_apply(struct ospf *ospf, } if (IS_DEBUG_OSPF_DEFAULT_INFO) - zlog_debug("Apply default originate routemap on ei: %s cmd: %d", - inet_ntoa(ei->p.prefix), cmd); + zlog_debug("Apply default originate routemap on ei: %pI4 cmd: %d", + &ei->p.prefix, cmd); ret = ospf_external_info_apply_default_routemap(ospf, ei, default_ei); /* If deny then nothing to be done both in add and del case. */ if (!ret) { if (IS_DEBUG_OSPF_DEFAULT_INFO) - zlog_debug("Default originte routemap deny for ei: %s", - inet_ntoa(ei->p.prefix)); + zlog_debug("Default originte routemap deny for ei: %pI4", + &ei->p.prefix); return false; } @@ -990,8 +990,8 @@ static bool ospf_external_lsa_default_routemap_apply(struct ospf *ospf, if (IS_DEBUG_OSPF_DEFAULT_INFO) zlog_debug( - "Running default route-map again as ei: %s deleted", - inet_ntoa(ei->p.prefix)); + "Running default route-map again as ei: %pI4 deleted", + &ei->p.prefix); /* * if this route delete was permitted then we need to check * there are any other external info which can still trigger @@ -1192,9 +1192,8 @@ static int ospf_zebra_read_route(ZAPI_CALLBACK_ARGS) zebra, ZEBRA_REDISTRIBUTE)) zlog_debug( - "ospf_zebra_read_route() : %s refreshing LSA", - inet_ntoa( - p.prefix)); + "ospf_zebra_read_route() : %pI4 refreshing LSA", + &p.prefix); ospf_external_lsa_refresh( ospf, current, ei, LSA_REFRESH_FORCE); diff --git a/ospfd/ospfd.c b/ospfd/ospfd.c index aa063a0759..3718f82c05 100644 --- a/ospfd/ospfd.c +++ b/ospfd/ospfd.c @@ -103,8 +103,8 @@ void ospf_router_id_update(struct ospf *ospf) } if (IS_DEBUG_OSPF_EVENT) - zlog_debug("Router-ID[OLD:%s]: Update", - inet_ntoa(ospf->router_id)); + zlog_debug("Router-ID[OLD:%pI4]: Update", + &ospf->router_id); router_id_old = ospf->router_id; @@ -123,8 +123,8 @@ void ospf_router_id_update(struct ospf *ospf) router_id = ospf->router_id_zebra; if (IS_DEBUG_OSPF_EVENT) - zlog_debug("Router-ID[OLD:%s]: Update to %s", - inet_ntoa(ospf->router_id), inet_ntoa(router_id)); + zlog_debug("Router-ID[OLD:%pI4]: Update to %pI4", + &ospf->router_id, &router_id); if (!IPV4_ADDR_SAME(&router_id_old, &router_id)) { @@ -162,8 +162,8 @@ void ospf_router_id_update(struct ospf *ospf) ospf->router_id = router_id; if (IS_DEBUG_OSPF_EVENT) - zlog_debug("Router-ID[NEW:%s]: Update", - inet_ntoa(ospf->router_id)); + zlog_debug("Router-ID[NEW:%pI4]: Update", + &ospf->router_id); /* Flush (inline) all external LSAs which now match the new router-id, @@ -1324,10 +1324,7 @@ void ospf_ls_upd_queue_empty(struct ospf_interface *oi) } /* remove update event */ - if (oi->t_ls_upd_event) { - thread_cancel(oi->t_ls_upd_event); - oi->t_ls_upd_event = NULL; - } + thread_cancel(&oi->t_ls_upd_event); } void ospf_if_update(struct ospf *ospf, struct interface *ifp) @@ -1338,10 +1335,10 @@ void ospf_if_update(struct ospf *ospf, struct interface *ifp) if (IS_DEBUG_OSPF_EVENT) zlog_debug( - "%s: interface %s ifp->vrf_id %u ospf vrf %s vrf_id %u router_id %s", + "%s: interface %s ifp->vrf_id %u ospf vrf %s vrf_id %u router_id %pI4", __func__, ifp->name, ifp->vrf_id, ospf_vrf_id_to_name(ospf->vrf_id), ospf->vrf_id, - inet_ntoa(ospf->router_id)); + &ospf->router_id); /* OSPF must be ready. */ if (!ospf_is_ready(ospf)) @@ -1378,16 +1375,16 @@ static void ospf_area_type_set(struct ospf_area *area, int type) if (area->external_routing == type) { if (IS_DEBUG_OSPF_EVENT) - zlog_debug("Area[%s]: Types are the same, ignored.", - inet_ntoa(area->area_id)); + zlog_debug("Area[%pI4]: Types are the same, ignored.", + &area->area_id); return; } area->external_routing = type; if (IS_DEBUG_OSPF_EVENT) - zlog_debug("Area[%s]: Configured as %s", - inet_ntoa(area->area_id), + zlog_debug("Area[%pI4]: Configured as %s", + &area->area_id, lookup_msg(ospf_area_type_msg, type, NULL)); switch (area->external_routing) { @@ -2158,7 +2155,7 @@ static int ospf_vrf_disable(struct vrf *vrf) if (IS_DEBUG_OSPF_EVENT) zlog_debug("%s: ospf old_vrf_id %d unlinked", __func__, old_vrf_id); - thread_cancel(ospf->t_read); + thread_cancel(&ospf->t_read); close(ospf->fd); ospf->fd = -1; } diff --git a/ospfd/ospfd.h b/ospfd/ospfd.h index 5009355d48..5535cb40ab 100644 --- a/ospfd/ospfd.h +++ b/ospfd/ospfd.h @@ -535,13 +535,7 @@ struct ospf_nbr_nbma { #define OSPF_AREA_TIMER_ON(T,F,V) thread_add_timer (master, (F), area, (V), &(T)) #define OSPF_POLL_TIMER_ON(T,F,V) thread_add_timer (master, (F), nbr_nbma, (V), &(T)) #define OSPF_POLL_TIMER_OFF(X) OSPF_TIMER_OFF((X)) -#define OSPF_TIMER_OFF(X) \ - do { \ - if (X) { \ - thread_cancel(X); \ - (X) = NULL; \ - } \ - } while (0) +#define OSPF_TIMER_OFF(X) thread_cancel(&(X)) /* Extern variables. */ extern struct ospf_master *om; diff --git a/pbrd/pbr_zebra.c b/pbrd/pbr_zebra.c index b8ee974635..697c65ca45 100644 --- a/pbrd/pbr_zebra.c +++ b/pbrd/pbr_zebra.c @@ -408,10 +408,10 @@ static int pbr_zebra_nexthop_update(ZAPI_CALLBACK_ARGS) for (i = 0; i < nhr.nexthop_num; i++) { DEBUGD(&pbr_dbg_zebra, - "%s: \tType: %d: vrf: %d, ifindex: %d gate: %s", + "%s: \tType: %d: vrf: %d, ifindex: %d gate: %pI4", __func__, nhr.nexthops[i].type, nhr.nexthops[i].vrf_id, nhr.nexthops[i].ifindex, - inet_ntoa(nhr.nexthops[i].gate.ipv4)); + &nhr.nexthops[i].gate.ipv4); } } diff --git a/pimd/mtracebis.c b/pimd/mtracebis.c index 1b812de92c..3b69964960 100644 --- a/pimd/mtracebis.c +++ b/pimd/mtracebis.c @@ -26,7 +26,6 @@ #include "checksum.h" #include "prefix.h" #include "mtracebis_routeget.h" - #include <sys/select.h> #include <netinet/in.h> #include <arpa/inet.h> @@ -64,13 +63,14 @@ static void version(void) static void print_host(struct in_addr addr) { struct hostent *h; + char buf[PREFIX_STRLEN]; h = gethostbyaddr(&addr, sizeof(addr), AF_INET); if (h == NULL) printf("?"); else printf("%s", h->h_name); - printf(" (%s) ", inet_ntoa(addr)); + printf(" (%s) ", inet_ntop(AF_INET, &addr, buf, sizeof(buf))); } static void print_line_no(int i) diff --git a/pimd/pim_bsm.c b/pimd/pim_bsm.c index 52dd60aa18..1acfece895 100644 --- a/pimd/pim_bsm.c +++ b/pimd/pim_bsm.c @@ -376,9 +376,9 @@ static void pim_g2rp_timer_start(struct bsm_rpinfo *bsrp, int hold_time) THREAD_OFF(bsrp->g2rp_timer); if (PIM_DEBUG_BSM) zlog_debug( - "%s : starting g2rp timer for grp: %pFX - rp: %s with timeout %d secs(Actual Hold time : %d secs)", + "%s : starting g2rp timer for grp: %pFX - rp: %pI4 with timeout %d secs(Actual Hold time : %d secs)", __func__, &bsrp->bsgrp_node->group, - inet_ntoa(bsrp->rp_address), hold_time, + &bsrp->rp_address, hold_time, bsrp->rp_holdtime); thread_add_timer(router->master, pim_on_g2rp_timer, bsrp, hold_time, @@ -397,9 +397,9 @@ static void pim_g2rp_timer_stop(struct bsm_rpinfo *bsrp) return; if (PIM_DEBUG_BSM) - zlog_debug("%s : stopping g2rp timer for grp: %pFX - rp: %s", + zlog_debug("%s : stopping g2rp timer for grp: %pFX - rp: %pI4", __func__, &bsrp->bsgrp_node->group, - inet_ntoa(bsrp->rp_address)); + &bsrp->rp_address); THREAD_OFF(bsrp->g2rp_timer); } diff --git a/pimd/pim_cmd.c b/pimd/pim_cmd.c index 103237b0f8..2a7ff4e7f8 100644 --- a/pimd/pim_cmd.c +++ b/pimd/pim_cmd.c @@ -199,6 +199,7 @@ static void pim_show_assert_helper(struct vty *vty, struct in_addr ifaddr; char uptime[10]; char timer[10]; + char buf[PREFIX_STRLEN]; ifaddr = pim_ifp->primary_address; @@ -211,9 +212,10 @@ static void pim_show_assert_helper(struct vty *vty, pim_time_timer_to_mmss(timer, sizeof(timer), ch->t_ifassert_timer); vty_out(vty, "%-16s %-15s %-15s %-15s %-6s %-15s %-8s %-5s\n", - ch->interface->name, inet_ntoa(ifaddr), ch_src_str, ch_grp_str, - pim_ifchannel_ifassert_name(ch->ifassert_state), winner_str, - uptime, timer); + ch->interface->name, + inet_ntop(AF_INET, &ifaddr, buf, sizeof(buf)), ch_src_str, + ch_grp_str, pim_ifchannel_ifassert_name(ch->ifassert_state), + winner_str, uptime, timer); } static void pim_show_assert(struct pim_instance *pim, struct vty *vty) @@ -246,13 +248,16 @@ static void pim_show_assert_internal_helper(struct vty *vty, char ch_src_str[INET_ADDRSTRLEN]; char ch_grp_str[INET_ADDRSTRLEN]; struct in_addr ifaddr; + char buf[PREFIX_STRLEN]; ifaddr = pim_ifp->primary_address; pim_inet4_dump("<ch_src?>", ch->sg.src, ch_src_str, sizeof(ch_src_str)); pim_inet4_dump("<ch_grp?>", ch->sg.grp, ch_grp_str, sizeof(ch_grp_str)); vty_out(vty, "%-16s %-15s %-15s %-15s %-3s %-3s %-3s %-4s\n", - ch->interface->name, inet_ntoa(ifaddr), ch_src_str, ch_grp_str, + ch->interface->name, + inet_ntop(AF_INET, &ifaddr, buf, sizeof(buf)), + ch_src_str, ch_grp_str, PIM_IF_FLAG_TEST_COULD_ASSERT(ch->flags) ? "yes" : "no", pim_macro_ch_could_assert_eval(ch) ? "yes" : "no", PIM_IF_FLAG_TEST_ASSERT_TRACKING_DESIRED(ch->flags) ? "yes" @@ -294,6 +299,7 @@ static void pim_show_assert_metric_helper(struct vty *vty, char addr_str[INET_ADDRSTRLEN]; struct pim_assert_metric am; struct in_addr ifaddr; + char buf[PREFIX_STRLEN]; ifaddr = pim_ifp->primary_address; @@ -305,9 +311,10 @@ static void pim_show_assert_metric_helper(struct vty *vty, pim_inet4_dump("<addr?>", am.ip_address, addr_str, sizeof(addr_str)); vty_out(vty, "%-16s %-15s %-15s %-15s %-3s %4u %6u %-15s\n", - ch->interface->name, inet_ntoa(ifaddr), ch_src_str, ch_grp_str, - am.rpt_bit_flag ? "yes" : "no", am.metric_preference, - am.route_metric, addr_str); + ch->interface->name, + inet_ntop(AF_INET, &ifaddr, buf, sizeof(buf)), + ch_src_str, ch_grp_str, am.rpt_bit_flag ? "yes" : "no", + am.metric_preference, am.route_metric, addr_str); } static void pim_show_assert_metric(struct pim_instance *pim, struct vty *vty) @@ -341,6 +348,7 @@ static void pim_show_assert_winner_metric_helper(struct vty *vty, struct in_addr ifaddr; char pref_str[16]; char metr_str[16]; + char buf[PREFIX_STRLEN]; ifaddr = pim_ifp->primary_address; @@ -362,8 +370,10 @@ static void pim_show_assert_winner_metric_helper(struct vty *vty, snprintf(metr_str, sizeof(metr_str), "%6u", am->route_metric); vty_out(vty, "%-16s %-15s %-15s %-15s %-3s %-4s %-6s %-15s\n", - ch->interface->name, inet_ntoa(ifaddr), ch_src_str, ch_grp_str, - am->rpt_bit_flag ? "yes" : "no", pref_str, metr_str, addr_str); + ch->interface->name, + inet_ntop(AF_INET, &ifaddr, buf, sizeof(buf)), ch_src_str, + ch_grp_str, am->rpt_bit_flag ? "yes" : "no", pref_str, metr_str, + addr_str); } static void pim_show_assert_winner_metric(struct pim_instance *pim, @@ -391,12 +401,14 @@ static void json_object_pim_ifp_add(struct json_object *json, struct interface *ifp) { struct pim_interface *pim_ifp; + char buf[PREFIX_STRLEN]; pim_ifp = ifp->info; json_object_string_add(json, "name", ifp->name); json_object_string_add(json, "state", if_is_up(ifp) ? "up" : "down"); json_object_string_add(json, "address", - inet_ntoa(pim_ifp->primary_address)); + inet_ntop(AF_INET, &pim_ifp->primary_address, + buf, sizeof(buf))); json_object_int_add(json, "index", ifp->ifindex); if (if_is_multicast(ifp)) @@ -569,6 +581,7 @@ static void igmp_show_interfaces(struct pim_instance *pim, struct vty *vty, { struct interface *ifp; time_t now; + char buf[PREFIX_STRLEN]; json_object *json = NULL; json_object *json_row = NULL; @@ -632,7 +645,8 @@ static void igmp_show_interfaces(struct pim_instance *pim, struct vty *vty, ? (igmp->mtrace_only ? "mtrc" : "up") : "down", - inet_ntoa(igmp->ifaddr), + inet_ntop(AF_INET, &igmp->ifaddr, + buf, sizeof(buf)), pim_ifp->igmp_version, igmp->t_igmp_query_timer ? "local" : "other", @@ -797,8 +811,8 @@ static void igmp_show_interfaces_single(struct pim_instance *pim, ? (igmp->mtrace_only ? "mtrace" : "up") : "down"); - vty_out(vty, "Address : %s\n", - inet_ntoa(pim_ifp->primary_address)); + vty_out(vty, "Address : %pI4\n", + &pim_ifp->primary_address); vty_out(vty, "Uptime : %s\n", uptime); vty_out(vty, "Version : %d\n", pim_ifp->igmp_version); @@ -940,6 +954,7 @@ static void pim_show_interfaces_single(struct pim_instance *pim, int mloop = 0; int found_ifname = 0; int print_header; + char buf[PREFIX_STRLEN]; json_object *json = NULL; json_object *json_row = NULL; json_object *json_pim_neighbor = NULL; @@ -992,7 +1007,9 @@ static void pim_show_interfaces_single(struct pim_instance *pim, if (pim_ifp->update_source.s_addr != INADDR_ANY) { json_object_string_add( json_row, "useSource", - inet_ntoa(pim_ifp->update_source)); + inet_ntop(AF_INET, + &pim_ifp->update_source, + buf, sizeof(buf))); } if (pim_ifp->sec_addr_list) { json_object *sec_list = NULL; @@ -1160,20 +1177,20 @@ static void pim_show_interfaces_single(struct pim_instance *pim, vty_out(vty, "State : %s\n", if_is_up(ifp) ? "up" : "down"); if (pim_ifp->update_source.s_addr != INADDR_ANY) { - vty_out(vty, "Use Source : %s\n", - inet_ntoa(pim_ifp->update_source)); + vty_out(vty, "Use Source : %pI4\n", + &pim_ifp->update_source); } if (pim_ifp->sec_addr_list) { - vty_out(vty, "Address : %s (primary)\n", - inet_ntoa(ifaddr)); + vty_out(vty, "Address : %pI4 (primary)\n", + &ifaddr); for (ALL_LIST_ELEMENTS_RO( pim_ifp->sec_addr_list, sec_node, sec_addr)) vty_out(vty, " %pFX\n", &sec_addr->addr); } else { - vty_out(vty, "Address : %s\n", - inet_ntoa(ifaddr)); + vty_out(vty, "Address : %pI4\n", + &ifaddr); } vty_out(vty, "\n"); @@ -1397,6 +1414,7 @@ static void pim_show_interfaces(struct pim_instance *pim, struct vty *vty, int fhr = 0; int pim_nbrs = 0; int pim_ifchannels = 0; + char buf[PREFIX_STRLEN]; json_object *json = NULL; json_object *json_row = NULL; json_object *json_tmp; @@ -1427,7 +1445,9 @@ static void pim_show_interfaces(struct pim_instance *pim, struct vty *vty, json_object_int_add(json_row, "pimIfChannels", pim_ifchannels); json_object_int_add(json_row, "firstHopRouterCount", fhr); json_object_string_add(json_row, "pimDesignatedRouter", - inet_ntoa(pim_ifp->pim_dr_addr)); + inet_ntop(AF_INET, + &pim_ifp->pim_dr_addr, buf, + sizeof(buf))); if (pim_ifp->pim_dr_addr.s_addr == pim_ifp->primary_address.s_addr) @@ -1682,6 +1702,7 @@ static void pim_show_join_helper(struct vty *vty, struct pim_interface *pim_ifp, char uptime[10]; char expire[10]; char prune[10]; + char buf[PREFIX_STRLEN]; ifaddr = pim_ifp->primary_address; @@ -1730,8 +1751,9 @@ static void pim_show_join_helper(struct vty *vty, struct pim_interface *pim_ifp, json_object_object_add(json_grp, ch_src_str, json_row); } else { vty_out(vty, "%-16s %-15s %-15s %-15s %-10s %8s %-6s %5s\n", - ch->interface->name, inet_ntoa(ifaddr), ch_src_str, - ch_grp_str, + ch->interface->name, + inet_ntop(AF_INET, &ifaddr, buf, sizeof(buf)), + ch_src_str, ch_grp_str, pim_ifchannel_ifjoin_name(ch->ifjoin_state, ch->flags), uptime, expire, prune); } @@ -2304,6 +2326,7 @@ static void pim_show_neighbors_secondary(struct pim_instance *pim, struct in_addr ifaddr; struct listnode *neighnode; struct pim_neighbor *neigh; + char buf[PREFIX_STRLEN]; pim_ifp = ifp->info; @@ -2330,7 +2353,9 @@ static void pim_show_neighbors_secondary(struct pim_instance *pim, for (ALL_LIST_ELEMENTS_RO(neigh->prefix_list, prefix_node, p)) vty_out(vty, "%-16s %-15s %-15s %-15pFX\n", - ifp->name, inet_ntoa(ifaddr), + ifp->name, + inet_ntop(AF_INET, &ifaddr, + buf, sizeof(buf)), neigh_src_str, p); } } @@ -2975,14 +3000,17 @@ static int pim_print_pnc_cache_walkcb(struct hash_bucket *bucket, void *arg) struct nexthop *nh_node = NULL; ifindex_t first_ifindex; struct interface *ifp = NULL; + char buf[PREFIX_STRLEN]; for (nh_node = pnc->nexthop; nh_node; nh_node = nh_node->next) { first_ifindex = nh_node->ifindex; ifp = if_lookup_by_index(first_ifindex, pim->vrf_id); - vty_out(vty, "%-15s ", inet_ntoa(pnc->rpf.rpf_addr.u.prefix4)); + vty_out(vty, "%-15s ", inet_ntop(AF_INET, + &pnc->rpf.rpf_addr.u.prefix4, + buf, sizeof(buf))); vty_out(vty, "%-16s ", ifp ? ifp->name : "NULL"); - vty_out(vty, "%s ", inet_ntoa(nh_node->gate.ipv4)); + vty_out(vty, "%pI4 ", &nh_node->gate.ipv4); vty_out(vty, "\n"); } return CMD_SUCCESS; @@ -5656,6 +5684,7 @@ static void show_multicast_interfaces(struct pim_instance *pim, struct vty *vty, bool uj) { struct interface *ifp; + char buf[PREFIX_STRLEN]; json_object *json = NULL; json_object *json_row = NULL; @@ -5696,7 +5725,8 @@ static void show_multicast_interfaces(struct pim_instance *pim, struct vty *vty, if_is_up(ifp) ? "up" : "down"); json_object_string_add( json_row, "address", - inet_ntoa(pim_ifp->primary_address)); + inet_ntop(AF_INET, &pim_ifp->primary_address, + buf, sizeof(buf))); json_object_int_add(json_row, "ifIndex", ifp->ifindex); json_object_int_add(json_row, "vif", pim_ifp->mroute_vif_index); @@ -5712,8 +5742,9 @@ static void show_multicast_interfaces(struct pim_instance *pim, struct vty *vty, } else { vty_out(vty, "%-16s %-15s %3d %3d %7lu %7lu %10lu %10lu\n", - ifp->name, inet_ntoa(ifaddr), ifp->ifindex, - pim_ifp->mroute_vif_index, + ifp->name, + inet_ntop(AF_INET, &ifaddr, buf, sizeof(buf)), + ifp->ifindex, pim_ifp->mroute_vif_index, (unsigned long)vreq.icount, (unsigned long)vreq.ocount, (unsigned long)vreq.ibytes, diff --git a/pimd/pim_igmp.c b/pimd/pim_igmp.c index d4d47377bd..19d7817577 100644 --- a/pimd/pim_igmp.c +++ b/pimd/pim_igmp.c @@ -63,8 +63,8 @@ static int igmp_sock_open(struct in_addr ifaddr, struct interface *ifp, ++join; } else { zlog_warn( - "%s %s: IGMP socket fd=%d interface %s: could not solve %s to group address: errno=%d: %s", - __FILE__, __func__, fd, inet_ntoa(ifaddr), + "%s %s: IGMP socket fd=%d interface %pI4: could not solve %s to group address: errno=%d: %s", + __FILE__, __func__, fd, &ifaddr, PIM_ALL_ROUTERS, errno, safe_strerror(errno)); } } @@ -79,8 +79,8 @@ static int igmp_sock_open(struct in_addr ifaddr, struct interface *ifp, ++join; } else { zlog_warn( - "%s %s: IGMP socket fd=%d interface %s: could not solve %s to group address: errno=%d: %s", - __FILE__, __func__, fd, inet_ntoa(ifaddr), + "%s %s: IGMP socket fd=%d interface %pI4: could not solve %s to group address: errno=%d: %s", + __FILE__, __func__, fd, &ifaddr, PIM_ALL_SYSTEMS, errno, safe_strerror(errno)); } @@ -90,16 +90,16 @@ static int igmp_sock_open(struct in_addr ifaddr, struct interface *ifp, } } else { zlog_warn( - "%s %s: IGMP socket fd=%d interface %s: could not solve %s to group address: errno=%d: %s", - __FILE__, __func__, fd, inet_ntoa(ifaddr), + "%s %s: IGMP socket fd=%d interface %pI4: could not solve %s to group address: errno=%d: %s", + __FILE__, __func__, fd, &ifaddr, PIM_ALL_IGMP_ROUTERS, errno, safe_strerror(errno)); } if (!join) { flog_err_sys( EC_LIB_SOCKET, - "IGMP socket fd=%d could not join any group on interface address %s", - fd, inet_ntoa(ifaddr)); + "IGMP socket fd=%d could not join any group on interface address %pI4", + fd, &ifaddr); close(fd); fd = -1; } @@ -117,8 +117,8 @@ static void igmp_sock_dump(array_t *igmp_sock_array) struct igmp_sock *igmp = array_get(igmp_sock_array, i); - zlog_debug("%s %s: [%d/%d] igmp_addr=%s fd=%d", __FILE__, - __func__, i, size, inet_ntoa(igmp->ifaddr), + zlog_debug("%s %s: [%d/%d] igmp_addr=%pI4 fd=%d", __FILE__, + __func__, i, size, &igmp->ifaddr, igmp->fd); } } @@ -701,8 +701,8 @@ static void sock_close(struct igmp_sock *igmp) if (PIM_DEBUG_IGMP_TRACE_DETAIL) { if (igmp->t_igmp_read) { zlog_debug( - "Cancelling READ event on IGMP socket %s fd=%d on interface %s", - inet_ntoa(igmp->ifaddr), igmp->fd, + "Cancelling READ event on IGMP socket %pI4 fd=%d on interface %s", + &igmp->ifaddr, igmp->fd, igmp->interface->name); } } @@ -711,14 +711,14 @@ static void sock_close(struct igmp_sock *igmp) if (close(igmp->fd)) { flog_err( EC_LIB_SOCKET, - "Failure closing IGMP socket %s fd=%d on interface %s: errno=%d: %s", - inet_ntoa(igmp->ifaddr), igmp->fd, + "Failure closing IGMP socket %pI4 fd=%d on interface %s: errno=%d: %s", + &igmp->ifaddr, igmp->fd, igmp->interface->name, errno, safe_strerror(errno)); } if (PIM_DEBUG_IGMP_TRACE_DETAIL) { - zlog_debug("Deleted IGMP socket %s fd=%d on interface %s", - inet_ntoa(igmp->ifaddr), igmp->fd, + zlog_debug("Deleted IGMP socket %pI4 fd=%d on interface %s", + &igmp->ifaddr, igmp->fd, igmp->interface->name); } } @@ -900,8 +900,8 @@ static struct igmp_sock *igmp_sock_new(int fd, struct in_addr ifaddr, if (PIM_DEBUG_IGMP_TRACE) { zlog_debug( - "Creating IGMP socket fd=%d for address %s on interface %s", - fd, inet_ntoa(ifaddr), ifp->name); + "Creating IGMP socket fd=%d for address %pI4 on interface %s", + fd, &ifaddr, ifp->name); } igmp = XCALLOC(MTYPE_PIM_IGMP_SOCKET, sizeof(*igmp)); @@ -1000,8 +1000,8 @@ struct igmp_sock *pim_igmp_sock_add(struct list *igmp_sock_list, fd = igmp_sock_open(ifaddr, ifp, pim_ifp->options); if (fd < 0) { - zlog_warn("Could not open IGMP socket for %s on %s", - inet_ntoa(ifaddr), ifp->name); + zlog_warn("Could not open IGMP socket for %pI4 on %s", + &ifaddr, ifp->name); return NULL; } @@ -1009,8 +1009,8 @@ struct igmp_sock *pim_igmp_sock_add(struct list *igmp_sock_list, sin.sin_addr = ifaddr; sin.sin_port = 0; if (bind(fd, (struct sockaddr *) &sin, sizeof(sin)) != 0) { - zlog_warn("Could not bind IGMP socket for %s on %s", - inet_ntoa(ifaddr), ifp->name); + zlog_warn("Could not bind IGMP socket for %pI4 on %s", + &ifaddr, ifp->name); close(fd); return NULL; @@ -1153,8 +1153,8 @@ struct igmp_group *igmp_add_group_by_addr(struct igmp_sock *igmp, if (pim_is_group_224_0_0_0_24(group_addr)) { if (PIM_DEBUG_IGMP_TRACE) zlog_debug( - "%s: Group specified %s is part of 224.0.0.0/24", - __func__, inet_ntoa(group_addr)); + "%s: Group specified %pI4 is part of 224.0.0.0/24", + __func__, &group_addr); return NULL; } /* diff --git a/pimd/pim_igmp_mtrace.c b/pimd/pim_igmp_mtrace.c index 9e78b76008..941d067619 100644 --- a/pimd/pim_igmp_mtrace.c +++ b/pimd/pim_igmp_mtrace.c @@ -82,10 +82,10 @@ static bool mtrace_fwd_info_weak(struct pim_instance *pim, zlog_debug("mtrace pim_nexthop_lookup OK"); if (PIM_DEBUG_MTRACE) - zlog_warn("mtrace next_hop=%s", - inet_ntop(nexthop.mrib_nexthop_addr.family, - &nexthop.mrib_nexthop_addr.u.prefix, - nexthop_str, sizeof(nexthop_str))); + zlog_debug("mtrace next_hop=%s", + inet_ntop(nexthop.mrib_nexthop_addr.family, + &nexthop.mrib_nexthop_addr.u.prefix, + nexthop_str, sizeof(nexthop_str))); if (nexthop.mrib_nexthop_addr.family == AF_INET) nh_addr = nexthop.mrib_nexthop_addr.u.prefix4; @@ -270,8 +270,8 @@ static uint32_t query_arrival_time(void) if (gettimeofday(&tv, NULL) < 0) { if (PIM_DEBUG_MTRACE) - zlog_warn("Query arrival time lookup failed: errno=%d: %s", - errno, safe_strerror(errno)); + zlog_debug("Query arrival time lookup failed: errno=%d: %s", + errno, safe_strerror(errno)); return 0; } /* not sure second offset correct, as I get different value */ @@ -336,7 +336,7 @@ static int mtrace_send_packet(struct interface *ifp, if (ret < 0) { if (PIM_DEBUG_MTRACE) - zlog_warn("Failed to set socket multicast TTL"); + zlog_debug("Failed to set socket multicast TTL"); ret = -1; goto close_fd; } @@ -354,14 +354,14 @@ static int mtrace_send_packet(struct interface *ifp, sizeof(group_str)); if (sent < 0) { if (PIM_DEBUG_MTRACE) - zlog_warn( + zlog_debug( "Send mtrace request failed for %s on%s: group=%s msg_size=%zd: errno=%d: %s", dst_str, ifp->name, group_str, mtrace_buf_len, errno, safe_strerror(errno)); } else { if (PIM_DEBUG_MTRACE) - zlog_warn( + zlog_debug( "Send mtrace request failed for %s on %s: group=%s msg_size=%zd: sent=%zd", dst_str, ifp->name, group_str, mtrace_buf_len, sent); @@ -411,7 +411,7 @@ static int mtrace_un_forward_packet(struct pim_instance *pim, struct ip *ip_hdr, if (!pim_nexthop_lookup(pim, &nexthop, ip_hdr->ip_dst, 0)) { close(fd); if (PIM_DEBUG_MTRACE) - zlog_warn( + zlog_debug( "Dropping mtrace packet, no route to destination"); return -1; } @@ -440,15 +440,15 @@ static int mtrace_un_forward_packet(struct pim_instance *pim, struct ip *ip_hdr, if (sent < 0) { if (PIM_DEBUG_MTRACE) - zlog_warn( + zlog_debug( "Failed to forward mtrace packet: sendto errno=%d, %s", errno, safe_strerror(errno)); return -1; } if (PIM_DEBUG_MTRACE) { - zlog_debug("Fwd mtrace packet len=%u to %s ttl=%u", - ntohs(ip_hdr->ip_len), inet_ntoa(ip_hdr->ip_dst), + zlog_debug("Fwd mtrace packet len=%u to %pI4 ttl=%u", + ntohs(ip_hdr->ip_len), &ip_hdr->ip_dst, ip_hdr->ip_ttl); } @@ -472,9 +472,9 @@ static int mtrace_mc_forward_packet(struct pim_instance *pim, struct ip *ip_hdr) if (c_oil == NULL) { if (PIM_DEBUG_MTRACE) { zlog_debug( - "Dropping mtrace multicast packet len=%u to %s ttl=%u", + "Dropping mtrace multicast packet len=%u to %pI4 ttl=%u", ntohs(ip_hdr->ip_len), - inet_ntoa(ip_hdr->ip_dst), ip_hdr->ip_ttl); + &ip_hdr->ip_dst, ip_hdr->ip_ttl); } return -1; } @@ -514,6 +514,7 @@ static int mtrace_send_mc_response(struct pim_instance *pim, struct listnode *chnextnode; struct pim_ifchannel *ch = NULL; int ret = -1; + char buf[PREFIX_STRLEN]; memset(&sg, 0, sizeof(struct prefix_sg)); sg.grp = mtracep->rsp_addr; @@ -525,7 +526,8 @@ static int mtrace_send_mc_response(struct pim_instance *pim, zlog_debug( "Dropping mtrace multicast response packet len=%u to %s", (unsigned int)mtrace_len, - inet_ntoa(mtracep->rsp_addr)); + inet_ntop(AF_INET, &mtracep->rsp_addr, + buf, sizeof(buf))); } return -1; } @@ -570,10 +572,10 @@ static int mtrace_send_response(struct pim_instance *pim, if (p_rpf == NULL) { if (PIM_DEBUG_MTRACE) - zlog_warn("mtrace no RP for %s", - inet_ntop(AF_INET, - &(mtracep->rsp_addr), - grp_str, sizeof(grp_str))); + zlog_debug("mtrace no RP for %s", + inet_ntop(AF_INET, + &(mtracep->rsp_addr), + grp_str, sizeof(grp_str))); return -1; } nexthop = p_rpf->source_nexthop; @@ -584,7 +586,7 @@ static int mtrace_send_response(struct pim_instance *pim, /* TODO: should use unicast rib lookup */ if (!pim_nexthop_lookup(pim, &nexthop, mtracep->rsp_addr, 1)) { if (PIM_DEBUG_MTRACE) - zlog_warn( + zlog_debug( "Dropped response qid=%ud, no route to response address", mtracep->qry_id); return -1; @@ -633,7 +635,7 @@ int igmp_mtrace_recv_qry_req(struct igmp_sock *igmp, struct ip *ip_hdr, if (igmp_msg_len < (int)sizeof(struct igmp_mtrace)) { if (PIM_DEBUG_MTRACE) - zlog_warn( + zlog_debug( "Recv mtrace packet from %s on %s: too short, len=%d, min=%zu", from_str, ifp->name, igmp_msg_len, sizeof(struct igmp_mtrace)); @@ -650,7 +652,7 @@ int igmp_mtrace_recv_qry_req(struct igmp_sock *igmp, struct ip *ip_hdr, if (recv_checksum != checksum) { if (PIM_DEBUG_MTRACE) - zlog_warn( + zlog_debug( "Recv mtrace packet from %s on %s: checksum mismatch: received=%x computed=%x", from_str, ifp->name, recv_checksum, checksum); return -1; @@ -700,12 +702,12 @@ int igmp_mtrace_recv_qry_req(struct igmp_sock *igmp, struct ip *ip_hdr, last_rsp_ind = r_len / sizeof(struct igmp_mtrace_rsp); if (last_rsp_ind > MTRACE_MAX_HOPS) { if (PIM_DEBUG_MTRACE) - zlog_warn("Mtrace request of excessive size"); + zlog_debug("Mtrace request of excessive size"); return -1; } } else { if (PIM_DEBUG_MTRACE) - zlog_warn( + zlog_debug( "Recv mtrace packet from %s on %s: invalid length %d", from_str, ifp->name, igmp_msg_len); return -1; @@ -715,9 +717,9 @@ int igmp_mtrace_recv_qry_req(struct igmp_sock *igmp, struct ip *ip_hdr, if (IPV4_CLASS_DE(ntohl(ip_hdr->ip_dst.s_addr)) && !IPV4_MC_LINKLOCAL(ntohl(ip_hdr->ip_dst.s_addr))) { if (PIM_DEBUG_MTRACE) - zlog_warn( - "Recv mtrace packet from %s on %s: not link-local multicast %s", - from_str, ifp->name, inet_ntoa(ip_hdr->ip_dst)); + zlog_debug( + "Recv mtrace packet from %s on %s: not link-local multicast %pI4", + from_str, ifp->name, &ip_hdr->ip_dst); return -1; } @@ -848,7 +850,7 @@ int igmp_mtrace_recv_response(struct igmp_sock *igmp, struct ip *ip_hdr, if (igmp_msg_len < (int)sizeof(struct igmp_mtrace)) { if (PIM_DEBUG_MTRACE) - zlog_warn( + zlog_debug( "Recv mtrace packet from %s on %s: too short, len=%d, min=%zu", from_str, ifp->name, igmp_msg_len, sizeof(struct igmp_mtrace)); @@ -865,7 +867,7 @@ int igmp_mtrace_recv_response(struct igmp_sock *igmp, struct ip *ip_hdr, if (recv_checksum != checksum) { if (PIM_DEBUG_MTRACE) - zlog_warn( + zlog_debug( "Recv mtrace response from %s on %s: checksum mismatch: received=%x computed=%x", from_str, ifp->name, recv_checksum, checksum); return -1; diff --git a/pimd/pim_igmpv3.c b/pimd/pim_igmpv3.c index 8eaca75821..22767a8629 100644 --- a/pimd/pim_igmpv3.c +++ b/pimd/pim_igmpv3.c @@ -1921,10 +1921,10 @@ int igmp_v3_recv_report(struct igmp_sock *igmp, struct in_addr from, if (PIM_DEBUG_IGMP_PACKETS) { zlog_debug( - " Recv IGMP report v3 from %s on %s: record=%d type=%d auxdatalen=%d sources=%d group=%s", + " Recv IGMP report v3 from %s on %s: record=%d type=%d auxdatalen=%d sources=%d group=%pI4", from_str, ifp->name, i, rec_type, rec_auxdatalen, rec_num_sources, - inet_ntoa(rec_group)); + &rec_group); } /* Scan sources */ @@ -1949,9 +1949,9 @@ int igmp_v3_recv_report(struct igmp_sock *igmp, struct in_addr from, "<source?>"); zlog_debug( - " Recv IGMP report v3 from %s on %s: record=%d group=%s source=%s", + " Recv IGMP report v3 from %s on %s: record=%d group=%pI4 source=%s", from_str, ifp->name, i, - inet_ntoa(rec_group), src_str); + &rec_group, src_str); } } /* for (sources) */ @@ -1969,8 +1969,8 @@ int igmp_v3_recv_report(struct igmp_sock *igmp, struct in_addr from, if (PIM_DEBUG_IGMP_PACKETS && filtered) zlog_debug( - "Filtering IGMPv3 group record %s from %s on %s per prefix-list %s", - inet_ntoa(rec_group), from_str, ifp->name, + "Filtering IGMPv3 group record %pI4 from %s on %s per prefix-list %s", + &rec_group, from_str, ifp->name, pim_ifp->boundary_oil_plist); /* diff --git a/pimd/pim_msdp.h b/pimd/pim_msdp.h index 6caa3181e7..15a1041e21 100644 --- a/pimd/pim_msdp.h +++ b/pimd/pim_msdp.h @@ -208,8 +208,8 @@ struct pim_msdp { thread_add_write(mp->pim->msdp.master, pim_msdp_write, mp, mp->fd, \ &mp->t_write) -#define PIM_MSDP_PEER_READ_OFF(mp) THREAD_READ_OFF(mp->t_read) -#define PIM_MSDP_PEER_WRITE_OFF(mp) THREAD_WRITE_OFF(mp->t_write) +#define PIM_MSDP_PEER_READ_OFF(mp) thread_cancel(&mp->t_read) +#define PIM_MSDP_PEER_WRITE_OFF(mp) thread_cancel(&mp->t_write) // struct pim_msdp *msdp; struct pim_instance; diff --git a/pimd/pim_neighbor.c b/pimd/pim_neighbor.c index 4d6625bf6f..167aa3c604 100644 --- a/pimd/pim_neighbor.c +++ b/pimd/pim_neighbor.c @@ -294,7 +294,7 @@ static int on_neighbor_jp_timer(struct thread *t) static void pim_neighbor_start_jp_timer(struct pim_neighbor *neigh) { - THREAD_TIMER_OFF(neigh->jp_timer); + THREAD_OFF(neigh->jp_timer); thread_add_timer(router->master, on_neighbor_jp_timer, neigh, router->t_periodic, &neigh->jp_timer); } diff --git a/pimd/pim_nht.c b/pimd/pim_nht.c index 7fc7dafed6..f691e8b755 100644 --- a/pimd/pim_nht.c +++ b/pimd/pim_nht.c @@ -810,9 +810,9 @@ int pim_parse_nexthop_update(ZAPI_CALLBACK_ARGS) if (PIM_DEBUG_PIM_NHT) zlog_debug( - "%s: NHT addr %pFX(%s) %d-nhop via %s(%s) type %d distance:%u metric:%u ", + "%s: NHT addr %pFX(%s) %d-nhop via %pI4(%s) type %d distance:%u metric:%u ", __func__, &nhr.prefix, pim->vrf->name, - i + 1, inet_ntoa(nexthop->gate.ipv4), + i + 1, &nexthop->gate.ipv4, ifp->name, nexthop->type, nhr.distance, nhr.metric); diff --git a/pimd/pim_register.c b/pimd/pim_register.c index 19e15f3ede..90b69a54f2 100644 --- a/pimd/pim_register.c +++ b/pimd/pim_register.c @@ -75,8 +75,8 @@ void pim_register_stop_send(struct interface *ifp, struct prefix_sg *sg, struct prefix p; if (PIM_DEBUG_PIM_REG) { - zlog_debug("Sending Register stop for %s to %s on %s", - pim_str_sg_dump(sg), inet_ntoa(originator), + zlog_debug("Sending Register stop for %s to %pI4 on %s", + pim_str_sg_dump(sg), &originator, ifp->name); } @@ -170,9 +170,9 @@ void pim_register_send(const uint8_t *buf, int buf_size, struct in_addr src, struct interface *ifp; if (PIM_DEBUG_PIM_REG) { - zlog_debug("Sending %s %sRegister Packet to %s", up->sg_str, + zlog_debug("Sending %s %sRegister Packet to %pI4", up->sg_str, null_register ? "NULL " : "", - inet_ntoa(rpg->rpf_addr.u.prefix4)); + &rpg->rpf_addr.u.prefix4); } ifp = rpg->source_nexthop.interface; @@ -192,12 +192,9 @@ void pim_register_send(const uint8_t *buf, int buf_size, struct in_addr src, } if (PIM_DEBUG_PIM_REG) { - char rp_str[INET_ADDRSTRLEN]; - strlcpy(rp_str, inet_ntoa(rpg->rpf_addr.u.prefix4), - sizeof(rp_str)); - zlog_debug("%s: Sending %s %sRegister Packet to %s on %s", + zlog_debug("%s: Sending %s %sRegister Packet to %pI4 on %s", __func__, up->sg_str, null_register ? "NULL " : "", - rp_str, ifp->name); + &rpg->rpf_addr.u.prefix4, ifp->name); } memset(buffer, 0, 10000); diff --git a/pimd/pim_rp.c b/pimd/pim_rp.c index 0ec8e45edb..7246482f02 100644 --- a/pimd/pim_rp.c +++ b/pimd/pim_rp.c @@ -350,8 +350,8 @@ void pim_upstream_update(struct pim_instance *pim, struct pim_upstream *up) up->sg.grp); if (PIM_DEBUG_PIM_TRACE) - zlog_debug("%s: pim upstream update for old upstream %s", - __func__, inet_ntoa(old_upstream_addr)); + zlog_debug("%s: pim upstream update for old upstream %pI4", + __func__, &old_upstream_addr); if (old_upstream_addr.s_addr == new_upstream_addr.s_addr) return; @@ -1204,6 +1204,7 @@ void pim_rp_show_information(struct pim_instance *pim, struct vty *vty, bool uj) struct rp_info *prev_rp_info = NULL; struct listnode *node; char source[7]; + char buf[PREFIX_STRLEN]; json_object *json = NULL; json_object *json_rp_rows = NULL; @@ -1236,9 +1237,11 @@ void pim_rp_show_information(struct pim_instance *pim, struct vty *vty, bool uj) .s_addr) { json_object_object_add( json, - inet_ntoa(prev_rp_info->rp + inet_ntop(AF_INET, + &prev_rp_info->rp .rpf_addr.u - .prefix4), + .prefix4, + buf, sizeof(buf)), json_rp_rows); json_rp_rows = NULL; } @@ -1249,8 +1252,10 @@ void pim_rp_show_information(struct pim_instance *pim, struct vty *vty, bool uj) json_row = json_object_new_object(); json_object_string_add( json_row, "rpAddress", - inet_ntoa(rp_info->rp.rpf_addr.u - .prefix4)); + inet_ntop(AF_INET, + &rp_info->rp.rpf_addr.u + .prefix4, + buf, sizeof(buf))); if (rp_info->rp.source_nexthop.interface) json_object_string_add( json_row, "outboundInterface", @@ -1282,8 +1287,10 @@ void pim_rp_show_information(struct pim_instance *pim, struct vty *vty, bool uj) json_object_array_add(json_rp_rows, json_row); } else { vty_out(vty, "%-15s ", - inet_ntoa(rp_info->rp.rpf_addr.u - .prefix4)); + inet_ntop(AF_INET, + &rp_info->rp.rpf_addr.u + .prefix4, + buf, sizeof(buf))); if (rp_info->plist) vty_out(vty, "%-18s ", rp_info->plist); @@ -1313,7 +1320,9 @@ void pim_rp_show_information(struct pim_instance *pim, struct vty *vty, bool uj) if (prev_rp_info && json_rp_rows) json_object_object_add( json, - inet_ntoa(prev_rp_info->rp.rpf_addr.u.prefix4), + inet_ntop(AF_INET, + &prev_rp_info->rp.rpf_addr.u.prefix4, + buf, sizeof(buf)), json_rp_rows); vty_out(vty, "%s\n", json_object_to_json_string_ext( diff --git a/pimd/pim_upstream.c b/pimd/pim_upstream.c index 312a7069df..d95b092d94 100644 --- a/pimd/pim_upstream.c +++ b/pimd/pim_upstream.c @@ -951,8 +951,8 @@ static struct pim_upstream *pim_upstream_new(struct pim_instance *pim, if (PIM_DEBUG_PIM_TRACE) { zlog_debug( - "%s: Created Upstream %s upstream_addr %s ref count %d increment", - __func__, up->sg_str, inet_ntoa(up->upstream_addr), + "%s: Created Upstream %s upstream_addr %pI4 ref count %d increment", + __func__, up->sg_str, &up->upstream_addr, up->ref_count); } @@ -1768,7 +1768,7 @@ void pim_upstream_start_register_stop_timer(struct pim_upstream *up, { uint32_t time; - THREAD_TIMER_OFF(up->t_rs_timer); + THREAD_OFF(up->t_rs_timer); if (!null_register) { uint32_t lower = (0.5 * PIM_REGISTER_SUPPRESSION_PERIOD); diff --git a/pimd/pim_zebra.c b/pimd/pim_zebra.c index 52bfab9a33..f0eae955cc 100644 --- a/pimd/pim_zebra.c +++ b/pimd/pim_zebra.c @@ -98,8 +98,8 @@ static void dump_if_address(struct interface *ifp) if (p->family != AF_INET) continue; - zlog_debug("%s %s: interface %s address %s %s", __FILE__, - __func__, ifp->name, inet_ntoa(p->u.prefix4), + zlog_debug("%s %s: interface %s address %pI4 %s", __FILE__, + __func__, ifp->name, &p->u.prefix4, CHECK_FLAG(ifc->flags, ZEBRA_IFA_SECONDARY) ? "secondary" : "primary"); @@ -837,9 +837,9 @@ void pim_forward_start(struct pim_ifchannel *ch) sizeof(group_str)); pim_inet4_dump("<upstream?>", up->upstream_addr, upstream_str, sizeof(upstream_str)); - zlog_debug("%s: (S,G)=(%s,%s) oif=%s (%s)", __func__, + zlog_debug("%s: (S,G)=(%s,%s) oif=%s (%pI4)", __func__, source_str, group_str, ch->interface->name, - inet_ntoa(up->upstream_addr)); + &up->upstream_addr); } if (PIM_IF_FLAG_TEST_PROTO_IGMP(ch->flags)) diff --git a/ripd/rip_interface.c b/ripd/rip_interface.c index 7c35781eef..c601ab4047 100644 --- a/ripd/rip_interface.c +++ b/ripd/rip_interface.c @@ -172,8 +172,8 @@ static void rip_request_interface_send(struct interface *ifp, uint8_t version) continue; if (IS_RIP_DEBUG_EVENT) - zlog_debug("SEND request to %s", - inet_ntoa(to.sin_addr)); + zlog_debug("SEND request to %pI4", + &to.sin_addr); rip_request_send(&to, ifp, version, connected); } @@ -468,10 +468,7 @@ static void rip_interface_clean(struct rip_interface *ri) ri->enable_interface = 0; ri->running = 0; - if (ri->t_wakeup) { - thread_cancel(ri->t_wakeup); - ri->t_wakeup = NULL; - } + thread_cancel(&ri->t_wakeup); } void rip_interfaces_clean(struct rip *rip) @@ -1174,9 +1171,7 @@ int rip_show_network_config(struct vty *vty, struct rip *rip) for (node = route_top(rip->enable_network); node; node = route_next(node)) if (node->info) - vty_out(vty, " %s/%u\n", - inet_ntoa(node->p.u.prefix4), - node->p.prefixlen); + vty_out(vty, " %pFX\n", &node->p); /* Interface name RIP enable statement. */ for (i = 0; i < vector_active(rip->enable_interface); i++) @@ -1186,7 +1181,7 @@ int rip_show_network_config(struct vty *vty, struct rip *rip) /* RIP neighbors listing. */ for (node = route_top(rip->neighbor); node; node = route_next(node)) if (node->info) - vty_out(vty, " %s\n", inet_ntoa(node->p.u.prefix4)); + vty_out(vty, " %pI4\n", &node->p.u.prefix4); return 0; } diff --git a/ripd/rip_peer.c b/ripd/rip_peer.c index 77c73ab398..23599f0877 100644 --- a/ripd/rip_peer.c +++ b/ripd/rip_peer.c @@ -86,8 +86,7 @@ static struct rip_peer *rip_peer_get(struct rip *rip, struct in_addr *addr) peer = rip_peer_lookup(rip, addr); if (peer) { - if (peer->t_timeout) - thread_cancel(peer->t_timeout); + thread_cancel(&peer->t_timeout); } else { peer = rip_peer_new(); peer->rip = rip; @@ -155,8 +154,8 @@ void rip_peer_display(struct vty *vty, struct rip *rip) char timebuf[RIP_UPTIME_LEN]; for (ALL_LIST_ELEMENTS(rip->peer_list, node, nnode, peer)) { - vty_out(vty, " %-16s %9d %9d %9d %s\n", - inet_ntoa(peer->addr), peer->recv_badpackets, + vty_out(vty, " %-16pI4 %9d %9d %9d %s\n", + &peer->addr, peer->recv_badpackets, peer->recv_badroutes, ZEBRA_RIP_DISTANCE_DEFAULT, rip_peer_uptime(peer, timebuf, RIP_UPTIME_LEN)); } diff --git a/ripd/rip_zebra.c b/ripd/rip_zebra.c index e07d218860..074370dc26 100644 --- a/ripd/rip_zebra.c +++ b/ripd/rip_zebra.c @@ -88,18 +88,16 @@ static void rip_zebra_ipv4_send(struct rip *rip, struct route_node *rp, if (IS_RIP_DEBUG_ZEBRA) { if (rip->ecmp) - zlog_debug("%s: %s/%d nexthops %d", + zlog_debug("%s: %pFX nexthops %d", (cmd == ZEBRA_ROUTE_ADD) ? "Install into zebra" : "Delete from zebra", - inet_ntoa(rp->p.u.prefix4), rp->p.prefixlen, - count); + &rp->p, count); else - zlog_debug("%s: %s/%d", + zlog_debug("%s: %pFX", (cmd == ZEBRA_ROUTE_ADD) ? "Install into zebra" - : "Delete from zebra", - inet_ntoa(rp->p.u.prefix4), rp->p.prefixlen); + : "Delete from zebra", &rp->p); } rip->counters.route_changes++; diff --git a/ripd/ripd.c b/ripd/ripd.c index 49caf3f6d8..059a0e2efd 100644 --- a/ripd/ripd.c +++ b/ripd/ripd.c @@ -45,6 +45,7 @@ #include "lib_errors.h" #include "northbound_cli.h" #include "network.h" +#include "lib/printfrr.h" #include "ripd/ripd.h" #include "ripd/rip_nb.h" @@ -466,8 +467,8 @@ static void rip_rte_process(struct rte *rte, struct sockaddr_in *from, if (ret == RMAP_DENYMATCH) { if (IS_RIP_DEBUG_PACKET) zlog_debug( - "RIP %s/%d is filtered by route-map in", - inet_ntoa(p.prefix), p.prefixlen); + "RIP %pFX is filtered by route-map in", + &p); return; } @@ -502,8 +503,8 @@ static void rip_rte_process(struct rte *rte, struct sockaddr_in *from, /* Check if nexthop address is myself, then do nothing. */ if (rip_nexthop_check(rip, nexthop) < 0) { if (IS_RIP_DEBUG_PACKET) - zlog_debug("Nexthop address %s is myself", - inet_ntoa(*nexthop)); + zlog_debug("Nexthop address %pI4 is myself", + nexthop); return; } @@ -830,8 +831,8 @@ static int rip_auth_simple_password(struct rte *rte, struct sockaddr_in *from, } if (IS_RIP_DEBUG_EVENT) - zlog_debug("RIPv2 simple password authentication from %s", - inet_ntoa(from->sin_addr)); + zlog_debug("RIPv2 simple password authentication from %pI4", + &from->sin_addr); ri = ifp->info; @@ -878,8 +879,8 @@ static int rip_auth_md5(struct rip_packet *packet, struct sockaddr_in *from, char auth_str[RIP_AUTH_MD5_SIZE] = {}; if (IS_RIP_DEBUG_EVENT) - zlog_debug("RIPv2 MD5 authentication from %s", - inet_ntoa(from->sin_addr)); + zlog_debug("RIPv2 MD5 authentication from %pI4", + &from->sin_addr); ri = ifp->info; md5 = (struct rip_md5_info *)&packet->rte; @@ -1160,8 +1161,8 @@ static void rip_response_process(struct rip_packet *packet, int size, rip->vrf->vrf_id) == NULL) { zlog_info( - "This datagram doesn't came from a valid neighbor: %s", - inet_ntoa(from->sin_addr)); + "This datagram doesn't come from a valid neighbor: %pI4", + &from->sin_addr); rip_peer_bad_packet(rip, from); return; } @@ -1190,9 +1191,9 @@ static void rip_response_process(struct rip_packet *packet, int size, if (rte->family != htons(AF_INET)) { /* Address family check. RIP only supports AF_INET. */ - zlog_info("Unsupported family %d from %s.", + zlog_info("Unsupported family %d from %pI4", ntohs(rte->family), - inet_ntoa(from->sin_addr)); + &from->sin_addr); continue; } @@ -1218,8 +1219,8 @@ static void rip_response_process(struct rip_packet *packet, int size, /* RIPv1 does not have nexthop value. */ if (packet->version == RIPv1 && rte->nexthop.s_addr != INADDR_ANY) { - zlog_info("RIPv1 packet with nexthop value %s", - inet_ntoa(rte->nexthop)); + zlog_info("RIPv1 packet with nexthop value %pI4", + &rte->nexthop); rip_peer_bad_route(rip, from); continue; } @@ -1236,8 +1237,8 @@ static void rip_response_process(struct rip_packet *packet, int size, addrval = ntohl(rte->nexthop.s_addr); if (IN_CLASSD(addrval)) { zlog_info( - "Nexthop %s is multicast address, skip this rte", - inet_ntoa(rte->nexthop)); + "Nexthop %pI4 is multicast address, skip this rte", + &rte->nexthop); continue; } @@ -1257,16 +1258,14 @@ static void rip_response_process(struct rip_packet *packet, int size, == RIP_ROUTE_RTE) { if (IS_RIP_DEBUG_EVENT) zlog_debug( - "Next hop %s is on RIP network. Set nexthop to the packet's originator", - inet_ntoa( - rte->nexthop)); + "Next hop %pI4 is on RIP network. Set nexthop to the packet's originator", + &rte->nexthop); rte->nexthop = rinfo->from; } else { if (IS_RIP_DEBUG_EVENT) zlog_debug( - "Next hop %s is not directly reachable. Treat it as 0.0.0.0", - inet_ntoa( - rte->nexthop)); + "Next hop %pI4 is not directly reachable. Treat it as 0.0.0.0", + &rte->nexthop); rte->nexthop.s_addr = INADDR_ANY; } @@ -1275,9 +1274,8 @@ static void rip_response_process(struct rip_packet *packet, int size, } else { if (IS_RIP_DEBUG_EVENT) zlog_debug( - "Next hop %s is not directly reachable. Treat it as 0.0.0.0", - inet_ntoa( - rte->nexthop)); + "Next hop %pI4 is not directly reachable. Treat it as 0.0.0.0", + &rte->nexthop); rte->nexthop.s_addr = INADDR_ANY; } } @@ -1331,8 +1329,8 @@ static void rip_response_process(struct rip_packet *packet, int size, != rte->prefix.s_addr) masklen2ip(32, &rte->mask); if (IS_RIP_DEBUG_EVENT) - zlog_debug("Subnetted route %s", - inet_ntoa(rte->prefix)); + zlog_debug("Subnetted route %pI4", + &rte->prefix); } else { if ((rte->prefix.s_addr & rte->mask.s_addr) != rte->prefix.s_addr) @@ -1340,10 +1338,10 @@ static void rip_response_process(struct rip_packet *packet, int size, } if (IS_RIP_DEBUG_EVENT) { - zlog_debug("Resultant route %s", - inet_ntoa(rte->prefix)); - zlog_debug("Resultant mask %s", - inet_ntoa(rte->mask)); + zlog_debug("Resultant route %pI4", + &rte->prefix); + zlog_debug("Resultant mask %pI4", + &rte->mask); } } @@ -1354,8 +1352,8 @@ static void rip_response_process(struct rip_packet *packet, int size, && ((rte->prefix.s_addr & rte->mask.s_addr) != rte->prefix.s_addr)) { zlog_warn( - "RIPv2 address %s is not mask /%d applied one", - inet_ntoa(rte->prefix), ip_masklen(rte->mask)); + "RIPv2 address %pI4 is not mask /%d applied one", + &rte->prefix, ip_masklen(rte->mask)); rip_peer_bad_route(rip, from); continue; } @@ -1418,8 +1416,8 @@ int rip_create_socket(struct vrf *vrf) frr_with_privs(&ripd_privs) { if ((ret = bind(sock, (struct sockaddr *)&addr, sizeof(addr))) < 0) { - zlog_err("%s: Can't bind socket %d to %s port %d: %s", - __func__, sock, inet_ntoa(addr.sin_addr), + zlog_err("%s: Can't bind socket %d to %pI4 port %d: %s", + __func__, sock, &addr.sin_addr, (int)ntohs(addr.sin_port), safe_strerror(errno)); @@ -1459,14 +1457,14 @@ static int rip_send_packet(uint8_t *buf, int size, struct sockaddr_in *to, char dst[ADDRESS_SIZE]; if (to) { - strlcpy(dst, inet_ntoa(to->sin_addr), sizeof(dst)); + inet_ntop(AF_INET, &to->sin_addr, dst, sizeof(dst)); } else { sin.sin_addr.s_addr = htonl(INADDR_RIP_GROUP); - strlcpy(dst, inet_ntoa(sin.sin_addr), sizeof(dst)); + inet_ntop(AF_INET, &sin.sin_addr, dst, sizeof(dst)); } #undef ADDRESS_SIZE - zlog_debug("rip_send_packet %s > %s (%s)", - inet_ntoa(ifc->address->u.prefix4), dst, + zlog_debug("rip_send_packet %pI4 > %s (%s)", + &ifc->address->u.prefix4, dst, ifc->ifp->name); } @@ -1533,7 +1531,7 @@ static int rip_send_packet(uint8_t *buf, int size, struct sockaddr_in *to, ret = sendmsg(rip->sock, &msg, 0); if (IS_RIP_DEBUG_EVENT) - zlog_debug("SEND to %s.%d", inet_ntoa(sin.sin_addr), + zlog_debug("SEND to %pI4%d", &sin.sin_addr, ntohs(sin.sin_port)); if (ret < 0) @@ -1782,15 +1780,15 @@ static int rip_read(struct thread *t) /* RIP packet received */ if (IS_RIP_DEBUG_EVENT) - zlog_debug("RECV packet from %s port %d on %s (VRF %s)", - inet_ntoa(from.sin_addr), ntohs(from.sin_port), + zlog_debug("RECV packet from %pI4 port %d on %s (VRF %s)", + &from.sin_addr, ntohs(from.sin_port), ifp ? ifp->name : "unknown", rip->vrf_name); /* If this packet come from unknown interface, ignore it. */ if (ifp == NULL) { zlog_info( - "rip_read: cannot find interface for packet from %s port %d (VRF %s)", - inet_ntoa(from.sin_addr), ntohs(from.sin_port), + "rip_read: cannot find interface for packet from %pI4 port %d (VRF %s)", + &from.sin_addr, ntohs(from.sin_port), rip->vrf_name); return -1; } @@ -1803,8 +1801,8 @@ static int rip_read(struct thread *t) if (ifc == NULL) { zlog_info( - "rip_read: cannot find connected address for packet from %s port %d on interface %s (VRF %s)", - inet_ntoa(from.sin_addr), ntohs(from.sin_port), + "rip_read: cannot find connected address for packet from %pI4 port %d on interface %s (VRF %s)", + &from.sin_addr, ntohs(from.sin_port), ifp->name, rip->vrf_name); return -1; } @@ -2077,8 +2075,8 @@ void rip_output_process(struct connected *ifc, struct sockaddr_in *to, /* Logging output event. */ if (IS_RIP_DEBUG_EVENT) { if (to) - zlog_debug("update routes to neighbor %s", - inet_ntoa(to->sin_addr)); + zlog_debug("update routes to neighbor %pI4", + &to->sin_addr); else zlog_debug("update routes on interface %s ifindex %d", ifc->ifp->name, ifc->ifp->ifindex); @@ -2143,9 +2141,8 @@ void rip_output_process(struct connected *ifc, struct sockaddr_in *to, if (IS_RIP_DEBUG_PACKET) zlog_debug( - "RIPv1 mask check, %s/%d considered for output", - inet_ntoa(rp->p.u.prefix4), - rp->p.prefixlen); + "RIPv1 mask check, %pFX considered for output", + &rp->p); if (subnetted && prefix_match( @@ -2166,9 +2163,8 @@ void rip_output_process(struct connected *ifc, struct sockaddr_in *to, } if (IS_RIP_DEBUG_PACKET) zlog_debug( - "RIPv1 mask check, %s/%d made it through", - inet_ntoa(rp->p.u.prefix4), - rp->p.prefixlen); + "RIPv1 mask check, %pFX made it through", + &rp->p); } else p = (struct prefix_ipv4 *)&rp->p; @@ -2452,10 +2448,10 @@ static void rip_update_interface(struct connected *ifc, uint8_t version, to.sin_port = htons(RIP_PORT_DEFAULT); if (IS_RIP_DEBUG_EVENT) - zlog_debug("%s announce to %s on %s", + zlog_debug("%s announce to %pI4 on %s", CONNECTED_PEER(ifc) ? "unicast" : "broadcast", - inet_ntoa(to.sin_addr), ifp->name); + &to.sin_addr, ifp->name); rip_output_process(ifc, &to, route_type, version); } @@ -2530,8 +2526,8 @@ static void rip_update_process(struct rip *rip, int route_type) rip->vrf->vrf_id); if (!connected) { zlog_warn( - "Neighbor %s doesn't have connected interface!", - inet_ntoa(p->u.prefix4)); + "Neighbor %pI4 doesn't have connected interface!", + &p->u.prefix4); continue; } @@ -2957,8 +2953,7 @@ static void rip_distance_show(struct vty *vty, struct rip *rip) " Address Distance List\n"); header = 0; } - snprintf(buf, sizeof(buf), "%s/%d", - inet_ntoa(rn->p.u.prefix4), rn->p.prefixlen); + snprintfrr(buf, sizeof(buf), "%pFX", &rn->p); vty_out(vty, " %-20s %4d %s\n", buf, rdistance->distance, rdistance->access_list ? rdistance->access_list @@ -3085,12 +3080,11 @@ DEFUN (show_ip_rip, int len; len = vty_out( - vty, "%c(%s) %s/%d", + vty, "%c(%s) %pFX", /* np->lock, For debugging. */ zebra_route_char(rinfo->type), rip_route_type_print(rinfo->sub_type), - inet_ntoa(np->p.u.prefix4), - np->p.prefixlen); + &np->p); len = 24 - len; @@ -3100,8 +3094,8 @@ DEFUN (show_ip_rip, switch (rinfo->nh.type) { case NEXTHOP_TYPE_IPV4: case NEXTHOP_TYPE_IPV4_IFINDEX: - vty_out(vty, "%-20s %2d ", - inet_ntoa(rinfo->nh.gate.ipv4), + vty_out(vty, "%-20pI4 %2d ", + &rinfo->nh.gate.ipv4, rinfo->metric); break; case NEXTHOP_TYPE_IFINDEX: @@ -3125,8 +3119,8 @@ DEFUN (show_ip_rip, /* Route which exist in kernel routing table. */ if ((rinfo->type == ZEBRA_ROUTE_RIP) && (rinfo->sub_type == RIP_ROUTE_RTE)) { - vty_out(vty, "%-15s ", - inet_ntoa(rinfo->from)); + vty_out(vty, "%-15pI4 ", + &rinfo->from); vty_out(vty, "%3" ROUTE_TAG_PRI " ", (route_tag_t)rinfo->tag); rip_vty_out_uptime(vty, rinfo); @@ -3602,7 +3596,7 @@ static void rip_instance_disable(struct rip *rip) RIP_TIMER_OFF(rip->t_triggered_interval); /* Cancel read thread. */ - THREAD_READ_OFF(rip->t_read); + thread_cancel(&rip->t_read); /* Close RIP socket. */ close(rip->sock); diff --git a/ripd/ripd.h b/ripd/ripd.h index 417bd5b3b1..99718f7b9e 100644 --- a/ripd/ripd.h +++ b/ripd/ripd.h @@ -405,7 +405,7 @@ enum rip_event { #define RIP_TIMER_ON(T,F,V) thread_add_timer (master, (F), rinfo, (V), &(T)) /* Macro for timer turn off. */ -#define RIP_TIMER_OFF(X) THREAD_TIMER_OFF(X) +#define RIP_TIMER_OFF(X) thread_cancel(&(X)) #define RIP_OFFSET_LIST_IN 0 #define RIP_OFFSET_LIST_OUT 1 diff --git a/ripngd/ripng_interface.c b/ripngd/ripng_interface.c index 16859c2d29..115d7a6b99 100644 --- a/ripngd/ripng_interface.c +++ b/ripngd/ripng_interface.c @@ -321,10 +321,7 @@ void ripng_interface_clean(struct ripng *ripng) ri->enable_interface = 0; ri->running = 0; - if (ri->t_wakeup) { - thread_cancel(ri->t_wakeup); - ri->t_wakeup = NULL; - } + thread_cancel(&ri->t_wakeup); } } diff --git a/ripngd/ripng_peer.c b/ripngd/ripng_peer.c index e6ff58dd0c..0ac489c67e 100644 --- a/ripngd/ripng_peer.c +++ b/ripngd/ripng_peer.c @@ -95,8 +95,7 @@ static struct ripng_peer *ripng_peer_get(struct ripng *ripng, peer = ripng_peer_lookup(ripng, addr); if (peer) { - if (peer->t_timeout) - thread_cancel(peer->t_timeout); + thread_cancel(&peer->t_timeout); } else { peer = ripng_peer_new(); peer->ripng = ripng; @@ -105,7 +104,6 @@ static struct ripng_peer *ripng_peer_get(struct ripng *ripng, } /* Update timeout thread. */ - peer->t_timeout = NULL; thread_add_timer(master, ripng_peer_timeout, peer, RIPNG_PEER_TIMER_DEFAULT, &peer->t_timeout); diff --git a/ripngd/ripngd.c b/ripngd/ripngd.c index 060477010b..8d9249e4ae 100644 --- a/ripngd/ripngd.c +++ b/ripngd/ripngd.c @@ -1463,10 +1463,7 @@ static int ripng_update(struct thread *t) /* Triggered updates may be suppressed if a regular update is due by the time the triggered update would be sent. */ - if (ripng->t_triggered_interval) { - thread_cancel(ripng->t_triggered_interval); - ripng->t_triggered_interval = NULL; - } + thread_cancel(&ripng->t_triggered_interval); ripng->trigger = 0; /* Reset flush event. */ @@ -1500,10 +1497,7 @@ int ripng_triggered_update(struct thread *t) ripng->t_triggered_update = NULL; /* Cancel interval timer. */ - if (ripng->t_triggered_interval) { - thread_cancel(ripng->t_triggered_interval); - ripng->t_triggered_interval = NULL; - } + thread_cancel(&ripng->t_triggered_interval); ripng->trigger = 0; /* Logging triggered update. */ @@ -1952,10 +1946,8 @@ void ripng_event(struct ripng *ripng, enum ripng_event event, int sock) &ripng->t_read); break; case RIPNG_UPDATE_EVENT: - if (ripng->t_update) { - thread_cancel(ripng->t_update); - ripng->t_update = NULL; - } + thread_cancel(&ripng->t_update); + /* Update timer jitter. */ jitter = ripng_update_jitter(ripng->update_time); @@ -2719,10 +2711,7 @@ static void ripng_instance_disable(struct ripng *ripng) RIPNG_TIMER_OFF(ripng->t_triggered_interval); /* Cancel the read thread */ - if (ripng->t_read) { - thread_cancel(ripng->t_read); - ripng->t_read = NULL; - } + thread_cancel(&ripng->t_read); /* Close the RIPng socket */ if (ripng->sock >= 0) { diff --git a/ripngd/ripngd.h b/ripngd/ripngd.h index 70508d5cb0..a42c32ebb7 100644 --- a/ripngd/ripngd.h +++ b/ripngd/ripngd.h @@ -351,13 +351,7 @@ enum ripng_event { /* RIPng timer on/off macro. */ #define RIPNG_TIMER_ON(T,F,V) thread_add_timer (master, (F), rinfo, (V), &(T)) -#define RIPNG_TIMER_OFF(T) \ - do { \ - if (T) { \ - thread_cancel(T); \ - (T) = NULL; \ - } \ - } while (0) +#define RIPNG_TIMER_OFF(T) thread_cancel(&(T)) #define RIPNG_OFFSET_LIST_IN 0 #define RIPNG_OFFSET_LIST_OUT 1 diff --git a/staticd/static_vty.c b/staticd/static_vty.c index 6608811cc6..c3c453f42d 100644 --- a/staticd/static_vty.c +++ b/staticd/static_vty.c @@ -365,8 +365,7 @@ int static_config(struct vty *vty, struct static_vrf *svrf, afi_t afi, switch (nh->type) { case STATIC_IPV4_GATEWAY: - vty_out(vty, " %s", - inet_ntoa(nh->addr.ipv4)); + vty_out(vty, " %pI4", &nh->addr.ipv4); break; case STATIC_IPV6_GATEWAY: vty_out(vty, " %s", @@ -500,12 +499,6 @@ DEFPY_YANG(ip_route_blackhole, "Table to configure\n" "The table number to configure\n") { - if (table_str && vrf && !vrf_is_backend_netns()) { - vty_out(vty, - "%% table param only available when running on netns-based vrfs\n"); - return CMD_WARNING_CONFIG_FAILED; - } - return static_route(vty, AFI_IP, SAFI_UNICAST, no, prefix, mask_str, NULL, NULL, NULL, flag, tag_str, distance_str, vrf, label, table_str); @@ -819,12 +812,6 @@ DEFPY_YANG(ipv6_route_blackhole, "Table to configure\n" "The table number to configure\n") { - if (table_str && vrf && !vrf_is_backend_netns()) { - vty_out(vty, - "%% table param only available when running on netns-based vrfs\n"); - return CMD_WARNING_CONFIG_FAILED; - } - return static_route(vty, AFI_IP6, SAFI_UNICAST, no, prefix_str, NULL, from_str, NULL, NULL, flag, tag_str, distance_str, vrf, label, table_str); diff --git a/tests/isisd/test_isis_spf.c b/tests/isisd/test_isis_spf.c index 7ac8611bd9..4c89a5be0a 100644 --- a/tests/isisd/test_isis_spf.c +++ b/tests/isisd/test_isis_spf.c @@ -66,7 +66,7 @@ static void test_run_spf(struct vty *vty, const struct isis_topology *topology, /* Print the SPT and the corresponding routing table. */ isis_print_spftree(vty, spftree); - isis_print_routes(vty, spftree, false); + isis_print_routes(vty, spftree, false, false); /* Cleanup SPF tree. */ isis_spftree_del(spftree); @@ -122,7 +122,7 @@ static void test_run_ti_lfa(struct vty *vty, /* Print the post-convergence SPT and the correspoding routing table. */ isis_print_spftree(vty, spftree_pc); - isis_print_routes(vty, spftree_self, true); + isis_print_routes(vty, spftree_self, false, true); /* Cleanup everything. */ isis_spftree_del(spftree_self); diff --git a/tests/isisd/test_isis_spf.refout b/tests/isisd/test_isis_spf.refout index ea7cc14d7a..d24176a097 100644 --- a/tests/isisd/test_isis_spf.refout +++ b/tests/isisd/test_isis_spf.refout @@ -18,14 +18,15 @@ rt6 TE-IS 30 rt2 - rt4(4) IS-IS L1 IPv4 routing table:
- Prefix Metric Interface Nexthop Label(s)
- -----------------------------------------------------
- 10.0.255.2/32 20 - rt2 -
- 10.0.255.3/32 20 - rt3 -
- 10.0.255.4/32 30 - rt2 -
- 10.0.255.5/32 30 - rt3 -
- 10.0.255.6/32 40 - rt2 -
- - rt3 -
+ Prefix Metric Interface Nexthop Label(s)
+ ----------------------------------------------------------
+ 10.0.255.1/32 0 - - -
+ 10.0.255.2/32 20 - rt2 implicit-null
+ 10.0.255.3/32 20 - rt3 implicit-null
+ 10.0.255.4/32 30 - rt2 16040
+ 10.0.255.5/32 30 - rt3 16050
+ 10.0.255.6/32 40 - rt2 16060
+ - rt3 16060
IS-IS paths to level-1 routers that speak IPv6
Vertex Type Metric Next-Hop Interface Parent
@@ -46,14 +47,15 @@ rt6 TE-IS 30 rt2 - rt4(4) IS-IS L1 IPv6 routing table:
- Prefix Metric Interface Nexthop Label(s)
- -------------------------------------------------------
- 2001:db8::2/128 20 - rt2 -
- 2001:db8::3/128 20 - rt3 -
- 2001:db8::4/128 30 - rt2 -
- 2001:db8::5/128 30 - rt3 -
- 2001:db8::6/128 40 - rt2 -
- - rt3 -
+ Prefix Metric Interface Nexthop Label(s)
+ ------------------------------------------------------------
+ 2001:db8::1/128 0 - - -
+ 2001:db8::2/128 20 - rt2 implicit-null
+ 2001:db8::3/128 20 - rt3 implicit-null
+ 2001:db8::4/128 30 - rt2 16041
+ 2001:db8::5/128 30 - rt3 16051
+ 2001:db8::6/128 40 - rt2 16061
+ - rt3 16061
test# test isis topology 2 root rt1 spf
IS-IS paths to level-1 routers that speak IP
@@ -76,14 +78,15 @@ rt3 TE-IS 30 rt3 - rt1(4) IS-IS L1 IPv4 routing table:
- Prefix Metric Interface Nexthop Label(s)
- -----------------------------------------------------
- 10.0.255.2/32 25 - rt2 -
- 10.0.255.3/32 40 - rt3 -
- 10.0.255.4/32 20 - rt4 -
- 10.0.255.5/32 20 - rt5 -
- 10.0.255.6/32 30 - rt4 -
- - rt5 -
+ Prefix Metric Interface Nexthop Label(s)
+ ----------------------------------------------------------
+ 10.0.255.1/32 0 - - -
+ 10.0.255.2/32 25 - rt2 implicit-null
+ 10.0.255.3/32 40 - rt3 implicit-null
+ 10.0.255.4/32 20 - rt4 implicit-null
+ 10.0.255.5/32 20 - rt5 implicit-null
+ 10.0.255.6/32 30 - rt4 16060
+ - rt5 16060
IS-IS paths to level-1 routers that speak IPv6
Vertex Type Metric Next-Hop Interface Parent
@@ -105,14 +108,15 @@ rt3 TE-IS 30 rt3 - rt1(4) IS-IS L1 IPv6 routing table:
- Prefix Metric Interface Nexthop Label(s)
- -------------------------------------------------------
- 2001:db8::2/128 25 - rt2 -
- 2001:db8::3/128 40 - rt3 -
- 2001:db8::4/128 20 - rt4 -
- 2001:db8::5/128 20 - rt5 -
- 2001:db8::6/128 30 - rt4 -
- - rt5 -
+ Prefix Metric Interface Nexthop Label(s)
+ ------------------------------------------------------------
+ 2001:db8::1/128 0 - - -
+ 2001:db8::2/128 25 - rt2 implicit-null
+ 2001:db8::3/128 40 - rt3 implicit-null
+ 2001:db8::4/128 20 - rt4 implicit-null
+ 2001:db8::5/128 20 - rt5 implicit-null
+ 2001:db8::6/128 30 - rt4 16061
+ - rt5 16061
test# test isis topology 3 root rt1 spf ipv4-only
IS-IS paths to level-1 routers that speak IP
@@ -132,13 +136,14 @@ rt6 TE-IS 30 rt2 - rt4(4) IS-IS L1 IPv4 routing table:
- Prefix Metric Interface Nexthop Label(s)
- -----------------------------------------------------
- 10.0.255.2/32 20 - rt2 -
- 10.0.255.3/32 20 - rt3 -
- 10.0.255.4/32 30 - rt2 -
- 10.0.255.5/32 40 - rt2 -
- 10.0.255.6/32 40 - rt2 -
+ Prefix Metric Interface Nexthop Label(s)
+ ----------------------------------------------------------
+ 10.0.255.1/32 0 - - -
+ 10.0.255.2/32 20 - rt2 implicit-null
+ 10.0.255.3/32 20 - rt3 implicit-null
+ 10.0.255.4/32 30 - rt2 16040
+ 10.0.255.5/32 40 - rt2 16050
+ 10.0.255.6/32 40 - rt2 16060
test# test isis topology 4 root rt1 spf ipv4-only
IS-IS paths to level-1 routers that speak IP
@@ -162,15 +167,16 @@ rt8 TE-IS 40 rt2 - rt6(4) IS-IS L1 IPv4 routing table:
- Prefix Metric Interface Nexthop Label(s)
- -----------------------------------------------------
- 10.0.255.2/32 20 - rt2 -
- 10.0.255.3/32 20 - rt3 -
- 10.0.255.4/32 30 - rt2 -
- 10.0.255.5/32 30 - rt3 -
- 10.0.255.6/32 40 - rt2 -
- 10.0.255.7/32 40 - rt3 -
- 10.0.255.8/32 50 - rt2 -
+ Prefix Metric Interface Nexthop Label(s)
+ ----------------------------------------------------------
+ 10.0.255.1/32 0 - - -
+ 10.0.255.2/32 20 - rt2 implicit-null
+ 10.0.255.3/32 20 - rt3 implicit-null
+ 10.0.255.4/32 30 - rt2 16040
+ 10.0.255.5/32 30 - rt3 16050
+ 10.0.255.6/32 40 - rt2 16060
+ 10.0.255.7/32 40 - rt3 16070
+ 10.0.255.8/32 50 - rt2 16080
test# test isis topology 5 root rt1 spf ipv4-only
IS-IS paths to level-1 routers that speak IP
@@ -196,16 +202,17 @@ rt8 TE-IS 40 rt2 - rt6(4) IS-IS L1 IPv4 routing table:
- Prefix Metric Interface Nexthop Label(s)
- -----------------------------------------------------
- 10.0.255.2/32 20 - rt2 -
- 10.0.255.3/32 20 - rt3 -
- 10.0.255.4/32 30 - rt2 -
- 10.0.255.5/32 30 - rt3 -
- 10.0.255.6/32 40 - rt2 -
- 10.0.255.7/32 40 - rt3 -
- 10.0.255.8/32 50 - rt2 -
- - rt3 -
+ Prefix Metric Interface Nexthop Label(s)
+ ----------------------------------------------------------
+ 10.0.255.1/32 0 - - -
+ 10.0.255.2/32 20 - rt2 implicit-null
+ 10.0.255.3/32 20 - rt3 implicit-null
+ 10.0.255.4/32 30 - rt2 16040
+ 10.0.255.5/32 30 - rt3 16050
+ 10.0.255.6/32 40 - rt2 16060
+ 10.0.255.7/32 40 - rt3 16070
+ 10.0.255.8/32 50 - rt2 16080
+ - rt3 16080
test# test isis topology 6 root rt1 spf ipv4-only
IS-IS paths to level-1 routers that speak IP
@@ -239,20 +246,21 @@ rt7 TE-IS 50 rt2 - rt5(4) IS-IS L1 IPv4 routing table:
- Prefix Metric Interface Nexthop Label(s)
- -----------------------------------------------------
- 10.0.255.2/32 20 - rt2 -
- 10.0.255.3/32 20 - rt3 -
- 10.0.255.4/32 30 - rt2 -
- - rt3 -
- 10.0.255.5/32 50 - rt2 -
- - rt3 -
- 10.0.255.6/32 40 - rt2 -
- - rt3 -
- 10.0.255.7/32 60 - rt2 -
- - rt3 -
- 10.0.255.8/32 50 - rt2 -
- - rt3 -
+ Prefix Metric Interface Nexthop Label(s)
+ ----------------------------------------------------------
+ 10.0.255.1/32 0 - - -
+ 10.0.255.2/32 20 - rt2 implicit-null
+ 10.0.255.3/32 20 - rt3 implicit-null
+ 10.0.255.4/32 30 - rt2 16040
+ - rt3 16040
+ 10.0.255.5/32 50 - rt2 16050
+ - rt3 16050
+ 10.0.255.6/32 40 - rt2 16060
+ - rt3 16060
+ 10.0.255.7/32 60 - rt2 16070
+ - rt3 16070
+ 10.0.255.8/32 50 - rt2 16080
+ - rt3 16080
test# test isis topology 7 root rt1 spf ipv4-only
IS-IS paths to level-1 routers that speak IP
@@ -287,19 +295,20 @@ rt12 TE-IS 50 rt4 - rt9(4) IS-IS L1 IPv4 routing table:
- Prefix Metric Interface Nexthop Label(s)
- ------------------------------------------------------
- 10.0.255.2/32 40 - rt4 -
- 10.0.255.3/32 50 - rt4 -
- 10.0.255.4/32 20 - rt4 -
- 10.0.255.5/32 30 - rt4 -
- 10.0.255.6/32 40 - rt4 -
- 10.0.255.7/32 30 - rt4 -
- 10.0.255.8/32 40 - rt4 -
- 10.0.255.9/32 50 - rt4 -
- 10.0.255.10/32 50 - rt4 -
- 10.0.255.11/32 50 - rt4 -
- 10.0.255.12/32 60 - rt4 -
+ Prefix Metric Interface Nexthop Label(s)
+ -----------------------------------------------------------
+ 10.0.255.1/32 0 - - -
+ 10.0.255.2/32 40 - rt4 16020
+ 10.0.255.3/32 50 - rt4 16030
+ 10.0.255.4/32 20 - rt4 implicit-null
+ 10.0.255.5/32 30 - rt4 16050
+ 10.0.255.6/32 40 - rt4 16060
+ 10.0.255.7/32 30 - rt4 16070
+ 10.0.255.8/32 40 - rt4 16080
+ 10.0.255.9/32 50 - rt4 16090
+ 10.0.255.10/32 50 - rt4 16100
+ 10.0.255.11/32 50 - rt4 16110
+ 10.0.255.12/32 60 - rt4 16120
test# test isis topology 8 root rt1 spf ipv4-only
IS-IS paths to level-1 routers that speak IP
@@ -333,19 +342,20 @@ rt12 TE-IS 50 rt2 - rt9(4) IS-IS L1 IPv4 routing table:
- Prefix Metric Interface Nexthop Label(s)
- ------------------------------------------------------
- 10.0.255.2/32 20 - rt2 -
- 10.0.255.3/32 30 - rt2 -
- 10.0.255.4/32 20 - rt4 -
- 10.0.255.5/32 30 - rt2 -
- 10.0.255.6/32 40 - rt2 -
- 10.0.255.7/32 30 - rt4 -
- 10.0.255.8/32 40 - rt2 -
- 10.0.255.9/32 50 - rt2 -
- 10.0.255.10/32 40 - rt4 -
- 10.0.255.11/32 50 - rt2 -
- 10.0.255.12/32 60 - rt2 -
+ Prefix Metric Interface Nexthop Label(s)
+ -----------------------------------------------------------
+ 10.0.255.1/32 0 - - -
+ 10.0.255.2/32 20 - rt2 implicit-null
+ 10.0.255.3/32 30 - rt2 16030
+ 10.0.255.4/32 20 - rt4 implicit-null
+ 10.0.255.5/32 30 - rt2 16050
+ 10.0.255.6/32 40 - rt2 16060
+ 10.0.255.7/32 30 - rt4 16070
+ 10.0.255.8/32 40 - rt2 16080
+ 10.0.255.9/32 50 - rt2 16090
+ 10.0.255.10/32 40 - rt4 16100
+ 10.0.255.11/32 50 - rt2 16110
+ 10.0.255.12/32 60 - rt2 16120
test# test isis topology 9 root rt1 spf
IS-IS paths to level-1 routers that speak IP
@@ -374,16 +384,17 @@ rt8 TE-IS 50 rt2 - rt4(4) IS-IS L1 IPv4 routing table:
- Prefix Metric Interface Nexthop Label(s)
- -----------------------------------------------------
- 10.0.255.2/32 20 - rt2 -
- 10.0.255.3/32 20 - rt3 -
- 10.0.255.4/32 30 - rt2 -
- 10.0.255.5/32 40 - rt2 -
- 10.0.255.6/32 60 - rt2 -
- 10.0.255.7/32 60 - rt2 -
- 10.0.255.8/32 60 - rt2 -
- 10.0.255.9/32 50 - rt2 -
+ Prefix Metric Interface Nexthop Label(s)
+ ----------------------------------------------------------
+ 10.0.255.1/32 0 - - -
+ 10.0.255.2/32 20 - rt2 implicit-null
+ 10.0.255.3/32 20 - rt3 implicit-null
+ 10.0.255.4/32 30 - rt2 16040
+ 10.0.255.5/32 40 - rt2 16050
+ 10.0.255.6/32 60 - rt2 16060
+ 10.0.255.7/32 60 - rt2 16070
+ 10.0.255.8/32 60 - rt2 16080
+ 10.0.255.9/32 50 - rt2 16090
IS-IS paths to level-1 routers that speak IPv6
Vertex Type Metric Next-Hop Interface Parent
@@ -411,16 +422,17 @@ rt8 TE-IS 50 rt2 - rt4(4) IS-IS L1 IPv6 routing table:
- Prefix Metric Interface Nexthop Label(s)
- -------------------------------------------------------
- 2001:db8::2/128 20 - rt2 -
- 2001:db8::3/128 20 - rt3 -
- 2001:db8::4/128 30 - rt2 -
- 2001:db8::5/128 40 - rt2 -
- 2001:db8::6/128 60 - rt2 -
- 2001:db8::7/128 60 - rt2 -
- 2001:db8::8/128 60 - rt2 -
- 2001:db8::9/128 50 - rt2 -
+ Prefix Metric Interface Nexthop Label(s)
+ ------------------------------------------------------------
+ 2001:db8::1/128 0 - - -
+ 2001:db8::2/128 20 - rt2 implicit-null
+ 2001:db8::3/128 20 - rt3 implicit-null
+ 2001:db8::4/128 30 - rt2 16041
+ 2001:db8::5/128 40 - rt2 16051
+ 2001:db8::6/128 60 - rt2 16061
+ 2001:db8::7/128 60 - rt2 16071
+ 2001:db8::8/128 60 - rt2 16081
+ 2001:db8::9/128 50 - rt2 16091
test# test isis topology 10 root rt1 spf
IS-IS paths to level-1 routers that speak IP
@@ -444,15 +456,16 @@ rt8 TE-IS 30 rt2 - rt5(4) IS-IS L1 IPv4 routing table:
- Prefix Metric Interface Nexthop Label(s)
- -----------------------------------------------------
- 10.0.255.2/32 20 - rt2 -
- 10.0.255.3/32 30 - rt3 -
- 10.0.255.4/32 30 - rt4 -
- 10.0.255.5/32 30 - rt2 -
- 10.0.255.6/32 40 - rt3 -
- 10.0.255.7/32 40 - rt4 -
- 10.0.255.8/32 40 - rt2 -
+ Prefix Metric Interface Nexthop Label(s)
+ ----------------------------------------------------------
+ 10.0.255.1/32 0 - - -
+ 10.0.255.2/32 20 - rt2 implicit-null
+ 10.0.255.3/32 30 - rt3 implicit-null
+ 10.0.255.4/32 30 - rt4 implicit-null
+ 10.0.255.5/32 30 - rt2 16050
+ 10.0.255.6/32 40 - rt3 20060
+ 10.0.255.7/32 40 - rt4 16070
+ 10.0.255.8/32 40 - rt2 16080
IS-IS paths to level-1 routers that speak IPv6
Vertex Type Metric Next-Hop Interface Parent
@@ -475,15 +488,16 @@ rt8 TE-IS 30 rt2 - rt5(4) IS-IS L1 IPv6 routing table:
- Prefix Metric Interface Nexthop Label(s)
- -------------------------------------------------------
- 2001:db8::2/128 20 - rt2 -
- 2001:db8::3/128 30 - rt3 -
- 2001:db8::4/128 30 - rt4 -
- 2001:db8::5/128 30 - rt2 -
- 2001:db8::6/128 40 - rt3 -
- 2001:db8::7/128 40 - rt4 -
- 2001:db8::8/128 40 - rt2 -
+ Prefix Metric Interface Nexthop Label(s)
+ ------------------------------------------------------------
+ 2001:db8::1/128 0 - - -
+ 2001:db8::2/128 20 - rt2 implicit-null
+ 2001:db8::3/128 30 - rt3 implicit-null
+ 2001:db8::4/128 30 - rt4 implicit-null
+ 2001:db8::5/128 30 - rt2 16051
+ 2001:db8::6/128 40 - rt3 20061
+ 2001:db8::7/128 40 - rt4 16071
+ 2001:db8::8/128 40 - rt2 16081
test# test isis topology 11 root rt1 spf
IS-IS paths to level-1 routers that speak IP
@@ -506,14 +520,15 @@ rt6 TE-IS 30 rt2 - rt4(4) IS-IS L1 IPv4 routing table:
- Prefix Metric Interface Nexthop Label(s)
- -----------------------------------------------------
- 10.0.255.2/32 20 - rt2 -
- 10.0.255.3/32 20 - rt3 -
- 10.0.255.4/32 30 - rt2 -
- 10.0.255.5/32 30 - rt3 -
- 10.0.255.6/32 40 - rt2 -
- - rt3 -
+ Prefix Metric Interface Nexthop Label(s)
+ ----------------------------------------------------------
+ 10.0.255.1/32 0 - - -
+ 10.0.255.2/32 20 - rt2 implicit-null
+ 10.0.255.3/32 20 - rt3 implicit-null
+ 10.0.255.4/32 30 - rt2 16040
+ 10.0.255.5/32 30 - rt3 16050
+ 10.0.255.6/32 40 - rt2 16060
+ - rt3 16060
IS-IS paths to level-1 routers that speak IPv6
Vertex Type Metric Next-Hop Interface Parent
@@ -535,14 +550,15 @@ rt6 TE-IS 30 rt2 - rt4(4) IS-IS L1 IPv6 routing table:
- Prefix Metric Interface Nexthop Label(s)
- -------------------------------------------------------
- 2001:db8::2/128 20 - rt2 -
- 2001:db8::3/128 20 - rt3 -
- 2001:db8::4/128 30 - rt2 -
- 2001:db8::5/128 30 - rt3 -
- 2001:db8::6/128 40 - rt2 -
- - rt3 -
+ Prefix Metric Interface Nexthop Label(s)
+ ------------------------------------------------------------
+ 2001:db8::1/128 0 - - -
+ 2001:db8::2/128 20 - rt2 implicit-null
+ 2001:db8::3/128 20 - rt3 implicit-null
+ 2001:db8::4/128 30 - rt2 16041
+ 2001:db8::5/128 30 - rt3 16051
+ 2001:db8::6/128 40 - rt2 16061
+ - rt3 16061
test# test isis topology 12 root rt1 spf ipv4-only
IS-IS paths to level-1 routers that speak IP
@@ -570,17 +586,18 @@ rt10 TE-IS 50 rt2 - rt8(4) IS-IS L1 IPv4 routing table:
- Prefix Metric Interface Nexthop Label(s)
- ------------------------------------------------------
- 10.0.255.2/32 20 - rt2 -
- 10.0.255.3/32 20 - rt3 -
- 10.0.255.4/32 30 - rt2 -
- 10.0.255.5/32 30 - rt3 -
- 10.0.255.6/32 40 - rt2 -
- 10.0.255.7/32 40 - rt3 -
- 10.0.255.8/32 50 - rt2 -
- 10.0.255.9/32 50 - rt3 -
- 10.0.255.10/32 60 - rt2 -
+ Prefix Metric Interface Nexthop Label(s)
+ -----------------------------------------------------------
+ 10.0.255.1/32 0 - - -
+ 10.0.255.2/32 20 - rt2 implicit-null
+ 10.0.255.3/32 20 - rt3 implicit-null
+ 10.0.255.4/32 30 - rt2 16040
+ 10.0.255.5/32 30 - rt3 16050
+ 10.0.255.6/32 40 - rt2 16060
+ 10.0.255.7/32 40 - rt3 16070
+ 10.0.255.8/32 50 - rt2 16080
+ 10.0.255.9/32 50 - rt3 16090
+ 10.0.255.10/32 60 - rt2 16100
test# test isis topology 13 root rt1 spf ipv4-only
IS-IS paths to level-1 routers that speak IP
@@ -605,15 +622,16 @@ rt7 TE-IS 30 rt3 - rt5(4) IS-IS L1 IPv4 routing table:
- Prefix Metric Interface Nexthop Label(s)
- -----------------------------------------------------
- 10.0.255.2/32 20 - rt2 -
- 10.0.255.3/32 20 - rt3 -
- 10.0.255.4/32 30 - rt2 -
- - rt3 -
- 10.0.255.5/32 30 - rt3 -
- 10.0.255.6/32 30 - rt3 -
- 10.0.255.7/32 40 - rt3 -
+ Prefix Metric Interface Nexthop Label(s)
+ ----------------------------------------------------------
+ 10.0.255.1/32 0 - - -
+ 10.0.255.2/32 20 - rt2 implicit-null
+ 10.0.255.3/32 20 - rt3 implicit-null
+ 10.0.255.4/32 30 - rt2 16040
+ - rt3 16040
+ 10.0.255.5/32 30 - rt3 16050
+ 10.0.255.6/32 30 - rt3 16060
+ 10.0.255.7/32 40 - rt3 16070
test#
test# test isis topology 4 root rt1 reverse-spf ipv4-only
@@ -638,15 +656,16 @@ rt8 TE-IS 40 rt2 - rt6(4) IS-IS L1 IPv4 routing table:
- Prefix Metric Interface Nexthop Label(s)
- -----------------------------------------------------
- 10.0.255.2/32 20 - rt2 -
- 10.0.255.3/32 20 - rt3 -
- 10.0.255.4/32 30 - rt2 -
- 10.0.255.5/32 30 - rt3 -
- 10.0.255.6/32 40 - rt2 -
- 10.0.255.7/32 40 - rt3 -
- 10.0.255.8/32 50 - rt2 -
+ Prefix Metric Interface Nexthop Label(s)
+ ----------------------------------------------------------
+ 10.0.255.1/32 0 - - -
+ 10.0.255.2/32 20 - rt2 implicit-null
+ 10.0.255.3/32 20 - rt3 implicit-null
+ 10.0.255.4/32 30 - rt2 16040
+ 10.0.255.5/32 30 - rt3 16050
+ 10.0.255.6/32 40 - rt2 16060
+ 10.0.255.7/32 40 - rt3 16070
+ 10.0.255.8/32 50 - rt2 16080
test# test isis topology 11 root rt1 reverse-spf
IS-IS paths to level-1 routers that speak IP
@@ -668,11 +687,12 @@ rt6 TE-IS 30 rt3 - rt4(4) IS-IS L1 IPv4 routing table:
- Prefix Metric Interface Nexthop Label(s)
- -----------------------------------------------------
- 10.0.255.3/32 20 - rt3 -
- 10.0.255.5/32 30 - rt3 -
- 10.0.255.6/32 40 - rt3 -
+ Prefix Metric Interface Nexthop Label(s)
+ ----------------------------------------------------------
+ 10.0.255.1/32 0 - - -
+ 10.0.255.3/32 20 - rt3 implicit-null
+ 10.0.255.5/32 30 - rt3 16050
+ 10.0.255.6/32 40 - rt3 16060
IS-IS paths to level-1 routers that speak IPv6
Vertex Type Metric Next-Hop Interface Parent
@@ -693,11 +713,12 @@ rt6 TE-IS 30 rt3 - rt4(4) IS-IS L1 IPv6 routing table:
- Prefix Metric Interface Nexthop Label(s)
- -------------------------------------------------------
- 2001:db8::3/128 20 - rt3 -
- 2001:db8::5/128 30 - rt3 -
- 2001:db8::6/128 40 - rt3 -
+ Prefix Metric Interface Nexthop Label(s)
+ ------------------------------------------------------------
+ 2001:db8::1/128 0 - - -
+ 2001:db8::3/128 20 - rt3 implicit-null
+ 2001:db8::5/128 30 - rt3 16051
+ 2001:db8::6/128 40 - rt3 16061
test#
test# test isis topology 1 root rt1 ti-lfa system-id rt2
@@ -732,10 +753,10 @@ rt2 TE-IS 50 rt3 - rt4(4) IS-IS L1 IPv4 routing table:
- Prefix Metric Interface Nexthop Label(s)
- -----------------------------------------------------
- 10.0.255.2/32 60 - rt3 16060
- 10.0.255.4/32 50 - rt3 16060
+ Prefix Metric Interface Nexthop Label(s)
+ --------------------------------------------------------
+ 10.0.255.2/32 60 - rt3 16060/16020
+ 10.0.255.4/32 50 - rt3 16060/16040
P-space (self):
rt3
@@ -768,10 +789,10 @@ rt2 TE-IS 50 rt3 - rt4(4) IS-IS L1 IPv6 routing table:
- Prefix Metric Interface Nexthop Label(s)
- -------------------------------------------------------
- 2001:db8::2/128 60 - rt3 16061
- 2001:db8::4/128 50 - rt3 16061
+ Prefix Metric Interface Nexthop Label(s)
+ ----------------------------------------------------------
+ 2001:db8::2/128 60 - rt3 16061/16021
+ 2001:db8::4/128 50 - rt3 16061/16041
test# test isis topology 2 root rt1 ti-lfa system-id rt3
P-space (self):
@@ -818,9 +839,9 @@ rt3 TE-IS 50 rt5 - rt5(4) IS-IS L1 IPv4 routing table:
- Prefix Metric Interface Nexthop Label(s)
- -----------------------------------------------------
- 10.0.255.3/32 60 - rt5 16050/18
+ Prefix Metric Interface Nexthop Label(s)
+ -----------------------------------------------------------
+ 10.0.255.3/32 60 - rt5 16050/18/16030
P-space (self):
rt2
@@ -866,9 +887,9 @@ rt3 TE-IS 50 rt5 - rt5(4) IS-IS L1 IPv6 routing table:
- Prefix Metric Interface Nexthop Label(s)
- -------------------------------------------------------
- 2001:db8::3/128 60 - rt5 16051/19
+ Prefix Metric Interface Nexthop Label(s)
+ -------------------------------------------------------------
+ 2001:db8::3/128 60 - rt5 16051/19/16031
test# test isis topology 2 root rt1 ti-lfa system-id rt1 pseudonode-id 1
P-space (self):
@@ -906,11 +927,11 @@ rt5 TE-IS 65 rt2 - rt1(2) IS-IS L1 IPv4 routing table:
- Prefix Metric Interface Nexthop Label(s)
- -----------------------------------------------------
- 10.0.255.4/32 65 - rt2 16020/18
- 10.0.255.5/32 75 - rt2 16020/18
- 10.0.255.6/32 75 - rt2 16020/18
+ Prefix Metric Interface Nexthop Label(s)
+ -----------------------------------------------------------
+ 10.0.255.4/32 65 - rt2 16020/18/16040
+ 10.0.255.5/32 75 - rt2 16020/18/16050
+ 10.0.255.6/32 75 - rt2 16020/18/16060
P-space (self):
rt2
@@ -947,11 +968,11 @@ rt5 TE-IS 65 rt2 - rt1(2) IS-IS L1 IPv6 routing table:
- Prefix Metric Interface Nexthop Label(s)
- -------------------------------------------------------
- 2001:db8::4/128 65 - rt2 16021/19
- 2001:db8::5/128 75 - rt2 16021/19
- 2001:db8::6/128 75 - rt2 16021/19
+ Prefix Metric Interface Nexthop Label(s)
+ -------------------------------------------------------------
+ 2001:db8::4/128 65 - rt2 16021/19/16041
+ 2001:db8::5/128 75 - rt2 16021/19/16051
+ 2001:db8::6/128 75 - rt2 16021/19/16061
test# test isis topology 2 root rt5 ti-lfa system-id rt1 pseudonode-id 1
P-space (self):
@@ -992,11 +1013,11 @@ rt2 TE-IS 45 rt6 - rt1(4) IS-IS L1 IPv4 routing table:
- Prefix Metric Interface Nexthop Label(s)
- -----------------------------------------------------
- 10.0.255.1/32 40 - rt6 16040
- 10.0.255.2/32 55 - rt6 16040
- 10.0.255.4/32 30 - rt6 -
+ Prefix Metric Interface Nexthop Label(s)
+ --------------------------------------------------------
+ 10.0.255.1/32 40 - rt6 16040/16010
+ 10.0.255.2/32 55 - rt6 16040/16020
+ 10.0.255.4/32 30 - rt6 16040
P-space (self):
rt6
@@ -1036,11 +1057,11 @@ rt2 TE-IS 45 rt6 - rt1(4) IS-IS L1 IPv6 routing table:
- Prefix Metric Interface Nexthop Label(s)
- -------------------------------------------------------
- 2001:db8::1/128 40 - rt6 16041
- 2001:db8::2/128 55 - rt6 16041
- 2001:db8::4/128 30 - rt6 -
+ Prefix Metric Interface Nexthop Label(s)
+ ----------------------------------------------------------
+ 2001:db8::1/128 40 - rt6 16041/16011
+ 2001:db8::2/128 55 - rt6 16041/16021
+ 2001:db8::4/128 30 - rt6 16041
test# test isis topology 3 root rt5 ti-lfa system-id rt4 ipv4-only
P-space (self):
@@ -1088,10 +1109,10 @@ IS-IS L1 IPv4 routing table: Prefix Metric Interface Nexthop Label(s)
-----------------------------------------------------
- 10.0.255.1/32 50 - rt3 -
- - rt6 -
- 10.0.255.2/32 40 - rt6 -
- 10.0.255.4/32 30 - rt6 -
+ 10.0.255.1/32 50 - rt3 16010
+ - rt6 16010
+ 10.0.255.2/32 40 - rt6 16020
+ 10.0.255.4/32 30 - rt6 16040
test# test isis topology 3 root rt5 ti-lfa system-id rt3 ipv4-only
P-space (self):
@@ -1176,12 +1197,12 @@ rt2 TE-IS 90 rt3 - rt4(4) IS-IS L1 IPv4 routing table:
- Prefix Metric Interface Nexthop Label(s)
- -----------------------------------------------------
- 10.0.255.2/32 100 - rt3 16050/17
- 10.0.255.4/32 90 - rt3 16050/17
- 10.0.255.6/32 80 - rt3 16050/17
- 10.0.255.8/32 90 - rt3 16050/17
+ Prefix Metric Interface Nexthop Label(s)
+ -----------------------------------------------------------
+ 10.0.255.2/32 100 - rt3 16050/17/16020
+ 10.0.255.4/32 90 - rt3 16050/17/16040
+ 10.0.255.6/32 80 - rt3 16050/17/16060
+ 10.0.255.8/32 90 - rt3 16050/17/16080
test# test isis topology 4 root rt4 ti-lfa system-id rt6 ipv4-only
P-space (self):
@@ -1223,10 +1244,10 @@ rt8 TE-IS 100 rt2 - rt6(4) IS-IS L1 IPv4 routing table:
- Prefix Metric Interface Nexthop Label(s)
- -----------------------------------------------------
- 10.0.255.6/32 100 - rt2 16050/17
- 10.0.255.8/32 110 - rt2 16050/17
+ Prefix Metric Interface Nexthop Label(s)
+ -----------------------------------------------------------
+ 10.0.255.6/32 100 - rt2 16050/17/16060
+ 10.0.255.8/32 110 - rt2 16050/17/16080
test# test isis topology 5 root rt1 ti-lfa system-id rt2 ipv4-only
P-space (self):
@@ -1267,11 +1288,11 @@ rt2 TE-IS 70 rt3 - rt4(4) IS-IS L1 IPv4 routing table:
- Prefix Metric Interface Nexthop Label(s)
- -----------------------------------------------------
- 10.0.255.2/32 80 - rt3 16080
- 10.0.255.4/32 70 - rt3 16080
- 10.0.255.6/32 60 - rt3 16080
+ Prefix Metric Interface Nexthop Label(s)
+ --------------------------------------------------------
+ 10.0.255.2/32 80 - rt3 16080/16020
+ 10.0.255.4/32 70 - rt3 16080/16040
+ 10.0.255.6/32 60 - rt3 16080/16060
test# test isis topology 6 root rt4 ti-lfa system-id rt3 ipv4-only
P-space (self):
@@ -1317,9 +1338,9 @@ rt7 TE-IS 30 rt6 - rt5(4) IS-IS L1 IPv4 routing table:
- Prefix Metric Interface Nexthop Label(s)
- -----------------------------------------------------
- 10.0.255.3/32 40 - rt2 16010
+ Prefix Metric Interface Nexthop Label(s)
+ --------------------------------------------------------
+ 10.0.255.3/32 40 - rt2 16010/16030
test# test isis topology 7 root rt11 ti-lfa system-id rt8 ipv4-only
P-space (self):
@@ -1378,16 +1399,16 @@ rt3 TE-IS 60 rt12 - rt6(4) IS-IS L1 IPv4 routing table:
- Prefix Metric Interface Nexthop Label(s)
- -----------------------------------------------------
- 10.0.255.1/32 60 - rt10 -
- 10.0.255.2/32 60 - rt12 16090
- 10.0.255.3/32 70 - rt12 16090
- 10.0.255.4/32 50 - rt10 -
- 10.0.255.5/32 50 - rt12 16090
- 10.0.255.6/32 60 - rt12 16090
- 10.0.255.7/32 40 - rt10 -
- 10.0.255.8/32 40 - rt12 16090
+ Prefix Metric Interface Nexthop Label(s)
+ --------------------------------------------------------
+ 10.0.255.1/32 60 - rt10 16010
+ 10.0.255.2/32 60 - rt12 16090/16020
+ 10.0.255.3/32 70 - rt12 16090/16030
+ 10.0.255.4/32 50 - rt10 16040
+ 10.0.255.5/32 50 - rt12 16090/16050
+ 10.0.255.6/32 60 - rt12 16090/16060
+ 10.0.255.7/32 40 - rt10 16070
+ 10.0.255.8/32 40 - rt12 16090/16080
test# test isis topology 7 root rt6 ti-lfa system-id rt5 ipv4-only
P-space (self):
@@ -1458,19 +1479,19 @@ rt10 TE-IS 60 rt9 - rt11(4) IS-IS L1 IPv4 routing table:
- Prefix Metric Interface Nexthop Label(s)
- ------------------------------------------------------
- 10.0.255.1/32 60 - rt3 16020
- 10.0.255.4/32 50 - rt3 16020
- 10.0.255.5/32 40 - rt3 16020
- 10.0.255.7/32 60 - rt9 -
- - rt3 -
- 10.0.255.8/32 50 - rt9 -
- - rt3 -
- 10.0.255.10/32 70 - rt9 -
- - rt3 -
- 10.0.255.11/32 60 - rt9 -
- - rt3 -
+ Prefix Metric Interface Nexthop Label(s)
+ ---------------------------------------------------------
+ 10.0.255.1/32 60 - rt3 16020/16010
+ 10.0.255.4/32 50 - rt3 16020/16040
+ 10.0.255.5/32 40 - rt3 16020/16050
+ 10.0.255.7/32 60 - rt9 16070
+ - rt3 16070
+ 10.0.255.8/32 50 - rt9 16080
+ - rt3 16080
+ 10.0.255.10/32 70 - rt9 16100
+ - rt3 16100
+ 10.0.255.11/32 60 - rt9 16110
+ - rt3 16110
test# test isis topology 8 root rt2 ti-lfa system-id rt1 ipv4-only
P-space (self):
@@ -1532,12 +1553,12 @@ rt1 TE-IS 90 rt5 - rt4(4) IS-IS L1 IPv4 routing table:
- Prefix Metric Interface Nexthop Label(s)
- ------------------------------------------------------
- 10.0.255.1/32 100 - rt5 16110/17
- 10.0.255.4/32 90 - rt5 16110/17
- 10.0.255.7/32 80 - rt5 16110/17
- 10.0.255.10/32 70 - rt5 16110/17
+ Prefix Metric Interface Nexthop Label(s)
+ ------------------------------------------------------------
+ 10.0.255.1/32 100 - rt5 16110/17/16010
+ 10.0.255.4/32 90 - rt5 16110/17/16040
+ 10.0.255.7/32 80 - rt5 16110/17/16070
+ 10.0.255.10/32 70 - rt5 16110/17/16100
test# test isis topology 8 root rt2 ti-lfa system-id rt5 ipv4-only
P-space (self):
@@ -1595,13 +1616,13 @@ rt12 TE-IS 60 rt3 - rt9(4) IS-IS L1 IPv4 routing table:
- Prefix Metric Interface Nexthop Label(s)
- ------------------------------------------------------
- 10.0.255.5/32 40 - rt3 16060
- 10.0.255.8/32 50 - rt3 16060
- 10.0.255.9/32 60 - rt3 16060
- 10.0.255.11/32 60 - rt3 16060
- 10.0.255.12/32 70 - rt3 16060
+ Prefix Metric Interface Nexthop Label(s)
+ ---------------------------------------------------------
+ 10.0.255.5/32 40 - rt3 16060/16050
+ 10.0.255.8/32 50 - rt3 16060/16080
+ 10.0.255.9/32 60 - rt3 16060/16090
+ 10.0.255.11/32 60 - rt3 16060/16110
+ 10.0.255.12/32 70 - rt3 16060/16120
test# test isis topology 9 root rt1 ti-lfa system-id rt3
P-space (self):
@@ -1651,9 +1672,9 @@ rt3 TE-IS 120 rt2 - rt4(4) IS-IS L1 IPv4 routing table:
- Prefix Metric Interface Nexthop Label(s)
- -----------------------------------------------------
- 10.0.255.3/32 130 - rt2 16040/18
+ Prefix Metric Interface Nexthop Label(s)
+ -----------------------------------------------------------
+ 10.0.255.3/32 130 - rt2 16040/18/16030
P-space (self):
rt2
@@ -1702,9 +1723,9 @@ rt3 TE-IS 120 rt2 - rt4(4) IS-IS L1 IPv6 routing table:
- Prefix Metric Interface Nexthop Label(s)
- -------------------------------------------------------
- 2001:db8::3/128 130 - rt2 16041/19
+ Prefix Metric Interface Nexthop Label(s)
+ -------------------------------------------------------------
+ 2001:db8::3/128 130 - rt2 16041/19/16031
test# test isis topology 9 root rt1 ti-lfa system-id rt2
P-space (self):
@@ -1748,15 +1769,15 @@ rt8 TE-IS 140 rt3 - rt4(4) IS-IS L1 IPv4 routing table:
- Prefix Metric Interface Nexthop Label(s)
- -----------------------------------------------------
- 10.0.255.2/32 130 - rt3 16030/18
- 10.0.255.4/32 120 - rt3 16030/18
- 10.0.255.5/32 130 - rt3 16030/18
- 10.0.255.6/32 150 - rt3 16030/18
- 10.0.255.7/32 150 - rt3 16030/18
- 10.0.255.8/32 150 - rt3 16030/18
- 10.0.255.9/32 140 - rt3 16030/18
+ Prefix Metric Interface Nexthop Label(s)
+ -----------------------------------------------------------
+ 10.0.255.2/32 130 - rt3 16030/18/16020
+ 10.0.255.4/32 120 - rt3 16030/18/16040
+ 10.0.255.5/32 130 - rt3 16030/18/16050
+ 10.0.255.6/32 150 - rt3 16030/18/16060
+ 10.0.255.7/32 150 - rt3 16030/18/16070
+ 10.0.255.8/32 150 - rt3 16030/18/16080
+ 10.0.255.9/32 140 - rt3 16030/18/16090
P-space (self):
rt3
@@ -1799,15 +1820,15 @@ rt8 TE-IS 140 rt3 - rt4(4) IS-IS L1 IPv6 routing table:
- Prefix Metric Interface Nexthop Label(s)
- -------------------------------------------------------
- 2001:db8::2/128 130 - rt3 16031/19
- 2001:db8::4/128 120 - rt3 16031/19
- 2001:db8::5/128 130 - rt3 16031/19
- 2001:db8::6/128 150 - rt3 16031/19
- 2001:db8::7/128 150 - rt3 16031/19
- 2001:db8::8/128 150 - rt3 16031/19
- 2001:db8::9/128 140 - rt3 16031/19
+ Prefix Metric Interface Nexthop Label(s)
+ -------------------------------------------------------------
+ 2001:db8::2/128 130 - rt3 16031/19/16021
+ 2001:db8::4/128 120 - rt3 16031/19/16041
+ 2001:db8::5/128 130 - rt3 16031/19/16051
+ 2001:db8::6/128 150 - rt3 16031/19/16061
+ 2001:db8::7/128 150 - rt3 16031/19/16071
+ 2001:db8::8/128 150 - rt3 16031/19/16081
+ 2001:db8::9/128 140 - rt3 16031/19/16091
test# test isis topology 9 root rt9 ti-lfa system-id rt5
P-space (self):
@@ -1874,23 +1895,23 @@ rt3 TE-IS 70 rt6 - rt1(4) IS-IS L1 IPv4 routing table:
- Prefix Metric Interface Nexthop Label(s)
- -----------------------------------------------------
- 10.0.255.1/32 70 - rt6 16060/16
- - rt7 16070/16
- - rt8 16080/16
- 10.0.255.2/32 60 - rt6 16060/16
- - rt7 16070/16
- - rt8 16080/16
- 10.0.255.3/32 80 - rt6 16060/16
- - rt7 16070/16
- - rt8 16080/16
- 10.0.255.4/32 50 - rt6 16060/16
- - rt7 16070/16
- - rt8 16080/16
- 10.0.255.5/32 60 - rt6 16060/16
- - rt7 16070/16
- - rt8 16080/16
+ Prefix Metric Interface Nexthop Label(s)
+ -----------------------------------------------------------
+ 10.0.255.1/32 70 - rt6 16060/16/16010
+ - rt7 16070/16/16010
+ - rt8 16080/16/16010
+ 10.0.255.2/32 60 - rt6 16060/16/16020
+ - rt7 16070/16/16020
+ - rt8 16080/16/16020
+ 10.0.255.3/32 80 - rt6 16060/16/16030
+ - rt7 16070/16/16030
+ - rt8 16080/16/16030
+ 10.0.255.4/32 50 - rt6 16060/16/16040
+ - rt7 16070/16/16040
+ - rt8 16080/16/16040
+ 10.0.255.5/32 60 - rt6 16060/16/16050
+ - rt7 16070/16/16050
+ - rt8 16080/16/16050
P-space (self):
rt6
@@ -1956,23 +1977,23 @@ rt3 TE-IS 70 rt6 - rt1(4) IS-IS L1 IPv6 routing table:
- Prefix Metric Interface Nexthop Label(s)
- -------------------------------------------------------
- 2001:db8::1/128 70 - rt6 16061/17
- - rt7 16071/17
- - rt8 16081/17
- 2001:db8::2/128 60 - rt6 16061/17
- - rt7 16071/17
- - rt8 16081/17
- 2001:db8::3/128 80 - rt6 16061/17
- - rt7 16071/17
- - rt8 16081/17
- 2001:db8::4/128 50 - rt6 16061/17
- - rt7 16071/17
- - rt8 16081/17
- 2001:db8::5/128 60 - rt6 16061/17
- - rt7 16071/17
- - rt8 16081/17
+ Prefix Metric Interface Nexthop Label(s)
+ -------------------------------------------------------------
+ 2001:db8::1/128 70 - rt6 16061/17/16011
+ - rt7 16071/17/16011
+ - rt8 16081/17/16011
+ 2001:db8::2/128 60 - rt6 16061/17/16021
+ - rt7 16071/17/16021
+ - rt8 16081/17/16021
+ 2001:db8::3/128 80 - rt6 16061/17/16031
+ - rt7 16071/17/16031
+ - rt8 16081/17/16031
+ 2001:db8::4/128 50 - rt6 16061/17/16041
+ - rt7 16071/17/16041
+ - rt8 16081/17/16041
+ 2001:db8::5/128 60 - rt6 16061/17/16051
+ - rt7 16071/17/16051
+ - rt8 16081/17/16051
test# test isis topology 9 root rt9 ti-lfa system-id rt8
P-space (self):
@@ -2023,9 +2044,9 @@ rt3 TE-IS 50 rt5 - rt1(4) IS-IS L1 IPv4 routing table:
- Prefix Metric Interface Nexthop Label(s)
- -----------------------------------------------------
- 10.0.255.8/32 60 - rt5 16040/26
+ Prefix Metric Interface Nexthop Label(s)
+ -----------------------------------------------------------
+ 10.0.255.8/32 60 - rt5 16040/26/16080
P-space (self):
rt1
@@ -2075,9 +2096,9 @@ rt3 TE-IS 50 rt5 - rt1(4) IS-IS L1 IPv6 routing table:
- Prefix Metric Interface Nexthop Label(s)
- -------------------------------------------------------
- 2001:db8::8/128 60 - rt5 16041/27
+ Prefix Metric Interface Nexthop Label(s)
+ -------------------------------------------------------------
+ 2001:db8::8/128 60 - rt5 16041/27/16081
test# test isis topology 10 root rt1 ti-lfa system-id rt2
P-space (self):
@@ -2126,14 +2147,14 @@ rt2 TE-IS 100 rt3 - rt5(4) IS-IS L1 IPv4 routing table:
- Prefix Metric Interface Nexthop Label(s)
- -----------------------------------------------------
- 10.0.255.2/32 110 - rt3 20060/18
- - rt4 16070/18
- 10.0.255.5/32 100 - rt3 20060/18
- - rt4 16070/18
- 10.0.255.8/32 90 - rt3 20060/18
- - rt4 16070/18
+ Prefix Metric Interface Nexthop Label(s)
+ -----------------------------------------------------------
+ 10.0.255.2/32 110 - rt3 20060/18/16020
+ - rt4 16070/18/16020
+ 10.0.255.5/32 100 - rt3 20060/18/16050
+ - rt4 16070/18/16050
+ 10.0.255.8/32 90 - rt3 20060/18/16080
+ - rt4 16070/18/16080
P-space (self):
rt3
@@ -2181,14 +2202,14 @@ rt2 TE-IS 100 rt3 - rt5(4) IS-IS L1 IPv6 routing table:
- Prefix Metric Interface Nexthop Label(s)
- -------------------------------------------------------
- 2001:db8::2/128 110 - rt3 20061/19
- - rt4 16071/19
- 2001:db8::5/128 100 - rt3 20061/19
- - rt4 16071/19
- 2001:db8::8/128 90 - rt3 20061/19
- - rt4 16071/19
+ Prefix Metric Interface Nexthop Label(s)
+ -------------------------------------------------------------
+ 2001:db8::2/128 110 - rt3 20061/19/16021
+ - rt4 16071/19/16021
+ 2001:db8::5/128 100 - rt3 20061/19/16051
+ - rt4 16071/19/16051
+ 2001:db8::8/128 90 - rt3 20061/19/16081
+ - rt4 16071/19/16081
test# test isis topology 10 root rt1 ti-lfa system-id rt4
P-space (self):
@@ -2232,10 +2253,10 @@ rt4 TE-IS 90 rt2 - rt7(4) IS-IS L1 IPv4 routing table:
- Prefix Metric Interface Nexthop Label(s)
- -----------------------------------------------------
- 10.0.255.4/32 100 - rt2 16080/20
- 10.0.255.7/32 90 - rt2 16080/20
+ Prefix Metric Interface Nexthop Label(s)
+ -----------------------------------------------------------
+ 10.0.255.4/32 100 - rt2 16080/20/16040
+ 10.0.255.7/32 90 - rt2 16080/20/16070
P-space (self):
rt2
@@ -2278,10 +2299,10 @@ rt4 TE-IS 90 rt2 - rt7(4) IS-IS L1 IPv6 routing table:
- Prefix Metric Interface Nexthop Label(s)
- -------------------------------------------------------
- 2001:db8::4/128 100 - rt2 16081/21
- 2001:db8::7/128 90 - rt2 16081/21
+ Prefix Metric Interface Nexthop Label(s)
+ -------------------------------------------------------------
+ 2001:db8::4/128 100 - rt2 16081/21/16041
+ 2001:db8::7/128 90 - rt2 16081/21/16071
test# test isis topology 11 root rt2 ti-lfa system-id rt4
P-space (self):
@@ -2322,13 +2343,13 @@ rt6 TE-IS 70 rt3 - rt5(4) IS-IS L1 IPv4 routing table:
- Prefix Metric Interface Nexthop Label(s)
- -----------------------------------------------------
- 10.0.255.1/32 60 - rt1 -
- 10.0.255.3/32 60 - rt3 -
- 10.0.255.4/32 80 - rt3 16050
- 10.0.255.5/32 70 - rt3 -
- 10.0.255.6/32 80 - rt3 -
+ Prefix Metric Interface Nexthop Label(s)
+ ----------------------------------------------------------
+ 10.0.255.1/32 60 - rt1 implicit-null
+ 10.0.255.3/32 60 - rt3 implicit-null
+ 10.0.255.4/32 80 - rt3 16050/16040
+ 10.0.255.5/32 70 - rt3 16050
+ 10.0.255.6/32 80 - rt3 16060
P-space (self):
@@ -2368,13 +2389,13 @@ rt6 TE-IS 70 rt3 - rt5(4) IS-IS L1 IPv6 routing table:
- Prefix Metric Interface Nexthop Label(s)
- -------------------------------------------------------
- 2001:db8::1/128 60 - rt1 -
- 2001:db8::3/128 60 - rt3 -
- 2001:db8::4/128 80 - rt3 16051
- 2001:db8::5/128 70 - rt3 -
- 2001:db8::6/128 80 - rt3 -
+ Prefix Metric Interface Nexthop Label(s)
+ ------------------------------------------------------------
+ 2001:db8::1/128 60 - rt1 implicit-null
+ 2001:db8::3/128 60 - rt3 implicit-null
+ 2001:db8::4/128 80 - rt3 16051/16041
+ 2001:db8::5/128 70 - rt3 16051
+ 2001:db8::6/128 80 - rt3 16061
test# test isis topology 12 root rt1 ti-lfa system-id rt3 ipv4-only
P-space (self):
@@ -2419,12 +2440,12 @@ rt3 TE-IS 740 rt2 - rt5(4) IS-IS L1 IPv4 routing table:
- Prefix Metric Interface Nexthop Label(s)
- -----------------------------------------------------------
- 10.0.255.3/32 750 - rt2 16080/17/16/16
- 10.0.255.5/32 350 - rt2 16080/17/16
- 10.0.255.7/32 150 - rt2 16080/17
- 10.0.255.9/32 160 - rt2 16080/17/18
+ Prefix Metric Interface Nexthop Label(s)
+ -----------------------------------------------------------------
+ 10.0.255.3/32 750 - rt2 16080/17/16/16/16030
+ 10.0.255.5/32 350 - rt2 16080/17/16/16050
+ 10.0.255.7/32 150 - rt2 16080/17/16070
+ 10.0.255.9/32 160 - rt2 16080/17/18/16090
test# test isis topology 13 root rt1 ti-lfa system-id rt3 ipv4-only
P-space (self):
@@ -2461,12 +2482,12 @@ rt7 TE-IS 50 rt2 - rt5(4) IS-IS L1 IPv4 routing table:
- Prefix Metric Interface Nexthop Label(s)
- -----------------------------------------------------
- 10.0.255.3/32 40 - rt2 16040
- 10.0.255.5/32 50 - rt2 16040
- 10.0.255.6/32 50 - rt2 16040
- 10.0.255.7/32 60 - rt2 16040
+ Prefix Metric Interface Nexthop Label(s)
+ --------------------------------------------------------
+ 10.0.255.3/32 40 - rt2 16040/16030
+ 10.0.255.5/32 50 - rt2 16040/16050
+ 10.0.255.6/32 50 - rt2 16040/16060
+ 10.0.255.7/32 60 - rt2 16040/16070
test# end. diff --git a/tests/lib/test_timer_correctness.c b/tests/lib/test_timer_correctness.c index cbf9b05546..416ea39772 100644 --- a/tests/lib/test_timer_correctness.c +++ b/tests/lib/test_timer_correctness.c @@ -153,7 +153,7 @@ int main(int argc, char **argv) continue; XFREE(MTYPE_TMP, timers[index]->arg); - thread_cancel(timers[index]); + thread_cancel(&timers[index]); timers[index] = NULL; timers_pending--; } diff --git a/tests/lib/test_timer_performance.c b/tests/lib/test_timer_performance.c index 2960e0d81e..45b29b92b1 100644 --- a/tests/lib/test_timer_performance.c +++ b/tests/lib/test_timer_performance.c @@ -59,7 +59,7 @@ int main(int argc, char **argv) thread_add_timer_msec(master, dummy_func, NULL, 0, &timers[i]); } for (i = 0; i < SCHEDULE_TIMERS; i++) - thread_cancel(timers[i]); + thread_cancel(&timers[i]); monotime(&tv_start); @@ -78,8 +78,7 @@ int main(int argc, char **argv) int index; index = prng_rand(prng) % SCHEDULE_TIMERS; - if (timers[index]) - thread_cancel(timers[index]); + thread_cancel(&timers[index]); timers[index] = NULL; } diff --git a/tests/topotests/bgp_aggregate_address_topo1/peer1/exabgp.cfg b/tests/topotests/bgp_aggregate_address_topo1/peer1/exabgp.cfg index 277c6603ad..e0f6ab601f 100644 --- a/tests/topotests/bgp_aggregate_address_topo1/peer1/exabgp.cfg +++ b/tests/topotests/bgp_aggregate_address_topo1/peer1/exabgp.cfg @@ -13,5 +13,9 @@ neighbor 10.0.0.1 { route 192.168.1.1/32 next-hop 10.0.0.2 med 10; route 192.168.1.2/32 next-hop 10.0.0.2 med 10; route 192.168.1.3/32 next-hop 10.0.0.2 med 20; + + route 192.168.2.1/32 next-hop 10.0.0.2; + route 192.168.2.2/32 next-hop 10.0.0.2; + route 192.168.2.3/32 next-hop 10.0.0.2; } } diff --git a/tests/topotests/bgp_aggregate_address_topo1/r1/bgpd.conf b/tests/topotests/bgp_aggregate_address_topo1/r1/bgpd.conf index 4e1406177d..fa52150085 100644 --- a/tests/topotests/bgp_aggregate_address_topo1/r1/bgpd.conf +++ b/tests/topotests/bgp_aggregate_address_topo1/r1/bgpd.conf @@ -1,3 +1,20 @@ +debug bgp updates +! +access-list acl-sup-one seq 5 permit 192.168.2.1/32 +access-list acl-sup-one seq 10 deny any +! +access-list acl-sup-two seq 5 permit 192.168.2.2/32 +access-list acl-sup-two seq 10 deny any +! +access-list acl-sup-three seq 5 permit 192.168.2.3/32 +access-list acl-sup-three seq 10 deny any +! +route-map rm-sup-one permit 10 + match ip address acl-sup-one +! +route-map rm-sup-two permit 10 + match ip address acl-sup-two +! router bgp 65000 no bgp ebgp-requires-policy neighbor 10.0.0.2 remote-as 65001 @@ -8,5 +25,6 @@ router bgp 65000 redistribute connected aggregate-address 192.168.0.0/24 matching-MED-only aggregate-address 192.168.1.0/24 matching-MED-only + aggregate-address 192.168.2.0/24 suppress-map rm-sup-one exit-address-family ! diff --git a/tests/topotests/bgp_aggregate_address_topo1/test_bgp_aggregate_address_topo1.py b/tests/topotests/bgp_aggregate_address_topo1/test_bgp_aggregate_address_topo1.py index d3656b8701..3f3b71dea3 100644 --- a/tests/topotests/bgp_aggregate_address_topo1/test_bgp_aggregate_address_topo1.py +++ b/tests/topotests/bgp_aggregate_address_topo1/test_bgp_aggregate_address_topo1.py @@ -85,6 +85,20 @@ def teardown_module(mod): tgen.stop_topology() +def expect_route(router_name, routes_expected): + "Helper function to avoid repeated code." + tgen = get_topogen() + test_func = functools.partial( + topotest.router_json_cmp, + tgen.gears[router_name], + "show ip route json", + routes_expected, + ) + _, result = topotest.run_and_expect(test_func, None, count=120, wait=1) + assertmsg = '"{}" BGP convergence failure'.format(router_name) + assert result is None, assertmsg + + def test_expect_convergence(): "Test that BGP protocol converged." @@ -185,6 +199,79 @@ aggregate-address 192.168.1.0/24 matching-MED-only summary-only assert result is None, assertmsg +def test_bgp_aggregate_address_suppress_map(): + "Test that the command suppress-map works." + + tgen = get_topogen() + if tgen.routers_have_failure(): + pytest.skip(tgen.errors) + + expect_route('r2', { + "192.168.2.0/24": [{"protocol": "bgp"}], + "192.168.2.1/32": None, + "192.168.2.2/32": [{"protocol": "bgp"}], + "192.168.2.3/32": [{"protocol": "bgp"}], + }) + + # Change route map and test again. + tgen.gears["r1"].vtysh_multicmd( + """ +configure terminal +router bgp 65000 +address-family ipv4 unicast +no aggregate-address 192.168.2.0/24 suppress-map rm-sup-one +aggregate-address 192.168.2.0/24 suppress-map rm-sup-two +""" + ) + + expect_route('r2', { + "192.168.2.0/24": [{"protocol": "bgp"}], + "192.168.2.1/32": [{"protocol": "bgp"}], + "192.168.2.2/32": None, + "192.168.2.3/32": [{"protocol": "bgp"}], + }) + + +def test_bgp_aggregate_address_suppress_map_update_route_map(): + "Test that the suppress-map late route map creation works." + tgen = get_topogen() + if tgen.routers_have_failure(): + pytest.skip(tgen.errors) + + tgen.gears["r1"].vtysh_multicmd( + """ +configure terminal +router bgp 65000 +address-family ipv4 unicast +no aggregate-address 192.168.2.0/24 suppress-map rm-sup-two +aggregate-address 192.168.2.0/24 suppress-map rm-sup-three +""" + ) + + expect_route('r2', { + "192.168.2.0/24": [{"protocol": "bgp"}], + "192.168.2.1/32": [{"protocol": "bgp"}], + "192.168.2.2/32": [{"protocol": "bgp"}], + "192.168.2.3/32": [{"protocol": "bgp"}], + }) + + # Create missing route map and test again. + tgen.gears["r1"].vtysh_multicmd( + """ +configure terminal +route-map rm-sup-three permit 10 +match ip address acl-sup-three +""" + ) + + expect_route('r2', { + "192.168.2.0/24": [{"protocol": "bgp"}], + "192.168.2.1/32": [{"protocol": "bgp"}], + "192.168.2.2/32": [{"protocol": "bgp"}], + "192.168.2.3/32": None, + }) + + def test_memory_leak(): "Run the memory leak test and report results." tgen = get_topogen() diff --git a/tests/topotests/bgp_conditional_advertisement/__init__.py b/tests/topotests/bgp_conditional_advertisement/__init__.py new file mode 100644 index 0000000000..e69de29bb2 --- /dev/null +++ b/tests/topotests/bgp_conditional_advertisement/__init__.py diff --git a/tests/topotests/bgp_conditional_advertisement/r1/bgpd.conf b/tests/topotests/bgp_conditional_advertisement/r1/bgpd.conf new file mode 100644 index 0000000000..633d1832fd --- /dev/null +++ b/tests/topotests/bgp_conditional_advertisement/r1/bgpd.conf @@ -0,0 +1,30 @@ +! +ip prefix-list CUST seq 5 permit 10.139.224.0/20 +ip prefix-list DEFAULT seq 5 permit 0.0.0.0/0 +ip prefix-list PL1 seq 5 permit 192.0.2.1/32 +! +route-map CUST permit 10 + match ip address prefix-list CUST + set community 64671:501 +! +route-map RM1 permit 10 + match ip address prefix-list PL1 + set community 64952:3008 +! +route-map DEF permit 10 + match ip address prefix-list DEFAULT + set community 64848:3011 65011:200 65013:200 +! +router bgp 1 + bgp log-neighbor-changes + no bgp ebgp-requires-policy + neighbor 10.10.10.2 remote-as 2 + ! + address-family ipv4 unicast + network 0.0.0.0/0 route-map DEF + network 192.0.2.1/32 route-map RM1 + network 192.0.2.5/32 + redistribute connected route-map CUST + neighbor 10.10.10.2 soft-reconfiguration inbound + exit-address-family +! diff --git a/tests/topotests/bgp_conditional_advertisement/r1/zebra.conf b/tests/topotests/bgp_conditional_advertisement/r1/zebra.conf new file mode 100644 index 0000000000..bb887e41ad --- /dev/null +++ b/tests/topotests/bgp_conditional_advertisement/r1/zebra.conf @@ -0,0 +1,19 @@ +! +hostname Router1 +! +ip route 0.0.0.0/0 blackhole +ip route 192.0.2.1/32 blackhole +ip route 192.0.2.2/32 blackhole +ip route 192.0.2.3/32 blackhole +ip route 192.0.2.4/32 blackhole +ip route 192.0.2.5/32 blackhole +! +interface r1-eth0 + ip address 10.10.10.1/24 +! +interface lo + ip address 10.139.224.1/20 +! +ip forwarding +ipv6 forwarding +! diff --git a/tests/topotests/bgp_conditional_advertisement/r2/bgpd.conf b/tests/topotests/bgp_conditional_advertisement/r2/bgpd.conf new file mode 100644 index 0000000000..c6147fe658 --- /dev/null +++ b/tests/topotests/bgp_conditional_advertisement/r2/bgpd.conf @@ -0,0 +1,44 @@ +! +ip prefix-list DEFAULT seq 5 permit 192.0.2.5/32 +ip prefix-list DEFAULT seq 10 permit 192.0.2.1/32 +ip prefix-list EXIST seq 5 permit 10.10.10.10/32 +ip prefix-list DEFAULT-ROUTE seq 5 permit 0.0.0.0/0 +ip prefix-list IP1 seq 5 permit 10.139.224.0/20 +ip prefix-list IP2 seq 5 permit 203.0.113.1/32 +! +bgp community-list standard DC-ROUTES seq 5 permit 64952:3008 +bgp community-list standard DC-ROUTES seq 10 permit 64671:501 +bgp community-list standard DC-ROUTES seq 15 permit 64950:3009 +bgp community-list standard DEFAULT-ROUTE seq 5 permit 65013:200 +! +route-map ADV-MAP-1 permit 10 + match ip address prefix-list IP1 +! +route-map ADV-MAP-1 permit 20 + match community DC-ROUTES +! +route-map ADV-MAP-2 permit 10 + match ip address prefix-list IP2 +! +route-map EXIST-MAP permit 10 + match community DEFAULT-ROUTE + match ip address prefix-list DEFAULT-ROUTE +! +route-map RMAP-1 deny 10 + match ip address prefix-list IP1 +! +route-map RMAP-2 deny 10 + match ip address prefix-list IP2 +! +router bgp 2 + bgp log-neighbor-changes + no bgp ebgp-requires-policy + neighbor 10.10.10.1 remote-as 1 + neighbor 10.10.20.3 remote-as 3 + ! + address-family ipv4 unicast + network 203.0.113.1/32 + neighbor 10.10.10.1 soft-reconfiguration inbound + neighbor 10.10.20.3 soft-reconfiguration inbound + exit-address-family +! diff --git a/tests/topotests/bgp_conditional_advertisement/r2/zebra.conf b/tests/topotests/bgp_conditional_advertisement/r2/zebra.conf new file mode 100644 index 0000000000..434ab68e3c --- /dev/null +++ b/tests/topotests/bgp_conditional_advertisement/r2/zebra.conf @@ -0,0 +1,15 @@ +! +hostname Router2 +! +interface r2-eth0 + ip address 10.10.10.2/24 +! +interface r2-eth1 + ip address 10.10.20.2/24 +! +interface lo + ip address 203.0.113.1/32 +! +ip forwarding +ipv6 forwarding +! diff --git a/tests/topotests/bgp_conditional_advertisement/r3/bgpd.conf b/tests/topotests/bgp_conditional_advertisement/r3/bgpd.conf new file mode 100644 index 0000000000..2f4f5068d8 --- /dev/null +++ b/tests/topotests/bgp_conditional_advertisement/r3/bgpd.conf @@ -0,0 +1,11 @@ +! +router bgp 3 + bgp log-neighbor-changes + no bgp ebgp-requires-policy + neighbor 10.10.20.2 remote-as 2 + ! + address-family ipv4 unicast + neighbor 10.10.20.2 soft-reconfiguration inbound + exit-address-family +! + diff --git a/tests/topotests/bgp_conditional_advertisement/r3/zebra.conf b/tests/topotests/bgp_conditional_advertisement/r3/zebra.conf new file mode 100644 index 0000000000..0dadfdb3a9 --- /dev/null +++ b/tests/topotests/bgp_conditional_advertisement/r3/zebra.conf @@ -0,0 +1,12 @@ +! +hostname Router3 +! +interface r3-eth0 + ip address 10.10.20.3/24 +! +interface lo + ip address 198.51.100.1/32 +! +ip forwarding +ipv6 forwarding +! diff --git a/tests/topotests/bgp_conditional_advertisement/test_bgp_conditional_advertisement.py b/tests/topotests/bgp_conditional_advertisement/test_bgp_conditional_advertisement.py new file mode 100644 index 0000000000..0e31ab1995 --- /dev/null +++ b/tests/topotests/bgp_conditional_advertisement/test_bgp_conditional_advertisement.py @@ -0,0 +1,961 @@ +#!/usr/bin/env python + +# +# test_bgp_conditional_advertisement.py +# +# Copyright (c) 2020 by +# Samsung R&D Institute India - Bangalore. +# Madhurilatha Kuruganti +# +# Permission to use, copy, modify, and/or distribute this software +# for any purpose with or without fee is hereby granted, provided +# that the above copyright notice and this permission notice appear +# in all copies. +# +# THE SOFTWARE IS PROVIDED "AS IS" AND NETDEF DISCLAIMS ALL WARRANTIES +# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NETDEF BE LIABLE FOR +# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY +# DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, +# WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS +# ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE +# OF THIS SOFTWARE. +# + +""" +Test BGP conditional advertisement functionality. + + +--------+ +--------+ +--------+ + | | | | | | + | R1 |------------| R2 |------------| R3 | + | | | | | | + +--------+ +--------+ +--------+ + +R2 is DUT and peers with R1 and R3 in default bgp instance. + +Following tests are covered under BGP conditional advertisement functionality. +Conditional advertisement +------------------------- +TC11: R3 BGP convergence, without advertise-map configuration. + All routes are advertised to R3. + +TC21: exist-map routes present in R2's BGP table. + advertise-map routes present in R2's BGP table are advertised to R3. +TC22: exist-map routes not present in R2's BGP table + advertise-map routes present in R2's BGP table are withdrawn from R3. +TC31: non-exist-map routes not present in R2's BGP table + advertise-map routes present in R2's BGP table are advertised to R3. +TC32: non-exist-map routes present in R2's BGP table + advertise-map routes present in R2's BGP table are withdrawn from R3. + +TC41: non-exist-map route-map configuration removed in R2. + advertise-map routes present in R2's BGP table are advertised to R3. +TC42: exist-map route-map configuration removed in R2 + advertise-map routes present in R2's BGP table are withdrawn from R3. + +Conditional advertisement(received routes) along with Route-map Filter +---------------------------------------------------------------------- +TC51: exist-map routes present in R2's BGP table, with route-map filter. + All routes are withdrawn from R3 except advertise-map routes. +TC52: exist-map routes present in R2's BGP table, without route-map filter. + All routes are advertised to R3 including advertise-map routes. +TC53: non-exist-map routes present in R2's BGP table, with route-map filter. + All routes are withdrawn from R3 including advertise-map routes. +TC54: non-exist-map routes present in R2's BGP table, without route-map filter. + All routes are advertised to R3 except advertise-map routes. + +TC61: exist-map routes not present in R2's BGP table, with route-map filter. + All routes are withdrawn from R3 including advertise-map routes. +TC62: exist-map routes not present in R2's BGP table, without route-map filter. + All routes are advertised to R3 except advertise-map routes. +TC63: non-exist-map routes not present in R2's BGP table, with route-map filter. + All routes are withdrawn from R3 except advertise-map routes. +TC64: non-exist-map routes not present in R2's BGP table, without route-map filter. + All routes are advertised to R3 including advertise-map routes. + +Conditional advertisement(attached routes) along with Route-map Filter +----------------------------------------------------------------- +TC71: exist-map routes present in R2's BGP table, with route-map filter. + All routes are withdrawn from R3 except advertise-map routes. +TC72: exist-map routes present in R2's BGP table, without route-map filter. + All routes are advertised to R3 including advertise-map routes. +TC73: non-exist-map routes present in R2's BGP table, with route-map filter. + All routes are withdrawn from R3 including advertise-map routes. +TC74: non-exist-map routes present in R2's BGP table, without route-map filter. + All routes are advertised to R3 except advertise-map routes. + +TC81: exist-map routes not present in R2's BGP table, with route-map filter. + All routes are withdrawn from R3 including advertise-map routes. +TC82: exist-map routes not present in R2's BGP table, without route-map filter. + All routes are advertised to R3 except advertise-map routes. +TC83: non-exist-map routes not present in R2's BGP table, with route-map filter. + All routes are withdrawn from R3 except advertise-map routes. +TC84: non-exist-map routes not present in R2's BGP table, without route-map filter. + All routes are advertised to R3 including advertise-map routes. + +TC91: exist-map routes present in R2's BGP table, with route-map filter and network. + All routes are advertised to R3 including advertise-map routes. +TC92: exist-map routes present in R2's BGP table, with route-map filter and no network. + All routes are advertised to R3 except advertise-map routes. +TC93: non-exist-map routes not present in R2's BGP table, with route-map filter and network. + All routes are advertised to R3 including advertise-map routes. +TC94: non-exist-map routes not present in R2's BGP table, with route-map filter and no network. + All routes are advertised to R3 except advertise-map routes. + +i.e. ++----------------+-------------------------+------------------------+ +| Routes in | exist-map status | advertise-map status | +| BGP table | | | ++----------------+-------------------------+------------------------+ +| Present | Condition matched | Advertise | ++----------------+-------------------------+------------------------+ +| Not Present | Condition not matched | Withdrawn | ++----------------+-------------------------+------------------------+ +| | non-exist-map status | advertise-map status | +| | | | ++----------------+-------------------------+------------------------+ +| Present | Condition matched | Withdrawn | ++----------------+-------------------------+------------------------+ +| Not Present | Condition not matched | Advertise | ++----------------+-------------------------+------------------------+ +Here in this topology, based on the default route presence in R2 and +the configured condition-map (exist-map/non-exist-map) 10.139.224.0/20 +will be either advertised/withdrawn to/from R3. +""" + +import os +import sys +import json +import time +import pytest +import functools + +CWD = os.path.dirname(os.path.realpath(__file__)) +sys.path.append(os.path.join(CWD, "../")) + +# pylint: disable=C0413 +from lib import topotest +from lib.topogen import Topogen, TopoRouter, get_topogen +from lib.topolog import logger +from mininet.topo import Topo + + +class BgpConditionalAdvertisementTopo(Topo): + def build(self, *_args, **_opts): + tgen = get_topogen(self) + + r1 = tgen.add_router("r1") + r2 = tgen.add_router("r2") + r3 = tgen.add_router("r3") + + switch = tgen.add_switch("s1") + switch.add_link(r1) + switch.add_link(r2) + + switch = tgen.add_switch("s2") + switch.add_link(r2) + switch.add_link(r3) + + +def setup_module(mod): + testsuite_run_time = time.asctime(time.localtime(time.time())) + logger.info("Testsuite start time: {}".format(testsuite_run_time)) + logger.info("=" * 40) + + logger.info("Running setup_module to create topology") + + tgen = Topogen(BgpConditionalAdvertisementTopo, mod.__name__) + tgen.start_topology() + + router_list = tgen.routers() + + for i, (rname, router) in enumerate(router_list.items(), 1): + router.load_config( + TopoRouter.RD_ZEBRA, os.path.join(CWD, "{}/zebra.conf".format(rname)) + ) + router.load_config( + TopoRouter.RD_BGP, os.path.join(CWD, "{}/bgpd.conf".format(rname)) + ) + + tgen.start_router() + + logger.info("Running setup_module() done") + + +def teardown_module(mod): + """ + Teardown the pytest environment + * `mod`: module name + """ + + logger.info("Running teardown_module to delete topology") + + tgen = get_topogen() + tgen.stop_topology() + + logger.info( + "Testsuite end time: {}".format(time.asctime(time.localtime(time.time()))) + ) + logger.info("=" * 40) + + +def test_bgp_conditional_advertisement(): + """ + Test BGP conditional advertisement functionality. + """ + + tgen = get_topogen() + if tgen.routers_have_failure(): + pytest.skip(tgen.errors) + + router1 = tgen.gears["r1"] + router2 = tgen.gears["r2"] + router3 = tgen.gears["r3"] + + passed = "PASSED!!!" + failed = "FAILED!!!" + + def _all_routes_advertised(router): + output = json.loads(router.vtysh_cmd("show ip route json")) + expected = { + "0.0.0.0/0": [{"protocol": "bgp"}], + "192.0.2.1/32": [{"protocol": "bgp"}], + "192.0.2.5/32": [{"protocol": "bgp"}], + "10.139.224.0/20": [{"protocol": "bgp"}], + "203.0.113.1/32": [{"protocol": "bgp"}], + } + return topotest.json_cmp(output, expected) + + def _all_routes_withdrawn(router): + output = json.loads(router.vtysh_cmd("show ip route json")) + expected = { + "0.0.0.0/0": None, + "192.0.2.1/32": None, + "192.0.2.5/32": None, + "10.139.224.0/20": None, + "203.0.113.1/32": None, + } + return topotest.json_cmp(output, expected) + + # BGP conditional advertisement with route-maps + # EXIST-MAP, ADV-MAP-1 and RMAP-1 + def _exist_map_routes_present(router): + return _all_routes_advertised(router) + + def _exist_map_routes_not_present(router): + output = json.loads(router.vtysh_cmd("show ip route json")) + expected = { + "0.0.0.0/0": None, + "192.0.2.1/32": None, + "192.0.2.5/32": [{"protocol": "bgp"}], + "10.139.224.0/20": None, + "203.0.113.1/32": [{"protocol": "bgp"}], + } + return topotest.json_cmp(output, expected) + + def _non_exist_map_routes_present(router): + output = json.loads(router.vtysh_cmd("show ip route json")) + expected = { + "0.0.0.0/0": [{"protocol": "bgp"}], + "192.0.2.1/32": None, + "192.0.2.5/32": [{"protocol": "bgp"}], + "10.139.224.0/20": None, + "203.0.113.1/32": [{"protocol": "bgp"}], + } + return topotest.json_cmp(output, expected) + + def _non_exist_map_routes_not_present(router): + output = json.loads(router.vtysh_cmd("show ip route json")) + expected = { + "0.0.0.0/0": None, + "192.0.2.1/32": [{"protocol": "bgp"}], + "192.0.2.5/32": [{"protocol": "bgp"}], + "10.139.224.0/20": [{"protocol": "bgp"}], + "203.0.113.1/32": [{"protocol": "bgp"}], + } + return topotest.json_cmp(output, expected) + + def _exist_map_no_condition_route_map(router): + return _non_exist_map_routes_present(router) + + def _non_exist_map_no_condition_route_map(router): + return _all_routes_advertised(router) + + def _exist_map_routes_present_rmap_filter(router): + output = json.loads(router.vtysh_cmd("show ip route json")) + expected = { + "0.0.0.0/0": None, + "192.0.2.1/32": [{"protocol": "bgp"}], + "192.0.2.5/32": None, + "10.139.224.0/20": [{"protocol": "bgp"}], + "203.0.113.1/32": None, + } + return topotest.json_cmp(output, expected) + + def _exist_map_routes_present_no_rmap_filter(router): + return _all_routes_advertised(router) + + def _non_exist_map_routes_present_rmap_filter(router): + return _all_routes_withdrawn(router) + + def _non_exist_map_routes_present_no_rmap_filter(router): + return _non_exist_map_routes_present(router) + + def _exist_map_routes_not_present_rmap_filter(router): + return _all_routes_withdrawn(router) + + def _exist_map_routes_not_present_no_rmap_filter(router): + return _exist_map_routes_not_present(router) + + def _non_exist_map_routes_not_present_rmap_filter(router): + return _exist_map_routes_present_rmap_filter(router) + + def _non_exist_map_routes_not_present_no_rmap_filter(router): + return _non_exist_map_routes_not_present(router) + + # BGP conditional advertisement with route-maps + # EXIST-MAP, ADV-MAP-2 and RMAP-2 + def _exist_map_routes_not_present_rmap2_filter(router): + return _all_routes_withdrawn(router) + + def _exist_map_routes_not_present_no_rmap2_filter(router): + output = json.loads(router.vtysh_cmd("show ip route json")) + expected = { + "0.0.0.0/0": None, + "192.0.2.1/32": [{"protocol": "bgp"}], + "192.0.2.5/32": [{"protocol": "bgp"}], + "10.139.224.0/20": [{"protocol": "bgp"}], + "203.0.113.1/32": None, + } + return topotest.json_cmp(output, expected) + + def _non_exist_map_routes_not_present_rmap2_filter(router): + output = json.loads(router.vtysh_cmd("show ip route json")) + expected = { + "0.0.0.0/0": None, + "192.0.2.1/32": None, + "192.0.2.5/32": None, + "10.139.224.0/20": None, + "203.0.113.1/32": [{"protocol": "bgp"}], + } + return topotest.json_cmp(output, expected) + + def _non_exist_map_routes_not_present_no_rmap2_filter(router): + return _non_exist_map_routes_not_present(router) + + def _exist_map_routes_present_rmap2_filter(router): + return _non_exist_map_routes_not_present_rmap2_filter(router) + + def _exist_map_routes_present_no_rmap2_filter(router): + return _all_routes_advertised(router) + + def _non_exist_map_routes_present_rmap2_filter(router): + return _all_routes_withdrawn(router) + + def _non_exist_map_routes_present_no_rmap2_filter(router): + output = json.loads(router.vtysh_cmd("show ip route json")) + expected = { + "0.0.0.0/0": [{"protocol": "bgp"}], + "192.0.2.1/32": [{"protocol": "bgp"}], + "192.0.2.5/32": [{"protocol": "bgp"}], + "10.139.224.0/20": [{"protocol": "bgp"}], + "203.0.113.1/32": None, + } + return topotest.json_cmp(output, expected) + + def _exist_map_routes_present_rmap2_network(router): + return _non_exist_map_routes_not_present_rmap2_filter(router) + + def _exist_map_routes_present_rmap2_no_network(router): + return _all_routes_withdrawn(router) + + def _non_exist_map_routes_not_present_rmap2_network(router): + return _non_exist_map_routes_not_present_rmap2_filter(router) + + def _non_exist_map_routes_not_present_rmap2_no_network(router): + return _all_routes_withdrawn(router) + + # TC11: R3 BGP convergence, without advertise-map configuration. + # All routes are advertised to R3. + test_func = functools.partial(_all_routes_advertised, router3) + success, result = topotest.run_and_expect(test_func, None, count=130, wait=1) + + msg = 'TC11: "router3" BGP convergence - ' + assert result is None, msg + failed + + logger.info(msg + passed) + + # TC21: exist-map routes present in R2's BGP table. + # advertise-map routes present in R2's BGP table are advertised to R3. + router2.vtysh_cmd( + """ + configure terminal + router bgp 2 + address-family ipv4 unicast + neighbor 10.10.20.3 advertise-map ADV-MAP-1 exist-map EXIST-MAP + """ + ) + + test_func = functools.partial(_exist_map_routes_present, router3) + success, result = topotest.run_and_expect(test_func, None, count=90, wait=1) + + msg = 'TC21: exist-map routes present in "router2" BGP table - ' + assert result is None, msg + failed + + logger.info(msg + passed) + + # TC22: exist-map routes not present in R2's BGP table + # advertise-map routes present in R2's BGP table are withdrawn from R3. + router1.vtysh_cmd( + """ + configure terminal + router bgp 1 + address-family ipv4 unicast + no network 0.0.0.0/0 route-map DEF + """ + ) + + test_func = functools.partial(_exist_map_routes_not_present, router3) + success, result = topotest.run_and_expect(test_func, None, count=90, wait=1) + + msg = 'TC22: exist-map routes not present in "router2" BGP table - ' + assert result is None, msg + failed + + logger.info(msg + passed) + + # TC31: non-exist-map routes not present in R2's BGP table + # advertise-map routes present in R2's BGP table are advertised to R3. + router2.vtysh_cmd( + """ + configure terminal + router bgp 2 + address-family ipv4 unicast + neighbor 10.10.20.3 advertise-map ADV-MAP-1 non-exist-map EXIST-MAP + """ + ) + + test_func = functools.partial(_non_exist_map_routes_not_present, router3) + success, result = topotest.run_and_expect(test_func, None, count=90, wait=1) + + msg = 'TC31: non-exist-map routes not present in "router2" BGP table - ' + assert result is None, msg + failed + + logger.info(msg + passed) + + # TC32: non-exist-map routes present in R2's BGP table + # advertise-map routes present in R2's BGP table are withdrawn from R3. + router1.vtysh_cmd( + """ + configure terminal + router bgp 1 + address-family ipv4 unicast + network 0.0.0.0/0 route-map DEF + """ + ) + + test_func = functools.partial(_non_exist_map_routes_present, router3) + success, result = topotest.run_and_expect(test_func, None, count=90, wait=1) + + msg = 'TC32: non-exist-map routes present in "router2" BGP table - ' + assert result is None, msg + failed + + logger.info(msg + passed) + + # TC41: non-exist-map route-map configuration removed in R2. + # advertise-map routes present in R2's BGP table are advertised to R3. + router2.vtysh_cmd( + """ + configure terminal + no route-map EXIST-MAP permit 10 + """ + ) + + test_func = functools.partial(_non_exist_map_no_condition_route_map, router3) + success, result = topotest.run_and_expect(test_func, None, count=90, wait=1) + + msg = 'TC41: non-exist-map route-map removed in "router2" - ' + assert result is None, msg + failed + + logger.info(msg + passed) + + # TC42: exist-map route-map configuration removed in R2 + # advertise-map routes present in R2's BGP table are withdrawn from R3. + router2.vtysh_cmd( + """ + configure terminal + router bgp 2 + address-family ipv4 unicast + neighbor 10.10.20.3 advertise-map ADV-MAP-1 exist-map EXIST-MAP + """ + ) + + test_func = functools.partial(_exist_map_no_condition_route_map, router3) + success, result = topotest.run_and_expect(test_func, None, count=90, wait=1) + + msg = 'TC42: exist-map route-map removed in "router2" - ' + assert result is None, msg + failed + + logger.info(msg + passed) + + # TC51: exist-map routes present in R2's BGP table, with route-map filter. + # All routes are withdrawn from R3 except advertise-map routes. + router2.vtysh_cmd( + """ + configure terminal + route-map EXIST-MAP permit 10 + match community DEFAULT-ROUTE + match ip address prefix-list DEFAULT-ROUTE + ! + router bgp 2 + address-family ipv4 unicast + neighbor 10.10.20.3 route-map RMAP-1 out + """ + ) + + test_func = functools.partial(_exist_map_routes_present_rmap_filter, router3) + success, result = topotest.run_and_expect(test_func, None, count=90, wait=1) + + msg = "TC51: exist-map routes present with route-map filter - " + assert result is None, msg + failed + + logger.info(msg + passed) + + # TC52: exist-map routes present in R2's BGP table, no route-map filter. + # All routes are advertised to R3 including advertise-map routes. + router2.vtysh_cmd( + """ + configure terminal + router bgp 2 + address-family ipv4 unicast + no neighbor 10.10.20.3 route-map RMAP-1 out + """ + ) + + test_func = functools.partial(_exist_map_routes_present_no_rmap_filter, router3) + success, result = topotest.run_and_expect(test_func, None, count=90, wait=1) + + msg = "TC52: exist-map routes present, no route-map filter - " + assert result is None, msg + failed + + logger.info(msg + passed) + + # TC53: non-exist-map routes present in R2's BGP table, with route-map filter. + # All routes are withdrawn from R3 including advertise-map routes. + router2.vtysh_cmd( + """ + configure terminal + router bgp 2 + address-family ipv4 unicast + neighbor 10.10.20.3 route-map RMAP-1 out + neighbor 10.10.20.3 advertise-map ADV-MAP-1 non-exist-map EXIST-MAP + """ + ) + + test_func = functools.partial(_non_exist_map_routes_present_rmap_filter, router3) + success, result = topotest.run_and_expect(test_func, None, count=90, wait=1) + + msg = "TC53: non-exist-map routes present, with route-map filter - " + assert result is None, msg + failed + + logger.info(msg + passed) + + # TC54: non-exist-map routes present in R2's BGP table, no route-map filter. + # All routes are advertised to R3 except advertise-map routes. + router2.vtysh_cmd( + """ + configure terminal + router bgp 2 + address-family ipv4 unicast + no neighbor 10.10.20.3 route-map RMAP-1 out + """ + ) + + test_func = functools.partial(_non_exist_map_routes_present_no_rmap_filter, router3) + success, result = topotest.run_and_expect(test_func, None, count=90, wait=1) + + msg = "TC54: non-exist-map routes present, no route-map filter - " + assert result is None, msg + failed + + logger.info(msg + passed) + + # TC61: exist-map routes not present in R2's BGP table, with route-map filter. + # All routes are withdrawn from R3 including advertise-map routes. + router1.vtysh_cmd( + """ + configure terminal + router bgp 1 + address-family ipv4 unicast + no network 0.0.0.0/0 route-map DEF + """ + ) + router2.vtysh_cmd( + """ + configure terminal + router bgp 2 + address-family ipv4 unicast + neighbor 10.10.20.3 route-map RMAP-1 out + neighbor 10.10.20.3 advertise-map ADV-MAP-1 exist-map EXIST-MAP + """ + ) + + test_func = functools.partial(_exist_map_routes_not_present_rmap_filter, router3) + success, result = topotest.run_and_expect(test_func, None, count=90, wait=1) + + msg = "TC61: exist-map routes not present, route-map filter - " + assert result is None, msg + failed + + logger.info(msg + passed) + + # TC62: exist-map routes not present in R2's BGP table, without route-map filter. + # All routes are advertised to R3 except advertise-map routes. + router2.vtysh_cmd( + """ + configure terminal + router bgp 2 + address-family ipv4 unicast + no neighbor 10.10.20.3 route-map RMAP-1 out + """ + ) + + test_func = functools.partial(_exist_map_routes_not_present_no_rmap_filter, router3) + success, result = topotest.run_and_expect(test_func, None, count=90, wait=1) + + msg = "TC62: exist-map routes not present, no route-map filter - " + assert result is None, msg + failed + + logger.info(msg + passed) + + # TC63: non-exist-map routes not present in R2's BGP table, with route-map filter. + # All routes are withdrawn from R3 except advertise-map routes. + router2.vtysh_cmd( + """ + configure terminal + router bgp 2 + address-family ipv4 unicast + neighbor 10.10.20.3 route-map RMAP-1 out + neighbor 10.10.20.3 advertise-map ADV-MAP-1 non-exist-map EXIST-MAP + """ + ) + + test_func = functools.partial( + _non_exist_map_routes_not_present_rmap_filter, router3 + ) + success, result = topotest.run_and_expect(test_func, None, count=90, wait=1) + + msg = "TC63: non-exist-map routes not present, route-map filter - " + assert result is None, msg + failed + + logger.info(msg + passed) + + # TC64: non-exist-map routes not present in R2's BGP table, without route-map filter. + # All routes are advertised to R3 including advertise-map routes. + router2.vtysh_cmd( + """ + configure terminal + router bgp 2 + address-family ipv4 unicast + no neighbor 10.10.20.3 route-map RMAP-1 out + """ + ) + + test_func = functools.partial( + _non_exist_map_routes_not_present_no_rmap_filter, router3 + ) + success, result = topotest.run_and_expect(test_func, None, count=90, wait=1) + + msg = "TC64: non-exist-map routes not present, no route-map filter - " + assert result is None, msg + failed + + logger.info(msg + passed) + + # TC71: exist-map routes present in R2's BGP table, with route-map filter. + # All routes are withdrawn from R3 except advertise-map routes. + router1.vtysh_cmd( + """ + configure terminal + router bgp 1 + address-family ipv4 unicast + network 0.0.0.0/0 route-map DEF + """ + ) + router2.vtysh_cmd( + """ + configure terminal + router bgp 2 + address-family ipv4 unicast + neighbor 10.10.20.3 route-map RMAP-2 out + neighbor 10.10.20.3 advertise-map ADV-MAP-2 exist-map EXIST-MAP + """ + ) + + test_func = functools.partial(_exist_map_routes_present_rmap2_filter, router3) + success, result = topotest.run_and_expect(test_func, None, count=90, wait=1) + + msg = "TC71: exist-map routes present, route-map filter - " + assert result is None, msg + failed + + logger.info(msg + passed) + + # TC72: exist-map routes present in R2's BGP table, without route-map filter. + # All routes are advertised to R3 including advertise-map routes. + router2.vtysh_cmd( + """ + configure terminal + router bgp 2 + address-family ipv4 unicast + no neighbor 10.10.20.3 route-map RMAP-2 out + """ + ) + + test_func = functools.partial(_exist_map_routes_present_no_rmap2_filter, router3) + success, result = topotest.run_and_expect(test_func, None, count=90, wait=1) + + msg = "TC72: exist-map routes present, no route-map filter - " + assert result is None, msg + failed + + logger.info(msg + passed) + + # TC73: non-exist-map routes present in R2's BGP table, with route-map filter. + # All routes are advertised to R3 including advertise-map routes. + router2.vtysh_cmd( + """ + configure terminal + router bgp 2 + address-family ipv4 unicast + neighbor 10.10.20.3 route-map RMAP-2 out + neighbor 10.10.20.3 advertise-map ADV-MAP-2 non-exist-map EXIST-MAP + """ + ) + + test_func = functools.partial(_non_exist_map_routes_present_rmap2_filter, router3) + success, result = topotest.run_and_expect(test_func, None, count=90, wait=1) + + msg = "TC73: non-exist-map routes present, route-map filter - " + assert result is None, msg + failed + + logger.info(msg + passed) + + # TC74: non-exist-map routes present in R2's BGP table, without route-map filter. + # All routes are advertised to R3 including advertise-map routes. + router2.vtysh_cmd( + """ + configure terminal + router bgp 2 + address-family ipv4 unicast + no neighbor 10.10.20.3 route-map RMAP-2 out + """ + ) + + test_func = functools.partial( + _non_exist_map_routes_present_no_rmap2_filter, router3 + ) + success, result = topotest.run_and_expect(test_func, None, count=90, wait=1) + + msg = "TC74: non-exist-map routes present, no route-map filter - " + assert result is None, msg + failed + + logger.info(msg + passed) + + # TC81: exist-map routes not present in R2's BGP table, with route-map filter. + # All routes are withdrawn from R3 including advertise-map routes. + router1.vtysh_cmd( + """ + configure terminal + router bgp 1 + address-family ipv4 unicast + no network 0.0.0.0/0 route-map DEF + """ + ) + router2.vtysh_cmd( + """ + configure terminal + router bgp 2 + address-family ipv4 unicast + neighbor 10.10.20.3 route-map RMAP-2 out + neighbor 10.10.20.3 advertise-map ADV-MAP-2 exist-map EXIST-MAP + """ + ) + + test_func = functools.partial(_exist_map_routes_not_present_rmap2_filter, router3) + success, result = topotest.run_and_expect(test_func, None, count=90, wait=1) + + msg = "TC81: exist-map routes not present, route-map filter - " + assert result is None, msg + failed + + logger.info(msg + passed) + + # TC82: exist-map routes not present in R2's BGP table, without route-map filter. + # All routes are advertised to R3 except advertise-map routes. + router2.vtysh_cmd( + """ + configure terminal + router bgp 2 + address-family ipv4 unicast + no neighbor 10.10.20.3 route-map RMAP-2 out + """ + ) + + test_func = functools.partial( + _exist_map_routes_not_present_no_rmap2_filter, router3 + ) + success, result = topotest.run_and_expect(test_func, None, count=90, wait=1) + + msg = "TC82: exist-map routes not present, no route-map filter - " + assert result is None, msg + failed + + logger.info(msg + passed) + + # TC83: non-exist-map routes not present in R2's BGP table, with route-map filter. + # All routes are advertised to R3 including advertise-map routes. + router2.vtysh_cmd( + """ + configure terminal + router bgp 2 + address-family ipv4 unicast + neighbor 10.10.20.3 route-map RMAP-2 out + neighbor 10.10.20.3 advertise-map ADV-MAP-2 non-exist-map EXIST-MAP + """ + ) + + test_func = functools.partial( + _non_exist_map_routes_not_present_rmap2_filter, router3 + ) + success, result = topotest.run_and_expect(test_func, None, count=90, wait=1) + + msg = "TC83: non-exist-map routes not present, route-map filter - " + assert result is None, msg + failed + + logger.info(msg + passed) + + # TC84: non-exist-map routes not present in R2's BGP table, without route-map filter. + # All routes are advertised to R3 including advertise-map routes. + router2.vtysh_cmd( + """ + configure terminal + router bgp 2 + address-family ipv4 unicast + no neighbor 10.10.20.3 route-map RMAP-2 out + """ + ) + + test_func = functools.partial( + _non_exist_map_routes_not_present_no_rmap2_filter, router3 + ) + success, result = topotest.run_and_expect(test_func, None, count=90, wait=1) + + msg = "TC84: non-exist-map routes not present, no route-map filter - " + assert result is None, msg + failed + + logger.info(msg + passed) + + # TC91: exist-map routes present in R2's BGP table, with route-map filter and network. + # All routes are advertised to R3 including advertise-map routes. + router1.vtysh_cmd( + """ + configure terminal + router bgp 1 + address-family ipv4 unicast + network 0.0.0.0/0 route-map DEF + """ + ) + router2.vtysh_cmd( + """ + configure terminal + router bgp 2 + address-family ipv4 unicast + neighbor 10.10.20.3 route-map RMAP-2 out + neighbor 10.10.20.3 advertise-map ADV-MAP-2 exist-map EXIST-MAP + """ + ) + + test_func = functools.partial(_exist_map_routes_present_rmap2_network, router3) + success, result = topotest.run_and_expect(test_func, None, count=90, wait=1) + + msg = "TC91: exist-map routes present, route-map filter and network - " + assert result is None, msg + failed + + logger.info(msg + passed) + + # TC92: exist-map routes present in R2's BGP table, with route-map filter and no network. + # All routes are advertised to R3 except advertise-map routes. + router2.vtysh_cmd( + """ + configure terminal + router bgp 2 + address-family ipv4 unicast + no network 203.0.113.1/32 + """ + ) + + test_func = functools.partial(_exist_map_routes_present_rmap2_no_network, router3) + success, result = topotest.run_and_expect(test_func, None, count=90, wait=1) + + msg = "TC92: exist-map routes present, route-map filter and no network - " + assert result is None, msg + failed + + logger.info(msg + passed) + + # TC93: non-exist-map routes not present in R2's BGP table, with route-map filter and network. + # All routes are advertised to R3 including advertise-map routes. + router1.vtysh_cmd( + """ + configure terminal + router bgp 1 + address-family ipv4 unicast + no network 0.0.0.0/0 route-map DEF + """ + ) + router2.vtysh_cmd( + """ + configure terminal + router bgp 2 + address-family ipv4 unicast + network 203.0.113.1/32 + neighbor 10.10.20.3 advertise-map ADV-MAP-2 non-exist-map EXIST-MAP + """ + ) + + test_func = functools.partial( + _non_exist_map_routes_not_present_rmap2_network, router3 + ) + success, result = topotest.run_and_expect(test_func, None, count=90, wait=1) + + msg = "TC93: non-exist-map routes not present, route-map filter and network - " + assert result is None, msg + failed + + logger.info(msg + passed) + + # TC94: non-exist-map routes not present in R2's BGP table, with route-map filter and no network. + # All routes are advertised to R3 except advertise-map routes. + router2.vtysh_cmd( + """ + configure terminal + router bgp 2 + address-family ipv4 unicast + no network 203.0.113.1/32 + """ + ) + + test_func = functools.partial( + _non_exist_map_routes_not_present_rmap2_no_network, router3 + ) + success, result = topotest.run_and_expect(test_func, None, count=90, wait=1) + + msg = "TC94: non-exist-map routes not present, route-map filter and no network - " + assert result is None, msg + failed + + logger.info(msg + passed) + + +def test_memory_leak(): + "Run the memory leak test and report results." + tgen = get_topogen() + if not tgen.is_memleak_enabled(): + pytest.skip("Memory leak test/report is disabled") + + tgen.report_memory_leaks() + + +if __name__ == "__main__": + args = ["-s"] + sys.argv[1:] + sys.exit(pytest.main(args)) diff --git a/tests/topotests/isis-sr-topo1/rt1/step1/show_ip_route.ref b/tests/topotests/isis-sr-topo1/rt1/step1/show_ip_route.ref index 6b4a59011a..53bf8cb445 100644 --- a/tests/topotests/isis-sr-topo1/rt1/step1/show_ip_route.ref +++ b/tests/topotests/isis-sr-topo1/rt1/step1/show_ip_route.ref @@ -290,5 +290,38 @@ } ] } + ], + "10.10.10.10\/32":[ + { + "prefix":"10.10.10.10\/32", + "protocol":"isis", + "selected":true, + "destSelected":true, + "distance":115, + "metric":30, + "installed":true, + "nexthops":[ + { + "fib":true, + "ip":"10.0.1.2", + "afi":"ipv4", + "interfaceName":"eth-sw1", + "active":true, + "labels":[ + 16100 + ] + }, + { + "fib":true, + "ip":"10.0.1.3", + "afi":"ipv4", + "interfaceName":"eth-sw1", + "active":true, + "labels":[ + 17100 + ] + } + ] + } ] } diff --git a/tests/topotests/isis-sr-topo1/rt1/step1/show_ipv6_route.ref b/tests/topotests/isis-sr-topo1/rt1/step1/show_ipv6_route.ref index c507688f5b..0b39584717 100644 --- a/tests/topotests/isis-sr-topo1/rt1/step1/show_ipv6_route.ref +++ b/tests/topotests/isis-sr-topo1/rt1/step1/show_ipv6_route.ref @@ -117,5 +117,36 @@ } ] } + ], + "2001:db8:1000::10\/128":[ + { + "prefix":"2001:db8:1000::10\/128", + "protocol":"isis", + "selected":true, + "destSelected":true, + "distance":115, + "metric":30, + "installed":true, + "nexthops":[ + { + "fib":true, + "afi":"ipv6", + "interfaceName":"eth-sw1", + "active":true, + "labels":[ + 16101 + ] + }, + { + "fib":true, + "afi":"ipv6", + "interfaceName":"eth-sw1", + "active":true, + "labels":[ + 17101 + ] + } + ] + } ] } diff --git a/tests/topotests/isis-sr-topo1/rt1/step1/show_mpls_table.ref b/tests/topotests/isis-sr-topo1/rt1/step1/show_mpls_table.ref index 773f5e3d43..5b1950d8cb 100644 --- a/tests/topotests/isis-sr-topo1/rt1/step1/show_mpls_table.ref +++ b/tests/topotests/isis-sr-topo1/rt1/step1/show_mpls_table.ref @@ -130,5 +130,41 @@ "interface":"eth-sw1" } ] + }, + "16100":{ + "inLabel":16100, + "installed":true, + "nexthops":[ + { + "type":"SR (IS-IS)", + "outLabel":16100, + "installed":true, + "nexthop":"10.0.1.2" + }, + { + "type":"SR (IS-IS)", + "outLabel":17100, + "installed":true, + "nexthop":"10.0.1.3" + } + ] + }, + "16101":{ + "inLabel":16101, + "installed":true, + "nexthops":[ + { + "type":"SR (IS-IS)", + "outLabel":16101, + "installed":true, + "interface":"eth-sw1" + }, + { + "type":"SR (IS-IS)", + "outLabel":17101, + "installed":true, + "interface":"eth-sw1" + } + ] } } diff --git a/tests/topotests/isis-sr-topo1/rt1/step10/show_ip_route.ref b/tests/topotests/isis-sr-topo1/rt1/step10/show_ip_route.ref index 6b34d5e4ff..c712538c00 100644 --- a/tests/topotests/isis-sr-topo1/rt1/step10/show_ip_route.ref +++ b/tests/topotests/isis-sr-topo1/rt1/step10/show_ip_route.ref @@ -283,5 +283,38 @@ } ] } + ], + "10.10.10.10\/32":[ + { + "prefix":"10.10.10.10\/32", + "protocol":"isis", + "selected":true, + "destSelected":true, + "distance":115, + "metric":30, + "installed":true, + "nexthops":[ + { + "fib":true, + "ip":"10.0.1.2", + "afi":"ipv4", + "interfaceName":"eth-sw1", + "active":true, + "labels":[ + 16100 + ] + }, + { + "fib":true, + "ip":"10.0.1.3", + "afi":"ipv4", + "interfaceName":"eth-sw1", + "active":true, + "labels":[ + 17100 + ] + } + ] + } ] } diff --git a/tests/topotests/isis-sr-topo1/rt1/step10/show_ipv6_route.ref b/tests/topotests/isis-sr-topo1/rt1/step10/show_ipv6_route.ref index c507688f5b..0b39584717 100644 --- a/tests/topotests/isis-sr-topo1/rt1/step10/show_ipv6_route.ref +++ b/tests/topotests/isis-sr-topo1/rt1/step10/show_ipv6_route.ref @@ -117,5 +117,36 @@ } ] } + ], + "2001:db8:1000::10\/128":[ + { + "prefix":"2001:db8:1000::10\/128", + "protocol":"isis", + "selected":true, + "destSelected":true, + "distance":115, + "metric":30, + "installed":true, + "nexthops":[ + { + "fib":true, + "afi":"ipv6", + "interfaceName":"eth-sw1", + "active":true, + "labels":[ + 16101 + ] + }, + { + "fib":true, + "afi":"ipv6", + "interfaceName":"eth-sw1", + "active":true, + "labels":[ + 17101 + ] + } + ] + } ] } diff --git a/tests/topotests/isis-sr-topo1/rt1/step10/show_mpls_table.ref b/tests/topotests/isis-sr-topo1/rt1/step10/show_mpls_table.ref index 25a48c2bfc..7e6c72627a 100644 --- a/tests/topotests/isis-sr-topo1/rt1/step10/show_mpls_table.ref +++ b/tests/topotests/isis-sr-topo1/rt1/step10/show_mpls_table.ref @@ -152,5 +152,41 @@ "interface":"eth-sw1" } ] + }, + "16100":{ + "inLabel":16100, + "installed":true, + "nexthops":[ + { + "type":"SR (IS-IS)", + "outLabel":16100, + "installed":true, + "nexthop":"10.0.1.2" + }, + { + "type":"SR (IS-IS)", + "outLabel":17100, + "installed":true, + "nexthop":"10.0.1.3" + } + ] + }, + "16101":{ + "inLabel":16101, + "installed":true, + "nexthops":[ + { + "type":"SR (IS-IS)", + "outLabel":16101, + "installed":true, + "interface":"eth-sw1" + }, + { + "type":"SR (IS-IS)", + "outLabel":17101, + "installed":true, + "interface":"eth-sw1" + } + ] } } diff --git a/tests/topotests/isis-sr-topo1/rt1/step2/show_ip_route.ref b/tests/topotests/isis-sr-topo1/rt1/step2/show_ip_route.ref index 6b34d5e4ff..c712538c00 100644 --- a/tests/topotests/isis-sr-topo1/rt1/step2/show_ip_route.ref +++ b/tests/topotests/isis-sr-topo1/rt1/step2/show_ip_route.ref @@ -283,5 +283,38 @@ } ] } + ], + "10.10.10.10\/32":[ + { + "prefix":"10.10.10.10\/32", + "protocol":"isis", + "selected":true, + "destSelected":true, + "distance":115, + "metric":30, + "installed":true, + "nexthops":[ + { + "fib":true, + "ip":"10.0.1.2", + "afi":"ipv4", + "interfaceName":"eth-sw1", + "active":true, + "labels":[ + 16100 + ] + }, + { + "fib":true, + "ip":"10.0.1.3", + "afi":"ipv4", + "interfaceName":"eth-sw1", + "active":true, + "labels":[ + 17100 + ] + } + ] + } ] } diff --git a/tests/topotests/isis-sr-topo1/rt1/step2/show_ipv6_route.ref b/tests/topotests/isis-sr-topo1/rt1/step2/show_ipv6_route.ref index c507688f5b..0b39584717 100644 --- a/tests/topotests/isis-sr-topo1/rt1/step2/show_ipv6_route.ref +++ b/tests/topotests/isis-sr-topo1/rt1/step2/show_ipv6_route.ref @@ -117,5 +117,36 @@ } ] } + ], + "2001:db8:1000::10\/128":[ + { + "prefix":"2001:db8:1000::10\/128", + "protocol":"isis", + "selected":true, + "destSelected":true, + "distance":115, + "metric":30, + "installed":true, + "nexthops":[ + { + "fib":true, + "afi":"ipv6", + "interfaceName":"eth-sw1", + "active":true, + "labels":[ + 16101 + ] + }, + { + "fib":true, + "afi":"ipv6", + "interfaceName":"eth-sw1", + "active":true, + "labels":[ + 17101 + ] + } + ] + } ] } diff --git a/tests/topotests/isis-sr-topo1/rt1/step2/show_mpls_table.ref b/tests/topotests/isis-sr-topo1/rt1/step2/show_mpls_table.ref index 773f5e3d43..5b1950d8cb 100644 --- a/tests/topotests/isis-sr-topo1/rt1/step2/show_mpls_table.ref +++ b/tests/topotests/isis-sr-topo1/rt1/step2/show_mpls_table.ref @@ -130,5 +130,41 @@ "interface":"eth-sw1" } ] + }, + "16100":{ + "inLabel":16100, + "installed":true, + "nexthops":[ + { + "type":"SR (IS-IS)", + "outLabel":16100, + "installed":true, + "nexthop":"10.0.1.2" + }, + { + "type":"SR (IS-IS)", + "outLabel":17100, + "installed":true, + "nexthop":"10.0.1.3" + } + ] + }, + "16101":{ + "inLabel":16101, + "installed":true, + "nexthops":[ + { + "type":"SR (IS-IS)", + "outLabel":16101, + "installed":true, + "interface":"eth-sw1" + }, + { + "type":"SR (IS-IS)", + "outLabel":17101, + "installed":true, + "interface":"eth-sw1" + } + ] } } diff --git a/tests/topotests/isis-sr-topo1/rt1/step3/show_ip_route.ref b/tests/topotests/isis-sr-topo1/rt1/step3/show_ip_route.ref index 05a8498693..71f9ebddfb 100644 --- a/tests/topotests/isis-sr-topo1/rt1/step3/show_ip_route.ref +++ b/tests/topotests/isis-sr-topo1/rt1/step3/show_ip_route.ref @@ -250,5 +250,38 @@ } ] } + ], + "10.10.10.10\/32":[ + { + "prefix":"10.10.10.10\/32", + "protocol":"isis", + "selected":true, + "destSelected":true, + "distance":115, + "metric":30, + "installed":true, + "nexthops":[ + { + "fib":true, + "ip":"10.0.1.2", + "afi":"ipv4", + "interfaceName":"eth-sw1", + "active":true, + "labels":[ + 16100 + ] + }, + { + "fib":true, + "ip":"10.0.1.3", + "afi":"ipv4", + "interfaceName":"eth-sw1", + "active":true, + "labels":[ + 17100 + ] + } + ] + } ] } diff --git a/tests/topotests/isis-sr-topo1/rt1/step3/show_ipv6_route.ref b/tests/topotests/isis-sr-topo1/rt1/step3/show_ipv6_route.ref index d50952c6c4..304c0a475b 100644 --- a/tests/topotests/isis-sr-topo1/rt1/step3/show_ipv6_route.ref +++ b/tests/topotests/isis-sr-topo1/rt1/step3/show_ipv6_route.ref @@ -86,5 +86,36 @@ } ] } + ], + "2001:db8:1000::10\/128":[ + { + "prefix":"2001:db8:1000::10\/128", + "protocol":"isis", + "selected":true, + "destSelected":true, + "distance":115, + "metric":30, + "installed":true, + "nexthops":[ + { + "fib":true, + "afi":"ipv6", + "interfaceName":"eth-sw1", + "active":true, + "labels":[ + 16101 + ] + }, + { + "fib":true, + "afi":"ipv6", + "interfaceName":"eth-sw1", + "active":true, + "labels":[ + 17101 + ] + } + ] + } ] } diff --git a/tests/topotests/isis-sr-topo1/rt1/step3/show_mpls_table.ref b/tests/topotests/isis-sr-topo1/rt1/step3/show_mpls_table.ref index 73f517a6e5..94b3cb6d1a 100644 --- a/tests/topotests/isis-sr-topo1/rt1/step3/show_mpls_table.ref +++ b/tests/topotests/isis-sr-topo1/rt1/step3/show_mpls_table.ref @@ -94,5 +94,41 @@ "interface":"eth-sw1" } ] + }, + "16100":{ + "inLabel":16100, + "installed":true, + "nexthops":[ + { + "type":"SR (IS-IS)", + "outLabel":16100, + "installed":true, + "nexthop":"10.0.1.2" + }, + { + "type":"SR (IS-IS)", + "outLabel":17100, + "installed":true, + "nexthop":"10.0.1.3" + } + ] + }, + "16101":{ + "inLabel":16101, + "installed":true, + "nexthops":[ + { + "type":"SR (IS-IS)", + "outLabel":16101, + "installed":true, + "interface":"eth-sw1" + }, + { + "type":"SR (IS-IS)", + "outLabel":17101, + "installed":true, + "interface":"eth-sw1" + } + ] } } diff --git a/tests/topotests/isis-sr-topo1/rt1/step4/show_ip_route.ref b/tests/topotests/isis-sr-topo1/rt1/step4/show_ip_route.ref index 6b34d5e4ff..c712538c00 100644 --- a/tests/topotests/isis-sr-topo1/rt1/step4/show_ip_route.ref +++ b/tests/topotests/isis-sr-topo1/rt1/step4/show_ip_route.ref @@ -283,5 +283,38 @@ } ] } + ], + "10.10.10.10\/32":[ + { + "prefix":"10.10.10.10\/32", + "protocol":"isis", + "selected":true, + "destSelected":true, + "distance":115, + "metric":30, + "installed":true, + "nexthops":[ + { + "fib":true, + "ip":"10.0.1.2", + "afi":"ipv4", + "interfaceName":"eth-sw1", + "active":true, + "labels":[ + 16100 + ] + }, + { + "fib":true, + "ip":"10.0.1.3", + "afi":"ipv4", + "interfaceName":"eth-sw1", + "active":true, + "labels":[ + 17100 + ] + } + ] + } ] } diff --git a/tests/topotests/isis-sr-topo1/rt1/step4/show_ipv6_route.ref b/tests/topotests/isis-sr-topo1/rt1/step4/show_ipv6_route.ref index c507688f5b..0b39584717 100644 --- a/tests/topotests/isis-sr-topo1/rt1/step4/show_ipv6_route.ref +++ b/tests/topotests/isis-sr-topo1/rt1/step4/show_ipv6_route.ref @@ -117,5 +117,36 @@ } ] } + ], + "2001:db8:1000::10\/128":[ + { + "prefix":"2001:db8:1000::10\/128", + "protocol":"isis", + "selected":true, + "destSelected":true, + "distance":115, + "metric":30, + "installed":true, + "nexthops":[ + { + "fib":true, + "afi":"ipv6", + "interfaceName":"eth-sw1", + "active":true, + "labels":[ + 16101 + ] + }, + { + "fib":true, + "afi":"ipv6", + "interfaceName":"eth-sw1", + "active":true, + "labels":[ + 17101 + ] + } + ] + } ] } diff --git a/tests/topotests/isis-sr-topo1/rt1/step4/show_mpls_table.ref b/tests/topotests/isis-sr-topo1/rt1/step4/show_mpls_table.ref index ac39920ee5..6500a47fbf 100644 --- a/tests/topotests/isis-sr-topo1/rt1/step4/show_mpls_table.ref +++ b/tests/topotests/isis-sr-topo1/rt1/step4/show_mpls_table.ref @@ -101,15 +101,15 @@ "nexthops":[ { "type":"SR (IS-IS)", - "outLabel":16060, + "outLabel":17060, "installed":true, - "nexthop":"10.0.1.2" + "nexthop":"10.0.1.3" }, { "type":"SR (IS-IS)", - "outLabel":17060, + "outLabel":16060, "installed":true, - "nexthop":"10.0.1.3" + "nexthop":"10.0.1.2" } ] }, @@ -130,5 +130,41 @@ "interface":"eth-sw1" } ] + }, + "16100":{ + "inLabel":16100, + "installed":true, + "nexthops":[ + { + "type":"SR (IS-IS)", + "outLabel":16100, + "installed":true, + "nexthop":"10.0.1.2" + }, + { + "type":"SR (IS-IS)", + "outLabel":17100, + "installed":true, + "nexthop":"10.0.1.3" + } + ] + }, + "16101":{ + "inLabel":16101, + "installed":true, + "nexthops":[ + { + "type":"SR (IS-IS)", + "outLabel":16101, + "installed":true, + "interface":"eth-sw1" + }, + { + "type":"SR (IS-IS)", + "outLabel":17101, + "installed":true, + "interface":"eth-sw1" + } + ] } } diff --git a/tests/topotests/isis-sr-topo1/rt1/step5/show_ip_route.ref b/tests/topotests/isis-sr-topo1/rt1/step5/show_ip_route.ref index 59213686f2..16d9358468 100644 --- a/tests/topotests/isis-sr-topo1/rt1/step5/show_ip_route.ref +++ b/tests/topotests/isis-sr-topo1/rt1/step5/show_ip_route.ref @@ -277,5 +277,38 @@ } ] } + ], + "10.10.10.10\/32":[ + { + "prefix":"10.10.10.10\/32", + "protocol":"isis", + "selected":true, + "destSelected":true, + "distance":115, + "metric":30, + "installed":true, + "nexthops":[ + { + "fib":true, + "ip":"10.0.1.2", + "afi":"ipv4", + "interfaceName":"eth-sw1", + "active":true, + "labels":[ + 16100 + ] + }, + { + "fib":true, + "ip":"10.0.1.3", + "afi":"ipv4", + "interfaceName":"eth-sw1", + "active":true, + "labels":[ + 17100 + ] + } + ] + } ] } diff --git a/tests/topotests/isis-sr-topo1/rt1/step5/show_ipv6_route.ref b/tests/topotests/isis-sr-topo1/rt1/step5/show_ipv6_route.ref index cdfae284ba..f2093a3fc0 100644 --- a/tests/topotests/isis-sr-topo1/rt1/step5/show_ipv6_route.ref +++ b/tests/topotests/isis-sr-topo1/rt1/step5/show_ipv6_route.ref @@ -111,5 +111,36 @@ } ] } + ], + "2001:db8:1000::10\/128":[ + { + "prefix":"2001:db8:1000::10\/128", + "protocol":"isis", + "selected":true, + "destSelected":true, + "distance":115, + "metric":30, + "installed":true, + "nexthops":[ + { + "fib":true, + "afi":"ipv6", + "interfaceName":"eth-sw1", + "active":true, + "labels":[ + 16101 + ] + }, + { + "fib":true, + "afi":"ipv6", + "interfaceName":"eth-sw1", + "active":true, + "labels":[ + 17101 + ] + } + ] + } ] } diff --git a/tests/topotests/isis-sr-topo1/rt1/step5/show_mpls_table.ref b/tests/topotests/isis-sr-topo1/rt1/step5/show_mpls_table.ref index 73f517a6e5..94b3cb6d1a 100644 --- a/tests/topotests/isis-sr-topo1/rt1/step5/show_mpls_table.ref +++ b/tests/topotests/isis-sr-topo1/rt1/step5/show_mpls_table.ref @@ -94,5 +94,41 @@ "interface":"eth-sw1" } ] + }, + "16100":{ + "inLabel":16100, + "installed":true, + "nexthops":[ + { + "type":"SR (IS-IS)", + "outLabel":16100, + "installed":true, + "nexthop":"10.0.1.2" + }, + { + "type":"SR (IS-IS)", + "outLabel":17100, + "installed":true, + "nexthop":"10.0.1.3" + } + ] + }, + "16101":{ + "inLabel":16101, + "installed":true, + "nexthops":[ + { + "type":"SR (IS-IS)", + "outLabel":16101, + "installed":true, + "interface":"eth-sw1" + }, + { + "type":"SR (IS-IS)", + "outLabel":17101, + "installed":true, + "interface":"eth-sw1" + } + ] } } diff --git a/tests/topotests/isis-sr-topo1/rt1/step6/show_ip_route.ref b/tests/topotests/isis-sr-topo1/rt1/step6/show_ip_route.ref index 6b34d5e4ff..c712538c00 100644 --- a/tests/topotests/isis-sr-topo1/rt1/step6/show_ip_route.ref +++ b/tests/topotests/isis-sr-topo1/rt1/step6/show_ip_route.ref @@ -283,5 +283,38 @@ } ] } + ], + "10.10.10.10\/32":[ + { + "prefix":"10.10.10.10\/32", + "protocol":"isis", + "selected":true, + "destSelected":true, + "distance":115, + "metric":30, + "installed":true, + "nexthops":[ + { + "fib":true, + "ip":"10.0.1.2", + "afi":"ipv4", + "interfaceName":"eth-sw1", + "active":true, + "labels":[ + 16100 + ] + }, + { + "fib":true, + "ip":"10.0.1.3", + "afi":"ipv4", + "interfaceName":"eth-sw1", + "active":true, + "labels":[ + 17100 + ] + } + ] + } ] } diff --git a/tests/topotests/isis-sr-topo1/rt1/step6/show_ipv6_route.ref b/tests/topotests/isis-sr-topo1/rt1/step6/show_ipv6_route.ref index c507688f5b..0b39584717 100644 --- a/tests/topotests/isis-sr-topo1/rt1/step6/show_ipv6_route.ref +++ b/tests/topotests/isis-sr-topo1/rt1/step6/show_ipv6_route.ref @@ -117,5 +117,36 @@ } ] } + ], + "2001:db8:1000::10\/128":[ + { + "prefix":"2001:db8:1000::10\/128", + "protocol":"isis", + "selected":true, + "destSelected":true, + "distance":115, + "metric":30, + "installed":true, + "nexthops":[ + { + "fib":true, + "afi":"ipv6", + "interfaceName":"eth-sw1", + "active":true, + "labels":[ + 16101 + ] + }, + { + "fib":true, + "afi":"ipv6", + "interfaceName":"eth-sw1", + "active":true, + "labels":[ + 17101 + ] + } + ] + } ] } diff --git a/tests/topotests/isis-sr-topo1/rt1/step6/show_mpls_table.ref b/tests/topotests/isis-sr-topo1/rt1/step6/show_mpls_table.ref index 773f5e3d43..5b1950d8cb 100644 --- a/tests/topotests/isis-sr-topo1/rt1/step6/show_mpls_table.ref +++ b/tests/topotests/isis-sr-topo1/rt1/step6/show_mpls_table.ref @@ -130,5 +130,41 @@ "interface":"eth-sw1" } ] + }, + "16100":{ + "inLabel":16100, + "installed":true, + "nexthops":[ + { + "type":"SR (IS-IS)", + "outLabel":16100, + "installed":true, + "nexthop":"10.0.1.2" + }, + { + "type":"SR (IS-IS)", + "outLabel":17100, + "installed":true, + "nexthop":"10.0.1.3" + } + ] + }, + "16101":{ + "inLabel":16101, + "installed":true, + "nexthops":[ + { + "type":"SR (IS-IS)", + "outLabel":16101, + "installed":true, + "interface":"eth-sw1" + }, + { + "type":"SR (IS-IS)", + "outLabel":17101, + "installed":true, + "interface":"eth-sw1" + } + ] } } diff --git a/tests/topotests/isis-sr-topo1/rt1/step7/show_ip_route.ref b/tests/topotests/isis-sr-topo1/rt1/step7/show_ip_route.ref index 6b34d5e4ff..c712538c00 100644 --- a/tests/topotests/isis-sr-topo1/rt1/step7/show_ip_route.ref +++ b/tests/topotests/isis-sr-topo1/rt1/step7/show_ip_route.ref @@ -283,5 +283,38 @@ } ] } + ], + "10.10.10.10\/32":[ + { + "prefix":"10.10.10.10\/32", + "protocol":"isis", + "selected":true, + "destSelected":true, + "distance":115, + "metric":30, + "installed":true, + "nexthops":[ + { + "fib":true, + "ip":"10.0.1.2", + "afi":"ipv4", + "interfaceName":"eth-sw1", + "active":true, + "labels":[ + 16100 + ] + }, + { + "fib":true, + "ip":"10.0.1.3", + "afi":"ipv4", + "interfaceName":"eth-sw1", + "active":true, + "labels":[ + 17100 + ] + } + ] + } ] } diff --git a/tests/topotests/isis-sr-topo1/rt1/step7/show_ipv6_route.ref b/tests/topotests/isis-sr-topo1/rt1/step7/show_ipv6_route.ref index c507688f5b..0b39584717 100644 --- a/tests/topotests/isis-sr-topo1/rt1/step7/show_ipv6_route.ref +++ b/tests/topotests/isis-sr-topo1/rt1/step7/show_ipv6_route.ref @@ -117,5 +117,36 @@ } ] } + ], + "2001:db8:1000::10\/128":[ + { + "prefix":"2001:db8:1000::10\/128", + "protocol":"isis", + "selected":true, + "destSelected":true, + "distance":115, + "metric":30, + "installed":true, + "nexthops":[ + { + "fib":true, + "afi":"ipv6", + "interfaceName":"eth-sw1", + "active":true, + "labels":[ + 16101 + ] + }, + { + "fib":true, + "afi":"ipv6", + "interfaceName":"eth-sw1", + "active":true, + "labels":[ + 17101 + ] + } + ] + } ] } diff --git a/tests/topotests/isis-sr-topo1/rt1/step7/show_mpls_table.ref b/tests/topotests/isis-sr-topo1/rt1/step7/show_mpls_table.ref index 773f5e3d43..5b1950d8cb 100644 --- a/tests/topotests/isis-sr-topo1/rt1/step7/show_mpls_table.ref +++ b/tests/topotests/isis-sr-topo1/rt1/step7/show_mpls_table.ref @@ -130,5 +130,41 @@ "interface":"eth-sw1" } ] + }, + "16100":{ + "inLabel":16100, + "installed":true, + "nexthops":[ + { + "type":"SR (IS-IS)", + "outLabel":16100, + "installed":true, + "nexthop":"10.0.1.2" + }, + { + "type":"SR (IS-IS)", + "outLabel":17100, + "installed":true, + "nexthop":"10.0.1.3" + } + ] + }, + "16101":{ + "inLabel":16101, + "installed":true, + "nexthops":[ + { + "type":"SR (IS-IS)", + "outLabel":16101, + "installed":true, + "interface":"eth-sw1" + }, + { + "type":"SR (IS-IS)", + "outLabel":17101, + "installed":true, + "interface":"eth-sw1" + } + ] } } diff --git a/tests/topotests/isis-sr-topo1/rt1/step8/show_ip_route.ref b/tests/topotests/isis-sr-topo1/rt1/step8/show_ip_route.ref index 6b34d5e4ff..c712538c00 100644 --- a/tests/topotests/isis-sr-topo1/rt1/step8/show_ip_route.ref +++ b/tests/topotests/isis-sr-topo1/rt1/step8/show_ip_route.ref @@ -283,5 +283,38 @@ } ] } + ], + "10.10.10.10\/32":[ + { + "prefix":"10.10.10.10\/32", + "protocol":"isis", + "selected":true, + "destSelected":true, + "distance":115, + "metric":30, + "installed":true, + "nexthops":[ + { + "fib":true, + "ip":"10.0.1.2", + "afi":"ipv4", + "interfaceName":"eth-sw1", + "active":true, + "labels":[ + 16100 + ] + }, + { + "fib":true, + "ip":"10.0.1.3", + "afi":"ipv4", + "interfaceName":"eth-sw1", + "active":true, + "labels":[ + 17100 + ] + } + ] + } ] } diff --git a/tests/topotests/isis-sr-topo1/rt1/step8/show_ipv6_route.ref b/tests/topotests/isis-sr-topo1/rt1/step8/show_ipv6_route.ref index c507688f5b..0b39584717 100644 --- a/tests/topotests/isis-sr-topo1/rt1/step8/show_ipv6_route.ref +++ b/tests/topotests/isis-sr-topo1/rt1/step8/show_ipv6_route.ref @@ -117,5 +117,36 @@ } ] } + ], + "2001:db8:1000::10\/128":[ + { + "prefix":"2001:db8:1000::10\/128", + "protocol":"isis", + "selected":true, + "destSelected":true, + "distance":115, + "metric":30, + "installed":true, + "nexthops":[ + { + "fib":true, + "afi":"ipv6", + "interfaceName":"eth-sw1", + "active":true, + "labels":[ + 16101 + ] + }, + { + "fib":true, + "afi":"ipv6", + "interfaceName":"eth-sw1", + "active":true, + "labels":[ + 17101 + ] + } + ] + } ] } diff --git a/tests/topotests/isis-sr-topo1/rt1/step8/show_mpls_table.ref b/tests/topotests/isis-sr-topo1/rt1/step8/show_mpls_table.ref index 773f5e3d43..5b1950d8cb 100644 --- a/tests/topotests/isis-sr-topo1/rt1/step8/show_mpls_table.ref +++ b/tests/topotests/isis-sr-topo1/rt1/step8/show_mpls_table.ref @@ -130,5 +130,41 @@ "interface":"eth-sw1" } ] + }, + "16100":{ + "inLabel":16100, + "installed":true, + "nexthops":[ + { + "type":"SR (IS-IS)", + "outLabel":16100, + "installed":true, + "nexthop":"10.0.1.2" + }, + { + "type":"SR (IS-IS)", + "outLabel":17100, + "installed":true, + "nexthop":"10.0.1.3" + } + ] + }, + "16101":{ + "inLabel":16101, + "installed":true, + "nexthops":[ + { + "type":"SR (IS-IS)", + "outLabel":16101, + "installed":true, + "interface":"eth-sw1" + }, + { + "type":"SR (IS-IS)", + "outLabel":17101, + "installed":true, + "interface":"eth-sw1" + } + ] } } diff --git a/tests/topotests/isis-sr-topo1/rt1/step9/show_ip_route.ref b/tests/topotests/isis-sr-topo1/rt1/step9/show_ip_route.ref index 6b34d5e4ff..c712538c00 100644 --- a/tests/topotests/isis-sr-topo1/rt1/step9/show_ip_route.ref +++ b/tests/topotests/isis-sr-topo1/rt1/step9/show_ip_route.ref @@ -283,5 +283,38 @@ } ] } + ], + "10.10.10.10\/32":[ + { + "prefix":"10.10.10.10\/32", + "protocol":"isis", + "selected":true, + "destSelected":true, + "distance":115, + "metric":30, + "installed":true, + "nexthops":[ + { + "fib":true, + "ip":"10.0.1.2", + "afi":"ipv4", + "interfaceName":"eth-sw1", + "active":true, + "labels":[ + 16100 + ] + }, + { + "fib":true, + "ip":"10.0.1.3", + "afi":"ipv4", + "interfaceName":"eth-sw1", + "active":true, + "labels":[ + 17100 + ] + } + ] + } ] } diff --git a/tests/topotests/isis-sr-topo1/rt1/step9/show_ipv6_route.ref b/tests/topotests/isis-sr-topo1/rt1/step9/show_ipv6_route.ref index c507688f5b..0b39584717 100644 --- a/tests/topotests/isis-sr-topo1/rt1/step9/show_ipv6_route.ref +++ b/tests/topotests/isis-sr-topo1/rt1/step9/show_ipv6_route.ref @@ -117,5 +117,36 @@ } ] } + ], + "2001:db8:1000::10\/128":[ + { + "prefix":"2001:db8:1000::10\/128", + "protocol":"isis", + "selected":true, + "destSelected":true, + "distance":115, + "metric":30, + "installed":true, + "nexthops":[ + { + "fib":true, + "afi":"ipv6", + "interfaceName":"eth-sw1", + "active":true, + "labels":[ + 16101 + ] + }, + { + "fib":true, + "afi":"ipv6", + "interfaceName":"eth-sw1", + "active":true, + "labels":[ + 17101 + ] + } + ] + } ] } diff --git a/tests/topotests/isis-sr-topo1/rt1/step9/show_mpls_table.ref b/tests/topotests/isis-sr-topo1/rt1/step9/show_mpls_table.ref index 25a48c2bfc..7e6c72627a 100644 --- a/tests/topotests/isis-sr-topo1/rt1/step9/show_mpls_table.ref +++ b/tests/topotests/isis-sr-topo1/rt1/step9/show_mpls_table.ref @@ -152,5 +152,41 @@ "interface":"eth-sw1" } ] + }, + "16100":{ + "inLabel":16100, + "installed":true, + "nexthops":[ + { + "type":"SR (IS-IS)", + "outLabel":16100, + "installed":true, + "nexthop":"10.0.1.2" + }, + { + "type":"SR (IS-IS)", + "outLabel":17100, + "installed":true, + "nexthop":"10.0.1.3" + } + ] + }, + "16101":{ + "inLabel":16101, + "installed":true, + "nexthops":[ + { + "type":"SR (IS-IS)", + "outLabel":16101, + "installed":true, + "interface":"eth-sw1" + }, + { + "type":"SR (IS-IS)", + "outLabel":17101, + "installed":true, + "interface":"eth-sw1" + } + ] } } diff --git a/tests/topotests/isis-sr-topo1/rt2/step1/show_ip_route.ref b/tests/topotests/isis-sr-topo1/rt2/step1/show_ip_route.ref index be037aba8b..109b94f7a1 100644 --- a/tests/topotests/isis-sr-topo1/rt2/step1/show_ip_route.ref +++ b/tests/topotests/isis-sr-topo1/rt2/step1/show_ip_route.ref @@ -343,5 +343,38 @@ } ] } + ], + "10.10.10.10\/32":[ + { + "prefix":"10.10.10.10\/32", + "protocol":"isis", + "selected":true, + "destSelected":true, + "distance":115, + "metric":20, + "installed":true, + "nexthops":[ + { + "fib":true, + "ip":"10.0.2.4", + "afi":"ipv4", + "interfaceName":"eth-rt4-1", + "active":true, + "labels":[ + 16100 + ] + }, + { + "fib":true, + "ip":"10.0.3.4", + "afi":"ipv4", + "interfaceName":"eth-rt4-2", + "active":true, + "labels":[ + 16100 + ] + } + ] + } ] } diff --git a/tests/topotests/isis-sr-topo1/rt2/step1/show_ipv6_route.ref b/tests/topotests/isis-sr-topo1/rt2/step1/show_ipv6_route.ref index a888198ac8..eae700ee47 100644 --- a/tests/topotests/isis-sr-topo1/rt2/step1/show_ipv6_route.ref +++ b/tests/topotests/isis-sr-topo1/rt2/step1/show_ipv6_route.ref @@ -144,5 +144,36 @@ } ] } + ], + "2001:db8:1000::10\/128":[ + { + "prefix":"2001:db8:1000::10\/128", + "protocol":"isis", + "selected":true, + "destSelected":true, + "distance":115, + "metric":20, + "installed":true, + "nexthops":[ + { + "fib":true, + "afi":"ipv6", + "interfaceName":"eth-rt4-1", + "active":true, + "labels":[ + 16101 + ] + }, + { + "fib":true, + "afi":"ipv6", + "interfaceName":"eth-rt4-2", + "active":true, + "labels":[ + 16101 + ] + } + ] + } ] } diff --git a/tests/topotests/isis-sr-topo1/rt2/step1/show_mpls_table.ref b/tests/topotests/isis-sr-topo1/rt2/step1/show_mpls_table.ref index 42fde2d77f..a32cd1d1bf 100644 --- a/tests/topotests/isis-sr-topo1/rt2/step1/show_mpls_table.ref +++ b/tests/topotests/isis-sr-topo1/rt2/step1/show_mpls_table.ref @@ -77,13 +77,13 @@ "type":"SR (IS-IS)", "outLabel":16040, "installed":true, - "nexthop":"10.0.3.4" + "nexthop":"10.0.2.4" }, { "type":"SR (IS-IS)", "outLabel":16040, "installed":true, - "nexthop":"10.0.2.4" + "nexthop":"10.0.3.4" } ] }, @@ -95,13 +95,13 @@ "type":"SR (IS-IS)", "outLabel":16041, "installed":true, - "interface":"eth-rt4-2" + "interface":"eth-rt4-1" }, { "type":"SR (IS-IS)", "outLabel":16041, "installed":true, - "interface":"eth-rt4-1" + "interface":"eth-rt4-2" } ] }, @@ -111,9 +111,9 @@ "nexthops":[ { "type":"SR (IS-IS)", - "outLabel":17050, + "outLabel":16050, "installed":true, - "nexthop":"10.0.1.3" + "nexthop":"10.0.2.4" }, { "type":"SR (IS-IS)", @@ -123,9 +123,9 @@ }, { "type":"SR (IS-IS)", - "outLabel":16050, + "outLabel":17050, "installed":true, - "nexthop":"10.0.2.4" + "nexthop":"10.0.1.3" } ] }, @@ -135,9 +135,9 @@ "nexthops":[ { "type":"SR (IS-IS)", - "outLabel":17051, + "outLabel":16051, "installed":true, - "interface":"eth-sw1" + "interface":"eth-rt4-1" }, { "type":"SR (IS-IS)", @@ -147,9 +147,9 @@ }, { "type":"SR (IS-IS)", - "outLabel":16051, + "outLabel":17051, "installed":true, - "interface":"eth-rt4-1" + "interface":"eth-sw1" } ] }, @@ -161,13 +161,13 @@ "type":"SR (IS-IS)", "outLabel":16060, "installed":true, - "nexthop":"10.0.3.4" + "nexthop":"10.0.2.4" }, { "type":"SR (IS-IS)", "outLabel":16060, "installed":true, - "nexthop":"10.0.2.4" + "nexthop":"10.0.3.4" } ] }, @@ -179,13 +179,49 @@ "type":"SR (IS-IS)", "outLabel":16061, "installed":true, - "interface":"eth-rt4-2" + "interface":"eth-rt4-1" }, { "type":"SR (IS-IS)", "outLabel":16061, "installed":true, + "interface":"eth-rt4-2" + } + ] + }, + "16100":{ + "inLabel":16100, + "installed":true, + "nexthops":[ + { + "type":"SR (IS-IS)", + "outLabel":16100, + "installed":true, + "nexthop":"10.0.2.4" + }, + { + "type":"SR (IS-IS)", + "outLabel":16100, + "installed":true, + "nexthop":"10.0.3.4" + } + ] + }, + "16101":{ + "inLabel":16101, + "installed":true, + "nexthops":[ + { + "type":"SR (IS-IS)", + "outLabel":16101, + "installed":true, "interface":"eth-rt4-1" + }, + { + "type":"SR (IS-IS)", + "outLabel":16101, + "installed":true, + "interface":"eth-rt4-2" } ] } diff --git a/tests/topotests/isis-sr-topo1/rt2/step10/show_ip_route.ref b/tests/topotests/isis-sr-topo1/rt2/step10/show_ip_route.ref index 33fbdba28f..387d3b43d7 100644 --- a/tests/topotests/isis-sr-topo1/rt2/step10/show_ip_route.ref +++ b/tests/topotests/isis-sr-topo1/rt2/step10/show_ip_route.ref @@ -134,6 +134,27 @@ ] } ], + "10.0.2.0\/24":[ + { + "prefix":"10.0.2.0\/24", + "protocol":"isis", + "distance":115, + "metric":20, + "nexthops":[ + { + "ip":"10.0.2.4", + "afi":"ipv4", + "interfaceName":"eth-rt4-1" + }, + { + "ip":"10.0.3.4", + "afi":"ipv4", + "interfaceName":"eth-rt4-2", + "active":true + } + ] + } + ], "10.0.3.0\/24":[ { "prefix":"10.0.3.0\/24", @@ -255,5 +276,28 @@ } ] } + ], + "10.10.10.10\/32":[ + { + "prefix":"10.10.10.10\/32", + "protocol":"isis", + "selected":true, + "destSelected":true, + "distance":115, + "metric":20, + "installed":true, + "nexthops":[ + { + "fib":true, + "ip":"10.0.3.4", + "afi":"ipv4", + "interfaceName":"eth-rt4-2", + "active":true, + "labels":[ + 16100 + ] + } + ] + } ] } diff --git a/tests/topotests/isis-sr-topo1/rt2/step10/show_ipv6_route.ref b/tests/topotests/isis-sr-topo1/rt2/step10/show_ipv6_route.ref index 19837bc700..355436cbfc 100644 --- a/tests/topotests/isis-sr-topo1/rt2/step10/show_ipv6_route.ref +++ b/tests/topotests/isis-sr-topo1/rt2/step10/show_ipv6_route.ref @@ -126,5 +126,36 @@ } ] } + ], + "2001:db8:1000::10\/128":[ + { + "prefix":"2001:db8:1000::10\/128", + "protocol":"isis", + "selected":true, + "destSelected":true, + "distance":115, + "metric":20, + "installed":true, + "nexthops":[ + { + "fib":true, + "afi":"ipv6", + "interfaceName":"eth-rt4-1", + "active":true, + "labels":[ + 16101 + ] + }, + { + "fib":true, + "afi":"ipv6", + "interfaceName":"eth-rt4-2", + "active":true, + "labels":[ + 16101 + ] + } + ] + } ] } diff --git a/tests/topotests/isis-sr-topo1/rt2/step10/show_mpls_table.ref b/tests/topotests/isis-sr-topo1/rt2/step10/show_mpls_table.ref index 29ec55a589..4cbdb9fda9 100644 --- a/tests/topotests/isis-sr-topo1/rt2/step10/show_mpls_table.ref +++ b/tests/topotests/isis-sr-topo1/rt2/step10/show_mpls_table.ref @@ -89,13 +89,13 @@ "type":"SR (IS-IS)", "outLabel":16041, "installed":true, - "interface":"eth-rt4-2" + "interface":"eth-rt4-1" }, { "type":"SR (IS-IS)", "outLabel":16041, "installed":true, - "interface":"eth-rt4-1" + "interface":"eth-rt4-2" } ] }, @@ -143,13 +143,43 @@ "type":"SR (IS-IS)", "outLabel":16061, "installed":true, - "interface":"eth-rt4-2" + "interface":"eth-rt4-1" }, { "type":"SR (IS-IS)", "outLabel":16061, "installed":true, + "interface":"eth-rt4-2" + } + ] + }, + "16100":{ + "inLabel":16100, + "installed":true, + "nexthops":[ + { + "type":"SR (IS-IS)", + "outLabel":16100, + "installed":true, + "nexthop":"10.0.3.4" + } + ] + }, + "16101":{ + "inLabel":16101, + "installed":true, + "nexthops":[ + { + "type":"SR (IS-IS)", + "outLabel":16101, + "installed":true, "interface":"eth-rt4-1" + }, + { + "type":"SR (IS-IS)", + "outLabel":16101, + "installed":true, + "interface":"eth-rt4-2" } ] } diff --git a/tests/topotests/isis-sr-topo1/rt2/step2/show_ip_route.ref b/tests/topotests/isis-sr-topo1/rt2/step2/show_ip_route.ref index a110c51077..159392f7f7 100644 --- a/tests/topotests/isis-sr-topo1/rt2/step2/show_ip_route.ref +++ b/tests/topotests/isis-sr-topo1/rt2/step2/show_ip_route.ref @@ -316,5 +316,38 @@ } ] } + ], + "10.10.10.10\/32":[ + { + "prefix":"10.10.10.10\/32", + "protocol":"isis", + "selected":true, + "destSelected":true, + "distance":115, + "metric":20, + "installed":true, + "nexthops":[ + { + "fib":true, + "ip":"10.0.2.4", + "afi":"ipv4", + "interfaceName":"eth-rt4-1", + "active":true, + "labels":[ + 16100 + ] + }, + { + "fib":true, + "ip":"10.0.3.4", + "afi":"ipv4", + "interfaceName":"eth-rt4-2", + "active":true, + "labels":[ + 16100 + ] + } + ] + } ] } diff --git a/tests/topotests/isis-sr-topo1/rt2/step2/show_ipv6_route.ref b/tests/topotests/isis-sr-topo1/rt2/step2/show_ipv6_route.ref index cb426897ce..e9f63849d8 100644 --- a/tests/topotests/isis-sr-topo1/rt2/step2/show_ipv6_route.ref +++ b/tests/topotests/isis-sr-topo1/rt2/step2/show_ipv6_route.ref @@ -126,5 +126,36 @@ } ] } + ], + "2001:db8:1000::10\/128":[ + { + "prefix":"2001:db8:1000::10\/128", + "protocol":"isis", + "selected":true, + "destSelected":true, + "distance":115, + "metric":20, + "installed":true, + "nexthops":[ + { + "fib":true, + "afi":"ipv6", + "interfaceName":"eth-rt4-1", + "active":true, + "labels":[ + 16101 + ] + }, + { + "fib":true, + "afi":"ipv6", + "interfaceName":"eth-rt4-2", + "active":true, + "labels":[ + 16101 + ] + } + ] + } ] } diff --git a/tests/topotests/isis-sr-topo1/rt2/step2/show_mpls_table.ref b/tests/topotests/isis-sr-topo1/rt2/step2/show_mpls_table.ref index 118ec89b5c..0692553808 100644 --- a/tests/topotests/isis-sr-topo1/rt2/step2/show_mpls_table.ref +++ b/tests/topotests/isis-sr-topo1/rt2/step2/show_mpls_table.ref @@ -77,13 +77,13 @@ "type":"SR (IS-IS)", "outLabel":16040, "installed":true, - "nexthop":"10.0.3.4" + "nexthop":"10.0.2.4" }, { "type":"SR (IS-IS)", "outLabel":16040, "installed":true, - "nexthop":"10.0.2.4" + "nexthop":"10.0.3.4" } ] }, @@ -95,13 +95,13 @@ "type":"SR (IS-IS)", "outLabel":16041, "installed":true, - "interface":"eth-rt4-2" + "interface":"eth-rt4-1" }, { "type":"SR (IS-IS)", "outLabel":16041, "installed":true, - "interface":"eth-rt4-1" + "interface":"eth-rt4-2" } ] }, @@ -137,13 +137,13 @@ "type":"SR (IS-IS)", "outLabel":16060, "installed":true, - "nexthop":"10.0.3.4" + "nexthop":"10.0.2.4" }, { "type":"SR (IS-IS)", "outLabel":16060, "installed":true, - "nexthop":"10.0.2.4" + "nexthop":"10.0.3.4" } ] }, @@ -155,13 +155,49 @@ "type":"SR (IS-IS)", "outLabel":16061, "installed":true, - "interface":"eth-rt4-2" + "interface":"eth-rt4-1" }, { "type":"SR (IS-IS)", "outLabel":16061, "installed":true, + "interface":"eth-rt4-2" + } + ] + }, + "16100":{ + "inLabel":16100, + "installed":true, + "nexthops":[ + { + "type":"SR (IS-IS)", + "outLabel":16100, + "installed":true, + "nexthop":"10.0.2.4" + }, + { + "type":"SR (IS-IS)", + "outLabel":16100, + "installed":true, + "nexthop":"10.0.3.4" + } + ] + }, + "16101":{ + "inLabel":16101, + "installed":true, + "nexthops":[ + { + "type":"SR (IS-IS)", + "outLabel":16101, + "installed":true, "interface":"eth-rt4-1" + }, + { + "type":"SR (IS-IS)", + "outLabel":16101, + "installed":true, + "interface":"eth-rt4-2" } ] } diff --git a/tests/topotests/isis-sr-topo1/rt2/step3/show_ip_route.ref b/tests/topotests/isis-sr-topo1/rt2/step3/show_ip_route.ref index d31affeb59..16f49ffe46 100644 --- a/tests/topotests/isis-sr-topo1/rt2/step3/show_ip_route.ref +++ b/tests/topotests/isis-sr-topo1/rt2/step3/show_ip_route.ref @@ -269,5 +269,38 @@ } ] } + ], + "10.10.10.10\/32":[ + { + "prefix":"10.10.10.10\/32", + "protocol":"isis", + "selected":true, + "destSelected":true, + "distance":115, + "metric":20, + "installed":true, + "nexthops":[ + { + "fib":true, + "ip":"10.0.2.4", + "afi":"ipv4", + "interfaceName":"eth-rt4-1", + "active":true, + "labels":[ + 16100 + ] + }, + { + "fib":true, + "ip":"10.0.3.4", + "afi":"ipv4", + "interfaceName":"eth-rt4-2", + "active":true, + "labels":[ + 16100 + ] + } + ] + } ] } diff --git a/tests/topotests/isis-sr-topo1/rt2/step3/show_ipv6_route.ref b/tests/topotests/isis-sr-topo1/rt2/step3/show_ipv6_route.ref index d92df1918c..bde83c30d0 100644 --- a/tests/topotests/isis-sr-topo1/rt2/step3/show_ipv6_route.ref +++ b/tests/topotests/isis-sr-topo1/rt2/step3/show_ipv6_route.ref @@ -95,5 +95,36 @@ } ] } + ], + "2001:db8:1000::10\/128":[ + { + "prefix":"2001:db8:1000::10\/128", + "protocol":"isis", + "selected":true, + "destSelected":true, + "distance":115, + "metric":20, + "installed":true, + "nexthops":[ + { + "fib":true, + "afi":"ipv6", + "interfaceName":"eth-rt4-1", + "active":true, + "labels":[ + 16101 + ] + }, + { + "fib":true, + "afi":"ipv6", + "interfaceName":"eth-rt4-2", + "active":true, + "labels":[ + 16101 + ] + } + ] + } ] } diff --git a/tests/topotests/isis-sr-topo1/rt2/step3/show_mpls_table.ref b/tests/topotests/isis-sr-topo1/rt2/step3/show_mpls_table.ref index f1e18be26b..cbb0d5c695 100644 --- a/tests/topotests/isis-sr-topo1/rt2/step3/show_mpls_table.ref +++ b/tests/topotests/isis-sr-topo1/rt2/step3/show_mpls_table.ref @@ -77,13 +77,13 @@ "type":"SR (IS-IS)", "outLabel":16040, "installed":true, - "nexthop":"10.0.3.4" + "nexthop":"10.0.2.4" }, { "type":"SR (IS-IS)", "outLabel":16040, "installed":true, - "nexthop":"10.0.2.4" + "nexthop":"10.0.3.4" } ] }, @@ -95,13 +95,13 @@ "type":"SR (IS-IS)", "outLabel":16041, "installed":true, - "interface":"eth-rt4-2" + "interface":"eth-rt4-1" }, { "type":"SR (IS-IS)", "outLabel":16041, "installed":true, - "interface":"eth-rt4-1" + "interface":"eth-rt4-2" } ] }, @@ -128,5 +128,41 @@ "interface":"eth-sw1" } ] + }, + "16100":{ + "inLabel":16100, + "installed":true, + "nexthops":[ + { + "type":"SR (IS-IS)", + "outLabel":16100, + "installed":true, + "nexthop":"10.0.2.4" + }, + { + "type":"SR (IS-IS)", + "outLabel":16100, + "installed":true, + "nexthop":"10.0.3.4" + } + ] + }, + "16101":{ + "inLabel":16101, + "installed":true, + "nexthops":[ + { + "type":"SR (IS-IS)", + "outLabel":16101, + "installed":true, + "interface":"eth-rt4-1" + }, + { + "type":"SR (IS-IS)", + "outLabel":16101, + "installed":true, + "interface":"eth-rt4-2" + } + ] } } diff --git a/tests/topotests/isis-sr-topo1/rt2/step4/show_ip_route.ref b/tests/topotests/isis-sr-topo1/rt2/step4/show_ip_route.ref index a110c51077..159392f7f7 100644 --- a/tests/topotests/isis-sr-topo1/rt2/step4/show_ip_route.ref +++ b/tests/topotests/isis-sr-topo1/rt2/step4/show_ip_route.ref @@ -316,5 +316,38 @@ } ] } + ], + "10.10.10.10\/32":[ + { + "prefix":"10.10.10.10\/32", + "protocol":"isis", + "selected":true, + "destSelected":true, + "distance":115, + "metric":20, + "installed":true, + "nexthops":[ + { + "fib":true, + "ip":"10.0.2.4", + "afi":"ipv4", + "interfaceName":"eth-rt4-1", + "active":true, + "labels":[ + 16100 + ] + }, + { + "fib":true, + "ip":"10.0.3.4", + "afi":"ipv4", + "interfaceName":"eth-rt4-2", + "active":true, + "labels":[ + 16100 + ] + } + ] + } ] } diff --git a/tests/topotests/isis-sr-topo1/rt2/step4/show_ipv6_route.ref b/tests/topotests/isis-sr-topo1/rt2/step4/show_ipv6_route.ref index cb426897ce..e9f63849d8 100644 --- a/tests/topotests/isis-sr-topo1/rt2/step4/show_ipv6_route.ref +++ b/tests/topotests/isis-sr-topo1/rt2/step4/show_ipv6_route.ref @@ -126,5 +126,36 @@ } ] } + ], + "2001:db8:1000::10\/128":[ + { + "prefix":"2001:db8:1000::10\/128", + "protocol":"isis", + "selected":true, + "destSelected":true, + "distance":115, + "metric":20, + "installed":true, + "nexthops":[ + { + "fib":true, + "afi":"ipv6", + "interfaceName":"eth-rt4-1", + "active":true, + "labels":[ + 16101 + ] + }, + { + "fib":true, + "afi":"ipv6", + "interfaceName":"eth-rt4-2", + "active":true, + "labels":[ + 16101 + ] + } + ] + } ] } diff --git a/tests/topotests/isis-sr-topo1/rt2/step4/show_mpls_table.ref b/tests/topotests/isis-sr-topo1/rt2/step4/show_mpls_table.ref index 118ec89b5c..0692553808 100644 --- a/tests/topotests/isis-sr-topo1/rt2/step4/show_mpls_table.ref +++ b/tests/topotests/isis-sr-topo1/rt2/step4/show_mpls_table.ref @@ -77,13 +77,13 @@ "type":"SR (IS-IS)", "outLabel":16040, "installed":true, - "nexthop":"10.0.3.4" + "nexthop":"10.0.2.4" }, { "type":"SR (IS-IS)", "outLabel":16040, "installed":true, - "nexthop":"10.0.2.4" + "nexthop":"10.0.3.4" } ] }, @@ -95,13 +95,13 @@ "type":"SR (IS-IS)", "outLabel":16041, "installed":true, - "interface":"eth-rt4-2" + "interface":"eth-rt4-1" }, { "type":"SR (IS-IS)", "outLabel":16041, "installed":true, - "interface":"eth-rt4-1" + "interface":"eth-rt4-2" } ] }, @@ -137,13 +137,13 @@ "type":"SR (IS-IS)", "outLabel":16060, "installed":true, - "nexthop":"10.0.3.4" + "nexthop":"10.0.2.4" }, { "type":"SR (IS-IS)", "outLabel":16060, "installed":true, - "nexthop":"10.0.2.4" + "nexthop":"10.0.3.4" } ] }, @@ -155,13 +155,49 @@ "type":"SR (IS-IS)", "outLabel":16061, "installed":true, - "interface":"eth-rt4-2" + "interface":"eth-rt4-1" }, { "type":"SR (IS-IS)", "outLabel":16061, "installed":true, + "interface":"eth-rt4-2" + } + ] + }, + "16100":{ + "inLabel":16100, + "installed":true, + "nexthops":[ + { + "type":"SR (IS-IS)", + "outLabel":16100, + "installed":true, + "nexthop":"10.0.2.4" + }, + { + "type":"SR (IS-IS)", + "outLabel":16100, + "installed":true, + "nexthop":"10.0.3.4" + } + ] + }, + "16101":{ + "inLabel":16101, + "installed":true, + "nexthops":[ + { + "type":"SR (IS-IS)", + "outLabel":16101, + "installed":true, "interface":"eth-rt4-1" + }, + { + "type":"SR (IS-IS)", + "outLabel":16101, + "installed":true, + "interface":"eth-rt4-2" } ] } diff --git a/tests/topotests/isis-sr-topo1/rt2/step5/show_ip_route.ref b/tests/topotests/isis-sr-topo1/rt2/step5/show_ip_route.ref index f378e41d8d..fbfcce10aa 100644 --- a/tests/topotests/isis-sr-topo1/rt2/step5/show_ip_route.ref +++ b/tests/topotests/isis-sr-topo1/rt2/step5/show_ip_route.ref @@ -310,5 +310,38 @@ } ] } + ], + "10.10.10.10\/32":[ + { + "prefix":"10.10.10.10\/32", + "protocol":"isis", + "selected":true, + "destSelected":true, + "distance":115, + "metric":20, + "installed":true, + "nexthops":[ + { + "fib":true, + "ip":"10.0.2.4", + "afi":"ipv4", + "interfaceName":"eth-rt4-1", + "active":true, + "labels":[ + 16100 + ] + }, + { + "fib":true, + "ip":"10.0.3.4", + "afi":"ipv4", + "interfaceName":"eth-rt4-2", + "active":true, + "labels":[ + 16100 + ] + } + ] + } ] } diff --git a/tests/topotests/isis-sr-topo1/rt2/step5/show_ipv6_route.ref b/tests/topotests/isis-sr-topo1/rt2/step5/show_ipv6_route.ref index d63e7ceba5..f747a96518 100644 --- a/tests/topotests/isis-sr-topo1/rt2/step5/show_ipv6_route.ref +++ b/tests/topotests/isis-sr-topo1/rt2/step5/show_ipv6_route.ref @@ -120,5 +120,36 @@ } ] } + ], + "2001:db8:1000::10\/128":[ + { + "prefix":"2001:db8:1000::10\/128", + "protocol":"isis", + "selected":true, + "destSelected":true, + "distance":115, + "metric":20, + "installed":true, + "nexthops":[ + { + "fib":true, + "afi":"ipv6", + "interfaceName":"eth-rt4-1", + "active":true, + "labels":[ + 16101 + ] + }, + { + "fib":true, + "afi":"ipv6", + "interfaceName":"eth-rt4-2", + "active":true, + "labels":[ + 16101 + ] + } + ] + } ] } diff --git a/tests/topotests/isis-sr-topo1/rt2/step5/show_mpls_table.ref b/tests/topotests/isis-sr-topo1/rt2/step5/show_mpls_table.ref index f1e18be26b..cbb0d5c695 100644 --- a/tests/topotests/isis-sr-topo1/rt2/step5/show_mpls_table.ref +++ b/tests/topotests/isis-sr-topo1/rt2/step5/show_mpls_table.ref @@ -77,13 +77,13 @@ "type":"SR (IS-IS)", "outLabel":16040, "installed":true, - "nexthop":"10.0.3.4" + "nexthop":"10.0.2.4" }, { "type":"SR (IS-IS)", "outLabel":16040, "installed":true, - "nexthop":"10.0.2.4" + "nexthop":"10.0.3.4" } ] }, @@ -95,13 +95,13 @@ "type":"SR (IS-IS)", "outLabel":16041, "installed":true, - "interface":"eth-rt4-2" + "interface":"eth-rt4-1" }, { "type":"SR (IS-IS)", "outLabel":16041, "installed":true, - "interface":"eth-rt4-1" + "interface":"eth-rt4-2" } ] }, @@ -128,5 +128,41 @@ "interface":"eth-sw1" } ] + }, + "16100":{ + "inLabel":16100, + "installed":true, + "nexthops":[ + { + "type":"SR (IS-IS)", + "outLabel":16100, + "installed":true, + "nexthop":"10.0.2.4" + }, + { + "type":"SR (IS-IS)", + "outLabel":16100, + "installed":true, + "nexthop":"10.0.3.4" + } + ] + }, + "16101":{ + "inLabel":16101, + "installed":true, + "nexthops":[ + { + "type":"SR (IS-IS)", + "outLabel":16101, + "installed":true, + "interface":"eth-rt4-1" + }, + { + "type":"SR (IS-IS)", + "outLabel":16101, + "installed":true, + "interface":"eth-rt4-2" + } + ] } } diff --git a/tests/topotests/isis-sr-topo1/rt2/step6/show_ip_route.ref b/tests/topotests/isis-sr-topo1/rt2/step6/show_ip_route.ref index a110c51077..159392f7f7 100644 --- a/tests/topotests/isis-sr-topo1/rt2/step6/show_ip_route.ref +++ b/tests/topotests/isis-sr-topo1/rt2/step6/show_ip_route.ref @@ -316,5 +316,38 @@ } ] } + ], + "10.10.10.10\/32":[ + { + "prefix":"10.10.10.10\/32", + "protocol":"isis", + "selected":true, + "destSelected":true, + "distance":115, + "metric":20, + "installed":true, + "nexthops":[ + { + "fib":true, + "ip":"10.0.2.4", + "afi":"ipv4", + "interfaceName":"eth-rt4-1", + "active":true, + "labels":[ + 16100 + ] + }, + { + "fib":true, + "ip":"10.0.3.4", + "afi":"ipv4", + "interfaceName":"eth-rt4-2", + "active":true, + "labels":[ + 16100 + ] + } + ] + } ] } diff --git a/tests/topotests/isis-sr-topo1/rt2/step6/show_ipv6_route.ref b/tests/topotests/isis-sr-topo1/rt2/step6/show_ipv6_route.ref index cb426897ce..e9f63849d8 100644 --- a/tests/topotests/isis-sr-topo1/rt2/step6/show_ipv6_route.ref +++ b/tests/topotests/isis-sr-topo1/rt2/step6/show_ipv6_route.ref @@ -126,5 +126,36 @@ } ] } + ], + "2001:db8:1000::10\/128":[ + { + "prefix":"2001:db8:1000::10\/128", + "protocol":"isis", + "selected":true, + "destSelected":true, + "distance":115, + "metric":20, + "installed":true, + "nexthops":[ + { + "fib":true, + "afi":"ipv6", + "interfaceName":"eth-rt4-1", + "active":true, + "labels":[ + 16101 + ] + }, + { + "fib":true, + "afi":"ipv6", + "interfaceName":"eth-rt4-2", + "active":true, + "labels":[ + 16101 + ] + } + ] + } ] } diff --git a/tests/topotests/isis-sr-topo1/rt2/step6/show_mpls_table.ref b/tests/topotests/isis-sr-topo1/rt2/step6/show_mpls_table.ref index 118ec89b5c..0692553808 100644 --- a/tests/topotests/isis-sr-topo1/rt2/step6/show_mpls_table.ref +++ b/tests/topotests/isis-sr-topo1/rt2/step6/show_mpls_table.ref @@ -77,13 +77,13 @@ "type":"SR (IS-IS)", "outLabel":16040, "installed":true, - "nexthop":"10.0.3.4" + "nexthop":"10.0.2.4" }, { "type":"SR (IS-IS)", "outLabel":16040, "installed":true, - "nexthop":"10.0.2.4" + "nexthop":"10.0.3.4" } ] }, @@ -95,13 +95,13 @@ "type":"SR (IS-IS)", "outLabel":16041, "installed":true, - "interface":"eth-rt4-2" + "interface":"eth-rt4-1" }, { "type":"SR (IS-IS)", "outLabel":16041, "installed":true, - "interface":"eth-rt4-1" + "interface":"eth-rt4-2" } ] }, @@ -137,13 +137,13 @@ "type":"SR (IS-IS)", "outLabel":16060, "installed":true, - "nexthop":"10.0.3.4" + "nexthop":"10.0.2.4" }, { "type":"SR (IS-IS)", "outLabel":16060, "installed":true, - "nexthop":"10.0.2.4" + "nexthop":"10.0.3.4" } ] }, @@ -155,13 +155,49 @@ "type":"SR (IS-IS)", "outLabel":16061, "installed":true, - "interface":"eth-rt4-2" + "interface":"eth-rt4-1" }, { "type":"SR (IS-IS)", "outLabel":16061, "installed":true, + "interface":"eth-rt4-2" + } + ] + }, + "16100":{ + "inLabel":16100, + "installed":true, + "nexthops":[ + { + "type":"SR (IS-IS)", + "outLabel":16100, + "installed":true, + "nexthop":"10.0.2.4" + }, + { + "type":"SR (IS-IS)", + "outLabel":16100, + "installed":true, + "nexthop":"10.0.3.4" + } + ] + }, + "16101":{ + "inLabel":16101, + "installed":true, + "nexthops":[ + { + "type":"SR (IS-IS)", + "outLabel":16101, + "installed":true, "interface":"eth-rt4-1" + }, + { + "type":"SR (IS-IS)", + "outLabel":16101, + "installed":true, + "interface":"eth-rt4-2" } ] } diff --git a/tests/topotests/isis-sr-topo1/rt2/step7/show_ip_route.ref b/tests/topotests/isis-sr-topo1/rt2/step7/show_ip_route.ref index a9b086a248..09ab6d4f8a 100644 --- a/tests/topotests/isis-sr-topo1/rt2/step7/show_ip_route.ref +++ b/tests/topotests/isis-sr-topo1/rt2/step7/show_ip_route.ref @@ -313,5 +313,38 @@ } ] } + ], + "10.10.10.10\/32":[ + { + "prefix":"10.10.10.10\/32", + "protocol":"isis", + "selected":true, + "destSelected":true, + "distance":115, + "metric":20, + "installed":true, + "nexthops":[ + { + "fib":true, + "ip":"10.0.2.4", + "afi":"ipv4", + "interfaceName":"eth-rt4-1", + "active":true, + "labels":[ + 16100 + ] + }, + { + "fib":true, + "ip":"10.0.3.4", + "afi":"ipv4", + "interfaceName":"eth-rt4-2", + "active":true, + "labels":[ + 16100 + ] + } + ] + } ] } diff --git a/tests/topotests/isis-sr-topo1/rt2/step7/show_ipv6_route.ref b/tests/topotests/isis-sr-topo1/rt2/step7/show_ipv6_route.ref index 1c61f91451..851275fbf7 100644 --- a/tests/topotests/isis-sr-topo1/rt2/step7/show_ipv6_route.ref +++ b/tests/topotests/isis-sr-topo1/rt2/step7/show_ipv6_route.ref @@ -123,5 +123,36 @@ } ] } + ], + "2001:db8:1000::10\/128":[ + { + "prefix":"2001:db8:1000::10\/128", + "protocol":"isis", + "selected":true, + "destSelected":true, + "distance":115, + "metric":20, + "installed":true, + "nexthops":[ + { + "fib":true, + "afi":"ipv6", + "interfaceName":"eth-rt4-1", + "active":true, + "labels":[ + 16101 + ] + }, + { + "fib":true, + "afi":"ipv6", + "interfaceName":"eth-rt4-2", + "active":true, + "labels":[ + 16101 + ] + } + ] + } ] } diff --git a/tests/topotests/isis-sr-topo1/rt2/step7/show_mpls_table.ref b/tests/topotests/isis-sr-topo1/rt2/step7/show_mpls_table.ref index 0f0d24bbfb..87946aa7b9 100644 --- a/tests/topotests/isis-sr-topo1/rt2/step7/show_mpls_table.ref +++ b/tests/topotests/isis-sr-topo1/rt2/step7/show_mpls_table.ref @@ -53,13 +53,13 @@ "type":"SR (IS-IS)", "outLabel":16040, "installed":true, - "nexthop":"10.0.3.4" + "nexthop":"10.0.2.4" }, { "type":"SR (IS-IS)", "outLabel":16040, "installed":true, - "nexthop":"10.0.2.4" + "nexthop":"10.0.3.4" } ] }, @@ -71,13 +71,13 @@ "type":"SR (IS-IS)", "outLabel":16041, "installed":true, - "interface":"eth-rt4-2" + "interface":"eth-rt4-1" }, { "type":"SR (IS-IS)", "outLabel":16041, "installed":true, - "interface":"eth-rt4-1" + "interface":"eth-rt4-2" } ] }, @@ -113,13 +113,13 @@ "type":"SR (IS-IS)", "outLabel":16060, "installed":true, - "nexthop":"10.0.3.4" + "nexthop":"10.0.2.4" }, { "type":"SR (IS-IS)", "outLabel":16060, "installed":true, - "nexthop":"10.0.2.4" + "nexthop":"10.0.3.4" } ] }, @@ -131,13 +131,49 @@ "type":"SR (IS-IS)", "outLabel":16061, "installed":true, - "interface":"eth-rt4-2" + "interface":"eth-rt4-1" }, { "type":"SR (IS-IS)", "outLabel":16061, "installed":true, + "interface":"eth-rt4-2" + } + ] + }, + "16100":{ + "inLabel":16100, + "installed":true, + "nexthops":[ + { + "type":"SR (IS-IS)", + "outLabel":16100, + "installed":true, + "nexthop":"10.0.2.4" + }, + { + "type":"SR (IS-IS)", + "outLabel":16100, + "installed":true, + "nexthop":"10.0.3.4" + } + ] + }, + "16101":{ + "inLabel":16101, + "installed":true, + "nexthops":[ + { + "type":"SR (IS-IS)", + "outLabel":16101, + "installed":true, "interface":"eth-rt4-1" + }, + { + "type":"SR (IS-IS)", + "outLabel":16101, + "installed":true, + "interface":"eth-rt4-2" } ] } diff --git a/tests/topotests/isis-sr-topo1/rt2/step8/show_ip_route.ref b/tests/topotests/isis-sr-topo1/rt2/step8/show_ip_route.ref index a110c51077..159392f7f7 100644 --- a/tests/topotests/isis-sr-topo1/rt2/step8/show_ip_route.ref +++ b/tests/topotests/isis-sr-topo1/rt2/step8/show_ip_route.ref @@ -316,5 +316,38 @@ } ] } + ], + "10.10.10.10\/32":[ + { + "prefix":"10.10.10.10\/32", + "protocol":"isis", + "selected":true, + "destSelected":true, + "distance":115, + "metric":20, + "installed":true, + "nexthops":[ + { + "fib":true, + "ip":"10.0.2.4", + "afi":"ipv4", + "interfaceName":"eth-rt4-1", + "active":true, + "labels":[ + 16100 + ] + }, + { + "fib":true, + "ip":"10.0.3.4", + "afi":"ipv4", + "interfaceName":"eth-rt4-2", + "active":true, + "labels":[ + 16100 + ] + } + ] + } ] } diff --git a/tests/topotests/isis-sr-topo1/rt2/step8/show_ipv6_route.ref b/tests/topotests/isis-sr-topo1/rt2/step8/show_ipv6_route.ref index cb426897ce..e9f63849d8 100644 --- a/tests/topotests/isis-sr-topo1/rt2/step8/show_ipv6_route.ref +++ b/tests/topotests/isis-sr-topo1/rt2/step8/show_ipv6_route.ref @@ -126,5 +126,36 @@ } ] } + ], + "2001:db8:1000::10\/128":[ + { + "prefix":"2001:db8:1000::10\/128", + "protocol":"isis", + "selected":true, + "destSelected":true, + "distance":115, + "metric":20, + "installed":true, + "nexthops":[ + { + "fib":true, + "afi":"ipv6", + "interfaceName":"eth-rt4-1", + "active":true, + "labels":[ + 16101 + ] + }, + { + "fib":true, + "afi":"ipv6", + "interfaceName":"eth-rt4-2", + "active":true, + "labels":[ + 16101 + ] + } + ] + } ] } diff --git a/tests/topotests/isis-sr-topo1/rt2/step8/show_mpls_table.ref b/tests/topotests/isis-sr-topo1/rt2/step8/show_mpls_table.ref index 118ec89b5c..0692553808 100644 --- a/tests/topotests/isis-sr-topo1/rt2/step8/show_mpls_table.ref +++ b/tests/topotests/isis-sr-topo1/rt2/step8/show_mpls_table.ref @@ -77,13 +77,13 @@ "type":"SR (IS-IS)", "outLabel":16040, "installed":true, - "nexthop":"10.0.3.4" + "nexthop":"10.0.2.4" }, { "type":"SR (IS-IS)", "outLabel":16040, "installed":true, - "nexthop":"10.0.2.4" + "nexthop":"10.0.3.4" } ] }, @@ -95,13 +95,13 @@ "type":"SR (IS-IS)", "outLabel":16041, "installed":true, - "interface":"eth-rt4-2" + "interface":"eth-rt4-1" }, { "type":"SR (IS-IS)", "outLabel":16041, "installed":true, - "interface":"eth-rt4-1" + "interface":"eth-rt4-2" } ] }, @@ -137,13 +137,13 @@ "type":"SR (IS-IS)", "outLabel":16060, "installed":true, - "nexthop":"10.0.3.4" + "nexthop":"10.0.2.4" }, { "type":"SR (IS-IS)", "outLabel":16060, "installed":true, - "nexthop":"10.0.2.4" + "nexthop":"10.0.3.4" } ] }, @@ -155,13 +155,49 @@ "type":"SR (IS-IS)", "outLabel":16061, "installed":true, - "interface":"eth-rt4-2" + "interface":"eth-rt4-1" }, { "type":"SR (IS-IS)", "outLabel":16061, "installed":true, + "interface":"eth-rt4-2" + } + ] + }, + "16100":{ + "inLabel":16100, + "installed":true, + "nexthops":[ + { + "type":"SR (IS-IS)", + "outLabel":16100, + "installed":true, + "nexthop":"10.0.2.4" + }, + { + "type":"SR (IS-IS)", + "outLabel":16100, + "installed":true, + "nexthop":"10.0.3.4" + } + ] + }, + "16101":{ + "inLabel":16101, + "installed":true, + "nexthops":[ + { + "type":"SR (IS-IS)", + "outLabel":16101, + "installed":true, "interface":"eth-rt4-1" + }, + { + "type":"SR (IS-IS)", + "outLabel":16101, + "installed":true, + "interface":"eth-rt4-2" } ] } diff --git a/tests/topotests/isis-sr-topo1/rt2/step9/show_ip_route.ref b/tests/topotests/isis-sr-topo1/rt2/step9/show_ip_route.ref index 2e4c20257f..fc82ada7e3 100644 --- a/tests/topotests/isis-sr-topo1/rt2/step9/show_ip_route.ref +++ b/tests/topotests/isis-sr-topo1/rt2/step9/show_ip_route.ref @@ -316,5 +316,38 @@ } ] } + ], + "10.10.10.10\/32":[ + { + "prefix":"10.10.10.10\/32", + "protocol":"isis", + "selected":true, + "destSelected":true, + "distance":115, + "metric":20, + "installed":true, + "nexthops":[ + { + "fib":true, + "ip":"10.0.2.4", + "afi":"ipv4", + "interfaceName":"eth-rt4-1", + "active":true, + "labels":[ + 16100 + ] + }, + { + "fib":true, + "ip":"10.0.3.4", + "afi":"ipv4", + "interfaceName":"eth-rt4-2", + "active":true, + "labels":[ + 16100 + ] + } + ] + } ] } diff --git a/tests/topotests/isis-sr-topo1/rt2/step9/show_ipv6_route.ref b/tests/topotests/isis-sr-topo1/rt2/step9/show_ipv6_route.ref index 19837bc700..355436cbfc 100644 --- a/tests/topotests/isis-sr-topo1/rt2/step9/show_ipv6_route.ref +++ b/tests/topotests/isis-sr-topo1/rt2/step9/show_ipv6_route.ref @@ -126,5 +126,36 @@ } ] } + ], + "2001:db8:1000::10\/128":[ + { + "prefix":"2001:db8:1000::10\/128", + "protocol":"isis", + "selected":true, + "destSelected":true, + "distance":115, + "metric":20, + "installed":true, + "nexthops":[ + { + "fib":true, + "afi":"ipv6", + "interfaceName":"eth-rt4-1", + "active":true, + "labels":[ + 16101 + ] + }, + { + "fib":true, + "afi":"ipv6", + "interfaceName":"eth-rt4-2", + "active":true, + "labels":[ + 16101 + ] + } + ] + } ] } diff --git a/tests/topotests/isis-sr-topo1/rt2/step9/show_mpls_table.ref b/tests/topotests/isis-sr-topo1/rt2/step9/show_mpls_table.ref index 7c910fc6f6..05201724f4 100644 --- a/tests/topotests/isis-sr-topo1/rt2/step9/show_mpls_table.ref +++ b/tests/topotests/isis-sr-topo1/rt2/step9/show_mpls_table.ref @@ -77,13 +77,13 @@ "type":"SR (IS-IS)", "outLabel":16040, "installed":true, - "nexthop":"10.0.3.4" + "nexthop":"10.0.2.4" }, { "type":"SR (IS-IS)", "outLabel":16040, "installed":true, - "nexthop":"10.0.2.4" + "nexthop":"10.0.3.4" } ] }, @@ -95,13 +95,13 @@ "type":"SR (IS-IS)", "outLabel":16041, "installed":true, - "interface":"eth-rt4-2" + "interface":"eth-rt4-1" }, { "type":"SR (IS-IS)", "outLabel":16041, "installed":true, - "interface":"eth-rt4-1" + "interface":"eth-rt4-2" } ] }, @@ -137,13 +137,13 @@ "type":"SR (IS-IS)", "outLabel":16060, "installed":true, - "nexthop":"10.0.3.4" + "nexthop":"10.0.2.4" }, { "type":"SR (IS-IS)", "outLabel":16060, "installed":true, - "nexthop":"10.0.2.4" + "nexthop":"10.0.3.4" } ] }, @@ -155,13 +155,49 @@ "type":"SR (IS-IS)", "outLabel":16061, "installed":true, - "interface":"eth-rt4-2" + "interface":"eth-rt4-1" }, { "type":"SR (IS-IS)", "outLabel":16061, "installed":true, + "interface":"eth-rt4-2" + } + ] + }, + "16100":{ + "inLabel":16100, + "installed":true, + "nexthops":[ + { + "type":"SR (IS-IS)", + "outLabel":16100, + "installed":true, + "nexthop":"10.0.2.4" + }, + { + "type":"SR (IS-IS)", + "outLabel":16100, + "installed":true, + "nexthop":"10.0.3.4" + } + ] + }, + "16101":{ + "inLabel":16101, + "installed":true, + "nexthops":[ + { + "type":"SR (IS-IS)", + "outLabel":16101, + "installed":true, "interface":"eth-rt4-1" + }, + { + "type":"SR (IS-IS)", + "outLabel":16101, + "installed":true, + "interface":"eth-rt4-2" } ] } diff --git a/tests/topotests/isis-sr-topo1/rt3/step1/show_ip_route.ref b/tests/topotests/isis-sr-topo1/rt3/step1/show_ip_route.ref index 8d4fbec4b5..241f768859 100644 --- a/tests/topotests/isis-sr-topo1/rt3/step1/show_ip_route.ref +++ b/tests/topotests/isis-sr-topo1/rt3/step1/show_ip_route.ref @@ -343,5 +343,38 @@ } ] } + ], + "10.10.10.10\/32":[ + { + "prefix":"10.10.10.10\/32", + "protocol":"isis", + "selected":true, + "destSelected":true, + "distance":115, + "metric":20, + "installed":true, + "nexthops":[ + { + "fib":true, + "ip":"10.0.4.5", + "afi":"ipv4", + "interfaceName":"eth-rt5-1", + "active":true, + "labels":[ + 16100 + ] + }, + { + "fib":true, + "ip":"10.0.5.5", + "afi":"ipv4", + "interfaceName":"eth-rt5-2", + "active":true, + "labels":[ + 16100 + ] + } + ] + } ] } diff --git a/tests/topotests/isis-sr-topo1/rt3/step1/show_ipv6_route.ref b/tests/topotests/isis-sr-topo1/rt3/step1/show_ipv6_route.ref index 4e4961eaf0..dd78c7d318 100644 --- a/tests/topotests/isis-sr-topo1/rt3/step1/show_ipv6_route.ref +++ b/tests/topotests/isis-sr-topo1/rt3/step1/show_ipv6_route.ref @@ -56,7 +56,7 @@ { "fib":true, "afi":"ipv6", - "interfaceName":"eth-rt5-2", + "interfaceName":"eth-sw1", "active":true, "labels":[ 16041 @@ -65,7 +65,7 @@ { "fib":true, "afi":"ipv6", - "interfaceName":"eth-sw1", + "interfaceName":"eth-rt5-1", "active":true, "labels":[ 16041 @@ -74,7 +74,7 @@ { "fib":true, "afi":"ipv6", - "interfaceName":"eth-rt5-1", + "interfaceName":"eth-rt5-2", "active":true, "labels":[ 16041 @@ -96,7 +96,7 @@ { "fib":true, "afi":"ipv6", - "interfaceName":"eth-rt5-2", + "interfaceName":"eth-rt5-1", "active":true, "labels":[ 16051 @@ -105,7 +105,7 @@ { "fib":true, "afi":"ipv6", - "interfaceName":"eth-rt5-1", + "interfaceName":"eth-rt5-2", "active":true, "labels":[ 16051 @@ -127,7 +127,7 @@ { "fib":true, "afi":"ipv6", - "interfaceName":"eth-rt5-2", + "interfaceName":"eth-rt5-1", "active":true, "labels":[ 16061 @@ -136,7 +136,7 @@ { "fib":true, "afi":"ipv6", - "interfaceName":"eth-rt5-1", + "interfaceName":"eth-rt5-2", "active":true, "labels":[ 16061 @@ -144,5 +144,36 @@ } ] } + ], + "2001:db8:1000::10\/128":[ + { + "prefix":"2001:db8:1000::10\/128", + "protocol":"isis", + "selected":true, + "destSelected":true, + "distance":115, + "metric":20, + "installed":true, + "nexthops":[ + { + "fib":true, + "afi":"ipv6", + "interfaceName":"eth-rt5-1", + "active":true, + "labels":[ + 16101 + ] + }, + { + "fib":true, + "afi":"ipv6", + "interfaceName":"eth-rt5-2", + "active":true, + "labels":[ + 16101 + ] + } + ] + } ] } diff --git a/tests/topotests/isis-sr-topo1/rt3/step1/show_mpls_table.ref b/tests/topotests/isis-sr-topo1/rt3/step1/show_mpls_table.ref index b7bdc3e4af..8c6fca7b57 100644 --- a/tests/topotests/isis-sr-topo1/rt3/step1/show_mpls_table.ref +++ b/tests/topotests/isis-sr-topo1/rt3/step1/show_mpls_table.ref @@ -77,19 +77,19 @@ "type":"SR (IS-IS)", "outLabel":16040, "installed":true, - "nexthop":"10.0.1.2" + "nexthop":"10.0.5.5" }, { "type":"SR (IS-IS)", "outLabel":16040, "installed":true, - "nexthop":"10.0.5.5" + "nexthop":"10.0.4.5" }, { "type":"SR (IS-IS)", "outLabel":16040, "installed":true, - "nexthop":"10.0.4.5" + "nexthop":"10.0.1.2" } ] }, @@ -101,19 +101,19 @@ "type":"SR (IS-IS)", "outLabel":16041, "installed":true, - "interface":"eth-sw1" + "interface":"eth-rt5-2" }, { "type":"SR (IS-IS)", "outLabel":16041, "installed":true, - "interface":"eth-rt5-2" + "interface":"eth-rt5-1" }, { "type":"SR (IS-IS)", "outLabel":16041, "installed":true, - "interface":"eth-rt5-1" + "interface":"eth-sw1" } ] }, @@ -188,5 +188,41 @@ "interface":"eth-rt5-1" } ] + }, + "17100":{ + "inLabel":17100, + "installed":true, + "nexthops":[ + { + "type":"SR (IS-IS)", + "outLabel":16100, + "installed":true, + "nexthop":"10.0.5.5" + }, + { + "type":"SR (IS-IS)", + "outLabel":16100, + "installed":true, + "nexthop":"10.0.4.5" + } + ] + }, + "17101":{ + "inLabel":17101, + "installed":true, + "nexthops":[ + { + "type":"SR (IS-IS)", + "outLabel":16101, + "installed":true, + "interface":"eth-rt5-2" + }, + { + "type":"SR (IS-IS)", + "outLabel":16101, + "installed":true, + "interface":"eth-rt5-1" + } + ] } } diff --git a/tests/topotests/isis-sr-topo1/rt3/step10/show_ip_route.ref b/tests/topotests/isis-sr-topo1/rt3/step10/show_ip_route.ref index 9522b141b0..40a98ab7c6 100644 --- a/tests/topotests/isis-sr-topo1/rt3/step10/show_ip_route.ref +++ b/tests/topotests/isis-sr-topo1/rt3/step10/show_ip_route.ref @@ -323,5 +323,38 @@ } ] } + ], + "10.10.10.10\/32":[ + { + "prefix":"10.10.10.10\/32", + "protocol":"isis", + "selected":true, + "destSelected":true, + "distance":115, + "metric":20, + "installed":true, + "nexthops":[ + { + "fib":true, + "ip":"10.0.4.5", + "afi":"ipv4", + "interfaceName":"eth-rt5-1", + "active":true, + "labels":[ + 16100 + ] + }, + { + "fib":true, + "ip":"10.0.5.5", + "afi":"ipv4", + "interfaceName":"eth-rt5-2", + "active":true, + "labels":[ + 16100 + ] + } + ] + } ] } diff --git a/tests/topotests/isis-sr-topo1/rt3/step10/show_ipv6_route.ref b/tests/topotests/isis-sr-topo1/rt3/step10/show_ipv6_route.ref index fb630bc68f..1fb50407bd 100644 --- a/tests/topotests/isis-sr-topo1/rt3/step10/show_ipv6_route.ref +++ b/tests/topotests/isis-sr-topo1/rt3/step10/show_ipv6_route.ref @@ -78,7 +78,7 @@ { "fib":true, "afi":"ipv6", - "interfaceName":"eth-rt5-2", + "interfaceName":"eth-rt5-1", "active":true, "labels":[ 16051 @@ -87,7 +87,7 @@ { "fib":true, "afi":"ipv6", - "interfaceName":"eth-rt5-1", + "interfaceName":"eth-rt5-2", "active":true, "labels":[ 16051 @@ -109,7 +109,7 @@ { "fib":true, "afi":"ipv6", - "interfaceName":"eth-rt5-2", + "interfaceName":"eth-rt5-1", "active":true, "labels":[ 16061 @@ -118,7 +118,7 @@ { "fib":true, "afi":"ipv6", - "interfaceName":"eth-rt5-1", + "interfaceName":"eth-rt5-2", "active":true, "labels":[ 16061 @@ -126,5 +126,36 @@ } ] } + ], + "2001:db8:1000::10\/128":[ + { + "prefix":"2001:db8:1000::10\/128", + "protocol":"isis", + "selected":true, + "destSelected":true, + "distance":115, + "metric":20, + "installed":true, + "nexthops":[ + { + "fib":true, + "afi":"ipv6", + "interfaceName":"eth-rt5-1", + "active":true, + "labels":[ + 16101 + ] + }, + { + "fib":true, + "afi":"ipv6", + "interfaceName":"eth-rt5-2", + "active":true, + "labels":[ + 16101 + ] + } + ] + } ] } diff --git a/tests/topotests/isis-sr-topo1/rt3/step10/show_mpls_table.ref b/tests/topotests/isis-sr-topo1/rt3/step10/show_mpls_table.ref index 4aec3b6904..44ddc4bc14 100644 --- a/tests/topotests/isis-sr-topo1/rt3/step10/show_mpls_table.ref +++ b/tests/topotests/isis-sr-topo1/rt3/step10/show_mpls_table.ref @@ -164,5 +164,41 @@ "interface":"eth-rt5-1" } ] + }, + "17100":{ + "inLabel":17100, + "installed":true, + "nexthops":[ + { + "type":"SR (IS-IS)", + "outLabel":16100, + "installed":true, + "nexthop":"10.0.5.5" + }, + { + "type":"SR (IS-IS)", + "outLabel":16100, + "installed":true, + "nexthop":"10.0.4.5" + } + ] + }, + "17101":{ + "inLabel":17101, + "installed":true, + "nexthops":[ + { + "type":"SR (IS-IS)", + "outLabel":16101, + "installed":true, + "interface":"eth-rt5-2" + }, + { + "type":"SR (IS-IS)", + "outLabel":16101, + "installed":true, + "interface":"eth-rt5-1" + } + ] } } diff --git a/tests/topotests/isis-sr-topo1/rt3/step2/show_ip_route.ref b/tests/topotests/isis-sr-topo1/rt3/step2/show_ip_route.ref index 46ebeb8ab9..55d8213c4e 100644 --- a/tests/topotests/isis-sr-topo1/rt3/step2/show_ip_route.ref +++ b/tests/topotests/isis-sr-topo1/rt3/step2/show_ip_route.ref @@ -323,5 +323,38 @@ } ] } + ], + "10.10.10.10\/32":[ + { + "prefix":"10.10.10.10\/32", + "protocol":"isis", + "selected":true, + "destSelected":true, + "distance":115, + "metric":20, + "installed":true, + "nexthops":[ + { + "fib":true, + "ip":"10.0.4.5", + "afi":"ipv4", + "interfaceName":"eth-rt5-1", + "active":true, + "labels":[ + 16100 + ] + }, + { + "fib":true, + "ip":"10.0.5.5", + "afi":"ipv4", + "interfaceName":"eth-rt5-2", + "active":true, + "labels":[ + 16100 + ] + } + ] + } ] } diff --git a/tests/topotests/isis-sr-topo1/rt3/step2/show_ipv6_route.ref b/tests/topotests/isis-sr-topo1/rt3/step2/show_ipv6_route.ref index b2c774d493..4f6441e7b9 100644 --- a/tests/topotests/isis-sr-topo1/rt3/step2/show_ipv6_route.ref +++ b/tests/topotests/isis-sr-topo1/rt3/step2/show_ipv6_route.ref @@ -78,7 +78,7 @@ { "fib":true, "afi":"ipv6", - "interfaceName":"eth-rt5-2", + "interfaceName":"eth-rt5-1", "active":true, "labels":[ 16051 @@ -87,7 +87,7 @@ { "fib":true, "afi":"ipv6", - "interfaceName":"eth-rt5-1", + "interfaceName":"eth-rt5-2", "active":true, "labels":[ 16051 @@ -109,7 +109,7 @@ { "fib":true, "afi":"ipv6", - "interfaceName":"eth-rt5-2", + "interfaceName":"eth-rt5-1", "active":true, "labels":[ 16061 @@ -118,7 +118,7 @@ { "fib":true, "afi":"ipv6", - "interfaceName":"eth-rt5-1", + "interfaceName":"eth-rt5-2", "active":true, "labels":[ 16061 @@ -126,5 +126,36 @@ } ] } + ], + "2001:db8:1000::10\/128":[ + { + "prefix":"2001:db8:1000::10\/128", + "protocol":"isis", + "selected":true, + "destSelected":true, + "distance":115, + "metric":20, + "installed":true, + "nexthops":[ + { + "fib":true, + "afi":"ipv6", + "interfaceName":"eth-rt5-1", + "active":true, + "labels":[ + 16101 + ] + }, + { + "fib":true, + "afi":"ipv6", + "interfaceName":"eth-rt5-2", + "active":true, + "labels":[ + 16101 + ] + } + ] + } ] } diff --git a/tests/topotests/isis-sr-topo1/rt3/step2/show_mpls_table.ref b/tests/topotests/isis-sr-topo1/rt3/step2/show_mpls_table.ref index a1e64afd67..db8253f83d 100644 --- a/tests/topotests/isis-sr-topo1/rt3/step2/show_mpls_table.ref +++ b/tests/topotests/isis-sr-topo1/rt3/step2/show_mpls_table.ref @@ -164,5 +164,41 @@ "interface":"eth-rt5-1" } ] + }, + "17100":{ + "inLabel":17100, + "installed":true, + "nexthops":[ + { + "type":"SR (IS-IS)", + "outLabel":16100, + "installed":true, + "nexthop":"10.0.5.5" + }, + { + "type":"SR (IS-IS)", + "outLabel":16100, + "installed":true, + "nexthop":"10.0.4.5" + } + ] + }, + "17101":{ + "inLabel":17101, + "installed":true, + "nexthops":[ + { + "type":"SR (IS-IS)", + "outLabel":16101, + "installed":true, + "interface":"eth-rt5-2" + }, + { + "type":"SR (IS-IS)", + "outLabel":16101, + "installed":true, + "interface":"eth-rt5-1" + } + ] } } diff --git a/tests/topotests/isis-sr-topo1/rt3/step3/show_ip_route.ref b/tests/topotests/isis-sr-topo1/rt3/step3/show_ip_route.ref index 738aa17406..ed5cef8a5b 100644 --- a/tests/topotests/isis-sr-topo1/rt3/step3/show_ip_route.ref +++ b/tests/topotests/isis-sr-topo1/rt3/step3/show_ip_route.ref @@ -276,5 +276,38 @@ } ] } + ], + "10.10.10.10\/32":[ + { + "prefix":"10.10.10.10\/32", + "protocol":"isis", + "selected":true, + "destSelected":true, + "distance":115, + "metric":20, + "installed":true, + "nexthops":[ + { + "fib":true, + "ip":"10.0.4.5", + "afi":"ipv4", + "interfaceName":"eth-rt5-1", + "active":true, + "labels":[ + 16100 + ] + }, + { + "fib":true, + "ip":"10.0.5.5", + "afi":"ipv4", + "interfaceName":"eth-rt5-2", + "active":true, + "labels":[ + 16100 + ] + } + ] + } ] } diff --git a/tests/topotests/isis-sr-topo1/rt3/step3/show_ipv6_route.ref b/tests/topotests/isis-sr-topo1/rt3/step3/show_ipv6_route.ref index b6423cd2b8..b33058c3bd 100644 --- a/tests/topotests/isis-sr-topo1/rt3/step3/show_ipv6_route.ref +++ b/tests/topotests/isis-sr-topo1/rt3/step3/show_ipv6_route.ref @@ -78,7 +78,7 @@ { "fib":true, "afi":"ipv6", - "interfaceName":"eth-rt5-2", + "interfaceName":"eth-rt5-1", "active":true, "labels":[ 16051 @@ -87,7 +87,7 @@ { "fib":true, "afi":"ipv6", - "interfaceName":"eth-rt5-1", + "interfaceName":"eth-rt5-2", "active":true, "labels":[ 16051 @@ -95,5 +95,36 @@ } ] } + ], + "2001:db8:1000::10\/128":[ + { + "prefix":"2001:db8:1000::10\/128", + "protocol":"isis", + "selected":true, + "destSelected":true, + "distance":115, + "metric":20, + "installed":true, + "nexthops":[ + { + "fib":true, + "afi":"ipv6", + "interfaceName":"eth-rt5-1", + "active":true, + "labels":[ + 16101 + ] + }, + { + "fib":true, + "afi":"ipv6", + "interfaceName":"eth-rt5-2", + "active":true, + "labels":[ + 16101 + ] + } + ] + } ] } diff --git a/tests/topotests/isis-sr-topo1/rt3/step3/show_mpls_table.ref b/tests/topotests/isis-sr-topo1/rt3/step3/show_mpls_table.ref index 1a2b8728e6..70cccc0f0b 100644 --- a/tests/topotests/isis-sr-topo1/rt3/step3/show_mpls_table.ref +++ b/tests/topotests/isis-sr-topo1/rt3/step3/show_mpls_table.ref @@ -128,5 +128,41 @@ "interface":"eth-rt5-1" } ] + }, + "17100":{ + "inLabel":17100, + "installed":true, + "nexthops":[ + { + "type":"SR (IS-IS)", + "outLabel":16100, + "installed":true, + "nexthop":"10.0.5.5" + }, + { + "type":"SR (IS-IS)", + "outLabel":16100, + "installed":true, + "nexthop":"10.0.4.5" + } + ] + }, + "17101":{ + "inLabel":17101, + "installed":true, + "nexthops":[ + { + "type":"SR (IS-IS)", + "outLabel":16101, + "installed":true, + "interface":"eth-rt5-2" + }, + { + "type":"SR (IS-IS)", + "outLabel":16101, + "installed":true, + "interface":"eth-rt5-1" + } + ] } } diff --git a/tests/topotests/isis-sr-topo1/rt3/step4/show_ip_route.ref b/tests/topotests/isis-sr-topo1/rt3/step4/show_ip_route.ref index 46ebeb8ab9..55d8213c4e 100644 --- a/tests/topotests/isis-sr-topo1/rt3/step4/show_ip_route.ref +++ b/tests/topotests/isis-sr-topo1/rt3/step4/show_ip_route.ref @@ -323,5 +323,38 @@ } ] } + ], + "10.10.10.10\/32":[ + { + "prefix":"10.10.10.10\/32", + "protocol":"isis", + "selected":true, + "destSelected":true, + "distance":115, + "metric":20, + "installed":true, + "nexthops":[ + { + "fib":true, + "ip":"10.0.4.5", + "afi":"ipv4", + "interfaceName":"eth-rt5-1", + "active":true, + "labels":[ + 16100 + ] + }, + { + "fib":true, + "ip":"10.0.5.5", + "afi":"ipv4", + "interfaceName":"eth-rt5-2", + "active":true, + "labels":[ + 16100 + ] + } + ] + } ] } diff --git a/tests/topotests/isis-sr-topo1/rt3/step4/show_ipv6_route.ref b/tests/topotests/isis-sr-topo1/rt3/step4/show_ipv6_route.ref index b2c774d493..4f6441e7b9 100644 --- a/tests/topotests/isis-sr-topo1/rt3/step4/show_ipv6_route.ref +++ b/tests/topotests/isis-sr-topo1/rt3/step4/show_ipv6_route.ref @@ -78,7 +78,7 @@ { "fib":true, "afi":"ipv6", - "interfaceName":"eth-rt5-2", + "interfaceName":"eth-rt5-1", "active":true, "labels":[ 16051 @@ -87,7 +87,7 @@ { "fib":true, "afi":"ipv6", - "interfaceName":"eth-rt5-1", + "interfaceName":"eth-rt5-2", "active":true, "labels":[ 16051 @@ -109,7 +109,7 @@ { "fib":true, "afi":"ipv6", - "interfaceName":"eth-rt5-2", + "interfaceName":"eth-rt5-1", "active":true, "labels":[ 16061 @@ -118,7 +118,7 @@ { "fib":true, "afi":"ipv6", - "interfaceName":"eth-rt5-1", + "interfaceName":"eth-rt5-2", "active":true, "labels":[ 16061 @@ -126,5 +126,36 @@ } ] } + ], + "2001:db8:1000::10\/128":[ + { + "prefix":"2001:db8:1000::10\/128", + "protocol":"isis", + "selected":true, + "destSelected":true, + "distance":115, + "metric":20, + "installed":true, + "nexthops":[ + { + "fib":true, + "afi":"ipv6", + "interfaceName":"eth-rt5-1", + "active":true, + "labels":[ + 16101 + ] + }, + { + "fib":true, + "afi":"ipv6", + "interfaceName":"eth-rt5-2", + "active":true, + "labels":[ + 16101 + ] + } + ] + } ] } diff --git a/tests/topotests/isis-sr-topo1/rt3/step4/show_mpls_table.ref b/tests/topotests/isis-sr-topo1/rt3/step4/show_mpls_table.ref index a1e64afd67..db8253f83d 100644 --- a/tests/topotests/isis-sr-topo1/rt3/step4/show_mpls_table.ref +++ b/tests/topotests/isis-sr-topo1/rt3/step4/show_mpls_table.ref @@ -164,5 +164,41 @@ "interface":"eth-rt5-1" } ] + }, + "17100":{ + "inLabel":17100, + "installed":true, + "nexthops":[ + { + "type":"SR (IS-IS)", + "outLabel":16100, + "installed":true, + "nexthop":"10.0.5.5" + }, + { + "type":"SR (IS-IS)", + "outLabel":16100, + "installed":true, + "nexthop":"10.0.4.5" + } + ] + }, + "17101":{ + "inLabel":17101, + "installed":true, + "nexthops":[ + { + "type":"SR (IS-IS)", + "outLabel":16101, + "installed":true, + "interface":"eth-rt5-2" + }, + { + "type":"SR (IS-IS)", + "outLabel":16101, + "installed":true, + "interface":"eth-rt5-1" + } + ] } } diff --git a/tests/topotests/isis-sr-topo1/rt3/step5/show_ip_route.ref b/tests/topotests/isis-sr-topo1/rt3/step5/show_ip_route.ref index 489b495bb1..3adcdce58c 100644 --- a/tests/topotests/isis-sr-topo1/rt3/step5/show_ip_route.ref +++ b/tests/topotests/isis-sr-topo1/rt3/step5/show_ip_route.ref @@ -317,5 +317,38 @@ } ] } + ], + "10.10.10.10\/32":[ + { + "prefix":"10.10.10.10\/32", + "protocol":"isis", + "selected":true, + "destSelected":true, + "distance":115, + "metric":20, + "installed":true, + "nexthops":[ + { + "fib":true, + "ip":"10.0.4.5", + "afi":"ipv4", + "interfaceName":"eth-rt5-1", + "active":true, + "labels":[ + 16100 + ] + }, + { + "fib":true, + "ip":"10.0.5.5", + "afi":"ipv4", + "interfaceName":"eth-rt5-2", + "active":true, + "labels":[ + 16100 + ] + } + ] + } ] } diff --git a/tests/topotests/isis-sr-topo1/rt3/step5/show_ipv6_route.ref b/tests/topotests/isis-sr-topo1/rt3/step5/show_ipv6_route.ref index 46ee7ba28e..863e26c30e 100644 --- a/tests/topotests/isis-sr-topo1/rt3/step5/show_ipv6_route.ref +++ b/tests/topotests/isis-sr-topo1/rt3/step5/show_ipv6_route.ref @@ -78,7 +78,7 @@ { "fib":true, "afi":"ipv6", - "interfaceName":"eth-rt5-2", + "interfaceName":"eth-rt5-1", "active":true, "labels":[ 16051 @@ -87,7 +87,7 @@ { "fib":true, "afi":"ipv6", - "interfaceName":"eth-rt5-1", + "interfaceName":"eth-rt5-2", "active":true, "labels":[ 16051 @@ -109,16 +109,47 @@ { "fib":true, "afi":"ipv6", - "interfaceName":"eth-rt5-2", + "interfaceName":"eth-rt5-1", "active":true }, { "fib":true, "afi":"ipv6", - "interfaceName":"eth-rt5-1", + "interfaceName":"eth-rt5-2", "active":true } ] } + ], + "2001:db8:1000::10\/128":[ + { + "prefix":"2001:db8:1000::10\/128", + "protocol":"isis", + "selected":true, + "destSelected":true, + "distance":115, + "metric":20, + "installed":true, + "nexthops":[ + { + "fib":true, + "afi":"ipv6", + "interfaceName":"eth-rt5-1", + "active":true, + "labels":[ + 16101 + ] + }, + { + "fib":true, + "afi":"ipv6", + "interfaceName":"eth-rt5-2", + "active":true, + "labels":[ + 16101 + ] + } + ] + } ] } diff --git a/tests/topotests/isis-sr-topo1/rt3/step5/show_mpls_table.ref b/tests/topotests/isis-sr-topo1/rt3/step5/show_mpls_table.ref index 1a2b8728e6..70cccc0f0b 100644 --- a/tests/topotests/isis-sr-topo1/rt3/step5/show_mpls_table.ref +++ b/tests/topotests/isis-sr-topo1/rt3/step5/show_mpls_table.ref @@ -128,5 +128,41 @@ "interface":"eth-rt5-1" } ] + }, + "17100":{ + "inLabel":17100, + "installed":true, + "nexthops":[ + { + "type":"SR (IS-IS)", + "outLabel":16100, + "installed":true, + "nexthop":"10.0.5.5" + }, + { + "type":"SR (IS-IS)", + "outLabel":16100, + "installed":true, + "nexthop":"10.0.4.5" + } + ] + }, + "17101":{ + "inLabel":17101, + "installed":true, + "nexthops":[ + { + "type":"SR (IS-IS)", + "outLabel":16101, + "installed":true, + "interface":"eth-rt5-2" + }, + { + "type":"SR (IS-IS)", + "outLabel":16101, + "installed":true, + "interface":"eth-rt5-1" + } + ] } } diff --git a/tests/topotests/isis-sr-topo1/rt3/step6/show_ip_route.ref b/tests/topotests/isis-sr-topo1/rt3/step6/show_ip_route.ref index 46ebeb8ab9..55d8213c4e 100644 --- a/tests/topotests/isis-sr-topo1/rt3/step6/show_ip_route.ref +++ b/tests/topotests/isis-sr-topo1/rt3/step6/show_ip_route.ref @@ -323,5 +323,38 @@ } ] } + ], + "10.10.10.10\/32":[ + { + "prefix":"10.10.10.10\/32", + "protocol":"isis", + "selected":true, + "destSelected":true, + "distance":115, + "metric":20, + "installed":true, + "nexthops":[ + { + "fib":true, + "ip":"10.0.4.5", + "afi":"ipv4", + "interfaceName":"eth-rt5-1", + "active":true, + "labels":[ + 16100 + ] + }, + { + "fib":true, + "ip":"10.0.5.5", + "afi":"ipv4", + "interfaceName":"eth-rt5-2", + "active":true, + "labels":[ + 16100 + ] + } + ] + } ] } diff --git a/tests/topotests/isis-sr-topo1/rt3/step6/show_ipv6_route.ref b/tests/topotests/isis-sr-topo1/rt3/step6/show_ipv6_route.ref index b2c774d493..4f6441e7b9 100644 --- a/tests/topotests/isis-sr-topo1/rt3/step6/show_ipv6_route.ref +++ b/tests/topotests/isis-sr-topo1/rt3/step6/show_ipv6_route.ref @@ -78,7 +78,7 @@ { "fib":true, "afi":"ipv6", - "interfaceName":"eth-rt5-2", + "interfaceName":"eth-rt5-1", "active":true, "labels":[ 16051 @@ -87,7 +87,7 @@ { "fib":true, "afi":"ipv6", - "interfaceName":"eth-rt5-1", + "interfaceName":"eth-rt5-2", "active":true, "labels":[ 16051 @@ -109,7 +109,7 @@ { "fib":true, "afi":"ipv6", - "interfaceName":"eth-rt5-2", + "interfaceName":"eth-rt5-1", "active":true, "labels":[ 16061 @@ -118,7 +118,7 @@ { "fib":true, "afi":"ipv6", - "interfaceName":"eth-rt5-1", + "interfaceName":"eth-rt5-2", "active":true, "labels":[ 16061 @@ -126,5 +126,36 @@ } ] } + ], + "2001:db8:1000::10\/128":[ + { + "prefix":"2001:db8:1000::10\/128", + "protocol":"isis", + "selected":true, + "destSelected":true, + "distance":115, + "metric":20, + "installed":true, + "nexthops":[ + { + "fib":true, + "afi":"ipv6", + "interfaceName":"eth-rt5-1", + "active":true, + "labels":[ + 16101 + ] + }, + { + "fib":true, + "afi":"ipv6", + "interfaceName":"eth-rt5-2", + "active":true, + "labels":[ + 16101 + ] + } + ] + } ] } diff --git a/tests/topotests/isis-sr-topo1/rt3/step6/show_mpls_table.ref b/tests/topotests/isis-sr-topo1/rt3/step6/show_mpls_table.ref index a1e64afd67..db8253f83d 100644 --- a/tests/topotests/isis-sr-topo1/rt3/step6/show_mpls_table.ref +++ b/tests/topotests/isis-sr-topo1/rt3/step6/show_mpls_table.ref @@ -164,5 +164,41 @@ "interface":"eth-rt5-1" } ] + }, + "17100":{ + "inLabel":17100, + "installed":true, + "nexthops":[ + { + "type":"SR (IS-IS)", + "outLabel":16100, + "installed":true, + "nexthop":"10.0.5.5" + }, + { + "type":"SR (IS-IS)", + "outLabel":16100, + "installed":true, + "nexthop":"10.0.4.5" + } + ] + }, + "17101":{ + "inLabel":17101, + "installed":true, + "nexthops":[ + { + "type":"SR (IS-IS)", + "outLabel":16101, + "installed":true, + "interface":"eth-rt5-2" + }, + { + "type":"SR (IS-IS)", + "outLabel":16101, + "installed":true, + "interface":"eth-rt5-1" + } + ] } } diff --git a/tests/topotests/isis-sr-topo1/rt3/step7/show_ip_route.ref b/tests/topotests/isis-sr-topo1/rt3/step7/show_ip_route.ref index 1e8c27c01f..7f6e05f08b 100644 --- a/tests/topotests/isis-sr-topo1/rt3/step7/show_ip_route.ref +++ b/tests/topotests/isis-sr-topo1/rt3/step7/show_ip_route.ref @@ -320,5 +320,38 @@ } ] } + ], + "10.10.10.10\/32":[ + { + "prefix":"10.10.10.10\/32", + "protocol":"isis", + "selected":true, + "destSelected":true, + "distance":115, + "metric":20, + "installed":true, + "nexthops":[ + { + "fib":true, + "ip":"10.0.4.5", + "afi":"ipv4", + "interfaceName":"eth-rt5-1", + "active":true, + "labels":[ + 16100 + ] + }, + { + "fib":true, + "ip":"10.0.5.5", + "afi":"ipv4", + "interfaceName":"eth-rt5-2", + "active":true, + "labels":[ + 16100 + ] + } + ] + } ] } diff --git a/tests/topotests/isis-sr-topo1/rt3/step7/show_ipv6_route.ref b/tests/topotests/isis-sr-topo1/rt3/step7/show_ipv6_route.ref index d21700d407..f4770e2ac9 100644 --- a/tests/topotests/isis-sr-topo1/rt3/step7/show_ipv6_route.ref +++ b/tests/topotests/isis-sr-topo1/rt3/step7/show_ipv6_route.ref @@ -75,7 +75,7 @@ { "fib":true, "afi":"ipv6", - "interfaceName":"eth-rt5-2", + "interfaceName":"eth-rt5-1", "active":true, "labels":[ 16051 @@ -84,7 +84,7 @@ { "fib":true, "afi":"ipv6", - "interfaceName":"eth-rt5-1", + "interfaceName":"eth-rt5-2", "active":true, "labels":[ 16051 @@ -106,7 +106,7 @@ { "fib":true, "afi":"ipv6", - "interfaceName":"eth-rt5-2", + "interfaceName":"eth-rt5-1", "active":true, "labels":[ 16061 @@ -115,7 +115,7 @@ { "fib":true, "afi":"ipv6", - "interfaceName":"eth-rt5-1", + "interfaceName":"eth-rt5-2", "active":true, "labels":[ 16061 @@ -123,5 +123,36 @@ } ] } + ], + "2001:db8:1000::10\/128":[ + { + "prefix":"2001:db8:1000::10\/128", + "protocol":"isis", + "selected":true, + "destSelected":true, + "distance":115, + "metric":20, + "installed":true, + "nexthops":[ + { + "fib":true, + "afi":"ipv6", + "interfaceName":"eth-rt5-1", + "active":true, + "labels":[ + 16101 + ] + }, + { + "fib":true, + "afi":"ipv6", + "interfaceName":"eth-rt5-2", + "active":true, + "labels":[ + 16101 + ] + } + ] + } ] } diff --git a/tests/topotests/isis-sr-topo1/rt3/step7/show_mpls_table.ref b/tests/topotests/isis-sr-topo1/rt3/step7/show_mpls_table.ref index e97e0d017b..cb49505f55 100644 --- a/tests/topotests/isis-sr-topo1/rt3/step7/show_mpls_table.ref +++ b/tests/topotests/isis-sr-topo1/rt3/step7/show_mpls_table.ref @@ -140,5 +140,41 @@ "interface":"eth-rt5-1" } ] + }, + "17100":{ + "inLabel":17100, + "installed":true, + "nexthops":[ + { + "type":"SR (IS-IS)", + "outLabel":16100, + "installed":true, + "nexthop":"10.0.5.5" + }, + { + "type":"SR (IS-IS)", + "outLabel":16100, + "installed":true, + "nexthop":"10.0.4.5" + } + ] + }, + "17101":{ + "inLabel":17101, + "installed":true, + "nexthops":[ + { + "type":"SR (IS-IS)", + "outLabel":16101, + "installed":true, + "interface":"eth-rt5-2" + }, + { + "type":"SR (IS-IS)", + "outLabel":16101, + "installed":true, + "interface":"eth-rt5-1" + } + ] } } diff --git a/tests/topotests/isis-sr-topo1/rt3/step8/show_ip_route.ref b/tests/topotests/isis-sr-topo1/rt3/step8/show_ip_route.ref index 46ebeb8ab9..55d8213c4e 100644 --- a/tests/topotests/isis-sr-topo1/rt3/step8/show_ip_route.ref +++ b/tests/topotests/isis-sr-topo1/rt3/step8/show_ip_route.ref @@ -323,5 +323,38 @@ } ] } + ], + "10.10.10.10\/32":[ + { + "prefix":"10.10.10.10\/32", + "protocol":"isis", + "selected":true, + "destSelected":true, + "distance":115, + "metric":20, + "installed":true, + "nexthops":[ + { + "fib":true, + "ip":"10.0.4.5", + "afi":"ipv4", + "interfaceName":"eth-rt5-1", + "active":true, + "labels":[ + 16100 + ] + }, + { + "fib":true, + "ip":"10.0.5.5", + "afi":"ipv4", + "interfaceName":"eth-rt5-2", + "active":true, + "labels":[ + 16100 + ] + } + ] + } ] } diff --git a/tests/topotests/isis-sr-topo1/rt3/step8/show_ipv6_route.ref b/tests/topotests/isis-sr-topo1/rt3/step8/show_ipv6_route.ref index b2c774d493..4f6441e7b9 100644 --- a/tests/topotests/isis-sr-topo1/rt3/step8/show_ipv6_route.ref +++ b/tests/topotests/isis-sr-topo1/rt3/step8/show_ipv6_route.ref @@ -78,7 +78,7 @@ { "fib":true, "afi":"ipv6", - "interfaceName":"eth-rt5-2", + "interfaceName":"eth-rt5-1", "active":true, "labels":[ 16051 @@ -87,7 +87,7 @@ { "fib":true, "afi":"ipv6", - "interfaceName":"eth-rt5-1", + "interfaceName":"eth-rt5-2", "active":true, "labels":[ 16051 @@ -109,7 +109,7 @@ { "fib":true, "afi":"ipv6", - "interfaceName":"eth-rt5-2", + "interfaceName":"eth-rt5-1", "active":true, "labels":[ 16061 @@ -118,7 +118,7 @@ { "fib":true, "afi":"ipv6", - "interfaceName":"eth-rt5-1", + "interfaceName":"eth-rt5-2", "active":true, "labels":[ 16061 @@ -126,5 +126,36 @@ } ] } + ], + "2001:db8:1000::10\/128":[ + { + "prefix":"2001:db8:1000::10\/128", + "protocol":"isis", + "selected":true, + "destSelected":true, + "distance":115, + "metric":20, + "installed":true, + "nexthops":[ + { + "fib":true, + "afi":"ipv6", + "interfaceName":"eth-rt5-1", + "active":true, + "labels":[ + 16101 + ] + }, + { + "fib":true, + "afi":"ipv6", + "interfaceName":"eth-rt5-2", + "active":true, + "labels":[ + 16101 + ] + } + ] + } ] } diff --git a/tests/topotests/isis-sr-topo1/rt3/step8/show_mpls_table.ref b/tests/topotests/isis-sr-topo1/rt3/step8/show_mpls_table.ref index a1e64afd67..db8253f83d 100644 --- a/tests/topotests/isis-sr-topo1/rt3/step8/show_mpls_table.ref +++ b/tests/topotests/isis-sr-topo1/rt3/step8/show_mpls_table.ref @@ -164,5 +164,41 @@ "interface":"eth-rt5-1" } ] + }, + "17100":{ + "inLabel":17100, + "installed":true, + "nexthops":[ + { + "type":"SR (IS-IS)", + "outLabel":16100, + "installed":true, + "nexthop":"10.0.5.5" + }, + { + "type":"SR (IS-IS)", + "outLabel":16100, + "installed":true, + "nexthop":"10.0.4.5" + } + ] + }, + "17101":{ + "inLabel":17101, + "installed":true, + "nexthops":[ + { + "type":"SR (IS-IS)", + "outLabel":16101, + "installed":true, + "interface":"eth-rt5-2" + }, + { + "type":"SR (IS-IS)", + "outLabel":16101, + "installed":true, + "interface":"eth-rt5-1" + } + ] } } diff --git a/tests/topotests/isis-sr-topo1/rt3/step9/show_ip_route.ref b/tests/topotests/isis-sr-topo1/rt3/step9/show_ip_route.ref index 9522b141b0..40a98ab7c6 100644 --- a/tests/topotests/isis-sr-topo1/rt3/step9/show_ip_route.ref +++ b/tests/topotests/isis-sr-topo1/rt3/step9/show_ip_route.ref @@ -323,5 +323,38 @@ } ] } + ], + "10.10.10.10\/32":[ + { + "prefix":"10.10.10.10\/32", + "protocol":"isis", + "selected":true, + "destSelected":true, + "distance":115, + "metric":20, + "installed":true, + "nexthops":[ + { + "fib":true, + "ip":"10.0.4.5", + "afi":"ipv4", + "interfaceName":"eth-rt5-1", + "active":true, + "labels":[ + 16100 + ] + }, + { + "fib":true, + "ip":"10.0.5.5", + "afi":"ipv4", + "interfaceName":"eth-rt5-2", + "active":true, + "labels":[ + 16100 + ] + } + ] + } ] } diff --git a/tests/topotests/isis-sr-topo1/rt3/step9/show_ipv6_route.ref b/tests/topotests/isis-sr-topo1/rt3/step9/show_ipv6_route.ref index fb630bc68f..1fb50407bd 100644 --- a/tests/topotests/isis-sr-topo1/rt3/step9/show_ipv6_route.ref +++ b/tests/topotests/isis-sr-topo1/rt3/step9/show_ipv6_route.ref @@ -78,7 +78,7 @@ { "fib":true, "afi":"ipv6", - "interfaceName":"eth-rt5-2", + "interfaceName":"eth-rt5-1", "active":true, "labels":[ 16051 @@ -87,7 +87,7 @@ { "fib":true, "afi":"ipv6", - "interfaceName":"eth-rt5-1", + "interfaceName":"eth-rt5-2", "active":true, "labels":[ 16051 @@ -109,7 +109,7 @@ { "fib":true, "afi":"ipv6", - "interfaceName":"eth-rt5-2", + "interfaceName":"eth-rt5-1", "active":true, "labels":[ 16061 @@ -118,7 +118,7 @@ { "fib":true, "afi":"ipv6", - "interfaceName":"eth-rt5-1", + "interfaceName":"eth-rt5-2", "active":true, "labels":[ 16061 @@ -126,5 +126,36 @@ } ] } + ], + "2001:db8:1000::10\/128":[ + { + "prefix":"2001:db8:1000::10\/128", + "protocol":"isis", + "selected":true, + "destSelected":true, + "distance":115, + "metric":20, + "installed":true, + "nexthops":[ + { + "fib":true, + "afi":"ipv6", + "interfaceName":"eth-rt5-1", + "active":true, + "labels":[ + 16101 + ] + }, + { + "fib":true, + "afi":"ipv6", + "interfaceName":"eth-rt5-2", + "active":true, + "labels":[ + 16101 + ] + } + ] + } ] } diff --git a/tests/topotests/isis-sr-topo1/rt3/step9/show_mpls_table.ref b/tests/topotests/isis-sr-topo1/rt3/step9/show_mpls_table.ref index 4aec3b6904..44ddc4bc14 100644 --- a/tests/topotests/isis-sr-topo1/rt3/step9/show_mpls_table.ref +++ b/tests/topotests/isis-sr-topo1/rt3/step9/show_mpls_table.ref @@ -164,5 +164,41 @@ "interface":"eth-rt5-1" } ] + }, + "17100":{ + "inLabel":17100, + "installed":true, + "nexthops":[ + { + "type":"SR (IS-IS)", + "outLabel":16100, + "installed":true, + "nexthop":"10.0.5.5" + }, + { + "type":"SR (IS-IS)", + "outLabel":16100, + "installed":true, + "nexthop":"10.0.4.5" + } + ] + }, + "17101":{ + "inLabel":17101, + "installed":true, + "nexthops":[ + { + "type":"SR (IS-IS)", + "outLabel":16101, + "installed":true, + "interface":"eth-rt5-2" + }, + { + "type":"SR (IS-IS)", + "outLabel":16101, + "installed":true, + "interface":"eth-rt5-1" + } + ] } } diff --git a/tests/topotests/isis-sr-topo1/rt4/isisd.conf b/tests/topotests/isis-sr-topo1/rt4/isisd.conf index 5a110b75fe..3852b1962b 100644 --- a/tests/topotests/isis-sr-topo1/rt4/isisd.conf +++ b/tests/topotests/isis-sr-topo1/rt4/isisd.conf @@ -45,5 +45,7 @@ router isis 1 segment-routing global-block 16000 23999 segment-routing node-msd 8 segment-routing prefix 4.4.4.4/32 index 40 no-php-flag + segment-routing prefix 10.10.10.10/32 index 100 no-php-flag n-flag-clear segment-routing prefix 2001:db8:1000::4/128 index 41 no-php-flag + segment-routing prefix 2001:db8:1000::10/128 index 101 no-php-flag n-flag-clear ! diff --git a/tests/topotests/isis-sr-topo1/rt4/step1/show_ip_route.ref b/tests/topotests/isis-sr-topo1/rt4/step1/show_ip_route.ref index f06182b088..493f3ab60d 100644 --- a/tests/topotests/isis-sr-topo1/rt4/step1/show_ip_route.ref +++ b/tests/topotests/isis-sr-topo1/rt4/step1/show_ip_route.ref @@ -319,5 +319,24 @@ } ] } + ], + "10.10.10.10\/32":[ + { + "prefix":"10.10.10.10\/32", + "protocol":"isis", + "distance":115, + "metric":20, + "nexthops":[ + { + "ip":"10.0.6.5", + "afi":"ipv4", + "interfaceName":"eth-rt5", + "active":true, + "labels":[ + 16100 + ] + } + ] + } ] } diff --git a/tests/topotests/isis-sr-topo1/rt4/step1/show_ipv6_route.ref b/tests/topotests/isis-sr-topo1/rt4/step1/show_ipv6_route.ref index f5772f2726..217a4a5379 100644 --- a/tests/topotests/isis-sr-topo1/rt4/step1/show_ipv6_route.ref +++ b/tests/topotests/isis-sr-topo1/rt4/step1/show_ipv6_route.ref @@ -12,7 +12,7 @@ { "fib":true, "afi":"ipv6", - "interfaceName":"eth-rt2-2", + "interfaceName":"eth-rt2-1", "active":true, "labels":[ 16011 @@ -21,7 +21,7 @@ { "fib":true, "afi":"ipv6", - "interfaceName":"eth-rt2-1", + "interfaceName":"eth-rt2-2", "active":true, "labels":[ 16011 @@ -43,7 +43,7 @@ { "fib":true, "afi":"ipv6", - "interfaceName":"eth-rt2-2", + "interfaceName":"eth-rt2-1", "active":true, "labels":[ 16021 @@ -52,7 +52,7 @@ { "fib":true, "afi":"ipv6", - "interfaceName":"eth-rt2-1", + "interfaceName":"eth-rt2-2", "active":true, "labels":[ 16021 @@ -74,7 +74,7 @@ { "fib":true, "afi":"ipv6", - "interfaceName":"eth-rt2-2", + "interfaceName":"eth-rt2-1", "active":true, "labels":[ 16031 @@ -83,7 +83,7 @@ { "fib":true, "afi":"ipv6", - "interfaceName":"eth-rt5", + "interfaceName":"eth-rt2-2", "active":true, "labels":[ 16031 @@ -92,7 +92,7 @@ { "fib":true, "afi":"ipv6", - "interfaceName":"eth-rt2-1", + "interfaceName":"eth-rt5", "active":true, "labels":[ 16031 diff --git a/tests/topotests/isis-sr-topo1/rt4/step1/show_mpls_table.ref b/tests/topotests/isis-sr-topo1/rt4/step1/show_mpls_table.ref index b7fb69dcde..307403964a 100644 --- a/tests/topotests/isis-sr-topo1/rt4/step1/show_mpls_table.ref +++ b/tests/topotests/isis-sr-topo1/rt4/step1/show_mpls_table.ref @@ -7,13 +7,13 @@ "type":"SR (IS-IS)", "outLabel":16010, "installed":true, - "nexthop":"10.0.3.2" + "nexthop":"10.0.2.2" }, { "type":"SR (IS-IS)", "outLabel":16010, "installed":true, - "nexthop":"10.0.2.2" + "nexthop":"10.0.3.2" } ] }, @@ -25,13 +25,13 @@ "type":"SR (IS-IS)", "outLabel":16011, "installed":true, - "interface":"eth-rt2-2" + "interface":"eth-rt2-1" }, { "type":"SR (IS-IS)", "outLabel":16011, "installed":true, - "interface":"eth-rt2-1" + "interface":"eth-rt2-2" } ] }, @@ -43,13 +43,13 @@ "type":"SR (IS-IS)", "outLabel":16020, "installed":true, - "nexthop":"10.0.3.2" + "nexthop":"10.0.2.2" }, { "type":"SR (IS-IS)", "outLabel":16020, "installed":true, - "nexthop":"10.0.2.2" + "nexthop":"10.0.3.2" } ] }, @@ -61,13 +61,13 @@ "type":"SR (IS-IS)", "outLabel":16021, "installed":true, - "interface":"eth-rt2-2" + "interface":"eth-rt2-1" }, { "type":"SR (IS-IS)", "outLabel":16021, "installed":true, - "interface":"eth-rt2-1" + "interface":"eth-rt2-2" } ] }, @@ -79,13 +79,13 @@ "type":"SR (IS-IS)", "outLabel":16030, "installed":true, - "nexthop":"10.0.3.2" + "nexthop":"10.0.2.2" }, { "type":"SR (IS-IS)", "outLabel":16030, "installed":true, - "nexthop":"10.0.2.2" + "nexthop":"10.0.3.2" }, { "type":"SR (IS-IS)", @@ -103,13 +103,13 @@ "type":"SR (IS-IS)", "outLabel":16031, "installed":true, - "interface":"eth-rt2-2" + "interface":"eth-rt2-1" }, { "type":"SR (IS-IS)", "outLabel":16031, "installed":true, - "interface":"eth-rt2-1" + "interface":"eth-rt2-2" }, { "type":"SR (IS-IS)", @@ -188,5 +188,28 @@ "interface":"eth-rt6" } ] + }, + "16100":{ + "inLabel":16100, + "installed":true, + "nexthops":[ + { + "type":"SR (IS-IS)", + "outLabel":16100, + "installed":true, + "nexthop":"10.0.6.5" + } + ] + }, + "16101":{ + "inLabel":16101, + "installed":true, + "nexthops":[ + { + "type":"SR (IS-IS)", + "outLabel":3, + "installed":true + } + ] } } diff --git a/tests/topotests/isis-sr-topo1/rt4/step10/show_ip_route.ref b/tests/topotests/isis-sr-topo1/rt4/step10/show_ip_route.ref index d7d42120a0..11bc948319 100644 --- a/tests/topotests/isis-sr-topo1/rt4/step10/show_ip_route.ref +++ b/tests/topotests/isis-sr-topo1/rt4/step10/show_ip_route.ref @@ -231,6 +231,7 @@ "metric":30, "nexthops":[ { + "fib":true, "ip":"10.0.7.6", "afi":"ipv4", "interfaceName":"eth-rt6", @@ -273,5 +274,24 @@ } ] } + ], + "10.10.10.10\/32":[ + { + "prefix":"10.10.10.10\/32", + "protocol":"isis", + "distance":115, + "metric":30, + "nexthops":[ + { + "ip":"10.0.7.6", + "afi":"ipv4", + "interfaceName":"eth-rt6", + "active":true, + "labels":[ + 18100 + ] + } + ] + } ] } diff --git a/tests/topotests/isis-sr-topo1/rt4/step10/show_ipv6_route.ref b/tests/topotests/isis-sr-topo1/rt4/step10/show_ipv6_route.ref index 235c1facc6..844f6becf9 100644 --- a/tests/topotests/isis-sr-topo1/rt4/step10/show_ipv6_route.ref +++ b/tests/topotests/isis-sr-topo1/rt4/step10/show_ipv6_route.ref @@ -12,7 +12,7 @@ { "fib":true, "afi":"ipv6", - "interfaceName":"eth-rt2-2", + "interfaceName":"eth-rt2-1", "active":true, "labels":[ 16011 @@ -21,7 +21,7 @@ { "fib":true, "afi":"ipv6", - "interfaceName":"eth-rt2-1", + "interfaceName":"eth-rt2-2", "active":true, "labels":[ 16011 @@ -43,7 +43,7 @@ { "fib":true, "afi":"ipv6", - "interfaceName":"eth-rt2-2", + "interfaceName":"eth-rt2-1", "active":true, "labels":[ 16021 @@ -52,7 +52,7 @@ { "fib":true, "afi":"ipv6", - "interfaceName":"eth-rt2-1", + "interfaceName":"eth-rt2-2", "active":true, "labels":[ 16021 @@ -74,7 +74,7 @@ { "fib":true, "afi":"ipv6", - "interfaceName":"eth-rt2-2", + "interfaceName":"eth-rt2-1", "active":true, "labels":[ 16031 @@ -83,7 +83,7 @@ { "fib":true, "afi":"ipv6", - "interfaceName":"eth-rt2-1", + "interfaceName":"eth-rt2-2", "active":true, "labels":[ 16031 diff --git a/tests/topotests/isis-sr-topo1/rt4/step10/show_mpls_table.ref b/tests/topotests/isis-sr-topo1/rt4/step10/show_mpls_table.ref index 86ceaf4883..f275056070 100644 --- a/tests/topotests/isis-sr-topo1/rt4/step10/show_mpls_table.ref +++ b/tests/topotests/isis-sr-topo1/rt4/step10/show_mpls_table.ref @@ -19,13 +19,13 @@ "type":"SR (IS-IS)", "outLabel":16011, "installed":true, - "interface":"eth-rt2-2" + "interface":"eth-rt2-1" }, { "type":"SR (IS-IS)", "outLabel":16011, "installed":true, - "interface":"eth-rt2-1" + "interface":"eth-rt2-2" } ] }, @@ -49,13 +49,13 @@ "type":"SR (IS-IS)", "outLabel":16021, "installed":true, - "interface":"eth-rt2-2" + "interface":"eth-rt2-1" }, { "type":"SR (IS-IS)", "outLabel":16021, "installed":true, - "interface":"eth-rt2-1" + "interface":"eth-rt2-2" } ] }, @@ -79,13 +79,13 @@ "type":"SR (IS-IS)", "outLabel":16031, "installed":true, - "interface":"eth-rt2-2" + "interface":"eth-rt2-1" }, { "type":"SR (IS-IS)", "outLabel":16031, "installed":true, - "interface":"eth-rt2-1" + "interface":"eth-rt2-2" } ] }, @@ -158,5 +158,28 @@ "interface":"eth-rt6" } ] + }, + "16100":{ + "inLabel":16100, + "installed":true, + "nexthops":[ + { + "type":"SR (IS-IS)", + "outLabel":18100, + "installed":true, + "nexthop":"10.0.7.6" + } + ] + }, + "16101":{ + "inLabel":16101, + "installed":true, + "nexthops":[ + { + "type":"SR (IS-IS)", + "outLabel":3, + "installed":true + } + ] } } diff --git a/tests/topotests/isis-sr-topo1/rt4/step2/show_ip_route.ref b/tests/topotests/isis-sr-topo1/rt4/step2/show_ip_route.ref index 4789f7268f..c2fbdeb30e 100644 --- a/tests/topotests/isis-sr-topo1/rt4/step2/show_ip_route.ref +++ b/tests/topotests/isis-sr-topo1/rt4/step2/show_ip_route.ref @@ -289,6 +289,7 @@ "metric":30, "nexthops":[ { + "fib":true, "ip":"10.0.7.6", "afi":"ipv4", "interfaceName":"eth-rt6", @@ -331,5 +332,24 @@ } ] } + ], + "10.10.10.10\/32":[ + { + "prefix":"10.10.10.10\/32", + "protocol":"isis", + "distance":115, + "metric":30, + "nexthops":[ + { + "ip":"10.0.7.6", + "afi":"ipv4", + "interfaceName":"eth-rt6", + "active":true, + "labels":[ + 16100 + ] + } + ] + } ] } diff --git a/tests/topotests/isis-sr-topo1/rt4/step2/show_ipv6_route.ref b/tests/topotests/isis-sr-topo1/rt4/step2/show_ipv6_route.ref index 871b303cab..7f823b6896 100644 --- a/tests/topotests/isis-sr-topo1/rt4/step2/show_ipv6_route.ref +++ b/tests/topotests/isis-sr-topo1/rt4/step2/show_ipv6_route.ref @@ -12,7 +12,7 @@ { "fib":true, "afi":"ipv6", - "interfaceName":"eth-rt2-2", + "interfaceName":"eth-rt2-1", "active":true, "labels":[ 16011 @@ -21,7 +21,7 @@ { "fib":true, "afi":"ipv6", - "interfaceName":"eth-rt2-1", + "interfaceName":"eth-rt2-2", "active":true, "labels":[ 16011 @@ -43,7 +43,7 @@ { "fib":true, "afi":"ipv6", - "interfaceName":"eth-rt2-2", + "interfaceName":"eth-rt2-1", "active":true, "labels":[ 16021 @@ -52,7 +52,7 @@ { "fib":true, "afi":"ipv6", - "interfaceName":"eth-rt2-1", + "interfaceName":"eth-rt2-2", "active":true, "labels":[ 16021 @@ -74,7 +74,7 @@ { "fib":true, "afi":"ipv6", - "interfaceName":"eth-rt2-2", + "interfaceName":"eth-rt2-1", "active":true, "labels":[ 16031 @@ -83,7 +83,7 @@ { "fib":true, "afi":"ipv6", - "interfaceName":"eth-rt2-1", + "interfaceName":"eth-rt2-2", "active":true, "labels":[ 16031 diff --git a/tests/topotests/isis-sr-topo1/rt4/step2/show_mpls_table.ref b/tests/topotests/isis-sr-topo1/rt4/step2/show_mpls_table.ref index ff83c374f0..8dd37880d0 100644 --- a/tests/topotests/isis-sr-topo1/rt4/step2/show_mpls_table.ref +++ b/tests/topotests/isis-sr-topo1/rt4/step2/show_mpls_table.ref @@ -7,13 +7,13 @@ "type":"SR (IS-IS)", "outLabel":16010, "installed":true, - "nexthop":"10.0.3.2" + "nexthop":"10.0.2.2" }, { "type":"SR (IS-IS)", "outLabel":16010, "installed":true, - "nexthop":"10.0.2.2" + "nexthop":"10.0.3.2" } ] }, @@ -25,13 +25,13 @@ "type":"SR (IS-IS)", "outLabel":16011, "installed":true, - "interface":"eth-rt2-2" + "interface":"eth-rt2-1" }, { "type":"SR (IS-IS)", "outLabel":16011, "installed":true, - "interface":"eth-rt2-1" + "interface":"eth-rt2-2" } ] }, @@ -43,13 +43,13 @@ "type":"SR (IS-IS)", "outLabel":16020, "installed":true, - "nexthop":"10.0.3.2" + "nexthop":"10.0.2.2" }, { "type":"SR (IS-IS)", "outLabel":16020, "installed":true, - "nexthop":"10.0.2.2" + "nexthop":"10.0.3.2" } ] }, @@ -61,13 +61,13 @@ "type":"SR (IS-IS)", "outLabel":16021, "installed":true, - "interface":"eth-rt2-2" + "interface":"eth-rt2-1" }, { "type":"SR (IS-IS)", "outLabel":16021, "installed":true, - "interface":"eth-rt2-1" + "interface":"eth-rt2-2" } ] }, @@ -79,13 +79,13 @@ "type":"SR (IS-IS)", "outLabel":16030, "installed":true, - "nexthop":"10.0.3.2" + "nexthop":"10.0.2.2" }, { "type":"SR (IS-IS)", "outLabel":16030, "installed":true, - "nexthop":"10.0.2.2" + "nexthop":"10.0.3.2" } ] }, @@ -97,13 +97,13 @@ "type":"SR (IS-IS)", "outLabel":16031, "installed":true, - "interface":"eth-rt2-2" + "interface":"eth-rt2-1" }, { "type":"SR (IS-IS)", "outLabel":16031, "installed":true, - "interface":"eth-rt2-1" + "interface":"eth-rt2-2" } ] }, @@ -176,5 +176,28 @@ "interface":"eth-rt6" } ] + }, + "16100":{ + "inLabel":16100, + "installed":true, + "nexthops":[ + { + "type":"SR (IS-IS)", + "outLabel":16100, + "installed":true, + "nexthop":"10.0.7.6" + } + ] + }, + "16101":{ + "inLabel":16101, + "installed":true, + "nexthops":[ + { + "type":"SR (IS-IS)", + "outLabel":3, + "installed":true + } + ] } } diff --git a/tests/topotests/isis-sr-topo1/rt4/step3/show_ip_route.ref b/tests/topotests/isis-sr-topo1/rt4/step3/show_ip_route.ref index d86562deb9..4dc0dd7cac 100644 --- a/tests/topotests/isis-sr-topo1/rt4/step3/show_ip_route.ref +++ b/tests/topotests/isis-sr-topo1/rt4/step3/show_ip_route.ref @@ -262,12 +262,14 @@ "metric":40, "nexthops":[ { + "fib":true, "ip":"10.0.2.2", "afi":"ipv4", "interfaceName":"eth-rt2-1", "active":true }, { + "fib":true, "ip":"10.0.3.2", "afi":"ipv4", "interfaceName":"eth-rt2-2", @@ -276,6 +278,21 @@ ] } ], + "10.0.7.0\/24":[ + { + "prefix":"10.0.7.0\/24", + "protocol":"isis", + "distance":115, + "metric":20, + "nexthops":[ + { + "ip":"10.0.7.6", + "afi":"ipv4", + "interfaceName":"eth-rt6" + } + ] + } + ], "10.0.8.0\/24":[ { "prefix":"10.0.8.0\/24", @@ -302,5 +319,33 @@ } ] } + ], + "10.10.10.10\/32":[ + { + "prefix":"10.10.10.10\/32", + "protocol":"isis", + "distance":115, + "metric":40, + "nexthops":[ + { + "ip":"10.0.2.2", + "afi":"ipv4", + "interfaceName":"eth-rt2-1", + "active":true, + "labels":[ + 16100 + ] + }, + { + "ip":"10.0.3.2", + "afi":"ipv4", + "interfaceName":"eth-rt2-2", + "active":true, + "labels":[ + 16100 + ] + } + ] + } ] } diff --git a/tests/topotests/isis-sr-topo1/rt4/step3/show_ipv6_route.ref b/tests/topotests/isis-sr-topo1/rt4/step3/show_ipv6_route.ref index c09f584641..34afda1966 100644 --- a/tests/topotests/isis-sr-topo1/rt4/step3/show_ipv6_route.ref +++ b/tests/topotests/isis-sr-topo1/rt4/step3/show_ipv6_route.ref @@ -12,7 +12,7 @@ { "fib":true, "afi":"ipv6", - "interfaceName":"eth-rt2-2", + "interfaceName":"eth-rt2-1", "active":true, "labels":[ 16011 @@ -21,7 +21,7 @@ { "fib":true, "afi":"ipv6", - "interfaceName":"eth-rt2-1", + "interfaceName":"eth-rt2-2", "active":true, "labels":[ 16011 @@ -43,7 +43,7 @@ { "fib":true, "afi":"ipv6", - "interfaceName":"eth-rt2-2", + "interfaceName":"eth-rt2-1", "active":true, "labels":[ 16021 @@ -52,7 +52,7 @@ { "fib":true, "afi":"ipv6", - "interfaceName":"eth-rt2-1", + "interfaceName":"eth-rt2-2", "active":true, "labels":[ 16021 @@ -74,7 +74,7 @@ { "fib":true, "afi":"ipv6", - "interfaceName":"eth-rt2-2", + "interfaceName":"eth-rt2-1", "active":true, "labels":[ 16031 @@ -83,7 +83,7 @@ { "fib":true, "afi":"ipv6", - "interfaceName":"eth-rt2-1", + "interfaceName":"eth-rt2-2", "active":true, "labels":[ 16031 @@ -105,7 +105,7 @@ { "fib":true, "afi":"ipv6", - "interfaceName":"eth-rt2-2", + "interfaceName":"eth-rt2-1", "active":true, "labels":[ 16051 @@ -114,7 +114,7 @@ { "fib":true, "afi":"ipv6", - "interfaceName":"eth-rt2-1", + "interfaceName":"eth-rt2-2", "active":true, "labels":[ 16051 diff --git a/tests/topotests/isis-sr-topo1/rt4/step3/show_mpls_table.ref b/tests/topotests/isis-sr-topo1/rt4/step3/show_mpls_table.ref index 85c6c055c9..65336d88d1 100644 --- a/tests/topotests/isis-sr-topo1/rt4/step3/show_mpls_table.ref +++ b/tests/topotests/isis-sr-topo1/rt4/step3/show_mpls_table.ref @@ -7,13 +7,13 @@ "type":"SR (IS-IS)", "outLabel":16010, "installed":true, - "nexthop":"10.0.3.2" + "nexthop":"10.0.2.2" }, { "type":"SR (IS-IS)", "outLabel":16010, "installed":true, - "nexthop":"10.0.2.2" + "nexthop":"10.0.3.2" } ] }, @@ -25,13 +25,13 @@ "type":"SR (IS-IS)", "outLabel":16011, "installed":true, - "interface":"eth-rt2-2" + "interface":"eth-rt2-1" }, { "type":"SR (IS-IS)", "outLabel":16011, "installed":true, - "interface":"eth-rt2-1" + "interface":"eth-rt2-2" } ] }, @@ -43,13 +43,13 @@ "type":"SR (IS-IS)", "outLabel":16020, "installed":true, - "nexthop":"10.0.3.2" + "nexthop":"10.0.2.2" }, { "type":"SR (IS-IS)", "outLabel":16020, "installed":true, - "nexthop":"10.0.2.2" + "nexthop":"10.0.3.2" } ] }, @@ -61,13 +61,13 @@ "type":"SR (IS-IS)", "outLabel":16021, "installed":true, - "interface":"eth-rt2-2" + "interface":"eth-rt2-1" }, { "type":"SR (IS-IS)", "outLabel":16021, "installed":true, - "interface":"eth-rt2-1" + "interface":"eth-rt2-2" } ] }, @@ -79,13 +79,13 @@ "type":"SR (IS-IS)", "outLabel":16030, "installed":true, - "nexthop":"10.0.3.2" + "nexthop":"10.0.2.2" }, { "type":"SR (IS-IS)", "outLabel":16030, "installed":true, - "nexthop":"10.0.2.2" + "nexthop":"10.0.3.2" } ] }, @@ -97,13 +97,13 @@ "type":"SR (IS-IS)", "outLabel":16031, "installed":true, - "interface":"eth-rt2-2" + "interface":"eth-rt2-1" }, { "type":"SR (IS-IS)", "outLabel":16031, "installed":true, - "interface":"eth-rt2-1" + "interface":"eth-rt2-2" } ] }, @@ -137,13 +137,13 @@ "type":"SR (IS-IS)", "outLabel":16050, "installed":true, - "nexthop":"10.0.3.2" + "nexthop":"10.0.2.2" }, { "type":"SR (IS-IS)", "outLabel":16050, "installed":true, - "nexthop":"10.0.2.2" + "nexthop":"10.0.3.2" } ] }, @@ -155,13 +155,42 @@ "type":"SR (IS-IS)", "outLabel":16051, "installed":true, - "interface":"eth-rt2-2" + "interface":"eth-rt2-1" }, { "type":"SR (IS-IS)", "outLabel":16051, "installed":true, - "interface":"eth-rt2-1" + "interface":"eth-rt2-2" + } + ] + }, + "16100":{ + "inLabel":16100, + "installed":true, + "nexthops":[ + { + "type":"SR (IS-IS)", + "outLabel":16100, + "installed":true, + "nexthop":"10.0.2.2" + }, + { + "type":"SR (IS-IS)", + "outLabel":16100, + "installed":true, + "nexthop":"10.0.3.2" + } + ] + }, + "16101":{ + "inLabel":16101, + "installed":true, + "nexthops":[ + { + "type":"SR (IS-IS)", + "outLabel":3, + "installed":true } ] } diff --git a/tests/topotests/isis-sr-topo1/rt4/step4/show_ip_route.ref b/tests/topotests/isis-sr-topo1/rt4/step4/show_ip_route.ref index 3c7dfda0a3..e930657f8d 100644 --- a/tests/topotests/isis-sr-topo1/rt4/step4/show_ip_route.ref +++ b/tests/topotests/isis-sr-topo1/rt4/step4/show_ip_route.ref @@ -289,6 +289,7 @@ "metric":30, "nexthops":[ { + "fib":true, "ip":"10.0.7.6", "afi":"ipv4", "interfaceName":"eth-rt6", @@ -331,5 +332,24 @@ } ] } + ], + "10.10.10.10\/32":[ + { + "prefix":"10.10.10.10\/32", + "protocol":"isis", + "distance":115, + "metric":30, + "nexthops":[ + { + "ip":"10.0.7.6", + "afi":"ipv4", + "interfaceName":"eth-rt6", + "active":true, + "labels":[ + 18100 + ] + } + ] + } ] } diff --git a/tests/topotests/isis-sr-topo1/rt4/step4/show_ipv6_route.ref b/tests/topotests/isis-sr-topo1/rt4/step4/show_ipv6_route.ref index 38b51822dd..ca61c6e81f 100644 --- a/tests/topotests/isis-sr-topo1/rt4/step4/show_ipv6_route.ref +++ b/tests/topotests/isis-sr-topo1/rt4/step4/show_ipv6_route.ref @@ -12,7 +12,7 @@ { "fib":true, "afi":"ipv6", - "interfaceName":"eth-rt2-2", + "interfaceName":"eth-rt2-1", "active":true, "labels":[ 16011 @@ -21,7 +21,7 @@ { "fib":true, "afi":"ipv6", - "interfaceName":"eth-rt2-1", + "interfaceName":"eth-rt2-2", "active":true, "labels":[ 16011 @@ -43,7 +43,7 @@ { "fib":true, "afi":"ipv6", - "interfaceName":"eth-rt2-2", + "interfaceName":"eth-rt2-1", "active":true, "labels":[ 16021 @@ -52,7 +52,7 @@ { "fib":true, "afi":"ipv6", - "interfaceName":"eth-rt2-1", + "interfaceName":"eth-rt2-2", "active":true, "labels":[ 16021 @@ -74,7 +74,7 @@ { "fib":true, "afi":"ipv6", - "interfaceName":"eth-rt2-2", + "interfaceName":"eth-rt2-1", "active":true, "labels":[ 16031 @@ -83,7 +83,7 @@ { "fib":true, "afi":"ipv6", - "interfaceName":"eth-rt2-1", + "interfaceName":"eth-rt2-2", "active":true, "labels":[ 16031 diff --git a/tests/topotests/isis-sr-topo1/rt4/step4/show_mpls_table.ref b/tests/topotests/isis-sr-topo1/rt4/step4/show_mpls_table.ref index 4e5638f34f..eb95fa94c9 100644 --- a/tests/topotests/isis-sr-topo1/rt4/step4/show_mpls_table.ref +++ b/tests/topotests/isis-sr-topo1/rt4/step4/show_mpls_table.ref @@ -7,13 +7,13 @@ "type":"SR (IS-IS)", "outLabel":16010, "installed":true, - "nexthop":"10.0.3.2" + "nexthop":"10.0.2.2" }, { "type":"SR (IS-IS)", "outLabel":16010, "installed":true, - "nexthop":"10.0.2.2" + "nexthop":"10.0.3.2" } ] }, @@ -25,13 +25,13 @@ "type":"SR (IS-IS)", "outLabel":16011, "installed":true, - "interface":"eth-rt2-2" + "interface":"eth-rt2-1" }, { "type":"SR (IS-IS)", "outLabel":16011, "installed":true, - "interface":"eth-rt2-1" + "interface":"eth-rt2-2" } ] }, @@ -43,13 +43,13 @@ "type":"SR (IS-IS)", "outLabel":16020, "installed":true, - "nexthop":"10.0.3.2" + "nexthop":"10.0.2.2" }, { "type":"SR (IS-IS)", "outLabel":16020, "installed":true, - "nexthop":"10.0.2.2" + "nexthop":"10.0.3.2" } ] }, @@ -61,13 +61,13 @@ "type":"SR (IS-IS)", "outLabel":16021, "installed":true, - "interface":"eth-rt2-2" + "interface":"eth-rt2-1" }, { "type":"SR (IS-IS)", "outLabel":16021, "installed":true, - "interface":"eth-rt2-1" + "interface":"eth-rt2-2" } ] }, @@ -79,13 +79,13 @@ "type":"SR (IS-IS)", "outLabel":16030, "installed":true, - "nexthop":"10.0.3.2" + "nexthop":"10.0.2.2" }, { "type":"SR (IS-IS)", "outLabel":16030, "installed":true, - "nexthop":"10.0.2.2" + "nexthop":"10.0.3.2" } ] }, @@ -97,13 +97,13 @@ "type":"SR (IS-IS)", "outLabel":16031, "installed":true, - "interface":"eth-rt2-2" + "interface":"eth-rt2-1" }, { "type":"SR (IS-IS)", "outLabel":16031, "installed":true, - "interface":"eth-rt2-1" + "interface":"eth-rt2-2" } ] }, @@ -176,5 +176,28 @@ "interface":"eth-rt6" } ] + }, + "16100":{ + "inLabel":16100, + "installed":true, + "nexthops":[ + { + "type":"SR (IS-IS)", + "outLabel":18100, + "installed":true, + "nexthop":"10.0.7.6" + } + ] + }, + "16101":{ + "inLabel":16101, + "installed":true, + "nexthops":[ + { + "type":"SR (IS-IS)", + "outLabel":3, + "installed":true + } + ] } } diff --git a/tests/topotests/isis-sr-topo1/rt4/step5/show_ip_route.ref b/tests/topotests/isis-sr-topo1/rt4/step5/show_ip_route.ref index 90f69c06b8..8b0ddd4ee5 100644 --- a/tests/topotests/isis-sr-topo1/rt4/step5/show_ip_route.ref +++ b/tests/topotests/isis-sr-topo1/rt4/step5/show_ip_route.ref @@ -283,6 +283,7 @@ "metric":30, "nexthops":[ { + "fib":true, "ip":"10.0.7.6", "afi":"ipv4", "interfaceName":"eth-rt6", @@ -325,5 +326,22 @@ } ] } + ], + "10.10.10.10\/32":[ + { + "prefix":"10.10.10.10\/32", + "protocol":"isis", + "distance":115, + "metric":30, + "nexthops":[ + { + "fib":true, + "ip":"10.0.7.6", + "afi":"ipv4", + "interfaceName":"eth-rt6", + "active":true + } + ] + } ] } diff --git a/tests/topotests/isis-sr-topo1/rt4/step5/show_ipv6_route.ref b/tests/topotests/isis-sr-topo1/rt4/step5/show_ipv6_route.ref index 04056ed873..94e1fac450 100644 --- a/tests/topotests/isis-sr-topo1/rt4/step5/show_ipv6_route.ref +++ b/tests/topotests/isis-sr-topo1/rt4/step5/show_ipv6_route.ref @@ -12,7 +12,7 @@ { "fib":true, "afi":"ipv6", - "interfaceName":"eth-rt2-2", + "interfaceName":"eth-rt2-1", "active":true, "labels":[ 16011 @@ -21,7 +21,7 @@ { "fib":true, "afi":"ipv6", - "interfaceName":"eth-rt2-1", + "interfaceName":"eth-rt2-2", "active":true, "labels":[ 16011 @@ -43,7 +43,7 @@ { "fib":true, "afi":"ipv6", - "interfaceName":"eth-rt2-2", + "interfaceName":"eth-rt2-1", "active":true, "labels":[ 16021 @@ -52,7 +52,7 @@ { "fib":true, "afi":"ipv6", - "interfaceName":"eth-rt2-1", + "interfaceName":"eth-rt2-2", "active":true, "labels":[ 16021 @@ -74,7 +74,7 @@ { "fib":true, "afi":"ipv6", - "interfaceName":"eth-rt2-2", + "interfaceName":"eth-rt2-1", "active":true, "labels":[ 16031 @@ -83,7 +83,7 @@ { "fib":true, "afi":"ipv6", - "interfaceName":"eth-rt2-1", + "interfaceName":"eth-rt2-2", "active":true, "labels":[ 16031 diff --git a/tests/topotests/isis-sr-topo1/rt4/step5/show_mpls_table.ref b/tests/topotests/isis-sr-topo1/rt4/step5/show_mpls_table.ref index 4df722be4f..cd47cfa3a7 100644 --- a/tests/topotests/isis-sr-topo1/rt4/step5/show_mpls_table.ref +++ b/tests/topotests/isis-sr-topo1/rt4/step5/show_mpls_table.ref @@ -7,13 +7,13 @@ "type":"SR (IS-IS)", "outLabel":16010, "installed":true, - "nexthop":"10.0.3.2" + "nexthop":"10.0.2.2" }, { "type":"SR (IS-IS)", "outLabel":16010, "installed":true, - "nexthop":"10.0.2.2" + "nexthop":"10.0.3.2" } ] }, @@ -25,13 +25,13 @@ "type":"SR (IS-IS)", "outLabel":16011, "installed":true, - "interface":"eth-rt2-2" + "interface":"eth-rt2-1" }, { "type":"SR (IS-IS)", "outLabel":16011, "installed":true, - "interface":"eth-rt2-1" + "interface":"eth-rt2-2" } ] }, @@ -43,13 +43,13 @@ "type":"SR (IS-IS)", "outLabel":16020, "installed":true, - "nexthop":"10.0.3.2" + "nexthop":"10.0.2.2" }, { "type":"SR (IS-IS)", "outLabel":16020, "installed":true, - "nexthop":"10.0.2.2" + "nexthop":"10.0.3.2" } ] }, @@ -61,13 +61,13 @@ "type":"SR (IS-IS)", "outLabel":16021, "installed":true, - "interface":"eth-rt2-2" + "interface":"eth-rt2-1" }, { "type":"SR (IS-IS)", "outLabel":16021, "installed":true, - "interface":"eth-rt2-1" + "interface":"eth-rt2-2" } ] }, @@ -79,13 +79,13 @@ "type":"SR (IS-IS)", "outLabel":16030, "installed":true, - "nexthop":"10.0.3.2" + "nexthop":"10.0.2.2" }, { "type":"SR (IS-IS)", "outLabel":16030, "installed":true, - "nexthop":"10.0.2.2" + "nexthop":"10.0.3.2" } ] }, @@ -97,13 +97,13 @@ "type":"SR (IS-IS)", "outLabel":16031, "installed":true, - "interface":"eth-rt2-2" + "interface":"eth-rt2-1" }, { "type":"SR (IS-IS)", "outLabel":16031, "installed":true, - "interface":"eth-rt2-1" + "interface":"eth-rt2-2" } ] }, @@ -128,5 +128,16 @@ "installed":true } ] + }, + "16101":{ + "inLabel":16101, + "installed":true, + "nexthops":[ + { + "type":"SR (IS-IS)", + "outLabel":3, + "installed":true + } + ] } } diff --git a/tests/topotests/isis-sr-topo1/rt4/step6/show_ip_route.ref b/tests/topotests/isis-sr-topo1/rt4/step6/show_ip_route.ref index 3c7dfda0a3..e930657f8d 100644 --- a/tests/topotests/isis-sr-topo1/rt4/step6/show_ip_route.ref +++ b/tests/topotests/isis-sr-topo1/rt4/step6/show_ip_route.ref @@ -289,6 +289,7 @@ "metric":30, "nexthops":[ { + "fib":true, "ip":"10.0.7.6", "afi":"ipv4", "interfaceName":"eth-rt6", @@ -331,5 +332,24 @@ } ] } + ], + "10.10.10.10\/32":[ + { + "prefix":"10.10.10.10\/32", + "protocol":"isis", + "distance":115, + "metric":30, + "nexthops":[ + { + "ip":"10.0.7.6", + "afi":"ipv4", + "interfaceName":"eth-rt6", + "active":true, + "labels":[ + 18100 + ] + } + ] + } ] } diff --git a/tests/topotests/isis-sr-topo1/rt4/step6/show_ipv6_route.ref b/tests/topotests/isis-sr-topo1/rt4/step6/show_ipv6_route.ref index 38b51822dd..ca61c6e81f 100644 --- a/tests/topotests/isis-sr-topo1/rt4/step6/show_ipv6_route.ref +++ b/tests/topotests/isis-sr-topo1/rt4/step6/show_ipv6_route.ref @@ -12,7 +12,7 @@ { "fib":true, "afi":"ipv6", - "interfaceName":"eth-rt2-2", + "interfaceName":"eth-rt2-1", "active":true, "labels":[ 16011 @@ -21,7 +21,7 @@ { "fib":true, "afi":"ipv6", - "interfaceName":"eth-rt2-1", + "interfaceName":"eth-rt2-2", "active":true, "labels":[ 16011 @@ -43,7 +43,7 @@ { "fib":true, "afi":"ipv6", - "interfaceName":"eth-rt2-2", + "interfaceName":"eth-rt2-1", "active":true, "labels":[ 16021 @@ -52,7 +52,7 @@ { "fib":true, "afi":"ipv6", - "interfaceName":"eth-rt2-1", + "interfaceName":"eth-rt2-2", "active":true, "labels":[ 16021 @@ -74,7 +74,7 @@ { "fib":true, "afi":"ipv6", - "interfaceName":"eth-rt2-2", + "interfaceName":"eth-rt2-1", "active":true, "labels":[ 16031 @@ -83,7 +83,7 @@ { "fib":true, "afi":"ipv6", - "interfaceName":"eth-rt2-1", + "interfaceName":"eth-rt2-2", "active":true, "labels":[ 16031 diff --git a/tests/topotests/isis-sr-topo1/rt4/step6/show_mpls_table.ref b/tests/topotests/isis-sr-topo1/rt4/step6/show_mpls_table.ref index 4e5638f34f..eb95fa94c9 100644 --- a/tests/topotests/isis-sr-topo1/rt4/step6/show_mpls_table.ref +++ b/tests/topotests/isis-sr-topo1/rt4/step6/show_mpls_table.ref @@ -7,13 +7,13 @@ "type":"SR (IS-IS)", "outLabel":16010, "installed":true, - "nexthop":"10.0.3.2" + "nexthop":"10.0.2.2" }, { "type":"SR (IS-IS)", "outLabel":16010, "installed":true, - "nexthop":"10.0.2.2" + "nexthop":"10.0.3.2" } ] }, @@ -25,13 +25,13 @@ "type":"SR (IS-IS)", "outLabel":16011, "installed":true, - "interface":"eth-rt2-2" + "interface":"eth-rt2-1" }, { "type":"SR (IS-IS)", "outLabel":16011, "installed":true, - "interface":"eth-rt2-1" + "interface":"eth-rt2-2" } ] }, @@ -43,13 +43,13 @@ "type":"SR (IS-IS)", "outLabel":16020, "installed":true, - "nexthop":"10.0.3.2" + "nexthop":"10.0.2.2" }, { "type":"SR (IS-IS)", "outLabel":16020, "installed":true, - "nexthop":"10.0.2.2" + "nexthop":"10.0.3.2" } ] }, @@ -61,13 +61,13 @@ "type":"SR (IS-IS)", "outLabel":16021, "installed":true, - "interface":"eth-rt2-2" + "interface":"eth-rt2-1" }, { "type":"SR (IS-IS)", "outLabel":16021, "installed":true, - "interface":"eth-rt2-1" + "interface":"eth-rt2-2" } ] }, @@ -79,13 +79,13 @@ "type":"SR (IS-IS)", "outLabel":16030, "installed":true, - "nexthop":"10.0.3.2" + "nexthop":"10.0.2.2" }, { "type":"SR (IS-IS)", "outLabel":16030, "installed":true, - "nexthop":"10.0.2.2" + "nexthop":"10.0.3.2" } ] }, @@ -97,13 +97,13 @@ "type":"SR (IS-IS)", "outLabel":16031, "installed":true, - "interface":"eth-rt2-2" + "interface":"eth-rt2-1" }, { "type":"SR (IS-IS)", "outLabel":16031, "installed":true, - "interface":"eth-rt2-1" + "interface":"eth-rt2-2" } ] }, @@ -176,5 +176,28 @@ "interface":"eth-rt6" } ] + }, + "16100":{ + "inLabel":16100, + "installed":true, + "nexthops":[ + { + "type":"SR (IS-IS)", + "outLabel":18100, + "installed":true, + "nexthop":"10.0.7.6" + } + ] + }, + "16101":{ + "inLabel":16101, + "installed":true, + "nexthops":[ + { + "type":"SR (IS-IS)", + "outLabel":3, + "installed":true + } + ] } } diff --git a/tests/topotests/isis-sr-topo1/rt4/step7/show_ip_route.ref b/tests/topotests/isis-sr-topo1/rt4/step7/show_ip_route.ref index a3ac4ac109..f5ac45504e 100644 --- a/tests/topotests/isis-sr-topo1/rt4/step7/show_ip_route.ref +++ b/tests/topotests/isis-sr-topo1/rt4/step7/show_ip_route.ref @@ -283,6 +283,7 @@ "metric":30, "nexthops":[ { + "fib":true, "ip":"10.0.7.6", "afi":"ipv4", "interfaceName":"eth-rt6", @@ -325,5 +326,24 @@ } ] } + ], + "10.10.10.10\/32":[ + { + "prefix":"10.10.10.10\/32", + "protocol":"isis", + "distance":115, + "metric":30, + "nexthops":[ + { + "ip":"10.0.7.6", + "afi":"ipv4", + "interfaceName":"eth-rt6", + "active":true, + "labels":[ + 18100 + ] + } + ] + } ] } diff --git a/tests/topotests/isis-sr-topo1/rt4/step7/show_ipv6_route.ref b/tests/topotests/isis-sr-topo1/rt4/step7/show_ipv6_route.ref index c59abbd2f5..1599c88122 100644 --- a/tests/topotests/isis-sr-topo1/rt4/step7/show_ipv6_route.ref +++ b/tests/topotests/isis-sr-topo1/rt4/step7/show_ipv6_route.ref @@ -12,13 +12,13 @@ { "fib":true, "afi":"ipv6", - "interfaceName":"eth-rt2-2", + "interfaceName":"eth-rt2-1", "active":true }, { "fib":true, "afi":"ipv6", - "interfaceName":"eth-rt2-1", + "interfaceName":"eth-rt2-2", "active":true } ] @@ -37,7 +37,7 @@ { "fib":true, "afi":"ipv6", - "interfaceName":"eth-rt2-2", + "interfaceName":"eth-rt2-1", "active":true, "labels":[ 16021 @@ -46,7 +46,7 @@ { "fib":true, "afi":"ipv6", - "interfaceName":"eth-rt2-1", + "interfaceName":"eth-rt2-2", "active":true, "labels":[ 16021 @@ -68,7 +68,7 @@ { "fib":true, "afi":"ipv6", - "interfaceName":"eth-rt2-2", + "interfaceName":"eth-rt2-1", "active":true, "labels":[ 16031 @@ -77,7 +77,7 @@ { "fib":true, "afi":"ipv6", - "interfaceName":"eth-rt2-1", + "interfaceName":"eth-rt2-2", "active":true, "labels":[ 16031 diff --git a/tests/topotests/isis-sr-topo1/rt4/step7/show_mpls_table.ref b/tests/topotests/isis-sr-topo1/rt4/step7/show_mpls_table.ref index 512c057b31..19b0beb164 100644 --- a/tests/topotests/isis-sr-topo1/rt4/step7/show_mpls_table.ref +++ b/tests/topotests/isis-sr-topo1/rt4/step7/show_mpls_table.ref @@ -7,13 +7,13 @@ "type":"SR (IS-IS)", "outLabel":16020, "installed":true, - "nexthop":"10.0.3.2" + "nexthop":"10.0.2.2" }, { "type":"SR (IS-IS)", "outLabel":16020, "installed":true, - "nexthop":"10.0.2.2" + "nexthop":"10.0.3.2" } ] }, @@ -25,13 +25,13 @@ "type":"SR (IS-IS)", "outLabel":16021, "installed":true, - "interface":"eth-rt2-2" + "interface":"eth-rt2-1" }, { "type":"SR (IS-IS)", "outLabel":16021, "installed":true, - "interface":"eth-rt2-1" + "interface":"eth-rt2-2" } ] }, @@ -43,13 +43,13 @@ "type":"SR (IS-IS)", "outLabel":16030, "installed":true, - "nexthop":"10.0.3.2" + "nexthop":"10.0.2.2" }, { "type":"SR (IS-IS)", "outLabel":16030, "installed":true, - "nexthop":"10.0.2.2" + "nexthop":"10.0.3.2" } ] }, @@ -61,13 +61,13 @@ "type":"SR (IS-IS)", "outLabel":16031, "installed":true, - "interface":"eth-rt2-2" + "interface":"eth-rt2-1" }, { "type":"SR (IS-IS)", "outLabel":16031, "installed":true, - "interface":"eth-rt2-1" + "interface":"eth-rt2-2" } ] }, @@ -140,5 +140,28 @@ "interface":"eth-rt6" } ] + }, + "16100":{ + "inLabel":16100, + "installed":true, + "nexthops":[ + { + "type":"SR (IS-IS)", + "outLabel":18100, + "installed":true, + "nexthop":"10.0.7.6" + } + ] + }, + "16101":{ + "inLabel":16101, + "installed":true, + "nexthops":[ + { + "type":"SR (IS-IS)", + "outLabel":3, + "installed":true + } + ] } } diff --git a/tests/topotests/isis-sr-topo1/rt4/step8/show_ip_route.ref b/tests/topotests/isis-sr-topo1/rt4/step8/show_ip_route.ref index 3c7dfda0a3..e930657f8d 100644 --- a/tests/topotests/isis-sr-topo1/rt4/step8/show_ip_route.ref +++ b/tests/topotests/isis-sr-topo1/rt4/step8/show_ip_route.ref @@ -289,6 +289,7 @@ "metric":30, "nexthops":[ { + "fib":true, "ip":"10.0.7.6", "afi":"ipv4", "interfaceName":"eth-rt6", @@ -331,5 +332,24 @@ } ] } + ], + "10.10.10.10\/32":[ + { + "prefix":"10.10.10.10\/32", + "protocol":"isis", + "distance":115, + "metric":30, + "nexthops":[ + { + "ip":"10.0.7.6", + "afi":"ipv4", + "interfaceName":"eth-rt6", + "active":true, + "labels":[ + 18100 + ] + } + ] + } ] } diff --git a/tests/topotests/isis-sr-topo1/rt4/step8/show_ipv6_route.ref b/tests/topotests/isis-sr-topo1/rt4/step8/show_ipv6_route.ref index 38b51822dd..ca61c6e81f 100644 --- a/tests/topotests/isis-sr-topo1/rt4/step8/show_ipv6_route.ref +++ b/tests/topotests/isis-sr-topo1/rt4/step8/show_ipv6_route.ref @@ -12,7 +12,7 @@ { "fib":true, "afi":"ipv6", - "interfaceName":"eth-rt2-2", + "interfaceName":"eth-rt2-1", "active":true, "labels":[ 16011 @@ -21,7 +21,7 @@ { "fib":true, "afi":"ipv6", - "interfaceName":"eth-rt2-1", + "interfaceName":"eth-rt2-2", "active":true, "labels":[ 16011 @@ -43,7 +43,7 @@ { "fib":true, "afi":"ipv6", - "interfaceName":"eth-rt2-2", + "interfaceName":"eth-rt2-1", "active":true, "labels":[ 16021 @@ -52,7 +52,7 @@ { "fib":true, "afi":"ipv6", - "interfaceName":"eth-rt2-1", + "interfaceName":"eth-rt2-2", "active":true, "labels":[ 16021 @@ -74,7 +74,7 @@ { "fib":true, "afi":"ipv6", - "interfaceName":"eth-rt2-2", + "interfaceName":"eth-rt2-1", "active":true, "labels":[ 16031 @@ -83,7 +83,7 @@ { "fib":true, "afi":"ipv6", - "interfaceName":"eth-rt2-1", + "interfaceName":"eth-rt2-2", "active":true, "labels":[ 16031 diff --git a/tests/topotests/isis-sr-topo1/rt4/step8/show_mpls_table.ref b/tests/topotests/isis-sr-topo1/rt4/step8/show_mpls_table.ref index 4e5638f34f..eb95fa94c9 100644 --- a/tests/topotests/isis-sr-topo1/rt4/step8/show_mpls_table.ref +++ b/tests/topotests/isis-sr-topo1/rt4/step8/show_mpls_table.ref @@ -7,13 +7,13 @@ "type":"SR (IS-IS)", "outLabel":16010, "installed":true, - "nexthop":"10.0.3.2" + "nexthop":"10.0.2.2" }, { "type":"SR (IS-IS)", "outLabel":16010, "installed":true, - "nexthop":"10.0.2.2" + "nexthop":"10.0.3.2" } ] }, @@ -25,13 +25,13 @@ "type":"SR (IS-IS)", "outLabel":16011, "installed":true, - "interface":"eth-rt2-2" + "interface":"eth-rt2-1" }, { "type":"SR (IS-IS)", "outLabel":16011, "installed":true, - "interface":"eth-rt2-1" + "interface":"eth-rt2-2" } ] }, @@ -43,13 +43,13 @@ "type":"SR (IS-IS)", "outLabel":16020, "installed":true, - "nexthop":"10.0.3.2" + "nexthop":"10.0.2.2" }, { "type":"SR (IS-IS)", "outLabel":16020, "installed":true, - "nexthop":"10.0.2.2" + "nexthop":"10.0.3.2" } ] }, @@ -61,13 +61,13 @@ "type":"SR (IS-IS)", "outLabel":16021, "installed":true, - "interface":"eth-rt2-2" + "interface":"eth-rt2-1" }, { "type":"SR (IS-IS)", "outLabel":16021, "installed":true, - "interface":"eth-rt2-1" + "interface":"eth-rt2-2" } ] }, @@ -79,13 +79,13 @@ "type":"SR (IS-IS)", "outLabel":16030, "installed":true, - "nexthop":"10.0.3.2" + "nexthop":"10.0.2.2" }, { "type":"SR (IS-IS)", "outLabel":16030, "installed":true, - "nexthop":"10.0.2.2" + "nexthop":"10.0.3.2" } ] }, @@ -97,13 +97,13 @@ "type":"SR (IS-IS)", "outLabel":16031, "installed":true, - "interface":"eth-rt2-2" + "interface":"eth-rt2-1" }, { "type":"SR (IS-IS)", "outLabel":16031, "installed":true, - "interface":"eth-rt2-1" + "interface":"eth-rt2-2" } ] }, @@ -176,5 +176,28 @@ "interface":"eth-rt6" } ] + }, + "16100":{ + "inLabel":16100, + "installed":true, + "nexthops":[ + { + "type":"SR (IS-IS)", + "outLabel":18100, + "installed":true, + "nexthop":"10.0.7.6" + } + ] + }, + "16101":{ + "inLabel":16101, + "installed":true, + "nexthops":[ + { + "type":"SR (IS-IS)", + "outLabel":3, + "installed":true + } + ] } } diff --git a/tests/topotests/isis-sr-topo1/rt4/step9/show_ip_route.ref b/tests/topotests/isis-sr-topo1/rt4/step9/show_ip_route.ref index 73598e4605..a2b939a418 100644 --- a/tests/topotests/isis-sr-topo1/rt4/step9/show_ip_route.ref +++ b/tests/topotests/isis-sr-topo1/rt4/step9/show_ip_route.ref @@ -289,6 +289,7 @@ "metric":30, "nexthops":[ { + "fib":true, "ip":"10.0.7.6", "afi":"ipv4", "interfaceName":"eth-rt6", @@ -331,5 +332,24 @@ } ] } + ], + "10.10.10.10\/32":[ + { + "prefix":"10.10.10.10\/32", + "protocol":"isis", + "distance":115, + "metric":30, + "nexthops":[ + { + "ip":"10.0.7.6", + "afi":"ipv4", + "interfaceName":"eth-rt6", + "active":true, + "labels":[ + 18100 + ] + } + ] + } ] } diff --git a/tests/topotests/isis-sr-topo1/rt4/step9/show_ipv6_route.ref b/tests/topotests/isis-sr-topo1/rt4/step9/show_ipv6_route.ref index 235c1facc6..844f6becf9 100644 --- a/tests/topotests/isis-sr-topo1/rt4/step9/show_ipv6_route.ref +++ b/tests/topotests/isis-sr-topo1/rt4/step9/show_ipv6_route.ref @@ -12,7 +12,7 @@ { "fib":true, "afi":"ipv6", - "interfaceName":"eth-rt2-2", + "interfaceName":"eth-rt2-1", "active":true, "labels":[ 16011 @@ -21,7 +21,7 @@ { "fib":true, "afi":"ipv6", - "interfaceName":"eth-rt2-1", + "interfaceName":"eth-rt2-2", "active":true, "labels":[ 16011 @@ -43,7 +43,7 @@ { "fib":true, "afi":"ipv6", - "interfaceName":"eth-rt2-2", + "interfaceName":"eth-rt2-1", "active":true, "labels":[ 16021 @@ -52,7 +52,7 @@ { "fib":true, "afi":"ipv6", - "interfaceName":"eth-rt2-1", + "interfaceName":"eth-rt2-2", "active":true, "labels":[ 16021 @@ -74,7 +74,7 @@ { "fib":true, "afi":"ipv6", - "interfaceName":"eth-rt2-2", + "interfaceName":"eth-rt2-1", "active":true, "labels":[ 16031 @@ -83,7 +83,7 @@ { "fib":true, "afi":"ipv6", - "interfaceName":"eth-rt2-1", + "interfaceName":"eth-rt2-2", "active":true, "labels":[ 16031 diff --git a/tests/topotests/isis-sr-topo1/rt4/step9/show_mpls_table.ref b/tests/topotests/isis-sr-topo1/rt4/step9/show_mpls_table.ref index 5cdd99e425..5805bf3556 100644 --- a/tests/topotests/isis-sr-topo1/rt4/step9/show_mpls_table.ref +++ b/tests/topotests/isis-sr-topo1/rt4/step9/show_mpls_table.ref @@ -7,13 +7,13 @@ "type":"SR (IS-IS)", "outLabel":16010, "installed":true, - "nexthop":"10.0.3.2" + "nexthop":"10.0.2.2" }, { "type":"SR (IS-IS)", "outLabel":16010, "installed":true, - "nexthop":"10.0.2.2" + "nexthop":"10.0.3.2" } ] }, @@ -25,13 +25,13 @@ "type":"SR (IS-IS)", "outLabel":16011, "installed":true, - "interface":"eth-rt2-2" + "interface":"eth-rt2-1" }, { "type":"SR (IS-IS)", "outLabel":16011, "installed":true, - "interface":"eth-rt2-1" + "interface":"eth-rt2-2" } ] }, @@ -43,13 +43,13 @@ "type":"SR (IS-IS)", "outLabel":16020, "installed":true, - "nexthop":"10.0.3.2" + "nexthop":"10.0.2.2" }, { "type":"SR (IS-IS)", "outLabel":16020, "installed":true, - "nexthop":"10.0.2.2" + "nexthop":"10.0.3.2" } ] }, @@ -61,13 +61,13 @@ "type":"SR (IS-IS)", "outLabel":16021, "installed":true, - "interface":"eth-rt2-2" + "interface":"eth-rt2-1" }, { "type":"SR (IS-IS)", "outLabel":16021, "installed":true, - "interface":"eth-rt2-1" + "interface":"eth-rt2-2" } ] }, @@ -79,13 +79,13 @@ "type":"SR (IS-IS)", "outLabel":16030, "installed":true, - "nexthop":"10.0.3.2" + "nexthop":"10.0.2.2" }, { "type":"SR (IS-IS)", "outLabel":16030, "installed":true, - "nexthop":"10.0.2.2" + "nexthop":"10.0.3.2" } ] }, @@ -97,13 +97,13 @@ "type":"SR (IS-IS)", "outLabel":16031, "installed":true, - "interface":"eth-rt2-2" + "interface":"eth-rt2-1" }, { "type":"SR (IS-IS)", "outLabel":16031, "installed":true, - "interface":"eth-rt2-1" + "interface":"eth-rt2-2" } ] }, @@ -176,5 +176,28 @@ "interface":"eth-rt6" } ] + }, + "16100":{ + "inLabel":16100, + "installed":true, + "nexthops":[ + { + "type":"SR (IS-IS)", + "outLabel":18100, + "installed":true, + "nexthop":"10.0.7.6" + } + ] + }, + "16101":{ + "inLabel":16101, + "installed":true, + "nexthops":[ + { + "type":"SR (IS-IS)", + "outLabel":3, + "installed":true + } + ] } } diff --git a/tests/topotests/isis-sr-topo1/rt4/zebra.conf b/tests/topotests/isis-sr-topo1/rt4/zebra.conf index 4945897e9d..5889901c56 100644 --- a/tests/topotests/isis-sr-topo1/rt4/zebra.conf +++ b/tests/topotests/isis-sr-topo1/rt4/zebra.conf @@ -8,7 +8,9 @@ debug zebra mpls ! interface lo ip address 4.4.4.4/32 + ip address 10.10.10.10/32 ipv6 address 2001:db8:1000::4/128 + ipv6 address 2001:db8:1000::10/128 ! interface eth-rt2-1 ip address 10.0.2.4/24 diff --git a/tests/topotests/isis-sr-topo1/rt5/isisd.conf b/tests/topotests/isis-sr-topo1/rt5/isisd.conf index 6845e5bb82..f7beea796c 100644 --- a/tests/topotests/isis-sr-topo1/rt5/isisd.conf +++ b/tests/topotests/isis-sr-topo1/rt5/isisd.conf @@ -45,5 +45,7 @@ router isis 1 segment-routing global-block 16000 23999 segment-routing node-msd 8 segment-routing prefix 5.5.5.5/32 index 50 no-php-flag + segment-routing prefix 10.10.10.10/32 index 100 no-php-flag n-flag-clear segment-routing prefix 2001:db8:1000::5/128 index 51 no-php-flag + segment-routing prefix 2001:db8:1000::10/128 index 101 no-php-flag n-flag-clear ! diff --git a/tests/topotests/isis-sr-topo1/rt5/step1/show_ip_route.ref b/tests/topotests/isis-sr-topo1/rt5/step1/show_ip_route.ref index 8eaf40f236..0497bd8399 100644 --- a/tests/topotests/isis-sr-topo1/rt5/step1/show_ip_route.ref +++ b/tests/topotests/isis-sr-topo1/rt5/step1/show_ip_route.ref @@ -319,5 +319,24 @@ } ] } + ], + "10.10.10.10\/32":[ + { + "prefix":"10.10.10.10\/32", + "protocol":"isis", + "distance":115, + "metric":20, + "nexthops":[ + { + "ip":"10.0.6.4", + "afi":"ipv4", + "interfaceName":"eth-rt4", + "active":true, + "labels":[ + 16100 + ] + } + ] + } ] } diff --git a/tests/topotests/isis-sr-topo1/rt5/step1/show_mpls_table.ref b/tests/topotests/isis-sr-topo1/rt5/step1/show_mpls_table.ref index 9054c9c4af..99d1f773b7 100644 --- a/tests/topotests/isis-sr-topo1/rt5/step1/show_mpls_table.ref +++ b/tests/topotests/isis-sr-topo1/rt5/step1/show_mpls_table.ref @@ -188,5 +188,28 @@ "interface":"eth-rt6" } ] + }, + "16100":{ + "inLabel":16100, + "installed":true, + "nexthops":[ + { + "type":"SR (IS-IS)", + "outLabel":16100, + "installed":true, + "nexthop":"10.0.6.4" + } + ] + }, + "16101":{ + "inLabel":16101, + "installed":true, + "nexthops":[ + { + "type":"SR (IS-IS)", + "outLabel":3, + "installed":true + } + ] } } diff --git a/tests/topotests/isis-sr-topo1/rt5/step10/show_ip_route.ref b/tests/topotests/isis-sr-topo1/rt5/step10/show_ip_route.ref index a5a0bacaad..620f5eac67 100644 --- a/tests/topotests/isis-sr-topo1/rt5/step10/show_ip_route.ref +++ b/tests/topotests/isis-sr-topo1/rt5/step10/show_ip_route.ref @@ -274,6 +274,21 @@ ] } ], + "10.0.6.0\/24":[ + { + "prefix":"10.0.6.0\/24", + "protocol":"isis", + "distance":115, + "metric":20, + "nexthops":[ + { + "ip":"10.0.6.4", + "afi":"ipv4", + "interfaceName":"eth-rt4" + } + ] + } + ], "10.0.7.0\/24":[ { "prefix":"10.0.7.0\/24", @@ -308,5 +323,24 @@ } ] } + ], + "10.10.10.10\/32":[ + { + "prefix":"10.10.10.10\/32", + "protocol":"isis", + "distance":115, + "metric":30, + "nexthops":[ + { + "ip":"10.0.8.6", + "afi":"ipv4", + "interfaceName":"eth-rt6", + "active":true, + "labels":[ + 18100 + ] + } + ] + } ] } diff --git a/tests/topotests/isis-sr-topo1/rt5/step10/show_mpls_table.ref b/tests/topotests/isis-sr-topo1/rt5/step10/show_mpls_table.ref index e43ef6671d..7cfea2a329 100644 --- a/tests/topotests/isis-sr-topo1/rt5/step10/show_mpls_table.ref +++ b/tests/topotests/isis-sr-topo1/rt5/step10/show_mpls_table.ref @@ -176,5 +176,28 @@ "interface":"eth-rt6" } ] + }, + "16100":{ + "inLabel":16100, + "installed":true, + "nexthops":[ + { + "type":"SR (IS-IS)", + "outLabel":18100, + "installed":true, + "nexthop":"10.0.8.6" + } + ] + }, + "16101":{ + "inLabel":16101, + "installed":true, + "nexthops":[ + { + "type":"SR (IS-IS)", + "outLabel":3, + "installed":true + } + ] } } diff --git a/tests/topotests/isis-sr-topo1/rt5/step2/show_ip_route.ref b/tests/topotests/isis-sr-topo1/rt5/step2/show_ip_route.ref index 101b811d3b..19cdf9d896 100644 --- a/tests/topotests/isis-sr-topo1/rt5/step2/show_ip_route.ref +++ b/tests/topotests/isis-sr-topo1/rt5/step2/show_ip_route.ref @@ -281,6 +281,21 @@ ] } ], + "10.0.6.0\/24":[ + { + "prefix":"10.0.6.0\/24", + "protocol":"isis", + "distance":115, + "metric":20, + "nexthops":[ + { + "ip":"10.0.6.4", + "afi":"ipv4", + "interfaceName":"eth-rt4" + } + ] + } + ], "10.0.7.0\/24":[ { "prefix":"10.0.7.0\/24", @@ -315,5 +330,24 @@ } ] } + ], + "10.10.10.10\/32":[ + { + "prefix":"10.10.10.10\/32", + "protocol":"isis", + "distance":115, + "metric":30, + "nexthops":[ + { + "ip":"10.0.8.6", + "afi":"ipv4", + "interfaceName":"eth-rt6", + "active":true, + "labels":[ + 16100 + ] + } + ] + } ] } diff --git a/tests/topotests/isis-sr-topo1/rt5/step2/show_mpls_table.ref b/tests/topotests/isis-sr-topo1/rt5/step2/show_mpls_table.ref index 660e319a50..08f1635a39 100644 --- a/tests/topotests/isis-sr-topo1/rt5/step2/show_mpls_table.ref +++ b/tests/topotests/isis-sr-topo1/rt5/step2/show_mpls_table.ref @@ -176,5 +176,28 @@ "interface":"eth-rt6" } ] + }, + "16100":{ + "inLabel":16100, + "installed":true, + "nexthops":[ + { + "type":"SR (IS-IS)", + "outLabel":16100, + "installed":true, + "nexthop":"10.0.8.6" + } + ] + }, + "16101":{ + "inLabel":16101, + "installed":true, + "nexthops":[ + { + "type":"SR (IS-IS)", + "outLabel":3, + "installed":true + } + ] } } diff --git a/tests/topotests/isis-sr-topo1/rt5/step3/show_ip_route.ref b/tests/topotests/isis-sr-topo1/rt5/step3/show_ip_route.ref index dff6c5f7eb..48b5e6491e 100644 --- a/tests/topotests/isis-sr-topo1/rt5/step3/show_ip_route.ref +++ b/tests/topotests/isis-sr-topo1/rt5/step3/show_ip_route.ref @@ -254,6 +254,21 @@ ] } ], + "10.0.6.0\/24":[ + { + "prefix":"10.0.6.0\/24", + "protocol":"isis", + "distance":115, + "metric":20, + "nexthops":[ + { + "ip":"10.0.6.4", + "afi":"ipv4", + "interfaceName":"eth-rt4" + } + ] + } + ], "10.0.7.0\/24":[ { "prefix":"10.0.7.0\/24", @@ -280,5 +295,33 @@ } ] } + ], + "10.10.10.10\/32":[ + { + "prefix":"10.10.10.10\/32", + "protocol":"isis", + "distance":115, + "metric":40, + "nexthops":[ + { + "ip":"10.0.4.3", + "afi":"ipv4", + "interfaceName":"eth-rt3-1", + "active":true, + "labels":[ + 17100 + ] + }, + { + "ip":"10.0.5.3", + "afi":"ipv4", + "interfaceName":"eth-rt3-2", + "active":true, + "labels":[ + 17100 + ] + } + ] + } ] } diff --git a/tests/topotests/isis-sr-topo1/rt5/step3/show_mpls_table.ref b/tests/topotests/isis-sr-topo1/rt5/step3/show_mpls_table.ref index 9df3fc9ef6..9980058b12 100644 --- a/tests/topotests/isis-sr-topo1/rt5/step3/show_mpls_table.ref +++ b/tests/topotests/isis-sr-topo1/rt5/step3/show_mpls_table.ref @@ -164,5 +164,34 @@ "installed":true } ] + }, + "16100":{ + "inLabel":16100, + "installed":true, + "nexthops":[ + { + "type":"SR (IS-IS)", + "outLabel":17100, + "installed":true, + "nexthop":"10.0.5.3" + }, + { + "type":"SR (IS-IS)", + "outLabel":17100, + "installed":true, + "nexthop":"10.0.4.3" + } + ] + }, + "16101":{ + "inLabel":16101, + "installed":true, + "nexthops":[ + { + "type":"SR (IS-IS)", + "outLabel":3, + "installed":true + } + ] } } diff --git a/tests/topotests/isis-sr-topo1/rt5/step4/show_ip_route.ref b/tests/topotests/isis-sr-topo1/rt5/step4/show_ip_route.ref index 6b29ff2d44..156beef0f1 100644 --- a/tests/topotests/isis-sr-topo1/rt5/step4/show_ip_route.ref +++ b/tests/topotests/isis-sr-topo1/rt5/step4/show_ip_route.ref @@ -281,6 +281,21 @@ ] } ], + "10.0.6.0\/24":[ + { + "prefix":"10.0.6.0\/24", + "protocol":"isis", + "distance":115, + "metric":20, + "nexthops":[ + { + "ip":"10.0.6.4", + "afi":"ipv4", + "interfaceName":"eth-rt4" + } + ] + } + ], "10.0.7.0\/24":[ { "prefix":"10.0.7.0\/24", @@ -301,17 +316,21 @@ ] } ], - "10.0.8.0\/24":[ + "10.10.10.10\/32":[ { - "prefix":"10.0.8.0\/24", + "prefix":"10.10.10.10\/32", "protocol":"isis", "distance":115, - "metric":20, + "metric":30, "nexthops":[ { "ip":"10.0.8.6", "afi":"ipv4", - "interfaceName":"eth-rt6" + "interfaceName":"eth-rt6", + "active":true, + "labels":[ + 18100 + ] } ] } diff --git a/tests/topotests/isis-sr-topo1/rt5/step4/show_mpls_table.ref b/tests/topotests/isis-sr-topo1/rt5/step4/show_mpls_table.ref index 4d13108d7d..a84ed90b25 100644 --- a/tests/topotests/isis-sr-topo1/rt5/step4/show_mpls_table.ref +++ b/tests/topotests/isis-sr-topo1/rt5/step4/show_mpls_table.ref @@ -176,5 +176,28 @@ "interface":"eth-rt6" } ] + }, + "16100":{ + "inLabel":16100, + "installed":true, + "nexthops":[ + { + "type":"SR (IS-IS)", + "outLabel":18100, + "installed":true, + "nexthop":"10.0.8.6" + } + ] + }, + "16101":{ + "inLabel":16101, + "installed":true, + "nexthops":[ + { + "type":"SR (IS-IS)", + "outLabel":3, + "installed":true + } + ] } } diff --git a/tests/topotests/isis-sr-topo1/rt5/step5/show_ip_route.ref b/tests/topotests/isis-sr-topo1/rt5/step5/show_ip_route.ref index cadb674ba3..dba5e8d8a2 100644 --- a/tests/topotests/isis-sr-topo1/rt5/step5/show_ip_route.ref +++ b/tests/topotests/isis-sr-topo1/rt5/step5/show_ip_route.ref @@ -275,6 +275,21 @@ ] } ], + "10.0.6.0\/24":[ + { + "prefix":"10.0.6.0\/24", + "protocol":"isis", + "distance":115, + "metric":20, + "nexthops":[ + { + "ip":"10.0.6.4", + "afi":"ipv4", + "interfaceName":"eth-rt4" + } + ] + } + ], "10.0.7.0\/24":[ { "prefix":"10.0.7.0\/24", @@ -295,17 +310,19 @@ ] } ], - "10.0.8.0\/24":[ + "10.10.10.10\/32":[ { - "prefix":"10.0.8.0\/24", + "prefix":"10.10.10.10\/32", "protocol":"isis", "distance":115, - "metric":20, + "metric":30, "nexthops":[ { + "fib":true, "ip":"10.0.8.6", "afi":"ipv4", - "interfaceName":"eth-rt6" + "interfaceName":"eth-rt6", + "active":true } ] } diff --git a/tests/topotests/isis-sr-topo1/rt5/step5/show_mpls_table.ref b/tests/topotests/isis-sr-topo1/rt5/step5/show_mpls_table.ref index c60383093f..36c21b041f 100644 --- a/tests/topotests/isis-sr-topo1/rt5/step5/show_mpls_table.ref +++ b/tests/topotests/isis-sr-topo1/rt5/step5/show_mpls_table.ref @@ -128,5 +128,16 @@ "installed":true } ] + }, + "16101":{ + "inLabel":16101, + "installed":true, + "nexthops":[ + { + "type":"SR (IS-IS)", + "outLabel":3, + "installed":true + } + ] } } diff --git a/tests/topotests/isis-sr-topo1/rt5/step6/show_ip_route.ref b/tests/topotests/isis-sr-topo1/rt5/step6/show_ip_route.ref index 6b29ff2d44..156beef0f1 100644 --- a/tests/topotests/isis-sr-topo1/rt5/step6/show_ip_route.ref +++ b/tests/topotests/isis-sr-topo1/rt5/step6/show_ip_route.ref @@ -281,6 +281,21 @@ ] } ], + "10.0.6.0\/24":[ + { + "prefix":"10.0.6.0\/24", + "protocol":"isis", + "distance":115, + "metric":20, + "nexthops":[ + { + "ip":"10.0.6.4", + "afi":"ipv4", + "interfaceName":"eth-rt4" + } + ] + } + ], "10.0.7.0\/24":[ { "prefix":"10.0.7.0\/24", @@ -301,17 +316,21 @@ ] } ], - "10.0.8.0\/24":[ + "10.10.10.10\/32":[ { - "prefix":"10.0.8.0\/24", + "prefix":"10.10.10.10\/32", "protocol":"isis", "distance":115, - "metric":20, + "metric":30, "nexthops":[ { "ip":"10.0.8.6", "afi":"ipv4", - "interfaceName":"eth-rt6" + "interfaceName":"eth-rt6", + "active":true, + "labels":[ + 18100 + ] } ] } diff --git a/tests/topotests/isis-sr-topo1/rt5/step6/show_mpls_table.ref b/tests/topotests/isis-sr-topo1/rt5/step6/show_mpls_table.ref index 4d13108d7d..a84ed90b25 100644 --- a/tests/topotests/isis-sr-topo1/rt5/step6/show_mpls_table.ref +++ b/tests/topotests/isis-sr-topo1/rt5/step6/show_mpls_table.ref @@ -176,5 +176,28 @@ "interface":"eth-rt6" } ] + }, + "16100":{ + "inLabel":16100, + "installed":true, + "nexthops":[ + { + "type":"SR (IS-IS)", + "outLabel":18100, + "installed":true, + "nexthop":"10.0.8.6" + } + ] + }, + "16101":{ + "inLabel":16101, + "installed":true, + "nexthops":[ + { + "type":"SR (IS-IS)", + "outLabel":3, + "installed":true + } + ] } } diff --git a/tests/topotests/isis-sr-topo1/rt5/step7/show_ip_route.ref b/tests/topotests/isis-sr-topo1/rt5/step7/show_ip_route.ref index 72b89ccf69..ece747bdac 100644 --- a/tests/topotests/isis-sr-topo1/rt5/step7/show_ip_route.ref +++ b/tests/topotests/isis-sr-topo1/rt5/step7/show_ip_route.ref @@ -275,6 +275,21 @@ ] } ], + "10.0.6.0\/24":[ + { + "prefix":"10.0.6.0\/24", + "protocol":"isis", + "distance":115, + "metric":20, + "nexthops":[ + { + "ip":"10.0.6.4", + "afi":"ipv4", + "interfaceName":"eth-rt4" + } + ] + } + ], "10.0.7.0\/24":[ { "prefix":"10.0.7.0\/24", @@ -295,17 +310,21 @@ ] } ], - "10.0.8.0\/24":[ + "10.10.10.10\/32":[ { - "prefix":"10.0.8.0\/24", + "prefix":"10.10.10.10\/32", "protocol":"isis", "distance":115, - "metric":20, + "metric":30, "nexthops":[ { "ip":"10.0.8.6", "afi":"ipv4", - "interfaceName":"eth-rt6" + "interfaceName":"eth-rt6", + "active":true, + "labels":[ + 18100 + ] } ] } diff --git a/tests/topotests/isis-sr-topo1/rt5/step7/show_mpls_table.ref b/tests/topotests/isis-sr-topo1/rt5/step7/show_mpls_table.ref index 2b1e67ea71..c98da7effd 100644 --- a/tests/topotests/isis-sr-topo1/rt5/step7/show_mpls_table.ref +++ b/tests/topotests/isis-sr-topo1/rt5/step7/show_mpls_table.ref @@ -140,5 +140,28 @@ "interface":"eth-rt6" } ] + }, + "16100":{ + "inLabel":16100, + "installed":true, + "nexthops":[ + { + "type":"SR (IS-IS)", + "outLabel":18100, + "installed":true, + "nexthop":"10.0.8.6" + } + ] + }, + "16101":{ + "inLabel":16101, + "installed":true, + "nexthops":[ + { + "type":"SR (IS-IS)", + "outLabel":3, + "installed":true + } + ] } } diff --git a/tests/topotests/isis-sr-topo1/rt5/step8/show_ip_route.ref b/tests/topotests/isis-sr-topo1/rt5/step8/show_ip_route.ref index 6b29ff2d44..156beef0f1 100644 --- a/tests/topotests/isis-sr-topo1/rt5/step8/show_ip_route.ref +++ b/tests/topotests/isis-sr-topo1/rt5/step8/show_ip_route.ref @@ -281,6 +281,21 @@ ] } ], + "10.0.6.0\/24":[ + { + "prefix":"10.0.6.0\/24", + "protocol":"isis", + "distance":115, + "metric":20, + "nexthops":[ + { + "ip":"10.0.6.4", + "afi":"ipv4", + "interfaceName":"eth-rt4" + } + ] + } + ], "10.0.7.0\/24":[ { "prefix":"10.0.7.0\/24", @@ -301,17 +316,21 @@ ] } ], - "10.0.8.0\/24":[ + "10.10.10.10\/32":[ { - "prefix":"10.0.8.0\/24", + "prefix":"10.10.10.10\/32", "protocol":"isis", "distance":115, - "metric":20, + "metric":30, "nexthops":[ { "ip":"10.0.8.6", "afi":"ipv4", - "interfaceName":"eth-rt6" + "interfaceName":"eth-rt6", + "active":true, + "labels":[ + 18100 + ] } ] } diff --git a/tests/topotests/isis-sr-topo1/rt5/step8/show_mpls_table.ref b/tests/topotests/isis-sr-topo1/rt5/step8/show_mpls_table.ref index 4d13108d7d..a84ed90b25 100644 --- a/tests/topotests/isis-sr-topo1/rt5/step8/show_mpls_table.ref +++ b/tests/topotests/isis-sr-topo1/rt5/step8/show_mpls_table.ref @@ -176,5 +176,28 @@ "interface":"eth-rt6" } ] + }, + "16100":{ + "inLabel":16100, + "installed":true, + "nexthops":[ + { + "type":"SR (IS-IS)", + "outLabel":18100, + "installed":true, + "nexthop":"10.0.8.6" + } + ] + }, + "16101":{ + "inLabel":16101, + "installed":true, + "nexthops":[ + { + "type":"SR (IS-IS)", + "outLabel":3, + "installed":true + } + ] } } diff --git a/tests/topotests/isis-sr-topo1/rt5/step9/show_ip_route.ref b/tests/topotests/isis-sr-topo1/rt5/step9/show_ip_route.ref index cc37894d67..90588c6708 100644 --- a/tests/topotests/isis-sr-topo1/rt5/step9/show_ip_route.ref +++ b/tests/topotests/isis-sr-topo1/rt5/step9/show_ip_route.ref @@ -281,6 +281,21 @@ ] } ], + "10.0.6.0\/24":[ + { + "prefix":"10.0.6.0\/24", + "protocol":"isis", + "distance":115, + "metric":20, + "nexthops":[ + { + "ip":"10.0.6.4", + "afi":"ipv4", + "interfaceName":"eth-rt4" + } + ] + } + ], "10.0.7.0\/24":[ { "prefix":"10.0.7.0\/24", @@ -301,17 +316,21 @@ ] } ], - "10.0.8.0\/24":[ + "10.10.10.10\/32":[ { - "prefix":"10.0.8.0\/24", + "prefix":"10.10.10.10\/32", "protocol":"isis", "distance":115, - "metric":20, + "metric":30, "nexthops":[ { "ip":"10.0.8.6", "afi":"ipv4", - "interfaceName":"eth-rt6" + "interfaceName":"eth-rt6", + "active":true, + "labels":[ + 18100 + ] } ] } diff --git a/tests/topotests/isis-sr-topo1/rt5/step9/show_mpls_table.ref b/tests/topotests/isis-sr-topo1/rt5/step9/show_mpls_table.ref index e43ef6671d..7cfea2a329 100644 --- a/tests/topotests/isis-sr-topo1/rt5/step9/show_mpls_table.ref +++ b/tests/topotests/isis-sr-topo1/rt5/step9/show_mpls_table.ref @@ -176,5 +176,28 @@ "interface":"eth-rt6" } ] + }, + "16100":{ + "inLabel":16100, + "installed":true, + "nexthops":[ + { + "type":"SR (IS-IS)", + "outLabel":18100, + "installed":true, + "nexthop":"10.0.8.6" + } + ] + }, + "16101":{ + "inLabel":16101, + "installed":true, + "nexthops":[ + { + "type":"SR (IS-IS)", + "outLabel":3, + "installed":true + } + ] } } diff --git a/tests/topotests/isis-sr-topo1/rt5/zebra.conf b/tests/topotests/isis-sr-topo1/rt5/zebra.conf index 4cfea1a59f..a0c8f2cd7e 100644 --- a/tests/topotests/isis-sr-topo1/rt5/zebra.conf +++ b/tests/topotests/isis-sr-topo1/rt5/zebra.conf @@ -8,7 +8,9 @@ debug zebra mpls ! interface lo ip address 5.5.5.5/32 + ip address 10.10.10.10/32 ipv6 address 2001:db8:1000::5/128 + ipv6 address 2001:db8:1000::10/128 ! interface eth-rt3-1 ip address 10.0.4.5/24 diff --git a/tests/topotests/isis-sr-topo1/rt6/step1/show_ip_route.ref b/tests/topotests/isis-sr-topo1/rt6/step1/show_ip_route.ref index 324b71f7b8..7b62b0a9c6 100644 --- a/tests/topotests/isis-sr-topo1/rt6/step1/show_ip_route.ref +++ b/tests/topotests/isis-sr-topo1/rt6/step1/show_ip_route.ref @@ -287,5 +287,38 @@ } ] } + ], + "10.10.10.10\/32":[ + { + "prefix":"10.10.10.10\/32", + "protocol":"isis", + "selected":true, + "destSelected":true, + "distance":115, + "metric":20, + "installed":true, + "nexthops":[ + { + "fib":true, + "ip":"10.0.7.4", + "afi":"ipv4", + "interfaceName":"eth-rt4", + "active":true, + "labels":[ + 16100 + ] + }, + { + "fib":true, + "ip":"10.0.8.5", + "afi":"ipv4", + "interfaceName":"eth-rt5", + "active":true, + "labels":[ + 16100 + ] + } + ] + } ] } diff --git a/tests/topotests/isis-sr-topo1/rt6/step1/show_ipv6_route.ref b/tests/topotests/isis-sr-topo1/rt6/step1/show_ipv6_route.ref index eee9dea4d3..834cdfe6ca 100644 --- a/tests/topotests/isis-sr-topo1/rt6/step1/show_ipv6_route.ref +++ b/tests/topotests/isis-sr-topo1/rt6/step1/show_ipv6_route.ref @@ -12,7 +12,7 @@ { "fib":true, "afi":"ipv6", - "interfaceName":"eth-rt5", + "interfaceName":"eth-rt4", "active":true, "labels":[ 16011 @@ -21,7 +21,7 @@ { "fib":true, "afi":"ipv6", - "interfaceName":"eth-rt4", + "interfaceName":"eth-rt5", "active":true, "labels":[ 16011 @@ -117,5 +117,36 @@ } ] } + ], + "2001:db8:1000::10\/128":[ + { + "prefix":"2001:db8:1000::10\/128", + "protocol":"isis", + "selected":true, + "destSelected":true, + "distance":115, + "metric":20, + "installed":true, + "nexthops":[ + { + "fib":true, + "afi":"ipv6", + "interfaceName":"eth-rt4", + "active":true, + "labels":[ + 16101 + ] + }, + { + "fib":true, + "afi":"ipv6", + "interfaceName":"eth-rt5", + "active":true, + "labels":[ + 16101 + ] + } + ] + } ] } diff --git a/tests/topotests/isis-sr-topo1/rt6/step1/show_mpls_table.ref b/tests/topotests/isis-sr-topo1/rt6/step1/show_mpls_table.ref index 970251fe8a..2c526e74f0 100644 --- a/tests/topotests/isis-sr-topo1/rt6/step1/show_mpls_table.ref +++ b/tests/topotests/isis-sr-topo1/rt6/step1/show_mpls_table.ref @@ -130,5 +130,41 @@ "interface":"eth-rt5" } ] + }, + "16100":{ + "inLabel":16100, + "installed":true, + "nexthops":[ + { + "type":"SR (IS-IS)", + "outLabel":16100, + "installed":true, + "nexthop":"10.0.8.5" + }, + { + "type":"SR (IS-IS)", + "outLabel":16100, + "installed":true, + "nexthop":"10.0.7.4" + } + ] + }, + "16101":{ + "inLabel":16101, + "installed":true, + "nexthops":[ + { + "type":"SR (IS-IS)", + "outLabel":16101, + "installed":true, + "interface":"eth-rt5" + }, + { + "type":"SR (IS-IS)", + "outLabel":16101, + "installed":true, + "interface":"eth-rt4" + } + ] } } diff --git a/tests/topotests/isis-sr-topo1/rt6/step10/show_ip_route.ref b/tests/topotests/isis-sr-topo1/rt6/step10/show_ip_route.ref index 9d0c331ff2..d430ef5a33 100644 --- a/tests/topotests/isis-sr-topo1/rt6/step10/show_ip_route.ref +++ b/tests/topotests/isis-sr-topo1/rt6/step10/show_ip_route.ref @@ -280,5 +280,38 @@ } ] } + ], + "10.10.10.10\/32":[ + { + "prefix":"10.10.10.10\/32", + "protocol":"isis", + "selected":true, + "destSelected":true, + "distance":115, + "metric":20, + "installed":true, + "nexthops":[ + { + "fib":true, + "ip":"10.0.7.4", + "afi":"ipv4", + "interfaceName":"eth-rt4", + "active":true, + "labels":[ + 16100 + ] + }, + { + "fib":true, + "ip":"10.0.8.5", + "afi":"ipv4", + "interfaceName":"eth-rt5", + "active":true, + "labels":[ + 16100 + ] + } + ] + } ] } diff --git a/tests/topotests/isis-sr-topo1/rt6/step10/show_ipv6_route.ref b/tests/topotests/isis-sr-topo1/rt6/step10/show_ipv6_route.ref index eee9dea4d3..834cdfe6ca 100644 --- a/tests/topotests/isis-sr-topo1/rt6/step10/show_ipv6_route.ref +++ b/tests/topotests/isis-sr-topo1/rt6/step10/show_ipv6_route.ref @@ -12,7 +12,7 @@ { "fib":true, "afi":"ipv6", - "interfaceName":"eth-rt5", + "interfaceName":"eth-rt4", "active":true, "labels":[ 16011 @@ -21,7 +21,7 @@ { "fib":true, "afi":"ipv6", - "interfaceName":"eth-rt4", + "interfaceName":"eth-rt5", "active":true, "labels":[ 16011 @@ -117,5 +117,36 @@ } ] } + ], + "2001:db8:1000::10\/128":[ + { + "prefix":"2001:db8:1000::10\/128", + "protocol":"isis", + "selected":true, + "destSelected":true, + "distance":115, + "metric":20, + "installed":true, + "nexthops":[ + { + "fib":true, + "afi":"ipv6", + "interfaceName":"eth-rt4", + "active":true, + "labels":[ + 16101 + ] + }, + { + "fib":true, + "afi":"ipv6", + "interfaceName":"eth-rt5", + "active":true, + "labels":[ + 16101 + ] + } + ] + } ] } diff --git a/tests/topotests/isis-sr-topo1/rt6/step10/show_mpls_table.ref b/tests/topotests/isis-sr-topo1/rt6/step10/show_mpls_table.ref index a79406b300..be87ed90a0 100644 --- a/tests/topotests/isis-sr-topo1/rt6/step10/show_mpls_table.ref +++ b/tests/topotests/isis-sr-topo1/rt6/step10/show_mpls_table.ref @@ -130,5 +130,41 @@ "interface":"eth-rt5" } ] + }, + "18100":{ + "inLabel":18100, + "installed":true, + "nexthops":[ + { + "type":"SR (IS-IS)", + "outLabel":16100, + "installed":true, + "nexthop":"10.0.8.5" + }, + { + "type":"SR (IS-IS)", + "outLabel":16100, + "installed":true, + "nexthop":"10.0.7.4" + } + ] + }, + "18101":{ + "inLabel":18101, + "installed":true, + "nexthops":[ + { + "type":"SR (IS-IS)", + "outLabel":16101, + "installed":true, + "interface":"eth-rt5" + }, + { + "type":"SR (IS-IS)", + "outLabel":16101, + "installed":true, + "interface":"eth-rt4" + } + ] } } diff --git a/tests/topotests/isis-sr-topo1/rt6/step2/show_ip_route.ref b/tests/topotests/isis-sr-topo1/rt6/step2/show_ip_route.ref index e4df0d846e..4b204dbc4c 100644 --- a/tests/topotests/isis-sr-topo1/rt6/step2/show_ip_route.ref +++ b/tests/topotests/isis-sr-topo1/rt6/step2/show_ip_route.ref @@ -280,5 +280,38 @@ } ] } + ], + "10.10.10.10\/32":[ + { + "prefix":"10.10.10.10\/32", + "protocol":"isis", + "selected":true, + "destSelected":true, + "distance":115, + "metric":20, + "installed":true, + "nexthops":[ + { + "fib":true, + "ip":"10.0.7.4", + "afi":"ipv4", + "interfaceName":"eth-rt4", + "active":true, + "labels":[ + 16100 + ] + }, + { + "fib":true, + "ip":"10.0.8.5", + "afi":"ipv4", + "interfaceName":"eth-rt5", + "active":true, + "labels":[ + 16100 + ] + } + ] + } ] } diff --git a/tests/topotests/isis-sr-topo1/rt6/step2/show_ipv6_route.ref b/tests/topotests/isis-sr-topo1/rt6/step2/show_ipv6_route.ref index eee9dea4d3..834cdfe6ca 100644 --- a/tests/topotests/isis-sr-topo1/rt6/step2/show_ipv6_route.ref +++ b/tests/topotests/isis-sr-topo1/rt6/step2/show_ipv6_route.ref @@ -12,7 +12,7 @@ { "fib":true, "afi":"ipv6", - "interfaceName":"eth-rt5", + "interfaceName":"eth-rt4", "active":true, "labels":[ 16011 @@ -21,7 +21,7 @@ { "fib":true, "afi":"ipv6", - "interfaceName":"eth-rt4", + "interfaceName":"eth-rt5", "active":true, "labels":[ 16011 @@ -117,5 +117,36 @@ } ] } + ], + "2001:db8:1000::10\/128":[ + { + "prefix":"2001:db8:1000::10\/128", + "protocol":"isis", + "selected":true, + "destSelected":true, + "distance":115, + "metric":20, + "installed":true, + "nexthops":[ + { + "fib":true, + "afi":"ipv6", + "interfaceName":"eth-rt4", + "active":true, + "labels":[ + 16101 + ] + }, + { + "fib":true, + "afi":"ipv6", + "interfaceName":"eth-rt5", + "active":true, + "labels":[ + 16101 + ] + } + ] + } ] } diff --git a/tests/topotests/isis-sr-topo1/rt6/step2/show_mpls_table.ref b/tests/topotests/isis-sr-topo1/rt6/step2/show_mpls_table.ref index 970251fe8a..2c526e74f0 100644 --- a/tests/topotests/isis-sr-topo1/rt6/step2/show_mpls_table.ref +++ b/tests/topotests/isis-sr-topo1/rt6/step2/show_mpls_table.ref @@ -130,5 +130,41 @@ "interface":"eth-rt5" } ] + }, + "16100":{ + "inLabel":16100, + "installed":true, + "nexthops":[ + { + "type":"SR (IS-IS)", + "outLabel":16100, + "installed":true, + "nexthop":"10.0.8.5" + }, + { + "type":"SR (IS-IS)", + "outLabel":16100, + "installed":true, + "nexthop":"10.0.7.4" + } + ] + }, + "16101":{ + "inLabel":16101, + "installed":true, + "nexthops":[ + { + "type":"SR (IS-IS)", + "outLabel":16101, + "installed":true, + "interface":"eth-rt5" + }, + { + "type":"SR (IS-IS)", + "outLabel":16101, + "installed":true, + "interface":"eth-rt4" + } + ] } } diff --git a/tests/topotests/isis-sr-topo1/rt6/step4/show_ip_route.ref b/tests/topotests/isis-sr-topo1/rt6/step4/show_ip_route.ref index e4df0d846e..4b204dbc4c 100644 --- a/tests/topotests/isis-sr-topo1/rt6/step4/show_ip_route.ref +++ b/tests/topotests/isis-sr-topo1/rt6/step4/show_ip_route.ref @@ -280,5 +280,38 @@ } ] } + ], + "10.10.10.10\/32":[ + { + "prefix":"10.10.10.10\/32", + "protocol":"isis", + "selected":true, + "destSelected":true, + "distance":115, + "metric":20, + "installed":true, + "nexthops":[ + { + "fib":true, + "ip":"10.0.7.4", + "afi":"ipv4", + "interfaceName":"eth-rt4", + "active":true, + "labels":[ + 16100 + ] + }, + { + "fib":true, + "ip":"10.0.8.5", + "afi":"ipv4", + "interfaceName":"eth-rt5", + "active":true, + "labels":[ + 16100 + ] + } + ] + } ] } diff --git a/tests/topotests/isis-sr-topo1/rt6/step4/show_ipv6_route.ref b/tests/topotests/isis-sr-topo1/rt6/step4/show_ipv6_route.ref index eee9dea4d3..834cdfe6ca 100644 --- a/tests/topotests/isis-sr-topo1/rt6/step4/show_ipv6_route.ref +++ b/tests/topotests/isis-sr-topo1/rt6/step4/show_ipv6_route.ref @@ -12,7 +12,7 @@ { "fib":true, "afi":"ipv6", - "interfaceName":"eth-rt5", + "interfaceName":"eth-rt4", "active":true, "labels":[ 16011 @@ -21,7 +21,7 @@ { "fib":true, "afi":"ipv6", - "interfaceName":"eth-rt4", + "interfaceName":"eth-rt5", "active":true, "labels":[ 16011 @@ -117,5 +117,36 @@ } ] } + ], + "2001:db8:1000::10\/128":[ + { + "prefix":"2001:db8:1000::10\/128", + "protocol":"isis", + "selected":true, + "destSelected":true, + "distance":115, + "metric":20, + "installed":true, + "nexthops":[ + { + "fib":true, + "afi":"ipv6", + "interfaceName":"eth-rt4", + "active":true, + "labels":[ + 16101 + ] + }, + { + "fib":true, + "afi":"ipv6", + "interfaceName":"eth-rt5", + "active":true, + "labels":[ + 16101 + ] + } + ] + } ] } diff --git a/tests/topotests/isis-sr-topo1/rt6/step4/show_mpls_table.ref b/tests/topotests/isis-sr-topo1/rt6/step4/show_mpls_table.ref index a79406b300..be87ed90a0 100644 --- a/tests/topotests/isis-sr-topo1/rt6/step4/show_mpls_table.ref +++ b/tests/topotests/isis-sr-topo1/rt6/step4/show_mpls_table.ref @@ -130,5 +130,41 @@ "interface":"eth-rt5" } ] + }, + "18100":{ + "inLabel":18100, + "installed":true, + "nexthops":[ + { + "type":"SR (IS-IS)", + "outLabel":16100, + "installed":true, + "nexthop":"10.0.8.5" + }, + { + "type":"SR (IS-IS)", + "outLabel":16100, + "installed":true, + "nexthop":"10.0.7.4" + } + ] + }, + "18101":{ + "inLabel":18101, + "installed":true, + "nexthops":[ + { + "type":"SR (IS-IS)", + "outLabel":16101, + "installed":true, + "interface":"eth-rt5" + }, + { + "type":"SR (IS-IS)", + "outLabel":16101, + "installed":true, + "interface":"eth-rt4" + } + ] } } diff --git a/tests/topotests/isis-sr-topo1/rt6/step5/show_ip_route.ref b/tests/topotests/isis-sr-topo1/rt6/step5/show_ip_route.ref index c200a9f476..4b204dbc4c 100644 --- a/tests/topotests/isis-sr-topo1/rt6/step5/show_ip_route.ref +++ b/tests/topotests/isis-sr-topo1/rt6/step5/show_ip_route.ref @@ -14,14 +14,20 @@ "ip":"10.0.7.4", "afi":"ipv4", "interfaceName":"eth-rt4", - "active":true + "active":true, + "labels":[ + 16010 + ] }, { "fib":true, "ip":"10.0.8.5", "afi":"ipv4", "interfaceName":"eth-rt5", - "active":true + "active":true, + "labels":[ + 16010 + ] } ] } @@ -41,7 +47,10 @@ "ip":"10.0.7.4", "afi":"ipv4", "interfaceName":"eth-rt4", - "active":true + "active":true, + "labels":[ + 16020 + ] } ] } @@ -61,7 +70,10 @@ "ip":"10.0.8.5", "afi":"ipv4", "interfaceName":"eth-rt5", - "active":true + "active":true, + "labels":[ + 16030 + ] } ] } @@ -81,7 +93,10 @@ "ip":"10.0.7.4", "afi":"ipv4", "interfaceName":"eth-rt4", - "active":true + "active":true, + "labels":[ + 16040 + ] } ] } @@ -101,7 +116,10 @@ "ip":"10.0.8.5", "afi":"ipv4", "interfaceName":"eth-rt5", - "active":true + "active":true, + "labels":[ + 16050 + ] } ] } @@ -262,5 +280,38 @@ } ] } + ], + "10.10.10.10\/32":[ + { + "prefix":"10.10.10.10\/32", + "protocol":"isis", + "selected":true, + "destSelected":true, + "distance":115, + "metric":20, + "installed":true, + "nexthops":[ + { + "fib":true, + "ip":"10.0.7.4", + "afi":"ipv4", + "interfaceName":"eth-rt4", + "active":true, + "labels":[ + 16100 + ] + }, + { + "fib":true, + "ip":"10.0.8.5", + "afi":"ipv4", + "interfaceName":"eth-rt5", + "active":true, + "labels":[ + 16100 + ] + } + ] + } ] } diff --git a/tests/topotests/isis-sr-topo1/rt6/step5/show_ipv6_route.ref b/tests/topotests/isis-sr-topo1/rt6/step5/show_ipv6_route.ref index 2bf4b70be8..834cdfe6ca 100644 --- a/tests/topotests/isis-sr-topo1/rt6/step5/show_ipv6_route.ref +++ b/tests/topotests/isis-sr-topo1/rt6/step5/show_ipv6_route.ref @@ -12,14 +12,20 @@ { "fib":true, "afi":"ipv6", - "interfaceName":"eth-rt5", - "active":true + "interfaceName":"eth-rt4", + "active":true, + "labels":[ + 16011 + ] }, { "fib":true, "afi":"ipv6", - "interfaceName":"eth-rt4", - "active":true + "interfaceName":"eth-rt5", + "active":true, + "labels":[ + 16011 + ] } ] } @@ -38,7 +44,10 @@ "fib":true, "afi":"ipv6", "interfaceName":"eth-rt4", - "active":true + "active":true, + "labels":[ + 16021 + ] } ] } @@ -57,7 +66,10 @@ "fib":true, "afi":"ipv6", "interfaceName":"eth-rt5", - "active":true + "active":true, + "labels":[ + 16031 + ] } ] } @@ -76,7 +88,10 @@ "fib":true, "afi":"ipv6", "interfaceName":"eth-rt4", - "active":true + "active":true, + "labels":[ + 16041 + ] } ] } @@ -95,7 +110,41 @@ "fib":true, "afi":"ipv6", "interfaceName":"eth-rt5", - "active":true + "active":true, + "labels":[ + 16051 + ] + } + ] + } + ], + "2001:db8:1000::10\/128":[ + { + "prefix":"2001:db8:1000::10\/128", + "protocol":"isis", + "selected":true, + "destSelected":true, + "distance":115, + "metric":20, + "installed":true, + "nexthops":[ + { + "fib":true, + "afi":"ipv6", + "interfaceName":"eth-rt4", + "active":true, + "labels":[ + 16101 + ] + }, + { + "fib":true, + "afi":"ipv6", + "interfaceName":"eth-rt5", + "active":true, + "labels":[ + 16101 + ] } ] } diff --git a/tests/topotests/isis-sr-topo1/rt6/step5/show_mpls_table.ref b/tests/topotests/isis-sr-topo1/rt6/step5/show_mpls_table.ref index 2c63c08510..be87ed90a0 100644 --- a/tests/topotests/isis-sr-topo1/rt6/step5/show_mpls_table.ref +++ b/tests/topotests/isis-sr-topo1/rt6/step5/show_mpls_table.ref @@ -1,2 +1,170 @@ { + "18010":{ + "inLabel":18010, + "installed":true, + "nexthops":[ + { + "type":"SR (IS-IS)", + "outLabel":16010, + "installed":true, + "nexthop":"10.0.8.5" + }, + { + "type":"SR (IS-IS)", + "outLabel":16010, + "installed":true, + "nexthop":"10.0.7.4" + } + ] + }, + "18011":{ + "inLabel":18011, + "installed":true, + "nexthops":[ + { + "type":"SR (IS-IS)", + "outLabel":16011, + "installed":true, + "interface":"eth-rt5" + }, + { + "type":"SR (IS-IS)", + "outLabel":16011, + "installed":true, + "interface":"eth-rt4" + } + ] + }, + "18020":{ + "inLabel":18020, + "installed":true, + "nexthops":[ + { + "type":"SR (IS-IS)", + "outLabel":16020, + "installed":true, + "nexthop":"10.0.7.4" + } + ] + }, + "18021":{ + "inLabel":18021, + "installed":true, + "nexthops":[ + { + "type":"SR (IS-IS)", + "outLabel":16021, + "installed":true, + "interface":"eth-rt4" + } + ] + }, + "18030":{ + "inLabel":18030, + "installed":true, + "nexthops":[ + { + "type":"SR (IS-IS)", + "outLabel":16030, + "installed":true, + "nexthop":"10.0.8.5" + } + ] + }, + "18031":{ + "inLabel":18031, + "installed":true, + "nexthops":[ + { + "type":"SR (IS-IS)", + "outLabel":16031, + "installed":true, + "interface":"eth-rt5" + } + ] + }, + "18040":{ + "inLabel":18040, + "installed":true, + "nexthops":[ + { + "type":"SR (IS-IS)", + "outLabel":16040, + "installed":true, + "nexthop":"10.0.7.4" + } + ] + }, + "18041":{ + "inLabel":18041, + "installed":true, + "nexthops":[ + { + "type":"SR (IS-IS)", + "outLabel":16041, + "installed":true, + "interface":"eth-rt4" + } + ] + }, + "18050":{ + "inLabel":18050, + "installed":true, + "nexthops":[ + { + "type":"SR (IS-IS)", + "outLabel":16050, + "installed":true, + "nexthop":"10.0.8.5" + } + ] + }, + "18051":{ + "inLabel":18051, + "installed":true, + "nexthops":[ + { + "type":"SR (IS-IS)", + "outLabel":16051, + "installed":true, + "interface":"eth-rt5" + } + ] + }, + "18100":{ + "inLabel":18100, + "installed":true, + "nexthops":[ + { + "type":"SR (IS-IS)", + "outLabel":16100, + "installed":true, + "nexthop":"10.0.8.5" + }, + { + "type":"SR (IS-IS)", + "outLabel":16100, + "installed":true, + "nexthop":"10.0.7.4" + } + ] + }, + "18101":{ + "inLabel":18101, + "installed":true, + "nexthops":[ + { + "type":"SR (IS-IS)", + "outLabel":16101, + "installed":true, + "interface":"eth-rt5" + }, + { + "type":"SR (IS-IS)", + "outLabel":16101, + "installed":true, + "interface":"eth-rt4" + } + ] + } } diff --git a/tests/topotests/isis-sr-topo1/rt6/step6/show_ip_route.ref b/tests/topotests/isis-sr-topo1/rt6/step6/show_ip_route.ref index e4df0d846e..4b204dbc4c 100644 --- a/tests/topotests/isis-sr-topo1/rt6/step6/show_ip_route.ref +++ b/tests/topotests/isis-sr-topo1/rt6/step6/show_ip_route.ref @@ -280,5 +280,38 @@ } ] } + ], + "10.10.10.10\/32":[ + { + "prefix":"10.10.10.10\/32", + "protocol":"isis", + "selected":true, + "destSelected":true, + "distance":115, + "metric":20, + "installed":true, + "nexthops":[ + { + "fib":true, + "ip":"10.0.7.4", + "afi":"ipv4", + "interfaceName":"eth-rt4", + "active":true, + "labels":[ + 16100 + ] + }, + { + "fib":true, + "ip":"10.0.8.5", + "afi":"ipv4", + "interfaceName":"eth-rt5", + "active":true, + "labels":[ + 16100 + ] + } + ] + } ] } diff --git a/tests/topotests/isis-sr-topo1/rt6/step6/show_ipv6_route.ref b/tests/topotests/isis-sr-topo1/rt6/step6/show_ipv6_route.ref index eee9dea4d3..834cdfe6ca 100644 --- a/tests/topotests/isis-sr-topo1/rt6/step6/show_ipv6_route.ref +++ b/tests/topotests/isis-sr-topo1/rt6/step6/show_ipv6_route.ref @@ -12,7 +12,7 @@ { "fib":true, "afi":"ipv6", - "interfaceName":"eth-rt5", + "interfaceName":"eth-rt4", "active":true, "labels":[ 16011 @@ -21,7 +21,7 @@ { "fib":true, "afi":"ipv6", - "interfaceName":"eth-rt4", + "interfaceName":"eth-rt5", "active":true, "labels":[ 16011 @@ -117,5 +117,36 @@ } ] } + ], + "2001:db8:1000::10\/128":[ + { + "prefix":"2001:db8:1000::10\/128", + "protocol":"isis", + "selected":true, + "destSelected":true, + "distance":115, + "metric":20, + "installed":true, + "nexthops":[ + { + "fib":true, + "afi":"ipv6", + "interfaceName":"eth-rt4", + "active":true, + "labels":[ + 16101 + ] + }, + { + "fib":true, + "afi":"ipv6", + "interfaceName":"eth-rt5", + "active":true, + "labels":[ + 16101 + ] + } + ] + } ] } diff --git a/tests/topotests/isis-sr-topo1/rt6/step6/show_mpls_table.ref b/tests/topotests/isis-sr-topo1/rt6/step6/show_mpls_table.ref index a79406b300..be87ed90a0 100644 --- a/tests/topotests/isis-sr-topo1/rt6/step6/show_mpls_table.ref +++ b/tests/topotests/isis-sr-topo1/rt6/step6/show_mpls_table.ref @@ -130,5 +130,41 @@ "interface":"eth-rt5" } ] + }, + "18100":{ + "inLabel":18100, + "installed":true, + "nexthops":[ + { + "type":"SR (IS-IS)", + "outLabel":16100, + "installed":true, + "nexthop":"10.0.8.5" + }, + { + "type":"SR (IS-IS)", + "outLabel":16100, + "installed":true, + "nexthop":"10.0.7.4" + } + ] + }, + "18101":{ + "inLabel":18101, + "installed":true, + "nexthops":[ + { + "type":"SR (IS-IS)", + "outLabel":16101, + "installed":true, + "interface":"eth-rt5" + }, + { + "type":"SR (IS-IS)", + "outLabel":16101, + "installed":true, + "interface":"eth-rt4" + } + ] } } diff --git a/tests/topotests/isis-sr-topo1/rt6/step7/show_ip_route.ref b/tests/topotests/isis-sr-topo1/rt6/step7/show_ip_route.ref index b21e5db928..1787988207 100644 --- a/tests/topotests/isis-sr-topo1/rt6/step7/show_ip_route.ref +++ b/tests/topotests/isis-sr-topo1/rt6/step7/show_ip_route.ref @@ -274,5 +274,38 @@ } ] } + ], + "10.10.10.10\/32":[ + { + "prefix":"10.10.10.10\/32", + "protocol":"isis", + "selected":true, + "destSelected":true, + "distance":115, + "metric":20, + "installed":true, + "nexthops":[ + { + "fib":true, + "ip":"10.0.7.4", + "afi":"ipv4", + "interfaceName":"eth-rt4", + "active":true, + "labels":[ + 16100 + ] + }, + { + "fib":true, + "ip":"10.0.8.5", + "afi":"ipv4", + "interfaceName":"eth-rt5", + "active":true, + "labels":[ + 16100 + ] + } + ] + } ] } diff --git a/tests/topotests/isis-sr-topo1/rt6/step7/show_ipv6_route.ref b/tests/topotests/isis-sr-topo1/rt6/step7/show_ipv6_route.ref index dfbb1954b8..367d0ed173 100644 --- a/tests/topotests/isis-sr-topo1/rt6/step7/show_ipv6_route.ref +++ b/tests/topotests/isis-sr-topo1/rt6/step7/show_ipv6_route.ref @@ -12,13 +12,13 @@ { "fib":true, "afi":"ipv6", - "interfaceName":"eth-rt5", + "interfaceName":"eth-rt4", "active":true }, { "fib":true, "afi":"ipv6", - "interfaceName":"eth-rt4", + "interfaceName":"eth-rt5", "active":true } ] @@ -111,5 +111,36 @@ } ] } + ], + "2001:db8:1000::10\/128":[ + { + "prefix":"2001:db8:1000::10\/128", + "protocol":"isis", + "selected":true, + "destSelected":true, + "distance":115, + "metric":20, + "installed":true, + "nexthops":[ + { + "fib":true, + "afi":"ipv6", + "interfaceName":"eth-rt4", + "active":true, + "labels":[ + 16101 + ] + }, + { + "fib":true, + "afi":"ipv6", + "interfaceName":"eth-rt5", + "active":true, + "labels":[ + 16101 + ] + } + ] + } ] } diff --git a/tests/topotests/isis-sr-topo1/rt6/step7/show_mpls_table.ref b/tests/topotests/isis-sr-topo1/rt6/step7/show_mpls_table.ref index 43d771bcbd..b44dda298e 100644 --- a/tests/topotests/isis-sr-topo1/rt6/step7/show_mpls_table.ref +++ b/tests/topotests/isis-sr-topo1/rt6/step7/show_mpls_table.ref @@ -94,5 +94,41 @@ "interface":"eth-rt5" } ] + }, + "18100":{ + "inLabel":18100, + "installed":true, + "nexthops":[ + { + "type":"SR (IS-IS)", + "outLabel":16100, + "installed":true, + "nexthop":"10.0.8.5" + }, + { + "type":"SR (IS-IS)", + "outLabel":16100, + "installed":true, + "nexthop":"10.0.7.4" + } + ] + }, + "18101":{ + "inLabel":18101, + "installed":true, + "nexthops":[ + { + "type":"SR (IS-IS)", + "outLabel":16101, + "installed":true, + "interface":"eth-rt5" + }, + { + "type":"SR (IS-IS)", + "outLabel":16101, + "installed":true, + "interface":"eth-rt4" + } + ] } } diff --git a/tests/topotests/isis-sr-topo1/rt6/step8/show_ip_route.ref b/tests/topotests/isis-sr-topo1/rt6/step8/show_ip_route.ref index e4df0d846e..4b204dbc4c 100644 --- a/tests/topotests/isis-sr-topo1/rt6/step8/show_ip_route.ref +++ b/tests/topotests/isis-sr-topo1/rt6/step8/show_ip_route.ref @@ -280,5 +280,38 @@ } ] } + ], + "10.10.10.10\/32":[ + { + "prefix":"10.10.10.10\/32", + "protocol":"isis", + "selected":true, + "destSelected":true, + "distance":115, + "metric":20, + "installed":true, + "nexthops":[ + { + "fib":true, + "ip":"10.0.7.4", + "afi":"ipv4", + "interfaceName":"eth-rt4", + "active":true, + "labels":[ + 16100 + ] + }, + { + "fib":true, + "ip":"10.0.8.5", + "afi":"ipv4", + "interfaceName":"eth-rt5", + "active":true, + "labels":[ + 16100 + ] + } + ] + } ] } diff --git a/tests/topotests/isis-sr-topo1/rt6/step8/show_ipv6_route.ref b/tests/topotests/isis-sr-topo1/rt6/step8/show_ipv6_route.ref index eee9dea4d3..834cdfe6ca 100644 --- a/tests/topotests/isis-sr-topo1/rt6/step8/show_ipv6_route.ref +++ b/tests/topotests/isis-sr-topo1/rt6/step8/show_ipv6_route.ref @@ -12,7 +12,7 @@ { "fib":true, "afi":"ipv6", - "interfaceName":"eth-rt5", + "interfaceName":"eth-rt4", "active":true, "labels":[ 16011 @@ -21,7 +21,7 @@ { "fib":true, "afi":"ipv6", - "interfaceName":"eth-rt4", + "interfaceName":"eth-rt5", "active":true, "labels":[ 16011 @@ -117,5 +117,36 @@ } ] } + ], + "2001:db8:1000::10\/128":[ + { + "prefix":"2001:db8:1000::10\/128", + "protocol":"isis", + "selected":true, + "destSelected":true, + "distance":115, + "metric":20, + "installed":true, + "nexthops":[ + { + "fib":true, + "afi":"ipv6", + "interfaceName":"eth-rt4", + "active":true, + "labels":[ + 16101 + ] + }, + { + "fib":true, + "afi":"ipv6", + "interfaceName":"eth-rt5", + "active":true, + "labels":[ + 16101 + ] + } + ] + } ] } diff --git a/tests/topotests/isis-sr-topo1/rt6/step8/show_mpls_table.ref b/tests/topotests/isis-sr-topo1/rt6/step8/show_mpls_table.ref index a79406b300..be87ed90a0 100644 --- a/tests/topotests/isis-sr-topo1/rt6/step8/show_mpls_table.ref +++ b/tests/topotests/isis-sr-topo1/rt6/step8/show_mpls_table.ref @@ -130,5 +130,41 @@ "interface":"eth-rt5" } ] + }, + "18100":{ + "inLabel":18100, + "installed":true, + "nexthops":[ + { + "type":"SR (IS-IS)", + "outLabel":16100, + "installed":true, + "nexthop":"10.0.8.5" + }, + { + "type":"SR (IS-IS)", + "outLabel":16100, + "installed":true, + "nexthop":"10.0.7.4" + } + ] + }, + "18101":{ + "inLabel":18101, + "installed":true, + "nexthops":[ + { + "type":"SR (IS-IS)", + "outLabel":16101, + "installed":true, + "interface":"eth-rt5" + }, + { + "type":"SR (IS-IS)", + "outLabel":16101, + "installed":true, + "interface":"eth-rt4" + } + ] } } diff --git a/tests/topotests/isis-sr-topo1/rt6/step9/show_ip_route.ref b/tests/topotests/isis-sr-topo1/rt6/step9/show_ip_route.ref index e4df0d846e..4b204dbc4c 100644 --- a/tests/topotests/isis-sr-topo1/rt6/step9/show_ip_route.ref +++ b/tests/topotests/isis-sr-topo1/rt6/step9/show_ip_route.ref @@ -280,5 +280,38 @@ } ] } + ], + "10.10.10.10\/32":[ + { + "prefix":"10.10.10.10\/32", + "protocol":"isis", + "selected":true, + "destSelected":true, + "distance":115, + "metric":20, + "installed":true, + "nexthops":[ + { + "fib":true, + "ip":"10.0.7.4", + "afi":"ipv4", + "interfaceName":"eth-rt4", + "active":true, + "labels":[ + 16100 + ] + }, + { + "fib":true, + "ip":"10.0.8.5", + "afi":"ipv4", + "interfaceName":"eth-rt5", + "active":true, + "labels":[ + 16100 + ] + } + ] + } ] } diff --git a/tests/topotests/isis-sr-topo1/rt6/step9/show_ipv6_route.ref b/tests/topotests/isis-sr-topo1/rt6/step9/show_ipv6_route.ref index eee9dea4d3..834cdfe6ca 100644 --- a/tests/topotests/isis-sr-topo1/rt6/step9/show_ipv6_route.ref +++ b/tests/topotests/isis-sr-topo1/rt6/step9/show_ipv6_route.ref @@ -12,7 +12,7 @@ { "fib":true, "afi":"ipv6", - "interfaceName":"eth-rt5", + "interfaceName":"eth-rt4", "active":true, "labels":[ 16011 @@ -21,7 +21,7 @@ { "fib":true, "afi":"ipv6", - "interfaceName":"eth-rt4", + "interfaceName":"eth-rt5", "active":true, "labels":[ 16011 @@ -117,5 +117,36 @@ } ] } + ], + "2001:db8:1000::10\/128":[ + { + "prefix":"2001:db8:1000::10\/128", + "protocol":"isis", + "selected":true, + "destSelected":true, + "distance":115, + "metric":20, + "installed":true, + "nexthops":[ + { + "fib":true, + "afi":"ipv6", + "interfaceName":"eth-rt4", + "active":true, + "labels":[ + 16101 + ] + }, + { + "fib":true, + "afi":"ipv6", + "interfaceName":"eth-rt5", + "active":true, + "labels":[ + 16101 + ] + } + ] + } ] } diff --git a/tests/topotests/isis-sr-topo1/rt6/step9/show_mpls_table.ref b/tests/topotests/isis-sr-topo1/rt6/step9/show_mpls_table.ref index a79406b300..be87ed90a0 100644 --- a/tests/topotests/isis-sr-topo1/rt6/step9/show_mpls_table.ref +++ b/tests/topotests/isis-sr-topo1/rt6/step9/show_mpls_table.ref @@ -130,5 +130,41 @@ "interface":"eth-rt5" } ] + }, + "18100":{ + "inLabel":18100, + "installed":true, + "nexthops":[ + { + "type":"SR (IS-IS)", + "outLabel":16100, + "installed":true, + "nexthop":"10.0.8.5" + }, + { + "type":"SR (IS-IS)", + "outLabel":16100, + "installed":true, + "nexthop":"10.0.7.4" + } + ] + }, + "18101":{ + "inLabel":18101, + "installed":true, + "nexthops":[ + { + "type":"SR (IS-IS)", + "outLabel":16101, + "installed":true, + "interface":"eth-rt5" + }, + { + "type":"SR (IS-IS)", + "outLabel":16101, + "installed":true, + "interface":"eth-rt4" + } + ] } } diff --git a/tests/topotests/isis-tilfa-topo1/rt1/step4/show_ip_route.ref.diff b/tests/topotests/isis-tilfa-topo1/rt1/step4/show_ip_route.ref.diff index ccea94c42c..1a9307ddb9 100644 --- a/tests/topotests/isis-tilfa-topo1/rt1/step4/show_ip_route.ref.diff +++ b/tests/topotests/isis-tilfa-topo1/rt1/step4/show_ip_route.ref.diff @@ -1,5 +1,5 @@ ---- rt1/step3/show_ip_route.ref 2020-08-31 22:42:48.831561460 -0300 -+++ rt1/step4/show_ip_route.ref 2020-08-31 22:42:48.831561460 -0300 +--- rt1/step3/show_ip_route.ref 2020-09-25 17:48:05.062911204 -0300 ++++ rt1/step4/show_ip_route.ref 2020-09-25 17:49:01.563647190 -0300 @@ -60,10 +60,7 @@ "ip":"10.0.1.2", "afi":"ipv4", diff --git a/tests/topotests/isis-tilfa-topo1/rt1/step4/show_ipv6_route.ref.diff b/tests/topotests/isis-tilfa-topo1/rt1/step4/show_ipv6_route.ref.diff index 13e098858a..f5036aeda8 100644 --- a/tests/topotests/isis-tilfa-topo1/rt1/step4/show_ipv6_route.ref.diff +++ b/tests/topotests/isis-tilfa-topo1/rt1/step4/show_ipv6_route.ref.diff @@ -1,5 +1,5 @@ ---- rt1/step3/show_ipv6_route.ref 2020-08-31 22:42:48.831561460 -0300 -+++ rt1/step4/show_ipv6_route.ref 2020-08-31 22:42:48.831561460 -0300 +--- rt1/step3/show_ipv6_route.ref 2020-09-25 17:48:06.358928078 -0300 ++++ rt1/step4/show_ipv6_route.ref 2020-09-25 17:49:02.791663194 -0300 @@ -57,10 +57,7 @@ "fib":true, "afi":"ipv6", diff --git a/tests/topotests/isis-tilfa-topo1/rt1/step4/show_mpls_table.ref.diff b/tests/topotests/isis-tilfa-topo1/rt1/step4/show_mpls_table.ref.diff index 9531fbc2f0..30c612b544 100644 --- a/tests/topotests/isis-tilfa-topo1/rt1/step4/show_mpls_table.ref.diff +++ b/tests/topotests/isis-tilfa-topo1/rt1/step4/show_mpls_table.ref.diff @@ -1,5 +1,5 @@ ---- rt1/step3/show_mpls_table.ref 2020-08-31 22:42:48.831561460 -0300 -+++ rt1/step4/show_mpls_table.ref 2020-08-31 22:42:48.831561460 -0300 +--- rt1/step3/show_mpls_table.ref 2020-09-25 17:48:03.782894539 -0300 ++++ rt1/step4/show_mpls_table.ref 2020-09-25 17:49:00.343631290 -0300 @@ -47,30 +47,6 @@ } ] diff --git a/tests/topotests/isis-tilfa-topo1/rt1/step5/show_ip_route.ref.diff b/tests/topotests/isis-tilfa-topo1/rt1/step5/show_ip_route.ref.diff index 2a2cb762a7..79a452ef69 100644 --- a/tests/topotests/isis-tilfa-topo1/rt1/step5/show_ip_route.ref.diff +++ b/tests/topotests/isis-tilfa-topo1/rt1/step5/show_ip_route.ref.diff @@ -1,5 +1,5 @@ ---- rt1/step4/show_ip_route.ref 2020-08-31 22:42:48.831561460 -0300 -+++ rt1/step5/show_ip_route.ref 2020-08-31 22:42:48.831561460 -0300 +--- rt1/step4/show_ip_route.ref 2020-09-25 17:49:01.563647190 -0300 ++++ rt1/step5/show_ip_route.ref 2020-09-25 17:50:12.144567593 -0300 @@ -60,7 +60,10 @@ "ip":"10.0.1.2", "afi":"ipv4", diff --git a/tests/topotests/isis-tilfa-topo1/rt1/step5/show_ipv6_route.ref.diff b/tests/topotests/isis-tilfa-topo1/rt1/step5/show_ipv6_route.ref.diff index 94bf3c1db3..805266aaaa 100644 --- a/tests/topotests/isis-tilfa-topo1/rt1/step5/show_ipv6_route.ref.diff +++ b/tests/topotests/isis-tilfa-topo1/rt1/step5/show_ipv6_route.ref.diff @@ -1,5 +1,5 @@ ---- rt1/step4/show_ipv6_route.ref 2020-08-31 22:42:48.831561460 -0300 -+++ rt1/step5/show_ipv6_route.ref 2020-08-31 22:42:48.831561460 -0300 +--- rt1/step4/show_ipv6_route.ref 2020-09-25 17:49:02.791663194 -0300 ++++ rt1/step5/show_ipv6_route.ref 2020-09-25 17:50:13.428584346 -0300 @@ -57,7 +57,10 @@ "fib":true, "afi":"ipv6", diff --git a/tests/topotests/isis-tilfa-topo1/rt1/step5/show_mpls_table.ref.diff b/tests/topotests/isis-tilfa-topo1/rt1/step5/show_mpls_table.ref.diff index 0fd252e455..d7ab66ee18 100644 --- a/tests/topotests/isis-tilfa-topo1/rt1/step5/show_mpls_table.ref.diff +++ b/tests/topotests/isis-tilfa-topo1/rt1/step5/show_mpls_table.ref.diff @@ -1,5 +1,5 @@ ---- rt1/step4/show_mpls_table.ref 2020-08-31 22:42:48.831561460 -0300 -+++ rt1/step5/show_mpls_table.ref 2020-08-31 22:42:48.831561460 -0300 +--- rt1/step4/show_mpls_table.ref 2020-09-25 17:49:00.343631290 -0300 ++++ rt1/step5/show_mpls_table.ref 2020-09-25 17:50:10.868550944 -0300 @@ -47,6 +47,30 @@ } ] diff --git a/tests/topotests/isis-tilfa-topo1/rt1/step7/show_ip_route.ref.diff b/tests/topotests/isis-tilfa-topo1/rt1/step7/show_ip_route.ref.diff index 22f7ce9a2e..9aa0cd2e39 100644 --- a/tests/topotests/isis-tilfa-topo1/rt1/step7/show_ip_route.ref.diff +++ b/tests/topotests/isis-tilfa-topo1/rt1/step7/show_ip_route.ref.diff @@ -1,5 +1,5 @@ ---- rt1/step6/show_ip_route.ref 2020-08-31 22:42:48.831561460 -0300 -+++ rt1/step7/show_ip_route.ref 2020-08-31 22:42:48.835561429 -0300 +--- rt1/step6/show_ip_route.ref 2020-09-25 17:51:15.105389461 -0300 ++++ rt1/step7/show_ip_route.ref 2020-09-25 17:52:02.014002243 -0300 @@ -83,10 +83,7 @@ "ip":"10.0.1.3", "afi":"ipv4", diff --git a/tests/topotests/isis-tilfa-topo1/rt1/step7/show_ipv6_route.ref.diff b/tests/topotests/isis-tilfa-topo1/rt1/step7/show_ipv6_route.ref.diff index 4b07bd7762..52fd7caf91 100644 --- a/tests/topotests/isis-tilfa-topo1/rt1/step7/show_ipv6_route.ref.diff +++ b/tests/topotests/isis-tilfa-topo1/rt1/step7/show_ipv6_route.ref.diff @@ -1,5 +1,5 @@ ---- rt1/step6/show_ipv6_route.ref 2020-08-31 22:42:48.835561429 -0300 -+++ rt1/step7/show_ipv6_route.ref 2020-08-31 22:42:48.835561429 -0300 +--- rt1/step6/show_ipv6_route.ref 2020-09-25 17:51:16.345405655 -0300 ++++ rt1/step7/show_ipv6_route.ref 2020-09-25 17:52:03.230018133 -0300 @@ -79,10 +79,7 @@ "fib":true, "afi":"ipv6", diff --git a/tests/topotests/isis-tilfa-topo1/rt1/step7/show_mpls_table.ref.diff b/tests/topotests/isis-tilfa-topo1/rt1/step7/show_mpls_table.ref.diff index b62ca10fa3..53332be569 100644 --- a/tests/topotests/isis-tilfa-topo1/rt1/step7/show_mpls_table.ref.diff +++ b/tests/topotests/isis-tilfa-topo1/rt1/step7/show_mpls_table.ref.diff @@ -1,5 +1,5 @@ ---- rt1/step6/show_mpls_table.ref 2020-08-31 22:42:48.835561429 -0300 -+++ rt1/step7/show_mpls_table.ref 2020-08-31 22:42:48.835561429 -0300 +--- rt1/step6/show_mpls_table.ref 2020-09-25 17:51:13.861373215 -0300 ++++ rt1/step7/show_mpls_table.ref 2020-09-25 17:52:00.769985988 -0300 @@ -71,30 +71,6 @@ } ] diff --git a/tests/topotests/isis-tilfa-topo1/rt1/step8/show_ip_route.ref.diff b/tests/topotests/isis-tilfa-topo1/rt1/step8/show_ip_route.ref.diff index 2bf88c8346..af9f72e718 100644 --- a/tests/topotests/isis-tilfa-topo1/rt1/step8/show_ip_route.ref.diff +++ b/tests/topotests/isis-tilfa-topo1/rt1/step8/show_ip_route.ref.diff @@ -1,5 +1,5 @@ ---- rt1/step7/show_ip_route.ref 2020-08-31 22:42:48.835561429 -0300 -+++ rt1/step8/show_ip_route.ref 2020-08-31 22:42:48.835561429 -0300 +--- rt1/step7/show_ip_route.ref 2020-09-25 17:52:02.014002243 -0300 ++++ rt1/step8/show_ip_route.ref 2020-09-25 17:53:20.003021800 -0300 @@ -83,7 +83,10 @@ "ip":"10.0.1.3", "afi":"ipv4", diff --git a/tests/topotests/isis-tilfa-topo1/rt1/step8/show_ipv6_route.ref.diff b/tests/topotests/isis-tilfa-topo1/rt1/step8/show_ipv6_route.ref.diff index a01038a7a8..b733b33ed9 100644 --- a/tests/topotests/isis-tilfa-topo1/rt1/step8/show_ipv6_route.ref.diff +++ b/tests/topotests/isis-tilfa-topo1/rt1/step8/show_ipv6_route.ref.diff @@ -1,5 +1,5 @@ ---- rt1/step7/show_ipv6_route.ref 2020-08-31 22:42:48.835561429 -0300 -+++ rt1/step8/show_ipv6_route.ref 2020-08-31 22:42:48.835561429 -0300 +--- rt1/step7/show_ipv6_route.ref 2020-09-25 17:52:03.230018133 -0300 ++++ rt1/step8/show_ipv6_route.ref 2020-09-25 17:53:21.239037966 -0300 @@ -79,7 +79,10 @@ "fib":true, "afi":"ipv6", diff --git a/tests/topotests/isis-tilfa-topo1/rt1/step8/show_mpls_table.ref.diff b/tests/topotests/isis-tilfa-topo1/rt1/step8/show_mpls_table.ref.diff index e3f8361315..b6f8c962f0 100644 --- a/tests/topotests/isis-tilfa-topo1/rt1/step8/show_mpls_table.ref.diff +++ b/tests/topotests/isis-tilfa-topo1/rt1/step8/show_mpls_table.ref.diff @@ -1,5 +1,5 @@ ---- rt1/step7/show_mpls_table.ref 2020-08-31 22:42:48.835561429 -0300 -+++ rt1/step8/show_mpls_table.ref 2020-08-31 22:42:48.835561429 -0300 +--- rt1/step7/show_mpls_table.ref 2020-09-25 17:52:00.769985988 -0300 ++++ rt1/step8/show_mpls_table.ref 2020-09-25 17:53:18.671004379 -0300 @@ -71,6 +71,30 @@ } ] diff --git a/tests/topotests/isis-tilfa-topo1/rt1/step9/show_ip_route.ref.diff b/tests/topotests/isis-tilfa-topo1/rt1/step9/show_ip_route.ref.diff index c10f97b86a..1d96341557 100644 --- a/tests/topotests/isis-tilfa-topo1/rt1/step9/show_ip_route.ref.diff +++ b/tests/topotests/isis-tilfa-topo1/rt1/step9/show_ip_route.ref.diff @@ -1,5 +1,5 @@ ---- rt1/step8/show_ip_route.ref 2020-08-31 22:42:48.835561429 -0300 -+++ rt1/step9/show_ip_route.ref 2020-08-31 22:42:48.835561429 -0300 +--- rt1/step8/show_ip_route.ref 2020-09-25 17:53:20.003021800 -0300 ++++ rt1/step9/show_ip_route.ref 2020-09-25 17:54:37.700038367 -0300 @@ -85,7 +85,7 @@ "interfaceName":"eth-sw1", "active":true, diff --git a/tests/topotests/isis-tilfa-topo1/rt1/step9/show_ipv6_route.ref.diff b/tests/topotests/isis-tilfa-topo1/rt1/step9/show_ipv6_route.ref.diff index 7a909f6410..232b823ac2 100644 --- a/tests/topotests/isis-tilfa-topo1/rt1/step9/show_ipv6_route.ref.diff +++ b/tests/topotests/isis-tilfa-topo1/rt1/step9/show_ipv6_route.ref.diff @@ -1,5 +1,5 @@ ---- rt1/step8/show_ipv6_route.ref 2020-08-31 22:42:48.835561429 -0300 -+++ rt1/step9/show_ipv6_route.ref 2020-08-31 22:42:48.835561429 -0300 +--- rt1/step8/show_ipv6_route.ref 2020-09-25 17:53:21.239037966 -0300 ++++ rt1/step9/show_ipv6_route.ref 2020-09-25 17:54:38.912054230 -0300 @@ -81,7 +81,7 @@ "interfaceName":"eth-sw1", "active":true, diff --git a/tests/topotests/isis-tilfa-topo1/rt1/step9/show_mpls_table.ref.diff b/tests/topotests/isis-tilfa-topo1/rt1/step9/show_mpls_table.ref.diff index b794a674f8..7f0d50f5f2 100644 --- a/tests/topotests/isis-tilfa-topo1/rt1/step9/show_mpls_table.ref.diff +++ b/tests/topotests/isis-tilfa-topo1/rt1/step9/show_mpls_table.ref.diff @@ -1,5 +1,5 @@ ---- rt1/step8/show_mpls_table.ref 2020-08-31 22:42:48.835561429 -0300 -+++ rt1/step9/show_mpls_table.ref 2020-08-31 22:42:48.835561429 -0300 +--- rt1/step8/show_mpls_table.ref 2020-09-25 17:53:18.671004379 -0300 ++++ rt1/step9/show_mpls_table.ref 2020-09-25 17:54:36.428021718 -0300 @@ -71,30 +71,6 @@ } ] diff --git a/tests/topotests/isis-tilfa-topo1/rt2/step1/show_ip_route.ref b/tests/topotests/isis-tilfa-topo1/rt2/step1/show_ip_route.ref index 7c6f6f8b65..23e07b7cda 100644 --- a/tests/topotests/isis-tilfa-topo1/rt2/step1/show_ip_route.ref +++ b/tests/topotests/isis-tilfa-topo1/rt2/step1/show_ip_route.ref @@ -31,7 +31,8 @@ "interfaceName":"eth-rt4-1", "active":true, "labels":[ - 16050 + 16050, + 16010 ] }, { @@ -40,7 +41,8 @@ "interfaceName":"eth-rt4-2", "active":true, "labels":[ - 16050 + 16050, + 16010 ] } ] @@ -78,7 +80,8 @@ "interfaceName":"eth-rt4-1", "active":true, "labels":[ - 16050 + 16050, + 16030 ] }, { @@ -87,7 +90,8 @@ "interfaceName":"eth-rt4-2", "active":true, "labels":[ - 16050 + 16050, + 16030 ] } ] @@ -109,6 +113,9 @@ "afi":"ipv4", "interfaceName":"eth-rt4-1", "active":true, + "backupIndex":[ + 0 + ], "labels":[ 3 ] @@ -119,10 +126,25 @@ "afi":"ipv4", "interfaceName":"eth-rt4-2", "active":true, + "backupIndex":[ + 0 + ], "labels":[ 3 ] } + ], + "backupNexthops":[ + { + "ip":"10.0.1.3", + "afi":"ipv4", + "interfaceName":"eth-sw1", + "active":true, + "labels":[ + 16050, + 16040 + ] + } ] } ], @@ -185,6 +207,9 @@ "afi":"ipv4", "interfaceName":"eth-rt4-1", "active":true, + "backupIndex":[ + 0 + ], "labels":[ 16060 ] @@ -195,10 +220,21 @@ "afi":"ipv4", "interfaceName":"eth-rt4-2", "active":true, + "backupIndex":[ + 0 + ], "labels":[ 16060 ] } + ], + "backupNexthops":[ + { + "ip":"10.0.1.3", + "afi":"ipv4", + "interfaceName":"eth-sw1", + "active":true + } ] } ], @@ -233,13 +269,19 @@ "ip":"10.0.2.4", "afi":"ipv4", "interfaceName":"eth-rt4-1", - "active":true + "active":true, + "labels":[ + 16050 + ] }, { "ip":"10.0.3.4", "afi":"ipv4", "interfaceName":"eth-rt4-2", - "active":true + "active":true, + "labels":[ + 16050 + ] } ] } @@ -254,13 +296,30 @@ { "ip":"10.0.2.4", "afi":"ipv4", - "interfaceName":"eth-rt4-1" + "interfaceName":"eth-rt4-1", + "backupIndex":[ + 0 + ] }, { "ip":"10.0.3.4", "afi":"ipv4", "interfaceName":"eth-rt4-2", - "active":true + "active":true, + "backupIndex":[ + 0 + ] + } + ], + "backupNexthops":[ + { + "ip":"10.0.1.3", + "afi":"ipv4", + "interfaceName":"eth-sw1", + "active":true, + "labels":[ + 16050 + ] } ] } @@ -276,12 +335,29 @@ "ip":"10.0.2.4", "afi":"ipv4", "interfaceName":"eth-rt4-1", - "active":true + "active":true, + "backupIndex":[ + 0 + ] }, { "ip":"10.0.3.4", "afi":"ipv4", - "interfaceName":"eth-rt4-2" + "interfaceName":"eth-rt4-2", + "backupIndex":[ + 0 + ] + } + ], + "backupNexthops":[ + { + "ip":"10.0.1.3", + "afi":"ipv4", + "interfaceName":"eth-sw1", + "active":true, + "labels":[ + 16050 + ] } ] } @@ -377,13 +453,27 @@ "ip":"10.0.2.4", "afi":"ipv4", "interfaceName":"eth-rt4-1", - "active":true + "active":true, + "backupIndex":[ + 0 + ] }, { "fib":true, "ip":"10.0.3.4", "afi":"ipv4", "interfaceName":"eth-rt4-2", + "active":true, + "backupIndex":[ + 0 + ] + } + ], + "backupNexthops":[ + { + "ip":"10.0.1.3", + "afi":"ipv4", + "interfaceName":"eth-sw1", "active":true } ] @@ -404,14 +494,31 @@ "ip":"10.0.2.4", "afi":"ipv4", "interfaceName":"eth-rt4-1", - "active":true + "active":true, + "backupIndex":[ + 0 + ] }, { "fib":true, "ip":"10.0.3.4", "afi":"ipv4", "interfaceName":"eth-rt4-2", - "active":true + "active":true, + "backupIndex":[ + 0 + ] + } + ], + "backupNexthops":[ + { + "ip":"10.0.1.3", + "afi":"ipv4", + "interfaceName":"eth-sw1", + "active":true, + "labels":[ + 16050 + ] } ] } diff --git a/tests/topotests/isis-tilfa-topo1/rt2/step1/show_ipv6_route.ref b/tests/topotests/isis-tilfa-topo1/rt2/step1/show_ipv6_route.ref index 68569b7265..d9bd04ef30 100644 --- a/tests/topotests/isis-tilfa-topo1/rt2/step1/show_ipv6_route.ref +++ b/tests/topotests/isis-tilfa-topo1/rt2/step1/show_ipv6_route.ref @@ -29,7 +29,8 @@ "interfaceName":"eth-rt4-1", "active":true, "labels":[ - 16051 + 16051, + 16011 ] }, { @@ -37,7 +38,8 @@ "interfaceName":"eth-rt4-2", "active":true, "labels":[ - 16051 + 16051, + 16011 ] } ] @@ -73,7 +75,8 @@ "interfaceName":"eth-rt4-1", "active":true, "labels":[ - 16051 + 16051, + 16031 ] }, { @@ -81,7 +84,8 @@ "interfaceName":"eth-rt4-2", "active":true, "labels":[ - 16051 + 16051, + 16031 ] } ] @@ -100,8 +104,11 @@ { "fib":true, "afi":"ipv6", - "interfaceName":"eth-rt4-1", + "interfaceName":"eth-rt4-2", "active":true, + "backupIndex":[ + 0 + ], "labels":[ 3 ] @@ -109,12 +116,26 @@ { "fib":true, "afi":"ipv6", - "interfaceName":"eth-rt4-2", + "interfaceName":"eth-rt4-1", "active":true, + "backupIndex":[ + 0 + ], "labels":[ 3 ] } + ], + "backupNexthops":[ + { + "afi":"ipv6", + "interfaceName":"eth-sw1", + "active":true, + "labels":[ + 16051, + 16041 + ] + } ] } ], @@ -131,7 +152,7 @@ { "fib":true, "afi":"ipv6", - "interfaceName":"eth-rt4-1", + "interfaceName":"eth-sw1", "active":true, "labels":[ 16051 @@ -140,7 +161,7 @@ { "fib":true, "afi":"ipv6", - "interfaceName":"eth-sw1", + "interfaceName":"eth-rt4-2", "active":true, "labels":[ 16051 @@ -149,7 +170,7 @@ { "fib":true, "afi":"ipv6", - "interfaceName":"eth-rt4-2", + "interfaceName":"eth-rt4-1", "active":true, "labels":[ 16051 @@ -171,8 +192,11 @@ { "fib":true, "afi":"ipv6", - "interfaceName":"eth-rt4-1", + "interfaceName":"eth-rt4-2", "active":true, + "backupIndex":[ + 0 + ], "labels":[ 16061 ] @@ -180,12 +204,22 @@ { "fib":true, "afi":"ipv6", - "interfaceName":"eth-rt4-2", + "interfaceName":"eth-rt4-1", "active":true, + "backupIndex":[ + 0 + ], "labels":[ 16061 ] } + ], + "backupNexthops":[ + { + "afi":"ipv6", + "interfaceName":"eth-sw1", + "active":true + } ] } ] diff --git a/tests/topotests/isis-tilfa-topo1/rt2/step1/show_mpls_table.ref b/tests/topotests/isis-tilfa-topo1/rt2/step1/show_mpls_table.ref index 4c18e20472..cd2f879593 100644 --- a/tests/topotests/isis-tilfa-topo1/rt2/step1/show_mpls_table.ref +++ b/tests/topotests/isis-tilfa-topo1/rt2/step1/show_mpls_table.ref @@ -119,13 +119,26 @@ "type":"SR (IS-IS)", "outLabel":3, "installed":true, - "nexthop":"10.0.3.4" + "nexthop":"10.0.3.4", + "backupIndex":[ + 0 + ] }, { "type":"SR (IS-IS)", "outLabel":3, "installed":true, - "nexthop":"10.0.2.4" + "nexthop":"10.0.2.4", + "backupIndex":[ + 0 + ] + } + ], + "backupNexthops":[ + { + "type":"SR (IS-IS)", + "outLabel":16050, + "nexthop":"10.0.1.3" } ] }, @@ -137,13 +150,26 @@ "type":"SR (IS-IS)", "outLabel":3, "installed":true, - "interface":"eth-rt4-2" + "interface":"eth-rt4-2", + "backupIndex":[ + 0 + ] }, { "type":"SR (IS-IS)", "outLabel":3, "installed":true, - "interface":"eth-rt4-1" + "interface":"eth-rt4-1", + "backupIndex":[ + 0 + ] + } + ], + "backupNexthops":[ + { + "type":"SR (IS-IS)", + "outLabel":16051, + "interface":"eth-sw1" } ] }, @@ -203,13 +229,26 @@ "type":"SR (IS-IS)", "outLabel":16060, "installed":true, - "nexthop":"10.0.3.4" + "nexthop":"10.0.3.4", + "backupIndex":[ + 0 + ] }, { "type":"SR (IS-IS)", "outLabel":16060, "installed":true, - "nexthop":"10.0.2.4" + "nexthop":"10.0.2.4", + "backupIndex":[ + 0 + ] + } + ], + "backupNexthops":[ + { + "type":"SR (IS-IS)", + "outLabel":3, + "nexthop":"10.0.1.3" } ] }, @@ -221,13 +260,26 @@ "type":"SR (IS-IS)", "outLabel":16061, "installed":true, - "interface":"eth-rt4-2" + "interface":"eth-rt4-2", + "backupIndex":[ + 0 + ] }, { "type":"SR (IS-IS)", "outLabel":16061, "installed":true, - "interface":"eth-rt4-1" + "interface":"eth-rt4-1", + "backupIndex":[ + 0 + ] + } + ], + "backupNexthops":[ + { + "type":"SR (IS-IS)", + "outLabel":3, + "interface":"eth-sw1" } ] } diff --git a/tests/topotests/isis-tilfa-topo1/rt2/step2/show_ip_route.ref.diff b/tests/topotests/isis-tilfa-topo1/rt2/step2/show_ip_route.ref.diff index 24237769e9..22b896f684 100644 --- a/tests/topotests/isis-tilfa-topo1/rt2/step2/show_ip_route.ref.diff +++ b/tests/topotests/isis-tilfa-topo1/rt2/step2/show_ip_route.ref.diff @@ -1,6 +1,6 @@ ---- rt2/step1/show_ip_route.ref 2020-08-31 15:36:25.999825589 -0300 -+++ rt2/step2/show_ip_route.ref 2020-08-31 22:42:48.835561429 -0300 -@@ -15,34 +15,10 @@ +--- rt2/step1/show_ip_route.ref 2020-09-25 17:46:27.537642781 -0300 ++++ rt2/step2/show_ip_route.ref 2020-09-25 17:46:57.306029668 -0300 +@@ -15,36 +15,10 @@ "afi":"ipv4", "interfaceName":"eth-sw1", "active":true, @@ -20,7 +20,8 @@ - "interfaceName":"eth-rt4-1", - "active":true, - "labels":[ -- 16050 +- 16050, +- 16010 - ] - }, - { @@ -29,13 +30,14 @@ - "interfaceName":"eth-rt4-2", - "active":true, - "labels":[ -- 16050 +- 16050, +- 16010 - ] - } ] } ], -@@ -62,34 +38,10 @@ +@@ -64,36 +38,10 @@ "afi":"ipv4", "interfaceName":"eth-sw1", "active":true, @@ -55,7 +57,8 @@ - "interfaceName":"eth-rt4-1", - "active":true, - "labels":[ -- 16050 +- 16050, +- 16030 - ] - }, - { @@ -64,13 +67,14 @@ - "interfaceName":"eth-rt4-2", - "active":true, - "labels":[ -- 16050 +- 16050, +- 16030 - ] - } ] } ], -@@ -212,34 +164,12 @@ +@@ -248,40 +196,12 @@ { "ip":"10.0.1.1", "afi":"ipv4", @@ -96,18 +100,24 @@ - "ip":"10.0.2.4", - "afi":"ipv4", - "interfaceName":"eth-rt4-1", -- "active":true +- "active":true, +- "labels":[ +- 16050 +- ] - }, - { - "ip":"10.0.3.4", - "afi":"ipv4", - "interfaceName":"eth-rt4-2", -- "active":true +- "active":true, +- "labels":[ +- 16050 +- ] + "interfaceName":"eth-sw1" } ] } -@@ -301,24 +231,6 @@ +@@ -377,24 +297,6 @@ "ip":"10.0.1.3", "afi":"ipv4", "interfaceName":"eth-sw1", @@ -132,7 +142,7 @@ "active":true } ] -@@ -339,24 +251,6 @@ +@@ -415,24 +317,6 @@ "ip":"10.0.1.3", "afi":"ipv4", "interfaceName":"eth-sw1", diff --git a/tests/topotests/isis-tilfa-topo1/rt2/step2/show_ipv6_route.ref.diff b/tests/topotests/isis-tilfa-topo1/rt2/step2/show_ipv6_route.ref.diff index 7c9f1e965a..08c7d2b1fc 100644 --- a/tests/topotests/isis-tilfa-topo1/rt2/step2/show_ipv6_route.ref.diff +++ b/tests/topotests/isis-tilfa-topo1/rt2/step2/show_ipv6_route.ref.diff @@ -1,6 +1,6 @@ ---- rt2/step1/show_ipv6_route.ref 2020-08-31 15:36:25.999825589 -0300 -+++ rt2/step2/show_ipv6_route.ref 2020-08-31 22:42:48.835561429 -0300 -@@ -14,32 +14,10 @@ +--- rt2/step1/show_ipv6_route.ref 2020-09-25 17:46:28.865660035 -0300 ++++ rt2/step2/show_ipv6_route.ref 2020-09-25 17:46:58.514045373 -0300 +@@ -14,34 +14,10 @@ "afi":"ipv6", "interfaceName":"eth-sw1", "active":true, @@ -19,7 +19,8 @@ - "interfaceName":"eth-rt4-1", - "active":true, - "labels":[ -- 16051 +- 16051, +- 16011 - ] - }, - { @@ -27,13 +28,14 @@ - "interfaceName":"eth-rt4-2", - "active":true, - "labels":[ -- 16051 +- 16051, +- 16011 - ] - } ] } ], -@@ -58,32 +36,10 @@ +@@ -60,34 +36,10 @@ "afi":"ipv6", "interfaceName":"eth-sw1", "active":true, @@ -52,7 +54,8 @@ - "interfaceName":"eth-rt4-1", - "active":true, - "labels":[ -- 16051 +- 16051, +- 16031 - ] - }, - { @@ -60,7 +63,8 @@ - "interfaceName":"eth-rt4-2", - "active":true, - "labels":[ -- 16051 +- 16051, +- 16031 - ] - } ] diff --git a/tests/topotests/isis-tilfa-topo1/rt2/step2/show_mpls_table.ref.diff b/tests/topotests/isis-tilfa-topo1/rt2/step2/show_mpls_table.ref.diff index 1c3e037b96..4feb927156 100644 --- a/tests/topotests/isis-tilfa-topo1/rt2/step2/show_mpls_table.ref.diff +++ b/tests/topotests/isis-tilfa-topo1/rt2/step2/show_mpls_table.ref.diff @@ -1,5 +1,5 @@ ---- rt2/step1/show_mpls_table.ref 2020-08-31 15:36:25.999825589 -0300 -+++ rt2/step2/show_mpls_table.ref 2020-08-31 22:42:48.835561429 -0300 +--- rt2/step1/show_mpls_table.ref 2020-09-25 17:46:26.261626203 -0300 ++++ rt2/step2/show_mpls_table.ref 2020-09-25 17:46:56.086013807 -0300 @@ -7,23 +7,7 @@ "type":"SR (IS-IS)", "outLabel":3, diff --git a/tests/topotests/isis-tilfa-topo1/rt2/step3/show_ip_route.ref.diff b/tests/topotests/isis-tilfa-topo1/rt2/step3/show_ip_route.ref.diff index 4613c2c63d..af1cebc76d 100644 --- a/tests/topotests/isis-tilfa-topo1/rt2/step3/show_ip_route.ref.diff +++ b/tests/topotests/isis-tilfa-topo1/rt2/step3/show_ip_route.ref.diff @@ -1,6 +1,6 @@ ---- rt2/step2/show_ip_route.ref 2020-08-31 22:42:48.835561429 -0300 -+++ rt2/step3/show_ip_route.ref 2020-08-31 22:42:48.835561429 -0300 -@@ -15,10 +15,34 @@ +--- rt2/step2/show_ip_route.ref 2020-09-25 17:46:57.306029668 -0300 ++++ rt2/step3/show_ip_route.ref 2020-09-25 17:48:05.274913964 -0300 +@@ -15,10 +15,36 @@ "afi":"ipv4", "interfaceName":"eth-sw1", "active":true, @@ -20,7 +20,8 @@ + "interfaceName":"eth-rt4-1", + "active":true, + "labels":[ -+ 16050 ++ 16050, ++ 16010 + ] + }, + { @@ -29,13 +30,14 @@ + "interfaceName":"eth-rt4-2", + "active":true, + "labels":[ -+ 16050 ++ 16050, ++ 16010 + ] + } ] } ], -@@ -38,10 +62,34 @@ +@@ -38,10 +64,36 @@ "afi":"ipv4", "interfaceName":"eth-sw1", "active":true, @@ -55,7 +57,8 @@ + "interfaceName":"eth-rt4-1", + "active":true, + "labels":[ -+ 16050 ++ 16050, ++ 16030 + ] + }, + { @@ -64,13 +67,14 @@ + "interfaceName":"eth-rt4-2", + "active":true, + "labels":[ -+ 16050 ++ 16050, ++ 16030 + ] + } ] } ], -@@ -164,12 +212,34 @@ +@@ -196,12 +248,40 @@ { "ip":"10.0.1.1", "afi":"ipv4", @@ -97,17 +101,23 @@ + "ip":"10.0.2.4", + "afi":"ipv4", + "interfaceName":"eth-rt4-1", -+ "active":true ++ "active":true, ++ "labels":[ ++ 16050 ++ ] + }, + { + "ip":"10.0.3.4", + "afi":"ipv4", + "interfaceName":"eth-rt4-2", -+ "active":true ++ "active":true, ++ "labels":[ ++ 16050 ++ ] } ] } -@@ -231,6 +301,24 @@ +@@ -297,6 +377,24 @@ "ip":"10.0.1.3", "afi":"ipv4", "interfaceName":"eth-sw1", @@ -132,7 +142,7 @@ "active":true } ] -@@ -251,6 +339,24 @@ +@@ -317,6 +415,24 @@ "ip":"10.0.1.3", "afi":"ipv4", "interfaceName":"eth-sw1", diff --git a/tests/topotests/isis-tilfa-topo1/rt2/step3/show_ipv6_route.ref.diff b/tests/topotests/isis-tilfa-topo1/rt2/step3/show_ipv6_route.ref.diff index 84b5283360..9809c316e8 100644 --- a/tests/topotests/isis-tilfa-topo1/rt2/step3/show_ipv6_route.ref.diff +++ b/tests/topotests/isis-tilfa-topo1/rt2/step3/show_ipv6_route.ref.diff @@ -1,6 +1,6 @@ ---- rt2/step2/show_ipv6_route.ref 2020-08-31 22:42:48.835561429 -0300 -+++ rt2/step3/show_ipv6_route.ref 2020-08-31 22:42:48.835561429 -0300 -@@ -14,10 +14,32 @@ +--- rt2/step2/show_ipv6_route.ref 2020-09-25 17:46:58.514045373 -0300 ++++ rt2/step3/show_ipv6_route.ref 2020-09-25 17:48:06.570930838 -0300 +@@ -14,10 +14,34 @@ "afi":"ipv6", "interfaceName":"eth-sw1", "active":true, @@ -19,7 +19,8 @@ + "interfaceName":"eth-rt4-1", + "active":true, + "labels":[ -+ 16051 ++ 16051, ++ 16011 + ] + }, + { @@ -27,13 +28,14 @@ + "interfaceName":"eth-rt4-2", + "active":true, + "labels":[ -+ 16051 ++ 16051, ++ 16011 + ] + } ] } ], -@@ -36,10 +58,32 @@ +@@ -36,10 +60,34 @@ "afi":"ipv6", "interfaceName":"eth-sw1", "active":true, @@ -52,7 +54,8 @@ + "interfaceName":"eth-rt4-1", + "active":true, + "labels":[ -+ 16051 ++ 16051, ++ 16031 + ] + }, + { @@ -60,7 +63,8 @@ + "interfaceName":"eth-rt4-2", + "active":true, + "labels":[ -+ 16051 ++ 16051, ++ 16031 + ] + } ] diff --git a/tests/topotests/isis-tilfa-topo1/rt2/step3/show_mpls_table.ref.diff b/tests/topotests/isis-tilfa-topo1/rt2/step3/show_mpls_table.ref.diff index 5dc90e442c..180323e4c8 100644 --- a/tests/topotests/isis-tilfa-topo1/rt2/step3/show_mpls_table.ref.diff +++ b/tests/topotests/isis-tilfa-topo1/rt2/step3/show_mpls_table.ref.diff @@ -1,5 +1,5 @@ ---- rt2/step2/show_mpls_table.ref 2020-08-31 22:42:48.835561429 -0300 -+++ rt2/step3/show_mpls_table.ref 2020-08-31 22:42:48.835561429 -0300 +--- rt2/step2/show_mpls_table.ref 2020-09-25 17:46:56.086013807 -0300 ++++ rt2/step3/show_mpls_table.ref 2020-09-25 17:48:03.994897300 -0300 @@ -7,7 +7,23 @@ "type":"SR (IS-IS)", "outLabel":3, diff --git a/tests/topotests/isis-tilfa-topo1/rt2/step4/show_ip_route.ref.diff b/tests/topotests/isis-tilfa-topo1/rt2/step4/show_ip_route.ref.diff index f703db555f..12d45bbe07 100644 --- a/tests/topotests/isis-tilfa-topo1/rt2/step4/show_ip_route.ref.diff +++ b/tests/topotests/isis-tilfa-topo1/rt2/step4/show_ip_route.ref.diff @@ -1,6 +1,6 @@ ---- rt2/step3/show_ip_route.ref 2020-08-31 22:42:48.835561429 -0300 -+++ rt2/step4/show_ip_route.ref 2020-08-31 22:42:48.835561429 -0300 -@@ -15,34 +15,10 @@ +--- rt2/step3/show_ip_route.ref 2020-09-25 17:48:05.274913964 -0300 ++++ rt2/step4/show_ip_route.ref 2020-09-25 17:49:01.763649797 -0300 +@@ -15,36 +15,10 @@ "afi":"ipv4", "interfaceName":"eth-sw1", "active":true, @@ -20,7 +20,8 @@ - "interfaceName":"eth-rt4-1", - "active":true, - "labels":[ -- 16050 +- 16050, +- 16010 - ] - }, - { @@ -29,13 +30,14 @@ - "interfaceName":"eth-rt4-2", - "active":true, - "labels":[ -- 16050 +- 16050, +- 16010 - ] - } ] } ], -@@ -62,34 +38,10 @@ +@@ -64,36 +38,10 @@ "afi":"ipv4", "interfaceName":"eth-sw1", "active":true, @@ -55,7 +57,8 @@ - "interfaceName":"eth-rt4-1", - "active":true, - "labels":[ -- 16050 +- 16050, +- 16030 - ] - }, - { @@ -64,60 +67,50 @@ - "interfaceName":"eth-rt4-2", - "active":true, - "labels":[ -- 16050 +- 16050, +- 16030 - ] - } ] } ], -@@ -108,20 +60,14 @@ - "ip":"10.0.2.4", - "afi":"ipv4", - "interfaceName":"eth-rt4-1", -- "active":true, +@@ -115,9 +63,6 @@ + "active":true, + "backupIndex":[ + 0 +- ], - "labels":[ - 3 -- ] -+ "active":true + ] }, { - "fib":true, - "ip":"10.0.3.4", - "afi":"ipv4", - "interfaceName":"eth-rt4-2", -- "active":true, +@@ -128,9 +73,6 @@ + "active":true, + "backupIndex":[ + 0 +- ], - "labels":[ - 3 -- ] -+ "active":true - } - ] - } -@@ -153,7 +99,7 @@ - "interfaceName":"eth-rt4-1", - "active":true, - "labels":[ -- 16050 -+ 3 ] - }, - { -@@ -163,7 +109,7 @@ - "interfaceName":"eth-rt4-2", + } + ], +@@ -141,8 +83,7 @@ + "interfaceName":"eth-sw1", "active":true, "labels":[ -- 16050 -+ 3 +- 16050, +- 16040 ++ 16050 ] } ] -@@ -184,20 +130,14 @@ +@@ -173,20 +114,14 @@ "ip":"10.0.2.4", "afi":"ipv4", "interfaceName":"eth-rt4-1", - "active":true, - "labels":[ -- 16060 +- 16050 - ] + "active":true }, @@ -128,13 +121,33 @@ "interfaceName":"eth-rt4-2", - "active":true, - "labels":[ -- 16060 +- 16050 - ] + "active":true } ] } -@@ -212,34 +152,12 @@ +@@ -209,9 +144,6 @@ + "active":true, + "backupIndex":[ + 0 +- ], +- "labels":[ +- 16060 + ] + }, + { +@@ -222,9 +154,6 @@ + "active":true, + "backupIndex":[ + 0 +- ], +- "labels":[ +- 16060 + ] + } + ], +@@ -248,40 +177,12 @@ { "ip":"10.0.1.1", "afi":"ipv4", @@ -160,13 +173,19 @@ - "ip":"10.0.2.4", - "afi":"ipv4", - "interfaceName":"eth-rt4-1", -- "active":true +- "active":true, +- "labels":[ +- 16050 +- ] - }, - { - "ip":"10.0.3.4", - "afi":"ipv4", - "interfaceName":"eth-rt4-2", -- "active":true +- "active":true, +- "labels":[ +- 16050 +- ] + "interfaceName":"eth-sw1" } ] diff --git a/tests/topotests/isis-tilfa-topo1/rt2/step4/show_ipv6_route.ref.diff b/tests/topotests/isis-tilfa-topo1/rt2/step4/show_ipv6_route.ref.diff index fdd4a5166e..fdf658d59d 100644 --- a/tests/topotests/isis-tilfa-topo1/rt2/step4/show_ipv6_route.ref.diff +++ b/tests/topotests/isis-tilfa-topo1/rt2/step4/show_ipv6_route.ref.diff @@ -1,6 +1,6 @@ ---- rt2/step3/show_ipv6_route.ref 2020-08-31 22:42:48.835561429 -0300 -+++ rt2/step4/show_ipv6_route.ref 2020-08-31 22:42:48.835561429 -0300 -@@ -14,32 +14,10 @@ +--- rt2/step3/show_ipv6_route.ref 2020-09-25 17:48:06.570930838 -0300 ++++ rt2/step4/show_ipv6_route.ref 2020-09-25 17:49:02.995665853 -0300 +@@ -14,34 +14,10 @@ "afi":"ipv6", "interfaceName":"eth-sw1", "active":true, @@ -19,7 +19,8 @@ - "interfaceName":"eth-rt4-1", - "active":true, - "labels":[ -- 16051 +- 16051, +- 16011 - ] - }, - { @@ -27,13 +28,14 @@ - "interfaceName":"eth-rt4-2", - "active":true, - "labels":[ -- 16051 +- 16051, +- 16011 - ] - } ] } ], -@@ -58,32 +36,10 @@ +@@ -60,34 +36,10 @@ "afi":"ipv6", "interfaceName":"eth-sw1", "active":true, @@ -52,7 +54,8 @@ - "interfaceName":"eth-rt4-1", - "active":true, - "labels":[ -- 16051 +- 16051, +- 16031 - ] - }, - { @@ -60,71 +63,82 @@ - "interfaceName":"eth-rt4-2", - "active":true, - "labels":[ -- 16051 +- 16051, +- 16031 - ] - } ] } ], -@@ -101,19 +57,13 @@ - "fib":true, - "afi":"ipv6", - "interfaceName":"eth-rt4-1", -- "active":true, +@@ -108,9 +60,6 @@ + "active":true, + "backupIndex":[ + 0 +- ], - "labels":[ - 3 -- ] -+ "active":true + ] }, { - "fib":true, - "afi":"ipv6", - "interfaceName":"eth-rt4-2", -- "active":true, +@@ -120,9 +69,6 @@ + "active":true, + "backupIndex":[ + 0 +- ], - "labels":[ - 3 -- ] -+ "active":true - } - ] - } -@@ -134,7 +84,7 @@ - "interfaceName":"eth-rt4-1", - "active":true, - "labels":[ -- 16051 -+ 3 ] - }, - { -@@ -152,7 +102,7 @@ - "interfaceName":"eth-rt4-2", + } + ], +@@ -132,8 +78,7 @@ + "interfaceName":"eth-sw1", "active":true, "labels":[ -- 16051 -+ 3 +- 16051, +- 16041 ++ 16051 ] } ] -@@ -172,19 +122,13 @@ +@@ -162,19 +107,13 @@ "fib":true, "afi":"ipv6", - "interfaceName":"eth-rt4-1", + "interfaceName":"eth-rt4-2", - "active":true, - "labels":[ -- 16061 +- 16051 - ] + "active":true }, { "fib":true, "afi":"ipv6", - "interfaceName":"eth-rt4-2", + "interfaceName":"eth-rt4-1", - "active":true, - "labels":[ -- 16061 +- 16051 - ] + "active":true } ] } +@@ -196,9 +135,6 @@ + "active":true, + "backupIndex":[ + 0 +- ], +- "labels":[ +- 16061 + ] + }, + { +@@ -208,9 +144,6 @@ + "active":true, + "backupIndex":[ + 0 +- ], +- "labels":[ +- 16061 + ] + } + ], diff --git a/tests/topotests/isis-tilfa-topo1/rt2/step4/show_mpls_table.ref.diff b/tests/topotests/isis-tilfa-topo1/rt2/step4/show_mpls_table.ref.diff index dcc4532e54..a78f79c576 100644 --- a/tests/topotests/isis-tilfa-topo1/rt2/step4/show_mpls_table.ref.diff +++ b/tests/topotests/isis-tilfa-topo1/rt2/step4/show_mpls_table.ref.diff @@ -1,5 +1,5 @@ ---- rt2/step3/show_mpls_table.ref 2020-08-31 22:42:48.835561429 -0300 -+++ rt2/step4/show_mpls_table.ref 2020-08-31 22:42:48.835561429 -0300 +--- rt2/step3/show_mpls_table.ref 2020-09-25 17:48:03.994897300 -0300 ++++ rt2/step4/show_mpls_table.ref 2020-09-25 17:49:00.551634001 -0300 @@ -7,23 +7,7 @@ "type":"SR (IS-IS)", "outLabel":3, @@ -75,7 +75,7 @@ } ] }, -@@ -91,59 +43,7 @@ +@@ -91,84 +43,6 @@ "type":"SR (IS-IS)", "outLabel":3, "installed":true, @@ -107,13 +107,26 @@ - "type":"SR (IS-IS)", - "outLabel":3, - "installed":true, -- "nexthop":"10.0.3.4" +- "nexthop":"10.0.3.4", +- "backupIndex":[ +- 0 +- ] - }, - { - "type":"SR (IS-IS)", - "outLabel":3, - "installed":true, -- "nexthop":"10.0.2.4" +- "nexthop":"10.0.2.4", +- "backupIndex":[ +- 0 +- ] +- } +- ], +- "backupNexthops":[ +- { +- "type":"SR (IS-IS)", +- "outLabel":16050, +- "nexthop":"10.0.1.3" - } - ] - }, @@ -125,88 +138,63 @@ - "type":"SR (IS-IS)", - "outLabel":3, - "installed":true, -- "interface":"eth-rt4-2" +- "interface":"eth-rt4-2", +- "backupIndex":[ +- 0 +- ] - }, - { - "type":"SR (IS-IS)", - "outLabel":3, - "installed":true, -- "interface":"eth-rt4-1" -+ "interface":"eth-sw1" - } - ] - }, -@@ -153,13 +53,13 @@ - "nexthops":[ - { - "type":"SR (IS-IS)", -- "outLabel":16050, -+ "outLabel":3, - "installed":true, - "nexthop":"10.0.3.4" - }, - { - "type":"SR (IS-IS)", -- "outLabel":16050, -+ "outLabel":3, - "installed":true, - "nexthop":"10.0.2.4" - }, -@@ -177,13 +77,13 @@ - "nexthops":[ - { - "type":"SR (IS-IS)", -- "outLabel":16051, -+ "outLabel":3, - "installed":true, - "interface":"eth-rt4-2" - }, - { - "type":"SR (IS-IS)", +- "interface":"eth-rt4-1", +- "backupIndex":[ +- 0 +- ] +- } +- ], +- "backupNexthops":[ +- { +- "type":"SR (IS-IS)", - "outLabel":16051, -+ "outLabel":3, - "installed":true, - "interface":"eth-rt4-1" - }, -@@ -194,41 +94,5 @@ "interface":"eth-sw1" } ] -- }, -- "16060":{ -- "inLabel":16060, -- "installed":true, -- "nexthops":[ -- { -- "type":"SR (IS-IS)", -- "outLabel":16060, -- "installed":true, +@@ -181,18 +55,6 @@ + "type":"SR (IS-IS)", + "outLabel":16050, + "installed":true, - "nexthop":"10.0.3.4" - }, - { - "type":"SR (IS-IS)", -- "outLabel":16060, +- "outLabel":16050, - "installed":true, - "nexthop":"10.0.2.4" -- } -- ] -- }, -- "16061":{ -- "inLabel":16061, -- "installed":true, -- "nexthops":[ +- }, - { - "type":"SR (IS-IS)", -- "outLabel":16061, +- "outLabel":16050, +- "installed":true, + "nexthop":"10.0.1.3" + } + ] +@@ -204,18 +66,6 @@ + { + "type":"SR (IS-IS)", + "outLabel":16051, - "installed":true, - "interface":"eth-rt4-2" - }, - { - "type":"SR (IS-IS)", -- "outLabel":16061, +- "outLabel":16051, - "installed":true, - "interface":"eth-rt4-1" -- } -- ] - } - } +- }, +- { +- "type":"SR (IS-IS)", +- "outLabel":16051, + "installed":true, + "interface":"eth-sw1" + } diff --git a/tests/topotests/isis-tilfa-topo1/rt2/step5/show_ip_route.ref.diff b/tests/topotests/isis-tilfa-topo1/rt2/step5/show_ip_route.ref.diff index 22a5cb6579..7d20fad3f4 100644 --- a/tests/topotests/isis-tilfa-topo1/rt2/step5/show_ip_route.ref.diff +++ b/tests/topotests/isis-tilfa-topo1/rt2/step5/show_ip_route.ref.diff @@ -1,6 +1,6 @@ ---- rt2/step4/show_ip_route.ref 2020-08-31 22:42:48.835561429 -0300 -+++ rt2/step5/show_ip_route.ref 2020-08-31 22:42:48.835561429 -0300 -@@ -15,10 +15,34 @@ +--- rt2/step4/show_ip_route.ref 2020-09-25 17:49:01.763649797 -0300 ++++ rt2/step5/show_ip_route.ref 2020-09-25 17:50:12.360570411 -0300 +@@ -15,10 +15,36 @@ "afi":"ipv4", "interfaceName":"eth-sw1", "active":true, @@ -20,7 +20,8 @@ + "interfaceName":"eth-rt4-1", + "active":true, + "labels":[ -+ 16050 ++ 16050, ++ 16010 + ] + }, + { @@ -29,13 +30,14 @@ + "interfaceName":"eth-rt4-2", + "active":true, + "labels":[ -+ 16050 ++ 16050, ++ 16010 + ] + } ] } ], -@@ -38,10 +62,34 @@ +@@ -38,10 +64,36 @@ "afi":"ipv4", "interfaceName":"eth-sw1", "active":true, @@ -55,7 +57,8 @@ + "interfaceName":"eth-rt4-1", + "active":true, + "labels":[ -+ 16050 ++ 16050, ++ 16030 + ] + }, + { @@ -64,61 +67,51 @@ + "interfaceName":"eth-rt4-2", + "active":true, + "labels":[ -+ 16050 ++ 16050, ++ 16030 + ] + } ] } ], -@@ -60,14 +108,20 @@ - "ip":"10.0.2.4", - "afi":"ipv4", - "interfaceName":"eth-rt4-1", -- "active":true -+ "active":true, +@@ -63,6 +115,9 @@ + "active":true, + "backupIndex":[ + 0 ++ ], + "labels":[ + 3 -+ ] + ] }, { - "fib":true, - "ip":"10.0.3.4", - "afi":"ipv4", - "interfaceName":"eth-rt4-2", -- "active":true -+ "active":true, +@@ -73,6 +128,9 @@ + "active":true, + "backupIndex":[ + 0 ++ ], + "labels":[ + 3 -+ ] - } - ] - } -@@ -99,7 +153,7 @@ - "interfaceName":"eth-rt4-1", - "active":true, - "labels":[ -- 3 -+ 16050 ] - }, - { -@@ -109,7 +163,7 @@ - "interfaceName":"eth-rt4-2", + } + ], +@@ -83,7 +141,8 @@ + "interfaceName":"eth-sw1", "active":true, "labels":[ -- 3 -+ 16050 +- 16050 ++ 16050, ++ 16040 ] } ] -@@ -130,14 +184,20 @@ +@@ -114,14 +173,20 @@ "ip":"10.0.2.4", "afi":"ipv4", "interfaceName":"eth-rt4-1", - "active":true + "active":true, + "labels":[ -+ 16060 ++ 16050 + ] }, { @@ -129,12 +122,32 @@ - "active":true + "active":true, + "labels":[ -+ 16060 ++ 16050 + ] } ] } -@@ -152,12 +212,34 @@ +@@ -144,6 +209,9 @@ + "active":true, + "backupIndex":[ + 0 ++ ], ++ "labels":[ ++ 16060 + ] + }, + { +@@ -154,6 +222,9 @@ + "active":true, + "backupIndex":[ + 0 ++ ], ++ "labels":[ ++ 16060 + ] + } + ], +@@ -177,12 +248,40 @@ { "ip":"10.0.1.1", "afi":"ipv4", @@ -161,13 +174,19 @@ + "ip":"10.0.2.4", + "afi":"ipv4", + "interfaceName":"eth-rt4-1", -+ "active":true ++ "active":true, ++ "labels":[ ++ 16050 ++ ] + }, + { + "ip":"10.0.3.4", + "afi":"ipv4", + "interfaceName":"eth-rt4-2", -+ "active":true ++ "active":true, ++ "labels":[ ++ 16050 ++ ] } ] } diff --git a/tests/topotests/isis-tilfa-topo1/rt2/step5/show_ipv6_route.ref.diff b/tests/topotests/isis-tilfa-topo1/rt2/step5/show_ipv6_route.ref.diff index 819a153f7a..9330964338 100644 --- a/tests/topotests/isis-tilfa-topo1/rt2/step5/show_ipv6_route.ref.diff +++ b/tests/topotests/isis-tilfa-topo1/rt2/step5/show_ipv6_route.ref.diff @@ -1,6 +1,6 @@ ---- rt2/step4/show_ipv6_route.ref 2020-08-31 22:42:48.835561429 -0300 -+++ rt2/step5/show_ipv6_route.ref 2020-08-31 22:42:48.835561429 -0300 -@@ -14,10 +14,32 @@ +--- rt2/step4/show_ipv6_route.ref 2020-09-25 17:49:02.995665853 -0300 ++++ rt2/step5/show_ipv6_route.ref 2020-09-25 17:50:13.636587060 -0300 +@@ -14,10 +14,34 @@ "afi":"ipv6", "interfaceName":"eth-sw1", "active":true, @@ -19,7 +19,8 @@ + "interfaceName":"eth-rt4-1", + "active":true, + "labels":[ -+ 16051 ++ 16051, ++ 16011 + ] + }, + { @@ -27,13 +28,14 @@ + "interfaceName":"eth-rt4-2", + "active":true, + "labels":[ -+ 16051 ++ 16051, ++ 16011 + ] + } ] } ], -@@ -36,10 +58,32 @@ +@@ -36,10 +60,34 @@ "afi":"ipv6", "interfaceName":"eth-sw1", "active":true, @@ -52,7 +54,8 @@ + "interfaceName":"eth-rt4-1", + "active":true, + "labels":[ -+ 16051 ++ 16051, ++ 16031 + ] + }, + { @@ -60,71 +63,82 @@ + "interfaceName":"eth-rt4-2", + "active":true, + "labels":[ -+ 16051 ++ 16051, ++ 16031 + ] + } ] } ], -@@ -57,13 +101,19 @@ - "fib":true, - "afi":"ipv6", - "interfaceName":"eth-rt4-1", -- "active":true -+ "active":true, +@@ -60,6 +108,9 @@ + "active":true, + "backupIndex":[ + 0 ++ ], + "labels":[ + 3 -+ ] + ] }, { - "fib":true, - "afi":"ipv6", - "interfaceName":"eth-rt4-2", -- "active":true -+ "active":true, +@@ -69,6 +120,9 @@ + "active":true, + "backupIndex":[ + 0 ++ ], + "labels":[ + 3 -+ ] - } - ] - } -@@ -84,7 +134,7 @@ - "interfaceName":"eth-rt4-1", - "active":true, - "labels":[ -- 3 -+ 16051 ] - }, - { -@@ -102,7 +152,7 @@ - "interfaceName":"eth-rt4-2", + } + ], +@@ -78,7 +132,8 @@ + "interfaceName":"eth-sw1", "active":true, "labels":[ -- 3 -+ 16051 +- 16051 ++ 16051, ++ 16041 ] } ] -@@ -122,13 +172,19 @@ +@@ -107,13 +162,19 @@ "fib":true, "afi":"ipv6", - "interfaceName":"eth-rt4-1", + "interfaceName":"eth-rt4-2", - "active":true + "active":true, + "labels":[ -+ 16061 ++ 16051 + ] }, { "fib":true, "afi":"ipv6", - "interfaceName":"eth-rt4-2", + "interfaceName":"eth-rt4-1", - "active":true + "active":true, + "labels":[ -+ 16061 ++ 16051 + ] } ] } +@@ -135,6 +196,9 @@ + "active":true, + "backupIndex":[ + 0 ++ ], ++ "labels":[ ++ 16061 + ] + }, + { +@@ -144,6 +208,9 @@ + "active":true, + "backupIndex":[ + 0 ++ ], ++ "labels":[ ++ 16061 + ] + } + ], diff --git a/tests/topotests/isis-tilfa-topo1/rt2/step5/show_mpls_table.ref.diff b/tests/topotests/isis-tilfa-topo1/rt2/step5/show_mpls_table.ref.diff index 7f851effad..b1e44a727f 100644 --- a/tests/topotests/isis-tilfa-topo1/rt2/step5/show_mpls_table.ref.diff +++ b/tests/topotests/isis-tilfa-topo1/rt2/step5/show_mpls_table.ref.diff @@ -1,5 +1,5 @@ ---- rt2/step4/show_mpls_table.ref 2020-08-31 22:42:48.835561429 -0300 -+++ rt2/step5/show_mpls_table.ref 2020-08-31 22:42:48.835561429 -0300 +--- rt2/step4/show_mpls_table.ref 2020-09-25 17:49:00.551634001 -0300 ++++ rt2/step5/show_mpls_table.ref 2020-09-25 17:50:11.068553553 -0300 @@ -7,7 +7,23 @@ "type":"SR (IS-IS)", "outLabel":3, @@ -75,11 +75,10 @@ } ] }, -@@ -43,12 +91,28 @@ +@@ -43,6 +91,84 @@ "type":"SR (IS-IS)", "outLabel":3, "installed":true, -- "interface":"eth-sw1" + "interface":"eth-sw1", + "backupIndex":[ + 0, @@ -97,114 +96,105 @@ + "type":"SR (IS-IS)", + "outLabel":16051, + "interface":"eth-rt4-2" - } - ] - }, -- "16050":{ -- "inLabel":16050, -+ "16040":{ -+ "inLabel":16040, - "installed":true, - "nexthops":[ - { -@@ -62,6 +126,42 @@ - "outLabel":3, - "installed":true, - "nexthop":"10.0.2.4" + } + ] + }, -+ "16041":{ -+ "inLabel":16041, ++ "16040":{ ++ "inLabel":16040, + "installed":true, + "nexthops":[ + { + "type":"SR (IS-IS)", + "outLabel":3, + "installed":true, -+ "interface":"eth-rt4-2" ++ "nexthop":"10.0.3.4", ++ "backupIndex":[ ++ 0 ++ ] + }, + { + "type":"SR (IS-IS)", + "outLabel":3, + "installed":true, -+ "interface":"eth-rt4-1" ++ "nexthop":"10.0.2.4", ++ "backupIndex":[ ++ 0 ++ ] ++ } ++ ], ++ "backupNexthops":[ ++ { ++ "type":"SR (IS-IS)", ++ "outLabel":16050, ++ "nexthop":"10.0.1.3" + } + ] + }, -+ "16050":{ -+ "inLabel":16050, ++ "16041":{ ++ "inLabel":16041, + "installed":true, + "nexthops":[ + { + "type":"SR (IS-IS)", -+ "outLabel":16050, ++ "outLabel":3, + "installed":true, -+ "nexthop":"10.0.3.4" ++ "interface":"eth-rt4-2", ++ "backupIndex":[ ++ 0 ++ ] + }, + { + "type":"SR (IS-IS)", -+ "outLabel":16050, ++ "outLabel":3, + "installed":true, -+ "nexthop":"10.0.2.4" - }, - { - "type":"SR (IS-IS)", -@@ -77,13 +177,13 @@ - "nexthops":[ - { - "type":"SR (IS-IS)", -- "outLabel":3, -+ "outLabel":16051, - "installed":true, - "interface":"eth-rt4-2" - }, - { - "type":"SR (IS-IS)", -- "outLabel":3, ++ "interface":"eth-rt4-1", ++ "backupIndex":[ ++ 0 ++ ] ++ } ++ ], ++ "backupNexthops":[ ++ { ++ "type":"SR (IS-IS)", + "outLabel":16051, - "installed":true, - "interface":"eth-rt4-1" - }, -@@ -94,5 +194,41 @@ "interface":"eth-sw1" } ] -+ }, -+ "16060":{ -+ "inLabel":16060, -+ "installed":true, -+ "nexthops":[ -+ { -+ "type":"SR (IS-IS)", -+ "outLabel":16060, -+ "installed":true, +@@ -55,6 +181,18 @@ + "type":"SR (IS-IS)", + "outLabel":16050, + "installed":true, + "nexthop":"10.0.3.4" + }, + { + "type":"SR (IS-IS)", -+ "outLabel":16060, ++ "outLabel":16050, + "installed":true, + "nexthop":"10.0.2.4" -+ } -+ ] -+ }, -+ "16061":{ -+ "inLabel":16061, -+ "installed":true, -+ "nexthops":[ ++ }, + { + "type":"SR (IS-IS)", -+ "outLabel":16061, ++ "outLabel":16050, ++ "installed":true, + "nexthop":"10.0.1.3" + } + ] +@@ -66,6 +204,18 @@ + { + "type":"SR (IS-IS)", + "outLabel":16051, + "installed":true, + "interface":"eth-rt4-2" + }, + { + "type":"SR (IS-IS)", -+ "outLabel":16061, ++ "outLabel":16051, + "installed":true, + "interface":"eth-rt4-1" -+ } -+ ] - } - } ++ }, ++ { ++ "type":"SR (IS-IS)", ++ "outLabel":16051, + "installed":true, + "interface":"eth-sw1" + } diff --git a/tests/topotests/isis-tilfa-topo1/rt2/step7/show_ip_route.ref.diff b/tests/topotests/isis-tilfa-topo1/rt2/step7/show_ip_route.ref.diff index 109ab8ea6a..c92195d704 100644 --- a/tests/topotests/isis-tilfa-topo1/rt2/step7/show_ip_route.ref.diff +++ b/tests/topotests/isis-tilfa-topo1/rt2/step7/show_ip_route.ref.diff @@ -1,6 +1,6 @@ ---- rt2/step6/show_ip_route.ref 2020-08-31 22:42:48.835561429 -0300 -+++ rt2/step7/show_ip_route.ref 2020-08-31 22:42:48.835561429 -0300 -@@ -15,34 +15,10 @@ +--- rt2/step6/show_ip_route.ref 2020-09-25 17:51:15.313392177 -0300 ++++ rt2/step7/show_ip_route.ref 2020-09-25 17:52:02.210004805 -0300 +@@ -15,36 +15,10 @@ "afi":"ipv4", "interfaceName":"eth-sw1", "active":true, @@ -20,7 +20,8 @@ - "interfaceName":"eth-rt4-1", - "active":true, - "labels":[ -- 16050 +- 16050, +- 16010 - ] - }, - { @@ -29,13 +30,14 @@ - "interfaceName":"eth-rt4-2", - "active":true, - "labels":[ -- 16050 +- 16050, +- 16010 - ] - } ] } ], -@@ -62,34 +38,10 @@ +@@ -64,36 +38,10 @@ "afi":"ipv4", "interfaceName":"eth-sw1", "active":true, @@ -55,7 +57,8 @@ - "interfaceName":"eth-rt4-1", - "active":true, - "labels":[ -- 16050 +- 16050, +- 16030 - ] - }, - { @@ -64,13 +67,50 @@ - "interfaceName":"eth-rt4-2", - "active":true, - "labels":[ -- 16050 +- 16050, +- 16030 - ] - } ] } ], -@@ -141,30 +93,21 @@ +@@ -113,9 +61,6 @@ + "afi":"ipv4", + "interfaceName":"eth-rt4-1", + "active":true, +- "backupIndex":[ +- 0 +- ], + "labels":[ + 3 + ] +@@ -126,25 +71,10 @@ + "afi":"ipv4", + "interfaceName":"eth-rt4-2", + "active":true, +- "backupIndex":[ +- 0 +- ], + "labels":[ + 3 + ] + } +- ], +- "backupNexthops":[ +- { +- "ip":"10.0.1.3", +- "afi":"ipv4", +- "interfaceName":"eth-sw1", +- "active":true, +- "labels":[ +- 16050, +- 16040 +- ] +- } + ] + } + ], +@@ -163,30 +93,21 @@ "ip":"10.0.1.3", "afi":"ipv4", "interfaceName":"eth-sw1", @@ -104,7 +144,7 @@ } ] } -@@ -212,34 +155,12 @@ +@@ -248,40 +169,12 @@ { "ip":"10.0.1.1", "afi":"ipv4", @@ -130,14 +170,119 @@ - "ip":"10.0.2.4", - "afi":"ipv4", - "interfaceName":"eth-rt4-1", -- "active":true +- "active":true, +- "labels":[ +- 16050 +- ] - }, - { - "ip":"10.0.3.4", - "afi":"ipv4", - "interfaceName":"eth-rt4-2", -- "active":true +- "active":true, +- "labels":[ +- 16050 +- ] + "interfaceName":"eth-sw1" } ] } +@@ -296,30 +189,13 @@ + { + "ip":"10.0.2.4", + "afi":"ipv4", +- "interfaceName":"eth-rt4-1", +- "backupIndex":[ +- 0 +- ] ++ "interfaceName":"eth-rt4-1" + }, + { + "ip":"10.0.3.4", + "afi":"ipv4", + "interfaceName":"eth-rt4-2", +- "active":true, +- "backupIndex":[ +- 0 +- ] +- } +- ], +- "backupNexthops":[ +- { +- "ip":"10.0.1.3", +- "afi":"ipv4", +- "interfaceName":"eth-sw1", +- "active":true, +- "labels":[ +- 16050 +- ] ++ "active":true + } + ] + } +@@ -335,29 +211,12 @@ + "ip":"10.0.2.4", + "afi":"ipv4", + "interfaceName":"eth-rt4-1", +- "active":true, +- "backupIndex":[ +- 0 +- ] ++ "active":true + }, + { + "ip":"10.0.3.4", + "afi":"ipv4", +- "interfaceName":"eth-rt4-2", +- "backupIndex":[ +- 0 +- ] +- } +- ], +- "backupNexthops":[ +- { +- "ip":"10.0.1.3", +- "afi":"ipv4", +- "interfaceName":"eth-sw1", +- "active":true, +- "labels":[ +- 16050 +- ] ++ "interfaceName":"eth-rt4-2" + } + ] + } +@@ -494,31 +353,14 @@ + "ip":"10.0.2.4", + "afi":"ipv4", + "interfaceName":"eth-rt4-1", +- "active":true, +- "backupIndex":[ +- 0 +- ] ++ "active":true + }, + { + "fib":true, + "ip":"10.0.3.4", + "afi":"ipv4", + "interfaceName":"eth-rt4-2", +- "active":true, +- "backupIndex":[ +- 0 +- ] +- } +- ], +- "backupNexthops":[ +- { +- "ip":"10.0.1.3", +- "afi":"ipv4", +- "interfaceName":"eth-sw1", +- "active":true, +- "labels":[ +- 16050 +- ] ++ "active":true + } + ] + } diff --git a/tests/topotests/isis-tilfa-topo1/rt2/step7/show_ipv6_route.ref.diff b/tests/topotests/isis-tilfa-topo1/rt2/step7/show_ipv6_route.ref.diff index 871fd98b7e..140c7b08bf 100644 --- a/tests/topotests/isis-tilfa-topo1/rt2/step7/show_ipv6_route.ref.diff +++ b/tests/topotests/isis-tilfa-topo1/rt2/step7/show_ipv6_route.ref.diff @@ -1,6 +1,6 @@ ---- rt2/step6/show_ipv6_route.ref 2020-08-31 22:42:48.835561429 -0300 -+++ rt2/step7/show_ipv6_route.ref 2020-08-31 22:42:48.835561429 -0300 -@@ -14,32 +14,10 @@ +--- rt2/step6/show_ipv6_route.ref 2020-09-25 17:51:16.549408319 -0300 ++++ rt2/step7/show_ipv6_route.ref 2020-09-25 17:52:03.438020851 -0300 +@@ -14,34 +14,10 @@ "afi":"ipv6", "interfaceName":"eth-sw1", "active":true, @@ -19,7 +19,8 @@ - "interfaceName":"eth-rt4-1", - "active":true, - "labels":[ -- 16051 +- 16051, +- 16011 - ] - }, - { @@ -27,13 +28,14 @@ - "interfaceName":"eth-rt4-2", - "active":true, - "labels":[ -- 16051 +- 16051, +- 16011 - ] - } ] } ], -@@ -58,32 +36,10 @@ +@@ -60,34 +36,10 @@ "afi":"ipv6", "interfaceName":"eth-sw1", "active":true, @@ -52,7 +54,8 @@ - "interfaceName":"eth-rt4-1", - "active":true, - "labels":[ -- 16051 +- 16051, +- 16031 - ] - }, - { @@ -60,16 +63,52 @@ - "interfaceName":"eth-rt4-2", - "active":true, - "labels":[ -- 16051 +- 16051, +- 16031 - ] - } ] } ], -@@ -132,28 +88,19 @@ - "fib":true, +@@ -106,9 +58,6 @@ + "afi":"ipv6", + "interfaceName":"eth-rt4-2", + "active":true, +- "backupIndex":[ +- 0 +- ], + "labels":[ + 3 + ] +@@ -118,24 +67,10 @@ "afi":"ipv6", "interfaceName":"eth-rt4-1", + "active":true, +- "backupIndex":[ +- 0 +- ], + "labels":[ + 3 + ] + } +- ], +- "backupNexthops":[ +- { +- "afi":"ipv6", +- "interfaceName":"eth-sw1", +- "active":true, +- "labels":[ +- 16051, +- 16041 +- ] +- } + ] + } + ], +@@ -153,28 +88,19 @@ + "fib":true, + "afi":"ipv6", + "interfaceName":"eth-sw1", - "active":true, - "labels":[ - 16051 @@ -79,7 +118,7 @@ { "fib":true, "afi":"ipv6", - "interfaceName":"eth-sw1", + "interfaceName":"eth-rt4-2", - "active":true, - "labels":[ - 16051 @@ -89,7 +128,7 @@ { "fib":true, "afi":"ipv6", - "interfaceName":"eth-rt4-2", + "interfaceName":"eth-rt4-1", - "active":true, - "labels":[ - 16051 diff --git a/tests/topotests/isis-tilfa-topo1/rt2/step7/show_mpls_table.ref.diff b/tests/topotests/isis-tilfa-topo1/rt2/step7/show_mpls_table.ref.diff index ad48c50f32..f8476cd0bb 100644 --- a/tests/topotests/isis-tilfa-topo1/rt2/step7/show_mpls_table.ref.diff +++ b/tests/topotests/isis-tilfa-topo1/rt2/step7/show_mpls_table.ref.diff @@ -1,5 +1,5 @@ ---- rt2/step6/show_mpls_table.ref 2020-08-31 22:42:48.835561429 -0300 -+++ rt2/step7/show_mpls_table.ref 2020-08-31 22:42:48.835561429 -0300 +--- rt2/step6/show_mpls_table.ref 2020-09-25 17:51:14.073375985 -0300 ++++ rt2/step7/show_mpls_table.ref 2020-09-25 17:52:00.973988653 -0300 @@ -7,23 +7,7 @@ "type":"SR (IS-IS)", "outLabel":3, @@ -100,10 +100,62 @@ } ] }, -@@ -147,54 +83,6 @@ +@@ -119,26 +55,13 @@ + "type":"SR (IS-IS)", + "outLabel":3, + "installed":true, +- "nexthop":"10.0.3.4", +- "backupIndex":[ +- 0 +- ] ++ "nexthop":"10.0.3.4" + }, + { + "type":"SR (IS-IS)", + "outLabel":3, + "installed":true, +- "nexthop":"10.0.2.4", +- "backupIndex":[ +- 0 +- ] +- } +- ], +- "backupNexthops":[ +- { +- "type":"SR (IS-IS)", +- "outLabel":16050, +- "nexthop":"10.0.1.3" ++ "nexthop":"10.0.2.4" } ] }, +@@ -150,74 +73,13 @@ + "type":"SR (IS-IS)", + "outLabel":3, + "installed":true, +- "interface":"eth-rt4-2", +- "backupIndex":[ +- 0 +- ] +- }, +- { +- "type":"SR (IS-IS)", +- "outLabel":3, +- "installed":true, +- "interface":"eth-rt4-1", +- "backupIndex":[ +- 0 +- ] +- } +- ], +- "backupNexthops":[ +- { +- "type":"SR (IS-IS)", +- "outLabel":16051, +- "interface":"eth-sw1" +- } +- ] +- }, - "16050":{ - "inLabel":16050, - "installed":true, @@ -136,22 +188,20 @@ - "type":"SR (IS-IS)", - "outLabel":16051, - "installed":true, -- "interface":"eth-rt4-2" -- }, -- { -- "type":"SR (IS-IS)", + "interface":"eth-rt4-2" + }, + { + "type":"SR (IS-IS)", - "outLabel":16051, -- "installed":true, -- "interface":"eth-rt4-1" ++ "outLabel":3, + "installed":true, + "interface":"eth-rt4-1" - }, - { - "type":"SR (IS-IS)", - "outLabel":16051, - "installed":true, - "interface":"eth-sw1" -- } -- ] -- }, - "16060":{ - "inLabel":16060, - "installed":true, + } + ] + }, diff --git a/tests/topotests/isis-tilfa-topo1/rt2/step8/show_ip_route.ref.diff b/tests/topotests/isis-tilfa-topo1/rt2/step8/show_ip_route.ref.diff index 3511a595c3..7d5237e740 100644 --- a/tests/topotests/isis-tilfa-topo1/rt2/step8/show_ip_route.ref.diff +++ b/tests/topotests/isis-tilfa-topo1/rt2/step8/show_ip_route.ref.diff @@ -1,6 +1,6 @@ ---- rt2/step7/show_ip_route.ref 2020-08-31 22:42:48.835561429 -0300 -+++ rt2/step8/show_ip_route.ref 2020-08-31 22:42:48.835561429 -0300 -@@ -15,10 +15,34 @@ +--- rt2/step7/show_ip_route.ref 2020-09-25 17:52:02.210004805 -0300 ++++ rt2/step8/show_ip_route.ref 2020-09-25 17:53:20.207024469 -0300 +@@ -15,10 +15,36 @@ "afi":"ipv4", "interfaceName":"eth-sw1", "active":true, @@ -20,7 +20,8 @@ + "interfaceName":"eth-rt4-1", + "active":true, + "labels":[ -+ 16050 ++ 16050, ++ 16010 + ] + }, + { @@ -29,13 +30,14 @@ + "interfaceName":"eth-rt4-2", + "active":true, + "labels":[ -+ 16050 ++ 16050, ++ 16010 + ] + } ] } ], -@@ -38,10 +62,34 @@ +@@ -38,10 +64,36 @@ "afi":"ipv4", "interfaceName":"eth-sw1", "active":true, @@ -55,7 +57,8 @@ + "interfaceName":"eth-rt4-1", + "active":true, + "labels":[ -+ 16050 ++ 16050, ++ 16030 + ] + }, + { @@ -64,13 +67,50 @@ + "interfaceName":"eth-rt4-2", + "active":true, + "labels":[ -+ 16050 ++ 16050, ++ 16030 + ] + } ] } ], -@@ -93,21 +141,30 @@ +@@ -61,6 +113,9 @@ + "afi":"ipv4", + "interfaceName":"eth-rt4-1", + "active":true, ++ "backupIndex":[ ++ 0 ++ ], + "labels":[ + 3 + ] +@@ -71,10 +126,25 @@ + "afi":"ipv4", + "interfaceName":"eth-rt4-2", + "active":true, ++ "backupIndex":[ ++ 0 ++ ], + "labels":[ + 3 + ] + } ++ ], ++ "backupNexthops":[ ++ { ++ "ip":"10.0.1.3", ++ "afi":"ipv4", ++ "interfaceName":"eth-sw1", ++ "active":true, ++ "labels":[ ++ 16050, ++ 16040 ++ ] ++ } + ] + } + ], +@@ -93,21 +163,30 @@ "ip":"10.0.1.3", "afi":"ipv4", "interfaceName":"eth-sw1", @@ -104,7 +144,7 @@ } ] } -@@ -155,12 +212,34 @@ +@@ -169,12 +248,40 @@ { "ip":"10.0.1.1", "afi":"ipv4", @@ -131,13 +171,118 @@ + "ip":"10.0.2.4", + "afi":"ipv4", + "interfaceName":"eth-rt4-1", -+ "active":true ++ "active":true, ++ "labels":[ ++ 16050 ++ ] + }, + { + "ip":"10.0.3.4", + "afi":"ipv4", + "interfaceName":"eth-rt4-2", -+ "active":true ++ "active":true, ++ "labels":[ ++ 16050 ++ ] + } + ] + } +@@ -189,13 +296,30 @@ + { + "ip":"10.0.2.4", + "afi":"ipv4", +- "interfaceName":"eth-rt4-1" ++ "interfaceName":"eth-rt4-1", ++ "backupIndex":[ ++ 0 ++ ] + }, + { + "ip":"10.0.3.4", + "afi":"ipv4", + "interfaceName":"eth-rt4-2", +- "active":true ++ "active":true, ++ "backupIndex":[ ++ 0 ++ ] ++ } ++ ], ++ "backupNexthops":[ ++ { ++ "ip":"10.0.1.3", ++ "afi":"ipv4", ++ "interfaceName":"eth-sw1", ++ "active":true, ++ "labels":[ ++ 16050 ++ ] + } + ] + } +@@ -211,12 +335,29 @@ + "ip":"10.0.2.4", + "afi":"ipv4", + "interfaceName":"eth-rt4-1", +- "active":true ++ "active":true, ++ "backupIndex":[ ++ 0 ++ ] + }, + { + "ip":"10.0.3.4", + "afi":"ipv4", +- "interfaceName":"eth-rt4-2" ++ "interfaceName":"eth-rt4-2", ++ "backupIndex":[ ++ 0 ++ ] ++ } ++ ], ++ "backupNexthops":[ ++ { ++ "ip":"10.0.1.3", ++ "afi":"ipv4", ++ "interfaceName":"eth-sw1", ++ "active":true, ++ "labels":[ ++ 16050 ++ ] + } + ] + } +@@ -353,14 +494,31 @@ + "ip":"10.0.2.4", + "afi":"ipv4", + "interfaceName":"eth-rt4-1", +- "active":true ++ "active":true, ++ "backupIndex":[ ++ 0 ++ ] + }, + { + "fib":true, + "ip":"10.0.3.4", + "afi":"ipv4", + "interfaceName":"eth-rt4-2", +- "active":true ++ "active":true, ++ "backupIndex":[ ++ 0 ++ ] ++ } ++ ], ++ "backupNexthops":[ ++ { ++ "ip":"10.0.1.3", ++ "afi":"ipv4", ++ "interfaceName":"eth-sw1", ++ "active":true, ++ "labels":[ ++ 16050 ++ ] } ] } diff --git a/tests/topotests/isis-tilfa-topo1/rt2/step8/show_ipv6_route.ref.diff b/tests/topotests/isis-tilfa-topo1/rt2/step8/show_ipv6_route.ref.diff index 96a60197ab..45322214e6 100644 --- a/tests/topotests/isis-tilfa-topo1/rt2/step8/show_ipv6_route.ref.diff +++ b/tests/topotests/isis-tilfa-topo1/rt2/step8/show_ipv6_route.ref.diff @@ -1,6 +1,6 @@ ---- rt2/step7/show_ipv6_route.ref 2020-08-31 22:42:48.835561429 -0300 -+++ rt2/step8/show_ipv6_route.ref 2020-08-31 22:42:48.835561429 -0300 -@@ -14,10 +14,32 @@ +--- rt2/step7/show_ipv6_route.ref 2020-09-25 17:52:03.438020851 -0300 ++++ rt2/step8/show_ipv6_route.ref 2020-09-25 17:53:21.443040633 -0300 +@@ -14,10 +14,34 @@ "afi":"ipv6", "interfaceName":"eth-sw1", "active":true, @@ -19,7 +19,8 @@ + "interfaceName":"eth-rt4-1", + "active":true, + "labels":[ -+ 16051 ++ 16051, ++ 16011 + ] + }, + { @@ -27,13 +28,14 @@ + "interfaceName":"eth-rt4-2", + "active":true, + "labels":[ -+ 16051 ++ 16051, ++ 16011 + ] + } ] } ], -@@ -36,10 +58,32 @@ +@@ -36,10 +60,34 @@ "afi":"ipv6", "interfaceName":"eth-sw1", "active":true, @@ -52,7 +54,8 @@ + "interfaceName":"eth-rt4-1", + "active":true, + "labels":[ -+ 16051 ++ 16051, ++ 16031 + ] + }, + { @@ -60,16 +63,52 @@ + "interfaceName":"eth-rt4-2", + "active":true, + "labels":[ -+ 16051 ++ 16051, ++ 16031 + ] + } ] } ], -@@ -88,19 +132,28 @@ - "fib":true, +@@ -58,6 +106,9 @@ + "afi":"ipv6", + "interfaceName":"eth-rt4-2", + "active":true, ++ "backupIndex":[ ++ 0 ++ ], + "labels":[ + 3 + ] +@@ -67,10 +118,24 @@ "afi":"ipv6", "interfaceName":"eth-rt4-1", + "active":true, ++ "backupIndex":[ ++ 0 ++ ], + "labels":[ + 3 + ] + } ++ ], ++ "backupNexthops":[ ++ { ++ "afi":"ipv6", ++ "interfaceName":"eth-sw1", ++ "active":true, ++ "labels":[ ++ 16051, ++ 16041 ++ ] ++ } + ] + } + ], +@@ -88,19 +153,28 @@ + "fib":true, + "afi":"ipv6", + "interfaceName":"eth-sw1", - "active":true + "active":true, + "labels":[ @@ -79,7 +118,7 @@ { "fib":true, "afi":"ipv6", - "interfaceName":"eth-sw1", + "interfaceName":"eth-rt4-2", - "active":true + "active":true, + "labels":[ @@ -89,7 +128,7 @@ { "fib":true, "afi":"ipv6", - "interfaceName":"eth-rt4-2", + "interfaceName":"eth-rt4-1", - "active":true + "active":true, + "labels":[ diff --git a/tests/topotests/isis-tilfa-topo1/rt2/step8/show_mpls_table.ref.diff b/tests/topotests/isis-tilfa-topo1/rt2/step8/show_mpls_table.ref.diff index 04b8e99725..083c647802 100644 --- a/tests/topotests/isis-tilfa-topo1/rt2/step8/show_mpls_table.ref.diff +++ b/tests/topotests/isis-tilfa-topo1/rt2/step8/show_mpls_table.ref.diff @@ -1,5 +1,5 @@ ---- rt2/step7/show_mpls_table.ref 2020-08-31 22:42:48.835561429 -0300 -+++ rt2/step8/show_mpls_table.ref 2020-08-31 22:42:48.835561429 -0300 +--- rt2/step7/show_mpls_table.ref 2020-09-25 17:52:00.973988653 -0300 ++++ rt2/step8/show_mpls_table.ref 2020-09-25 17:53:18.923007676 -0300 @@ -7,7 +7,23 @@ "type":"SR (IS-IS)", "outLabel":3, @@ -100,10 +100,63 @@ } ] }, -@@ -83,6 +147,54 @@ +@@ -55,13 +119,26 @@ + "type":"SR (IS-IS)", + "outLabel":3, + "installed":true, +- "nexthop":"10.0.3.4" ++ "nexthop":"10.0.3.4", ++ "backupIndex":[ ++ 0 ++ ] + }, + { + "type":"SR (IS-IS)", + "outLabel":3, + "installed":true, +- "nexthop":"10.0.2.4" ++ "nexthop":"10.0.2.4", ++ "backupIndex":[ ++ 0 ++ ] ++ } ++ ], ++ "backupNexthops":[ ++ { ++ "type":"SR (IS-IS)", ++ "outLabel":16050, ++ "nexthop":"10.0.1.3" } ] }, +@@ -73,13 +150,74 @@ + "type":"SR (IS-IS)", + "outLabel":3, + "installed":true, +- "interface":"eth-rt4-2" ++ "interface":"eth-rt4-2", ++ "backupIndex":[ ++ 0 ++ ] + }, + { + "type":"SR (IS-IS)", + "outLabel":3, + "installed":true, ++ "interface":"eth-rt4-1", ++ "backupIndex":[ ++ 0 ++ ] ++ } ++ ], ++ "backupNexthops":[ ++ { ++ "type":"SR (IS-IS)", ++ "outLabel":16051, ++ "interface":"eth-sw1" ++ } ++ ] ++ }, + "16050":{ + "inLabel":16050, + "installed":true, @@ -142,16 +195,13 @@ + "type":"SR (IS-IS)", + "outLabel":16051, + "installed":true, -+ "interface":"eth-rt4-1" + "interface":"eth-rt4-1" + }, + { + "type":"SR (IS-IS)", + "outLabel":16051, + "installed":true, + "interface":"eth-sw1" -+ } -+ ] -+ }, - "16060":{ - "inLabel":16060, - "installed":true, + } + ] + }, diff --git a/tests/topotests/isis-tilfa-topo1/rt2/step9/show_ip_route.ref.diff b/tests/topotests/isis-tilfa-topo1/rt2/step9/show_ip_route.ref.diff index b7deb80554..15370a0a62 100644 --- a/tests/topotests/isis-tilfa-topo1/rt2/step9/show_ip_route.ref.diff +++ b/tests/topotests/isis-tilfa-topo1/rt2/step9/show_ip_route.ref.diff @@ -1,15 +1,69 @@ ---- rt2/step8/show_ip_route.ref 2020-08-31 22:42:48.835561429 -0300 -+++ rt2/step9/show_ip_route.ref 2020-08-31 22:42:48.835561429 -0300 +--- rt2/step8/show_ip_route.ref 2020-09-25 17:53:20.207024469 -0300 ++++ rt2/step9/show_ip_route.ref 2020-09-25 17:54:37.908041089 -0300 @@ -31,7 +31,7 @@ "interfaceName":"eth-rt4-1", "active":true, "labels":[ +- 16050, ++ 16500, + 16010 + ] + }, +@@ -41,7 +41,7 @@ + "interfaceName":"eth-rt4-2", + "active":true, + "labels":[ +- 16050, ++ 16500, + 16010 + ] + } +@@ -80,7 +80,7 @@ + "interfaceName":"eth-rt4-1", + "active":true, + "labels":[ +- 16050, ++ 16500, + 16030 + ] + }, +@@ -90,7 +90,7 @@ + "interfaceName":"eth-rt4-2", + "active":true, + "labels":[ +- 16050, ++ 16500, + 16030 + ] + } +@@ -141,7 +141,7 @@ + "interfaceName":"eth-sw1", + "active":true, + "labels":[ +- 16050, ++ 16500, + 16040 + ] + } +@@ -165,7 +165,7 @@ + "interfaceName":"eth-sw1", + "active":true, + "labels":[ - 16050 + 16500 ] }, { -@@ -40,7 +40,7 @@ +@@ -175,7 +175,7 @@ + "interfaceName":"eth-rt4-1", + "active":true, + "labels":[ +- 16050 ++ 16500 + ] + }, + { +@@ -185,7 +185,7 @@ "interfaceName":"eth-rt4-2", "active":true, "labels":[ @@ -18,7 +72,7 @@ ] } ] -@@ -78,7 +78,7 @@ +@@ -271,7 +271,7 @@ "interfaceName":"eth-rt4-1", "active":true, "labels":[ @@ -27,7 +81,7 @@ ] }, { -@@ -87,7 +87,7 @@ +@@ -280,7 +280,7 @@ "interfaceName":"eth-rt4-2", "active":true, "labels":[ @@ -36,26 +90,26 @@ ] } ] -@@ -143,7 +143,7 @@ +@@ -318,7 +318,7 @@ "interfaceName":"eth-sw1", "active":true, "labels":[ - 16050 + 16500 ] - }, - { -@@ -153,7 +153,7 @@ - "interfaceName":"eth-rt4-1", + } + ] +@@ -356,7 +356,7 @@ + "interfaceName":"eth-sw1", "active":true, "labels":[ - 16050 + 16500 ] - }, - { -@@ -163,7 +163,7 @@ - "interfaceName":"eth-rt4-2", + } + ] +@@ -517,7 +517,7 @@ + "interfaceName":"eth-sw1", "active":true, "labels":[ - 16050 diff --git a/tests/topotests/isis-tilfa-topo1/rt2/step9/show_ipv6_route.ref.diff b/tests/topotests/isis-tilfa-topo1/rt2/step9/show_ipv6_route.ref.diff index cd634af4e6..2585f32595 100644 --- a/tests/topotests/isis-tilfa-topo1/rt2/step9/show_ipv6_route.ref.diff +++ b/tests/topotests/isis-tilfa-topo1/rt2/step9/show_ipv6_route.ref.diff @@ -1,43 +1,52 @@ ---- rt2/step8/show_ipv6_route.ref 2020-08-31 22:42:48.835561429 -0300 -+++ rt2/step9/show_ipv6_route.ref 2020-08-31 22:42:48.835561429 -0300 +--- rt2/step8/show_ipv6_route.ref 2020-09-25 17:53:21.443040633 -0300 ++++ rt2/step9/show_ipv6_route.ref 2020-09-25 17:54:39.112056848 -0300 @@ -29,7 +29,7 @@ "interfaceName":"eth-rt4-1", "active":true, "labels":[ -- 16051 -+ 16501 +- 16051, ++ 16501, + 16011 ] }, - { -@@ -37,7 +37,7 @@ +@@ -38,7 +38,7 @@ "interfaceName":"eth-rt4-2", "active":true, "labels":[ -- 16051 -+ 16501 +- 16051, ++ 16501, + 16011 ] } - ] -@@ -73,7 +73,7 @@ +@@ -75,7 +75,7 @@ "interfaceName":"eth-rt4-1", "active":true, "labels":[ -- 16051 -+ 16501 +- 16051, ++ 16501, + 16031 ] }, - { -@@ -81,7 +81,7 @@ +@@ -84,7 +84,7 @@ "interfaceName":"eth-rt4-2", "active":true, "labels":[ -- 16051 -+ 16501 +- 16051, ++ 16501, + 16031 ] } - ] -@@ -134,7 +134,7 @@ - "interfaceName":"eth-rt4-1", +@@ -132,7 +132,7 @@ + "interfaceName":"eth-sw1", + "active":true, + "labels":[ +- 16051, ++ 16501, + 16041 + ] + } +@@ -155,7 +155,7 @@ + "interfaceName":"eth-sw1", "active":true, "labels":[ - 16051 @@ -45,8 +54,8 @@ ] }, { -@@ -143,7 +143,7 @@ - "interfaceName":"eth-sw1", +@@ -164,7 +164,7 @@ + "interfaceName":"eth-rt4-2", "active":true, "labels":[ - 16051 @@ -54,8 +63,8 @@ ] }, { -@@ -152,7 +152,7 @@ - "interfaceName":"eth-rt4-2", +@@ -173,7 +173,7 @@ + "interfaceName":"eth-rt4-1", "active":true, "labels":[ - 16051 diff --git a/tests/topotests/isis-tilfa-topo1/rt2/step9/show_mpls_table.ref.diff b/tests/topotests/isis-tilfa-topo1/rt2/step9/show_mpls_table.ref.diff index f195264f5a..b90b889eba 100644 --- a/tests/topotests/isis-tilfa-topo1/rt2/step9/show_mpls_table.ref.diff +++ b/tests/topotests/isis-tilfa-topo1/rt2/step9/show_mpls_table.ref.diff @@ -1,5 +1,5 @@ ---- rt2/step8/show_mpls_table.ref 2020-08-31 22:42:48.835561429 -0300 -+++ rt2/step9/show_mpls_table.ref 2020-08-31 22:42:48.835561429 -0300 +--- rt2/step8/show_mpls_table.ref 2020-09-25 17:53:18.923007676 -0300 ++++ rt2/step9/show_mpls_table.ref 2020-09-25 17:54:36.640024493 -0300 @@ -17,12 +17,12 @@ "backupNexthops":[ { @@ -60,119 +60,123 @@ "interface":"eth-rt4-2" } ] -@@ -147,87 +147,87 @@ - } - ] - }, -- "16050":{ -- "inLabel":16050, -+ "16060":{ -+ "inLabel":16060, - "installed":true, - "nexthops":[ +@@ -137,7 +137,7 @@ + "backupNexthops":[ { "type":"SR (IS-IS)", - "outLabel":16050, -+ "outLabel":16060, - "installed":true, - "nexthop":"10.0.3.4" - }, ++ "outLabel":16500, + "nexthop":"10.0.1.3" + } + ] +@@ -168,55 +168,7 @@ + "backupNexthops":[ { "type":"SR (IS-IS)", +- "outLabel":16051, +- "interface":"eth-sw1" +- } +- ] +- }, +- "16050":{ +- "inLabel":16050, +- "installed":true, +- "nexthops":[ +- { +- "type":"SR (IS-IS)", - "outLabel":16050, -+ "outLabel":16060, - "installed":true, - "nexthop":"10.0.2.4" +- "installed":true, +- "nexthop":"10.0.3.4" +- }, +- { +- "type":"SR (IS-IS)", +- "outLabel":16050, +- "installed":true, +- "nexthop":"10.0.2.4" - }, - { - "type":"SR (IS-IS)", - "outLabel":16050, - "installed":true, - "nexthop":"10.0.1.3" - } - ] - }, +- } +- ] +- }, - "16051":{ - "inLabel":16051, -+ "16061":{ -+ "inLabel":16061, - "installed":true, - "nexthops":[ - { - "type":"SR (IS-IS)", +- "installed":true, +- "nexthops":[ +- { +- "type":"SR (IS-IS)", - "outLabel":16051, -+ "outLabel":16061, - "installed":true, - "interface":"eth-rt4-2" - }, - { - "type":"SR (IS-IS)", +- "installed":true, +- "interface":"eth-rt4-2" +- }, +- { +- "type":"SR (IS-IS)", - "outLabel":16051, -+ "outLabel":16061, - "installed":true, - "interface":"eth-rt4-1" +- "installed":true, +- "interface":"eth-rt4-1" - }, - { - "type":"SR (IS-IS)", - "outLabel":16051, - "installed":true, -- "interface":"eth-sw1" ++ "outLabel":16501, + "interface":"eth-sw1" + } + ] +@@ -282,5 +234,53 @@ + "interface":"eth-sw1" } ] - }, -- "16060":{ -- "inLabel":16060, ++ }, + "16500":{ + "inLabel":16500, - "installed":true, - "nexthops":[ - { - "type":"SR (IS-IS)", -- "outLabel":16060, ++ "installed":true, ++ "nexthops":[ ++ { ++ "type":"SR (IS-IS)", + "outLabel":16500, - "installed":true, - "nexthop":"10.0.3.4" - }, - { - "type":"SR (IS-IS)", -- "outLabel":16060, ++ "installed":true, ++ "nexthop":"10.0.3.4" ++ }, ++ { ++ "type":"SR (IS-IS)", + "outLabel":16500, - "installed":true, - "nexthop":"10.0.2.4" ++ "installed":true, ++ "nexthop":"10.0.2.4" + }, + { + "type":"SR (IS-IS)", + "outLabel":16500, + "installed":true, + "nexthop":"10.0.1.3" - } - ] - }, -- "16061":{ -- "inLabel":16061, ++ } ++ ] ++ }, + "16501":{ + "inLabel":16501, - "installed":true, - "nexthops":[ - { - "type":"SR (IS-IS)", -- "outLabel":16061, ++ "installed":true, ++ "nexthops":[ ++ { ++ "type":"SR (IS-IS)", + "outLabel":16501, - "installed":true, - "interface":"eth-rt4-2" - }, - { - "type":"SR (IS-IS)", -- "outLabel":16061, ++ "installed":true, ++ "interface":"eth-rt4-2" ++ }, ++ { ++ "type":"SR (IS-IS)", + "outLabel":16501, - "installed":true, - "interface":"eth-rt4-1" ++ "installed":true, ++ "interface":"eth-rt4-1" + }, + { + "type":"SR (IS-IS)", + "outLabel":16501, + "installed":true, + "interface":"eth-sw1" - } - ] ++ } ++ ] } + } diff --git a/tests/topotests/isis-tilfa-topo1/rt3/step1/show_ip_route.ref b/tests/topotests/isis-tilfa-topo1/rt3/step1/show_ip_route.ref index 5a4e1ce033..8c37180daf 100644 --- a/tests/topotests/isis-tilfa-topo1/rt3/step1/show_ip_route.ref +++ b/tests/topotests/isis-tilfa-topo1/rt3/step1/show_ip_route.ref @@ -26,21 +26,23 @@ ], "backupNexthops":[ { - "ip":"10.0.5.5", + "ip":"10.0.4.5", "afi":"ipv4", - "interfaceName":"eth-rt5-2", + "interfaceName":"eth-rt5-1", "active":true, "labels":[ - 16040 + 16040, + 16010 ] }, { - "ip":"10.0.4.5", + "ip":"10.0.5.5", "afi":"ipv4", - "interfaceName":"eth-rt5-1", + "interfaceName":"eth-rt5-2", "active":true, "labels":[ - 16040 + 16040, + 16010 ] } ] @@ -73,21 +75,23 @@ ], "backupNexthops":[ { - "ip":"10.0.5.5", + "ip":"10.0.4.5", "afi":"ipv4", - "interfaceName":"eth-rt5-2", + "interfaceName":"eth-rt5-1", "active":true, "labels":[ - 16040 + 16040, + 16020 ] }, { - "ip":"10.0.4.5", + "ip":"10.0.5.5", "afi":"ipv4", - "interfaceName":"eth-rt5-1", + "interfaceName":"eth-rt5-2", "active":true, "labels":[ - 16040 + 16040, + 16020 ] } ] @@ -152,6 +156,9 @@ "afi":"ipv4", "interfaceName":"eth-rt5-1", "active":true, + "backupIndex":[ + 0 + ], "labels":[ 3 ] @@ -162,10 +169,25 @@ "afi":"ipv4", "interfaceName":"eth-rt5-2", "active":true, + "backupIndex":[ + 0 + ], "labels":[ 3 ] } + ], + "backupNexthops":[ + { + "ip":"10.0.1.2", + "afi":"ipv4", + "interfaceName":"eth-sw1", + "active":true, + "labels":[ + 16040, + 16050 + ] + } ] } ], @@ -185,6 +207,9 @@ "afi":"ipv4", "interfaceName":"eth-rt5-1", "active":true, + "backupIndex":[ + 0 + ], "labels":[ 16060 ] @@ -195,10 +220,21 @@ "afi":"ipv4", "interfaceName":"eth-rt5-2", "active":true, + "backupIndex":[ + 0 + ], "labels":[ 16060 ] } + ], + "backupNexthops":[ + { + "ip":"10.0.1.2", + "afi":"ipv4", + "interfaceName":"eth-sw1", + "active":true + } ] } ], @@ -230,16 +266,22 @@ ], "backupNexthops":[ { - "ip":"10.0.5.5", + "ip":"10.0.4.5", "afi":"ipv4", - "interfaceName":"eth-rt5-2", - "active":true + "interfaceName":"eth-rt5-1", + "active":true, + "labels":[ + 16040 + ] }, { - "ip":"10.0.4.5", + "ip":"10.0.5.5", "afi":"ipv4", - "interfaceName":"eth-rt5-1", - "active":true + "interfaceName":"eth-rt5-2", + "active":true, + "labels":[ + 16040 + ] } ] } @@ -268,15 +310,15 @@ ], "backupNexthops":[ { - "ip":"10.0.5.5", + "ip":"10.0.4.5", "afi":"ipv4", - "interfaceName":"eth-rt5-2", + "interfaceName":"eth-rt5-1", "active":true }, { - "ip":"10.0.4.5", + "ip":"10.0.5.5", "afi":"ipv4", - "interfaceName":"eth-rt5-1", + "interfaceName":"eth-rt5-2", "active":true } ] @@ -306,15 +348,15 @@ ], "backupNexthops":[ { - "ip":"10.0.5.5", + "ip":"10.0.4.5", "afi":"ipv4", - "interfaceName":"eth-rt5-2", + "interfaceName":"eth-rt5-1", "active":true }, { - "ip":"10.0.4.5", + "ip":"10.0.5.5", "afi":"ipv4", - "interfaceName":"eth-rt5-1", + "interfaceName":"eth-rt5-2", "active":true } ] @@ -330,13 +372,30 @@ { "ip":"10.0.4.5", "afi":"ipv4", - "interfaceName":"eth-rt5-1" + "interfaceName":"eth-rt5-1", + "backupIndex":[ + 0 + ] }, { "ip":"10.0.5.5", "afi":"ipv4", "interfaceName":"eth-rt5-2", - "active":true + "active":true, + "backupIndex":[ + 0 + ] + } + ], + "backupNexthops":[ + { + "ip":"10.0.1.2", + "afi":"ipv4", + "interfaceName":"eth-sw1", + "active":true, + "labels":[ + 16040 + ] } ] } @@ -352,12 +411,29 @@ "ip":"10.0.4.5", "afi":"ipv4", "interfaceName":"eth-rt5-1", - "active":true + "active":true, + "backupIndex":[ + 0 + ] }, { "ip":"10.0.5.5", "afi":"ipv4", - "interfaceName":"eth-rt5-2" + "interfaceName":"eth-rt5-2", + "backupIndex":[ + 0 + ] + } + ], + "backupNexthops":[ + { + "ip":"10.0.1.2", + "afi":"ipv4", + "interfaceName":"eth-sw1", + "active":true, + "labels":[ + 16040 + ] } ] } @@ -377,13 +453,27 @@ "ip":"10.0.4.5", "afi":"ipv4", "interfaceName":"eth-rt5-1", - "active":true + "active":true, + "backupIndex":[ + 0 + ] }, { "fib":true, "ip":"10.0.5.5", "afi":"ipv4", "interfaceName":"eth-rt5-2", + "active":true, + "backupIndex":[ + 0 + ] + } + ], + "backupNexthops":[ + { + "ip":"10.0.1.2", + "afi":"ipv4", + "interfaceName":"eth-sw1", "active":true } ] @@ -438,14 +528,31 @@ "ip":"10.0.4.5", "afi":"ipv4", "interfaceName":"eth-rt5-1", - "active":true + "active":true, + "backupIndex":[ + 0 + ] }, { "fib":true, "ip":"10.0.5.5", "afi":"ipv4", "interfaceName":"eth-rt5-2", - "active":true + "active":true, + "backupIndex":[ + 0 + ] + } + ], + "backupNexthops":[ + { + "ip":"10.0.1.2", + "afi":"ipv4", + "interfaceName":"eth-sw1", + "active":true, + "labels":[ + 16040 + ] } ] } diff --git a/tests/topotests/isis-tilfa-topo1/rt3/step1/show_ipv6_route.ref b/tests/topotests/isis-tilfa-topo1/rt3/step1/show_ipv6_route.ref index 525a87f31d..5ddb24af5a 100644 --- a/tests/topotests/isis-tilfa-topo1/rt3/step1/show_ipv6_route.ref +++ b/tests/topotests/isis-tilfa-topo1/rt3/step1/show_ipv6_route.ref @@ -26,18 +26,20 @@ "backupNexthops":[ { "afi":"ipv6", - "interfaceName":"eth-rt5-2", + "interfaceName":"eth-rt5-1", "active":true, "labels":[ - 16041 + 16041, + 16011 ] }, { "afi":"ipv6", - "interfaceName":"eth-rt5-1", + "interfaceName":"eth-rt5-2", "active":true, "labels":[ - 16041 + 16041, + 16011 ] } ] @@ -70,18 +72,20 @@ "backupNexthops":[ { "afi":"ipv6", - "interfaceName":"eth-rt5-2", + "interfaceName":"eth-rt5-1", "active":true, "labels":[ - 16041 + 16041, + 16021 ] }, { "afi":"ipv6", - "interfaceName":"eth-rt5-1", + "interfaceName":"eth-rt5-2", "active":true, "labels":[ - 16041 + 16041, + 16021 ] } ] @@ -100,7 +104,7 @@ { "fib":true, "afi":"ipv6", - "interfaceName":"eth-rt5-2", + "interfaceName":"eth-sw1", "active":true, "labels":[ 16041 @@ -109,7 +113,7 @@ { "fib":true, "afi":"ipv6", - "interfaceName":"eth-rt5-1", + "interfaceName":"eth-rt5-2", "active":true, "labels":[ 16041 @@ -118,7 +122,7 @@ { "fib":true, "afi":"ipv6", - "interfaceName":"eth-sw1", + "interfaceName":"eth-rt5-1", "active":true, "labels":[ 16041 @@ -142,6 +146,9 @@ "afi":"ipv6", "interfaceName":"eth-rt5-2", "active":true, + "backupIndex":[ + 0 + ], "labels":[ 3 ] @@ -151,10 +158,24 @@ "afi":"ipv6", "interfaceName":"eth-rt5-1", "active":true, + "backupIndex":[ + 0 + ], "labels":[ 3 ] } + ], + "backupNexthops":[ + { + "afi":"ipv6", + "interfaceName":"eth-sw1", + "active":true, + "labels":[ + 16041, + 16051 + ] + } ] } ], @@ -173,6 +194,9 @@ "afi":"ipv6", "interfaceName":"eth-rt5-2", "active":true, + "backupIndex":[ + 0 + ], "labels":[ 16061 ] @@ -182,10 +206,20 @@ "afi":"ipv6", "interfaceName":"eth-rt5-1", "active":true, + "backupIndex":[ + 0 + ], "labels":[ 16061 ] } + ], + "backupNexthops":[ + { + "afi":"ipv6", + "interfaceName":"eth-sw1", + "active":true + } ] } ] diff --git a/tests/topotests/isis-tilfa-topo1/rt3/step1/show_mpls_table.ref b/tests/topotests/isis-tilfa-topo1/rt3/step1/show_mpls_table.ref index 13f5f2c703..f68d1f4244 100644 --- a/tests/topotests/isis-tilfa-topo1/rt3/step1/show_mpls_table.ref +++ b/tests/topotests/isis-tilfa-topo1/rt3/step1/show_mpls_table.ref @@ -18,12 +18,12 @@ { "type":"SR (IS-IS)", "outLabel":16040, - "nexthop":"10.0.5.5" + "nexthop":"10.0.4.5" }, { "type":"SR (IS-IS)", "outLabel":16040, - "nexthop":"10.0.4.5" + "nexthop":"10.0.5.5" } ] }, @@ -46,12 +46,12 @@ { "type":"SR (IS-IS)", "outLabel":16041, - "interface":"eth-rt5-2" + "interface":"eth-rt5-1" }, { "type":"SR (IS-IS)", "outLabel":16041, - "interface":"eth-rt5-1" + "interface":"eth-rt5-2" } ] }, @@ -74,12 +74,12 @@ { "type":"SR (IS-IS)", "outLabel":16040, - "nexthop":"10.0.5.5" + "nexthop":"10.0.4.5" }, { "type":"SR (IS-IS)", "outLabel":16040, - "nexthop":"10.0.4.5" + "nexthop":"10.0.5.5" } ] }, @@ -102,12 +102,12 @@ { "type":"SR (IS-IS)", "outLabel":16041, - "interface":"eth-rt5-2" + "interface":"eth-rt5-1" }, { "type":"SR (IS-IS)", "outLabel":16041, - "interface":"eth-rt5-1" + "interface":"eth-rt5-2" } ] }, @@ -119,7 +119,7 @@ "type":"SR (IS-IS)", "outLabel":16040, "installed":true, - "nexthop":"10.0.1.2" + "nexthop":"10.0.5.5" }, { "type":"SR (IS-IS)", @@ -131,7 +131,7 @@ "type":"SR (IS-IS)", "outLabel":16040, "installed":true, - "nexthop":"10.0.5.5" + "nexthop":"10.0.1.2" } ] }, @@ -143,7 +143,7 @@ "type":"SR (IS-IS)", "outLabel":16041, "installed":true, - "interface":"eth-sw1" + "interface":"eth-rt5-2" }, { "type":"SR (IS-IS)", @@ -155,7 +155,7 @@ "type":"SR (IS-IS)", "outLabel":16041, "installed":true, - "interface":"eth-rt5-2" + "interface":"eth-sw1" } ] }, @@ -167,13 +167,26 @@ "type":"SR (IS-IS)", "outLabel":3, "installed":true, - "nexthop":"10.0.4.5" + "nexthop":"10.0.5.5", + "backupIndex":[ + 0 + ] }, { "type":"SR (IS-IS)", "outLabel":3, "installed":true, - "nexthop":"10.0.5.5" + "nexthop":"10.0.4.5", + "backupIndex":[ + 0 + ] + } + ], + "backupNexthops":[ + { + "type":"SR (IS-IS)", + "outLabel":16040, + "nexthop":"10.0.1.2" } ] }, @@ -185,13 +198,26 @@ "type":"SR (IS-IS)", "outLabel":3, "installed":true, - "interface":"eth-rt5-1" + "interface":"eth-rt5-2", + "backupIndex":[ + 0 + ] }, { "type":"SR (IS-IS)", "outLabel":3, "installed":true, - "interface":"eth-rt5-2" + "interface":"eth-rt5-1", + "backupIndex":[ + 0 + ] + } + ], + "backupNexthops":[ + { + "type":"SR (IS-IS)", + "outLabel":16041, + "interface":"eth-sw1" } ] }, @@ -203,13 +229,26 @@ "type":"SR (IS-IS)", "outLabel":16060, "installed":true, - "nexthop":"10.0.4.5" + "nexthop":"10.0.5.5", + "backupIndex":[ + 0 + ] }, { "type":"SR (IS-IS)", "outLabel":16060, "installed":true, - "nexthop":"10.0.5.5" + "nexthop":"10.0.4.5", + "backupIndex":[ + 0 + ] + } + ], + "backupNexthops":[ + { + "type":"SR (IS-IS)", + "outLabel":3, + "nexthop":"10.0.1.2" } ] }, @@ -221,13 +260,26 @@ "type":"SR (IS-IS)", "outLabel":16061, "installed":true, - "interface":"eth-rt5-1" + "interface":"eth-rt5-2", + "backupIndex":[ + 0 + ] }, { "type":"SR (IS-IS)", "outLabel":16061, "installed":true, - "interface":"eth-rt5-2" + "interface":"eth-rt5-1", + "backupIndex":[ + 0 + ] + } + ], + "backupNexthops":[ + { + "type":"SR (IS-IS)", + "outLabel":3, + "interface":"eth-sw1" } ] } diff --git a/tests/topotests/isis-tilfa-topo1/rt3/step4/show_ip_route.ref.diff b/tests/topotests/isis-tilfa-topo1/rt3/step4/show_ip_route.ref.diff index e5fe6e7589..707f95495d 100644 --- a/tests/topotests/isis-tilfa-topo1/rt3/step4/show_ip_route.ref.diff +++ b/tests/topotests/isis-tilfa-topo1/rt3/step4/show_ip_route.ref.diff @@ -1,6 +1,6 @@ ---- rt3/step3/show_ip_route.ref 2020-08-31 22:42:48.835561429 -0300 -+++ rt3/step4/show_ip_route.ref 2020-08-31 22:42:48.839561398 -0300 -@@ -15,34 +15,10 @@ +--- rt3/step3/show_ip_route.ref 2020-09-25 17:48:05.506916984 -0300 ++++ rt3/step4/show_ip_route.ref 2020-09-25 17:49:01.963652403 -0300 +@@ -15,36 +15,10 @@ "afi":"ipv4", "interfaceName":"eth-sw1", "active":true, @@ -15,27 +15,29 @@ - ], - "backupNexthops":[ - { -- "ip":"10.0.5.5", +- "ip":"10.0.4.5", - "afi":"ipv4", -- "interfaceName":"eth-rt5-2", +- "interfaceName":"eth-rt5-1", - "active":true, - "labels":[ -- 16040 +- 16040, +- 16010 - ] - }, - { -- "ip":"10.0.4.5", +- "ip":"10.0.5.5", - "afi":"ipv4", -- "interfaceName":"eth-rt5-1", +- "interfaceName":"eth-rt5-2", - "active":true, - "labels":[ -- 16040 +- 16040, +- 16010 - ] - } ] } ], -@@ -62,34 +38,10 @@ +@@ -64,36 +38,10 @@ "afi":"ipv4", "interfaceName":"eth-sw1", "active":true, @@ -50,27 +52,29 @@ - ], - "backupNexthops":[ - { -- "ip":"10.0.5.5", +- "ip":"10.0.4.5", - "afi":"ipv4", -- "interfaceName":"eth-rt5-2", +- "interfaceName":"eth-rt5-1", - "active":true, - "labels":[ -- 16040 +- 16040, +- 16020 - ] - }, - { -- "ip":"10.0.4.5", +- "ip":"10.0.5.5", - "afi":"ipv4", -- "interfaceName":"eth-rt5-1", +- "interfaceName":"eth-rt5-2", - "active":true, - "labels":[ -- 16040 +- 16040, +- 16020 - ] - } ] } ], -@@ -108,30 +60,21 @@ +@@ -112,30 +60,21 @@ "ip":"10.0.1.2", "afi":"ipv4", "interfaceName":"eth-sw1", @@ -104,7 +108,43 @@ } ] } -@@ -212,34 +155,12 @@ +@@ -156,9 +95,6 @@ + "afi":"ipv4", + "interfaceName":"eth-rt5-1", + "active":true, +- "backupIndex":[ +- 0 +- ], + "labels":[ + 3 + ] +@@ -169,25 +105,10 @@ + "afi":"ipv4", + "interfaceName":"eth-rt5-2", + "active":true, +- "backupIndex":[ +- 0 +- ], + "labels":[ + 3 + ] + } +- ], +- "backupNexthops":[ +- { +- "ip":"10.0.1.2", +- "afi":"ipv4", +- "interfaceName":"eth-sw1", +- "active":true, +- "labels":[ +- 16040, +- 16050 +- ] +- } + ] + } + ], +@@ -248,40 +169,12 @@ { "ip":"10.0.1.1", "afi":"ipv4", @@ -127,17 +167,122 @@ - ], - "backupNexthops":[ - { -- "ip":"10.0.5.5", +- "ip":"10.0.4.5", - "afi":"ipv4", -- "interfaceName":"eth-rt5-2", -- "active":true +- "interfaceName":"eth-rt5-1", +- "active":true, +- "labels":[ +- 16040 +- ] - }, - { -- "ip":"10.0.4.5", +- "ip":"10.0.5.5", - "afi":"ipv4", -- "interfaceName":"eth-rt5-1", -- "active":true +- "interfaceName":"eth-rt5-2", +- "active":true, +- "labels":[ +- 16040 +- ] + "interfaceName":"eth-sw1" } ] } +@@ -372,30 +265,13 @@ + { + "ip":"10.0.4.5", + "afi":"ipv4", +- "interfaceName":"eth-rt5-1", +- "backupIndex":[ +- 0 +- ] ++ "interfaceName":"eth-rt5-1" + }, + { + "ip":"10.0.5.5", + "afi":"ipv4", + "interfaceName":"eth-rt5-2", +- "active":true, +- "backupIndex":[ +- 0 +- ] +- } +- ], +- "backupNexthops":[ +- { +- "ip":"10.0.1.2", +- "afi":"ipv4", +- "interfaceName":"eth-sw1", +- "active":true, +- "labels":[ +- 16040 +- ] ++ "active":true + } + ] + } +@@ -411,29 +287,12 @@ + "ip":"10.0.4.5", + "afi":"ipv4", + "interfaceName":"eth-rt5-1", +- "active":true, +- "backupIndex":[ +- 0 +- ] ++ "active":true + }, + { + "ip":"10.0.5.5", + "afi":"ipv4", +- "interfaceName":"eth-rt5-2", +- "backupIndex":[ +- 0 +- ] +- } +- ], +- "backupNexthops":[ +- { +- "ip":"10.0.1.2", +- "afi":"ipv4", +- "interfaceName":"eth-sw1", +- "active":true, +- "labels":[ +- 16040 +- ] ++ "interfaceName":"eth-rt5-2" + } + ] + } +@@ -528,31 +387,14 @@ + "ip":"10.0.4.5", + "afi":"ipv4", + "interfaceName":"eth-rt5-1", +- "active":true, +- "backupIndex":[ +- 0 +- ] ++ "active":true + }, + { + "fib":true, + "ip":"10.0.5.5", + "afi":"ipv4", + "interfaceName":"eth-rt5-2", +- "active":true, +- "backupIndex":[ +- 0 +- ] +- } +- ], +- "backupNexthops":[ +- { +- "ip":"10.0.1.2", +- "afi":"ipv4", +- "interfaceName":"eth-sw1", +- "active":true, +- "labels":[ +- 16040 +- ] ++ "active":true + } + ] + } diff --git a/tests/topotests/isis-tilfa-topo1/rt3/step4/show_ipv6_route.ref.diff b/tests/topotests/isis-tilfa-topo1/rt3/step4/show_ipv6_route.ref.diff index ccfbbeae69..76d0ebc913 100644 --- a/tests/topotests/isis-tilfa-topo1/rt3/step4/show_ipv6_route.ref.diff +++ b/tests/topotests/isis-tilfa-topo1/rt3/step4/show_ipv6_route.ref.diff @@ -1,6 +1,6 @@ ---- rt3/step3/show_ipv6_route.ref 2020-08-31 22:42:48.835561429 -0300 -+++ rt3/step4/show_ipv6_route.ref 2020-08-31 22:42:48.839561398 -0300 -@@ -14,32 +14,10 @@ +--- rt3/step3/show_ipv6_route.ref 2020-09-25 17:48:06.790933702 -0300 ++++ rt3/step4/show_ipv6_route.ref 2020-09-25 17:49:03.199668512 -0300 +@@ -14,34 +14,10 @@ "afi":"ipv6", "interfaceName":"eth-sw1", "active":true, @@ -16,24 +16,26 @@ - "backupNexthops":[ - { - "afi":"ipv6", -- "interfaceName":"eth-rt5-2", +- "interfaceName":"eth-rt5-1", - "active":true, - "labels":[ -- 16041 +- 16041, +- 16011 - ] - }, - { - "afi":"ipv6", -- "interfaceName":"eth-rt5-1", +- "interfaceName":"eth-rt5-2", - "active":true, - "labels":[ -- 16041 +- 16041, +- 16011 - ] - } ] } ], -@@ -58,32 +36,10 @@ +@@ -60,34 +36,10 @@ "afi":"ipv6", "interfaceName":"eth-sw1", "active":true, @@ -49,27 +51,29 @@ - "backupNexthops":[ - { - "afi":"ipv6", -- "interfaceName":"eth-rt5-2", +- "interfaceName":"eth-rt5-1", - "active":true, - "labels":[ -- 16041 +- 16041, +- 16021 - ] - }, - { - "afi":"ipv6", -- "interfaceName":"eth-rt5-1", +- "interfaceName":"eth-rt5-2", - "active":true, - "labels":[ -- 16041 +- 16041, +- 16021 - ] - } ] } ], -@@ -101,28 +57,19 @@ +@@ -105,28 +57,19 @@ "fib":true, "afi":"ipv6", - "interfaceName":"eth-rt5-2", + "interfaceName":"eth-sw1", - "active":true, - "labels":[ - 16041 @@ -79,7 +83,7 @@ { "fib":true, "afi":"ipv6", - "interfaceName":"eth-rt5-1", + "interfaceName":"eth-rt5-2", - "active":true, - "labels":[ - 16041 @@ -89,7 +93,7 @@ { "fib":true, "afi":"ipv6", - "interfaceName":"eth-sw1", + "interfaceName":"eth-rt5-1", - "active":true, - "labels":[ - 16041 @@ -98,3 +102,38 @@ } ] } +@@ -146,9 +89,6 @@ + "afi":"ipv6", + "interfaceName":"eth-rt5-2", + "active":true, +- "backupIndex":[ +- 0 +- ], + "labels":[ + 3 + ] +@@ -158,24 +98,10 @@ + "afi":"ipv6", + "interfaceName":"eth-rt5-1", + "active":true, +- "backupIndex":[ +- 0 +- ], + "labels":[ + 3 + ] + } +- ], +- "backupNexthops":[ +- { +- "afi":"ipv6", +- "interfaceName":"eth-sw1", +- "active":true, +- "labels":[ +- 16041, +- 16051 +- ] +- } + ] + } + ], diff --git a/tests/topotests/isis-tilfa-topo1/rt3/step4/show_mpls_table.ref.diff b/tests/topotests/isis-tilfa-topo1/rt3/step4/show_mpls_table.ref.diff index 64a8689a82..b888c9d273 100644 --- a/tests/topotests/isis-tilfa-topo1/rt3/step4/show_mpls_table.ref.diff +++ b/tests/topotests/isis-tilfa-topo1/rt3/step4/show_mpls_table.ref.diff @@ -1,5 +1,5 @@ ---- rt3/step3/show_mpls_table.ref 2020-08-31 22:42:48.835561429 -0300 -+++ rt3/step4/show_mpls_table.ref 2020-08-31 22:42:48.839561398 -0300 +--- rt3/step3/show_mpls_table.ref 2020-09-25 17:48:04.214900164 -0300 ++++ rt3/step4/show_mpls_table.ref 2020-09-25 17:49:00.759636711 -0300 @@ -7,23 +7,7 @@ "type":"SR (IS-IS)", "outLabel":3, @@ -15,12 +15,12 @@ - { - "type":"SR (IS-IS)", - "outLabel":16040, -- "nexthop":"10.0.5.5" +- "nexthop":"10.0.4.5" - }, - { - "type":"SR (IS-IS)", - "outLabel":16040, -- "nexthop":"10.0.4.5" +- "nexthop":"10.0.5.5" + "nexthop":"10.0.1.1" } ] @@ -40,12 +40,12 @@ - { - "type":"SR (IS-IS)", - "outLabel":16041, -- "interface":"eth-rt5-2" +- "interface":"eth-rt5-1" - }, - { - "type":"SR (IS-IS)", - "outLabel":16041, -- "interface":"eth-rt5-1" +- "interface":"eth-rt5-2" + "interface":"eth-sw1" } ] @@ -65,17 +65,17 @@ - { - "type":"SR (IS-IS)", - "outLabel":16040, -- "nexthop":"10.0.5.5" +- "nexthop":"10.0.4.5" - }, - { - "type":"SR (IS-IS)", - "outLabel":16040, -- "nexthop":"10.0.4.5" +- "nexthop":"10.0.5.5" + "nexthop":"10.0.1.2" } ] }, -@@ -91,71 +43,7 @@ +@@ -91,70 +43,6 @@ "type":"SR (IS-IS)", "outLabel":3, "installed":true, @@ -90,12 +90,12 @@ - { - "type":"SR (IS-IS)", - "outLabel":16041, -- "interface":"eth-rt5-2" +- "interface":"eth-rt5-1" - }, - { - "type":"SR (IS-IS)", - "outLabel":16041, -- "interface":"eth-rt5-1" +- "interface":"eth-rt5-2" - } - ] - }, @@ -107,7 +107,7 @@ - "type":"SR (IS-IS)", - "outLabel":16040, - "installed":true, -- "nexthop":"10.0.1.2" +- "nexthop":"10.0.5.5" - }, - { - "type":"SR (IS-IS)", @@ -119,7 +119,7 @@ - "type":"SR (IS-IS)", - "outLabel":16040, - "installed":true, -- "nexthop":"10.0.5.5" +- "nexthop":"10.0.1.2" - } - ] - }, @@ -131,7 +131,7 @@ - "type":"SR (IS-IS)", - "outLabel":16041, - "installed":true, - "interface":"eth-sw1" +- "interface":"eth-rt5-2" - }, - { - "type":"SR (IS-IS)", @@ -143,7 +143,64 @@ - "type":"SR (IS-IS)", - "outLabel":16041, - "installed":true, -- "interface":"eth-rt5-2" + "interface":"eth-sw1" + } + ] +@@ -167,26 +55,13 @@ + "type":"SR (IS-IS)", + "outLabel":3, + "installed":true, +- "nexthop":"10.0.5.5", +- "backupIndex":[ +- 0 +- ] ++ "nexthop":"10.0.5.5" + }, + { + "type":"SR (IS-IS)", + "outLabel":3, + "installed":true, +- "nexthop":"10.0.4.5", +- "backupIndex":[ +- 0 +- ] +- } +- ], +- "backupNexthops":[ +- { +- "type":"SR (IS-IS)", +- "outLabel":16040, +- "nexthop":"10.0.1.2" ++ "nexthop":"10.0.4.5" + } + ] + }, +@@ -198,26 +73,13 @@ + "type":"SR (IS-IS)", + "outLabel":3, + "installed":true, +- "interface":"eth-rt5-2", +- "backupIndex":[ +- 0 +- ] ++ "interface":"eth-rt5-2" + }, + { + "type":"SR (IS-IS)", + "outLabel":3, + "installed":true, +- "interface":"eth-rt5-1", +- "backupIndex":[ +- 0 +- ] +- } +- ], +- "backupNexthops":[ +- { +- "type":"SR (IS-IS)", +- "outLabel":16041, +- "interface":"eth-sw1" ++ "interface":"eth-rt5-1" } ] }, diff --git a/tests/topotests/isis-tilfa-topo1/rt3/step5/show_ip_route.ref.diff b/tests/topotests/isis-tilfa-topo1/rt3/step5/show_ip_route.ref.diff index de265cc255..8eac75bec7 100644 --- a/tests/topotests/isis-tilfa-topo1/rt3/step5/show_ip_route.ref.diff +++ b/tests/topotests/isis-tilfa-topo1/rt3/step5/show_ip_route.ref.diff @@ -1,6 +1,6 @@ ---- rt3/step4/show_ip_route.ref 2020-08-31 22:42:48.839561398 -0300 -+++ rt3/step5/show_ip_route.ref 2020-08-31 22:42:48.839561398 -0300 -@@ -15,10 +15,34 @@ +--- rt3/step4/show_ip_route.ref 2020-09-25 17:49:01.963652403 -0300 ++++ rt3/step5/show_ip_route.ref 2020-09-25 17:50:12.592573438 -0300 +@@ -15,10 +15,36 @@ "afi":"ipv4", "interfaceName":"eth-sw1", "active":true, @@ -15,27 +15,29 @@ + ], + "backupNexthops":[ + { -+ "ip":"10.0.5.5", ++ "ip":"10.0.4.5", + "afi":"ipv4", -+ "interfaceName":"eth-rt5-2", ++ "interfaceName":"eth-rt5-1", + "active":true, + "labels":[ -+ 16040 ++ 16040, ++ 16010 + ] + }, + { -+ "ip":"10.0.4.5", ++ "ip":"10.0.5.5", + "afi":"ipv4", -+ "interfaceName":"eth-rt5-1", ++ "interfaceName":"eth-rt5-2", + "active":true, + "labels":[ -+ 16040 ++ 16040, ++ 16010 + ] + } ] } ], -@@ -38,10 +62,34 @@ +@@ -38,10 +64,36 @@ "afi":"ipv4", "interfaceName":"eth-sw1", "active":true, @@ -50,27 +52,29 @@ + ], + "backupNexthops":[ + { -+ "ip":"10.0.5.5", ++ "ip":"10.0.4.5", + "afi":"ipv4", -+ "interfaceName":"eth-rt5-2", ++ "interfaceName":"eth-rt5-1", + "active":true, + "labels":[ -+ 16040 ++ 16040, ++ 16020 + ] + }, + { -+ "ip":"10.0.4.5", ++ "ip":"10.0.5.5", + "afi":"ipv4", -+ "interfaceName":"eth-rt5-1", ++ "interfaceName":"eth-rt5-2", + "active":true, + "labels":[ -+ 16040 ++ 16040, ++ 16020 + ] + } ] } ], -@@ -60,21 +108,30 @@ +@@ -60,21 +112,30 @@ "ip":"10.0.1.2", "afi":"ipv4", "interfaceName":"eth-sw1", @@ -104,7 +108,43 @@ } ] } -@@ -155,12 +212,34 @@ +@@ -95,6 +156,9 @@ + "afi":"ipv4", + "interfaceName":"eth-rt5-1", + "active":true, ++ "backupIndex":[ ++ 0 ++ ], + "labels":[ + 3 + ] +@@ -105,10 +169,25 @@ + "afi":"ipv4", + "interfaceName":"eth-rt5-2", + "active":true, ++ "backupIndex":[ ++ 0 ++ ], + "labels":[ + 3 + ] + } ++ ], ++ "backupNexthops":[ ++ { ++ "ip":"10.0.1.2", ++ "afi":"ipv4", ++ "interfaceName":"eth-sw1", ++ "active":true, ++ "labels":[ ++ 16040, ++ 16050 ++ ] ++ } + ] + } + ], +@@ -169,12 +248,40 @@ { "ip":"10.0.1.1", "afi":"ipv4", @@ -128,16 +168,121 @@ + ], + "backupNexthops":[ + { -+ "ip":"10.0.5.5", ++ "ip":"10.0.4.5", + "afi":"ipv4", -+ "interfaceName":"eth-rt5-2", -+ "active":true ++ "interfaceName":"eth-rt5-1", ++ "active":true, ++ "labels":[ ++ 16040 ++ ] + }, + { -+ "ip":"10.0.4.5", ++ "ip":"10.0.5.5", + "afi":"ipv4", ++ "interfaceName":"eth-rt5-2", ++ "active":true, ++ "labels":[ ++ 16040 ++ ] + } + ] + } +@@ -265,13 +372,30 @@ + { + "ip":"10.0.4.5", + "afi":"ipv4", +- "interfaceName":"eth-rt5-1" + "interfaceName":"eth-rt5-1", -+ "active":true ++ "backupIndex":[ ++ 0 ++ ] + }, + { + "ip":"10.0.5.5", + "afi":"ipv4", + "interfaceName":"eth-rt5-2", +- "active":true ++ "active":true, ++ "backupIndex":[ ++ 0 ++ ] ++ } ++ ], ++ "backupNexthops":[ ++ { ++ "ip":"10.0.1.2", ++ "afi":"ipv4", ++ "interfaceName":"eth-sw1", ++ "active":true, ++ "labels":[ ++ 16040 ++ ] + } + ] + } +@@ -287,12 +411,29 @@ + "ip":"10.0.4.5", + "afi":"ipv4", + "interfaceName":"eth-rt5-1", +- "active":true ++ "active":true, ++ "backupIndex":[ ++ 0 ++ ] + }, + { + "ip":"10.0.5.5", + "afi":"ipv4", +- "interfaceName":"eth-rt5-2" ++ "interfaceName":"eth-rt5-2", ++ "backupIndex":[ ++ 0 ++ ] ++ } ++ ], ++ "backupNexthops":[ ++ { ++ "ip":"10.0.1.2", ++ "afi":"ipv4", ++ "interfaceName":"eth-sw1", ++ "active":true, ++ "labels":[ ++ 16040 ++ ] + } + ] + } +@@ -387,14 +528,31 @@ + "ip":"10.0.4.5", + "afi":"ipv4", + "interfaceName":"eth-rt5-1", +- "active":true ++ "active":true, ++ "backupIndex":[ ++ 0 ++ ] + }, + { + "fib":true, + "ip":"10.0.5.5", + "afi":"ipv4", + "interfaceName":"eth-rt5-2", +- "active":true ++ "active":true, ++ "backupIndex":[ ++ 0 ++ ] ++ } ++ ], ++ "backupNexthops":[ ++ { ++ "ip":"10.0.1.2", ++ "afi":"ipv4", ++ "interfaceName":"eth-sw1", ++ "active":true, ++ "labels":[ ++ 16040 ++ ] } ] } diff --git a/tests/topotests/isis-tilfa-topo1/rt3/step5/show_ipv6_route.ref.diff b/tests/topotests/isis-tilfa-topo1/rt3/step5/show_ipv6_route.ref.diff index 947d4271e8..fc55267ad1 100644 --- a/tests/topotests/isis-tilfa-topo1/rt3/step5/show_ipv6_route.ref.diff +++ b/tests/topotests/isis-tilfa-topo1/rt3/step5/show_ipv6_route.ref.diff @@ -1,6 +1,6 @@ ---- rt3/step4/show_ipv6_route.ref 2020-08-31 22:42:48.839561398 -0300 -+++ rt3/step5/show_ipv6_route.ref 2020-08-31 22:42:48.839561398 -0300 -@@ -14,10 +14,32 @@ +--- rt3/step4/show_ipv6_route.ref 2020-09-25 17:49:03.199668512 -0300 ++++ rt3/step5/show_ipv6_route.ref 2020-09-25 17:50:13.840589722 -0300 +@@ -14,10 +14,34 @@ "afi":"ipv6", "interfaceName":"eth-sw1", "active":true, @@ -16,24 +16,26 @@ + "backupNexthops":[ + { + "afi":"ipv6", -+ "interfaceName":"eth-rt5-2", ++ "interfaceName":"eth-rt5-1", + "active":true, + "labels":[ -+ 16041 ++ 16041, ++ 16011 + ] + }, + { + "afi":"ipv6", -+ "interfaceName":"eth-rt5-1", ++ "interfaceName":"eth-rt5-2", + "active":true, + "labels":[ -+ 16041 ++ 16041, ++ 16011 + ] + } ] } ], -@@ -36,10 +58,32 @@ +@@ -36,10 +60,34 @@ "afi":"ipv6", "interfaceName":"eth-sw1", "active":true, @@ -49,27 +51,29 @@ + "backupNexthops":[ + { + "afi":"ipv6", -+ "interfaceName":"eth-rt5-2", ++ "interfaceName":"eth-rt5-1", + "active":true, + "labels":[ -+ 16041 ++ 16041, ++ 16021 + ] + }, + { + "afi":"ipv6", -+ "interfaceName":"eth-rt5-1", ++ "interfaceName":"eth-rt5-2", + "active":true, + "labels":[ -+ 16041 ++ 16041, ++ 16021 + ] + } ] } ], -@@ -57,19 +101,28 @@ +@@ -57,19 +105,28 @@ "fib":true, "afi":"ipv6", - "interfaceName":"eth-rt5-2", + "interfaceName":"eth-sw1", - "active":true + "active":true, + "labels":[ @@ -79,7 +83,7 @@ { "fib":true, "afi":"ipv6", - "interfaceName":"eth-rt5-1", + "interfaceName":"eth-rt5-2", - "active":true + "active":true, + "labels":[ @@ -89,7 +93,7 @@ { "fib":true, "afi":"ipv6", - "interfaceName":"eth-sw1", + "interfaceName":"eth-rt5-1", - "active":true + "active":true, + "labels":[ @@ -98,3 +102,38 @@ } ] } +@@ -89,6 +146,9 @@ + "afi":"ipv6", + "interfaceName":"eth-rt5-2", + "active":true, ++ "backupIndex":[ ++ 0 ++ ], + "labels":[ + 3 + ] +@@ -98,10 +158,24 @@ + "afi":"ipv6", + "interfaceName":"eth-rt5-1", + "active":true, ++ "backupIndex":[ ++ 0 ++ ], + "labels":[ + 3 + ] + } ++ ], ++ "backupNexthops":[ ++ { ++ "afi":"ipv6", ++ "interfaceName":"eth-sw1", ++ "active":true, ++ "labels":[ ++ 16041, ++ 16051 ++ ] ++ } + ] + } + ], diff --git a/tests/topotests/isis-tilfa-topo1/rt3/step5/show_mpls_table.ref.diff b/tests/topotests/isis-tilfa-topo1/rt3/step5/show_mpls_table.ref.diff index 3dd237b91b..4ed491e241 100644 --- a/tests/topotests/isis-tilfa-topo1/rt3/step5/show_mpls_table.ref.diff +++ b/tests/topotests/isis-tilfa-topo1/rt3/step5/show_mpls_table.ref.diff @@ -1,5 +1,5 @@ ---- rt3/step4/show_mpls_table.ref 2020-08-31 22:42:48.839561398 -0300 -+++ rt3/step5/show_mpls_table.ref 2020-08-31 22:42:48.839561398 -0300 +--- rt3/step4/show_mpls_table.ref 2020-09-25 17:49:00.759636711 -0300 ++++ rt3/step5/show_mpls_table.ref 2020-09-25 17:50:11.280556320 -0300 @@ -7,7 +7,23 @@ "type":"SR (IS-IS)", "outLabel":3, @@ -16,12 +16,12 @@ + { + "type":"SR (IS-IS)", + "outLabel":16040, -+ "nexthop":"10.0.5.5" ++ "nexthop":"10.0.4.5" + }, + { + "type":"SR (IS-IS)", + "outLabel":16040, -+ "nexthop":"10.0.4.5" ++ "nexthop":"10.0.5.5" } ] }, @@ -41,12 +41,12 @@ + { + "type":"SR (IS-IS)", + "outLabel":16041, -+ "interface":"eth-rt5-2" ++ "interface":"eth-rt5-1" + }, + { + "type":"SR (IS-IS)", + "outLabel":16041, -+ "interface":"eth-rt5-1" ++ "interface":"eth-rt5-2" } ] }, @@ -66,12 +66,12 @@ + { + "type":"SR (IS-IS)", + "outLabel":16040, -+ "nexthop":"10.0.5.5" ++ "nexthop":"10.0.4.5" + }, + { + "type":"SR (IS-IS)", + "outLabel":16040, -+ "nexthop":"10.0.4.5" ++ "nexthop":"10.0.5.5" } ] }, @@ -90,12 +90,12 @@ + { + "type":"SR (IS-IS)", + "outLabel":16041, -+ "interface":"eth-rt5-2" ++ "interface":"eth-rt5-1" + }, + { + "type":"SR (IS-IS)", + "outLabel":16041, -+ "interface":"eth-rt5-1" ++ "interface":"eth-rt5-2" + } + ] + }, @@ -107,13 +107,13 @@ + "type":"SR (IS-IS)", + "outLabel":16040, + "installed":true, -+ "nexthop":"10.0.4.5" ++ "nexthop":"10.0.5.5" + }, + { + "type":"SR (IS-IS)", + "outLabel":16040, + "installed":true, -+ "nexthop":"10.0.5.5" ++ "nexthop":"10.0.4.5" + }, + { + "type":"SR (IS-IS)", @@ -131,13 +131,13 @@ + "type":"SR (IS-IS)", + "outLabel":16041, + "installed":true, -+ "interface":"eth-rt5-1" ++ "interface":"eth-rt5-2" + }, + { + "type":"SR (IS-IS)", + "outLabel":16041, + "installed":true, -+ "interface":"eth-rt5-2" ++ "interface":"eth-rt5-1" + }, + { + "type":"SR (IS-IS)", @@ -146,3 +146,61 @@ "interface":"eth-sw1" } ] +@@ -55,13 +167,26 @@ + "type":"SR (IS-IS)", + "outLabel":3, + "installed":true, +- "nexthop":"10.0.5.5" ++ "nexthop":"10.0.5.5", ++ "backupIndex":[ ++ 0 ++ ] + }, + { + "type":"SR (IS-IS)", + "outLabel":3, + "installed":true, +- "nexthop":"10.0.4.5" ++ "nexthop":"10.0.4.5", ++ "backupIndex":[ ++ 0 ++ ] ++ } ++ ], ++ "backupNexthops":[ ++ { ++ "type":"SR (IS-IS)", ++ "outLabel":16040, ++ "nexthop":"10.0.1.2" + } + ] + }, +@@ -73,13 +198,26 @@ + "type":"SR (IS-IS)", + "outLabel":3, + "installed":true, +- "interface":"eth-rt5-2" ++ "interface":"eth-rt5-2", ++ "backupIndex":[ ++ 0 ++ ] + }, + { + "type":"SR (IS-IS)", + "outLabel":3, + "installed":true, +- "interface":"eth-rt5-1" ++ "interface":"eth-rt5-1", ++ "backupIndex":[ ++ 0 ++ ] ++ } ++ ], ++ "backupNexthops":[ ++ { ++ "type":"SR (IS-IS)", ++ "outLabel":16041, ++ "interface":"eth-sw1" + } + ] + }, diff --git a/tests/topotests/isis-tilfa-topo1/rt3/step6/show_ip_route.ref.diff b/tests/topotests/isis-tilfa-topo1/rt3/step6/show_ip_route.ref.diff index 00f0bb031a..9273c75352 100644 --- a/tests/topotests/isis-tilfa-topo1/rt3/step6/show_ip_route.ref.diff +++ b/tests/topotests/isis-tilfa-topo1/rt3/step6/show_ip_route.ref.diff @@ -1,42 +1,42 @@ ---- rt3/step5/show_ip_route.ref 2020-08-31 22:42:48.839561398 -0300 -+++ rt3/step6/show_ip_route.ref 2020-08-31 22:42:48.839561398 -0300 +--- rt3/step5/show_ip_route.ref 2020-09-25 17:50:12.592573438 -0300 ++++ rt3/step6/show_ip_route.ref 2020-09-25 17:51:15.521394894 -0300 @@ -31,7 +31,7 @@ - "interfaceName":"eth-rt5-2", + "interfaceName":"eth-rt5-1", "active":true, "labels":[ -- 16040 -+ 30040 +- 16040, ++ 30040, + 16010 ] }, - { -@@ -40,7 +40,7 @@ - "interfaceName":"eth-rt5-1", +@@ -41,7 +41,7 @@ + "interfaceName":"eth-rt5-2", "active":true, "labels":[ -- 16040 -+ 30040 +- 16040, ++ 30040, + 16010 ] } - ] -@@ -78,7 +78,7 @@ - "interfaceName":"eth-rt5-2", +@@ -80,7 +80,7 @@ + "interfaceName":"eth-rt5-1", "active":true, "labels":[ -- 16040 -+ 30040 +- 16040, ++ 30040, + 16020 ] }, - { -@@ -87,7 +87,7 @@ - "interfaceName":"eth-rt5-1", +@@ -90,7 +90,7 @@ + "interfaceName":"eth-rt5-2", "active":true, "labels":[ -- 16040 -+ 30040 +- 16040, ++ 30040, + 16020 ] } - ] -@@ -120,7 +120,7 @@ +@@ -124,7 +124,7 @@ "interfaceName":"eth-rt5-1", "active":true, "labels":[ @@ -45,7 +45,7 @@ ] }, { -@@ -130,7 +130,7 @@ +@@ -134,7 +134,7 @@ "interfaceName":"eth-rt5-2", "active":true, "labels":[ @@ -54,21 +54,48 @@ ] } ] -@@ -186,7 +186,7 @@ - "interfaceName":"eth-rt5-1", +@@ -185,7 +185,7 @@ "active":true, "labels":[ + 16040, +- 16050 ++ 30050 + ] + } + ] +@@ -211,7 +211,7 @@ + 0 + ], + "labels":[ - 16060 + 30060 ] }, { -@@ -196,7 +196,7 @@ - "interfaceName":"eth-rt5-2", - "active":true, +@@ -224,7 +224,7 @@ + 0 + ], "labels":[ - 16060 + 30060 ] } + ], +@@ -271,7 +271,7 @@ + "interfaceName":"eth-rt5-1", + "active":true, + "labels":[ +- 16040 ++ 30040 + ] + }, + { +@@ -280,7 +280,7 @@ + "interfaceName":"eth-rt5-2", + "active":true, + "labels":[ +- 16040 ++ 30040 + ] + } ] diff --git a/tests/topotests/isis-tilfa-topo1/rt3/step6/show_ipv6_route.ref.diff b/tests/topotests/isis-tilfa-topo1/rt3/step6/show_ipv6_route.ref.diff index 823cd4591f..f50be893e4 100644 --- a/tests/topotests/isis-tilfa-topo1/rt3/step6/show_ipv6_route.ref.diff +++ b/tests/topotests/isis-tilfa-topo1/rt3/step6/show_ipv6_route.ref.diff @@ -1,42 +1,42 @@ ---- rt3/step5/show_ipv6_route.ref 2020-08-31 22:42:48.839561398 -0300 -+++ rt3/step6/show_ipv6_route.ref 2020-08-31 22:42:48.839561398 -0300 +--- rt3/step5/show_ipv6_route.ref 2020-09-25 17:50:13.840589722 -0300 ++++ rt3/step6/show_ipv6_route.ref 2020-09-25 17:51:16.757411035 -0300 @@ -29,7 +29,7 @@ - "interfaceName":"eth-rt5-2", + "interfaceName":"eth-rt5-1", "active":true, "labels":[ -- 16041 -+ 30041 +- 16041, ++ 30041, + 16011 ] }, - { -@@ -37,7 +37,7 @@ - "interfaceName":"eth-rt5-1", +@@ -38,7 +38,7 @@ + "interfaceName":"eth-rt5-2", "active":true, "labels":[ -- 16041 -+ 30041 +- 16041, ++ 30041, + 16011 ] } - ] -@@ -73,7 +73,7 @@ - "interfaceName":"eth-rt5-2", +@@ -75,7 +75,7 @@ + "interfaceName":"eth-rt5-1", "active":true, "labels":[ -- 16041 -+ 30041 +- 16041, ++ 30041, + 16021 ] }, - { -@@ -81,7 +81,7 @@ - "interfaceName":"eth-rt5-1", +@@ -84,7 +84,7 @@ + "interfaceName":"eth-rt5-2", "active":true, "labels":[ -- 16041 -+ 30041 +- 16041, ++ 30041, + 16021 ] } - ] -@@ -103,7 +103,7 @@ +@@ -116,7 +116,7 @@ "interfaceName":"eth-rt5-2", "active":true, "labels":[ @@ -45,30 +45,39 @@ ] }, { -@@ -112,7 +112,7 @@ +@@ -125,7 +125,7 @@ "interfaceName":"eth-rt5-1", "active":true, "labels":[ - 16041 + 30041 ] - }, - { -@@ -174,7 +174,7 @@ - "interfaceName":"eth-rt5-2", + } + ] +@@ -173,7 +173,7 @@ "active":true, "labels":[ + 16041, +- 16051 ++ 30051 + ] + } + ] +@@ -198,7 +198,7 @@ + 0 + ], + "labels":[ - 16061 + 30061 ] }, { -@@ -183,7 +183,7 @@ - "interfaceName":"eth-rt5-1", - "active":true, +@@ -210,7 +210,7 @@ + 0 + ], "labels":[ - 16061 + 30061 ] } - ] + ], diff --git a/tests/topotests/isis-tilfa-topo1/rt3/step6/show_mpls_table.ref.diff b/tests/topotests/isis-tilfa-topo1/rt3/step6/show_mpls_table.ref.diff index 1ad228b9c2..b63a728ef1 100644 --- a/tests/topotests/isis-tilfa-topo1/rt3/step6/show_mpls_table.ref.diff +++ b/tests/topotests/isis-tilfa-topo1/rt3/step6/show_mpls_table.ref.diff @@ -1,18 +1,18 @@ ---- rt3/step5/show_mpls_table.ref 2020-08-31 22:42:48.839561398 -0300 -+++ rt3/step6/show_mpls_table.ref 2020-08-31 22:42:48.839561398 -0300 +--- rt3/step5/show_mpls_table.ref 2020-09-25 17:50:11.280556320 -0300 ++++ rt3/step6/show_mpls_table.ref 2020-09-25 17:51:14.281378700 -0300 @@ -17,12 +17,12 @@ "backupNexthops":[ { "type":"SR (IS-IS)", - "outLabel":16040, + "outLabel":30040, - "nexthop":"10.0.5.5" + "nexthop":"10.0.4.5" }, { "type":"SR (IS-IS)", - "outLabel":16040, + "outLabel":30040, - "nexthop":"10.0.4.5" + "nexthop":"10.0.5.5" } ] @@ -45,12 +45,12 @@ @@ -21,13 +21,13 @@ "type":"SR (IS-IS)", - "outLabel":16041, + "outLabel":30041, - "interface":"eth-rt5-2" + "interface":"eth-rt5-1" }, { "type":"SR (IS-IS)", - "outLabel":16041, + "outLabel":30041, - "interface":"eth-rt5-1" + "interface":"eth-rt5-2" } ] @@ -73,12 +73,12 @@ @@ -36,13 +36,13 @@ "type":"SR (IS-IS)", - "outLabel":16040, + "outLabel":30040, - "nexthop":"10.0.5.5" + "nexthop":"10.0.4.5" }, { "type":"SR (IS-IS)", - "outLabel":16040, + "outLabel":30040, - "nexthop":"10.0.4.5" + "nexthop":"10.0.5.5" } ] @@ -101,12 +101,12 @@ @@ -51,13 +51,13 @@ "type":"SR (IS-IS)", - "outLabel":16041, + "outLabel":30041, - "interface":"eth-rt5-2" + "interface":"eth-rt5-1" }, { "type":"SR (IS-IS)", - "outLabel":16041, + "outLabel":30041, - "interface":"eth-rt5-1" + "interface":"eth-rt5-2" } ] @@ -117,13 +117,13 @@ @@ -67,14 +67,14 @@ - "outLabel":16040, + "outLabel":30040, "installed":true, - "nexthop":"10.0.4.5" + "nexthop":"10.0.5.5" }, { "type":"SR (IS-IS)", - "outLabel":16040, + "outLabel":30040, "installed":true, - "nexthop":"10.0.5.5" + "nexthop":"10.0.4.5" }, @@ -141,13 +141,13 @@ "nexthops":[ @@ -83,44 +83,48 @@ - "outLabel":16041, + "outLabel":30041, "installed":true, - "interface":"eth-rt5-1" + "interface":"eth-rt5-2" }, { "type":"SR (IS-IS)", - "outLabel":16041, + "outLabel":30041, "installed":true, - "interface":"eth-rt5-2" + "interface":"eth-rt5-1" }, -@@ -201,13 +201,13 @@ +@@ -227,7 +227,7 @@ "nexthops":[ { "type":"SR (IS-IS)", - "outLabel":16060, + "outLabel":30060, "installed":true, - "nexthop":"10.0.4.5" + "nexthop":"10.0.5.5", + "backupIndex":[ +@@ -236,7 +236,7 @@ }, { "type":"SR (IS-IS)", - "outLabel":16060, + "outLabel":30060, "installed":true, - "nexthop":"10.0.5.5" - } -@@ -219,13 +219,13 @@ + "nexthop":"10.0.4.5", + "backupIndex":[ +@@ -258,7 +258,7 @@ "nexthops":[ { "type":"SR (IS-IS)", - "outLabel":16061, + "outLabel":30061, "installed":true, - "interface":"eth-rt5-1" + "interface":"eth-rt5-2", + "backupIndex":[ +@@ -267,7 +267,7 @@ }, { "type":"SR (IS-IS)", - "outLabel":16061, + "outLabel":30061, "installed":true, - "interface":"eth-rt5-2" - } + "interface":"eth-rt5-1", + "backupIndex":[ diff --git a/tests/topotests/isis-tilfa-topo1/rt3/step7/show_ip_route.ref.diff b/tests/topotests/isis-tilfa-topo1/rt3/step7/show_ip_route.ref.diff index bee7c568e7..0ae87afa3b 100644 --- a/tests/topotests/isis-tilfa-topo1/rt3/step7/show_ip_route.ref.diff +++ b/tests/topotests/isis-tilfa-topo1/rt3/step7/show_ip_route.ref.diff @@ -1,25 +1,32 @@ ---- rt3/step6/show_ip_route.ref 2020-08-31 22:42:48.839561398 -0300 -+++ rt3/step7/show_ip_route.ref 2020-08-31 22:42:48.839561398 -0300 -@@ -151,20 +151,14 @@ - "ip":"10.0.4.5", - "afi":"ipv4", - "interfaceName":"eth-rt5-1", -- "active":true, +--- rt3/step6/show_ip_route.ref 2020-09-25 17:51:15.521394894 -0300 ++++ rt3/step7/show_ip_route.ref 2020-09-25 17:52:02.414007470 -0300 +@@ -158,9 +158,6 @@ + "active":true, + "backupIndex":[ + 0 +- ], - "labels":[ - 3 -- ] -+ "active":true + ] }, { - "fib":true, - "ip":"10.0.5.5", - "afi":"ipv4", - "interfaceName":"eth-rt5-2", -- "active":true, +@@ -171,9 +168,6 @@ + "active":true, + "backupIndex":[ + 0 +- ], - "labels":[ - 3 -- ] -+ "active":true + ] + } + ], +@@ -184,8 +178,7 @@ + "interfaceName":"eth-sw1", + "active":true, + "labels":[ +- 16040, +- 30050 ++ 16040 + ] } ] - } diff --git a/tests/topotests/isis-tilfa-topo1/rt3/step7/show_ipv6_route.ref.diff b/tests/topotests/isis-tilfa-topo1/rt3/step7/show_ipv6_route.ref.diff index 05b4080304..f392f644c0 100644 --- a/tests/topotests/isis-tilfa-topo1/rt3/step7/show_ipv6_route.ref.diff +++ b/tests/topotests/isis-tilfa-topo1/rt3/step7/show_ipv6_route.ref.diff @@ -1,24 +1,32 @@ ---- rt3/step6/show_ipv6_route.ref 2020-08-31 22:42:48.839561398 -0300 -+++ rt3/step7/show_ipv6_route.ref 2020-08-31 22:42:48.839561398 -0300 -@@ -141,19 +141,13 @@ - "fib":true, - "afi":"ipv6", - "interfaceName":"eth-rt5-2", -- "active":true, +--- rt3/step6/show_ipv6_route.ref 2020-09-25 17:51:16.757411035 -0300 ++++ rt3/step7/show_ipv6_route.ref 2020-09-25 17:52:03.650023622 -0300 +@@ -148,9 +148,6 @@ + "active":true, + "backupIndex":[ + 0 +- ], - "labels":[ - 3 -- ] -+ "active":true + ] }, { - "fib":true, - "afi":"ipv6", - "interfaceName":"eth-rt5-1", -- "active":true, +@@ -160,9 +157,6 @@ + "active":true, + "backupIndex":[ + 0 +- ], - "labels":[ - 3 -- ] -+ "active":true + ] + } + ], +@@ -172,8 +166,7 @@ + "interfaceName":"eth-sw1", + "active":true, + "labels":[ +- 16041, +- 30051 ++ 16041 + ] } ] - } diff --git a/tests/topotests/isis-tilfa-topo1/rt3/step7/show_mpls_table.ref.diff b/tests/topotests/isis-tilfa-topo1/rt3/step7/show_mpls_table.ref.diff index 3fb37faea6..b74eb9579c 100644 --- a/tests/topotests/isis-tilfa-topo1/rt3/step7/show_mpls_table.ref.diff +++ b/tests/topotests/isis-tilfa-topo1/rt3/step7/show_mpls_table.ref.diff @@ -1,6 +1,6 @@ ---- rt3/step6/show_mpls_table.ref 2020-08-31 22:42:48.839561398 -0300 -+++ rt3/step7/show_mpls_table.ref 2020-08-31 22:42:48.839561398 -0300 -@@ -159,42 +159,6 @@ +--- rt3/step6/show_mpls_table.ref 2020-09-25 17:51:14.281378700 -0300 ++++ rt3/step7/show_mpls_table.ref 2020-09-25 17:52:01.181991371 -0300 +@@ -159,68 +159,6 @@ } ] }, @@ -12,13 +12,26 @@ - "type":"SR (IS-IS)", - "outLabel":3, - "installed":true, -- "nexthop":"10.0.4.5" +- "nexthop":"10.0.5.5", +- "backupIndex":[ +- 0 +- ] - }, - { - "type":"SR (IS-IS)", - "outLabel":3, - "installed":true, -- "nexthop":"10.0.5.5" +- "nexthop":"10.0.4.5", +- "backupIndex":[ +- 0 +- ] +- } +- ], +- "backupNexthops":[ +- { +- "type":"SR (IS-IS)", +- "outLabel":16040, +- "nexthop":"10.0.1.2" - } - ] - }, @@ -30,13 +43,26 @@ - "type":"SR (IS-IS)", - "outLabel":3, - "installed":true, -- "interface":"eth-rt5-1" +- "interface":"eth-rt5-2", +- "backupIndex":[ +- 0 +- ] - }, - { - "type":"SR (IS-IS)", - "outLabel":3, - "installed":true, -- "interface":"eth-rt5-2" +- "interface":"eth-rt5-1", +- "backupIndex":[ +- 0 +- ] +- } +- ], +- "backupNexthops":[ +- { +- "type":"SR (IS-IS)", +- "outLabel":16041, +- "interface":"eth-sw1" - } - ] - }, diff --git a/tests/topotests/isis-tilfa-topo1/rt3/step8/show_ip_route.ref.diff b/tests/topotests/isis-tilfa-topo1/rt3/step8/show_ip_route.ref.diff index c31d25261c..25b42f2825 100644 --- a/tests/topotests/isis-tilfa-topo1/rt3/step8/show_ip_route.ref.diff +++ b/tests/topotests/isis-tilfa-topo1/rt3/step8/show_ip_route.ref.diff @@ -1,25 +1,32 @@ ---- rt3/step7/show_ip_route.ref 2020-08-31 22:42:48.839561398 -0300 -+++ rt3/step8/show_ip_route.ref 2020-08-31 22:42:48.839561398 -0300 -@@ -151,14 +151,20 @@ - "ip":"10.0.4.5", - "afi":"ipv4", - "interfaceName":"eth-rt5-1", -- "active":true -+ "active":true, +--- rt3/step7/show_ip_route.ref 2020-09-25 17:52:02.414007470 -0300 ++++ rt3/step8/show_ip_route.ref 2020-09-25 17:53:20.419027241 -0300 +@@ -158,6 +158,9 @@ + "active":true, + "backupIndex":[ + 0 ++ ], + "labels":[ + 3 -+ ] + ] }, { - "fib":true, - "ip":"10.0.5.5", - "afi":"ipv4", - "interfaceName":"eth-rt5-2", -- "active":true -+ "active":true, +@@ -168,6 +171,9 @@ + "active":true, + "backupIndex":[ + 0 ++ ], + "labels":[ + 3 -+ ] + ] + } + ], +@@ -178,7 +184,8 @@ + "interfaceName":"eth-sw1", + "active":true, + "labels":[ +- 16040 ++ 16040, ++ 30050 + ] } ] - } diff --git a/tests/topotests/isis-tilfa-topo1/rt3/step8/show_ipv6_route.ref.diff b/tests/topotests/isis-tilfa-topo1/rt3/step8/show_ipv6_route.ref.diff index 759f28d263..42d9356c8a 100644 --- a/tests/topotests/isis-tilfa-topo1/rt3/step8/show_ipv6_route.ref.diff +++ b/tests/topotests/isis-tilfa-topo1/rt3/step8/show_ipv6_route.ref.diff @@ -1,24 +1,32 @@ ---- rt3/step7/show_ipv6_route.ref 2020-08-31 22:42:48.839561398 -0300 -+++ rt3/step8/show_ipv6_route.ref 2020-08-31 22:42:48.839561398 -0300 -@@ -141,13 +141,19 @@ - "fib":true, - "afi":"ipv6", - "interfaceName":"eth-rt5-2", -- "active":true -+ "active":true, +--- rt3/step7/show_ipv6_route.ref 2020-09-25 17:52:03.650023622 -0300 ++++ rt3/step8/show_ipv6_route.ref 2020-09-25 17:53:21.643043250 -0300 +@@ -148,6 +148,9 @@ + "active":true, + "backupIndex":[ + 0 ++ ], + "labels":[ + 3 -+ ] + ] }, { - "fib":true, - "afi":"ipv6", - "interfaceName":"eth-rt5-1", -- "active":true -+ "active":true, +@@ -157,6 +160,9 @@ + "active":true, + "backupIndex":[ + 0 ++ ], + "labels":[ + 3 -+ ] + ] + } + ], +@@ -166,7 +172,8 @@ + "interfaceName":"eth-sw1", + "active":true, + "labels":[ +- 16041 ++ 16041, ++ 30051 + ] } ] - } diff --git a/tests/topotests/isis-tilfa-topo1/rt3/step8/show_mpls_table.ref.diff b/tests/topotests/isis-tilfa-topo1/rt3/step8/show_mpls_table.ref.diff index 0c2c8e2b09..bd40f954eb 100644 --- a/tests/topotests/isis-tilfa-topo1/rt3/step8/show_mpls_table.ref.diff +++ b/tests/topotests/isis-tilfa-topo1/rt3/step8/show_mpls_table.ref.diff @@ -1,6 +1,6 @@ ---- rt3/step7/show_mpls_table.ref 2020-08-31 22:42:48.839561398 -0300 -+++ rt3/step8/show_mpls_table.ref 2020-08-31 22:42:48.839561398 -0300 -@@ -159,6 +159,42 @@ +--- rt3/step7/show_mpls_table.ref 2020-09-25 17:52:01.181991371 -0300 ++++ rt3/step8/show_mpls_table.ref 2020-09-25 17:53:19.135010448 -0300 +@@ -159,6 +159,68 @@ } ] }, @@ -12,13 +12,26 @@ + "type":"SR (IS-IS)", + "outLabel":3, + "installed":true, -+ "nexthop":"10.0.4.5" ++ "nexthop":"10.0.5.5", ++ "backupIndex":[ ++ 0 ++ ] + }, + { + "type":"SR (IS-IS)", + "outLabel":3, + "installed":true, -+ "nexthop":"10.0.5.5" ++ "nexthop":"10.0.4.5", ++ "backupIndex":[ ++ 0 ++ ] ++ } ++ ], ++ "backupNexthops":[ ++ { ++ "type":"SR (IS-IS)", ++ "outLabel":16040, ++ "nexthop":"10.0.1.2" + } + ] + }, @@ -30,13 +43,26 @@ + "type":"SR (IS-IS)", + "outLabel":3, + "installed":true, -+ "interface":"eth-rt5-1" ++ "interface":"eth-rt5-2", ++ "backupIndex":[ ++ 0 ++ ] + }, + { + "type":"SR (IS-IS)", + "outLabel":3, + "installed":true, -+ "interface":"eth-rt5-2" ++ "interface":"eth-rt5-1", ++ "backupIndex":[ ++ 0 ++ ] ++ } ++ ], ++ "backupNexthops":[ ++ { ++ "type":"SR (IS-IS)", ++ "outLabel":16041, ++ "interface":"eth-sw1" + } + ] + }, diff --git a/tests/topotests/isis-tilfa-topo1/rt3/step9/show_ip_route.ref.diff b/tests/topotests/isis-tilfa-topo1/rt3/step9/show_ip_route.ref.diff index e69de29bb2..687e84ad40 100644 --- a/tests/topotests/isis-tilfa-topo1/rt3/step9/show_ip_route.ref.diff +++ b/tests/topotests/isis-tilfa-topo1/rt3/step9/show_ip_route.ref.diff @@ -0,0 +1,11 @@ +--- rt3/step8/show_ip_route.ref 2020-09-25 17:53:20.419027241 -0300 ++++ rt3/step9/show_ip_route.ref 2020-09-25 17:54:38.112043759 -0300 +@@ -185,7 +185,7 @@ + "active":true, + "labels":[ + 16040, +- 30050 ++ 30500 + ] + } + ] diff --git a/tests/topotests/isis-tilfa-topo1/rt3/step9/show_ipv6_route.ref.diff b/tests/topotests/isis-tilfa-topo1/rt3/step9/show_ipv6_route.ref.diff index e69de29bb2..4b76be66ac 100644 --- a/tests/topotests/isis-tilfa-topo1/rt3/step9/show_ipv6_route.ref.diff +++ b/tests/topotests/isis-tilfa-topo1/rt3/step9/show_ipv6_route.ref.diff @@ -0,0 +1,11 @@ +--- rt3/step8/show_ipv6_route.ref 2020-09-25 17:53:21.643043250 -0300 ++++ rt3/step9/show_ipv6_route.ref 2020-09-25 17:54:39.320059571 -0300 +@@ -173,7 +173,7 @@ + "active":true, + "labels":[ + 16041, +- 30051 ++ 30501 + ] + } + ] diff --git a/tests/topotests/isis-tilfa-topo1/rt3/step9/show_mpls_table.ref.diff b/tests/topotests/isis-tilfa-topo1/rt3/step9/show_mpls_table.ref.diff index b0a4851750..6f6451e510 100644 --- a/tests/topotests/isis-tilfa-topo1/rt3/step9/show_mpls_table.ref.diff +++ b/tests/topotests/isis-tilfa-topo1/rt3/step9/show_mpls_table.ref.diff @@ -1,6 +1,6 @@ ---- rt3/step8/show_mpls_table.ref 2020-08-31 22:42:48.839561398 -0300 -+++ rt3/step9/show_mpls_table.ref 2020-08-31 22:42:48.839561398 -0300 -@@ -159,73 +159,73 @@ +--- rt3/step8/show_mpls_table.ref 2020-09-25 17:53:19.135010448 -0300 ++++ rt3/step9/show_mpls_table.ref 2020-09-25 17:54:36.852027268 -0300 +@@ -159,13 +159,13 @@ } ] }, @@ -15,14 +15,24 @@ - "outLabel":3, + "outLabel":30060, "installed":true, - "nexthop":"10.0.4.5" + "nexthop":"10.0.5.5", + "backupIndex":[ +@@ -174,7 +174,7 @@ }, { "type":"SR (IS-IS)", - "outLabel":3, + "outLabel":30060, "installed":true, - "nexthop":"10.0.5.5" + "nexthop":"10.0.4.5", + "backupIndex":[ +@@ -185,18 +185,18 @@ + "backupNexthops":[ + { + "type":"SR (IS-IS)", +- "outLabel":16040, ++ "outLabel":3, + "nexthop":"10.0.1.2" } ] }, @@ -37,14 +47,24 @@ - "outLabel":3, + "outLabel":30061, "installed":true, - "interface":"eth-rt5-1" + "interface":"eth-rt5-2", + "backupIndex":[ +@@ -205,7 +205,7 @@ }, { "type":"SR (IS-IS)", - "outLabel":3, + "outLabel":30061, "installed":true, - "interface":"eth-rt5-2" + "interface":"eth-rt5-1", + "backupIndex":[ +@@ -216,18 +216,18 @@ + "backupNexthops":[ + { + "type":"SR (IS-IS)", +- "outLabel":16041, ++ "outLabel":3, + "interface":"eth-sw1" } ] }, @@ -59,14 +79,24 @@ - "outLabel":30060, + "outLabel":3, "installed":true, - "nexthop":"10.0.4.5" + "nexthop":"10.0.5.5", + "backupIndex":[ +@@ -236,7 +236,7 @@ }, { "type":"SR (IS-IS)", - "outLabel":30060, + "outLabel":3, "installed":true, - "nexthop":"10.0.5.5" + "nexthop":"10.0.4.5", + "backupIndex":[ +@@ -247,18 +247,18 @@ + "backupNexthops":[ + { + "type":"SR (IS-IS)", +- "outLabel":3, ++ "outLabel":16040, + "nexthop":"10.0.1.2" } ] }, @@ -81,12 +111,23 @@ - "outLabel":30061, + "outLabel":3, "installed":true, - "interface":"eth-rt5-1" + "interface":"eth-rt5-2", + "backupIndex":[ +@@ -267,7 +267,7 @@ }, { "type":"SR (IS-IS)", - "outLabel":30061, + "outLabel":3, "installed":true, - "interface":"eth-rt5-2" + "interface":"eth-rt5-1", + "backupIndex":[ +@@ -278,7 +278,7 @@ + "backupNexthops":[ + { + "type":"SR (IS-IS)", +- "outLabel":3, ++ "outLabel":16041, + "interface":"eth-sw1" } + ] diff --git a/tests/topotests/isis-tilfa-topo1/rt4/step1/show_ip_route.ref b/tests/topotests/isis-tilfa-topo1/rt4/step1/show_ip_route.ref index 3ee587ac49..168b90a3f6 100644 --- a/tests/topotests/isis-tilfa-topo1/rt4/step1/show_ip_route.ref +++ b/tests/topotests/isis-tilfa-topo1/rt4/step1/show_ip_route.ref @@ -15,6 +15,9 @@ "afi":"ipv4", "interfaceName":"eth-rt2-1", "active":true, + "backupIndex":[ + 0 + ], "labels":[ 16010 ] @@ -25,10 +28,21 @@ "afi":"ipv4", "interfaceName":"eth-rt2-2", "active":true, + "backupIndex":[ + 0 + ], "labels":[ 16010 ] } + ], + "backupNexthops":[ + { + "ip":"10.0.6.5", + "afi":"ipv4", + "interfaceName":"eth-rt5", + "active":true + } ] } ], @@ -48,6 +62,9 @@ "afi":"ipv4", "interfaceName":"eth-rt2-1", "active":true, + "backupIndex":[ + 0 + ], "labels":[ 3 ] @@ -58,10 +75,25 @@ "afi":"ipv4", "interfaceName":"eth-rt2-2", "active":true, + "backupIndex":[ + 0 + ], "labels":[ 3 ] } + ], + "backupNexthops":[ + { + "ip":"10.0.6.5", + "afi":"ipv4", + "interfaceName":"eth-rt5", + "active":true, + "labels":[ + 16030, + 16020 + ] + } ] } ], @@ -137,10 +169,7 @@ "ip":"10.0.7.6", "afi":"ipv4", "interfaceName":"eth-rt6", - "active":true, - "labels":[ - 3 - ] + "active":true } ] } @@ -174,10 +203,7 @@ "ip":"10.0.6.5", "afi":"ipv4", "interfaceName":"eth-rt5", - "active":true, - "labels":[ - 3 - ] + "active":true } ] } @@ -197,13 +223,27 @@ "ip":"10.0.2.2", "afi":"ipv4", "interfaceName":"eth-rt2-1", - "active":true + "active":true, + "backupIndex":[ + 0 + ] }, { "fib":true, "ip":"10.0.3.2", "afi":"ipv4", "interfaceName":"eth-rt2-2", + "active":true, + "backupIndex":[ + 0 + ] + } + ], + "backupNexthops":[ + { + "ip":"10.0.6.5", + "afi":"ipv4", + "interfaceName":"eth-rt5", "active":true } ] @@ -219,13 +259,30 @@ { "ip":"10.0.2.2", "afi":"ipv4", - "interfaceName":"eth-rt2-1" + "interfaceName":"eth-rt2-1", + "backupIndex":[ + 0 + ] }, { "ip":"10.0.3.2", "afi":"ipv4", "interfaceName":"eth-rt2-2", - "active":true + "active":true, + "backupIndex":[ + 0 + ] + } + ], + "backupNexthops":[ + { + "ip":"10.0.6.5", + "afi":"ipv4", + "interfaceName":"eth-rt5", + "active":true, + "labels":[ + 16030 + ] } ] } @@ -241,12 +298,29 @@ "ip":"10.0.2.2", "afi":"ipv4", "interfaceName":"eth-rt2-1", - "active":true + "active":true, + "backupIndex":[ + 0 + ] }, { "ip":"10.0.3.2", "afi":"ipv4", - "interfaceName":"eth-rt2-2" + "interfaceName":"eth-rt2-2", + "backupIndex":[ + 0 + ] + } + ], + "backupNexthops":[ + { + "ip":"10.0.6.5", + "afi":"ipv4", + "interfaceName":"eth-rt5", + "active":true, + "labels":[ + 16030 + ] } ] } diff --git a/tests/topotests/isis-tilfa-topo1/rt4/step1/show_ipv6_route.ref b/tests/topotests/isis-tilfa-topo1/rt4/step1/show_ipv6_route.ref index 2f6b703d93..a4442ee089 100644 --- a/tests/topotests/isis-tilfa-topo1/rt4/step1/show_ipv6_route.ref +++ b/tests/topotests/isis-tilfa-topo1/rt4/step1/show_ipv6_route.ref @@ -12,8 +12,11 @@ { "fib":true, "afi":"ipv6", - "interfaceName":"eth-rt2-2", + "interfaceName":"eth-rt2-1", "active":true, + "backupIndex":[ + 0 + ], "labels":[ 16011 ] @@ -21,12 +24,22 @@ { "fib":true, "afi":"ipv6", - "interfaceName":"eth-rt2-1", + "interfaceName":"eth-rt2-2", "active":true, + "backupIndex":[ + 0 + ], "labels":[ 16011 ] } + ], + "backupNexthops":[ + { + "afi":"ipv6", + "interfaceName":"eth-rt5", + "active":true + } ] } ], @@ -43,8 +56,11 @@ { "fib":true, "afi":"ipv6", - "interfaceName":"eth-rt2-2", + "interfaceName":"eth-rt2-1", "active":true, + "backupIndex":[ + 0 + ], "labels":[ 3 ] @@ -52,12 +68,26 @@ { "fib":true, "afi":"ipv6", - "interfaceName":"eth-rt2-1", + "interfaceName":"eth-rt2-2", "active":true, + "backupIndex":[ + 0 + ], "labels":[ 3 ] } + ], + "backupNexthops":[ + { + "afi":"ipv6", + "interfaceName":"eth-rt5", + "active":true, + "labels":[ + 16031, + 16021 + ] + } ] } ], @@ -74,7 +104,7 @@ { "fib":true, "afi":"ipv6", - "interfaceName":"eth-rt2-2", + "interfaceName":"eth-rt2-1", "active":true, "labels":[ 16031 @@ -92,7 +122,7 @@ { "fib":true, "afi":"ipv6", - "interfaceName":"eth-rt2-1", + "interfaceName":"eth-rt2-2", "active":true, "labels":[ 16031 @@ -128,10 +158,7 @@ { "afi":"ipv6", "interfaceName":"eth-rt6", - "active":true, - "labels":[ - 3 - ] + "active":true } ] } @@ -163,10 +190,7 @@ { "afi":"ipv6", "interfaceName":"eth-rt5", - "active":true, - "labels":[ - 3 - ] + "active":true } ] } diff --git a/tests/topotests/isis-tilfa-topo1/rt4/step1/show_mpls_table.ref b/tests/topotests/isis-tilfa-topo1/rt4/step1/show_mpls_table.ref index 5433d4f100..18354e947d 100644 --- a/tests/topotests/isis-tilfa-topo1/rt4/step1/show_mpls_table.ref +++ b/tests/topotests/isis-tilfa-topo1/rt4/step1/show_mpls_table.ref @@ -7,13 +7,26 @@ "type":"SR (IS-IS)", "outLabel":16010, "installed":true, - "nexthop":"10.0.3.2" + "nexthop":"10.0.3.2", + "backupIndex":[ + 0 + ] }, { "type":"SR (IS-IS)", "outLabel":16010, "installed":true, - "nexthop":"10.0.2.2" + "nexthop":"10.0.2.2", + "backupIndex":[ + 0 + ] + } + ], + "backupNexthops":[ + { + "type":"SR (IS-IS)", + "outLabel":3, + "nexthop":"10.0.6.5" } ] }, @@ -25,13 +38,26 @@ "type":"SR (IS-IS)", "outLabel":16011, "installed":true, - "interface":"eth-rt2-2" + "interface":"eth-rt2-2", + "backupIndex":[ + 0 + ] }, { "type":"SR (IS-IS)", "outLabel":16011, "installed":true, - "interface":"eth-rt2-1" + "interface":"eth-rt2-1", + "backupIndex":[ + 0 + ] + } + ], + "backupNexthops":[ + { + "type":"SR (IS-IS)", + "outLabel":3, + "interface":"eth-rt5" } ] }, @@ -43,13 +69,26 @@ "type":"SR (IS-IS)", "outLabel":3, "installed":true, - "nexthop":"10.0.3.2" + "nexthop":"10.0.3.2", + "backupIndex":[ + 0 + ] }, { "type":"SR (IS-IS)", "outLabel":3, "installed":true, - "nexthop":"10.0.2.2" + "nexthop":"10.0.2.2", + "backupIndex":[ + 0 + ] + } + ], + "backupNexthops":[ + { + "type":"SR (IS-IS)", + "outLabel":16030, + "nexthop":"10.0.6.5" } ] }, @@ -61,13 +100,26 @@ "type":"SR (IS-IS)", "outLabel":3, "installed":true, - "interface":"eth-rt2-2" + "interface":"eth-rt2-2", + "backupIndex":[ + 0 + ] }, { "type":"SR (IS-IS)", "outLabel":3, "installed":true, - "interface":"eth-rt2-1" + "interface":"eth-rt2-1", + "backupIndex":[ + 0 + ] + } + ], + "backupNexthops":[ + { + "type":"SR (IS-IS)", + "outLabel":16031, + "interface":"eth-rt5" } ] }, diff --git a/tests/topotests/isis-tilfa-topo1/rt4/step4/show_ip_route.ref.diff b/tests/topotests/isis-tilfa-topo1/rt4/step4/show_ip_route.ref.diff index 09a0eaa424..7dcdb744ac 100644 --- a/tests/topotests/isis-tilfa-topo1/rt4/step4/show_ip_route.ref.diff +++ b/tests/topotests/isis-tilfa-topo1/rt4/step4/show_ip_route.ref.diff @@ -1,58 +1,124 @@ ---- rt4/step3/show_ip_route.ref 2020-08-31 22:42:48.839561398 -0300 -+++ rt4/step4/show_ip_route.ref 2020-08-31 22:42:48.839561398 -0300 -@@ -14,20 +14,14 @@ - "ip":"10.0.2.2", +--- rt4/step3/show_ip_route.ref 2020-09-25 17:48:05.722919797 -0300 ++++ rt4/step4/show_ip_route.ref 2020-09-25 17:49:02.163655010 -0300 +@@ -15,9 +15,6 @@ "afi":"ipv4", "interfaceName":"eth-rt2-1", -- "active":true, -- "labels":[ -- 16010 -- ] -+ "active":true - }, - { - "fib":true, - "ip":"10.0.3.2", + "active":true, +- "backupIndex":[ +- 0 +- ], + "labels":[ + 16010 + ] +@@ -28,21 +25,10 @@ "afi":"ipv4", "interfaceName":"eth-rt2-2", -- "active":true, -- "labels":[ -- 16010 -- ] -+ "active":true + "active":true, +- "backupIndex":[ +- 0 +- ], + "labels":[ + 16010 + ] } +- ], +- "backupNexthops":[ +- { +- "ip":"10.0.6.5", +- "afi":"ipv4", +- "interfaceName":"eth-rt5", +- "active":true +- } ] } -@@ -47,20 +41,14 @@ - "ip":"10.0.2.2", + ], +@@ -62,9 +48,6 @@ "afi":"ipv4", "interfaceName":"eth-rt2-1", -- "active":true, -- "labels":[ -- 3 -- ] -+ "active":true - }, - { - "fib":true, - "ip":"10.0.3.2", + "active":true, +- "backupIndex":[ +- 0 +- ], + "labels":[ + 3 + ] +@@ -75,25 +58,10 @@ "afi":"ipv4", "interfaceName":"eth-rt2-2", + "active":true, +- "backupIndex":[ +- 0 +- ], + "labels":[ + 3 + ] + } +- ], +- "backupNexthops":[ +- { +- "ip":"10.0.6.5", +- "afi":"ipv4", +- "interfaceName":"eth-rt5", - "active":true, - "labels":[ -- 3 +- 16030, +- 16020 - ] -+ "active":true +- } + ] + } + ], +@@ -156,21 +124,10 @@ + "afi":"ipv4", + "interfaceName":"eth-rt5", + "active":true, +- "backupIndex":[ +- 0 +- ], + "labels":[ + 3 + ] + } +- ], +- "backupNexthops":[ +- { +- "ip":"10.0.7.6", +- "afi":"ipv4", +- "interfaceName":"eth-rt6", +- "active":true +- } + ] + } + ], +@@ -190,21 +147,10 @@ + "afi":"ipv4", + "interfaceName":"eth-rt6", + "active":true, +- "backupIndex":[ +- 0 +- ], + "labels":[ + 3 + ] } +- ], +- "backupNexthops":[ +- { +- "ip":"10.0.6.5", +- "afi":"ipv4", +- "interfaceName":"eth-rt5", +- "active":true +- } ] } -@@ -80,30 +68,21 @@ + ], +@@ -223,27 +169,13 @@ "ip":"10.0.2.2", "afi":"ipv4", "interfaceName":"eth-rt2-1", - "active":true, -- "labels":[ -- 16030 +- "backupIndex":[ +- 0 - ] + "active":true }, @@ -62,60 +128,68 @@ "afi":"ipv4", "interfaceName":"eth-rt2-2", - "active":true, -- "labels":[ -- 16030 +- "backupIndex":[ +- 0 - ] -+ "active":true - }, +- } +- ], +- "backupNexthops":[ +- { +- "ip":"10.0.6.5", +- "afi":"ipv4", +- "interfaceName":"eth-rt5", + "active":true + } + ] +@@ -259,30 +191,13 @@ { - "fib":true, - "ip":"10.0.6.5", + "ip":"10.0.2.2", "afi":"ipv4", - "interfaceName":"eth-rt5", -- "active":true, -- "labels":[ -- 16030 +- "interfaceName":"eth-rt2-1", +- "backupIndex":[ +- 0 - ] -+ "active":true - } - ] - } -@@ -123,24 +102,7 @@ - "ip":"10.0.6.5", ++ "interfaceName":"eth-rt2-1" + }, + { + "ip":"10.0.3.2", "afi":"ipv4", - "interfaceName":"eth-rt5", + "interfaceName":"eth-rt2-2", - "active":true, - "backupIndex":[ - 0 -- ], -- "labels":[ -- 3 - ] - } - ], - "backupNexthops":[ - { -- "ip":"10.0.7.6", +- "ip":"10.0.6.5", - "afi":"ipv4", -- "interfaceName":"eth-rt6", +- "interfaceName":"eth-rt5", - "active":true, - "labels":[ -- 3 +- 16030 - ] + "active":true } ] } -@@ -160,24 +122,7 @@ - "ip":"10.0.7.6", +@@ -298,29 +213,12 @@ + "ip":"10.0.2.2", "afi":"ipv4", - "interfaceName":"eth-rt6", + "interfaceName":"eth-rt2-1", - "active":true, - "backupIndex":[ - 0 -- ], -- "labels":[ -- 3 +- ] ++ "active":true + }, + { + "ip":"10.0.3.2", + "afi":"ipv4", +- "interfaceName":"eth-rt2-2", +- "backupIndex":[ +- 0 - ] - } - ], @@ -126,13 +200,13 @@ - "interfaceName":"eth-rt5", - "active":true, - "labels":[ -- 3 +- 16030 - ] -+ "active":true ++ "interfaceName":"eth-rt2-2" } ] } -@@ -266,31 +211,6 @@ +@@ -340,31 +238,6 @@ "ip":"10.0.6.5", "afi":"ipv4", "interfaceName":"eth-rt5", @@ -164,7 +238,7 @@ "active":true } ] -@@ -311,31 +231,6 @@ +@@ -385,31 +258,6 @@ "ip":"10.0.6.5", "afi":"ipv4", "interfaceName":"eth-rt5", @@ -196,7 +270,7 @@ "active":true } ] -@@ -351,18 +246,7 @@ +@@ -425,18 +273,7 @@ { "ip":"10.0.6.5", "afi":"ipv4", @@ -216,7 +290,7 @@ } ] } -@@ -377,18 +261,7 @@ +@@ -451,18 +288,7 @@ { "ip":"10.0.7.6", "afi":"ipv4", diff --git a/tests/topotests/isis-tilfa-topo1/rt4/step4/show_ipv6_route.ref.diff b/tests/topotests/isis-tilfa-topo1/rt4/step4/show_ipv6_route.ref.diff index c1f9fa4bba..b84ceaff1a 100644 --- a/tests/topotests/isis-tilfa-topo1/rt4/step4/show_ipv6_route.ref.diff +++ b/tests/topotests/isis-tilfa-topo1/rt4/step4/show_ipv6_route.ref.diff @@ -1,128 +1,110 @@ ---- rt4/step3/show_ipv6_route.ref 2020-08-31 22:42:48.839561398 -0300 -+++ rt4/step4/show_ipv6_route.ref 2020-08-31 22:42:48.839561398 -0300 -@@ -13,19 +13,13 @@ - "fib":true, - "afi":"ipv6", - "interfaceName":"eth-rt2-2", -- "active":true, -- "labels":[ -- 16011 -- ] -+ "active":true - }, - { - "fib":true, +--- rt4/step3/show_ipv6_route.ref 2020-09-25 17:48:06.998936410 -0300 ++++ rt4/step4/show_ipv6_route.ref 2020-09-25 17:49:03.399671119 -0300 +@@ -14,9 +14,6 @@ "afi":"ipv6", "interfaceName":"eth-rt2-1", -- "active":true, -- "labels":[ -- 16011 -- ] -+ "active":true - } - ] - } -@@ -44,19 +38,13 @@ - "fib":true, + "active":true, +- "backupIndex":[ +- 0 +- ], + "labels":[ + 16011 + ] +@@ -26,20 +23,10 @@ "afi":"ipv6", "interfaceName":"eth-rt2-2", -- "active":true, -- "labels":[ -- 3 -- ] -+ "active":true - }, - { - "fib":true, - "afi":"ipv6", - "interfaceName":"eth-rt2-1", -- "active":true, -- "labels":[ -- 3 -- ] -+ "active":true + "active":true, +- "backupIndex":[ +- 0 +- ], + "labels":[ + 16011 + ] } +- ], +- "backupNexthops":[ +- { +- "afi":"ipv6", +- "interfaceName":"eth-rt5", +- "active":true +- } ] } -@@ -75,28 +63,19 @@ - "fib":true, - "afi":"ipv6", - "interfaceName":"eth-rt2-2", -- "active":true, -- "labels":[ -- 16031 -- ] -+ "active":true - }, - { - "fib":true, - "afi":"ipv6", - "interfaceName":"eth-rt5", -- "active":true, -- "labels":[ -- 16031 -- ] -+ "active":true - }, - { - "fib":true, + ], +@@ -58,9 +45,6 @@ "afi":"ipv6", "interfaceName":"eth-rt2-1", + "active":true, +- "backupIndex":[ +- 0 +- ], + "labels":[ + 3 + ] +@@ -70,24 +54,10 @@ + "afi":"ipv6", + "interfaceName":"eth-rt2-2", + "active":true, +- "backupIndex":[ +- 0 +- ], + "labels":[ + 3 + ] + } +- ], +- "backupNexthops":[ +- { +- "afi":"ipv6", +- "interfaceName":"eth-rt5", - "active":true, - "labels":[ -- 16031 +- 16031, +- 16021 - ] -+ "active":true - } +- } ] } -@@ -115,23 +94,7 @@ - "fib":true, + ], +@@ -146,20 +116,10 @@ "afi":"ipv6", "interfaceName":"eth-rt5", -- "active":true, + "active":true, - "backupIndex":[ - 0 - ], -- "labels":[ -- 3 -- ] -- } + "labels":[ + 3 + ] + } - ], - "backupNexthops":[ - { - "afi":"ipv6", - "interfaceName":"eth-rt6", -- "active":true, -- "labels":[ -- 3 -- ] -+ "active":true - } +- "active":true +- } ] } -@@ -150,23 +113,7 @@ - "fib":true, + ], +@@ -178,20 +138,10 @@ "afi":"ipv6", "interfaceName":"eth-rt6", -- "active":true, + "active":true, - "backupIndex":[ - 0 - ], -- "labels":[ -- 3 -- ] -- } + "labels":[ + 3 + ] + } - ], - "backupNexthops":[ - { - "afi":"ipv6", - "interfaceName":"eth-rt5", -- "active":true, -- "labels":[ -- 3 -- ] -+ "active":true - } +- "active":true +- } ] } + ] diff --git a/tests/topotests/isis-tilfa-topo1/rt4/step4/show_mpls_table.ref.diff b/tests/topotests/isis-tilfa-topo1/rt4/step4/show_mpls_table.ref.diff index 710f81708b..70e0108b0d 100644 --- a/tests/topotests/isis-tilfa-topo1/rt4/step4/show_mpls_table.ref.diff +++ b/tests/topotests/isis-tilfa-topo1/rt4/step4/show_mpls_table.ref.diff @@ -1,135 +1,125 @@ ---- rt4/step3/show_mpls_table.ref 2020-08-31 22:42:48.839561398 -0300 -+++ rt4/step4/show_mpls_table.ref 2020-08-31 22:42:48.839561398 -0300 -@@ -1,210 +1,2 @@ - { -- "16010":{ -- "inLabel":16010, -- "installed":true, -- "nexthops":[ -- { -- "type":"SR (IS-IS)", -- "outLabel":16010, -- "installed":true, -- "nexthop":"10.0.3.2" -- }, -- { -- "type":"SR (IS-IS)", -- "outLabel":16010, -- "installed":true, -- "nexthop":"10.0.2.2" -- } -- ] -- }, -- "16011":{ -- "inLabel":16011, -- "installed":true, -- "nexthops":[ -- { -- "type":"SR (IS-IS)", -- "outLabel":16011, -- "installed":true, -- "interface":"eth-rt2-2" -- }, -- { -- "type":"SR (IS-IS)", -- "outLabel":16011, -- "installed":true, -- "interface":"eth-rt2-1" +--- rt4/step3/show_mpls_table.ref 2020-09-25 17:48:04.418902820 -0300 ++++ rt4/step4/show_mpls_table.ref 2020-09-25 17:49:00.959639319 -0300 +@@ -7,26 +7,13 @@ + "type":"SR (IS-IS)", + "outLabel":16010, + "installed":true, +- "nexthop":"10.0.3.2", +- "backupIndex":[ +- 0 +- ] ++ "nexthop":"10.0.3.2" + }, + { + "type":"SR (IS-IS)", + "outLabel":16010, + "installed":true, +- "nexthop":"10.0.2.2", +- "backupIndex":[ +- 0 +- ] - } -- ] -- }, -- "16020":{ -- "inLabel":16020, -- "installed":true, -- "nexthops":[ -- { -- "type":"SR (IS-IS)", -- "outLabel":3, -- "installed":true, -- "nexthop":"10.0.3.2" -- }, +- ], +- "backupNexthops":[ - { - "type":"SR (IS-IS)", - "outLabel":3, -- "installed":true, -- "nexthop":"10.0.2.2" +- "nexthop":"10.0.6.5" ++ "nexthop":"10.0.2.2" + } + ] + }, +@@ -38,26 +25,13 @@ + "type":"SR (IS-IS)", + "outLabel":16011, + "installed":true, +- "interface":"eth-rt2-2", +- "backupIndex":[ +- 0 +- ] ++ "interface":"eth-rt2-2" + }, + { + "type":"SR (IS-IS)", + "outLabel":16011, + "installed":true, +- "interface":"eth-rt2-1", +- "backupIndex":[ +- 0 +- ] - } -- ] -- }, -- "16021":{ -- "inLabel":16021, -- "installed":true, -- "nexthops":[ -- { -- "type":"SR (IS-IS)", -- "outLabel":3, -- "installed":true, -- "interface":"eth-rt2-2" -- }, +- ], +- "backupNexthops":[ - { - "type":"SR (IS-IS)", - "outLabel":3, -- "installed":true, -- "interface":"eth-rt2-1" +- "interface":"eth-rt5" ++ "interface":"eth-rt2-1" + } + ] + }, +@@ -69,26 +43,13 @@ + "type":"SR (IS-IS)", + "outLabel":3, + "installed":true, +- "nexthop":"10.0.3.2", +- "backupIndex":[ +- 0 +- ] ++ "nexthop":"10.0.3.2" + }, + { + "type":"SR (IS-IS)", + "outLabel":3, + "installed":true, +- "nexthop":"10.0.2.2", +- "backupIndex":[ +- 0 +- ] - } -- ] -- }, -- "16030":{ -- "inLabel":16030, -- "installed":true, -- "nexthops":[ -- { -- "type":"SR (IS-IS)", -- "outLabel":16030, -- "installed":true, -- "nexthop":"10.0.3.2" -- }, -- { -- "type":"SR (IS-IS)", -- "outLabel":16030, -- "installed":true, -- "nexthop":"10.0.2.2" -- }, +- ], +- "backupNexthops":[ - { - "type":"SR (IS-IS)", - "outLabel":16030, -- "installed":true, - "nexthop":"10.0.6.5" ++ "nexthop":"10.0.2.2" + } + ] + }, +@@ -100,26 +61,13 @@ + "type":"SR (IS-IS)", + "outLabel":3, + "installed":true, +- "interface":"eth-rt2-2", +- "backupIndex":[ +- 0 +- ] ++ "interface":"eth-rt2-2" + }, + { + "type":"SR (IS-IS)", + "outLabel":3, + "installed":true, +- "interface":"eth-rt2-1", +- "backupIndex":[ +- 0 +- ] - } -- ] -- }, -- "16031":{ -- "inLabel":16031, -- "installed":true, -- "nexthops":[ -- { -- "type":"SR (IS-IS)", -- "outLabel":16031, -- "installed":true, -- "interface":"eth-rt2-2" -- }, -- { -- "type":"SR (IS-IS)", -- "outLabel":16031, -- "installed":true, -- "interface":"eth-rt2-1" -- }, +- ], +- "backupNexthops":[ - { - "type":"SR (IS-IS)", - "outLabel":16031, -- "installed":true, - "interface":"eth-rt5" -- } -- ] -- }, -- "16050":{ -- "inLabel":16050, -- "installed":true, -- "nexthops":[ -- { -- "type":"SR (IS-IS)", -- "outLabel":3, -- "installed":true, ++ "interface":"eth-rt2-1" + } + ] + }, +@@ -179,17 +127,7 @@ + "type":"SR (IS-IS)", + "outLabel":3, + "installed":true, - "nexthop":"10.0.6.5", - "backupIndex":[ - 0 @@ -141,17 +131,14 @@ - "type":"SR (IS-IS)", - "outLabel":3, - "nexthop":"10.0.7.6" -- } -- ] -- }, -- "16051":{ -- "inLabel":16051, -- "installed":true, -- "nexthops":[ -- { -- "type":"SR (IS-IS)", -- "outLabel":3, -- "installed":true, ++ "nexthop":"10.0.6.5" + } + ] + }, +@@ -201,17 +139,7 @@ + "type":"SR (IS-IS)", + "outLabel":3, + "installed":true, - "interface":"eth-rt5", - "backupIndex":[ - 0 @@ -163,17 +150,14 @@ - "type":"SR (IS-IS)", - "outLabel":3, - "interface":"eth-rt6" -- } -- ] -- }, -- "16060":{ -- "inLabel":16060, -- "installed":true, -- "nexthops":[ -- { -- "type":"SR (IS-IS)", -- "outLabel":3, -- "installed":true, ++ "interface":"eth-rt5" + } + ] + }, +@@ -223,17 +151,7 @@ + "type":"SR (IS-IS)", + "outLabel":3, + "installed":true, - "nexthop":"10.0.7.6", - "backupIndex":[ - 0 @@ -185,17 +169,14 @@ - "type":"SR (IS-IS)", - "outLabel":3, - "nexthop":"10.0.6.5" -- } -- ] -- }, -- "16061":{ -- "inLabel":16061, -- "installed":true, -- "nexthops":[ -- { -- "type":"SR (IS-IS)", -- "outLabel":3, -- "installed":true, ++ "nexthop":"10.0.7.6" + } + ] + }, +@@ -245,17 +163,7 @@ + "type":"SR (IS-IS)", + "outLabel":3, + "installed":true, - "interface":"eth-rt6", - "backupIndex":[ - 0 @@ -207,7 +188,7 @@ - "type":"SR (IS-IS)", - "outLabel":3, - "interface":"eth-rt5" -- } -- ] -- } - } ++ "interface":"eth-rt6" + } + ] + } diff --git a/tests/topotests/isis-tilfa-topo1/rt4/step5/show_ip_route.ref.diff b/tests/topotests/isis-tilfa-topo1/rt4/step5/show_ip_route.ref.diff index e19f6b293c..aa319a3232 100644 --- a/tests/topotests/isis-tilfa-topo1/rt4/step5/show_ip_route.ref.diff +++ b/tests/topotests/isis-tilfa-topo1/rt4/step5/show_ip_route.ref.diff @@ -1,59 +1,125 @@ ---- rt4/step4/show_ip_route.ref 2020-08-31 22:42:48.839561398 -0300 -+++ rt4/step5/show_ip_route.ref 2020-08-31 22:42:48.839561398 -0300 -@@ -14,14 +14,20 @@ - "ip":"10.0.2.2", +--- rt4/step4/show_ip_route.ref 2020-09-25 17:49:02.163655010 -0300 ++++ rt4/step5/show_ip_route.ref 2020-09-25 17:50:12.800576153 -0300 +@@ -15,6 +15,9 @@ "afi":"ipv4", "interfaceName":"eth-rt2-1", -- "active":true -+ "active":true, -+ "labels":[ -+ 16010 -+ ] - }, - { - "fib":true, - "ip":"10.0.3.2", + "active":true, ++ "backupIndex":[ ++ 0 ++ ], + "labels":[ + 16010 + ] +@@ -25,10 +28,21 @@ "afi":"ipv4", "interfaceName":"eth-rt2-2", -- "active":true -+ "active":true, -+ "labels":[ -+ 16010 -+ ] + "active":true, ++ "backupIndex":[ ++ 0 ++ ], + "labels":[ + 16010 + ] } ++ ], ++ "backupNexthops":[ ++ { ++ "ip":"10.0.6.5", ++ "afi":"ipv4", ++ "interfaceName":"eth-rt5", ++ "active":true ++ } ] } -@@ -41,14 +47,20 @@ - "ip":"10.0.2.2", + ], +@@ -48,6 +62,9 @@ "afi":"ipv4", "interfaceName":"eth-rt2-1", -- "active":true -+ "active":true, -+ "labels":[ -+ 3 -+ ] - }, - { - "fib":true, - "ip":"10.0.3.2", + "active":true, ++ "backupIndex":[ ++ 0 ++ ], + "labels":[ + 3 + ] +@@ -58,10 +75,25 @@ "afi":"ipv4", "interfaceName":"eth-rt2-2", -- "active":true + "active":true, ++ "backupIndex":[ ++ 0 ++ ], + "labels":[ + 3 + ] + } ++ ], ++ "backupNexthops":[ ++ { ++ "ip":"10.0.6.5", ++ "afi":"ipv4", ++ "interfaceName":"eth-rt5", + "active":true, + "labels":[ -+ 3 ++ 16030, ++ 16020 + ] ++ } + ] + } + ], +@@ -124,10 +156,21 @@ + "afi":"ipv4", + "interfaceName":"eth-rt5", + "active":true, ++ "backupIndex":[ ++ 0 ++ ], + "labels":[ + 3 + ] + } ++ ], ++ "backupNexthops":[ ++ { ++ "ip":"10.0.7.6", ++ "afi":"ipv4", ++ "interfaceName":"eth-rt6", ++ "active":true ++ } + ] + } + ], +@@ -147,10 +190,21 @@ + "afi":"ipv4", + "interfaceName":"eth-rt6", + "active":true, ++ "backupIndex":[ ++ 0 ++ ], + "labels":[ + 3 + ] } ++ ], ++ "backupNexthops":[ ++ { ++ "ip":"10.0.6.5", ++ "afi":"ipv4", ++ "interfaceName":"eth-rt5", ++ "active":true ++ } ] } -@@ -68,21 +80,30 @@ + ], +@@ -169,13 +223,27 @@ "ip":"10.0.2.2", "afi":"ipv4", "interfaceName":"eth-rt2-1", - "active":true + "active":true, -+ "labels":[ -+ 16030 ++ "backupIndex":[ ++ 0 + ] }, { @@ -61,62 +127,70 @@ "ip":"10.0.3.2", "afi":"ipv4", "interfaceName":"eth-rt2-2", -- "active":true + "active":true, -+ "labels":[ -+ 16030 ++ "backupIndex":[ ++ 0 + ] - }, ++ } ++ ], ++ "backupNexthops":[ ++ { ++ "ip":"10.0.6.5", ++ "afi":"ipv4", ++ "interfaceName":"eth-rt5", + "active":true + } + ] +@@ -191,13 +259,30 @@ { - "fib":true, - "ip":"10.0.6.5", + "ip":"10.0.2.2", "afi":"ipv4", - "interfaceName":"eth-rt5", -- "active":true -+ "active":true, -+ "labels":[ -+ 16030 +- "interfaceName":"eth-rt2-1" ++ "interfaceName":"eth-rt2-1", ++ "backupIndex":[ ++ 0 + ] - } - ] - } -@@ -102,7 +123,24 @@ - "ip":"10.0.6.5", + }, + { + "ip":"10.0.3.2", "afi":"ipv4", - "interfaceName":"eth-rt5", + "interfaceName":"eth-rt2-2", - "active":true + "active":true, + "backupIndex":[ + 0 -+ ], -+ "labels":[ -+ 3 + ] + } + ], + "backupNexthops":[ + { -+ "ip":"10.0.7.6", ++ "ip":"10.0.6.5", + "afi":"ipv4", -+ "interfaceName":"eth-rt6", ++ "interfaceName":"eth-rt5", + "active":true, + "labels":[ -+ 3 ++ 16030 + ] } ] } -@@ -122,7 +160,24 @@ - "ip":"10.0.7.6", +@@ -213,12 +298,29 @@ + "ip":"10.0.2.2", "afi":"ipv4", - "interfaceName":"eth-rt6", + "interfaceName":"eth-rt2-1", - "active":true + "active":true, + "backupIndex":[ + 0 -+ ], -+ "labels":[ -+ 3 ++ ] + }, + { + "ip":"10.0.3.2", + "afi":"ipv4", +- "interfaceName":"eth-rt2-2" ++ "interfaceName":"eth-rt2-2", ++ "backupIndex":[ ++ 0 + ] + } + ], @@ -127,12 +201,12 @@ + "interfaceName":"eth-rt5", + "active":true, + "labels":[ -+ 3 ++ 16030 + ] } ] } -@@ -211,6 +266,31 @@ +@@ -238,6 +340,31 @@ "ip":"10.0.6.5", "afi":"ipv4", "interfaceName":"eth-rt5", @@ -164,7 +238,7 @@ "active":true } ] -@@ -231,6 +311,31 @@ +@@ -258,6 +385,31 @@ "ip":"10.0.6.5", "afi":"ipv4", "interfaceName":"eth-rt5", @@ -196,7 +270,7 @@ "active":true } ] -@@ -246,7 +351,18 @@ +@@ -273,7 +425,18 @@ { "ip":"10.0.6.5", "afi":"ipv4", @@ -216,7 +290,7 @@ } ] } -@@ -261,7 +377,18 @@ +@@ -288,7 +451,18 @@ { "ip":"10.0.7.6", "afi":"ipv4", diff --git a/tests/topotests/isis-tilfa-topo1/rt4/step5/show_ipv6_route.ref.diff b/tests/topotests/isis-tilfa-topo1/rt4/step5/show_ipv6_route.ref.diff index 5289194396..1bd207854c 100644 --- a/tests/topotests/isis-tilfa-topo1/rt4/step5/show_ipv6_route.ref.diff +++ b/tests/topotests/isis-tilfa-topo1/rt4/step5/show_ipv6_route.ref.diff @@ -1,128 +1,110 @@ ---- rt4/step4/show_ipv6_route.ref 2020-08-31 22:42:48.839561398 -0300 -+++ rt4/step5/show_ipv6_route.ref 2020-08-31 22:42:48.839561398 -0300 -@@ -13,13 +13,19 @@ - "fib":true, - "afi":"ipv6", - "interfaceName":"eth-rt2-2", -- "active":true -+ "active":true, -+ "labels":[ -+ 16011 -+ ] - }, - { - "fib":true, +--- rt4/step4/show_ipv6_route.ref 2020-09-25 17:49:03.399671119 -0300 ++++ rt4/step5/show_ipv6_route.ref 2020-09-25 17:50:14.040592332 -0300 +@@ -14,6 +14,9 @@ "afi":"ipv6", "interfaceName":"eth-rt2-1", -- "active":true -+ "active":true, -+ "labels":[ -+ 16011 -+ ] - } - ] - } -@@ -38,13 +44,19 @@ - "fib":true, + "active":true, ++ "backupIndex":[ ++ 0 ++ ], + "labels":[ + 16011 + ] +@@ -23,10 +26,20 @@ "afi":"ipv6", "interfaceName":"eth-rt2-2", -- "active":true -+ "active":true, -+ "labels":[ -+ 3 -+ ] - }, - { - "fib":true, - "afi":"ipv6", - "interfaceName":"eth-rt2-1", -- "active":true -+ "active":true, -+ "labels":[ -+ 3 -+ ] + "active":true, ++ "backupIndex":[ ++ 0 ++ ], + "labels":[ + 16011 + ] } ++ ], ++ "backupNexthops":[ ++ { ++ "afi":"ipv6", ++ "interfaceName":"eth-rt5", ++ "active":true ++ } ] } -@@ -63,19 +75,28 @@ - "fib":true, - "afi":"ipv6", - "interfaceName":"eth-rt2-2", -- "active":true -+ "active":true, -+ "labels":[ -+ 16031 -+ ] - }, - { - "fib":true, - "afi":"ipv6", - "interfaceName":"eth-rt5", -- "active":true -+ "active":true, -+ "labels":[ -+ 16031 -+ ] - }, - { - "fib":true, + ], +@@ -45,6 +58,9 @@ "afi":"ipv6", "interfaceName":"eth-rt2-1", -- "active":true + "active":true, ++ "backupIndex":[ ++ 0 ++ ], + "labels":[ + 3 + ] +@@ -54,10 +70,24 @@ + "afi":"ipv6", + "interfaceName":"eth-rt2-2", + "active":true, ++ "backupIndex":[ ++ 0 ++ ], + "labels":[ + 3 + ] + } ++ ], ++ "backupNexthops":[ ++ { ++ "afi":"ipv6", ++ "interfaceName":"eth-rt5", + "active":true, + "labels":[ -+ 16031 ++ 16031, ++ 16021 + ] - } ++ } ] } -@@ -94,7 +115,23 @@ - "fib":true, + ], +@@ -116,10 +146,20 @@ "afi":"ipv6", "interfaceName":"eth-rt5", -- "active":true -+ "active":true, + "active":true, + "backupIndex":[ + 0 + ], -+ "labels":[ -+ 3 -+ ] -+ } + "labels":[ + 3 + ] + } + ], + "backupNexthops":[ + { + "afi":"ipv6", + "interfaceName":"eth-rt6", -+ "active":true, -+ "labels":[ -+ 3 -+ ] - } ++ "active":true ++ } ] } -@@ -113,7 +150,23 @@ - "fib":true, + ], +@@ -138,10 +178,20 @@ "afi":"ipv6", "interfaceName":"eth-rt6", -- "active":true -+ "active":true, + "active":true, + "backupIndex":[ + 0 + ], -+ "labels":[ -+ 3 -+ ] -+ } + "labels":[ + 3 + ] + } + ], + "backupNexthops":[ + { + "afi":"ipv6", + "interfaceName":"eth-rt5", -+ "active":true, -+ "labels":[ -+ 3 -+ ] - } ++ "active":true ++ } ] } + ] diff --git a/tests/topotests/isis-tilfa-topo1/rt4/step5/show_mpls_table.ref.diff b/tests/topotests/isis-tilfa-topo1/rt4/step5/show_mpls_table.ref.diff index 8bcd28aa2d..664b129a1b 100644 --- a/tests/topotests/isis-tilfa-topo1/rt4/step5/show_mpls_table.ref.diff +++ b/tests/topotests/isis-tilfa-topo1/rt4/step5/show_mpls_table.ref.diff @@ -1,135 +1,126 @@ ---- rt4/step4/show_mpls_table.ref 2020-08-31 22:42:48.839561398 -0300 -+++ rt4/step5/show_mpls_table.ref 2020-08-31 22:42:48.839561398 -0300 -@@ -1,2 +1,210 @@ - { -+ "16010":{ -+ "inLabel":16010, -+ "installed":true, -+ "nexthops":[ -+ { -+ "type":"SR (IS-IS)", -+ "outLabel":16010, -+ "installed":true, -+ "nexthop":"10.0.3.2" -+ }, -+ { -+ "type":"SR (IS-IS)", -+ "outLabel":16010, -+ "installed":true, -+ "nexthop":"10.0.2.2" -+ } -+ ] -+ }, -+ "16011":{ -+ "inLabel":16011, -+ "installed":true, -+ "nexthops":[ -+ { -+ "type":"SR (IS-IS)", -+ "outLabel":16011, -+ "installed":true, -+ "interface":"eth-rt2-2" -+ }, -+ { -+ "type":"SR (IS-IS)", -+ "outLabel":16011, -+ "installed":true, -+ "interface":"eth-rt2-1" +--- rt4/step4/show_mpls_table.ref 2020-09-25 17:49:00.959639319 -0300 ++++ rt4/step5/show_mpls_table.ref 2020-09-25 17:50:11.488559034 -0300 +@@ -7,13 +7,26 @@ + "type":"SR (IS-IS)", + "outLabel":16010, + "installed":true, +- "nexthop":"10.0.3.2" ++ "nexthop":"10.0.3.2", ++ "backupIndex":[ ++ 0 ++ ] + }, + { + "type":"SR (IS-IS)", + "outLabel":16010, + "installed":true, +- "nexthop":"10.0.2.2" ++ "nexthop":"10.0.2.2", ++ "backupIndex":[ ++ 0 ++ ] + } -+ ] -+ }, -+ "16020":{ -+ "inLabel":16020, -+ "installed":true, -+ "nexthops":[ -+ { -+ "type":"SR (IS-IS)", -+ "outLabel":3, -+ "installed":true, -+ "nexthop":"10.0.3.2" -+ }, ++ ], ++ "backupNexthops":[ + { + "type":"SR (IS-IS)", + "outLabel":3, -+ "installed":true, -+ "nexthop":"10.0.2.2" ++ "nexthop":"10.0.6.5" + } + ] + }, +@@ -25,13 +38,26 @@ + "type":"SR (IS-IS)", + "outLabel":16011, + "installed":true, +- "interface":"eth-rt2-2" ++ "interface":"eth-rt2-2", ++ "backupIndex":[ ++ 0 ++ ] + }, + { + "type":"SR (IS-IS)", + "outLabel":16011, + "installed":true, +- "interface":"eth-rt2-1" ++ "interface":"eth-rt2-1", ++ "backupIndex":[ ++ 0 ++ ] + } -+ ] -+ }, -+ "16021":{ -+ "inLabel":16021, -+ "installed":true, -+ "nexthops":[ -+ { -+ "type":"SR (IS-IS)", -+ "outLabel":3, -+ "installed":true, -+ "interface":"eth-rt2-2" -+ }, ++ ], ++ "backupNexthops":[ + { + "type":"SR (IS-IS)", + "outLabel":3, -+ "installed":true, -+ "interface":"eth-rt2-1" ++ "interface":"eth-rt5" + } + ] + }, +@@ -43,13 +69,26 @@ + "type":"SR (IS-IS)", + "outLabel":3, + "installed":true, +- "nexthop":"10.0.3.2" ++ "nexthop":"10.0.3.2", ++ "backupIndex":[ ++ 0 ++ ] + }, + { + "type":"SR (IS-IS)", + "outLabel":3, + "installed":true, +- "nexthop":"10.0.2.2" ++ "nexthop":"10.0.2.2", ++ "backupIndex":[ ++ 0 ++ ] + } -+ ] -+ }, -+ "16030":{ -+ "inLabel":16030, -+ "installed":true, -+ "nexthops":[ -+ { -+ "type":"SR (IS-IS)", -+ "outLabel":16030, -+ "installed":true, -+ "nexthop":"10.0.3.2" -+ }, -+ { -+ "type":"SR (IS-IS)", -+ "outLabel":16030, -+ "installed":true, -+ "nexthop":"10.0.2.2" -+ }, ++ ], ++ "backupNexthops":[ + { + "type":"SR (IS-IS)", + "outLabel":16030, -+ "installed":true, + "nexthop":"10.0.6.5" + } + ] + }, +@@ -61,13 +100,26 @@ + "type":"SR (IS-IS)", + "outLabel":3, + "installed":true, +- "interface":"eth-rt2-2" ++ "interface":"eth-rt2-2", ++ "backupIndex":[ ++ 0 ++ ] + }, + { + "type":"SR (IS-IS)", + "outLabel":3, + "installed":true, +- "interface":"eth-rt2-1" ++ "interface":"eth-rt2-1", ++ "backupIndex":[ ++ 0 ++ ] + } -+ ] -+ }, -+ "16031":{ -+ "inLabel":16031, -+ "installed":true, -+ "nexthops":[ -+ { -+ "type":"SR (IS-IS)", -+ "outLabel":16031, -+ "installed":true, -+ "interface":"eth-rt2-2" -+ }, -+ { -+ "type":"SR (IS-IS)", -+ "outLabel":16031, -+ "installed":true, -+ "interface":"eth-rt2-1" -+ }, ++ ], ++ "backupNexthops":[ + { + "type":"SR (IS-IS)", + "outLabel":16031, -+ "installed":true, + "interface":"eth-rt5" -+ } -+ ] -+ }, -+ "16050":{ -+ "inLabel":16050, -+ "installed":true, -+ "nexthops":[ -+ { -+ "type":"SR (IS-IS)", -+ "outLabel":3, -+ "installed":true, + } + ] + }, +@@ -127,7 +179,17 @@ + "type":"SR (IS-IS)", + "outLabel":3, + "installed":true, +- "nexthop":"10.0.6.5" + "nexthop":"10.0.6.5", + "backupIndex":[ + 0 @@ -141,17 +132,14 @@ + "type":"SR (IS-IS)", + "outLabel":3, + "nexthop":"10.0.7.6" -+ } -+ ] -+ }, -+ "16051":{ -+ "inLabel":16051, -+ "installed":true, -+ "nexthops":[ -+ { -+ "type":"SR (IS-IS)", -+ "outLabel":3, -+ "installed":true, + } + ] + }, +@@ -139,7 +201,17 @@ + "type":"SR (IS-IS)", + "outLabel":3, + "installed":true, +- "interface":"eth-rt5" + "interface":"eth-rt5", + "backupIndex":[ + 0 @@ -163,17 +151,14 @@ + "type":"SR (IS-IS)", + "outLabel":3, + "interface":"eth-rt6" -+ } -+ ] -+ }, -+ "16060":{ -+ "inLabel":16060, -+ "installed":true, -+ "nexthops":[ -+ { -+ "type":"SR (IS-IS)", -+ "outLabel":3, -+ "installed":true, + } + ] + }, +@@ -151,7 +223,17 @@ + "type":"SR (IS-IS)", + "outLabel":3, + "installed":true, +- "nexthop":"10.0.7.6" + "nexthop":"10.0.7.6", + "backupIndex":[ + 0 @@ -185,17 +170,14 @@ + "type":"SR (IS-IS)", + "outLabel":3, + "nexthop":"10.0.6.5" -+ } -+ ] -+ }, -+ "16061":{ -+ "inLabel":16061, -+ "installed":true, -+ "nexthops":[ -+ { -+ "type":"SR (IS-IS)", -+ "outLabel":3, -+ "installed":true, + } + ] + }, +@@ -163,7 +245,17 @@ + "type":"SR (IS-IS)", + "outLabel":3, + "installed":true, +- "interface":"eth-rt6" + "interface":"eth-rt6", + "backupIndex":[ + 0 @@ -207,7 +189,6 @@ + "type":"SR (IS-IS)", + "outLabel":3, + "interface":"eth-rt5" -+ } -+ ] -+ } - } + } + ] + } diff --git a/tests/topotests/isis-tilfa-topo1/rt4/step6/show_ip_route.ref.diff b/tests/topotests/isis-tilfa-topo1/rt4/step6/show_ip_route.ref.diff index 03f31f7273..c758b89839 100644 --- a/tests/topotests/isis-tilfa-topo1/rt4/step6/show_ip_route.ref.diff +++ b/tests/topotests/isis-tilfa-topo1/rt4/step6/show_ip_route.ref.diff @@ -1,6 +1,33 @@ ---- rt4/step5/show_ip_route.ref 2020-08-31 22:42:48.839561398 -0300 -+++ rt4/step6/show_ip_route.ref 2020-08-31 22:42:48.839561398 -0300 -@@ -102,7 +102,7 @@ +--- rt4/step5/show_ip_route.ref 2020-09-25 17:50:12.800576153 -0300 ++++ rt4/step6/show_ip_route.ref 2020-09-25 17:51:15.725397558 -0300 +@@ -90,7 +90,7 @@ + "interfaceName":"eth-rt5", + "active":true, + "labels":[ +- 16030, ++ 30030, + 16020 + ] + } +@@ -134,7 +134,7 @@ + "interfaceName":"eth-rt5", + "active":true, + "labels":[ +- 16030 ++ 30030 + ] + } + ] +@@ -281,7 +281,7 @@ + "interfaceName":"eth-rt5", + "active":true, + "labels":[ +- 16030 ++ 30030 + ] + } + ] +@@ -319,7 +319,7 @@ "interfaceName":"eth-rt5", "active":true, "labels":[ diff --git a/tests/topotests/isis-tilfa-topo1/rt4/step6/show_ipv6_route.ref.diff b/tests/topotests/isis-tilfa-topo1/rt4/step6/show_ipv6_route.ref.diff index 43621e117c..ca495216dd 100644 --- a/tests/topotests/isis-tilfa-topo1/rt4/step6/show_ipv6_route.ref.diff +++ b/tests/topotests/isis-tilfa-topo1/rt4/step6/show_ipv6_route.ref.diff @@ -1,6 +1,15 @@ ---- rt4/step5/show_ipv6_route.ref 2020-08-31 22:42:48.839561398 -0300 -+++ rt4/step6/show_ipv6_route.ref 2020-08-31 22:42:48.839561398 -0300 -@@ -86,7 +86,7 @@ +--- rt4/step5/show_ipv6_route.ref 2020-09-25 17:50:14.040592332 -0300 ++++ rt4/step6/show_ipv6_route.ref 2020-09-25 17:51:16.969413804 -0300 +@@ -84,7 +84,7 @@ + "interfaceName":"eth-rt5", + "active":true, + "labels":[ +- 16031, ++ 30031, + 16021 + ] + } +@@ -116,7 +116,7 @@ "interfaceName":"eth-rt5", "active":true, "labels":[ diff --git a/tests/topotests/isis-tilfa-topo1/rt4/step6/show_mpls_table.ref.diff b/tests/topotests/isis-tilfa-topo1/rt4/step6/show_mpls_table.ref.diff index 871824bb6a..630e0419cf 100644 --- a/tests/topotests/isis-tilfa-topo1/rt4/step6/show_mpls_table.ref.diff +++ b/tests/topotests/isis-tilfa-topo1/rt4/step6/show_mpls_table.ref.diff @@ -1,6 +1,24 @@ ---- rt4/step5/show_mpls_table.ref 2020-08-31 22:42:48.839561398 -0300 -+++ rt4/step6/show_mpls_table.ref 2020-08-31 22:42:48.839561398 -0300 -@@ -89,7 +89,7 @@ +--- rt4/step5/show_mpls_table.ref 2020-09-25 17:50:11.488559034 -0300 ++++ rt4/step6/show_mpls_table.ref 2020-09-25 17:51:14.481381312 -0300 +@@ -87,7 +87,7 @@ + "backupNexthops":[ + { + "type":"SR (IS-IS)", +- "outLabel":16030, ++ "outLabel":30030, + "nexthop":"10.0.6.5" + } + ] +@@ -118,7 +118,7 @@ + "backupNexthops":[ + { + "type":"SR (IS-IS)", +- "outLabel":16031, ++ "outLabel":30031, + "interface":"eth-rt5" + } + ] +@@ -141,7 +141,7 @@ }, { "type":"SR (IS-IS)", @@ -9,7 +27,7 @@ "installed":true, "nexthop":"10.0.6.5" } -@@ -113,7 +113,7 @@ +@@ -165,7 +165,7 @@ }, { "type":"SR (IS-IS)", diff --git a/tests/topotests/isis-tilfa-topo1/rt4/step7/show_ip_route.ref.diff b/tests/topotests/isis-tilfa-topo1/rt4/step7/show_ip_route.ref.diff index 1f1de16c0e..30e0dcf3c0 100644 --- a/tests/topotests/isis-tilfa-topo1/rt4/step7/show_ip_route.ref.diff +++ b/tests/topotests/isis-tilfa-topo1/rt4/step7/show_ip_route.ref.diff @@ -1,6 +1,6 @@ ---- rt4/step6/show_ip_route.ref 2020-08-31 22:42:48.839561398 -0300 -+++ rt4/step7/show_ip_route.ref 2020-08-31 22:42:48.839561398 -0300 -@@ -126,9 +126,6 @@ +--- rt4/step6/show_ip_route.ref 2020-09-25 17:51:15.725397558 -0300 ++++ rt4/step7/show_ip_route.ref 2020-09-25 17:52:02.614010084 -0300 +@@ -158,9 +158,6 @@ "active":true, "backupIndex":[ 0 @@ -10,15 +10,3 @@ ] } ], -@@ -137,10 +134,7 @@ - "ip":"10.0.7.6", - "afi":"ipv4", - "interfaceName":"eth-rt6", -- "active":true, -- "labels":[ -- 3 -- ] -+ "active":true - } - ] - } diff --git a/tests/topotests/isis-tilfa-topo1/rt4/step7/show_ipv6_route.ref.diff b/tests/topotests/isis-tilfa-topo1/rt4/step7/show_ipv6_route.ref.diff index 1c2f0f6fef..2606027d75 100644 --- a/tests/topotests/isis-tilfa-topo1/rt4/step7/show_ipv6_route.ref.diff +++ b/tests/topotests/isis-tilfa-topo1/rt4/step7/show_ipv6_route.ref.diff @@ -1,6 +1,6 @@ ---- rt4/step6/show_ipv6_route.ref 2020-08-31 22:42:48.839561398 -0300 -+++ rt4/step7/show_ipv6_route.ref 2020-08-31 22:42:48.839561398 -0300 -@@ -118,9 +118,6 @@ +--- rt4/step6/show_ipv6_route.ref 2020-09-25 17:51:16.969413804 -0300 ++++ rt4/step7/show_ipv6_route.ref 2020-09-25 17:52:03.854026287 -0300 +@@ -148,9 +148,6 @@ "active":true, "backupIndex":[ 0 @@ -10,15 +10,3 @@ ] } ], -@@ -128,10 +125,7 @@ - { - "afi":"ipv6", - "interfaceName":"eth-rt6", -- "active":true, -- "labels":[ -- 3 -- ] -+ "active":true - } - ] - } diff --git a/tests/topotests/isis-tilfa-topo1/rt4/step7/show_mpls_table.ref.diff b/tests/topotests/isis-tilfa-topo1/rt4/step7/show_mpls_table.ref.diff index dfe7aef93a..5334cfd048 100644 --- a/tests/topotests/isis-tilfa-topo1/rt4/step7/show_mpls_table.ref.diff +++ b/tests/topotests/isis-tilfa-topo1/rt4/step7/show_mpls_table.ref.diff @@ -1,6 +1,6 @@ ---- rt4/step6/show_mpls_table.ref 2020-08-31 22:42:48.839561398 -0300 -+++ rt4/step7/show_mpls_table.ref 2020-08-31 22:42:48.839561398 -0300 -@@ -119,50 +119,6 @@ +--- rt4/step6/show_mpls_table.ref 2020-09-25 17:51:14.481381312 -0300 ++++ rt4/step7/show_mpls_table.ref 2020-09-25 17:52:01.385994037 -0300 +@@ -171,50 +171,6 @@ } ] }, diff --git a/tests/topotests/isis-tilfa-topo1/rt4/step8/show_ip_route.ref.diff b/tests/topotests/isis-tilfa-topo1/rt4/step8/show_ip_route.ref.diff index e9445650a7..b393970e42 100644 --- a/tests/topotests/isis-tilfa-topo1/rt4/step8/show_ip_route.ref.diff +++ b/tests/topotests/isis-tilfa-topo1/rt4/step8/show_ip_route.ref.diff @@ -1,6 +1,6 @@ ---- rt4/step7/show_ip_route.ref 2020-08-31 22:42:48.839561398 -0300 -+++ rt4/step8/show_ip_route.ref 2020-08-31 22:42:48.839561398 -0300 -@@ -126,6 +126,9 @@ +--- rt4/step7/show_ip_route.ref 2020-09-25 17:52:02.614010084 -0300 ++++ rt4/step8/show_ip_route.ref 2020-09-25 17:53:20.623029909 -0300 +@@ -158,6 +158,9 @@ "active":true, "backupIndex":[ 0 @@ -10,15 +10,3 @@ ] } ], -@@ -134,7 +137,10 @@ - "ip":"10.0.7.6", - "afi":"ipv4", - "interfaceName":"eth-rt6", -- "active":true -+ "active":true, -+ "labels":[ -+ 3 -+ ] - } - ] - } diff --git a/tests/topotests/isis-tilfa-topo1/rt4/step8/show_ipv6_route.ref.diff b/tests/topotests/isis-tilfa-topo1/rt4/step8/show_ipv6_route.ref.diff index 0d699ad92e..8bad2edcf3 100644 --- a/tests/topotests/isis-tilfa-topo1/rt4/step8/show_ipv6_route.ref.diff +++ b/tests/topotests/isis-tilfa-topo1/rt4/step8/show_ipv6_route.ref.diff @@ -1,6 +1,6 @@ ---- rt4/step7/show_ipv6_route.ref 2020-08-31 22:42:48.839561398 -0300 -+++ rt4/step8/show_ipv6_route.ref 2020-08-31 22:42:48.839561398 -0300 -@@ -118,6 +118,9 @@ +--- rt4/step7/show_ipv6_route.ref 2020-09-25 17:52:03.854026287 -0300 ++++ rt4/step8/show_ipv6_route.ref 2020-09-25 17:53:21.843045865 -0300 +@@ -148,6 +148,9 @@ "active":true, "backupIndex":[ 0 @@ -10,15 +10,3 @@ ] } ], -@@ -125,7 +128,10 @@ - { - "afi":"ipv6", - "interfaceName":"eth-rt6", -- "active":true -+ "active":true, -+ "labels":[ -+ 3 -+ ] - } - ] - } diff --git a/tests/topotests/isis-tilfa-topo1/rt4/step8/show_mpls_table.ref.diff b/tests/topotests/isis-tilfa-topo1/rt4/step8/show_mpls_table.ref.diff index 145d3b1fa1..d296dbdcaf 100644 --- a/tests/topotests/isis-tilfa-topo1/rt4/step8/show_mpls_table.ref.diff +++ b/tests/topotests/isis-tilfa-topo1/rt4/step8/show_mpls_table.ref.diff @@ -1,6 +1,6 @@ ---- rt4/step7/show_mpls_table.ref 2020-08-31 22:42:48.839561398 -0300 -+++ rt4/step8/show_mpls_table.ref 2020-08-31 22:42:48.839561398 -0300 -@@ -119,6 +119,50 @@ +--- rt4/step7/show_mpls_table.ref 2020-09-25 17:52:01.385994037 -0300 ++++ rt4/step8/show_mpls_table.ref 2020-09-25 17:53:19.371013534 -0300 +@@ -171,6 +171,50 @@ } ] }, diff --git a/tests/topotests/isis-tilfa-topo1/rt4/step9/show_mpls_table.ref.diff b/tests/topotests/isis-tilfa-topo1/rt4/step9/show_mpls_table.ref.diff index 6ae67bcfbe..408cbfb0ba 100644 --- a/tests/topotests/isis-tilfa-topo1/rt4/step9/show_mpls_table.ref.diff +++ b/tests/topotests/isis-tilfa-topo1/rt4/step9/show_mpls_table.ref.diff @@ -1,6 +1,6 @@ ---- rt4/step8/show_mpls_table.ref 2020-08-31 22:42:48.839561398 -0300 -+++ rt4/step9/show_mpls_table.ref 2020-08-31 22:42:48.839561398 -0300 -@@ -119,15 +119,15 @@ +--- rt4/step8/show_mpls_table.ref 2020-09-25 17:53:19.371013534 -0300 ++++ rt4/step9/show_mpls_table.ref 2020-09-25 17:54:37.064030042 -0300 +@@ -171,15 +171,15 @@ } ] }, @@ -19,7 +19,7 @@ "backupIndex":[ 0 ] -@@ -137,19 +137,19 @@ +@@ -189,19 +189,19 @@ { "type":"SR (IS-IS)", "outLabel":3, @@ -43,7 +43,7 @@ "backupIndex":[ 0 ] -@@ -159,19 +159,19 @@ +@@ -211,19 +211,19 @@ { "type":"SR (IS-IS)", "outLabel":3, @@ -67,7 +67,7 @@ "backupIndex":[ 0 ] -@@ -181,19 +181,19 @@ +@@ -233,19 +233,19 @@ { "type":"SR (IS-IS)", "outLabel":3, @@ -91,7 +91,7 @@ "backupIndex":[ 0 ] -@@ -203,7 +203,7 @@ +@@ -255,7 +255,7 @@ { "type":"SR (IS-IS)", "outLabel":3, diff --git a/tests/topotests/isis-tilfa-topo1/rt5/step1/show_ip_route.ref b/tests/topotests/isis-tilfa-topo1/rt5/step1/show_ip_route.ref index ce320d0b12..f747065f9c 100644 --- a/tests/topotests/isis-tilfa-topo1/rt5/step1/show_ip_route.ref +++ b/tests/topotests/isis-tilfa-topo1/rt5/step1/show_ip_route.ref @@ -15,6 +15,9 @@ "afi":"ipv4", "interfaceName":"eth-rt3-1", "active":true, + "backupIndex":[ + 0 + ], "labels":[ 16010 ] @@ -25,10 +28,21 @@ "afi":"ipv4", "interfaceName":"eth-rt3-2", "active":true, + "backupIndex":[ + 0 + ], "labels":[ 16010 ] } + ], + "backupNexthops":[ + { + "ip":"10.0.6.4", + "afi":"ipv4", + "interfaceName":"eth-rt4", + "active":true + } ] } ], @@ -91,6 +105,9 @@ "afi":"ipv4", "interfaceName":"eth-rt3-1", "active":true, + "backupIndex":[ + 0 + ], "labels":[ 3 ] @@ -101,10 +118,25 @@ "afi":"ipv4", "interfaceName":"eth-rt3-2", "active":true, + "backupIndex":[ + 0 + ], "labels":[ 3 ] } + ], + "backupNexthops":[ + { + "ip":"10.0.6.4", + "afi":"ipv4", + "interfaceName":"eth-rt4", + "active":true, + "labels":[ + 16020, + 16030 + ] + } ] } ], @@ -137,10 +169,7 @@ "ip":"10.0.8.6", "afi":"ipv4", "interfaceName":"eth-rt6", - "active":true, - "labels":[ - 3 - ] + "active":true } ] } @@ -174,10 +203,7 @@ "ip":"10.0.6.4", "afi":"ipv4", "interfaceName":"eth-rt4", - "active":true, - "labels":[ - 3 - ] + "active":true } ] } @@ -197,13 +223,27 @@ "ip":"10.0.4.3", "afi":"ipv4", "interfaceName":"eth-rt3-1", - "active":true + "active":true, + "backupIndex":[ + 0 + ] }, { "fib":true, "ip":"10.0.5.3", "afi":"ipv4", "interfaceName":"eth-rt3-2", + "active":true, + "backupIndex":[ + 0 + ] + } + ], + "backupNexthops":[ + { + "ip":"10.0.6.4", + "afi":"ipv4", + "interfaceName":"eth-rt4", "active":true } ] @@ -309,13 +349,30 @@ { "ip":"10.0.4.3", "afi":"ipv4", - "interfaceName":"eth-rt3-1" + "interfaceName":"eth-rt3-1", + "backupIndex":[ + 0 + ] }, { "ip":"10.0.5.3", "afi":"ipv4", "interfaceName":"eth-rt3-2", - "active":true + "active":true, + "backupIndex":[ + 0 + ] + } + ], + "backupNexthops":[ + { + "ip":"10.0.6.4", + "afi":"ipv4", + "interfaceName":"eth-rt4", + "active":true, + "labels":[ + 16020 + ] } ] } @@ -331,12 +388,29 @@ "ip":"10.0.4.3", "afi":"ipv4", "interfaceName":"eth-rt3-1", - "active":true + "active":true, + "backupIndex":[ + 0 + ] }, { "ip":"10.0.5.3", "afi":"ipv4", - "interfaceName":"eth-rt3-2" + "interfaceName":"eth-rt3-2", + "backupIndex":[ + 0 + ] + } + ], + "backupNexthops":[ + { + "ip":"10.0.6.4", + "afi":"ipv4", + "interfaceName":"eth-rt4", + "active":true, + "labels":[ + 16020 + ] } ] } diff --git a/tests/topotests/isis-tilfa-topo1/rt5/step1/show_ipv6_route.ref b/tests/topotests/isis-tilfa-topo1/rt5/step1/show_ipv6_route.ref index 5bda17760e..6c0a5e0b9b 100644 --- a/tests/topotests/isis-tilfa-topo1/rt5/step1/show_ipv6_route.ref +++ b/tests/topotests/isis-tilfa-topo1/rt5/step1/show_ipv6_route.ref @@ -14,6 +14,9 @@ "afi":"ipv6", "interfaceName":"eth-rt3-1", "active":true, + "backupIndex":[ + 0 + ], "labels":[ 16011 ] @@ -23,10 +26,20 @@ "afi":"ipv6", "interfaceName":"eth-rt3-2", "active":true, + "backupIndex":[ + 0 + ], "labels":[ 16011 ] } + ], + "backupNexthops":[ + { + "afi":"ipv6", + "interfaceName":"eth-rt4", + "active":true + } ] } ], @@ -43,7 +56,7 @@ { "fib":true, "afi":"ipv6", - "interfaceName":"eth-rt3-1", + "interfaceName":"eth-rt4", "active":true, "labels":[ 16021 @@ -52,7 +65,7 @@ { "fib":true, "afi":"ipv6", - "interfaceName":"eth-rt4", + "interfaceName":"eth-rt3-1", "active":true, "labels":[ 16021 @@ -85,6 +98,9 @@ "afi":"ipv6", "interfaceName":"eth-rt3-1", "active":true, + "backupIndex":[ + 0 + ], "labels":[ 3 ] @@ -94,10 +110,24 @@ "afi":"ipv6", "interfaceName":"eth-rt3-2", "active":true, + "backupIndex":[ + 0 + ], "labels":[ 3 ] } + ], + "backupNexthops":[ + { + "afi":"ipv6", + "interfaceName":"eth-rt4", + "active":true, + "labels":[ + 16021, + 16031 + ] + } ] } ], @@ -128,10 +158,7 @@ { "afi":"ipv6", "interfaceName":"eth-rt6", - "active":true, - "labels":[ - 3 - ] + "active":true } ] } @@ -163,10 +190,7 @@ { "afi":"ipv6", "interfaceName":"eth-rt4", - "active":true, - "labels":[ - 3 - ] + "active":true } ] } diff --git a/tests/topotests/isis-tilfa-topo1/rt5/step1/show_mpls_table.ref b/tests/topotests/isis-tilfa-topo1/rt5/step1/show_mpls_table.ref index 84ba09910c..2b70392adc 100644 --- a/tests/topotests/isis-tilfa-topo1/rt5/step1/show_mpls_table.ref +++ b/tests/topotests/isis-tilfa-topo1/rt5/step1/show_mpls_table.ref @@ -7,13 +7,26 @@ "type":"SR (IS-IS)", "outLabel":16010, "installed":true, - "nexthop":"10.0.5.3" + "nexthop":"10.0.5.3", + "backupIndex":[ + 0 + ] }, { "type":"SR (IS-IS)", "outLabel":16010, "installed":true, - "nexthop":"10.0.4.3" + "nexthop":"10.0.4.3", + "backupIndex":[ + 0 + ] + } + ], + "backupNexthops":[ + { + "type":"SR (IS-IS)", + "outLabel":3, + "nexthop":"10.0.6.4" } ] }, @@ -25,13 +38,26 @@ "type":"SR (IS-IS)", "outLabel":16011, "installed":true, - "interface":"eth-rt3-2" + "interface":"eth-rt3-2", + "backupIndex":[ + 0 + ] }, { "type":"SR (IS-IS)", "outLabel":16011, "installed":true, - "interface":"eth-rt3-1" + "interface":"eth-rt3-1", + "backupIndex":[ + 0 + ] + } + ], + "backupNexthops":[ + { + "type":"SR (IS-IS)", + "outLabel":3, + "interface":"eth-rt4" } ] }, @@ -91,13 +117,26 @@ "type":"SR (IS-IS)", "outLabel":3, "installed":true, - "nexthop":"10.0.5.3" + "nexthop":"10.0.5.3", + "backupIndex":[ + 0 + ] }, { "type":"SR (IS-IS)", "outLabel":3, "installed":true, - "nexthop":"10.0.4.3" + "nexthop":"10.0.4.3", + "backupIndex":[ + 0 + ] + } + ], + "backupNexthops":[ + { + "type":"SR (IS-IS)", + "outLabel":16020, + "nexthop":"10.0.6.4" } ] }, @@ -109,13 +148,26 @@ "type":"SR (IS-IS)", "outLabel":3, "installed":true, - "interface":"eth-rt3-2" + "interface":"eth-rt3-2", + "backupIndex":[ + 0 + ] }, { "type":"SR (IS-IS)", "outLabel":3, "installed":true, - "interface":"eth-rt3-1" + "interface":"eth-rt3-1", + "backupIndex":[ + 0 + ] + } + ], + "backupNexthops":[ + { + "type":"SR (IS-IS)", + "outLabel":16021, + "interface":"eth-rt4" } ] }, diff --git a/tests/topotests/isis-tilfa-topo1/rt5/step4/show_ip_route.ref.diff b/tests/topotests/isis-tilfa-topo1/rt5/step4/show_ip_route.ref.diff index f9f01414c9..6402b51893 100644 --- a/tests/topotests/isis-tilfa-topo1/rt5/step4/show_ip_route.ref.diff +++ b/tests/topotests/isis-tilfa-topo1/rt5/step4/show_ip_route.ref.diff @@ -1,15 +1,54 @@ ---- rt5/step3/show_ip_route.ref 2020-08-31 22:42:48.839561398 -0300 -+++ rt5/step4/show_ip_route.ref 2020-08-31 22:42:48.843561366 -0300 -@@ -69,7 +69,7 @@ +--- rt5/step3/show_ip_route.ref 2020-09-25 17:48:05.950922766 -0300 ++++ rt5/step4/show_ip_route.ref 2020-09-25 17:49:02.363657616 -0300 +@@ -81,10 +81,7 @@ + "ip":"10.0.6.4", + "afi":"ipv4", "interfaceName":"eth-rt4", +- "active":true, +- "labels":[ +- 16020 +- ] ++ "active":true + } + ] + } +@@ -105,9 +102,6 @@ + "afi":"ipv4", + "interfaceName":"eth-rt3-1", "active":true, +- "backupIndex":[ +- 0 +- ], "labels":[ -- 16020 -+ 3 + 3 + ] +@@ -118,25 +112,10 @@ + "afi":"ipv4", + "interfaceName":"eth-rt3-2", + "active":true, +- "backupIndex":[ +- 0 +- ], + "labels":[ + 3 ] } +- ], +- "backupNexthops":[ +- { +- "ip":"10.0.6.4", +- "afi":"ipv4", +- "interfaceName":"eth-rt4", +- "active":true, +- "labels":[ +- 16020, +- 16030 +- ] +- } ] -@@ -126,9 +126,6 @@ + } + ], +@@ -158,9 +137,6 @@ "active":true, "backupIndex":[ 0 @@ -19,15 +58,68 @@ ] } ], -@@ -137,10 +134,7 @@ - "ip":"10.0.8.6", +@@ -349,30 +325,13 @@ + { + "ip":"10.0.4.3", + "afi":"ipv4", +- "interfaceName":"eth-rt3-1", +- "backupIndex":[ +- 0 +- ] ++ "interfaceName":"eth-rt3-1" + }, + { + "ip":"10.0.5.3", "afi":"ipv4", - "interfaceName":"eth-rt6", + "interfaceName":"eth-rt3-2", +- "active":true, +- "backupIndex":[ +- 0 +- ] +- } +- ], +- "backupNexthops":[ +- { +- "ip":"10.0.6.4", +- "afi":"ipv4", +- "interfaceName":"eth-rt4", - "active":true, - "labels":[ -- 3 +- 16020 +- ] ++ "active":true + } + ] + } +@@ -388,29 +347,12 @@ + "ip":"10.0.4.3", + "afi":"ipv4", + "interfaceName":"eth-rt3-1", +- "active":true, +- "backupIndex":[ +- 0 - ] + "active":true + }, + { + "ip":"10.0.5.3", + "afi":"ipv4", +- "interfaceName":"eth-rt3-2", +- "backupIndex":[ +- 0 +- ] +- } +- ], +- "backupNexthops":[ +- { +- "ip":"10.0.6.4", +- "afi":"ipv4", +- "interfaceName":"eth-rt4", +- "active":true, +- "labels":[ +- 16020 +- ] ++ "interfaceName":"eth-rt3-2" } ] } diff --git a/tests/topotests/isis-tilfa-topo1/rt5/step4/show_ipv6_route.ref.diff b/tests/topotests/isis-tilfa-topo1/rt5/step4/show_ipv6_route.ref.diff index 3e3c7d8541..7a0135bf04 100644 --- a/tests/topotests/isis-tilfa-topo1/rt5/step4/show_ipv6_route.ref.diff +++ b/tests/topotests/isis-tilfa-topo1/rt5/step4/show_ipv6_route.ref.diff @@ -1,33 +1,59 @@ ---- rt5/step3/show_ipv6_route.ref 2020-08-31 22:42:48.839561398 -0300 -+++ rt5/step4/show_ipv6_route.ref 2020-08-31 22:42:48.843561366 -0300 -@@ -55,7 +55,7 @@ +--- rt5/step3/show_ipv6_route.ref 2020-09-25 17:48:07.218939274 -0300 ++++ rt5/step4/show_ipv6_route.ref 2020-09-25 17:49:03.599673726 -0300 +@@ -57,10 +57,7 @@ + "fib":true, + "afi":"ipv6", "interfaceName":"eth-rt4", - "active":true, - "labels":[ +- "active":true, +- "labels":[ - 16021 -+ 3 - ] +- ] ++ "active":true }, { -@@ -118,9 +118,6 @@ + "fib":true, +@@ -98,9 +95,6 @@ + "afi":"ipv6", + "interfaceName":"eth-rt3-1", "active":true, - "backupIndex":[ - 0 +- "backupIndex":[ +- 0 - ], -- "labels":[ -- 3 + "labels":[ + 3 ] - } - ], -@@ -128,10 +125,7 @@ - { +@@ -110,24 +104,10 @@ "afi":"ipv6", - "interfaceName":"eth-rt6", + "interfaceName":"eth-rt3-2", + "active":true, +- "backupIndex":[ +- 0 +- ], + "labels":[ + 3 + ] + } +- ], +- "backupNexthops":[ +- { +- "afi":"ipv6", +- "interfaceName":"eth-rt4", - "active":true, - "labels":[ -- 3 +- 16021, +- 16031 - ] -+ "active":true - } +- } ] } + ], +@@ -148,9 +128,6 @@ + "active":true, + "backupIndex":[ + 0 +- ], +- "labels":[ +- 3 + ] + } + ], diff --git a/tests/topotests/isis-tilfa-topo1/rt5/step4/show_mpls_table.ref.diff b/tests/topotests/isis-tilfa-topo1/rt5/step4/show_mpls_table.ref.diff index 21c426e678..299dac7640 100644 --- a/tests/topotests/isis-tilfa-topo1/rt5/step4/show_mpls_table.ref.diff +++ b/tests/topotests/isis-tilfa-topo1/rt5/step4/show_mpls_table.ref.diff @@ -1,27 +1,88 @@ ---- rt5/step3/show_mpls_table.ref 2020-08-31 22:42:48.843561366 -0300 -+++ rt5/step4/show_mpls_table.ref 2020-08-31 22:42:48.843561366 -0300 -@@ -53,7 +53,7 @@ - }, - { - "type":"SR (IS-IS)", +--- rt5/step3/show_mpls_table.ref 2020-09-25 17:48:04.626905528 -0300 ++++ rt5/step4/show_mpls_table.ref 2020-09-25 17:49:01.159641924 -0300 +@@ -76,12 +76,6 @@ + "outLabel":16020, + "installed":true, + "nexthop":"10.0.4.3" +- }, +- { +- "type":"SR (IS-IS)", - "outLabel":16020, -+ "outLabel":3, +- "installed":true, +- "nexthop":"10.0.6.4" + } + ] + }, +@@ -100,12 +94,6 @@ + "outLabel":16021, "installed":true, - "nexthop":"10.0.6.4" + "interface":"eth-rt3-1" +- }, +- { +- "type":"SR (IS-IS)", +- "outLabel":16021, +- "installed":true, +- "interface":"eth-rt4" } -@@ -77,7 +77,7 @@ + ] + }, +@@ -117,26 +105,13 @@ + "type":"SR (IS-IS)", + "outLabel":3, + "installed":true, +- "nexthop":"10.0.5.3", +- "backupIndex":[ +- 0 +- ] ++ "nexthop":"10.0.5.3" }, { "type":"SR (IS-IS)", -- "outLabel":16021, -+ "outLabel":3, + "outLabel":3, "installed":true, - "interface":"eth-rt4" - } -@@ -119,50 +119,6 @@ +- "nexthop":"10.0.4.3", +- "backupIndex":[ +- 0 +- ] +- } +- ], +- "backupNexthops":[ +- { +- "type":"SR (IS-IS)", +- "outLabel":16020, +- "nexthop":"10.0.6.4" ++ "nexthop":"10.0.4.3" } ] }, +@@ -148,70 +123,13 @@ + "type":"SR (IS-IS)", + "outLabel":3, + "installed":true, +- "interface":"eth-rt3-2", +- "backupIndex":[ +- 0 +- ] ++ "interface":"eth-rt3-2" + }, + { + "type":"SR (IS-IS)", + "outLabel":3, + "installed":true, +- "interface":"eth-rt3-1", +- "backupIndex":[ +- 0 +- ] +- } +- ], +- "backupNexthops":[ +- { +- "type":"SR (IS-IS)", +- "outLabel":16021, +- "interface":"eth-rt4" +- } +- ] +- }, - "16040":{ - "inLabel":16040, - "installed":true, @@ -63,9 +124,7 @@ - "type":"SR (IS-IS)", - "outLabel":3, - "interface":"eth-rt6" -- } -- ] -- }, - "16060":{ - "inLabel":16060, - "installed":true, ++ "interface":"eth-rt3-1" + } + ] + }, diff --git a/tests/topotests/isis-tilfa-topo1/rt5/step5/show_ip_route.ref.diff b/tests/topotests/isis-tilfa-topo1/rt5/step5/show_ip_route.ref.diff index 49253b130f..31f70b17a3 100644 --- a/tests/topotests/isis-tilfa-topo1/rt5/step5/show_ip_route.ref.diff +++ b/tests/topotests/isis-tilfa-topo1/rt5/step5/show_ip_route.ref.diff @@ -1,15 +1,54 @@ ---- rt5/step4/show_ip_route.ref 2020-08-31 22:42:48.843561366 -0300 -+++ rt5/step5/show_ip_route.ref 2020-08-31 22:42:48.843561366 -0300 -@@ -69,7 +69,7 @@ +--- rt5/step4/show_ip_route.ref 2020-09-25 17:49:02.363657616 -0300 ++++ rt5/step5/show_ip_route.ref 2020-09-25 17:50:13.012578918 -0300 +@@ -81,7 +81,10 @@ + "ip":"10.0.6.4", + "afi":"ipv4", "interfaceName":"eth-rt4", +- "active":true ++ "active":true, ++ "labels":[ ++ 16020 ++ ] + } + ] + } +@@ -102,6 +105,9 @@ + "afi":"ipv4", + "interfaceName":"eth-rt3-1", "active":true, ++ "backupIndex":[ ++ 0 ++ ], "labels":[ -- 3 -+ 16020 + 3 + ] +@@ -112,10 +118,25 @@ + "afi":"ipv4", + "interfaceName":"eth-rt3-2", + "active":true, ++ "backupIndex":[ ++ 0 ++ ], + "labels":[ + 3 ] } ++ ], ++ "backupNexthops":[ ++ { ++ "ip":"10.0.6.4", ++ "afi":"ipv4", ++ "interfaceName":"eth-rt4", ++ "active":true, ++ "labels":[ ++ 16020, ++ 16030 ++ ] ++ } ] -@@ -126,6 +126,9 @@ + } + ], +@@ -137,6 +158,9 @@ "active":true, "backupIndex":[ 0 @@ -19,14 +58,67 @@ ] } ], -@@ -134,7 +137,10 @@ - "ip":"10.0.8.6", +@@ -325,13 +349,30 @@ + { + "ip":"10.0.4.3", + "afi":"ipv4", +- "interfaceName":"eth-rt3-1" ++ "interfaceName":"eth-rt3-1", ++ "backupIndex":[ ++ 0 ++ ] + }, + { + "ip":"10.0.5.3", "afi":"ipv4", - "interfaceName":"eth-rt6", + "interfaceName":"eth-rt3-2", - "active":true + "active":true, ++ "backupIndex":[ ++ 0 ++ ] ++ } ++ ], ++ "backupNexthops":[ ++ { ++ "ip":"10.0.6.4", ++ "afi":"ipv4", ++ "interfaceName":"eth-rt4", ++ "active":true, + "labels":[ -+ 3 ++ 16020 ++ ] + } + ] + } +@@ -347,12 +388,29 @@ + "ip":"10.0.4.3", + "afi":"ipv4", + "interfaceName":"eth-rt3-1", +- "active":true ++ "active":true, ++ "backupIndex":[ ++ 0 ++ ] + }, + { + "ip":"10.0.5.3", + "afi":"ipv4", +- "interfaceName":"eth-rt3-2" ++ "interfaceName":"eth-rt3-2", ++ "backupIndex":[ ++ 0 ++ ] ++ } ++ ], ++ "backupNexthops":[ ++ { ++ "ip":"10.0.6.4", ++ "afi":"ipv4", ++ "interfaceName":"eth-rt4", ++ "active":true, ++ "labels":[ ++ 16020 + ] } ] diff --git a/tests/topotests/isis-tilfa-topo1/rt5/step5/show_ipv6_route.ref.diff b/tests/topotests/isis-tilfa-topo1/rt5/step5/show_ipv6_route.ref.diff index 2ee7db9e7e..59d9755e18 100644 --- a/tests/topotests/isis-tilfa-topo1/rt5/step5/show_ipv6_route.ref.diff +++ b/tests/topotests/isis-tilfa-topo1/rt5/step5/show_ipv6_route.ref.diff @@ -1,33 +1,59 @@ ---- rt5/step4/show_ipv6_route.ref 2020-08-31 22:42:48.843561366 -0300 -+++ rt5/step5/show_ipv6_route.ref 2020-08-31 22:42:48.843561366 -0300 -@@ -55,7 +55,7 @@ +--- rt5/step4/show_ipv6_route.ref 2020-09-25 17:49:03.599673726 -0300 ++++ rt5/step5/show_ipv6_route.ref 2020-09-25 17:50:14.248595046 -0300 +@@ -57,7 +57,10 @@ + "fib":true, + "afi":"ipv6", "interfaceName":"eth-rt4", - "active":true, - "labels":[ -- 3 +- "active":true ++ "active":true, ++ "labels":[ + 16021 - ] ++ ] }, { -@@ -118,6 +118,9 @@ + "fib":true, +@@ -95,6 +98,9 @@ + "afi":"ipv6", + "interfaceName":"eth-rt3-1", "active":true, - "backupIndex":[ - 0 ++ "backupIndex":[ ++ 0 + ], -+ "labels":[ -+ 3 + "labels":[ + 3 ] - } - ], -@@ -125,7 +128,10 @@ - { +@@ -104,10 +110,24 @@ "afi":"ipv6", - "interfaceName":"eth-rt6", -- "active":true + "interfaceName":"eth-rt3-2", + "active":true, ++ "backupIndex":[ ++ 0 ++ ], + "labels":[ + 3 + ] + } ++ ], ++ "backupNexthops":[ ++ { ++ "afi":"ipv6", ++ "interfaceName":"eth-rt4", + "active":true, + "labels":[ -+ 3 ++ 16021, ++ 16031 + ] - } ++ } ] } + ], +@@ -128,6 +148,9 @@ + "active":true, + "backupIndex":[ + 0 ++ ], ++ "labels":[ ++ 3 + ] + } + ], diff --git a/tests/topotests/isis-tilfa-topo1/rt5/step5/show_mpls_table.ref.diff b/tests/topotests/isis-tilfa-topo1/rt5/step5/show_mpls_table.ref.diff index 269b8ddc94..669c07e344 100644 --- a/tests/topotests/isis-tilfa-topo1/rt5/step5/show_mpls_table.ref.diff +++ b/tests/topotests/isis-tilfa-topo1/rt5/step5/show_mpls_table.ref.diff @@ -1,27 +1,89 @@ ---- rt5/step4/show_mpls_table.ref 2020-08-31 22:42:48.843561366 -0300 -+++ rt5/step5/show_mpls_table.ref 2020-08-31 22:42:48.843561366 -0300 -@@ -53,7 +53,7 @@ +--- rt5/step4/show_mpls_table.ref 2020-09-25 17:49:01.159641924 -0300 ++++ rt5/step5/show_mpls_table.ref 2020-09-25 17:50:11.696561748 -0300 +@@ -69,6 +69,12 @@ + "type":"SR (IS-IS)", + "outLabel":16020, + "installed":true, ++ "nexthop":"10.0.6.4" ++ }, ++ { ++ "type":"SR (IS-IS)", ++ "outLabel":16020, ++ "installed":true, + "nexthop":"10.0.5.3" }, { +@@ -87,6 +93,12 @@ "type":"SR (IS-IS)", -- "outLabel":3, -+ "outLabel":16020, + "outLabel":16021, "installed":true, - "nexthop":"10.0.6.4" - } -@@ -77,7 +77,7 @@ ++ "interface":"eth-rt4" ++ }, ++ { ++ "type":"SR (IS-IS)", ++ "outLabel":16021, ++ "installed":true, + "interface":"eth-rt3-2" }, { +@@ -105,13 +117,26 @@ "type":"SR (IS-IS)", -- "outLabel":3, -+ "outLabel":16021, + "outLabel":3, "installed":true, - "interface":"eth-rt4" - } -@@ -119,6 +119,50 @@ +- "nexthop":"10.0.5.3" ++ "nexthop":"10.0.5.3", ++ "backupIndex":[ ++ 0 ++ ] + }, + { + "type":"SR (IS-IS)", + "outLabel":3, + "installed":true, +- "nexthop":"10.0.4.3" ++ "nexthop":"10.0.4.3", ++ "backupIndex":[ ++ 0 ++ ] ++ } ++ ], ++ "backupNexthops":[ ++ { ++ "type":"SR (IS-IS)", ++ "outLabel":16020, ++ "nexthop":"10.0.6.4" } ] }, +@@ -123,13 +148,70 @@ + "type":"SR (IS-IS)", + "outLabel":3, + "installed":true, +- "interface":"eth-rt3-2" ++ "interface":"eth-rt3-2", ++ "backupIndex":[ ++ 0 ++ ] + }, + { + "type":"SR (IS-IS)", + "outLabel":3, + "installed":true, +- "interface":"eth-rt3-1" ++ "interface":"eth-rt3-1", ++ "backupIndex":[ ++ 0 ++ ] ++ } ++ ], ++ "backupNexthops":[ ++ { ++ "type":"SR (IS-IS)", ++ "outLabel":16021, ++ "interface":"eth-rt4" ++ } ++ ] ++ }, + "16040":{ + "inLabel":16040, + "installed":true, @@ -63,9 +125,6 @@ + "type":"SR (IS-IS)", + "outLabel":3, + "interface":"eth-rt6" -+ } -+ ] -+ }, - "16060":{ - "inLabel":16060, - "installed":true, + } + ] + }, diff --git a/tests/topotests/isis-tilfa-topo1/rt5/step6/show_mpls_table.ref.diff b/tests/topotests/isis-tilfa-topo1/rt5/step6/show_mpls_table.ref.diff index f70ac77e6a..a4f82cbf10 100644 --- a/tests/topotests/isis-tilfa-topo1/rt5/step6/show_mpls_table.ref.diff +++ b/tests/topotests/isis-tilfa-topo1/rt5/step6/show_mpls_table.ref.diff @@ -1,5 +1,5 @@ ---- rt5/step5/show_mpls_table.ref 2020-08-31 22:42:48.843561366 -0300 -+++ rt5/step6/show_mpls_table.ref 2020-08-31 22:42:48.843561366 -0300 +--- rt5/step5/show_mpls_table.ref 2020-09-25 17:50:11.696561748 -0300 ++++ rt5/step6/show_mpls_table.ref 2020-09-25 17:51:14.685383977 -0300 @@ -1,6 +1,6 @@ { - "16010":{ @@ -9,7 +9,7 @@ "installed":true, "nexthops":[ { -@@ -17,8 +17,8 @@ +@@ -30,8 +30,8 @@ } ] }, @@ -20,7 +20,7 @@ "installed":true, "nexthops":[ { -@@ -35,8 +35,8 @@ +@@ -61,56 +61,56 @@ } ] }, @@ -31,7 +31,25 @@ "installed":true, "nexthops":[ { -@@ -59,8 +59,8 @@ + "type":"SR (IS-IS)", + "outLabel":16020, + "installed":true, +- "nexthop":"10.0.6.4" ++ "nexthop":"10.0.5.3" + }, + { + "type":"SR (IS-IS)", + "outLabel":16020, + "installed":true, +- "nexthop":"10.0.5.3" ++ "nexthop":"10.0.4.3" + }, + { + "type":"SR (IS-IS)", + "outLabel":16020, + "installed":true, +- "nexthop":"10.0.4.3" ++ "nexthop":"10.0.6.4" } ] }, @@ -42,7 +60,25 @@ "installed":true, "nexthops":[ { -@@ -83,8 +83,8 @@ + "type":"SR (IS-IS)", + "outLabel":16021, + "installed":true, +- "interface":"eth-rt4" ++ "interface":"eth-rt3-2" + }, + { + "type":"SR (IS-IS)", + "outLabel":16021, + "installed":true, +- "interface":"eth-rt3-2" ++ "interface":"eth-rt3-1" + }, + { + "type":"SR (IS-IS)", + "outLabel":16021, + "installed":true, +- "interface":"eth-rt3-1" ++ "interface":"eth-rt4" } ] }, @@ -53,7 +89,7 @@ "installed":true, "nexthops":[ { -@@ -101,8 +101,8 @@ +@@ -140,8 +140,8 @@ } ] }, @@ -64,7 +100,7 @@ "installed":true, "nexthops":[ { -@@ -119,8 +119,8 @@ +@@ -171,8 +171,8 @@ } ] }, @@ -75,7 +111,7 @@ "installed":true, "nexthops":[ { -@@ -141,8 +141,8 @@ +@@ -193,8 +193,8 @@ } ] }, @@ -86,7 +122,7 @@ "installed":true, "nexthops":[ { -@@ -163,8 +163,8 @@ +@@ -215,8 +215,8 @@ } ] }, @@ -97,7 +133,7 @@ "installed":true, "nexthops":[ { -@@ -185,8 +185,8 @@ +@@ -237,8 +237,8 @@ } ] }, diff --git a/tests/topotests/isis-tilfa-topo1/rt6/step1/show_ip_route.ref b/tests/topotests/isis-tilfa-topo1/rt6/step1/show_ip_route.ref index c9615d1e45..5bcef4c2f6 100644 --- a/tests/topotests/isis-tilfa-topo1/rt6/step1/show_ip_route.ref +++ b/tests/topotests/isis-tilfa-topo1/rt6/step1/show_ip_route.ref @@ -61,10 +61,7 @@ "ip":"10.0.8.5", "afi":"ipv4", "interfaceName":"eth-rt5", - "active":true, - "labels":[ - 3 - ] + "active":true } ] } @@ -98,10 +95,7 @@ "ip":"10.0.7.4", "afi":"ipv4", "interfaceName":"eth-rt4", - "active":true, - "labels":[ - 3 - ] + "active":true } ] } @@ -135,10 +129,7 @@ "ip":"10.0.8.5", "afi":"ipv4", "interfaceName":"eth-rt5", - "active":true, - "labels":[ - 3 - ] + "active":true } ] } @@ -172,10 +163,7 @@ "ip":"10.0.7.4", "afi":"ipv4", "interfaceName":"eth-rt4", - "active":true, - "labels":[ - 3 - ] + "active":true } ] } diff --git a/tests/topotests/isis-tilfa-topo1/rt6/step1/show_ipv6_route.ref b/tests/topotests/isis-tilfa-topo1/rt6/step1/show_ipv6_route.ref index b69c1491ec..8294b07136 100644 --- a/tests/topotests/isis-tilfa-topo1/rt6/step1/show_ipv6_route.ref +++ b/tests/topotests/isis-tilfa-topo1/rt6/step1/show_ipv6_route.ref @@ -12,7 +12,7 @@ { "fib":true, "afi":"ipv6", - "interfaceName":"eth-rt4", + "interfaceName":"eth-rt5", "active":true, "labels":[ 16011 @@ -21,7 +21,7 @@ { "fib":true, "afi":"ipv6", - "interfaceName":"eth-rt5", + "interfaceName":"eth-rt4", "active":true, "labels":[ 16011 @@ -57,10 +57,7 @@ { "afi":"ipv6", "interfaceName":"eth-rt5", - "active":true, - "labels":[ - 3 - ] + "active":true } ] } @@ -92,10 +89,7 @@ { "afi":"ipv6", "interfaceName":"eth-rt4", - "active":true, - "labels":[ - 3 - ] + "active":true } ] } @@ -127,10 +121,7 @@ { "afi":"ipv6", "interfaceName":"eth-rt5", - "active":true, - "labels":[ - 3 - ] + "active":true } ] } @@ -162,10 +153,7 @@ { "afi":"ipv6", "interfaceName":"eth-rt4", - "active":true, - "labels":[ - 3 - ] + "active":true } ] } diff --git a/tests/topotests/isis-tilfa-topo1/rt6/step1/show_mpls_table.ref b/tests/topotests/isis-tilfa-topo1/rt6/step1/show_mpls_table.ref index 2aa794124a..33dbf59204 100644 --- a/tests/topotests/isis-tilfa-topo1/rt6/step1/show_mpls_table.ref +++ b/tests/topotests/isis-tilfa-topo1/rt6/step1/show_mpls_table.ref @@ -7,13 +7,13 @@ "type":"SR (IS-IS)", "outLabel":16010, "installed":true, - "nexthop":"10.0.8.5" + "nexthop":"10.0.7.4" }, { "type":"SR (IS-IS)", "outLabel":16010, "installed":true, - "nexthop":"10.0.7.4" + "nexthop":"10.0.8.5" } ] }, @@ -25,13 +25,13 @@ "type":"SR (IS-IS)", "outLabel":16011, "installed":true, - "interface":"eth-rt5" + "interface":"eth-rt4" }, { "type":"SR (IS-IS)", "outLabel":16011, "installed":true, - "interface":"eth-rt4" + "interface":"eth-rt5" } ] }, diff --git a/tests/topotests/isis-tilfa-topo1/rt6/step4/show_ip_route.ref.diff b/tests/topotests/isis-tilfa-topo1/rt6/step4/show_ip_route.ref.diff index 7e6810d6d3..04adaefe78 100644 --- a/tests/topotests/isis-tilfa-topo1/rt6/step4/show_ip_route.ref.diff +++ b/tests/topotests/isis-tilfa-topo1/rt6/step4/show_ip_route.ref.diff @@ -1,15 +1,18 @@ ---- rt6/step3/show_ip_route.ref 2020-08-31 22:42:48.843561366 -0300 -+++ rt6/step4/show_ip_route.ref 2020-08-31 22:42:48.847561334 -0300 -@@ -16,7 +16,7 @@ +--- rt6/step3/show_ip_route.ref 2020-09-25 17:48:06.154925422 -0300 ++++ rt6/step4/show_ip_route.ref 2020-09-25 17:49:02.583660484 -0300 +@@ -14,10 +14,7 @@ + "ip":"10.0.7.4", + "afi":"ipv4", "interfaceName":"eth-rt4", - "active":true, - "labels":[ +- "active":true, +- "labels":[ - 16010 -+ 3 - ] +- ] ++ "active":true }, { -@@ -50,9 +50,6 @@ + "fib":true, +@@ -50,9 +47,6 @@ "active":true, "backupIndex":[ 0 @@ -19,19 +22,7 @@ ] } ], -@@ -61,10 +58,7 @@ - "ip":"10.0.8.5", - "afi":"ipv4", - "interfaceName":"eth-rt5", -- "active":true, -- "labels":[ -- 3 -- ] -+ "active":true - } - ] - } -@@ -124,9 +118,6 @@ +@@ -118,9 +112,6 @@ "active":true, "backupIndex":[ 0 @@ -41,15 +32,3 @@ ] } ], -@@ -135,10 +126,7 @@ - "ip":"10.0.8.5", - "afi":"ipv4", - "interfaceName":"eth-rt5", -- "active":true, -- "labels":[ -- 3 -- ] -+ "active":true - } - ] - } diff --git a/tests/topotests/isis-tilfa-topo1/rt6/step4/show_ipv6_route.ref.diff b/tests/topotests/isis-tilfa-topo1/rt6/step4/show_ipv6_route.ref.diff index 8c424f6065..20aa1ec83b 100644 --- a/tests/topotests/isis-tilfa-topo1/rt6/step4/show_ipv6_route.ref.diff +++ b/tests/topotests/isis-tilfa-topo1/rt6/step4/show_ipv6_route.ref.diff @@ -1,15 +1,18 @@ ---- rt6/step3/show_ipv6_route.ref 2020-08-31 22:42:48.843561366 -0300 -+++ rt6/step4/show_ipv6_route.ref 2020-08-31 22:42:48.847561334 -0300 -@@ -15,7 +15,7 @@ +--- rt6/step3/show_ipv6_route.ref 2020-09-25 17:48:07.434942087 -0300 ++++ rt6/step4/show_ipv6_route.ref 2020-09-25 17:49:03.847676958 -0300 +@@ -22,10 +22,7 @@ + "fib":true, + "afi":"ipv6", "interfaceName":"eth-rt4", - "active":true, - "labels":[ +- "active":true, +- "labels":[ - 16011 -+ 3 - ] - }, - { -@@ -47,9 +47,6 @@ +- ] ++ "active":true + } + ] + } +@@ -47,9 +44,6 @@ "active":true, "backupIndex":[ 0 @@ -19,19 +22,7 @@ ] } ], -@@ -57,10 +54,7 @@ - { - "afi":"ipv6", - "interfaceName":"eth-rt5", -- "active":true, -- "labels":[ -- 3 -- ] -+ "active":true - } - ] - } -@@ -117,9 +111,6 @@ +@@ -111,9 +105,6 @@ "active":true, "backupIndex":[ 0 @@ -41,15 +32,3 @@ ] } ], -@@ -127,10 +118,7 @@ - { - "afi":"ipv6", - "interfaceName":"eth-rt5", -- "active":true, -- "labels":[ -- 3 -- ] -+ "active":true - } - ] - } diff --git a/tests/topotests/isis-tilfa-topo1/rt6/step4/show_mpls_table.ref.diff b/tests/topotests/isis-tilfa-topo1/rt6/step4/show_mpls_table.ref.diff index 2ebbab8a2f..3f24547f6d 100644 --- a/tests/topotests/isis-tilfa-topo1/rt6/step4/show_mpls_table.ref.diff +++ b/tests/topotests/isis-tilfa-topo1/rt6/step4/show_mpls_table.ref.diff @@ -1,70 +1,32 @@ ---- rt6/step3/show_mpls_table.ref 2020-08-31 22:42:48.843561366 -0300 -+++ rt6/step4/show_mpls_table.ref 2020-08-31 22:42:48.847561334 -0300 -@@ -11,7 +11,7 @@ - }, - { +--- rt6/step3/show_mpls_table.ref 2020-09-25 17:48:04.842908340 -0300 ++++ rt6/step4/show_mpls_table.ref 2020-09-25 17:49:01.363644584 -0300 +@@ -7,12 +7,6 @@ "type":"SR (IS-IS)", -- "outLabel":16010, -+ "outLabel":3, + "outLabel":16010, "installed":true, - "nexthop":"10.0.7.4" - } -@@ -29,53 +29,9 @@ - }, - { - "type":"SR (IS-IS)", -- "outLabel":16011, -- "installed":true, -- "interface":"eth-rt4" -- } -- ] -- }, -- "16020":{ -- "inLabel":16020, -- "installed":true, -- "nexthops":[ +- "nexthop":"10.0.7.4" +- }, - { - "type":"SR (IS-IS)", -- "outLabel":16020, +- "outLabel":16010, - "installed":true, -- "nexthop":"10.0.7.4", -- "backupIndex":[ -- 0 -- ] -- } -- ], -- "backupNexthops":[ -- { -- "type":"SR (IS-IS)", - "outLabel":3, -- "nexthop":"10.0.8.5" -- } -- ] -- }, -- "16021":{ -- "inLabel":16021, -- "installed":true, -- "nexthops":[ -- { -- "type":"SR (IS-IS)", -- "outLabel":16021, + "nexthop":"10.0.8.5" + } + ] +@@ -25,12 +19,6 @@ + "type":"SR (IS-IS)", + "outLabel":16011, "installed":true, -- "interface":"eth-rt4", -- "backupIndex":[ -- 0 -- ] -- } -- ], -- "backupNexthops":[ +- "interface":"eth-rt4" +- }, - { - "type":"SR (IS-IS)", -- "outLabel":3, -- "interface":"eth-rt5" -+ "interface":"eth-rt4" +- "outLabel":16011, +- "installed":true, + "interface":"eth-rt5" } ] - }, -@@ -123,50 +79,6 @@ +@@ -123,50 +111,6 @@ } ] }, diff --git a/tests/topotests/isis-tilfa-topo1/rt6/step5/show_ip_route.ref.diff b/tests/topotests/isis-tilfa-topo1/rt6/step5/show_ip_route.ref.diff index 5151f71580..9f73a2904e 100644 --- a/tests/topotests/isis-tilfa-topo1/rt6/step5/show_ip_route.ref.diff +++ b/tests/topotests/isis-tilfa-topo1/rt6/step5/show_ip_route.ref.diff @@ -1,15 +1,18 @@ ---- rt6/step4/show_ip_route.ref 2020-08-31 22:42:48.847561334 -0300 -+++ rt6/step5/show_ip_route.ref 2020-08-31 22:42:48.847561334 -0300 -@@ -16,7 +16,7 @@ +--- rt6/step4/show_ip_route.ref 2020-09-25 17:49:02.583660484 -0300 ++++ rt6/step5/show_ip_route.ref 2020-09-25 17:50:13.220581632 -0300 +@@ -14,7 +14,10 @@ + "ip":"10.0.7.4", + "afi":"ipv4", "interfaceName":"eth-rt4", - "active":true, - "labels":[ -- 3 +- "active":true ++ "active":true, ++ "labels":[ + 16010 - ] ++ ] }, { -@@ -50,6 +50,9 @@ + "fib":true, +@@ -47,6 +50,9 @@ "active":true, "backupIndex":[ 0 @@ -19,19 +22,7 @@ ] } ], -@@ -58,7 +61,10 @@ - "ip":"10.0.8.5", - "afi":"ipv4", - "interfaceName":"eth-rt5", -- "active":true -+ "active":true, -+ "labels":[ -+ 3 -+ ] - } - ] - } -@@ -118,6 +124,9 @@ +@@ -112,6 +118,9 @@ "active":true, "backupIndex":[ 0 @@ -41,15 +32,3 @@ ] } ], -@@ -126,7 +135,10 @@ - "ip":"10.0.8.5", - "afi":"ipv4", - "interfaceName":"eth-rt5", -- "active":true -+ "active":true, -+ "labels":[ -+ 3 -+ ] - } - ] - } diff --git a/tests/topotests/isis-tilfa-topo1/rt6/step5/show_ipv6_route.ref.diff b/tests/topotests/isis-tilfa-topo1/rt6/step5/show_ipv6_route.ref.diff index 2ddc9f82b6..c9358d45b2 100644 --- a/tests/topotests/isis-tilfa-topo1/rt6/step5/show_ipv6_route.ref.diff +++ b/tests/topotests/isis-tilfa-topo1/rt6/step5/show_ipv6_route.ref.diff @@ -1,15 +1,18 @@ ---- rt6/step4/show_ipv6_route.ref 2020-08-31 22:42:48.847561334 -0300 -+++ rt6/step5/show_ipv6_route.ref 2020-08-31 22:42:48.847561334 -0300 -@@ -15,7 +15,7 @@ +--- rt6/step4/show_ipv6_route.ref 2020-09-25 17:49:03.847676958 -0300 ++++ rt6/step5/show_ipv6_route.ref 2020-09-25 17:50:14.456597760 -0300 +@@ -22,7 +22,10 @@ + "fib":true, + "afi":"ipv6", "interfaceName":"eth-rt4", - "active":true, - "labels":[ -- 3 +- "active":true ++ "active":true, ++ "labels":[ + 16011 - ] - }, - { -@@ -47,6 +47,9 @@ ++ ] + } + ] + } +@@ -44,6 +47,9 @@ "active":true, "backupIndex":[ 0 @@ -19,19 +22,7 @@ ] } ], -@@ -54,7 +57,10 @@ - { - "afi":"ipv6", - "interfaceName":"eth-rt5", -- "active":true -+ "active":true, -+ "labels":[ -+ 3 -+ ] - } - ] - } -@@ -111,6 +117,9 @@ +@@ -105,6 +111,9 @@ "active":true, "backupIndex":[ 0 @@ -41,15 +32,3 @@ ] } ], -@@ -118,7 +127,10 @@ - { - "afi":"ipv6", - "interfaceName":"eth-rt5", -- "active":true -+ "active":true, -+ "labels":[ -+ 3 -+ ] - } - ] - } diff --git a/tests/topotests/isis-tilfa-topo1/rt6/step5/show_mpls_table.ref.diff b/tests/topotests/isis-tilfa-topo1/rt6/step5/show_mpls_table.ref.diff index 18354ea604..c9d67955ef 100644 --- a/tests/topotests/isis-tilfa-topo1/rt6/step5/show_mpls_table.ref.diff +++ b/tests/topotests/isis-tilfa-topo1/rt6/step5/show_mpls_table.ref.diff @@ -1,73 +1,32 @@ ---- rt6/step4/show_mpls_table.ref 2020-08-31 22:42:48.847561334 -0300 -+++ rt6/step5/show_mpls_table.ref 2020-08-31 22:42:48.847561334 -0300 -@@ -11,7 +11,7 @@ - }, - { +--- rt6/step4/show_mpls_table.ref 2020-09-25 17:49:01.363644584 -0300 ++++ rt6/step5/show_mpls_table.ref 2020-09-25 17:50:11.904564461 -0300 +@@ -7,6 +7,12 @@ "type":"SR (IS-IS)", -- "outLabel":3, -+ "outLabel":16010, + "outLabel":16010, "installed":true, - "nexthop":"10.0.7.4" - } -@@ -29,12 +29,56 @@ - }, - { - "type":"SR (IS-IS)", -- "outLabel":3, -+ "outLabel":16011, - "installed":true, - "interface":"eth-rt4" - } - ] - }, -+ "16020":{ -+ "inLabel":16020, -+ "installed":true, -+ "nexthops":[ ++ "nexthop":"10.0.7.4" ++ }, + { + "type":"SR (IS-IS)", -+ "outLabel":16020, ++ "outLabel":16010, + "installed":true, -+ "nexthop":"10.0.7.4", -+ "backupIndex":[ -+ 0 -+ ] -+ } -+ ], -+ "backupNexthops":[ -+ { -+ "type":"SR (IS-IS)", -+ "outLabel":3, -+ "nexthop":"10.0.8.5" -+ } -+ ] -+ }, -+ "16021":{ -+ "inLabel":16021, -+ "installed":true, -+ "nexthops":[ + "nexthop":"10.0.8.5" + } + ] +@@ -19,6 +25,12 @@ + "type":"SR (IS-IS)", + "outLabel":16011, + "installed":true, ++ "interface":"eth-rt4" ++ }, + { + "type":"SR (IS-IS)", -+ "outLabel":16021, ++ "outLabel":16011, + "installed":true, -+ "interface":"eth-rt4", -+ "backupIndex":[ -+ 0 -+ ] -+ } -+ ], -+ "backupNexthops":[ -+ { -+ "type":"SR (IS-IS)", -+ "outLabel":3, -+ "interface":"eth-rt5" -+ } -+ ] -+ }, - "16030":{ - "inLabel":16030, - "installed":true, -@@ -79,6 +123,50 @@ + "interface":"eth-rt5" + } + ] +@@ -111,6 +123,50 @@ } ] }, diff --git a/tests/topotests/isis-tilfa-topo1/rt6/step6/show_ip_route.ref.diff b/tests/topotests/isis-tilfa-topo1/rt6/step6/show_ip_route.ref.diff index cddb6ab4bc..527ec74958 100644 --- a/tests/topotests/isis-tilfa-topo1/rt6/step6/show_ip_route.ref.diff +++ b/tests/topotests/isis-tilfa-topo1/rt6/step6/show_ip_route.ref.diff @@ -1,5 +1,5 @@ ---- rt6/step5/show_ip_route.ref 2020-08-31 22:42:48.847561334 -0300 -+++ rt6/step6/show_ip_route.ref 2020-08-31 22:42:48.847561334 -0300 +--- rt6/step5/show_ip_route.ref 2020-09-25 17:50:13.220581632 -0300 ++++ rt6/step6/show_ip_route.ref 2020-09-25 17:51:16.137402938 -0300 @@ -26,7 +26,7 @@ "interfaceName":"eth-rt5", "active":true, @@ -9,7 +9,7 @@ ] } ] -@@ -89,7 +89,7 @@ +@@ -86,7 +86,7 @@ 0 ], "labels":[ diff --git a/tests/topotests/isis-tilfa-topo1/rt6/step6/show_ipv6_route.ref.diff b/tests/topotests/isis-tilfa-topo1/rt6/step6/show_ipv6_route.ref.diff index 389d87edc9..7b8f8022f2 100644 --- a/tests/topotests/isis-tilfa-topo1/rt6/step6/show_ipv6_route.ref.diff +++ b/tests/topotests/isis-tilfa-topo1/rt6/step6/show_ipv6_route.ref.diff @@ -1,15 +1,15 @@ ---- rt6/step5/show_ipv6_route.ref 2020-08-31 22:42:48.847561334 -0300 -+++ rt6/step6/show_ipv6_route.ref 2020-08-31 22:42:48.847561334 -0300 -@@ -24,7 +24,7 @@ +--- rt6/step5/show_ipv6_route.ref 2020-09-25 17:50:14.456597760 -0300 ++++ rt6/step6/show_ipv6_route.ref 2020-09-25 17:51:17.401419446 -0300 +@@ -15,7 +15,7 @@ "interfaceName":"eth-rt5", "active":true, "labels":[ - 16011 + 30011 ] - } - ] -@@ -84,7 +84,7 @@ + }, + { +@@ -81,7 +81,7 @@ 0 ], "labels":[ diff --git a/tests/topotests/isis-tilfa-topo1/rt6/step6/show_mpls_table.ref.diff b/tests/topotests/isis-tilfa-topo1/rt6/step6/show_mpls_table.ref.diff index 8d5385dd0c..edd5afeeb8 100644 --- a/tests/topotests/isis-tilfa-topo1/rt6/step6/show_mpls_table.ref.diff +++ b/tests/topotests/isis-tilfa-topo1/rt6/step6/show_mpls_table.ref.diff @@ -1,23 +1,23 @@ ---- rt6/step5/show_mpls_table.ref 2020-08-31 22:42:48.847561334 -0300 -+++ rt6/step6/show_mpls_table.ref 2020-08-31 22:42:48.847561334 -0300 -@@ -5,7 +5,7 @@ - "nexthops":[ +--- rt6/step5/show_mpls_table.ref 2020-09-25 17:50:11.904564461 -0300 ++++ rt6/step6/show_mpls_table.ref 2020-09-25 17:51:14.893386692 -0300 +@@ -11,7 +11,7 @@ + }, { "type":"SR (IS-IS)", - "outLabel":16010, + "outLabel":30010, "installed":true, "nexthop":"10.0.8.5" + } +@@ -29,7 +29,7 @@ }, -@@ -23,7 +23,7 @@ - "nexthops":[ { "type":"SR (IS-IS)", - "outLabel":16011, + "outLabel":30011, "installed":true, "interface":"eth-rt5" - }, + } @@ -85,7 +85,7 @@ "nexthops":[ { diff --git a/tests/topotests/isis-tilfa-topo1/rt6/step7/show_ip_route.ref.diff b/tests/topotests/isis-tilfa-topo1/rt6/step7/show_ip_route.ref.diff index e9b88ce90b..7553dd22e5 100644 --- a/tests/topotests/isis-tilfa-topo1/rt6/step7/show_ip_route.ref.diff +++ b/tests/topotests/isis-tilfa-topo1/rt6/step7/show_ip_route.ref.diff @@ -1,6 +1,6 @@ ---- rt6/step6/show_ip_route.ref 2020-08-31 22:42:48.847561334 -0300 -+++ rt6/step7/show_ip_route.ref 2020-08-31 22:42:48.847561334 -0300 -@@ -161,9 +161,6 @@ +--- rt6/step6/show_ip_route.ref 2020-09-25 17:51:16.137402938 -0300 ++++ rt6/step7/show_ip_route.ref 2020-09-25 17:52:03.018015363 -0300 +@@ -152,9 +152,6 @@ "active":true, "backupIndex":[ 0 @@ -10,15 +10,3 @@ ] } ], -@@ -172,10 +169,7 @@ - "ip":"10.0.7.4", - "afi":"ipv4", - "interfaceName":"eth-rt4", -- "active":true, -- "labels":[ -- 3 -- ] -+ "active":true - } - ] - } diff --git a/tests/topotests/isis-tilfa-topo1/rt6/step7/show_ipv6_route.ref.diff b/tests/topotests/isis-tilfa-topo1/rt6/step7/show_ipv6_route.ref.diff index a65d3e8e40..b56890de0f 100644 --- a/tests/topotests/isis-tilfa-topo1/rt6/step7/show_ipv6_route.ref.diff +++ b/tests/topotests/isis-tilfa-topo1/rt6/step7/show_ipv6_route.ref.diff @@ -1,6 +1,6 @@ ---- rt6/step6/show_ipv6_route.ref 2020-08-31 22:42:48.847561334 -0300 -+++ rt6/step7/show_ipv6_route.ref 2020-08-31 22:42:48.847561334 -0300 -@@ -152,9 +152,6 @@ +--- rt6/step6/show_ipv6_route.ref 2020-09-25 17:51:17.401419446 -0300 ++++ rt6/step7/show_ipv6_route.ref 2020-09-25 17:52:04.270031723 -0300 +@@ -143,9 +143,6 @@ "active":true, "backupIndex":[ 0 @@ -10,15 +10,3 @@ ] } ], -@@ -162,10 +159,7 @@ - { - "afi":"ipv6", - "interfaceName":"eth-rt4", -- "active":true, -- "labels":[ -- 3 -- ] -+ "active":true - } - ] - } diff --git a/tests/topotests/isis-tilfa-topo1/rt6/step7/show_mpls_table.ref.diff b/tests/topotests/isis-tilfa-topo1/rt6/step7/show_mpls_table.ref.diff index 0d119554c7..ff043fb0bf 100644 --- a/tests/topotests/isis-tilfa-topo1/rt6/step7/show_mpls_table.ref.diff +++ b/tests/topotests/isis-tilfa-topo1/rt6/step7/show_mpls_table.ref.diff @@ -1,5 +1,5 @@ ---- rt6/step6/show_mpls_table.ref 2020-08-31 22:42:48.847561334 -0300 -+++ rt6/step7/show_mpls_table.ref 2020-08-31 22:42:48.847561334 -0300 +--- rt6/step6/show_mpls_table.ref 2020-09-25 17:51:14.893386692 -0300 ++++ rt6/step7/show_mpls_table.ref 2020-09-25 17:52:01.809999577 -0300 @@ -166,49 +166,5 @@ "interface":"eth-rt5" } diff --git a/tests/topotests/isis-tilfa-topo1/rt6/step8/show_ip_route.ref.diff b/tests/topotests/isis-tilfa-topo1/rt6/step8/show_ip_route.ref.diff index cb9d758f32..d0b25bffa3 100644 --- a/tests/topotests/isis-tilfa-topo1/rt6/step8/show_ip_route.ref.diff +++ b/tests/topotests/isis-tilfa-topo1/rt6/step8/show_ip_route.ref.diff @@ -1,6 +1,6 @@ ---- rt6/step7/show_ip_route.ref 2020-08-31 22:42:48.847561334 -0300 -+++ rt6/step8/show_ip_route.ref 2020-08-31 22:42:48.847561334 -0300 -@@ -161,6 +161,9 @@ +--- rt6/step7/show_ip_route.ref 2020-09-25 17:52:03.018015363 -0300 ++++ rt6/step8/show_ip_route.ref 2020-09-25 17:53:21.035035298 -0300 +@@ -152,6 +152,9 @@ "active":true, "backupIndex":[ 0 @@ -10,15 +10,3 @@ ] } ], -@@ -169,7 +172,10 @@ - "ip":"10.0.7.4", - "afi":"ipv4", - "interfaceName":"eth-rt4", -- "active":true -+ "active":true, -+ "labels":[ -+ 3 -+ ] - } - ] - } diff --git a/tests/topotests/isis-tilfa-topo1/rt6/step8/show_ipv6_route.ref.diff b/tests/topotests/isis-tilfa-topo1/rt6/step8/show_ipv6_route.ref.diff index cac719262d..203175510c 100644 --- a/tests/topotests/isis-tilfa-topo1/rt6/step8/show_ipv6_route.ref.diff +++ b/tests/topotests/isis-tilfa-topo1/rt6/step8/show_ipv6_route.ref.diff @@ -1,6 +1,6 @@ ---- rt6/step7/show_ipv6_route.ref 2020-08-31 22:42:48.847561334 -0300 -+++ rt6/step8/show_ipv6_route.ref 2020-08-31 22:42:48.847561334 -0300 -@@ -152,6 +152,9 @@ +--- rt6/step7/show_ipv6_route.ref 2020-09-25 17:52:04.270031723 -0300 ++++ rt6/step8/show_ipv6_route.ref 2020-09-25 17:53:22.239051045 -0300 +@@ -143,6 +143,9 @@ "active":true, "backupIndex":[ 0 @@ -10,15 +10,3 @@ ] } ], -@@ -159,7 +162,10 @@ - { - "afi":"ipv6", - "interfaceName":"eth-rt4", -- "active":true -+ "active":true, -+ "labels":[ -+ 3 -+ ] - } - ] - } diff --git a/tests/topotests/isis-tilfa-topo1/rt6/step8/show_mpls_table.ref.diff b/tests/topotests/isis-tilfa-topo1/rt6/step8/show_mpls_table.ref.diff index 917954b077..535f30bf35 100644 --- a/tests/topotests/isis-tilfa-topo1/rt6/step8/show_mpls_table.ref.diff +++ b/tests/topotests/isis-tilfa-topo1/rt6/step8/show_mpls_table.ref.diff @@ -1,5 +1,5 @@ ---- rt6/step7/show_mpls_table.ref 2020-08-31 22:42:48.847561334 -0300 -+++ rt6/step8/show_mpls_table.ref 2020-08-31 22:42:48.847561334 -0300 +--- rt6/step7/show_mpls_table.ref 2020-09-25 17:52:01.809999577 -0300 ++++ rt6/step8/show_mpls_table.ref 2020-09-25 17:53:19.799019132 -0300 @@ -166,5 +166,49 @@ "interface":"eth-rt5" } diff --git a/tests/topotests/isis-tilfa-topo1/rt6/step9/show_mpls_table.ref.diff b/tests/topotests/isis-tilfa-topo1/rt6/step9/show_mpls_table.ref.diff index 3c9558e56a..b6e5396554 100644 --- a/tests/topotests/isis-tilfa-topo1/rt6/step9/show_mpls_table.ref.diff +++ b/tests/topotests/isis-tilfa-topo1/rt6/step9/show_mpls_table.ref.diff @@ -1,5 +1,5 @@ ---- rt6/step8/show_mpls_table.ref 2020-08-31 22:42:48.847561334 -0300 -+++ rt6/step9/show_mpls_table.ref 2020-08-31 22:42:48.847561334 -0300 +--- rt6/step8/show_mpls_table.ref 2020-09-25 17:53:19.799019132 -0300 ++++ rt6/step9/show_mpls_table.ref 2020-09-25 17:54:37.492035644 -0300 @@ -167,8 +167,8 @@ } ] diff --git a/tests/topotests/isis-topo1-vrf/r1/r1_route.json b/tests/topotests/isis-topo1-vrf/r1/r1_route.json index 77d2ad9c63..f0a3593a4c 100644 --- a/tests/topotests/isis-topo1-vrf/r1/r1_route.json +++ b/tests/topotests/isis-topo1-vrf/r1/r1_route.json @@ -20,20 +20,6 @@ ], "10.0.20.0/24": [ { - "distance": 115, - "metric": 20, - "nexthops": [ - { - "afi": "ipv4", - "interfaceName": "r1-eth0", - "ip": "10.0.20.1" - } - ], - "prefix": "10.0.20.0/24", - "protocol": "isis", - "vrfName": "r1-cust1" - }, - { "nexthops": [ { "active": true, diff --git a/tests/topotests/isis-topo1-vrf/r2/r2_route.json b/tests/topotests/isis-topo1-vrf/r2/r2_route.json index 98252c5939..a26cdfad8e 100644 --- a/tests/topotests/isis-topo1-vrf/r2/r2_route.json +++ b/tests/topotests/isis-topo1-vrf/r2/r2_route.json @@ -20,20 +20,6 @@ ], "10.0.21.0/24": [ { - "distance": 115, - "metric": 20, - "nexthops": [ - { - "afi": "ipv4", - "interfaceName": "r2-eth0", - "ip": "10.0.21.1" - } - ], - "prefix": "10.0.21.0/24", - "protocol": "isis", - "vrfName": "r2-cust1" - }, - { "nexthops": [ { "active": true, diff --git a/tests/topotests/isis-topo1-vrf/r3/r3_route.json b/tests/topotests/isis-topo1-vrf/r3/r3_route.json index de158876f1..9717df5c1a 100644 --- a/tests/topotests/isis-topo1-vrf/r3/r3_route.json +++ b/tests/topotests/isis-topo1-vrf/r3/r3_route.json @@ -50,20 +50,6 @@ ], "10.0.20.0/24": [ { - "distance": 115, - "metric": 20, - "nexthops": [ - { - "afi": "ipv4", - "interfaceName": "r3-eth0", - "ip": "10.0.20.2" - } - ], - "prefix": "10.0.20.0/24", - "protocol": "isis", - "vrfName": "r3-cust1" - }, - { "nexthops": [ { "active": true, diff --git a/tests/topotests/isis-topo1-vrf/r4/r4_route.json b/tests/topotests/isis-topo1-vrf/r4/r4_route.json index b3ed4f2cbe..6cb79b0301 100644 --- a/tests/topotests/isis-topo1-vrf/r4/r4_route.json +++ b/tests/topotests/isis-topo1-vrf/r4/r4_route.json @@ -66,18 +66,6 @@ { "nexthops": [ { - "afi": "ipv4", - "interfaceName": "r4-eth0", - "ip": "10.0.21.2" - } - ], - "prefix": "10.0.21.0/24", - "protocol": "isis", - "vrfName": "r4-cust1" - }, - { - "nexthops": [ - { "active": true, "directlyConnected": true, "fib": true, diff --git a/tests/topotests/isis-topo1/r1/r1_route.json b/tests/topotests/isis-topo1/r1/r1_route.json index 123b4dd163..f94233a80f 100644 --- a/tests/topotests/isis-topo1/r1/r1_route.json +++ b/tests/topotests/isis-topo1/r1/r1_route.json @@ -19,19 +19,6 @@ ], "10.0.20.0/24": [ { - "distance": 115, - "metric": 10, - "nexthops": [ - { - "afi": "ipv4", - "interfaceName": "r1-eth0", - "ip": "10.0.20.1" - } - ], - "prefix": "10.0.20.0/24", - "protocol": "isis" - }, - { "nexthops": [ { "active": true, diff --git a/tests/topotests/isis-topo1/r2/r2_route.json b/tests/topotests/isis-topo1/r2/r2_route.json index fe2de05734..aab651eff0 100644 --- a/tests/topotests/isis-topo1/r2/r2_route.json +++ b/tests/topotests/isis-topo1/r2/r2_route.json @@ -19,19 +19,6 @@ ], "10.0.21.0/24": [ { - "distance": 115, - "metric": 10, - "nexthops": [ - { - "afi": "ipv4", - "interfaceName": "r2-eth0", - "ip": "10.0.21.1" - } - ], - "prefix": "10.0.21.0/24", - "protocol": "isis" - }, - { "nexthops": [ { "active": true, diff --git a/tests/topotests/isis-topo1/r3/r3_route.json b/tests/topotests/isis-topo1/r3/r3_route.json index 1f0fcdfcd6..61d05e80bb 100644 --- a/tests/topotests/isis-topo1/r3/r3_route.json +++ b/tests/topotests/isis-topo1/r3/r3_route.json @@ -47,19 +47,6 @@ ], "10.0.20.0/24": [ { - "distance": 115, - "metric": 10, - "nexthops": [ - { - "afi": "ipv4", - "interfaceName": "r3-eth0", - "ip": "10.0.20.2" - } - ], - "prefix": "10.0.20.0/24", - "protocol": "isis" - }, - { "nexthops": [ { "active": true, diff --git a/tests/topotests/isis-topo1/r4/r4_route.json b/tests/topotests/isis-topo1/r4/r4_route.json index 597e953c09..79361af4b5 100644 --- a/tests/topotests/isis-topo1/r4/r4_route.json +++ b/tests/topotests/isis-topo1/r4/r4_route.json @@ -16,19 +16,6 @@ ], "10.0.21.0/24": [ { - "distance": 115, - "metric": 10, - "nexthops": [ - { - "afi": "ipv4", - "interfaceName": "r4-eth0", - "ip": "10.0.21.2" - } - ], - "prefix": "10.0.21.0/24", - "protocol": "isis" - }, - { "nexthops": [ { "active": true, diff --git a/tools/coccinelle/README.md b/tools/coccinelle/README.md new file mode 100644 index 0000000000..262ccc1da0 --- /dev/null +++ b/tools/coccinelle/README.md @@ -0,0 +1,14 @@ +Coccinelle patches +================== + +This collection of coccinelle patches represents some of the broader, +codebase-wide changes that have been made. If you maintain a fork of +FRR and find that your codebase needs to be updated to align with +these changes, the coccinelle tool should help you make that update. + +The coccinelle tool is documented at: + https://coccinelle.gitlabpages.inria.fr/website/ + +To run a coccinelle patch script: + + spatch --sp-file tools/coccinelle/semicolon.cocci zebra/*.c diff --git a/tools/coccinelle/thread_cancel_api.cocci b/tools/coccinelle/thread_cancel_api.cocci new file mode 100644 index 0000000000..cc34f9389a --- /dev/null +++ b/tools/coccinelle/thread_cancel_api.cocci @@ -0,0 +1,68 @@ +@ptrupdate@ +expression E; +@@ +- thread_cancel(E); ++ thread_cancel(&E); + +@nullcheckremove depends on ptrupdate@ +expression E; +@@ + +thread_cancel(&E); +- E = NULL; + +@cancelguardremove depends on nullcheckremove@ +expression E; +@@ +- if (E) +- { + thread_cancel(&E); +- } + +@cancelguardremove2 depends on nullcheckremove@ +expression E; +@@ +- if (E != NULL) +- { + thread_cancel(&E); +- } + +@cancelguardremove3 depends on nullcheckremove@ +expression E; +@@ +- if (E) + thread_cancel(&E); + +@cancelguardremove4 depends on nullcheckremove@ +expression E; +@@ +- if (E != NULL) + thread_cancel(&E); + +@replacetimeroff@ +expression E; +@@ + +- THREAD_TIMER_OFF(E); ++ thread_cancel(&E); + +@replacewriteoff@ +expression E; +@@ + +- THREAD_WRITE_OFF(E); ++ thread_cancel(&E); + +@replacereadoff@ +expression E; +@@ + +- THREAD_READ_OFF(E); ++ thread_cancel(&E); + +@replacethreadoff@ +expression E; +@@ + +- THREAD_OFF(E); ++ thread_cancel(&E);
\ No newline at end of file diff --git a/tools/gen_northbound_callbacks.c b/tools/gen_northbound_callbacks.c index eaab932228..a785f43cdf 100644 --- a/tools/gen_northbound_callbacks.c +++ b/tools/gen_northbound_callbacks.c @@ -368,13 +368,12 @@ int main(int argc, char *argv[]) /* Generate callback prototypes. */ if (!static_cbs) { printf("/* prototypes */\n"); - yang_snodes_iterate_module(module->info, generate_prototypes, 0, - NULL); + yang_snodes_iterate(module->info, generate_prototypes, 0, NULL); printf("\n"); } /* Generate callback functions. */ - yang_snodes_iterate_module(module->info, generate_callbacks, 0, NULL); + yang_snodes_iterate(module->info, generate_callbacks, 0, NULL); strlcpy(module_name_underscores, module->name, sizeof(module_name_underscores)); @@ -386,7 +385,7 @@ int main(int argc, char *argv[]) "\t.name = \"%s\",\n" "\t.nodes = {\n", module_name_underscores, module->name); - yang_snodes_iterate_module(module->info, generate_nb_nodes, 0, NULL); + yang_snodes_iterate(module->info, generate_nb_nodes, 0, NULL); printf("\t\t{\n" "\t\t\t.xpath = NULL,\n" "\t\t},\n"); diff --git a/tools/gen_yang_deviations.c b/tools/gen_yang_deviations.c index f908e1fc69..53a53c943c 100644 --- a/tools/gen_yang_deviations.c +++ b/tools/gen_yang_deviations.c @@ -71,8 +71,8 @@ int main(int argc, char *argv[]) module = yang_module_load(argv[0]); /* Generate deviations. */ - yang_snodes_iterate_module(module->info, generate_yang_deviation, - YANG_ITER_FILTER_IMPLICIT, NULL); + yang_snodes_iterate(module->info, generate_yang_deviation, + YANG_ITER_FILTER_IMPLICIT, NULL); /* Cleanup and exit. */ yang_terminate(); diff --git a/watchfrr/watchfrr.c b/watchfrr/watchfrr.c index af243f7ca5..319bd6a771 100644 --- a/watchfrr/watchfrr.c +++ b/watchfrr/watchfrr.c @@ -409,8 +409,8 @@ static void sigchild(void) what = restart->what; restart->pid = 0; gs.numpids--; - thread_cancel(restart->t_kill); - restart->t_kill = NULL; + thread_cancel(&restart->t_kill); + /* Update restart time to reflect the time the command * completed. */ gettimeofday(&restart->time, NULL); @@ -586,6 +586,7 @@ static void restart_done(struct daemon *dmn) return; } THREAD_OFF(dmn->t_wakeup); + if (try_connect(dmn) < 0) SET_WAKEUP_DOWN(dmn); } @@ -678,8 +679,7 @@ static int handle_read(struct thread *t_read) dmn->name, (long)delay.tv_sec, (long)delay.tv_usec); SET_READ_HANDLER(dmn); - if (dmn->t_wakeup) - thread_cancel(dmn->t_wakeup); + thread_cancel(&dmn->t_wakeup); SET_WAKEUP_ECHO(dmn); return 0; @@ -866,9 +866,8 @@ static int phase_hanging(struct thread *t_hanging) static void set_phase(restart_phase_t new_phase) { gs.phase = new_phase; - if (gs.t_phase_hanging) - thread_cancel(gs.t_phase_hanging); - gs.t_phase_hanging = NULL; + thread_cancel(&gs.t_phase_hanging); + thread_add_timer(master, phase_hanging, NULL, PHASE_TIMEOUT, &gs.t_phase_hanging); } diff --git a/yang/frr-bgp-common.yang b/yang/frr-bgp-common.yang index f02d28800e..de78758dbb 100644 --- a/yang/frr-bgp-common.yang +++ b/yang/frr-bgp-common.yang @@ -779,6 +779,48 @@ submodule frr-bgp-common { description "Apply route map to aggregate network."; } + + leaf origin { + type enumeration { + enum "igp" { + value 0; + description + "Local IGP."; + } + enum "egp" { + value 1; + description + "Remote EGP."; + } + enum "incomplete" { + value 2; + description + "Unknown heritage."; + } + enum "unspecified" { + value 255; + description + "Unspecified."; + } + } + default "unspecified"; + description + "BGP origin type."; + } + + leaf match-med { + type boolean; + default "false"; + description + "When set to 'true' aggregate-route matches only + med."; + } + + leaf suppress-map { + type string; + description + "Suppress more specific routes specified in route-map."; + } } grouping admin-distance { @@ -791,6 +833,7 @@ submodule frr-bgp-common { type uint8 { range "1..255"; } + default "20"; description "Administrative distance for routes learned from external BGP (EBGP)."; @@ -800,6 +843,7 @@ submodule frr-bgp-common { type uint8 { range "1..255"; } + default "200"; description "Administrative distance for routes learned from internal BGP (IBGP)."; @@ -809,6 +853,7 @@ submodule frr-bgp-common { type uint8 { range "1..255"; } + default "200"; description "Administrative distance for routes learned from local."; @@ -1017,6 +1062,7 @@ submodule frr-bgp-common { case import-export { uses rt-list; } + case both { leaf-list rt-list { type rt-types:route-target; @@ -1064,7 +1110,11 @@ submodule frr-bgp-common { grouping global-afi-safi-vpn-config { container vpn-config { - uses route-distinguisher-params; + leaf rd { + type string; + description + "Route distinguisher value as per RFC4364."; + } uses vpn-label-params; diff --git a/yang/frr-bgp.yang b/yang/frr-bgp.yang index e10b5e7848..820c4b2861 100644 --- a/yang/frr-bgp.yang +++ b/yang/frr-bgp.yang @@ -353,6 +353,8 @@ module frr-bgp { uses distance-per-route-config; } + uses route-flap-dampening; + uses mp-afi-unicast-common; uses global-filter-config; @@ -362,10 +364,14 @@ module frr-bgp { augment "/frr-rt:routing/frr-rt:control-plane-protocols/frr-rt:control-plane-protocol/bgp/global/afi-safis/afi-safi/ipv4-labeled-unicast" { uses global-group-use-multiple-paths; + + uses route-flap-dampening; } augment "/frr-rt:routing/frr-rt:control-plane-protocols/frr-rt:control-plane-protocol/bgp/global/afi-safis/afi-safi/ipv6-labeled-unicast" { uses global-group-use-multiple-paths; + + uses route-flap-dampening; } augment "/frr-rt:routing/frr-rt:control-plane-protocols/frr-rt:control-plane-protocol/bgp/global/afi-safis/afi-safi/ipv4-multicast" { @@ -411,6 +417,8 @@ module frr-bgp { description "IPv4 multicast destination prefix."; } + + uses distance-per-route-config; } uses admin-distance; @@ -463,8 +471,12 @@ module frr-bgp { description "IPv6 multicast destination prefix."; } + + uses distance-per-route-config; } + uses route-flap-dampening; + uses admin-distance; } diff --git a/yang/frr-isisd.yang b/yang/frr-isisd.yang index 06d1a793b5..c3b39e3750 100644 --- a/yang/frr-isisd.yang +++ b/yang/frr-isisd.yang @@ -1381,6 +1381,12 @@ module frr-isisd { description "Configure last hop behavior."; } + leaf n-flag-clear { + type boolean; + default "false"; + description + "Not a node SID"; + } } } } diff --git a/yang/frr-route-types.yang b/yang/frr-route-types.yang index 057c32a7e7..5a0f58071f 100644 --- a/yang/frr-route-types.yang +++ b/yang/frr-route-types.yang @@ -76,6 +76,9 @@ module frr-route-types { enum vnc { value 17; } + enum vnc-direct { + value 18; + } enum babel { value 22; } @@ -120,6 +123,9 @@ module frr-route-types { enum vnc { value 17; } + enum vnc-direct { + value 18; + } enum babel { value 22; } diff --git a/zebra/connected.c b/zebra/connected.c index cd42b5b250..6a1efc3e65 100644 --- a/zebra/connected.c +++ b/zebra/connected.c @@ -308,8 +308,8 @@ void connected_add_ipv4(struct interface *ifp, int flags, struct in_addr *addr, if (IPV4_ADDR_SAME(addr, dest)) flog_warn( EC_ZEBRA_IFACE_SAME_LOCAL_AS_PEER, - "warning: interface %s has same local and peer address %s, routing protocols may malfunction", - ifp->name, inet_ntoa(*addr)); + "warning: interface %s has same local and peer address %pI4, routing protocols may malfunction", + ifp->name, addr); } else { zlog_debug( "warning: %s called for interface %s with peer flag set, but no peer address supplied", @@ -322,8 +322,8 @@ void connected_add_ipv4(struct interface *ifp, int flags, struct in_addr *addr, if (!dest && (prefixlen == IPV4_MAX_PREFIXLEN) && if_is_pointopoint(ifp)) zlog_debug( - "warning: PtP interface %s with addr %s/%d needs a peer address", - ifp->name, inet_ntoa(*addr), prefixlen); + "warning: PtP interface %s with addr %pI4/%d needs a peer address", + ifp->name, addr, prefixlen); /* Label of this address. */ if (label) diff --git a/zebra/interface.c b/zebra/interface.c index 0652d3a2ba..3b7d6f2432 100644 --- a/zebra/interface.c +++ b/zebra/interface.c @@ -1494,14 +1494,14 @@ static void if_dump_vty(struct vty *vty, struct interface *ifp) vxlan_info = &zebra_if->l2info.vxl; vty_out(vty, " VxLAN Id %u", vxlan_info->vni); if (vxlan_info->vtep_ip.s_addr != INADDR_ANY) - vty_out(vty, " VTEP IP: %s", - inet_ntoa(vxlan_info->vtep_ip)); + vty_out(vty, " VTEP IP: %pI4", + &vxlan_info->vtep_ip); if (vxlan_info->access_vlan) vty_out(vty, " Access VLAN Id %u\n", vxlan_info->access_vlan); if (vxlan_info->mcast_grp.s_addr != INADDR_ANY) - vty_out(vty, " Mcast Group %s", - inet_ntoa(vxlan_info->mcast_grp)); + vty_out(vty, " Mcast Group %pI4", + &vxlan_info->mcast_grp); if (vxlan_info->ifindex_link && (vxlan_info->link_nsid != NS_UNKNOWN)) { struct interface *ifp; @@ -1607,8 +1607,8 @@ static void if_dump_vty(struct vty *vty, struct interface *ifp) vty_out(vty, " Utilized Bandwidth %g (Byte/s)\n", iflp->use_bw); if (IS_PARAM_SET(iflp, LP_RMT_AS)) - vty_out(vty, " Neighbor ASBR IP: %s AS: %u \n", - inet_ntoa(iflp->rmt_ip), iflp->rmt_as); + vty_out(vty, " Neighbor ASBR IP: %pI4 AS: %u \n", + &iflp->rmt_ip, iflp->rmt_as); } hook_call(zebra_if_extra_info, vty, ifp); @@ -3496,7 +3496,7 @@ static int link_params_config_write(struct vty *vty, struct interface *ifp) if (IS_PARAM_SET(iflp, LP_USE_BW)) vty_out(vty, " use-bw %g\n", iflp->use_bw); if (IS_PARAM_SET(iflp, LP_RMT_AS)) - vty_out(vty, " neighbor %s as %u\n", inet_ntoa(iflp->rmt_ip), + vty_out(vty, " neighbor %pI4 as %u\n", &iflp->rmt_ip, iflp->rmt_as); vty_out(vty, " exit-link-params\n"); return 0; diff --git a/zebra/irdp_main.c b/zebra/irdp_main.c index 710a32c452..936206641f 100644 --- a/zebra/irdp_main.c +++ b/zebra/irdp_main.c @@ -263,9 +263,7 @@ void irdp_advert_off(struct interface *ifp) if (!irdp) return; - if (irdp->t_advertise) - thread_cancel(irdp->t_advertise); - irdp->t_advertise = NULL; + thread_cancel(&irdp->t_advertise); if (ifp->connected) for (ALL_LIST_ELEMENTS(ifp->connected, node, nnode, ifc)) { @@ -300,9 +298,7 @@ void process_solicit(struct interface *ifp) return; irdp->flags |= IF_SOLICIT; - if (irdp->t_advertise) - thread_cancel(irdp->t_advertise); - irdp->t_advertise = NULL; + thread_cancel(&irdp->t_advertise); timer = (frr_weak_random() % MAX_RESPONSE_DELAY) + 1; diff --git a/zebra/irdp_packet.c b/zebra/irdp_packet.c index 502a2f277c..56fd35a736 100644 --- a/zebra/irdp_packet.c +++ b/zebra/irdp_packet.c @@ -79,6 +79,7 @@ static void parse_irdp_packet(char *p, int len, struct interface *ifp) struct zebra_if *zi; struct irdp_interface *irdp; uint16_t saved_chksum; + char buf[PREFIX_STRLEN]; zi = ifp->info; if (!zi) @@ -104,8 +105,8 @@ static void parse_irdp_packet(char *p, int len, struct interface *ifp) if (iplen < ICMP_MINLEN) { flog_err(EC_ZEBRA_IRDP_LEN_MISMATCH, - "IRDP: RX ICMP packet too short from %s\n", - inet_ntoa(src)); + "IRDP: RX ICMP packet too short from %pI4\n", + &src); return; } @@ -115,8 +116,8 @@ static void parse_irdp_packet(char *p, int len, struct interface *ifp) len of IP-header) 14+20 */ if (iplen > IRDP_RX_BUF - 34) { flog_err(EC_ZEBRA_IRDP_LEN_MISMATCH, - "IRDP: RX ICMP packet too long from %s\n", - inet_ntoa(src)); + "IRDP: RX ICMP packet too long from %pI4\n", + &src); return; } @@ -128,8 +129,8 @@ static void parse_irdp_packet(char *p, int len, struct interface *ifp) if (in_cksum(icmp, datalen) != saved_chksum) { flog_warn( EC_ZEBRA_IRDP_BAD_CHECKSUM, - "IRDP: RX ICMP packet from %s. Bad checksum, silently ignored", - inet_ntoa(src)); + "IRDP: RX ICMP packet from %pI4 Bad checksum, silently ignored", + &src); return; } @@ -141,8 +142,8 @@ static void parse_irdp_packet(char *p, int len, struct interface *ifp) if (icmp->code != 0) { flog_warn( EC_ZEBRA_IRDP_BAD_TYPE_CODE, - "IRDP: RX packet type %d from %s. Bad ICMP type code, silently ignored", - icmp->type, inet_ntoa(src)); + "IRDP: RX packet type %d from %pI4 Bad ICMP type code, silently ignored", + icmp->type, &src); return; } @@ -152,11 +153,12 @@ static void parse_irdp_packet(char *p, int len, struct interface *ifp) && !(irdp->flags & IF_BROADCAST))) { flog_warn( EC_ZEBRA_IRDP_BAD_RX_FLAGS, - "IRDP: RX illegal from %s to %s while %s operates in %s; Please correct settings\n", - inet_ntoa(src), + "IRDP: RX illegal from %pI4 to %s while %s operates in %s; Please correct settings\n", + &src, ntohl(ip->ip_dst.s_addr) == INADDR_ALLRTRS_GROUP ? "multicast" - : inet_ntoa(ip->ip_dst), + : inet_ntop(AF_INET, &ip->ip_dst, + buf, sizeof(buf)), ifp->name, irdp->flags & IF_BROADCAST ? "broadcast" : "multicast"); return; @@ -169,8 +171,8 @@ static void parse_irdp_packet(char *p, int len, struct interface *ifp) case ICMP_ROUTERSOLICIT: if (irdp->flags & IF_DEBUG_MESSAGES) - zlog_debug("IRDP: RX Solicit on %s from %s", - ifp->name, inet_ntoa(src)); + zlog_debug("IRDP: RX Solicit on %s from %pI4", + ifp->name, &src); process_solicit(ifp); break; @@ -178,8 +180,8 @@ static void parse_irdp_packet(char *p, int len, struct interface *ifp) default: flog_warn( EC_ZEBRA_IRDP_BAD_TYPE_CODE, - "IRDP: RX packet type %d from %s. Bad ICMP type code, silently ignored", - icmp->type, inet_ntoa(src)); + "IRDP: RX packet type %d from %pI4 Bad ICMP type code, silently ignored", + icmp->type, &src); } } diff --git a/zebra/kernel_netlink.c b/zebra/kernel_netlink.c index c53d28a18c..129703d9a9 100644 --- a/zebra/kernel_netlink.c +++ b/zebra/kernel_netlink.c @@ -1051,7 +1051,7 @@ static int nl_batch_read_resp(struct nl_batch *bth) { struct nlmsghdr *h; struct sockaddr_nl snl; - struct msghdr msg; + struct msghdr msg = {}; int status, seq; const struct nlsock *nl; struct zebra_dplane_ctx *ctx; @@ -1501,7 +1501,7 @@ void kernel_init(struct zebra_ns *zns) void kernel_terminate(struct zebra_ns *zns, bool complete) { - THREAD_READ_OFF(zns->t_netlink); + thread_cancel(&zns->t_netlink); if (zns->netlink.sock >= 0) { close(zns->netlink.sock); diff --git a/zebra/main.c b/zebra/main.c index 6b6409f845..ced29e1a25 100644 --- a/zebra/main.c +++ b/zebra/main.c @@ -170,12 +170,14 @@ static void sigint(void) zebra_ptm_finish(); - if (retain_mode) + if (retain_mode) { + zebra_nhg_mark_keep(); RB_FOREACH (vrf, vrf_name_head, &vrfs_by_name) { zvrf = vrf->info; if (zvrf) SET_FLAG(zvrf->flags, ZEBRA_VRF_RETAIN); } + } if (zrouter.lsp_process_q) work_queue_free_and_null(&zrouter.lsp_process_q); diff --git a/zebra/rt_netlink.c b/zebra/rt_netlink.c index d0bf77f016..da0eeb364e 100644 --- a/zebra/rt_netlink.c +++ b/zebra/rt_netlink.c @@ -903,8 +903,6 @@ static int netlink_route_change_read_multicast(struct nlmsghdr *h, int count; int oif[256]; int oif_count = 0; - char sbuf[40]; - char gbuf[40]; char oif_list[256] = "\0"; vrf_id_t vrf; int table; @@ -966,8 +964,6 @@ static int netlink_route_change_read_multicast(struct nlmsghdr *h, struct interface *ifp = NULL; struct zebra_vrf *zvrf = NULL; - strlcpy(sbuf, inet_ntoa(m->sg.src), sizeof(sbuf)); - strlcpy(gbuf, inet_ntoa(m->sg.grp), sizeof(gbuf)); for (count = 0; count < oif_count; count++) { ifp = if_lookup_by_index(oif[count], vrf); char temp[256]; @@ -979,9 +975,10 @@ static int netlink_route_change_read_multicast(struct nlmsghdr *h, zvrf = zebra_vrf_lookup_by_id(vrf); ifp = if_lookup_by_index(iif, vrf); zlog_debug( - "MCAST VRF: %s(%d) %s (%s,%s) IIF: %s(%d) OIF: %s jiffies: %lld", + "MCAST VRF: %s(%d) %s (%pI4,%pI4) IIF: %s(%d) OIF: %s jiffies: %lld", zvrf_name(zvrf), vrf, nl_msg_type_to_str(h->nlmsg_type), - sbuf, gbuf, ifp ? ifp->name : "Unknown", iif, oif_list, + &m->sg.src, &m->sg.grp, ifp ? ifp->name : "Unknown", + iif, oif_list, m->lastused); } return 0; @@ -2890,8 +2887,8 @@ static int netlink_macfdb_change(struct nlmsghdr *h, int len, ns_id_t ns_id) dst_present = 1; memcpy(&vtep_ip.s_addr, RTA_DATA(tb[NDA_DST]), IPV4_MAX_BYTELEN); - snprintf(dst_buf, sizeof(dst_buf), " dst %s", - inet_ntoa(vtep_ip)); + snprintfrr(dst_buf, sizeof(dst_buf), " dst %pI4", + &vtep_ip); } if (tb[NDA_NH_ID]) @@ -3948,8 +3945,8 @@ static int netlink_fdb_nh_update(uint32_t nh_id, struct in_addr vtep_ip) return -1; if (IS_ZEBRA_DEBUG_KERNEL || IS_ZEBRA_DEBUG_EVPN_MH_NH) { - zlog_debug("Tx %s fdb-nh 0x%x %s", - nl_msg_type_to_str(cmd), nh_id, inet_ntoa(vtep_ip)); + zlog_debug("Tx %s fdb-nh 0x%x %pI4", + nl_msg_type_to_str(cmd), nh_id, &vtep_ip); } return netlink_talk(netlink_talk_filter, &req.n, &zns->netlink_cmd, zns, diff --git a/zebra/zebra_dplane.c b/zebra/zebra_dplane.c index 24e8db6f33..e93444d22e 100644 --- a/zebra/zebra_dplane.c +++ b/zebra/zebra_dplane.c @@ -3209,8 +3209,8 @@ enum zebra_dplane_result dplane_vtep_add(const struct interface *ifp, struct ipaddr addr; if (IS_ZEBRA_DEBUG_VXLAN) - zlog_debug("Install %s into flood list for VNI %u intf %s(%u)", - inet_ntoa(*ip), vni, ifp->name, ifp->ifindex); + zlog_debug("Install %pI4 into flood list for VNI %u intf %s(%u)", + ip, vni, ifp->name, ifp->ifindex); SET_IPADDR_V4(&addr); addr.ipaddr_v4 = *ip; @@ -3234,8 +3234,8 @@ enum zebra_dplane_result dplane_vtep_delete(const struct interface *ifp, if (IS_ZEBRA_DEBUG_VXLAN) zlog_debug( - "Uninstall %s from flood list for VNI %u intf %s(%u)", - inet_ntoa(*ip), vni, ifp->name, ifp->ifindex); + "Uninstall %pI4 from flood list for VNI %u intf %s(%u)", + ip, vni, ifp->name, ifp->ifindex); SET_IPADDR_V4(&addr); addr.ipaddr_v4 = *ip; diff --git a/zebra/zebra_evpn.c b/zebra/zebra_evpn.c index e1dbd04def..6722af117c 100644 --- a/zebra/zebra_evpn.c +++ b/zebra/zebra_evpn.c @@ -109,6 +109,7 @@ void zebra_evpn_print(zebra_evpn_t *zevpn, void **ctxt) json_object *json = NULL; json_object *json_vtep_list = NULL; json_object *json_ip_str = NULL; + char buf[PREFIX_STRLEN]; vty = ctxt[0]; json = ctxt[1]; @@ -134,18 +135,20 @@ void zebra_evpn_print(zebra_evpn_t *zevpn, void **ctxt) if (json == NULL) { vty_out(vty, " VxLAN interface: %s\n", zevpn->vxlan_if->name); vty_out(vty, " VxLAN ifIndex: %u\n", zevpn->vxlan_if->ifindex); - vty_out(vty, " Local VTEP IP: %s\n", - inet_ntoa(zevpn->local_vtep_ip)); - vty_out(vty, " Mcast group: %s\n", - inet_ntoa(zevpn->mcast_grp)); + vty_out(vty, " Local VTEP IP: %pI4\n", + &zevpn->local_vtep_ip); + vty_out(vty, " Mcast group: %pI4\n", + &zevpn->mcast_grp); } else { json_object_string_add(json, "vxlanInterface", zevpn->vxlan_if->name); json_object_int_add(json, "ifindex", zevpn->vxlan_if->ifindex); json_object_string_add(json, "vtepIp", - inet_ntoa(zevpn->local_vtep_ip)); + inet_ntop(AF_INET, &zevpn->local_vtep_ip, + buf, sizeof(buf))); json_object_string_add(json, "mcastGroup", - inet_ntoa(zevpn->mcast_grp)); + inet_ntop(AF_INET, &zevpn->mcast_grp, + buf, sizeof(buf))); json_object_string_add(json, "advertiseGatewayMacip", zevpn->advertise_gw_macip ? "Yes" : "No"); json_object_int_add(json, "numMacs", num_macs); @@ -165,12 +168,14 @@ void zebra_evpn_print(zebra_evpn_t *zevpn, void **ctxt) VXLAN_FLOOD_STR_DEFAULT); if (json == NULL) { - vty_out(vty, " %s flood: %s\n", - inet_ntoa(zvtep->vtep_ip), + vty_out(vty, " %pI4 flood: %s\n", + &zvtep->vtep_ip, flood_str); } else { json_ip_str = json_object_new_string( - inet_ntoa(zvtep->vtep_ip)); + inet_ntop(AF_INET, + &zvtep->vtep_ip, buf, + sizeof(buf))); json_object_array_add(json_vtep_list, json_ip_str); } @@ -207,6 +212,7 @@ void zebra_evpn_print_hash(struct hash_bucket *bucket, void *ctxt[]) json_object *json_evpn = NULL; json_object *json_ip_str = NULL; json_object *json_vtep_list = NULL; + char buf[PREFIX_STRLEN]; vty = ctxt[0]; json = ctxt[1]; @@ -245,7 +251,8 @@ void zebra_evpn_print_hash(struct hash_bucket *bucket, void *ctxt[]) json_vtep_list = json_object_new_array(); for (zvtep = zevpn->vteps; zvtep; zvtep = zvtep->next) { json_ip_str = json_object_new_string( - inet_ntoa(zvtep->vtep_ip)); + inet_ntop(AF_INET, &zvtep->vtep_ip, buf, + sizeof(buf))); json_object_array_add(json_vtep_list, json_ip_str); } @@ -1074,8 +1081,8 @@ int zebra_evpn_send_add_to_client(zebra_evpn_t *zevpn) stream_putw_at(s, 0, stream_get_endp(s)); if (IS_ZEBRA_DEBUG_VXLAN) - zlog_debug("Send EVPN_ADD %u %s tenant vrf %s to %s", zevpn->vni, - inet_ntoa(zevpn->local_vtep_ip), + zlog_debug("Send EVPN_ADD %u %pI4 tenant vrf %s to %s", zevpn->vni, + &zevpn->local_vtep_ip, vrf_id_to_name(zevpn->vrf_id), zebra_route_string(client->proto)); diff --git a/zebra/zebra_evpn_mac.c b/zebra/zebra_evpn_mac.c index 75031ddba6..8e9a1a4e8e 100644 --- a/zebra/zebra_evpn_mac.c +++ b/zebra/zebra_evpn_mac.c @@ -417,11 +417,11 @@ static void zebra_evpn_dup_addr_detect_for_mac(struct zebra_vrf *zvrf, if (mac->dad_count >= zvrf->dad_max_moves) { flog_warn(EC_ZEBRA_DUP_MAC_DETECTED, - "VNI %u: MAC %s detected as duplicate during %s VTEP %s", + "VNI %u: MAC %s detected as duplicate during %s VTEP %pI4", mac->zevpn->vni, prefix_mac2str(&mac->macaddr, buf, sizeof(buf)), is_local ? "local update, last" : - "remote update, from", inet_ntoa(vtep_ip)); + "remote update, from", &vtep_ip); SET_FLAG(mac->flags, ZEBRA_MAC_DUPLICATE); @@ -485,6 +485,7 @@ void zebra_evpn_print_mac(zebra_mac_t *mac, void *ctxt, json_object *json) struct listnode *node = NULL; char buf1[ETHER_ADDR_STRLEN]; char buf2[INET6_ADDRSTRLEN]; + char addr_buf[PREFIX_STRLEN]; struct zebra_vrf *zvrf; struct timeval detect_start_time = {0, 0}; char timebuf[MONOTIME_STRLEN]; @@ -518,7 +519,8 @@ void zebra_evpn_print_mac(zebra_mac_t *mac, void *ctxt, json_object *json) json_object_string_add(json_mac, "type", "remote"); json_object_string_add( json_mac, "remoteVtep", - inet_ntoa(mac->fwd_info.r_vtep_ip)); + inet_ntop(AF_INET, &mac->fwd_info.r_vtep_ip, + addr_buf, sizeof(addr_buf))); } else if (CHECK_FLAG(mac->flags, ZEBRA_MAC_AUTO)) json_object_string_add(json_mac, "type", "auto"); @@ -617,8 +619,8 @@ void zebra_evpn_print_mac(zebra_mac_t *mac, void *ctxt, json_object *json) vty_out(vty, " Remote ES: %s", mac->es->esi_str); else - vty_out(vty, " Remote VTEP: %s", - inet_ntoa(mac->fwd_info.r_vtep_ip)); + vty_out(vty, " Remote VTEP: %pI4", + &mac->fwd_info.r_vtep_ip); } else if (CHECK_FLAG(mac->flags, ZEBRA_MAC_AUTO)) { vty_out(vty, " Auto Mac "); } @@ -709,6 +711,7 @@ void zebra_evpn_print_mac_hash(struct hash_bucket *bucket, void *ctxt) json_object *json_mac_hdr = NULL, *json_mac = NULL; zebra_mac_t *mac; char buf1[ETHER_ADDR_STRLEN]; + char addr_buf[PREFIX_STRLEN]; struct mac_walk_ctx *wctx = ctxt; char flags_buf[6]; @@ -785,18 +788,22 @@ void zebra_evpn_print_mac_hash(struct hash_bucket *bucket, void *ctxt) "Intf/Remote ES/VTEP", "VLAN", "Seq #'s"); } + if (mac->es == NULL) + inet_ntop(AF_INET, &mac->fwd_info.r_vtep_ip, + addr_buf, sizeof(addr_buf)); + vty_out(vty, "%-17s %-6s %-5s %-30s %-5s %u/%u\n", buf1, "remote", zebra_evpn_print_mac_flags(mac, flags_buf, - sizeof(flags_buf)), - mac->es ? mac->es->esi_str - : inet_ntoa(mac->fwd_info.r_vtep_ip), + sizeof(flags_buf)), + mac->es ? mac->es->esi_str : addr_buf, "", mac->loc_seq, mac->rem_seq); } else { json_object_string_add(json_mac, "type", "remote"); json_object_string_add( json_mac, "remoteVtep", - inet_ntoa(mac->fwd_info.r_vtep_ip)); + inet_ntop(AF_INET, &mac->fwd_info.r_vtep_ip, + addr_buf, sizeof(addr_buf))); json_object_object_add(json_mac_hdr, buf1, json_mac); json_object_int_add(json_mac, "localSequence", mac->loc_seq); @@ -1769,10 +1776,10 @@ int process_mac_remote_macip_add(zebra_evpn_t *zevpn, struct zebra_vrf *zvrf, mac = zebra_evpn_mac_add(zevpn, macaddr); if (!mac) { zlog_warn( - "Failed to add MAC %s VNI %u Remote VTEP %s", + "Failed to add MAC %s VNI %u Remote VTEP %pI4", prefix_mac2str(macaddr, buf, sizeof(buf)), - zevpn->vni, inet_ntoa(vtep_ip)); + zevpn->vni, &vtep_ip); return -1; } @@ -2028,10 +2035,10 @@ int zebra_evpn_add_update_local_mac(struct zebra_vrf *zvrf, zebra_evpn_t *zevpn, if (CHECK_FLAG(mac->flags, ZEBRA_MAC_STICKY)) { flog_warn( EC_ZEBRA_STICKY_MAC_ALREADY_LEARNT, - "MAC %s already learnt as remote sticky MAC behind VTEP %s VNI %u", + "MAC %s already learnt as remote sticky MAC behind VTEP %pI4 VNI %u", prefix_mac2str(macaddr, buf, sizeof(buf)), - inet_ntoa(mac->fwd_info.r_vtep_ip), + &mac->fwd_info.r_vtep_ip, zevpn->vni); return 0; } diff --git a/zebra/zebra_evpn_mh.c b/zebra/zebra_evpn_mh.c index a406884187..7dbe74e42d 100644 --- a/zebra/zebra_evpn_mh.c +++ b/zebra/zebra_evpn_mh.c @@ -810,6 +810,7 @@ void zebra_evpn_if_init(struct zebra_if *zif) void zebra_evpn_if_cleanup(struct zebra_if *zif) { vlanid_t vid; + struct zebra_evpn_es *es; if (!bf_is_inited(zif->vlan_bitmap)) return; @@ -821,8 +822,9 @@ void zebra_evpn_if_cleanup(struct zebra_if *zif) bf_free(zif->vlan_bitmap); /* Delete associated Ethernet Segment */ - if (zif->es_info.es) - zebra_evpn_local_es_del(&zif->es_info.es); + es = zif->es_info.es; + if (es) + zebra_evpn_local_es_del(&es); } /***************************************************************************** @@ -919,9 +921,9 @@ static void zebra_evpn_nh_add(struct zebra_evpn_es_vtep *es_vtep) return; if (IS_ZEBRA_DEBUG_EVPN_MH_NH) - zlog_debug("es %s vtep %s nh 0x%x add", + zlog_debug("es %s vtep %pI4 nh 0x%x add", es_vtep->es->esi_str, - inet_ntoa(es_vtep->vtep_ip), es_vtep->nh_id); + &es_vtep->vtep_ip, es_vtep->nh_id); /* install the NH */ kernel_upd_mac_nh(es_vtep->nh_id, es_vtep->vtep_ip); /* add the NH to the parent NHG */ @@ -936,9 +938,9 @@ static void zebra_evpn_nh_del(struct zebra_evpn_es_vtep *es_vtep) return; if (IS_ZEBRA_DEBUG_EVPN_MH_NH) - zlog_debug("es %s vtep %s nh 0x%x del", + zlog_debug("es %s vtep %pI4 nh 0x%x del", es_vtep->es->esi_str, - inet_ntoa(es_vtep->vtep_ip), es_vtep->nh_id); + &es_vtep->vtep_ip, es_vtep->nh_id); nh_id = es_vtep->nh_id; es_vtep->nh_id = 0; @@ -1024,8 +1026,8 @@ static void zebra_evpn_es_vtep_add(struct zebra_evpn_es *es, if (!es_vtep) { if (IS_ZEBRA_DEBUG_EVPN_MH_ES) - zlog_debug("es %s vtep %s add", - es->esi_str, inet_ntoa(vtep_ip)); + zlog_debug("es %s vtep %pI4 add", + es->esi_str, &vtep_ip); es_vtep = zebra_evpn_es_vtep_new(es, vtep_ip); /* update the L2-NHG associated with the ES */ zebra_evpn_nh_add(es_vtep); @@ -1041,8 +1043,8 @@ static void zebra_evpn_es_vtep_del(struct zebra_evpn_es *es, if (es_vtep) { if (IS_ZEBRA_DEBUG_EVPN_MH_ES) - zlog_debug("es %s vtep %s del", - es->esi_str, inet_ntoa(vtep_ip)); + zlog_debug("es %s vtep %pI4 del", + es->esi_str, &vtep_ip); zebra_evpn_es_vtep_free(es_vtep); } } @@ -1168,9 +1170,9 @@ static int zebra_evpn_es_send_add_to_client(struct zebra_evpn_es *es) stream_putw_at(s, 0, stream_get_endp(s)); if (IS_ZEBRA_DEBUG_EVPN_MH_ES) - zlog_debug("send add local es %s %s to %s", + zlog_debug("send add local es %s %pI4 to %s", es->esi_str, - inet_ntoa(zmh_info->es_originator_ip), + &zmh_info->es_originator_ip, zebra_route_string(client->proto)); client->local_es_add_cnt++; @@ -1450,7 +1452,7 @@ static int zebra_evpn_local_es_update(struct zebra_if *zif, uint32_t lid, if (!lid || is_zero_mac(sysmac)) { /* if in ES is attached to zif delete it */ if (old_es) - zebra_evpn_local_es_del(&zif->es_info.es); + zebra_evpn_local_es_del(&old_es); return 0; } @@ -1475,7 +1477,7 @@ static int zebra_evpn_local_es_update(struct zebra_if *zif, uint32_t lid, /* release the old_es against the zif */ if (old_es) - zebra_evpn_local_es_del(&zif->es_info.es); + zebra_evpn_local_es_del(&old_es); es = zebra_evpn_es_find(&esi); if (es) { @@ -1498,9 +1500,8 @@ static int zebra_evpn_remote_es_del(esi_t *esi, struct in_addr vtep_ip) struct zebra_evpn_es *es; if (IS_ZEBRA_DEBUG_EVPN_MH_ES) - zlog_debug("remote es %s vtep %s del", - esi_to_str(esi, buf, sizeof(buf)), - inet_ntoa(vtep_ip)); + zlog_debug("remote es %s vtep %pI4 del", + esi_to_str(esi, buf, sizeof(buf)), &vtep_ip); es = zebra_evpn_es_find(esi); if (!es) { @@ -1525,9 +1526,9 @@ static void zebra_evpn_remote_es_flush(struct zebra_evpn_es **esp) for (ALL_LIST_ELEMENTS(es->es_vtep_list, node, nnode, es_vtep)) { if (IS_ZEBRA_DEBUG_EVPN_MH_ES) - zlog_debug("es %s vtep %s flush", + zlog_debug("es %s vtep %pI4 flush", es->esi_str, - inet_ntoa(es_vtep->vtep_ip)); + &es_vtep->vtep_ip); zebra_evpn_es_vtep_free(es_vtep); } zebra_evpn_es_remote_info_re_eval(esp); @@ -1539,9 +1540,8 @@ static int zebra_evpn_remote_es_add(esi_t *esi, struct in_addr vtep_ip) struct zebra_evpn_es *es; if (IS_ZEBRA_DEBUG_EVPN_MH_ES) - zlog_debug("remote es %s vtep %s add", - esi_to_str(esi, buf, sizeof(buf)), - inet_ntoa(vtep_ip)); + zlog_debug("remote es %s vtep %pI4 add", + esi_to_str(esi, buf, sizeof(buf)), &vtep_ip); es = zebra_evpn_es_find(esi); if (!es) { @@ -1756,17 +1756,20 @@ static char *zebra_evpn_es_vtep_str(char *vtep_str, struct zebra_evpn_es *es, { struct zebra_evpn_es_vtep *zvtep; struct listnode *node; + char buf[PREFIX_STRLEN]; bool first = true; vtep_str[0] = '\0'; for (ALL_LIST_ELEMENTS_RO(es->es_vtep_list, node, zvtep)) { if (first) { first = false; - strlcat(vtep_str, inet_ntoa(zvtep->vtep_ip), + strlcat(vtep_str, inet_ntop(AF_INET, &zvtep->vtep_ip, + buf, sizeof(buf)), vtep_str_size); } else { strlcat(vtep_str, ",", vtep_str_size); - strlcat(vtep_str, inet_ntoa(zvtep->vtep_ip), + strlcat(vtep_str, inet_ntop(AF_INET, &zvtep->vtep_ip, + buf, sizeof(buf)), vtep_str_size); } } @@ -1832,8 +1835,8 @@ static void zebra_evpn_es_show_entry_detail(struct vty *vty, vty_out(vty, " Nexthop group: 0x%x\n", es->nhg_id); vty_out(vty, " VTEPs:\n"); for (ALL_LIST_ELEMENTS_RO(es->es_vtep_list, node, zvtep)) - vty_out(vty, " %s nh: 0x%x\n", - inet_ntoa(zvtep->vtep_ip), + vty_out(vty, " %pI4 nh: 0x%x\n", + &zvtep->vtep_ip, zvtep->nh_id); vty_out(vty, "\n"); @@ -2029,8 +2032,8 @@ void zebra_evpn_es_set_base_evpn(zebra_evpn_t *zevpn) zmh_info->es_base_evpn->local_vtep_ip.s_addr; if (IS_ZEBRA_DEBUG_EVPN_MH_ES) - zlog_debug("es originator ip set to %s", - inet_ntoa(zmh_info->es_base_evpn->local_vtep_ip)); + zlog_debug("es originator ip set to %pI4", + &zmh_info->es_base_evpn->local_vtep_ip); /* if originator ip changes we need to update bgp */ for (ALL_LIST_ELEMENTS_RO(zmh_info->local_es_list, node, es)) { diff --git a/zebra/zebra_evpn_neigh.c b/zebra/zebra_evpn_neigh.c index 860dc5b054..bb848255d0 100644 --- a/zebra/zebra_evpn_neigh.c +++ b/zebra/zebra_evpn_neigh.c @@ -1283,12 +1283,12 @@ zebra_evpn_dup_addr_detect_for_neigh(struct zebra_vrf *zvrf, zebra_neigh_t *nbr, if (nbr->dad_count >= zvrf->dad_max_moves) { flog_warn( EC_ZEBRA_DUP_IP_DETECTED, - "VNI %u: MAC %s IP %s detected as duplicate during %s VTEP %s", + "VNI %u: MAC %s IP %s detected as duplicate during %s VTEP %pI4", nbr->zevpn->vni, prefix_mac2str(&nbr->emac, buf, sizeof(buf)), ipaddr2str(&nbr->ip, buf1, sizeof(buf1)), is_local ? "local update, last" : "remote update, from", - inet_ntoa(vtep_ip)); + &vtep_ip); SET_FLAG(nbr->flags, ZEBRA_NEIGH_DUPLICATE); @@ -1790,6 +1790,7 @@ void zebra_evpn_print_neigh(zebra_neigh_t *n, void *ctxt, json_object *json) struct vty *vty; char buf1[ETHER_ADDR_STRLEN]; char buf2[INET6_ADDRSTRLEN]; + char addr_buf[PREFIX_STRLEN]; const char *type_str; const char *state_str; bool flags_present = false; @@ -1867,11 +1868,13 @@ void zebra_evpn_print_neigh(zebra_neigh_t *n, void *ctxt, json_object *json) n->mac->es->esi_str); } else { if (json) - json_object_string_add(json, "remoteVtep", - inet_ntoa(n->r_vtep_ip)); + json_object_string_add( + json, "remoteVtep", + inet_ntop(AF_INET, &n->r_vtep_ip, + addr_buf, sizeof(addr_buf))); else - vty_out(vty, " Remote VTEP: %s\n", - inet_ntoa(n->r_vtep_ip)); + vty_out(vty, " Remote VTEP: %pI4\n", + &n->r_vtep_ip); } } if (CHECK_FLAG(n->flags, ZEBRA_NEIGH_DEF_GW)) { @@ -1952,6 +1955,7 @@ void zebra_evpn_print_neigh_hash(struct hash_bucket *bucket, void *ctxt) zebra_neigh_t *n; char buf1[ETHER_ADDR_STRLEN]; char buf2[INET6_ADDRSTRLEN]; + char addr_buf[PREFIX_STRLEN]; struct neigh_walk_ctx *wctx = ctxt; const char *state_str; char flags_buf[6]; @@ -2006,12 +2010,16 @@ void zebra_evpn_print_neigh_hash(struct hash_bucket *bucket, void *ctxt) if ((wctx->flags & SHOW_REMOTE_NEIGH_FROM_VTEP) && (wctx->count == 0)) zebra_evpn_print_neigh_hdr(vty, wctx); + + if (n->mac->es == NULL) + inet_ntop(AF_INET, &n->r_vtep_ip, + addr_buf, sizeof(addr_buf)); + vty_out(vty, "%*s %-6s %-5s %-8s %-17s %-30s %u/%u\n", -wctx->addr_width, buf2, "remote", zebra_evpn_print_neigh_flags(n, flags_buf, sizeof(flags_buf)), state_str, buf1, - n->mac->es ? n->mac->es->esi_str - : inet_ntoa(n->r_vtep_ip), + n->mac->es ? n->mac->es->esi_str : addr_buf, n->loc_seq, n->rem_seq); } else { json_object_string_add(json_row, "type", "remote"); @@ -2021,8 +2029,10 @@ void zebra_evpn_print_neigh_hash(struct hash_bucket *bucket, void *ctxt) json_object_string_add(json_row, "remoteEs", n->mac->es->esi_str); else - json_object_string_add(json_row, "remoteVtep", - inet_ntoa(n->r_vtep_ip)); + json_object_string_add( + json_row, "remoteVtep", + inet_ntop(AF_INET, &n->r_vtep_ip, + addr_buf, sizeof(addr_buf))); if (CHECK_FLAG(n->flags, ZEBRA_NEIGH_DEF_GW)) json_object_boolean_true_add(json_row, "defaultGateway"); @@ -2133,11 +2143,11 @@ void process_neigh_remote_macip_add(zebra_evpn_t *zevpn, struct zebra_vrf *zvrf, mac, 0); if (!n) { zlog_warn( - "Failed to add Neigh %s MAC %s VNI %u Remote VTEP %s", + "Failed to add Neigh %s MAC %s VNI %u Remote VTEP %pI4", ipaddr2str(ipaddr, buf1, sizeof(buf1)), prefix_mac2str(&mac->macaddr, buf, sizeof(buf)), - zevpn->vni, inet_ntoa(vtep_ip)); + zevpn->vni, &vtep_ip); return; } diff --git a/zebra/zebra_fpm.c b/zebra/zebra_fpm.c index 1c3193449b..2bf48c6277 100644 --- a/zebra/zebra_fpm.c +++ b/zebra/zebra_fpm.c @@ -489,7 +489,7 @@ static inline void zfpm_write_on(void) */ static inline void zfpm_read_off(void) { - THREAD_READ_OFF(zfpm_g->t_read); + thread_cancel(&zfpm_g->t_read); } /* @@ -497,12 +497,12 @@ static inline void zfpm_read_off(void) */ static inline void zfpm_write_off(void) { - THREAD_WRITE_OFF(zfpm_g->t_write); + thread_cancel(&zfpm_g->t_write); } static inline void zfpm_connect_off(void) { - THREAD_TIMER_OFF(zfpm_g->t_connect); + thread_cancel(&zfpm_g->t_connect); } /* @@ -1687,7 +1687,7 @@ static void zfpm_stop_stats_timer(void) return; zfpm_debug("Stopping existing stats timer"); - THREAD_TIMER_OFF(zfpm_g->t_stats); + thread_cancel(&zfpm_g->t_stats); } /* @@ -1933,7 +1933,7 @@ static int fpm_remote_srv_write(struct vty *vty) if ((zfpm_g->fpm_server != FPM_DEFAULT_IP && zfpm_g->fpm_server != INADDR_ANY) || (zfpm_g->fpm_port != FPM_DEFAULT_PORT && zfpm_g->fpm_port != 0)) - vty_out(vty, "fpm connection ip %s port %d\n", inet_ntoa(in), + vty_out(vty, "fpm connection ip %pI4 port %d\n", &in, zfpm_g->fpm_port); return 0; diff --git a/zebra/zebra_fpm_dt.c b/zebra/zebra_fpm_dt.c index 81437e72f5..e392722030 100644 --- a/zebra/zebra_fpm_dt.c +++ b/zebra/zebra_fpm_dt.c @@ -181,6 +181,7 @@ static void zfpm_dt_log_fpm_message(Fpm__Message *msg) char *if_name; size_t i; char buf[INET6_ADDRSTRLEN]; + char addr_buf[PREFIX_STRLEN]; union g_addr nh_addr; if (msg->type != FPM__MESSAGE__TYPE__ADD_ROUTE) @@ -213,7 +214,9 @@ static void zfpm_dt_log_fpm_message(Fpm__Message *msg) zfpm_debug("Nexthop - if_index: %d (%s), gateway: %s, ", if_index, if_name ? if_name : "name not specified", - nexthop->address ? inet_ntoa(nh_addr.ipv4) : "None"); + nexthop->address ? + inet_ntop(AF_INET, &nh_addr.ipv4, + addr_buf, sizeof(addr_buf)) : "None"); } } diff --git a/zebra/zebra_fpm_netlink.c b/zebra/zebra_fpm_netlink.c index 2c07413638..44f574073c 100644 --- a/zebra/zebra_fpm_netlink.c +++ b/zebra/zebra_fpm_netlink.c @@ -44,41 +44,6 @@ #include "zebra/zebra_vxlan_private.h" /* - * addr_to_a - * - * Returns string representation of an address of the given AF. - */ -static inline const char *addr_to_a(uint8_t af, void *addr) -{ - if (!addr) - return "<No address>"; - - switch (af) { - - case AF_INET: - return inet_ntoa(*((struct in_addr *)addr)); - case AF_INET6: - return inet6_ntoa(*((struct in6_addr *)addr)); - default: - return "<Addr in unknown AF>"; - } -} - -/* - * prefix_addr_to_a - * - * Convience wrapper that returns a human-readable string for the - * address in a prefix. - */ -static const char *prefix_addr_to_a(struct prefix *prefix) -{ - if (!prefix) - return "<No address>"; - - return addr_to_a(prefix->family, &prefix->u.prefix); -} - -/* * af_addr_size * * The size of an address in a given address family. @@ -525,18 +490,24 @@ static void zfpm_log_route_info(struct netlink_route_info *ri, { struct netlink_nh_info *nhi; unsigned int i; + char buf[PREFIX_STRLEN]; - zfpm_debug("%s : %s %s/%d, Proto: %s, Metric: %u", label, + zfpm_debug("%s : %s %s, Proto: %s, Metric: %u", label, nl_msg_type_to_str(ri->nlmsg_type), - prefix_addr_to_a(ri->prefix), ri->prefix->prefixlen, + prefix2str(ri->prefix, buf, sizeof(buf)), nl_rtproto_to_str(ri->rtm_protocol), ri->metric ? *ri->metric : 0); for (i = 0; i < ri->num_nhs; i++) { nhi = &ri->nhs[i]; + + if (ri->af == AF_INET) + inet_ntop(AF_INET, &nhi->gateway, buf, sizeof(buf)); + else + inet_ntop(AF_INET6, &nhi->gateway, buf, sizeof(buf)); + zfpm_debug(" Intf: %u, Gateway: %s, Recursive: %s, Type: %s, Encap type: %s", - nhi->if_index, addr_to_a(ri->af, nhi->gateway), - nhi->recursive ? "yes" : "no", + nhi->if_index, buf, nhi->recursive ? "yes" : "no", nexthop_type_to_str(nhi->type), fpm_nh_encap_type_to_str(nhi->encap_info.encap_type) ); @@ -621,11 +592,11 @@ int zfpm_netlink_encode_mac(struct fpm_mac_info_t *mac, char *in_buf, assert(req->hdr.nlmsg_len < in_buf_len); - zfpm_debug("Tx %s family %s ifindex %u MAC %s DEST %s", + zfpm_debug("Tx %s family %s ifindex %u MAC %s DEST %pI4", nl_msg_type_to_str(req->hdr.nlmsg_type), nl_family_to_str(req->ndm.ndm_family), req->ndm.ndm_ifindex, prefix_mac2str(&mac->macaddr, buf1, sizeof(buf1)), - inet_ntoa(mac->r_vtep_ip)); + &mac->r_vtep_ip); return req->hdr.nlmsg_len; } diff --git a/zebra/zebra_mpls.c b/zebra/zebra_mpls.c index c3982904e9..dc49695019 100644 --- a/zebra/zebra_mpls.c +++ b/zebra/zebra_mpls.c @@ -331,7 +331,6 @@ static void fec_evaluate(struct zebra_vrf *zvrf) zebra_fec_t *fec; uint32_t old_label, new_label; int af; - char buf[BUFSIZ]; for (af = AFI_IP; af < AFI_MAX; af++) { if (zvrf->fec_table[af] == NULL) @@ -348,9 +347,6 @@ static void fec_evaluate(struct zebra_vrf *zvrf) || fec->label_index == MPLS_INVALID_LABEL_INDEX) continue; - if (IS_ZEBRA_DEBUG_MPLS) - prefix2str(&rn->p, buf, BUFSIZ); - /* Save old label, determine new label. */ old_label = fec->label; new_label = @@ -364,8 +360,8 @@ static void fec_evaluate(struct zebra_vrf *zvrf) if (IS_ZEBRA_DEBUG_MPLS) zlog_debug( - "Update fec %s new label %u upon label block", - buf, new_label); + "Update fec %pRN new label %u upon label block", + rn, new_label); fec->label = new_label; fec_update_clients(fec); @@ -494,8 +490,7 @@ static void fec_print(zebra_fec_t *fec, struct vty *vty) char buf[BUFSIZ]; rn = fec->rn; - prefix2str(&rn->p, buf, BUFSIZ); - vty_out(vty, "%s\n", buf); + vty_out(vty, "%pRN\n", rn); vty_out(vty, " Label: %s", label2str(fec->label, buf, BUFSIZ)); if (fec->label_index != MPLS_INVALID_LABEL_INDEX) vty_out(vty, ", Label Index: %u", fec->label_index); @@ -1502,7 +1497,8 @@ static json_object *nhlfe_json(zebra_nhlfe_t *nhlfe) case NEXTHOP_TYPE_IPV4: case NEXTHOP_TYPE_IPV4_IFINDEX: json_object_string_add(json_nhlfe, "nexthop", - inet_ntoa(nexthop->gate.ipv4)); + inet_ntop(AF_INET, &nexthop->gate.ipv4, + buf, sizeof(buf))); break; case NEXTHOP_TYPE_IPV6: case NEXTHOP_TYPE_IPV6_IFINDEX: @@ -1560,7 +1556,7 @@ static void nhlfe_print(zebra_nhlfe_t *nhlfe, struct vty *vty, switch (nexthop->type) { case NEXTHOP_TYPE_IPV4: case NEXTHOP_TYPE_IPV4_IFINDEX: - vty_out(vty, " via %s", inet_ntoa(nexthop->gate.ipv4)); + vty_out(vty, " via %pI4", &nexthop->gate.ipv4); if (nexthop->ifindex) vty_out(vty, " dev %s", ifindex2ifname(nexthop->ifindex, @@ -2243,7 +2239,6 @@ int zebra_mpls_fec_register(struct zebra_vrf *zvrf, struct prefix *p, { struct route_table *table; zebra_fec_t *fec; - char buf[BUFSIZ]; bool new_client; bool label_change = false; uint32_t old_label; @@ -2254,14 +2249,11 @@ int zebra_mpls_fec_register(struct zebra_vrf *zvrf, struct prefix *p, if (!table) return -1; - if (IS_ZEBRA_DEBUG_MPLS) - prefix2str(p, buf, BUFSIZ); - if (label != MPLS_INVALID_LABEL && have_label_index) { flog_err( EC_ZEBRA_FEC_LABEL_INDEX_LABEL_CONFLICT, - "Rejecting FEC register for %s with both label %u and Label Index %u specified, client %s", - buf, label, label_index, + "Rejecting FEC register for %pFX with both label %u and Label Index %u specified, client %s", + p, label, label_index, zebra_route_string(client->proto)); return -1; } @@ -2273,8 +2265,8 @@ int zebra_mpls_fec_register(struct zebra_vrf *zvrf, struct prefix *p, if (!fec) { flog_err( EC_ZEBRA_FEC_ADD_FAILED, - "Failed to add FEC %s upon register, client %s", - buf, zebra_route_string(client->proto)); + "Failed to add FEC %pFX upon register, client %s", + p, zebra_route_string(client->proto)); return -1; } @@ -2300,7 +2292,7 @@ int zebra_mpls_fec_register(struct zebra_vrf *zvrf, struct prefix *p, listnode_add(fec->client_list, client); if (IS_ZEBRA_DEBUG_MPLS) - zlog_debug("FEC %s label%s %u %s by client %s%s", buf, + zlog_debug("FEC %pFX label%s %u %s by client %s%s", p, have_label_index ? " index" : "", have_label_index ? label_index : label, new_client ? "registered" : "updated", @@ -2351,15 +2343,11 @@ int zebra_mpls_fec_unregister(struct zebra_vrf *zvrf, struct prefix *p, { struct route_table *table; zebra_fec_t *fec; - char buf[BUFSIZ]; table = zvrf->fec_table[family2afi(PREFIX_FAMILY(p))]; if (!table) return -1; - if (IS_ZEBRA_DEBUG_MPLS) - prefix2str(p, buf, BUFSIZ); - fec = fec_find(table, p); if (!fec) { flog_err(EC_ZEBRA_FEC_RM_FAILED, @@ -2371,7 +2359,7 @@ int zebra_mpls_fec_unregister(struct zebra_vrf *zvrf, struct prefix *p, listnode_delete(fec->client_list, client); if (IS_ZEBRA_DEBUG_MPLS) - zlog_debug("FEC %s unregistered by client %s", buf, + zlog_debug("FEC %pFX unregistered by client %s", p, zebra_route_string(client->proto)); /* If not a configured entry, delete the FEC if no other clients. Before @@ -2512,7 +2500,6 @@ int zebra_mpls_static_fec_add(struct zebra_vrf *zvrf, struct prefix *p, { struct route_table *table; zebra_fec_t *fec; - char buf[BUFSIZ]; mpls_label_t old_label; int ret = 0; @@ -2520,9 +2507,6 @@ int zebra_mpls_static_fec_add(struct zebra_vrf *zvrf, struct prefix *p, if (!table) return -1; - if (IS_ZEBRA_DEBUG_MPLS) - prefix2str(p, buf, BUFSIZ); - /* Update existing FEC or create a new one. */ fec = fec_find(table, p); if (!fec) { @@ -2535,7 +2519,7 @@ int zebra_mpls_static_fec_add(struct zebra_vrf *zvrf, struct prefix *p, } if (IS_ZEBRA_DEBUG_MPLS) - zlog_debug("Add fec %s label %u", buf, in_label); + zlog_debug("Add fec %pFX label %u", p, in_label); } else { fec->flags |= FEC_FLAG_CONFIGURED; if (fec->label == in_label) @@ -2545,7 +2529,7 @@ int zebra_mpls_static_fec_add(struct zebra_vrf *zvrf, struct prefix *p, /* Label change, update clients. */ old_label = fec->label; if (IS_ZEBRA_DEBUG_MPLS) - zlog_debug("Update fec %s new label %u", buf, in_label); + zlog_debug("Update fec %pFX new label %u", p, in_label); fec->label = in_label; fec_update_clients(fec); @@ -2568,7 +2552,6 @@ int zebra_mpls_static_fec_del(struct zebra_vrf *zvrf, struct prefix *p) struct route_table *table; zebra_fec_t *fec; mpls_label_t old_label; - char buf[BUFSIZ]; table = zvrf->fec_table[family2afi(PREFIX_FAMILY(p))]; if (!table) @@ -2576,9 +2559,8 @@ int zebra_mpls_static_fec_del(struct zebra_vrf *zvrf, struct prefix *p) fec = fec_find(table, p); if (!fec) { - prefix2str(p, buf, BUFSIZ); flog_err(EC_ZEBRA_FEC_RM_FAILED, - "Failed to find FEC %s upon delete", buf); + "Failed to find FEC %pFX upon delete", p); return -1; } diff --git a/zebra/zebra_mroute.c b/zebra/zebra_mroute.c index 583b666e66..3af805558d 100644 --- a/zebra/zebra_mroute.c +++ b/zebra/zebra_mroute.c @@ -47,8 +47,8 @@ void zebra_ipmr_route_stats(ZAPI_HANDLER_ARGS) char sbuf[40]; char gbuf[40]; - strlcpy(sbuf, inet_ntoa(mroute.sg.src), sizeof(sbuf)); - strlcpy(gbuf, inet_ntoa(mroute.sg.grp), sizeof(gbuf)); + inet_ntop(AF_INET, &mroute.sg.src, sbuf, sizeof(sbuf)); + inet_ntop(AF_INET, &mroute.sg.grp, gbuf, sizeof(gbuf)); zlog_debug("Asking for (%s,%s)[%s(%u)] mroute information", sbuf, gbuf, zvrf->vrf->name, zvrf->vrf->vrf_id); diff --git a/zebra/zebra_netns_notify.c b/zebra/zebra_netns_notify.c index 995fa6fb5a..ee2dc7a0ed 100644 --- a/zebra/zebra_netns_notify.c +++ b/zebra/zebra_netns_notify.c @@ -378,7 +378,7 @@ void zebra_ns_notify_close(void) fd = zebra_netns_notify_current->u.fd; if (zebra_netns_notify_current->master != NULL) - thread_cancel(zebra_netns_notify_current); + thread_cancel(&zebra_netns_notify_current); /* auto-removal of notify items */ if (fd > 0) diff --git a/zebra/zebra_nhg.c b/zebra/zebra_nhg.c index f1f6e7e2bf..ebefa020c8 100644 --- a/zebra/zebra_nhg.c +++ b/zebra/zebra_nhg.c @@ -442,11 +442,8 @@ static void *zebra_nhg_hash_alloc(void *arg) /* Mark duplicate nexthops in a group at creation time. */ nexthop_group_mark_duplicates(&(nhe->nhg)); - zebra_nhg_connect_depends(nhe, &(copy->nhg_depends)); - /* Add the ifp now if it's not a group or recursive and has ifindex */ - if (zebra_nhg_depends_is_empty(nhe) && nhe->nhg.nexthop - && nhe->nhg.nexthop->ifindex) { + if (nhe->nhg.nexthop && nhe->nhg.nexthop->ifindex) { struct interface *ifp = NULL; ifp = if_lookup_by_index(nhe->nhg.nexthop->ifindex, @@ -461,7 +458,6 @@ static void *zebra_nhg_hash_alloc(void *arg) nhe->nhg.nexthop->vrf_id, nhe->id); } - return nhe; } @@ -754,7 +750,7 @@ static bool zebra_nhe_find(struct nhg_hash_entry **nhe, /* return value */ * resolving nexthop; or a group of nexthops, where we need * relationships with the corresponding singletons. */ - zebra_nhg_depends_init(lookup); + zebra_nhg_depends_init(newnhe); nh = newnhe->nhg.nexthop; @@ -786,7 +782,14 @@ static bool zebra_nhe_find(struct nhg_hash_entry **nhe, /* return value */ } if (recursive) - SET_FLAG((*nhe)->flags, NEXTHOP_GROUP_RECURSIVE); + SET_FLAG(newnhe->flags, NEXTHOP_GROUP_RECURSIVE); + + /* Attach dependent backpointers to singletons */ + zebra_nhg_connect_depends(newnhe, &newnhe->nhg_depends); + + /** + * Backup Nexthops + */ if (zebra_nhg_get_backup_nhg(newnhe) == NULL || zebra_nhg_get_backup_nhg(newnhe)->nexthop == NULL) @@ -1588,6 +1591,7 @@ void zebra_nhg_free(struct nhg_hash_entry *nhe) void zebra_nhg_hash_free(void *p) { + zebra_nhg_release_all_deps((struct nhg_hash_entry *)p); zebra_nhg_free((struct nhg_hash_entry *)p); } @@ -2711,6 +2715,30 @@ void zebra_nhg_sweep_table(struct hash *hash) hash_iterate(hash, zebra_nhg_sweep_entry, NULL); } +static void zebra_nhg_mark_keep_entry(struct hash_bucket *bucket, void *arg) +{ + struct nhg_hash_entry *nhe = bucket->data; + + UNSET_FLAG(nhe->flags, NEXTHOP_GROUP_INSTALLED); +} + +/* + * When we are shutting down and we have retain mode enabled + * in zebra the process is to mark each vrf that it's + * routes should not be deleted. The problem with that + * is that shutdown actually free's up memory which + * causes the nexthop group's ref counts to go to zero + * we need a way to subtly tell the system to not remove + * the nexthop groups from the kernel at the same time. + * The easiest just looks like that we should not mark + * the nhg's as installed any more and when the ref count + * goes to zero we'll attempt to delete and do nothing + */ +void zebra_nhg_mark_keep(void) +{ + hash_iterate(zrouter.nhgs_id, zebra_nhg_mark_keep_entry, NULL); +} + /* Global control to disable use of kernel nexthops, if available. We can't * force the kernel to support nexthop ids, of course, but we can disable * zebra's use of them, for testing e.g. By default, if the kernel supports @@ -2814,10 +2842,15 @@ struct nhg_hash_entry *zebra_nhg_proto_add(uint32_t id, int type, if (old) { /* * This is a replace, just release NHE from ID for now, The - * depends/dependents may still be used in the replacement. + * depends/dependents may still be used in the replacement so + * we don't touch them other than to remove their refs to their + * old parent. */ replace = true; hash_release(zrouter.nhgs_id, old); + + /* Free all the things */ + zebra_nhg_release_all_deps(old); } new = zebra_nhg_rib_find_nhe(&lookup, afi); @@ -2854,9 +2887,6 @@ struct nhg_hash_entry *zebra_nhg_proto_add(uint32_t id, int type, zebra_nhg_decrement_ref(rb_node_dep->nhe); } - /* Free all the things */ - zebra_nhg_release_all_deps(old); - /* Dont call the dec API, we dont want to uninstall the ID */ old->refcnt = 0; zebra_nhg_free(old); diff --git a/zebra/zebra_nhg.h b/zebra/zebra_nhg.h index 052fa65d06..b2ef88bb61 100644 --- a/zebra/zebra_nhg.h +++ b/zebra/zebra_nhg.h @@ -324,9 +324,16 @@ struct zebra_dplane_ctx; extern void zebra_nhg_dplane_result(struct zebra_dplane_ctx *ctx); -/* Sweet the nhg hash tables for old entries on restart */ +/* Sweep the nhg hash tables for old entries on restart */ extern void zebra_nhg_sweep_table(struct hash *hash); +/* + * We are shutting down but the nexthops should be kept + * as that -r has been specified and we don't want to delete + * the routes unintentionally + */ +extern void zebra_nhg_mark_keep(void); + /* Nexthop resolution processing */ struct route_entry; /* Forward ref to avoid circular includes */ extern int nexthop_active_update(struct route_node *rn, struct route_entry *re); diff --git a/zebra/zebra_ptm.c b/zebra/zebra_ptm.c index 9a3b567b5a..1e7b38086b 100644 --- a/zebra/zebra_ptm.c +++ b/zebra/zebra_ptm.c @@ -156,13 +156,10 @@ void zebra_ptm_finish(void) if (ptm_cb.in_data) free(ptm_cb.in_data); - /* Release threads. */ - if (ptm_cb.t_read) - thread_cancel(ptm_cb.t_read); - if (ptm_cb.t_write) - thread_cancel(ptm_cb.t_write); - if (ptm_cb.t_timer) - thread_cancel(ptm_cb.t_timer); + /* Cancel events. */ + thread_cancel(&ptm_cb.t_read); + thread_cancel(&ptm_cb.t_write); + thread_cancel(&ptm_cb.t_timer); if (ptm_cb.wb) buffer_free(ptm_cb.wb); @@ -218,7 +215,7 @@ static int zebra_ptm_send_message(char *data, int size) ptm_cb.reconnect_time, &ptm_cb.t_timer); return -1; case BUFFER_EMPTY: - THREAD_OFF(ptm_cb.t_write); + thread_cancel(&ptm_cb.t_write); break; case BUFFER_PENDING: thread_add_write(zrouter.master, zebra_ptm_flush_messages, NULL, diff --git a/zebra/zebra_pw.c b/zebra/zebra_pw.c index cdcca1e930..ecae021dba 100644 --- a/zebra/zebra_pw.c +++ b/zebra/zebra_pw.c @@ -102,7 +102,7 @@ void zebra_pw_del(struct zebra_vrf *zvrf, struct zebra_pw *pw) hook_call(pw_uninstall, pw); dplane_pw_uninstall(pw); } else if (pw->install_retry_timer) - THREAD_TIMER_OFF(pw->install_retry_timer); + thread_cancel(&pw->install_retry_timer); /* unlink and release memory */ RB_REMOVE(zebra_pw_head, &zvrf->pseudowires, pw); @@ -219,7 +219,7 @@ void zebra_pw_install_failure(struct zebra_pw *pw, int pwstatus) pw->vrf_id, pw->ifname, PW_INSTALL_RETRY_INTERVAL); /* schedule to retry later */ - THREAD_TIMER_OFF(pw->install_retry_timer); + thread_cancel(&pw->install_retry_timer); thread_add_timer(zrouter.master, zebra_pw_install_retry, pw, PW_INSTALL_RETRY_INTERVAL, &pw->install_retry_timer); diff --git a/zebra/zebra_rib.c b/zebra/zebra_rib.c index 730042b72c..ab7423a12a 100644 --- a/zebra/zebra_rib.c +++ b/zebra/zebra_rib.c @@ -1495,7 +1495,6 @@ static bool rib_update_re_from_ctx(struct route_entry *re, struct route_node *rn, struct zebra_dplane_ctx *ctx) { - char dest_str[PREFIX_STRLEN] = ""; struct nexthop *nexthop; bool matched; const struct nexthop_group *ctxnhg; @@ -1507,19 +1506,13 @@ static bool rib_update_re_from_ctx(struct route_entry *re, vrf = vrf_lookup_by_id(re->vrf_id); - /* Note well: only capturing the prefix string if debug is enabled here; - * unconditional log messages will have to generate the string. - */ - if (IS_ZEBRA_DEBUG_RIB) - prefix2str(&(rn->p), dest_str, sizeof(dest_str)); - dest = rib_dest_from_rnode(rn); if (dest) is_selected = (re == dest->selected_fib); if (IS_ZEBRA_DEBUG_RIB_DETAILED) - zlog_debug("update_from_ctx: %s(%u:%u):%s: %sSELECTED, re %p", - VRF_LOGNAME(vrf), re->vrf_id, re->table, dest_str, + zlog_debug("update_from_ctx: %s(%u:%u):%pRN: %sSELECTED, re %p", + VRF_LOGNAME(vrf), re->vrf_id, re->table, rn, (is_selected ? "" : "NOT "), re); /* Update zebra's nexthop FIB flag for each nexthop that was installed. @@ -1545,9 +1538,8 @@ static bool rib_update_re_from_ctx(struct route_entry *re, if (matched) { if (IS_ZEBRA_DEBUG_RIB) zlog_debug( - "%s(%u:%u):%s update_from_ctx(): existing fib nhg, no change", - VRF_LOGNAME(vrf), re->vrf_id, re->table, - dest_str); + "%s(%u:%u):%pRN update_from_ctx(): existing fib nhg, no change", + VRF_LOGNAME(vrf), re->vrf_id, re->table, rn); goto check_backups; } else if (CHECK_FLAG(re->status, ROUTE_ENTRY_USE_FIB_NHG)) { @@ -1556,9 +1548,8 @@ static bool rib_update_re_from_ctx(struct route_entry *re, */ if (IS_ZEBRA_DEBUG_RIB) zlog_debug( - "%s(%u:%u):%s update_from_ctx(): replacing fib nhg", - VRF_LOGNAME(vrf), re->vrf_id, re->table, - dest_str); + "%s(%u:%u):%pRN update_from_ctx(): replacing fib nhg", + VRF_LOGNAME(vrf), re->vrf_id, re->table, rn); nexthops_free(re->fib_ng.nexthop); re->fib_ng.nexthop = NULL; @@ -1568,9 +1559,9 @@ static bool rib_update_re_from_ctx(struct route_entry *re, changed_p = true; } else { if (IS_ZEBRA_DEBUG_RIB) - zlog_debug("%s(%u:%u):%s update_from_ctx(): no fib nhg", - VRF_LOGNAME(vrf), re->vrf_id, re->table, - dest_str); + zlog_debug( + "%s(%u:%u):%pRN update_from_ctx(): no fib nhg", + VRF_LOGNAME(vrf), re->vrf_id, re->table, rn); } /* @@ -1597,9 +1588,9 @@ static bool rib_update_re_from_ctx(struct route_entry *re, if (matched) { if (IS_ZEBRA_DEBUG_RIB) zlog_debug( - "%s(%u:%u):%s update_from_ctx(): rib nhg matched, changed '%s'", - VRF_LOGNAME(vrf), re->vrf_id, re->table, - dest_str, (changed_p ? "true" : "false")); + "%s(%u:%u):%pRN update_from_ctx(): rib nhg matched, changed '%s'", + VRF_LOGNAME(vrf), re->vrf_id, re->table, rn, + (changed_p ? "true" : "false")); goto check_backups; } @@ -1610,8 +1601,8 @@ no_nexthops: */ if (IS_ZEBRA_DEBUG_RIB) zlog_debug( - "%s(%u:%u):%s update_from_ctx(): changed %s, adding new fib nhg%s", - VRF_LOGNAME(vrf), re->vrf_id, re->table, dest_str, + "%s(%u:%u):%pRN update_from_ctx(): changed %s, adding new fib nhg%s", + VRF_LOGNAME(vrf), re->vrf_id, re->table, rn, (changed_p ? "true" : "false"), ctxnhg->nexthop != NULL ? "" : " (empty)"); @@ -1645,8 +1636,8 @@ check_backups: if (matched) { if (IS_ZEBRA_DEBUG_RIB) zlog_debug( - "%s(%u):%s update_from_ctx(): existing fib backup nhg, no change", - VRF_LOGNAME(vrf), re->vrf_id, dest_str); + "%s(%u):%pRN update_from_ctx(): existing fib backup nhg, no change", + VRF_LOGNAME(vrf), re->vrf_id, rn); goto done; } else if (re->fib_backup_ng.nexthop) { @@ -1656,8 +1647,8 @@ check_backups: */ if (IS_ZEBRA_DEBUG_RIB) zlog_debug( - "%s(%u):%s update_from_ctx(): replacing fib backup nhg", - VRF_LOGNAME(vrf), re->vrf_id, dest_str); + "%s(%u):%pRN update_from_ctx(): replacing fib backup nhg", + VRF_LOGNAME(vrf), re->vrf_id, rn); nexthops_free(re->fib_backup_ng.nexthop); re->fib_backup_ng.nexthop = NULL; @@ -1665,8 +1656,9 @@ check_backups: changed_p = true; } else { if (IS_ZEBRA_DEBUG_RIB) - zlog_debug("%s(%u):%s update_from_ctx(): no fib backup nhg", - VRF_LOGNAME(vrf), re->vrf_id, dest_str); + zlog_debug( + "%s(%u):%pRN update_from_ctx(): no fib backup nhg", + VRF_LOGNAME(vrf), re->vrf_id, rn); } /* @@ -1685,9 +1677,10 @@ check_backups: goto done; if (IS_ZEBRA_DEBUG_RIB) - zlog_debug("%s(%u):%s update_from_ctx(): changed %s, adding new backup fib nhg", - VRF_LOGNAME(vrf), re->vrf_id, dest_str, - (changed_p ? "true" : "false")); + zlog_debug( + "%s(%u):%pRN update_from_ctx(): changed %s, adding new backup fib nhg", + VRF_LOGNAME(vrf), re->vrf_id, rn, + (changed_p ? "true" : "false")); copy_nexthops(&(re->fib_backup_ng.nexthop), ctxnhg->nexthop, NULL); @@ -1749,7 +1742,6 @@ static void rib_process_result(struct zebra_dplane_ctx *ctx) struct route_node *rn = NULL; struct route_entry *re = NULL, *old_re = NULL, *rib; bool is_update = false; - char dest_str[PREFIX_STRLEN] = ""; enum dplane_op_e op; enum zebra_dplane_result status; const struct prefix *dest_pfx, *src_pfx; @@ -1761,20 +1753,14 @@ static void rib_process_result(struct zebra_dplane_ctx *ctx) vrf = vrf_lookup_by_id(dplane_ctx_get_vrf(ctx)); dest_pfx = dplane_ctx_get_dest(ctx); - /* Note well: only capturing the prefix string if debug is enabled here; - * unconditional log messages will have to generate the string. - */ - if (IS_ZEBRA_DEBUG_DPLANE) - prefix2str(dest_pfx, dest_str, sizeof(dest_str)); - /* Locate rn and re(s) from ctx */ rn = rib_find_rn_from_ctx(ctx); if (rn == NULL) { if (IS_ZEBRA_DEBUG_DPLANE) { zlog_debug( - "Failed to process dplane results: no route for %s(%u):%s", + "Failed to process dplane results: no route for %s(%u):%pFX", VRF_LOGNAME(vrf), dplane_ctx_get_vrf(ctx), - dest_str); + dest_pfx); } goto done; } @@ -1787,9 +1773,9 @@ static void rib_process_result(struct zebra_dplane_ctx *ctx) if (IS_ZEBRA_DEBUG_DPLANE_DETAIL) zlog_debug( - "%s(%u:%u):%s Processing dplane result ctx %p, op %s result %s", + "%s(%u:%u):%pFX Processing dplane result ctx %p, op %s result %s", VRF_LOGNAME(vrf), dplane_ctx_get_vrf(ctx), - dplane_ctx_get_table(ctx), dest_str, ctx, + dplane_ctx_get_table(ctx), dest_pfx, ctx, dplane_op2str(op), dplane_res2str(status)); /* @@ -1829,9 +1815,9 @@ static void rib_process_result(struct zebra_dplane_ctx *ctx) if (re->dplane_sequence != seq) { if (IS_ZEBRA_DEBUG_DPLANE_DETAIL) zlog_debug( - "%s(%u):%s Stale dplane result for re %p", + "%s(%u):%pFX Stale dplane result for re %p", VRF_LOGNAME(vrf), - dplane_ctx_get_vrf(ctx), dest_str, re); + dplane_ctx_get_vrf(ctx), dest_pfx, re); } else UNSET_FLAG(re->status, ROUTE_ENTRY_QUEUED); } @@ -1840,10 +1826,10 @@ static void rib_process_result(struct zebra_dplane_ctx *ctx) if (old_re->dplane_sequence != dplane_ctx_get_old_seq(ctx)) { if (IS_ZEBRA_DEBUG_DPLANE_DETAIL) zlog_debug( - "%s(%u:%u):%s Stale dplane result for old_re %p", + "%s(%u:%u):%pFX Stale dplane result for old_re %p", VRF_LOGNAME(vrf), dplane_ctx_get_vrf(ctx), old_re->table, - dest_str, old_re); + dest_pfx, old_re); } else UNSET_FLAG(old_re->status, ROUTE_ENTRY_QUEUED); } @@ -1881,12 +1867,12 @@ static void rib_process_result(struct zebra_dplane_ctx *ctx) if (!fib_changed) { if (IS_ZEBRA_DEBUG_DPLANE_DETAIL) zlog_debug( - "%s(%u:%u):%s no fib change for re", + "%s(%u:%u):%pFX no fib change for re", VRF_LOGNAME(vrf), dplane_ctx_get_vrf(ctx), dplane_ctx_get_table( ctx), - dest_str); + dest_pfx); } /* Redistribute if this is the selected re */ @@ -2027,7 +2013,6 @@ static void rib_process_dplane_notify(struct zebra_dplane_ctx *ctx) struct route_entry *re = NULL; struct vrf *vrf; struct nexthop *nexthop; - char dest_str[PREFIX_STRLEN] = ""; const struct prefix *dest_pfx, *src_pfx; rib_dest_t *dest; bool fib_changed = false; @@ -2036,20 +2021,14 @@ static void rib_process_dplane_notify(struct zebra_dplane_ctx *ctx) dest_pfx = dplane_ctx_get_dest(ctx); vrf = vrf_lookup_by_id(dplane_ctx_get_vrf(ctx)); - /* Note well: only capturing the prefix string if debug is enabled here; - * unconditional log messages will have to generate the string. - */ - if (debug_p) - prefix2str(dest_pfx, dest_str, sizeof(dest_str)); - /* Locate rn and re(s) from ctx */ rn = rib_find_rn_from_ctx(ctx); if (rn == NULL) { if (debug_p) { zlog_debug( - "Failed to process dplane notification: no routes for %s(%u:%u):%s", + "Failed to process dplane notification: no routes for %s(%u:%u):%pFX", VRF_LOGNAME(vrf), dplane_ctx_get_vrf(ctx), - dplane_ctx_get_table(ctx), dest_str); + dplane_ctx_get_table(ctx), dest_pfx); } goto done; } @@ -2058,9 +2037,9 @@ static void rib_process_dplane_notify(struct zebra_dplane_ctx *ctx) srcdest_rnode_prefixes(rn, &dest_pfx, &src_pfx); if (debug_p) - zlog_debug("%s(%u:%u):%s Processing dplane notif ctx %p", + zlog_debug("%s(%u:%u):%pFX Processing dplane notif ctx %p", VRF_LOGNAME(vrf), dplane_ctx_get_vrf(ctx), - dplane_ctx_get_table(ctx), dest_str, ctx); + dplane_ctx_get_table(ctx), dest_pfx, ctx); /* * Take a pass through the routes, look for matches with the context @@ -2075,9 +2054,9 @@ static void rib_process_dplane_notify(struct zebra_dplane_ctx *ctx) if (re == NULL) { if (debug_p) zlog_debug( - "%s(%u:%u):%s Unable to process dplane notification: no entry for type %s", + "%s(%u:%u):%pFX Unable to process dplane notification: no entry for type %s", VRF_LOGNAME(vrf), dplane_ctx_get_vrf(ctx), - dplane_ctx_get_table(ctx), dest_str, + dplane_ctx_get_table(ctx), dest_pfx, zebra_route_string(dplane_ctx_get_type(ctx))); goto done; @@ -2109,20 +2088,20 @@ static void rib_process_dplane_notify(struct zebra_dplane_ctx *ctx) UNSET_FLAG(re->status, ROUTE_ENTRY_INSTALLED); if (debug_p) zlog_debug( - "%s(%u:%u):%s dplane notif, uninstalled type %s route", + "%s(%u:%u):%pFX dplane notif, uninstalled type %s route", VRF_LOGNAME(vrf), dplane_ctx_get_vrf(ctx), - dplane_ctx_get_table(ctx), dest_str, + dplane_ctx_get_table(ctx), dest_pfx, zebra_route_string( dplane_ctx_get_type(ctx))); } else { /* At least report on the event. */ if (debug_p) zlog_debug( - "%s(%u:%u):%s dplane notif, but type %s not selected_fib", + "%s(%u:%u):%pFX dplane notif, but type %s not selected_fib", VRF_LOGNAME(vrf), dplane_ctx_get_vrf(ctx), - dplane_ctx_get_table(ctx), dest_str, + dplane_ctx_get_table(ctx), dest_pfx, zebra_route_string( dplane_ctx_get_type(ctx))); } @@ -2146,9 +2125,9 @@ static void rib_process_dplane_notify(struct zebra_dplane_ctx *ctx) if (!fib_changed) { if (debug_p) zlog_debug( - "%s(%u:%u):%s dplane notification: rib_update returns FALSE", + "%s(%u:%u):%pFX dplane notification: rib_update returns FALSE", VRF_LOGNAME(vrf), dplane_ctx_get_vrf(ctx), - dplane_ctx_get_table(ctx), dest_str); + dplane_ctx_get_table(ctx), dest_pfx); } /* @@ -2163,9 +2142,9 @@ static void rib_process_dplane_notify(struct zebra_dplane_ctx *ctx) if (start_count > 0 && end_count > 0) { if (debug_p) zlog_debug( - "%s(%u:%u):%s applied nexthop changes from dplane notification", + "%s(%u:%u):%pFX applied nexthop changes from dplane notification", VRF_LOGNAME(vrf), dplane_ctx_get_vrf(ctx), - dplane_ctx_get_table(ctx), dest_str); + dplane_ctx_get_table(ctx), dest_pfx); /* Changed nexthops - update kernel/others */ dplane_route_notif_update(rn, re, @@ -2174,9 +2153,9 @@ static void rib_process_dplane_notify(struct zebra_dplane_ctx *ctx) } else if (start_count == 0 && end_count > 0) { if (debug_p) zlog_debug( - "%s(%u:%u):%s installed transition from dplane notification", + "%s(%u:%u):%pFX installed transition from dplane notification", VRF_LOGNAME(vrf), dplane_ctx_get_vrf(ctx), - dplane_ctx_get_table(ctx), dest_str); + dplane_ctx_get_table(ctx), dest_pfx); /* We expect this to be the selected route, so we want * to tell others about this transition. @@ -2192,9 +2171,9 @@ static void rib_process_dplane_notify(struct zebra_dplane_ctx *ctx) } else if (start_count > 0 && end_count == 0) { if (debug_p) zlog_debug( - "%s(%u:%u):%s un-installed transition from dplane notification", + "%s(%u:%u):%pFX un-installed transition from dplane notification", VRF_LOGNAME(vrf), dplane_ctx_get_vrf(ctx), - dplane_ctx_get_table(ctx), dest_str); + dplane_ctx_get_table(ctx), dest_pfx); /* Transition from _something_ installed to _nothing_ * installed. diff --git a/zebra/zebra_rnh.c b/zebra/zebra_rnh.c index 8178629b00..521f969fcc 100644 --- a/zebra/zebra_rnh.c +++ b/zebra/zebra_rnh.c @@ -1197,7 +1197,7 @@ static void print_nh(struct nexthop *nexthop, struct vty *vty) switch (nexthop->type) { case NEXTHOP_TYPE_IPV4: case NEXTHOP_TYPE_IPV4_IFINDEX: - vty_out(vty, " via %s", inet_ntoa(nexthop->gate.ipv4)); + vty_out(vty, " via %pI4", &nexthop->gate.ipv4); if (nexthop->ifindex) vty_out(vty, ", %s", ifindex2ifname_per_ns(zns, nexthop->ifindex)); diff --git a/zebra/zebra_routemap.c b/zebra/zebra_routemap.c index 8155f9acfe..294f2c17ff 100644 --- a/zebra/zebra_routemap.c +++ b/zebra/zebra_routemap.c @@ -1695,7 +1695,7 @@ static void zebra_route_map_set_delay_timer(uint32_t value) if (!value && zebra_t_rmap_update) { /* Event driven route map updates is being disabled */ /* But there's a pending timer. Fire it off now */ - thread_cancel(zebra_t_rmap_update); + thread_cancel(&zebra_t_rmap_update); zebra_route_map_update_timer(zebra_t_rmap_update); } } @@ -1705,7 +1705,7 @@ void zebra_routemap_finish(void) /* Set zebra_rmap_update_timer to 0 so that it wont schedule again */ zebra_rmap_update_timer = 0; /* Thread off if any scheduled already */ - THREAD_TIMER_OFF(zebra_t_rmap_update); + thread_cancel(&zebra_t_rmap_update); route_map_finish(); } diff --git a/zebra/zebra_vty.c b/zebra/zebra_vty.c index 762da5d0d3..1a6e6032b6 100644 --- a/zebra/zebra_vty.c +++ b/zebra/zebra_vty.c @@ -304,8 +304,8 @@ static void show_nexthop_detail_helper(struct vty *vty, switch (nexthop->type) { case NEXTHOP_TYPE_IPV4: case NEXTHOP_TYPE_IPV4_IFINDEX: - vty_out(vty, " %s", - inet_ntoa(nexthop->gate.ipv4)); + vty_out(vty, " %pI4", + &nexthop->gate.ipv4); if (nexthop->ifindex) vty_out(vty, ", via %s", ifindex2ifname( @@ -508,7 +508,7 @@ static void show_route_nexthop_helper(struct vty *vty, switch (nexthop->type) { case NEXTHOP_TYPE_IPV4: case NEXTHOP_TYPE_IPV4_IFINDEX: - vty_out(vty, " via %s", inet_ntoa(nexthop->gate.ipv4)); + vty_out(vty, " via %pI4", &nexthop->gate.ipv4); if (nexthop->ifindex) vty_out(vty, ", %s", ifindex2ifname(nexthop->ifindex, @@ -636,7 +636,8 @@ static void show_nexthop_json_helper(json_object *json_nexthop, case NEXTHOP_TYPE_IPV4_IFINDEX: json_object_string_add( json_nexthop, "ip", - inet_ntoa(nexthop->gate.ipv4)); + inet_ntop(AF_INET, &nexthop->gate.ipv4, + buf, sizeof(buf))); json_object_string_add(json_nexthop, "afi", "ipv4"); diff --git a/zebra/zebra_vxlan.c b/zebra/zebra_vxlan.c index f8b65bea15..cca7680953 100644 --- a/zebra/zebra_vxlan.c +++ b/zebra/zebra_vxlan.c @@ -340,8 +340,8 @@ static void zl3vni_print_rmac(zebra_mac_t *zrmac, struct vty *vty, if (!json) { vty_out(vty, "MAC: %s\n", prefix_mac2str(&zrmac->macaddr, buf1, sizeof(buf1))); - vty_out(vty, " Remote VTEP: %s\n", - inet_ntoa(zrmac->fwd_info.r_vtep_ip)); + vty_out(vty, " Remote VTEP: %pI4\n", + &zrmac->fwd_info.r_vtep_ip); vty_out(vty, " Refcount: %d\n", rb_host_count(&zrmac->host_rb)); vty_out(vty, " Prefixes:\n"); RB_FOREACH (hle, host_rb_tree_entry, &zrmac->host_rb) @@ -352,7 +352,9 @@ static void zl3vni_print_rmac(zebra_mac_t *zrmac, struct vty *vty, json, "routerMac", prefix_mac2str(&zrmac->macaddr, buf1, sizeof(buf1))); json_object_string_add(json, "vtepIp", - inet_ntoa(zrmac->fwd_info.r_vtep_ip)); + inet_ntop(AF_INET, + &zrmac->fwd_info.r_vtep_ip, + buf1, sizeof(buf1))); json_object_int_add(json, "refCount", rb_host_count(&zrmac->host_rb)); json_object_int_add(json, "localSequence", zrmac->loc_seq); @@ -629,7 +631,7 @@ static void zl3vni_print_rmac_hash(struct hash_bucket *bucket, void *ctx) struct vty *vty = NULL; struct json_object *json = NULL; struct json_object *json_rmac = NULL; - char buf[ETHER_ADDR_STRLEN]; + char buf[PREFIX_STRLEN]; wctx = (struct rmac_walk_ctx *)ctx; vty = wctx->vty; @@ -639,15 +641,17 @@ static void zl3vni_print_rmac_hash(struct hash_bucket *bucket, void *ctx) zrmac = (zebra_mac_t *)bucket->data; if (!json) { - vty_out(vty, "%-17s %-21s\n", + vty_out(vty, "%-17s %-21pI4\n", prefix_mac2str(&zrmac->macaddr, buf, sizeof(buf)), - inet_ntoa(zrmac->fwd_info.r_vtep_ip)); + &zrmac->fwd_info.r_vtep_ip); } else { json_object_string_add( json_rmac, "routerMac", prefix_mac2str(&zrmac->macaddr, buf, sizeof(buf))); json_object_string_add(json_rmac, "vtepIp", - inet_ntoa(zrmac->fwd_info.r_vtep_ip)); + inet_ntop(AF_INET, + &zrmac->fwd_info.r_vtep_ip, + buf, sizeof(buf))); json_object_object_add( json, prefix_mac2str(&zrmac->macaddr, buf, sizeof(buf)), json_rmac); @@ -657,7 +661,7 @@ static void zl3vni_print_rmac_hash(struct hash_bucket *bucket, void *ctx) /* print a specific L3 VNI entry */ static void zl3vni_print(zebra_l3vni_t *zl3vni, void **ctx) { - char buf[ETHER_ADDR_STRLEN]; + char buf[PREFIX_STRLEN]; struct vty *vty = NULL; json_object *json = NULL; zebra_evpn_t *zevpn = NULL; @@ -671,8 +675,8 @@ static void zl3vni_print(zebra_l3vni_t *zl3vni, void **ctx) vty_out(vty, "VNI: %u\n", zl3vni->vni); vty_out(vty, " Type: %s\n", "L3"); vty_out(vty, " Tenant VRF: %s\n", zl3vni_vrf_name(zl3vni)); - vty_out(vty, " Local Vtep Ip: %s\n", - inet_ntoa(zl3vni->local_vtep_ip)); + vty_out(vty, " Local Vtep Ip: %pI4\n", + &zl3vni->local_vtep_ip); vty_out(vty, " Vxlan-Intf: %s\n", zl3vni_vxlan_if_name(zl3vni)); vty_out(vty, " SVI-If: %s\n", zl3vni_svi_if_name(zl3vni)); @@ -693,8 +697,10 @@ static void zl3vni_print(zebra_l3vni_t *zl3vni, void **ctx) json_evpn_list = json_object_new_array(); json_object_int_add(json, "vni", zl3vni->vni); json_object_string_add(json, "type", "L3"); - json_object_string_add(json, "localVtepIp", - inet_ntoa(zl3vni->local_vtep_ip)); + json_object_string_add( + json, "localVtepIp", + inet_ntop(AF_INET, &zl3vni->local_vtep_ip, buf, + sizeof(buf))); json_object_string_add(json, "vxlanIntf", zl3vni_vxlan_if_name(zl3vni)); json_object_string_add(json, "sviIntf", @@ -943,9 +949,9 @@ static int zevpn_build_hash_table_zns(struct ns *ns, if (IS_ZEBRA_DEBUG_VXLAN) zlog_debug( - "Create L2-VNI hash for intf %s(%u) L2-VNI %u local IP %s", + "Create L2-VNI hash for intf %s(%u) L2-VNI %u local IP %pI4", ifp->name, ifp->ifindex, vni, - inet_ntoa(vxl->vtep_ip)); + &vxl->vtep_ip); /* EVPN hash entry is expected to exist, if the BGP process is killed */ zevpn = zebra_evpn_lookup(vni); @@ -1297,9 +1303,9 @@ static int zl3vni_remote_rmac_add(zebra_l3vni_t *zl3vni, &vtep_ip->ipaddr_v4)) { if (IS_ZEBRA_DEBUG_VXLAN) zlog_debug( - "L3VNI %u Remote VTEP change(%s -> %s) for RMAC %s, prefix %pFX", + "L3VNI %u Remote VTEP change(%pI4 -> %s) for RMAC %s, prefix %pFX", zl3vni->vni, - inet_ntoa(zrmac->fwd_info.r_vtep_ip), + &zrmac->fwd_info.r_vtep_ip, ipaddr2str(vtep_ip, buf1, sizeof(buf1)), prefix_mac2str(rmac, buf, sizeof(buf)), host_prefix); @@ -1909,11 +1915,11 @@ static int zl3vni_send_add_to_client(zebra_l3vni_t *zl3vni) if (IS_ZEBRA_DEBUG_VXLAN) zlog_debug( - "Send L3_VNI_ADD %u VRF %s RMAC %s VRR %s local-ip %s filter %s to %s", + "Send L3_VNI_ADD %u VRF %s RMAC %s VRR %s local-ip %pI4 filter %s to %s", zl3vni->vni, vrf_id_to_name(zl3vni_vrf_id(zl3vni)), prefix_mac2str(&svi_rmac, buf, sizeof(buf)), prefix_mac2str(&vrr_rmac, buf1, sizeof(buf1)), - inet_ntoa(zl3vni->local_vtep_ip), + &zl3vni->local_vtep_ip, CHECK_FLAG(zl3vni->filter, PREFIX_ROUTES_ONLY) ? "prefix-routes-only" : "none", @@ -3762,14 +3768,13 @@ void zebra_vxlan_remote_macip_del(ZAPI_HANDLER_ARGS) l += res_length; if (IS_ZEBRA_DEBUG_VXLAN) zlog_debug( - "Recv MACIP DEL VNI %u MAC %s%s%s Remote VTEP %s from %s", + "Recv MACIP DEL VNI %u MAC %s%s%s Remote VTEP %pI4 from %s", vni, prefix_mac2str(&macaddr, buf, sizeof(buf)), ipa_len ? " IP " : "", ipa_len ? ipaddr2str(&ip, buf1, sizeof(buf1)) : "", - inet_ntoa(vtep_ip), - zebra_route_string(client->proto)); + &vtep_ip, zebra_route_string(client->proto)); process_remote_macip_del(vni, &macaddr, ipa_len, &ip, vtep_ip); } @@ -3824,7 +3829,7 @@ void zebra_vxlan_remote_macip_add(ZAPI_HANDLER_ARGS) else strlcpy(esi_buf, "-", ESI_STR_LEN); zlog_debug( - "Recv %sMACIP ADD VNI %u MAC %s%s%s flags 0x%x seq %u VTEP %s ESI %s from %s", + "Recv %sMACIP ADD VNI %u MAC %s%s%s flags 0x%x seq %u VTEP %pI4 ESI %s from %s", (flags & ZEBRA_MACIP_TYPE_SYNC_PATH) ? "sync-" : "", vni, @@ -3832,7 +3837,7 @@ void zebra_vxlan_remote_macip_add(ZAPI_HANDLER_ARGS) ipa_len ? " IP " : "", ipa_len ? ipaddr2str(&ip, buf1, sizeof(buf1)) : "", - flags, seq, inet_ntoa(vtep_ip), esi_buf, + flags, seq, &vtep_ip, esi_buf, zebra_route_string(client->proto)); } @@ -3883,8 +3888,8 @@ int zebra_vxlan_check_readd_vtep(struct interface *ifp, if (IS_ZEBRA_DEBUG_VXLAN) zlog_debug( - "Del MAC for remote VTEP %s intf %s(%u) VNI %u - readd", - inet_ntoa(vtep_ip), ifp->name, ifp->ifindex, vni); + "Del MAC for remote VTEP %pI4 intf %s(%u) VNI %u - readd", + &vtep_ip, ifp->name, ifp->ifindex, vni); zebra_evpn_vtep_install(zevpn, zvtep); return 0; @@ -4124,8 +4129,8 @@ void zebra_vxlan_remote_vtep_del(ZAPI_HANDLER_ARGS) l += 4; if (IS_ZEBRA_DEBUG_VXLAN) - zlog_debug("Recv VTEP_DEL %s VNI %u from %s", - inet_ntoa(vtep_ip), vni, + zlog_debug("Recv VTEP_DEL %pI4 VNI %u from %s", + &vtep_ip, vni, zebra_route_string(client->proto)); /* Locate VNI hash entry - expected to exist. */ @@ -4208,8 +4213,8 @@ void zebra_vxlan_remote_vtep_add(ZAPI_HANDLER_ARGS) l += IPV4_MAX_BYTELEN + 4; if (IS_ZEBRA_DEBUG_VXLAN) - zlog_debug("Recv VTEP_ADD %s VNI %u flood %d from %s", - inet_ntoa(vtep_ip), vni, flood_control, + zlog_debug("Recv VTEP_ADD %pI4 VNI %u flood %d from %s", + &vtep_ip, vni, flood_control, zebra_route_string(client->proto)); /* Locate VNI hash entry - expected to exist. */ @@ -4791,9 +4796,9 @@ int zebra_vxlan_if_update(struct interface *ifp, uint16_t chgflags) if (IS_ZEBRA_DEBUG_VXLAN) zlog_debug( - "Update L3-VNI %u intf %s(%u) VLAN %u local IP %s master %u chg 0x%x", + "Update L3-VNI %u intf %s(%u) VLAN %u local IP %pI4 master %u chg 0x%x", vni, ifp->name, ifp->ifindex, vxl->access_vlan, - inet_ntoa(vxl->vtep_ip), + &vxl->vtep_ip, zif->brslave_info.bridge_ifindex, chgflags); /* Removed from bridge? Cleanup and return */ @@ -4855,9 +4860,9 @@ int zebra_vxlan_if_update(struct interface *ifp, uint16_t chgflags) if (IS_ZEBRA_DEBUG_VXLAN) zlog_debug( - "Update L2-VNI %u intf %s(%u) VLAN %u local IP %s master %u chg 0x%x", + "Update L2-VNI %u intf %s(%u) VLAN %u local IP %pI4 master %u chg 0x%x", vni, ifp->name, ifp->ifindex, vxl->access_vlan, - inet_ntoa(vxl->vtep_ip), + &vxl->vtep_ip, zif->brslave_info.bridge_ifindex, chgflags); /* Removed from bridge? Cleanup and return */ @@ -4962,9 +4967,9 @@ int zebra_vxlan_if_add(struct interface *ifp) /* process if-add for l3-vni*/ if (IS_ZEBRA_DEBUG_VXLAN) zlog_debug( - "Add L3-VNI %u intf %s(%u) VLAN %u local IP %s master %u", + "Add L3-VNI %u intf %s(%u) VLAN %u local IP %pI4 master %u", vni, ifp->name, ifp->ifindex, vxl->access_vlan, - inet_ntoa(vxl->vtep_ip), + &vxl->vtep_ip, zif->brslave_info.bridge_ifindex); /* associate with vxlan_if */ |
