Set default IPv6 multicast IP to FF02::6D (see RFC 5498)
[olsrd.git] / src / olsr_protocol.h
1
2 /*
3  * The olsr.org Optimized Link-State Routing daemon(olsrd)
4  * Copyright (c) 2004, Andreas Tonnesen(andreto@olsr.org)
5  * All rights reserved.
6  *
7  * Redistribution and use in source and binary forms, with or without
8  * modification, are permitted provided that the following conditions
9  * are met:
10  *
11  * * Redistributions of source code must retain the above copyright
12  *   notice, this list of conditions and the following disclaimer.
13  * * Redistributions in binary form must reproduce the above copyright
14  *   notice, this list of conditions and the following disclaimer in
15  *   the documentation and/or other materials provided with the
16  *   distribution.
17  * * Neither the name of olsr.org, olsrd nor the names of its
18  *   contributors may be used to endorse or promote products derived
19  *   from this software without specific prior written permission.
20  *
21  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
22  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
23  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
24  * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
25  * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
26  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
27  * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
28  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
29  * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
30  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
31  * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
32  * POSSIBILITY OF SUCH DAMAGE.
33  *
34  * Visit http://www.olsr.org for more information.
35  *
36  * If you find this software useful feel free to make a donation
37  * to the project. For more information see the website or contact
38  * the copyright holders.
39  *
40  */
41
42 /*
43  *Values and packet formats as proposed in RFC3626 and misc. values and
44  *data structures used by the olsr.org OLSR daemon.
45  */
46
47 #ifndef _PROTOCOLS_OLSR_H
48 #define _PROTOCOLS_OLSR_H
49
50 #include "olsr_types.h"
51 #include "olsr_cfg.h"
52
53 #include <string.h>
54
55 /* Default IPv6 multicast addresses (linklocal manet routers, see RFC 5498) */
56 #define OLSR_IPV6_MCAST "FF02::6D"
57
58 #define OLSR_HEADERSIZE (sizeof(uint16_t) + sizeof(uint16_t))
59
60 #define OLSR_MSGHDRSZ_IPV4 12
61 #define OLSR_MSGHDRSZ_IPV6 24
62
63 /*
64  *Emission Intervals
65  */
66
67 #define HELLO_INTERVAL        2
68 #define REFRESH_INTERVAL      2
69 #define TC_INTERVAL           5
70 #define MID_INTERVAL          TC_INTERVAL
71 #define HNA_INTERVAL          TC_INTERVAL
72
73 /* Emission Jitter */
74 #define HELLO_JITTER         25 /* percent */
75 #define HNA_JITTER           25 /* percent */
76 #define MID_JITTER           25 /* percent */
77 #define TC_JITTER            25 /* percent */
78
79 /*
80  * Default Holding Time (for large scale community networks)
81  */
82
83 #define NEIGHB_HOLD_TIME      10 * REFRESH_INTERVAL
84 #define TOP_HOLD_TIME         60 * TC_INTERVAL
85 #define DUP_HOLD_TIME         30
86 #define MID_HOLD_TIME         60 * MID_INTERVAL
87 #define HNA_HOLD_TIME         60 * HNA_INTERVAL
88
89 /*
90  *Message Types
91  */
92
93 #define HELLO_MESSAGE         1
94 #define TC_MESSAGE            2
95 #define MID_MESSAGE           3
96 #define HNA_MESSAGE           4
97 #define MAX_MESSAGE           4
98
99 /*
100  *Link Types
101  */
102
103 #define UNSPEC_LINK           0
104 #define ASYM_LINK             1
105 #define SYM_LINK              2
106 #define LOST_LINK             3
107 #define HIDE_LINK             4
108 #define MAX_LINK              4
109
110 /*
111  *Neighbor Types
112  */
113
114 #define NOT_NEIGH             0
115 #define SYM_NEIGH             1
116 #define MPR_NEIGH             2
117 #define MAX_NEIGH             2
118
119 /*
120  *Neighbor status
121  */
122
123 #define NOT_SYM               0
124 #define SYM                   1
125
126 /*
127  *Link Hysteresis
128  */
129
130 #define HYST_THRESHOLD_HIGH   0.8
131 #define HYST_THRESHOLD_LOW    0.3
132 #define HYST_SCALING          0.5
133
134 /*
135  *Willingness
136  */
137
138 #define WILL_NEVER            0
139 #define WILL_LOW              1
140 #define WILL_DEFAULT          3
141 #define WILL_HIGH             6
142 #define WILL_ALWAYS           7
143
144 /*
145  *Redundancy defaults
146  */
147 #define TC_REDUNDANCY         2
148 #define MPR_COVERAGE          7
149
150 /*
151  *Misc. Constants
152  */
153 #define MAXJITTER             HELLO_INTERVAL / 4
154 #define MAX_TTL               0xff
155
156 /*
157  *Sequence numbering
158  */
159
160 /* Seqnos are 16 bit values */
161
162 #define MAXVALUE 0xFFFF
163
164 /* Macro for checking seqnos "wraparound" */
165 #define SEQNO_GREATER_THAN(s1, s2)                \
166         (((s1 > s2) && (s1 - s2 <= (MAXVALUE/2))) \
167      || ((s2 > s1) && (s2 - s1 > (MAXVALUE/2))))
168
169 /*
170  * Macros for creating and extracting the neighbor
171  * and link type information from 8bit link_code
172  * data as passed in HELLO messages
173  */
174
175 #define CREATE_LINK_CODE(status, link) (link | (status<<2))
176
177 #define EXTRACT_STATUS(link_code) ((link_code & 0xC)>>2)
178
179 #define EXTRACT_LINK(link_code) (link_code & 0x3)
180
181 /***********************************************
182  *           OLSR packet definitions           *
183  ***********************************************/
184
185 /*
186  *The HELLO message
187  */
188
189 /*
190  *Hello info
191  */
192 struct hellinfo {
193   uint8_t link_code;
194   uint8_t reserved;
195   uint16_t size;
196   uint32_t neigh_addr[1];              /* neighbor IP address(es) */
197 } __attribute__ ((packed));
198
199 struct hellomsg {
200   uint16_t reserved;
201   uint8_t htime;
202   uint8_t willingness;
203   struct hellinfo hell_info[1];
204 } __attribute__ ((packed));
205
206 /*
207  *IPv6
208  */
209
210 struct hellinfo6 {
211   uint8_t link_code;
212   uint8_t reserved;
213   uint16_t size;
214   struct in6_addr neigh_addr[1];       /* neighbor IP address(es) */
215 } __attribute__ ((packed));
216
217 struct hellomsg6 {
218   uint16_t reserved;
219   uint8_t htime;
220   uint8_t willingness;
221   struct hellinfo6 hell_info[1];
222 } __attribute__ ((packed));
223
224 /*
225  * Topology Control packet
226  */
227
228 struct neigh_info {
229   uint32_t addr;
230 } __attribute__ ((packed));
231
232 struct olsr_tcmsg {
233   uint16_t ansn;
234   uint16_t reserved;
235   struct neigh_info neigh[1];
236 } __attribute__ ((packed));
237
238 /*
239  *IPv6
240  */
241
242 struct neigh_info6 {
243   struct in6_addr addr;
244 } __attribute__ ((packed));
245
246 struct olsr_tcmsg6 {
247   uint16_t ansn;
248   uint16_t reserved;
249   struct neigh_info6 neigh[1];
250 } __attribute__ ((packed));
251
252 /*
253  *Multiple Interface Declaration message
254  */
255
256 /*
257  * Defined as s struct for further expansion
258  * For example: do we want to tell what type of interface
259  * is associated whit each address?
260  */
261 struct midaddr {
262   uint32_t addr;
263 } __attribute__ ((packed));
264
265 struct midmsg {
266   struct midaddr mid_addr[1];
267 } __attribute__ ((packed));
268
269 /*
270  *IPv6
271  */
272 struct midaddr6 {
273   struct in6_addr addr;
274 } __attribute__ ((packed));
275
276 struct midmsg6 {
277   struct midaddr6 mid_addr[1];
278 } __attribute__ ((packed));
279
280 /*
281  * Host and Network Association message
282  */
283 struct hnapair {
284   uint32_t addr;
285   uint32_t netmask;
286 } __attribute__ ((packed));
287
288 struct hnamsg {
289   struct hnapair hna_net[1];
290 } __attribute__ ((packed));
291
292 /*
293  *IPv6
294  */
295
296 struct hnapair6 {
297   struct in6_addr addr;
298   struct in6_addr netmask;
299 } __attribute__ ((packed));
300
301 struct hnamsg6 {
302   struct hnapair6 hna_net[1];
303 } __attribute__ ((packed));
304
305 /*
306  * OLSR message (several can exist in one OLSR packet)
307  */
308
309 struct olsrmsg {
310   uint8_t olsr_msgtype;
311   uint8_t olsr_vtime;
312   uint16_t olsr_msgsize;
313   uint32_t originator;
314   uint8_t ttl;
315   uint8_t hopcnt;
316   uint16_t seqno;
317
318   union {
319     struct hellomsg hello;
320     struct olsr_tcmsg tc;
321     struct hnamsg hna;
322     struct midmsg mid;
323   } message;
324
325 } __attribute__ ((packed));
326
327 /*
328  *IPv6
329  */
330
331 struct olsrmsg6 {
332   uint8_t olsr_msgtype;
333   uint8_t olsr_vtime;
334   uint16_t olsr_msgsize;
335   struct in6_addr originator;
336   uint8_t ttl;
337   uint8_t hopcnt;
338   uint16_t seqno;
339
340   union {
341     struct hellomsg6 hello;
342     struct olsr_tcmsg6 tc;
343     struct hnamsg6 hna;
344     struct midmsg6 mid;
345   } message;
346
347 } __attribute__ ((packed));
348
349 /*
350  * Generic OLSR packet
351  */
352
353 struct olsr {
354   uint16_t olsr_packlen;               /* packet length */
355   uint16_t olsr_seqno;
356   struct olsrmsg olsr_msg[1];          /* variable messages */
357 } __attribute__ ((packed));
358
359 struct olsr6 {
360   uint16_t olsr_packlen;               /* packet length */
361   uint16_t olsr_seqno;
362   struct olsrmsg6 olsr_msg[1];         /* variable messages */
363 } __attribute__ ((packed));
364
365 /* IPv4 <-> IPv6 compability */
366
367 union olsr_message {
368   struct olsrmsg v4;
369   struct olsrmsg6 v6;
370 } __attribute__ ((packed));
371
372 union olsr_packet {
373   struct olsr v4;
374   struct olsr6 v6;
375 } __attribute__ ((packed));
376
377 #endif
378
379 /*
380  * Local Variables:
381  * c-basic-offset: 2
382  * indent-tabs-mode: nil
383  * End:
384  */