368169629fcd4f132052bd9d1bf7f1effc70413a
[olsrd.git] / gui / linux-gtk / src / olsr_protocol.h
1 /*
2  * The olsr.org Optimized Link-State Routing daemon (olsrd)
3  *
4  * (c) by the OLSR project
5  *
6  * See our Git repository to find out who worked on this file
7  * and thus is a copyright holder on it.
8  *
9  * All rights reserved.
10  *
11  * Redistribution and use in source and binary forms, with or without
12  * modification, are permitted provided that the following conditions
13  * are met:
14  *
15  * * Redistributions of source code must retain the above copyright
16  *   notice, this list of conditions and the following disclaimer.
17  * * Redistributions in binary form must reproduce the above copyright
18  *   notice, this list of conditions and the following disclaimer in
19  *   the documentation and/or other materials provided with the
20  *   distribution.
21  * * Neither the name of olsr.org, olsrd nor the names of its
22  *   contributors may be used to endorse or promote products derived
23  *   from this software without specific prior written permission.
24  *
25  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
26  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
27  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
28  * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
29  * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
30  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
31  * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
32  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
33  * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
34  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
35  * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
36  * POSSIBILITY OF SUCH DAMAGE.
37  *
38  * Visit http://www.olsr.org for more information.
39  *
40  * If you find this software useful feel free to make a donation
41  * to the project. For more information see the website or contact
42  * the copyright holders.
43  *
44  */
45
46 /*
47  *Values and packet formats as proposed in RFC3626 and misc. values and
48  *data structures used by the UniK olsr daemon.
49  */
50
51 #ifndef _PROTOCOLS_OLSR_H
52 #define _PROTOCOLS_OLSR_H
53
54 /* Port for OLSR to use */
55
56 #define OLSRPORT       698
57
58 /* Default IPv6 multicast address */
59
60 #define OLSR_IPV6_MULTICAST_ADDR "ff05::15"
61
62 /* types */
63 #include <sys/types.h>
64
65 #ifdef _WIN32
66 typedef unsigned char olsr_u8_t;
67 typedef unsigned short olsr_u16_t;
68 typedef unsigned int olsr_u32_t;
69 typedef char olsr_8_t;
70 typedef short olsr_16_t;
71 typedef int olsr_32_t;
72 #else /* _WIN32 */
73 typedef u_int8_t olsr_u8_t;
74 typedef u_int16_t olsr_u16_t;
75 typedef u_int32_t olsr_u32_t;
76 typedef int8_t olsr_8_t;
77 typedef int16_t olsr_16_t;
78 typedef int32_t olsr_32_t;
79 #endif /* _WIN32 */
80
81 /* IPv6 address format in6_addr */
82 #include <netinet/in.h>
83
84 union olsr_ip_addr {
85   struct in_addr v4;
86   struct in6_addr v6;
87 };
88
89 /*
90  *Emission Intervals
91  */
92
93 #define HELLO_INTERVAL        2
94 #define HELLO_INTERVAL_NW     HELLO_INTERVAL * 2
95 #define REFRESH_INTERVAL      2
96 #define TC_INTERVAL           5
97 #define MID_INTERVAL          TC_INTERVAL
98 #define HNA_INTERVAL          TC_INTERVAL
99
100 /*
101  *Holding Time
102  */
103
104 #define NEIGHB_HOLD_TIME      3 * REFRESH_INTERVAL
105
106 /*extra: time to delete for non-wireless interfaces */
107 #define NEIGHB_HOLD_TIME_NW   NEIGHB_HOLD_TIME * 2
108 #define TOP_HOLD_TIME         3 * TC_INTERVAL
109 #define DUP_HOLD_TIME         30
110 #define MID_HOLD_TIME         3 * MID_INTERVAL
111 #define HNA_HOLD_TIME         3 * HNA_INTERVAL
112
113 /*
114  * Scaling factor
115  */
116
117 #define VTIME_SCALE_FACTOR    0.0625
118
119 /*
120  *Message Types
121  */
122
123 #define HELLO_MESSAGE         1
124 #define TC_MESSAGE            2
125 #define MID_MESSAGE           3
126 #define HNA_MESSAGE           4
127 #define MAX_MESSAGE           4
128
129 /*
130  *Link Types
131  */
132
133 #define UNSPEC_LINK           0
134 #define ASYM_LINK             1
135 #define SYM_LINK              2
136 #define LOST_LINK             3
137 #define MAX_LINK              3
138
139 /*
140  *Neighbor Types
141  */
142
143 #define NOT_NEIGH             0
144 #define SYM_NEIGH             1
145 #define MPR_NEIGH             2
146 #define MAX_NEIGH             2
147
148 /*
149  *Neighbor status
150  */
151
152 #define NOT_SYM               0
153 #define SYM                   1
154
155 /*
156  *Link Hysteresis
157  */
158
159 #define HYST_THRESHOLD_HIGH   0.8
160 #define HYST_THRESHOLD_LOW    0.3
161 #define HYST_SCALING          0.5
162
163 /*
164  *Willingness
165  */
166
167 #define WILL_NEVER            0
168 #define WILL_LOW              1
169 #define WILL_DEFAULT          3
170 #define WILL_HIGH             6
171 #define WILL_ALWAYS           7
172
173 /*
174  *Misc. Constants
175  */
176
177 #define TC_REDUNDANCY         0
178 #define MPR_COVERAGE          1
179 #define MAXJITTER             HELLO_INTERVAL / 4
180 #define MAX_TTL               0xff
181
182 /*
183  *Sequence numbering
184  */
185
186 /* Seqnos are 16 bit values */
187
188 #define MAXVALUE 0xFFFF
189
190 /* Macro for checking seqnos "wraparound" */
191 #define SEQNO_GREATER_THAN(s1, s2)                \
192         (((s1 > s2) && (s1 - s2 <= (MAXVALUE/2))) \
193      || ((s2 > s1) && (s2 - s1 > (MAXVALUE/2))))
194
195 /*
196  * Macros for creating and extracting the neighbor
197  * and link type information from 8bit link_code
198  * data as passed in HELLO messages
199  */
200
201 #define CREATE_LINK_CODE(status, link) (link | (status<<2))
202
203 #define EXTRACT_STATUS(link_code) ((link_code & 0xC)>>2)
204
205 #define EXTRACT_LINK(link_code) (link_code & 0x3)
206
207 /***********************************************
208  *           OLSR packet definitions           *
209  ***********************************************/
210
211 /*
212  *The HELLO message
213  */
214
215 /*
216  *Hello info
217  */
218 struct hellinfo {
219   olsr_u8_t link_code;
220   olsr_u8_t reserved;
221   olsr_u16_t size;
222   olsr_u32_t neigh_addr[1];            /* neighbor IP address(es) */
223 };
224
225 struct hellomsg {
226   olsr_u16_t reserved;
227   olsr_u8_t htime;
228   olsr_u8_t willingness;
229   struct hellinfo hell_info[1];
230 };
231
232 /*
233  *IPv6
234  */
235
236 struct hellinfo6 {
237   olsr_u8_t link_code;
238   olsr_u8_t reserved;
239   olsr_u16_t size;
240   struct in6_addr neigh_addr[1];       /* neighbor IP address(es) */
241 };
242
243 struct hellomsg6 {
244   olsr_u16_t reserved;
245   olsr_u8_t htime;
246   olsr_u8_t willingness;
247   struct hellinfo6 hell_info[1];
248 };
249
250 /*
251  * Topology Control packet
252  */
253
254 struct neigh_info {
255   olsr_u32_t addr;
256 };
257
258 struct olsr_tcmsg {
259   olsr_u16_t ansn;
260   olsr_u16_t reserved;
261   struct neigh_info neigh[1];
262 };
263
264 /*
265  *IPv6
266  */
267
268 struct neigh_info6 {
269   struct in6_addr addr;
270 };
271
272 struct olsr_tcmsg6 {
273   olsr_u16_t ansn;
274   olsr_u16_t reserved;
275   struct neigh_info6 neigh[1];
276 };
277
278 /*
279  *Multiple Interface Declaration message
280  */
281
282 /*
283  * Defined as s struct for further expansion
284  * For example: do we want to tell what type of interface
285  * is associated whit each address?
286  */
287 struct midaddr {
288   olsr_u32_t addr;
289 };
290
291 struct midmsg {
292   struct midaddr mid_addr[1];
293 };
294
295 /*
296  *IPv6
297  */
298 struct midaddr6 {
299   struct in6_addr addr;
300 };
301
302 struct midmsg6 {
303   struct midaddr6 mid_addr[1];
304 };
305
306 /*
307  * Host and Network Association message
308  */
309 struct hnapair {
310   olsr_u32_t addr;
311   olsr_u32_t netmask;
312 };
313
314 struct hnamsg {
315   struct hnapair hna_net[1];
316 };
317
318 /*
319  *IPv6
320  */
321
322 struct hnapair6 {
323   struct in6_addr addr;
324   struct in6_addr netmask;
325 };
326
327 struct hnamsg6 {
328   struct hnapair6 hna_net[1];
329 };
330
331 /*
332  * OLSR message (several can exist in one OLSR packet)
333  */
334
335 struct olsrmsg {
336   olsr_u8_t olsr_msgtype;
337   olsr_u8_t olsr_vtime;
338   olsr_u16_t olsr_msgsize;
339   olsr_u32_t originator;
340   olsr_u8_t ttl;
341   olsr_u8_t hopcnt;
342   olsr_u16_t seqno;
343
344   union {
345     struct hellomsg hello;
346     struct olsr_tcmsg tc;
347     struct hnamsg hna;
348     struct midmsg mid;
349   } message;
350
351 };
352
353 /*
354  *IPv6
355  */
356
357 struct olsrmsg6 {
358   olsr_u8_t olsr_msgtype;
359   olsr_u8_t olsr_vtime;
360   olsr_u16_t olsr_msgsize;
361   struct in6_addr originator;
362   olsr_u8_t ttl;
363   olsr_u8_t hopcnt;
364   olsr_u16_t seqno;
365
366   union {
367     struct hellomsg6 hello;
368     struct olsr_tcmsg6 tc;
369     struct hnamsg6 hna;
370     struct midmsg6 mid;
371   } message;
372
373 };
374
375 /*
376  * Generic OLSR packet
377  */
378
379 struct olsr {
380   olsr_u16_t olsr_packlen;             /* packet length */
381   olsr_u16_t olsr_seqno;
382   struct olsrmsg olsr_msg[1];          /* variable messages */
383 };
384
385 struct olsr6 {
386   olsr_u16_t olsr_packlen;             /* packet length */
387   olsr_u16_t olsr_seqno;
388   struct olsrmsg6 olsr_msg[1];         /* variable messages */
389 };
390
391 /* IPv4 <-> IPv6 compability */
392
393 union olsr_message {
394   struct olsrmsg v4;
395   struct olsrmsg6 v6;
396 };
397
398 union olsr_packet {
399   struct olsr v4;
400   struct olsr6 v6;
401 };
402
403 #endif /* _PROTOCOLS_OLSR_H */
404
405 /*
406  * Local Variables:
407  * c-basic-offset: 2
408  * indent-tabs-mode: nil
409  * End:
410  */