Plugin interface updates, topology is generated upon every connection
[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
51 /*****************************************************************************
52  *                               Plugin data                                 *
53  *                       ALTER THIS TO YOUR OWN NEED                         *
54  *****************************************************************************/
55
56 #define PLUGIN_NAME    "OLSRD dot draw plugin"
57 #define PLUGIN_VERSION "0.2"
58 #define PLUGIN_AUTHOR   "Andreas T√łnnesen"
59 #define MOD_DESC PLUGIN_NAME " " PLUGIN_VERSION " by " PLUGIN_AUTHOR
60 #define PLUGIN_INTERFACE_VERSION 2
61
62
63
64 /****************************************************************************
65  *           Various datastructures and definitions from olsrd              *
66  ****************************************************************************/
67
68 /*
69  * TYPES SECTION
70  */
71
72 typedef enum
73 {
74     OLSR_FALSE = 0,
75     OLSR_TRUE
76 }olsr_bool;
77
78
79
80 /* types */
81 #include <sys/types.h>
82
83 #ifndef WIN32
84 typedef u_int8_t        olsr_u8_t;
85 typedef u_int16_t       olsr_u16_t;
86 typedef u_int32_t       olsr_u32_t;
87 typedef int8_t          olsr_8_t;
88 typedef int16_t         olsr_16_t;
89 typedef int32_t         olsr_32_t;
90 #else
91 typedef unsigned char olsr_u8_t;
92 typedef unsigned short olsr_u16_t;
93 typedef unsigned int olsr_u32_t;
94 typedef char olsr_8_t;
95 typedef short olsr_16_t;
96 typedef int olsr_32_t;
97 #endif
98
99
100 /*
101  * VARIOUS DEFINITIONS
102  */
103
104 union olsr_ip_addr
105 {
106   olsr_u32_t v4;
107   struct in6_addr v6;
108 };
109
110 union hna_netmask
111 {
112   olsr_u32_t v4;
113   olsr_u16_t v6;
114 };
115
116 /*
117  * Hashing
118  */
119
120 #define HASHSIZE        32
121 #define HASHMASK        (HASHSIZE - 1)
122
123 #define MAXIFS         8 /* Maximum number of interfaces (from defs.h) in uOLSRd */
124
125
126
127 /*
128  * Neighbor structures
129  */
130
131 /* One hop neighbor */
132
133 struct neighbor_2_list_entry 
134 {
135   struct neighbor_2_entry      *neighbor_2;
136   struct timeval               neighbor_2_timer;
137   struct neighbor_2_list_entry *next;
138   struct neighbor_2_list_entry *prev;
139 };
140
141 struct neighbor_entry
142 {
143   union olsr_ip_addr           neighbor_main_addr;
144   olsr_u8_t                    status;
145   olsr_u8_t                    willingness;
146   olsr_bool                    is_mpr;
147   olsr_bool                    was_mpr; /* Used to detect changes in MPR */
148   int                          neighbor_2_nocov;
149   int                          linkcount;
150   struct neighbor_2_list_entry neighbor_2_list; 
151   struct neighbor_entry        *next;
152   struct neighbor_entry        *prev;
153 };
154
155
156 /* Two hop neighbor */
157
158
159
160 struct neighbor_list_entry 
161 {
162   struct        neighbor_entry *neighbor;
163   struct        neighbor_list_entry *next;
164   struct        neighbor_list_entry *prev;
165 };
166
167
168 struct neighbor_2_entry
169 {
170   union olsr_ip_addr         neighbor_2_addr;
171   olsr_u8_t                  mpr_covered_count;    /*used in mpr calculation*/
172   olsr_u8_t                  processed;            /*used in mpr calculation*/
173   olsr_16_t                  neighbor_2_pointer;   /* Neighbor count */
174   struct neighbor_list_entry neighbor_2_nblist; 
175   struct neighbor_2_entry    *prev;
176   struct neighbor_2_entry    *next;
177 };
178
179 /* Topology entry */
180
181 struct topo_dst
182 {
183   union olsr_ip_addr T_dest_addr;
184   struct timeval T_time;
185   olsr_u16_t T_seq;
186   struct topo_dst *next;
187   struct topo_dst *prev;
188 };
189
190
191 struct tc_entry
192 {
193   union olsr_ip_addr T_last_addr;
194   struct topo_dst destinations;
195   struct tc_entry *next;
196   struct tc_entry *prev;
197 };
198
199 /* HNA */
200
201 /* hna_netmask declared in packet.h */
202
203 struct hna_net
204 {
205   union olsr_ip_addr A_network_addr;
206   union hna_netmask  A_netmask;
207   struct timeval     A_time;
208   struct hna_net     *next;
209   struct hna_net     *prev;
210 };
211
212 struct hna_entry
213 {
214   union olsr_ip_addr A_gateway_addr;
215   struct hna_net     networks;
216   struct hna_entry   *next;
217   struct hna_entry   *prev;
218 };
219
220 /* The lists */
221
222 struct neighbor_entry *neighbortable;
223 struct neighbor_2_entry *two_hop_neighbortable;
224 struct tc_entry *tc_table;
225 struct hna_entry *hna_set;
226
227
228 /* Buffer for olsr_ip_to_string */
229
230 char ipv6_buf[100]; /* buffer for IPv6 inet_htop */
231
232
233 /****************************************************************************
234  *                Function pointers to functions in olsrd                   *
235  *              These allow direct access to olsrd functions                *
236  ****************************************************************************/
237
238 /* The multi-purpose funtion. All other functions are fetched trough this */
239 int (*olsr_plugin_io)(int, void *, size_t);
240
241 /* Register a scheduled event */
242 int (*olsr_register_scheduler_event)(void (*)(), float, float, olsr_u8_t *);
243
244 /* Register a "process changes" function */
245 int (*register_pcf)(int (*)(int, int, int));
246
247 /* Get the next message seqno in line */
248 olsr_u16_t (*get_msg_seqno)();
249
250 /* Check the duplicate table for prior processing */
251 int (*check_dup_proc)(union olsr_ip_addr *, olsr_u16_t);
252
253
254 /* Add a socket to the main olsrd select loop */
255 void (*add_olsr_socket)(int, void(*)(int));
256
257 /* Remove a socket from the main olsrd select loop */
258 int (*remove_olsr_socket)(int, void(*)(int));
259
260 /* get the link status to a neighbor */
261 int (*check_neighbor_link)(union olsr_ip_addr *);
262
263 /* Mantissa/exponen conversions */
264 olsr_u8_t (*double_to_me)(double);
265
266 double (*me_to_double)(olsr_u8_t);
267
268 /* olsrd printf wrapper */
269 int (*olsr_printf)(int, char *, ...);
270
271 /* olsrd malloc wrapper */
272 void *(*olsr_malloc)(size_t, const char *);
273
274 /* Add hna net IPv4 */
275 void (*add_local_hna4_entry)(union olsr_ip_addr *, union hna_netmask *);
276
277 /* Remove hna net IPv4 */
278 int (*remove_local_hna4_entry)(union olsr_ip_addr *, union hna_netmask *);
279
280 /* Add hna net IPv6 */
281 void (*add_local_hna6_entry)(union olsr_ip_addr *, union hna_netmask *);
282
283 /* Remove hna net IPv6 */
284 int (*remove_local_hna6_entry)(union olsr_ip_addr *, union hna_netmask *);
285
286
287 /****************************************************************************
288  *                             Data from olsrd                              *
289  *           NOTE THAT POINTERS POINT TO THE DATA USED BY OLSRD!            *
290  *               NEVER ALTER DATA POINTED TO BY THESE POINTERS              * 
291  *                   UNLESS YOU KNOW WHAT YOU ARE DOING!!!                  *
292  ****************************************************************************/
293
294 /* These two are set automatically by olsrd at load time */
295 int                ipversion;  /* IPversion in use */
296 union olsr_ip_addr *main_addr; /* Main address */
297
298
299 size_t             ipsize;     /* Size of the ipadresses used */
300 struct timeval     *now;       /* the olsrds schedulers idea of current time */
301
302 /* Data that can be altered by your plugin */
303 char               *buffer;    /* The packet buffer - put your packet here */
304 int                *outputsize;/* Pointer to the outputsize - set the size of your packet here */
305
306
307 /****************************************************************************
308  *                Functions that the plugin MUST provide                    *
309  ****************************************************************************/
310
311
312 /* Initialization function */
313 int
314 olsr_plugin_init();
315
316 /* IPC initialization function */
317 int
318 plugin_ipc_init();
319
320 /* Destructor function */
321 void
322 olsr_plugin_exit();
323
324 /* Mulitpurpose funtion */
325 int
326 plugin_io(int, void *, size_t);
327
328 int 
329 get_plugin_interface_version();
330
331 #endif