a547f2b5a39e72f9a0abb88d647c92ae66ef43ac
[olsrd.git] / lib / obamp / src / obamp.h
1
2 /*
3  * The olsr.org Optimized Link-State Routing daemon(olsrd)
4  * Copyright (c) 2004-2009, the olsr.org team - see HISTORY file
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 olsr.org, olsrd 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
22  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
23  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
24  * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
25  * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
26  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
27  * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
28  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
29  * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
30  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
31  * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
32  * POSSIBILITY OF SUCH DAMAGE.
33  *
34  * Visit http://www.olsr.org for more information.
35  *
36  * If you find this software useful feel free to make a donation
37  * to the project. For more information see the website or contact
38  * the copyright holders.
39  *
40  */
41
42
43 #ifndef _OBAMP_OBAMP_H
44 #define _OBAMP_OBAMP_H
45
46 #include "list.h"
47
48 #include "plugin.h"             /* union set_plugin_parameter_addon */
49
50 #include "parser.h"
51
52 #define MESSAGE_TYPE            133     //TODO: check if this number is ok
53 #define PARSER_TYPE             MESSAGE_TYPE
54 #define EMISSION_INTERVAL       10      /* seconds */
55 #define EMISSION_JITTER         25      /* percent */
56 #define OBAMP_VALID_TIME        1800    /* seconds */
57
58 /* OBAMP plugin data */
59 #define PLUGIN_NAME             "OLSRD OBAMP plugin"
60 #define PLUGIN_NAME_SHORT       "OLSRD OBAMP"
61 #define PLUGIN_VERSION          "1.0.0 (" __DATE__ " " __TIME__ ")"
62 #define PLUGIN_COPYRIGHT        "  (C) Ninux.org"
63 #define PLUGIN_AUTHOR           "  Saverio Proto (zioproto@gmail.com)"
64 #define MOD_DESC PLUGIN_NAME " " PLUGIN_VERSION "\n" PLUGIN_COPYRIGHT "\n" PLUGIN_AUTHOR
65 #define PLUGIN_INTERFACE_VERSION 5
66
67 #define PLUGIN_DESCR            "OBAMP"
68
69 #define OBAMP_JITTER            25      /* percent */
70 #define OBAMP_ALIVE_EIVAL       3
71 #define OBAMP_MESH_CREATE_IVAL  1       //Seconds
72 #define OBAMP_TREE_CREATE_IVAL  2      //seconds
73 #define TREE_HEARTBEAT          5      //seconds
74 #define OBAMP_OUTER_TREE_CREATE_IVAL    6      //seconds
75 #define _MESH_LOCK_             3      //seconds
76
77 #define _Texpire_               7     //time in seconds before expire a neighbor
78 #define _Texpire_timer_         1       //time in seconds to parse the list decrement and purge
79
80
81 /*OBAMP Protocol MESSAGE IDs */
82
83 #define OBAMP_DATA              0
84 #define OBAMP_HELLO             1
85 #define OBAMP_TREECREATE        2
86 #define OBAMP_ALIVE             3
87 #define OBAMP_TREE_REQ          4
88 #define OBAMP_TREE_ACK          5
89 #define OBAMP_TREE_DESTROY      6
90
91 #define OBAMP_SIGNALLING_PORT   6226
92
93
94
95 extern struct ObampNodeState *myState; //Internal state of the running OBAMP node
96
97 /* Forward declaration of OLSR interface type */
98 struct interface;
99
100 union olsr_ip_addr *MainAddressOf(union olsr_ip_addr *ip);
101
102 void ObampSignalling(int sd, void *x, unsigned int y);
103
104 //Gets packets from sniffing interfaces, checks if are multicast, and pushes them to OBAMP tree links
105 void EncapFlowInObamp(int sd, void *x, unsigned int y);
106
107 //Used to add Sniffing Interfaces read from config file to the list
108 int AddObampSniffingIf(const char *ifName, void *data, set_plugin_parameter_addon addon);
109
110
111 int InitOBAMP(void);
112 int PreInitOBAMP(void);
113 void CloseOBAMP(void);
114
115 void olsr_obamp_gen(void *packet, int len);
116
117 void obamp_hello_gen(void *para);
118 void obamp_alive_gen(void *para);
119 void purge_nodes(void *para);
120 void mesh_create(void *para);
121 void tree_create(void *para);
122 void outer_tree_create(void *para);
123
124 int addObampNode4(struct in_addr *ipv4, u_int8_t status);
125
126
127 /* Parser function to register with the scheduler */
128 void olsr_parser(struct olsr_message *, struct interface *, union olsr_ip_addr *, enum duplicate_status);
129
130 //Struct to describe the other OBAMP nodes in the mesh network
131 struct ObampNode {
132
133   union olsr_ip_addr neighbor_ip_addr; //IP address
134
135   int isMesh;                          //The consider the path from us to this OBAMP node as an overlay mesh link
136   int wasMesh;
137   int outerTreeLink;                   //I'm using this OBAMP node as an anchor
138   int isTree;                          //it identifies if it is a link of tree
139   int MeshLock;                        //Is mesh because requested from neighbor with hello messages
140
141   u_int8_t status;                     //indicates if this OBAMP node has at least a tree link
142
143   int Texpire;                         // TTL to softstate expire
144
145   u_int8_t DataSeqNumber;
146
147   struct list_head list;
148 };
149
150 //Interfaces of the router not talking OLSR, where we capture the multicast traffic
151 struct ObampSniffingIf {
152
153   int skd;                             //Socket descriptor
154   char ifName[16];                     //Interface name
155   struct list_head list;
156
157 };
158
159
160 //Internal State of the OBAMP NoDE
161 struct ObampNodeState {
162
163   union olsr_ip_addr myipaddr;         //IP ADDRESS
164   union olsr_ip_addr CoreAddress;      //CORE IP ADDRESS
165
166   int iamcore;                         //Indicates if I'm the core
167
168   u_int8_t TreeCreateSequenceNumber;
169   u_int8_t tree_req_sn;
170   u_int8_t DataSequenceNumber;
171
172   union olsr_ip_addr ParentId;         //Tree link towards the core
173   union olsr_ip_addr OldParentId;
174
175   /*
176      TTL to check if I'm receiving tree_create messages from core
177      if this expires there is a problem with the spanning tree
178
179    */
180   int TreeHeartBeat;
181   int TreeRequestDelay;
182 };
183
184 // OBAMP message types
185
186
187 struct OBAMP_data_message4 {
188
189   u_int8_t MessageID;
190   u_int32_t router_id;
191   u_int32_t last_hop;
192   u_int16_t SequenceNumber;
193   u_int32_t CoreAddress;
194   u_int16_t datalen;
195   unsigned char data[1471];            //Considering 1492 MTU
196
197 } __attribute__((__packed__));
198
199 struct OBAMP_data_message6 {
200
201 //TODO
202
203 };
204
205
206
207 struct OBAMP_tree_destroy {
208
209   u_int8_t MessageID;
210   union olsr_ip_addr router_id;
211   u_int8_t SequenceNumber; //Unused
212   union olsr_ip_addr CoreAddress;
213
214 };
215
216 struct OBAMP_tree_create {
217
218   u_int8_t MessageID;
219   union olsr_ip_addr router_id;
220   u_int8_t SequenceNumber;
221   union olsr_ip_addr CoreAddress;
222
223 };
224
225 struct OBAMP_tree_link_req {
226
227   u_int8_t MessageID;
228   union olsr_ip_addr router_id;
229   u_int8_t SequenceNumber;
230   union olsr_ip_addr CoreAddress;
231 };
232
233 struct OBAMP_tree_link_ack {
234
235   u_int8_t MessageID;
236   union olsr_ip_addr router_id;
237   u_int8_t SequenceNumber;
238   union olsr_ip_addr CoreAddress;
239 };
240
241
242 struct OBAMP_hello {
243
244   u_int8_t MessageID;
245   union olsr_ip_addr router_id;
246   u_int8_t HelloSequenceNumber;
247   union olsr_ip_addr CoreAddress;
248
249 };
250
251 struct OBAMP_alive {
252
253   u_int8_t MessageID;
254   u_int8_t status;
255   u_int32_t CoreAddress;
256 //REMEMBER:Pad to 4 bytes this is a OLSR message
257
258 };
259
260 #endif /* _OBAMP_OBAMP_H */