1/* Route map function. 2 * Copyright (C) 1998 Kunihiro Ishiguro 3 * 4 * This file is part of GNU Zebra. 5 * 6 * GNU Zebra is free software; you can redistribute it and/or modify it 7 * under the terms of the GNU General Public License as published by the 8 * Free Software Foundation; either version 2, or (at your option) any 9 * later version. 10 * 11 * GNU Zebra is distributed in the hope that it will be useful, but 12 * WITHOUT ANY WARRANTY; without even the implied warranty of 13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 14 * General Public License for more details. 15 * 16 * You should have received a copy of the GNU General Public License 17 * along with GNU Zebra; see the file COPYING. If not, write to the Free 18 * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 19 * 02111-1307, USA. 20 */ 21 22#ifndef _ZEBRA_ROUTEMAP_H 23#define _ZEBRA_ROUTEMAP_H 24 25/* Route map's type. */ 26enum route_map_type 27{ 28 RMAP_PERMIT, 29 RMAP_DENY, 30 RMAP_ANY 31}; 32 33typedef enum 34{ 35 RMAP_MATCH, 36 RMAP_DENYMATCH, 37 RMAP_NOMATCH, 38 RMAP_ERROR, 39 RMAP_OKAY 40} route_map_result_t; 41 42typedef enum 43{ 44 RMAP_RIP, 45 RMAP_RIPNG, 46 RMAP_BABEL, 47 RMAP_OSPF, 48 RMAP_OSPF6, 49 RMAP_BGP, 50 RMAP_ZEBRA 51} route_map_object_t; 52 53typedef enum 54{ 55 RMAP_EXIT, 56 RMAP_GOTO, 57 RMAP_NEXT 58} route_map_end_t; 59 60typedef enum 61{ 62 RMAP_EVENT_SET_ADDED, 63 RMAP_EVENT_SET_DELETED, 64 RMAP_EVENT_SET_REPLACED, 65 RMAP_EVENT_MATCH_ADDED, 66 RMAP_EVENT_MATCH_DELETED, 67 RMAP_EVENT_MATCH_REPLACED, 68 RMAP_EVENT_INDEX_ADDED, 69 RMAP_EVENT_INDEX_DELETED 70} route_map_event_t; 71 72/* Depth limit in RMAP recursion using RMAP_CALL. */ 73#define RMAP_RECURSION_LIMIT 10 74 75/* Route map rule structure for matching and setting. */ 76struct route_map_rule_cmd 77{ 78 /* Route map rule name (e.g. as-path, metric) */ 79 const char *str; 80 81 /* Function for value set or match. */ 82 route_map_result_t (*func_apply)(void *, struct prefix *, 83 route_map_object_t, void *); 84 85 /* Compile argument and return result as void *. */ 86 void *(*func_compile)(const char *); 87 88 /* Free allocated value by func_compile (). */ 89 void (*func_free)(void *); 90}; 91 92/* Route map apply error. */ 93enum 94{ 95 /* Route map rule is missing. */ 96 RMAP_RULE_MISSING = 1, 97 98 /* Route map rule can't compile */ 99 RMAP_COMPILE_ERROR 100}; 101 102/* Route map rule list. */ 103struct route_map_rule_list 104{ 105 struct route_map_rule *head; 106 struct route_map_rule *tail; 107}; 108 109/* Route map index structure. */ 110struct route_map_index 111{ 112 struct route_map *map; 113 char *description; 114 115 /* Preference of this route map rule. */ 116 int pref; 117 118 /* Route map type permit or deny. */ 119 enum route_map_type type; 120 121 /* Do we follow old rules, or hop forward? */ 122 route_map_end_t exitpolicy; 123 124 /* If we're using "GOTO", to where do we go? */ 125 int nextpref; 126 127 /* If we're using "CALL", to which route-map do ew go? */ 128 char *nextrm; 129 130 /* Matching rule list. */ 131 struct route_map_rule_list match_list; 132 struct route_map_rule_list set_list; 133 134 /* Make linked list. */ 135 struct route_map_index *next; 136 struct route_map_index *prev; 137}; 138 139/* Route map list structure. */ 140struct route_map 141{ 142 /* Name of route map. */ 143 char *name; 144 145 /* Route map's rule. */ 146 struct route_map_index *head; 147 struct route_map_index *tail; 148 149 /* Make linked list. */ 150 struct route_map *next; 151 struct route_map *prev; 152}; 153 154/* Prototypes. */ 155extern void route_map_init (void); 156extern void route_map_init_vty (void); 157extern void route_map_finish (void); 158 159/* Add match statement to route map. */ 160extern int route_map_add_match (struct route_map_index *index, 161 const char *match_name, 162 const char *match_arg); 163 164/* Delete specified route match rule. */ 165extern int route_map_delete_match (struct route_map_index *index, 166 const char *match_name, 167 const char *match_arg); 168 169/* Add route-map set statement to the route map. */ 170extern int route_map_add_set (struct route_map_index *index, 171 const char *set_name, 172 const char *set_arg); 173 174/* Delete route map set rule. */ 175extern int route_map_delete_set (struct route_map_index *index, 176 const char *set_name, 177 const char *set_arg); 178 179/* Install rule command to the match list. */ 180extern void route_map_install_match (struct route_map_rule_cmd *cmd); 181 182/* Install rule command to the set list. */ 183extern void route_map_install_set (struct route_map_rule_cmd *cmd); 184 185/* Lookup route map by name. */ 186extern struct route_map * route_map_lookup_by_name (const char *name); 187 188/* Apply route map to the object. */ 189extern route_map_result_t route_map_apply (struct route_map *map, 190 struct prefix *, 191 route_map_object_t object_type, 192 void *object); 193 194extern void route_map_add_hook (void (*func) (const char *)); 195extern void route_map_delete_hook (void (*func) (const char *)); 196extern void route_map_event_hook (void (*func) (route_map_event_t, const char *)); 197 198#endif /* _ZEBRA_ROUTEMAP_H */ 199