gui: linux: align olsr_ip_addr to olsr definition of it
[olsrd.git] / gui / linux-gtk / src / olsr_protocol.h
1
2 /*
3  * OLSR ad-hoc routing table management protocol
4  * Copyright (C) 2003 Andreas Tonnesen (andreto@ifi.uio.no)
5  *
6  * This file is part of the UniK OLSR daemon.
7  *
8  * The UniK OLSR daemon is free software; you can redistribute it and/or modify
9  * it under the terms of the GNU General Public License as published by
10  * the Free Software Foundation; either version 2 of the License, or
11  * (at your option) any later version.
12  *
13  * The UniK OLSR daemon is distributed in the hope that it will be useful,
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16  * GNU General Public License for more details.
17  *
18  * You should have received a copy of the GNU General Public License
19  * along with the UniK OLSR daemon; if not, write to the Free Software
20  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
21  *
22  */
23
24 /*
25  *Values and packet formats as proposed in RFC3626 and misc. values and
26  *data structures used by the UniK olsr daemon.
27  */
28
29 #ifndef _PROTOCOLS_OLSR_H
30 #define _PROTOCOLS_OLSR_H
31
32 /* Port for OLSR to use */
33
34 #define OLSRPORT       698
35
36 /* Default IPv6 multicast address */
37
38 #define OLSR_IPV6_MULTICAST_ADDR "ff05::15"
39
40 /* types */
41 #include <sys/types.h>
42
43 #ifdef WIN32
44 typedef unsigned char olsr_u8_t;
45 typedef unsigned short olsr_u16_t;
46 typedef unsigned int olsr_u32_t;
47 typedef char olsr_8_t;
48 typedef short olsr_16_t;
49 typedef int olsr_32_t;
50 #else
51 typedef u_int8_t olsr_u8_t;
52 typedef u_int16_t olsr_u16_t;
53 typedef u_int32_t olsr_u32_t;
54 typedef int8_t olsr_8_t;
55 typedef int16_t olsr_16_t;
56 typedef int32_t olsr_32_t;
57 #endif
58
59 /* IPv6 address format in6_addr */
60 #include <netinet/in.h>
61
62 union olsr_ip_addr {
63   struct in_addr v4;
64   struct in6_addr v6;
65 };
66
67 /*
68  *Emission Intervals
69  */
70
71 #define HELLO_INTERVAL        2
72 #define HELLO_INTERVAL_NW     HELLO_INTERVAL * 2
73 #define REFRESH_INTERVAL      2
74 #define TC_INTERVAL           5
75 #define MID_INTERVAL          TC_INTERVAL
76 #define HNA_INTERVAL          TC_INTERVAL
77
78 /*
79  *Holding Time
80  */
81
82 #define NEIGHB_HOLD_TIME      3 * REFRESH_INTERVAL
83
84 /*extra: time to delete for non-wireless interfaces */
85 #define NEIGHB_HOLD_TIME_NW   NEIGHB_HOLD_TIME * 2
86 #define TOP_HOLD_TIME         3 * TC_INTERVAL
87 #define DUP_HOLD_TIME         30
88 #define MID_HOLD_TIME         3 * MID_INTERVAL
89 #define HNA_HOLD_TIME         3 * HNA_INTERVAL
90
91 /*
92  * Scaling factor
93  */
94
95 #define VTIME_SCALE_FACTOR    0.0625
96
97 /*
98  *Message Types
99  */
100
101 #define HELLO_MESSAGE         1
102 #define TC_MESSAGE            2
103 #define MID_MESSAGE           3
104 #define HNA_MESSAGE           4
105 #define MAX_MESSAGE           4
106
107 /*
108  *Link Types
109  */
110
111 #define UNSPEC_LINK           0
112 #define ASYM_LINK             1
113 #define SYM_LINK              2
114 #define LOST_LINK             3
115 #define MAX_LINK              3
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  *Neighbor status
128  */
129
130 #define NOT_SYM               0
131 #define SYM                   1
132
133 /*
134  *Link Hysteresis
135  */
136
137 #define HYST_THRESHOLD_HIGH   0.8
138 #define HYST_THRESHOLD_LOW    0.3
139 #define HYST_SCALING          0.5
140
141 /*
142  *Willingness
143  */
144
145 #define WILL_NEVER            0
146 #define WILL_LOW              1
147 #define WILL_DEFAULT          3
148 #define WILL_HIGH             6
149 #define WILL_ALWAYS           7
150
151 /*
152  *Misc. Constants
153  */
154
155 #define TC_REDUNDANCY         0
156 #define MPR_COVERAGE          1
157 #define MAXJITTER             HELLO_INTERVAL / 4
158 #define MAX_TTL               0xff
159
160 /*
161  *Sequence numbering
162  */
163
164 /* Seqnos are 16 bit values */
165
166 #define MAXVALUE 0xFFFF
167
168 /* Macro for checking seqnos "wraparound" */
169 #define SEQNO_GREATER_THAN(s1, s2)                \
170         (((s1 > s2) && (s1 - s2 <= (MAXVALUE/2))) \
171      || ((s2 > s1) && (s2 - s1 > (MAXVALUE/2))))
172
173 /*
174  * Macros for creating and extracting the neighbor
175  * and link type information from 8bit link_code
176  * data as passed in HELLO messages
177  */
178
179 #define CREATE_LINK_CODE(status, link) (link | (status<<2))
180
181 #define EXTRACT_STATUS(link_code) ((link_code & 0xC)>>2)
182
183 #define EXTRACT_LINK(link_code) (link_code & 0x3)
184
185 /***********************************************
186  *           OLSR packet definitions           *
187  ***********************************************/
188
189 /*
190  *The HELLO message
191  */
192
193 /*
194  *Hello info
195  */
196 struct hellinfo {
197   olsr_u8_t link_code;
198   olsr_u8_t reserved;
199   olsr_u16_t size;
200   olsr_u32_t neigh_addr[1];            /* neighbor IP address(es) */
201 };
202
203 struct hellomsg {
204   olsr_u16_t reserved;
205   olsr_u8_t htime;
206   olsr_u8_t willingness;
207   struct hellinfo hell_info[1];
208 };
209
210 /*
211  *IPv6
212  */
213
214 struct hellinfo6 {
215   olsr_u8_t link_code;
216   olsr_u8_t reserved;
217   olsr_u16_t size;
218   struct in6_addr neigh_addr[1];       /* neighbor IP address(es) */
219 };
220
221 struct hellomsg6 {
222   olsr_u16_t reserved;
223   olsr_u8_t htime;
224   olsr_u8_t willingness;
225   struct hellinfo6 hell_info[1];
226 };
227
228 /*
229  * Topology Control packet
230  */
231
232 struct neigh_info {
233   olsr_u32_t addr;
234 };
235
236 struct olsr_tcmsg {
237   olsr_u16_t ansn;
238   olsr_u16_t reserved;
239   struct neigh_info neigh[1];
240 };
241
242 /*
243  *IPv6
244  */
245
246 struct neigh_info6 {
247   struct in6_addr addr;
248 };
249
250 struct olsr_tcmsg6 {
251   olsr_u16_t ansn;
252   olsr_u16_t reserved;
253   struct neigh_info6 neigh[1];
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   olsr_u32_t addr;
267 };
268
269 struct midmsg {
270   struct midaddr mid_addr[1];
271 };
272
273 /*
274  *IPv6
275  */
276 struct midaddr6 {
277   struct in6_addr addr;
278 };
279
280 struct midmsg6 {
281   struct midaddr6 mid_addr[1];
282 };
283
284 /*
285  * Host and Network Association message
286  */
287 struct hnapair {
288   olsr_u32_t addr;
289   olsr_u32_t netmask;
290 };
291
292 struct hnamsg {
293   struct hnapair hna_net[1];
294 };
295
296 /*
297  *IPv6
298  */
299
300 struct hnapair6 {
301   struct in6_addr addr;
302   struct in6_addr netmask;
303 };
304
305 struct hnamsg6 {
306   struct hnapair6 hna_net[1];
307 };
308
309 /*
310  * OLSR message (several can exist in one OLSR packet)
311  */
312
313 struct olsrmsg {
314   olsr_u8_t olsr_msgtype;
315   olsr_u8_t olsr_vtime;
316   olsr_u16_t olsr_msgsize;
317   olsr_u32_t originator;
318   olsr_u8_t ttl;
319   olsr_u8_t hopcnt;
320   olsr_u16_t seqno;
321
322   union {
323     struct hellomsg hello;
324     struct olsr_tcmsg tc;
325     struct hnamsg hna;
326     struct midmsg mid;
327   } message;
328
329 };
330
331 /*
332  *IPv6
333  */
334
335 struct olsrmsg6 {
336   olsr_u8_t olsr_msgtype;
337   olsr_u8_t olsr_vtime;
338   olsr_u16_t olsr_msgsize;
339   struct in6_addr originator;
340   olsr_u8_t ttl;
341   olsr_u8_t hopcnt;
342   olsr_u16_t seqno;
343
344   union {
345     struct hellomsg6 hello;
346     struct olsr_tcmsg6 tc;
347     struct hnamsg6 hna;
348     struct midmsg6 mid;
349   } message;
350
351 };
352
353 /*
354  * Generic OLSR packet
355  */
356
357 struct olsr {
358   olsr_u16_t olsr_packlen;             /* packet length */
359   olsr_u16_t olsr_seqno;
360   struct olsrmsg olsr_msg[1];          /* variable messages */
361 };
362
363 struct olsr6 {
364   olsr_u16_t olsr_packlen;             /* packet length */
365   olsr_u16_t olsr_seqno;
366   struct olsrmsg6 olsr_msg[1];         /* variable messages */
367 };
368
369 /* IPv4 <-> IPv6 compability */
370
371 union olsr_message {
372   struct olsrmsg v4;
373   struct olsrmsg6 v6;
374 };
375
376 union olsr_packet {
377   struct olsr v4;
378   struct olsr6 v6;
379 };
380
381 #endif
382
383 /*
384  * Local Variables:
385  * c-basic-offset: 2
386  * indent-tabs-mode: nil
387  * End:
388  */