diff --git a/isisd/isis_nb_config.c b/isisd/isis_nb_config.c index 2622c5b51b..4a01c728f0 100644 --- a/isisd/isis_nb_config.c +++ b/isisd/isis_nb_config.c @@ -111,6 +111,28 @@ int isis_instance_is_type_modify(struct nb_cb_modify_args *args) return NB_OK; } +struct sysid_iter { + struct area_addr *addr; + bool same; +}; + +static int sysid_iter_cb(const struct lyd_node *dnode, void *arg) +{ + struct sysid_iter *iter = arg; + struct area_addr addr; + const char *net; + + net = yang_dnode_get_string(dnode, NULL); + addr.addr_len = dotformat2buff(addr.area_addr, net); + + if (memcmp(GETSYSID(iter->addr), GETSYSID((&addr)), ISIS_SYS_ID_LEN)) { + iter->same = false; + return YANG_ITER_STOP; + } + + return YANG_ITER_CONTINUE; +} + /* * XPath: /frr-isisd:isis/instance/area-address */ @@ -119,14 +141,12 @@ int isis_instance_area_address_create(struct nb_cb_create_args *args) struct isis_area *area; struct area_addr addr, *addrr = NULL, *addrp = NULL; struct listnode *node; + struct sysid_iter iter; uint8_t buff[255]; const char *net_title = yang_dnode_get_string(args->dnode, NULL); switch (args->event) { case NB_EV_VALIDATE: - area = nb_running_get_entry(args->dnode, NULL, false); - if (area == NULL) - return NB_ERR_VALIDATION; addr.addr_len = dotformat2buff(buff, net_title); memcpy(addr.area_addr, buff, addr.addr_len); if (addr.area_addr[addr.addr_len - 1] != 0) { @@ -135,15 +155,18 @@ int isis_instance_area_address_create(struct nb_cb_create_args *args) "nsel byte (last byte) in area address must be 0"); return NB_ERR_VALIDATION; } - if (area->isis->sysid_set) { - /* Check that the SystemID portions match */ - if (memcmp(area->isis->sysid, GETSYSID((&addr)), - ISIS_SYS_ID_LEN)) { - snprintf( - args->errmsg, args->errmsg_len, - "System ID must not change when defining additional area addresses"); - return NB_ERR_VALIDATION; - } + + iter.addr = &addr; + iter.same = true; + + yang_dnode_iterate(sysid_iter_cb, &iter, args->dnode, + "../area-address"); + + if (!iter.same) { + snprintf( + args->errmsg, args->errmsg_len, + "System ID must not change when defining additional area addresses"); + return NB_ERR_VALIDATION; } break; case NB_EV_PREPARE: @@ -2360,14 +2383,14 @@ int isis_instance_segment_routing_prefix_sid_map_prefix_sid_n_flag_clear_modify( int isis_instance_mpls_ldp_sync_create(struct nb_cb_create_args *args) { struct isis_area *area; + const char *vrfname; switch (args->event) { case NB_EV_VALIDATE: - area = nb_running_get_entry(args->dnode, NULL, false); - if (area == NULL || area->isis == NULL) - return NB_ERR_VALIDATION; + vrfname = yang_dnode_get_string( + lyd_parent(lyd_parent(args->dnode)), "./vrf"); - if (area->isis->vrf_id != VRF_DEFAULT) { + if (strcmp(vrfname, VRF_DEFAULT_NAME)) { snprintf(args->errmsg, args->errmsg_len, "LDP-Sync only runs on Default VRF"); return NB_ERR_VALIDATION; @@ -2404,14 +2427,15 @@ int isis_instance_mpls_ldp_sync_holddown_modify(struct nb_cb_modify_args *args) { struct isis_area *area; uint16_t holddown; + const char *vrfname; switch (args->event) { case NB_EV_VALIDATE: - area = nb_running_get_entry(args->dnode, NULL, false); - if (area == NULL || area->isis == NULL) - return NB_ERR_VALIDATION; + vrfname = yang_dnode_get_string( + lyd_parent(lyd_parent(lyd_parent(args->dnode))), + "./vrf"); - if (area->isis->vrf_id != VRF_DEFAULT) { + if (strcmp(vrfname, VRF_DEFAULT_NAME)) { snprintf(args->errmsg, args->errmsg_len, "LDP-Sync only runs on Default VRF"); return NB_ERR_VALIDATION; @@ -3180,26 +3204,14 @@ int lib_interface_isis_mpls_ldp_sync_modify(struct nb_cb_modify_args *args) struct isis_circuit *circuit; struct ldp_sync_info *ldp_sync_info; bool ldp_sync_enable; - struct interface *ifp; + const char *vrfname; switch (args->event) { case NB_EV_VALIDATE: - ifp = nb_running_get_entry( - lyd_parent(lyd_parent(lyd_parent(args->dnode))), NULL, - false); - if (ifp == NULL) - return NB_ERR_VALIDATION; - if (if_is_loopback(ifp)) { - snprintf(args->errmsg, args->errmsg_len, - "LDP-Sync does not run on loopback interface"); - return NB_ERR_VALIDATION; - } - - circuit = nb_running_get_entry(args->dnode, NULL, false); - if (circuit == NULL || circuit->area == NULL) - break; - - if (circuit->isis->vrf_id != VRF_DEFAULT) { + vrfname = yang_dnode_get_string( + lyd_parent(lyd_parent(lyd_parent(args->dnode))), + "./vrf"); + if (strcmp(vrfname, VRF_DEFAULT_NAME)) { snprintf(args->errmsg, args->errmsg_len, "LDP-Sync only runs on Default VRF"); return NB_ERR_VALIDATION; @@ -3236,27 +3248,14 @@ int lib_interface_isis_mpls_holddown_modify(struct nb_cb_modify_args *args) struct isis_circuit *circuit; struct ldp_sync_info *ldp_sync_info; uint16_t holddown; - struct interface *ifp; + const char *vrfname; switch (args->event) { case NB_EV_VALIDATE: - - ifp = nb_running_get_entry( - lyd_parent(lyd_parent(lyd_parent(args->dnode))), NULL, - false); - if (ifp == NULL) - return NB_ERR_VALIDATION; - if (if_is_loopback(ifp)) { - snprintf(args->errmsg, args->errmsg_len, - "LDP-Sync does not run on loopback interface"); - return NB_ERR_VALIDATION; - } - - circuit = nb_running_get_entry(args->dnode, NULL, false); - if (circuit == NULL || circuit->area == NULL) - break; - - if (circuit->isis->vrf_id != VRF_DEFAULT) { + vrfname = yang_dnode_get_string( + lyd_parent(lyd_parent(lyd_parent(args->dnode))), + "./vrf"); + if (strcmp(vrfname, VRF_DEFAULT_NAME)) { snprintf(args->errmsg, args->errmsg_len, "LDP-Sync only runs on Default VRF"); return NB_ERR_VALIDATION; @@ -3282,26 +3281,14 @@ int lib_interface_isis_mpls_holddown_destroy(struct nb_cb_destroy_args *args) { struct isis_circuit *circuit; struct ldp_sync_info *ldp_sync_info; - struct interface *ifp; + const char *vrfname; switch (args->event) { case NB_EV_VALIDATE: - ifp = nb_running_get_entry( - lyd_parent(lyd_parent(lyd_parent(args->dnode))), NULL, - false); - if (ifp == NULL) - return NB_ERR_VALIDATION; - if (if_is_loopback(ifp)) { - snprintf(args->errmsg, args->errmsg_len, - "LDP-Sync does not run on loopback interface"); - return NB_ERR_VALIDATION; - } - - circuit = nb_running_get_entry(args->dnode, NULL, false); - if (circuit == NULL || circuit->area == NULL) - break; - - if (circuit->isis->vrf_id != VRF_DEFAULT) { + vrfname = yang_dnode_get_string( + lyd_parent(lyd_parent(lyd_parent(args->dnode))), + "./vrf"); + if (strcmp(vrfname, VRF_DEFAULT_NAME)) { snprintf(args->errmsg, args->errmsg_len, "LDP-Sync only runs on Default VRF"); return NB_ERR_VALIDATION;