Rename olsr_time.[ch] to olsr_clock.[ch]
[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_clock.h"
47 #include "ipcalc.h"
48 #include "olsr_protocol.h"
49
50 #define LQ_HELLO_MESSAGE      201
51 #define LQ_TC_MESSAGE         202
52
53
54 /* deserialized LQ_HELLO */
55
56 struct lq_hello_neighbor {
57   uint8_t link_type;
58   uint8_t neigh_type;
59   union olsr_ip_addr addr;
60   struct lq_hello_neighbor *next;
61   olsr_linkcost cost;
62 };
63
64 struct lq_hello_message {
65   struct olsr_message *comm;
66   uint32_t htime;
67   uint8_t will;
68   struct lq_hello_neighbor *neigh;
69 };
70
71 static INLINE void
72 pkt_get_u8(const uint8_t ** p, uint8_t * var)
73 {
74   *var = *(const uint8_t *)(*p);
75   *p += sizeof(uint8_t);
76 }
77 static INLINE void
78 pkt_get_u16(const uint8_t ** p, uint16_t * var)
79 {
80   *var = ntohs(**((const uint16_t **)p));
81   *p += sizeof(uint16_t);
82 }
83 static INLINE void
84 pkt_get_u32(const uint8_t ** p, uint32_t * var)
85 {
86   *var = ntohl(**((const uint32_t **)p));
87   *p += sizeof(uint32_t);
88 }
89 static INLINE void
90 pkt_get_s8(const uint8_t ** p, int8_t * var)
91 {
92   *var = *(const int8_t *)(*p);
93   *p += sizeof(int8_t);
94 }
95 static INLINE void
96 pkt_get_s16(const uint8_t ** p, int16_t * var)
97 {
98   *var = ntohs(**((const int16_t **)p));
99   *p += sizeof(int16_t);
100 }
101 static INLINE void
102 pkt_get_s32(const uint8_t ** p, int32_t * var)
103 {
104   *var = ntohl(**((const int32_t **)p));
105   *p += sizeof(int32_t);
106 }
107 static INLINE void
108 pkt_get_reltime(const uint8_t ** p, uint32_t * var)
109 {
110   *var = me_to_reltime(**p);
111   *p += sizeof(uint8_t);
112 }
113 static INLINE void
114 pkt_get_ipaddress(const uint8_t ** p, union olsr_ip_addr *var)
115 {
116   memcpy(var, *p, olsr_cnf->ipsize);
117   *p += olsr_cnf->ipsize;
118 }
119 static INLINE void
120 pkt_get_prefixlen(const uint8_t ** p, uint8_t * var)
121 {
122   *var = netmask_to_prefix(*p, olsr_cnf->ipsize);
123   *p += olsr_cnf->ipsize;
124 }
125
126 static INLINE void
127 pkt_ignore_u8(const uint8_t ** p)
128 {
129   *p += sizeof(uint8_t);
130 }
131 static INLINE void
132 pkt_ignore_u16(const uint8_t ** p)
133 {
134   *p += sizeof(uint16_t);
135 }
136 static INLINE void
137 pkt_ignore_u32(const uint8_t ** p)
138 {
139   *p += sizeof(uint32_t);
140 }
141 static INLINE void
142 pkt_ignore_s8(const uint8_t ** p)
143 {
144   *p += sizeof(int8_t);
145 }
146 static INLINE void
147 pkt_ignore_s16(const uint8_t ** p)
148 {
149   *p += sizeof(int16_t);
150 }
151 static INLINE void
152 pkt_ignore_s32(const uint8_t ** p)
153 {
154   *p += sizeof(int32_t);
155 }
156 static INLINE void
157 pkt_ignore_ipaddress(const uint8_t ** p)
158 {
159   *p += olsr_cnf->ipsize;
160 }
161 static INLINE void
162 pkt_ignore_prefixlen(const uint8_t ** p)
163 {
164   *p += olsr_cnf->ipsize;
165 }
166
167 static INLINE void
168 pkt_put_u8(uint8_t ** p, uint8_t var)
169 {
170   **((uint8_t **)p) = var;
171   *p += sizeof(uint8_t);
172 }
173 static INLINE void
174 pkt_put_u16(uint8_t ** p, uint16_t var)
175 {
176   **((uint16_t **)p) = htons(var);
177   *p += sizeof(uint16_t);
178 }
179 static INLINE void
180 pkt_put_u32(uint8_t ** p, uint32_t var)
181 {
182   **((uint32_t **)p) = htonl(var);
183   *p += sizeof(uint32_t);
184 }
185 static INLINE void
186 pkt_put_s8(uint8_t ** p, int8_t var)
187 {
188   **((int8_t **)p) = var;
189   *p += sizeof(int8_t);
190 }
191 static INLINE void
192 pkt_put_s16(uint8_t ** p, int16_t var)
193 {
194   **((int16_t **)p) = htons(var);
195   *p += sizeof(int16_t);
196 }
197 static INLINE void
198 pkt_put_s32(uint8_t ** p, int32_t var)
199 {
200   **((int32_t **)p) = htonl(var);
201   *p += sizeof(int32_t);
202 }
203 static INLINE void
204 pkt_put_reltime(uint8_t ** p, uint32_t var)
205 {
206   **p = reltime_to_me(var);
207   *p += sizeof(uint8_t);
208 }
209 static INLINE void
210 pkt_put_ipaddress(uint8_t ** p, const union olsr_ip_addr *var)
211 {
212   memcpy(*p, var, olsr_cnf->ipsize);
213   *p += olsr_cnf->ipsize;
214 }
215 static INLINE void
216 pkt_put_prefixlen(uint8_t ** p, uint8_t var)
217 {
218   prefix_to_netmask(*p, olsr_cnf->ipsize, var);
219   *p += olsr_cnf->ipsize;
220 }
221
222 void destroy_lq_hello(struct lq_hello_message *lq_hello);
223
224 #endif
225
226 /*
227  * Local Variables:
228  * c-basic-offset: 2
229  * indent-tabs-mode: nil
230  * End:
231  */