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