Merge branch 'PolynomialDivision-feature/add_workflow'
[olsrd.git] / lib / bmf / src / NetworkInterfaces.h
1 /*
2  * The olsr.org Optimized Link-State Routing daemon (olsrd)
3  *
4  * (c) by the OLSR project
5  *
6  * See our Git repository to find out who worked on this file
7  * and thus is a copyright holder on it.
8  *
9  * All rights reserved.
10  *
11  * Redistribution and use in source and binary forms, with or without
12  * modification, are permitted provided that the following conditions
13  * are met:
14  *
15  * * Redistributions of source code must retain the above copyright
16  *   notice, this list of conditions and the following disclaimer.
17  * * Redistributions in binary form must reproduce the above copyright
18  *   notice, this list of conditions and the following disclaimer in
19  *   the documentation and/or other materials provided with the
20  *   distribution.
21  * * Neither the name of olsr.org, olsrd nor the names of its
22  *   contributors may be used to endorse or promote products derived
23  *   from this software without specific prior written permission.
24  *
25  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
26  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
27  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
28  * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
29  * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
30  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
31  * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
32  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
33  * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
34  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
35  * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
36  * POSSIBILITY OF SUCH DAMAGE.
37  *
38  * Visit http://www.olsr.org for more information.
39  *
40  * If you find this software useful feel free to make a donation
41  * to the project. For more information see the website or contact
42  * the copyright holders.
43  *
44  */
45
46 #ifndef _BMF_NETWORKINTERFACES_H
47 #define _BMF_NETWORKINTERFACES_H
48
49 /* -------------------------------------------------------------------------
50  * File       : NetworkInterfaces.h
51  * Description: Functions to open and close sockets
52  * Created    : 29 Jun 2006
53  *
54  * ------------------------------------------------------------------------- */
55
56 /* System includes */
57 #include <netinet/in.h> /* struct in_addr */
58
59 /* OLSR includes */
60 #include "olsr_types.h" /* olsr_ip_addr */
61 #include "olsrd_plugin.h" /* union set_plugin_parameter_addon */
62
63 /* Plugin includes */
64 #include "Packet.h" /* IFHWADDRLEN */
65
66 /* Size of buffer in which packets are received */
67 #define BMF_BUFFER_SIZE 2048
68
69 struct TBmfInterface
70 {
71   /* File descriptor of raw packet socket, used for capturing multicast packets */
72   int capturingSkfd;
73
74   /* File descriptor of UDP (datagram) socket for encapsulated multicast packets. 
75    * Only used for OLSR-enabled interfaces; set to -1 if interface is not OLSR-enabled. */
76   int encapsulatingSkfd;
77
78   /* File descriptor of UDP packet socket, used for listening to encapsulation packets.
79    * Used only when PlParam "BmfMechanism" is set to "UnicastPromiscuous". */
80   int listeningSkfd;
81
82   unsigned char macAddr[IFHWADDRLEN];
83
84   char ifName[IFNAMSIZ];
85
86   /* OLSRs idea of this network interface. NULL if this interface is not
87    * OLSR-enabled. */
88   struct interface_olsr * olsrIntf;
89
90   /* IP address of this network interface */
91   union olsr_ip_addr intAddr;
92
93   /* Broadcast address of this network interface */
94   union olsr_ip_addr broadAddr;
95
96   /* Number of received and transmitted BMF packets on this interface */
97   u_int32_t nBmfPacketsRx;
98   u_int32_t nBmfPacketsRxDup;
99   u_int32_t nBmfPacketsTx;
100
101   /* Next element in list */
102   struct TBmfInterface* next; 
103 };
104
105 extern struct TBmfInterface* BmfInterfaces;
106
107 extern int HighestSkfd;
108 extern fd_set InputSet;
109
110 extern int EtherTunTapFd;
111
112 extern char EtherTunTapIfName[];
113
114 /* 10.255.255.253 in host byte order */
115 #define ETHERTUNTAPDEFAULTIP 0x0AFFFFFD
116
117 extern u_int32_t EtherTunTapIp;
118 extern u_int32_t EtherTunTapIpMask;
119 extern u_int32_t EtherTunTapIpBroadcast;
120
121 extern int CapturePacketsOnOlsrInterfaces;
122
123 enum TBmfMechanism { BM_BROADCAST = 0, BM_UNICAST_PROMISCUOUS };
124 extern enum TBmfMechanism BmfMechanism;
125
126 int SetBmfInterfaceName(const char* ifname, void* data, set_plugin_parameter_addon addon);
127 int SetBmfInterfaceIp(const char* ip, void* data, set_plugin_parameter_addon addon);
128 int SetBmfInterfacePersistent(const char* value, void* data, set_plugin_parameter_addon addon);
129 int SetCapturePacketsOnOlsrInterfaces(const char* enable, void* data, set_plugin_parameter_addon addon);
130 int SetBmfMechanism(const char* mechanism, void* data, set_plugin_parameter_addon addon);
131 int DeactivateSpoofFilter(void);
132 void RestoreSpoofFilter(void);
133
134 #define MAX_UNICAST_NEIGHBORS 10
135 struct TBestNeighbors
136 {
137   struct link_entry* links[MAX_UNICAST_NEIGHBORS];
138 };
139
140 void FindNeighbors(
141   struct TBestNeighbors* neighbors,
142   struct link_entry** bestNeighbor,
143   struct TBmfInterface* intf,
144   union olsr_ip_addr* source,
145   union olsr_ip_addr* forwardedBy,
146   union olsr_ip_addr* forwardedTo,
147   int* nPossibleNeighbors);
148
149 int CreateBmfNetworkInterfaces(struct interface_olsr * skipThisIntf);
150 void CloseBmfNetworkInterfaces(void);
151 int AddNonOlsrBmfIf(const char* ifName, void* data, set_plugin_parameter_addon addon);
152 int IsNonOlsrBmfIf(const char* ifName);
153 void CheckAndUpdateLocalBroadcast(unsigned char* ipPacket, union olsr_ip_addr* broadAddr);
154 void AddMulticastRoute(void);
155 void DeleteMulticastRoute(void);
156
157 #endif /* _BMF_NETWORKINTERFACES_H */