Updated data structures to use clock_t instead of struct timeval.
[olsrd.git] / lib / dot_draw / 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.12 2005/01/22 16:50:37 tlopatic 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 <sys/socket.h>
51 #include <netinet/in.h>
52 #include <arpa/inet.h>
53 #include <sys/time.h>
54 #include <time.h>
55 #include <math.h>
56
57 #include "olsr_plugin_io.h"
58
59
60 /*****************************************************************************
61  *                               Plugin data                                 *
62  *                       ALTER THIS TO YOUR OWN NEED                         *
63  *****************************************************************************/
64
65 #define PLUGIN_NAME    "OLSRD dot draw plugin"
66 #define PLUGIN_VERSION "0.3"
67 #define PLUGIN_AUTHOR   "Andreas T√łnnesen"
68 #define MOD_DESC PLUGIN_NAME " " PLUGIN_VERSION " by " PLUGIN_AUTHOR
69 #define PLUGIN_INTERFACE_VERSION 2
70
71 struct in_addr ipc_accept_ip;
72 int ipc_port;
73
74 /****************************************************************************
75  *           Various datastructures and definitions from olsrd              *
76  ****************************************************************************/
77
78 /*
79  * TYPES SECTION
80  */
81
82 typedef enum
83 {
84     OLSR_FALSE = 0,
85     OLSR_TRUE
86 }olsr_bool;
87
88
89
90 /* types */
91 #include <sys/types.h>
92
93 #ifndef WIN32
94 typedef u_int8_t        olsr_u8_t;
95 typedef u_int16_t       olsr_u16_t;
96 typedef u_int32_t       olsr_u32_t;
97 typedef int8_t          olsr_8_t;
98 typedef int16_t         olsr_16_t;
99 typedef int32_t         olsr_32_t;
100 #else
101 typedef unsigned char olsr_u8_t;
102 typedef unsigned short olsr_u16_t;
103 typedef unsigned int olsr_u32_t;
104 typedef char olsr_8_t;
105 typedef short olsr_16_t;
106 typedef int olsr_32_t;
107 #endif
108
109
110 /*
111  * VARIOUS DEFINITIONS
112  */
113
114 union olsr_ip_addr
115 {
116   olsr_u32_t v4;
117   struct in6_addr v6;
118 };
119
120 union hna_netmask
121 {
122   olsr_u32_t v4;
123   olsr_u16_t v6;
124 };
125
126 /*
127  * Hashing
128  */
129
130 #define HASHSIZE        32
131 #define HASHMASK        (HASHSIZE - 1)
132
133 #define MAXIFS         8 /* Maximum number of interfaces (from defs.h) in uOLSRd */
134
135
136
137 /*
138  * Neighbor structures
139  */
140
141 /* One hop neighbor */
142
143 struct neighbor_2_list_entry 
144 {
145   struct neighbor_2_entry      *neighbor_2;
146   clock_t              neighbor_2_timer;
147   struct neighbor_2_list_entry *next;
148   struct neighbor_2_list_entry *prev;
149 };
150
151 struct neighbor_entry
152 {
153   union olsr_ip_addr           neighbor_main_addr;
154   olsr_u8_t                    status;
155   olsr_u8_t                    willingness;
156   olsr_bool                    is_mpr;
157   olsr_bool                    was_mpr; /* Used to detect changes in MPR */
158   olsr_bool                    skip;
159   int                          neighbor_2_nocov;
160   int                          linkcount;
161   struct neighbor_2_list_entry neighbor_2_list; 
162   struct neighbor_entry        *next;
163   struct neighbor_entry        *prev;
164 };
165
166
167 /* Two hop neighbor */
168
169
170 struct neighbor_list_entry 
171 {
172   struct        neighbor_entry *neighbor;
173   double path_link_quality;
174   double saved_path_link_quality;
175   struct        neighbor_list_entry *next;
176   struct        neighbor_list_entry *prev;
177 };
178
179 struct neighbor_2_entry
180 {
181   union olsr_ip_addr         neighbor_2_addr;
182   olsr_u8_t                  mpr_covered_count;    /*used in mpr calculation*/
183   olsr_u8_t                  processed;            /*used in mpr calculation*/
184   olsr_16_t                  neighbor_2_pointer;   /* Neighbor count */
185   struct neighbor_list_entry neighbor_2_nblist; 
186   struct neighbor_2_entry    *prev;
187   struct neighbor_2_entry    *next;
188 };
189
190 /* Topology entry */
191
192 struct topo_dst
193 {
194   union olsr_ip_addr T_dest_addr;
195   clock_t T_time;
196   olsr_u16_t T_seq;
197   struct topo_dst *next;
198   struct topo_dst *prev;
199   double link_quality;
200   double inverse_link_quality;
201   double saved_link_quality;
202   double saved_inverse_link_quality;
203 };
204
205 struct tc_entry
206 {
207   union olsr_ip_addr T_last_addr;
208   struct topo_dst destinations;
209   struct tc_entry *next;
210   struct tc_entry *prev;
211 };
212
213 /* HNA */
214
215 /* hna_netmask declared in packet.h */
216
217 struct hna_net
218 {
219   union olsr_ip_addr A_network_addr;
220   union hna_netmask  A_netmask;
221   clock_t            A_time;
222   struct hna_net     *next;
223   struct hna_net     *prev;
224 };
225
226 struct hna_entry
227 {
228   union olsr_ip_addr A_gateway_addr;
229   struct hna_net     networks;
230   struct hna_entry   *next;
231   struct hna_entry   *prev;
232 };
233
234 /* Link entry */
235 struct link_entry
236 {
237   union olsr_ip_addr local_iface_addr;
238   union olsr_ip_addr neighbor_iface_addr;
239   clock_t SYM_time;
240   clock_t ASYM_time;
241   clock_t time;
242   struct neighbor_entry *neighbor;
243
244   /*
245    *Hysteresis
246    */
247   float L_link_quality;
248   int L_link_pending;
249   clock_t L_LOST_LINK_time;
250   clock_t hello_timeout; /* When we should receive a new HELLO */
251   double last_htime;
252   olsr_u16_t olsr_seqno;
253   olsr_bool olsr_seqno_valid;
254
255   /*
256    * packet loss
257    */
258
259   double loss_hello_int;
260   clock_t loss_timeout;
261
262   olsr_u16_t loss_seqno;
263   int loss_seqno_valid;
264   int loss_missed_hellos;
265
266   int lost_packets;
267   int total_packets;
268
269   double loss_link_quality;
270
271   int loss_window_size;
272   int loss_index;
273
274   unsigned char loss_bitmap[16];
275
276   double neigh_link_quality;
277
278   double saved_loss_link_quality;
279   double saved_neigh_link_quality;
280
281   /*
282    * Spy
283    */
284   olsr_u8_t                    spy_activated;
285
286   struct link_entry *next;
287 };
288
289 /* The lists */
290
291 struct neighbor_entry *neighbortable;
292 struct neighbor_2_entry *two_hop_neighbortable;
293 struct tc_entry *tc_table;
294 struct hna_entry *hna_set;
295 struct link_entry *link_set;
296
297 /* Buffer for olsr_ip_to_string */
298
299 char ipv6_buf[100]; /* buffer for IPv6 inet_htop */
300
301
302 /****************************************************************************
303  *                Function pointers to functions in olsrd                   *
304  *              These allow direct access to olsrd functions                *
305  ****************************************************************************/
306
307 /* The multi-purpose funtion. All other functions are fetched trough this */
308 int (*olsr_plugin_io)(int, void *, size_t);
309
310 /* Register a "process changes" function */
311 int (*register_pcf)(int (*)(int, int, int));
312
313 /* Add a socket to the main olsrd select loop */
314 void (*add_olsr_socket)(int, void(*)(int));
315
316 /* Remove a socket from the main olsrd select loop */
317 int (*remove_olsr_socket)(int, void(*)(int));
318
319 /* get the link status to a neighbor */
320 int (*check_neighbor_link)(union olsr_ip_addr *);
321
322 /* olsrd printf wrapper */
323 int (*olsr_printf)(int, char *, ...);
324
325 /* olsrd malloc wrapper */
326 void *(*olsr_malloc)(size_t, const char *);
327
328
329 /****************************************************************************
330  *                             Data from olsrd                              *
331  *           NOTE THAT POINTERS POINT TO THE DATA USED BY OLSRD!            *
332  *               NEVER ALTER DATA POINTED TO BY THESE POINTERS              * 
333  *                   UNLESS YOU KNOW WHAT YOU ARE DOING!!!                  *
334  ****************************************************************************/
335
336 /* These two are set automatically by olsrd at load time */
337 int                ipversion;  /* IPversion in use */
338 union olsr_ip_addr *main_addr; /* Main address */
339
340
341 size_t             ipsize;     /* Size of the ipadresses used */
342
343 /****************************************************************************
344  *                Functions that the plugin MUST provide                    *
345  ****************************************************************************/
346
347
348 /* Initialization function */
349 int
350 olsr_plugin_init(void);
351
352 /* IPC initialization function */
353 int
354 plugin_ipc_init(void);
355
356 int
357 register_olsr_param(char *, char *);
358
359 /* Destructor function */
360 void
361 olsr_plugin_exit(void);
362
363 /* Mulitpurpose funtion */
364 int
365 plugin_io(int, void *, size_t);
366
367 int 
368 get_plugin_interface_version(void);
369
370 #endif