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