Import Upstream version 1.2.2
[quagga-debian.git] / zebra / irdp.h
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 */