summaryrefslogtreecommitdiff
path: root/lib/filter_nb.c
diff options
context:
space:
mode:
Diffstat (limited to 'lib/filter_nb.c')
-rw-r--r--lib/filter_nb.c280
1 files changed, 257 insertions, 23 deletions
diff --git a/lib/filter_nb.c b/lib/filter_nb.c
index 2007b37cdf..cab108e4ba 100644
--- a/lib/filter_nb.c
+++ b/lib/filter_nb.c
@@ -1148,25 +1148,11 @@ static int lib_prefix_list_entry_action_modify(struct nb_cb_modify_args *args)
return NB_OK;
}
-/*
- * XPath: /frr-filter:lib/prefix-list/entry/ipv4-prefix
- */
-static int
-lib_prefix_list_entry_ipv4_prefix_modify(struct nb_cb_modify_args *args)
+static int lib_prefix_list_entry_prefix_modify(struct nb_cb_modify_args *args)
{
struct prefix_list_entry *ple;
struct prefix p;
- if (args->event == NB_EV_VALIDATE) {
- if (plist_is_dup_nb(args->dnode)) {
- snprintf(args->errmsg, args->errmsg_len,
- "duplicated prefix list value: %s",
- yang_dnode_get_string(args->dnode, NULL));
- return NB_ERR_VALIDATION;
- }
- return NB_OK;
- }
-
if (args->event != NB_EV_APPLY)
return NB_OK;
@@ -1193,8 +1179,7 @@ lib_prefix_list_entry_ipv4_prefix_modify(struct nb_cb_modify_args *args)
return NB_OK;
}
-static int
-lib_prefix_list_entry_ipv4_prefix_destroy(struct nb_cb_destroy_args *args)
+static int lib_prefix_list_entry_prefix_destroy(struct nb_cb_destroy_args *args)
{
struct prefix_list_entry *ple;
@@ -1215,6 +1200,67 @@ lib_prefix_list_entry_ipv4_prefix_destroy(struct nb_cb_destroy_args *args)
}
/*
+ * XPath: /frr-filter:lib/prefix-list/entry/ipv4-prefix
+ */
+static int
+lib_prefix_list_entry_ipv4_prefix_modify(struct nb_cb_modify_args *args)
+{
+
+ if (args->event == NB_EV_VALIDATE) {
+ return NB_OK;
+ }
+
+ if (args->event != NB_EV_APPLY)
+ return NB_OK;
+
+ return lib_prefix_list_entry_prefix_modify(args);
+}
+
+static int
+lib_prefix_list_entry_ipv4_prefix_destroy(struct nb_cb_destroy_args *args)
+{
+
+ if (args->event == NB_EV_VALIDATE) {
+ return NB_OK;
+ }
+
+ if (args->event != NB_EV_APPLY)
+ return NB_OK;
+
+ return lib_prefix_list_entry_prefix_destroy(args);
+}
+
+/*
+ * XPath: /frr-filter:lib/prefix-list/entry/ipv6-prefix
+ */
+static int
+lib_prefix_list_entry_ipv6_prefix_modify(struct nb_cb_modify_args *args)
+{
+
+ if (args->event == NB_EV_VALIDATE) {
+ return NB_OK;
+ }
+
+ if (args->event != NB_EV_APPLY)
+ return NB_OK;
+
+ return lib_prefix_list_entry_prefix_modify(args);
+}
+
+static int
+lib_prefix_list_entry_ipv6_prefix_destroy(struct nb_cb_destroy_args *args)
+{
+
+ if (args->event == NB_EV_VALIDATE) {
+ }
+
+ if (args->event != NB_EV_APPLY)
+ return NB_OK;
+
+ return lib_prefix_list_entry_prefix_destroy(args);
+}
+
+/*
* XPath: /frr-filter:lib/prefix-list/entry/ipv4-prefix-length-greater-or-equal
*/
static int lib_prefix_list_entry_ipv4_prefix_length_greater_or_equal_modify(
@@ -1256,6 +1302,19 @@ static int lib_prefix_list_entry_ipv4_prefix_length_greater_or_equal_destroy(
struct nb_cb_destroy_args *args)
{
struct prefix_list_entry *ple;
+ const char *af_type;
+
+ if (args->event == NB_EV_VALIDATE) {
+ const struct lyd_node *entry_dnode =
+ yang_dnode_get_parent(args->dnode, "prefix-list");
+ af_type = yang_dnode_get_string(entry_dnode, "./type");
+ if (strcmp(af_type, "ipv4")) {
+ snprintf(args->errmsg, args->errmsg_len,
+ "prefix-list type %s is mismatched.", af_type);
+ return NB_ERR_VALIDATION;
+ }
+ return NB_OK;
+ }
if (args->event != NB_EV_APPLY)
return NB_OK;
@@ -1315,6 +1374,101 @@ static int lib_prefix_list_entry_ipv4_prefix_length_lesser_or_equal_destroy(
struct nb_cb_destroy_args *args)
{
struct prefix_list_entry *ple;
+ const char *af_type;
+
+ if (args->event == NB_EV_VALIDATE) {
+ const struct lyd_node *entry_dnode =
+ yang_dnode_get_parent(args->dnode, "prefix-list");
+ af_type = yang_dnode_get_string(entry_dnode, "./type");
+ if (strcmp(af_type, "ipv4")) {
+ snprintf(args->errmsg, args->errmsg_len,
+ "prefix-list type %s is mismatched.", af_type);
+ return NB_ERR_VALIDATION;
+ }
+ return NB_OK;
+ }
+
+ if (args->event != NB_EV_APPLY)
+ return NB_OK;
+
+ ple = nb_running_get_entry(args->dnode, NULL, true);
+
+ /* Start prefix entry update procedure. */
+ prefix_list_entry_update_start(ple);
+
+ ple->ge = 0;
+
+ /* Finish prefix entry update procedure. */
+ prefix_list_entry_update_finish(ple);
+
+ return NB_OK;
+}
+
+/*
+ * XPath: /frr-filter:lib/prefix-list/entry/ipv6-prefix-length-greater-or-equal
+ */
+static int lib_prefix_list_entry_ipv6_prefix_length_greater_or_equal_modify(
+ struct nb_cb_modify_args *args)
+{
+ struct prefix_list_entry *ple;
+ const char *af_type;
+
+ if (args->event == NB_EV_VALIDATE
+ && prefix_list_length_validate(args) != NB_OK)
+ return NB_ERR_VALIDATION;
+
+ if (args->event == NB_EV_VALIDATE) {
+ const struct lyd_node *entry_dnode =
+ yang_dnode_get_parent(args->dnode, "prefix-list");
+ af_type = yang_dnode_get_string(entry_dnode, "./type");
+ if (strcmp(af_type, "ipv6")) {
+ snprintf(args->errmsg, args->errmsg_len,
+ "prefix-list type %s is mismatched.", af_type);
+ return NB_ERR_VALIDATION;
+ }
+
+ if (plist_is_dup_nb(args->dnode)) {
+ snprintf(args->errmsg, args->errmsg_len,
+ "duplicated prefix list value: %s",
+ yang_dnode_get_string(args->dnode, NULL));
+ return NB_ERR_VALIDATION;
+ }
+ return NB_OK;
+ }
+
+ if (args->event != NB_EV_APPLY)
+ return NB_OK;
+
+ ple = nb_running_get_entry(args->dnode, NULL, true);
+
+ /* Start prefix entry update procedure. */
+ prefix_list_entry_update_start(ple);
+
+ ple->ge = yang_dnode_get_uint8(args->dnode, NULL);
+
+ /* Finish prefix entry update procedure. */
+ prefix_list_entry_update_finish(ple);
+
+ return NB_OK;
+}
+
+static int lib_prefix_list_entry_ipv6_prefix_length_greater_or_equal_destroy(
+ struct nb_cb_destroy_args *args)
+{
+ struct prefix_list_entry *ple;
+ const char *af_type;
+
+ if (args->event == NB_EV_VALIDATE) {
+ const struct lyd_node *entry_dnode =
+ yang_dnode_get_parent(args->dnode, "prefix-list");
+ af_type = yang_dnode_get_string(entry_dnode, "./type");
+ if (strcmp(af_type, "ipv6")) {
+ snprintf(args->errmsg, args->errmsg_len,
+ "prefix-list type %s is mismatched.", af_type);
+ return NB_ERR_VALIDATION;
+ }
+ return NB_OK;
+ }
if (args->event != NB_EV_APPLY)
return NB_OK;
@@ -1333,6 +1487,86 @@ static int lib_prefix_list_entry_ipv4_prefix_length_lesser_or_equal_destroy(
}
/*
+ * XPath: /frr-filter:lib/prefix-list/entry/ipv6-prefix-length-lesser-or-equal
+ */
+static int lib_prefix_list_entry_ipv6_prefix_length_lesser_or_equal_modify(
+ struct nb_cb_modify_args *args)
+{
+ struct prefix_list_entry *ple;
+ const char *af_type;
+
+ if (args->event == NB_EV_VALIDATE
+ && prefix_list_length_validate(args) != NB_OK)
+ return NB_ERR_VALIDATION;
+
+ if (args->event == NB_EV_VALIDATE) {
+ const struct lyd_node *entry_dnode =
+ yang_dnode_get_parent(args->dnode, "prefix-list");
+ af_type = yang_dnode_get_string(entry_dnode, "./type");
+ if (strcmp(af_type, "ipv6")) {
+ snprintf(args->errmsg, args->errmsg_len,
+ "prefix-list type %s is mismatched.", af_type);
+ return NB_ERR_VALIDATION;
+ }
+ if (plist_is_dup_nb(args->dnode)) {
+ snprintf(args->errmsg, args->errmsg_len,
+ "duplicated prefix list value: %s",
+ yang_dnode_get_string(args->dnode, NULL));
+ return NB_ERR_VALIDATION;
+ }
+ return NB_OK;
+ }
+
+ if (args->event != NB_EV_APPLY)
+ return NB_OK;
+
+ ple = nb_running_get_entry(args->dnode, NULL, true);
+
+ /* Start prefix entry update procedure. */
+ prefix_list_entry_update_start(ple);
+
+ ple->le = yang_dnode_get_uint8(args->dnode, NULL);
+
+ /* Finish prefix entry update procedure. */
+ prefix_list_entry_update_finish(ple);
+
+ return NB_OK;
+}
+
+static int lib_prefix_list_entry_ipv6_prefix_length_lesser_or_equal_destroy(
+ struct nb_cb_destroy_args *args)
+{
+ struct prefix_list_entry *ple;
+ const char *af_type;
+
+ if (args->event == NB_EV_VALIDATE) {
+ const struct lyd_node *entry_dnode =
+ yang_dnode_get_parent(args->dnode, "prefix-list");
+ af_type = yang_dnode_get_string(entry_dnode, "./type");
+ if (strcmp(af_type, "ipv6")) {
+ snprintf(args->errmsg, args->errmsg_len,
+ "prefix-list type %s is mismatched.", af_type);
+ return NB_ERR_VALIDATION;
+ }
+ return NB_OK;
+ }
+ if (args->event != NB_EV_APPLY)
+ return NB_OK;
+
+ ple = nb_running_get_entry(args->dnode, NULL, true);
+
+ /* Start prefix entry update procedure. */
+ prefix_list_entry_update_start(ple);
+
+ ple->le = 0;
+
+ /* Finish prefix entry update procedure. */
+ prefix_list_entry_update_finish(ple);
+
+ return NB_OK;
+}
+
+/*
* XPath: /frr-filter:lib/prefix-list/entry/any
*/
static int lib_prefix_list_entry_any_create(struct nb_cb_create_args *args)
@@ -1583,22 +1817,22 @@ const struct frr_yang_module_info frr_filter_info = {
{
.xpath = "/frr-filter:lib/prefix-list/entry/ipv6-prefix",
.cbs = {
- .modify = lib_prefix_list_entry_ipv4_prefix_modify,
- .destroy = lib_prefix_list_entry_ipv4_prefix_destroy,
+ .modify = lib_prefix_list_entry_ipv6_prefix_modify,
+ .destroy = lib_prefix_list_entry_ipv6_prefix_destroy,
}
},
{
.xpath = "/frr-filter:lib/prefix-list/entry/ipv6-prefix-length-greater-or-equal",
.cbs = {
- .modify = lib_prefix_list_entry_ipv4_prefix_length_greater_or_equal_modify,
- .destroy = lib_prefix_list_entry_ipv4_prefix_length_greater_or_equal_destroy,
+ .modify = lib_prefix_list_entry_ipv6_prefix_length_greater_or_equal_modify,
+ .destroy = lib_prefix_list_entry_ipv6_prefix_length_greater_or_equal_destroy,
}
},
{
.xpath = "/frr-filter:lib/prefix-list/entry/ipv6-prefix-length-lesser-or-equal",
.cbs = {
- .modify = lib_prefix_list_entry_ipv4_prefix_length_lesser_or_equal_modify,
- .destroy = lib_prefix_list_entry_ipv4_prefix_length_lesser_or_equal_destroy,
+ .modify = lib_prefix_list_entry_ipv6_prefix_length_lesser_or_equal_modify,
+ .destroy = lib_prefix_list_entry_ipv6_prefix_length_lesser_or_equal_destroy,
}
},
{