]> 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 3473ca2aea8cf12f6043d91fc5f739784aa199af..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>
@@ -601,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;
@@ -612,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;
@@ -867,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: