Plugin interface updates, topology is generated upon every connection
[olsrd.git] / lib / dot_draw / src / olsrd_plugin.c
1 /*
2  * OLSR plugin
3  * Copyright (C) 2004 Andreas T√łnnesen (andreto@olsr.org)
4  *
5  * This file is part of the olsrd dynamic gateway detection.
6  *
7  * This 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  * This plugin 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  * $Id: olsrd_plugin.c,v 1.4 2004/11/06 14:07:20 kattemat Exp $
23  *
24  */
25
26 /*
27  * Dynamic linked library example for UniK OLSRd
28  */
29
30
31 #include "olsrd_plugin.h"
32 #include <stdio.h>
33
34
35 /* Data to sent to the plugin with the register_olsr_function call 
36  * THIS STRUCT MUST MATCH ITS SIBLING IN plugin_loader.h IN OLSRD
37  */
38 struct olsr_plugin_data
39 {
40   int ipversion;
41   union olsr_ip_addr *main_addr;
42   int (*olsr_plugin_io)(int, void *, size_t);
43 };
44
45
46 /**
47  * "Private" declarations
48  */
49
50 void __attribute__ ((constructor)) 
51 my_init(void);
52
53 void __attribute__ ((destructor)) 
54 my_fini(void);
55
56 int
57 register_olsr_data(struct olsr_plugin_data *);
58
59 int
60 fetch_olsrd_data();
61
62
63 /*
64  * Defines the version of the plugin interface that is used
65  * THIS IS NOT THE VERSION OF YOUR PLUGIN!
66  * Do not alter unless you know what you are doing!
67  */
68 int 
69 get_plugin_interface_version()
70 {
71   return PLUGIN_INTERFACE_VERSION;
72 }
73
74
75
76 /**
77  *Constructor
78  */
79 void
80 my_init()
81 {
82   /* Print plugin info to stdout */
83   printf("%s\n", MOD_DESC);
84
85   return;
86 }
87
88 /**
89  *Destructor
90  */
91 void
92 my_fini()
93 {
94
95   /* Calls the destruction function
96    * olsr_plugin_exit()
97    * This function should be present in your
98    * sourcefile and all data destruction
99    * should happen there - NOT HERE!
100    */
101   olsr_plugin_exit();
102
103   return;
104 }
105
106
107 /**
108  *Register needed functions and pointers
109  *
110  *This function should not be changed!
111  *
112  */
113 int
114 register_olsr_data(struct olsr_plugin_data *data)
115 {
116   /* IPversion */
117   ipversion = data->ipversion;
118   /* Main address */
119   main_addr = data->main_addr;
120
121   /* Multi-purpose function */
122   olsr_plugin_io = data->olsr_plugin_io;
123
124   /* Set size of IP address */
125   if(ipversion == AF_INET)
126     {
127       ipsize = sizeof(olsr_u32_t);
128     }
129   else
130     {
131       ipsize = sizeof(struct in6_addr);
132     }
133
134   if(!fetch_olsrd_data())
135     {
136       fprintf(stderr, "Could not fetch the neccessary functions from olsrd!\n");
137       return 0;
138     }
139
140   /* Calls the initialization function
141    * olsr_plugin_init()
142    * This function should be present in your
143    * sourcefile and all data initialization
144    * should happen there - NOT HERE!
145    */
146   if(!olsr_plugin_init())
147     {
148       fprintf(stderr, "Could not initialize plugin!\n");
149       return 0;
150     }
151
152   if(!plugin_ipc_init())
153     {
154       fprintf(stderr, "Could not initialize plugin IPC!\n");
155       return 0;
156     }
157
158   return 1;
159
160 }
161
162
163
164 int
165 fetch_olsrd_data()
166 {
167   int retval = 1;
168
169   
170   /* Neighbor table */
171   if(!olsr_plugin_io(GETD__NEIGHBORTABLE, 
172                      &neighbortable, 
173                      sizeof(neighbortable)))
174   {
175     neighbortable = NULL;
176     retval = 0;
177   }
178   
179   /* Two hop neighbor table */
180   if(!olsr_plugin_io(GETD__TWO_HOP_NEIGHBORTABLE, 
181                      &two_hop_neighbortable, 
182                      sizeof(two_hop_neighbortable)))
183   {
184     two_hop_neighbortable = NULL;
185     retval = 0;
186   }
187
188   /* Topoloy table */
189   if(!olsr_plugin_io(GETD__TC_TABLE, 
190                      &tc_table, 
191                      sizeof(tc_table)))
192   {
193     tc_table = NULL;
194     retval = 0;
195   }
196
197   /* HNA table */
198   if(!olsr_plugin_io(GETD__HNA_SET, 
199                      &hna_set, 
200                      sizeof(hna_set)))
201   {
202     hna_set = NULL;
203     retval = 0;
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 malloc wrapper */
216   if(!olsr_plugin_io(GETF__OLSR_MALLOC, 
217                      &olsr_malloc, 
218                      sizeof(olsr_malloc)))
219   {
220     olsr_malloc = NULL;
221     retval = 0;
222   }
223
224   /* "ProcessChanges" event registration */
225   if(!olsr_plugin_io(GETF__REGISTER_PCF, 
226                      &register_pcf, 
227                      sizeof(register_pcf)))
228   {
229     register_pcf = NULL;
230     retval = 0;
231   }
232
233
234
235   /* Add socket to OLSR select function */
236   if(!olsr_plugin_io(GETF__ADD_OLSR_SOCKET, &add_olsr_socket, sizeof(add_olsr_socket)))
237   {
238     add_olsr_socket = NULL;
239     retval = 0;
240   }
241
242   /* Remove socket from OLSR select function */
243   if(!olsr_plugin_io(GETF__REMOVE_OLSR_SOCKET, &remove_olsr_socket, sizeof(remove_olsr_socket)))
244   {
245     remove_olsr_socket = NULL;
246     retval = 0;
247   }
248
249   return retval;
250
251 }