all: ensure all files have the same license header
[olsrd.git] / lib / info / info_types.h
1 /*
2  * The olsr.org Optimized Link-State Routing daemon (olsrd)
3  *
4  * (c) by the OLSR project
5  *
6  * See our Git repository to find out who worked on this file
7  * and thus is a copyright holder on it.
8  *
9  * All rights reserved.
10  *
11  * Redistribution and use in source and binary forms, with or without
12  * modification, are permitted provided that the following conditions
13  * are met:
14  *
15  * * Redistributions of source code must retain the above copyright
16  *   notice, this list of conditions and the following disclaimer.
17  * * Redistributions in binary form must reproduce the above copyright
18  *   notice, this list of conditions and the following disclaimer in
19  *   the documentation and/or other materials provided with the
20  *   distribution.
21  * * Neither the name of olsr.org, olsrd nor the names of its
22  *   contributors may be used to endorse or promote products derived
23  *   from this software without specific prior written permission.
24  *
25  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
26  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
27  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
28  * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
29  * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
30  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
31  * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
32  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
33  * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
34  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
35  * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
36  * POSSIBILITY OF SUCH DAMAGE.
37  *
38  * Visit http://www.olsr.org for more information.
39  *
40  * If you find this software useful feel free to make a donation
41  * to the project. For more information see the website or contact
42  * the copyright holders.
43  *
44  */
45
46 #ifndef _OLSRD_LIB_INFO_INFO_TYPES_H_
47 #define _OLSRD_LIB_INFO_INFO_TYPES_H_
48
49 #include <stdbool.h>
50 #include <assert.h>
51 #include <netinet/in.h>
52
53 #include "common/autobuf.h"
54
55 #define CACHE_TIMEOUT_DEFAULT 1000
56
57 typedef struct {
58     union olsr_ip_addr accept_ip;
59     union olsr_ip_addr listen_ip;
60     int ipc_port;
61     bool http_headers;
62     bool allow_localhost;
63     bool ipv6_only;
64     long cache_timeout;
65 } info_plugin_config_t;
66
67 #define INFO_PLUGIN_CONFIG_PLUGIN_PARAMETERS(config) \
68   { .name = "port", .set_plugin_parameter = &set_plugin_port, .data = &config.ipc_port }, \
69   { .name = "accept", .set_plugin_parameter = &set_plugin_ipaddress, .data = &config.accept_ip }, \
70   { .name = "listen", .set_plugin_parameter = &set_plugin_ipaddress, .data = &config.listen_ip }, \
71   { .name = "httpheaders", .set_plugin_parameter = &set_plugin_boolean, .data = &config.http_headers }, \
72   { .name = "allowlocalhost", .set_plugin_parameter = &set_plugin_boolean, .data = &config.allow_localhost }, \
73   { .name = "ipv6only", .set_plugin_parameter = &set_plugin_boolean, .data = &config.ipv6_only },\
74   { .name = "cachetimeout", .set_plugin_parameter = &set_plugin_long, .data = &config.cache_timeout }
75
76 /* these provide all of the runtime status info */
77 #define SIW_NEIGHBORS                    (1ULL <<  0)
78 #define SIW_LINKS                        (1ULL <<  1)
79 #define SIW_ROUTES                       (1ULL <<  2)
80 #define SIW_HNA                          (1ULL <<  3)
81 #define SIW_MID                          (1ULL <<  4)
82 #define SIW_TOPOLOGY                     (1ULL <<  5)
83 #define SIW_GATEWAYS                     (1ULL <<  6)
84 #define SIW_INTERFACES                   (1ULL <<  7)
85 #define SIW_2HOP                         (1ULL <<  8)
86 #define SIW_SGW                          (1ULL <<  9)
87 #define SIW_RUNTIME_ALL                  (SIW_NEIGHBORS | SIW_LINKS | SIW_ROUTES | SIW_HNA | SIW_MID | SIW_TOPOLOGY | SIW_GATEWAYS | SIW_INTERFACES | SIW_2HOP | SIW_SGW)
88 #define SIW_NEIGHBORS_FREIFUNK           (SIW_NEIGHBORS | SIW_LINKS) /* special */
89
90 /* these only change at olsrd startup */
91 #define SIW_VERSION                      (1ULL << 10)
92 #define SIW_CONFIG                       (1ULL << 11)
93 #define SIW_PLUGINS                      (1ULL << 12)
94 #define SIW_STARTUP_ALL                  (SIW_VERSION | SIW_CONFIG | SIW_PLUGINS)
95
96 /* this is everything in normal format */
97 #define SIW_ALL                          (SIW_RUNTIME_ALL | SIW_STARTUP_ALL)
98
99 /* this data is not normal format but olsrd.conf format */
100 #define SIW_OLSRD_CONF                   (1ULL << 13)
101
102 /* everything */
103 #define SIW_EVERYTHING                   ((1ULL << 14) - 1)
104
105 typedef void (*init_plugin)(const char *plugin_name);
106 typedef unsigned long long (*supported_commands_mask_func)(void);
107 typedef bool (*command_matcher)(const char *str, unsigned long long siw);
108 typedef long (*cache_timeout_func)(info_plugin_config_t *plugin_config, unsigned long long siw);
109 typedef const char * (*mime_type)(unsigned int send_what);
110 typedef void (*output_start_end)(struct autobuf *abuf);
111 typedef void (*printer_error)(struct autobuf *abuf, unsigned int status, const char * req, bool http_headers);
112 typedef void (*printer_generic)(struct autobuf *abuf);
113
114 typedef struct {
115     bool supportsCompositeCommands;
116     init_plugin init;
117     supported_commands_mask_func supported_commands_mask;
118     command_matcher is_command;
119     cache_timeout_func cache_timeout;
120     mime_type determine_mime_type;
121     output_start_end output_start;
122     output_start_end output_end;
123     printer_error output_error;
124     printer_generic neighbors;
125     printer_generic links;
126     printer_generic routes;
127     printer_generic topology;
128     printer_generic hna;
129     printer_generic mid;
130     printer_generic gateways;
131     printer_generic sgw;
132     printer_generic version;
133     printer_generic olsrd_conf;
134     printer_generic interfaces;
135     printer_generic twohop;
136     printer_generic config;
137     printer_generic plugins;
138 } info_plugin_functions_t;
139
140 struct info_cache_entry_t {
141     bool initialised;
142     long long timestamp;
143     struct autobuf buf;
144 };
145
146 struct info_cache_t {
147     struct info_cache_entry_t neighbors;
148     struct info_cache_entry_t links;
149     struct info_cache_entry_t routes;
150     struct info_cache_entry_t hna;
151     struct info_cache_entry_t mid;
152     struct info_cache_entry_t topology;
153     struct info_cache_entry_t gateways;
154     struct info_cache_entry_t interfaces;
155     struct info_cache_entry_t twohop;
156     struct info_cache_entry_t sgw;
157
158     struct info_cache_entry_t version;
159     struct info_cache_entry_t config;
160     struct info_cache_entry_t plugins;
161 };
162
163 static INLINE struct info_cache_entry_t * info_cache_get_entry(struct info_cache_t * cache, unsigned long long siw) {
164   struct info_cache_entry_t * r = NULL;
165
166   if (!cache) {
167     return r;
168   }
169
170   switch (siw) {
171     case SIW_NEIGHBORS:
172       r = &cache->neighbors;
173       break;
174
175     case SIW_LINKS:
176       r = &cache->links;
177       break;
178
179     case SIW_ROUTES:
180       r = &cache->routes;
181       break;
182
183     case SIW_HNA:
184       r = &cache->hna;
185       break;
186
187     case SIW_MID:
188       r = &cache->mid;
189       break;
190
191     case SIW_TOPOLOGY:
192       r = &cache->topology;
193       break;
194
195     case SIW_GATEWAYS:
196       r = &cache->gateways;
197       break;
198
199     case SIW_INTERFACES:
200       r = &cache->interfaces;
201       break;
202
203     case SIW_2HOP:
204       r = &cache->twohop;
205       break;
206
207     case SIW_SGW:
208       r = &cache->sgw;
209       break;
210
211     case SIW_VERSION:
212       r = &cache->version;
213       break;
214
215     case SIW_CONFIG:
216       r = &cache->config;
217       break;
218
219     case SIW_PLUGINS:
220       r = &cache->plugins;
221       break;
222
223     default:
224       /* not cached */
225       break;
226   }
227
228   return r;
229 }
230
231 static INLINE void info_plugin_config_init(info_plugin_config_t *config, unsigned short port) {
232   assert(config);
233
234   if (olsr_cnf->ip_version == AF_INET) {
235     config->accept_ip.v4.s_addr = htonl(INADDR_LOOPBACK);
236     config->listen_ip.v4.s_addr = htonl(INADDR_ANY);
237   } else {
238     config->accept_ip.v6 = in6addr_loopback;
239     config->listen_ip.v6 = in6addr_any;
240   }
241
242   config->ipc_port = port;
243   config->http_headers = true;
244   config->allow_localhost = false;
245   config->ipv6_only = false;
246   config->cache_timeout = CACHE_TIMEOUT_DEFAULT;
247 }
248
249 #endif /* _OLSRD_LIB_INFO_INFO_TYPES_H_ */