]> git.proxmox.com Git - mirror_frr.git/blobdiff - lib/routemap_northbound.c
Merge pull request #12798 from donaldsharp/rib_match_multicast
[mirror_frr.git] / lib / routemap_northbound.c
index db06e9caac75653dc80b1810ff808f1d09da408e..ab127dd0fcbf4e718136d0aa0e9c7bd1868f56aa 100644 (file)
@@ -1,23 +1,9 @@
+// SPDX-License-Identifier: GPL-2.0-or-later
 /*
  * Route map northbound implementation.
  *
  * Copyright (C) 2019 Network Device Education Foundation, Inc. ("NetDEF")
  *                    Rafael Zalamena
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
- * 02110-1301 USA.
  */
 
 #include <zebra.h>
@@ -271,6 +257,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:
@@ -281,7 +268,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;
        }
 
@@ -592,6 +587,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;
@@ -603,6 +608,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;
@@ -858,7 +873,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: