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