📄 ospf_routemap.c
字号:
/* * Route map function of ospfd. * Copyright (C) 2000 IP Infusion Inc. * * Written by Toshiaki Takada. * * This file is part of GNU Zebra. * * GNU Zebra 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, or (at your option) any * later version. * * GNU Zebra 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 GNU Zebra; see the file COPYING. If not, write to the Free * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA * 02111-1307, USA. */#include <zebra.h>#include "memory.h"#include "prefix.h"#include "table.h"#include "routemap.h"#include "command.h"#include "log.h"#include "plist.h"#include "ospfd/ospfd.h"#include "ospfd/ospf_asbr.h"#include "ospfd/ospf_interface.h"#include "ospfd/ospf_lsa.h"#include "ospfd/ospf_route.h"#include "ospfd/ospf_zebra.h"/* Hook function for updating route_map assignment. */voidospf_route_map_update (char *name){ struct ospf *ospf; int type; /* If OSPF instatnce does not exist, return right now. */ ospf = ospf_lookup (); if (ospf == NULL) return; /* Update route-map */ for (type = 0; type <= ZEBRA_ROUTE_MAX; type++) { if (ROUTEMAP_NAME (ospf, type) && strcmp (ROUTEMAP_NAME (ospf, type), name) == 0) { /* Keep old route-map. */ struct route_map *old = ROUTEMAP (ospf, type); /* Update route-map. */ ROUTEMAP (ospf, type) = route_map_lookup_by_name (ROUTEMAP_NAME (ospf, type)); /* No update for this distribute type. */ if (old == NULL && ROUTEMAP (ospf, type) == NULL) continue; ospf_distribute_list_update (ospf, type); } }}voidospf_route_map_event (route_map_event_t event, char *name){ struct ospf *ospf; int type; /* If OSPF instatnce does not exist, return right now. */ ospf = ospf_lookup (); if (ospf == NULL) return; /* Update route-map. */ for (type = 0; type <= ZEBRA_ROUTE_MAX; type++) { if (ROUTEMAP_NAME (ospf, type) && ROUTEMAP (ospf, type) && !strcmp (ROUTEMAP_NAME (ospf, type), name)) { ospf_distribute_list_update (ospf, type); } }}/* Delete rip route map rule. */intospf_route_match_delete (struct vty *vty, struct route_map_index *index, char *command, char *arg){ int ret; ret = route_map_delete_match (index, command, arg); if (ret) { switch (ret) { case RMAP_RULE_MISSING: vty_out (vty, "%% Can't find rule.%s", VTY_NEWLINE); return CMD_WARNING; break; case RMAP_COMPILE_ERROR: vty_out (vty, "%% Argument is malformed.%s", VTY_NEWLINE); return CMD_WARNING; break; } } return CMD_SUCCESS;}intospf_route_match_add (struct vty *vty, struct route_map_index *index, char *command, char *arg){ int ret; ret = route_map_add_match (index, command, arg); if (ret) { switch (ret) { case RMAP_RULE_MISSING: vty_out (vty, "%% Can't find rule.%s", VTY_NEWLINE); return CMD_WARNING; break; case RMAP_COMPILE_ERROR: vty_out (vty, "%% Argument is malformed.%s", VTY_NEWLINE); return CMD_WARNING; break; } } return CMD_SUCCESS;}intospf_route_set_add (struct vty *vty, struct route_map_index *index, char *command, char *arg){ int ret; ret = route_map_add_set (index, command, arg); if (ret) { switch (ret) { case RMAP_RULE_MISSING: vty_out (vty, "%% Can't find rule.%s", VTY_NEWLINE); return CMD_WARNING; break; case RMAP_COMPILE_ERROR: vty_out (vty, "%% Argument is malformed.%s", VTY_NEWLINE); return CMD_WARNING; break; } } return CMD_SUCCESS;}/* Delete rip route map rule. */intospf_route_set_delete (struct vty *vty, struct route_map_index *index, char *command, char *arg){ int ret; ret = route_map_delete_set (index, command, arg); if (ret) { switch (ret) { case RMAP_RULE_MISSING: vty_out (vty, "%% Can't find rule.%s", VTY_NEWLINE); return CMD_WARNING; break; case RMAP_COMPILE_ERROR: vty_out (vty, "%% Argument is malformed.%s", VTY_NEWLINE); return CMD_WARNING; break; } } return CMD_SUCCESS;}/* `match ip netxthop ' *//* Match function return 1 if match is success else return zero. */route_map_result_troute_match_ip_nexthop (void *rule, struct prefix *prefix, route_map_object_t type, void *object){ struct access_list *alist; struct external_info *ei = object; struct prefix_ipv4 p; if (type == RMAP_OSPF) { p.family = AF_INET; p.prefix = ei->nexthop; p.prefixlen = IPV4_MAX_BITLEN; alist = access_list_lookup (AFI_IP, (char *) rule); if (alist == NULL) return RMAP_NOMATCH; return (access_list_apply (alist, &p) == FILTER_DENY ? RMAP_NOMATCH : RMAP_MATCH); } return RMAP_NOMATCH;}/* Route map `ip next-hop' match statement. `arg' should be access-list name. */void *route_match_ip_nexthop_compile (char *arg){ return XSTRDUP (MTYPE_ROUTE_MAP_COMPILED, arg);}/* Free route map's compiled `ip address' value. */voidroute_match_ip_nexthop_free (void *rule){ XFREE (MTYPE_ROUTE_MAP_COMPILED, rule);}/* Route map commands for metric matching. */struct route_map_rule_cmd route_match_ip_nexthop_cmd ={ "ip next-hop", route_match_ip_nexthop, route_match_ip_nexthop_compile, route_match_ip_nexthop_free};/* `match ip next-hop prefix-list PREFIX_LIST' */route_map_result_troute_match_ip_next_hop_prefix_list (void *rule, struct prefix *prefix, route_map_object_t type, void *object){ struct prefix_list *plist; struct external_info *ei = object; struct prefix_ipv4 p; if (type == RMAP_OSPF) { p.family = AF_INET; p.prefix = ei->nexthop; p.prefixlen = IPV4_MAX_BITLEN; plist = prefix_list_lookup (AFI_IP, (char *) rule); if (plist == NULL) return RMAP_NOMATCH; return (prefix_list_apply (plist, &p) == PREFIX_DENY ? RMAP_NOMATCH : RMAP_MATCH); } return RMAP_NOMATCH;}void *route_match_ip_next_hop_prefix_list_compile (char *arg){ return XSTRDUP (MTYPE_ROUTE_MAP_COMPILED, arg);}voidroute_match_ip_next_hop_prefix_list_free (void *rule){ XFREE (MTYPE_ROUTE_MAP_COMPILED, rule);}struct route_map_rule_cmd route_match_ip_next_hop_prefix_list_cmd ={ "ip next-hop prefix-list", route_match_ip_next_hop_prefix_list, route_match_ip_next_hop_prefix_list_compile, route_match_ip_next_hop_prefix_list_free};/* `match ip address IP_ACCESS_LIST' *//* Match function should return 1 if match is success else return zero. */route_map_result_troute_match_ip_address (void *rule, struct prefix *prefix, route_map_object_t type, void *object){ struct access_list *alist; /* struct prefix_ipv4 match; */ if (type == RMAP_OSPF) { alist = access_list_lookup (AFI_IP, (char *) rule); if (alist == NULL) return RMAP_NOMATCH; return (access_list_apply (alist, prefix) == FILTER_DENY ? RMAP_NOMATCH : RMAP_MATCH); } return RMAP_NOMATCH;}/* Route map `ip address' match statement. `arg' should be access-list name. */void *route_match_ip_address_compile (char *arg){ return XSTRDUP (MTYPE_ROUTE_MAP_COMPILED, arg);}/* Free route map's compiled `ip address' value. */voidroute_match_ip_address_free (void *rule){ XFREE (MTYPE_ROUTE_MAP_COMPILED, rule);}/* Route map commands for ip address matching. */struct route_map_rule_cmd route_match_ip_address_cmd ={ "ip address", route_match_ip_address, route_match_ip_address_compile, route_match_ip_address_free};/* `match ip address prefix-list PREFIX_LIST' */route_map_result_troute_match_ip_address_prefix_list (void *rule, struct prefix *prefix, route_map_object_t type, void *object){ struct prefix_list *plist; if (type == RMAP_OSPF) { plist = prefix_list_lookup (AFI_IP, (char *) rule); if (plist == NULL) return RMAP_NOMATCH; return (prefix_list_apply (plist, prefix) == PREFIX_DENY ? RMAP_NOMATCH : RMAP_MATCH); } return RMAP_NOMATCH;}void *route_match_ip_address_prefix_list_compile (char *arg){ return XSTRDUP (MTYPE_ROUTE_MAP_COMPILED, arg);}voidroute_match_ip_address_prefix_list_free (void *rule){ XFREE (MTYPE_ROUTE_MAP_COMPILED, rule);}struct route_map_rule_cmd route_match_ip_address_prefix_list_cmd ={ "ip address prefix-list", route_match_ip_address_prefix_list, route_match_ip_address_prefix_list_compile, route_match_ip_address_prefix_list_free};/* `match interface IFNAME' *//* Match function should return 1 if match is success else return zero. */route_map_result_troute_match_interface (void *rule, struct prefix *prefix, route_map_object_t type, void *object){ struct interface *ifp; struct external_info *ei; if (type == RMAP_OSPF) { ei = object; ifp = if_lookup_by_name ((char *)rule); if (ifp == NULL || ifp->ifindex != ei->ifindex) return RMAP_NOMATCH; return RMAP_MATCH; } return RMAP_NOMATCH;}/* Route map `interface' match statement. `arg' should be interface name. */void *route_match_interface_compile (char *arg){ return XSTRDUP (MTYPE_ROUTE_MAP_COMPILED, arg);}/* Free route map's compiled `interface' value. */voidroute_match_interface_free (void *rule){ XFREE (MTYPE_ROUTE_MAP_COMPILED, rule);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -