Backporting mDNS plugin to stable branch
[olsrd.git] / lib / mdns / 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 "Packet.h"
42
43 /* System includes */
44 #include <stddef.h>             /* NULL */
45 #include <assert.h>             /* assert() */
46 #include <string.h>             /* memcpy() */
47 #include <sys/types.h>          /* u_int8_t, u_int16_t, u_int32_t */
48 #include <netinet/in.h>         /* ntohs(), htons() */
49 #include <netinet/ip.h>         /* struct iphdr */
50
51
52 #include "defs.h"               /* ARM_NOWARN_ALIGN */
53
54 /* -------------------------------------------------------------------------
55  * Function   : IsIpFragment
56  * Description: Check if an IP packet is an IP fragment
57  * Input      : ipPacket - the IP packet
58  * Output     : none
59  * Return     : true (1) or false (0)
60  * Data Used  : none
61  * ------------------------------------------------------------------------- */
62 int
63 IsIpFragment(unsigned char *ipPacket)
64 {
65   struct ip *iph;
66
67   assert(ipPacket != NULL);
68
69   iph = (struct ip *)(ARM_NOWARN_ALIGN)ipPacket;
70   if ((ntohs(iph->ip_off) & IP_OFFMASK) != 0) {
71     return 1;
72   }
73   return 0;
74 }                               /* IsIpFragment */
75
76 /* -------------------------------------------------------------------------
77  * Function   : GetIpTotalLength
78  * Description: Retrieve the total length of the IP packet (in bytes) of
79  *              an IP packet
80  * Input      : ipPacket - the IP packet
81  * Output     : none
82  * Return     : IP packet length
83  * Data Used  : none
84  * ------------------------------------------------------------------------- */
85 u_int16_t
86 GetIpTotalLength(unsigned char *ipPacket)
87 {
88   struct iphdr *iph;
89
90   assert(ipPacket != NULL);
91
92   iph = (struct iphdr *)(ARM_NOWARN_ALIGN)ipPacket;
93   return ntohs(iph->tot_len);
94 }                               /* GetIpTotalLength */
95
96 /* -------------------------------------------------------------------------
97  * Function   : GetIpHeaderLength
98  * Description: Retrieve the IP header length (in bytes) of an IP packet
99  * Input      : ipPacket - the IP packet
100  * Output     : none
101  * Return     : IP header length
102  * Data Used  : none
103  * ------------------------------------------------------------------------- */
104 unsigned int
105 GetIpHeaderLength(unsigned char *ipPacket)
106 {
107   struct iphdr *iph;
108
109   assert(ipPacket != NULL);
110
111   iph = (struct iphdr *)(ARM_NOWARN_ALIGN)ipPacket;
112   return iph->ihl << 2;
113 }                               /* GetIpHeaderLength */
114
115 /* -------------------------------------------------------------------------
116  * Function   : GetTtl
117  * Description: Retrieve the TTL (Time To Live) value from the IP header of
118  *              an IP packet
119  * Input      : ipPacket - the IP packet
120  * Output     : none
121  * Return     : TTL value
122  * Data Used  : none
123  * ------------------------------------------------------------------------- */
124 u_int8_t
125 GetTtl(unsigned char *ipPacket)
126 {
127   struct iphdr *iph;
128
129   assert(ipPacket != NULL);
130
131   iph = (struct iphdr *)(ARM_NOWARN_ALIGN)ipPacket;
132   return iph->ttl;
133 }                               /* GetTtl */
134
135 /* -------------------------------------------------------------------------
136  * Function   : SaveTtlAndChecksum
137  * Description: Save the TTL (Time To Live) value and IP checksum as found in
138  *              the IP header of an IP packet
139  * Input      : ipPacket - the IP packet
140  * Output     : sttl - the TTL and checksum values
141  * Return     : none
142  * Data Used  : none
143  * ------------------------------------------------------------------------- */
144 void
145 SaveTtlAndChecksum(unsigned char *ipPacket, struct TSaveTtl *sttl)
146 {
147   struct iphdr *iph;
148
149   assert(ipPacket != NULL && sttl != NULL);
150
151   iph = (struct iphdr *)(ARM_NOWARN_ALIGN)ipPacket;
152   sttl->ttl = iph->ttl;
153   sttl->check = ntohs(iph->check);
154 }                               /* SaveTtlAndChecksum */
155
156 /* -------------------------------------------------------------------------
157  * Function   : RestoreTtlAndChecksum
158  * Description: Restore the TTL (Time To Live) value and IP checksum in
159  *              the IP header of an IP packet
160  * Input      : ipPacket - the IP packet
161  *              sttl - the TTL and checksum values
162  * Output     : none
163  * Return     : none
164  * Data Used  : none
165  * ------------------------------------------------------------------------- */
166 void
167 RestoreTtlAndChecksum(unsigned char *ipPacket, struct TSaveTtl *sttl)
168 {
169   struct iphdr *iph;
170
171   assert(ipPacket != NULL && sttl != NULL);
172
173   iph = (struct iphdr *)(ARM_NOWARN_ALIGN)ipPacket;
174   iph->ttl = sttl->ttl;
175   iph->check = htons(sttl->check);
176 }                               /* RestoreTtlAndChecksum */
177
178 /* -------------------------------------------------------------------------
179  * Function   : DecreaseTtlAndUpdateHeaderChecksum
180  * Description: For an IP packet, decrement the TTL value and update the IP header
181  *              checksum accordingly.
182  * Input      : ipPacket - the IP packet
183  * Output     : none
184  * Return     : none
185  * Data Used  : none
186  * Notes      : See also RFC1141
187  * ------------------------------------------------------------------------- */
188 void
189 DecreaseTtlAndUpdateHeaderChecksum(unsigned char *ipPacket)
190 {
191   struct iphdr *iph;
192   u_int32_t sum;
193
194   assert(ipPacket != NULL);
195
196   iph = (struct iphdr *)(ARM_NOWARN_ALIGN)ipPacket;
197
198   iph->ttl--;                   /* decrement ttl */
199   sum = ntohs(iph->check) + 0x100;      /* increment checksum high byte */
200   iph->check = htons(sum + (sum >> 16));        /* add carry */
201 }                               /* DecreaseTtlAndUpdateHeaderChecksum */
202
203 /* -------------------------------------------------------------------------
204  * Function   : GetIpHeader
205  * Description: Retrieve the IP header from BMF encapsulation UDP data
206  * Input      : encapsulationUdpData - the encapsulation UDP data
207  * Output     : none
208  * Return     : IP header
209  * Data Used  : none
210  * ------------------------------------------------------------------------- */
211 struct ip *
212 GetIpHeader(unsigned char *encapsulationUdpData)
213 {
214   return (struct ip *)(ARM_NOWARN_ALIGN)(encapsulationUdpData + ENCAP_HDR_LEN);
215 }                               /* GetIpHeader */
216
217 /* -------------------------------------------------------------------------
218  * Function   : GetIpPacket
219  * Description: Retrieve the IP packet from BMF encapsulation UDP data
220  * Input      : encapsulationUdpData - the encapsulation UDP data
221  * Output     : none
222  * Return     : The IP packet
223  * Data Used  : none
224  * ------------------------------------------------------------------------- */
225 unsigned char *
226 GetIpPacket(unsigned char *encapsulationUdpData)
227 {
228   return encapsulationUdpData + ENCAP_HDR_LEN;
229 }                               /* GetIpPacket */
230
231
232
233
234 /*
235  * Local Variables:
236  * c-basic-offset: 2
237  * indent-tabs-mode: nil
238  * End:
239  */