1: /* ICMP Router Discovery Messages
2: * Copyright (C) 1997, 2000 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: /*
23: * This file is modified and completed for the Zebra IRDP implementation
24: * by Robert Olsson, Swedish University of Agricultural Sciences
25: */
26:
27: #ifndef _IRDP_H
28: #define _IRDP_H
29:
30: #include "lib/vty.h"
31:
32: #define TRUE 1
33: #define FALSE 0
34:
35: /* ICMP Messages */
36: #ifndef ICMP_ROUTERADVERT
37: #define ICMP_ROUTERADVERT 9
38: #endif /* ICMP_ROUTERADVERT */
39:
40: #ifndef ICMP_ROUTERSOLICIT
41: #define ICMP_ROUTERSOLICIT 10
42: #endif /* ICMP_ROUTERSOLICT */
43:
44: /* Multicast groups */
45: #ifndef INADDR_ALLHOSTS_GROUP
46: #define INADDR_ALLHOSTS_GROUP 0xe0000001U /* 224.0.0.1 */
47: #endif /* INADDR_ALLHOSTS_GROUP */
48:
49: #ifndef INADDR_ALLRTRS_GROUP
50: #define INADDR_ALLRTRS_GROUP 0xe0000002U /* 224.0.0.2 */
51: #endif /* INADDR_ALLRTRS_GROUP */
52:
53: /* Default irdp packet interval */
54: #define IRDP_DEFAULT_INTERVAL 300
55:
56: /* Router constants from RFC1256 */
57: #define MAX_INITIAL_ADVERT_INTERVAL 16
58: #define MAX_INITIAL_ADVERTISEMENTS 3
59: #define MAX_RESPONSE_DELAY 2
60:
61: #define IRDP_MAXADVERTINTERVAL 600
62: #define IRDP_MINADVERTINTERVAL 450 /* 0.75*600 */
63: #define IRDP_LIFETIME 1350 /* 3*450 */
64: #define IRDP_PREFERENCE 0
65:
66: #define ICMP_MINLEN 8
67:
68: #define IRDP_LAST_ADVERT_MESSAGES 2 /* The last adverts with Holdtime 0 */
69:
70: #define IRDP_RX_BUF 1500
71:
72: /*
73: Comments comes from RFC1256 ICMP Router Discovery Messages.
74:
75: The IP destination address to be used for multicast Router
76: Advertisements sent from the interface. The only permissible
77: values are the all-systems multicast address, 224.0.0.1, or the
78: limited-broadcast address, 255.255.255.255. (The all-systems
79: address is preferred wherever possible, i.e., on any link where
80: all listening hosts support IP multicast.)
81:
82: Default: 224.0.0.1 if the router supports IP multicast on the
83: interface, else 255.255.255.255
84:
85: The maximum time allowed between sending multicast Router
86: Advertisements from the interface, in seconds. Must be no less
87: than 4 seconds and no greater than 1800 seconds.
88:
89: Default: 600 seconds
90:
91: The minimum time allowed between sending unsolicited multicast
92: Router Advertisements from the interface, in seconds. Must be no
93: less than 3 seconds and no greater than MaxAdvertisementInterval.
94:
95: Default: 0.75 * MaxAdvertisementInterval
96:
97: The value to be placed in the Lifetime field of Router
98: Advertisements sent from the interface, in seconds. Must be no
99: less than MaxAdvertisementInterval and no greater than 9000
100: seconds.
101:
102: Default: 3 * MaxAdvertisementInterval
103:
104: The preferability of the address as a default router address,
105: relative to other router addresses on the same subnet. A 32-bit,
106: signed, twos-complement integer, with higher values meaning more
107: preferable. The minimum value (hex 80000000) is used to indicate
108: that the address, even though it may be advertised, is not to be
109: used by neighboring hosts as a default router address.
110:
111: Default: 0
112: */
113:
114: struct irdp_interface
115: {
116: unsigned long MaxAdvertInterval;
117: unsigned long MinAdvertInterval;
118: unsigned long Preference;
119:
120: u_int32_t flags;
121:
122: #define IF_ACTIVE (1<<0) /* ICMP Active */
123: #define IF_BROADCAST (1<<1) /* 255.255.255.255 */
124: #define IF_SOLICIT (1<<2) /* Solicit active */
125: #define IF_DEBUG_MESSAGES (1<<3)
126: #define IF_DEBUG_PACKET (1<<4)
127: #define IF_DEBUG_MISC (1<<5)
128: #define IF_SHUTDOWN (1<<6)
129:
130: struct interface *ifp;
131: struct thread *t_advertise;
132: unsigned long irdp_sent;
133: u_int16_t Lifetime;
134:
135: struct list *AdvPrefList;
136:
137: };
138:
139: struct Adv
140: {
141: struct in_addr ip;
142: int pref;
143: };
144:
145: extern void irdp_init(void);
146: extern int irdp_sock_init(void);
147: extern void irdp_finish(void);
148: extern void irdp_config_write (struct vty *, struct interface *);
149: extern int irdp_send_thread(struct thread *t_advert);
150: extern void irdp_advert_off(struct interface *ifp);
151: extern void process_solicit (struct interface *ifp);
152: extern int irdp_read_raw(struct thread *r);
153: extern void send_packet(struct interface *ifp, struct stream *s,
154: u_int32_t dst, struct prefix *p, u_int32_t ttl);
155:
156:
157: #endif /* _IRDP_H */
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>