From 173f8887cc3716985bfe4b84bdf2228194716f7d Mon Sep 17 00:00:00 2001 From: Olivier Dugeon Date: Wed, 30 Jun 2021 17:23:56 +0200 Subject: [PATCH 1/5] isisd: Add support for RFC6119 (IPv6 TE in IS-IS) - Add advertisement of Global IPv6 address in IIH pdu - Add new CLI to set IPv6 Router ID - Add advertisement of IPv6 Router ID - Correctly advertise IPv6 local and neighbor addresses in Extended IS and MT Reachability TLVs - Correct output of Neighbor IPv6 address in 'show isis database detail' - Manage IPv6 addresses advertisement and corresponiding Adjacency SID when IS-IS is not using Multi-Topology by introducing a new ISIS_MT_DISABLE value for mtid (== 4096 i.e. first reserved flag set to 1) Signed-off-by: Olivier Dugeon --- doc/user/isisd.rst | 4 + isisd/isis_adjacency.c | 23 +- isisd/isis_adjacency.h | 12 +- isisd/isis_bfd.c | 11 +- isisd/isis_circuit.c | 10 +- isisd/isis_cli.c | 39 +++ isisd/isis_lfa.c | 5 +- isisd/isis_lsp.c | 16 +- isisd/isis_mt.c | 11 + isisd/isis_mt.h | 2 + isisd/isis_nb.c | 8 + isisd/isis_nb.h | 7 + isisd/isis_nb_config.c | 51 ++++ isisd/isis_pdu.c | 5 + isisd/isis_route.c | 4 +- isisd/isis_snmp.c | 7 +- isisd/isis_sr.c | 18 +- isisd/isis_te.c | 141 +++++++-- isisd/isis_te.h | 3 +- isisd/isis_tlvs.c | 347 +++++++++++++++++++--- isisd/isis_tlvs.h | 8 + tests/isisd/test_fuzz_isis_tlv_tests.h.gz | Bin 176859 -> 245481 bytes yang/frr-isisd.yang | 5 + 23 files changed, 619 insertions(+), 118 deletions(-) diff --git a/doc/user/isisd.rst b/doc/user/isisd.rst index 4a711a8feb..2bba3b9755 100644 --- a/doc/user/isisd.rst +++ b/doc/user/isisd.rst @@ -330,6 +330,10 @@ Traffic Engineering Configure stable IP address for MPLS-TE. +.. clicmd:: mpls-te router-address ipv6 + + Configure stable IPv6 address for MPLS-TE. + .. clicmd:: show isis mpls-te interface .. clicmd:: show isis mpls-te interface INTERFACE diff --git a/isisd/isis_adjacency.c b/isisd/isis_adjacency.c index f5e8a790bf..ea05824f0e 100644 --- a/isisd/isis_adjacency.c +++ b/isisd/isis_adjacency.c @@ -168,7 +168,7 @@ void isis_delete_adj(void *arg) XFREE(MTYPE_ISIS_ADJACENCY_INFO, adj->area_addresses); XFREE(MTYPE_ISIS_ADJACENCY_INFO, adj->ipv4_addresses); - XFREE(MTYPE_ISIS_ADJACENCY_INFO, adj->ipv6_addresses); + XFREE(MTYPE_ISIS_ADJACENCY_INFO, adj->ll_ipv6_addrs); adj_mt_finish(adj); list_delete(&adj->adj_sids); @@ -414,11 +414,11 @@ void isis_adj_print(struct isis_adjacency *adj) zlog_debug("%pI4", &adj->ipv4_addresses[i]); } - if (adj->ipv6_address_count) { + if (adj->ll_ipv6_count) { zlog_debug("IPv6 Address(es):"); - for (unsigned int i = 0; i < adj->ipv6_address_count; i++) { + for (unsigned int i = 0; i < adj->ll_ipv6_count; i++) { char buf[INET6_ADDRSTRLEN]; - inet_ntop(AF_INET6, &adj->ipv6_addresses[i], buf, + inet_ntop(AF_INET6, &adj->ll_ipv6_addrs[i], buf, sizeof(buf)); zlog_debug("%s", buf); } @@ -577,12 +577,21 @@ void isis_adj_print_vty(struct isis_adjacency *adj, struct vty *vty, vty_out(vty, " %pI4\n", &adj->ipv4_addresses[i]); } - if (adj->ipv6_address_count) { + if (adj->ll_ipv6_count) { vty_out(vty, " IPv6 Address(es):\n"); - for (unsigned int i = 0; i < adj->ipv6_address_count; + for (unsigned int i = 0; i < adj->ll_ipv6_count; i++) { + char buf[INET6_ADDRSTRLEN]; + inet_ntop(AF_INET6, &adj->ll_ipv6_addrs[i], + buf, sizeof(buf)); + vty_out(vty, " %s\n", buf); + } + } + if (adj->global_ipv6_count) { + vty_out(vty, " Global IPv6 Address(es):\n"); + for (unsigned int i = 0; i < adj->global_ipv6_count; i++) { char buf[INET6_ADDRSTRLEN]; - inet_ntop(AF_INET6, &adj->ipv6_addresses[i], + inet_ntop(AF_INET6, &adj->global_ipv6_addrs[i], buf, sizeof(buf)); vty_out(vty, " %s\n", buf); } diff --git a/isisd/isis_adjacency.h b/isisd/isis_adjacency.h index 4aa553e303..af70775a87 100644 --- a/isisd/isis_adjacency.h +++ b/isisd/isis_adjacency.h @@ -88,8 +88,10 @@ struct isis_adjacency { struct in_addr *ipv4_addresses; unsigned int ipv4_address_count; struct in_addr router_address; - struct in6_addr *ipv6_addresses; - unsigned int ipv6_address_count; + struct in6_addr *ll_ipv6_addrs; /* Link local IPv6 neighbor address */ + unsigned int ll_ipv6_count; + struct in6_addr *global_ipv6_addrs; /* Global IPv6 neighbor address */ + unsigned int global_ipv6_count; struct in6_addr router_address6; uint8_t prio[ISIS_LEVELS]; /* priorityOfNeighbour for DIS */ int circuit_t; /* from hello PDU hdr */ @@ -127,9 +129,11 @@ void isis_adj_process_threeway(struct isis_adjacency *adj, enum isis_adj_usage adj_usage); DECLARE_HOOK(isis_adj_state_change_hook, (struct isis_adjacency *adj), (adj)); DECLARE_HOOK(isis_adj_ip_enabled_hook, - (struct isis_adjacency *adj, int family), (adj, family)); + (struct isis_adjacency * adj, int family, bool global), + (adj, family, global)); DECLARE_HOOK(isis_adj_ip_disabled_hook, - (struct isis_adjacency *adj, int family), (adj, family)); + (struct isis_adjacency * adj, int family, bool global), + (adj, family, global)); void isis_log_adj_change(struct isis_adjacency *adj, enum isis_adj_state old_state, enum isis_adj_state new_state, const char *reason); diff --git a/isisd/isis_bfd.c b/isisd/isis_bfd.c index a7548e2f13..1f50fb9342 100644 --- a/isisd/isis_bfd.c +++ b/isisd/isis_bfd.c @@ -81,7 +81,7 @@ static void bfd_handle_adj_up(struct isis_adjacency *adj) */ if (circuit->ipv6_router && (listcount(circuit->ipv6_link) == 0 - || adj->ipv6_address_count == 0)) { + || adj->ll_ipv6_count == 0)) { if (IS_DEBUG_BFD) zlog_debug( "ISIS-BFD: skipping BFD initialization on adjacency with %s because IPv6 is enabled but not ready", @@ -93,9 +93,9 @@ static void bfd_handle_adj_up(struct isis_adjacency *adj) * If IS-IS is enabled for both IPv4 and IPv6 on the circuit, prefer * creating a BFD session over IPv6. */ - if (circuit->ipv6_router && adj->ipv6_address_count) { + if (circuit->ipv6_router && adj->ll_ipv6_count) { family = AF_INET6; - dst_ip.ipv6 = adj->ipv6_addresses[0]; + dst_ip.ipv6 = adj->ll_ipv6_addrs[0]; local_ips = circuit->ipv6_link; if (!local_ips || list_isempty(local_ips)) { if (IS_DEBUG_BFD) @@ -181,10 +181,11 @@ void isis_bfd_circuit_cmd(struct isis_circuit *circuit) } } -static int bfd_handle_adj_ip_enabled(struct isis_adjacency *adj, int family) +static int bfd_handle_adj_ip_enabled(struct isis_adjacency *adj, int family, + bool global) { - if (family != AF_INET6) + if (family != AF_INET6 || global) return 0; if (adj->bfd_session) diff --git a/isisd/isis_circuit.c b/isisd/isis_circuit.c index a91bbd0b95..0ad6190ba4 100644 --- a/isisd/isis_circuit.c +++ b/isisd/isis_circuit.c @@ -335,8 +335,16 @@ void isis_circuit_add_addr(struct isis_circuit *circuit, if (IN6_IS_ADDR_LINKLOCAL(&ipv6->prefix)) listnode_add(circuit->ipv6_link, ipv6); - else + else { listnode_add(circuit->ipv6_non_link, ipv6); + /* Update Local IPv6 address param. if MPLS TE is on */ + if (circuit->ext && circuit->area + && IS_MPLS_TE(circuit->area->mta)) { + IPV6_ADDR_COPY(&circuit->ext->local_addr6, + &ipv6->prefix); + SET_SUBTLV(circuit->ext, EXT_LOCAL_ADDR6); + } + } if (circuit->area) lsp_regenerate_schedule(circuit->area, circuit->is_type, 0); diff --git a/isisd/isis_cli.c b/isisd/isis_cli.c index bf03d0a050..b6f798bb25 100644 --- a/isisd/isis_cli.c +++ b/isisd/isis_cli.c @@ -1140,6 +1140,43 @@ void cli_show_isis_mpls_te_router_addr(struct vty *vty, yang_dnode_get_string(dnode, NULL)); } +/* + * XPath: /frr-isisd:isis/instance/mpls-te/router-address-v6 + */ +DEFPY_YANG(isis_mpls_te_router_addr_v6, isis_mpls_te_router_addr_v6_cmd, + "mpls-te router-address ipv6 X:X::X:X", + MPLS_TE_STR + "Stable IP address of the advertising router\n" + "IPv6 address\n" + "MPLS-TE router address in IPv6 address format\n") +{ + nb_cli_enqueue_change(vty, "./mpls-te/router-address-v6", NB_OP_MODIFY, + ipv6_str); + + return nb_cli_apply_changes(vty, NULL); +} + +DEFPY_YANG(no_isis_mpls_te_router_addr_v6, no_isis_mpls_te_router_addr_v6_cmd, + "no mpls-te router-address ipv6 [X:X::X:X]", + NO_STR MPLS_TE_STR + "Delete IP address of the advertising router\n" + "IPv6 address\n" + "MPLS-TE router address in IPv6 address format\n") +{ + nb_cli_enqueue_change(vty, "./mpls-te/router-address-v6", NB_OP_DESTROY, + NULL); + + return nb_cli_apply_changes(vty, NULL); +} + +void cli_show_isis_mpls_te_router_addr_ipv6(struct vty *vty, + const struct lyd_node *dnode, + bool show_defaults) +{ + vty_out(vty, " mpls-te router-address ipv6 %s\n", + yang_dnode_get_string(dnode, NULL)); +} + DEFPY_YANG(isis_mpls_te_inter_as, isis_mpls_te_inter_as_cmd, "[no] mpls-te inter-as [level-1|level-1-2|level-2-only]", NO_STR MPLS_TE_STR @@ -3125,6 +3162,8 @@ void isis_cli_init(void) install_element(ISIS_NODE, &no_isis_mpls_te_on_cmd); install_element(ISIS_NODE, &isis_mpls_te_router_addr_cmd); install_element(ISIS_NODE, &no_isis_mpls_te_router_addr_cmd); + install_element(ISIS_NODE, &isis_mpls_te_router_addr_v6_cmd); + install_element(ISIS_NODE, &no_isis_mpls_te_router_addr_v6_cmd); install_element(ISIS_NODE, &isis_mpls_te_inter_as_cmd); install_element(ISIS_NODE, &isis_default_originate_cmd); diff --git a/isisd/isis_lfa.c b/isisd/isis_lfa.c index e033c28fef..84aac24d52 100644 --- a/isisd/isis_lfa.c +++ b/isisd/isis_lfa.c @@ -1443,9 +1443,8 @@ static mpls_label_t rlfa_nexthop_label(struct isis_spftree *spftree, } break; case AF_INET6: - for (unsigned int j = 0; j < adj->ipv6_address_count; - j++) { - struct in6_addr addr = adj->ipv6_addresses[j]; + for (unsigned int j = 0; j < adj->ll_ipv6_count; j++) { + struct in6_addr addr = adj->ll_ipv6_addrs[j]; if (!IPV6_ADDR_SAME( &addr, diff --git a/isisd/isis_lsp.c b/isisd/isis_lsp.c index e3de6f08c0..94353a5bc8 100644 --- a/isisd/isis_lsp.c +++ b/isisd/isis_lsp.c @@ -1067,6 +1067,14 @@ static void lsp_build(struct isis_lsp *lsp, struct isis_area *area) area->area_tag); } + if (IS_MPLS_TE(area->mta) + && !IN6_IS_ADDR_UNSPECIFIED(&area->mta->router_id_ipv6)) { + lsp_debug("ISIS (%s): Adding IPv6 TE Router ID tlv.", + area->area_tag); + isis_tlvs_set_te_router_id_ipv6(lsp->tlvs, + &area->mta->router_id_ipv6); + } + lsp_debug("ISIS (%s): Adding circuit specific information.", area->area_tag); @@ -1601,6 +1609,7 @@ static void lsp_build_pseudo(struct isis_lsp *lsp, struct isis_circuit *circuit, struct list *adj_list; struct listnode *node; struct isis_area *area = circuit->area; + uint16_t mtid; lsp_clear_data(lsp); lsp->tlvs = isis_alloc_tlvs(); @@ -1630,8 +1639,11 @@ static void lsp_build_pseudo(struct isis_lsp *lsp, struct isis_circuit *circuit, LSP_PSEUDO_ID(ne_id)); } if (circuit->area->newmetric) { - isis_tlvs_add_extended_reach(lsp->tlvs, ISIS_MT_IPV4_UNICAST, - ne_id, 0, NULL); + if (area_is_mt(circuit->area)) + mtid = ISIS_MT_IPV4_UNICAST; + else + mtid = ISIS_MT_DISABLE; + isis_tlvs_add_extended_reach(lsp->tlvs, mtid, ne_id, 0, NULL); lsp_debug( "ISIS (%s): Adding %s.%02x as te-style neighbor (self)", area->area_tag, sysid_print(ne_id), diff --git a/isisd/isis_mt.c b/isisd/isis_mt.c index c024549fcc..f937bdf55c 100644 --- a/isisd/isis_mt.c +++ b/isisd/isis_mt.c @@ -515,6 +515,17 @@ static void tlvs_add_mt_set(struct isis_area *area, struct isis_tlvs *tlvs, uint8_t *id, uint32_t metric, struct isis_ext_subtlvs *ext) { + /* Check if MT is enable for this area */ + if (!area_is_mt(area)) { + lsp_debug( + "ISIS (%s): Adding %s.%02x as te-style neighbor (MT disable)", + area->area_tag, sysid_print(id), LSP_PSEUDO_ID(id)); + isis_tlvs_add_extended_reach(tlvs, ISIS_MT_DISABLE, id, metric, + ext); + return; + } + + /* Process Multi-Topology */ for (unsigned int i = 0; i < mt_count; i++) { uint16_t mtid = mt_set[i]; if (mt_set[i] == ISIS_MT_IPV4_UNICAST) { diff --git a/isisd/isis_mt.h b/isisd/isis_mt.h index fd9ee133ca..2952a2f171 100644 --- a/isisd/isis_mt.h +++ b/isisd/isis_mt.h @@ -33,6 +33,8 @@ #define ISIS_MT_IPV6_MULTICAST 4 #define ISIS_MT_IPV6_MGMT 5 #define ISIS_MT_IPV6_DSTSRC 3996 /* FIXME: IANA */ +/* Use first Reserved Flag to indicate that there is no MT Topology active */ +#define ISIS_MT_DISABLE 4096 #define ISIS_MT_NAMES \ "event != NB_EV_APPLY) + return NB_OK; + + area = nb_running_get_entry(args->dnode, NULL, true); + /* only proceed if MPLS-TE is enabled */ + if (!IS_MPLS_TE(area->mta)) + return NB_OK; + + yang_dnode_get_ipv6(&value, args->dnode, NULL); + /* Update Area IPv6 Router ID if different */ + if (!IPV6_ADDR_SAME(&area->mta->router_id_ipv6, &value)) { + IPV6_ADDR_COPY(&area->mta->router_id_ipv6, &value); + + /* And re-schedule LSP update */ + lsp_regenerate_schedule(area, area->is_type, 0); + } + + return NB_OK; +} + +int isis_instance_mpls_te_router_address_ipv6_destroy( + struct nb_cb_destroy_args *args) +{ + struct isis_area *area; + + if (args->event != NB_EV_APPLY) + return NB_OK; + + area = nb_running_get_entry(args->dnode, NULL, true); + /* only proceed if MPLS-TE is enabled */ + if (!IS_MPLS_TE(area->mta)) + return NB_OK; + + /* Reset Area Router ID */ + IPV6_ADDR_COPY(&area->mta->router_id_ipv6, &in6addr_any); + + /* And re-schedule LSP update */ + lsp_regenerate_schedule(area, area->is_type, 0); + + return NB_OK; +} + /* * XPath: /frr-isisd:isis/instance/segment-routing/enabled */ diff --git a/isisd/isis_pdu.c b/isisd/isis_pdu.c index 7256fcbbc7..0814f3eea0 100644 --- a/isisd/isis_pdu.c +++ b/isisd/isis_pdu.c @@ -1971,6 +1971,11 @@ int send_hello(struct isis_circuit *circuit, int level) if (circuit->ipv6_router && circuit->ipv6_link) isis_tlvs_add_ipv6_addresses(tlvs, circuit->ipv6_link); + /* RFC6119 section 4 define TLV 233 to provide Global IPv6 address */ + if (circuit->ipv6_router && circuit->ipv6_non_link) + isis_tlvs_add_global_ipv6_addresses(tlvs, + circuit->ipv6_non_link); + if (isis_pack_tlvs(tlvs, circuit->snd_stream, len_pointer, circuit->pad_hellos, false)) { isis_free_tlvs(tlvs); diff --git a/isisd/isis_route.c b/isisd/isis_route.c index bf0079d814..764a0b0cd3 100644 --- a/isisd/isis_route.c +++ b/isisd/isis_route.c @@ -145,8 +145,8 @@ void adjinfo2nexthop(int family, struct list *nexthops, } break; case AF_INET6: - for (unsigned int i = 0; i < adj->ipv6_address_count; i++) { - ip.ipv6 = adj->ipv6_addresses[i]; + for (unsigned int i = 0; i < adj->ll_ipv6_count; i++) { + ip.ipv6 = adj->ll_ipv6_addrs[i]; if (!nexthoplookup(nexthops, AF_INET6, &ip, adj->circuit->interface->ifindex)) { diff --git a/isisd/isis_snmp.c b/isisd/isis_snmp.c index c530eb9169..319977f417 100644 --- a/isisd/isis_snmp.c +++ b/isisd/isis_snmp.c @@ -1186,14 +1186,13 @@ static int isis_snmp_adj_helper(struct isis_adjacency *adj, int data_id, break; case ISIS_SNMP_ADJ_DATA_IP_ADDR: - if (data_off - >= (adj->ipv4_address_count + adj->ipv6_address_count)) + if (data_off >= (adj->ipv4_address_count + adj->ll_ipv6_count)) return 0; if (data_off >= adj->ipv4_address_count) { - data = (uint8_t *)&adj->ipv6_addresses + data = (uint8_t *)&adj->ll_ipv6_addrs [data_off - adj->ipv4_address_count]; - data_len = sizeof(adj->ipv6_addresses[0]); + data_len = sizeof(adj->ll_ipv6_addrs[0]); } else { data = (uint8_t *)&adj->ipv4_addresses[data_off]; data_len = sizeof(adj->ipv4_addresses[0]); diff --git a/isisd/isis_sr.c b/isisd/isis_sr.c index 54e31f0040..18a727adde 100644 --- a/isisd/isis_sr.c +++ b/isisd/isis_sr.c @@ -661,10 +661,10 @@ void sr_adj_sid_add_single(struct isis_adjacency *adj, int family, bool backup, nexthop.ipv4 = adj->ipv4_addresses[0]; break; case AF_INET6: - if (!circuit->ipv6_router || !adj->ipv6_address_count) + if (!circuit->ipv6_router || !adj->ll_ipv6_count) return; - nexthop.ipv6 = adj->ipv6_addresses[0]; + nexthop.ipv6 = adj->ll_ipv6_addrs[0]; break; default: flog_err(EC_LIB_DEVELOPMENT, @@ -880,12 +880,14 @@ static int sr_adj_state_change(struct isis_adjacency *adj) * * @param adj IS-IS Adjacency * @param family Inet Family (IPv4 or IPv6) + * @param global Indicate if it concerns the Local or Global IPv6 addresses * * @return 0 */ -static int sr_adj_ip_enabled(struct isis_adjacency *adj, int family) +static int sr_adj_ip_enabled(struct isis_adjacency *adj, int family, + bool global) { - if (!adj->circuit->area->srdb.enabled) + if (!adj->circuit->area->srdb.enabled || global) return 0; sr_adj_sid_add(adj, family); @@ -899,15 +901,17 @@ static int sr_adj_ip_enabled(struct isis_adjacency *adj, int family) * * @param adj IS-IS Adjacency * @param family Inet Family (IPv4 or IPv6) + * @param global Indicate if it concerns the Local or Global IPv6 addresses * * @return 0 */ -static int sr_adj_ip_disabled(struct isis_adjacency *adj, int family) +static int sr_adj_ip_disabled(struct isis_adjacency *adj, int family, + bool global) { struct sr_adjacency *sra; struct listnode *node, *nnode; - if (!adj->circuit->area->srdb.enabled) + if (!adj->circuit->area->srdb.enabled || global) return 0; for (ALL_LIST_ELEMENTS(adj->adj_sids, node, nnode, sra)) @@ -1148,7 +1152,7 @@ int isis_sr_start(struct isis_area *area) for (ALL_LIST_ELEMENTS_RO(area->adjacency_list, node, adj)) { if (adj->ipv4_address_count > 0) sr_adj_sid_add(adj, AF_INET); - if (adj->ipv6_address_count > 0) + if (adj->ll_ipv6_count > 0) sr_adj_sid_add(adj, AF_INET6); } diff --git a/isisd/isis_te.c b/isisd/isis_te.c index 8daa2b36bf..348894fed5 100644 --- a/isisd/isis_te.c +++ b/isisd/isis_te.c @@ -248,29 +248,99 @@ void isis_link_params_update(struct isis_circuit *circuit, return; } -static int isis_link_update_adj_hook(struct isis_adjacency *adj) +static int isis_mpls_te_adj_ip_enabled(struct isis_adjacency *adj, int family, + bool global) { + struct isis_circuit *circuit; + struct isis_ext_subtlvs *ext; - struct isis_circuit *circuit = adj->circuit; - - /* Update MPLS TE Remote IP address parameter if possible */ - if (!IS_MPLS_TE(circuit->area->mta) || !IS_EXT_TE(circuit->ext)) + /* Sanity Check */ + if (!adj || !adj->circuit) return 0; - /* IPv4 first */ - if (adj->ipv4_address_count > 0) { - IPV4_ADDR_COPY(&circuit->ext->neigh_addr, - &adj->ipv4_addresses[0]); - SET_SUBTLV(circuit->ext, EXT_NEIGH_ADDR); + circuit = adj->circuit; + + /* Check that MPLS TE is enabled */ + if (!IS_MPLS_TE(circuit->area->mta) || !circuit->ext) + return 0; + + ext = circuit->ext; + + /* Update MPLS TE IP address parameters if possible */ + if (!IS_MPLS_TE(circuit->area->mta) || !IS_EXT_TE(ext)) + return 0; + + /* Determine nexthop IP address */ + switch (family) { + case AF_INET: + if (!circuit->ip_router || !adj->ipv4_address_count) + UNSET_SUBTLV(ext, EXT_NEIGH_ADDR); + else { + IPV4_ADDR_COPY(&ext->neigh_addr, + &adj->ipv4_addresses[0]); + SET_SUBTLV(ext, EXT_NEIGH_ADDR); + } + break; + case AF_INET6: + if (!global) + return 0; + + if (!circuit->ipv6_router || !adj->global_ipv6_count) + UNSET_SUBTLV(ext, EXT_NEIGH_ADDR6); + else { + IPV6_ADDR_COPY(&ext->neigh_addr6, + &adj->global_ipv6_addrs[0]); + SET_SUBTLV(ext, EXT_NEIGH_ADDR6); + } + break; + default: + return 0; } - /* and IPv6 */ - if (adj->ipv6_address_count > 0) { - IPV6_ADDR_COPY(&circuit->ext->neigh_addr6, - &adj->ipv6_addresses[0]); - SET_SUBTLV(circuit->ext, EXT_NEIGH_ADDR6); + /* Update LSP */ + lsp_regenerate_schedule(circuit->area, circuit->is_type, 0); + + return 0; +} + +static int isis_mpls_te_adj_ip_disabled(struct isis_adjacency *adj, int family, + bool global) +{ + struct isis_circuit *circuit; + struct isis_ext_subtlvs *ext; + + /* Sanity Check */ + if (!adj || !adj->circuit || !adj->circuit->ext) + return 0; + + circuit = adj->circuit; + + /* Check that MPLS TE is enabled */ + if (!IS_MPLS_TE(circuit->area->mta) || !circuit->ext) + return 0; + + ext = circuit->ext; + + /* Update MPLS TE IP address parameters if possible */ + if (!IS_MPLS_TE(circuit->area->mta) || !IS_EXT_TE(ext)) + return 0; + + /* Determine nexthop IP address */ + switch (family) { + case AF_INET: + UNSET_SUBTLV(ext, EXT_NEIGH_ADDR); + break; + case AF_INET6: + if (global) + UNSET_SUBTLV(ext, EXT_NEIGH_ADDR6); + break; + default: + return 0; } + /* Update LSP */ + lsp_regenerate_schedule(circuit->area, circuit->is_type, 0); + return 0; } @@ -302,6 +372,25 @@ int isis_mpls_te_update(struct interface *ifp) /* Followings are vty command functions */ #ifndef FABRICD +static void show_router_id(struct vty *vty, struct isis_area *area) +{ + bool no_match = true; + + vty_out(vty, "Area %s:\n", area->area_tag); + if (area->mta->router_id.s_addr != 0) { + vty_out(vty, " MPLS-TE IPv4 Router-Address: %pI4\n", + &area->mta->router_id); + no_match = false; + } + if (!IN6_IS_ADDR_UNSPECIFIED(&area->mta->router_id_ipv6)) { + vty_out(vty, " MPLS-TE IPv6 Router-Address: %pI6\n", + &area->mta->router_id_ipv6); + no_match = false; + } + if (no_match) + vty_out(vty, " N/A\n"); +} + DEFUN(show_isis_mpls_te_router, show_isis_mpls_te_router_cmd, "show " PROTO_NAME " [vrf ] mpls-te router", @@ -331,15 +420,7 @@ DEFUN(show_isis_mpls_te_router, if (!IS_MPLS_TE(area->mta)) continue; - vty_out(vty, "Area %s:\n", - area->area_tag); - if (ntohs(area->mta->router_id.s_addr) - != 0) - vty_out(vty, - " MPLS-TE Router-Address: %pI4\n", - &area->mta->router_id); - else - vty_out(vty, " N/A\n"); + show_router_id(vty, area); } } return 0; @@ -352,13 +433,7 @@ DEFUN(show_isis_mpls_te_router, if (!IS_MPLS_TE(area->mta)) continue; - vty_out(vty, "Area %s:\n", area->area_tag); - if (ntohs(area->mta->router_id.s_addr) != 0) - vty_out(vty, - " MPLS-TE Router-Address: %pI4\n", - &area->mta->router_id); - else - vty_out(vty, " N/A\n"); + show_router_id(vty, area); } } } @@ -536,8 +611,8 @@ void isis_mpls_te_init(void) /* Register Circuit and Adjacency hook */ hook_register(isis_if_new_hook, isis_mpls_te_update); - hook_register(isis_adj_state_change_hook, isis_link_update_adj_hook); - + hook_register(isis_adj_ip_enabled_hook, isis_mpls_te_adj_ip_enabled); + hook_register(isis_adj_ip_disabled_hook, isis_mpls_te_adj_ip_disabled); #ifndef FABRICD /* Register new VTY commands */ diff --git a/isisd/isis_te.h b/isisd/isis_te.h index 2a6911d500..e69ae40729 100644 --- a/isisd/isis_te.h +++ b/isisd/isis_te.h @@ -101,8 +101,9 @@ struct mpls_te_area { interas_mode_t inter_as; struct in_addr interas_areaid; - /* MPLS_TE router ID */ + /* MPLS_TE IPv4 & IPv6 Router IDs */ struct in_addr router_id; + struct in6_addr router_id_ipv6; }; /* Prototypes. */ diff --git a/isisd/isis_tlvs.c b/isisd/isis_tlvs.c index a66d3b00f7..9a442e0374 100644 --- a/isisd/isis_tlvs.c +++ b/isisd/isis_tlvs.c @@ -99,6 +99,7 @@ static const struct pack_order_entry pack_order[] = { PACK_ENTRY(OLDSTYLE_IP_REACH_EXT, ISIS_ITEMS, oldstyle_ip_reach_ext), PACK_ENTRY(IPV4_ADDRESS, ISIS_ITEMS, ipv4_address), PACK_ENTRY(IPV6_ADDRESS, ISIS_ITEMS, ipv6_address), + PACK_ENTRY(GLOBAL_IPV6_ADDRESS, ISIS_ITEMS, global_ipv6_address), PACK_ENTRY(EXTENDED_IP_REACH, ISIS_ITEMS, extended_ip_reach), PACK_ENTRY(MT_IP_REACH, ISIS_MT_ITEMS, mt_ip_reach), PACK_ENTRY(IPV6_REACH, ISIS_ITEMS, ipv6_reach), @@ -128,27 +129,41 @@ struct isis_ext_subtlvs *isis_alloc_ext_subtlvs(void) } /* - * mtid parameter is used to determine if Adjacency is related to IPv4 or IPv6. - * A negative value could be used to skip copy of Adjacency SID. + * mtid parameter is used to determine if Adjacency is related to IPv4 or IPv6 + * Multi-Topology. Special 4096 value i.e. first R flag set is used to indicate + * that MT is disabled i.e. IS-IS is working with a Single Topology. */ static struct isis_ext_subtlvs * -copy_item_ext_subtlvs(struct isis_ext_subtlvs *exts, int16_t mtid) +copy_item_ext_subtlvs(struct isis_ext_subtlvs *exts, uint16_t mtid) { struct isis_ext_subtlvs *rv = XCALLOC(MTYPE_ISIS_SUBTLV, sizeof(*rv)); struct isis_adj_sid *adj; struct isis_lan_adj_sid *lan; + /* Copy the Extended IS main part */ memcpy(rv, exts, sizeof(struct isis_ext_subtlvs)); + + /* Disable IPv4 / IPv6 advertisement in function of MTID */ + if (mtid == ISIS_MT_IPV4_UNICAST) { + UNSET_SUBTLV(rv, EXT_LOCAL_ADDR6); + UNSET_SUBTLV(rv, EXT_NEIGH_ADDR6); + } + if (mtid == ISIS_MT_IPV6_UNICAST) { + UNSET_SUBTLV(rv, EXT_LOCAL_ADDR); + UNSET_SUBTLV(rv, EXT_NEIGH_ADDR); + } + + /* Prepare (LAN)-Adjacency Segment Routing ID*/ init_item_list(&rv->adj_sid); init_item_list(&rv->lan_sid); UNSET_SUBTLV(rv, EXT_ADJ_SID); UNSET_SUBTLV(rv, EXT_LAN_ADJ_SID); - /* Copy Adj SID and LAN Adj SID list for IPv4 if needed */ + /* Copy Adj SID list for IPv4 & IPv6 in function of MT ID */ for (adj = (struct isis_adj_sid *)exts->adj_sid.head; adj != NULL; adj = adj->next) { - if ((mtid != -1) + if ((mtid != ISIS_MT_DISABLE) && (((mtid == ISIS_MT_IPV4_UNICAST) && (adj->family != AF_INET)) || ((mtid == ISIS_MT_IPV6_UNICAST) @@ -166,9 +181,10 @@ copy_item_ext_subtlvs(struct isis_ext_subtlvs *exts, int16_t mtid) SET_SUBTLV(rv, EXT_ADJ_SID); } + /* Same for LAN Adj SID */ for (lan = (struct isis_lan_adj_sid *)exts->lan_sid.head; lan != NULL; lan = lan->next) { - if ((mtid != -1) + if ((mtid != ISIS_MT_DISABLE) && (((mtid == ISIS_MT_IPV4_UNICAST) && (lan->family != AF_INET)) || ((mtid == ISIS_MT_IPV6_UNICAST) @@ -196,8 +212,6 @@ static void format_item_ext_subtlvs(struct isis_ext_subtlvs *exts, uint16_t mtid) { - char ibuf[PREFIX2STR_BUFFER]; - /* Standard metrics */ if (IS_SUBTLV(exts, EXT_ADM_GRP)) sbuf_push(buf, indent, "Administrative Group: 0x%x\n", @@ -212,16 +226,17 @@ static void format_item_ext_subtlvs(struct isis_ext_subtlvs *exts, sbuf_push(buf, indent, "Local Interface IP Address(es): %pI4\n", &exts->local_addr); if (IS_SUBTLV(exts, EXT_NEIGH_ADDR)) - sbuf_push(buf, indent, "Remote Interface IP Address(es): %pI4\n", + sbuf_push(buf, indent, + "Remote Interface IP Address(es): %pI4\n", &exts->neigh_addr); if (IS_SUBTLV(exts, EXT_LOCAL_ADDR6)) - sbuf_push(buf, indent, "Local Interface IPv6 Address(es): %s\n", - inet_ntop(AF_INET6, &exts->local_addr6, ibuf, - PREFIX2STR_BUFFER)); + sbuf_push(buf, indent, + "Local Interface IPv6 Address(es): %pI6\n", + &exts->local_addr6); if (IS_SUBTLV(exts, EXT_NEIGH_ADDR6)) - sbuf_push(buf, indent, "Remote Interface IPv6 Address(es): %s\n", - inet_ntop(AF_INET6, &exts->local_addr6, ibuf, - PREFIX2STR_BUFFER)); + sbuf_push(buf, indent, + "Remote Interface IPv6 Address(es): %pI6\n", + &exts->neigh_addr6); if (IS_SUBTLV(exts, EXT_MAX_BW)) sbuf_push(buf, indent, "Maximum Bandwidth: %g (Bytes/sec)\n", exts->max_bw); @@ -289,11 +304,6 @@ static void format_item_ext_subtlvs(struct isis_ext_subtlvs *exts, for (adj = (struct isis_adj_sid *)exts->adj_sid.head; adj; adj = adj->next) { - if (((mtid == ISIS_MT_IPV4_UNICAST) - && (adj->family != AF_INET)) - || ((mtid == ISIS_MT_IPV6_UNICAST) - && (adj->family != AF_INET6))) - continue; sbuf_push( buf, indent, "Adjacency-SID: %u, Weight: %hhu, Flags: F:%c B:%c, V:%c, L:%c, S:%c, P:%c\n", @@ -319,10 +329,6 @@ static void format_item_ext_subtlvs(struct isis_ext_subtlvs *exts, for (lan = (struct isis_lan_adj_sid *)exts->lan_sid.head; lan; lan = lan->next) { - if (((mtid == ISIS_MT_IPV4_UNICAST) - && (lan->family != AF_INET)) - || ((mtid == ISIS_MT_IPV6_UNICAST) - && (lan->family != AF_INET6))) continue; sbuf_push(buf, indent, "Lan-Adjacency-SID: %u, Weight: %hhu, Flags: F:%c B:%c, V:%c, L:%c, S:%c, P:%c\n" @@ -1839,12 +1845,12 @@ static int pack_item_ipv6_address(struct isis_item *i, struct stream *s, { struct isis_ipv6_address *a = (struct isis_ipv6_address *)i; - if (STREAM_WRITEABLE(s) < 16) { - *min_len = 16; + if (STREAM_WRITEABLE(s) < IPV6_MAX_BYTELEN) { + *min_len = IPV6_MAX_BYTELEN; return 1; } - stream_put(s, &a->addr, 16); + stream_put(s, &a->addr, IPV6_MAX_BYTELEN); return 0; } @@ -1865,7 +1871,7 @@ static int unpack_item_ipv6_address(uint16_t mtid, uint8_t len, } struct isis_ipv6_address *rv = XCALLOC(MTYPE_ISIS_TLV, sizeof(*rv)); - stream_get(&rv->addr, s, 16); + stream_get(&rv->addr, s, IPV6_MAX_BYTELEN); format_item_ipv6_address(mtid, (struct isis_item *)rv, log, indent + 2); append_item(&tlvs->ipv6_address, (struct isis_item *)rv); @@ -1873,6 +1879,70 @@ static int unpack_item_ipv6_address(uint16_t mtid, uint8_t len, } +/* Functions related to TLV 233 Global IPv6 Interface addresses */ +static struct isis_item *copy_item_global_ipv6_address(struct isis_item *i) +{ + struct isis_ipv6_address *a = (struct isis_ipv6_address *)i; + struct isis_ipv6_address *rv = XCALLOC(MTYPE_ISIS_TLV, sizeof(*rv)); + + rv->addr = a->addr; + return (struct isis_item *)rv; +} + +static void format_item_global_ipv6_address(uint16_t mtid, struct isis_item *i, + struct sbuf *buf, int indent) +{ + struct isis_ipv6_address *a = (struct isis_ipv6_address *)i; + char addrbuf[INET6_ADDRSTRLEN]; + + inet_ntop(AF_INET6, &a->addr, addrbuf, sizeof(addrbuf)); + sbuf_push(buf, indent, "Global IPv6 Interface Address: %s\n", addrbuf); +} + +static void free_item_global_ipv6_address(struct isis_item *i) +{ + XFREE(MTYPE_ISIS_TLV, i); +} + +static int pack_item_global_ipv6_address(struct isis_item *i, struct stream *s, + size_t *min_len) +{ + struct isis_ipv6_address *a = (struct isis_ipv6_address *)i; + + if (STREAM_WRITEABLE(s) < IPV6_MAX_BYTELEN) { + *min_len = IPV6_MAX_BYTELEN; + return 1; + } + + stream_put(s, &a->addr, IPV6_MAX_BYTELEN); + + return 0; +} + +static int unpack_item_global_ipv6_address(uint16_t mtid, uint8_t len, + struct stream *s, struct sbuf *log, + void *dest, int indent) +{ + struct isis_tlvs *tlvs = dest; + + sbuf_push(log, indent, "Unpack Global IPv6 Interface address...\n"); + if (len < IPV6_MAX_BYTELEN) { + sbuf_push( + log, indent, + "Not enough data left.(Expected 16 bytes of IPv6 address, got %hhu)\n", + len); + return 1; + } + + struct isis_ipv6_address *rv = XCALLOC(MTYPE_ISIS_TLV, sizeof(*rv)); + stream_get(&rv->addr, s, IPV6_MAX_BYTELEN); + + format_item_global_ipv6_address(mtid, (struct isis_item *)rv, log, + indent + 2); + append_item(&tlvs->global_ipv6_address, (struct isis_item *)rv); + return 0; +} + /* Functions related to TLV 229 MT Router information */ static struct isis_item *copy_item_mt_router_info(struct isis_item *i) { @@ -2273,6 +2343,77 @@ static int unpack_tlv_dynamic_hostname(enum isis_tlv_context context, return 0; } +/* Functions related to TLV 140 IPv6 TE Router ID */ + +static struct in6_addr *copy_tlv_te_router_id_ipv6(const struct in6_addr *id) +{ + if (!id) + return NULL; + + struct in6_addr *rv = XCALLOC(MTYPE_ISIS_TLV, sizeof(*rv)); + memcpy(rv, id, sizeof(*rv)); + return rv; +} + +static void format_tlv_te_router_id_ipv6(const struct in6_addr *id, + struct sbuf *buf, int indent) +{ + if (!id) + return; + + char addrbuf[INET6_ADDRSTRLEN]; + inet_ntop(AF_INET6, id, addrbuf, sizeof(addrbuf)); + sbuf_push(buf, indent, "IPv6 TE Router ID: %s\n", addrbuf); +} + +static void free_tlv_te_router_id_ipv6(struct in6_addr *id) +{ + XFREE(MTYPE_ISIS_TLV, id); +} + +static int pack_tlv_te_router_id_ipv6(const struct in6_addr *id, + struct stream *s) +{ + if (!id) + return 0; + + if (STREAM_WRITEABLE(s) < (unsigned)(2 + sizeof(*id))) + return 1; + + stream_putc(s, ISIS_TLV_TE_ROUTER_ID_IPV6); + stream_putc(s, IPV6_MAX_BYTELEN); + stream_put(s, id, IPV6_MAX_BYTELEN); + return 0; +} + +static int unpack_tlv_te_router_id_ipv6(enum isis_tlv_context context, + uint8_t tlv_type, uint8_t tlv_len, + struct stream *s, struct sbuf *log, + void *dest, int indent) +{ + struct isis_tlvs *tlvs = dest; + + sbuf_push(log, indent, "Unpacking IPv6 TE Router ID TLV...\n"); + if (tlv_len != IPV6_MAX_BYTELEN) { + sbuf_push(log, indent, "WARNING: Length invalid\n"); + return 1; + } + + if (tlvs->te_router_id_ipv6) { + sbuf_push( + log, indent, + "WARNING: IPv6 TE Router ID present multiple times.\n"); + stream_forward_getp(s, tlv_len); + return 0; + } + + tlvs->te_router_id_ipv6 = XCALLOC(MTYPE_ISIS_TLV, IPV6_MAX_BYTELEN); + stream_get(tlvs->te_router_id_ipv6, s, IPV6_MAX_BYTELEN); + format_tlv_te_router_id_ipv6(tlvs->te_router_id_ipv6, log, indent + 2); + return 0; +} + + /* Functions related to TLV 150 Spine-Leaf-Extension */ static struct isis_spine_leaf *copy_tlv_spine_leaf( @@ -3640,6 +3781,7 @@ struct isis_tlvs *isis_alloc_tlvs(void) init_item_list(&result->oldstyle_ip_reach_ext); init_item_list(&result->ipv4_address); init_item_list(&result->ipv6_address); + init_item_list(&result->global_ipv6_address); init_item_list(&result->extended_ip_reach); RB_INIT(isis_mt_item_list, &result->mt_ip_reach); init_item_list(&result->ipv6_reach); @@ -3696,8 +3838,14 @@ struct isis_tlvs *isis_copy_tlvs(struct isis_tlvs *tlvs) copy_items(ISIS_CONTEXT_LSP, ISIS_TLV_IPV6_ADDRESS, &tlvs->ipv6_address, &rv->ipv6_address); + copy_items(ISIS_CONTEXT_LSP, ISIS_TLV_GLOBAL_IPV6_ADDRESS, + &tlvs->global_ipv6_address, &rv->global_ipv6_address); + rv->te_router_id = copy_tlv_te_router_id(tlvs->te_router_id); + rv->te_router_id_ipv6 = + copy_tlv_te_router_id_ipv6(tlvs->te_router_id_ipv6); + copy_items(ISIS_CONTEXT_LSP, ISIS_TLV_EXTENDED_IP_REACH, &tlvs->extended_ip_reach, &rv->extended_ip_reach); @@ -3751,6 +3899,7 @@ static void format_tlvs(struct isis_tlvs *tlvs, struct sbuf *buf, int indent) format_tlv_dynamic_hostname(tlvs->hostname, buf, indent); format_tlv_te_router_id(tlvs->te_router_id, buf, indent); + format_tlv_te_router_id_ipv6(tlvs->te_router_id_ipv6, buf, indent); format_tlv_router_cap(tlvs->router_cap, buf, indent); format_items(ISIS_CONTEXT_LSP, ISIS_TLV_EXTENDED_REACH, @@ -3771,6 +3920,9 @@ static void format_tlvs(struct isis_tlvs *tlvs, struct sbuf *buf, int indent) format_items(ISIS_CONTEXT_LSP, ISIS_TLV_IPV6_ADDRESS, &tlvs->ipv6_address, buf, indent); + format_items(ISIS_CONTEXT_LSP, ISIS_TLV_GLOBAL_IPV6_ADDRESS, + &tlvs->global_ipv6_address, buf, indent); + format_items(ISIS_CONTEXT_LSP, ISIS_TLV_EXTENDED_IP_REACH, &tlvs->extended_ip_reach, buf, indent); @@ -3828,7 +3980,10 @@ void isis_free_tlvs(struct isis_tlvs *tlvs) &tlvs->ipv4_address); free_items(ISIS_CONTEXT_LSP, ISIS_TLV_IPV6_ADDRESS, &tlvs->ipv6_address); + free_items(ISIS_CONTEXT_LSP, ISIS_TLV_GLOBAL_IPV6_ADDRESS, + &tlvs->global_ipv6_address); free_tlv_te_router_id(tlvs->te_router_id); + free_tlv_te_router_id_ipv6(tlvs->te_router_id_ipv6); free_items(ISIS_CONTEXT_LSP, ISIS_TLV_EXTENDED_IP_REACH, &tlvs->extended_ip_reach); free_mt_items(ISIS_CONTEXT_LSP, ISIS_TLV_MT_IP_REACH, @@ -4035,6 +4190,14 @@ static int pack_tlvs(struct isis_tlvs *tlvs, struct stream *stream, copy_tlv_te_router_id(tlvs->te_router_id); } + rv = pack_tlv_te_router_id_ipv6(tlvs->te_router_id_ipv6, stream); + if (rv) + return rv; + if (fragment_tlvs) { + fragment_tlvs->te_router_id_ipv6 = + copy_tlv_te_router_id_ipv6(tlvs->te_router_id_ipv6); + } + rv = pack_tlv_threeway_adj(tlvs->threeway_adj, stream); if (rv) return rv; @@ -4255,10 +4418,12 @@ ITEM_TLV_OPS(ipv4_address, "TLV 132 IPv4 Interface Address"); TLV_OPS(te_router_id, "TLV 134 TE Router ID"); ITEM_TLV_OPS(extended_ip_reach, "TLV 135 Extended IP Reachability"); TLV_OPS(dynamic_hostname, "TLV 137 Dynamic Hostname"); +TLV_OPS(te_router_id_ipv6, "TLV 140 IPv6 TE Router ID"); TLV_OPS(spine_leaf, "TLV 150 Spine Leaf Extensions"); ITEM_TLV_OPS(mt_router_info, "TLV 229 MT Router Information"); TLV_OPS(threeway_adj, "TLV 240 P2P Three-Way Adjacency"); ITEM_TLV_OPS(ipv6_address, "TLV 232 IPv6 Interface Address"); +ITEM_TLV_OPS(global_ipv6_address, "TLV 233 Global IPv6 Interface Address"); ITEM_TLV_OPS(ipv6_reach, "TLV 236 IPv6 Reachability"); TLV_OPS(router_cap, "TLV 242 Router Capability"); @@ -4279,12 +4444,14 @@ static const struct tlv_ops *const tlv_table[ISIS_CONTEXT_MAX][ISIS_TLV_MAX] = { [ISIS_TLV_OLDSTYLE_IP_REACH_EXT] = &tlv_oldstyle_ip_reach_ops, [ISIS_TLV_IPV4_ADDRESS] = &tlv_ipv4_address_ops, [ISIS_TLV_TE_ROUTER_ID] = &tlv_te_router_id_ops, + [ISIS_TLV_TE_ROUTER_ID_IPV6] = &tlv_te_router_id_ipv6_ops, [ISIS_TLV_EXTENDED_IP_REACH] = &tlv_extended_ip_reach_ops, [ISIS_TLV_DYNAMIC_HOSTNAME] = &tlv_dynamic_hostname_ops, [ISIS_TLV_SPINE_LEAF_EXT] = &tlv_spine_leaf_ops, [ISIS_TLV_MT_REACH] = &tlv_extended_reach_ops, [ISIS_TLV_MT_ROUTER_INFO] = &tlv_mt_router_info_ops, [ISIS_TLV_IPV6_ADDRESS] = &tlv_ipv6_address_ops, + [ISIS_TLV_GLOBAL_IPV6_ADDRESS] = &tlv_global_ipv6_address_ops, [ISIS_TLV_MT_IP_REACH] = &tlv_extended_ip_reach_ops, [ISIS_TLV_IPV6_REACH] = &tlv_ipv6_reach_ops, [ISIS_TLV_MT_IPV6_REACH] = &tlv_ipv6_reach_ops, @@ -4427,6 +4594,26 @@ void isis_tlvs_add_ipv6_addresses(struct isis_tlvs *tlvs, } } +void isis_tlvs_add_global_ipv6_addresses(struct isis_tlvs *tlvs, + struct list *addresses) +{ + struct listnode *node; + struct prefix_ipv6 *ip_addr; + unsigned int addr_count = 0; + + for (ALL_LIST_ELEMENTS_RO(addresses, node, ip_addr)) { + if (addr_count >= 15) + break; + + struct isis_ipv6_address *a = + XCALLOC(MTYPE_ISIS_TLV, sizeof(*a)); + + a->addr = ip_addr->prefix; + append_item(&tlvs->global_ipv6_address, (struct isis_item *)a); + addr_count++; + } +} + typedef bool (*auth_validator_func)(struct isis_passwd *passwd, struct stream *stream, struct isis_auth *auth, bool is_lsp); @@ -4606,10 +4793,12 @@ static void tlvs_protocols_supported_to_adj(struct isis_tlvs *tlvs, memcpy(adj->nlpids.nlpids, reduced.nlpids, reduced.count); } -DEFINE_HOOK(isis_adj_ip_enabled_hook, (struct isis_adjacency *adj, int family), - (adj, family)); +DEFINE_HOOK(isis_adj_ip_enabled_hook, + (struct isis_adjacency * adj, int family, bool global), + (adj, family, global)); DEFINE_HOOK(isis_adj_ip_disabled_hook, - (struct isis_adjacency *adj, int family), (adj, family)); + (struct isis_adjacency * adj, int family, bool global), + (adj, family, global)); static void tlvs_ipv4_addresses_to_adj(struct isis_tlvs *tlvs, struct isis_adjacency *adj, @@ -4620,7 +4809,7 @@ static void tlvs_ipv4_addresses_to_adj(struct isis_tlvs *tlvs, if (adj->ipv4_address_count == 0 && tlvs->ipv4_address.count > 0) ipv4_enabled = true; else if (adj->ipv4_address_count > 0 && tlvs->ipv4_address.count == 0) - hook_call(isis_adj_ip_disabled_hook, adj, AF_INET); + hook_call(isis_adj_ip_disabled_hook, adj, AF_INET, false); if (adj->ipv4_address_count != tlvs->ipv4_address.count) { uint32_t oc = adj->ipv4_address_count; @@ -4654,7 +4843,7 @@ static void tlvs_ipv4_addresses_to_adj(struct isis_tlvs *tlvs, } if (ipv4_enabled) - hook_call(isis_adj_ip_enabled_hook, adj, AF_INET); + hook_call(isis_adj_ip_enabled_hook, adj, AF_INET, false); } static void tlvs_ipv6_addresses_to_adj(struct isis_tlvs *tlvs, @@ -4663,23 +4852,23 @@ static void tlvs_ipv6_addresses_to_adj(struct isis_tlvs *tlvs, { bool ipv6_enabled = false; - if (adj->ipv6_address_count == 0 && tlvs->ipv6_address.count > 0) + if (adj->ll_ipv6_count == 0 && tlvs->ipv6_address.count > 0) ipv6_enabled = true; - else if (adj->ipv6_address_count > 0 && tlvs->ipv6_address.count == 0) - hook_call(isis_adj_ip_disabled_hook, adj, AF_INET6); + else if (adj->ll_ipv6_count > 0 && tlvs->ipv6_address.count == 0) + hook_call(isis_adj_ip_disabled_hook, adj, AF_INET6, false); - if (adj->ipv6_address_count != tlvs->ipv6_address.count) { - uint32_t oc = adj->ipv6_address_count; + if (adj->ll_ipv6_count != tlvs->ipv6_address.count) { + uint32_t oc = adj->ll_ipv6_count; *changed = true; - adj->ipv6_address_count = tlvs->ipv6_address.count; - adj->ipv6_addresses = XREALLOC( - MTYPE_ISIS_ADJACENCY_INFO, adj->ipv6_addresses, - adj->ipv6_address_count * sizeof(*adj->ipv6_addresses)); + adj->ll_ipv6_count = tlvs->ipv6_address.count; + adj->ll_ipv6_addrs = XREALLOC( + MTYPE_ISIS_ADJACENCY_INFO, adj->ll_ipv6_addrs, + adj->ll_ipv6_count * sizeof(*adj->ll_ipv6_addrs)); - for (; oc < adj->ipv6_address_count; oc++) { - memset(&adj->ipv6_addresses[oc], 0, - sizeof(adj->ipv6_addresses[oc])); + for (; oc < adj->ll_ipv6_count; oc++) { + memset(&adj->ll_ipv6_addrs[oc], 0, + sizeof(adj->ll_ipv6_addrs[oc])); } } @@ -4691,16 +4880,65 @@ static void tlvs_ipv6_addresses_to_adj(struct isis_tlvs *tlvs, else addr = addr->next; - if (!memcmp(&adj->ipv6_addresses[i], &addr->addr, + if (!memcmp(&adj->ll_ipv6_addrs[i], &addr->addr, sizeof(addr->addr))) continue; *changed = true; - adj->ipv6_addresses[i] = addr->addr; + adj->ll_ipv6_addrs[i] = addr->addr; } if (ipv6_enabled) - hook_call(isis_adj_ip_enabled_hook, adj, AF_INET6); + hook_call(isis_adj_ip_enabled_hook, adj, AF_INET6, false); +} + + +static void tlvs_global_ipv6_addresses_to_adj(struct isis_tlvs *tlvs, + struct isis_adjacency *adj, + bool *changed) +{ + bool global_ipv6_enabled = false; + + if (adj->global_ipv6_count == 0 && tlvs->global_ipv6_address.count > 0) + global_ipv6_enabled = true; + else if (adj->global_ipv6_count > 0 + && tlvs->global_ipv6_address.count == 0) + hook_call(isis_adj_ip_disabled_hook, adj, AF_INET6, true); + + if (adj->global_ipv6_count != tlvs->global_ipv6_address.count) { + uint32_t oc = adj->global_ipv6_count; + + *changed = true; + adj->global_ipv6_count = tlvs->global_ipv6_address.count; + adj->global_ipv6_addrs = XREALLOC( + MTYPE_ISIS_ADJACENCY_INFO, adj->global_ipv6_addrs, + adj->global_ipv6_count + * sizeof(*adj->global_ipv6_addrs)); + + for (; oc < adj->global_ipv6_count; oc++) { + memset(&adj->global_ipv6_addrs[oc], 0, + sizeof(adj->global_ipv6_addrs[oc])); + } + } + + struct isis_ipv6_address *addr = NULL; + for (unsigned int i = 0; i < tlvs->global_ipv6_address.count; i++) { + if (!addr) + addr = (struct isis_ipv6_address *) + tlvs->global_ipv6_address.head; + else + addr = addr->next; + + if (!memcmp(&adj->global_ipv6_addrs[i], &addr->addr, + sizeof(addr->addr))) + continue; + + *changed = true; + adj->global_ipv6_addrs[i] = addr->addr; + } + + if (global_ipv6_enabled) + hook_call(isis_adj_ip_enabled_hook, adj, AF_INET6, true); } void isis_tlvs_to_adj(struct isis_tlvs *tlvs, struct isis_adjacency *adj, @@ -4712,6 +4950,7 @@ void isis_tlvs_to_adj(struct isis_tlvs *tlvs, struct isis_adjacency *adj, tlvs_protocols_supported_to_adj(tlvs, adj, changed); tlvs_ipv4_addresses_to_adj(tlvs, adj, changed); tlvs_ipv6_addresses_to_adj(tlvs, adj, changed); + tlvs_global_ipv6_addresses_to_adj(tlvs, adj, changed); } bool isis_tlvs_own_snpa_found(struct isis_tlvs *tlvs, uint8_t *snpa) @@ -4793,6 +5032,16 @@ void isis_tlvs_set_te_router_id(struct isis_tlvs *tlvs, memcpy(tlvs->te_router_id, id, sizeof(*id)); } +void isis_tlvs_set_te_router_id_ipv6(struct isis_tlvs *tlvs, + const struct in6_addr *id) +{ + XFREE(MTYPE_ISIS_TLV, tlvs->te_router_id_ipv6); + if (!id) + return; + tlvs->te_router_id_ipv6 = XCALLOC(MTYPE_ISIS_TLV, sizeof(*id)); + memcpy(tlvs->te_router_id_ipv6, id, sizeof(*id)); +} + void isis_tlvs_add_oldstyle_ip_reach(struct isis_tlvs *tlvs, struct prefix_ipv4 *dest, uint8_t metric) { @@ -4922,7 +5171,7 @@ void isis_tlvs_add_extended_reach(struct isis_tlvs *tlvs, uint16_t mtid, r->subtlvs = copy_item_ext_subtlvs(exts, mtid); struct isis_item_list *l; - if (mtid == ISIS_MT_IPV4_UNICAST) + if ((mtid == ISIS_MT_IPV4_UNICAST) || (mtid == ISIS_MT_DISABLE)) l = &tlvs->extended_reach; else l = isis_get_mt_items(&tlvs->mt_reach, mtid); diff --git a/isisd/isis_tlvs.h b/isisd/isis_tlvs.h index 0438d13ae0..38470ef85e 100644 --- a/isisd/isis_tlvs.h +++ b/isisd/isis_tlvs.h @@ -324,9 +324,11 @@ struct isis_tlvs { struct isis_item_list oldstyle_ip_reach_ext; struct isis_item_list ipv4_address; struct isis_item_list ipv6_address; + struct isis_item_list global_ipv6_address; struct isis_item_list mt_router_info; bool mt_router_info_empty; struct in_addr *te_router_id; + struct in6_addr *te_router_id_ipv6; struct isis_item_list extended_ip_reach; struct isis_mt_item_list mt_ip_reach; char *hostname; @@ -372,10 +374,12 @@ enum isis_tlv_type { ISIS_TLV_TE_ROUTER_ID = 134, ISIS_TLV_EXTENDED_IP_REACH = 135, ISIS_TLV_DYNAMIC_HOSTNAME = 137, + ISIS_TLV_TE_ROUTER_ID_IPV6 = 140, ISIS_TLV_SPINE_LEAF_EXT = 150, ISIS_TLV_MT_REACH = 222, ISIS_TLV_MT_ROUTER_INFO = 229, ISIS_TLV_IPV6_ADDRESS = 232, + ISIS_TLV_GLOBAL_IPV6_ADDRESS = 233, ISIS_TLV_MT_IP_REACH = 235, ISIS_TLV_IPV6_REACH = 236, ISIS_TLV_MT_IPV6_REACH = 237, @@ -575,6 +579,8 @@ void isis_tlvs_add_ipv4_addresses(struct isis_tlvs *tlvs, struct list *addresses); void isis_tlvs_add_ipv6_addresses(struct isis_tlvs *tlvs, struct list *addresses); +void isis_tlvs_add_global_ipv6_addresses(struct isis_tlvs *tlvs, + struct list *addresses); int isis_tlvs_auth_is_valid(struct isis_tlvs *tlvs, struct isis_passwd *passwd, struct stream *stream, bool is_lsp); bool isis_tlvs_area_addresses_match(struct isis_tlvs *tlvs, @@ -594,6 +600,8 @@ void isis_tlvs_set_router_capability(struct isis_tlvs *tlvs, const struct isis_router_cap *cap); void isis_tlvs_set_te_router_id(struct isis_tlvs *tlvs, const struct in_addr *id); +void isis_tlvs_set_te_router_id_ipv6(struct isis_tlvs *tlvs, + const struct in6_addr *id); void isis_tlvs_add_oldstyle_ip_reach(struct isis_tlvs *tlvs, struct prefix_ipv4 *dest, uint8_t metric); void isis_tlvs_add_extended_ip_reach(struct isis_tlvs *tlvs, diff --git a/tests/isisd/test_fuzz_isis_tlv_tests.h.gz b/tests/isisd/test_fuzz_isis_tlv_tests.h.gz index b50c5683bf6e597baefcbab7670e8183464e7ad1..accc906bf25853bd417cff25840b233f98d1221e 100644 GIT binary patch literal 245481 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
x!5vuG8=ZaKuGZTWkAFBJdnfgJ^ z1qwdC$mx@W`{W&KRbMsNA_;iDf>6%&TD6}grL8(RM;pxj<*G!9sY2;fH}KD8hP6F= zG9#|PP_rHO7nd73VGSen#47FhYSmuhR{ zs=m^prlX`Pm1MhfEkPX`dahK68dM~p?FCkFO<8NIU(K-4kHnPsJQYbaa_KIsaTrb3 zs=t}t_%z4NuD+|+inuFi)`%Pde-&S3hk9g9INw~{UqdD|X~uy?26+}p8QXCDt)1S8 zrr98ARcei?jU95gv4}{?!~icHCiNxa6}-DW7;jfr)VVgDCdTw%WQ}H-JWtGx^faW5 zc@wh^({GK0ul3BN;!nJy%i+U&XFo6Q@)#4fowsjY@qNKAsGG-`S$u)HcQ0~gtU8#j zG@W2zdKfo*ARB)2U9x~s*EgF43_nig(W^sA(a@8Ta>iFpl#A~T*{O83$&&n9HQx3h zgd1bwJVPnI$e%hg>h6y;t~ig@PB?~cuK|~PE|0pXnC3=rq~k*1P(zJ`lJfpyq_s}) zWmsBI@``p^8@#hQAL*4(R?y2h6Jn>B{^r?lE|FjODNA_5=JzV~{8Rol8U?kHtw)`n z-5>bcMyic^r=Dk5Qk?aDW{7S@yKd`@yHi52rf!XCEHJe*kNNMGcP8SDn5m;p!Jb^R^ep8R;lUe)+gQmi&jpAiG&@;2CaVg7Qdj1W>Buq&@Gq7)3(c#Z${E zjy^>7mxc_%@{nG%9+!!z&AmBwMaC1`R}HF};HM-_3|W0>zCZ5+v@<0Yl9nUu@6xV= z|EJj#1btt2ZIS!!wo`(SXrl>;3C%dJ$)D&Lbj0TC@ui=+G1FJxP6cm*`Gn3mZnj9k zyn|ncXeHb@KBAX!YDBM})21#iZX??!^+wxDo&GX7f8!&yP4VJrvddW^$eDtsu^B@K zJgA8S4-*|!R$3)x|yXRbW zRZPg?!Vb_yC2&Xb+9?E2w1#^?)gOdex781Hf9(FNv0x;MWeb{KjuT(tykF3)`Q` z{za{lm&i*vi^A3-e{1oiv%6vYQ$<>~>19F0#k!=_{VN;wkN+v=bQuu#VubDIlr}%K zF=H`4?@2!keR1$fYmvINJF6M9+T7`0m2iwDZ4xRT`nRm|(93D}VZVE#7k4jIa)k77 z$9iK@pdi>6TyZ&VUPABvpl_CH$b~XFa?_>?xyD~F-k~p`;EK1l+*t(ggs6|d)(huhR8PIt|*a;=)bju)vYJn$br&=}mIlygCR z?Nei8rAAkO4%_^pq1ru{lO1H+lnC|C+AOu@QVOswBTu9)D9IIWU-5r|{k~Q(`AaP{ z3hjw^VYgd9+VDB#SiRWGFp~@a>A&nh{g?j|y`Lb6NR8B5Qe5@7wB6jkQ;Hai2;-kH ze@VEkye&K3{Fl8_*7R>3W=rUqz+=iUtxqVgdGQ69ggbsEl@2kH^)(+5uPn5wf$lS7 zh;2pcch|XJj5Cdl=|z%JrbK80WHEr}*&_Dlv|2Ldg4|G=gxEzy^!!??LGG@G4dhqq> z$+^e1ZMTmMXBnzY$uy7PWND06tPighCCv?m9S$`CTz5wY_?5UhAr zg})L?=wCe1)W-~} zX;sn)!fxC$$%^RPcU8|n!gx7=*lY?g;SwS}9zc8vz8!z))EML1aL3#6)I`Zh2qg5I zv^F6xJD5!exiwGi5NTJ{RUS-%8W+ynxajmFcxwZ9TsJ*cHTs9|_m{SJN$ghv;&{Kf zqtdTkgF0xVHr$?l1?(2{_CDQ)f@x*o?R}j?Z8cJMPJzI%jJSqESp3Y1D7v@0GX<#P zrL}?dY`>ji>Wz!dJwH3&&(M07TX@~XeF9a*$U5*cOfUhZ@r-$}HlrRY)7Hj

9`l^;L)1iYynJ@WxLulodz^8Bgi)?L9 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 E0$XaQc>n+a literal 176859 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 z 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 Bmk|H} diff --git a/yang/frr-isisd.yang b/yang/frr-isisd.yang index 5997e8866a..7a67a739ee 100644 --- a/yang/frr-isisd.yang +++ b/yang/frr-isisd.yang @@ -1481,6 +1481,11 @@ module frr-isisd { description "Stable IP address of the advertising router."; } + leaf router-address-v6 { + type inet:ipv6-address; + description + "Stable IPv6 address of the advertising router."; + } } container segment-routing { From 8693b4d66e02fdcb2c767e3fe25803bcf858619e Mon Sep 17 00:00:00 2001 From: Olivier Dugeon Date: Tue, 22 Jun 2021 20:09:54 +0200 Subject: [PATCH 2/5] lib: Update Link State functions to handle IPv6 In order to add Link State Traffic Engineering to IS-IS, Link State library should have been updated: - Correct Node and Edge RB Tree comparison functions to support key > 32 bits - Change Subnet RB Tree comparison function to take into account host part of the prefix i.e. 10.0.0.1/24 and 10.0.0.2/24 are considered as different - Add new function to convert IS-IS ISO system ID into Vertex or Edge key that take into account Endianness architecture - Correct Vertex and Edge creation and search function accordingly - Add extra Adjacency entries in Link State Attributes for IPv6 Segment Routing - Update send/received and show TED functions accordingly Signed-off-by: Olivier Dugeon --- lib/link_state.c | 341 ++++++++++++++++++++++++++++------------------- lib/link_state.h | 42 +++++- 2 files changed, 241 insertions(+), 142 deletions(-) diff --git a/lib/link_state.c b/lib/link_state.c index b0bc386b79..e4ccd0fb65 100644 --- a/lib/link_state.c +++ b/lib/link_state.c @@ -89,7 +89,7 @@ struct ls_node *ls_node_new(struct ls_node_id adv, struct in_addr rid, } } if (!IN6_IS_ADDR_UNSPECIFIED(&rid6)) { - new->router6_id = rid6; + new->router_id6 = rid6; SET_FLAG(new->flags, LS_NODE_ROUTER_ID6); } return new; @@ -127,7 +127,7 @@ int ls_node_same(struct ls_node *n1, struct ls_node *n2) && !IPV4_ADDR_SAME(&n1->router_id, &n2->router_id)) return 0; if (CHECK_FLAG(n1->flags, LS_NODE_ROUTER_ID6) - && !IPV6_ADDR_SAME(&n1->router6_id, &n2->router6_id)) + && !IPV6_ADDR_SAME(&n1->router_id6, &n2->router_id6)) return 0; if (CHECK_FLAG(n1->flags, LS_NODE_FLAG) && (n1->node_flag != n2->node_flag)) @@ -306,36 +306,23 @@ int ls_attributes_same(struct ls_attributes *l1, struct ls_attributes *l2) if (CHECK_FLAG(l1->flags, LS_ATTR_USE_BW) && (l1->extended.used_bw != l2->extended.used_bw)) return 0; - if (CHECK_FLAG(l1->flags, LS_ATTR_ADJ_SID)) { - if ((l1->adj_sid[0].sid != l2->adj_sid[0].sid) - || (l1->adj_sid[0].flags != l2->adj_sid[0].flags) - || (l1->adj_sid[0].weight != l2->adj_sid[0].weight)) + for (int i = 0; i < LS_ADJ_MAX; i++) { + if (!CHECK_FLAG(l1->flags, (LS_ATTR_ADJ_SID << i))) + continue; + if ((l1->adj_sid[i].sid != l2->adj_sid[i].sid) + || (l1->adj_sid[i].flags != l2->adj_sid[i].flags) + || (l1->adj_sid[i].weight != l2->adj_sid[i].weight)) return 0; if (((l1->adv.origin == ISIS_L1) || (l1->adv.origin == ISIS_L2)) - && (memcmp(&l1->adj_sid[0].neighbor.sysid, - &l2->adj_sid[0].neighbor.sysid, ISO_SYS_ID_LEN) + && (memcmp(&l1->adj_sid[i].neighbor.sysid, + &l2->adj_sid[i].neighbor.sysid, ISO_SYS_ID_LEN) != 0)) return 0; if (((l1->adv.origin == OSPFv2) || (l1->adv.origin == STATIC) || (l1->adv.origin == DIRECT)) - && (!IPV4_ADDR_SAME(&l1->adj_sid[0].neighbor.addr, - &l2->adj_sid[0].neighbor.addr))) - return 0; - } - if (CHECK_FLAG(l1->flags, LS_ATTR_BCK_ADJ_SID)) { - if ((l1->adj_sid[1].sid != l2->adj_sid[1].sid) - || (l1->adj_sid[1].flags != l2->adj_sid[1].flags) - || (l1->adj_sid[1].weight != l2->adj_sid[1].weight)) - return 0; - if (((l1->adv.origin == ISIS_L1) || (l1->adv.origin == ISIS_L2)) - && (memcmp(&l1->adj_sid[1].neighbor.sysid, - &l2->adj_sid[1].neighbor.sysid, ISO_SYS_ID_LEN) - != 0)) - return 0; - if (((l1->adv.origin == OSPFv2) || (l1->adv.origin == STATIC) - || (l1->adv.origin == DIRECT)) - && (!IPV4_ADDR_SAME(&l1->adj_sid[1].neighbor.addr, - &l2->adj_sid[1].neighbor.addr))) + && (i < ADJ_PRI_IPV6) + && (!IPV4_ADDR_SAME(&l1->adj_sid[i].neighbor.addr, + &l2->adj_sid[i].neighbor.addr))) return 0; } if (CHECK_FLAG(l1->flags, LS_ATTR_SRLG) @@ -417,6 +404,25 @@ int ls_prefix_same(struct ls_prefix *p1, struct ls_prefix *p2) /** * Link State Vertices management functions */ +uint64_t sysid_to_key(const uint8_t sysid[ISO_SYS_ID_LEN]) +{ + uint64_t key = 0; + +#if BYTE_ORDER == LITTLE_ENDIAN + uint8_t *byte = (uint8_t *)&key; + + for (int i = 0; i < ISO_SYS_ID_LEN; i++) + byte[i] = sysid[ISO_SYS_ID_LEN - i - 1]; + + byte[6] = 0; + byte[7] = 0; +#else + memcpy(&key, sysid, ISO_SYS_ID_LEN); +#endif + + return key; +} + struct ls_vertex *ls_vertex_add(struct ls_ted *ted, struct ls_node *node) { struct ls_vertex *new; @@ -435,7 +441,7 @@ struct ls_vertex *ls_vertex_add(struct ls_ted *ted, struct ls_node *node) break; case ISIS_L1: case ISIS_L2: - memcpy(&key, &node->adv.id.iso.sys_id, ISO_SYS_ID_LEN); + key = sysid_to_key(node->adv.id.iso.sys_id); break; default: key = 0; @@ -557,7 +563,7 @@ struct ls_vertex *ls_find_vertex_by_id(struct ls_ted *ted, break; case ISIS_L1: case ISIS_L2: - memcpy(&vertex.key, &nid.id.iso.sys_id, ISO_SYS_ID_LEN); + vertex.key = sysid_to_key(nid.id.iso.sys_id); break; default: return NULL; @@ -673,6 +679,46 @@ static void ls_edge_connect_to(struct ls_ted *ted, struct ls_edge *edge) } } +static uint64_t get_edge_key(struct ls_attributes *attr, bool dst) +{ + uint64_t key = 0; + struct ls_standard *std; + + if (!attr) + return key; + + std = &attr->standard; + + if (dst) { + /* Key is the IPv4 remote address */ + if (CHECK_FLAG(attr->flags, LS_ATTR_NEIGH_ADDR)) + key = ((uint64_t)ntohl(std->remote.s_addr)) + & 0xffffffff; + /* or the 64 bits LSB of IPv6 remote address */ + else if (CHECK_FLAG(attr->flags, LS_ATTR_NEIGH_ADDR6)) + key = ((uint64_t)ntohl(std->remote6.s6_addr32[2]) << 32 + | (uint64_t)ntohl(std->remote6.s6_addr32[3])); + /* of remote identifier if no IP addresses are defined */ + else if (CHECK_FLAG(attr->flags, LS_ATTR_NEIGH_ID)) + key = (((uint64_t)std->remote_id) & 0xffffffff) + | ((uint64_t)std->local_id << 32); + } else { + /* Key is the IPv4 local address */ + if (CHECK_FLAG(attr->flags, LS_ATTR_LOCAL_ADDR)) + key = ((uint64_t)ntohl(std->local.s_addr)) & 0xffffffff; + /* or the 64 bits LSB of IPv6 local address */ + else if (CHECK_FLAG(attr->flags, LS_ATTR_LOCAL_ADDR6)) + key = ((uint64_t)ntohl(std->local6.s6_addr32[2]) << 32 + | (uint64_t)ntohl(std->local6.s6_addr32[3])); + /* of local identifier if no IP addresses are defined */ + else if (CHECK_FLAG(attr->flags, LS_ATTR_LOCAL_ID)) + key = (((uint64_t)std->local_id) & 0xffffffff) + | ((uint64_t)std->remote_id << 32); + } + + return key; +} + struct ls_edge *ls_edge_add(struct ls_ted *ted, struct ls_attributes *attributes) { @@ -682,23 +728,7 @@ struct ls_edge *ls_edge_add(struct ls_ted *ted, if (attributes == NULL) return NULL; - /* Key is the IPv4 local address */ - if (!IPV4_NET0(attributes->standard.local.s_addr)) - key = ((uint64_t)ntohl(attributes->standard.local.s_addr)) - & 0xffffffff; - /* or the IPv6 local address if IPv4 is not defined */ - else if (!IN6_IS_ADDR_UNSPECIFIED(&attributes->standard.local6)) - key = (uint64_t)(attributes->standard.local6.s6_addr32[0] - & 0xffffffff) - | ((uint64_t)attributes->standard.local6.s6_addr32[1] - << 32); - /* of local identifier if no IP addresses are defined */ - else if (attributes->standard.local_id != 0) - key = (uint64_t)( - (attributes->standard.local_id & 0xffffffff) - | ((uint64_t)attributes->standard.remote_id << 32)); - - /* Check that key is valid */ + key = get_edge_key(attributes, false); if (key == 0) return NULL; @@ -736,23 +766,7 @@ struct ls_edge *ls_find_edge_by_source(struct ls_ted *ted, if (attributes == NULL) return NULL; - edge.key = 0; - /* Key is the IPv4 local address */ - if (!IPV4_NET0(attributes->standard.local.s_addr)) - edge.key = ((uint64_t)ntohl(attributes->standard.local.s_addr)) - & 0xffffffff; - /* or the IPv6 local address if IPv4 is not defined */ - else if (!IN6_IS_ADDR_UNSPECIFIED(&attributes->standard.local6)) - edge.key = (uint64_t)(attributes->standard.local6.s6_addr32[0] - & 0xffffffff) - | ((uint64_t)attributes->standard.local6.s6_addr32[1] - << 32); - /* of local identifier if no IP addresses are defined */ - else if (attributes->standard.local_id != 0) - edge.key = (uint64_t)( - (attributes->standard.local_id & 0xffffffff) - | ((uint64_t)attributes->standard.remote_id << 32)); - + edge.key = get_edge_key(attributes, false); if (edge.key == 0) return NULL; @@ -767,24 +781,7 @@ struct ls_edge *ls_find_edge_by_destination(struct ls_ted *ted, if (attributes == NULL) return NULL; - edge.key = 0; - /* Key is the IPv4 remote address */ - if (!IPV4_NET0(attributes->standard.remote.s_addr)) - edge.key = ((uint64_t)ntohl(attributes->standard.remote.s_addr)) - & 0xffffffff; - /* or the IPv6 remote address if IPv4 is not defined */ - else if (!IN6_IS_ADDR_UNSPECIFIED(&attributes->standard.remote6)) - edge.key = - (uint64_t)(attributes->standard.remote6.s6_addr32[0] - & 0xffffffff) - | ((uint64_t)attributes->standard.remote6.s6_addr32[1] - << 32); - /* of remote identifier if no IP addresses are defined */ - else if (attributes->standard.remote_id != 0) - edge.key = (uint64_t)( - (attributes->standard.remote_id & 0xffffffff) - | ((uint64_t)attributes->standard.local_id << 32)); - + edge.key = get_edge_key(attributes, true); if (edge.key == 0) return NULL; @@ -1177,7 +1174,7 @@ static struct ls_node *ls_parse_node(struct stream *s) if (CHECK_FLAG(node->flags, LS_NODE_ROUTER_ID)) node->router_id.s_addr = stream_get_ipv4(s); if (CHECK_FLAG(node->flags, LS_NODE_ROUTER_ID6)) - STREAM_GET(&node->router6_id, s, IPV6_MAX_BYTELEN); + STREAM_GET(&node->router_id6, s, IPV6_MAX_BYTELEN); if (CHECK_FLAG(node->flags, LS_NODE_FLAG)) STREAM_GETC(s, node->node_flag); if (CHECK_FLAG(node->flags, LS_NODE_TYPE)) @@ -1267,26 +1264,32 @@ static struct ls_attributes *ls_parse_attributes(struct stream *s) if (CHECK_FLAG(attr->flags, LS_ATTR_USE_BW)) STREAM_GETF(s, attr->extended.used_bw); if (CHECK_FLAG(attr->flags, LS_ATTR_ADJ_SID)) { - STREAM_GETL(s, attr->adj_sid[0].sid); - STREAM_GETC(s, attr->adj_sid[0].flags); - STREAM_GETC(s, attr->adj_sid[0].weight); - if (attr->adv.origin == ISIS_L1 || attr->adv.origin == ISIS_L2) - STREAM_GET(attr->adj_sid[0].neighbor.sysid, s, - ISO_SYS_ID_LEN); - else if (attr->adv.origin == OSPFv2) - attr->adj_sid[0].neighbor.addr.s_addr = - stream_get_ipv4(s); + STREAM_GETL(s, attr->adj_sid[ADJ_PRI_IPV4].sid); + STREAM_GETC(s, attr->adj_sid[ADJ_PRI_IPV4].flags); + STREAM_GETC(s, attr->adj_sid[ADJ_PRI_IPV4].weight); + attr->adj_sid[ADJ_PRI_IPV4].neighbor.addr.s_addr = + stream_get_ipv4(s); } if (CHECK_FLAG(attr->flags, LS_ATTR_BCK_ADJ_SID)) { - STREAM_GETL(s, attr->adj_sid[1].sid); - STREAM_GETC(s, attr->adj_sid[1].flags); - STREAM_GETC(s, attr->adj_sid[1].weight); - if (attr->adv.origin == ISIS_L1 || attr->adv.origin == ISIS_L2) - STREAM_GET(attr->adj_sid[1].neighbor.sysid, s, - ISO_SYS_ID_LEN); - else if (attr->adv.origin == OSPFv2) - attr->adj_sid[1].neighbor.addr.s_addr = - stream_get_ipv4(s); + STREAM_GETL(s, attr->adj_sid[ADJ_BCK_IPV4].sid); + STREAM_GETC(s, attr->adj_sid[ADJ_BCK_IPV4].flags); + STREAM_GETC(s, attr->adj_sid[ADJ_BCK_IPV4].weight); + attr->adj_sid[ADJ_BCK_IPV4].neighbor.addr.s_addr = + stream_get_ipv4(s); + } + if (CHECK_FLAG(attr->flags, LS_ATTR_ADJ_SID6)) { + STREAM_GETL(s, attr->adj_sid[ADJ_PRI_IPV6].sid); + STREAM_GETC(s, attr->adj_sid[ADJ_PRI_IPV6].flags); + STREAM_GETC(s, attr->adj_sid[ADJ_PRI_IPV6].weight); + STREAM_GET(attr->adj_sid[ADJ_PRI_IPV6].neighbor.sysid, s, + ISO_SYS_ID_LEN); + } + if (CHECK_FLAG(attr->flags, LS_ATTR_BCK_ADJ_SID6)) { + STREAM_GETL(s, attr->adj_sid[ADJ_BCK_IPV6].sid); + STREAM_GETC(s, attr->adj_sid[ADJ_BCK_IPV6].flags); + STREAM_GETC(s, attr->adj_sid[ADJ_BCK_IPV6].weight); + STREAM_GET(attr->adj_sid[ADJ_BCK_IPV6].neighbor.sysid, s, + ISO_SYS_ID_LEN); } if (CHECK_FLAG(attr->flags, LS_ATTR_SRLG)) { STREAM_GETC(s, len); @@ -1401,7 +1404,7 @@ static int ls_format_node(struct stream *s, struct ls_node *node) if (CHECK_FLAG(node->flags, LS_NODE_ROUTER_ID)) stream_put_ipv4(s, node->router_id.s_addr); if (CHECK_FLAG(node->flags, LS_NODE_ROUTER_ID6)) - stream_put(s, &node->router6_id, IPV6_MAX_BYTELEN); + stream_put(s, &node->router_id6, IPV6_MAX_BYTELEN); if (CHECK_FLAG(node->flags, LS_NODE_FLAG)) stream_putc(s, node->node_flag); if (CHECK_FLAG(node->flags, LS_NODE_TYPE)) @@ -1487,26 +1490,32 @@ static int ls_format_attributes(struct stream *s, struct ls_attributes *attr) if (CHECK_FLAG(attr->flags, LS_ATTR_USE_BW)) stream_putf(s, attr->extended.used_bw); if (CHECK_FLAG(attr->flags, LS_ATTR_ADJ_SID)) { - stream_putl(s, attr->adj_sid[0].sid); - stream_putc(s, attr->adj_sid[0].flags); - stream_putc(s, attr->adj_sid[0].weight); - if (attr->adv.origin == ISIS_L1 || attr->adv.origin == ISIS_L2) - stream_put(s, attr->adj_sid[0].neighbor.sysid, - ISO_SYS_ID_LEN); - else if (attr->adv.origin == OSPFv2) - stream_put_ipv4(s, - attr->adj_sid[0].neighbor.addr.s_addr); + stream_putl(s, attr->adj_sid[ADJ_PRI_IPV4].sid); + stream_putc(s, attr->adj_sid[ADJ_PRI_IPV4].flags); + stream_putc(s, attr->adj_sid[ADJ_PRI_IPV4].weight); + stream_put_ipv4( + s, attr->adj_sid[ADJ_PRI_IPV4].neighbor.addr.s_addr); } if (CHECK_FLAG(attr->flags, LS_ATTR_BCK_ADJ_SID)) { - stream_putl(s, attr->adj_sid[1].sid); - stream_putc(s, attr->adj_sid[1].flags); - stream_putc(s, attr->adj_sid[1].weight); - if (attr->adv.origin == ISIS_L1 || attr->adv.origin == ISIS_L2) - stream_put(s, attr->adj_sid[1].neighbor.sysid, - ISO_SYS_ID_LEN); - else if (attr->adv.origin == OSPFv2) - stream_put_ipv4(s, - attr->adj_sid[1].neighbor.addr.s_addr); + stream_putl(s, attr->adj_sid[ADJ_BCK_IPV4].sid); + stream_putc(s, attr->adj_sid[ADJ_BCK_IPV4].flags); + stream_putc(s, attr->adj_sid[ADJ_BCK_IPV4].weight); + stream_put_ipv4( + s, attr->adj_sid[ADJ_BCK_IPV4].neighbor.addr.s_addr); + } + if (CHECK_FLAG(attr->flags, LS_ATTR_ADJ_SID6)) { + stream_putl(s, attr->adj_sid[ADJ_PRI_IPV6].sid); + stream_putc(s, attr->adj_sid[ADJ_PRI_IPV6].flags); + stream_putc(s, attr->adj_sid[ADJ_PRI_IPV6].weight); + stream_put(s, attr->adj_sid[ADJ_PRI_IPV6].neighbor.sysid, + ISO_SYS_ID_LEN); + } + if (CHECK_FLAG(attr->flags, LS_ATTR_BCK_ADJ_SID6)) { + stream_putl(s, attr->adj_sid[ADJ_BCK_IPV6].sid); + stream_putc(s, attr->adj_sid[ADJ_BCK_IPV6].flags); + stream_putc(s, attr->adj_sid[ADJ_BCK_IPV6].weight); + stream_put(s, attr->adj_sid[ADJ_BCK_IPV6].neighbor.sysid, + ISO_SYS_ID_LEN); } if (CHECK_FLAG(attr->flags, LS_ATTR_SRLG)) { stream_putc(s, attr->srlg_len); @@ -1955,6 +1964,7 @@ static void ls_show_vertex_vty(struct ls_vertex *vertex, struct vty *vty, struct listnode *node; struct ls_node *lsn; struct ls_edge *edge; + struct ls_attributes *attr; struct ls_subnet *subnet; struct sbuf sbuf; uint32_t upper; @@ -2019,9 +2029,15 @@ static void ls_show_vertex_vty(struct ls_vertex *vertex, struct vty *vty, } else { sbuf_push(&sbuf, 6, "To:\t- (0.0.0.0)"); } - sbuf_push(&sbuf, 0, "\tLocal: %pI4\tRemote: %pI4\n", - &edge->attributes->standard.local, - &edge->attributes->standard.remote); + attr = edge->attributes; + if ((CHECK_FLAG(attr->flags, LS_ATTR_LOCAL_ADDR))) + sbuf_push(&sbuf, 0, "\tLocal: %pI4\tRemote: %pI4\n", + &attr->standard.local, + &attr->standard.remote); + else if ((CHECK_FLAG(attr->flags, LS_ATTR_LOCAL_ADDR6))) + sbuf_push(&sbuf, 0, "\tLocal: %pI6\tRemote: %pI6\n", + &attr->standard.local6, + &attr->standard.remote6); } sbuf_push(&sbuf, 4, "Incoming Edges: %d\n", @@ -2034,9 +2050,15 @@ static void ls_show_vertex_vty(struct ls_vertex *vertex, struct vty *vty, } else { sbuf_push(&sbuf, 6, "From:\t- (0.0.0.0)"); } - sbuf_push(&sbuf, 0, "\tRemote: %pI4\tLocal: %pI4\n", - &edge->attributes->standard.local, - &edge->attributes->standard.remote); + attr = edge->attributes; + if ((CHECK_FLAG(attr->flags, LS_ATTR_LOCAL_ADDR))) + sbuf_push(&sbuf, 0, "\tLocal: %pI4\tRemote: %pI4\n", + &attr->standard.local, + &attr->standard.remote); + else if ((CHECK_FLAG(attr->flags, LS_ATTR_LOCAL_ADDR6))) + sbuf_push(&sbuf, 0, "\tLocal: %pI6\tRemote: %pI6\n", + &attr->standard.local6, + &attr->standard.remote6); } sbuf_push(&sbuf, 4, "Subnets: %d\n", listcount(vertex->prefixes)); @@ -2071,7 +2093,7 @@ static void ls_show_vertex_json(struct ls_vertex *vertex, json_object_string_add(json, "router-id", buf); } if (CHECK_FLAG(lsn->flags, LS_NODE_ROUTER_ID6)) { - snprintfrr(buf, INET6_BUFSIZ, "%pI6", &lsn->router6_id); + snprintfrr(buf, INET6_BUFSIZ, "%pI6", &lsn->router_id6); json_object_string_add(json, "router-id-v6", buf); } if (CHECK_FLAG(lsn->flags, LS_NODE_TYPE)) @@ -2235,15 +2257,32 @@ static void ls_show_edge_vty(struct ls_edge *edge, struct vty *vty, sbuf_push(&sbuf, 4, "Utilized Bandwidth: %g (Bytes/s)\n", attr->extended.used_bw); if (CHECK_FLAG(attr->flags, LS_ATTR_ADJ_SID)) { - sbuf_push(&sbuf, 4, "Adjacency-SID: %u", attr->adj_sid[0].sid); + sbuf_push(&sbuf, 4, "IPv4 Adjacency-SID: %u", + attr->adj_sid[ADJ_PRI_IPV4].sid); sbuf_push(&sbuf, 0, "\tFlags: 0x%x\tWeight: 0x%x\n", - attr->adj_sid[0].flags, attr->adj_sid[0].weight); + attr->adj_sid[ADJ_PRI_IPV4].flags, + attr->adj_sid[ADJ_PRI_IPV4].weight); } if (CHECK_FLAG(attr->flags, LS_ATTR_BCK_ADJ_SID)) { - sbuf_push(&sbuf, 4, "Bck. Adjacency-SID: %u", - attr->adj_sid[1].sid); + sbuf_push(&sbuf, 4, "IPv4 Bck. Adjacency-SID: %u", + attr->adj_sid[ADJ_BCK_IPV4].sid); sbuf_push(&sbuf, 0, "\tFlags: 0x%x\tWeight: 0x%x\n", - attr->adj_sid[1].flags, attr->adj_sid[1].weight); + attr->adj_sid[ADJ_BCK_IPV4].flags, + attr->adj_sid[ADJ_BCK_IPV4].weight); + } + if (CHECK_FLAG(attr->flags, LS_ATTR_ADJ_SID6)) { + sbuf_push(&sbuf, 4, "IPv6 Adjacency-SID: %u", + attr->adj_sid[ADJ_PRI_IPV6].sid); + sbuf_push(&sbuf, 0, "\tFlags: 0x%x\tWeight: 0x%x\n", + attr->adj_sid[ADJ_PRI_IPV6].flags, + attr->adj_sid[ADJ_PRI_IPV6].weight); + } + if (CHECK_FLAG(attr->flags, LS_ATTR_BCK_ADJ_SID6)) { + sbuf_push(&sbuf, 4, "IPv6 Bck. Adjacency-SID: %u", + attr->adj_sid[ADJ_BCK_IPV6].sid); + sbuf_push(&sbuf, 0, "\tFlags: 0x%x\tWeight: 0x%x\n", + attr->adj_sid[ADJ_BCK_IPV6].flags, + attr->adj_sid[ADJ_BCK_IPV6].weight); } if (CHECK_FLAG(attr->flags, LS_ATTR_SRLG)) { sbuf_push(&sbuf, 4, "SRLGs: %d", attr->srlg_len); @@ -2374,10 +2413,12 @@ static void ls_show_edge_json(struct ls_edge *edge, struct json_object *json) jsr = json_object_new_array(); json_object_object_add(json, "segment-routing", jsr); jobj = json_object_new_object(); - json_object_int_add(jobj, "adj-sid", attr->adj_sid[0].sid); - snprintfrr(buf, 6, "0x%x", attr->adj_sid[0].flags); + json_object_int_add(jobj, "adj-sid", + attr->adj_sid[ADJ_PRI_IPV4].sid); + snprintfrr(buf, 6, "0x%x", attr->adj_sid[ADJ_PRI_IPV4].flags); json_object_string_add(jobj, "flags", buf); - json_object_int_add(jobj, "weight", attr->adj_sid[0].weight); + json_object_int_add(jobj, "weight", + attr->adj_sid[ADJ_PRI_IPV4].weight); json_object_array_add(jsr, jobj); } if (CHECK_FLAG(attr->flags, LS_ATTR_BCK_ADJ_SID)) { @@ -2386,10 +2427,38 @@ static void ls_show_edge_json(struct ls_edge *edge, struct json_object *json) json_object_object_add(json, "segment-routing", jsr); } jobj = json_object_new_object(); - json_object_int_add(jobj, "adj-sid", attr->adj_sid[1].sid); - snprintfrr(buf, 6, "0x%x", attr->adj_sid[1].flags); + json_object_int_add(jobj, "adj-sid", + attr->adj_sid[ADJ_BCK_IPV4].sid); + snprintfrr(buf, 6, "0x%x", attr->adj_sid[ADJ_BCK_IPV4].flags); json_object_string_add(jobj, "flags", buf); - json_object_int_add(jobj, "weight", attr->adj_sid[1].weight); + json_object_int_add(jobj, "weight", + attr->adj_sid[ADJ_BCK_IPV4].weight); + json_object_array_add(jsr, jobj); + } + if (CHECK_FLAG(attr->flags, LS_ATTR_ADJ_SID6)) { + jsr = json_object_new_array(); + json_object_object_add(json, "segment-routing", jsr); + jobj = json_object_new_object(); + json_object_int_add(jobj, "adj-sid", + attr->adj_sid[ADJ_PRI_IPV6].sid); + snprintfrr(buf, 6, "0x%x", attr->adj_sid[ADJ_PRI_IPV6].flags); + json_object_string_add(jobj, "flags", buf); + json_object_int_add(jobj, "weight", + attr->adj_sid[ADJ_PRI_IPV6].weight); + json_object_array_add(jsr, jobj); + } + if (CHECK_FLAG(attr->flags, LS_ATTR_BCK_ADJ_SID6)) { + if (!jsr) { + jsr = json_object_new_array(); + json_object_object_add(json, "segment-routing", jsr); + } + jobj = json_object_new_object(); + json_object_int_add(jobj, "adj-sid", + attr->adj_sid[ADJ_BCK_IPV6].sid); + snprintfrr(buf, 6, "0x%x", attr->adj_sid[ADJ_BCK_IPV6].flags); + json_object_string_add(jobj, "flags", buf); + json_object_int_add(jobj, "weight", + attr->adj_sid[ADJ_BCK_IPV6].weight); json_object_array_add(jsr, jobj); } } diff --git a/lib/link_state.h b/lib/link_state.h index 981e8b5285..761e8b6a27 100644 --- a/lib/link_state.h +++ b/lib/link_state.h @@ -122,7 +122,7 @@ struct ls_node { struct ls_node_id adv; /* Adv. Router of this Link State */ char name[MAX_NAME_LENGTH]; /* Name of the Node (IS-IS only) */ struct in_addr router_id; /* IPv4 Router ID */ - struct in6_addr router6_id; /* IPv6 Router ID */ + struct in6_addr router_id6; /* IPv6 Router ID */ uint8_t node_flag; /* IS-IS or OSPF Node flag */ enum ls_node_type type; /* Type of Node */ uint32_t as_number; /* Local or neighbor AS number */ @@ -166,6 +166,8 @@ struct ls_node { #define LS_ATTR_USE_BW 0x00400000 #define LS_ATTR_ADJ_SID 0x01000000 #define LS_ATTR_BCK_ADJ_SID 0x02000000 +#define LS_ATTR_ADJ_SID6 0x04000000 +#define LS_ATTR_BCK_ADJ_SID6 0x08000000 #define LS_ATTR_SRLG 0x10000000 /* Link State Attributes */ @@ -200,6 +202,11 @@ struct ls_attributes { float rsv_bw; /* Reserved Bandwidth */ float used_bw; /* Utilized Bandwidth */ } extended; +#define ADJ_PRI_IPV4 0 +#define ADJ_BCK_IPV4 1 +#define ADJ_PRI_IPV6 2 +#define ADJ_BCK_IPV6 3 +#define LS_ADJ_MAX 4 struct ls_adjacency { /* (LAN)-Adjacency SID for OSPF */ uint32_t sid; /* SID as MPLS label or index */ uint8_t flags; /* Flags */ @@ -208,7 +215,7 @@ struct ls_attributes { struct in_addr addr; /* Neighbor @IP for OSPF */ uint8_t sysid[ISO_SYS_ID_LEN]; /* or Sys-ID for ISIS */ } neighbor; - } adj_sid[2]; /* Primary & Backup (LAN)-Adj. SID */ + } adj_sid[4]; /* IPv4/IPv6 & Primary/Backup (LAN)-Adj. SID */ uint32_t *srlgs; /* List of Shared Risk Link Group */ uint8_t srlg_len; /* number of SRLG in the list */ }; @@ -412,21 +419,34 @@ struct ls_subnet { macro_inline int vertex_cmp(const struct ls_vertex *node1, const struct ls_vertex *node2) { - return (node1->key - node2->key); + return numcmp(node1->key, node2->key); } DECLARE_RBTREE_UNIQ(vertices, struct ls_vertex, entry, vertex_cmp); macro_inline int edge_cmp(const struct ls_edge *edge1, const struct ls_edge *edge2) { - return (edge1->key - edge2->key); + return numcmp(edge1->key, edge2->key); } DECLARE_RBTREE_UNIQ(edges, struct ls_edge, entry, edge_cmp); +/* + * Prefix comparison are done to the host part so, 10.0.0.1/24 + * and 10.0.0.2/24 are considered come different + */ macro_inline int subnet_cmp(const struct ls_subnet *a, - const struct ls_subnet *b) + const struct ls_subnet *b) { - return prefix_cmp(&a->key, &b->key); + if (a->key.family != b->key.family) + return numcmp(a->key.family, b->key.family); + + if (a->key.prefixlen != b->key.prefixlen) + return numcmp(a->key.prefixlen, b->key.prefixlen); + + if (a->key.family == AF_INET) + return memcmp(&a->key.u.val, &b->key.u.val, 4); + + return memcmp(&a->key.u.val, &b->key.u.val, 16); } DECLARE_RBTREE_UNIQ(subnets, struct ls_subnet, entry, subnet_cmp); @@ -503,6 +523,16 @@ extern struct ls_vertex *ls_vertex_update(struct ls_ted *ted, */ extern void ls_vertex_clean(struct ls_ted *ted, struct ls_vertex *vertex, struct zclient *zclient); + +/** + * This function convert the ISIS ISO system ID into a 64 bits unsigned integer + * following the architecture dependent byte order. + * + * @param sysid The ISO system ID + * @return Key as 64 bits unsigned integer + */ +extern uint64_t sysid_to_key(const uint8_t sysid[ISO_SYS_ID_LEN]); + /** * Find Vertex in the Link State DB by its unique key. * From d9884a758ca7b06e856476b4ba55758a6043fae4 Mon Sep 17 00:00:00 2001 From: Olivier Dugeon Date: Tue, 22 Jun 2021 19:59:02 +0200 Subject: [PATCH 3/5] isisd: Prepare IS-IS for Link State support In order to provide Link State Traffic Engineering features to IS-IS, this patch adds some modifications to base IS-IS: - Solve bug in lsp iterate function to avoid infinite loop in isis_lsp.c by adding condition to recurse call - Add new trigger event to parse LSP in isis_lsp.c - Add new TE debug flag to track Traffic Engineering events in isisd.[c,h] - Correct small bug in isis_tlvs.c where delay and min/max delay are not correctly handle - Handle Opaque LSA Traffic Engineering Zebra API in isis_zebra.[c,h] Signed-off-by: Olivier Dugeon --- isisd/isis_lsp.c | 51 +++++++++++++++++++++++++++++++--------------- isisd/isis_zebra.c | 28 +++++++++++++++++++++++++ isisd/isis_zebra.h | 1 + isisd/isisd.c | 42 ++++++++++++++++++++++++++++++++++++++ isisd/isisd.h | 9 +++++++- 5 files changed, 114 insertions(+), 17 deletions(-) diff --git a/isisd/isis_lsp.c b/isisd/isis_lsp.c index 94353a5bc8..92d329f035 100644 --- a/isisd/isis_lsp.c +++ b/isisd/isis_lsp.c @@ -124,6 +124,8 @@ static void lsp_destroy(struct isis_lsp *lsp) ISIS_FLAGS_CLEAR_ALL(lsp->SSNflags); + isis_te_lsp_event(lsp, LSP_DEL); + lsp_clear_data(lsp); if (!LSP_FRAGMENT(lsp->hdr.lsp_id)) { @@ -335,6 +337,7 @@ void lsp_inc_seqno(struct isis_lsp *lsp, uint32_t seqno) lsp_pack_pdu(lsp); isis_spf_schedule(lsp->area, lsp->level); + isis_te_lsp_event(lsp, LSP_INC); } static void lsp_purge_add_poi(struct isis_lsp *lsp, @@ -570,8 +573,10 @@ void lsp_update(struct isis_lsp *lsp, struct isis_lsp_hdr *hdr, lsp_link_fragment(lsp, lsp0); } - if (lsp->hdr.seqno) + if (lsp->hdr.seqno) { isis_spf_schedule(lsp->area, lsp->level); + isis_te_lsp_event(lsp, LSP_UPD); + } } /* creation of LSP directly from what we received */ @@ -636,8 +641,10 @@ struct isis_lsp *lsp_new(struct isis_area *area, uint8_t *lsp_id, void lsp_insert(struct lspdb_head *head, struct isis_lsp *lsp) { lspdb_add(head, lsp); - if (lsp->hdr.seqno) + if (lsp->hdr.seqno) { isis_spf_schedule(lsp->area, lsp->level); + isis_te_lsp_event(lsp, LSP_ADD); + } } /* @@ -1030,6 +1037,10 @@ static void lsp_build(struct isis_lsp *lsp, struct isis_area *area) cap.srlb.lower_bound = srdb->config.srlb_lower_bound; /* And finally MSD */ cap.msd = srdb->config.msd; + } else { + /* Disable SR Algorithm */ + cap.algo[0] = SR_ALGORITHM_UNSET; + cap.algo[1] = SR_ALGORITHM_UNSET; } isis_tlvs_set_router_capability(lsp->tlvs, &cap); @@ -2012,6 +2023,7 @@ int lsp_tick(struct thread *thread) /* 7.3.16.4 c) record the time to purge * FIXME */ isis_spf_schedule(lsp->area, lsp->level); + isis_te_lsp_event(lsp, LSP_TICK); } if (lsp->age_out == 0) { @@ -2166,7 +2178,7 @@ int isis_lsp_iterate_ip_reach(struct isis_lsp *lsp, int family, uint16_t mtid, if (lsp->hdr.seqno == 0 || lsp->hdr.rem_lifetime == 0) return LSP_ITER_CONTINUE; - /* Parse main LSP. */ + /* Parse LSP */ if (lsp->tlvs) { if (!fabricd && !pseudo_lsp && family == AF_INET && mtid == ISIS_MT_IPV4_UNICAST) { @@ -2236,13 +2248,17 @@ int isis_lsp_iterate_ip_reach(struct isis_lsp *lsp, int family, uint16_t mtid, } } - /* Parse LSP fragments. */ - for (ALL_LIST_ELEMENTS_RO(lsp->lspu.frags, node, frag)) { - if (!frag->tlvs) - continue; + /* Parse LSP fragments if it is not a fragment itself */ + if (!LSP_FRAGMENT(lsp->hdr.lsp_id)) + for (ALL_LIST_ELEMENTS_RO(lsp->lspu.frags, node, frag)) { + if (!frag->tlvs) + continue; - isis_lsp_iterate_ip_reach(frag, family, mtid, cb, arg); - } + if (isis_lsp_iterate_ip_reach(frag, family, mtid, cb, + arg) + == LSP_ITER_STOP) + return LSP_ITER_STOP; + } return LSP_ITER_CONTINUE; } @@ -2263,7 +2279,7 @@ int isis_lsp_iterate_is_reach(struct isis_lsp *lsp, uint16_t mtid, if (lsp->hdr.seqno == 0 || lsp->hdr.rem_lifetime == 0) return LSP_ITER_CONTINUE; - /* Parse main LSP. */ + /* Parse LSP */ if (lsp->tlvs) { if (pseudo_lsp || mtid == ISIS_MT_IPV4_UNICAST) { head = lsp->tlvs->oldstyle_reach.head; @@ -2295,13 +2311,16 @@ int isis_lsp_iterate_is_reach(struct isis_lsp *lsp, uint16_t mtid, } } - /* Parse LSP fragments. */ - for (ALL_LIST_ELEMENTS_RO(lsp->lspu.frags, node, frag)) { - if (!frag->tlvs) - continue; + /* Parse LSP fragments if it not a fragment itself. */ + if (!LSP_FRAGMENT(lsp->hdr.lsp_id)) + for (ALL_LIST_ELEMENTS_RO(lsp->lspu.frags, node, frag)) { + if (!frag->tlvs) + continue; - isis_lsp_iterate_is_reach(frag, mtid, cb, arg); - } + if (isis_lsp_iterate_is_reach(frag, mtid, cb, arg) + == LSP_ITER_STOP) + return LSP_ITER_STOP; + } return LSP_ITER_CONTINUE; } diff --git a/isisd/isis_zebra.c b/isisd/isis_zebra.c index 27e80e2501..52a5cdd64f 100644 --- a/isisd/isis_zebra.c +++ b/isisd/isis_zebra.c @@ -38,6 +38,7 @@ #include "vrf.h" #include "libfrr.h" #include "bfd.h" +#include "link_state.h" #include "isisd/isis_constants.h" #include "isisd/isis_common.h" @@ -747,6 +748,25 @@ static void isis_zebra_connected(struct zclient *zclient) bfd_client_sendmsg(zclient, ZEBRA_BFD_CLIENT_REGISTER, VRF_DEFAULT); } +/** + * Register / unregister Link State ZAPI Opaque Message + * + * @param up True to register, false to unregister + * + * @return 0 if success, -1 otherwise + */ +int isis_zebra_ls_register(bool up) +{ + int rc; + + if (up) + rc = ls_register(zclient, true); + else + rc = ls_unregister(zclient, true); + + return rc; +} + /* * opaque messages between processes */ @@ -754,6 +774,7 @@ static int isis_opaque_msg_handler(ZAPI_CALLBACK_ARGS) { struct stream *s; struct zapi_opaque_msg info; + struct zapi_opaque_reg_info dst; struct ldp_igp_sync_if_state state; struct ldp_igp_sync_announce announce; struct zapi_rlfa_response rlfa; @@ -764,6 +785,13 @@ static int isis_opaque_msg_handler(ZAPI_CALLBACK_ARGS) return -1; switch (info.type) { + case LINK_STATE_SYNC: + STREAM_GETC(s, dst.proto); + STREAM_GETW(s, dst.instance); + STREAM_GETL(s, dst.session_id); + dst.type = LINK_STATE_SYNC; + ret = isis_te_sync_ted(dst); + break; case LDP_IGP_SYNC_IF_STATE_UPDATE: STREAM_GET(&state, s, sizeof(state)); ret = isis_ldp_sync_state_update(state); diff --git a/isisd/isis_zebra.h b/isisd/isis_zebra.h index 348d7b3eab..84dc58ec6c 100644 --- a/isisd/isis_zebra.h +++ b/isisd/isis_zebra.h @@ -67,5 +67,6 @@ int isis_zebra_request_label_range(uint32_t base, uint32_t chunk_size); int isis_zebra_release_label_range(uint32_t start, uint32_t end); void isis_zebra_vrf_register(struct isis *isis); void isis_zebra_vrf_deregister(struct isis *isis); +int isis_zebra_ls_register(bool up); #endif /* _ZEBRA_ISIS_ZEBRA_H */ diff --git a/isisd/isisd.c b/isisd/isisd.c index b33f272f56..f00496c23f 100644 --- a/isisd/isisd.c +++ b/isisd/isisd.c @@ -81,6 +81,7 @@ unsigned long debug_tx_queue; unsigned long debug_sr; unsigned long debug_ldp_sync; unsigned long debug_lfa; +unsigned long debug_te; DEFINE_MGROUP(ISISD, "isisd"); @@ -1419,6 +1420,10 @@ void print_debug(struct vty *vty, int flags, int onoff) if (flags & DEBUG_SR) vty_out(vty, "IS-IS Segment Routing events debugging is %s\n", onoffs); + if (flags & DEBUG_TE) + vty_out(vty, + "IS-IS Traffic Engineering events debugging is %s\n", + onoffs); if (flags & DEBUG_LFA) vty_out(vty, "IS-IS LFA events debugging is %s\n", onoffs); if (flags & DEBUG_UPDATE_PACKETS) @@ -1461,6 +1466,8 @@ DEFUN_NOSH (show_debugging, print_debug(vty, DEBUG_SPF_EVENTS, 1); if (IS_DEBUG_SR) print_debug(vty, DEBUG_SR, 1); + if (IS_DEBUG_TE) + print_debug(vty, DEBUG_TE, 1); if (IS_DEBUG_UPDATE_PACKETS) print_debug(vty, DEBUG_UPDATE_PACKETS, 1); if (IS_DEBUG_RTE_EVENTS) @@ -1518,6 +1525,10 @@ static int config_write_debug(struct vty *vty) vty_out(vty, "debug " PROTO_NAME " sr-events\n"); write++; } + if (IS_DEBUG_TE) { + vty_out(vty, "debug " PROTO_NAME " te-events\n"); + write++; + } if (IS_DEBUG_LFA) { vty_out(vty, "debug " PROTO_NAME " lfa\n"); write++; @@ -1752,6 +1763,33 @@ DEFUN (no_debug_isis_srevents, return CMD_SUCCESS; } +DEFUN (debug_isis_teevents, + debug_isis_teevents_cmd, + "debug " PROTO_NAME " te-events", + DEBUG_STR + PROTO_HELP + "IS-IS Traffic Engineering Events\n") +{ + debug_te |= DEBUG_TE; + print_debug(vty, DEBUG_TE, 1); + + return CMD_SUCCESS; +} + +DEFUN (no_debug_isis_teevents, + no_debug_isis_teevents_cmd, + "no debug " PROTO_NAME " te-events", + NO_STR + UNDEBUG_STR + PROTO_HELP + "IS-IS Traffic Engineering Events\n") +{ + debug_te &= ~DEBUG_TE; + print_debug(vty, DEBUG_TE, 0); + + return CMD_SUCCESS; +} + DEFUN (debug_isis_lfa, debug_isis_lfa_cmd, "debug " PROTO_NAME " lfa", @@ -3140,6 +3178,8 @@ void isis_init(void) install_element(ENABLE_NODE, &no_debug_isis_spfevents_cmd); install_element(ENABLE_NODE, &debug_isis_srevents_cmd); install_element(ENABLE_NODE, &no_debug_isis_srevents_cmd); + install_element(ENABLE_NODE, &debug_isis_teevents_cmd); + install_element(ENABLE_NODE, &no_debug_isis_teevents_cmd); install_element(ENABLE_NODE, &debug_isis_lfa_cmd); install_element(ENABLE_NODE, &no_debug_isis_lfa_cmd); install_element(ENABLE_NODE, &debug_isis_rtevents_cmd); @@ -3171,6 +3211,8 @@ void isis_init(void) install_element(CONFIG_NODE, &no_debug_isis_spfevents_cmd); install_element(CONFIG_NODE, &debug_isis_srevents_cmd); install_element(CONFIG_NODE, &no_debug_isis_srevents_cmd); + install_element(CONFIG_NODE, &debug_isis_teevents_cmd); + install_element(CONFIG_NODE, &no_debug_isis_teevents_cmd); install_element(CONFIG_NODE, &debug_isis_lfa_cmd); install_element(CONFIG_NODE, &no_debug_isis_lfa_cmd); install_element(CONFIG_NODE, &debug_isis_rtevents_cmd); diff --git a/isisd/isisd.h b/isisd/isisd.h index 3febda1d87..7f8474a5f2 100644 --- a/isisd/isisd.h +++ b/isisd/isisd.h @@ -331,6 +331,7 @@ extern unsigned long debug_tx_queue; extern unsigned long debug_sr; extern unsigned long debug_ldp_sync; extern unsigned long debug_lfa; +extern unsigned long debug_te; #define DEBUG_ADJ_PACKETS (1<<0) #define DEBUG_SNP_PACKETS (1<<1) @@ -347,6 +348,7 @@ extern unsigned long debug_lfa; #define DEBUG_SR (1<<12) #define DEBUG_LDP_SYNC (1<<13) #define DEBUG_LFA (1<<14) +#define DEBUG_TE (1<<15) /* Debug related macro. */ #define IS_DEBUG_ADJ_PACKETS (debug_adj_pkt & DEBUG_ADJ_PACKETS) @@ -364,6 +366,7 @@ extern unsigned long debug_lfa; #define IS_DEBUG_SR (debug_sr & DEBUG_SR) #define IS_DEBUG_LDP_SYNC (debug_ldp_sync & DEBUG_LDP_SYNC) #define IS_DEBUG_LFA (debug_lfa & DEBUG_LFA) +#define IS_DEBUG_TE (debug_te & DEBUG_TE) #define lsp_debug(...) \ do { \ @@ -383,6 +386,10 @@ extern unsigned long debug_lfa; zlog_debug(__VA_ARGS__); \ } while (0) -#define DEBUG_TE DEBUG_LSP_GEN +#define te_debug(...) \ + do { \ + if (IS_DEBUG_TE) \ + zlog_debug(__VA_ARGS__); \ + } while (0) #endif /* ISISD_H */ From ed6189a9b5c6597b18fe789953595ac335ac2aa3 Mon Sep 17 00:00:00 2001 From: Olivier Dugeon Date: Tue, 22 Jun 2021 20:18:00 +0200 Subject: [PATCH 4/5] isisd: Add Link State Traffic Engineering support Add Link State TED features to isis_te.c and new CLI to export LS TED and show LS TED to IS-IS. IS-IS LSPs are parse each time a new LSP event occurs in order to update accordingly the Link State Traffic Engineering Database. LS TED could be exported through the ZAPI Opaque message (see sharpd as example). Signed-off-by: Olivier Dugeon --- doc/user/isisd.rst | 24 + isisd/isis_cli.c | 32 ++ isisd/isis_nb.c | 7 + isisd/isis_nb.h | 3 + isisd/isis_nb_config.c | 43 ++ isisd/isis_te.c | 1239 ++++++++++++++++++++++++++++++++++++++-- isisd/isis_te.h | 18 + yang/frr-isisd.yang | 6 + 8 files changed, 1334 insertions(+), 38 deletions(-) diff --git a/doc/user/isisd.rst b/doc/user/isisd.rst index 2bba3b9755..5d53f60f93 100644 --- a/doc/user/isisd.rst +++ b/doc/user/isisd.rst @@ -318,6 +318,11 @@ Traffic Engineering .. note:: + IS-IS-TE supports RFC 5305 (base TE), RFC 6119 (IPv6) and RFC 7810 / 8570 + (Extended Metric) with or without Multi-Topology. All Traffic Engineering + information are stored in a database formally named TED. However, best + acccuracy is provided without Multi-Topology due to inconsistency of Traffic + Engineering Advertisement of 3rd party commercial routers when MT is enabled. At this time, FRR offers partial support for some of the routing protocol extensions that can be used with MPLS-TE. FRR does not currently support a complete RSVP-TE solution. @@ -334,6 +339,11 @@ Traffic Engineering Configure stable IPv6 address for MPLS-TE. +.. clicmd:: mpls-te export + + Export Traffic Engineering DataBase to other daemons through the ZAPI + Opaque Link State messages. + .. clicmd:: show isis mpls-te interface .. clicmd:: show isis mpls-te interface INTERFACE @@ -344,6 +354,16 @@ Traffic Engineering Show Traffic Engineering router parameters. +.. clicmd:: show isis [vrf ] mpls-te database [detail|json] + +.. clicmd:: show isis [vrf ] mpls-te database vertex [WORD] [detail|json] + +.. clicmd:: show isis [vrf ] mpls-te database edge [A.B.C.D|X:X::X:X] [detail|json] + +.. clicmd:: show isis [vrf ] mpls-te database subnet [A.B.C.D/M|X:X::X:X/M] [detail|json] + + Show Traffic Engineering Database + .. seealso:: :ref:`ospf-traffic-engineering` @@ -449,6 +469,10 @@ Debugging ISIS Update related packets. +.. clicmd:: debug isis te-events + + IS-IS Traffic Engineering events + .. clicmd:: debug isis sr-events diff --git a/isisd/isis_cli.c b/isisd/isis_cli.c index b6f798bb25..70f14ecc93 100644 --- a/isisd/isis_cli.c +++ b/isisd/isis_cli.c @@ -1189,6 +1189,36 @@ DEFPY_YANG(isis_mpls_te_inter_as, isis_mpls_te_inter_as_cmd, return CMD_SUCCESS; } +/* + * XPath: /frr-isisd:isis/instance/mpls-te/export + */ +DEFPY_YANG(isis_mpls_te_export, isis_mpls_te_export_cmd, "mpls-te export", + MPLS_TE_STR "Enable export of MPLS-TE Link State information\n") +{ + nb_cli_enqueue_change(vty, "./mpls-te/export", NB_OP_MODIFY, "true"); + + return nb_cli_apply_changes(vty, NULL); +} + +DEFPY_YANG(no_isis_mpls_te_export, no_isis_mpls_te_export_cmd, + "no mpls-te export", + NO_STR MPLS_TE_STR + "Disable export of MPLS-TE Link State information\n") +{ + nb_cli_enqueue_change(vty, "./mpls-te/export", NB_OP_MODIFY, "false"); + + return nb_cli_apply_changes(vty, NULL); +} + +void cli_show_isis_mpls_te_export(struct vty *vty, const struct lyd_node *dnode, + bool show_defaults) +{ + if (!yang_dnode_get_bool(dnode, NULL)) + vty_out(vty, " no"); + + vty_out(vty, " mpls-te export\n"); +} + /* * XPath: /frr-isisd:isis/instance/default-information-originate */ @@ -3165,6 +3195,8 @@ void isis_cli_init(void) install_element(ISIS_NODE, &isis_mpls_te_router_addr_v6_cmd); install_element(ISIS_NODE, &no_isis_mpls_te_router_addr_v6_cmd); install_element(ISIS_NODE, &isis_mpls_te_inter_as_cmd); + install_element(ISIS_NODE, &isis_mpls_te_export_cmd); + install_element(ISIS_NODE, &no_isis_mpls_te_export_cmd); install_element(ISIS_NODE, &isis_default_originate_cmd); install_element(ISIS_NODE, &isis_redistribute_cmd); diff --git a/isisd/isis_nb.c b/isisd/isis_nb.c index 57d013b3d4..20e4806525 100644 --- a/isisd/isis_nb.c +++ b/isisd/isis_nb.c @@ -572,6 +572,13 @@ const struct frr_yang_module_info frr_isisd_info = { .cli_show = cli_show_isis_mpls_te_router_addr_ipv6, .destroy = isis_instance_mpls_te_router_address_ipv6_destroy, .modify = isis_instance_mpls_te_router_address_ipv6_modify, + } + }, + { + .xpath = "/frr-isisd:isis/instance/mpls-te/export", + .cbs = { + .cli_show = cli_show_isis_mpls_te_export, + .modify = isis_instance_mpls_te_export_modify, }, }, { diff --git a/isisd/isis_nb.h b/isisd/isis_nb.h index 11167096cc..96de64a68b 100644 --- a/isisd/isis_nb.h +++ b/isisd/isis_nb.h @@ -215,6 +215,7 @@ int isis_instance_mpls_te_router_address_ipv6_modify( struct nb_cb_modify_args *args); int isis_instance_mpls_te_router_address_ipv6_destroy( struct nb_cb_destroy_args *args); +int isis_instance_mpls_te_export_modify(struct nb_cb_modify_args *args); int lib_interface_isis_create(struct nb_cb_create_args *args); int lib_interface_isis_destroy(struct nb_cb_destroy_args *args); int lib_interface_isis_area_tag_modify(struct nb_cb_modify_args *args); @@ -470,6 +471,8 @@ void cli_show_isis_mpls_te_router_addr(struct vty *vty, void cli_show_isis_mpls_te_router_addr_ipv6(struct vty *vty, const struct lyd_node *dnode, bool show_defaults); +void cli_show_isis_mpls_te_export(struct vty *vty, const struct lyd_node *dnode, + bool show_defaults); void cli_show_isis_def_origin_ipv4(struct vty *vty, const struct lyd_node *dnode, bool show_defaults); diff --git a/isisd/isis_nb_config.c b/isisd/isis_nb_config.c index bf043c4f41..b1c7966681 100644 --- a/isisd/isis_nb_config.c +++ b/isisd/isis_nb_config.c @@ -33,6 +33,7 @@ #include "lib_errors.h" #include "vrf.h" #include "ldp_sync.h" +#include "link_state.h" #include "isisd/isisd.h" #include "isisd/isis_nb.h" @@ -51,6 +52,7 @@ #include "isisd/isis_redist.h" #include "isisd/isis_ldp_sync.h" #include "isisd/isis_dr.h" +#include "isisd/isis_zebra.h" DEFINE_MTYPE_STATIC(ISISD, ISIS_MPLS_TE, "ISIS MPLS_TE parameters"); DEFINE_MTYPE_STATIC(ISISD, ISIS_PLIST_NAME, "ISIS prefix-list name"); @@ -1827,12 +1829,19 @@ int isis_instance_mpls_te_create(struct nb_cb_create_args *args) new->inter_as = off; new->interas_areaid.s_addr = 0; new->router_id.s_addr = 0; + new->ted = ls_ted_new(1, "ISIS", 0); + if (!new->ted) + zlog_warn("Unable to create Link State Data Base"); area->mta = new; } else { area->mta->status = enable; } + /* Initialize Link State Database */ + if (area->mta->ted) + isis_te_init_ted(area); + /* Update Extended TLVs according to Interface link parameters */ for (ALL_LIST_ELEMENTS_RO(area->circuit_list, node, circuit)) isis_link_params_update(circuit, circuit->interface); @@ -1858,6 +1867,9 @@ int isis_instance_mpls_te_destroy(struct nb_cb_destroy_args *args) else return NB_OK; + /* Remove Link State Database */ + ls_ted_del_all(area->mta->ted); + /* Flush LSP if circuit engage */ for (ALL_LIST_ELEMENTS_RO(area->circuit_list, node, circuit)) { if (!IS_EXT_TE(circuit->ext)) @@ -1980,6 +1992,37 @@ int isis_instance_mpls_te_router_address_ipv6_destroy( return NB_OK; } +/* + * XPath: /frr-isisd:isis/instance/mpls-te/export + */ +int isis_instance_mpls_te_export_modify(struct nb_cb_modify_args *args) +{ + struct isis_area *area; + + if (args->event != NB_EV_APPLY) + return NB_OK; + + area = nb_running_get_entry(args->dnode, NULL, true); + /* only proceed if MPLS-TE is enabled */ + if (!IS_MPLS_TE(area->mta)) + return NB_OK; + + area->mta->export = yang_dnode_get_bool(args->dnode, NULL); + if (area->mta->export) { + if (IS_DEBUG_EVENTS) + zlog_debug("MPLS-TE: Enabled Link State export"); + if (isis_zebra_ls_register(true) != 0) + zlog_warn("Unable to register Link State\n"); + } else { + if (IS_DEBUG_EVENTS) + zlog_debug("MPLS-TE: Disable Link State export"); + if (isis_zebra_ls_register(false) != 0) + zlog_warn("Unable to register Link State\n"); + } + + return NB_OK; +} + /* * XPath: /frr-isisd:isis/instance/segment-routing/enabled */ diff --git a/isisd/isis_te.c b/isisd/isis_te.c index 348894fed5..93be70036e 100644 --- a/isisd/isis_te.c +++ b/isisd/isis_te.c @@ -43,6 +43,8 @@ #include "sockunion.h" #include "network.h" #include "sbuf.h" +#include "link_state.h" +#include "lib/json.h" #include "isisd/isis_constants.h" #include "isisd/isis_common.h" @@ -57,6 +59,8 @@ #include "isisd/isis_csm.h" #include "isisd/isis_adjacency.h" #include "isisd/isis_spf.h" +#include "isisd/isis_tlvs.h" +#include "isisd/isis_mt.h" #include "isisd/isis_te.h" #include "isisd/isis_zebra.h" @@ -82,14 +86,14 @@ void isis_link_params_update(struct isis_circuit *circuit, if ((ifp == NULL) || (circuit->state != C_STATE_UP)) return; - zlog_debug("TE(%s): Update circuit parameters for interface %s", - circuit->area->area_tag, ifp->name); + te_debug("ISIS-TE(%s): Update circuit parameters for interface %s", + circuit->area->area_tag, ifp->name); /* Check if MPLS TE Circuit context has not been already created */ if (circuit->ext == NULL) { circuit->ext = isis_alloc_ext_subtlvs(); - zlog_debug(" |- Allocated new Ext-subTLVs for interface %s", - ifp->name); + te_debug(" |- Allocated new Ext-subTLVs for interface %s", + ifp->name); } ext = circuit->ext; @@ -113,19 +117,6 @@ void isis_link_params_update(struct isis_circuit *circuit, } else UNSET_SUBTLV(ext, EXT_LOCAL_ADDR); - /* Same for Remote IPv4 address */ - if (circuit->circ_type == CIRCUIT_T_P2P) { - struct isis_adjacency *adj = circuit->u.p2p.neighbor; - - if (adj && adj->adj_state == ISIS_ADJ_UP - && adj->ipv4_address_count) { - IPV4_ADDR_COPY(&ext->neigh_addr, - &adj->ipv4_addresses[0]); - SET_SUBTLV(ext, EXT_NEIGH_ADDR); - } - } else - UNSET_SUBTLV(ext, EXT_NEIGH_ADDR); - /* If known, register local IPv6 addr from ip_addr list */ if (circuit->ipv6_non_link != NULL && listcount(circuit->ipv6_non_link) != 0) { @@ -137,18 +128,12 @@ void isis_link_params_update(struct isis_circuit *circuit, } else UNSET_SUBTLV(ext, EXT_LOCAL_ADDR6); - /* Same for Remote IPv6 address */ - if (circuit->circ_type == CIRCUIT_T_P2P) { - struct isis_adjacency *adj = circuit->u.p2p.neighbor; - - if (adj && adj->adj_state == ISIS_ADJ_UP - && adj->ipv6_address_count) { - IPV6_ADDR_COPY(&ext->neigh_addr6, - &adj->ipv6_addresses[0]); - SET_SUBTLV(ext, EXT_NEIGH_ADDR6); - } - } else - UNSET_SUBTLV(ext, EXT_NEIGH_ADDR6); + /* + * Remote IPv4 and IPv6 addresses are now added in + * isis_mpls_te_adj_ip_enabled() to get the right IP address + * in particular for IPv6 to get the global IPv6 address and + * not the link-local IPv6 address. + */ if (IS_PARAM_SET(ifp->link_params, LP_MAX_BW)) { ext->max_bw = ifp->link_params->max_bw; @@ -231,11 +216,11 @@ void isis_link_params_update(struct isis_circuit *circuit, UNSET_SUBTLV(ext, EXT_RMT_AS); UNSET_SUBTLV(ext, EXT_RMT_IP); } - zlog_debug(" |- New MPLS-TE link parameters status 0x%x", - ext->status); + te_debug(" |- New MPLS-TE link parameters status 0x%x", + ext->status); } else { - zlog_debug(" |- Reset Extended subTLVs status 0x%x", - ext->status); + te_debug(" |- Reset Extended subTLVs status 0x%x", + ext->status); /* Reset TE subTLVs keeping SR one's */ if (IS_SUBTLV(ext, EXT_ADJ_SID)) ext->status = EXT_ADJ_SID; @@ -266,10 +251,6 @@ static int isis_mpls_te_adj_ip_enabled(struct isis_adjacency *adj, int family, ext = circuit->ext; - /* Update MPLS TE IP address parameters if possible */ - if (!IS_MPLS_TE(circuit->area->mta) || !IS_EXT_TE(ext)) - return 0; - /* Determine nexthop IP address */ switch (family) { case AF_INET: @@ -369,6 +350,886 @@ int isis_mpls_te_update(struct interface *ifp) return rc; } + +/** + * Export Link State information to consumer daemon through ZAPI Link State + * Opaque Message. + * + * @param type Type of Link State Element i.e. Vertex, Edge or Subnet + * @param link_state Pointer to Link State Vertex, Edge or Subnet + * + * @return 0 if success, -1 otherwise + */ +static int isis_te_export(uint8_t type, void *link_state) +{ + struct ls_message msg = {}; + int rc = 0; + + switch (type) { + case LS_MSG_TYPE_NODE: + ls_vertex2msg(&msg, (struct ls_vertex *)link_state); + rc = ls_send_msg(zclient, &msg, NULL); + break; + case LS_MSG_TYPE_ATTRIBUTES: + ls_edge2msg(&msg, (struct ls_edge *)link_state); + rc = ls_send_msg(zclient, &msg, NULL); + break; + case LS_MSG_TYPE_PREFIX: + ls_subnet2msg(&msg, (struct ls_subnet *)link_state); + rc = ls_send_msg(zclient, &msg, NULL); + break; + default: + rc = -1; + break; + } + + return rc; +} + +/** + * Parse LSP and build corresponding vertex. If vertex doesn't exist in the + * Link State Database it is created otherwise updated. + * + * @param ted Traffic Engineering Link State Database + * @param lsp IS-IS Link State PDU + * + * @return Link State Vertex or NULL in case of error + */ +static struct ls_vertex *lsp_to_vertex(struct ls_ted *ted, struct isis_lsp *lsp) +{ + struct ls_vertex *vertex = NULL; + struct ls_node *old, lnode = {}; + struct isis_tlvs *tlvs; + const struct in_addr inaddr_any = {.s_addr = INADDR_ANY}; + + /* Sanity check */ + if (!ted || !lsp) + return NULL; + + /* Compute Link State Node ID from IS-IS sysID ... */ + if (lsp->level == ISIS_LEVEL1) + lnode.adv.origin = ISIS_L1; + else + lnode.adv.origin = ISIS_L2; + memcpy(&lnode.adv.id.iso.sys_id, &lsp->hdr.lsp_id, ISIS_SYS_ID_LEN); + lnode.adv.id.iso.level = lsp->level; + /* ... and search the corresponding vertex */ + vertex = ls_find_vertex_by_id(ted, lnode.adv); + /* Create a new one if not found */ + if (!vertex) { + old = ls_node_new(lnode.adv, inaddr_any, in6addr_any); + old->type = STANDARD; + vertex = ls_vertex_add(ted, old); + } + old = vertex->node; + te_debug(" |- %s Vertex (%" PRIu64 ") for node %s", + vertex->status == NEW ? "Create" : "Found", vertex->key, + print_sys_hostname(old->adv.id.iso.sys_id)); + + /* Fulfill Link State Node information */ + tlvs = lsp->tlvs; + if (tlvs) { + if (tlvs->te_router_id) { + IPV4_ADDR_COPY(&lnode.router_id, tlvs->te_router_id); + SET_FLAG(lnode.flags, LS_NODE_ROUTER_ID); + } + if (tlvs->te_router_id_ipv6) { + IPV6_ADDR_COPY(&lnode.router_id6, + tlvs->te_router_id_ipv6); + SET_FLAG(lnode.flags, LS_NODE_ROUTER_ID6); + } + if (tlvs->hostname) { + memcpy(&lnode.name, tlvs->hostname, MAX_NAME_LENGTH); + SET_FLAG(lnode.flags, LS_NODE_NAME); + } + if (tlvs->router_cap) { + struct isis_router_cap *cap = tlvs->router_cap; + + if (cap->srgb.lower_bound != 0 + && cap->srgb.range_size != 0) { + SET_FLAG(lnode.flags, LS_NODE_SR); + lnode.srgb.flag = cap->srgb.flags; + lnode.srgb.lower_bound = cap->srgb.lower_bound; + lnode.srgb.range_size = cap->srgb.range_size; + for (int i = 0; i < SR_ALGORITHM_COUNT; i++) + lnode.algo[i] = cap->algo[i]; + } + + if (cap->srlb.lower_bound != 0 + && cap->srlb.range_size != 0) { + lnode.srlb.lower_bound = cap->srlb.lower_bound; + lnode.srlb.range_size = cap->srlb.range_size; + SET_FLAG(lnode.flags, LS_NODE_SRLB); + } + if (cap->msd != 0) { + lnode.msd = cap->msd; + SET_FLAG(lnode.flags, LS_NODE_MSD); + } + } + } + + /* Update Link State Node information */ + if (!ls_node_same(old, &lnode)) { + te_debug(" |- Update Link State Node information"); + memcpy(old, &lnode, sizeof(struct ls_node)); + if (vertex->status != NEW) + vertex->status = UPDATE; + } + + /* Set self TED vertex if LSP corresponds to the own router */ + if (lsp->own_lsp) + ted->self = vertex; + + return vertex; +} + +/** + * Get Link State Edge from Link State Attributes in TE Database. + * Edge structure is dynamically allocated and fulfill with Link State + * Attributes if not found. + * + * @param ted Link State Database + * @param attr Link State Attributes + * + * @return New Link State Edge if success, NULL otherwise + */ +static struct ls_edge *get_edge(struct ls_ted *ted, struct ls_attributes *attr) +{ + struct ls_edge *edge; + struct ls_standard *std; + uint64_t key = 0; + + /* Check parameters */ + if (!ted || !attr) + return NULL; + + std = &attr->standard; + + /* Compute keys in function of local address (IPv4/v6) or identifier */ + if (CHECK_FLAG(attr->flags, LS_ATTR_LOCAL_ADDR)) + key = ((uint64_t)ntohl(std->local.s_addr)) & 0xffffffff; + else if (CHECK_FLAG(attr->flags, LS_ATTR_LOCAL_ADDR6)) + key = ((uint64_t)ntohl(std->local6.s6_addr32[2]) << 32 + | (uint64_t)ntohl(std->local6.s6_addr32[3])); + else if (CHECK_FLAG(attr->flags, LS_ATTR_LOCAL_ID)) + key = ((uint64_t)std->remote_id << 32) + | (((uint64_t)std->local_id) & 0xffffffff); + else + key = 0; + + /* Stop here if we don't got a valid key */ + if (key == 0) + return NULL; + + /* Get corresponding Edge by key from Link State Data Base */ + edge = ls_find_edge_by_key(ted, key); + + /* and create new one if not exist */ + if (!edge) { + edge = ls_edge_add(ted, attr); + /* + * Edge could be Null if no local ID is found in Attributes. + * Stop the processing as without any local ID it is not + * possible to store Edge in the TED. + */ + if (!edge) + return NULL; + } + + if (CHECK_FLAG(edge->attributes->flags, LS_ATTR_LOCAL_ADDR)) + te_debug(" |- %s Edge (%" PRIu64 + ") from Extended Reach. %pI4", + edge->status == NEW ? "Create" : "Found", edge->key, + &attr->standard.local); + else if (CHECK_FLAG(edge->attributes->flags, LS_ATTR_LOCAL_ADDR6)) + te_debug(" |- %s Edge (%" PRIu64 + ") from Extended Reach. %pI6", + edge->status == NEW ? "Create" : "Found", edge->key, + &attr->standard.local6); + else + te_debug(" |- %s Edge (%" PRIu64 ")", + edge->status == NEW ? "Create" : "Found", edge->key); + + return edge; +} + +/** + * Get Link State Attributes from IS-IS Sub-TLVs. Structure is dynamically + * allocated and should be free once not use anymore. + * + * @param adv Link State Node ID + * @param tlvs IS-IS Sub TLVs + * + * @return New Link State attributes if success, NULL otherwise + */ +static struct ls_attributes *get_attributes(struct ls_node_id adv, + struct isis_ext_subtlvs *tlvs) +{ + struct ls_attributes *attr; + struct in_addr local = {.s_addr = INADDR_ANY}; + struct in6_addr local6 = in6addr_any; + uint32_t local_id = 0; + + /* Got Local identifier */ + if (CHECK_FLAG(tlvs->status, EXT_LOCAL_ADDR)) + local.s_addr = tlvs->local_addr.s_addr; + + if (CHECK_FLAG(tlvs->status, EXT_LOCAL_ADDR6)) + memcpy(&local6, &tlvs->local_addr6, IPV6_MAX_BYTELEN); + + if (CHECK_FLAG(tlvs->status, EXT_LLRI)) + local_id = tlvs->local_llri; + + /* Create LS Attributes */ + attr = ls_attributes_new(adv, local, local6, local_id); + if (!attr) + return NULL; + + /* Browse sub-TLV and fulfill Link State Attributes */ + if (CHECK_FLAG(tlvs->status, EXT_ADM_GRP)) { + attr->standard.admin_group = tlvs->adm_group; + SET_FLAG(attr->flags, LS_ATTR_ADM_GRP); + } + if (CHECK_FLAG(tlvs->status, EXT_LLRI)) { + attr->standard.local_id = tlvs->local_llri; + attr->standard.remote_id = tlvs->remote_llri; + SET_FLAG(attr->flags, LS_ATTR_LOCAL_ID); + SET_FLAG(attr->flags, LS_ATTR_NEIGH_ID); + } + if (CHECK_FLAG(tlvs->status, EXT_NEIGH_ADDR)) { + attr->standard.remote.s_addr = tlvs->neigh_addr.s_addr; + SET_FLAG(attr->flags, LS_ATTR_NEIGH_ADDR); + } + if (CHECK_FLAG(tlvs->status, EXT_NEIGH_ADDR6)) { + memcpy(&attr->standard.remote6, &tlvs->neigh_addr6, + IPV6_MAX_BYTELEN); + SET_FLAG(attr->flags, LS_ATTR_NEIGH_ADDR6); + } + if (CHECK_FLAG(tlvs->status, EXT_MAX_BW)) { + attr->standard.max_bw = tlvs->max_bw; + SET_FLAG(attr->flags, LS_ATTR_MAX_BW); + } + if (CHECK_FLAG(tlvs->status, EXT_MAX_RSV_BW)) { + attr->standard.max_rsv_bw = tlvs->max_rsv_bw; + SET_FLAG(attr->flags, LS_ATTR_MAX_RSV_BW); + } + if (CHECK_FLAG(tlvs->status, EXT_UNRSV_BW)) { + memcpy(&attr->standard.unrsv_bw, tlvs->unrsv_bw, + ISIS_SUBTLV_UNRSV_BW_SIZE); + SET_FLAG(attr->flags, LS_ATTR_UNRSV_BW); + } + if (CHECK_FLAG(tlvs->status, EXT_TE_METRIC)) { + attr->standard.te_metric = tlvs->te_metric; + SET_FLAG(attr->flags, LS_ATTR_TE_METRIC); + } + if (CHECK_FLAG(tlvs->status, EXT_RMT_AS)) { + attr->standard.remote_as = tlvs->remote_as; + SET_FLAG(attr->flags, LS_ATTR_REMOTE_AS); + } + if (CHECK_FLAG(tlvs->status, EXT_RMT_IP)) { + attr->standard.remote_addr = tlvs->remote_ip; + SET_FLAG(attr->flags, LS_ATTR_REMOTE_ADDR); + } + if (CHECK_FLAG(tlvs->status, EXT_DELAY)) { + attr->extended.delay = tlvs->delay; + SET_FLAG(attr->flags, LS_ATTR_DELAY); + } + if (CHECK_FLAG(tlvs->status, EXT_MM_DELAY)) { + attr->extended.min_delay = tlvs->min_delay; + attr->extended.max_delay = tlvs->max_delay; + SET_FLAG(attr->flags, LS_ATTR_MIN_MAX_DELAY); + } + if (CHECK_FLAG(tlvs->status, EXT_DELAY_VAR)) { + attr->extended.jitter = tlvs->delay_var; + SET_FLAG(attr->flags, LS_ATTR_JITTER); + } + if (CHECK_FLAG(tlvs->status, EXT_PKT_LOSS)) { + attr->extended.pkt_loss = tlvs->pkt_loss; + SET_FLAG(attr->flags, LS_ATTR_PACKET_LOSS); + } + if (CHECK_FLAG(tlvs->status, EXT_AVA_BW)) { + attr->extended.ava_bw = tlvs->ava_bw; + SET_FLAG(attr->flags, LS_ATTR_AVA_BW); + } + if (CHECK_FLAG(tlvs->status, EXT_RES_BW)) { + attr->extended.rsv_bw = tlvs->res_bw; + SET_FLAG(attr->flags, LS_ATTR_RSV_BW); + } + if (CHECK_FLAG(tlvs->status, EXT_USE_BW)) { + attr->extended.used_bw = tlvs->use_bw; + SET_FLAG(attr->flags, LS_ATTR_USE_BW); + } + if (CHECK_FLAG(tlvs->status, EXT_ADJ_SID)) { + struct isis_adj_sid *adj = + (struct isis_adj_sid *)tlvs->adj_sid.head; + int i; + for (; adj; adj = adj->next) { + i = adj->flags & EXT_SUBTLV_LINK_ADJ_SID_BFLG ? 1 : 0; + i += adj->flags & EXT_SUBTLV_LINK_ADJ_SID_FFLG ? 2 : 0; + attr->adj_sid[i].flags = adj->flags; + attr->adj_sid[i].weight = adj->weight; + attr->adj_sid[i].sid = adj->sid; + switch (i) { + case ADJ_PRI_IPV4: + SET_FLAG(attr->flags, LS_ATTR_ADJ_SID); + break; + case ADJ_BCK_IPV4: + SET_FLAG(attr->flags, LS_ATTR_BCK_ADJ_SID); + break; + case ADJ_PRI_IPV6: + SET_FLAG(attr->flags, LS_ATTR_ADJ_SID6); + break; + case ADJ_BCK_IPV6: + SET_FLAG(attr->flags, LS_ATTR_BCK_ADJ_SID6); + break; + } + } + } + if (CHECK_FLAG(tlvs->status, EXT_LAN_ADJ_SID)) { + struct isis_lan_adj_sid *ladj = + (struct isis_lan_adj_sid *)tlvs->lan_sid.head; + int i; + for (; ladj; ladj = ladj->next) { + i = ladj->flags & EXT_SUBTLV_LINK_ADJ_SID_BFLG ? 1 : 0; + i += ladj->flags & EXT_SUBTLV_LINK_ADJ_SID_FFLG ? 2 : 0; + attr->adj_sid[i].flags = ladj->flags; + attr->adj_sid[i].weight = ladj->weight; + attr->adj_sid[i].sid = ladj->sid; + memcpy(&attr->adj_sid[i].neighbor.sysid, + &ladj->neighbor_id, ISIS_SYS_ID_LEN); + switch (i) { + case ADJ_PRI_IPV4: + SET_FLAG(attr->flags, LS_ATTR_ADJ_SID); + break; + case ADJ_BCK_IPV4: + SET_FLAG(attr->flags, LS_ATTR_BCK_ADJ_SID); + break; + case ADJ_PRI_IPV6: + SET_FLAG(attr->flags, LS_ATTR_ADJ_SID6); + break; + case ADJ_BCK_IPV6: + SET_FLAG(attr->flags, LS_ATTR_BCK_ADJ_SID6); + break; + } + } + } + + return attr; +} + +/** + * Parse Extended Reachability TLVs and create or update the corresponding + * Link State Edge and Attributes. Vertex connections are also updated if + * needed based on the remote IP address of the Edge and existing reverse Edge. + * + * @param id ID of Extended IS + * @param metric Metric of the link + * @param old_metric Boolean that indicate if it is an old metric (no TE) + * @param tlvs SubTlvs that contains TE information + * @param arg IS-IS TE argument (TED, Vertex, and export indication) + * + * @return 0 if success, -1 otherwise + */ +static int lsp_to_edge_cb(const uint8_t *id, uint32_t metric, bool old_metric, + struct isis_ext_subtlvs *tlvs, void *arg) +{ + struct isis_te_args *args = (struct isis_te_args *)arg; + struct ls_vertex *vertex; + struct ls_edge *edge, *dst; + struct ls_attributes *attr; + + te_debug(" |- Process Extended IS for %s", sysid_print(id)); + + /* Check parameters */ + if (old_metric || !args || !tlvs) + return LSP_ITER_CONTINUE; + + /* Initialize Link State Attributes */ + vertex = args->vertex; + attr = get_attributes(vertex->node->adv, tlvs); + /* + * Attributes may be Null if no local ID has been found in the LSP. + * Stop processing here as without any local ID it is not possible to + * create corresponding Edge in the TED. + */ + if (!attr) + return LSP_ITER_CONTINUE; + + attr->metric = metric; + + /* Get corresponding Edge from Link State Data Base */ + edge = get_edge(args->ted, attr); + /* + * Edge could be Null if no local ID has been found in Attributes. + * Stop processing here as without any local ID it is not possible to + * create corresponding Edge in the TED. + */ + if (!edge) { + ls_attributes_del(attr); + return LSP_ITER_CONTINUE; + } + + /* Update Attribute fields if there are different */ + if (edge->status != NEW) { + if (!ls_attributes_same(edge->attributes, attr)) { + te_debug(" |- Update Edge Attributes information"); + ls_attributes_del(edge->attributes); + edge->attributes = attr; + edge->status = UPDATE; + } else { + if (edge->attributes != attr) + ls_attributes_del(attr); + edge->status = SYNC; + } + } + + /* Try to update remote Link from remote address or reachability ID */ + te_debug(" |- Link Edge (%" PRIu64 ") to destination vertex (%s)", + edge->key, print_sys_hostname(id)); + dst = ls_find_edge_by_destination(args->ted, edge->attributes); + if (dst) { + /* Attach remote link if not set */ + if (edge->source && dst->destination == NULL) { + vertex = edge->source; + if (vertex->incoming_edges) + listnode_add_sort_nodup(vertex->incoming_edges, + dst); + dst->destination = vertex; + } + /* and destination vertex to this edge if not set */ + if (dst->source && edge->destination == NULL) { + vertex = dst->source; + if (vertex->incoming_edges) + listnode_add_sort_nodup(vertex->incoming_edges, + edge); + edge->destination = vertex; + } + } else { + /* Search dst. Vertex by Extended Reach. ID if not found */ + if (edge->destination == NULL) { + vertex = ls_find_vertex_by_key(args->ted, + sysid_to_key(id)); + if (vertex && vertex->incoming_edges) + listnode_add_sort_nodup(vertex->incoming_edges, + edge); + edge->destination = vertex; + } + } + + /* Update status and Export Link State Edge if needed */ + if (edge->status != SYNC) { + if (args->export) + isis_te_export(LS_MSG_TYPE_ATTRIBUTES, edge); + edge->status = SYNC; + } + + return LSP_ITER_CONTINUE; +} + +/** + * Parse Extended IP Reachability or MT IPv6 Reachability TLVs and create or + * update the corresponding Link State Subnet and Prefix. + * + * @param prefix Prefix associated to this subnet + * @param metric Metric of this prefix + * @param external Boolean to indicate if the prefix is external + * @param subtlvs Subtlvs if any (mostly Segment Routing ID) + * @param arg IS-IS TE argument (TED, Vertex, and export indication) + * + * @return 0 if success, -1 otherwise + */ +static int lsp_to_subnet_cb(const struct prefix *prefix, uint32_t metric, + bool external, struct isis_subtlvs *subtlvs, + void *arg) +{ + struct isis_te_args *args = (struct isis_te_args *)arg; + struct ls_vertex *vertex; + struct ls_subnet *subnet; + struct ls_prefix *ls_pref; + struct listnode *node; + struct ls_edge *edge; + struct ls_standard *std = NULL; + struct prefix p; + + /* Sanity Check */ + if (!args || !prefix) + return LSP_ITER_CONTINUE; + + te_debug(" |- Process Extended %s Reachability %pFX", + prefix->family == AF_INET ? "IP" : "IPv6", prefix); + + vertex = args->vertex; + + /* + * Prefix with mask different from /32 or /128 are advertised by at + * least 2 nodes. To avoid subnet attached to undetermined vertex, and + * gives the possibility to send the information to client e.g. BGP for + * Link State advertisement, we adjust the prefix with the corresponding + * IP address of the belonging interface when it is available. Other + * prefixes are kept unchanged. + */ + if (prefix->family == AF_INET && prefix->prefixlen < IPV4_MAX_BITLEN) { + std = NULL; + for (ALL_LIST_ELEMENTS_RO(vertex->outgoing_edges, node, edge)) { + if (!CHECK_FLAG(edge->attributes->flags, + LS_ATTR_LOCAL_ADDR)) + continue; + + p.u.prefix4 = edge->attributes->standard.local; + p.family = AF_INET; + p.prefixlen = prefix->prefixlen; + apply_mask_ipv4((struct prefix_ipv4 *)&p); + if (IPV4_ADDR_SAME(&p.u.prefix4, &prefix->u.prefix4)) { + std = &edge->attributes->standard; + break; + } + } + if (std) + p.u.prefix4 = std->local; + + } else if (prefix->family == AF_INET6 + && prefix->prefixlen < IPV6_MAX_BITLEN) { + std = NULL; + for (ALL_LIST_ELEMENTS_RO(vertex->outgoing_edges, node, edge)) { + if (!CHECK_FLAG(edge->attributes->flags, + LS_ATTR_LOCAL_ADDR6)) + continue; + + p.u.prefix6 = edge->attributes->standard.local6; + p.family = AF_INET6; + p.prefixlen = prefix->prefixlen; + apply_mask_ipv6((struct prefix_ipv6 *)&p); + if (IPV6_ADDR_SAME(&p.u.prefix6, &prefix->u.prefix6)) { + std = &edge->attributes->standard; + break; + } + } + if (std) + p.u.prefix6 = std->local6; + } + if (!std) + p = *prefix; + else + te_debug(" |- Adjust prefix %pFX with local address to: %pFX", + prefix, &p); + + /* Search existing Subnet in TED ... */ + subnet = ls_find_subnet(args->ted, p); + /* ... and create a new Subnet if not found */ + if (!subnet) { + ls_pref = ls_prefix_new(vertex->node->adv, p); + subnet = ls_subnet_add(args->ted, ls_pref); + if (!subnet) + return LSP_ITER_CONTINUE; + } + ls_pref = subnet->ls_pref; + + te_debug(" |- %s Subnet from prefix %pFX", + subnet->status == NEW ? "Create" : "Found", &p); + + /* Update Metric */ + if (!CHECK_FLAG(ls_pref->flags, LS_PREF_METRIC) + || (ls_pref->metric != metric)) { + ls_pref->metric = metric; + SET_FLAG(ls_pref->flags, LS_PREF_METRIC); + if (subnet->status != NEW) + subnet->status = UPDATE; + } else { + if (subnet->status == ORPHAN) + subnet->status = SYNC; + } + + /* Update Prefix SID if any */ + if (subtlvs && subtlvs->prefix_sids.count != 0) { + struct isis_prefix_sid *psid; + struct ls_sid sr = {}; + + psid = (struct isis_prefix_sid *)subtlvs->prefix_sids.head; + sr.algo = psid->algorithm; + sr.sid_flag = psid->flags; + sr.sid = psid->value; + + if (!CHECK_FLAG(ls_pref->flags, LS_PREF_SR) + || !memcmp(&ls_pref->sr, &sr, sizeof(struct ls_sid))) { + memcpy(&ls_pref->sr, &sr, sizeof(struct ls_sid)); + SET_FLAG(ls_pref->flags, LS_PREF_SR); + if (subnet->status != NEW) + subnet->status = UPDATE; + } else { + if (subnet->status == ORPHAN) + subnet->status = SYNC; + } + } else { + if (CHECK_FLAG(ls_pref->flags, LS_PREF_SR)) { + UNSET_FLAG(ls_pref->flags, LS_PREF_SR); + if (subnet->status != NEW) + subnet->status = UPDATE; + } else { + if (subnet->status == ORPHAN) + subnet->status = SYNC; + } + } + + /* Update status and Export Link State Edge if needed */ + if (subnet->status != SYNC) { + if (args->export) + isis_te_export(LS_MSG_TYPE_PREFIX, subnet); + subnet->status = SYNC; + } + + return LSP_ITER_CONTINUE; +} + +/** + * Parse ISIS LSP to fulfill the Link State Database + * + * @param ted Link State Database + * @param lsp ISIS Link State PDU + */ +static void isis_te_parse_lsp(struct mpls_te_area *mta, struct isis_lsp *lsp) +{ + struct ls_ted *ted; + struct ls_vertex *vertex; + struct ls_edge *edge; + struct ls_subnet *subnet; + struct listnode *node; + struct isis_te_args args; + + /* Sanity Check */ + if (!IS_MPLS_TE(mta) || !mta->ted || !lsp) + return; + + ted = mta->ted; + + te_debug("ISIS-TE(%s): Parse LSP %s", lsp->area->area_tag, + sysid_print(lsp->hdr.lsp_id)); + + /* First parse LSP to obtain the corresponding Vertex */ + vertex = lsp_to_vertex(ted, lsp); + if (!vertex) { + zlog_warn("Unable to build Vertex from LSP %s. Abort!", + sysid_print(lsp->hdr.lsp_id)); + return; + } + + /* Check if Vertex has been modified */ + if (vertex->status != SYNC) { + /* Vertex is out of sync: export it if requested */ + if (IS_EXPORT_TE(mta)) + isis_te_export(LS_MSG_TYPE_NODE, vertex); + vertex->status = SYNC; + } + + /* Mark outgoing Edges and Subnets as ORPHAN to detect deletion */ + for (ALL_LIST_ELEMENTS_RO(vertex->outgoing_edges, node, edge)) + edge->status = ORPHAN; + + for (ALL_LIST_ELEMENTS_RO(vertex->prefixes, node, subnet)) + subnet->status = ORPHAN; + + /* Process all Extended Reachability in LSP (all fragments) */ + args.ted = ted; + args.vertex = vertex; + args.export = mta->export; + isis_lsp_iterate_is_reach(lsp, ISIS_MT_IPV4_UNICAST, lsp_to_edge_cb, + &args); + + isis_lsp_iterate_is_reach(lsp, ISIS_MT_IPV6_UNICAST, lsp_to_edge_cb, + &args); + + /* Process all Extended IP (v4 & v6) in LSP (all fragments) */ + isis_lsp_iterate_ip_reach(lsp, AF_INET, ISIS_MT_IPV4_UNICAST, + lsp_to_subnet_cb, &args); + isis_lsp_iterate_ip_reach(lsp, AF_INET6, ISIS_MT_IPV6_UNICAST, + lsp_to_subnet_cb, &args); + isis_lsp_iterate_ip_reach(lsp, AF_INET6, ISIS_MT_IPV4_UNICAST, + lsp_to_subnet_cb, &args); + + /* Clean remaining Orphan Edges or Subnets */ + if (IS_EXPORT_TE(mta)) + ls_vertex_clean(ted, vertex, zclient); + else + ls_vertex_clean(ted, vertex, NULL); +} + +/** + * Delete Link State Database Vertex, Edge & Prefix that correspond to this + * ISIS Link State PDU + * + * @param ted Link State Database + * @param lsp ISIS Link State PDU + */ +static void isis_te_delete_lsp(struct mpls_te_area *mta, struct isis_lsp *lsp) +{ + struct ls_ted *ted; + struct ls_vertex *vertex = NULL; + struct ls_node lnode = {}; + struct ls_edge *edge; + struct ls_subnet *subnet; + struct listnode *nnode, *node; + + /* Sanity Check */ + if (!IS_MPLS_TE(mta) || !mta->ted || !lsp) + return; + + te_debug("ISIS-TE(%s): Delete Link State TED objects from LSP %s", + lsp->area->area_tag, sysid_print(lsp->hdr.lsp_id)); + + /* Compute Link State Node ID from IS-IS sysID ... */ + if (lsp->level == ISIS_LEVEL1) + lnode.adv.origin = ISIS_L1; + else + lnode.adv.origin = ISIS_L2; + memcpy(&lnode.adv.id.iso.sys_id, &lsp->hdr.lsp_id, ISIS_SYS_ID_LEN); + lnode.adv.id.iso.level = lsp->level; + ted = mta->ted; + /* ... and search the corresponding vertex */ + vertex = ls_find_vertex_by_id(ted, lnode.adv); + if (!vertex) + return; + + te_debug(" |- Delete Vertex %s", vertex->node->name); + + /* + * We can't use the ls_vertex_del_all() function if export TE is set, + * as we must first advertise the client daemons of each removal. + */ + /* Remove outgoing Edges */ + for (ALL_LIST_ELEMENTS(vertex->outgoing_edges, node, nnode, edge)) { + if (IS_EXPORT_TE(mta)) { + edge->status = DELETE; + isis_te_export(LS_MSG_TYPE_ATTRIBUTES, edge); + } + ls_edge_del_all(ted, edge); + } + + /* Disconnect incoming Edges */ + for (ALL_LIST_ELEMENTS(vertex->incoming_edges, node, nnode, edge)) { + ls_disconnect(vertex, edge, false); + if (edge->source == NULL) { + if (IS_EXPORT_TE(mta)) { + edge->status = DELETE; + isis_te_export(LS_MSG_TYPE_ATTRIBUTES, edge); + } + ls_edge_del_all(ted, edge); + } + } + + /* Remove subnets */ + for (ALL_LIST_ELEMENTS(vertex->prefixes, node, nnode, subnet)) { + if (IS_EXPORT_TE(mta)) { + subnet->status = DELETE; + isis_te_export(LS_MSG_TYPE_PREFIX, subnet); + } + ls_subnet_del_all(ted, subnet); + } + + /* Then remove Link State Node */ + if (IS_EXPORT_TE(mta)) { + vertex->status = DELETE; + isis_te_export(LS_MSG_TYPE_NODE, vertex); + } + ls_node_del(vertex->node); + + /* Finally, remove Vertex */ + ls_vertex_del(ted, vertex); +} + +/** + * Process ISIS LSP according to the event to add, update or remove + * corresponding vertex, edge and prefix in the Link State database. + * Since LSP could be fragmented, the function starts by searching the root LSP + * to retrieve the complete LSP, including eventual fragment before processing + * all of them. + * + * @param lsp ISIS Link State PDU + * @param event LSP event: ADD, UPD, INC & DEL (TICK are ignored) + * + */ +void isis_te_lsp_event(struct isis_lsp *lsp, enum lsp_event event) +{ + struct isis_area *area; + struct isis_lsp *lsp0; + + /* Sanity check */ + if (!lsp || !lsp->area) + return; + + area = lsp->area; + if (!IS_MPLS_TE(area->mta)) + return; + + /* Adjust LSP0 in case of fragment */ + if (LSP_FRAGMENT(lsp->hdr.lsp_id)) + lsp0 = lsp->lspu.zero_lsp; + else + lsp0 = lsp; + + /* Then process event */ + switch (event) { + case LSP_ADD: + case LSP_UPD: + case LSP_INC: + isis_te_parse_lsp(area->mta, lsp0); + break; + case LSP_DEL: + isis_te_delete_lsp(area->mta, lsp0); + break; + default: + break; + } +} + +/** + * Send the whole Link State Traffic Engineering Database to the consumer that + * request it through a ZAPI Link State Synchronous Opaque Message. + * + * @param info ZAPI Opaque message + * + * @return 0 if success, -1 otherwise + */ +int isis_te_sync_ted(struct zapi_opaque_reg_info dst) +{ + struct listnode *node, *inode; + struct isis *isis; + struct isis_area *area; + struct mpls_te_area *mta; + int rc = -1; + + te_debug("ISIS-TE(%s): Received TED synchro from client %d", __func__, + dst.proto); + /* For each area, send TED if TE distribution is enabled */ + for (ALL_LIST_ELEMENTS_RO(im->isis, inode, isis)) { + for (ALL_LIST_ELEMENTS_RO(isis->area_list, node, area)) { + mta = area->mta; + if (IS_MPLS_TE(mta) && IS_EXPORT_TE(mta)) { + te_debug(" |- Export TED from area %s", + area->area_tag); + rc = ls_sync_ted(mta->ted, zclient, &dst); + if (rc != 0) + return rc; + } + } + } + + return rc; +} + +/** + * Initialize the Link State database from the LSP already stored for this area + * + * @param area ISIS area + */ +void isis_te_init_ted(struct isis_area *area) +{ + struct isis_lsp *lsp; + + /* Iterate over all lsp. */ + for (int level = ISIS_LEVEL1; level <= ISIS_LEVELS; level++) + frr_each (lspdb, &area->lspdb[level - 1], lsp) + isis_te_parse_lsp(area->mta, lsp); +} + /* Followings are vty command functions */ #ifndef FABRICD @@ -603,7 +1464,308 @@ DEFUN (show_isis_mpls_te_interface, return CMD_SUCCESS; } -#endif + +/** + * Search Vertex in TED that corresponds to the given string that represent + * the ISO system ID in the forms [.-] + * + * @param ted Link State Database + * @param id ISO System ID + * @param isis Main reference to the isis daemon + * + * @return Vertex if found, NULL otherwise + */ +static struct ls_vertex *vertex_for_arg(struct ls_ted *ted, const char *id, + struct isis *isis) +{ + char sysid[255] = {0}; + uint8_t number[3]; + const char *pos; + uint8_t lspid[ISIS_SYS_ID_LEN + 2] = {0}; + struct isis_dynhn *dynhn; + uint64_t key = 0; + + if (!id) + return NULL; + + /* + * extract fragment and pseudo id from the string argv + * in the forms: + * (a) .- or + * (b) . or + * (c) or + * Where systemid is in the form: + * xxxx.xxxx.xxxx + */ + strlcpy(sysid, id, sizeof(sysid)); + if (strlen(id) > 3) { + pos = id + strlen(id) - 3; + if (strncmp(pos, "-", 1) == 0) { + memcpy(number, ++pos, 2); + lspid[ISIS_SYS_ID_LEN + 1] = + (uint8_t)strtol((char *)number, NULL, 16); + pos -= 4; + if (strncmp(pos, ".", 1) != 0) + return NULL; + } + if (strncmp(pos, ".", 1) == 0) { + memcpy(number, ++pos, 2); + lspid[ISIS_SYS_ID_LEN] = + (uint8_t)strtol((char *)number, NULL, 16); + sysid[pos - id - 1] = '\0'; + } + } + + /* + * Try to find the lsp-id if the argv + * string is in + * the form + * hostname.- + */ + if (sysid2buff(lspid, sysid)) { + key = sysid_to_key(lspid); + } else if ((dynhn = dynhn_find_by_name(isis, sysid))) { + memcpy(lspid, dynhn->id, ISIS_SYS_ID_LEN); + key = sysid_to_key(lspid); + } else if (strncmp(cmd_hostname_get(), sysid, 15) == 0) { + memcpy(lspid, isis->sysid, ISIS_SYS_ID_LEN); + key = sysid_to_key(lspid); + } + + if (key == 0) + return NULL; + + return ls_find_vertex_by_key(ted, key); +} + +/** + * Show Link State Traffic Engineering Database extracted from IS-IS LSP. + * + * @param vty VTY output console + * @param argv Command line argument + * @param argc Number of command line argument + * @param ted Traffic Engineering Database + * @param isis isis Main reference to the isis daemon + * + * @return Command Success if OK, Command Warning otherwise + */ +static int show_ted(struct vty *vty, struct cmd_token *argv[], int argc, + struct isis_area *area, struct isis *isis) +{ + int idx; + char *id; + struct in_addr ip_addr; + struct in6_addr ip6_addr; + struct prefix pref; + struct ls_ted *ted; + struct ls_vertex *vertex; + struct ls_edge *edge; + struct ls_subnet *subnet; + uint64_t key; + bool detail = false; + bool uj = use_json(argc, argv); + json_object *json = NULL; + + if (!IS_MPLS_TE(area->mta) || !area->mta->ted) { + vty_out(vty, "MPLS-TE is disabled for Area %s\n", + area->area_tag ? area->area_tag : "null"); + return CMD_SUCCESS; + } + + ted = area->mta->ted; + + if (uj) + json = json_object_new_object(); + else + vty_out(vty, "Area %s:\n", + area->area_tag ? area->area_tag : "null"); + + if (argv[argc - 1]->arg && strmatch(argv[argc - 1]->text, "detail")) + detail = true; + + idx = 4; + if (argv_find(argv, argc, "vertex", &idx)) { + /* Show Vertex */ + id = argv_find(argv, argc, "WORD", &idx) ? argv[idx]->arg + : NULL; + if (!id) + vertex = NULL; + else if (!strncmp(id, "self", 4)) + vertex = ted->self; + else { + vertex = vertex_for_arg(ted, id, isis); + if (!vertex) { + vty_out(vty, "No vertex found for ID %s\n", id); + return CMD_WARNING; + } + } + + if (vertex) + ls_show_vertex(vertex, vty, json, detail); + else + ls_show_vertices(ted, vty, json, detail); + + } else if (argv_find(argv, argc, "edge", &idx)) { + /* Show Edge */ + if (argv_find(argv, argc, "A.B.C.D", &idx)) { + if (!inet_pton(AF_INET, argv[idx]->arg, &ip_addr)) { + vty_out(vty, + "Specified Edge ID %s is invalid\n", + argv[idx]->arg); + return CMD_WARNING_CONFIG_FAILED; + } + /* Get the Edge from the Link State Database */ + key = ((uint64_t)ntohl(ip_addr.s_addr)) & 0xffffffff; + edge = ls_find_edge_by_key(ted, key); + if (!edge) { + vty_out(vty, "No edge found for ID %pI4\n", + &ip_addr); + return CMD_WARNING; + } + } else if (argv_find(argv, argc, "X:X::X:X", &idx)) { + if (!inet_pton(AF_INET6, argv[idx]->arg, &ip6_addr)) { + vty_out(vty, + "Specified Edge ID %s is invalid\n", + argv[idx]->arg); + return CMD_WARNING_CONFIG_FAILED; + } + /* Get the Edge from the Link State Database */ + key = (uint64_t)ntohl(ip6_addr.s6_addr32[3]) + | ((uint64_t)ntohl(ip6_addr.s6_addr32[2]) << 32); + edge = ls_find_edge_by_key(ted, key); + if (!edge) { + vty_out(vty, "No edge found for ID %pI6\n", + &ip6_addr); + return CMD_WARNING; + } + } else + edge = NULL; + + if (edge) + ls_show_edge(edge, vty, json, detail); + else + ls_show_edges(ted, vty, json, detail); + + } else if (argv_find(argv, argc, "subnet", &idx)) { + /* Show Subnet */ + if (argv_find(argv, argc, "A.B.C.D/M", &idx)) { + if (!str2prefix(argv[idx]->arg, &pref)) { + vty_out(vty, "Invalid prefix format %s\n", + argv[idx]->arg); + return CMD_WARNING_CONFIG_FAILED; + } + /* Get the Subnet from the Link State Database */ + subnet = ls_find_subnet(ted, pref); + if (!subnet) { + vty_out(vty, "No subnet found for ID %pFX\n", + &pref); + return CMD_WARNING; + } + } else if (argv_find(argv, argc, "X:X::X:X/M", &idx)) { + if (!str2prefix(argv[idx]->arg, &pref)) { + vty_out(vty, "Invalid prefix format %s\n", + argv[idx]->arg); + return CMD_WARNING_CONFIG_FAILED; + } + /* Get the Subnet from the Link State Database */ + subnet = ls_find_subnet(ted, pref); + if (!subnet) { + vty_out(vty, "No subnet found for ID %pFX\n", + &pref); + return CMD_WARNING; + } + } else + subnet = NULL; + + if (subnet) + ls_show_subnet(subnet, vty, json, detail); + else + ls_show_subnets(ted, vty, json, detail); + + } else { + /* Show the complete TED */ + ls_show_ted(ted, vty, json, detail); + } + + if (uj) { + vty_out(vty, "%s\n", + json_object_to_json_string_ext( + json, JSON_C_TO_STRING_PRETTY)); + json_object_free(json); + } + + return CMD_SUCCESS; +} + +/** + * Show ISIS Traffic Engineering Database + * + * @param vty VTY output console + * @param argv Command line argument + * @param argc Number of command line argument + * @param isis isis Main reference to the isis daemon + + * @return Command Success if OK, Command Warning otherwise + */ +static int show_isis_ted(struct vty *vty, struct cmd_token *argv[], int argc, + struct isis *isis) +{ + struct listnode *node; + struct isis_area *area; + int rc; + + for (ALL_LIST_ELEMENTS_RO(isis->area_list, node, area)) { + rc = show_ted(vty, argv, argc, area, isis); + if (rc != CMD_SUCCESS) + return rc; + } + return CMD_SUCCESS; +} + +DEFUN(show_isis_mpls_te_db, + show_isis_mpls_te_db_cmd, + "show " PROTO_NAME " [vrf ] mpls-te database [] [detail|json]", + SHOW_STR PROTO_HELP VRF_CMD_HELP_STR + "All VRFs\n" + MPLS_TE_STR + "MPLS-TE database\n" + "MPLS-TE Vertex\n" + "MPLS-TE Vertex ID (as an ISO ID, hostname or \"self\")\n" + "MPLS-TE Edge\n" + "MPLS-TE Edge ID (as an IPv4 address)\n" + "MPLS-TE Edge ID (as an IPv6 address)\n" + "MPLS-TE Subnet\n" + "MPLS-TE Subnet ID (as an IPv4 prefix)\n" + "MPLS-TE Subnet ID (as an IPv6 prefix)\n" + "Detailed information\n" + JSON_STR) +{ + int idx_vrf = 0; + const char *vrf_name = VRF_DEFAULT_NAME; + bool all_vrf = false; + struct listnode *node; + struct isis *isis; + int rc = CMD_WARNING; + + ISIS_FIND_VRF_ARGS(argv, argc, idx_vrf, vrf_name, all_vrf); + if (vrf_name) { + if (all_vrf) { + for (ALL_LIST_ELEMENTS_RO(im->isis, node, isis)) { + rc = show_isis_ted(vty, argv, argc, isis); + if (rc != CMD_SUCCESS) + return rc; + } + return CMD_SUCCESS; + } + isis = isis_lookup_by_vrfname(vrf_name); + if (isis) + rc = show_isis_ted(vty, argv, argc, isis); + } + + return rc; +} + +#endif /* #ifndef FRABRICD */ /* Initialize MPLS_TE */ void isis_mpls_te_init(void) @@ -618,6 +1780,7 @@ void isis_mpls_te_init(void) /* Register new VTY commands */ install_element(VIEW_NODE, &show_isis_mpls_te_router_cmd); install_element(VIEW_NODE, &show_isis_mpls_te_interface_cmd); + install_element(VIEW_NODE, &show_isis_mpls_te_db_cmd); #endif return; diff --git a/isisd/isis_te.h b/isisd/isis_te.h index e69ae40729..56954073dd 100644 --- a/isisd/isis_te.h +++ b/isisd/isis_te.h @@ -88,8 +88,10 @@ typedef enum _interas_mode_t { off, region, as, emulate } interas_mode_t; && e->status != EXT_ADJ_SID \ && e->status != EXT_LAN_ADJ_SID) #define IS_MPLS_TE(a) (a && a->status == enable) +#define IS_EXPORT_TE(a) (a->export) /* Per area MPLS-TE parameters */ +struct ls_ted; struct mpls_te_area { /* Status of MPLS-TE: enable or disable */ status_t status; @@ -104,11 +106,27 @@ struct mpls_te_area { /* MPLS_TE IPv4 & IPv6 Router IDs */ struct in_addr router_id; struct in6_addr router_id_ipv6; + + /* Link State Database */ + struct ls_ted *ted; + bool export; }; +/* Structure to provide parameters to lsp iterate callback function */ +struct isis_te_args { + struct ls_ted *ted; + struct ls_vertex *vertex; + bool export; +}; + +enum lsp_event { LSP_UNKNOWN, LSP_ADD, LSP_UPD, LSP_DEL, LSP_INC, LSP_TICK }; + /* Prototypes. */ void isis_mpls_te_init(void); void isis_link_params_update(struct isis_circuit *, struct interface *); int isis_mpls_te_update(struct interface *); +void isis_te_lsp_event(struct isis_lsp *lsp, enum lsp_event event); +int isis_te_sync_ted(struct zapi_opaque_reg_info dst); +void isis_te_init_ted(struct isis_area *area); #endif /* _ZEBRA_ISIS_MPLS_TE_H */ diff --git a/yang/frr-isisd.yang b/yang/frr-isisd.yang index 7a67a739ee..defb2b2038 100644 --- a/yang/frr-isisd.yang +++ b/yang/frr-isisd.yang @@ -1486,6 +1486,12 @@ module frr-isisd { description "Stable IPv6 address of the advertising router."; } + leaf export { + type boolean; + default "false"; + description + "Export Link State informatin."; + } } container segment-routing { From be95145ebc54d0c7e6105fa2de785b5ed37e49a6 Mon Sep 17 00:00:00 2001 From: Olivier Dugeon Date: Tue, 13 Jul 2021 15:26:55 +0200 Subject: [PATCH 5/5] topotests: Add new IS-IS Traffic Engineering tests Test the new Link State Traffic Engineering feature in IS-IS. Signed-off-by: Olivier Dugeon --- tests/topotests/isis_te_topo1/__init__.py | 0 tests/topotests/isis_te_topo1/r1/isisd.conf | 31 + tests/topotests/isis_te_topo1/r1/zebra.conf | 25 + tests/topotests/isis_te_topo1/r2/isisd.conf | 45 + tests/topotests/isis_te_topo1/r2/zebra.conf | 39 + tests/topotests/isis_te_topo1/r3/isisd.conf | 34 + tests/topotests/isis_te_topo1/r3/zebra.conf | 25 + tests/topotests/isis_te_topo1/r4/isisd.conf | 39 + tests/topotests/isis_te_topo1/r4/zebra.conf | 22 + .../isis_te_topo1/reference/ted_step1.json | 851 ++++++++++++++++ .../isis_te_topo1/reference/ted_step2.json | 651 ++++++++++++ .../isis_te_topo1/reference/ted_step3.json | 752 ++++++++++++++ .../isis_te_topo1/reference/ted_step4.json | 752 ++++++++++++++ .../isis_te_topo1/reference/ted_step5.json | 952 +++++++++++++++++ .../isis_te_topo1/reference/ted_step6.json | 953 ++++++++++++++++++ .../isis_te_topo1/test_isis_te_topo1.py | 265 +++++ 16 files changed, 5436 insertions(+) create mode 100755 tests/topotests/isis_te_topo1/__init__.py create mode 100644 tests/topotests/isis_te_topo1/r1/isisd.conf create mode 100644 tests/topotests/isis_te_topo1/r1/zebra.conf create mode 100644 tests/topotests/isis_te_topo1/r2/isisd.conf create mode 100644 tests/topotests/isis_te_topo1/r2/zebra.conf create mode 100644 tests/topotests/isis_te_topo1/r3/isisd.conf create mode 100644 tests/topotests/isis_te_topo1/r3/zebra.conf create mode 100644 tests/topotests/isis_te_topo1/r4/isisd.conf create mode 100644 tests/topotests/isis_te_topo1/r4/zebra.conf create mode 100644 tests/topotests/isis_te_topo1/reference/ted_step1.json create mode 100644 tests/topotests/isis_te_topo1/reference/ted_step2.json create mode 100644 tests/topotests/isis_te_topo1/reference/ted_step3.json create mode 100644 tests/topotests/isis_te_topo1/reference/ted_step4.json create mode 100644 tests/topotests/isis_te_topo1/reference/ted_step5.json create mode 100644 tests/topotests/isis_te_topo1/reference/ted_step6.json create mode 100644 tests/topotests/isis_te_topo1/test_isis_te_topo1.py diff --git a/tests/topotests/isis_te_topo1/__init__.py b/tests/topotests/isis_te_topo1/__init__.py new file mode 100755 index 0000000000..e69de29bb2 diff --git a/tests/topotests/isis_te_topo1/r1/isisd.conf b/tests/topotests/isis_te_topo1/r1/isisd.conf new file mode 100644 index 0000000000..938d713ced --- /dev/null +++ b/tests/topotests/isis_te_topo1/r1/isisd.conf @@ -0,0 +1,31 @@ +! +hostname r1 +! +interface lo + ip router isis TE + ipv6 router isis TE + isis circuit-type level-2-only + isis passive +! +interface r1-eth0 + ip router isis TE + isis circuit-type level-2-only + isis network point-to-point + isis hello-multiplier 3 +! +interface r1-eth1 + ip router isis TE + ipv6 router isis TE + isis circuit-type level-2-only + isis network point-to-point + isis hello-multiplier 3 +! +router isis TE + net 49.0000.0000.0000.0001.00 + is-type level-2-only + topology ipv6-unicast + lsp-timers gen-interval 2 refresh-interval 10 max-lifetime 350 + mpls-te on + mpls-te router-address 10.0.255.1 +! + diff --git a/tests/topotests/isis_te_topo1/r1/zebra.conf b/tests/topotests/isis_te_topo1/r1/zebra.conf new file mode 100644 index 0000000000..814d8f8c97 --- /dev/null +++ b/tests/topotests/isis_te_topo1/r1/zebra.conf @@ -0,0 +1,25 @@ +! +hostname r1 +! +interface lo + ip address 10.0.255.1/32 + ipv6 address 2001:db8:ffff::1/128 +! +interface r1-eth0 + ip address 10.0.0.1/24 + link-params + metric 20 + delay 10000 + ava-bw 1.25e+08 + enable + exit-link-params +! +interface r1-eth1 + ip address 10.0.1.1/24 + ipv6 address 2001:db8:1::1:1/64 + link-params + enable + exit-link-params +! +ip forwarding +! diff --git a/tests/topotests/isis_te_topo1/r2/isisd.conf b/tests/topotests/isis_te_topo1/r2/isisd.conf new file mode 100644 index 0000000000..f389e90762 --- /dev/null +++ b/tests/topotests/isis_te_topo1/r2/isisd.conf @@ -0,0 +1,45 @@ +! +hostname r2 +! +! debug isis te-events +! +interface lo + ip router isis TE + ipv6 router isis TE + isis circuit-type level-2-only + isis passive +! +interface r2-eth0 + ip router isis TE + isis circuit-type level-2-only + isis network point-to-point + isis hello-multiplier 3 +! +interface r2-eth1 + ip router isis TE + ipv6 router isis TE + isis circuit-type level-2-only + isis network point-to-point + isis hello-multiplier 3 +! +interface r2-eth2 + ip router isis TE + ipv6 router isis TE + isis circuit-type level-2-only + isis network point-to-point + isis hello-multiplier 3 +! +interface r2-eth3 + ip router isis TE + isis circuit-type level-2-only + isis network point-to-point + isis hello-multiplier 3 +! +router isis TE + net 49.0000.0000.0000.0002.00 + is-type level-2-only + topology ipv6-unicast + lsp-timers gen-interval 2 refresh-interval 10 max-lifetime 350 + mpls-te on + mpls-te router-address 10.0.255.2 +! diff --git a/tests/topotests/isis_te_topo1/r2/zebra.conf b/tests/topotests/isis_te_topo1/r2/zebra.conf new file mode 100644 index 0000000000..26b48ded78 --- /dev/null +++ b/tests/topotests/isis_te_topo1/r2/zebra.conf @@ -0,0 +1,39 @@ +! +hostname r2 +! +interface lo + ip address 10.0.255.2/32 + ipv6 address 2001:db8:ffff::2/128 +! +interface r2-eth0 + ip address 10.0.0.2/24 + link-params + enable + exit-link-params +! +interface r2-eth1 + ip address 10.0.1.2/24 + ipv6 address 2001:db8:1::1:2/64 + link-params + enable + exit-link-params +! +interface r2-eth2 + ip address 10.0.3.2/24 + ipv6 address 2001:db8:3::3:2/64 + link-params + enable + exit-link-params +! +interface r2-eth3 + ip address 10.0.4.2/24 + ipv6 address 2001:db8:4::4:2/64 + link-params + metric 30 + delay 25000 + use-bw 1.25e+8 + enable + exit-link-params +! +ip forwarding +! diff --git a/tests/topotests/isis_te_topo1/r3/isisd.conf b/tests/topotests/isis_te_topo1/r3/isisd.conf new file mode 100644 index 0000000000..4920a17c4c --- /dev/null +++ b/tests/topotests/isis_te_topo1/r3/isisd.conf @@ -0,0 +1,34 @@ +! +hostname r3 +! +! debug isis te-events +! +interface lo + ip router isis TE + ipv6 router isis TE + isis circuit-type level-2-only + isis passive +! +interface r3-eth0 + ip router isis TE + ipv6 router isis TE + isis circuit-type level-2-only + isis network point-to-point + isis hello-multiplier 3 +! +interface r3-eth1 + ipv6 router isis TE + isis circuit-type level-2-only + isis network point-to-point + isis hello-multiplier 3 +! +! +router isis TE + net 49.0000.0000.0000.0003.00 + is-type level-2-only + topology ipv6-unicast + lsp-timers gen-interval 2 refresh-interval 10 max-lifetime 350 + mpls-te on + mpls-te router-address 10.0.255.3 + mpls-te router-address ipv6 2001:db8:1000::3 +! diff --git a/tests/topotests/isis_te_topo1/r3/zebra.conf b/tests/topotests/isis_te_topo1/r3/zebra.conf new file mode 100644 index 0000000000..6a82f30d82 --- /dev/null +++ b/tests/topotests/isis_te_topo1/r3/zebra.conf @@ -0,0 +1,25 @@ +! +hostname r3 +! +interface lo + ip address 10.0.255.3/32 + ipv6 address 2001:db8:ffff::3/128 +! +interface r3-eth0 + ip address 10.0.3.3/24 + ipv6 address 2001:db8:3::3:3/64 + link-params + enable + admin-grp 0x20 + exit-link-params +! +interface r3-eth1 + ipv6 address 2001:db8:5::4:3/64 + link-params + enable + metric 10 + delay 50000 + exit-link-params +! +ip forwarding +! diff --git a/tests/topotests/isis_te_topo1/r4/isisd.conf b/tests/topotests/isis_te_topo1/r4/isisd.conf new file mode 100644 index 0000000000..51e9ba6dec --- /dev/null +++ b/tests/topotests/isis_te_topo1/r4/isisd.conf @@ -0,0 +1,39 @@ +! +hostname r4 +! +! debug isis te-events +! debug isis sr-events +! debug isis lsp-gen +! +interface lo + ip router isis TE + ipv6 router isis TE + isis circuit-type level-2-only + isis passive +! +interface r4-eth0 + ip router isis TE + isis circuit-type level-2-only + isis network point-to-point + isis hello-multiplier 3 +! +interface r4-eth1 + ipv6 router isis TE + isis circuit-type level-2-only + isis network point-to-point + isis hello-multiplier 3 +! +! +router isis TE + net 49.0000.0000.0000.0004.00 + is-type level-2-only + topology ipv6-unicast + lsp-timers gen-interval 2 refresh-interval 10 max-lifetime 350 + mpls-te on + mpls-te router-address 10.0.255.4 + segment-routing on + segment-routing global-block 10000 19999 local-block 5000 5999 + segment-routing node-msd 12 + segment-routing prefix 10.0.255.4/32 index 400 no-php-flag + segment-routing prefix 2001:db8:ffff::4/128 index 1400 no-php-flag +! diff --git a/tests/topotests/isis_te_topo1/r4/zebra.conf b/tests/topotests/isis_te_topo1/r4/zebra.conf new file mode 100644 index 0000000000..2f6a38e77a --- /dev/null +++ b/tests/topotests/isis_te_topo1/r4/zebra.conf @@ -0,0 +1,22 @@ +! +hostname r4 +! +interface lo + ip address 10.0.255.4/32 + ipv6 address 2001:db8:ffff::4/128 +! +interface r4-eth0 + ip address 10.0.4.4/24 + ipv6 address 2001:db8:4::2:4/64 + link-params + enable + exit-link-params +! +interface r4-eth1 + ipv6 address 2001:db8:5::3:4/64 + link-params + enable + exit-link-params +! +ip forwarding +! diff --git a/tests/topotests/isis_te_topo1/reference/ted_step1.json b/tests/topotests/isis_te_topo1/reference/ted_step1.json new file mode 100644 index 0000000000..7a47733801 --- /dev/null +++ b/tests/topotests/isis_te_topo1/reference/ted_step1.json @@ -0,0 +1,851 @@ +{ + "ted":{ + "name":"ISIS", + "key":1, + "verticesCount":4, + "edgesCount":14, + "subnetsCount":22, + "vertices":[ + { + "vertex-id":1, + "status":"Sync", + "origin":"ISIS_L2", + "name":"r1", + "router-id":"10.0.255.1" + }, + { + "vertex-id":2, + "status":"Sync", + "origin":"ISIS_L2", + "name":"r2", + "router-id":"10.0.255.2" + }, + { + "vertex-id":3, + "status":"Sync", + "origin":"ISIS_L2", + "name":"r3", + "router-id":"10.0.255.3", + "router-id-v6":"2001:db8:1000::3" + }, + { + "vertex-id":4, + "status":"Sync", + "origin":"ISIS_L2", + "name":"r4", + "router-id":"10.0.255.4", + "segment-routing":{ + "srgb-size":10000, + "srgb-lower":10000, + "algorithms":[ + { + "0":"SPF" + } + ], + "srlb-size":1000, + "srlb-lower":5000, + "msd":12 + } + } + ], + "edges":[ + { + "edge-id":65537, + "status":"Sync", + "origin":"ISIS_L2", + "advertised-router":"0000.0000.0001", + "local-vertex-id":1, + "remote-vertex-id":2, + "metric":10, + "edge-attributes":{ + "te-metric":0, + "local-address-v6":"2001:db8:1::1:1", + "remote-address-v6":"2001:db8:1::1:2", + "max-link-bandwidth":176258176.0, + "max-resv-link-bandwidth":176258176.0, + "unreserved-bandwidth":[ + { + "class-type-0":176258176.0 + }, + { + "class-type-1":176258176.0 + }, + { + "class-type-2":176258176.0 + }, + { + "class-type-3":176258176.0 + }, + { + "class-type-4":176258176.0 + }, + { + "class-type-5":176258176.0 + }, + { + "class-type-6":176258176.0 + }, + { + "class-type-7":176258176.0 + } + ] + } + }, + { + "edge-id":65538, + "status":"Sync", + "origin":"ISIS_L2", + "advertised-router":"0000.0000.0002", + "local-vertex-id":2, + "remote-vertex-id":1, + "metric":10, + "edge-attributes":{ + "te-metric":0, + "local-address-v6":"2001:db8:1::1:2", + "remote-address-v6":"2001:db8:1::1:1", + "max-link-bandwidth":176258176.0, + "max-resv-link-bandwidth":176258176.0, + "unreserved-bandwidth":[ + { + "class-type-0":176258176.0 + }, + { + "class-type-1":176258176.0 + }, + { + "class-type-2":176258176.0 + }, + { + "class-type-3":176258176.0 + }, + { + "class-type-4":176258176.0 + }, + { + "class-type-5":176258176.0 + }, + { + "class-type-6":176258176.0 + }, + { + "class-type-7":176258176.0 + } + ] + } + }, + { + "edge-id":196610, + "status":"Sync", + "origin":"ISIS_L2", + "advertised-router":"0000.0000.0002", + "local-vertex-id":2, + "remote-vertex-id":3, + "metric":10, + "edge-attributes":{ + "te-metric":0, + "local-address-v6":"2001:db8:3::3:2", + "remote-address-v6":"2001:db8:3::3:3", + "max-link-bandwidth":176258176.0, + "max-resv-link-bandwidth":176258176.0, + "unreserved-bandwidth":[ + { + "class-type-0":176258176.0 + }, + { + "class-type-1":176258176.0 + }, + { + "class-type-2":176258176.0 + }, + { + "class-type-3":176258176.0 + }, + { + "class-type-4":176258176.0 + }, + { + "class-type-5":176258176.0 + }, + { + "class-type-6":176258176.0 + }, + { + "class-type-7":176258176.0 + } + ] + } + }, + { + "edge-id":196611, + "status":"Sync", + "origin":"ISIS_L2", + "advertised-router":"0000.0000.0003", + "local-vertex-id":3, + "remote-vertex-id":2, + "metric":10, + "edge-attributes":{ + "te-metric":0, + "admin-group":32, + "local-address-v6":"2001:db8:3::3:3", + "remote-address-v6":"2001:db8:3::3:2", + "max-link-bandwidth":176258176.0, + "max-resv-link-bandwidth":176258176.0, + "unreserved-bandwidth":[ + { + "class-type-0":176258176.0 + }, + { + "class-type-1":176258176.0 + }, + { + "class-type-2":176258176.0 + }, + { + "class-type-3":176258176.0 + }, + { + "class-type-4":176258176.0 + }, + { + "class-type-5":176258176.0 + }, + { + "class-type-6":176258176.0 + }, + { + "class-type-7":176258176.0 + } + ] + } + }, + { + "edge-id":196612, + "status":"Sync", + "origin":"ISIS_L2", + "advertised-router":"0000.0000.0004", + "local-vertex-id":4, + "remote-vertex-id":3, + "metric":10, + "edge-attributes":{ + "te-metric":0, + "local-address-v6":"2001:db8:5::3:4", + "remote-address-v6":"2001:db8:5::4:3", + "max-link-bandwidth":176258176.0, + "max-resv-link-bandwidth":176258176.0, + "unreserved-bandwidth":[ + { + "class-type-0":176258176.0 + }, + { + "class-type-1":176258176.0 + }, + { + "class-type-2":176258176.0 + }, + { + "class-type-3":176258176.0 + }, + { + "class-type-4":176258176.0 + }, + { + "class-type-5":176258176.0 + }, + { + "class-type-6":176258176.0 + }, + { + "class-type-7":176258176.0 + } + ] + }, + "segment-routing":[ + { + "adj-sid":5001, + "flags":"0xb0", + "weight":0 + } + ] + }, + { + "edge-id":262147, + "status":"Sync", + "origin":"ISIS_L2", + "advertised-router":"0000.0000.0003", + "local-vertex-id":3, + "remote-vertex-id":4, + "metric":10, + "edge-attributes":{ + "te-metric":10, + "local-address-v6":"2001:db8:5::4:3", + "remote-address-v6":"2001:db8:5::3:4", + "max-link-bandwidth":176258176.0, + "max-resv-link-bandwidth":176258176.0, + "unreserved-bandwidth":[ + { + "class-type-0":176258176.0 + }, + { + "class-type-1":176258176.0 + }, + { + "class-type-2":176258176.0 + }, + { + "class-type-3":176258176.0 + }, + { + "class-type-4":176258176.0 + }, + { + "class-type-5":176258176.0 + }, + { + "class-type-6":176258176.0 + }, + { + "class-type-7":176258176.0 + } + ], + "delay":50000 + } + }, + { + "edge-id":167772161, + "status":"Sync", + "origin":"ISIS_L2", + "advertised-router":"0000.0000.0001", + "local-vertex-id":1, + "remote-vertex-id":2, + "metric":10, + "edge-attributes":{ + "te-metric":20, + "local-address":"10.0.0.1", + "remote-address":"10.0.0.2", + "max-link-bandwidth":176258176.0, + "max-resv-link-bandwidth":176258176.0, + "unreserved-bandwidth":[ + { + "class-type-0":176258176.0 + }, + { + "class-type-1":176258176.0 + }, + { + "class-type-2":176258176.0 + }, + { + "class-type-3":176258176.0 + }, + { + "class-type-4":176258176.0 + }, + { + "class-type-5":176258176.0 + }, + { + "class-type-6":176258176.0 + }, + { + "class-type-7":176258176.0 + } + ], + "delay":10000, + "available-bandwidth":125000000.0 + } + }, + { + "edge-id":167772162, + "status":"Sync", + "origin":"ISIS_L2", + "advertised-router":"0000.0000.0002", + "local-vertex-id":2, + "remote-vertex-id":1, + "metric":10, + "edge-attributes":{ + "te-metric":0, + "local-address":"10.0.0.2", + "remote-address":"10.0.0.1", + "max-link-bandwidth":176258176.0, + "max-resv-link-bandwidth":176258176.0, + "unreserved-bandwidth":[ + { + "class-type-0":176258176.0 + }, + { + "class-type-1":176258176.0 + }, + { + "class-type-2":176258176.0 + }, + { + "class-type-3":176258176.0 + }, + { + "class-type-4":176258176.0 + }, + { + "class-type-5":176258176.0 + }, + { + "class-type-6":176258176.0 + }, + { + "class-type-7":176258176.0 + } + ] + } + }, + { + "edge-id":167772417, + "status":"Sync", + "origin":"ISIS_L2", + "advertised-router":"0000.0000.0001", + "local-vertex-id":1, + "remote-vertex-id":2, + "metric":10, + "edge-attributes":{ + "te-metric":0, + "local-address":"10.0.1.1", + "remote-address":"10.0.1.2", + "max-link-bandwidth":176258176.0, + "max-resv-link-bandwidth":176258176.0, + "unreserved-bandwidth":[ + { + "class-type-0":176258176.0 + }, + { + "class-type-1":176258176.0 + }, + { + "class-type-2":176258176.0 + }, + { + "class-type-3":176258176.0 + }, + { + "class-type-4":176258176.0 + }, + { + "class-type-5":176258176.0 + }, + { + "class-type-6":176258176.0 + }, + { + "class-type-7":176258176.0 + } + ] + } + }, + { + "edge-id":167772418, + "status":"Sync", + "origin":"ISIS_L2", + "advertised-router":"0000.0000.0002", + "local-vertex-id":2, + "remote-vertex-id":1, + "metric":10, + "edge-attributes":{ + "te-metric":0, + "local-address":"10.0.1.2", + "remote-address":"10.0.1.1", + "max-link-bandwidth":176258176.0, + "max-resv-link-bandwidth":176258176.0, + "unreserved-bandwidth":[ + { + "class-type-0":176258176.0 + }, + { + "class-type-1":176258176.0 + }, + { + "class-type-2":176258176.0 + }, + { + "class-type-3":176258176.0 + }, + { + "class-type-4":176258176.0 + }, + { + "class-type-5":176258176.0 + }, + { + "class-type-6":176258176.0 + }, + { + "class-type-7":176258176.0 + } + ] + } + }, + { + "edge-id":167772930, + "status":"Sync", + "origin":"ISIS_L2", + "advertised-router":"0000.0000.0002", + "local-vertex-id":2, + "remote-vertex-id":3, + "metric":10, + "edge-attributes":{ + "te-metric":0, + "local-address":"10.0.3.2", + "remote-address":"10.0.3.3", + "max-link-bandwidth":176258176.0, + "max-resv-link-bandwidth":176258176.0, + "unreserved-bandwidth":[ + { + "class-type-0":176258176.0 + }, + { + "class-type-1":176258176.0 + }, + { + "class-type-2":176258176.0 + }, + { + "class-type-3":176258176.0 + }, + { + "class-type-4":176258176.0 + }, + { + "class-type-5":176258176.0 + }, + { + "class-type-6":176258176.0 + }, + { + "class-type-7":176258176.0 + } + ] + } + }, + { + "edge-id":167772931, + "status":"Sync", + "origin":"ISIS_L2", + "advertised-router":"0000.0000.0003", + "local-vertex-id":3, + "remote-vertex-id":2, + "metric":10, + "edge-attributes":{ + "te-metric":0, + "admin-group":32, + "local-address":"10.0.3.3", + "remote-address":"10.0.3.2", + "max-link-bandwidth":176258176.0, + "max-resv-link-bandwidth":176258176.0, + "unreserved-bandwidth":[ + { + "class-type-0":176258176.0 + }, + { + "class-type-1":176258176.0 + }, + { + "class-type-2":176258176.0 + }, + { + "class-type-3":176258176.0 + }, + { + "class-type-4":176258176.0 + }, + { + "class-type-5":176258176.0 + }, + { + "class-type-6":176258176.0 + }, + { + "class-type-7":176258176.0 + } + ] + } + }, + { + "edge-id":167773186, + "status":"Sync", + "origin":"ISIS_L2", + "advertised-router":"0000.0000.0002", + "local-vertex-id":2, + "remote-vertex-id":4, + "metric":10, + "edge-attributes":{ + "te-metric":30, + "local-address":"10.0.4.2", + "remote-address":"10.0.4.4", + "max-link-bandwidth":176258176.0, + "max-resv-link-bandwidth":176258176.0, + "unreserved-bandwidth":[ + { + "class-type-0":176258176.0 + }, + { + "class-type-1":176258176.0 + }, + { + "class-type-2":176258176.0 + }, + { + "class-type-3":176258176.0 + }, + { + "class-type-4":176258176.0 + }, + { + "class-type-5":176258176.0 + }, + { + "class-type-6":176258176.0 + }, + { + "class-type-7":176258176.0 + } + ], + "delay":25000, + "utilized-bandwidth":125000000.0 + } + }, + { + "edge-id":167773188, + "status":"Sync", + "origin":"ISIS_L2", + "advertised-router":"0000.0000.0004", + "local-vertex-id":4, + "remote-vertex-id":2, + "metric":10, + "edge-attributes":{ + "te-metric":0, + "local-address":"10.0.4.4", + "remote-address":"10.0.4.2", + "max-link-bandwidth":176258176.0, + "max-resv-link-bandwidth":176258176.0, + "unreserved-bandwidth":[ + { + "class-type-0":176258176.0 + }, + { + "class-type-1":176258176.0 + }, + { + "class-type-2":176258176.0 + }, + { + "class-type-3":176258176.0 + }, + { + "class-type-4":176258176.0 + }, + { + "class-type-5":176258176.0 + }, + { + "class-type-6":176258176.0 + }, + { + "class-type-7":176258176.0 + } + ] + }, + "segment-routing":[ + { + "adj-sid":5000, + "flags":"0x30", + "weight":0 + } + ] + } + ], + "subnets":[ + { + "subnet-id":"10.0.0.1\/24", + "status":"Sync", + "origin":"ISIS_L2", + "advertised-router":"0000.0000.0001", + "vertex-id":1, + "metric":10 + }, + { + "subnet-id":"10.0.0.2\/24", + "status":"Sync", + "origin":"ISIS_L2", + "advertised-router":"0000.0000.0002", + "vertex-id":2, + "metric":10 + }, + { + "subnet-id":"10.0.1.1\/24", + "status":"Sync", + "origin":"ISIS_L2", + "advertised-router":"0000.0000.0001", + "vertex-id":1, + "metric":10 + }, + { + "subnet-id":"10.0.1.2\/24", + "status":"Sync", + "origin":"ISIS_L2", + "advertised-router":"0000.0000.0002", + "vertex-id":2, + "metric":10 + }, + { + "subnet-id":"10.0.3.2\/24", + "status":"Sync", + "origin":"ISIS_L2", + "advertised-router":"0000.0000.0002", + "vertex-id":2, + "metric":10 + }, + { + "subnet-id":"10.0.3.3\/24", + "status":"Sync", + "origin":"ISIS_L2", + "advertised-router":"0000.0000.0003", + "vertex-id":3, + "metric":10 + }, + { + "subnet-id":"10.0.4.2\/24", + "status":"Sync", + "origin":"ISIS_L2", + "advertised-router":"0000.0000.0002", + "vertex-id":2, + "metric":10 + }, + { + "subnet-id":"10.0.4.4\/24", + "status":"Sync", + "origin":"ISIS_L2", + "advertised-router":"0000.0000.0004", + "vertex-id":4, + "metric":10 + }, + { + "subnet-id":"10.0.255.1\/32", + "status":"Sync", + "origin":"ISIS_L2", + "advertised-router":"0000.0000.0001", + "vertex-id":1, + "metric":10 + }, + { + "subnet-id":"10.0.255.2\/32", + "status":"Sync", + "origin":"ISIS_L2", + "advertised-router":"0000.0000.0002", + "vertex-id":2, + "metric":10 + }, + { + "subnet-id":"10.0.255.3\/32", + "status":"Sync", + "origin":"ISIS_L2", + "advertised-router":"0000.0000.0003", + "vertex-id":3, + "metric":10 + }, + { + "subnet-id":"10.0.255.4\/32", + "status":"Sync", + "origin":"ISIS_L2", + "advertised-router":"0000.0000.0004", + "vertex-id":4, + "metric":10, + "segment-routing":{ + "pref-sid":400, + "algo":0, + "flags":"0x60" + } + }, + { + "subnet-id":"2001:db8:1::1:1\/64", + "status":"Sync", + "origin":"ISIS_L2", + "advertised-router":"0000.0000.0001", + "vertex-id":1, + "metric":10 + }, + { + "subnet-id":"2001:db8:1::1:2\/64", + "status":"Sync", + "origin":"ISIS_L2", + "advertised-router":"0000.0000.0002", + "vertex-id":2, + "metric":10 + }, + { + "subnet-id":"2001:db8:3::3:2\/64", + "status":"Sync", + "origin":"ISIS_L2", + "advertised-router":"0000.0000.0002", + "vertex-id":2, + "metric":10 + }, + { + "subnet-id":"2001:db8:3::3:3\/64", + "status":"Sync", + "origin":"ISIS_L2", + "advertised-router":"0000.0000.0003", + "vertex-id":3, + "metric":10 + }, + { + "subnet-id":"2001:db8:5::3:4\/64", + "status":"Sync", + "origin":"ISIS_L2", + "advertised-router":"0000.0000.0004", + "vertex-id":4, + "metric":10 + }, + { + "subnet-id":"2001:db8:5::4:3\/64", + "status":"Sync", + "origin":"ISIS_L2", + "advertised-router":"0000.0000.0003", + "vertex-id":3, + "metric":10 + }, + { + "subnet-id":"2001:db8:ffff::1\/128", + "status":"Sync", + "origin":"ISIS_L2", + "advertised-router":"0000.0000.0001", + "vertex-id":1, + "metric":10 + }, + { + "subnet-id":"2001:db8:ffff::2\/128", + "status":"Sync", + "origin":"ISIS_L2", + "advertised-router":"0000.0000.0002", + "vertex-id":2, + "metric":10 + }, + { + "subnet-id":"2001:db8:ffff::3\/128", + "status":"Sync", + "origin":"ISIS_L2", + "advertised-router":"0000.0000.0003", + "vertex-id":3, + "metric":10 + }, + { + "subnet-id":"2001:db8:ffff::4\/128", + "status":"Sync", + "origin":"ISIS_L2", + "advertised-router":"0000.0000.0004", + "vertex-id":4, + "metric":10, + "segment-routing":{ + "pref-sid":1400, + "algo":0, + "flags":"0x60" + } + } + ] + } +} diff --git a/tests/topotests/isis_te_topo1/reference/ted_step2.json b/tests/topotests/isis_te_topo1/reference/ted_step2.json new file mode 100644 index 0000000000..8277e6d532 --- /dev/null +++ b/tests/topotests/isis_te_topo1/reference/ted_step2.json @@ -0,0 +1,651 @@ +{ + "ted":{ + "name":"ISIS", + "key":1, + "verticesCount":4, + "edgesCount":10, + "subnetsCount":18, + "vertices":[ + { + "vertex-id":1, + "status":"Sync", + "origin":"ISIS_L2", + "name":"r1", + "router-id":"10.0.255.1" + }, + { + "vertex-id":2, + "status":"Sync", + "origin":"ISIS_L2", + "name":"r2", + "router-id":"10.0.255.2" + }, + { + "vertex-id":3, + "status":"Sync", + "origin":"ISIS_L2", + "name":"r3", + "router-id":"10.0.255.3", + "router-id-v6":"2001:db8:1000::3" + }, + { + "vertex-id":4, + "status":"Sync", + "origin":"ISIS_L2", + "name":"r4", + "router-id":"10.0.255.4", + "segment-routing":{ + "srgb-size":10000, + "srgb-lower":10000, + "algorithms":[ + { + "0":"SPF" + } + ], + "srlb-size":1000, + "srlb-lower":5000, + "msd":12 + } + } + ], + "edges":[ + { + "edge-id":196610, + "status":"Sync", + "origin":"ISIS_L2", + "advertised-router":"0000.0000.0002", + "local-vertex-id":2, + "remote-vertex-id":3, + "metric":10, + "edge-attributes":{ + "te-metric":0, + "local-address-v6":"2001:db8:3::3:2", + "remote-address-v6":"2001:db8:3::3:3", + "max-link-bandwidth":176258176.0, + "max-resv-link-bandwidth":176258176.0, + "unreserved-bandwidth":[ + { + "class-type-0":176258176.0 + }, + { + "class-type-1":176258176.0 + }, + { + "class-type-2":176258176.0 + }, + { + "class-type-3":176258176.0 + }, + { + "class-type-4":176258176.0 + }, + { + "class-type-5":176258176.0 + }, + { + "class-type-6":176258176.0 + }, + { + "class-type-7":176258176.0 + } + ] + } + }, + { + "edge-id":196611, + "status":"Sync", + "origin":"ISIS_L2", + "advertised-router":"0000.0000.0003", + "local-vertex-id":3, + "remote-vertex-id":2, + "metric":10, + "edge-attributes":{ + "te-metric":0, + "admin-group":32, + "local-address-v6":"2001:db8:3::3:3", + "remote-address-v6":"2001:db8:3::3:2", + "max-link-bandwidth":176258176.0, + "max-resv-link-bandwidth":176258176.0, + "unreserved-bandwidth":[ + { + "class-type-0":176258176.0 + }, + { + "class-type-1":176258176.0 + }, + { + "class-type-2":176258176.0 + }, + { + "class-type-3":176258176.0 + }, + { + "class-type-4":176258176.0 + }, + { + "class-type-5":176258176.0 + }, + { + "class-type-6":176258176.0 + }, + { + "class-type-7":176258176.0 + } + ] + } + }, + { + "edge-id":196612, + "status":"Sync", + "origin":"ISIS_L2", + "advertised-router":"0000.0000.0004", + "local-vertex-id":4, + "remote-vertex-id":3, + "metric":10, + "edge-attributes":{ + "te-metric":0, + "local-address-v6":"2001:db8:5::3:4", + "remote-address-v6":"2001:db8:5::4:3", + "max-link-bandwidth":176258176.0, + "max-resv-link-bandwidth":176258176.0, + "unreserved-bandwidth":[ + { + "class-type-0":176258176.0 + }, + { + "class-type-1":176258176.0 + }, + { + "class-type-2":176258176.0 + }, + { + "class-type-3":176258176.0 + }, + { + "class-type-4":176258176.0 + }, + { + "class-type-5":176258176.0 + }, + { + "class-type-6":176258176.0 + }, + { + "class-type-7":176258176.0 + } + ] + }, + "segment-routing":[ + { + "adj-sid":5001, + "flags":"0xb0", + "weight":0 + } + ] + }, + { + "edge-id":262147, + "status":"Sync", + "origin":"ISIS_L2", + "advertised-router":"0000.0000.0003", + "local-vertex-id":3, + "remote-vertex-id":4, + "metric":10, + "edge-attributes":{ + "te-metric":10, + "local-address-v6":"2001:db8:5::4:3", + "remote-address-v6":"2001:db8:5::3:4", + "max-link-bandwidth":176258176.0, + "max-resv-link-bandwidth":176258176.0, + "unreserved-bandwidth":[ + { + "class-type-0":176258176.0 + }, + { + "class-type-1":176258176.0 + }, + { + "class-type-2":176258176.0 + }, + { + "class-type-3":176258176.0 + }, + { + "class-type-4":176258176.0 + }, + { + "class-type-5":176258176.0 + }, + { + "class-type-6":176258176.0 + }, + { + "class-type-7":176258176.0 + } + ], + "delay":50000 + } + }, + { + "edge-id":167772161, + "status":"Sync", + "origin":"ISIS_L2", + "advertised-router":"0000.0000.0001", + "local-vertex-id":1, + "remote-vertex-id":2, + "metric":10, + "edge-attributes":{ + "te-metric":20, + "local-address":"10.0.0.1", + "remote-address":"10.0.0.2", + "max-link-bandwidth":176258176.0, + "max-resv-link-bandwidth":176258176.0, + "unreserved-bandwidth":[ + { + "class-type-0":176258176.0 + }, + { + "class-type-1":176258176.0 + }, + { + "class-type-2":176258176.0 + }, + { + "class-type-3":176258176.0 + }, + { + "class-type-4":176258176.0 + }, + { + "class-type-5":176258176.0 + }, + { + "class-type-6":176258176.0 + }, + { + "class-type-7":176258176.0 + } + ], + "delay":10000, + "available-bandwidth":125000000.0 + } + }, + { + "edge-id":167772162, + "status":"Sync", + "origin":"ISIS_L2", + "advertised-router":"0000.0000.0002", + "local-vertex-id":2, + "remote-vertex-id":1, + "metric":10, + "edge-attributes":{ + "te-metric":0, + "local-address":"10.0.0.2", + "remote-address":"10.0.0.1", + "max-link-bandwidth":176258176.0, + "max-resv-link-bandwidth":176258176.0, + "unreserved-bandwidth":[ + { + "class-type-0":176258176.0 + }, + { + "class-type-1":176258176.0 + }, + { + "class-type-2":176258176.0 + }, + { + "class-type-3":176258176.0 + }, + { + "class-type-4":176258176.0 + }, + { + "class-type-5":176258176.0 + }, + { + "class-type-6":176258176.0 + }, + { + "class-type-7":176258176.0 + } + ] + } + }, + { + "edge-id":167772930, + "status":"Sync", + "origin":"ISIS_L2", + "advertised-router":"0000.0000.0002", + "local-vertex-id":2, + "remote-vertex-id":3, + "metric":10, + "edge-attributes":{ + "te-metric":0, + "local-address":"10.0.3.2", + "remote-address":"10.0.3.3", + "max-link-bandwidth":176258176.0, + "max-resv-link-bandwidth":176258176.0, + "unreserved-bandwidth":[ + { + "class-type-0":176258176.0 + }, + { + "class-type-1":176258176.0 + }, + { + "class-type-2":176258176.0 + }, + { + "class-type-3":176258176.0 + }, + { + "class-type-4":176258176.0 + }, + { + "class-type-5":176258176.0 + }, + { + "class-type-6":176258176.0 + }, + { + "class-type-7":176258176.0 + } + ] + } + }, + { + "edge-id":167772931, + "status":"Sync", + "origin":"ISIS_L2", + "advertised-router":"0000.0000.0003", + "local-vertex-id":3, + "remote-vertex-id":2, + "metric":10, + "edge-attributes":{ + "te-metric":0, + "admin-group":32, + "local-address":"10.0.3.3", + "remote-address":"10.0.3.2", + "max-link-bandwidth":176258176.0, + "max-resv-link-bandwidth":176258176.0, + "unreserved-bandwidth":[ + { + "class-type-0":176258176.0 + }, + { + "class-type-1":176258176.0 + }, + { + "class-type-2":176258176.0 + }, + { + "class-type-3":176258176.0 + }, + { + "class-type-4":176258176.0 + }, + { + "class-type-5":176258176.0 + }, + { + "class-type-6":176258176.0 + }, + { + "class-type-7":176258176.0 + } + ] + } + }, + { + "edge-id":167773186, + "status":"Sync", + "origin":"ISIS_L2", + "advertised-router":"0000.0000.0002", + "local-vertex-id":2, + "remote-vertex-id":4, + "metric":10, + "edge-attributes":{ + "te-metric":30, + "local-address":"10.0.4.2", + "remote-address":"10.0.4.4", + "max-link-bandwidth":176258176.0, + "max-resv-link-bandwidth":176258176.0, + "unreserved-bandwidth":[ + { + "class-type-0":176258176.0 + }, + { + "class-type-1":176258176.0 + }, + { + "class-type-2":176258176.0 + }, + { + "class-type-3":176258176.0 + }, + { + "class-type-4":176258176.0 + }, + { + "class-type-5":176258176.0 + }, + { + "class-type-6":176258176.0 + }, + { + "class-type-7":176258176.0 + } + ], + "delay":25000, + "utilized-bandwidth":125000000.0 + } + }, + { + "edge-id":167773188, + "status":"Sync", + "origin":"ISIS_L2", + "advertised-router":"0000.0000.0004", + "local-vertex-id":4, + "remote-vertex-id":2, + "metric":10, + "edge-attributes":{ + "te-metric":0, + "local-address":"10.0.4.4", + "remote-address":"10.0.4.2", + "max-link-bandwidth":176258176.0, + "max-resv-link-bandwidth":176258176.0, + "unreserved-bandwidth":[ + { + "class-type-0":176258176.0 + }, + { + "class-type-1":176258176.0 + }, + { + "class-type-2":176258176.0 + }, + { + "class-type-3":176258176.0 + }, + { + "class-type-4":176258176.0 + }, + { + "class-type-5":176258176.0 + }, + { + "class-type-6":176258176.0 + }, + { + "class-type-7":176258176.0 + } + ] + }, + "segment-routing":[ + { + "adj-sid":5000, + "flags":"0x30", + "weight":0 + } + ] + } + ], + "subnets":[ + { + "subnet-id":"10.0.0.1\/24", + "status":"Sync", + "origin":"ISIS_L2", + "advertised-router":"0000.0000.0001", + "vertex-id":1, + "metric":10 + }, + { + "subnet-id":"10.0.0.2\/24", + "status":"Sync", + "origin":"ISIS_L2", + "advertised-router":"0000.0000.0002", + "vertex-id":2, + "metric":10 + }, + { + "subnet-id":"10.0.3.2\/24", + "status":"Sync", + "origin":"ISIS_L2", + "advertised-router":"0000.0000.0002", + "vertex-id":2, + "metric":10 + }, + { + "subnet-id":"10.0.3.3\/24", + "status":"Sync", + "origin":"ISIS_L2", + "advertised-router":"0000.0000.0003", + "vertex-id":3, + "metric":10 + }, + { + "subnet-id":"10.0.4.2\/24", + "status":"Sync", + "origin":"ISIS_L2", + "advertised-router":"0000.0000.0002", + "vertex-id":2, + "metric":10 + }, + { + "subnet-id":"10.0.4.4\/24", + "status":"Sync", + "origin":"ISIS_L2", + "advertised-router":"0000.0000.0004", + "vertex-id":4, + "metric":10 + }, + { + "subnet-id":"10.0.255.1\/32", + "status":"Sync", + "origin":"ISIS_L2", + "advertised-router":"0000.0000.0001", + "vertex-id":1, + "metric":10 + }, + { + "subnet-id":"10.0.255.2\/32", + "status":"Sync", + "origin":"ISIS_L2", + "advertised-router":"0000.0000.0002", + "vertex-id":2, + "metric":10 + }, + { + "subnet-id":"10.0.255.3\/32", + "status":"Sync", + "origin":"ISIS_L2", + "advertised-router":"0000.0000.0003", + "vertex-id":3, + "metric":10 + }, + { + "subnet-id":"10.0.255.4\/32", + "status":"Sync", + "origin":"ISIS_L2", + "advertised-router":"0000.0000.0004", + "vertex-id":4, + "metric":10, + "segment-routing":{ + "pref-sid":400, + "algo":0, + "flags":"0x60" + } + }, + { + "subnet-id":"2001:db8:3::3:2\/64", + "status":"Sync", + "origin":"ISIS_L2", + "advertised-router":"0000.0000.0002", + "vertex-id":2, + "metric":10 + }, + { + "subnet-id":"2001:db8:3::3:3\/64", + "status":"Sync", + "origin":"ISIS_L2", + "advertised-router":"0000.0000.0003", + "vertex-id":3, + "metric":10 + }, + { + "subnet-id":"2001:db8:5::3:4\/64", + "status":"Sync", + "origin":"ISIS_L2", + "advertised-router":"0000.0000.0004", + "vertex-id":4, + "metric":10 + }, + { + "subnet-id":"2001:db8:5::4:3\/64", + "status":"Sync", + "origin":"ISIS_L2", + "advertised-router":"0000.0000.0003", + "vertex-id":3, + "metric":10 + }, + { + "subnet-id":"2001:db8:ffff::1\/128", + "status":"Sync", + "origin":"ISIS_L2", + "advertised-router":"0000.0000.0001", + "vertex-id":1, + "metric":10 + }, + { + "subnet-id":"2001:db8:ffff::2\/128", + "status":"Sync", + "origin":"ISIS_L2", + "advertised-router":"0000.0000.0002", + "vertex-id":2, + "metric":10 + }, + { + "subnet-id":"2001:db8:ffff::3\/128", + "status":"Sync", + "origin":"ISIS_L2", + "advertised-router":"0000.0000.0003", + "vertex-id":3, + "metric":10 + }, + { + "subnet-id":"2001:db8:ffff::4\/128", + "status":"Sync", + "origin":"ISIS_L2", + "advertised-router":"0000.0000.0004", + "vertex-id":4, + "metric":10, + "segment-routing":{ + "pref-sid":1400, + "algo":0, + "flags":"0x60" + } + } + ] + } +} diff --git a/tests/topotests/isis_te_topo1/reference/ted_step3.json b/tests/topotests/isis_te_topo1/reference/ted_step3.json new file mode 100644 index 0000000000..0ade398847 --- /dev/null +++ b/tests/topotests/isis_te_topo1/reference/ted_step3.json @@ -0,0 +1,752 @@ +{ + "ted":{ + "name":"ISIS", + "key":1, + "verticesCount":4, + "edgesCount":12, + "subnetsCount":20, + "vertices":[ + { + "vertex-id":1, + "status":"Sync", + "origin":"ISIS_L2", + "name":"r1", + "router-id":"10.0.255.1" + }, + { + "vertex-id":2, + "status":"Sync", + "origin":"ISIS_L2", + "name":"r2", + "router-id":"10.0.255.2" + }, + { + "vertex-id":3, + "status":"Sync", + "origin":"ISIS_L2", + "name":"r3", + "router-id":"10.0.255.3", + "router-id-v6":"2001:db8:1000::3" + }, + { + "vertex-id":4, + "status":"Sync", + "origin":"ISIS_L2", + "name":"r4", + "router-id":"10.0.255.4", + "segment-routing":{ + "srgb-size":10000, + "srgb-lower":10000, + "algorithms":[ + { + "0":"SPF" + } + ], + "srlb-size":1000, + "srlb-lower":5000, + "msd":12 + } + } + ], + "edges":[ + { + "edge-id":1, + "status":"Sync", + "origin":"ISIS_L2", + "advertised-router":"0000.0000.0001", + "local-vertex-id":1, + "remote-vertex-id":2, + "metric":10, + "edge-attributes":{ + "te-metric":20, + "local-address-v6":"2001:db8::1", + "remote-address-v6":"2001:db8::2", + "max-link-bandwidth":176258176.0, + "max-resv-link-bandwidth":176258176.0, + "unreserved-bandwidth":[ + { + "class-type-0":176258176.0 + }, + { + "class-type-1":176258176.0 + }, + { + "class-type-2":176258176.0 + }, + { + "class-type-3":176258176.0 + }, + { + "class-type-4":176258176.0 + }, + { + "class-type-5":176258176.0 + }, + { + "class-type-6":176258176.0 + }, + { + "class-type-7":176258176.0 + } + ], + "delay":10000, + "available-bandwidth":125000000.0 + } + }, + { + "edge-id":2, + "status":"Sync", + "origin":"ISIS_L2", + "advertised-router":"0000.0000.0002", + "local-vertex-id":2, + "remote-vertex-id":1, + "metric":10, + "edge-attributes":{ + "te-metric":0, + "local-address-v6":"2001:db8::2", + "max-link-bandwidth":176258176.0, + "max-resv-link-bandwidth":176258176.0, + "unreserved-bandwidth":[ + { + "class-type-0":176258176.0 + }, + { + "class-type-1":176258176.0 + }, + { + "class-type-2":176258176.0 + }, + { + "class-type-3":176258176.0 + }, + { + "class-type-4":176258176.0 + }, + { + "class-type-5":176258176.0 + }, + { + "class-type-6":176258176.0 + }, + { + "class-type-7":176258176.0 + } + ] + } + }, + { + "edge-id":196610, + "status":"Sync", + "origin":"ISIS_L2", + "advertised-router":"0000.0000.0002", + "local-vertex-id":2, + "remote-vertex-id":3, + "metric":10, + "edge-attributes":{ + "te-metric":0, + "local-address-v6":"2001:db8:3::3:2", + "remote-address-v6":"2001:db8:3::3:3", + "max-link-bandwidth":176258176.0, + "max-resv-link-bandwidth":176258176.0, + "unreserved-bandwidth":[ + { + "class-type-0":176258176.0 + }, + { + "class-type-1":176258176.0 + }, + { + "class-type-2":176258176.0 + }, + { + "class-type-3":176258176.0 + }, + { + "class-type-4":176258176.0 + }, + { + "class-type-5":176258176.0 + }, + { + "class-type-6":176258176.0 + }, + { + "class-type-7":176258176.0 + } + ] + } + }, + { + "edge-id":196611, + "status":"Sync", + "origin":"ISIS_L2", + "advertised-router":"0000.0000.0003", + "local-vertex-id":3, + "remote-vertex-id":2, + "metric":10, + "edge-attributes":{ + "te-metric":0, + "admin-group":32, + "local-address-v6":"2001:db8:3::3:3", + "remote-address-v6":"2001:db8:3::3:2", + "max-link-bandwidth":176258176.0, + "max-resv-link-bandwidth":176258176.0, + "unreserved-bandwidth":[ + { + "class-type-0":176258176.0 + }, + { + "class-type-1":176258176.0 + }, + { + "class-type-2":176258176.0 + }, + { + "class-type-3":176258176.0 + }, + { + "class-type-4":176258176.0 + }, + { + "class-type-5":176258176.0 + }, + { + "class-type-6":176258176.0 + }, + { + "class-type-7":176258176.0 + } + ] + } + }, + { + "edge-id":196612, + "status":"Sync", + "origin":"ISIS_L2", + "advertised-router":"0000.0000.0004", + "local-vertex-id":4, + "remote-vertex-id":3, + "metric":10, + "edge-attributes":{ + "te-metric":0, + "local-address-v6":"2001:db8:5::3:4", + "remote-address-v6":"2001:db8:5::4:3", + "max-link-bandwidth":176258176.0, + "max-resv-link-bandwidth":176258176.0, + "unreserved-bandwidth":[ + { + "class-type-0":176258176.0 + }, + { + "class-type-1":176258176.0 + }, + { + "class-type-2":176258176.0 + }, + { + "class-type-3":176258176.0 + }, + { + "class-type-4":176258176.0 + }, + { + "class-type-5":176258176.0 + }, + { + "class-type-6":176258176.0 + }, + { + "class-type-7":176258176.0 + } + ] + }, + "segment-routing":[ + { + "adj-sid":5001, + "flags":"0xb0", + "weight":0 + } + ] + }, + { + "edge-id":262147, + "status":"Sync", + "origin":"ISIS_L2", + "advertised-router":"0000.0000.0003", + "local-vertex-id":3, + "remote-vertex-id":4, + "metric":10, + "edge-attributes":{ + "te-metric":10, + "local-address-v6":"2001:db8:5::4:3", + "remote-address-v6":"2001:db8:5::3:4", + "max-link-bandwidth":176258176.0, + "max-resv-link-bandwidth":176258176.0, + "unreserved-bandwidth":[ + { + "class-type-0":176258176.0 + }, + { + "class-type-1":176258176.0 + }, + { + "class-type-2":176258176.0 + }, + { + "class-type-3":176258176.0 + }, + { + "class-type-4":176258176.0 + }, + { + "class-type-5":176258176.0 + }, + { + "class-type-6":176258176.0 + }, + { + "class-type-7":176258176.0 + } + ], + "delay":50000 + } + }, + { + "edge-id":167772161, + "status":"Sync", + "origin":"ISIS_L2", + "advertised-router":"0000.0000.0001", + "local-vertex-id":1, + "remote-vertex-id":2, + "metric":10, + "edge-attributes":{ + "te-metric":20, + "local-address":"10.0.0.1", + "remote-address":"10.0.0.2", + "max-link-bandwidth":176258176.0, + "max-resv-link-bandwidth":176258176.0, + "unreserved-bandwidth":[ + { + "class-type-0":176258176.0 + }, + { + "class-type-1":176258176.0 + }, + { + "class-type-2":176258176.0 + }, + { + "class-type-3":176258176.0 + }, + { + "class-type-4":176258176.0 + }, + { + "class-type-5":176258176.0 + }, + { + "class-type-6":176258176.0 + }, + { + "class-type-7":176258176.0 + } + ], + "delay":10000, + "available-bandwidth":125000000.0 + } + }, + { + "edge-id":167772162, + "status":"Sync", + "origin":"ISIS_L2", + "advertised-router":"0000.0000.0002", + "local-vertex-id":2, + "remote-vertex-id":1, + "metric":10, + "edge-attributes":{ + "te-metric":0, + "local-address":"10.0.0.2", + "remote-address":"10.0.0.1", + "max-link-bandwidth":176258176.0, + "max-resv-link-bandwidth":176258176.0, + "unreserved-bandwidth":[ + { + "class-type-0":176258176.0 + }, + { + "class-type-1":176258176.0 + }, + { + "class-type-2":176258176.0 + }, + { + "class-type-3":176258176.0 + }, + { + "class-type-4":176258176.0 + }, + { + "class-type-5":176258176.0 + }, + { + "class-type-6":176258176.0 + }, + { + "class-type-7":176258176.0 + } + ] + } + }, + { + "edge-id":167772930, + "status":"Sync", + "origin":"ISIS_L2", + "advertised-router":"0000.0000.0002", + "local-vertex-id":2, + "remote-vertex-id":3, + "metric":10, + "edge-attributes":{ + "te-metric":0, + "local-address":"10.0.3.2", + "remote-address":"10.0.3.3", + "max-link-bandwidth":176258176.0, + "max-resv-link-bandwidth":176258176.0, + "unreserved-bandwidth":[ + { + "class-type-0":176258176.0 + }, + { + "class-type-1":176258176.0 + }, + { + "class-type-2":176258176.0 + }, + { + "class-type-3":176258176.0 + }, + { + "class-type-4":176258176.0 + }, + { + "class-type-5":176258176.0 + }, + { + "class-type-6":176258176.0 + }, + { + "class-type-7":176258176.0 + } + ] + } + }, + { + "edge-id":167772931, + "status":"Sync", + "origin":"ISIS_L2", + "advertised-router":"0000.0000.0003", + "local-vertex-id":3, + "remote-vertex-id":2, + "metric":10, + "edge-attributes":{ + "te-metric":0, + "admin-group":32, + "local-address":"10.0.3.3", + "remote-address":"10.0.3.2", + "max-link-bandwidth":176258176.0, + "max-resv-link-bandwidth":176258176.0, + "unreserved-bandwidth":[ + { + "class-type-0":176258176.0 + }, + { + "class-type-1":176258176.0 + }, + { + "class-type-2":176258176.0 + }, + { + "class-type-3":176258176.0 + }, + { + "class-type-4":176258176.0 + }, + { + "class-type-5":176258176.0 + }, + { + "class-type-6":176258176.0 + }, + { + "class-type-7":176258176.0 + } + ] + } + }, + { + "edge-id":167773186, + "status":"Sync", + "origin":"ISIS_L2", + "advertised-router":"0000.0000.0002", + "local-vertex-id":2, + "remote-vertex-id":4, + "metric":10, + "edge-attributes":{ + "te-metric":30, + "local-address":"10.0.4.2", + "remote-address":"10.0.4.4", + "max-link-bandwidth":176258176.0, + "max-resv-link-bandwidth":176258176.0, + "unreserved-bandwidth":[ + { + "class-type-0":176258176.0 + }, + { + "class-type-1":176258176.0 + }, + { + "class-type-2":176258176.0 + }, + { + "class-type-3":176258176.0 + }, + { + "class-type-4":176258176.0 + }, + { + "class-type-5":176258176.0 + }, + { + "class-type-6":176258176.0 + }, + { + "class-type-7":176258176.0 + } + ], + "delay":25000, + "utilized-bandwidth":125000000.0 + } + }, + { + "edge-id":167773188, + "status":"Sync", + "origin":"ISIS_L2", + "advertised-router":"0000.0000.0004", + "local-vertex-id":4, + "remote-vertex-id":2, + "metric":10, + "edge-attributes":{ + "te-metric":0, + "local-address":"10.0.4.4", + "remote-address":"10.0.4.2", + "max-link-bandwidth":176258176.0, + "max-resv-link-bandwidth":176258176.0, + "unreserved-bandwidth":[ + { + "class-type-0":176258176.0 + }, + { + "class-type-1":176258176.0 + }, + { + "class-type-2":176258176.0 + }, + { + "class-type-3":176258176.0 + }, + { + "class-type-4":176258176.0 + }, + { + "class-type-5":176258176.0 + }, + { + "class-type-6":176258176.0 + }, + { + "class-type-7":176258176.0 + } + ] + }, + "segment-routing":[ + { + "adj-sid":5000, + "flags":"0x30", + "weight":0 + } + ] + } + ], + "subnets":[ + { + "subnet-id":"10.0.0.1\/24", + "status":"Sync", + "origin":"ISIS_L2", + "advertised-router":"0000.0000.0001", + "vertex-id":1, + "metric":10 + }, + { + "subnet-id":"10.0.0.2\/24", + "status":"Sync", + "origin":"ISIS_L2", + "advertised-router":"0000.0000.0002", + "vertex-id":2, + "metric":10 + }, + { + "subnet-id":"10.0.3.2\/24", + "status":"Sync", + "origin":"ISIS_L2", + "advertised-router":"0000.0000.0002", + "vertex-id":2, + "metric":10 + }, + { + "subnet-id":"10.0.3.3\/24", + "status":"Sync", + "origin":"ISIS_L2", + "advertised-router":"0000.0000.0003", + "vertex-id":3, + "metric":10 + }, + { + "subnet-id":"10.0.4.2\/24", + "status":"Sync", + "origin":"ISIS_L2", + "advertised-router":"0000.0000.0002", + "vertex-id":2, + "metric":10 + }, + { + "subnet-id":"10.0.4.4\/24", + "status":"Sync", + "origin":"ISIS_L2", + "advertised-router":"0000.0000.0004", + "vertex-id":4, + "metric":10 + }, + { + "subnet-id":"10.0.255.1\/32", + "status":"Sync", + "origin":"ISIS_L2", + "advertised-router":"0000.0000.0001", + "vertex-id":1, + "metric":10 + }, + { + "subnet-id":"10.0.255.2\/32", + "status":"Sync", + "origin":"ISIS_L2", + "advertised-router":"0000.0000.0002", + "vertex-id":2, + "metric":10 + }, + { + "subnet-id":"10.0.255.3\/32", + "status":"Sync", + "origin":"ISIS_L2", + "advertised-router":"0000.0000.0003", + "vertex-id":3, + "metric":10 + }, + { + "subnet-id":"10.0.255.4\/32", + "status":"Sync", + "origin":"ISIS_L2", + "advertised-router":"0000.0000.0004", + "vertex-id":4, + "metric":10, + "segment-routing":{ + "pref-sid":400, + "algo":0, + "flags":"0x60" + } + }, + { + "subnet-id":"2001:db8::1\/64", + "status":"Sync", + "origin":"ISIS_L2", + "advertised-router":"0000.0000.0001", + "vertex-id":1, + "metric":10 + }, + { + "subnet-id":"2001:db8::2\/64", + "status":"Sync", + "origin":"ISIS_L2", + "advertised-router":"0000.0000.0002", + "vertex-id":2, + "metric":10 + }, + { + "subnet-id":"2001:db8:3::3:2\/64", + "status":"Sync", + "origin":"ISIS_L2", + "advertised-router":"0000.0000.0002", + "vertex-id":2, + "metric":10 + }, + { + "subnet-id":"2001:db8:3::3:3\/64", + "status":"Sync", + "origin":"ISIS_L2", + "advertised-router":"0000.0000.0003", + "vertex-id":3, + "metric":10 + }, + { + "subnet-id":"2001:db8:5::3:4\/64", + "status":"Sync", + "origin":"ISIS_L2", + "advertised-router":"0000.0000.0004", + "vertex-id":4, + "metric":10 + }, + { + "subnet-id":"2001:db8:5::4:3\/64", + "status":"Sync", + "origin":"ISIS_L2", + "advertised-router":"0000.0000.0003", + "vertex-id":3, + "metric":10 + }, + { + "subnet-id":"2001:db8:ffff::1\/128", + "status":"Sync", + "origin":"ISIS_L2", + "advertised-router":"0000.0000.0001", + "vertex-id":1, + "metric":10 + }, + { + "subnet-id":"2001:db8:ffff::2\/128", + "status":"Sync", + "origin":"ISIS_L2", + "advertised-router":"0000.0000.0002", + "vertex-id":2, + "metric":10 + }, + { + "subnet-id":"2001:db8:ffff::3\/128", + "status":"Sync", + "origin":"ISIS_L2", + "advertised-router":"0000.0000.0003", + "vertex-id":3, + "metric":10 + }, + { + "subnet-id":"2001:db8:ffff::4\/128", + "status":"Sync", + "origin":"ISIS_L2", + "advertised-router":"0000.0000.0004", + "vertex-id":4, + "metric":10, + "segment-routing":{ + "pref-sid":1400, + "algo":0, + "flags":"0x60" + } + } + ] + } +} diff --git a/tests/topotests/isis_te_topo1/reference/ted_step4.json b/tests/topotests/isis_te_topo1/reference/ted_step4.json new file mode 100644 index 0000000000..0ade398847 --- /dev/null +++ b/tests/topotests/isis_te_topo1/reference/ted_step4.json @@ -0,0 +1,752 @@ +{ + "ted":{ + "name":"ISIS", + "key":1, + "verticesCount":4, + "edgesCount":12, + "subnetsCount":20, + "vertices":[ + { + "vertex-id":1, + "status":"Sync", + "origin":"ISIS_L2", + "name":"r1", + "router-id":"10.0.255.1" + }, + { + "vertex-id":2, + "status":"Sync", + "origin":"ISIS_L2", + "name":"r2", + "router-id":"10.0.255.2" + }, + { + "vertex-id":3, + "status":"Sync", + "origin":"ISIS_L2", + "name":"r3", + "router-id":"10.0.255.3", + "router-id-v6":"2001:db8:1000::3" + }, + { + "vertex-id":4, + "status":"Sync", + "origin":"ISIS_L2", + "name":"r4", + "router-id":"10.0.255.4", + "segment-routing":{ + "srgb-size":10000, + "srgb-lower":10000, + "algorithms":[ + { + "0":"SPF" + } + ], + "srlb-size":1000, + "srlb-lower":5000, + "msd":12 + } + } + ], + "edges":[ + { + "edge-id":1, + "status":"Sync", + "origin":"ISIS_L2", + "advertised-router":"0000.0000.0001", + "local-vertex-id":1, + "remote-vertex-id":2, + "metric":10, + "edge-attributes":{ + "te-metric":20, + "local-address-v6":"2001:db8::1", + "remote-address-v6":"2001:db8::2", + "max-link-bandwidth":176258176.0, + "max-resv-link-bandwidth":176258176.0, + "unreserved-bandwidth":[ + { + "class-type-0":176258176.0 + }, + { + "class-type-1":176258176.0 + }, + { + "class-type-2":176258176.0 + }, + { + "class-type-3":176258176.0 + }, + { + "class-type-4":176258176.0 + }, + { + "class-type-5":176258176.0 + }, + { + "class-type-6":176258176.0 + }, + { + "class-type-7":176258176.0 + } + ], + "delay":10000, + "available-bandwidth":125000000.0 + } + }, + { + "edge-id":2, + "status":"Sync", + "origin":"ISIS_L2", + "advertised-router":"0000.0000.0002", + "local-vertex-id":2, + "remote-vertex-id":1, + "metric":10, + "edge-attributes":{ + "te-metric":0, + "local-address-v6":"2001:db8::2", + "max-link-bandwidth":176258176.0, + "max-resv-link-bandwidth":176258176.0, + "unreserved-bandwidth":[ + { + "class-type-0":176258176.0 + }, + { + "class-type-1":176258176.0 + }, + { + "class-type-2":176258176.0 + }, + { + "class-type-3":176258176.0 + }, + { + "class-type-4":176258176.0 + }, + { + "class-type-5":176258176.0 + }, + { + "class-type-6":176258176.0 + }, + { + "class-type-7":176258176.0 + } + ] + } + }, + { + "edge-id":196610, + "status":"Sync", + "origin":"ISIS_L2", + "advertised-router":"0000.0000.0002", + "local-vertex-id":2, + "remote-vertex-id":3, + "metric":10, + "edge-attributes":{ + "te-metric":0, + "local-address-v6":"2001:db8:3::3:2", + "remote-address-v6":"2001:db8:3::3:3", + "max-link-bandwidth":176258176.0, + "max-resv-link-bandwidth":176258176.0, + "unreserved-bandwidth":[ + { + "class-type-0":176258176.0 + }, + { + "class-type-1":176258176.0 + }, + { + "class-type-2":176258176.0 + }, + { + "class-type-3":176258176.0 + }, + { + "class-type-4":176258176.0 + }, + { + "class-type-5":176258176.0 + }, + { + "class-type-6":176258176.0 + }, + { + "class-type-7":176258176.0 + } + ] + } + }, + { + "edge-id":196611, + "status":"Sync", + "origin":"ISIS_L2", + "advertised-router":"0000.0000.0003", + "local-vertex-id":3, + "remote-vertex-id":2, + "metric":10, + "edge-attributes":{ + "te-metric":0, + "admin-group":32, + "local-address-v6":"2001:db8:3::3:3", + "remote-address-v6":"2001:db8:3::3:2", + "max-link-bandwidth":176258176.0, + "max-resv-link-bandwidth":176258176.0, + "unreserved-bandwidth":[ + { + "class-type-0":176258176.0 + }, + { + "class-type-1":176258176.0 + }, + { + "class-type-2":176258176.0 + }, + { + "class-type-3":176258176.0 + }, + { + "class-type-4":176258176.0 + }, + { + "class-type-5":176258176.0 + }, + { + "class-type-6":176258176.0 + }, + { + "class-type-7":176258176.0 + } + ] + } + }, + { + "edge-id":196612, + "status":"Sync", + "origin":"ISIS_L2", + "advertised-router":"0000.0000.0004", + "local-vertex-id":4, + "remote-vertex-id":3, + "metric":10, + "edge-attributes":{ + "te-metric":0, + "local-address-v6":"2001:db8:5::3:4", + "remote-address-v6":"2001:db8:5::4:3", + "max-link-bandwidth":176258176.0, + "max-resv-link-bandwidth":176258176.0, + "unreserved-bandwidth":[ + { + "class-type-0":176258176.0 + }, + { + "class-type-1":176258176.0 + }, + { + "class-type-2":176258176.0 + }, + { + "class-type-3":176258176.0 + }, + { + "class-type-4":176258176.0 + }, + { + "class-type-5":176258176.0 + }, + { + "class-type-6":176258176.0 + }, + { + "class-type-7":176258176.0 + } + ] + }, + "segment-routing":[ + { + "adj-sid":5001, + "flags":"0xb0", + "weight":0 + } + ] + }, + { + "edge-id":262147, + "status":"Sync", + "origin":"ISIS_L2", + "advertised-router":"0000.0000.0003", + "local-vertex-id":3, + "remote-vertex-id":4, + "metric":10, + "edge-attributes":{ + "te-metric":10, + "local-address-v6":"2001:db8:5::4:3", + "remote-address-v6":"2001:db8:5::3:4", + "max-link-bandwidth":176258176.0, + "max-resv-link-bandwidth":176258176.0, + "unreserved-bandwidth":[ + { + "class-type-0":176258176.0 + }, + { + "class-type-1":176258176.0 + }, + { + "class-type-2":176258176.0 + }, + { + "class-type-3":176258176.0 + }, + { + "class-type-4":176258176.0 + }, + { + "class-type-5":176258176.0 + }, + { + "class-type-6":176258176.0 + }, + { + "class-type-7":176258176.0 + } + ], + "delay":50000 + } + }, + { + "edge-id":167772161, + "status":"Sync", + "origin":"ISIS_L2", + "advertised-router":"0000.0000.0001", + "local-vertex-id":1, + "remote-vertex-id":2, + "metric":10, + "edge-attributes":{ + "te-metric":20, + "local-address":"10.0.0.1", + "remote-address":"10.0.0.2", + "max-link-bandwidth":176258176.0, + "max-resv-link-bandwidth":176258176.0, + "unreserved-bandwidth":[ + { + "class-type-0":176258176.0 + }, + { + "class-type-1":176258176.0 + }, + { + "class-type-2":176258176.0 + }, + { + "class-type-3":176258176.0 + }, + { + "class-type-4":176258176.0 + }, + { + "class-type-5":176258176.0 + }, + { + "class-type-6":176258176.0 + }, + { + "class-type-7":176258176.0 + } + ], + "delay":10000, + "available-bandwidth":125000000.0 + } + }, + { + "edge-id":167772162, + "status":"Sync", + "origin":"ISIS_L2", + "advertised-router":"0000.0000.0002", + "local-vertex-id":2, + "remote-vertex-id":1, + "metric":10, + "edge-attributes":{ + "te-metric":0, + "local-address":"10.0.0.2", + "remote-address":"10.0.0.1", + "max-link-bandwidth":176258176.0, + "max-resv-link-bandwidth":176258176.0, + "unreserved-bandwidth":[ + { + "class-type-0":176258176.0 + }, + { + "class-type-1":176258176.0 + }, + { + "class-type-2":176258176.0 + }, + { + "class-type-3":176258176.0 + }, + { + "class-type-4":176258176.0 + }, + { + "class-type-5":176258176.0 + }, + { + "class-type-6":176258176.0 + }, + { + "class-type-7":176258176.0 + } + ] + } + }, + { + "edge-id":167772930, + "status":"Sync", + "origin":"ISIS_L2", + "advertised-router":"0000.0000.0002", + "local-vertex-id":2, + "remote-vertex-id":3, + "metric":10, + "edge-attributes":{ + "te-metric":0, + "local-address":"10.0.3.2", + "remote-address":"10.0.3.3", + "max-link-bandwidth":176258176.0, + "max-resv-link-bandwidth":176258176.0, + "unreserved-bandwidth":[ + { + "class-type-0":176258176.0 + }, + { + "class-type-1":176258176.0 + }, + { + "class-type-2":176258176.0 + }, + { + "class-type-3":176258176.0 + }, + { + "class-type-4":176258176.0 + }, + { + "class-type-5":176258176.0 + }, + { + "class-type-6":176258176.0 + }, + { + "class-type-7":176258176.0 + } + ] + } + }, + { + "edge-id":167772931, + "status":"Sync", + "origin":"ISIS_L2", + "advertised-router":"0000.0000.0003", + "local-vertex-id":3, + "remote-vertex-id":2, + "metric":10, + "edge-attributes":{ + "te-metric":0, + "admin-group":32, + "local-address":"10.0.3.3", + "remote-address":"10.0.3.2", + "max-link-bandwidth":176258176.0, + "max-resv-link-bandwidth":176258176.0, + "unreserved-bandwidth":[ + { + "class-type-0":176258176.0 + }, + { + "class-type-1":176258176.0 + }, + { + "class-type-2":176258176.0 + }, + { + "class-type-3":176258176.0 + }, + { + "class-type-4":176258176.0 + }, + { + "class-type-5":176258176.0 + }, + { + "class-type-6":176258176.0 + }, + { + "class-type-7":176258176.0 + } + ] + } + }, + { + "edge-id":167773186, + "status":"Sync", + "origin":"ISIS_L2", + "advertised-router":"0000.0000.0002", + "local-vertex-id":2, + "remote-vertex-id":4, + "metric":10, + "edge-attributes":{ + "te-metric":30, + "local-address":"10.0.4.2", + "remote-address":"10.0.4.4", + "max-link-bandwidth":176258176.0, + "max-resv-link-bandwidth":176258176.0, + "unreserved-bandwidth":[ + { + "class-type-0":176258176.0 + }, + { + "class-type-1":176258176.0 + }, + { + "class-type-2":176258176.0 + }, + { + "class-type-3":176258176.0 + }, + { + "class-type-4":176258176.0 + }, + { + "class-type-5":176258176.0 + }, + { + "class-type-6":176258176.0 + }, + { + "class-type-7":176258176.0 + } + ], + "delay":25000, + "utilized-bandwidth":125000000.0 + } + }, + { + "edge-id":167773188, + "status":"Sync", + "origin":"ISIS_L2", + "advertised-router":"0000.0000.0004", + "local-vertex-id":4, + "remote-vertex-id":2, + "metric":10, + "edge-attributes":{ + "te-metric":0, + "local-address":"10.0.4.4", + "remote-address":"10.0.4.2", + "max-link-bandwidth":176258176.0, + "max-resv-link-bandwidth":176258176.0, + "unreserved-bandwidth":[ + { + "class-type-0":176258176.0 + }, + { + "class-type-1":176258176.0 + }, + { + "class-type-2":176258176.0 + }, + { + "class-type-3":176258176.0 + }, + { + "class-type-4":176258176.0 + }, + { + "class-type-5":176258176.0 + }, + { + "class-type-6":176258176.0 + }, + { + "class-type-7":176258176.0 + } + ] + }, + "segment-routing":[ + { + "adj-sid":5000, + "flags":"0x30", + "weight":0 + } + ] + } + ], + "subnets":[ + { + "subnet-id":"10.0.0.1\/24", + "status":"Sync", + "origin":"ISIS_L2", + "advertised-router":"0000.0000.0001", + "vertex-id":1, + "metric":10 + }, + { + "subnet-id":"10.0.0.2\/24", + "status":"Sync", + "origin":"ISIS_L2", + "advertised-router":"0000.0000.0002", + "vertex-id":2, + "metric":10 + }, + { + "subnet-id":"10.0.3.2\/24", + "status":"Sync", + "origin":"ISIS_L2", + "advertised-router":"0000.0000.0002", + "vertex-id":2, + "metric":10 + }, + { + "subnet-id":"10.0.3.3\/24", + "status":"Sync", + "origin":"ISIS_L2", + "advertised-router":"0000.0000.0003", + "vertex-id":3, + "metric":10 + }, + { + "subnet-id":"10.0.4.2\/24", + "status":"Sync", + "origin":"ISIS_L2", + "advertised-router":"0000.0000.0002", + "vertex-id":2, + "metric":10 + }, + { + "subnet-id":"10.0.4.4\/24", + "status":"Sync", + "origin":"ISIS_L2", + "advertised-router":"0000.0000.0004", + "vertex-id":4, + "metric":10 + }, + { + "subnet-id":"10.0.255.1\/32", + "status":"Sync", + "origin":"ISIS_L2", + "advertised-router":"0000.0000.0001", + "vertex-id":1, + "metric":10 + }, + { + "subnet-id":"10.0.255.2\/32", + "status":"Sync", + "origin":"ISIS_L2", + "advertised-router":"0000.0000.0002", + "vertex-id":2, + "metric":10 + }, + { + "subnet-id":"10.0.255.3\/32", + "status":"Sync", + "origin":"ISIS_L2", + "advertised-router":"0000.0000.0003", + "vertex-id":3, + "metric":10 + }, + { + "subnet-id":"10.0.255.4\/32", + "status":"Sync", + "origin":"ISIS_L2", + "advertised-router":"0000.0000.0004", + "vertex-id":4, + "metric":10, + "segment-routing":{ + "pref-sid":400, + "algo":0, + "flags":"0x60" + } + }, + { + "subnet-id":"2001:db8::1\/64", + "status":"Sync", + "origin":"ISIS_L2", + "advertised-router":"0000.0000.0001", + "vertex-id":1, + "metric":10 + }, + { + "subnet-id":"2001:db8::2\/64", + "status":"Sync", + "origin":"ISIS_L2", + "advertised-router":"0000.0000.0002", + "vertex-id":2, + "metric":10 + }, + { + "subnet-id":"2001:db8:3::3:2\/64", + "status":"Sync", + "origin":"ISIS_L2", + "advertised-router":"0000.0000.0002", + "vertex-id":2, + "metric":10 + }, + { + "subnet-id":"2001:db8:3::3:3\/64", + "status":"Sync", + "origin":"ISIS_L2", + "advertised-router":"0000.0000.0003", + "vertex-id":3, + "metric":10 + }, + { + "subnet-id":"2001:db8:5::3:4\/64", + "status":"Sync", + "origin":"ISIS_L2", + "advertised-router":"0000.0000.0004", + "vertex-id":4, + "metric":10 + }, + { + "subnet-id":"2001:db8:5::4:3\/64", + "status":"Sync", + "origin":"ISIS_L2", + "advertised-router":"0000.0000.0003", + "vertex-id":3, + "metric":10 + }, + { + "subnet-id":"2001:db8:ffff::1\/128", + "status":"Sync", + "origin":"ISIS_L2", + "advertised-router":"0000.0000.0001", + "vertex-id":1, + "metric":10 + }, + { + "subnet-id":"2001:db8:ffff::2\/128", + "status":"Sync", + "origin":"ISIS_L2", + "advertised-router":"0000.0000.0002", + "vertex-id":2, + "metric":10 + }, + { + "subnet-id":"2001:db8:ffff::3\/128", + "status":"Sync", + "origin":"ISIS_L2", + "advertised-router":"0000.0000.0003", + "vertex-id":3, + "metric":10 + }, + { + "subnet-id":"2001:db8:ffff::4\/128", + "status":"Sync", + "origin":"ISIS_L2", + "advertised-router":"0000.0000.0004", + "vertex-id":4, + "metric":10, + "segment-routing":{ + "pref-sid":1400, + "algo":0, + "flags":"0x60" + } + } + ] + } +} diff --git a/tests/topotests/isis_te_topo1/reference/ted_step5.json b/tests/topotests/isis_te_topo1/reference/ted_step5.json new file mode 100644 index 0000000000..ba9bdb01ff --- /dev/null +++ b/tests/topotests/isis_te_topo1/reference/ted_step5.json @@ -0,0 +1,952 @@ +{ + "ted":{ + "name":"ISIS", + "key":1, + "verticesCount":4, + "edgesCount":16, + "subnetsCount":24, + "vertices":[ + { + "vertex-id":1, + "status":"Sync", + "origin":"ISIS_L2", + "name":"r1", + "router-id":"10.0.255.1" + }, + { + "vertex-id":2, + "status":"Sync", + "origin":"ISIS_L2", + "name":"r2", + "router-id":"10.0.255.2" + }, + { + "vertex-id":3, + "status":"Sync", + "origin":"ISIS_L2", + "name":"r3", + "router-id":"10.0.255.3", + "router-id-v6":"2001:db8:1000::3" + }, + { + "vertex-id":4, + "status":"Sync", + "origin":"ISIS_L2", + "name":"r4", + "router-id":"10.0.255.4", + "segment-routing":{ + "srgb-size":10000, + "srgb-lower":10000, + "algorithms":[ + { + "0":"SPF" + } + ], + "srlb-size":1000, + "srlb-lower":5000, + "msd":12 + } + } + ], + "edges":[ + { + "edge-id":1, + "status":"Sync", + "origin":"ISIS_L2", + "advertised-router":"0000.0000.0001", + "local-vertex-id":1, + "remote-vertex-id":2, + "metric":10, + "edge-attributes":{ + "te-metric":20, + "local-address-v6":"2001:db8::1", + "remote-address-v6":"2001:db8::2", + "max-link-bandwidth":176258176.0, + "max-resv-link-bandwidth":176258176.0, + "unreserved-bandwidth":[ + { + "class-type-0":176258176.0 + }, + { + "class-type-1":176258176.0 + }, + { + "class-type-2":176258176.0 + }, + { + "class-type-3":176258176.0 + }, + { + "class-type-4":176258176.0 + }, + { + "class-type-5":176258176.0 + }, + { + "class-type-6":176258176.0 + }, + { + "class-type-7":176258176.0 + } + ], + "delay":10000, + "available-bandwidth":125000000.0 + } + }, + { + "edge-id":2, + "status":"Sync", + "origin":"ISIS_L2", + "advertised-router":"0000.0000.0002", + "local-vertex-id":2, + "remote-vertex-id":1, + "metric":10, + "edge-attributes":{ + "te-metric":0, + "local-address-v6":"2001:db8::2", + "max-link-bandwidth":176258176.0, + "max-resv-link-bandwidth":176258176.0, + "unreserved-bandwidth":[ + { + "class-type-0":176258176.0 + }, + { + "class-type-1":176258176.0 + }, + { + "class-type-2":176258176.0 + }, + { + "class-type-3":176258176.0 + }, + { + "class-type-4":176258176.0 + }, + { + "class-type-5":176258176.0 + }, + { + "class-type-6":176258176.0 + }, + { + "class-type-7":176258176.0 + } + ] + } + }, + { + "edge-id":65537, + "status":"Sync", + "origin":"ISIS_L2", + "advertised-router":"0000.0000.0001", + "local-vertex-id":1, + "remote-vertex-id":2, + "metric":10, + "edge-attributes":{ + "te-metric":0, + "local-address-v6":"2001:db8:1::1:1", + "remote-address-v6":"2001:db8:1::1:2", + "max-link-bandwidth":176258176.0, + "max-resv-link-bandwidth":176258176.0, + "unreserved-bandwidth":[ + { + "class-type-0":176258176.0 + }, + { + "class-type-1":176258176.0 + }, + { + "class-type-2":176258176.0 + }, + { + "class-type-3":176258176.0 + }, + { + "class-type-4":176258176.0 + }, + { + "class-type-5":176258176.0 + }, + { + "class-type-6":176258176.0 + }, + { + "class-type-7":176258176.0 + } + ] + } + }, + { + "edge-id":65538, + "status":"Sync", + "origin":"ISIS_L2", + "advertised-router":"0000.0000.0002", + "local-vertex-id":2, + "remote-vertex-id":1, + "metric":10, + "edge-attributes":{ + "te-metric":0, + "local-address-v6":"2001:db8:1::1:2", + "remote-address-v6":"2001:db8:1::1:1", + "max-link-bandwidth":176258176.0, + "max-resv-link-bandwidth":176258176.0, + "unreserved-bandwidth":[ + { + "class-type-0":176258176.0 + }, + { + "class-type-1":176258176.0 + }, + { + "class-type-2":176258176.0 + }, + { + "class-type-3":176258176.0 + }, + { + "class-type-4":176258176.0 + }, + { + "class-type-5":176258176.0 + }, + { + "class-type-6":176258176.0 + }, + { + "class-type-7":176258176.0 + } + ] + } + }, + { + "edge-id":196610, + "status":"Sync", + "origin":"ISIS_L2", + "advertised-router":"0000.0000.0002", + "local-vertex-id":2, + "remote-vertex-id":3, + "metric":10, + "edge-attributes":{ + "te-metric":0, + "local-address-v6":"2001:db8:3::3:2", + "remote-address-v6":"2001:db8:3::3:3", + "max-link-bandwidth":176258176.0, + "max-resv-link-bandwidth":176258176.0, + "unreserved-bandwidth":[ + { + "class-type-0":176258176.0 + }, + { + "class-type-1":176258176.0 + }, + { + "class-type-2":176258176.0 + }, + { + "class-type-3":176258176.0 + }, + { + "class-type-4":176258176.0 + }, + { + "class-type-5":176258176.0 + }, + { + "class-type-6":176258176.0 + }, + { + "class-type-7":176258176.0 + } + ] + } + }, + { + "edge-id":196611, + "status":"Sync", + "origin":"ISIS_L2", + "advertised-router":"0000.0000.0003", + "local-vertex-id":3, + "remote-vertex-id":2, + "metric":10, + "edge-attributes":{ + "te-metric":0, + "admin-group":32, + "local-address-v6":"2001:db8:3::3:3", + "remote-address-v6":"2001:db8:3::3:2", + "max-link-bandwidth":176258176.0, + "max-resv-link-bandwidth":176258176.0, + "unreserved-bandwidth":[ + { + "class-type-0":176258176.0 + }, + { + "class-type-1":176258176.0 + }, + { + "class-type-2":176258176.0 + }, + { + "class-type-3":176258176.0 + }, + { + "class-type-4":176258176.0 + }, + { + "class-type-5":176258176.0 + }, + { + "class-type-6":176258176.0 + }, + { + "class-type-7":176258176.0 + } + ] + } + }, + { + "edge-id":196612, + "status":"Sync", + "origin":"ISIS_L2", + "advertised-router":"0000.0000.0004", + "local-vertex-id":4, + "remote-vertex-id":3, + "metric":10, + "edge-attributes":{ + "te-metric":0, + "local-address-v6":"2001:db8:5::3:4", + "remote-address-v6":"2001:db8:5::4:3", + "max-link-bandwidth":176258176.0, + "max-resv-link-bandwidth":176258176.0, + "unreserved-bandwidth":[ + { + "class-type-0":176258176.0 + }, + { + "class-type-1":176258176.0 + }, + { + "class-type-2":176258176.0 + }, + { + "class-type-3":176258176.0 + }, + { + "class-type-4":176258176.0 + }, + { + "class-type-5":176258176.0 + }, + { + "class-type-6":176258176.0 + }, + { + "class-type-7":176258176.0 + } + ] + }, + "segment-routing":[ + { + "adj-sid":5001, + "flags":"0xb0", + "weight":0 + } + ] + }, + { + "edge-id":262147, + "status":"Sync", + "origin":"ISIS_L2", + "advertised-router":"0000.0000.0003", + "local-vertex-id":3, + "remote-vertex-id":4, + "metric":10, + "edge-attributes":{ + "te-metric":10, + "local-address-v6":"2001:db8:5::4:3", + "remote-address-v6":"2001:db8:5::3:4", + "max-link-bandwidth":176258176.0, + "max-resv-link-bandwidth":176258176.0, + "unreserved-bandwidth":[ + { + "class-type-0":176258176.0 + }, + { + "class-type-1":176258176.0 + }, + { + "class-type-2":176258176.0 + }, + { + "class-type-3":176258176.0 + }, + { + "class-type-4":176258176.0 + }, + { + "class-type-5":176258176.0 + }, + { + "class-type-6":176258176.0 + }, + { + "class-type-7":176258176.0 + } + ], + "delay":50000 + } + }, + { + "edge-id":167772161, + "status":"Sync", + "origin":"ISIS_L2", + "advertised-router":"0000.0000.0001", + "local-vertex-id":1, + "remote-vertex-id":2, + "metric":10, + "edge-attributes":{ + "te-metric":20, + "local-address":"10.0.0.1", + "remote-address":"10.0.0.2", + "max-link-bandwidth":176258176.0, + "max-resv-link-bandwidth":176258176.0, + "unreserved-bandwidth":[ + { + "class-type-0":176258176.0 + }, + { + "class-type-1":176258176.0 + }, + { + "class-type-2":176258176.0 + }, + { + "class-type-3":176258176.0 + }, + { + "class-type-4":176258176.0 + }, + { + "class-type-5":176258176.0 + }, + { + "class-type-6":176258176.0 + }, + { + "class-type-7":176258176.0 + } + ], + "delay":10000, + "available-bandwidth":125000000.0 + } + }, + { + "edge-id":167772162, + "status":"Sync", + "origin":"ISIS_L2", + "advertised-router":"0000.0000.0002", + "local-vertex-id":2, + "remote-vertex-id":1, + "metric":10, + "edge-attributes":{ + "te-metric":0, + "local-address":"10.0.0.2", + "remote-address":"10.0.0.1", + "max-link-bandwidth":176258176.0, + "max-resv-link-bandwidth":176258176.0, + "unreserved-bandwidth":[ + { + "class-type-0":176258176.0 + }, + { + "class-type-1":176258176.0 + }, + { + "class-type-2":176258176.0 + }, + { + "class-type-3":176258176.0 + }, + { + "class-type-4":176258176.0 + }, + { + "class-type-5":176258176.0 + }, + { + "class-type-6":176258176.0 + }, + { + "class-type-7":176258176.0 + } + ] + } + }, + { + "edge-id":167772417, + "status":"Sync", + "origin":"ISIS_L2", + "advertised-router":"0000.0000.0001", + "local-vertex-id":1, + "remote-vertex-id":2, + "metric":10, + "edge-attributes":{ + "te-metric":0, + "local-address":"10.0.1.1", + "remote-address":"10.0.1.2", + "max-link-bandwidth":176258176.0, + "max-resv-link-bandwidth":176258176.0, + "unreserved-bandwidth":[ + { + "class-type-0":176258176.0 + }, + { + "class-type-1":176258176.0 + }, + { + "class-type-2":176258176.0 + }, + { + "class-type-3":176258176.0 + }, + { + "class-type-4":176258176.0 + }, + { + "class-type-5":176258176.0 + }, + { + "class-type-6":176258176.0 + }, + { + "class-type-7":176258176.0 + } + ] + } + }, + { + "edge-id":167772418, + "status":"Sync", + "origin":"ISIS_L2", + "advertised-router":"0000.0000.0002", + "local-vertex-id":2, + "remote-vertex-id":1, + "metric":10, + "edge-attributes":{ + "te-metric":0, + "local-address":"10.0.1.2", + "remote-address":"10.0.1.1", + "max-link-bandwidth":176258176.0, + "max-resv-link-bandwidth":176258176.0, + "unreserved-bandwidth":[ + { + "class-type-0":176258176.0 + }, + { + "class-type-1":176258176.0 + }, + { + "class-type-2":176258176.0 + }, + { + "class-type-3":176258176.0 + }, + { + "class-type-4":176258176.0 + }, + { + "class-type-5":176258176.0 + }, + { + "class-type-6":176258176.0 + }, + { + "class-type-7":176258176.0 + } + ] + } + }, + { + "edge-id":167772930, + "status":"Sync", + "origin":"ISIS_L2", + "advertised-router":"0000.0000.0002", + "local-vertex-id":2, + "remote-vertex-id":3, + "metric":10, + "edge-attributes":{ + "te-metric":0, + "local-address":"10.0.3.2", + "remote-address":"10.0.3.3", + "max-link-bandwidth":176258176.0, + "max-resv-link-bandwidth":176258176.0, + "unreserved-bandwidth":[ + { + "class-type-0":176258176.0 + }, + { + "class-type-1":176258176.0 + }, + { + "class-type-2":176258176.0 + }, + { + "class-type-3":176258176.0 + }, + { + "class-type-4":176258176.0 + }, + { + "class-type-5":176258176.0 + }, + { + "class-type-6":176258176.0 + }, + { + "class-type-7":176258176.0 + } + ] + } + }, + { + "edge-id":167772931, + "status":"Sync", + "origin":"ISIS_L2", + "advertised-router":"0000.0000.0003", + "local-vertex-id":3, + "remote-vertex-id":2, + "metric":10, + "edge-attributes":{ + "te-metric":0, + "admin-group":32, + "local-address":"10.0.3.3", + "remote-address":"10.0.3.2", + "max-link-bandwidth":176258176.0, + "max-resv-link-bandwidth":176258176.0, + "unreserved-bandwidth":[ + { + "class-type-0":176258176.0 + }, + { + "class-type-1":176258176.0 + }, + { + "class-type-2":176258176.0 + }, + { + "class-type-3":176258176.0 + }, + { + "class-type-4":176258176.0 + }, + { + "class-type-5":176258176.0 + }, + { + "class-type-6":176258176.0 + }, + { + "class-type-7":176258176.0 + } + ] + } + }, + { + "edge-id":167773186, + "status":"Sync", + "origin":"ISIS_L2", + "advertised-router":"0000.0000.0002", + "local-vertex-id":2, + "remote-vertex-id":4, + "metric":10, + "edge-attributes":{ + "te-metric":30, + "local-address":"10.0.4.2", + "remote-address":"10.0.4.4", + "max-link-bandwidth":176258176.0, + "max-resv-link-bandwidth":176258176.0, + "unreserved-bandwidth":[ + { + "class-type-0":176258176.0 + }, + { + "class-type-1":176258176.0 + }, + { + "class-type-2":176258176.0 + }, + { + "class-type-3":176258176.0 + }, + { + "class-type-4":176258176.0 + }, + { + "class-type-5":176258176.0 + }, + { + "class-type-6":176258176.0 + }, + { + "class-type-7":176258176.0 + } + ], + "delay":25000, + "utilized-bandwidth":125000000.0 + } + }, + { + "edge-id":167773188, + "status":"Sync", + "origin":"ISIS_L2", + "advertised-router":"0000.0000.0004", + "local-vertex-id":4, + "remote-vertex-id":2, + "metric":10, + "edge-attributes":{ + "te-metric":0, + "local-address":"10.0.4.4", + "remote-address":"10.0.4.2", + "max-link-bandwidth":176258176.0, + "max-resv-link-bandwidth":176258176.0, + "unreserved-bandwidth":[ + { + "class-type-0":176258176.0 + }, + { + "class-type-1":176258176.0 + }, + { + "class-type-2":176258176.0 + }, + { + "class-type-3":176258176.0 + }, + { + "class-type-4":176258176.0 + }, + { + "class-type-5":176258176.0 + }, + { + "class-type-6":176258176.0 + }, + { + "class-type-7":176258176.0 + } + ] + }, + "segment-routing":[ + { + "adj-sid":5000, + "flags":"0x30", + "weight":0 + } + ] + } + ], + "subnets":[ + { + "subnet-id":"10.0.0.1\/24", + "status":"Sync", + "origin":"ISIS_L2", + "advertised-router":"0000.0000.0001", + "vertex-id":1, + "metric":10 + }, + { + "subnet-id":"10.0.0.2\/24", + "status":"Sync", + "origin":"ISIS_L2", + "advertised-router":"0000.0000.0002", + "vertex-id":2, + "metric":10 + }, + { + "subnet-id":"10.0.1.1\/24", + "status":"Sync", + "origin":"ISIS_L2", + "advertised-router":"0000.0000.0001", + "vertex-id":1, + "metric":10 + }, + { + "subnet-id":"10.0.1.2\/24", + "status":"Sync", + "origin":"ISIS_L2", + "advertised-router":"0000.0000.0002", + "vertex-id":2, + "metric":10 + }, + { + "subnet-id":"10.0.3.2\/24", + "status":"Sync", + "origin":"ISIS_L2", + "advertised-router":"0000.0000.0002", + "vertex-id":2, + "metric":10 + }, + { + "subnet-id":"10.0.3.3\/24", + "status":"Sync", + "origin":"ISIS_L2", + "advertised-router":"0000.0000.0003", + "vertex-id":3, + "metric":10 + }, + { + "subnet-id":"10.0.4.2\/24", + "status":"Sync", + "origin":"ISIS_L2", + "advertised-router":"0000.0000.0002", + "vertex-id":2, + "metric":10 + }, + { + "subnet-id":"10.0.4.4\/24", + "status":"Sync", + "origin":"ISIS_L2", + "advertised-router":"0000.0000.0004", + "vertex-id":4, + "metric":10 + }, + { + "subnet-id":"10.0.255.1\/32", + "status":"Sync", + "origin":"ISIS_L2", + "advertised-router":"0000.0000.0001", + "vertex-id":1, + "metric":10 + }, + { + "subnet-id":"10.0.255.2\/32", + "status":"Sync", + "origin":"ISIS_L2", + "advertised-router":"0000.0000.0002", + "vertex-id":2, + "metric":10 + }, + { + "subnet-id":"10.0.255.3\/32", + "status":"Sync", + "origin":"ISIS_L2", + "advertised-router":"0000.0000.0003", + "vertex-id":3, + "metric":10 + }, + { + "subnet-id":"10.0.255.4\/32", + "status":"Sync", + "origin":"ISIS_L2", + "advertised-router":"0000.0000.0004", + "vertex-id":4, + "metric":10, + "segment-routing":{ + "pref-sid":400, + "algo":0, + "flags":"0x60" + } + }, + { + "subnet-id":"2001:db8::1\/64", + "status":"Sync", + "origin":"ISIS_L2", + "advertised-router":"0000.0000.0001", + "vertex-id":1, + "metric":10 + }, + { + "subnet-id":"2001:db8::2\/64", + "status":"Sync", + "origin":"ISIS_L2", + "advertised-router":"0000.0000.0002", + "vertex-id":2, + "metric":10 + }, + { + "subnet-id":"2001:db8:1::1:1\/64", + "status":"Sync", + "origin":"ISIS_L2", + "advertised-router":"0000.0000.0001", + "vertex-id":1, + "metric":10 + }, + { + "subnet-id":"2001:db8:1::1:2\/64", + "status":"Sync", + "origin":"ISIS_L2", + "advertised-router":"0000.0000.0002", + "vertex-id":2, + "metric":10 + }, + { + "subnet-id":"2001:db8:3::3:2\/64", + "status":"Sync", + "origin":"ISIS_L2", + "advertised-router":"0000.0000.0002", + "vertex-id":2, + "metric":10 + }, + { + "subnet-id":"2001:db8:3::3:3\/64", + "status":"Sync", + "origin":"ISIS_L2", + "advertised-router":"0000.0000.0003", + "vertex-id":3, + "metric":10 + }, + { + "subnet-id":"2001:db8:5::3:4\/64", + "status":"Sync", + "origin":"ISIS_L2", + "advertised-router":"0000.0000.0004", + "vertex-id":4, + "metric":10 + }, + { + "subnet-id":"2001:db8:5::4:3\/64", + "status":"Sync", + "origin":"ISIS_L2", + "advertised-router":"0000.0000.0003", + "vertex-id":3, + "metric":10 + }, + { + "subnet-id":"2001:db8:ffff::1\/128", + "status":"Sync", + "origin":"ISIS_L2", + "advertised-router":"0000.0000.0001", + "vertex-id":1, + "metric":10 + }, + { + "subnet-id":"2001:db8:ffff::2\/128", + "status":"Sync", + "origin":"ISIS_L2", + "advertised-router":"0000.0000.0002", + "vertex-id":2, + "metric":10 + }, + { + "subnet-id":"2001:db8:ffff::3\/128", + "status":"Sync", + "origin":"ISIS_L2", + "advertised-router":"0000.0000.0003", + "vertex-id":3, + "metric":10 + }, + { + "subnet-id":"2001:db8:ffff::4\/128", + "status":"Sync", + "origin":"ISIS_L2", + "advertised-router":"0000.0000.0004", + "vertex-id":4, + "metric":10, + "segment-routing":{ + "pref-sid":1400, + "algo":0, + "flags":"0x60" + } + } + ] + } +} diff --git a/tests/topotests/isis_te_topo1/reference/ted_step6.json b/tests/topotests/isis_te_topo1/reference/ted_step6.json new file mode 100644 index 0000000000..83bb27235e --- /dev/null +++ b/tests/topotests/isis_te_topo1/reference/ted_step6.json @@ -0,0 +1,953 @@ +{ + "ted":{ + "name":"ISIS", + "key":1, + "verticesCount":4, + "edgesCount":16, + "subnetsCount":24, + "vertices":[ + { + "vertex-id":1, + "status":"Sync", + "origin":"ISIS_L2", + "name":"r1", + "router-id":"10.0.255.1" + }, + { + "vertex-id":2, + "status":"Sync", + "origin":"ISIS_L2", + "name":"r2", + "router-id":"10.0.255.2" + }, + { + "vertex-id":3, + "status":"Sync", + "origin":"ISIS_L2", + "name":"r3", + "router-id":"10.0.255.3", + "router-id-v6":"2001:db8:1000::3" + }, + { + "vertex-id":4, + "status":"Sync", + "origin":"ISIS_L2", + "name":"r4", + "router-id":"10.0.255.4", + "segment-routing":{ + "srgb-size":10000, + "srgb-lower":10000, + "algorithms":[ + { + "0":"SPF" + } + ], + "srlb-size":1000, + "srlb-lower":5000, + "msd":12 + } + } + ], + "edges":[ + { + "edge-id":1, + "status":"Sync", + "origin":"ISIS_L2", + "advertised-router":"0000.0000.0001", + "local-vertex-id":1, + "remote-vertex-id":2, + "metric":10, + "edge-attributes":{ + "te-metric":20, + "local-address-v6":"2001:db8::1", + "remote-address-v6":"2001:db8::2", + "max-link-bandwidth":176258176.0, + "max-resv-link-bandwidth":176258176.0, + "unreserved-bandwidth":[ + { + "class-type-0":176258176.0 + }, + { + "class-type-1":176258176.0 + }, + { + "class-type-2":176258176.0 + }, + { + "class-type-3":176258176.0 + }, + { + "class-type-4":176258176.0 + }, + { + "class-type-5":176258176.0 + }, + { + "class-type-6":176258176.0 + }, + { + "class-type-7":176258176.0 + } + ], + "delay":10000, + "available-bandwidth":125000000.0 + } + }, + { + "edge-id":2, + "status":"Sync", + "origin":"ISIS_L2", + "advertised-router":"0000.0000.0002", + "local-vertex-id":2, + "remote-vertex-id":1, + "metric":10, + "edge-attributes":{ + "te-metric":0, + "local-address-v6":"2001:db8::2", + "max-link-bandwidth":176258176.0, + "max-resv-link-bandwidth":176258176.0, + "unreserved-bandwidth":[ + { + "class-type-0":176258176.0 + }, + { + "class-type-1":176258176.0 + }, + { + "class-type-2":176258176.0 + }, + { + "class-type-3":176258176.0 + }, + { + "class-type-4":176258176.0 + }, + { + "class-type-5":176258176.0 + }, + { + "class-type-6":176258176.0 + }, + { + "class-type-7":176258176.0 + } + ] + } + }, + { + "edge-id":65537, + "status":"Sync", + "origin":"ISIS_L2", + "advertised-router":"0000.0000.0001", + "local-vertex-id":1, + "remote-vertex-id":2, + "metric":10, + "edge-attributes":{ + "te-metric":0, + "local-address-v6":"2001:db8:1::1:1", + "remote-address-v6":"2001:db8:1::1:2", + "max-link-bandwidth":176258176.0, + "max-resv-link-bandwidth":176258176.0, + "unreserved-bandwidth":[ + { + "class-type-0":176258176.0 + }, + { + "class-type-1":176258176.0 + }, + { + "class-type-2":176258176.0 + }, + { + "class-type-3":176258176.0 + }, + { + "class-type-4":176258176.0 + }, + { + "class-type-5":176258176.0 + }, + { + "class-type-6":176258176.0 + }, + { + "class-type-7":176258176.0 + } + ] + } + }, + { + "edge-id":65538, + "status":"Sync", + "origin":"ISIS_L2", + "advertised-router":"0000.0000.0002", + "local-vertex-id":2, + "remote-vertex-id":1, + "metric":10, + "edge-attributes":{ + "te-metric":0, + "local-address-v6":"2001:db8:1::1:2", + "remote-address-v6":"2001:db8:1::1:1", + "max-link-bandwidth":176258176.0, + "max-resv-link-bandwidth":176258176.0, + "unreserved-bandwidth":[ + { + "class-type-0":176258176.0 + }, + { + "class-type-1":176258176.0 + }, + { + "class-type-2":176258176.0 + }, + { + "class-type-3":176258176.0 + }, + { + "class-type-4":176258176.0 + }, + { + "class-type-5":176258176.0 + }, + { + "class-type-6":176258176.0 + }, + { + "class-type-7":176258176.0 + } + ] + } + }, + { + "edge-id":196610, + "status":"Sync", + "origin":"ISIS_L2", + "advertised-router":"0000.0000.0002", + "local-vertex-id":2, + "remote-vertex-id":3, + "metric":10, + "edge-attributes":{ + "te-metric":0, + "local-address-v6":"2001:db8:3::3:2", + "remote-address-v6":"2001:db8:3::3:3", + "max-link-bandwidth":176258176.0, + "max-resv-link-bandwidth":176258176.0, + "unreserved-bandwidth":[ + { + "class-type-0":176258176.0 + }, + { + "class-type-1":176258176.0 + }, + { + "class-type-2":176258176.0 + }, + { + "class-type-3":176258176.0 + }, + { + "class-type-4":176258176.0 + }, + { + "class-type-5":176258176.0 + }, + { + "class-type-6":176258176.0 + }, + { + "class-type-7":176258176.0 + } + ] + } + }, + { + "edge-id":196611, + "status":"Sync", + "origin":"ISIS_L2", + "advertised-router":"0000.0000.0003", + "local-vertex-id":3, + "remote-vertex-id":2, + "metric":10, + "edge-attributes":{ + "te-metric":0, + "admin-group":32, + "local-address-v6":"2001:db8:3::3:3", + "remote-address-v6":"2001:db8:3::3:2", + "max-link-bandwidth":176258176.0, + "max-resv-link-bandwidth":176258176.0, + "unreserved-bandwidth":[ + { + "class-type-0":176258176.0 + }, + { + "class-type-1":176258176.0 + }, + { + "class-type-2":176258176.0 + }, + { + "class-type-3":176258176.0 + }, + { + "class-type-4":176258176.0 + }, + { + "class-type-5":176258176.0 + }, + { + "class-type-6":176258176.0 + }, + { + "class-type-7":176258176.0 + } + ] + } + }, + { + "edge-id":196612, + "status":"Sync", + "origin":"ISIS_L2", + "advertised-router":"0000.0000.0004", + "local-vertex-id":4, + "remote-vertex-id":3, + "metric":10, + "edge-attributes":{ + "te-metric":0, + "local-address-v6":"2001:db8:5::3:4", + "remote-address-v6":"2001:db8:5::4:3", + "max-link-bandwidth":176258176.0, + "max-resv-link-bandwidth":176258176.0, + "unreserved-bandwidth":[ + { + "class-type-0":176258176.0 + }, + { + "class-type-1":176258176.0 + }, + { + "class-type-2":176258176.0 + }, + { + "class-type-3":176258176.0 + }, + { + "class-type-4":176258176.0 + }, + { + "class-type-5":176258176.0 + }, + { + "class-type-6":176258176.0 + }, + { + "class-type-7":176258176.0 + } + ] + }, + "segment-routing":[ + { + "adj-sid":5001, + "flags":"0xb0", + "weight":0 + } + ] + }, + { + "edge-id":262147, + "status":"Sync", + "origin":"ISIS_L2", + "advertised-router":"0000.0000.0003", + "local-vertex-id":3, + "remote-vertex-id":4, + "metric":10, + "edge-attributes":{ + "te-metric":10, + "local-address-v6":"2001:db8:5::4:3", + "remote-address-v6":"2001:db8:5::3:4", + "max-link-bandwidth":176258176.0, + "max-resv-link-bandwidth":176258176.0, + "unreserved-bandwidth":[ + { + "class-type-0":176258176.0 + }, + { + "class-type-1":176258176.0 + }, + { + "class-type-2":176258176.0 + }, + { + "class-type-3":176258176.0 + }, + { + "class-type-4":176258176.0 + }, + { + "class-type-5":176258176.0 + }, + { + "class-type-6":176258176.0 + }, + { + "class-type-7":176258176.0 + } + ], + "delay":50000 + } + }, + { + "edge-id":167772161, + "status":"Sync", + "origin":"ISIS_L2", + "advertised-router":"0000.0000.0001", + "local-vertex-id":1, + "remote-vertex-id":2, + "metric":10, + "edge-attributes":{ + "te-metric":20, + "local-address":"10.0.0.1", + "remote-address":"10.0.0.2", + "max-link-bandwidth":176258176.0, + "max-resv-link-bandwidth":176258176.0, + "unreserved-bandwidth":[ + { + "class-type-0":176258176.0 + }, + { + "class-type-1":176258176.0 + }, + { + "class-type-2":176258176.0 + }, + { + "class-type-3":176258176.0 + }, + { + "class-type-4":176258176.0 + }, + { + "class-type-5":176258176.0 + }, + { + "class-type-6":176258176.0 + }, + { + "class-type-7":176258176.0 + } + ], + "delay":10000, + "available-bandwidth":125000000.0 + } + }, + { + "edge-id":167772162, + "status":"Sync", + "origin":"ISIS_L2", + "advertised-router":"0000.0000.0002", + "local-vertex-id":2, + "remote-vertex-id":1, + "metric":10, + "edge-attributes":{ + "te-metric":0, + "local-address":"10.0.0.2", + "remote-address":"10.0.0.1", + "max-link-bandwidth":176258176.0, + "max-resv-link-bandwidth":176258176.0, + "unreserved-bandwidth":[ + { + "class-type-0":176258176.0 + }, + { + "class-type-1":176258176.0 + }, + { + "class-type-2":176258176.0 + }, + { + "class-type-3":176258176.0 + }, + { + "class-type-4":176258176.0 + }, + { + "class-type-5":176258176.0 + }, + { + "class-type-6":176258176.0 + }, + { + "class-type-7":176258176.0 + } + ] + } + }, + { + "edge-id":167772417, + "status":"Sync", + "origin":"ISIS_L2", + "advertised-router":"0000.0000.0001", + "local-vertex-id":1, + "remote-vertex-id":2, + "metric":10, + "edge-attributes":{ + "te-metric":0, + "local-address":"10.0.1.1", + "remote-address":"10.0.1.2", + "max-link-bandwidth":176258176.0, + "max-resv-link-bandwidth":176258176.0, + "unreserved-bandwidth":[ + { + "class-type-0":176258176.0 + }, + { + "class-type-1":176258176.0 + }, + { + "class-type-2":176258176.0 + }, + { + "class-type-3":176258176.0 + }, + { + "class-type-4":176258176.0 + }, + { + "class-type-5":176258176.0 + }, + { + "class-type-6":176258176.0 + }, + { + "class-type-7":176258176.0 + } + ] + } + }, + { + "edge-id":167772418, + "status":"Sync", + "origin":"ISIS_L2", + "advertised-router":"0000.0000.0002", + "local-vertex-id":2, + "remote-vertex-id":1, + "metric":10, + "edge-attributes":{ + "te-metric":0, + "local-address":"10.0.1.2", + "remote-address":"10.0.1.1", + "max-link-bandwidth":176258176.0, + "max-resv-link-bandwidth":176258176.0, + "unreserved-bandwidth":[ + { + "class-type-0":176258176.0 + }, + { + "class-type-1":176258176.0 + }, + { + "class-type-2":176258176.0 + }, + { + "class-type-3":176258176.0 + }, + { + "class-type-4":176258176.0 + }, + { + "class-type-5":176258176.0 + }, + { + "class-type-6":176258176.0 + }, + { + "class-type-7":176258176.0 + } + ] + } + }, + { + "edge-id":167772930, + "status":"Sync", + "origin":"ISIS_L2", + "advertised-router":"0000.0000.0002", + "local-vertex-id":2, + "remote-vertex-id":3, + "metric":10, + "edge-attributes":{ + "te-metric":0, + "local-address":"10.0.3.2", + "remote-address":"10.0.3.3", + "max-link-bandwidth":176258176.0, + "max-resv-link-bandwidth":176258176.0, + "unreserved-bandwidth":[ + { + "class-type-0":176258176.0 + }, + { + "class-type-1":176258176.0 + }, + { + "class-type-2":176258176.0 + }, + { + "class-type-3":176258176.0 + }, + { + "class-type-4":176258176.0 + }, + { + "class-type-5":176258176.0 + }, + { + "class-type-6":176258176.0 + }, + { + "class-type-7":176258176.0 + } + ] + } + }, + { + "edge-id":167772931, + "status":"Sync", + "origin":"ISIS_L2", + "advertised-router":"0000.0000.0003", + "local-vertex-id":3, + "remote-vertex-id":2, + "metric":10, + "edge-attributes":{ + "te-metric":0, + "admin-group":32, + "local-address":"10.0.3.3", + "remote-address":"10.0.3.2", + "max-link-bandwidth":176258176.0, + "max-resv-link-bandwidth":176258176.0, + "unreserved-bandwidth":[ + { + "class-type-0":176258176.0 + }, + { + "class-type-1":176258176.0 + }, + { + "class-type-2":176258176.0 + }, + { + "class-type-3":176258176.0 + }, + { + "class-type-4":176258176.0 + }, + { + "class-type-5":176258176.0 + }, + { + "class-type-6":176258176.0 + }, + { + "class-type-7":176258176.0 + } + ] + } + }, + { + "edge-id":167773186, + "status":"Sync", + "origin":"ISIS_L2", + "advertised-router":"0000.0000.0002", + "local-vertex-id":2, + "remote-vertex-id":4, + "metric":10, + "edge-attributes":{ + "te-metric":30, + "local-address":"10.0.4.2", + "remote-address":"10.0.4.4", + "max-link-bandwidth":176258176.0, + "max-resv-link-bandwidth":176258176.0, + "unreserved-bandwidth":[ + { + "class-type-0":176258176.0 + }, + { + "class-type-1":176258176.0 + }, + { + "class-type-2":176258176.0 + }, + { + "class-type-3":176258176.0 + }, + { + "class-type-4":176258176.0 + }, + { + "class-type-5":176258176.0 + }, + { + "class-type-6":176258176.0 + }, + { + "class-type-7":176258176.0 + } + ], + "delay":25000 + } + }, + { + "edge-id":167773188, + "status":"Sync", + "origin":"ISIS_L2", + "advertised-router":"0000.0000.0004", + "local-vertex-id":4, + "remote-vertex-id":2, + "metric":10, + "edge-attributes":{ + "te-metric":0, + "local-address":"10.0.4.4", + "remote-address":"10.0.4.2", + "max-link-bandwidth":176258176.0, + "max-resv-link-bandwidth":176258176.0, + "unreserved-bandwidth":[ + { + "class-type-0":176258176.0 + }, + { + "class-type-1":176258176.0 + }, + { + "class-type-2":176258176.0 + }, + { + "class-type-3":176258176.0 + }, + { + "class-type-4":176258176.0 + }, + { + "class-type-5":176258176.0 + }, + { + "class-type-6":176258176.0 + }, + { + "class-type-7":176258176.0 + } + ], + "delay":20000, + "jitter":10000 + }, + "segment-routing":[ + { + "adj-sid":5000, + "flags":"0x30", + "weight":0 + } + ] + } + ], + "subnets":[ + { + "subnet-id":"10.0.0.1\/24", + "status":"Sync", + "origin":"ISIS_L2", + "advertised-router":"0000.0000.0001", + "vertex-id":1, + "metric":10 + }, + { + "subnet-id":"10.0.0.2\/24", + "status":"Sync", + "origin":"ISIS_L2", + "advertised-router":"0000.0000.0002", + "vertex-id":2, + "metric":10 + }, + { + "subnet-id":"10.0.1.1\/24", + "status":"Sync", + "origin":"ISIS_L2", + "advertised-router":"0000.0000.0001", + "vertex-id":1, + "metric":10 + }, + { + "subnet-id":"10.0.1.2\/24", + "status":"Sync", + "origin":"ISIS_L2", + "advertised-router":"0000.0000.0002", + "vertex-id":2, + "metric":10 + }, + { + "subnet-id":"10.0.3.2\/24", + "status":"Sync", + "origin":"ISIS_L2", + "advertised-router":"0000.0000.0002", + "vertex-id":2, + "metric":10 + }, + { + "subnet-id":"10.0.3.3\/24", + "status":"Sync", + "origin":"ISIS_L2", + "advertised-router":"0000.0000.0003", + "vertex-id":3, + "metric":10 + }, + { + "subnet-id":"10.0.4.2\/24", + "status":"Sync", + "origin":"ISIS_L2", + "advertised-router":"0000.0000.0002", + "vertex-id":2, + "metric":10 + }, + { + "subnet-id":"10.0.4.4\/24", + "status":"Sync", + "origin":"ISIS_L2", + "advertised-router":"0000.0000.0004", + "vertex-id":4, + "metric":10 + }, + { + "subnet-id":"10.0.255.1\/32", + "status":"Sync", + "origin":"ISIS_L2", + "advertised-router":"0000.0000.0001", + "vertex-id":1, + "metric":10 + }, + { + "subnet-id":"10.0.255.2\/32", + "status":"Sync", + "origin":"ISIS_L2", + "advertised-router":"0000.0000.0002", + "vertex-id":2, + "metric":10 + }, + { + "subnet-id":"10.0.255.3\/32", + "status":"Sync", + "origin":"ISIS_L2", + "advertised-router":"0000.0000.0003", + "vertex-id":3, + "metric":10 + }, + { + "subnet-id":"10.0.255.4\/32", + "status":"Sync", + "origin":"ISIS_L2", + "advertised-router":"0000.0000.0004", + "vertex-id":4, + "metric":10, + "segment-routing":{ + "pref-sid":400, + "algo":0, + "flags":"0x60" + } + }, + { + "subnet-id":"2001:db8::1\/64", + "status":"Sync", + "origin":"ISIS_L2", + "advertised-router":"0000.0000.0001", + "vertex-id":1, + "metric":10 + }, + { + "subnet-id":"2001:db8::2\/64", + "status":"Sync", + "origin":"ISIS_L2", + "advertised-router":"0000.0000.0002", + "vertex-id":2, + "metric":10 + }, + { + "subnet-id":"2001:db8:1::1:1\/64", + "status":"Sync", + "origin":"ISIS_L2", + "advertised-router":"0000.0000.0001", + "vertex-id":1, + "metric":10 + }, + { + "subnet-id":"2001:db8:1::1:2\/64", + "status":"Sync", + "origin":"ISIS_L2", + "advertised-router":"0000.0000.0002", + "vertex-id":2, + "metric":10 + }, + { + "subnet-id":"2001:db8:3::3:2\/64", + "status":"Sync", + "origin":"ISIS_L2", + "advertised-router":"0000.0000.0002", + "vertex-id":2, + "metric":10 + }, + { + "subnet-id":"2001:db8:3::3:3\/64", + "status":"Sync", + "origin":"ISIS_L2", + "advertised-router":"0000.0000.0003", + "vertex-id":3, + "metric":10 + }, + { + "subnet-id":"2001:db8:5::3:4\/64", + "status":"Sync", + "origin":"ISIS_L2", + "advertised-router":"0000.0000.0004", + "vertex-id":4, + "metric":10 + }, + { + "subnet-id":"2001:db8:5::4:3\/64", + "status":"Sync", + "origin":"ISIS_L2", + "advertised-router":"0000.0000.0003", + "vertex-id":3, + "metric":10 + }, + { + "subnet-id":"2001:db8:ffff::1\/128", + "status":"Sync", + "origin":"ISIS_L2", + "advertised-router":"0000.0000.0001", + "vertex-id":1, + "metric":10 + }, + { + "subnet-id":"2001:db8:ffff::2\/128", + "status":"Sync", + "origin":"ISIS_L2", + "advertised-router":"0000.0000.0002", + "vertex-id":2, + "metric":10 + }, + { + "subnet-id":"2001:db8:ffff::3\/128", + "status":"Sync", + "origin":"ISIS_L2", + "advertised-router":"0000.0000.0003", + "vertex-id":3, + "metric":10 + }, + { + "subnet-id":"2001:db8:ffff::4\/128", + "status":"Sync", + "origin":"ISIS_L2", + "advertised-router":"0000.0000.0004", + "vertex-id":4, + "metric":10, + "segment-routing":{ + "pref-sid":1400, + "algo":0, + "flags":"0x60" + } + } + ] + } +} diff --git a/tests/topotests/isis_te_topo1/test_isis_te_topo1.py b/tests/topotests/isis_te_topo1/test_isis_te_topo1.py new file mode 100644 index 0000000000..0e453d30e3 --- /dev/null +++ b/tests/topotests/isis_te_topo1/test_isis_te_topo1.py @@ -0,0 +1,265 @@ +#!/usr/bin/env python + +# +# test_isis_te_topo1.py +# Part of NetDEF Topology Tests +# +# Copyright (c) 2021 by Orange +# Author: Olivier Dugeon +# +# Permission to use, copy, modify, and/or distribute this software +# for any purpose with or without fee is hereby granted, provided +# that the above copyright notice and this permission notice appear +# in all copies. +# +# THE SOFTWARE IS PROVIDED "AS IS" AND NETDEF DISCLAIMS ALL WARRANTIES +# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NETDEF BE LIABLE FOR +# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY +# DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, +# WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS +# ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE +# OF THIS SOFTWARE. +# + +""" +test_isis_te_topo1.py: Test the FRR IS-IS with Traffic Engineering. + + +------------+ + | | + | R1 | + | 10.0.225.1 | + | | + +------------+ + r1-eth0| |r1-eth1 + | | + 10.0.0.0/24| |10.0.1.0/24 + | |2001:db8:1:/64 + | | + r2-eth0| |r2-eth1 + +------------+ +------------+ + | | | | + | R2 |r2-eth2 r3-eth0| R3 | + | 10.0.255.2 +------------------+ 10.0.255.3 | + | | 10.0.3.0/24 | | + +------------+ 2001:db8:3:/64 +------+-----+ + r2-eth3| r3-eth1| + | | + 10.0.4.0/24| | + | | + | | + r4-eth0| 2001:db8:5:/64| + +------------+ | + | | | + | R4 |r4-eth1 | + | 10.0.255.4 +-------------------------+ + | | + +------------+ + +""" + +import os +import sys +import json +from functools import partial + +# Save the Current Working Directory to find configuration files. +CWD = os.path.dirname(os.path.realpath(__file__)) +sys.path.append(os.path.join(CWD, "../")) + +# pylint: disable=C0413 + +# Import topogen and topotest helpers +from lib import topotest +from lib.topogen import Topogen, TopoRouter, get_topogen +from lib.topolog import logger + +# and Finally pytest +import pytest + +pytestmark = [pytest.mark.isisd] + + +def build_topo(tgen): + "Build function" + + # Create 4 routers + for routern in range(1, 5): + tgen.add_router("r{}".format(routern)) + + # Interconect router 1 and 2 with 2 links + switch = tgen.add_switch("s1") + switch.add_link(tgen.gears["r1"]) + switch.add_link(tgen.gears["r2"]) + switch = tgen.add_switch("s2") + switch.add_link(tgen.gears["r1"]) + switch.add_link(tgen.gears["r2"]) + + # Interconect router 3 and 2 + switch = tgen.add_switch("s3") + switch.add_link(tgen.gears["r3"]) + switch.add_link(tgen.gears["r2"]) + + # Interconect router 4 and 2 + switch = tgen.add_switch("s4") + switch.add_link(tgen.gears["r4"]) + switch.add_link(tgen.gears["r2"]) + + # Interconnect router 3 and 4 + switch = tgen.add_switch("s5") + switch.add_link(tgen.gears["r3"]) + switch.add_link(tgen.gears["r4"]) + + +def setup_module(mod): + "Sets up the pytest environment" + + logger.info("\n\n---- Starting IS-IS TE tests ----\n") + + tgen = Topogen(build_topo, mod.__name__) + tgen.start_topology() + + router_list = tgen.routers() + + for rname, router in router_list.items(): + router.load_config( + TopoRouter.RD_ZEBRA, os.path.join(CWD, "{}/zebra.conf".format(rname)) + ) + router.load_config( + TopoRouter.RD_ISIS, os.path.join(CWD, "{}/isisd.conf".format(rname)) + ) + + # Initialize all routers. + tgen.start_router() + + +def teardown_module(): + "Teardown the pytest environment" + + tgen = get_topogen() + tgen.stop_topology() + + logger.info("\n\n---- IS-IS TE tests End ----\n") + + +def compare_ted_json_output(tgen, rname, fileref): + "Compare TED JSON output" + + logger.info('Comparing router "%s" TED output', rname) + + filename = "{}/reference/{}".format(CWD, fileref) + expected = json.loads(open(filename).read()) + command = "show isis mpls-te database json" + + # Run test function until we get an result. Wait at most 60 seconds. + test_func = partial(topotest.router_json_cmp, tgen.gears[rname], command, expected) + _, diff = topotest.run_and_expect(test_func, None, count=60, wait=2) + assertmsg = '"{}" TED JSON output mismatches the expected result'.format(rname) + assert diff is None, assertmsg + + +def setup_testcase(msg): + "Setup test case" + + logger.info(msg) + tgen = get_topogen() + + # Skip if previous fatal error condition is raised + if tgen.routers_have_failure(): + pytest.skip(tgen.errors) + + return tgen + + +# Note that all routers must discover the same Network Topology, so the same TED. + + +def test_step1(): + "Step1: Check initial topology" + + tgen = setup_testcase("Step1: test initial IS-IS TE Data Base") + + for rname in ["r1", "r2", "r3", "r4"]: + compare_ted_json_output(tgen, rname, "ted_step1.json") + + +def test_step2(): + "Step2: Shutdown interface between r1 and r2 and verify that \ + corresponding Edges are removed from the TED on all routers " + + tgen = setup_testcase("Step2: Shutdown interface between r1 & r2") + + tgen.net["r1"].cmd('vtysh -c "conf t" -c "interface r1-eth1" -c "shutdown"') + tgen.net["r2"].cmd('vtysh -c "conf t" -c "interface r2-eth1" -c "shutdown"') + + for rname in ["r1", "r2", "r3", "r4"]: + compare_ted_json_output(tgen, rname, "ted_step2.json") + + +def test_step3(): + "Step3: Enable IPv6 address between r1 and r2 and verify that \ + corresponding Edges are added in the TED on all routers" + + tgen = setup_testcase("Step3: Add IPv6 on r1 and r2 interfaces") + + tgen.net["r1"].cmd('vtysh -c "conf t" -c "interface r1-eth0" -c "ipv6 address 2001:db8:0::1/64"') + tgen.net["r1"].cmd('vtysh -c "conf t" -c "interface r1-eth0" -c "ipv6 router isis TE"') + tgen.net["r2"].cmd('vtysh -c "conf t" -c "interface r2-eth0" -c "ipv6 address 2001:db8:0::2/64"') + tgen.net["r2"].cmd('vtysh -c "conf t" -c "interface r2-eth0" -c "ipv6 router isis TE"') + for rname in ["r1", "r2", "r3", "r4"]: + compare_ted_json_output(tgen, rname, "ted_step3.json") + + +def test_step4(): + "Step4: Modify Segment Routing Prefix SID advertisement on Router r4" + + tgen = setup_testcase("Step4: Modify Prefix SID on router r4") + + tgen.net["r4"].cmd('vtysh -c "conf t" -c "router isis TE" -c "segment-routing prefix 10.0.255.4/32 index 40"') + tgen.net["r4"].cmd('vtysh -c "conf t" -c "router isis TE" -c "segment-routing prefix 2001:db8:ffff::4/128 index 1040"') + + for rname in ["r1", "r2", "r3", "r4"]: + compare_ted_json_output(tgen, rname, "ted_step4.json") + + +def test_step5(): + "Step5: Re-enable interface between r1 & r2 and verify that corresponding \ + Edges are added in the TED on all routers" + + tgen = setup_testcase("Step5: Re-enable interface between r1 & r2") + + tgen.net["r1"].cmd('vtysh -c "conf t" -c "interface r1-eth1" -c "no shutdown"') + tgen.net["r2"].cmd('vtysh -c "conf t" -c "interface r2-eth1" -c "no shutdown"') + + for rname in ["r1", "r2", "r3", "r4"]: + compare_ted_json_output(tgen, rname, "ted_step5.json") + + +def test_step6(): + "Step6: Set delay and jitter for interface r4-eth0 on r4, remove use-bw \ + for interface r2-eth3 on r2 and verify that corresponding Edges are \ + updated in the TED on all routers" + + tgen = setup_testcase("Step6: Modify link parameters on r2 & r4") + + tgen.net["r2"].cmd('vtysh -c "conf t" -c "interface r2-eth3" -c "link-params" -c "no use-bw"') + tgen.net["r4"].cmd('vtysh -c "conf t" -c "interface r4-eth0" -c "link-params" -c "delay 20000"') + tgen.net["r4"].cmd('vtysh -c "conf t" -c "interface r4-eth0" -c "link-params" -c "delay-variation 10000"') + + for rname in ["r1", "r2", "r3", "r4"]: + compare_ted_json_output(tgen, rname, "ted_step6.json") + + +def test_memory_leak(): + "Run the memory leak test and report results." + + tgen = get_topogen() + if not tgen.is_memleak_enabled(): + pytest.skip("Memory leak test/report is disabled") + + tgen.report_memory_leaks() + + +if __name__ == "__main__": + args = ["-s"] + sys.argv[1:] + sys.exit(pytest.main(args))