Applied: indent -sob -nhnl -nut $(find -name "*.[ch]")
[olsrd.git] / src / lq_packet.h
1 /*
2  * The olsr.org Optimized Link-State Routing daemon(olsrd)
3  * Copyright (c) 2004, Thomas Lopatic (thomas@lopatic.de)
4  * All rights reserved.
5  *
6  * Redistribution and use in source and binary forms, with or without
7  * modification, are permitted provided that the following conditions
8  * are met:
9  *
10  * * Redistributions of source code must retain the above copyright
11  *   notice, this list of conditions and the following disclaimer.
12  * * Redistributions in binary form must reproduce the above copyright
13  *   notice, this list of conditions and the following disclaimer in
14  *   the documentation and/or other materials provided with the
15  *   distribution.
16  * * Neither the name of olsr.org, olsrd nor the names of its
17  *   contributors may be used to endorse or promote products derived
18  *   from this software without specific prior written permission.
19  *
20  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
21  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
22  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
23  * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
24  * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
25  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
26  * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
27  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
28  * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
29  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
30  * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
31  * POSSIBILITY OF SUCH DAMAGE.
32  *
33  * Visit http://www.olsr.org for more information.
34  *
35  * If you find this software useful feel free to make a donation
36  * to the project. For more information see the website or contact
37  * the copyright holders.
38  *
39  */
40
41 #ifndef _OLSR_LQ_PACKET_H
42 #define _OLSR_LQ_PACKET_H
43
44 #include "olsr_types.h"
45 #include "packet.h"
46 #include "mantissa.h"
47 #include "ipcalc.h"
48
49 #define LQ_HELLO_MESSAGE      201
50 #define LQ_TC_MESSAGE         202
51
52 /* deserialized OLSR header */
53
54 struct olsr_common
55 {
56   olsr_u8_t type;
57   olsr_reltime vtime;
58   olsr_u16_t size;
59   union olsr_ip_addr orig;
60   olsr_u8_t ttl;
61   olsr_u8_t hops;
62   olsr_u16_t seqno;
63 };
64
65 /* serialized IPv4 OLSR header */
66
67 struct olsr_header_v4
68 {
69   olsr_u8_t type;
70   olsr_u8_t vtime;
71   olsr_u16_t size;
72   olsr_u32_t orig;
73   olsr_u8_t ttl;
74   olsr_u8_t hops;
75   olsr_u16_t seqno;
76 };
77
78 /* serialized IPv6 OLSR header */
79
80 struct olsr_header_v6
81 {
82   olsr_u8_t type;
83   olsr_u8_t vtime;
84   olsr_u16_t size;
85   unsigned char orig[16];
86   olsr_u8_t ttl;
87   olsr_u8_t hops;
88   olsr_u16_t seqno;
89 };
90
91 /* deserialized LQ_HELLO */
92
93 struct lq_hello_neighbor
94 {
95   olsr_u8_t link_type;
96   olsr_u8_t neigh_type;
97   union olsr_ip_addr addr;
98   struct lq_hello_neighbor *next;
99   olsr_u32_t linkquality[0];
100 };
101
102 struct lq_hello_message
103 {
104   struct olsr_common comm;
105   olsr_reltime htime;
106   olsr_u8_t will;
107   struct lq_hello_neighbor *neigh;
108 };
109
110 /* serialized LQ_HELLO */
111
112 struct lq_hello_info_header
113 {
114   olsr_u8_t link_code;
115   olsr_u8_t reserved;
116   olsr_u16_t size;
117 };
118
119 struct lq_hello_header
120 {
121   olsr_u16_t reserved;
122   olsr_u8_t htime;
123   olsr_u8_t will;
124 };
125
126 /* deserialized LQ_TC */
127 struct lq_tc_message
128 {
129   struct olsr_common comm;
130   union olsr_ip_addr from;
131   olsr_u16_t ansn;
132   struct tc_mpr_addr *neigh;
133 };
134
135 /* serialized LQ_TC */
136
137 struct lq_tc_header
138 {
139   olsr_u16_t ansn;
140   olsr_u8_t lower_border;
141   olsr_u8_t upper_border;
142 };
143
144 static INLINE void
145 pkt_get_u8 (const olsr_u8_t ** p, olsr_u8_t * var)
146 {
147   *var = *(const olsr_u8_t *) (*p);
148   *p += sizeof (olsr_u8_t);
149 }
150 static INLINE void
151 pkt_get_u16 (const olsr_u8_t ** p, olsr_u16_t * var)
152 {
153   *var = ntohs (*(const olsr_u16_t *) (*p));
154   *p += sizeof (olsr_u16_t);
155 }
156 static INLINE void
157 pkt_get_u32 (const olsr_u8_t ** p, olsr_u32_t * var)
158 {
159   *var = ntohl (*(const olsr_u32_t *) (p));
160   *p += sizeof (olsr_u32_t);
161 }
162 static INLINE void
163 pkt_get_s8 (const olsr_u8_t ** p, olsr_8_t * var)
164 {
165   *var = *(const olsr_8_t *) (*p);
166   *p += sizeof (olsr_8_t);
167 }
168 static INLINE void
169 pkt_get_s16 (const olsr_u8_t ** p, olsr_16_t * var)
170 {
171   *var = ntohs (*(const olsr_16_t *) (*p));
172   *p += sizeof (olsr_16_t);
173 }
174 static INLINE void
175 pkt_get_s32 (const olsr_u8_t ** p, olsr_32_t * var)
176 {
177   *var = ntohl (*(const olsr_32_t *) (*p));
178   *p += sizeof (olsr_32_t);
179 }
180 static INLINE void
181 pkt_get_reltime (const olsr_u8_t ** p, olsr_reltime * var)
182 {
183   *var = me_to_reltime (**p);
184   *p += sizeof (olsr_u8_t);
185 }
186 static INLINE void
187 pkt_get_ipaddress (const olsr_u8_t ** p, union olsr_ip_addr *var)
188 {
189   memcpy (var, *p, olsr_cnf->ipsize);
190   *p += olsr_cnf->ipsize;
191 }
192 static INLINE void
193 pkt_get_prefixlen (const olsr_u8_t ** p, olsr_u8_t * var)
194 {
195   *var = netmask_to_prefix (*p, olsr_cnf->ipsize);
196   *p += olsr_cnf->ipsize;
197 }
198
199 static INLINE void
200 pkt_ignore_u8 (const olsr_u8_t ** p)
201 {
202   *p += sizeof (olsr_u8_t);
203 }
204 static INLINE void
205 pkt_ignore_u16 (const olsr_u8_t ** p)
206 {
207   *p += sizeof (olsr_u16_t);
208 }
209 static INLINE void
210 pkt_ignore_u32 (const olsr_u8_t ** p)
211 {
212   *p += sizeof (olsr_u32_t);
213 }
214 static INLINE void
215 pkt_ignore_s8 (const olsr_u8_t ** p)
216 {
217   *p += sizeof (olsr_8_t);
218 }
219 static INLINE void
220 pkt_ignore_s16 (const olsr_u8_t ** p)
221 {
222   *p += sizeof (olsr_16_t);
223 }
224 static INLINE void
225 pkt_ignore_s32 (const olsr_u8_t ** p)
226 {
227   *p += sizeof (olsr_32_t);
228 }
229 static INLINE void
230 pkt_ignore_ipaddress (const olsr_u8_t ** p)
231 {
232   *p += olsr_cnf->ipsize;
233 }
234 static INLINE void
235 pkt_ignore_prefixlen (const olsr_u8_t ** p)
236 {
237   *p += olsr_cnf->ipsize;
238 }
239
240 static INLINE void
241 pkt_put_u8 (olsr_u8_t ** p, olsr_u8_t var)
242 {
243   *(olsr_u8_t *) (*p) = var;
244   *p += sizeof (olsr_u8_t);
245 }
246 static INLINE void
247 pkt_put_u16 (olsr_u8_t ** p, olsr_u16_t var)
248 {
249   *(olsr_u16_t *) (*p) = htons (var);
250   *p += sizeof (olsr_u16_t);
251 }
252 static INLINE void
253 pkt_put_u32 (olsr_u8_t ** p, olsr_u32_t var)
254 {
255   *(olsr_u32_t *) (*p) = htonl (var);
256   *p += sizeof (olsr_u32_t);
257 }
258 static INLINE void
259 pkt_put_s8 (olsr_u8_t ** p, olsr_8_t var)
260 {
261   *(olsr_8_t *) (*p) = var;
262   *p += sizeof (olsr_8_t);
263 }
264 static INLINE void
265 pkt_put_s16 (olsr_u8_t ** p, olsr_16_t var)
266 {
267   *(olsr_16_t *) (*p) = htons (var);
268   *p += sizeof (olsr_16_t);
269 }
270 static INLINE void
271 pkt_put_s32 (olsr_u8_t ** p, olsr_32_t var)
272 {
273   *(olsr_32_t *) (*p) = htonl (var);
274   *p += sizeof (olsr_32_t);
275 }
276 static INLINE void
277 pkt_put_reltime (olsr_u8_t ** p, olsr_reltime var)
278 {
279   **p = reltime_to_me (var);
280   *p += sizeof (olsr_u8_t);
281 }
282 static INLINE void
283 pkt_put_ipaddress (olsr_u8_t ** p, const union olsr_ip_addr *var)
284 {
285   memcpy (*p, var, olsr_cnf->ipsize);
286   *p += olsr_cnf->ipsize;
287 }
288 static INLINE void
289 pkt_put_prefixlen (olsr_u8_t ** p, olsr_u8_t var)
290 {
291   prefix_to_netmask (*p, olsr_cnf->ipsize, var);
292   *p += olsr_cnf->ipsize;
293 }
294
295 void olsr_output_lq_hello (void *para);
296
297 void olsr_output_lq_tc (void *para);
298
299 void olsr_input_lq_hello (union olsr_message *ser, struct interface *inif,
300                           union olsr_ip_addr *from);
301
302 extern olsr_bool lq_tc_pending;
303
304 #endif