1/* 2 * RIPng related value and structure. 3 * Copyright (C) 1998 Kunihiro Ishiguro 4 * 5 * This file is part of GNU Zebra. 6 * 7 * GNU Zebra is free software; you can redistribute it and/or modify it 8 * under the terms of the GNU General Public License as published by the 9 * Free Software Foundation; either version 2, or (at your option) any 10 * later version. 11 * 12 * GNU Zebra is distributed in the hope that it will be useful, but 13 * WITHOUT ANY WARRANTY; without even the implied warranty of 14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 15 * General Public License for more details. 16 * 17 * You should have received a copy of the GNU General Public License 18 * along with GNU Zebra; see the file COPYING. If not, write to the Free 19 * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 20 * 02111-1307, USA. 21 */ 22 23#ifndef _ZEBRA_RIPNG_RIPNGD_H 24#define _ZEBRA_RIPNG_RIPNGD_H 25 26/* RIPng version and port number. */ 27#define RIPNG_V1 1 28#define RIPNG_PORT_DEFAULT 521 29#define RIPNG_VTY_PORT 2603 30#define RIPNG_VTYSH_PATH "/tmp/.ripngd" 31#define RIPNG_MAX_PACKET_SIZE 1500 32#define RIPNG_PRIORITY_DEFAULT 0 33 34/* RIPng commands. */ 35#define RIPNG_REQUEST 1 36#define RIPNG_RESPONSE 2 37 38/* RIPng metric and multicast group address. */ 39#define RIPNG_METRIC_INFINITY 16 40#define RIPNG_METRIC_NEXTHOP 0xff 41#define RIPNG_GROUP "ff02::9" 42 43/* RIPng timers. */ 44#define RIPNG_UPDATE_TIMER_DEFAULT 30 45#define RIPNG_TIMEOUT_TIMER_DEFAULT 180 46#define RIPNG_GARBAGE_TIMER_DEFAULT 120 47 48/* Default config file name. */ 49#define RIPNG_DEFAULT_CONFIG "ripngd.conf" 50 51/* RIPng route types. */ 52#define RIPNG_ROUTE_RTE 0 53#define RIPNG_ROUTE_STATIC 1 54#define RIPNG_ROUTE_AGGREGATE 2 55 56/* Interface send/receive configuration. */ 57#define RIPNG_SEND_UNSPEC 0 58#define RIPNG_SEND_OFF 1 59#define RIPNG_RECEIVE_UNSPEC 0 60#define RIPNG_RECEIVE_OFF 1 61 62/* Split horizon definitions. */ 63#define RIPNG_SPLIT_HORIZON_UNSPEC 0 64#define RIPNG_SPLIT_HORIZON_NONE 1 65#define RIPNG_SPLIT_HORIZON 2 66#define RIPNG_SPLIT_HORIZON_POISONED 3 67 68/* RIP default route's accept/announce methods. */ 69#define RIPNG_DEFAULT_ADVERTISE_UNSPEC 0 70#define RIPNG_DEFAULT_ADVERTISE_NONE 1 71#define RIPNG_DEFAULT_ADVERTISE 2 72 73#define RIPNG_DEFAULT_ACCEPT_UNSPEC 0 74#define RIPNG_DEFAULT_ACCEPT_NONE 1 75#define RIPNG_DEFAULT_ACCEPT 2 76 77/* Default value for "default-metric" command. */ 78#define RIPNG_DEFAULT_METRIC_DEFAULT 1 79 80/* For max RTE calculation. */ 81#ifndef IPV6_HDRLEN 82#define IPV6_HDRLEN 40 83#endif /* IPV6_HDRLEN */ 84 85#ifndef IFMINMTU 86#define IFMINMTU 576 87#endif /* IFMINMTU */ 88 89/* RIPng structure. */ 90struct ripng 91{ 92 /* RIPng socket. */ 93 int sock; 94 95 /* RIPng Parameters.*/ 96 u_char command; 97 u_char version; 98 unsigned long update_time; 99 unsigned long timeout_time; 100 unsigned long garbage_time; 101 int max_mtu; 102 int default_metric; 103 int default_information; 104 105 /* Input/output buffer of RIPng. */ 106 struct stream *ibuf; 107 struct stream *obuf; 108 109 /* RIPng routing information base. */ 110 struct route_table *table; 111 112 /* RIPng only static route information. */ 113 struct route_table *route; 114 115 /* RIPng aggregate route information. */ 116 struct route_table *aggregate; 117 118 /* RIPng threads. */ 119 struct thread *t_read; 120 struct thread *t_write; 121 struct thread *t_update; 122 struct thread *t_garbage; 123 struct thread *t_zebra; 124 125 /* Triggered update hack. */ 126 int trigger; 127 struct thread *t_triggered_update; 128 struct thread *t_triggered_interval; 129 130 /* For redistribute route map. */ 131 struct 132 { 133 char *name; 134 struct route_map *map; 135 int metric_config; 136 u_int32_t metric; 137 } route_map[ZEBRA_ROUTE_MAX]; 138}; 139 140/* Routing table entry. */ 141struct rte 142{ 143 struct in6_addr addr; 144 u_short tag; 145 u_char prefixlen; 146 u_char metric; 147}; 148 149/* RIPNG send packet. */ 150struct ripng_packet 151{ 152 u_char command; 153 u_char version; 154 u_int16_t zero; 155 struct rte rte[1]; 156}; 157 158/* Each route's information. */ 159struct ripng_info 160{ 161 /* This route's type. Static, ripng or aggregate. */ 162 u_char type; 163 164 /* Sub type for static route. */ 165 u_char sub_type; 166 167 /* RIPng specific information */ 168 struct in6_addr nexthop; 169 struct in6_addr from; 170 171 /* Which interface does this route come from. */ 172 unsigned int ifindex; 173 174 /* Metric of this route. */ 175 u_char metric; 176 177 /* Tag field of RIPng packet.*/ 178 u_int16_t tag; 179 180 /* For aggregation. */ 181 unsigned int suppress; 182 183 /* Flags of RIPng route. */ 184#define RIPNG_RTF_FIB 1 185#define RIPNG_RTF_CHANGED 2 186 u_char flags; 187 188 /* Garbage collect timer. */ 189 struct thread *t_timeout; 190 struct thread *t_garbage_collect; 191 192 /* Route-map features - this variables can be changed. */ 193 u_char metric_set; 194 195 struct route_node *rp; 196}; 197 198/* RIPng tag structure. */ 199struct ripng_tag 200{ 201 /* Tag value. */ 202 u_int16_t tag; 203 204 /* Port. */ 205 u_int16_t port; 206 207 /* Multicast group. */ 208 struct in6_addr maddr; 209 210 /* Table number. */ 211 int table; 212 213 /* Distance. */ 214 int distance; 215 216 /* Split horizon. */ 217 u_char split_horizon; 218 219 /* Poison reverse. */ 220 u_char poison_reverse; 221}; 222 223/* RIPng specific interface configuration. */ 224struct ripng_interface 225{ 226 /* RIPng is enabled on this interface. */ 227 int enable_network; 228 int enable_interface; 229 230 /* RIPng is running on this interface. */ 231 int running; 232 233 /* For filter type slot. */ 234#define RIPNG_FILTER_IN 0 235#define RIPNG_FILTER_OUT 1 236#define RIPNG_FILTER_MAX 2 237 238 /* Access-list. */ 239 struct access_list *list[RIPNG_FILTER_MAX]; 240 241 /* Prefix-list. */ 242 struct prefix_list *prefix[RIPNG_FILTER_MAX]; 243 244 /* Route-map. */ 245 struct route_map *routemap[RIPNG_FILTER_MAX]; 246 247 /* RIPng tag configuration. */ 248 struct ripng_tag *rtag; 249 250 /* Default information originate. */ 251 u_char default_originate; 252 253 /* Default information only. */ 254 u_char default_only; 255 256 /* Wake up thread. */ 257 struct thread *t_wakeup; 258 259 /* Passive interface. */ 260 int passive; 261}; 262 263/* All RIPng events. */ 264enum ripng_event 265{ 266 RIPNG_READ, 267 RIPNG_ZEBRA, 268 RIPNG_REQUEST_EVENT, 269 RIPNG_UPDATE_EVENT, 270 RIPNG_TRIGGERED_UPDATE, 271}; 272 273/* RIPng timer on/off macro. */ 274#define RIPNG_TIMER_ON(T,F,V) \ 275do { \ 276 if (!(T)) \ 277 (T) = thread_add_timer (master, (F), rinfo, (V)); \ 278} while (0) 279 280#define RIPNG_TIMER_OFF(T) \ 281do { \ 282 if (T) \ 283 { \ 284 thread_cancel(T); \ 285 (T) = NULL; \ 286 } \ 287} while (0) 288 289/* Count prefix size from mask length */ 290#define PSIZE(a) (((a) + 7) / (8)) 291 292/* Extern variables. */ 293extern struct ripng *ripng; 294 295extern struct thread_master *master; 296 297/* Prototypes. */ 298void ripng_init (); 299void ripng_if_init (); 300void ripng_terminate (); 301void ripng_zclient_start (); 302void zebra_init (); 303struct ripng_info * ripng_info_new (); 304void ripng_info_free (struct ripng_info *rinfo); 305void ripng_event (enum ripng_event, int); 306int ripng_request (struct interface *ifp); 307void ripng_redistribute_add (int, int, struct prefix_ipv6 *, unsigned int); 308void ripng_redistribute_delete (int, int, struct prefix_ipv6 *, unsigned int); 309void ripng_redistribute_withdraw (int type); 310 311void ripng_distribute_update_interface (struct interface *); 312void ripng_if_rmap_update_interface (struct interface *); 313 314void ripng_zebra_ipv6_add (struct prefix_ipv6 *p, struct in6_addr *nexthop, unsigned int ifindex); 315void ripng_zebra_ipv6_delete (struct prefix_ipv6 *p, struct in6_addr *nexthop, unsigned int ifindex); 316void ripng_route_map_init (); 317 318#endif /* _ZEBRA_RIPNG_RIPNGD_H */ 319