c1606d7ceadb6e5ebf52e8b12037c5d7b84278a4
[olsrd.git] / lib / secure / src / olsrd_plugin.c
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.c,v 1.6 2004/11/19 20:52:05 kattemat Exp $
37  */
38
39
40
41 #include "olsrd_plugin.h"
42 #include <stdio.h>
43
44
45 /* Data to sent to the plugin with the register_olsr_function call 
46  * THIS STRUCT MUST MATCH ITS SIBLING IN plugin_loader.h IN OLSRD
47  */
48 struct olsr_plugin_data
49 {
50   int ipversion;
51   union olsr_ip_addr *main_addr;
52   int (*olsr_plugin_io)(int, void *, size_t);
53 };
54
55
56 /**
57  * "Private" declarations
58  */
59
60 void __attribute__ ((constructor)) 
61 my_init(void);
62
63 void __attribute__ ((destructor)) 
64 my_fini(void);
65
66 int
67 register_olsr_data(struct olsr_plugin_data *);
68
69 int
70 fetch_olsrd_data();
71
72 /*
73  * Defines the version of the plugin interface that is used
74  * THIS IS NOT THE VERSION OF YOUR PLUGIN!
75  * Do not alter unless you know what you are doing!
76  */
77 int 
78 get_plugin_interface_version()
79 {
80   return PLUGIN_INTERFACE_VERSION;
81 }
82
83
84
85 /**
86  *Constructor
87  */
88 void
89 my_init()
90 {
91   /* Print plugin info to stdout */
92   printf("%s\n", MOD_DESC);
93   /* Set interface version */
94
95   ifs = NULL;
96
97   return;
98 }
99
100 /**
101  *Destructor
102  */
103 void
104 my_fini()
105 {
106
107   /* Calls the destruction function
108    * olsr_plugin_exit()
109    * This function should be present in your
110    * sourcefile and all data destruction
111    * should happen there - NOT HERE!
112    */
113   olsr_plugin_exit();
114
115   return;
116 }
117
118
119 int
120 register_olsr_param(char *key, char *value)
121 {
122   if(!strcmp(key, "Keyfile"))
123     {
124       strncpy(keyfile, value, FILENAME_MAX);
125     }
126
127   return 1;
128 }
129
130
131 /**
132  *Register needed functions and pointers
133  *
134  *This function should not be changed!
135  *
136  */
137 int
138 register_olsr_data(struct olsr_plugin_data *data)
139 {
140   /* IPversion */
141   ipversion = data->ipversion;
142   /* Main address */
143   main_addr = data->main_addr;
144
145   /* Multi-purpose function */
146   olsr_plugin_io = data->olsr_plugin_io;
147
148   /* Set size of IP address */
149   if(ipversion == AF_INET)
150     {
151       ipsize = sizeof(olsr_u32_t);
152     }
153   else
154     {
155       ipsize = sizeof(struct in6_addr);
156     }
157
158   if(!fetch_olsrd_data())
159     {
160       fprintf(stderr, "Could not fetch the neccessary functions from olsrd!\n");
161       return 0;
162     }
163
164   /* Calls the initialization function
165    * olsr_plugin_init()
166    * This function should be present in your
167    * sourcefile and all data initialization
168    * should happen there - NOT HERE!
169    */
170   if(!olsr_plugin_init())
171     {
172       fprintf(stderr, "Could not initialize plugin!\n");
173       return 0;
174     }
175
176   if(!plugin_ipc_init())
177     {
178       fprintf(stderr, "Could not initialize plugin IPC!\n");
179       return 0;
180     }
181   return 1;
182
183 }
184
185
186
187 int
188 fetch_olsrd_data()
189 {
190   int retval = 1;
191
192
193   if(!olsr_plugin_io(GETF__NET_RESERVE_BUFSPACE, 
194                      &net_reserve_bufspace, 
195                      sizeof(net_reserve_bufspace)))
196   {
197     net_reserve_bufspace = NULL;
198     retval = 0;
199   }
200
201   if(!olsr_plugin_io(GETF__NET_OUTBUFFER_PUSH_RESERVED, 
202                      &net_outbuffer_push_reserved, 
203                      sizeof(net_outbuffer_push_reserved)))
204   {
205     net_outbuffer_push_reserved = NULL;
206     retval = 0;
207   }
208
209   if(!olsr_plugin_io(GETF__NET_OUTBUFFER_PUSH, 
210                      &net_outbuffer_push, 
211                      sizeof(net_outbuffer_push)))
212   {
213     net_outbuffer_push = NULL;
214     retval = 0;
215   }
216
217
218   if(!olsr_plugin_io(GETF__OLSR_PRINTF, 
219                      &olsr_printf, 
220                      sizeof(olsr_printf)))
221   {
222     olsr_printf = NULL;
223     retval = 0;
224   }
225
226   if(!olsr_plugin_io(GETD__NOW, 
227                      &now, 
228                      sizeof(now)))
229   {
230     now = NULL;
231     retval = 0;
232   }
233
234   if(!olsr_plugin_io(GETF__NET_OUTPUT, 
235                      &net_output, 
236                      sizeof(net_output)))
237   {
238     net_output = NULL;
239     retval = 0;
240   }
241
242   /* Olsr malloc wrapper */
243   if(!olsr_plugin_io(GETF__OLSR_MALLOC, 
244                      &olsr_malloc, 
245                      sizeof(olsr_malloc)))
246   {
247     olsr_malloc = NULL;
248     retval = 0;
249   }
250
251   /* Scheduler event registration */
252   if(!olsr_plugin_io(GETF__OLSR_REGISTER_SCHEDULER_EVENT, 
253                      &olsr_register_scheduler_event, 
254                      sizeof(olsr_register_scheduler_event)))
255   {
256     olsr_register_scheduler_event = NULL;
257     retval = 0;
258   }
259
260
261   /* Interface list */
262   if(!olsr_plugin_io(GETD__IFNET, &ifs, sizeof(ifs)))
263   {
264     ifs = NULL;
265     retval = 0;
266   }
267
268
269
270   /* Add socket to OLSR select function */
271   if(!olsr_plugin_io(GETF__ADD_OLSR_SOCKET, &add_olsr_socket, sizeof(add_olsr_socket)))
272   {
273     add_olsr_socket = NULL;
274     retval = 0;
275   }
276
277   /* Remove socket from OLSR select function */
278   if(!olsr_plugin_io(GETF__REMOVE_OLSR_SOCKET, &remove_olsr_socket, sizeof(remove_olsr_socket)))
279   {
280     remove_olsr_socket = NULL;
281     retval = 0;
282   }
283
284   /* Add packet transform function */
285   if(!olsr_plugin_io(GETF__ADD_PTF, &add_ptf, sizeof(add_ptf)))
286   {
287     add_ptf = NULL;
288     retval = 0;
289   }
290
291   /* Remove packet transform function */
292   if(!olsr_plugin_io(GETF__DEL_PTF, &del_ptf, sizeof(del_ptf)))
293   {
294     del_ptf = NULL;
295     retval = 0;
296   }
297
298   /* Get message seqno function */
299   if(!olsr_plugin_io(GETF__GET_MSG_SEQNO, &get_msg_seqno, sizeof(get_msg_seqno)))
300   {
301     get_msg_seqno = NULL;
302     retval = 0;
303   }
304
305   /* Socket read function */
306   if(!olsr_plugin_io(GETF__OLSR_INPUT, &olsr_input, sizeof(olsr_input)))
307   {
308     olsr_input = NULL;
309     retval = 0;
310   }
311
312   /* Default packet parser */
313   if(!olsr_plugin_io(GETF__PARSE_PACKET, &parse_packet, sizeof(parse_packet)))
314   {
315     parse_packet = NULL;
316     retval = 0;
317   }
318
319   /* Find interface by socket */
320   if(!olsr_plugin_io(GETF__IF_IFWITHSOCK, &if_ifwithsock, sizeof(if_ifwithsock)))
321   {
322     if_ifwithsock = NULL;
323     retval = 0;
324   }
325
326   /* Find interface by address */
327   if(!olsr_plugin_io(GETF__IF_IFWITHADDR, &if_ifwithaddr, sizeof(if_ifwithaddr)))
328   {
329     if_ifwithaddr = NULL;
330     retval = 0;
331   }
332
333
334   /* Add ifchange function */
335   if(!olsr_plugin_io(GETF__ADD_IFCHGF, &add_ifchgf, sizeof(add_ifchgf)))
336   {
337     add_ifchgf = NULL;
338     retval = 0;
339   }
340
341   /* Remove ifchange function */
342   if(!olsr_plugin_io(GETF__DEL_IFCHGF, &del_ifchgf, sizeof(del_ifchgf)))
343   {
344     del_ifchgf = NULL;
345     retval = 0;
346   }
347
348
349   return retval;
350
351 }