lib: Ignore duplicate alist/plist entries in CLI

If duplicate value is entered, the whole plist/alist just dropped.

Before:
```
$ grep prefix-list /etc/frr/frr.conf
ip prefix-list test seq 5 permit 1.1.1.1/32
ip prefix-list test seq 10 permit 1.1.1.1/32
$ systemctl restart frr
$ vtysh -c 'show run | include prefix-list'
$
```

After:
```
$ grep prefix-list /etc/frr/frr.conf
ip prefix-list test seq 5 permit 1.1.1.1/32
ip prefix-list test seq 10 permit 1.1.1.1/32
$ systemctl restart frr
$ vtysh -c 'show run | include prefix-list'
ip prefix-list test seq 5 permit 1.1.1.1/32
```

Signed-off-by: Donatas Abraitis <donatas@opensourcerouting.org>
This commit is contained in:
Donatas Abraitis 2022-04-25 19:06:49 +03:00
parent d45a846e5c
commit 1db0e0c6c8

View File

@ -151,28 +151,25 @@ DEFPY_YANG(
* Backward compatibility: don't complain about duplicated values, * Backward compatibility: don't complain about duplicated values,
* just silently accept. * just silently accept.
*/ */
if (seq_str == NULL) { ada.ada_type = "ipv4";
ada.ada_type = "ipv4"; ada.ada_name = name;
ada.ada_name = name; ada.ada_action = action;
ada.ada_action = action; if (host_str && mask_str == NULL) {
if (host_str && mask_str == NULL) { ada.ada_xpath[0] = "./host";
ada.ada_xpath[0] = "./host"; ada.ada_value[0] = host_str;
ada.ada_value[0] = host_str; } else if (host_str && mask_str) {
} else if (host_str && mask_str) { ada.ada_xpath[0] = "./network/address";
ada.ada_xpath[0] = "./network/address"; ada.ada_value[0] = host_str;
ada.ada_value[0] = host_str; ada.ada_xpath[1] = "./network/mask";
ada.ada_xpath[1] = "./network/mask"; ada.ada_value[1] = mask_str;
ada.ada_value[1] = mask_str; } else {
} else { ada.ada_xpath[0] = "./source-any";
ada.ada_xpath[0] = "./source-any"; ada.ada_value[0] = "";
ada.ada_value[0] = "";
}
/* Duplicated entry without sequence, just quit. */
if (acl_is_dup(vty->candidate_config->dnode, &ada))
return CMD_SUCCESS;
} }
if (acl_is_dup(vty->candidate_config->dnode, &ada))
return CMD_SUCCESS;
/* /*
* Create the access-list first, so we can generate sequence if * Create the access-list first, so we can generate sequence if
* none given (backward compatibility). * none given (backward compatibility).
@ -280,49 +277,46 @@ DEFPY_YANG(
* Backward compatibility: don't complain about duplicated values, * Backward compatibility: don't complain about duplicated values,
* just silently accept. * just silently accept.
*/ */
if (seq_str == NULL) { ada.ada_type = "ipv4";
ada.ada_type = "ipv4"; ada.ada_name = name;
ada.ada_name = name; ada.ada_action = action;
ada.ada_action = action; if (src_str && src_mask_str == NULL) {
if (src_str && src_mask_str == NULL) { ada.ada_xpath[idx] = "./host";
ada.ada_xpath[idx] = "./host"; ada.ada_value[idx] = src_str;
ada.ada_value[idx] = src_str; idx++;
idx++; } else if (src_str && src_mask_str) {
} else if (src_str && src_mask_str) { ada.ada_xpath[idx] = "./network/address";
ada.ada_xpath[idx] = "./network/address"; ada.ada_value[idx] = src_str;
ada.ada_value[idx] = src_str; idx++;
idx++; ada.ada_xpath[idx] = "./network/mask";
ada.ada_xpath[idx] = "./network/mask"; ada.ada_value[idx] = src_mask_str;
ada.ada_value[idx] = src_mask_str; idx++;
idx++; } else {
} else { ada.ada_xpath[idx] = "./source-any";
ada.ada_xpath[idx] = "./source-any"; ada.ada_value[idx] = "";
ada.ada_value[idx] = ""; idx++;
idx++;
}
if (dst_str && dst_mask_str == NULL) {
ada.ada_xpath[idx] = "./destination-host";
ada.ada_value[idx] = dst_str;
idx++;
} else if (dst_str && dst_mask_str) {
ada.ada_xpath[idx] = "./destination-network/address";
ada.ada_value[idx] = dst_str;
idx++;
ada.ada_xpath[idx] = "./destination-network/mask";
ada.ada_value[idx] = dst_mask_str;
idx++;
} else {
ada.ada_xpath[idx] = "./destination-any";
ada.ada_value[idx] = "";
idx++;
}
/* Duplicated entry without sequence, just quit. */
if (acl_is_dup(vty->candidate_config->dnode, &ada))
return CMD_SUCCESS;
} }
if (dst_str && dst_mask_str == NULL) {
ada.ada_xpath[idx] = "./destination-host";
ada.ada_value[idx] = dst_str;
idx++;
} else if (dst_str && dst_mask_str) {
ada.ada_xpath[idx] = "./destination-network/address";
ada.ada_value[idx] = dst_str;
idx++;
ada.ada_xpath[idx] = "./destination-network/mask";
ada.ada_value[idx] = dst_mask_str;
idx++;
} else {
ada.ada_xpath[idx] = "./destination-any";
ada.ada_value[idx] = "";
idx++;
}
if (acl_is_dup(vty->candidate_config->dnode, &ada))
return CMD_SUCCESS;
/* /*
* Create the access-list first, so we can generate sequence if * Create the access-list first, so we can generate sequence if
* none given (backward compatibility). * none given (backward compatibility).
@ -466,28 +460,25 @@ DEFPY_YANG(
* Backward compatibility: don't complain about duplicated values, * Backward compatibility: don't complain about duplicated values,
* just silently accept. * just silently accept.
*/ */
if (seq_str == NULL) { ada.ada_type = "ipv4";
ada.ada_type = "ipv4"; ada.ada_name = name;
ada.ada_name = name; ada.ada_action = action;
ada.ada_action = action;
if (prefix_str) { if (prefix_str) {
ada.ada_xpath[0] = "./ipv4-prefix"; ada.ada_xpath[0] = "./ipv4-prefix";
ada.ada_value[0] = prefix_str; ada.ada_value[0] = prefix_str;
if (exact) { if (exact) {
ada.ada_xpath[1] = "./ipv4-exact-match"; ada.ada_xpath[1] = "./ipv4-exact-match";
ada.ada_value[1] = "true"; ada.ada_value[1] = "true";
}
} else {
ada.ada_xpath[0] = "./any";
ada.ada_value[0] = "";
} }
} else {
/* Duplicated entry without sequence, just quit. */ ada.ada_xpath[0] = "./any";
if (acl_is_dup(vty->candidate_config->dnode, &ada)) ada.ada_value[0] = "";
return CMD_SUCCESS;
} }
if (acl_is_dup(vty->candidate_config->dnode, &ada))
return CMD_SUCCESS;
/* /*
* Create the access-list first, so we can generate sequence if * Create the access-list first, so we can generate sequence if
* none given (backward compatibility). * none given (backward compatibility).
@ -656,28 +647,25 @@ DEFPY_YANG(
* Backward compatibility: don't complain about duplicated values, * Backward compatibility: don't complain about duplicated values,
* just silently accept. * just silently accept.
*/ */
if (seq_str == NULL) { ada.ada_type = "ipv6";
ada.ada_type = "ipv6"; ada.ada_name = name;
ada.ada_name = name; ada.ada_action = action;
ada.ada_action = action;
if (prefix_str) { if (prefix_str) {
ada.ada_xpath[0] = "./ipv6-prefix"; ada.ada_xpath[0] = "./ipv6-prefix";
ada.ada_value[0] = prefix_str; ada.ada_value[0] = prefix_str;
if (exact) { if (exact) {
ada.ada_xpath[1] = "./ipv6-exact-match"; ada.ada_xpath[1] = "./ipv6-exact-match";
ada.ada_value[1] = "true"; ada.ada_value[1] = "true";
}
} else {
ada.ada_xpath[0] = "./any";
ada.ada_value[0] = "";
} }
} else {
/* Duplicated entry without sequence, just quit. */ ada.ada_xpath[0] = "./any";
if (acl_is_dup(vty->candidate_config->dnode, &ada)) ada.ada_value[0] = "";
return CMD_SUCCESS;
} }
if (acl_is_dup(vty->candidate_config->dnode, &ada))
return CMD_SUCCESS;
/* /*
* Create the access-list first, so we can generate sequence if * Create the access-list first, so we can generate sequence if
* none given (backward compatibility). * none given (backward compatibility).
@ -850,24 +838,21 @@ DEFPY_YANG(
* Backward compatibility: don't complain about duplicated values, * Backward compatibility: don't complain about duplicated values,
* just silently accept. * just silently accept.
*/ */
if (seq_str == NULL) { ada.ada_type = "mac";
ada.ada_type = "mac"; ada.ada_name = name;
ada.ada_name = name; ada.ada_action = action;
ada.ada_action = action;
if (mac_str) { if (mac_str) {
ada.ada_xpath[0] = "./mac"; ada.ada_xpath[0] = "./mac";
ada.ada_value[0] = mac_str; ada.ada_value[0] = mac_str;
} else { } else {
ada.ada_xpath[0] = "./any"; ada.ada_xpath[0] = "./any";
ada.ada_value[0] = ""; ada.ada_value[0] = "";
}
/* Duplicated entry without sequence, just quit. */
if (acl_is_dup(vty->candidate_config->dnode, &ada))
return CMD_SUCCESS;
} }
if (acl_is_dup(vty->candidate_config->dnode, &ada))
return CMD_SUCCESS;
/* /*
* Create the access-list first, so we can generate sequence if * Create the access-list first, so we can generate sequence if
* none given (backward compatibility). * none given (backward compatibility).
@ -1272,23 +1257,20 @@ DEFPY_YANG(
* Backward compatibility: don't complain about duplicated values, * Backward compatibility: don't complain about duplicated values,
* just silently accept. * just silently accept.
*/ */
if (seq_str == NULL) { pda.pda_type = "ipv4";
pda.pda_type = "ipv4"; pda.pda_name = name;
pda.pda_name = name; pda.pda_action = action;
pda.pda_action = action; if (prefix_str) {
if (prefix_str) { prefix_copy(&pda.prefix, prefix);
prefix_copy(&pda.prefix, prefix); pda.ge = ge;
pda.ge = ge; pda.le = le;
pda.le = le; } else {
} else { pda.any = true;
pda.any = true;
}
/* Duplicated entry without sequence, just quit. */
if (plist_is_dup(vty->candidate_config->dnode, &pda))
return CMD_SUCCESS;
} }
if (plist_is_dup(vty->candidate_config->dnode, &pda))
return CMD_SUCCESS;
/* /*
* Create the prefix-list first, so we can generate sequence if * Create the prefix-list first, so we can generate sequence if
* none given (backward compatibility). * none given (backward compatibility).
@ -1476,23 +1458,20 @@ DEFPY_YANG(
* Backward compatibility: don't complain about duplicated values, * Backward compatibility: don't complain about duplicated values,
* just silently accept. * just silently accept.
*/ */
if (seq_str == NULL) { pda.pda_type = "ipv6";
pda.pda_type = "ipv6"; pda.pda_name = name;
pda.pda_name = name; pda.pda_action = action;
pda.pda_action = action; if (prefix_str) {
if (prefix_str) { prefix_copy(&pda.prefix, prefix);
prefix_copy(&pda.prefix, prefix); pda.ge = ge;
pda.ge = ge; pda.le = le;
pda.le = le; } else {
} else { pda.any = true;
pda.any = true;
}
/* Duplicated entry without sequence, just quit. */
if (plist_is_dup(vty->candidate_config->dnode, &pda))
return CMD_SUCCESS;
} }
if (plist_is_dup(vty->candidate_config->dnode, &pda))
return CMD_SUCCESS;
/* /*
* Create the prefix-list first, so we can generate sequence if * Create the prefix-list first, so we can generate sequence if
* none given (backward compatibility). * none given (backward compatibility).