mirror of
https://git.proxmox.com/git/mirror_frr
synced 2025-08-14 10:37:29 +00:00
Merge pull request #8907 from idryzhov/isis-batching
Fix ISIS config batching
This commit is contained in:
commit
065549df13
@ -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,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");
|
"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)) {
|
|
||||||
snprintf(
|
yang_dnode_iterate(sysid_iter_cb, &iter, args->dnode,
|
||||||
args->errmsg, args->errmsg_len,
|
"../area-address");
|
||||||
"System ID must not change when defining additional area addresses");
|
|
||||||
return NB_ERR_VALIDATION;
|
if (!iter.same) {
|
||||||
}
|
snprintf(
|
||||||
|
args->errmsg, args->errmsg_len,
|
||||||
|
"System ID must not change when defining additional area addresses");
|
||||||
|
return NB_ERR_VALIDATION;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case NB_EV_PREPARE:
|
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)
|
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;
|
||||||
|
Loading…
Reference in New Issue
Block a user