Initial import
[olsrd.git] / lib / secure / src / olsrd_plugin.c
1 /*
2  * Secure OLSR plugin
3  * Copyright (C) 2004 Andreas T√łnnesen (andreto@ifi.uio.no)
4  *
5  * This file is part of the secure OLSR plugin(solsrp) for UniK olsrd.
6  *
7  * Solsrp is free software; you can redistribute it and/or modify
8  * it under the terms of the GNU General Public License as published by
9  * the Free Software Foundation; either version 2 of the License, or
10  * (at your option) any later version.
11  *
12  * solsrp is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15  * GNU General Public License for more details.
16  *
17  * You should have received a copy of the GNU General Public License
18  * along with olsrd-unik; if not, write to the Free Software
19  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
20  *
21  */
22
23 /*
24  * Dynamic linked library example for UniK OLSRd
25  */
26
27
28 #include "olsrd_plugin.h"
29 #include <stdio.h>
30
31
32 /* Data to sent to the plugin with the register_olsr_function call 
33  * THIS STRUCT MUST MATCH ITS SIBLING IN plugin_loader.h IN OLSRD
34  */
35 struct olsr_plugin_data
36 {
37   int ipversion;
38   union olsr_ip_addr *main_addr;
39   int (*olsr_plugin_io)(int, void *, size_t);
40 };
41
42
43 /**
44  * "Private" declarations
45  */
46
47 void __attribute__ ((constructor)) 
48 my_init(void);
49
50 void __attribute__ ((destructor)) 
51 my_fini(void);
52
53 int
54 register_olsr_data(struct olsr_plugin_data *);
55
56 int
57 fetch_olsrd_data();
58
59 /*
60  * Defines the version of the plugin interface that is used
61  * THIS IS NOT THE VERSION OF YOUR PLUGIN!
62  * Do not alter unless you know what you are doing!
63  */
64 int plugin_interface_version;
65
66 /**
67  *Constructor
68  */
69 void
70 my_init()
71 {
72   /* Print plugin info to stdout */
73   printf("%s\n", MOD_DESC);
74   /* Set interface version */
75   plugin_interface_version = PLUGIN_INTERFACE_VERSION;
76
77   ifs = NULL;
78
79   return;
80 }
81
82 /**
83  *Destructor
84  */
85 void
86 my_fini()
87 {
88
89   /* Calls the destruction function
90    * olsr_plugin_exit()
91    * This function should be present in your
92    * sourcefile and all data destruction
93    * should happen there - NOT HERE!
94    */
95   olsr_plugin_exit();
96
97   return;
98 }
99
100
101 /**
102  *Register needed functions and pointers
103  *
104  *This function should not be changed!
105  *
106  */
107 int
108 register_olsr_data(struct olsr_plugin_data *data)
109 {
110   /* IPversion */
111   ipversion = data->ipversion;
112   /* Main address */
113   main_addr = data->main_addr;
114
115   /* Multi-purpose function */
116   olsr_plugin_io = data->olsr_plugin_io;
117
118   /* Set size of IP address */
119   if(ipversion == AF_INET)
120     {
121       ipsize = sizeof(olsr_u32_t);
122     }
123   else
124     {
125       ipsize = sizeof(struct in6_addr);
126     }
127
128   if(!fetch_olsrd_data())
129     {
130       fprintf(stderr, "Could not fetch the neccessary functions from olsrd!\n");
131       return 0;
132     }
133
134   /* Calls the initialization function
135    * olsr_plugin_init()
136    * This function should be present in your
137    * sourcefile and all data initialization
138    * should happen there - NOT HERE!
139    */
140   if(!olsr_plugin_init())
141     {
142       fprintf(stderr, "Could not initialize plugin!\n");
143       return 0;
144     }
145
146   if(!plugin_ipc_init())
147     {
148       fprintf(stderr, "Could not initialize plugin IPC!\n");
149       return 0;
150     }
151   return 1;
152
153 }
154
155
156
157 int
158 fetch_olsrd_data()
159 {
160   int retval = 1;
161
162
163   /* Olsr debug output function */
164   if(!olsr_plugin_io(GETD__OUTPUTSIZE, 
165                      &outputsize, 
166                      sizeof(outputsize)))
167   {
168     outputsize = NULL;
169     retval = 0;
170   }
171
172   /* Olsr debug output function */
173   if(!olsr_plugin_io(GETD__MAXMESSAGESIZE, 
174                      &maxmessagesize, 
175                      sizeof(maxmessagesize)))
176   {
177     maxmessagesize = NULL;
178     retval = 0;
179   }
180
181   /* Olsr debug output function */
182   if(!olsr_plugin_io(GETD__PACKET, 
183                      &buffer, 
184                      sizeof(buffer)))
185   {
186     buffer = NULL;
187     retval = 0;
188   }
189
190
191   /* Olsr debug output function */
192   if(!olsr_plugin_io(GETF__OLSR_PRINTF, 
193                      &olsr_printf, 
194                      sizeof(olsr_printf)))
195   {
196     olsr_printf = NULL;
197     retval = 0;
198   }
199
200   /* Olsr debug output function */
201   if(!olsr_plugin_io(GETD__NOW, 
202                      &now, 
203                      sizeof(now)))
204   {
205     now = NULL;
206     retval = 0;
207   }
208
209   /* Olsr debug output function */
210   if(!olsr_plugin_io(GETF__NET_OUTPUT, 
211                      &net_output, 
212                      sizeof(net_output)))
213   {
214     net_output = NULL;
215     retval = 0;
216   }
217
218   /* Olsr malloc wrapper */
219   if(!olsr_plugin_io(GETF__OLSR_MALLOC, 
220                      &olsr_malloc, 
221                      sizeof(olsr_malloc)))
222   {
223     olsr_malloc = NULL;
224     retval = 0;
225   }
226
227   /* Scheduler event registration */
228   if(!olsr_plugin_io(GETF__OLSR_REGISTER_SCHEDULER_EVENT, 
229                      &olsr_register_scheduler_event, 
230                      sizeof(olsr_register_scheduler_event)))
231   {
232     olsr_register_scheduler_event = NULL;
233     retval = 0;
234   }
235
236
237   /* Interface list */
238   if(!olsr_plugin_io(GETD__IFNET, &ifs, sizeof(ifs)))
239   {
240     ifs = NULL;
241     retval = 0;
242   }
243
244
245
246   /* Add socket to OLSR select function */
247   if(!olsr_plugin_io(GETF__ADD_OLSR_SOCKET, &add_olsr_socket, sizeof(add_olsr_socket)))
248   {
249     add_olsr_socket = NULL;
250     retval = 0;
251   }
252
253   /* Remove socket from OLSR select function */
254   if(!olsr_plugin_io(GETF__REMOVE_OLSR_SOCKET, &remove_olsr_socket, sizeof(remove_olsr_socket)))
255   {
256     remove_olsr_socket = NULL;
257     retval = 0;
258   }
259
260   /* Add hna net IPv4 */
261   if(!olsr_plugin_io(GETF__ADD_LOCAL_HNA4_ENTRY, &add_local_hna4_entry, sizeof(add_local_hna4_entry)))
262   {
263     add_local_hna4_entry = NULL;
264     retval = 0;
265   }
266
267   /* Remove hna net IPv4 */
268   if(!olsr_plugin_io(GETF__REMOVE_LOCAL_HNA4_ENTRY, &remove_local_hna4_entry, sizeof(remove_local_hna4_entry)))
269   {
270     remove_local_hna4_entry = NULL;
271     retval = 0;
272   }
273
274   /* Add packet transform function */
275   if(!olsr_plugin_io(GETF__ADD_PTF, &add_ptf, sizeof(add_ptf)))
276   {
277     add_ptf = NULL;
278     retval = 0;
279   }
280
281   /* Remove packet transform function */
282   if(!olsr_plugin_io(GETF__DEL_PTF, &del_ptf, sizeof(del_ptf)))
283   {
284     del_ptf = NULL;
285     retval = 0;
286   }
287
288   /* Get message seqno function */
289   if(!olsr_plugin_io(GETF__GET_MSG_SEQNO, &get_msg_seqno, sizeof(get_msg_seqno)))
290   {
291     get_msg_seqno = NULL;
292     retval = 0;
293   }
294
295   /* Socket read function */
296   if(!olsr_plugin_io(GETF__OLSR_INPUT, &olsr_input, sizeof(olsr_input)))
297   {
298     olsr_input = NULL;
299     retval = 0;
300   }
301
302   /* Default packet parser */
303   if(!olsr_plugin_io(GETF__PARSE_PACKET, &parse_packet, sizeof(parse_packet)))
304   {
305     parse_packet = NULL;
306     retval = 0;
307   }
308
309   /* Find interface by socket */
310   if(!olsr_plugin_io(GETF__IF_IFWITHSOCK, &if_ifwithsock, sizeof(if_ifwithsock)))
311   {
312     if_ifwithsock = NULL;
313     retval = 0;
314   }
315
316   /* Find interface by address */
317   if(!olsr_plugin_io(GETF__IF_IFWITHADDR, &if_ifwithaddr, sizeof(if_ifwithaddr)))
318   {
319     if_ifwithaddr = NULL;
320     retval = 0;
321   }
322
323
324   /* Add ifchange function */
325   if(!olsr_plugin_io(GETF__ADD_IFCHGF, &add_ifchgf, sizeof(add_ifchgf)))
326   {
327     add_ifchgf = NULL;
328     retval = 0;
329   }
330
331   /* Remove ifchange function */
332   if(!olsr_plugin_io(GETF__DEL_IFCHGF, &del_ifchgf, sizeof(del_ifchgf)))
333   {
334     del_ifchgf = NULL;
335     retval = 0;
336   }
337
338
339   return retval;
340
341 }