]> 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 db06e9caac75653dc80b1810ff808f1d09da408e..0ccfe98af031f01a0fb62aceca6427c2db2b98f8 100644 (file)
@@ -271,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:
@@ -281,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;
        }
 
@@ -592,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;
@@ -603,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;
@@ -858,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: