Added CVS Id fields to all ca nd h files
[olsrd.git] / lib / powerinfo / src / olsrd_plugin.c
1
2 /*
3  * Copyright (c) 2004, Andreas T√łnnesen(andreto-at-olsr.org)
4  * All rights reserved.
5  *
6  * Redistribution and use in source and binary forms, with or without 
7  * modification, are permitted provided that the following conditions 
8  * are met:
9  *
10  * * Redistributions of source code must retain the above copyright notice, 
11  *   this list of conditions and the following disclaimer.
12  * * Redistributions in binary form must reproduce the above copyright notice, 
13  *   this list of conditions and the following disclaimer in the documentation 
14  *   and/or other materials provided with the distribution.
15  * * Neither the name of the UniK olsr daemon nor the names of its contributors 
16  *   may be used to endorse or promote products derived from this software 
17  *   without specific prior written permission.
18  *
19  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND 
20  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 
21  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 
22  * IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, 
23  * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, 
24  * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 
25  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY 
26  * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE 
27  * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED 
28  * OF THE POSSIBILITY OF SUCH DAMAGE.
29  *
30  */
31
32 /*
33  * Dynamic linked library example for UniK OLSRd
34  */
35
36
37 #include "olsrd_plugin.h"
38 #include <stdio.h>
39
40
41 /* Data to sent to the plugin with the register_olsr_function call 
42  * THIS STRUCT MUST MATCH ITS SIBLING IN plugin_loader.h IN OLSRD
43  */
44 struct olsr_plugin_data
45 {
46   int ipversion;
47   union olsr_ip_addr *main_addr;
48   int (*olsr_plugin_io)(int, void *, size_t);
49 };
50
51
52 /**
53  * "Private" declarations
54  */
55
56 void __attribute__ ((constructor)) 
57 my_init(void);
58
59 void __attribute__ ((destructor)) 
60 my_fini(void);
61
62 int
63 register_olsr_data(struct olsr_plugin_data *);
64
65 int
66 fetch_olsrd_data();
67
68 /*
69  * Defines the version of the plugin interface that is used
70  * THIS IS NOT THE VERSION OF YOUR PLUGIN!
71  * Do not alter unless you know what you are doing!
72  */
73 int plugin_interface_version;
74
75 /**
76  *Constructor
77  */
78 void
79 my_init()
80 {
81   /* Print plugin info to stdout */
82   printf("%s\n", MOD_DESC);
83   /* Set interface version */
84   plugin_interface_version = PLUGIN_INTERFACE_VERSION;
85
86   ifs = NULL;
87
88   return;
89 }
90
91 /**
92  *Destructor
93  */
94 void
95 my_fini()
96 {
97
98   /* Calls the destruction function
99    * olsr_plugin_exit()
100    * This function should be present in your
101    * sourcefile and all data destruction
102    * should happen there - NOT HERE!
103    */
104   olsr_plugin_exit();
105
106   return;
107 }
108
109
110 /**
111  *Register needed functions and pointers
112  *
113  *This function should not be changed!
114  *
115  */
116 int
117 register_olsr_data(struct olsr_plugin_data *data)
118 {
119   /* IPversion */
120   ipversion = data->ipversion;
121   /* Main address */
122   main_addr = data->main_addr;
123
124   /* Multi-purpose function */
125   olsr_plugin_io = data->olsr_plugin_io;
126
127   /* Set size of IP address */
128   if(ipversion == AF_INET)
129     {
130       ipsize = sizeof(olsr_u32_t);
131     }
132   else
133     {
134       ipsize = sizeof(struct in6_addr);
135     }
136
137   if(!fetch_olsrd_data())
138     {
139       fprintf(stderr, "Could not fetch the neccessary functions from olsrd!\n");
140       return 0;
141     }
142
143   /* Calls the initialization function
144    * olsr_plugin_init()
145    * This function should be present in your
146    * sourcefile and all data initialization
147    * should happen there - NOT HERE!
148    */
149   if(!olsr_plugin_init())
150     {
151       fprintf(stderr, "Could not initialize plugin!\n");
152       return 0;
153     }
154
155   if(!plugin_ipc_init())
156     {
157       fprintf(stderr, "Could not initialize plugin IPC!\n");
158       return 0;
159     }
160
161   return 1;
162 }
163
164
165
166 int
167 fetch_olsrd_data()
168 {
169   int retval = 1;
170
171
172   /* Packet buffer */
173   if(!olsr_plugin_io(GETD__PACKET, &buffer, sizeof(buffer)))
174   {
175     buffer = NULL;
176     retval = 0;
177   }
178
179   /* Packet buffer size */
180   if(!olsr_plugin_io(GETD__OUTPUTSIZE, &outputsize, sizeof(outputsize)))
181   {
182     outputsize = NULL;
183     retval = 0;
184   }
185
186   /* Olsr debug output function */
187   if(!olsr_plugin_io(GETF__OLSR_PRINTF, 
188                      &olsr_printf, 
189                      sizeof(olsr_printf)))
190   {
191     olsr_printf = NULL;
192     retval = 0;
193   }
194
195
196   /* Olsr malloc wrapper */
197   if(!olsr_plugin_io(GETF__OLSR_MALLOC, 
198                      &olsr_malloc, 
199                      sizeof(olsr_malloc)))
200   {
201     olsr_malloc = NULL;
202     retval = 0;
203   }
204
205   /* Parser registration */
206   if(!olsr_plugin_io(GETF__OLSR_PARSER_ADD_FUNCTION, 
207                      &olsr_parser_add_function, 
208                      sizeof(olsr_parser_add_function)))
209   {
210     olsr_parser_add_function = NULL;
211     retval = 0;
212   }
213
214   /* Scheduler timeout registration */
215   if(!olsr_plugin_io(GETF__OLSR_REGISTER_TIMEOUT_FUNCTION, 
216                      &olsr_register_timeout_function, 
217                      sizeof(olsr_register_timeout_function)))
218   {
219     olsr_register_timeout_function = NULL;
220     retval = 0;
221   }
222
223   /* Scheduler event registration */
224   if(!olsr_plugin_io(GETF__OLSR_REGISTER_SCHEDULER_EVENT, 
225                      &olsr_register_scheduler_event, 
226                      sizeof(olsr_register_scheduler_event)))
227   {
228     olsr_register_scheduler_event = NULL;
229     retval = 0;
230   }
231
232   /* Double to mantissa/exponent */
233   if(!olsr_plugin_io(GETF__DOUBLE_TO_ME, 
234                      &double_to_me, 
235                      sizeof(double_to_me)))
236   {
237     double_to_me = NULL;
238     retval = 0;
239   }
240
241
242
243   /* Mantissa/exponent to double conversion */
244   if(!olsr_plugin_io(GETF__ME_TO_DOUBLE, 
245                      &me_to_double, 
246                      sizeof(me_to_double)))
247   {
248     me_to_double = NULL;
249     retval = 0;
250   }
251
252
253   /* Interface list */
254   if(!olsr_plugin_io(GETD__IFNET, &ifs, sizeof(ifs)))
255   {
256     ifs = NULL;
257     retval = 0;
258   }
259
260   /* Messageseqno fetch function */
261   if(!olsr_plugin_io(GETF__GET_MSG_SEQNO, &get_msg_seqno, sizeof(get_msg_seqno)))
262   {
263     get_msg_seqno = NULL;
264     retval = 0;
265   }
266
267   /* Scheduler maintained timestamp */
268   if(!olsr_plugin_io(GETD__NOW, &now, sizeof(now)))
269   {
270     now = NULL;
271     retval = 0;
272   }
273
274   /* Output function */
275   if(!olsr_plugin_io(GETF__NET_OUTPUT, &net_output, sizeof(net_output)))
276   {
277     net_output = NULL;
278     retval = 0;
279   }
280
281   /* Duplicate check (for processing) */
282   if(!olsr_plugin_io(GETF__OLSR_CHECK_DUP_TABLE_PROC, &check_dup_proc, sizeof(check_dup_proc)))
283   {
284     check_dup_proc = NULL;
285     retval = 0;
286   }
287
288   /* Default forward function */
289   if(!olsr_plugin_io(GETF__OLSR_FORWARD_MESSAGE, &default_fwd, sizeof(default_fwd)))
290   {
291     default_fwd = NULL;
292     retval = 0;
293   }
294
295
296   /* Add socket to OLSR select function */
297   if(!olsr_plugin_io(GETF__ADD_OLSR_SOCKET, &add_olsr_socket, sizeof(add_olsr_socket)))
298   {
299     add_olsr_socket = NULL;
300     retval = 0;
301   }
302
303
304   /* Remove socket from OLSR select function */
305   if(!olsr_plugin_io(GETF__REMOVE_OLSR_SOCKET, &remove_olsr_socket, sizeof(remove_olsr_socket)))
306   {
307     remove_olsr_socket = NULL;
308     retval = 0;
309   }
310
311   /* Neighbor link status lookup */
312   if(!olsr_plugin_io(GETF__CHECK_NEIGHBOR_LINK, &check_neighbor_link, sizeof(check_neighbor_link)))
313   {
314     check_neighbor_link = NULL;
315     retval = 0;
316   }
317
318
319   return retval;
320
321 }