Merge pull request #8907 from idryzhov/isis-batching

Fix ISIS config batching
This commit is contained in:
Christian Hopps 2021-06-25 10:32:28 -04:00 committed by GitHub
commit 065549df13
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -111,6 +111,28 @@ int isis_instance_is_type_modify(struct nb_cb_modify_args *args)
return NB_OK; 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 * 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 isis_area *area;
struct area_addr addr, *addrr = NULL, *addrp = NULL; struct area_addr addr, *addrr = NULL, *addrp = NULL;
struct listnode *node; struct listnode *node;
struct sysid_iter iter;
uint8_t buff[255]; uint8_t buff[255];
const char *net_title = yang_dnode_get_string(args->dnode, NULL); const char *net_title = yang_dnode_get_string(args->dnode, NULL);
switch (args->event) { switch (args->event) {
case NB_EV_VALIDATE: 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); addr.addr_len = dotformat2buff(buff, net_title);
memcpy(addr.area_addr, buff, addr.addr_len); memcpy(addr.area_addr, buff, addr.addr_len);
if (addr.area_addr[addr.addr_len - 1] != 0) { if (addr.area_addr[addr.addr_len - 1] != 0) {
@ -135,16 +155,19 @@ int isis_instance_area_address_create(struct nb_cb_create_args *args)
"nsel byte (last byte) in area address must be 0"); "nsel byte (last byte) in area address must be 0");
return NB_ERR_VALIDATION; return NB_ERR_VALIDATION;
} }
if (area->isis->sysid_set) {
/* Check that the SystemID portions match */ iter.addr = &addr;
if (memcmp(area->isis->sysid, GETSYSID((&addr)), iter.same = true;
ISIS_SYS_ID_LEN)) {
yang_dnode_iterate(sysid_iter_cb, &iter, args->dnode,
"../area-address");
if (!iter.same) {
snprintf( snprintf(
args->errmsg, args->errmsg_len, args->errmsg, args->errmsg_len,
"System ID must not change when defining additional area addresses"); "System ID must not change when defining additional area addresses");
return NB_ERR_VALIDATION; return NB_ERR_VALIDATION;
} }
}
break; break;
case NB_EV_PREPARE: case NB_EV_PREPARE:
addrr = XMALLOC(MTYPE_ISIS_AREA_ADDR, sizeof(struct area_addr)); addrr = XMALLOC(MTYPE_ISIS_AREA_ADDR, sizeof(struct area_addr));
@ -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) int isis_instance_mpls_ldp_sync_create(struct nb_cb_create_args *args)
{ {
struct isis_area *area; struct isis_area *area;
const char *vrfname;
switch (args->event) { switch (args->event) {
case NB_EV_VALIDATE: case NB_EV_VALIDATE:
area = nb_running_get_entry(args->dnode, NULL, false); vrfname = yang_dnode_get_string(
if (area == NULL || area->isis == NULL) lyd_parent(lyd_parent(args->dnode)), "./vrf");
return NB_ERR_VALIDATION;
if (area->isis->vrf_id != VRF_DEFAULT) { if (strcmp(vrfname, VRF_DEFAULT_NAME)) {
snprintf(args->errmsg, args->errmsg_len, snprintf(args->errmsg, args->errmsg_len,
"LDP-Sync only runs on Default VRF"); "LDP-Sync only runs on Default VRF");
return NB_ERR_VALIDATION; 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; struct isis_area *area;
uint16_t holddown; uint16_t holddown;
const char *vrfname;
switch (args->event) { switch (args->event) {
case NB_EV_VALIDATE: case NB_EV_VALIDATE:
area = nb_running_get_entry(args->dnode, NULL, false); vrfname = yang_dnode_get_string(
if (area == NULL || area->isis == NULL) lyd_parent(lyd_parent(lyd_parent(args->dnode))),
return NB_ERR_VALIDATION; "./vrf");
if (area->isis->vrf_id != VRF_DEFAULT) { if (strcmp(vrfname, VRF_DEFAULT_NAME)) {
snprintf(args->errmsg, args->errmsg_len, snprintf(args->errmsg, args->errmsg_len,
"LDP-Sync only runs on Default VRF"); "LDP-Sync only runs on Default VRF");
return NB_ERR_VALIDATION; 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 isis_circuit *circuit;
struct ldp_sync_info *ldp_sync_info; struct ldp_sync_info *ldp_sync_info;
bool ldp_sync_enable; bool ldp_sync_enable;
struct interface *ifp; const char *vrfname;
switch (args->event) { switch (args->event) {
case NB_EV_VALIDATE: case NB_EV_VALIDATE:
ifp = nb_running_get_entry( vrfname = yang_dnode_get_string(
lyd_parent(lyd_parent(lyd_parent(args->dnode))), NULL, lyd_parent(lyd_parent(lyd_parent(args->dnode))),
false); "./vrf");
if (ifp == NULL) if (strcmp(vrfname, VRF_DEFAULT_NAME)) {
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) {
snprintf(args->errmsg, args->errmsg_len, snprintf(args->errmsg, args->errmsg_len,
"LDP-Sync only runs on Default VRF"); "LDP-Sync only runs on Default VRF");
return NB_ERR_VALIDATION; 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 isis_circuit *circuit;
struct ldp_sync_info *ldp_sync_info; struct ldp_sync_info *ldp_sync_info;
uint16_t holddown; uint16_t holddown;
struct interface *ifp; const char *vrfname;
switch (args->event) { switch (args->event) {
case NB_EV_VALIDATE: case NB_EV_VALIDATE:
vrfname = yang_dnode_get_string(
ifp = nb_running_get_entry( lyd_parent(lyd_parent(lyd_parent(args->dnode))),
lyd_parent(lyd_parent(lyd_parent(args->dnode))), NULL, "./vrf");
false); if (strcmp(vrfname, VRF_DEFAULT_NAME)) {
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) {
snprintf(args->errmsg, args->errmsg_len, snprintf(args->errmsg, args->errmsg_len,
"LDP-Sync only runs on Default VRF"); "LDP-Sync only runs on Default VRF");
return NB_ERR_VALIDATION; 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 isis_circuit *circuit;
struct ldp_sync_info *ldp_sync_info; struct ldp_sync_info *ldp_sync_info;
struct interface *ifp; const char *vrfname;
switch (args->event) { switch (args->event) {
case NB_EV_VALIDATE: case NB_EV_VALIDATE:
ifp = nb_running_get_entry( vrfname = yang_dnode_get_string(
lyd_parent(lyd_parent(lyd_parent(args->dnode))), NULL, lyd_parent(lyd_parent(lyd_parent(args->dnode))),
false); "./vrf");
if (ifp == NULL) if (strcmp(vrfname, VRF_DEFAULT_NAME)) {
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) {
snprintf(args->errmsg, args->errmsg_len, snprintf(args->errmsg, args->errmsg_len,
"LDP-Sync only runs on Default VRF"); "LDP-Sync only runs on Default VRF");
return NB_ERR_VALIDATION; return NB_ERR_VALIDATION;