Removed unused function pointer
[olsrd.git] / lib / secure / src / olsrd_plugin.h
1
2 /*
3  * Secure OLSR plugin
4  * http://www.olsr.org
5  *
6  * Copyright (c) 2004, Andreas T√łnnesen(andreto@olsr.org)
7  * All rights reserved.
8  *
9  * Redistribution and use in source and binary forms, with or 
10  * without modification, are permitted provided that the following 
11  * conditions are met:
12  *
13  * * Redistributions of source code must retain the above copyright 
14  *   notice, this list of conditions and the following disclaimer.
15  * * Redistributions in binary form must reproduce the above copyright 
16  *   notice, this list of conditions and the following disclaimer in 
17  *   the documentation and/or other materials provided with the 
18  *   distribution.
19  * * Neither the name of olsrd, olsr.org nor the names of its 
20  *   contributors may be used to endorse or promote products derived 
21  *   from this software without specific prior written permission.
22  *
23  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 
24  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 
25  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS 
26  * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE 
27  * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, 
28  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, 
29  * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 
30  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER 
31  * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 
32  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN 
33  * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 
34  * POSSIBILITY OF SUCH DAMAGE.
35  *
36  * $Id: olsrd_plugin.h,v 1.13 2005/05/25 13:39:08 kattemat Exp $
37  */
38
39
40 /*
41  * olsr.org olsr daemon security plugin
42  */
43
44 #ifndef _OLSRD_PLUGIN_DEFS
45 #define _OLSRD_PLUGIN_DEFS
46
47
48 #include <sys/socket.h>
49 #include <netinet/in.h>
50 #include <arpa/inet.h>
51 #include <sys/time.h>
52 #include <time.h>
53 #include <math.h>
54 #include <stdio.h>
55
56 #include "olsr_plugin_io.h"
57 #include "olsr_types.h"
58 #include "interfaces.h"
59
60 /* Use this as PARSER_TYPE to receive ALL messages! */
61 #define PROMISCUOUS 0xffffffff
62
63
64
65 #define PLUGIN_NAME    "OLSRD signature plugin"
66 #define PLUGIN_VERSION "0.5"
67 #define PLUGIN_AUTHOR   "Andreas T√łnnesen"
68 #define MOD_DESC PLUGIN_NAME " " PLUGIN_VERSION " by " PLUGIN_AUTHOR
69 #define PLUGIN_INTERFACE_VERSION 3
70
71 /* The type of message you will use */
72 #define MESSAGE_TYPE 10
73
74 #define MAXMESSAGESIZE 512
75
76 /* The type of messages we will receive - can be set to promiscuous */
77 #define PARSER_TYPE MESSAGE_TYPE
78
79 #define TYPE_CHALLENGE 11
80 #define TYPE_CRESPONSE 12
81 #define TYPE_RRESPONSE 13
82
83 #define TIMED_OUT(s1) \
84         timercmp(s1, now, <)
85
86 char keyfile[FILENAME_MAX];
87
88 #define MAX_TTL               0xff
89
90 /*
91  *Link Types
92  */
93
94 #define UNSPEC_LINK           0
95 #define ASYM_LINK             1
96 #define SYM_LINK              2
97 #define LOST_LINK             3
98 #define HIDE_LINK             4
99 #define MAX_LINK              4
100
101
102 /*
103  * Mantissa scaling factor
104  */
105
106 #define VTIME_SCALE_FACTOR    0.0625
107
108
109 /*
110  * Hashing
111  */
112
113 #define HASHSIZE        32
114 #define HASHMASK        (HASHSIZE - 1)
115
116 #define MAXIFS         8 /* Maximum number of interfaces (from defs.h) in uOLSRd */
117
118 /* Ifchange actions */
119
120 #define IFCHG_IF_ADD           1
121 #define IFCHG_IF_REMOVE        2
122 #define IFCHG_IF_UPDATE        3
123
124 #ifdef USE_OPENSSL
125 #define SIGSIZE   20
126 #else
127 #define SIGSIZE   16
128 #endif
129
130 /****************************************************************************
131  *                            PACKET SECTION                                *
132  ****************************************************************************/
133
134 struct sig_msg
135 {
136   olsr_u8_t     type;
137   olsr_u8_t     algorithm;
138   olsr_u16_t    reserved;
139
140   time_t        timestamp;
141   char          signature[SIGSIZE];
142 };
143
144 /*
145  * OLSR message (several can exist in one OLSR packet)
146  */
147
148 struct olsrmsg
149 {
150   olsr_u8_t     olsr_msgtype;
151   olsr_u8_t     olsr_vtime;
152   olsr_u16_t    olsr_msgsize;
153   olsr_u32_t    originator;
154   olsr_u8_t     ttl;
155   olsr_u8_t     hopcnt;
156   olsr_u16_t    seqno;
157
158   /* YOUR PACKET GOES HERE */
159   struct sig_msg sig;
160
161 };
162
163
164 /*
165  * Challenge response messages
166  */
167
168 struct challengemsg
169 {
170   olsr_u8_t     olsr_msgtype;
171   olsr_u8_t     olsr_vtime;
172   olsr_u16_t    olsr_msgsize;
173   olsr_u32_t    originator;
174   olsr_u8_t     ttl;
175   olsr_u8_t     hopcnt;
176   olsr_u16_t    seqno;
177
178   olsr_u32_t    destination;
179   olsr_u32_t    challenge;
180
181   char          signature[SIGSIZE];
182
183 };
184
185
186
187 struct c_respmsg
188 {
189   olsr_u8_t     olsr_msgtype;
190   olsr_u8_t     olsr_vtime;
191   olsr_u16_t    olsr_msgsize;
192   olsr_u32_t    originator;
193   olsr_u8_t     ttl;
194   olsr_u8_t     hopcnt;
195   olsr_u16_t    seqno;
196
197   olsr_u32_t    destination;
198   olsr_u32_t    challenge;
199   time_t        timestamp;
200
201   char          res_sig[SIGSIZE];
202
203   char          signature[SIGSIZE];
204
205 };
206
207
208 struct r_respmsg
209 {
210   olsr_u8_t     olsr_msgtype;
211   olsr_u8_t     olsr_vtime;
212   olsr_u16_t    olsr_msgsize;
213   olsr_u32_t    originator;
214   olsr_u8_t     ttl;
215   olsr_u8_t     hopcnt;
216   olsr_u16_t    seqno;
217
218   olsr_u32_t    destination;
219   time_t        timestamp;
220
221   char          res_sig[SIGSIZE];
222
223   char          signature[SIGSIZE];
224 };
225
226
227 /*
228  *IPv6
229  */
230
231 struct olsrmsg6
232 {
233   olsr_u8_t        olsr_msgtype;
234   olsr_u8_t        olsr_vtime;
235   olsr_u16_t       olsr_msgsize;
236   struct in6_addr  originator;
237   olsr_u8_t        ttl;
238   olsr_u8_t        hopcnt;
239   olsr_u16_t       seqno;
240
241   /* YOUR PACKET GOES HERE */
242   struct sig_msg   sig;
243 };
244
245 /*
246  * Generic OLSR packet - DO NOT ALTER
247  */
248
249 struct olsr 
250 {
251   olsr_u16_t      olsr_packlen;         /* packet length */
252   olsr_u16_t      olsr_seqno;
253   struct olsrmsg  olsr_msg[1];          /* variable messages */
254 };
255
256
257 struct olsr6
258 {
259   olsr_u16_t        olsr_packlen;        /* packet length */
260   olsr_u16_t        olsr_seqno;
261   struct olsrmsg6   olsr_msg[1];         /* variable messages */
262 };
263
264
265 /* 
266  * ALWAYS USE THESE WRAPPERS TO
267  * ENSURE IPv4 <-> IPv6 compability 
268  */
269
270 union olsr_message
271 {
272   struct olsrmsg v4;
273   struct olsrmsg6 v6;
274 };
275
276 union olsr_packet
277 {
278   struct olsr v4;
279   struct olsr6 v6;
280 };
281
282
283 /***************************************************************************
284  *                 Functions provided by uolsrd_plugin.c                   *
285  *                  Similar to their siblings in olsrd                     *
286  ***************************************************************************/
287
288 char ipv6_buf[100]; /* buffer for IPv6 inet_htop */
289
290 /* All these could optionally be fetched from olsrd */
291
292 olsr_u32_t
293 olsr_hashing(union olsr_ip_addr *);
294
295 void
296 olsr_get_timestamp(olsr_u32_t, struct timeval *);
297
298 void
299 olsr_init_timer(olsr_u32_t, struct timeval *);
300
301 int
302 olsr_timed_out(struct timeval *);
303
304 char *
305 olsr_ip_to_string(union olsr_ip_addr *);
306
307
308
309 /****************************************************************************
310  *                Function pointers to functions in olsrd                   *
311  *              These allow direct access to olsrd functions                *
312  ****************************************************************************/
313
314 /* The multi-purpose funtion. All other functions are fetched trough this */
315 int (*olsr_plugin_io)(int, void *, size_t);
316
317 /* add a prser function */
318 void (*olsr_parser_add_function)(void (*)(union olsr_message *, struct interface *, union olsr_ip_addr *), 
319                                  int, int);
320
321 /* Register a timeout function */
322 int (*olsr_register_timeout_function)(void (*)(void));
323
324 /* Register a scheduled event */
325 int (*olsr_register_scheduler_event)(void (*)(void), void *, float, float, olsr_u8_t *);
326
327 /* Get the next message seqno in line */
328 olsr_u16_t (*get_msg_seqno)(void);
329
330 /* Transmit package */
331 int (*net_output)(struct interface*);
332
333 /* Check the duplicate table for prior processing */
334 int (*check_dup_proc)(union olsr_ip_addr *, olsr_u16_t);
335
336 /* Default forward algorithm */
337 int (*default_fwd)(union olsr_message *, 
338                    union olsr_ip_addr *, 
339                    olsr_u16_t,  
340                    struct interface *, 
341                    union olsr_ip_addr *);
342
343 /* Add a socket to the main olsrd select loop */
344 void (*add_olsr_socket)(int, void(*)(int));
345
346 /* Remove a socket from the main olsrd select loop */
347 int (*remove_olsr_socket)(int, void(*)(int));
348
349 /* get the link status to a neighbor */
350 int (*check_neighbor_link)(union olsr_ip_addr *);
351
352 /* Mantissa/exponent conversions */
353 olsr_u8_t (*double_to_me)(double);
354
355 /* olsrd printf wrapper */
356 int (*olsr_printf)(int, char *, ...);
357
358 /* olsrd malloc wrapper */
359 void *(*olsr_malloc)(size_t, const char *);
360
361 /* Add a packet transform function */
362 int (*add_ptf)(int(*)(char *, int *));
363
364 /* Remove a packet transform function */
365 int (*del_ptf)(int(*)(char *, int *));
366
367 /* Socket input function */
368 void (*olsr_input)(int);
369
370 /* Packet parser function */
371 void (*parse_packet)(struct olsr *, int, struct interface *, union olsr_ip_addr *);
372
373 /* Map interface by socket */
374 struct interface * (*if_ifwithsock)(int);
375
376 /* Map interface by address */
377 struct interface * (*if_ifwithaddr)(union olsr_ip_addr *);
378
379 /* Add an ifchange function */
380 int (*add_ifchgf)(int(*)(struct interface *, int));
381
382 /* Remove an ifchange function */
383 int (*del_ifchgf)(int(*)(struct interface *, int));
384
385 int (*net_reserve_bufspace)(struct interface *, int);
386
387 int (*net_outbuffer_push_reserved)(struct interface *, olsr_u8_t *, olsr_u16_t);
388
389 int (*net_outbuffer_push)(struct interface *, olsr_u8_t *, olsr_u16_t);
390
391
392 /****************************************************************************
393  *                             Data from olsrd                              *
394  *           NOTE THAT POINTERS POINT TO THE DATA USED BY OLSRD!            *
395  *               NEVER ALTER DATA POINTED TO BY THESE POINTERS              * 
396  *                   UNLESS YOU KNOW WHAT YOU ARE DOING!!!                  *
397  ****************************************************************************/
398 /**
399  * The interface list from olsrd
400  */
401
402 struct interface   *ifs;
403
404 /* These two are set automatically by olsrd at load time */
405 int                ipversion;  /* IPversion in use */
406 union olsr_ip_addr *main_addr; /* Main address */
407
408
409 size_t             ipsize;     /* Size of the ipadresses used */
410 struct timeval     *now;       /* the olsrds schedulers idea of current time */
411
412
413 /****************************************************************************
414  *                Functions that the plugin MUST provide                    *
415  ****************************************************************************/
416
417
418 /* Initialization function */
419 int
420 olsr_plugin_init(void);
421
422 /* IPC initialization function */
423 int
424 plugin_ipc_init(void);
425
426 int
427 register_olsr_param(char *, char *);
428
429 /* Destructor function */
430 void
431 olsr_plugin_exit(void);
432
433 /* Mulitpurpose funtion */
434 int
435 plugin_io(int, void *, size_t);
436
437 int 
438 get_plugin_interface_version(void);
439
440 #endif