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