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