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