96770d83fcd8b2ec0513a4ea986ad08d21095a6d
[olsrd.git] / src / olsr_protocol.h
1
2 /*
3  * The olsr.org Optimized Link-State Routing daemon(olsrd)
4  * Copyright (c) 2004, Andreas Tonnesen(andreto@olsr.org)
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 /* Default IPv6 multicast addresses */
56
57 #define OLSR_IPV6_MCAST "FF02::1"
58
59 #define OLSR_HEADERSIZE (sizeof(uint16_t) + sizeof(uint16_t))
60
61 #define OLSR_MSGHDRSZ_IPV4 12
62 #define OLSR_MSGHDRSZ_IPV6 24
63
64 /*
65  *Emission Intervals
66  */
67
68 #define HELLO_INTERVAL        2
69 #define REFRESH_INTERVAL      2
70 #define TC_INTERVAL           5
71 #define MID_INTERVAL          TC_INTERVAL
72 #define HNA_INTERVAL          TC_INTERVAL
73
74 /* Emission Jitter */
75 #define HELLO_JITTER         25 /* percent */
76 #define HNA_JITTER           25 /* percent */
77 #define MID_JITTER           25 /* percent */
78 #define TC_JITTER            25 /* percent */
79
80 /*
81  * Default Holding Time (for large scale community networks)
82  */
83
84 #define NEIGHB_HOLD_TIME      10 * REFRESH_INTERVAL
85 #define TOP_HOLD_TIME         60 * TC_INTERVAL
86 #define DUP_HOLD_TIME         30
87 #define MID_HOLD_TIME         60 * MID_INTERVAL
88 #define HNA_HOLD_TIME         60 * HNA_INTERVAL
89
90 /*
91  *Message Types
92  */
93
94 #define HELLO_MESSAGE         1
95 #define TC_MESSAGE            2
96 #define MID_MESSAGE           3
97 #define HNA_MESSAGE           4
98 #define MAX_MESSAGE           4
99
100 /*
101  *Link Types
102  */
103
104 #define UNSPEC_LINK           0
105 #define ASYM_LINK             1
106 #define SYM_LINK              2
107 #define LOST_LINK             3
108 #define HIDE_LINK             4
109 #define MAX_LINK              4
110
111 /*
112  *Neighbor Types
113  */
114
115 #define NOT_NEIGH             0
116 #define SYM_NEIGH             1
117 #define MPR_NEIGH             2
118 #define MAX_NEIGH             2
119
120 /*
121  *Neighbor status
122  */
123
124 #define NOT_SYM               0
125 #define SYM                   1
126
127 /*
128  *Link Hysteresis
129  */
130
131 #define HYST_THRESHOLD_HIGH   0.8
132 #define HYST_THRESHOLD_LOW    0.3
133 #define HYST_SCALING          0.5
134
135 /*
136  *Willingness
137  */
138
139 #define WILL_NEVER            0
140 #define WILL_LOW              1
141 #define WILL_DEFAULT          3
142 #define WILL_HIGH             6
143 #define WILL_ALWAYS           7
144
145 /*
146  *Redundancy defaults
147  */
148 #define TC_REDUNDANCY         2
149 #define MPR_COVERAGE          7
150
151 /*
152  *Misc. Constants
153  */
154 #define MAXJITTER             HELLO_INTERVAL / 4
155 #define MAX_TTL               0xff
156
157 /*
158  *Sequence numbering
159  */
160
161 /* Seqnos are 16 bit values */
162
163 #define MAXVALUE 0xFFFF
164
165 /* Macro for checking seqnos "wraparound" */
166 #define SEQNO_GREATER_THAN(s1, s2)                \
167         (((s1 > s2) && (s1 - s2 <= (MAXVALUE/2))) \
168      || ((s2 > s1) && (s2 - s1 > (MAXVALUE/2))))
169
170 /*
171  * Macros for creating and extracting the neighbor
172  * and link type information from 8bit link_code
173  * data as passed in HELLO messages
174  */
175
176 #define CREATE_LINK_CODE(status, link) (link | (status<<2))
177
178 #define EXTRACT_STATUS(link_code) ((link_code & 0xC)>>2)
179
180 #define EXTRACT_LINK(link_code) (link_code & 0x3)
181
182 /***********************************************
183  *           OLSR packet definitions           *
184  ***********************************************/
185
186 /*
187  *The HELLO message
188  */
189
190 /*
191  *Hello info
192  */
193 struct hellinfo {
194   uint8_t link_code;
195   uint8_t reserved;
196   uint16_t size;
197   uint32_t neigh_addr[1];              /* neighbor IP address(es) */
198 } __attribute__ ((packed));
199
200 struct hellomsg {
201   uint16_t reserved;
202   uint8_t htime;
203   uint8_t willingness;
204   struct hellinfo hell_info[1];
205 } __attribute__ ((packed));
206
207 /*
208  *IPv6
209  */
210
211 struct hellinfo6 {
212   uint8_t link_code;
213   uint8_t reserved;
214   uint16_t size;
215   struct in6_addr neigh_addr[1];       /* neighbor IP address(es) */
216 } __attribute__ ((packed));
217
218 struct hellomsg6 {
219   uint16_t reserved;
220   uint8_t htime;
221   uint8_t willingness;
222   struct hellinfo6 hell_info[1];
223 } __attribute__ ((packed));
224
225 /*
226  * Topology Control packet
227  */
228
229 struct neigh_info {
230   uint32_t addr;
231 } __attribute__ ((packed));
232
233 struct olsr_tcmsg {
234   uint16_t ansn;
235   uint16_t reserved;
236   struct neigh_info neigh[1];
237 } __attribute__ ((packed));
238
239 /*
240  *IPv6
241  */
242
243 struct neigh_info6 {
244   struct in6_addr addr;
245 } __attribute__ ((packed));
246
247 struct olsr_tcmsg6 {
248   uint16_t ansn;
249   uint16_t reserved;
250   struct neigh_info6 neigh[1];
251 } __attribute__ ((packed));
252
253 /*
254  *Multiple Interface Declaration message
255  */
256
257 /*
258  * Defined as s struct for further expansion
259  * For example: do we want to tell what type of interface
260  * is associated whit each address?
261  */
262 struct midaddr {
263   uint32_t addr;
264 } __attribute__ ((packed));
265
266 struct midmsg {
267   struct midaddr mid_addr[1];
268 } __attribute__ ((packed));
269
270 /*
271  *IPv6
272  */
273 struct midaddr6 {
274   struct in6_addr addr;
275 } __attribute__ ((packed));
276
277 struct midmsg6 {
278   struct midaddr6 mid_addr[1];
279 } __attribute__ ((packed));
280
281 /*
282  * Host and Network Association message
283  */
284 struct hnapair {
285   uint32_t addr;
286   uint32_t netmask;
287 } __attribute__ ((packed));
288
289 struct hnamsg {
290   struct hnapair hna_net[1];
291 } __attribute__ ((packed));
292
293 /*
294  *IPv6
295  */
296
297 struct hnapair6 {
298   struct in6_addr addr;
299   struct in6_addr netmask;
300 } __attribute__ ((packed));
301
302 struct hnamsg6 {
303   struct hnapair6 hna_net[1];
304 } __attribute__ ((packed));
305
306 /*
307  * OLSR message (several can exist in one OLSR packet)
308  */
309
310 struct olsrmsg {
311   uint8_t olsr_msgtype;
312   uint8_t olsr_vtime;
313   uint16_t olsr_msgsize;
314   uint32_t originator;
315   uint8_t ttl;
316   uint8_t hopcnt;
317   uint16_t seqno;
318
319   union {
320     struct hellomsg hello;
321     struct olsr_tcmsg tc;
322     struct hnamsg hna;
323     struct midmsg mid;
324   } message;
325
326 } __attribute__ ((packed));
327
328 /*
329  *IPv6
330  */
331
332 struct olsrmsg6 {
333   uint8_t olsr_msgtype;
334   uint8_t olsr_vtime;
335   uint16_t olsr_msgsize;
336   struct in6_addr originator;
337   uint8_t ttl;
338   uint8_t hopcnt;
339   uint16_t seqno;
340
341   union {
342     struct hellomsg6 hello;
343     struct olsr_tcmsg6 tc;
344     struct hnamsg6 hna;
345     struct midmsg6 mid;
346   } message;
347
348 } __attribute__ ((packed));
349
350 /*
351  * Generic OLSR packet
352  */
353
354 struct olsr {
355   uint16_t olsr_packlen;               /* packet length */
356   uint16_t olsr_seqno;
357   struct olsrmsg olsr_msg[1];          /* variable messages */
358 } __attribute__ ((packed));
359
360 struct olsr6 {
361   uint16_t olsr_packlen;               /* packet length */
362   uint16_t olsr_seqno;
363   struct olsrmsg6 olsr_msg[1];         /* variable messages */
364 } __attribute__ ((packed));
365
366 /* IPv4 <-> IPv6 compability */
367
368 union olsr_message {
369   struct olsrmsg v4;
370   struct olsrmsg6 v6;
371 } __attribute__ ((packed));
372
373 union olsr_packet {
374   struct olsr v4;
375   struct olsr6 v6;
376 } __attribute__ ((packed));
377
378 #endif
379
380 /*
381  * Local Variables:
382  * c-basic-offset: 2
383  * indent-tabs-mode: nil
384  * End:
385  */