FIX: floatingpoint-text to uint32 conversion
[olsrd.git] / src / lq_packet.h
1
2 /*
3  * The olsr.org Optimized Link-State Routing daemon(olsrd)
4  * Copyright (c) 2004-2009, the olsr.org team - see HISTORY file
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 #ifndef _OLSR_LQ_PACKET_H
43 #define _OLSR_LQ_PACKET_H
44
45 #include "olsr_types.h"
46 #include "olsr_time.h"
47 #include "ipcalc.h"
48
49 #define LQ_HELLO_MESSAGE      201
50 #define LQ_TC_MESSAGE         202
51
52
53 /* deserialized OLSR header */
54
55 struct olsr_common {
56   uint8_t type;
57   uint16_t size;
58   uint32_t vtime;
59   union olsr_ip_addr orig;
60   uint8_t ttl;
61   uint8_t hops;
62   uint16_t seqno;
63 };
64
65 /* serialized IPv4 OLSR header */
66
67 struct olsr_header_v4 {
68   uint8_t type;
69   uint8_t vtime;
70   uint16_t size;
71   uint32_t orig;
72   uint8_t ttl;
73   uint8_t hops;
74   uint16_t seqno;
75 };
76
77 /* serialized IPv6 OLSR header */
78
79 struct olsr_header_v6 {
80   uint8_t type;
81   uint8_t vtime;
82   uint16_t size;
83   unsigned char orig[16];
84   uint8_t ttl;
85   uint8_t hops;
86   uint16_t seqno;
87 };
88
89 /* deserialized LQ_HELLO */
90
91 struct lq_hello_neighbor {
92   uint8_t link_type;
93   uint8_t neigh_type;
94   union olsr_ip_addr addr;
95   struct lq_hello_neighbor *next;
96   olsr_linkcost cost;
97 };
98
99 struct lq_hello_message {
100   struct olsr_common comm;
101   uint32_t htime;
102   uint8_t will;
103   struct lq_hello_neighbor *neigh;
104 };
105
106 /* serialized LQ_HELLO */
107
108 struct lq_hello_info_header {
109   uint8_t link_code;
110   uint8_t reserved;
111   uint16_t size;
112 };
113
114 struct lq_hello_header {
115   uint16_t reserved;
116   uint8_t htime;
117   uint8_t will;
118 };
119
120 /* deserialized LQ_TC */
121 struct lq_tc_message {
122   struct olsr_common comm;
123   union olsr_ip_addr from;
124   uint16_t ansn;
125   struct tc_mpr_addr *neigh;
126 };
127
128 struct tc_mpr_addr {
129   union olsr_ip_addr address;
130   struct tc_mpr_addr *next;
131 };
132
133 /* serialized LQ_TC */
134
135 struct lq_tc_header {
136   uint16_t ansn;
137   uint8_t lower_border;
138   uint8_t upper_border;
139 };
140
141 static INLINE void
142 pkt_get_u8(const uint8_t ** p, uint8_t * var)
143 {
144   *var = *(const uint8_t *)(*p);
145   *p += sizeof(uint8_t);
146 }
147 static INLINE void
148 pkt_get_u16(const uint8_t ** p, uint16_t * var)
149 {
150   *var = ntohs(*(const uint16_t *)(*p));
151   *p += sizeof(uint16_t);
152 }
153 static INLINE void
154 pkt_get_u32(const uint8_t ** p, uint32_t * var)
155 {
156   *var = ntohl(*(const uint32_t *)(p));
157   *p += sizeof(uint32_t);
158 }
159 static INLINE void
160 pkt_get_s8(const uint8_t ** p, int8_t * var)
161 {
162   *var = *(const int8_t *)(*p);
163   *p += sizeof(int8_t);
164 }
165 static INLINE void
166 pkt_get_s16(const uint8_t ** p, int16_t * var)
167 {
168   *var = ntohs(*(const int16_t *)(*p));
169   *p += sizeof(int16_t);
170 }
171 static INLINE void
172 pkt_get_s32(const uint8_t ** p, int32_t * var)
173 {
174   *var = ntohl(*(const int32_t *)(*p));
175   *p += sizeof(int32_t);
176 }
177 static INLINE void
178 pkt_get_reltime(const uint8_t ** p, uint32_t * var)
179 {
180   *var = me_to_reltime(**p);
181   *p += sizeof(uint8_t);
182 }
183 static INLINE void
184 pkt_get_ipaddress(const uint8_t ** p, union olsr_ip_addr *var)
185 {
186   memcpy(var, *p, olsr_cnf->ipsize);
187   *p += olsr_cnf->ipsize;
188 }
189 static INLINE void
190 pkt_get_prefixlen(const uint8_t ** p, uint8_t * var)
191 {
192   *var = netmask_to_prefix(*p, olsr_cnf->ipsize);
193   *p += olsr_cnf->ipsize;
194 }
195
196 static INLINE void
197 pkt_ignore_u8(const uint8_t ** p)
198 {
199   *p += sizeof(uint8_t);
200 }
201 static INLINE void
202 pkt_ignore_u16(const uint8_t ** p)
203 {
204   *p += sizeof(uint16_t);
205 }
206 static INLINE void
207 pkt_ignore_u32(const uint8_t ** p)
208 {
209   *p += sizeof(uint32_t);
210 }
211 static INLINE void
212 pkt_ignore_s8(const uint8_t ** p)
213 {
214   *p += sizeof(int8_t);
215 }
216 static INLINE void
217 pkt_ignore_s16(const uint8_t ** p)
218 {
219   *p += sizeof(int16_t);
220 }
221 static INLINE void
222 pkt_ignore_s32(const uint8_t ** p)
223 {
224   *p += sizeof(int32_t);
225 }
226 static INLINE void
227 pkt_ignore_ipaddress(const uint8_t ** p)
228 {
229   *p += olsr_cnf->ipsize;
230 }
231 static INLINE void
232 pkt_ignore_prefixlen(const uint8_t ** p)
233 {
234   *p += olsr_cnf->ipsize;
235 }
236
237 static INLINE void
238 pkt_put_u8(uint8_t ** p, uint8_t var)
239 {
240   *(uint8_t *) (*p) = var;
241   *p += sizeof(uint8_t);
242 }
243 static INLINE void
244 pkt_put_u16(uint8_t ** p, uint16_t var)
245 {
246   *(uint16_t *) (*p) = htons(var);
247   *p += sizeof(uint16_t);
248 }
249 static INLINE void
250 pkt_put_u32(uint8_t ** p, uint32_t var)
251 {
252   *(uint32_t *) (*p) = htonl(var);
253   *p += sizeof(uint32_t);
254 }
255 static INLINE void
256 pkt_put_s8(uint8_t ** p, int8_t var)
257 {
258   *(int8_t *) (*p) = var;
259   *p += sizeof(int8_t);
260 }
261 static INLINE void
262 pkt_put_s16(uint8_t ** p, int16_t var)
263 {
264   *(int16_t *) (*p) = htons(var);
265   *p += sizeof(int16_t);
266 }
267 static INLINE void
268 pkt_put_s32(uint8_t ** p, int32_t var)
269 {
270   *(int32_t *) (*p) = htonl(var);
271   *p += sizeof(int32_t);
272 }
273 static INLINE void
274 pkt_put_reltime(uint8_t ** p, uint32_t var)
275 {
276   **p = reltime_to_me(var);
277   *p += sizeof(uint8_t);
278 }
279 static INLINE void
280 pkt_put_ipaddress(uint8_t ** p, const union olsr_ip_addr *var)
281 {
282   memcpy(*p, var, olsr_cnf->ipsize);
283   *p += olsr_cnf->ipsize;
284 }
285 static INLINE void
286 pkt_put_prefixlen(uint8_t ** p, uint8_t var)
287 {
288   prefix_to_netmask(*p, olsr_cnf->ipsize, var);
289   *p += olsr_cnf->ipsize;
290 }
291
292 uint16_t EXPORT(get_local_ansn_number)(bool increase);
293
294 void olsr_output_lq_hello(void *para);
295
296 void olsr_output_lq_tc(void *para);
297
298 void destroy_lq_hello(struct lq_hello_message *lq_hello);
299
300 extern bool lq_tc_pending;
301
302 #endif
303
304 /*
305  * Local Variables:
306  * c-basic-offset: 2
307  * indent-tabs-mode: nil
308  * End:
309  */