diff options
author | Donatas Abraitis <donatas.abraitis@gmail.com> | 2019-06-21 17:51:33 +0200 |
---|---|---|
committer | Donatas Abraitis <donatas.abraitis@gmail.com> | 2019-06-21 23:07:20 +0200 |
commit | b6c0e91356c612c269a1a50555c12c12bc038310 (patch) | |
tree | 954a4e5d8d47326735853153283012549b86af44 /ospfd/ospf_routemap.c | |
parent | Prefix list count (#4578) (diff) | |
download | frr-b6c0e91356c612c269a1a50555c12c12bc038310.tar.xz frr-b6c0e91356c612c269a1a50555c12c12bc038310.zip |
rmap: Add hooks into zebra,ospf,rip for `match ip next-hop type blackhole`
Signed-off-by: Donatas Abraitis <donatas.abraitis@gmail.com>
Diffstat (limited to 'ospfd/ospf_routemap.c')
-rw-r--r-- | ospfd/ospf_routemap.c | 38 |
1 files changed, 38 insertions, 0 deletions
diff --git a/ospfd/ospf_routemap.c b/ospfd/ospf_routemap.c index ab2d5ae58..bb7e97bf7 100644 --- a/ospfd/ospf_routemap.c +++ b/ospfd/ospf_routemap.c @@ -210,6 +210,40 @@ struct route_map_rule_cmd route_match_ip_next_hop_prefix_list_cmd = { route_match_ip_next_hop_prefix_list_compile, route_match_ip_next_hop_prefix_list_free}; +/* `match ip next-hop type <blackhole>' */ + +static route_map_result_t +route_match_ip_next_hop_type(void *rule, const struct prefix *prefix, + route_map_object_t type, void *object) +{ + struct external_info *ei = object; + + if (type == RMAP_OSPF && prefix->family == AF_INET) { + ei = (struct external_info *)object; + if (!ei) + return RMAP_DENYMATCH; + + if (ei->nexthop.s_addr == INADDR_ANY && !ei->ifindex) + return RMAP_MATCH; + } + return RMAP_NOMATCH; +} + +static void *route_match_ip_next_hop_type_compile(const char *arg) +{ + return XSTRDUP(MTYPE_ROUTE_MAP_COMPILED, arg); +} + +static void route_match_ip_next_hop_type_free(void *rule) +{ + XFREE(MTYPE_ROUTE_MAP_COMPILED, rule); +} + +static struct route_map_rule_cmd route_match_ip_next_hop_type_cmd = { + "ip next-hop type", route_match_ip_next_hop_type, + route_match_ip_next_hop_type_compile, + route_match_ip_next_hop_type_free}; + /* `match ip address IP_ACCESS_LIST' */ /* Match function should return 1 if match is success else return zero. */ @@ -566,6 +600,9 @@ void ospf_route_map_init(void) route_map_match_ip_next_hop_prefix_list_hook(generic_match_add); route_map_no_match_ip_next_hop_prefix_list_hook(generic_match_delete); + route_map_match_ip_next_hop_type_hook(generic_match_add); + route_map_no_match_ip_next_hop_type_hook(generic_match_delete); + route_map_match_tag_hook(generic_match_add); route_map_no_match_tag_hook(generic_match_delete); @@ -579,6 +616,7 @@ void ospf_route_map_init(void) route_map_install_match(&route_match_ip_next_hop_prefix_list_cmd); route_map_install_match(&route_match_ip_address_cmd); route_map_install_match(&route_match_ip_address_prefix_list_cmd); + route_map_install_match(&route_match_ip_next_hop_type_cmd); route_map_install_match(&route_match_interface_cmd); route_map_install_match(&route_match_tag_cmd); |