summaryrefslogtreecommitdiffstats
path: root/lib/routemap_northbound.c
diff options
context:
space:
mode:
authorJafar Al-Gharaibeh <jafar@atcorp.com>2023-04-06 06:55:13 +0200
committerJafar Al-Gharaibeh <jafar@atcorp.com>2023-04-18 07:48:16 +0200
commit055355e10432fcbf37038f3116ef7ac388013b3b (patch)
tree1b61db7f6ec0cb489d37aad4a7d4975253ed164b /lib/routemap_northbound.c
parentospfd: use rib metric as the base for set metric +/- (diff)
downloadfrr-055355e10432fcbf37038f3116ef7ac388013b3b.tar.xz
frr-055355e10432fcbf37038f3116ef7ac388013b3b.zip
lib, ospfd, yang: add route map set for min/max metric
Signed-off-by: Jafar Al-Gharaibeh <jafar@atcorp.com>
Diffstat (limited to 'lib/routemap_northbound.c')
-rw-r--r--lib/routemap_northbound.c118
1 files changed, 118 insertions, 0 deletions
diff --git a/lib/routemap_northbound.c b/lib/routemap_northbound.c
index ab127dd0f..465985099 100644
--- a/lib/routemap_northbound.c
+++ b/lib/routemap_northbound.c
@@ -1028,6 +1028,110 @@ lib_route_map_entry_set_action_value_destroy(struct nb_cb_destroy_args *args)
}
/*
+ * XPath: /frr-route-map:lib/route-map/entry/set-action/min-metric
+ */
+static int set_action_min_metric_modify(enum nb_event event,
+ const struct lyd_node *dnode,
+ union nb_resource *resource,
+ const char *value, char *errmsg,
+ size_t errmsg_len)
+{
+ struct routemap_hook_context *rhc;
+ int rv;
+
+ if (event != NB_EV_APPLY)
+ return NB_OK;
+
+ /* Check for hook function. */
+ if (rmap_match_set_hook.set_min_metric == NULL)
+ return NB_OK;
+
+ /* Add configuration. */
+ rhc = nb_running_get_entry(dnode, NULL, true);
+
+ /* Set destroy information. */
+ rhc->rhc_shook = rmap_match_set_hook.no_set_min_metric;
+ rhc->rhc_rule = "min-metric";
+
+ rv = rmap_match_set_hook.set_min_metric(rhc->rhc_rmi, "min-metric",
+ value, errmsg, errmsg_len);
+ if (rv != CMD_SUCCESS) {
+ rhc->rhc_shook = NULL;
+ return NB_ERR_INCONSISTENCY;
+ }
+
+ return NB_OK;
+}
+
+static int
+lib_route_map_entry_set_action_min_metric_modify(struct nb_cb_modify_args *args)
+{
+ const char *min_metric = yang_dnode_get_string(args->dnode, NULL);
+
+ return set_action_min_metric_modify(args->event, args->dnode,
+ args->resource, min_metric,
+ args->errmsg, args->errmsg_len);
+}
+
+static int lib_route_map_entry_set_action_min_metric_destroy(
+ struct nb_cb_destroy_args *args)
+{
+ return lib_route_map_entry_set_destroy(args);
+}
+
+/*
+ * XPath: /frr-route-map:lib/route-map/entry/set-action/max-metric
+ */
+static int set_action_max_metric_modify(enum nb_event event,
+ const struct lyd_node *dnode,
+ union nb_resource *resource,
+ const char *value, char *errmsg,
+ size_t errmsg_len)
+{
+ struct routemap_hook_context *rhc;
+ int rv;
+
+ if (event != NB_EV_APPLY)
+ return NB_OK;
+
+ /* Check for hook function. */
+ if (rmap_match_set_hook.set_max_metric == NULL)
+ return NB_OK;
+
+ /* Add configuration. */
+ rhc = nb_running_get_entry(dnode, NULL, true);
+
+ /* Set destroy information. */
+ rhc->rhc_shook = rmap_match_set_hook.no_set_max_metric;
+ rhc->rhc_rule = "max-metric";
+
+ rv = rmap_match_set_hook.set_max_metric(rhc->rhc_rmi, "max-metric",
+ value, errmsg, errmsg_len);
+ if (rv != CMD_SUCCESS) {
+ rhc->rhc_shook = NULL;
+ return NB_ERR_INCONSISTENCY;
+ }
+
+ return NB_OK;
+}
+
+static int
+lib_route_map_entry_set_action_max_metric_modify(struct nb_cb_modify_args *args)
+{
+ const char *max_metric = yang_dnode_get_string(args->dnode, NULL);
+
+ return set_action_max_metric_modify(args->event, args->dnode,
+ args->resource, max_metric,
+ args->errmsg, args->errmsg_len);
+}
+
+static int lib_route_map_entry_set_action_max_metric_destroy(
+ struct nb_cb_destroy_args *args)
+{
+ return lib_route_map_entry_set_destroy(args);
+}
+
+/*
* XPath: /frr-route-map:lib/route-map/entry/set-action/add-metric
*/
static int
@@ -1369,6 +1473,20 @@ const struct frr_yang_module_info frr_route_map_info = {
}
},
{
+ .xpath = "/frr-route-map:lib/route-map/entry/set-action/rmap-set-action/min-metric",
+ .cbs = {
+ .modify = lib_route_map_entry_set_action_min_metric_modify,
+ .destroy = lib_route_map_entry_set_action_min_metric_destroy,
+ }
+ },
+ {
+ .xpath = "/frr-route-map:lib/route-map/entry/set-action/rmap-set-action/max-metric",
+ .cbs = {
+ .modify = lib_route_map_entry_set_action_max_metric_modify,
+ .destroy = lib_route_map_entry_set_action_max_metric_destroy,
+ }
+ },
+ {
.xpath = "/frr-route-map:lib/route-map/entry/set-action/rmap-set-action/add-metric",
.cbs = {
.modify = lib_route_map_entry_set_action_add_metric_modify,