The plugin now compiles for win32 as well
[olsrd.git] / lib / nameservice / src / olsrd_plugin.h
1 /*
2  * Copyright (c) 2005, Bruno Randolf <bruno.randolf@4g-systems.biz>
3  * Copyright (c) 2004, Andreas T√łnnesen(andreto-at-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 notice, 
11  *   this list of conditions and the following disclaimer.
12  * * Redistributions in binary form must reproduce the above copyright notice, 
13  *   this list of conditions and the following disclaimer in the documentation 
14  *   and/or other materials provided with the distribution.
15  * * Neither the name of the UniK olsr daemon nor the names of its contributors 
16  *   may be used to endorse or promote products derived from this software 
17  *   without specific prior written permission.
18  *
19  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND 
20  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 
21  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 
22  * IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, 
23  * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, 
24  * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 
25  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY 
26  * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE 
27  * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED 
28  * OF THE POSSIBILITY OF SUCH DAMAGE.
29  *
30  */
31
32 /* $Id: olsrd_plugin.h,v 1.2 2005/01/30 16:33:53 kattemat Exp $ */
33
34 /*
35  * Dynamic linked library example for UniK OLSRd
36  */
37
38 #ifndef _OLSRD_PLUGIN_DEFS
39 #define _OLSRD_PLUGIN_DEFS
40
41
42 #include <sys/socket.h>
43 #include <netinet/in.h>
44 #include <arpa/inet.h>
45 #include <sys/time.h>
46 #include <time.h>
47 #include <math.h>
48
49 #include "olsr_plugin_io.h"
50
51 /* Use this as PARSER_TYPE to receive ALL messages! */
52 #define PROMISCUOUS 0xffffffff
53
54
55 /****************************************************************************
56  *           Various datastructures and definitions from olsrd              *
57  ****************************************************************************/
58
59 /*
60  * TYPES SECTION
61  */
62
63 /* types */
64 #include <sys/types.h>
65
66 #ifndef WIN32
67 typedef u_int8_t        olsr_u8_t;
68 typedef u_int16_t       olsr_u16_t;
69 typedef u_int32_t       olsr_u32_t;
70 typedef int8_t          olsr_8_t;
71 typedef int16_t         olsr_16_t;
72 typedef int32_t         olsr_32_t;
73 #else
74 typedef unsigned char olsr_u8_t;
75 typedef unsigned short olsr_u16_t;
76 typedef unsigned int olsr_u32_t;
77 typedef char olsr_8_t;
78 typedef short olsr_16_t;
79 typedef int olsr_32_t;
80 #endif
81
82
83 /*
84  * VARIOUS DEFINITIONS
85  */
86
87 union olsr_ip_addr
88 {
89   olsr_u32_t v4;
90   struct in6_addr v6;
91 };
92
93
94 #define MAX_TTL               0xff
95
96
97 /*
98  *Link Types
99  */
100
101 #define UNSPEC_LINK           0
102 #define ASYM_LINK             1
103 #define SYM_LINK              2
104 #define LOST_LINK             3
105 #define HIDE_LINK             4
106 #define MAX_LINK              4
107
108
109
110 /*
111  * Hashing
112  */
113
114 #define HASHSIZE        32
115 #define HASHMASK        (HASHSIZE - 1)
116
117 #define MAXIFS         8 /* Maximum number of interfaces (from defs.h) in uOLSRd */
118
119
120 /****************************************************************************
121  *                          INTERFACE SECTION                               *
122  ****************************************************************************/
123 struct vtimes
124 {
125   olsr_u8_t hello;
126   olsr_u8_t tc;
127   olsr_u8_t mid;
128   olsr_u8_t hna;
129 };
130
131 /**
132  *A struct containing all necessary information about each
133  *interface participating in the OLSD routing
134  */
135 struct interface 
136 {
137   /* IP version 4 */
138   struct        sockaddr int_addr;              /* address */
139   struct        sockaddr int_netmask;           /* netmask */
140   struct        sockaddr int_broadaddr;         /* broadcast address */
141   /* IP version 6 */
142   struct        sockaddr_in6 int6_addr;         /* Address */
143   struct        sockaddr_in6 int6_multaddr;     /* Multicast */
144   /* IP independent */
145   union         olsr_ip_addr ip_addr;
146   int           olsr_socket;                    /* The broadcast socket for this interface */
147   int           int_metric;                     /* metric of interface */
148   int           int_mtu;                        /* MTU of interface */
149   int           int_flags;                      /* see below */
150   char          *int_name;                      /* from kernel if structure */
151   int           if_index;                       /* Kernels index of this interface */
152   int           if_nr;                          /* This interfaces index internally*/
153   int           is_wireless;                    /* wireless interface or not*/
154   olsr_u16_t    olsr_seqnum;                    /* Olsr message seqno */
155
156   float         hello_etime;
157   struct        vtimes valtimes;
158
159   struct        interface *int_next;
160 };
161
162
163 /****************************************************************************
164  *                            PACKET SECTION                                *
165  ****************************************************************************/
166
167  /**********************************
168  * DEFINE YOUR CUSTOM PACKET HERE *
169  **********************************/
170 #include "nameservice_msg.h"
171
172 /* 
173  * ALWAYS USE THESE WRAPPERS TO
174  * ENSURE IPv4 <-> IPv6 compability 
175  */
176
177 union olsr_message
178 {
179   struct olsrmsg v4;
180   struct olsrmsg6 v6;
181 };
182
183
184
185
186 /***************************************************************************
187  *                 Functions provided by uolsrd_plugin.c                   *
188  *                  Similar to their siblings in olsrd                     *
189  ***************************************************************************/
190
191 char ipv6_buf[100]; /* buffer for IPv6 inet_htop */
192
193 /* All these could optionally be fetched from olsrd */
194
195 olsr_u32_t
196 olsr_hashing(union olsr_ip_addr *);
197
198 void
199 olsr_get_timestamp(olsr_u32_t, struct timeval *);
200
201 void
202 olsr_init_timer(olsr_u32_t, struct timeval *);
203
204 int
205 olsr_timed_out(struct timeval *);
206
207 char *
208 olsr_ip_to_string(union olsr_ip_addr *);
209
210
211
212 /****************************************************************************
213  *                Function pointers to functions in olsrd                   *
214  *              These allow direct access to olsrd functions                *
215  ****************************************************************************/
216
217 /* The multi-purpose funtion. All other functions are fetched trough this */
218 int (*olsr_plugin_io)(int, void *, size_t);
219
220 /* add a prser function */
221 void (*olsr_parser_add_function)(void (*)(union olsr_message *, struct interface *, union olsr_ip_addr *), int, int);
222
223 /* Register a timeout function */
224 int (*olsr_register_timeout_function)(void (*)(void));
225
226 /* Register a scheduled event */
227 int (*olsr_register_scheduler_event)(void (*)(void *), void *, float, float, olsr_u8_t *);
228
229 /* Get the next message seqno in line */
230 olsr_u16_t (*get_msg_seqno)(void);
231
232 int (*net_outbuffer_push)(struct interface *, olsr_u8_t *, olsr_u16_t);
233
234 /* Transmit package */
235 int (*net_output)(struct interface*);
236
237 /* Check the duplicate table for prior processing */
238 int (*check_dup_proc)(union olsr_ip_addr *, olsr_u16_t);
239
240 /* Default forward algorithm */
241 int (*default_fwd)(union olsr_message *, 
242                    union olsr_ip_addr *, 
243                    olsr_u16_t,  
244                    struct interface *, 
245                    union olsr_ip_addr *);
246
247 /* Add a socket to the main olsrd select loop */
248 void (*add_olsr_socket)(int, void(*)(int));
249
250 /* get the link status to a neighbor */
251 int (*check_neighbor_link)(union olsr_ip_addr *);
252
253 /* Mantissa/exponen conversions */
254 olsr_u8_t (*double_to_me)(double);
255
256 double (*me_to_double)(olsr_u8_t);
257
258 /* olsrd printf wrapper */
259 int (*olsr_printf)(int, char *, ...);
260
261 /* olsrd malloc wrapper */
262 void *(*olsr_malloc)(size_t, const char *);
263
264
265 /****************************************************************************
266  *                             Data from olsrd                              *
267  *           NOTE THAT POINTERS POINT TO THE DATA USED BY OLSRD!            *
268  *               NEVER ALTER DATA POINTED TO BY THESE POINTERS              * 
269  *                   UNLESS YOU KNOW WHAT YOU ARE DOING!!!                  *
270  ****************************************************************************/
271 /**
272  * The interface list from olsrd
273  */
274
275 struct interface   *ifs;
276
277 /* These two are set automatically by olsrd at load time */
278 int                ipversion;  /* IPversion in use */
279 union olsr_ip_addr *main_addr; /* Main address */
280
281
282 size_t             ipsize;     /* Size of the ipadresses used */
283 struct timeval     *now;       /* the olsrds schedulers idea of current time */
284
285
286 /****************************************************************************
287  *                Functions that the plugin MUST provide                    *
288  ****************************************************************************/
289
290
291 /* Initialization function */
292 int
293 olsr_plugin_init(void);
294
295 /* Destructor function */
296 void
297 olsr_plugin_exit(void);
298
299 /* Mulitpurpose funtion */
300 int
301 plugin_io(int, void *, size_t);
302
303 /* Plugin interface version */
304 int 
305 get_plugin_interface_version(void);
306
307
308 /*****************************************************************************
309  *                               Plugin data                                 *
310  *****************************************************************************/
311
312 #define MOD_DESC PLUGIN_NAME " " PLUGIN_VERSION " by " PLUGIN_AUTHOR
313 #define PLUGIN_INTERFACE_VERSION 2
314
315 #endif