ff514c2e6d7e3ba3ac840063c25cc1c5981e9657
[olsrd.git] / src / olsr_protocol.h
1
2 /*
3  * The olsr.org Optimized Link-State Routing daemon(olsrd)
4  * Copyright (c) 2004-2009, the olsr.org team - see HISTORY file
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
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(uint16_t) + sizeof(uint16_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        2000
74 #define REFRESH_INTERVAL      2000
75 #define TC_INTERVAL           5000
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         30000
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  *Willingness
128  */
129
130 #define WILL_NEVER            0
131 #define WILL_LOW              1
132 #define WILL_DEFAULT          3
133 #define WILL_HIGH             6
134 #define WILL_ALWAYS           7
135
136 /*
137  *Redundancy defaults
138  */
139 #define TC_REDUNDANCY         2
140 #define MPR_COVERAGE          1
141
142 /*
143  *Misc. Constants
144  */
145 #define MAXJITTER             HELLO_INTERVAL / 4
146 #define MAX_TTL               0xff
147
148 /*
149  *Sequence numbering
150  */
151
152 /* Seqnos are 16 bit values */
153
154 #define MAXVALUE 0xFFFF
155
156 /* Macro for checking seqnos "wraparound" */
157 #define SEQNO_GREATER_THAN(s1, s2)                \
158         (((s1 > s2) && (s1 - s2 <= (MAXVALUE/2))) \
159      || ((s2 > s1) && (s2 - s1 > (MAXVALUE/2))))
160
161
162
163 /*
164  * Macros for creating and extracting the neighbor
165  * and link type information from 8bit link_code
166  * data as passed in HELLO messages
167  */
168
169 #define CREATE_LINK_CODE(status, link) (link | (status<<2))
170
171 #define EXTRACT_STATUS(link_code) ((link_code & 0xC)>>2)
172
173 #define EXTRACT_LINK(link_code) (link_code & 0x3)
174
175
176 /***********************************************
177  *           OLSR packet definitions           *
178  ***********************************************/
179
180
181 /*
182  *The HELLO message
183  */
184
185 /*
186  *Hello info
187  */
188 struct hellinfo {
189   uint8_t link_code;
190   uint8_t reserved;
191   uint16_t size;
192   uint32_t neigh_addr[1];              /* neighbor IP address(es) */
193 } __attribute__ ((packed));
194
195 struct hellomsg {
196   uint16_t reserved;
197   uint8_t htime;
198   uint8_t willingness;
199   struct hellinfo hell_info[1];
200 } __attribute__ ((packed));
201
202 /*
203  *IPv6
204  */
205
206 struct hellinfo6 {
207   uint8_t link_code;
208   uint8_t reserved;
209   uint16_t size;
210   struct in6_addr neigh_addr[1];       /* neighbor IP address(es) */
211 } __attribute__ ((packed));
212
213 struct hellomsg6 {
214   uint16_t reserved;
215   uint8_t htime;
216   uint8_t willingness;
217   struct hellinfo6 hell_info[1];
218 } __attribute__ ((packed));
219
220 /*
221  * Topology Control packet
222  */
223
224 struct neigh_info {
225   uint32_t addr;
226 } __attribute__ ((packed));
227
228
229 struct olsr_tcmsg {
230   uint16_t ansn;
231   uint16_t reserved;
232   struct neigh_info neigh[1];
233 } __attribute__ ((packed));
234
235
236
237 /*
238  *IPv6
239  */
240
241 struct neigh_info6 {
242   struct in6_addr addr;
243 } __attribute__ ((packed));
244
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
254
255
256 /*
257  *Multiple Interface Declaration message
258  */
259
260 /*
261  * Defined as s struct for further expansion
262  * For example: do we want to tell what type of interface
263  * is associated whit each address?
264  */
265 struct midaddr {
266   uint32_t addr;
267 } __attribute__ ((packed));
268
269
270 struct midmsg {
271   struct midaddr mid_addr[1];
272 } __attribute__ ((packed));
273
274
275 /*
276  *IPv6
277  */
278 struct midaddr6 {
279   struct in6_addr addr;
280 } __attribute__ ((packed));
281
282
283 struct midmsg6 {
284   struct midaddr6 mid_addr[1];
285 } __attribute__ ((packed));
286
287
288
289
290
291
292 /*
293  * Host and Network Association message
294  */
295 struct hnapair {
296   uint32_t addr;
297   uint32_t netmask;
298 } __attribute__ ((packed));
299
300 struct hnamsg {
301   struct hnapair hna_net[1];
302 } __attribute__ ((packed));
303
304 /*
305  *IPv6
306  */
307
308 struct hnapair6 {
309   struct in6_addr addr;
310   struct in6_addr netmask;
311 } __attribute__ ((packed));
312
313 struct hnamsg6 {
314   struct hnapair6 hna_net[1];
315 } __attribute__ ((packed));
316
317
318
319
320
321 /*
322  * OLSR message (several can exist in one OLSR packet)
323  */
324
325 struct olsrmsg {
326   uint8_t olsr_msgtype;
327   uint8_t olsr_vtime;
328   uint16_t olsr_msgsize;
329   uint32_t originator;
330   uint8_t ttl;
331   uint8_t hopcnt;
332   uint16_t seqno;
333
334   union {
335     struct hellomsg hello;
336     struct olsr_tcmsg tc;
337     struct hnamsg hna;
338     struct midmsg mid;
339   } message;
340
341 } __attribute__ ((packed));
342
343 /*
344  * Internal representation of the header.
345  * Used for some code sharing between message parsers.
346  */
347 struct olsrmsg_hdr {
348   uint8_t type;
349   olsr_reltime vtime;
350   uint16_t size;
351   union olsr_ip_addr originator;
352   uint8_t ttl;
353   uint8_t hopcnt;
354   uint16_t seqno;
355 } __attribute__ ((packed));
356
357 /*
358  *IPv6
359  */
360
361 struct olsrmsg6 {
362   uint8_t olsr_msgtype;
363   uint8_t olsr_vtime;
364   uint16_t olsr_msgsize;
365   struct in6_addr originator;
366   uint8_t ttl;
367   uint8_t hopcnt;
368   uint16_t seqno;
369
370   union {
371     struct hellomsg6 hello;
372     struct olsr_tcmsg6 tc;
373     struct hnamsg6 hna;
374     struct midmsg6 mid;
375   } message;
376
377 } __attribute__ ((packed));
378
379
380
381 /*
382  * Generic OLSR packet
383  */
384
385 struct olsr {
386   uint16_t olsr_packlen;               /* packet length */
387   uint16_t olsr_seqno;
388   struct olsrmsg olsr_msg[1];          /* variable messages */
389 } __attribute__ ((packed));
390
391
392 struct olsr6 {
393   uint16_t olsr_packlen;               /* packet length */
394   uint16_t olsr_seqno;
395   struct olsrmsg6 olsr_msg[1];         /* variable messages */
396 } __attribute__ ((packed));
397
398
399 /* IPv4 <-> IPv6 compability */
400
401 union olsr_message {
402   struct olsrmsg v4;
403   struct olsrmsg6 v6;
404 } __attribute__ ((packed));
405
406 union olsr_packet {
407   struct olsr v4;
408   struct olsr6 v6;
409 } __attribute__ ((packed));
410
411
412 #endif
413
414 /*
415  * Local Variables:
416  * c-basic-offset: 2
417  * indent-tabs-mode: nil
418  * End:
419  */