mirror of
https://git.proxmox.com/git/mirror_frr
synced 2025-06-14 14:46:57 +00:00
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:
parent
d45a846e5c
commit
1db0e0c6c8
263
lib/filter_cli.c
263
lib/filter_cli.c
@ -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).
|
||||||
|
Loading…
Reference in New Issue
Block a user