blob: 2509bdd55a180f788934c6afa4d022fe867e43ac [file] [log] [blame]
paul718e3742002-12-13 20:15:29 +00001/*
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 */