Updated according to timer changes in olsrd code
[olsrd.git] / lib / httpinfo / src / olsrd_plugin.h
1 /*
2  * The olsr.org Optimized Link-State Routing daemon(olsrd)
3  * Copyright (c) 2004, Andreas T√łnnesen(andreto@olsr.org)
4  * All rights reserved.
5  *
6  * Redistribution and use in source and binary forms, with or without 
7  * modification, are permitted provided that the following conditions 
8  * are met:
9  *
10  * * Redistributions of source code must retain the above copyright 
11  *   notice, this list of conditions and the following disclaimer.
12  * * Redistributions in binary form must reproduce the above copyright 
13  *   notice, this list of conditions and the following disclaimer in 
14  *   the documentation and/or other materials provided with the 
15  *   distribution.
16  * * Neither the name of olsr.org, olsrd nor the names of its 
17  *   contributors may be used to endorse or promote products derived 
18  *   from this software without specific prior written permission.
19  *
20  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 
21  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 
22  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS 
23  * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE 
24  * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, 
25  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, 
26  * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 
27  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER 
28  * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 
29  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN 
30  * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 
31  * POSSIBILITY OF SUCH DAMAGE.
32  *
33  * Visit http://www.olsr.org for more information.
34  *
35  * If you find this software useful feel free to make a donation
36  * to the project. For more information see the website or contact
37  * the copyright holders.
38  *
39  * $Id: olsrd_plugin.h,v 1.10 2005/01/16 20:17:24 kattemat Exp $
40  */
41
42 /*
43  * Dynamic linked library for the olsr.org olsr daemon
44  */
45
46 #ifndef _OLSRD_PLUGIN_DEFS
47 #define _OLSRD_PLUGIN_DEFS
48
49
50 #include <netinet/in.h>
51 #include <sys/socket.h>
52 #include <sys/times.h>
53 #include <arpa/inet.h>
54 #include <sys/time.h>
55 #include <time.h>
56 #include <math.h>
57
58 #include "olsr_plugin_io.h"
59
60
61 /*****************************************************************************
62  *                               Plugin data                                 *
63  *                       ALTER THIS TO YOUR OWN NEED                         *
64  *****************************************************************************/
65
66 #define PLUGIN_NAME    "Httpinfo olsrd plugin"
67 #define PLUGIN_VERSION "0.1"
68 #define PLUGIN_AUTHOR   "Andreas T√łnnesen"
69 #define MOD_DESC PLUGIN_NAME " " PLUGIN_VERSION " by " PLUGIN_AUTHOR
70 #define PLUGIN_INTERFACE_VERSION 2
71
72 int http_port;
73
74 /****************************************************************************
75  *           Various datastructures and definitions from olsrd              *
76  ****************************************************************************/
77
78 /*
79  *Neighbor status
80  */
81
82 #define NOT_SYM               0
83 #define SYM                   1
84
85
86 /*
87  * TYPES SECTION
88  */
89
90 typedef enum
91 {
92     OLSR_FALSE = 0,
93     OLSR_TRUE
94 }olsr_bool;
95
96
97
98 /* types */
99 #include <sys/types.h>
100
101 #ifndef WIN32
102 typedef u_int8_t        olsr_u8_t;
103 typedef u_int16_t       olsr_u16_t;
104 typedef u_int32_t       olsr_u32_t;
105 typedef int8_t          olsr_8_t;
106 typedef int16_t         olsr_16_t;
107 typedef int32_t         olsr_32_t;
108 #else
109 typedef unsigned char olsr_u8_t;
110 typedef unsigned short olsr_u16_t;
111 typedef unsigned int olsr_u32_t;
112 typedef char olsr_8_t;
113 typedef short olsr_16_t;
114 typedef int olsr_32_t;
115 #endif
116
117
118 /*
119  * VARIOUS DEFINITIONS
120  */
121
122 union olsr_ip_addr
123 {
124   olsr_u32_t v4;
125   struct in6_addr v6;
126 };
127
128 union hna_netmask
129 {
130   olsr_u32_t v4;
131   olsr_u16_t v6;
132 };
133
134 /*
135  * Hashing
136  */
137
138 #define HASHSIZE        32
139 #define HASHMASK        (HASHSIZE - 1)
140
141 #define MAXIFS         8 /* Maximum number of interfaces (from defs.h) in uOLSRd */
142
143
144 struct allowed_host
145 {
146   union olsr_ip_addr       host;
147   struct allowed_host     *next;
148 };
149
150 struct allowed_net
151 {
152   union olsr_ip_addr       net;
153   union olsr_ip_addr       mask;
154   struct allowed_net      *next;
155 };
156
157 struct allowed_host   *allowed_hosts;
158 struct allowed_net    *allowed_nets;
159
160
161 /*
162  * Neighbor structures
163  */
164
165 /* One hop neighbor */
166
167 struct neighbor_2_list_entry 
168 {
169   struct neighbor_2_entry      *neighbor_2;
170   clock_t                      neighbor_2_timer;
171   struct neighbor_2_list_entry *next;
172   struct neighbor_2_list_entry *prev;
173 };
174
175 struct neighbor_entry
176 {
177   union olsr_ip_addr           neighbor_main_addr;
178   olsr_u8_t                    status;
179   olsr_u8_t                    willingness;
180   olsr_bool                    is_mpr;
181   olsr_bool                    was_mpr; /* Used to detect changes in MPR */
182   olsr_bool                    skip;
183   int                          neighbor_2_nocov;
184   int                          linkcount;
185   struct neighbor_2_list_entry neighbor_2_list; 
186   struct neighbor_entry        *next;
187   struct neighbor_entry        *prev;
188 };
189
190
191 /* Two hop neighbor */
192
193
194 struct neighbor_list_entry 
195 {
196   struct        neighbor_entry *neighbor;
197   double path_link_quality;
198   double saved_path_link_quality;
199   struct        neighbor_list_entry *next;
200   struct        neighbor_list_entry *prev;
201 };
202
203 struct neighbor_2_entry
204 {
205   union olsr_ip_addr         neighbor_2_addr;
206   olsr_u8_t                  mpr_covered_count;    /*used in mpr calculation*/
207   olsr_u8_t                  processed;            /*used in mpr calculation*/
208   olsr_16_t                  neighbor_2_pointer;   /* Neighbor count */
209   struct neighbor_list_entry neighbor_2_nblist; 
210   struct neighbor_2_entry    *prev;
211   struct neighbor_2_entry    *next;
212 };
213
214 struct link_entry
215 {
216   union olsr_ip_addr local_iface_addr;
217   union olsr_ip_addr neighbor_iface_addr;
218   clock_t SYM_time;
219   clock_t ASYM_time;
220   clock_t time;
221   struct neighbor_entry *neighbor;
222
223   /*
224    *Hysteresis
225    */
226   float L_link_quality;
227   int L_link_pending;
228   clock_t L_LOST_LINK_time;
229   clock_t hello_timeout; /* When we should receive a new HELLO */
230   double last_htime;
231   olsr_u16_t olsr_seqno;
232   olsr_bool olsr_seqno_valid;
233
234   /*
235    * packet loss
236    */
237
238   double loss_hello_int;
239   clock_t loss_timeout;
240
241   olsr_u16_t loss_seqno;
242   int loss_seqno_valid;
243   int loss_missed_hellos;
244
245   int lost_packets;
246   int total_packets;
247
248   double loss_link_quality;
249
250   int loss_window_size;
251   int loss_index;
252
253   unsigned char loss_bitmap[16];
254
255   double neigh_link_quality;
256
257   double saved_loss_link_quality;
258   double saved_neigh_link_quality;
259
260   /*
261    * Spy
262    */
263   olsr_u8_t                    spy_activated;
264
265   struct link_entry *next;
266 };
267
268
269
270 /* Topology entry */
271
272 struct topo_dst
273 {
274   union olsr_ip_addr T_dest_addr;
275   clock_t            T_time;
276   olsr_u16_t         T_seq;
277   struct topo_dst   *next;
278   struct topo_dst   *prev;
279   double             link_quality;
280   double             inverse_link_quality;
281   double             saved_link_quality;
282   double             saved_inverse_link_quality;
283 };
284
285 struct tc_entry
286 {
287   union olsr_ip_addr T_last_addr;
288   struct topo_dst destinations;
289   struct tc_entry *next;
290   struct tc_entry *prev;
291 };
292
293 /* HNA */
294
295 /* hna_netmask declared in packet.h */
296
297 struct hna_net
298 {
299   union olsr_ip_addr A_network_addr;
300   union hna_netmask  A_netmask;
301   clock_t            A_time;
302   struct hna_net     *next;
303   struct hna_net     *prev;
304 };
305
306 struct hna_entry
307 {
308   union olsr_ip_addr A_gateway_addr;
309   struct hna_net     networks;
310   struct hna_entry   *next;
311   struct hna_entry   *prev;
312 };
313
314 /*
315  * Generic address list elem
316  */
317 struct addresses 
318 {
319   union olsr_ip_addr address;
320   struct addresses *next;
321 };
322
323 /* MID set */
324 struct mid_entry
325 {
326   union olsr_ip_addr main_addr;
327   struct addresses  *aliases;
328   struct mid_entry  *prev;
329   struct mid_entry  *next;
330   clock_t            ass_timer;  
331 };
332
333 /* Routing table */
334 struct rt_entry
335 {
336   union olsr_ip_addr    rt_dst;
337   union olsr_ip_addr    rt_router;
338   union hna_netmask     rt_mask;
339   olsr_u8_t             rt_flags; 
340   olsr_u16_t            rt_metric;
341   struct interface      *rt_if;
342   struct rt_entry       *prev;
343   struct rt_entry       *next;
344 };
345
346
347 /* The lists */
348
349 struct neighbor_entry *neighbortable;
350 struct neighbor_2_entry *two_hop_neighbortable;
351 struct link_entry *link_set;
352 struct tc_entry *tc_table;
353 struct hna_entry *hna_set;
354 struct mid_entry *mid_set;
355 struct rt_entry *host_routes;
356 struct rt_entry *hna_routes;
357
358
359 /* Buffer for olsr_ip_to_string */
360
361 char ipv6_buf[100]; /* buffer for IPv6 inet_htop */
362
363 /* MPR set entry */
364
365 struct mpr_selector
366 {
367   union olsr_ip_addr  MS_main_addr;
368   clock_t             MS_time;
369   struct mpr_selector *next;
370   struct mpr_selector *prev;
371 };
372
373 /****************************************************************************
374  *                Function pointers to functions in olsrd                   *
375  *              These allow direct access to olsrd functions                *
376  ****************************************************************************/
377
378 /* The multi-purpose funtion. All other functions are fetched trough this */
379 int (*olsr_plugin_io)(int, void *, size_t);
380
381 /* Add a socket to the main olsrd select loop */
382 void (*add_olsr_socket)(int, void(*)(int));
383
384 /* Lookup MPR entry */
385 struct mpr_selector *(*olsr_lookup_mprs_set)(union olsr_ip_addr *);
386
387
388 /* olsrd printf wrapper */
389 int (*olsr_printf)(int, char *, ...);
390
391 /* olsrd malloc wrapper */
392 void *(*olsr_malloc)(size_t, const char *);
393
394
395 /****************************************************************************
396  *                             Data from olsrd                              *
397  *           NOTE THAT POINTERS POINT TO THE DATA USED BY OLSRD!            *
398  *               NEVER ALTER DATA POINTED TO BY THESE POINTERS              * 
399  *                   UNLESS YOU KNOW WHAT YOU ARE DOING!!!                  *
400  ****************************************************************************/
401
402 /* These two are set automatically by olsrd at load time */
403 int                ipversion;  /* IPversion in use */
404 union olsr_ip_addr *main_addr; /* Main address */
405
406
407 size_t             ipsize;     /* Size of the ipadresses used */
408
409 /****************************************************************************
410  *                Functions that the plugin MUST provide                    *
411  ****************************************************************************/
412
413
414 /* Initialization function */
415 int
416 olsr_plugin_init(void);
417
418 /* IPC initialization function */
419 int
420 plugin_ipc_init(void);
421
422 int
423 register_olsr_param(char *, char *);
424
425 /* Destructor function */
426 void
427 olsr_plugin_exit(void);
428
429 /* Mulitpurpose funtion */
430 int
431 plugin_io(int, void *, size_t);
432
433 int 
434 get_plugin_interface_version(void);
435
436 #endif