changed license to BSD
[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  */
37
38
39 /*
40  * Dynamic linked library example for UniK OLSRd
41  */
42
43 #ifndef _OLSRD_PLUGIN_DEFS
44 #define _OLSRD_PLUGIN_DEFS
45
46
47 #include <sys/socket.h>
48 #include <netinet/in.h>
49 #include <arpa/inet.h>
50 #include <sys/time.h>
51 #include <time.h>
52 #include <math.h>
53
54 #include "olsr_plugin_io.h"
55
56 /* Use this as PARSER_TYPE to receive ALL messages! */
57 #define PROMISCUOUS 0xffffffff
58
59
60
61 #define PLUGIN_NAME    "OLSRD signature plugin"
62 #define PLUGIN_VERSION "0.3"
63 #define PLUGIN_AUTHOR   "Andreas T√łnnesen"
64 #define MOD_DESC PLUGIN_NAME " " PLUGIN_VERSION " by " PLUGIN_AUTHOR
65 #define PLUGIN_INTERFACE_VERSION 1
66
67 /* The type of message you will use */
68 #define MESSAGE_TYPE 10
69
70 /* The type of messages we will receive - can be set to promiscuous */
71 #define PARSER_TYPE MESSAGE_TYPE
72
73 #define TYPE_CHALLENGE 11
74 #define TYPE_CRESPONSE 12
75 #define TYPE_RRESPONSE 13
76
77 #define TIMED_OUT(s1) \
78         timercmp(s1, now, <)
79
80 /****************************************************************************
81  *           Various datastructures and definitions from olsrd              *
82  ****************************************************************************/
83
84 /*
85  * TYPES SECTION
86  */
87
88 /* types */
89 #include <sys/types.h>
90
91 typedef u_int8_t        olsr_u8_t;
92 typedef u_int16_t       olsr_u16_t;
93 typedef u_int32_t       olsr_u32_t;
94 typedef int8_t          olsr_8_t;
95 typedef int16_t         olsr_16_t;
96 typedef int32_t         olsr_32_t;
97
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 #define MAX_TTL               0xff
117
118
119 /*
120  *Link Types
121  */
122
123 #define UNSPEC_LINK           0
124 #define ASYM_LINK             1
125 #define SYM_LINK              2
126 #define LOST_LINK             3
127 #define HIDE_LINK             4
128 #define MAX_LINK              4
129
130
131 /*
132  * Mantissa scaling factor
133  */
134
135 #define VTIME_SCALE_FACTOR    0.0625
136
137
138 /*
139  * Hashing
140  */
141
142 #define HASHSIZE        32
143 #define HASHMASK        (HASHSIZE - 1)
144
145 #define MAXIFS         8 /* Maximum number of interfaces (from defs.h) in uOLSRd */
146
147 #define MAXMESSAGESIZE          512     /* max broadcast size */
148
149
150 /****************************************************************************
151  *                          INTERFACE SECTION                               *
152  ****************************************************************************/
153
154 /**
155  *A struct containing all necessary information about each
156  *interface participating in the OLSD routing
157  */
158 struct interface 
159 {
160   /* IP version 4 */
161   struct        sockaddr int_addr;              /* address */
162   struct        sockaddr int_netmask;           /* netmask */
163   struct        sockaddr int_broadaddr;         /* broadcast address */
164   /* IP version 6 */
165   struct        sockaddr_in6 int6_addr;         /* Address */
166   struct        sockaddr_in6 int6_multaddr;     /* Multicast */
167   /* IP independent */
168   union         olsr_ip_addr ip_addr;
169   int           olsr_socket;                    /* The broadcast socket for this interface */
170   int           int_metric;                     /* metric of interface */
171   int           int_flags;                      /* see below */
172   char          *int_name;                      /* from kernel if structure */
173   int           if_index;                       /* Kernels index of this interface */
174   int           if_nr;                          /* This interfaces index internally*/
175   int           is_wireless;                    /* wireless interface or not*/
176   olsr_u16_t    olsr_seqnum;                    /* Olsr message seqno */
177   struct        interface *int_next;
178 };
179
180 /* Ifchange actions */
181
182 #define IFCHG_IF_ADD           1
183 #define IFCHG_IF_REMOVE        2
184 #define IFCHG_IF_UPDATE        3
185
186
187 /****************************************************************************
188  *                            PACKET SECTION                                *
189  ****************************************************************************/
190
191 struct sig_msg
192 {
193   olsr_u8_t     type;
194   olsr_u8_t     algorithm;
195   olsr_u16_t    reserved;
196
197   time_t        timestamp;
198   char          signature[20];
199 };
200
201 /*
202  * OLSR message (several can exist in one OLSR packet)
203  */
204
205 struct olsrmsg
206 {
207   olsr_u8_t     olsr_msgtype;
208   olsr_u8_t     olsr_vtime;
209   olsr_u16_t    olsr_msgsize;
210   olsr_u32_t    originator;
211   olsr_u8_t     ttl;
212   olsr_u8_t     hopcnt;
213   olsr_u16_t    seqno;
214
215   /* YOUR PACKET GOES HERE */
216   struct sig_msg sig;
217
218 };
219
220
221 /*
222  * Challenge response messages
223  */
224
225 struct challengemsg
226 {
227   olsr_u8_t     olsr_msgtype;
228   olsr_u8_t     olsr_vtime;
229   olsr_u16_t    olsr_msgsize;
230   olsr_u32_t    originator;
231   olsr_u8_t     ttl;
232   olsr_u8_t     hopcnt;
233   olsr_u16_t    seqno;
234
235   olsr_u32_t    destination;
236   olsr_u32_t    challenge;
237
238   char          signature[20];
239
240 };
241
242
243
244 struct c_respmsg
245 {
246   olsr_u8_t     olsr_msgtype;
247   olsr_u8_t     olsr_vtime;
248   olsr_u16_t    olsr_msgsize;
249   olsr_u32_t    originator;
250   olsr_u8_t     ttl;
251   olsr_u8_t     hopcnt;
252   olsr_u16_t    seqno;
253
254   olsr_u32_t    destination;
255   olsr_u32_t    challenge;
256   time_t        timestamp;
257
258   char          res_sig[20];
259
260   char          signature[20];
261
262 };
263
264
265 struct r_respmsg
266 {
267   olsr_u8_t     olsr_msgtype;
268   olsr_u8_t     olsr_vtime;
269   olsr_u16_t    olsr_msgsize;
270   olsr_u32_t    originator;
271   olsr_u8_t     ttl;
272   olsr_u8_t     hopcnt;
273   olsr_u16_t    seqno;
274
275   olsr_u32_t    destination;
276   time_t        timestamp;
277
278   char          res_sig[20];
279
280   char          signature[20];
281 };
282
283
284 /*
285  *IPv6
286  */
287
288 struct olsrmsg6
289 {
290   olsr_u8_t        olsr_msgtype;
291   olsr_u8_t        olsr_vtime;
292   olsr_u16_t       olsr_msgsize;
293   struct in6_addr  originator;
294   olsr_u8_t        ttl;
295   olsr_u8_t        hopcnt;
296   olsr_u16_t       seqno;
297
298   /* YOUR PACKET GOES HERE */
299   struct sig_msg   sig;
300 };
301
302 /*
303  * Generic OLSR packet - DO NOT ALTER
304  */
305
306 struct olsr 
307 {
308   olsr_u16_t      olsr_packlen;         /* packet length */
309   olsr_u16_t      olsr_seqno;
310   struct olsrmsg  olsr_msg[1];          /* variable messages */
311 };
312
313
314 struct olsr6
315 {
316   olsr_u16_t        olsr_packlen;        /* packet length */
317   olsr_u16_t        olsr_seqno;
318   struct olsrmsg6   olsr_msg[1];         /* variable messages */
319 };
320
321
322 /* 
323  * ALWAYS USE THESE WRAPPERS TO
324  * ENSURE IPv4 <-> IPv6 compability 
325  */
326
327 union olsr_message
328 {
329   struct olsrmsg v4;
330   struct olsrmsg6 v6;
331 };
332
333 union olsr_packet
334 {
335   struct olsr v4;
336   struct olsr6 v6;
337 };
338
339
340 /***************************************************************************
341  *                 Functions provided by uolsrd_plugin.c                   *
342  *                  Similar to their siblings in olsrd                     *
343  ***************************************************************************/
344
345 char ipv6_buf[100]; /* buffer for IPv6 inet_htop */
346
347 /* All these could optionally be fetched from olsrd */
348
349 olsr_u32_t
350 olsr_hashing(union olsr_ip_addr *);
351
352 void
353 olsr_get_timestamp(olsr_u32_t, struct timeval *);
354
355 void
356 olsr_init_timer(olsr_u32_t, struct timeval *);
357
358 int
359 olsr_timed_out(struct timeval *);
360
361 char *
362 olsr_ip_to_string(union olsr_ip_addr *);
363
364
365
366 /****************************************************************************
367  *                Function pointers to functions in olsrd                   *
368  *              These allow direct access to olsrd functions                *
369  ****************************************************************************/
370
371 /* The multi-purpose funtion. All other functions are fetched trough this */
372 int (*olsr_plugin_io)(int, void *, size_t);
373
374 /* add a prser function */
375 void (*olsr_parser_add_function)(void (*)(union olsr_message *, struct interface *, union olsr_ip_addr *), 
376                                  int, int);
377
378 /* Register a timeout function */
379 int (*olsr_register_timeout_function)(void (*)());
380
381 /* Register a scheduled event */
382 int (*olsr_register_scheduler_event)(void (*)(), float, float, olsr_u8_t *);
383
384 /* Get the next message seqno in line */
385 olsr_u16_t (*get_msg_seqno)();
386
387 /* Transmit package */
388 int (*net_output)(struct interface*);
389
390 /* Check the duplicate table for prior processing */
391 int (*check_dup_proc)(union olsr_ip_addr *, olsr_u16_t);
392
393 /* Default forward algorithm */
394 int (*default_fwd)(union olsr_message *, 
395                    union olsr_ip_addr *, 
396                    olsr_u16_t,  
397                    struct interface *, 
398                    union olsr_ip_addr *);
399
400 /* Add a socket to the main olsrd select loop */
401 void (*add_olsr_socket)(int, void(*)(int));
402
403 /* Remove a socket from the main olsrd select loop */
404 int (*remove_olsr_socket)(int, void(*)(int));
405
406 /* get the link status to a neighbor */
407 int (*check_neighbor_link)(union olsr_ip_addr *);
408
409 /* Mantissa/exponen conversions */
410 olsr_u8_t (*double_to_me)(double);
411
412 double (*me_to_double)(olsr_u8_t);
413
414 /* olsrd printf wrapper */
415 int (*olsr_printf)(int, char *, ...);
416
417 /* olsrd malloc wrapper */
418 void *(*olsr_malloc)(size_t, const char *);
419
420 /* Add hna net IPv4 */
421 void (*add_local_hna4_entry)(union olsr_ip_addr *, union hna_netmask *);
422
423 /* Remove hna net IPv4 */
424 int (*remove_local_hna4_entry)(union olsr_ip_addr *, union hna_netmask *);
425
426 /* Add hna net IPv6 */
427 void (*add_local_hna6_entry)(union olsr_ip_addr *, union hna_netmask *);
428
429 /* Remove hna net IPv6 */
430 int (*remove_local_hna6_entry)(union olsr_ip_addr *, union hna_netmask *);
431
432 /* Add a packet transform function */
433 int (*add_ptf)(int(*)(char *, int *));
434
435 /* Remove a packet transform function */
436 int (*del_ptf)(int(*)(char *, int *));
437
438 /* Socket input function */
439 void (*olsr_input)(int);
440
441 /* Packet parser function */
442 void (*parse_packet)(struct olsr *, int, struct interface *, union olsr_ip_addr *);
443
444 /* Map interface by socket */
445 struct interface * (*if_ifwithsock)(int);
446
447 /* Map interface by address */
448 struct interface * (*if_ifwithaddr)(union olsr_ip_addr *);
449
450 /* Add an ifchange function */
451 int (*add_ifchgf)(int(*)(struct interface *, int));
452
453 /* Remove an ifchange function */
454 int (*del_ifchgf)(int(*)(struct interface *, int));
455
456
457
458 /****************************************************************************
459  *                             Data from olsrd                              *
460  *           NOTE THAT POINTERS POINT TO THE DATA USED BY OLSRD!            *
461  *               NEVER ALTER DATA POINTED TO BY THESE POINTERS              * 
462  *                   UNLESS YOU KNOW WHAT YOU ARE DOING!!!                  *
463  ****************************************************************************/
464 /**
465  * The interface list from olsrd
466  */
467
468 struct interface   *ifs;
469
470 /* These two are set automatically by olsrd at load time */
471 int                ipversion;  /* IPversion in use */
472 union olsr_ip_addr *main_addr; /* Main address */
473
474
475 size_t             ipsize;     /* Size of the ipadresses used */
476 struct timeval     *now;       /* the olsrds schedulers idea of current time */
477
478 /* Data that can be altered by your plugin */
479 char               *buffer;    /* The packet buffer - put your packet here */
480 int                *outputsize;/* Pointer to the outputsize - set the size of your packet here */
481 int                *maxmessagesize;
482
483 /****************************************************************************
484  *                Functions that the plugin MUST provide                    *
485  ****************************************************************************/
486
487
488 /* Initialization function */
489 int
490 olsr_plugin_init();
491
492 /* IPC initialization function */
493 int
494 plugin_ipc_init();
495
496 /* Destructor function */
497 void
498 olsr_plugin_exit();
499
500 /* Mulitpurpose funtion */
501 int
502 plugin_io(int, void *, size_t);
503
504 #endif