]> git.proxmox.com Git - mirror_frr.git/blobdiff - lib/routemap_northbound.c
bgpd: Wrap IPV4_CLASS_DE into ipv4_unicast_valid() helper
[mirror_frr.git] / lib / routemap_northbound.c
index 410eb51f5e1712b6be6400a1cb747eb33590453b..0ccfe98af031f01a0fb62aceca6427c2db2b98f8 100644 (file)
@@ -140,6 +140,30 @@ static int lib_route_map_destroy(struct nb_cb_destroy_args *args)
        return NB_OK;
 }
 
+/*
+ * XPath: /frr-route-map:lib/route-map/optimization-disabled
+ */
+static int
+lib_route_map_optimization_disabled_modify(struct nb_cb_modify_args *args)
+{
+       struct route_map *rm;
+       bool disabled = yang_dnode_get_bool(args->dnode, NULL);
+
+       switch (args->event) {
+       case NB_EV_VALIDATE:
+       case NB_EV_PREPARE:
+       case NB_EV_ABORT:
+               /* NOTHING */
+               break;
+       case NB_EV_APPLY:
+               rm = nb_running_get_entry(args->dnode, NULL, true);
+               rm->optimization_disabled = disabled;
+               break;
+       }
+
+       return NB_OK;
+}
+
 /*
  * XPath: /frr-route-map:lib/route-map/entry
  */
@@ -247,6 +271,7 @@ lib_route_map_entry_description_destroy(struct nb_cb_destroy_args *args)
 static int lib_route_map_entry_action_modify(struct nb_cb_modify_args *args)
 {
        struct route_map_index *rmi;
+       struct route_map *map;
 
        switch (args->event) {
        case NB_EV_VALIDATE:
@@ -257,7 +282,15 @@ static int lib_route_map_entry_action_modify(struct nb_cb_modify_args *args)
        case NB_EV_APPLY:
                rmi = nb_running_get_entry(args->dnode, NULL, true);
                rmi->type = yang_dnode_get_enum(args->dnode, NULL);
-               /* TODO: notify? */
+               map = rmi->map;
+
+               /* Execute event hook. */
+               if (route_map_master.event_hook) {
+                       (*route_map_master.event_hook)(map->name);
+                       route_map_notify_dependencies(map->name,
+                                                     RMAP_EVENT_CALL_ADDED);
+               }
+
                break;
        }
 
@@ -568,6 +601,16 @@ static int lib_route_map_entry_match_condition_list_name_modify(
                        rhc->rhc_rmi, "ip next-hop", acl,
                        RMAP_EVENT_FILTER_ADDED,
                        args->errmsg, args->errmsg_len);
+       } else if (IS_MATCH_IPv6_NEXTHOP_LIST(condition)) {
+               if (rmap_match_set_hook.match_ipv6_next_hop == NULL)
+                       return NB_OK;
+               rhc->rhc_mhook = rmap_match_set_hook.no_match_ipv6_next_hop;
+               rhc->rhc_rule = "ipv6 next-hop";
+               rhc->rhc_event = RMAP_EVENT_FILTER_DELETED;
+               rv = rmap_match_set_hook.match_ipv6_next_hop(
+                       rhc->rhc_rmi, "ipv6 next-hop", acl,
+                       RMAP_EVENT_FILTER_ADDED, args->errmsg,
+                       args->errmsg_len);
        } else if (IS_MATCH_IPv4_NEXTHOP_PREFIX_LIST(condition)) {
                if (rmap_match_set_hook.match_ip_next_hop_prefix_list == NULL)
                        return NB_OK;
@@ -579,6 +622,16 @@ static int lib_route_map_entry_match_condition_list_name_modify(
                        rhc->rhc_rmi, "ip next-hop prefix-list", acl,
                        RMAP_EVENT_PLIST_ADDED,
                        args->errmsg, args->errmsg_len);
+       } else if (IS_MATCH_IPv6_NEXTHOP_PREFIX_LIST(condition)) {
+               if (rmap_match_set_hook.match_ipv6_next_hop_prefix_list == NULL)
+                       return NB_OK;
+               rhc->rhc_mhook =
+                       rmap_match_set_hook.no_match_ipv6_next_hop_prefix_list;
+               rhc->rhc_rule = "ipv6 next-hop prefix-list";
+               rhc->rhc_event = RMAP_EVENT_PLIST_DELETED;
+               rv = rmap_match_set_hook.match_ipv6_next_hop_prefix_list(
+                       rhc->rhc_rmi, "ipv6 next-hop prefix-list", acl,
+                       RMAP_EVENT_PLIST_ADDED, args->errmsg, args->errmsg_len);
        } else if (IS_MATCH_IPv6_ADDRESS_LIST(condition)) {
                if (rmap_match_set_hook.match_ipv6_address == NULL)
                        return NB_OK;
@@ -834,7 +887,7 @@ static int lib_route_map_entry_set_action_ipv4_address_modify(
                 * only implemented action.
                 */
                yang_dnode_get_ipv4(&ia, args->dnode, NULL);
-               if (ia.s_addr == INADDR_ANY || IPV4_CLASS_DE(ntohl(ia.s_addr)))
+               if (ia.s_addr == INADDR_ANY || !ipv4_unicast_valid(&ia))
                        return NB_ERR_VALIDATION;
                /* FALLTHROUGH */
        case NB_EV_PREPARE:
@@ -1197,6 +1250,13 @@ const struct frr_yang_module_info frr_route_map_info = {
                                .destroy = lib_route_map_destroy,
                        }
                },
+               {
+                       .xpath = "/frr-route-map:lib/route-map/optimization-disabled",
+                       .cbs = {
+                               .modify = lib_route_map_optimization_disabled_modify,
+                               .cli_show = route_map_optimization_disabled_show,
+                       }
+               },
                {
                        .xpath = "/frr-route-map:lib/route-map/entry",
                        .cbs = {