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