]> git.proxmox.com Git - mirror_frr.git/blobdiff - isisd/isis_mt.c
lib: enforce vrf_name_to_id by returning default_vrf when name is null
[mirror_frr.git] / isisd / isis_mt.c
index d13f2a13f314ddb15a9a05566b9e88cb5c3192a9..f7d4c7170f5c8a759a011e50e4d86d58c3ac5852 100644 (file)
@@ -33,6 +33,14 @@ DEFINE_MTYPE_STATIC(ISISD, MT_AREA_SETTING, "ISIS MT Area Setting")
 DEFINE_MTYPE_STATIC(ISISD, MT_CIRCUIT_SETTING, "ISIS MT Circuit Setting")
 DEFINE_MTYPE_STATIC(ISISD, MT_ADJ_INFO, "ISIS MT Adjacency Info")
 
+bool isis_area_ipv6_dstsrc_enabled(struct isis_area *area)
+{
+       struct isis_area_mt_setting *area_mt_setting;
+       area_mt_setting = area_lookup_mt_setting(area, ISIS_MT_IPV6_DSTSRC);
+
+       return (area_mt_setting && area_mt_setting->enabled);
+}
+
 uint16_t isis_area_ipv6_topology(struct isis_area *area)
 {
        struct isis_area_mt_setting *area_mt_setting;
@@ -61,6 +69,8 @@ const char *isis_mtid2str(uint16_t mtid)
                return "ipv6-multicast";
        case ISIS_MT_IPV6_MGMT:
                return "ipv6-mgmt";
+       case ISIS_MT_IPV6_DSTSRC:
+               return "ipv6-dstsrc";
        default:
                snprintf(buf, sizeof(buf), "%" PRIu16, mtid);
                return buf;
@@ -81,6 +91,8 @@ uint16_t isis_str2mtid(const char *name)
                return ISIS_MT_IPV6_MULTICAST;
        if (!strcmp(name, "ipv6-mgmt"))
                return ISIS_MT_IPV6_MGMT;
+       if (!strcmp(name, "ipv6-dstsrc"))
+               return ISIS_MT_IPV6_DSTSRC;
        return -1;
 }
 
@@ -151,7 +163,7 @@ void area_mt_init(struct isis_area *area)
 
 void area_mt_finish(struct isis_area *area)
 {
-       list_delete_and_null(&area->mt_settings);
+       list_delete(&area->mt_settings);
 }
 
 struct isis_area_mt_setting *area_get_mt_setting(struct isis_area *area,
@@ -274,7 +286,7 @@ void circuit_mt_init(struct isis_circuit *circuit)
 
 void circuit_mt_finish(struct isis_circuit *circuit)
 {
-       list_delete_and_null(&circuit->mt_settings);
+       list_delete(&circuit->mt_settings);
 }
 
 struct isis_circuit_mt_setting *
@@ -290,7 +302,8 @@ circuit_get_mt_setting(struct isis_circuit *circuit, uint16_t mtid)
        return setting;
 }
 
-int circuit_write_mt_settings(struct isis_circuit *circuit, struct vty *vty)
+static int circuit_write_mt_settings(struct isis_circuit *circuit,
+                                    struct vty *vty)
 {
        int written = 0;
        struct listnode *node;
@@ -299,7 +312,7 @@ int circuit_write_mt_settings(struct isis_circuit *circuit, struct vty *vty)
        for (ALL_LIST_ELEMENTS_RO(circuit->mt_settings, node, setting)) {
                const char *name = isis_mtid2str(setting->mtid);
                if (name && !setting->enabled) {
-                       vty_out(vty, " no isis topology %s\n", name);
+                       vty_out(vty, " no " PROTO_NAME " topology %s\n", name);
                        written++;
                }
        }
@@ -385,7 +398,7 @@ bool tlvs_to_adj_mt_set(struct isis_tlvs *tlvs, bool v4_usable, bool v6_usable,
                    && !tlvs->mt_router_info_empty) {
                        /* Other end does not have MT enabled */
                        if (mt_settings[i]->mtid == ISIS_MT_IPV4_UNICAST
-                           && v4_usable)
+                           && (v4_usable || v6_usable))
                                adj_mt_set(adj, intersect_count++,
                                           ISIS_MT_IPV4_UNICAST);
                } else {
@@ -539,3 +552,9 @@ void tlvs_add_mt_p2p(struct isis_tlvs *tlvs, struct isis_circuit *circuit,
        tlvs_add_mt_set(circuit->area, tlvs, adj->mt_count, adj->mt_set, id,
                        metric, subtlvs, subtlv_len);
 }
+
+void mt_init(void)
+{
+       hook_register(isis_circuit_config_write,
+                     circuit_write_mt_settings);
+}