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:
Rafael Zalamena 2020-08-13 19:59:47 -03:00
parent ff35d21a1c
commit 8bc38cbd9a

View File

@ -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)