Initial import
[olsrd.git] / lib / dot_draw / src / olsrd_plugin.h
1
2
3 /*
4  * Copyright (c) 2004, Andreas T√łnnesen(andreto-at-olsr.org)
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 notice, 
12  *   this list of conditions and the following disclaimer.
13  * * Redistributions in binary form must reproduce the above copyright notice, 
14  *   this list of conditions and the following disclaimer in the documentation 
15  *   and/or other materials provided with the distribution.
16  * * Neither the name of the UniK olsr daemon nor the names of its contributors 
17  *   may be used to endorse or promote products derived from this software 
18  *   without specific prior written permission.
19  *
20  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND 
21  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 
22  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 
23  * IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, 
24  * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, 
25  * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 
26  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY 
27  * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE 
28  * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED 
29  * OF THE POSSIBILITY OF SUCH DAMAGE.
30  *
31  */
32
33 /*
34  * Dynamic linked library example for UniK OLSRd
35  */
36
37 #ifndef _OLSRD_PLUGIN_DEFS
38 #define _OLSRD_PLUGIN_DEFS
39
40
41 #include <sys/socket.h>
42 #include <netinet/in.h>
43 #include <arpa/inet.h>
44 #include <sys/time.h>
45 #include <time.h>
46 #include <math.h>
47
48 #include "olsr_plugin_io.h"
49
50 /* Use this as PARSER_TYPE to receive ALL messages! */
51 #define PROMISCUOUS 0xffffffff
52
53
54 /*****************************************************************************
55  *                               Plugin data                                 *
56  *                       ALTER THIS TO YOUR OWN NEED                         *
57  *****************************************************************************/
58
59 #define PLUGIN_NAME    "OLSRD dot draw plugin"
60 #define PLUGIN_VERSION "0.1"
61 #define PLUGIN_AUTHOR   "Andreas T√łnnesen"
62 #define MOD_DESC PLUGIN_NAME " " PLUGIN_VERSION " by " PLUGIN_AUTHOR
63 #define PLUGIN_INTERFACE_VERSION 1
64
65 /* The type of message you will use */
66 #define MESSAGE_TYPE 128
67
68 /* The type of messages we will receive - can be set to promiscuous */
69 #define PARSER_TYPE MESSAGE_TYPE
70
71
72
73 /****************************************************************************
74  *           Various datastructures and definitions from olsrd              *
75  ****************************************************************************/
76
77 /*
78  * TYPES SECTION
79  */
80
81 /* types */
82 #include <sys/types.h>
83
84 #ifndef WIN32
85 typedef u_int8_t        olsr_u8_t;
86 typedef u_int16_t       olsr_u16_t;
87 typedef u_int32_t       olsr_u32_t;
88 typedef int8_t          olsr_8_t;
89 typedef int16_t         olsr_16_t;
90 typedef int32_t         olsr_32_t;
91 #else
92 typedef unsigned char olsr_u8_t;
93 typedef unsigned short olsr_u16_t;
94 typedef unsigned int olsr_u32_t;
95 typedef char olsr_8_t;
96 typedef short olsr_16_t;
97 typedef int olsr_32_t;
98 #endif
99
100
101 /*
102  * VARIOUS DEFINITIONS
103  */
104
105 union olsr_ip_addr
106 {
107   olsr_u32_t v4;
108   struct in6_addr v6;
109 };
110
111 union hna_netmask
112 {
113   olsr_u32_t v4;
114   olsr_u16_t v6;
115 };
116
117 #define MAX_TTL               0xff
118
119
120 /*
121  *Link Types
122  */
123
124 #define UNSPEC_LINK           0
125 #define ASYM_LINK             1
126 #define SYM_LINK              2
127 #define LOST_LINK             3
128 #define HIDE_LINK             4
129 #define MAX_LINK              4
130
131
132 /*
133  * Mantissa scaling factor
134  */
135
136 #define VTIME_SCALE_FACTOR    0.0625
137
138
139 /*
140  * Hashing
141  */
142
143 #define HASHSIZE        32
144 #define HASHMASK        (HASHSIZE - 1)
145
146 #define MAXIFS         8 /* Maximum number of interfaces (from defs.h) in uOLSRd */
147
148
149
150 /*
151  * Neighbor structures
152  */
153
154 /* One hop neighbor */
155
156 struct neighbor_2_list_entry 
157 {
158   struct neighbor_2_entry      *neighbor_2;
159   struct timeval               neighbor_2_timer;
160   struct neighbor_2_list_entry *next;
161   struct neighbor_2_list_entry *prev;
162 };
163
164 struct neighbor_entry
165 {
166   union olsr_ip_addr           neighbor_main_addr;
167   olsr_u8_t                    status;
168   olsr_u8_t                    willingness;
169   olsr_u8_t                    is_mpr;
170   olsr_u8_t                    was_mpr; /* Used to detect changes in MPR */
171   int                          neighbor_2_nocov;
172   int                          linkcount;
173   struct neighbor_2_list_entry neighbor_2_list; 
174   struct neighbor_entry        *next;
175   struct neighbor_entry        *prev;
176 };
177
178
179 /* Two hop neighbor */
180
181
182
183 struct neighbor_list_entry 
184 {
185   struct        neighbor_entry *neighbor;
186   struct        neighbor_list_entry *next;
187   struct        neighbor_list_entry *prev;
188 };
189
190
191 struct neighbor_2_entry
192 {
193   union olsr_ip_addr         neighbor_2_addr;
194   olsr_u8_t                  mpr_covered_count;    /*used in mpr calculation*/
195   olsr_u8_t                  processed;            /*used in mpr calculation*/
196   olsr_16_t                  neighbor_2_pointer;   /* Neighbor count */
197   struct neighbor_list_entry neighbor_2_nblist; 
198   struct neighbor_2_entry    *prev;
199   struct neighbor_2_entry    *next;
200 };
201
202 /* Topology entry */
203
204 struct topo_dst
205 {
206   union olsr_ip_addr T_dest_addr;
207   struct timeval T_time;
208   olsr_u16_t T_seq;
209   struct topo_dst *next;
210   struct topo_dst *prev;
211 };
212
213
214 struct tc_entry
215 {
216   union olsr_ip_addr T_last_addr;
217   struct topo_dst destinations;
218   struct tc_entry *next;
219   struct tc_entry *prev;
220 };
221
222 /* HNA */
223
224 /* hna_netmask declared in packet.h */
225
226 struct hna_net
227 {
228   union olsr_ip_addr A_network_addr;
229   union hna_netmask  A_netmask;
230   struct timeval     A_time;
231   struct hna_net     *next;
232   struct hna_net     *prev;
233 };
234
235 struct hna_entry
236 {
237   union olsr_ip_addr A_gateway_addr;
238   struct hna_net     networks;
239   struct hna_entry   *next;
240   struct hna_entry   *prev;
241 };
242
243 /* The lists */
244
245 struct neighbor_entry *neighbortable;
246 struct neighbor_2_entry *two_hop_neighbortable;
247 struct tc_entry *tc_table;
248 struct hna_entry *hna_set;
249
250
251 /* Buffer for olsr_ip_to_string */
252
253 char ipv6_buf[100]; /* buffer for IPv6 inet_htop */
254
255
256 /****************************************************************************
257  *                Function pointers to functions in olsrd                   *
258  *              These allow direct access to olsrd functions                *
259  ****************************************************************************/
260
261 /* The multi-purpose funtion. All other functions are fetched trough this */
262 int (*olsr_plugin_io)(int, void *, size_t);
263
264 /* Register a scheduled event */
265 int (*olsr_register_scheduler_event)(void (*)(), float, float, olsr_u8_t *);
266
267 /* Register a "process changes" function */
268 int (*register_pcf)(int (*)(int, int, int));
269
270 /* Get the next message seqno in line */
271 olsr_u16_t (*get_msg_seqno)();
272
273 /* Check the duplicate table for prior processing */
274 int (*check_dup_proc)(union olsr_ip_addr *, olsr_u16_t);
275
276
277 /* Add a socket to the main olsrd select loop */
278 void (*add_olsr_socket)(int, void(*)(int));
279
280 /* Remove a socket from the main olsrd select loop */
281 int (*remove_olsr_socket)(int, void(*)(int));
282
283 /* get the link status to a neighbor */
284 int (*check_neighbor_link)(union olsr_ip_addr *);
285
286 /* Mantissa/exponen conversions */
287 olsr_u8_t (*double_to_me)(double);
288
289 double (*me_to_double)(olsr_u8_t);
290
291 /* olsrd printf wrapper */
292 int (*olsr_printf)(int, char *, ...);
293
294 /* olsrd malloc wrapper */
295 void *(*olsr_malloc)(size_t, const char *);
296
297 /* Add hna net IPv4 */
298 void (*add_local_hna4_entry)(union olsr_ip_addr *, union hna_netmask *);
299
300 /* Remove hna net IPv4 */
301 int (*remove_local_hna4_entry)(union olsr_ip_addr *, union hna_netmask *);
302
303 /* Add hna net IPv6 */
304 void (*add_local_hna6_entry)(union olsr_ip_addr *, union hna_netmask *);
305
306 /* Remove hna net IPv6 */
307 int (*remove_local_hna6_entry)(union olsr_ip_addr *, union hna_netmask *);
308
309
310 /****************************************************************************
311  *                             Data from olsrd                              *
312  *           NOTE THAT POINTERS POINT TO THE DATA USED BY OLSRD!            *
313  *               NEVER ALTER DATA POINTED TO BY THESE POINTERS              * 
314  *                   UNLESS YOU KNOW WHAT YOU ARE DOING!!!                  *
315  ****************************************************************************/
316
317 /* These two are set automatically by olsrd at load time */
318 int                ipversion;  /* IPversion in use */
319 union olsr_ip_addr *main_addr; /* Main address */
320
321
322 size_t             ipsize;     /* Size of the ipadresses used */
323 struct timeval     *now;       /* the olsrds schedulers idea of current time */
324
325 /* Data that can be altered by your plugin */
326 char               *buffer;    /* The packet buffer - put your packet here */
327 int                *outputsize;/* Pointer to the outputsize - set the size of your packet here */
328
329
330 /****************************************************************************
331  *                Functions that the plugin MUST provide                    *
332  ****************************************************************************/
333
334
335 /* Initialization function */
336 int
337 olsr_plugin_init();
338
339 /* IPC initialization function */
340 int
341 plugin_ipc_init();
342
343 /* Destructor function */
344 void
345 olsr_plugin_exit();
346
347 /* Mulitpurpose funtion */
348 int
349 plugin_io(int, void *, size_t);
350
351 #endif