da711e2f90062fa22b2adcd3ec5de9df7b3fbfff
[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.4 2004/11/18 21:57:35 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 /**
120  *Register needed functions and pointers
121  *
122  *This function should not be changed!
123  *
124  */
125 int
126 register_olsr_data(struct olsr_plugin_data *data)
127 {
128   /* IPversion */
129   ipversion = data->ipversion;
130   /* Main address */
131   main_addr = data->main_addr;
132
133   /* Multi-purpose function */
134   olsr_plugin_io = data->olsr_plugin_io;
135
136   /* Set size of IP address */
137   if(ipversion == AF_INET)
138     {
139       ipsize = sizeof(olsr_u32_t);
140     }
141   else
142     {
143       ipsize = sizeof(struct in6_addr);
144     }
145
146   if(!fetch_olsrd_data())
147     {
148       fprintf(stderr, "Could not fetch the neccessary functions from olsrd!\n");
149       return 0;
150     }
151
152   /* Calls the initialization function
153    * olsr_plugin_init()
154    * This function should be present in your
155    * sourcefile and all data initialization
156    * should happen there - NOT HERE!
157    */
158   if(!olsr_plugin_init())
159     {
160       fprintf(stderr, "Could not initialize plugin!\n");
161       return 0;
162     }
163
164   if(!plugin_ipc_init())
165     {
166       fprintf(stderr, "Could not initialize plugin IPC!\n");
167       return 0;
168     }
169   return 1;
170
171 }
172
173
174
175 int
176 fetch_olsrd_data()
177 {
178   int retval = 1;
179
180
181   if(!olsr_plugin_io(GETF__NET_RESERVE_BUFSPACE, 
182                      &net_reserve_bufspace, 
183                      sizeof(net_reserve_bufspace)))
184   {
185     net_reserve_bufspace = NULL;
186     retval = 0;
187   }
188
189   if(!olsr_plugin_io(GETF__NET_OUTBUFFER_PUSH_RESERVED, 
190                      &net_outbuffer_push_reserved, 
191                      sizeof(net_outbuffer_push_reserved)))
192   {
193     net_outbuffer_push_reserved = NULL;
194     retval = 0;
195   }
196
197
198   if(!olsr_plugin_io(GETF__OLSR_PRINTF, 
199                      &olsr_printf, 
200                      sizeof(olsr_printf)))
201   {
202     olsr_printf = NULL;
203     retval = 0;
204   }
205
206   if(!olsr_plugin_io(GETD__NOW, 
207                      &now, 
208                      sizeof(now)))
209   {
210     now = NULL;
211     retval = 0;
212   }
213
214   if(!olsr_plugin_io(GETF__NET_OUTPUT, 
215                      &net_output, 
216                      sizeof(net_output)))
217   {
218     net_output = NULL;
219     retval = 0;
220   }
221
222   /* Olsr malloc wrapper */
223   if(!olsr_plugin_io(GETF__OLSR_MALLOC, 
224                      &olsr_malloc, 
225                      sizeof(olsr_malloc)))
226   {
227     olsr_malloc = NULL;
228     retval = 0;
229   }
230
231   /* Scheduler event registration */
232   if(!olsr_plugin_io(GETF__OLSR_REGISTER_SCHEDULER_EVENT, 
233                      &olsr_register_scheduler_event, 
234                      sizeof(olsr_register_scheduler_event)))
235   {
236     olsr_register_scheduler_event = NULL;
237     retval = 0;
238   }
239
240
241   /* Interface list */
242   if(!olsr_plugin_io(GETD__IFNET, &ifs, sizeof(ifs)))
243   {
244     ifs = NULL;
245     retval = 0;
246   }
247
248
249
250   /* Add socket to OLSR select function */
251   if(!olsr_plugin_io(GETF__ADD_OLSR_SOCKET, &add_olsr_socket, sizeof(add_olsr_socket)))
252   {
253     add_olsr_socket = NULL;
254     retval = 0;
255   }
256
257   /* Remove socket from OLSR select function */
258   if(!olsr_plugin_io(GETF__REMOVE_OLSR_SOCKET, &remove_olsr_socket, sizeof(remove_olsr_socket)))
259   {
260     remove_olsr_socket = NULL;
261     retval = 0;
262   }
263
264   /* Add packet transform function */
265   if(!olsr_plugin_io(GETF__ADD_PTF, &add_ptf, sizeof(add_ptf)))
266   {
267     add_ptf = NULL;
268     retval = 0;
269   }
270
271   /* Remove packet transform function */
272   if(!olsr_plugin_io(GETF__DEL_PTF, &del_ptf, sizeof(del_ptf)))
273   {
274     del_ptf = NULL;
275     retval = 0;
276   }
277
278   /* Get message seqno function */
279   if(!olsr_plugin_io(GETF__GET_MSG_SEQNO, &get_msg_seqno, sizeof(get_msg_seqno)))
280   {
281     get_msg_seqno = NULL;
282     retval = 0;
283   }
284
285   /* Socket read function */
286   if(!olsr_plugin_io(GETF__OLSR_INPUT, &olsr_input, sizeof(olsr_input)))
287   {
288     olsr_input = NULL;
289     retval = 0;
290   }
291
292   /* Default packet parser */
293   if(!olsr_plugin_io(GETF__PARSE_PACKET, &parse_packet, sizeof(parse_packet)))
294   {
295     parse_packet = NULL;
296     retval = 0;
297   }
298
299   /* Find interface by socket */
300   if(!olsr_plugin_io(GETF__IF_IFWITHSOCK, &if_ifwithsock, sizeof(if_ifwithsock)))
301   {
302     if_ifwithsock = NULL;
303     retval = 0;
304   }
305
306   /* Find interface by address */
307   if(!olsr_plugin_io(GETF__IF_IFWITHADDR, &if_ifwithaddr, sizeof(if_ifwithaddr)))
308   {
309     if_ifwithaddr = NULL;
310     retval = 0;
311   }
312
313
314   /* Add ifchange function */
315   if(!olsr_plugin_io(GETF__ADD_IFCHGF, &add_ifchgf, sizeof(add_ifchgf)))
316   {
317     add_ifchgf = NULL;
318     retval = 0;
319   }
320
321   /* Remove ifchange function */
322   if(!olsr_plugin_io(GETF__DEL_IFCHGF, &del_ifchgf, sizeof(del_ifchgf)))
323   {
324     del_ifchgf = NULL;
325     retval = 0;
326   }
327
328
329   return retval;
330
331 }