Makefile patches by Bruno added
[olsrd.git] / lib / powerinfo / src / olsrd_plugin.h
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 /* $Id: olsrd_plugin.h,v 1.3 2004/11/07 10:54:19 kattemat Exp $ */
33
34 /*
35  * Dynamic linked library example for UniK OLSRd
36  */
37
38 #ifndef _OLSRD_PLUGIN_DEFS
39 #define _OLSRD_PLUGIN_DEFS
40
41
42 #include <sys/socket.h>
43 #include <netinet/in.h>
44 #include <arpa/inet.h>
45 #include <sys/time.h>
46 #include <time.h>
47 #include <math.h>
48
49 #include "olsr_plugin_io.h"
50
51 /* Use this as PARSER_TYPE to receive ALL messages! */
52 #define PROMISCUOUS 0xffffffff
53
54
55 /*****************************************************************************
56  *                               Plugin data                                 *
57  *                       ALTER THIS TO YOUR OWN NEED                         *
58  *****************************************************************************/
59
60 #define PLUGIN_NAME    "OLSRD Powerstatus plugin"
61 #define PLUGIN_VERSION "0.3"
62 #define PLUGIN_AUTHOR   "Andreas T√łnnesen"
63 #define MOD_DESC PLUGIN_NAME " " PLUGIN_VERSION " by " PLUGIN_AUTHOR
64 #define PLUGIN_INTERFACE_VERSION 2
65
66 /* The type of message you will use */
67 #define MESSAGE_TYPE 128
68
69 /* The type of messages we will receive - can be set to promiscuous */
70 #define PARSER_TYPE MESSAGE_TYPE
71
72
73
74 /****************************************************************************
75  *           Various datastructures and definitions from olsrd              *
76  ****************************************************************************/
77
78 /*
79  * TYPES SECTION
80  */
81
82 /* types */
83 #include <sys/types.h>
84
85 typedef u_int8_t        olsr_u8_t;
86 typedef u_int16_t       olsr_u16_t;
87 typedef u_int32_t       olsr_u32_t;
88 typedef int8_t          olsr_8_t;
89 typedef int16_t         olsr_16_t;
90 typedef int32_t         olsr_32_t;
91
92
93
94 /*
95  * VARIOUS DEFINITIONS
96  */
97
98 union olsr_ip_addr
99 {
100   olsr_u32_t v4;
101   struct in6_addr v6;
102 };
103
104
105 #define MAX_TTL               0xff
106
107
108 /*
109  *Link Types
110  */
111
112 #define UNSPEC_LINK           0
113 #define ASYM_LINK             1
114 #define SYM_LINK              2
115 #define LOST_LINK             3
116 #define HIDE_LINK             4
117 #define MAX_LINK              4
118
119
120
121 /*
122  * Hashing
123  */
124
125 #define HASHSIZE        32
126 #define HASHMASK        (HASHSIZE - 1)
127
128 #define MAXIFS         8 /* Maximum number of interfaces (from defs.h) in uOLSRd */
129
130
131 /****************************************************************************
132  *                          INTERFACE SECTION                               *
133  ****************************************************************************/
134 struct vtimes
135 {
136   olsr_u8_t hello;
137   olsr_u8_t tc;
138   olsr_u8_t mid;
139   olsr_u8_t hna;
140 };
141
142 /**
143  *A struct containing all necessary information about each
144  *interface participating in the OLSD routing
145  */
146 struct interface 
147 {
148   /* IP version 4 */
149   struct        sockaddr int_addr;              /* address */
150   struct        sockaddr int_netmask;           /* netmask */
151   struct        sockaddr int_broadaddr;         /* broadcast address */
152   /* IP version 6 */
153   struct        sockaddr_in6 int6_addr;         /* Address */
154   struct        sockaddr_in6 int6_multaddr;     /* Multicast */
155   /* IP independent */
156   union         olsr_ip_addr ip_addr;
157   int           olsr_socket;                    /* The broadcast socket for this interface */
158   int           int_metric;                     /* metric of interface */
159   int           int_mtu;                        /* MTU of interface */
160   int           int_flags;                      /* see below */
161   char          *int_name;                      /* from kernel if structure */
162   int           if_index;                       /* Kernels index of this interface */
163   int           if_nr;                          /* This interfaces index internally*/
164   int           is_wireless;                    /* wireless interface or not*/
165   olsr_u16_t    olsr_seqnum;                    /* Olsr message seqno */
166
167   float         hello_etime;
168   struct        vtimes valtimes;
169
170   struct        interface *int_next;
171 };
172
173
174
175
176 /****************************************************************************
177  *                        POWERSTATUS SECTION                               *
178  ****************************************************************************/
179
180 #define OLSR_BATTERY_POWERED  0
181 #define OLSR_AC_POWERED       1
182
183 struct olsr_apm_info
184 {
185   int ac_line_status;
186   int battery_percentage;
187 };
188
189 /****************************************************************************
190  *                            PACKET SECTION                                *
191  ****************************************************************************/
192
193
194 /**********************************
195  * DEFINE YOUR CUSTOM PACKET HERE *
196  **********************************/
197
198 struct powermsg
199 {
200   olsr_u8_t       source_type;
201   olsr_u8_t       percentage;
202   olsr_u16_t      time_left;
203 };
204
205 /*
206  * OLSR message (several can exist in one OLSR packet)
207  */
208
209 struct olsrmsg
210 {
211   olsr_u8_t     olsr_msgtype;
212   olsr_u8_t     olsr_vtime;
213   olsr_u16_t    olsr_msgsize;
214   olsr_u32_t    originator;
215   olsr_u8_t     ttl;
216   olsr_u8_t     hopcnt;
217   olsr_u16_t    seqno;
218
219   /* YOUR PACKET GOES HERE */
220   struct powermsg msg;
221
222 };
223
224 /*
225  *IPv6
226  */
227
228 struct olsrmsg6
229 {
230   olsr_u8_t        olsr_msgtype;
231   olsr_u8_t        olsr_vtime;
232   olsr_u16_t       olsr_msgsize;
233   struct in6_addr  originator;
234   olsr_u8_t        ttl;
235   olsr_u8_t        hopcnt;
236   olsr_u16_t       seqno;
237
238   /* YOUR PACKET GOES HERE */
239   struct powermsg msg;
240
241 };
242
243 /* 
244  * ALWAYS USE THESE WRAPPERS TO
245  * ENSURE IPv4 <-> IPv6 compability 
246  */
247
248 union olsr_message
249 {
250   struct olsrmsg v4;
251   struct olsrmsg6 v6;
252 };
253
254
255
256
257 /***************************************************************************
258  *                 Functions provided by uolsrd_plugin.c                   *
259  *                  Similar to their siblings in olsrd                     *
260  ***************************************************************************/
261
262 char ipv6_buf[100]; /* buffer for IPv6 inet_htop */
263
264 /* All these could optionally be fetched from olsrd */
265
266 olsr_u32_t
267 olsr_hashing(union olsr_ip_addr *);
268
269 void
270 olsr_get_timestamp(olsr_u32_t, struct timeval *);
271
272 void
273 olsr_init_timer(olsr_u32_t, struct timeval *);
274
275 int
276 olsr_timed_out(struct timeval *);
277
278 char *
279 olsr_ip_to_string(union olsr_ip_addr *);
280
281
282
283 /****************************************************************************
284  *                Function pointers to functions in olsrd                   *
285  *              These allow direct access to olsrd functions                *
286  ****************************************************************************/
287
288 /* The multi-purpose funtion. All other functions are fetched trough this */
289 int (*olsr_plugin_io)(int, void *, size_t);
290
291 /* add a prser function */
292 void (*olsr_parser_add_function)(void (*)(union olsr_message *, struct interface *, union olsr_ip_addr *), int, int);
293
294 /* Register a timeout function */
295 int (*olsr_register_timeout_function)(void (*)());
296
297 /* Register a scheduled event */
298 int (*olsr_register_scheduler_event)(void (*)(), void *, float, float, olsr_u8_t *);
299
300 /* Get the next message seqno in line */
301 olsr_u16_t (*get_msg_seqno)();
302
303 int (*net_outbuffer_push)(struct interface *, olsr_u8_t *, olsr_u16_t);
304
305 /* Transmit package */
306 int (*net_output)(struct interface*);
307
308 /* Check the duplicate table for prior processing */
309 int (*check_dup_proc)(union olsr_ip_addr *, olsr_u16_t);
310
311 /* Default forward algorithm */
312 int (*default_fwd)(union olsr_message *, 
313                    union olsr_ip_addr *, 
314                    olsr_u16_t,  
315                    struct interface *, 
316                    union olsr_ip_addr *);
317
318 /* Add a socket to the main olsrd select loop */
319 void (*add_olsr_socket)(int, void(*)(int));
320
321 /* get the link status to a neighbor */
322 int (*check_neighbor_link)(union olsr_ip_addr *);
323
324 /* Mantissa/exponen conversions */
325 olsr_u8_t (*double_to_me)(double);
326
327 double (*me_to_double)(olsr_u8_t);
328
329 /* olsrd printf wrapper */
330 int (*olsr_printf)(int, char *, ...);
331
332 /* olsrd malloc wrapper */
333 void *(*olsr_malloc)(size_t, const char *);
334
335 int (*apm_read)(struct olsr_apm_info *);
336
337
338 /****************************************************************************
339  *                             Data from olsrd                              *
340  *           NOTE THAT POINTERS POINT TO THE DATA USED BY OLSRD!            *
341  *               NEVER ALTER DATA POINTED TO BY THESE POINTERS              * 
342  *                   UNLESS YOU KNOW WHAT YOU ARE DOING!!!                  *
343  ****************************************************************************/
344 /**
345  * The interface list from olsrd
346  */
347
348 struct interface   *ifs;
349
350 /* These two are set automatically by olsrd at load time */
351 int                ipversion;  /* IPversion in use */
352 union olsr_ip_addr *main_addr; /* Main address */
353
354
355 size_t             ipsize;     /* Size of the ipadresses used */
356 struct timeval     *now;       /* the olsrds schedulers idea of current time */
357
358
359 /****************************************************************************
360  *                Functions that the plugin MUST provide                    *
361  ****************************************************************************/
362
363
364 /* Initialization function */
365 int
366 olsr_plugin_init();
367
368 /* IPC initialization function */
369 int
370 plugin_ipc_init();
371
372 /* Destructor function */
373 void
374 olsr_plugin_exit();
375
376 /* Mulitpurpose funtion */
377 int
378 plugin_io(int, void *, size_t);
379
380 /* Plugin interface version */
381 int 
382 get_plugin_interface_version();
383
384 #endif