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