172ecb4a4474f07a20d191cb0a3d0106ec9d6d8b
[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       5
71 #define OBAMP_MESH_CREATE_IVAL  5       //Seconds
72 #define OBAMP_TREE_CREATE_IVAL  10      //seconds
73 #define TREE_HEARTBEAT          25      //seconds
74 #define OBAMP_OUTER_TREE_CREATE_IVAL    30      //seconds
75 #define _MESH_LOCK_             10      //seconds
76
77 #define _Texpire_               15      //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
90 #define OBAMP_SIGNALLING_PORT   6226
91
92
93
94 extern struct ObampNodeState *myState; //Internal state of the running OBAMP node
95
96 /* Forward declaration of OLSR interface type */
97 struct interface;
98
99 union olsr_ip_addr *MainAddressOf(union olsr_ip_addr *ip);
100
101 void ObampSignalling(int sd, void *x, unsigned int y);
102
103 //Gets packets from sniffing interfaces, checks if are multicast, and pushes them to OBAMP tree links
104 void EncapFlowInObamp(int sd, void *x, unsigned int y);
105
106 //Used to add Sniffing Interfaces read from config file to the list
107 int AddObampSniffingIf(const char *ifName, void *data, set_plugin_parameter_addon addon);
108
109
110 int InitOBAMP(void);
111 int PreInitOBAMP(void);
112 void CloseOBAMP(void);
113
114 void olsr_obamp_gen(unsigned char *packet, int len);
115
116 void obamp_hello_gen(void *para);
117 void obamp_alive_gen(void *para);
118 void purge_nodes(void *para);
119 void mesh_create(void *para);
120 void tree_create(void *para);
121 void outer_tree_create(void *para);
122
123 int addObampNode4(struct in_addr *ipv4, u_int8_t status);
124
125
126 /* Parser function to register with the scheduler */
127 void olsr_parser(union olsr_message *, struct interface *, union olsr_ip_addr *, enum duplicate_status);
128
129 //Struct to describe the other OBAMP nodes in the mesh network
130 struct ObampNode {
131
132   union olsr_ip_addr neighbor_ip_addr; //IP address
133
134   int isMesh;                          //The consider the path from us to this OBAMP node as an overlay mesh link
135   int wasMesh;
136   int outerTreeLink;                   //I'm using this OBAMP node as an anchor
137   int isTree;                          //it identifies if it is a link of tree
138   int MeshLock;                        //Is mesh because requested from neighbor with hello messages
139
140   u_int8_t status;                     //indicates if this OBAMP node has at least a tree link
141
142   int Texpire;                         // TTL to softstate expire
143
144   u_int8_t DataSeqNumber;
145
146   struct list_head list;
147 };
148
149 //Interfaces of the router not talking OLSR, where we capture the multicast traffic
150 struct ObampSniffingIf {
151
152   int skd;                             //Socket descriptor
153   char ifName[16];                     //Interface name
154   struct list_head list;
155
156 };
157
158
159 //Internal State of the OBAMP NoDE
160 struct ObampNodeState {
161
162   union olsr_ip_addr myipaddr;         //IP ADDRESS
163   union olsr_ip_addr CoreAddress;      //CORE IP ADDRESS
164
165   int iamcore;                         //Indicates if I'm the core
166
167   u_int8_t TreeCreateSequenceNumber;
168   u_int8_t tree_req_sn;
169   u_int8_t DataSequenceNumber;
170
171   union olsr_ip_addr ParentId;         //Tree link towards the core
172   union olsr_ip_addr OldParentId;
173
174   /*
175      TTL to check if I'm receiving tree_create messages from core
176      if this expires there is a problem with the spanning tree
177
178    */
179   int TreeHeartBeat;
180 };
181
182 // OBAMP message types
183
184
185 struct OBAMP_data_message4 {
186
187   u_int8_t MessageID;
188   u_int32_t router_id;
189   u_int32_t last_hop;
190   u_int16_t SequenceNumber;
191   u_int32_t CoreAddress;
192   u_int16_t datalen;
193   unsigned char data[1471];            //Considering 1492 MTU
194
195 } __attribute__((__packed__));
196
197 struct OBAMP_data_message6 {
198
199 //TODO
200
201 };
202
203 struct OBAMP_tree_create {
204
205   u_int8_t MessageID;
206   union olsr_ip_addr router_id;
207   u_int8_t SequenceNumber;
208   union olsr_ip_addr CoreAddress;
209
210 };
211
212 struct OBAMP_tree_link_req {
213
214   u_int8_t MessageID;
215   union olsr_ip_addr router_id;
216   u_int8_t SequenceNumber;
217   union olsr_ip_addr CoreAddress;
218 };
219
220 struct OBAMP_tree_link_ack {
221
222   u_int8_t MessageID;
223   union olsr_ip_addr router_id;
224   u_int8_t SequenceNumber;
225   union olsr_ip_addr CoreAddress;
226 };
227
228
229 struct OBAMP_hello {
230
231   u_int8_t MessageID;
232   union olsr_ip_addr router_id;
233   u_int8_t HelloSequenceNumber;
234   union olsr_ip_addr CoreAddress;
235
236 };
237
238 struct OBAMP_alive {
239
240   u_int8_t MessageID;
241   u_int8_t status;
242   u_int32_t CoreAddress;
243 //REMEMBER:Pad to 4 bytes this is a OLSR message
244
245 };
246
247 #endif /* _OBAMP_OBAMP_H */