Annotation of embedaddon/quagga/ripngd/ripngd.h, revision 1.1.1.1
1.1 misho 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: #include <zclient.h>
27: #include <vty.h>
28:
29: /* RIPng version and port number. */
30: #define RIPNG_V1 1
31: #define RIPNG_PORT_DEFAULT 521
32: #define RIPNG_VTY_PORT 2603
33: #define RIPNG_MAX_PACKET_SIZE 1500
34: #define RIPNG_PRIORITY_DEFAULT 0
35:
36: /* RIPng commands. */
37: #define RIPNG_REQUEST 1
38: #define RIPNG_RESPONSE 2
39:
40: /* RIPng metric and multicast group address. */
41: #define RIPNG_METRIC_INFINITY 16
42: #define RIPNG_METRIC_NEXTHOP 0xff
43: #define RIPNG_GROUP "ff02::9"
44:
45: /* RIPng timers. */
46: #define RIPNG_UPDATE_TIMER_DEFAULT 30
47: #define RIPNG_TIMEOUT_TIMER_DEFAULT 180
48: #define RIPNG_GARBAGE_TIMER_DEFAULT 120
49:
50: /* RIPng peer timeout value. */
51: #define RIPNG_PEER_TIMER_DEFAULT 180
52:
53: /* Default config file name. */
54: #define RIPNG_DEFAULT_CONFIG "ripngd.conf"
55:
56: /* RIPng route types. */
57: #define RIPNG_ROUTE_RTE 0
58: #define RIPNG_ROUTE_STATIC 1
59: #define RIPNG_ROUTE_DEFAULT 2
60: #define RIPNG_ROUTE_REDISTRIBUTE 3
61: #define RIPNG_ROUTE_INTERFACE 4
62: #define RIPNG_ROUTE_AGGREGATE 5
63:
64: /* Interface send/receive configuration. */
65: #define RIPNG_SEND_UNSPEC 0
66: #define RIPNG_SEND_OFF 1
67: #define RIPNG_RECEIVE_UNSPEC 0
68: #define RIPNG_RECEIVE_OFF 1
69:
70: /* RIP default route's accept/announce methods. */
71: #define RIPNG_DEFAULT_ADVERTISE_UNSPEC 0
72: #define RIPNG_DEFAULT_ADVERTISE_NONE 1
73: #define RIPNG_DEFAULT_ADVERTISE 2
74:
75: #define RIPNG_DEFAULT_ACCEPT_UNSPEC 0
76: #define RIPNG_DEFAULT_ACCEPT_NONE 1
77: #define RIPNG_DEFAULT_ACCEPT 2
78:
79: /* Default value for "default-metric" command. */
80: #define RIPNG_DEFAULT_METRIC_DEFAULT 1
81:
82: /* For max RTE calculation. */
83: #ifndef IPV6_HDRLEN
84: #define IPV6_HDRLEN 40
85: #endif /* IPV6_HDRLEN */
86:
87: #ifndef IFMINMTU
88: #define IFMINMTU 576
89: #endif /* IFMINMTU */
90:
91: /* RIPng structure. */
92: struct ripng
93: {
94: /* RIPng socket. */
95: int sock;
96:
97: /* RIPng Parameters.*/
98: u_char command;
99: u_char version;
100: unsigned long update_time;
101: unsigned long timeout_time;
102: unsigned long garbage_time;
103: int max_mtu;
104: int default_metric;
105: int default_information;
106:
107: /* Input/output buffer of RIPng. */
108: struct stream *ibuf;
109: struct stream *obuf;
110:
111: /* RIPng routing information base. */
112: struct route_table *table;
113:
114: /* RIPng only static route information. */
115: struct route_table *route;
116:
117: /* RIPng aggregate route information. */
118: struct route_table *aggregate;
119:
120: /* RIPng threads. */
121: struct thread *t_read;
122: struct thread *t_write;
123: struct thread *t_update;
124: struct thread *t_garbage;
125: struct thread *t_zebra;
126:
127: /* Triggered update hack. */
128: int trigger;
129: struct thread *t_triggered_update;
130: struct thread *t_triggered_interval;
131:
132: /* For redistribute route map. */
133: struct
134: {
135: char *name;
136: struct route_map *map;
137: int metric_config;
138: u_int32_t metric;
139: } route_map[ZEBRA_ROUTE_MAX];
140: };
141:
142: /* Routing table entry. */
143: struct rte
144: {
145: struct in6_addr addr; /* RIPng destination prefix */
146: u_short tag; /* RIPng tag */
147: u_char prefixlen; /* Length of the RIPng prefix */
148: u_char metric; /* Metric of the RIPng route */
149: /* The nexthop is stored by the structure
150: * ripng_nexthop within ripngd.c */
151: };
152:
153: /* RIPNG send packet. */
154: struct ripng_packet
155: {
156: u_char command;
157: u_char version;
158: u_int16_t zero;
159: struct rte rte[1];
160: };
161:
162: /* Each route's information. */
163: struct ripng_info
164: {
165: /* This route's type. Static, ripng or aggregate. */
166: u_char type;
167:
168: /* Sub type for static route. */
169: u_char sub_type;
170:
171: /* RIPng specific information */
172: struct in6_addr nexthop;
173: struct in6_addr from;
174:
175: /* Which interface does this route come from. */
176: unsigned int ifindex;
177:
178: /* Metric of this route. */
179: u_char metric;
180:
181: /* Tag field of RIPng packet.*/
182: u_int16_t tag;
183:
184: /* For aggregation. */
185: unsigned int suppress;
186:
187: /* Flags of RIPng route. */
188: #define RIPNG_RTF_FIB 1
189: #define RIPNG_RTF_CHANGED 2
190: u_char flags;
191:
192: /* Garbage collect timer. */
193: struct thread *t_timeout;
194: struct thread *t_garbage_collect;
195:
196: /* Route-map features - this variables can be changed. */
197: struct in6_addr nexthop_out;
198: u_char metric_set;
199: u_char metric_out;
200: u_short tag_out;
201:
202: struct route_node *rp;
203: };
204:
205: #ifdef notyet
206: #if 0
207: /* RIPng tag structure. */
208: struct ripng_tag
209: {
210: /* Tag value. */
211: u_int16_t tag;
212:
213: /* Port. */
214: u_int16_t port;
215:
216: /* Multicast group. */
217: struct in6_addr maddr;
218:
219: /* Table number. */
220: int table;
221:
222: /* Distance. */
223: int distance;
224:
225: /* Split horizon. */
226: u_char split_horizon;
227:
228: /* Poison reverse. */
229: u_char poison_reverse;
230: };
231: #endif /* 0 */
232: #endif /* not yet */
233:
234: typedef enum {
235: RIPNG_NO_SPLIT_HORIZON = 0,
236: RIPNG_SPLIT_HORIZON,
237: RIPNG_SPLIT_HORIZON_POISONED_REVERSE
238: } split_horizon_policy_t;
239:
240: /* RIPng specific interface configuration. */
241: struct ripng_interface
242: {
243: /* RIPng is enabled on this interface. */
244: int enable_network;
245: int enable_interface;
246:
247: /* RIPng is running on this interface. */
248: int running;
249:
250: /* Split horizon flag. */
251: split_horizon_policy_t split_horizon;
252: split_horizon_policy_t split_horizon_default;
253:
254: /* For filter type slot. */
255: #define RIPNG_FILTER_IN 0
256: #define RIPNG_FILTER_OUT 1
257: #define RIPNG_FILTER_MAX 2
258:
259: /* Access-list. */
260: struct access_list *list[RIPNG_FILTER_MAX];
261:
262: /* Prefix-list. */
263: struct prefix_list *prefix[RIPNG_FILTER_MAX];
264:
265: /* Route-map. */
266: struct route_map *routemap[RIPNG_FILTER_MAX];
267:
268: #ifdef notyet
269: #if 0
270: /* RIPng tag configuration. */
271: struct ripng_tag *rtag;
272: #endif /* 0 */
273: #endif /* notyet */
274:
275: /* Default information originate. */
276: u_char default_originate;
277:
278: /* Default information only. */
279: u_char default_only;
280:
281: /* Wake up thread. */
282: struct thread *t_wakeup;
283:
284: /* Passive interface. */
285: int passive;
286: };
287:
288: /* RIPng peer information. */
289: struct ripng_peer
290: {
291: /* Peer address. */
292: struct in6_addr addr;
293:
294: /* Peer RIPng tag value. */
295: int domain;
296:
297: /* Last update time. */
298: time_t uptime;
299:
300: /* Peer RIP version. */
301: u_char version;
302:
303: /* Statistics. */
304: int recv_badpackets;
305: int recv_badroutes;
306:
307: /* Timeout thread. */
308: struct thread *t_timeout;
309: };
310:
311: /* All RIPng events. */
312: enum ripng_event
313: {
314: RIPNG_READ,
315: RIPNG_ZEBRA,
316: RIPNG_REQUEST_EVENT,
317: RIPNG_UPDATE_EVENT,
318: RIPNG_TRIGGERED_UPDATE,
319: };
320:
321: /* RIPng timer on/off macro. */
322: #define RIPNG_TIMER_ON(T,F,V) \
323: do { \
324: if (!(T)) \
325: (T) = thread_add_timer (master, (F), rinfo, (V)); \
326: } while (0)
327:
328: #define RIPNG_TIMER_OFF(T) \
329: do { \
330: if (T) \
331: { \
332: thread_cancel(T); \
333: (T) = NULL; \
334: } \
335: } while (0)
336:
337: /* Count prefix size from mask length */
338: #define PSIZE(a) (((a) + 7) / (8))
339:
340: /* Extern variables. */
341: extern struct ripng *ripng;
342:
343: extern struct thread_master *master;
344:
345: /* Prototypes. */
346: extern void ripng_init (void);
347: extern void ripng_reset (void);
348: extern void ripng_clean (void);
349: extern void ripng_clean_network (void);
350: extern void ripng_interface_clean (void);
351: extern void ripng_interface_reset (void);
352: extern void ripng_passive_interface_clean (void);
353: extern void ripng_if_init (void);
354: extern void ripng_route_map_init (void);
355: extern void ripng_route_map_reset (void);
356: extern void ripng_terminate (void);
357: /* zclient_init() is done by ripng_zebra.c:zebra_init() */
358: extern void zebra_init (void);
359: extern void ripng_zclient_start (void);
360: extern void ripng_zclient_reset (void);
361: extern void ripng_offset_init (void);
362:
363: extern int config_write_ripng_offset_list (struct vty *);
364:
365: extern void ripng_peer_init (void);
366: extern void ripng_peer_update (struct sockaddr_in6 *, u_char);
367: extern void ripng_peer_bad_route (struct sockaddr_in6 *);
368: extern void ripng_peer_bad_packet (struct sockaddr_in6 *);
369: extern void ripng_peer_display (struct vty *);
370: extern struct ripng_peer *ripng_peer_lookup (struct in6_addr *);
371: extern struct ripng_peer *ripng_peer_lookup_next (struct in6_addr *);
372:
373: extern int ripng_offset_list_apply_in (struct prefix_ipv6 *,
374: struct interface *, u_char *);
375: extern int ripng_offset_list_apply_out (struct prefix_ipv6 *,
376: struct interface *, u_char *);
377: extern void ripng_offset_clean (void);
378:
379: extern struct ripng_info * ripng_info_new (void);
380: extern void ripng_info_free (struct ripng_info *rinfo);
381: extern void ripng_event (enum ripng_event, int);
382: extern int ripng_request (struct interface *ifp);
383: extern void ripng_redistribute_add (int, int, struct prefix_ipv6 *,
384: unsigned int, struct in6_addr *);
385: extern void ripng_redistribute_delete (int, int, struct prefix_ipv6 *,
386: unsigned int);
387: extern void ripng_redistribute_withdraw (int type);
388:
389: extern void ripng_distribute_update_interface (struct interface *);
390: extern void ripng_if_rmap_update_interface (struct interface *);
391:
392: extern void ripng_zebra_ipv6_add (struct prefix_ipv6 *p,
393: struct in6_addr *nexthop,
394: unsigned int ifindex, u_char metric);
395: extern void ripng_zebra_ipv6_delete (struct prefix_ipv6 *p,
396: struct in6_addr *nexthop,
397: unsigned int ifindex);
398:
399: extern void ripng_redistribute_clean (void);
400: extern int ripng_redistribute_check (int);
401: extern void ripng_redistribute_write (struct vty *, int);
402:
403: extern int ripng_write_rte (int num, struct stream *s, struct prefix_ipv6 *p,
404: struct in6_addr *nexthop,
405: u_int16_t tag, u_char metric);
406: extern int ripng_send_packet (caddr_t buf, int bufsize,
407: struct sockaddr_in6 *to, struct interface *ifp);
408:
409: extern void ripng_packet_dump (struct ripng_packet *packet, int size,
410: const char *sndrcv);
411:
412: extern int ripng_interface_up (int command, struct zclient *, zebra_size_t);
413: extern int ripng_interface_down (int command, struct zclient *, zebra_size_t);
414: extern int ripng_interface_add (int command, struct zclient *, zebra_size_t);
415: extern int ripng_interface_delete (int command, struct zclient *, zebra_size_t);
416: extern int ripng_interface_address_add (int command, struct zclient *, zebra_size_t);
417: extern int ripng_interface_address_delete (int command, struct zclient *, zebra_size_t);
418:
419: extern int ripng_network_write (struct vty *, int);
420:
421: #endif /* _ZEBRA_RIPNG_RIPNGD_H */
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>