p2pd: fix IsMulticastv4
[olsrd.git] / lib / p2pd / src / Packet.c
1 /*
2  * The olsr.org Optimized Link-State Routing daemon(olsrd)
3  * Copyright (c) 2004-2009, the olsr.org team - see HISTORY file
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 #include "olsr.h"
42 #include "Packet.h"
43
44 /* System includes */
45 #include <stddef.h>             /* NULL */
46 #include <assert.h>             /* assert() */
47 #include <string.h>             /* memcpy() */
48 #include <sys/types.h>          /* u_int8_t, u_int16_t, u_int32_t */
49 #include <netinet/in.h>         /* ntohs(), htons() */
50 #include <netinet/ip.h>         /* struct iphdr */
51
52 /* -------------------------------------------------------------------------
53  * Function   : IsIpFragment
54  * Description: Check if an IP packet is an IP fragment
55  * Input      : ipPacket - the IP packet
56  * Output     : none
57  * Return     : true (1) or false (0)
58  * Data Used  : none
59  * ------------------------------------------------------------------------- */
60 int IsIpFragment(unsigned char* ipPacket)
61 {
62   struct ip* iph;
63
64   assert(ipPacket != NULL);
65
66   iph = (struct ip*) ARM_NOWARN_ALIGN(ipPacket);
67   if ((ntohs(iph->ip_off) & IP_OFFMASK) != 0)
68   {
69     return 1;
70   }
71   return 0;
72 } /* IsIpFragment */
73
74 /* -------------------------------------------------------------------------
75  * Function   : GetIpTotalLength
76  * Description: Retrieve the total length of the IP packet (in bytes) of
77  *              an IP packet
78  * Input      : ipPacket - the IP packet
79  * Output     : none
80  * Return     : IP packet length
81  * Data Used  : none
82  * ------------------------------------------------------------------------- */
83 u_int16_t GetIpTotalLength(unsigned char* ipPacket)
84 {
85   struct iphdr* iph;
86
87   assert(ipPacket != NULL);
88
89   iph = (struct iphdr*) ARM_NOWARN_ALIGN(ipPacket);
90   return ntohs(iph->tot_len);
91 } /* GetIpTotalLength */
92
93 /* -------------------------------------------------------------------------
94  * Function   : IsIpv4Fragment
95  * Description: Check if an IP packet is an IP fragment
96  * Input      : ipPacket - the IP packet
97  * Output     : none
98  * Return     : true (1) or false (0)
99  * Data Used  : none
100  * ------------------------------------------------------------------------- */
101 int IsIpv4Fragment(struct ip* hdr)
102 {
103   assert(hdr != NULL);
104
105   if ((ntohs(hdr->ip_off) & IP_OFFMASK) != 0)
106   {
107     return 1;
108   }
109   return 0;
110 } /* IsIpv4Fragment */
111
112 int IsMulticastv4(struct ip* hdr)
113 {
114   assert(hdr != NULL);
115
116   if (IN_MULTICAST(ntohl(hdr->ip_dst.s_addr)))
117           return 1;
118   
119   return 0;
120 }
121
122 int IsBroadcast(struct ip* hdr)
123 {
124   uint32_t addr;
125
126   assert(hdr != NULL);
127
128   memcpy(&addr, &hdr->ip_dst.s_addr, sizeof(addr));
129   if (addr == 0xFFFFFFFF)
130     return 1;
131     
132   return 0;
133 }
134
135 /* -------------------------------------------------------------------------
136  * Function   : IsIpv6Fragment
137  * Description: Check if an IP packet is an IP fragment
138  * Input      : ipPacket - the IP packet
139  * Output     : none
140  * Return     : true (1) or false (0)
141  * Data Used  : none
142  * ------------------------------------------------------------------------- */
143 int IsIpv6Fragment(struct ip6_hdr* hdr __attribute__ ((unused)))
144 {
145   assert(hdr != NULL);
146   
147 //#error Implementation required
148   if (0)
149     return 1;
150     
151   return 0;
152 }
153
154 int IsMulticastv6(struct ip6_hdr* hdr __attribute__ ((unused)))
155 {
156   assert(hdr != NULL);
157
158
159   return 0;
160 }
161
162 /* -------------------------------------------------------------------------
163  * Function   : GetIpHeaderLength
164  * Description: Retrieve the IP header length (in bytes) of an IP packet
165  * Input      : ipPacket - the IP packet
166  * Output     : none
167  * Return     : IP header length
168  * Data Used  : none
169  * ------------------------------------------------------------------------- */
170 unsigned int
171 GetIpHeaderLength(unsigned char *ipPacket)
172 {
173   struct iphdr *iph;
174
175   assert(ipPacket != NULL);
176
177   iph = (struct iphdr *) ARM_NOWARN_ALIGN(ipPacket);
178   return iph->ihl << 2;
179 }                               /* GetIpHeaderLength */
180
181 /* -------------------------------------------------------------------------
182  * Function   : GetIpPacket
183  * Description: Retrieve the IP packet from BMF encapsulation UDP data
184  * Input      : encapsulationUdpData - the encapsulation UDP data
185  * Output     : none
186  * Return     : The IP packet
187  * Data Used  : none
188  * ------------------------------------------------------------------------- */
189 unsigned char *
190 GetIpPacket(unsigned char *encapsulationUdpData)
191 {
192   return encapsulationUdpData + ENCAP_HDR_LEN;
193 }                               /* GetIpPacket */
194
195 /* -------------------------------------------------------------------------
196  * Function   : GetTtl
197  * Description: Retrieve the TTL (Time To Live) value from the IP header of
198  *              an IP packet
199  * Input      : ipPacket - the IP packet
200  * Output     : none
201  * Return     : TTL value
202  * Data Used  : none
203  * ------------------------------------------------------------------------- */
204 u_int8_t GetTtl(unsigned char* ipPacket)
205 {
206   struct iphdr* iph;
207
208   assert(ipPacket != NULL);
209
210   iph = (struct iphdr*) ARM_NOWARN_ALIGN(ipPacket);
211   return iph->ttl;
212 } /* GetTtl */
213
214 /* -------------------------------------------------------------------------
215  * Function   : SaveTtlAndChecksum
216  * Description: Save the TTL (Time To Live) value and IP checksum as found in
217  *              the IP header of an IP packet
218  * Input      : ipPacket - the IP packet
219  * Output     : sttl - the TTL and checksum values
220  * Return     : none
221  * Data Used  : none
222  * ------------------------------------------------------------------------- */
223 void SaveTtlAndChecksum(unsigned char* ipPacket, struct TSaveTtl* sttl)
224 {
225   struct iphdr* iph;
226
227   assert(ipPacket != NULL && sttl != NULL);
228
229   iph = (struct iphdr*) ARM_NOWARN_ALIGN(ipPacket);
230   sttl->ttl = iph->ttl;
231   sttl->check = ntohs(iph->check);
232 } /* SaveTtlAndChecksum */
233
234 /* -------------------------------------------------------------------------
235  * Function   : RestoreTtlAndChecksum
236  * Description: Restore the TTL (Time To Live) value and IP checksum in
237  *              the IP header of an IP packet
238  * Input      : ipPacket - the IP packet
239  *              sttl - the TTL and checksum values
240  * Output     : none
241  * Return     : none
242  * Data Used  : none
243  * ------------------------------------------------------------------------- */
244 void RestoreTtlAndChecksum(unsigned char* ipPacket, struct TSaveTtl* sttl)
245 {
246   struct iphdr* iph;
247
248   assert(ipPacket != NULL && sttl != NULL);
249
250   iph = (struct iphdr*) ARM_NOWARN_ALIGN(ipPacket);
251   iph->ttl = sttl->ttl;
252   iph->check = htons(sttl->check);
253 } /* RestoreTtlAndChecksum */
254
255 /* -------------------------------------------------------------------------
256  * Function   : DecreaseTtlAndUpdateHeaderChecksum
257  * Description: For an IP packet, decrement the TTL value and update the IP header
258  *              checksum accordingly.
259  * Input      : ipPacket - the IP packet
260  * Output     : none
261  * Return     : none
262  * Data Used  : none
263  * Notes      : See also RFC1141
264  * ------------------------------------------------------------------------- */
265 void DecreaseTtlAndUpdateHeaderChecksum(unsigned char* ipPacket)
266 {
267   struct iphdr* iph;
268   u_int32_t sum;
269
270   assert(ipPacket != NULL);
271
272   iph = (struct iphdr*) ARM_NOWARN_ALIGN(ipPacket);
273
274   iph->ttl--; /* decrement ttl */
275   sum = ntohs(iph->check) + 0x100; /* increment checksum high byte */
276   iph->check = htons(sum + (sum>>16)); /* add carry */
277 } /* DecreaseTtlAndUpdateHeaderChecksum */
278
279
280
281
282 /*
283  * Local Variables:
284  * c-basic-offset: 2
285  * indent-tabs-mode: nil
286  * End:
287  */