Merge pull request #7184 from opensourcerouting/anycast-sids-v4

isisd: refactor Prefix-SID code + Anycast-SIDs (v2)
This commit is contained in:
Olivier Dugeon 2020-10-23 21:03:55 +02:00 committed by GitHub
commit acd043db00
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
308 changed files with 11190 additions and 4986 deletions

View File

@ -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

View File

@ -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");
}

View File

@ -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",

View File

@ -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;
};

View File

@ -537,6 +537,12 @@ const struct frr_yang_module_info frr_isisd_info = {
.modify = isis_instance_segment_routing_prefix_sid_map_prefix_sid_last_hop_behavior_modify,
},
},
{
.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 = {

View File

@ -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);

View File

@ -1837,6 +1837,23 @@ int isis_instance_segment_routing_prefix_sid_map_prefix_sid_last_hop_behavior_mo
return NB_OK;
}
/*
* 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
*/

View File

@ -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);

View File

@ -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 */

View File

@ -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;

View File

@ -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);

View File

@ -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");
}

File diff suppressed because it is too large Load Diff

View File

@ -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);

View File

@ -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);

View File

@ -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

View File

@ -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,57 +393,32 @@ 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.
*
@ -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;

View File

@ -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);

View File

@ -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);

File diff suppressed because it is too large Load Diff

View File

@ -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
]
}
]
}
]
}

View File

@ -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
]
}
]
}
]
}

View File

@ -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"
}
]
}
}

View File

@ -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
]
}
]
}
]
}

View File

@ -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
]
}
]
}
]
}

View File

@ -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"
}
]
}
}

View File

@ -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
]
}
]
}
]
}

View File

@ -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
]
}
]
}
]
}

View File

@ -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"
}
]
}
}

View File

@ -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
]
}
]
}
]
}

View File

@ -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
]
}
]
}
]
}

View File

@ -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"
}
]
}
}

View File

@ -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
]
}
]
}
]
}

View File

@ -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
]
}
]
}
]
}

View File

@ -99,17 +99,17 @@
"inLabel":16060,
"installed":true,
"nexthops":[
{
"type":"SR (IS-IS)",
"outLabel":16060,
"installed":true,
"nexthop":"10.0.1.2"
},
{
"type":"SR (IS-IS)",
"outLabel":17060,
"installed":true,
"nexthop":"10.0.1.3"
},
{
"type":"SR (IS-IS)",
"outLabel":16060,
"installed":true,
"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"
}
]
}
}

View File

@ -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
]
}
]
}
]
}

View File

@ -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
]
}
]
}
]
}

View File

@ -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"
}
]
}
}

View File

@ -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
]
}
]
}
]
}

View File

@ -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
]
}
]
}
]
}

View File

@ -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"
}
]
}
}

View File

@ -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
]
}
]
}
]
}

View File

@ -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
]
}
]
}
]
}

View File

@ -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"
}
]
}
}

View File

@ -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
]
}
]
}
]
}

View File

@ -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
]
}
]
}
]
}

View File

@ -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"
}
]
}
}

View File

@ -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
]
}
]
}
]
}

View File

@ -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
]
}
]
}
]
}

View File

@ -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"
}
]
}
}

View File

@ -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
]
}
]
}
]
}

View File

@ -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
]
}
]
}
]
}

View File

@ -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"
}
]
}

View File

@ -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
]
}
]
}
]
}

View File

@ -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
]
}
]
}
]
}

View File

@ -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"
}
]
}

View File

@ -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
]
}
]
}
]
}

View File

@ -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
]
}
]
}
]
}

View File

@ -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"
}
]
}

View File

@ -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
]
}
]
}
]
}

View File

@ -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
]
}
]
}
]
}

View File

@ -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"
}
]
}
}

View File

@ -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
]
}
]
}
]
}

View File

@ -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
]
}
]
}
]
}

View File

@ -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"
}
]
}

View File

@ -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
]
}
]
}
]
}

View File

@ -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
]
}
]
}
]
}

View File

@ -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"
}
]
}
}

View File

@ -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
]
}
]
}
]
}

View File

@ -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
]
}
]
}
]
}

View File

@ -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"
}
]
}

View File

@ -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
]
}
]
}
]
}

View File

@ -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
]
}
]
}
]
}

View File

@ -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"
}
]
}

View File

@ -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
]
}
]
}
]
}

View File

@ -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
]
}
]
}
]
}

View File

@ -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"
}
]
}

View File

@ -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
]
}
]
}
]
}

View File

@ -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
]
}
]
}
]
}

View File

@ -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"
}
]
}

View File

@ -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
]
}
]
}
]
}

View File

@ -53,15 +53,6 @@
"metric":30,
"installed":true,
"nexthops":[
{
"fib":true,
"afi":"ipv6",
"interfaceName":"eth-rt5-2",
"active":true,
"labels":[
16041
]
},
{
"fib":true,
"afi":"ipv6",
@ -79,6 +70,15 @@
"labels":[
16041
]
},
{
"fib":true,
"afi":"ipv6",
"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
]
}
]
}
]
}

View File

@ -73,12 +73,6 @@
"inLabel":17040,
"installed":true,
"nexthops":[
{
"type":"SR (IS-IS)",
"outLabel":16040,
"installed":true,
"nexthop":"10.0.1.2"
},
{
"type":"SR (IS-IS)",
"outLabel":16040,
@ -90,6 +84,12 @@
"outLabel":16040,
"installed":true,
"nexthop":"10.0.4.5"
},
{
"type":"SR (IS-IS)",
"outLabel":16040,
"installed":true,
"nexthop":"10.0.1.2"
}
]
},
@ -97,12 +97,6 @@
"inLabel":17041,
"installed":true,
"nexthops":[
{
"type":"SR (IS-IS)",
"outLabel":16041,
"installed":true,
"interface":"eth-sw1"
},
{
"type":"SR (IS-IS)",
"outLabel":16041,
@ -114,6 +108,12 @@
"outLabel":16041,
"installed":true,
"interface":"eth-rt5-1"
},
{
"type":"SR (IS-IS)",
"outLabel":16041,
"installed":true,
"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"
}
]
}
}

View File

@ -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
]
}
]
}
]
}

View File

@ -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
]
}
]
}
]
}

View File

@ -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"
}
]
}
}

View File

@ -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
]
}
]
}
]
}

View File

@ -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
]
}
]
}
]
}

View File

@ -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"
}
]
}
}

View File

@ -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
]
}
]
}
]
}

View File

@ -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
]
}
]
}
]
}

View File

@ -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"
}
]
}
}

View File

@ -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
]
}
]
}
]
}

View File

@ -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
]
}
]
}
]
}

View File

@ -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"
}
]
}
}

View File

@ -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
]
}
]
}
]
}

View File

@ -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
]
}
]
}
]
}

View File

@ -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"
}
]
}
}

View File

@ -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
]
}
]
}
]
}

View File

@ -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
]
}
]
}
]
}

Some files were not shown because too many files have changed in this diff Show More