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