Add p2dp plugin (generalized mdns), thanks to Teco Boot <teco@inf-net.nl>
[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 "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  * Function   : IsIpv4Fragment
53  * Description: Check if an IP packet is an IP fragment
54  * Input      : ipPacket - the IP packet
55  * Output     : none
56  * Return     : true (1) or false (0)
57  * Data Used  : none
58  * ------------------------------------------------------------------------- */
59 int IsIpv4Fragment(struct ip* hdr)
60 {
61   assert(hdr != NULL);
62
63   if ((ntohs(hdr->ip_off) & IP_OFFMASK) != 0)
64   {
65     return 1;
66   }
67   return 0;
68 } /* IsIpv4Fragment */
69
70 int IsMulticastv4(struct ip* hdr)
71 {
72   uint32_t addr;
73
74   assert(hdr != NULL);
75
76   memcpy(&addr, &hdr->ip_dst.s_addr, sizeof(addr));
77   if ((addr & 0xE0000000) == 0xE0000000)
78     return 1;
79   
80   return 0;
81 }
82
83 int IsBroadcast(struct ip* hdr)
84 {
85   uint32_t addr;
86
87   assert(hdr != NULL);
88
89   memcpy(&addr, &hdr->ip_dst.s_addr, sizeof(addr));
90   if (addr == 0xFFFFFFFF)
91     return 1;
92     
93   return 0;
94 }
95
96 /* -------------------------------------------------------------------------
97  * Function   : IsIpv6Fragment
98  * Description: Check if an IP packet is an IP fragment
99  * Input      : ipPacket - the IP packet
100  * Output     : none
101  * Return     : true (1) or false (0)
102  * Data Used  : none
103  * ------------------------------------------------------------------------- */
104 int IsIpv6Fragment(struct ip6_hdr* hdr)
105 {
106   assert(hdr != NULL);
107   
108 //#error Implementation required
109   if (0)
110     return 1;
111     
112   return 0;
113 }
114
115 int IsMulticastv6(struct ip6_hdr* hdr)
116 {
117   assert(hdr != NULL);
118
119
120   return 0;
121 }
122
123 /* -------------------------------------------------------------------------
124  * Function   : GetIpHeaderLength
125  * Description: Retrieve the IP header length (in bytes) of an IP packet
126  * Input      : ipPacket - the IP packet
127  * Output     : none
128  * Return     : IP header length
129  * Data Used  : none
130  * ------------------------------------------------------------------------- */
131 unsigned int
132 GetIpHeaderLength(unsigned char *ipPacket)
133 {
134   struct iphdr *iph;
135
136   assert(ipPacket != NULL);
137
138   iph = (struct iphdr *)ipPacket;
139   return iph->ihl << 2;
140 }                               /* GetIpHeaderLength */
141
142 /* -------------------------------------------------------------------------
143  * Function   : GetIpPacket
144  * Description: Retrieve the IP packet from BMF encapsulation UDP data
145  * Input      : encapsulationUdpData - the encapsulation UDP data
146  * Output     : none
147  * Return     : The IP packet
148  * Data Used  : none
149  * ------------------------------------------------------------------------- */
150 unsigned char *
151 GetIpPacket(unsigned char *encapsulationUdpData)
152 {
153   return encapsulationUdpData + ENCAP_HDR_LEN;
154 }                               /* GetIpPacket */
155
156
157
158
159 /*
160  * Local Variables:
161  * c-basic-offset: 2
162  * indent-tabs-mode: nil
163  * End:
164  */