Update to BMF 1.6.2 (written by Erik Tromp)
[olsrd.git] / lib / bmf / src / Address.c
1 /*
2  * OLSR Basic Multicast Forwarding (BMF) plugin.
3  * Copyright (c) 2005 - 2007, Thales Communications, Huizen, The Netherlands.
4  * Written by Erik Tromp.
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 Thales, BMF 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 "AS IS" AND 
22  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 
23  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 
24  * IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, 
25  * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, 
26  * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 
27  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY 
28  * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE 
29  * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED 
30  * OF THE POSSIBILITY OF SUCH DAMAGE.
31  */
32  
33 /* -------------------------------------------------------------------------
34  * File       : Address.c
35  * Description: IP packet characterization functions
36  * Created    : 29 Jun 2006
37  *
38  * ------------------------------------------------------------------------- */
39  
40 #include "Address.h"
41
42 /* System includes */
43 #include <stddef.h> /* NULL */
44 #include <assert.h> /* assert() */
45 #include <netinet/ip.h> /* struct ip */
46 #include <netinet/udp.h> /* struct udphdr */
47
48 /* OLSRD includes */
49 #include "defs.h" /* ipequal */
50
51 /* Plugin includes */
52 #include "Bmf.h" /* BMF_ENCAP_PORT */
53 #include "NetworkInterfaces.h" /* TBmfInterface */
54
55 /* Whether or not to flood local broadcast packets (e.g. packets with IP
56  * destination 192.168.1.255). May be overruled by setting the plugin
57  * parameter "DoLocalBroadcast" to "no" */
58 int EnableLocalBroadcast = 1;
59
60 /* -------------------------------------------------------------------------
61  * Function   : DoLocalBroadcast
62  * Description: Overrule the default setting, enabling or disabling the
63  *              flooding of local broadcast packets
64  * Input      : enable - either "yes" or "no"
65  *              data - not used
66  *              addon - not used
67  * Output     : none
68  * Return     : success (0) or fail (1)
69  * Data Used  : none
70  * ------------------------------------------------------------------------- */
71 int DoLocalBroadcast(
72   const char* enable,
73   void* data __attribute__((unused)),
74   set_plugin_parameter_addon addon __attribute__((unused)))
75 {
76   if (strcmp(enable, "yes") == 0)
77   {
78     EnableLocalBroadcast = 1;
79     return 0;
80   }
81   else if (strcmp(enable, "no") == 0)
82   {
83     EnableLocalBroadcast = 0;
84     return 0;
85   }
86
87   /* Value not recognized */
88   return 1;
89 }
90
91 /* -------------------------------------------------------------------------
92  * Function   : IsMulticast
93  * Description: Check if an IP address is a multicast address
94  * Input      : ipAddress
95  * Output     : none
96  * Return     : true (1) or false (0)
97  * Data Used  : none
98  * ------------------------------------------------------------------------- */
99 int IsMulticast(union olsr_ip_addr* ipAddress)
100 {
101   assert(ipAddress != NULL);
102
103   return (ntohl(ipAddress->v4.s_addr) & 0xF0000000) == 0xE0000000;
104 }
105
106 /* -------------------------------------------------------------------------
107  * Function   : IsOlsrOrBmfPacket
108  * Description: Check if an IP packet is either an OLSR packet or a BMF packet
109  * Input      : ipPacket
110  * Output     : none
111  * Return     : true (1) or false (0)
112  * Data Used  : none
113  * ------------------------------------------------------------------------- */
114 int IsOlsrOrBmfPacket(unsigned char* ipPacket)
115 {
116   struct ip* ipHeader;
117   unsigned int ipHeaderLen;
118   struct udphdr* udpHeader;
119   u_int16_t destPort;
120
121   assert(ipPacket != NULL);
122
123   /* OLSR packets are UDP - port 698
124    * OLSR-BMF packets are UDP - port 50698
125    * OLSR-Autodetect probe packets are UDP - port 51698 */
126
127   /* Check if UDP */
128   ipHeader = (struct ip*) ipPacket;
129   if (ipHeader->ip_p != SOL_UDP)
130   {
131     /* Not UDP */
132     return 0;
133   }
134
135   /* The total length must be at least large enough to store the UDP header */
136   ipHeaderLen = GetIpHeaderLength(ipPacket);
137   if (GetIpTotalLength(ipPacket) < ipHeaderLen + sizeof(struct udphdr))
138   {
139     /* Not long enough */
140     return 0;
141   }
142
143   /* Go into the UDP header and check port number */
144   udpHeader = (struct udphdr*) (ipPacket + ipHeaderLen);
145   destPort = ntohs(udpHeader->dest);
146
147   if (destPort == olsr_cnf->olsrport || destPort == BMF_ENCAP_PORT || destPort == 51698)
148       /* TODO: #define for 51698 */
149   {
150     return 1;
151   }
152
153   return 0;
154 }