Annotation of embedaddon/quagga/ripngd/ripngd.h, revision 1.1.1.2
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:
1.1.1.2 ! misho 132: /* RIPng ECMP flag */
! 133: unsigned int ecmp;
! 134:
1.1 misho 135: /* For redistribute route map. */
136: struct
137: {
138: char *name;
139: struct route_map *map;
140: int metric_config;
141: u_int32_t metric;
142: } route_map[ZEBRA_ROUTE_MAX];
143: };
144:
145: /* Routing table entry. */
146: struct rte
147: {
148: struct in6_addr addr; /* RIPng destination prefix */
149: u_short tag; /* RIPng tag */
150: u_char prefixlen; /* Length of the RIPng prefix */
151: u_char metric; /* Metric of the RIPng route */
152: /* The nexthop is stored by the structure
153: * ripng_nexthop within ripngd.c */
154: };
155:
156: /* RIPNG send packet. */
157: struct ripng_packet
158: {
159: u_char command;
160: u_char version;
161: u_int16_t zero;
162: struct rte rte[1];
163: };
164:
165: /* Each route's information. */
166: struct ripng_info
167: {
168: /* This route's type. Static, ripng or aggregate. */
169: u_char type;
170:
171: /* Sub type for static route. */
172: u_char sub_type;
173:
174: /* RIPng specific information */
175: struct in6_addr nexthop;
176: struct in6_addr from;
177:
178: /* Which interface does this route come from. */
1.1.1.2 ! misho 179: ifindex_t ifindex;
1.1 misho 180:
181: /* Metric of this route. */
182: u_char metric;
183:
184: /* Tag field of RIPng packet.*/
185: u_int16_t tag;
186:
187: /* For aggregation. */
188: unsigned int suppress;
189:
190: /* Flags of RIPng route. */
191: #define RIPNG_RTF_FIB 1
192: #define RIPNG_RTF_CHANGED 2
193: u_char flags;
194:
195: /* Garbage collect timer. */
196: struct thread *t_timeout;
197: struct thread *t_garbage_collect;
198:
199: /* Route-map features - this variables can be changed. */
200: struct in6_addr nexthop_out;
201: u_char metric_set;
202: u_char metric_out;
203: u_short tag_out;
204:
205: struct route_node *rp;
206: };
207:
208: #ifdef notyet
209: #if 0
210: /* RIPng tag structure. */
211: struct ripng_tag
212: {
213: /* Tag value. */
214: u_int16_t tag;
215:
216: /* Port. */
217: u_int16_t port;
218:
219: /* Multicast group. */
220: struct in6_addr maddr;
221:
222: /* Table number. */
223: int table;
224:
225: /* Distance. */
226: int distance;
227:
228: /* Split horizon. */
229: u_char split_horizon;
230:
231: /* Poison reverse. */
232: u_char poison_reverse;
233: };
234: #endif /* 0 */
235: #endif /* not yet */
236:
237: typedef enum {
238: RIPNG_NO_SPLIT_HORIZON = 0,
239: RIPNG_SPLIT_HORIZON,
240: RIPNG_SPLIT_HORIZON_POISONED_REVERSE
241: } split_horizon_policy_t;
242:
243: /* RIPng specific interface configuration. */
244: struct ripng_interface
245: {
246: /* RIPng is enabled on this interface. */
247: int enable_network;
248: int enable_interface;
249:
250: /* RIPng is running on this interface. */
251: int running;
252:
253: /* Split horizon flag. */
254: split_horizon_policy_t split_horizon;
255: split_horizon_policy_t split_horizon_default;
256:
257: /* For filter type slot. */
258: #define RIPNG_FILTER_IN 0
259: #define RIPNG_FILTER_OUT 1
260: #define RIPNG_FILTER_MAX 2
261:
262: /* Access-list. */
263: struct access_list *list[RIPNG_FILTER_MAX];
264:
265: /* Prefix-list. */
266: struct prefix_list *prefix[RIPNG_FILTER_MAX];
267:
268: /* Route-map. */
269: struct route_map *routemap[RIPNG_FILTER_MAX];
270:
271: #ifdef notyet
272: #if 0
273: /* RIPng tag configuration. */
274: struct ripng_tag *rtag;
275: #endif /* 0 */
276: #endif /* notyet */
277:
278: /* Default information originate. */
279: u_char default_originate;
280:
281: /* Default information only. */
282: u_char default_only;
283:
284: /* Wake up thread. */
285: struct thread *t_wakeup;
286:
287: /* Passive interface. */
288: int passive;
289: };
290:
291: /* RIPng peer information. */
292: struct ripng_peer
293: {
294: /* Peer address. */
295: struct in6_addr addr;
296:
297: /* Peer RIPng tag value. */
298: int domain;
299:
300: /* Last update time. */
301: time_t uptime;
302:
303: /* Peer RIP version. */
304: u_char version;
305:
306: /* Statistics. */
307: int recv_badpackets;
308: int recv_badroutes;
309:
310: /* Timeout thread. */
311: struct thread *t_timeout;
312: };
313:
314: /* All RIPng events. */
315: enum ripng_event
316: {
317: RIPNG_READ,
318: RIPNG_ZEBRA,
319: RIPNG_REQUEST_EVENT,
320: RIPNG_UPDATE_EVENT,
321: RIPNG_TRIGGERED_UPDATE,
322: };
323:
324: /* RIPng timer on/off macro. */
325: #define RIPNG_TIMER_ON(T,F,V) \
326: do { \
327: if (!(T)) \
328: (T) = thread_add_timer (master, (F), rinfo, (V)); \
329: } while (0)
330:
331: #define RIPNG_TIMER_OFF(T) \
332: do { \
333: if (T) \
334: { \
335: thread_cancel(T); \
336: (T) = NULL; \
337: } \
338: } while (0)
339:
340: /* Count prefix size from mask length */
341: #define PSIZE(a) (((a) + 7) / (8))
342:
343: /* Extern variables. */
344: extern struct ripng *ripng;
345:
346: extern struct thread_master *master;
347:
348: /* Prototypes. */
349: extern void ripng_init (void);
350: extern void ripng_reset (void);
351: extern void ripng_clean (void);
352: extern void ripng_clean_network (void);
353: extern void ripng_interface_clean (void);
354: extern void ripng_interface_reset (void);
355: extern void ripng_passive_interface_clean (void);
356: extern void ripng_if_init (void);
357: extern void ripng_route_map_init (void);
358: extern void ripng_route_map_reset (void);
359: extern void ripng_terminate (void);
360: /* zclient_init() is done by ripng_zebra.c:zebra_init() */
1.1.1.2 ! misho 361: extern void zebra_init (struct thread_master *);
1.1 misho 362: extern void ripng_zclient_start (void);
363: extern void ripng_zclient_reset (void);
364: extern void ripng_offset_init (void);
365:
366: extern int config_write_ripng_offset_list (struct vty *);
367:
368: extern void ripng_peer_init (void);
369: extern void ripng_peer_update (struct sockaddr_in6 *, u_char);
370: extern void ripng_peer_bad_route (struct sockaddr_in6 *);
371: extern void ripng_peer_bad_packet (struct sockaddr_in6 *);
372: extern void ripng_peer_display (struct vty *);
373: extern struct ripng_peer *ripng_peer_lookup (struct in6_addr *);
374: extern struct ripng_peer *ripng_peer_lookup_next (struct in6_addr *);
375:
376: extern int ripng_offset_list_apply_in (struct prefix_ipv6 *,
377: struct interface *, u_char *);
378: extern int ripng_offset_list_apply_out (struct prefix_ipv6 *,
379: struct interface *, u_char *);
380: extern void ripng_offset_clean (void);
381:
382: extern struct ripng_info * ripng_info_new (void);
383: extern void ripng_info_free (struct ripng_info *rinfo);
384: extern void ripng_event (enum ripng_event, int);
385: extern int ripng_request (struct interface *ifp);
386: extern void ripng_redistribute_add (int, int, struct prefix_ipv6 *,
1.1.1.2 ! misho 387: ifindex_t, struct in6_addr *);
1.1 misho 388: extern void ripng_redistribute_delete (int, int, struct prefix_ipv6 *,
1.1.1.2 ! misho 389: ifindex_t);
1.1 misho 390: extern void ripng_redistribute_withdraw (int type);
391:
392: extern void ripng_distribute_update_interface (struct interface *);
393: extern void ripng_if_rmap_update_interface (struct interface *);
394:
1.1.1.2 ! misho 395: extern void ripng_zebra_ipv6_add (struct route_node *);
! 396: extern void ripng_zebra_ipv6_delete (struct route_node *);
1.1 misho 397:
398: extern void ripng_redistribute_clean (void);
399: extern int ripng_redistribute_check (int);
400: extern void ripng_redistribute_write (struct vty *, int);
401:
402: extern int ripng_write_rte (int num, struct stream *s, struct prefix_ipv6 *p,
403: struct in6_addr *nexthop,
404: u_int16_t tag, u_char metric);
405: extern int ripng_send_packet (caddr_t buf, int bufsize,
406: struct sockaddr_in6 *to, struct interface *ifp);
407:
408: extern void ripng_packet_dump (struct ripng_packet *packet, int size,
409: const char *sndrcv);
410:
1.1.1.2 ! misho 411: extern int ripng_interface_up (int command, struct zclient *, zebra_size_t,
! 412: vrf_id_t);
! 413: extern int ripng_interface_down (int command, struct zclient *, zebra_size_t,
! 414: vrf_id_t);
! 415: extern int ripng_interface_add (int command, struct zclient *, zebra_size_t,
! 416: vrf_id_t);
! 417: extern int ripng_interface_delete (int command, struct zclient *, zebra_size_t,
! 418: vrf_id_t);
! 419: extern int ripng_interface_address_add (int command, struct zclient *, zebra_size_t,
! 420: vrf_id_t);
! 421: extern int ripng_interface_address_delete (int command, struct zclient *, zebra_size_t,
! 422: vrf_id_t);
1.1 misho 423:
424: extern int ripng_network_write (struct vty *, int);
1.1.1.2 ! misho 425:
! 426: extern struct ripng_info *ripng_ecmp_add (struct ripng_info *);
! 427: extern struct ripng_info *ripng_ecmp_replace (struct ripng_info *);
! 428: extern struct ripng_info *ripng_ecmp_delete (struct ripng_info *);
1.1 misho 429:
430: #endif /* _ZEBRA_RIPNG_RIPNGD_H */
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>