mirror of
https://git.proxmox.com/git/mirror_frr
synced 2025-08-07 10:49:24 +00:00
lib: show prefix error message on command failure
Use `args->errmsg` instead of just `zlog_info` for registering the error so the users don't need to check their log files. Signed-off-by: Rafael Zalamena <rzalamena@opensourcerouting.org>
This commit is contained in:
parent
ff35d21a1c
commit
8bc38cbd9a
@ -24,6 +24,7 @@
|
|||||||
|
|
||||||
#include "lib/northbound.h"
|
#include "lib/northbound.h"
|
||||||
#include "lib/prefix.h"
|
#include "lib/prefix.h"
|
||||||
|
#include "lib/printfrr.h"
|
||||||
|
|
||||||
#include "lib/filter.h"
|
#include "lib/filter.h"
|
||||||
#include "lib/plist.h"
|
#include "lib/plist.h"
|
||||||
@ -39,20 +40,19 @@ ipv4_network_addr(in_addr_t hostaddr, int masklen)
|
|||||||
return hostaddr & mask.s_addr;
|
return hostaddr & mask.s_addr;
|
||||||
}
|
}
|
||||||
|
|
||||||
static enum nb_error
|
static enum nb_error prefix_list_length_validate(struct nb_cb_modify_args *args)
|
||||||
prefix_list_length_validate(const struct lyd_node *dnode)
|
|
||||||
{
|
{
|
||||||
int type = yang_dnode_get_enum(dnode, "../../type");
|
int type = yang_dnode_get_enum(args->dnode, "../../type");
|
||||||
const char *xpath_le = NULL, *xpath_ge = NULL;
|
const char *xpath_le = NULL, *xpath_ge = NULL;
|
||||||
struct prefix p;
|
struct prefix p;
|
||||||
uint8_t le, ge;
|
uint8_t le, ge;
|
||||||
|
|
||||||
if (type == YPLT_IPV4) {
|
if (type == YPLT_IPV4) {
|
||||||
yang_dnode_get_prefix(&p, dnode, "../ipv4-prefix");
|
yang_dnode_get_prefix(&p, args->dnode, "../ipv4-prefix");
|
||||||
xpath_le = "../ipv4-prefix-length-lesser-or-equal";
|
xpath_le = "../ipv4-prefix-length-lesser-or-equal";
|
||||||
xpath_ge = "../ipv4-prefix-length-greater-or-equal";
|
xpath_ge = "../ipv4-prefix-length-greater-or-equal";
|
||||||
} else {
|
} else {
|
||||||
yang_dnode_get_prefix(&p, dnode, "../ipv6-prefix");
|
yang_dnode_get_prefix(&p, args->dnode, "../ipv6-prefix");
|
||||||
xpath_le = "../ipv6-prefix-length-lesser-or-equal";
|
xpath_le = "../ipv6-prefix-length-lesser-or-equal";
|
||||||
xpath_ge = "../ipv6-prefix-length-greater-or-equal";
|
xpath_ge = "../ipv6-prefix-length-greater-or-equal";
|
||||||
}
|
}
|
||||||
@ -61,19 +61,18 @@ prefix_list_length_validate(const struct lyd_node *dnode)
|
|||||||
* Check rule:
|
* Check rule:
|
||||||
* prefix length <= le.
|
* prefix length <= le.
|
||||||
*/
|
*/
|
||||||
if (yang_dnode_exists(dnode, xpath_le)) {
|
if (yang_dnode_exists(args->dnode, xpath_le)) {
|
||||||
le = yang_dnode_get_uint8(dnode, xpath_le);
|
le = yang_dnode_get_uint8(args->dnode, xpath_le);
|
||||||
if (p.prefixlen > le)
|
if (p.prefixlen > le)
|
||||||
goto log_and_fail;
|
goto log_and_fail;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Check rule:
|
* Check rule:
|
||||||
* prefix length < ge.
|
* prefix length < ge.
|
||||||
*/
|
*/
|
||||||
if (yang_dnode_exists(dnode, xpath_ge)) {
|
if (yang_dnode_exists(args->dnode, xpath_ge)) {
|
||||||
ge = yang_dnode_get_uint8(dnode, xpath_ge);
|
ge = yang_dnode_get_uint8(args->dnode, xpath_ge);
|
||||||
if (p.prefixlen >= ge)
|
if (p.prefixlen >= ge)
|
||||||
goto log_and_fail;
|
goto log_and_fail;
|
||||||
}
|
}
|
||||||
@ -82,18 +81,21 @@ prefix_list_length_validate(const struct lyd_node *dnode)
|
|||||||
* Check rule:
|
* Check rule:
|
||||||
* ge <= le.
|
* ge <= le.
|
||||||
*/
|
*/
|
||||||
if (yang_dnode_exists(dnode, xpath_le) &&
|
if (yang_dnode_exists(args->dnode, xpath_le)
|
||||||
yang_dnode_exists(dnode, xpath_ge)) {
|
&& yang_dnode_exists(args->dnode, xpath_ge)) {
|
||||||
le = yang_dnode_get_uint8(dnode, xpath_le);
|
le = yang_dnode_get_uint8(args->dnode, xpath_le);
|
||||||
ge = yang_dnode_get_uint8(dnode, xpath_ge);
|
ge = yang_dnode_get_uint8(args->dnode, xpath_ge);
|
||||||
if (ge > le)
|
if (ge > le)
|
||||||
goto log_and_fail;
|
goto log_and_fail;
|
||||||
}
|
}
|
||||||
|
|
||||||
return NB_OK;
|
return NB_OK;
|
||||||
|
|
||||||
log_and_fail:
|
log_and_fail:
|
||||||
zlog_info("prefix-list: invalid prefix range for %pFX: Make sure that mask length < ge <= le", &p);
|
snprintfrr(
|
||||||
|
args->errmsg, args->errmsg_len,
|
||||||
|
"Invalid prefix range for %pFX: Make sure that mask length < ge <= le",
|
||||||
|
&p);
|
||||||
return NB_ERR_VALIDATION;
|
return NB_ERR_VALIDATION;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -829,7 +831,7 @@ static int lib_prefix_list_entry_ipv4_prefix_length_greater_or_equal_modify(
|
|||||||
struct prefix_list_entry *ple;
|
struct prefix_list_entry *ple;
|
||||||
|
|
||||||
if (args->event == NB_EV_VALIDATE &&
|
if (args->event == NB_EV_VALIDATE &&
|
||||||
prefix_list_length_validate(args->dnode) != NB_OK)
|
prefix_list_length_validate(args) != NB_OK)
|
||||||
return NB_ERR_VALIDATION;
|
return NB_ERR_VALIDATION;
|
||||||
|
|
||||||
if (args->event != NB_EV_APPLY)
|
if (args->event != NB_EV_APPLY)
|
||||||
@ -878,7 +880,7 @@ static int lib_prefix_list_entry_ipv4_prefix_length_lesser_or_equal_modify(
|
|||||||
struct prefix_list_entry *ple;
|
struct prefix_list_entry *ple;
|
||||||
|
|
||||||
if (args->event == NB_EV_VALIDATE &&
|
if (args->event == NB_EV_VALIDATE &&
|
||||||
prefix_list_length_validate(args->dnode) != NB_OK)
|
prefix_list_length_validate(args) != NB_OK)
|
||||||
return NB_ERR_VALIDATION;
|
return NB_ERR_VALIDATION;
|
||||||
|
|
||||||
if (args->event != NB_EV_APPLY)
|
if (args->event != NB_EV_APPLY)
|
||||||
|
Loading…
Reference in New Issue
Block a user