Removed me_to_double use. Replaced with macro
[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.10 2005/05/25 13:41:47 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 #include "olsr_types.h"
51 #include "interfaces.h"
52 #include "apm.h"
53
54 /* Use this as PARSER_TYPE to receive ALL messages! */
55 #define PROMISCUOUS 0xffffffff
56
57
58 /*****************************************************************************
59  *                               Plugin data                                 *
60  *                       ALTER THIS TO YOUR OWN NEED                         *
61  *****************************************************************************/
62
63 #define PLUGIN_NAME    "OLSRD Powerstatus plugin"
64 #define PLUGIN_VERSION "0.3"
65 #define PLUGIN_AUTHOR   "Andreas T√łnnesen"
66 #define MOD_DESC PLUGIN_NAME " " PLUGIN_VERSION " by " PLUGIN_AUTHOR
67 #define PLUGIN_INTERFACE_VERSION 3
68
69 /* The type of message you will use */
70 #define MESSAGE_TYPE 128
71
72 /* The type of messages we will receive - can be set to promiscuous */
73 #define PARSER_TYPE MESSAGE_TYPE
74
75
76 /*
77  * Scaling factor
78  */
79
80 #define VTIME_SCALE_FACTOR    0.0625
81
82 /**
83  * Macro for converting a mantissa/exponent 8bit value back
84  * to double as described in RFC3626:
85  *
86  * value = C*(1+a/16)*2^b [in seconds]
87  *
88  *  where a is the integer represented by the four highest bits of the
89  *  field and b the integer represented by the four lowest bits of the
90  *  field.
91  *
92  * me is the 8 bit mantissa/exponent value
93  *
94  */
95 #define ME_TO_DOUBLE(me) \
96   (double)(VTIME_SCALE_FACTOR*(1+(double)(me>>4)/16)*(double)(1<<(me&0x0F)))
97
98
99 /****************************************************************************
100  *           Various datastructures and definitions from olsrd              *
101  ****************************************************************************/
102
103
104 #define MAX_TTL               0xff
105
106
107 /*
108  *Link Types
109  */
110
111 #define UNSPEC_LINK           0
112 #define ASYM_LINK             1
113 #define SYM_LINK              2
114 #define LOST_LINK             3
115 #define HIDE_LINK             4
116 #define MAX_LINK              4
117
118
119
120 /*
121  * Hashing
122  */
123
124 #define HASHSIZE        32
125 #define HASHMASK        (HASHSIZE - 1)
126
127 #define MAXIFS         8 /* Maximum number of interfaces (from defs.h) in uOLSRd */
128
129
130 /****************************************************************************
131  *                            PACKET SECTION                                *
132  ****************************************************************************/
133
134
135 /**********************************
136  * DEFINE YOUR CUSTOM PACKET HERE *
137  **********************************/
138
139 struct powermsg
140 {
141   olsr_u8_t       source_type;
142   olsr_u8_t       percentage;
143   olsr_u16_t      time_left;
144 };
145
146 /*
147  * OLSR message (several can exist in one OLSR packet)
148  */
149
150 struct olsrmsg
151 {
152   olsr_u8_t     olsr_msgtype;
153   olsr_u8_t     olsr_vtime;
154   olsr_u16_t    olsr_msgsize;
155   olsr_u32_t    originator;
156   olsr_u8_t     ttl;
157   olsr_u8_t     hopcnt;
158   olsr_u16_t    seqno;
159
160   /* YOUR PACKET GOES HERE */
161   struct powermsg msg;
162
163 };
164
165 /*
166  *IPv6
167  */
168
169 struct olsrmsg6
170 {
171   olsr_u8_t        olsr_msgtype;
172   olsr_u8_t        olsr_vtime;
173   olsr_u16_t       olsr_msgsize;
174   struct in6_addr  originator;
175   olsr_u8_t        ttl;
176   olsr_u8_t        hopcnt;
177   olsr_u16_t       seqno;
178
179   /* YOUR PACKET GOES HERE */
180   struct powermsg msg;
181
182 };
183
184 /* 
185  * ALWAYS USE THESE WRAPPERS TO
186  * ENSURE IPv4 <-> IPv6 compability 
187  */
188
189 union olsr_message
190 {
191   struct olsrmsg v4;
192   struct olsrmsg6 v6;
193 };
194
195
196
197
198 /***************************************************************************
199  *                 Functions provided by uolsrd_plugin.c                   *
200  *                  Similar to their siblings in olsrd                     *
201  ***************************************************************************/
202
203 char ipv6_buf[100]; /* buffer for IPv6 inet_htop */
204
205 /* All these could optionally be fetched from olsrd */
206
207 olsr_u32_t
208 olsr_hashing(union olsr_ip_addr *);
209
210 void
211 olsr_get_timestamp(olsr_u32_t, struct timeval *);
212
213 void
214 olsr_init_timer(olsr_u32_t, struct timeval *);
215
216 int
217 olsr_timed_out(struct timeval *);
218
219 char *
220 olsr_ip_to_string(union olsr_ip_addr *);
221
222
223
224 /****************************************************************************
225  *                Function pointers to functions in olsrd                   *
226  *              These allow direct access to olsrd functions                *
227  ****************************************************************************/
228
229 /* The multi-purpose funtion. All other functions are fetched trough this */
230 int (*olsr_plugin_io)(int, void *, size_t);
231
232 /* add a prser function */
233 void (*olsr_parser_add_function)(void (*)(union olsr_message *, struct interface *, union olsr_ip_addr *), int, int);
234
235 /* Register a timeout function */
236 int (*olsr_register_timeout_function)(void (*)(void));
237
238 /* Register a scheduled event */
239 int (*olsr_register_scheduler_event)(void (*)(void *), void *, float, float, olsr_u8_t *);
240
241 /* Get the next message seqno in line */
242 olsr_u16_t (*get_msg_seqno)(void);
243
244 int (*net_outbuffer_push)(struct interface *, olsr_u8_t *, olsr_u16_t);
245
246 /* Transmit package */
247 int (*net_output)(struct interface*);
248
249 /* Check the duplicate table for prior processing */
250 int (*check_dup_proc)(union olsr_ip_addr *, olsr_u16_t);
251
252 /* Default forward algorithm */
253 int (*default_fwd)(union olsr_message *, 
254                    union olsr_ip_addr *, 
255                    olsr_u16_t,  
256                    struct interface *, 
257                    union olsr_ip_addr *);
258
259 /* Add a socket to the main olsrd select loop */
260 void (*add_olsr_socket)(int, void(*)(int));
261
262 /* get the link status to a neighbor */
263 int (*check_neighbor_link)(union olsr_ip_addr *);
264
265 /* Mantissa/exponent conversions */
266 olsr_u8_t (*double_to_me)(double);
267
268 /* olsrd printf wrapper */
269 int (*olsr_printf)(int, char *, ...);
270
271 /* olsrd malloc wrapper */
272 void *(*olsr_malloc)(size_t, const char *);
273
274 int (*apm_read)(struct olsr_apm_info *);
275
276
277 /****************************************************************************
278  *                             Data from olsrd                              *
279  *           NOTE THAT POINTERS POINT TO THE DATA USED BY OLSRD!            *
280  *               NEVER ALTER DATA POINTED TO BY THESE POINTERS              * 
281  *                   UNLESS YOU KNOW WHAT YOU ARE DOING!!!                  *
282  ****************************************************************************/
283 /**
284  * The interface list from olsrd
285  */
286
287 struct interface   *ifs;
288
289 /* These two are set automatically by olsrd at load time */
290 int                ipversion;  /* IPversion in use */
291 union olsr_ip_addr *main_addr; /* Main address */
292
293
294 size_t             ipsize;     /* Size of the ipadresses used */
295 struct timeval     *now;       /* the olsrds schedulers idea of current time */
296
297
298 /****************************************************************************
299  *                Functions that the plugin MUST provide                    *
300  ****************************************************************************/
301
302
303 /* Initialization function */
304 int
305 olsr_plugin_init(void);
306
307 /* IPC initialization function */
308 int
309 plugin_ipc_init(void);
310
311 int
312 register_olsr_param(char *, char *);
313
314 /* Destructor function */
315 void
316 olsr_plugin_exit(void);
317
318 /* Mulitpurpose funtion */
319 int
320 plugin_io(int, void *, size_t);
321
322 /* Plugin interface version */
323 int 
324 get_plugin_interface_version(void);
325
326 #endif