Added NetBSD patch
[olsrd.git] / src / olsr_protocol.h
1 /*
2  * The olsr.org Optimized Link-State Routing daemon(olsrd)
3  * Copyright (c) 2004, Andreas T√łnnesen(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  * $Id: olsr_protocol.h,v 1.16 2004/12/12 17:54:00 kattemat Exp $
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 /* Port for OLSR to use */
51
52 #define OLSRPORT       698
53
54 /* Default IPv6 multicast addresses */
55
56 #define OLSR_IPV6_MCAST_SITE_LOCAL "ff05::15"
57 #define OLSR_IPV6_MCAST_GLOBAL     "ff0e::1"
58
59
60 /* types */
61 #include <sys/types.h>
62
63 typedef enum
64 {
65     OLSR_FALSE = 0,
66     OLSR_TRUE
67 }olsr_bool;
68
69 #ifdef linux
70
71 typedef u_int8_t        olsr_u8_t;
72 typedef u_int16_t       olsr_u16_t;
73 typedef u_int32_t       olsr_u32_t;
74 typedef int8_t          olsr_8_t;
75 typedef int16_t         olsr_16_t;
76 typedef int32_t         olsr_32_t;
77
78 #elif defined __FreeBSD__ || defined __NetBSD__
79
80 typedef uint8_t         olsr_u8_t;
81 typedef uint16_t        olsr_u16_t;
82 typedef uint32_t        olsr_u32_t;
83 typedef int8_t          olsr_8_t;
84 typedef int16_t         olsr_16_t;
85 typedef int32_t         olsr_32_t;
86
87 #elif defined WIN32
88
89 typedef unsigned char   olsr_u8_t;
90 typedef unsigned short  olsr_u16_t;
91 typedef unsigned int    olsr_u32_t;
92 typedef char            olsr_8_t;
93 typedef short           olsr_16_t;
94 typedef int             olsr_32_t;
95  
96 #elif defined __MacOSX__
97
98 typedef u_int8_t        olsr_u8_t;
99 typedef u_int16_t       olsr_u16_t;
100 typedef u_int32_t       olsr_u32_t;
101 typedef int8_t          olsr_8_t;
102 typedef int16_t         olsr_16_t;
103 typedef int32_t         olsr_32_t;
104
105 #else
106 #       error "Unsupported system"
107 #endif
108
109 /* IPv6 address format in6_addr */
110 #include <netinet/in.h>
111
112 union olsr_ip_addr
113 {
114   olsr_u32_t v4;
115   struct in6_addr v6;
116 };
117
118
119 #define OLSR_HEADERSIZE (sizeof(olsr_u16_t) + sizeof(olsr_u16_t))
120
121
122 /*
123  *Emission Intervals
124  */
125
126 #define HELLO_INTERVAL        2
127 #define REFRESH_INTERVAL      2
128 #define TC_INTERVAL           5
129 #define MID_INTERVAL          TC_INTERVAL
130 #define HNA_INTERVAL          TC_INTERVAL
131
132 /*
133  *Holding Time
134  */
135
136 #define NEIGHB_HOLD_TIME      3 * REFRESH_INTERVAL
137 #define TOP_HOLD_TIME         3 * TC_INTERVAL
138 #define DUP_HOLD_TIME         30
139 #define MID_HOLD_TIME         3 * MID_INTERVAL
140 #define HNA_HOLD_TIME         3 * HNA_INTERVAL
141
142 /*
143  * Scaling factor
144  */
145
146 #define VTIME_SCALE_FACTOR    0.0625
147
148 /*
149  *Message Types
150  */
151
152 #define HELLO_MESSAGE         1
153 #define TC_MESSAGE            2
154 #define MID_MESSAGE           3
155 #define HNA_MESSAGE           4
156 #define MAX_MESSAGE           4
157
158 /*
159  *Link Types
160  */
161
162 #define UNSPEC_LINK           0
163 #define ASYM_LINK             1
164 #define SYM_LINK              2
165 #define LOST_LINK             3
166 #define HIDE_LINK             4
167 #define MAX_LINK              4
168
169 /*
170  *Neighbor Types
171  */
172
173 #define NOT_NEIGH             0
174 #define SYM_NEIGH             1
175 #define MPR_NEIGH             2
176 #define MAX_NEIGH             2
177
178 /*
179  *Neighbor status
180  */
181
182 #define NOT_SYM               0
183 #define SYM                   1
184
185 /*
186  *Link Hysteresis
187  */
188
189 #define HYST_THRESHOLD_HIGH   0.8
190 #define HYST_THRESHOLD_LOW    0.3
191 #define HYST_SCALING          0.5
192
193 /*
194  *Willingness
195  */
196
197 #define WILL_NEVER            0
198 #define WILL_LOW              1
199 #define WILL_DEFAULT          3
200 #define WILL_HIGH             6
201 #define WILL_ALWAYS           7
202
203 /*
204  *Redundancy defaults
205  */
206 #define TC_REDUNDANCY         0
207 #define MPR_COVERAGE          1
208
209 /*
210  *Misc. Constants
211  */
212 #define MAXJITTER             HELLO_INTERVAL / 4
213 #define MAX_TTL               0xff
214
215 /*
216  *Sequence numbering
217  */
218
219 /* Seqnos are 16 bit values */
220
221 #define MAXVALUE 0xFFFF
222
223 /* Macro for checking seqnos "wraparound" */
224 #define SEQNO_GREATER_THAN(s1, s2)                \
225         (((s1 > s2) && (s1 - s2 <= (MAXVALUE/2))) \
226      || ((s2 > s1) && (s2 - s1 > (MAXVALUE/2))))
227
228
229
230 /*
231  * Macros for creating and extracting the neighbor 
232  * and link type information from 8bit link_code
233  * data as passed in HELLO messages
234  */
235
236 #define CREATE_LINK_CODE(status, link) (link | (status<<2))
237
238 #define EXTRACT_STATUS(link_code) ((link_code & 0xC)>>2)
239
240 #define EXTRACT_LINK(link_code) (link_code & 0x3)
241
242
243 /*
244  * Macros for comparing and copying IP addresses
245  */
246
247 #define COMP_IP(ip1, ip2) (!memcmp(ip1, ip2, ipsize))
248
249 #define COPY_IP(to, from) memcpy(to, from, ipsize)
250
251
252
253 /***********************************************
254  *           OLSR packet definitions           *
255  ***********************************************/
256
257
258 /*
259  *The HELLO message
260  */
261
262 /*
263  *Hello info
264  */
265 struct hellinfo 
266 {
267   olsr_u8_t   link_code;
268   olsr_u8_t   reserved;
269   olsr_u16_t  size;
270   olsr_u32_t  neigh_addr[1]; /* neighbor IP address(es) */
271 };
272
273 struct hellomsg 
274 {
275   olsr_u16_t      reserved;
276   olsr_u8_t       htime;
277   olsr_u8_t       willingness;
278   struct hellinfo hell_info[1];
279 };
280
281 /*
282  *IPv6
283  */
284
285 struct hellinfo6
286 {
287   olsr_u8_t       link_code;
288   olsr_u8_t       reserved;
289   olsr_u16_t      size;
290   struct in6_addr neigh_addr[1]; /* neighbor IP address(es) */
291 };
292
293 struct hellomsg6
294 {
295   olsr_u16_t         reserved;
296   olsr_u8_t          htime;
297   olsr_u8_t          willingness;
298   struct hellinfo6   hell_info[1];
299 };
300
301 /*
302  * Topology Control packet
303  */
304
305 struct neigh_info
306 {
307   olsr_u32_t       addr;
308 };
309
310
311 struct tcmsg 
312 {
313   olsr_u16_t        ansn;
314   olsr_u16_t        reserved;
315   struct neigh_info neigh[1];
316 };
317
318
319
320 /*
321  *IPv6
322  */
323
324 struct neigh_info6
325 {
326   struct in6_addr      addr;
327 };
328
329
330 struct tcmsg6
331 {
332   olsr_u16_t           ansn;
333   olsr_u16_t           reserved;
334   struct neigh_info6   neigh[1];
335 };
336
337
338
339
340
341 /*
342  *Multiple Interface Declaration message
343  */
344
345 /* 
346  * Defined as s struct for further expansion 
347  * For example: do we want to tell what type of interface
348  * is associated whit each address?
349  */
350 struct midaddr
351 {
352   olsr_u32_t addr;
353 };
354
355
356 struct midmsg 
357 {
358   struct midaddr mid_addr[1];
359 };
360
361
362 /*
363  *IPv6
364  */
365 struct midaddr6
366 {
367   struct in6_addr addr;
368 };
369
370
371 struct midmsg6
372 {
373   struct midaddr6 mid_addr[1];
374 };
375
376
377
378
379
380
381 /*
382  * Host and Network Association message
383  */
384 struct hnapair
385 {
386   olsr_u32_t   addr;
387   olsr_u32_t   netmask;
388 };
389
390 struct hnamsg
391 {
392   struct hnapair hna_net[1];
393 };
394
395 /*
396  *IPv6
397  */
398
399 struct hnapair6
400 {
401   struct in6_addr   addr;
402   struct in6_addr   netmask;
403 };
404
405 struct hnamsg6
406 {
407   struct hnapair6 hna_net[1];
408 };
409
410
411
412
413
414 /*
415  * OLSR message (several can exist in one OLSR packet)
416  */
417
418 struct olsrmsg
419 {
420   olsr_u8_t     olsr_msgtype;
421   olsr_u8_t     olsr_vtime;
422   olsr_u16_t    olsr_msgsize;
423   olsr_u32_t    originator;
424   olsr_u8_t     ttl;
425   olsr_u8_t     hopcnt;
426   olsr_u16_t    seqno;
427
428   union 
429   {
430     struct hellomsg hello;
431     struct tcmsg    tc;
432     struct hnamsg   hna;
433     struct midmsg   mid;
434   } message;
435
436 };
437
438 /*
439  *IPv6
440  */
441
442 struct olsrmsg6
443 {
444   olsr_u8_t        olsr_msgtype;
445   olsr_u8_t        olsr_vtime;
446   olsr_u16_t       olsr_msgsize;
447   struct in6_addr  originator;
448   olsr_u8_t        ttl;
449   olsr_u8_t        hopcnt;
450   olsr_u16_t       seqno;
451
452   union 
453   {
454     struct hellomsg6 hello;
455     struct tcmsg6    tc;
456     struct hnamsg6   hna;
457     struct midmsg6   mid;
458   } message;
459
460 };
461
462
463
464 /*
465  * Generic OLSR packet
466  */
467
468 struct olsr 
469 {
470   olsr_u16_t      olsr_packlen;         /* packet length */
471   olsr_u16_t      olsr_seqno;
472   struct olsrmsg  olsr_msg[1];          /* variable messages */
473 };
474
475
476 struct olsr6
477 {
478   olsr_u16_t        olsr_packlen;        /* packet length */
479   olsr_u16_t        olsr_seqno;
480   struct olsrmsg6   olsr_msg[1];         /* variable messages */
481 };
482
483
484 /* IPv4 <-> IPv6 compability */
485
486 union olsr_message
487 {
488   struct olsrmsg  v4;
489   struct olsrmsg6 v6;
490 };
491
492 union olsr_packet
493 {
494   struct olsr  v4;
495   struct olsr6 v6;
496 };
497
498
499 #endif