00cda23c81314e8f9f603006b3253f9dfa6822d7
[olsrd.git] / src / olsr_cfg.h
1
2 /*
3  * The olsr.org Optimized Link-State Routing daemon(olsrd)
4  * Copyright (c) 2004, Andreas Tonnesen(andreto@olsr.org)
5  * All rights reserved.
6  *
7  * Redistribution and use in source and binary forms, with or without
8  * modification, are permitted provided that the following conditions
9  * are met:
10  *
11  * * Redistributions of source code must retain the above copyright
12  *   notice, this list of conditions and the following disclaimer.
13  * * Redistributions in binary form must reproduce the above copyright
14  *   notice, this list of conditions and the following disclaimer in
15  *   the documentation and/or other materials provided with the
16  *   distribution.
17  * * Neither the name of olsr.org, olsrd nor the names of its
18  *   contributors may be used to endorse or promote products derived
19  *   from this software without specific prior written permission.
20  *
21  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
22  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
23  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
24  * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
25  * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
26  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
27  * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
28  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
29  * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
30  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
31  * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
32  * POSSIBILITY OF SUCH DAMAGE.
33  *
34  * Visit http://www.olsr.org for more information.
35  *
36  * If you find this software useful feel free to make a donation
37  * to the project. For more information see the website or contact
38  * the copyright holders.
39  *
40  */
41
42 #ifndef _OLSRD_CFGPARSER_H
43 #define _OLSRD_CFGPARSER_H
44
45 #include "olsr_types.h"
46 #include "common/autobuf.h"
47 #ifdef HTTPINFO_PUD
48 #include "pud/src/receiver.h"
49 #endif /* HTTPINFO_PUD */
50
51 /* set to 1 to collect all startup sleep into one sleep
52  * (just as long as the longest sleep)
53  * useful if many errors on many interfaces */
54 #define OLSR_COLLECT_STARTUP_SLEEP 1
55
56 #define TESTLIB_PATH 0
57 #define SYSLOG_NUMBERING 0
58
59 /* Default values not declared in olsr_protocol.h */
60 #define DEF_IP_VERSION       AF_INET
61 #define DEF_POLLRATE         0.05
62 #define DEF_NICCHGPOLLRT     2.5
63 #define DEF_WILL_AUTO        false
64 #define DEF_WILLINGNESS      3
65 #define DEF_ALLOW_NO_INTS    true
66 #define DEF_TOS              192
67 #define DEF_DEBUGLVL         1
68 #define DEF_IPC_CONNECTIONS  0
69 #define DEF_USE_HYST         false
70 #define DEF_FIB_METRIC       FIBM_FLAT
71 #define DEF_FIB_METRIC_DEFAULT            2
72 #define DEF_LQ_LEVEL         2
73 #define DEF_LQ_ALGORITHM     "etx_ff"
74 #define DEF_LQ_FISH          1
75 #define DEF_LQ_NAT_THRESH    1.0
76 #define DEF_LQ_AGING         0.05
77 #define DEF_CLEAR_SCREEN     true
78 #define DEF_OLSRPORT         698
79 #define DEF_RTPROTO          0 /* 0 means OS-specific default */
80 #define DEF_RT_NONE          -1
81 #define DEF_RT_AUTO          0
82
83 #define DEF_RT_TABLE_NR                   254
84 #define DEF_RT_TABLE_DEFAULT_NR           254
85 #define DEF_RT_TABLE_TUNNEL_NR            254
86
87 #define DEF_SGW_RT_TABLE_NR               254
88 #define DEF_SGW_RT_TABLE_DEFAULT_NR       223
89 #define DEF_SGW_RT_TABLE_TUNNEL_NR        224
90
91 #define DEF_RT_TABLE_PRI                  DEF_RT_NONE
92 #define DEF_RT_TABLE_DEFAULTOLSR_PRI      DEF_RT_NONE
93 #define DEF_RT_TABLE_TUNNEL_PRI           DEF_RT_NONE
94 #define DEF_RT_TABLE_DEFAULT_PRI          DEF_RT_NONE
95
96 #define DEF_SGW_RT_TABLE_PRI                    DEF_RT_NONE
97 #define DEF_SGW_RT_TABLE_PRI_BASE               32766
98 #define DEF_SGW_RT_TABLE_DEFAULTOLSR_PRI_ADDER  10
99 #define DEF_SGW_RT_TABLE_TUNNEL_PRI_ADDER       10
100 #define DEF_SGW_RT_TABLE_DEFAULT_PRI_ADDER      10
101
102 #define DEF_MIN_TC_VTIME     0.0
103 #define DEF_USE_NIIT         true
104 #define DEF_SMART_GW         false
105 #define DEF_SMART_GW_ALWAYS_REMOVE_SERVER_TUNNEL  false
106 #define DEF_GW_USE_COUNT     1
107 #define DEF_GW_TAKEDOWN_PERCENTAGE 25
108 #define DEF_GW_EGRESS_FILE    "/var/run/olsrd-sgw-egress.conf"
109 #define DEF_GW_EGRESS_FILE_PERIOD 5000
110 #define DEF_GW_OFFSET_TABLES 90
111 #define DEF_GW_OFFSET_RULES  0
112 #define DEF_GW_PERIOD        10*1000
113 #define DEF_GW_STABLE_COUNT  6
114 #define DEF_GW_ALLOW_NAT     true
115 #define DEF_GW_THRESH        0
116 #define DEF_GW_WEIGHT_EXITLINK_UP   1
117 #define DEF_GW_WEIGHT_EXITLINK_DOWN 1
118 #define DEF_GW_WEIGHT_ETX           1
119 #define DEF_GW_DIVIDER_ETX          0
120 #define DEF_GW_TYPE          GW_UPLINK_IPV46
121 #define DEF_GW_UPLINK_NAT    true
122 #define DEF_UPLINK_SPEED     128
123 #define DEF_DOWNLINK_SPEED   1024
124 #define DEF_USE_SRCIP_ROUTES false
125
126 #define DEF_IF_MODE          IF_MODE_MESH
127
128 /* Bounds */
129
130 #define MIN_INTERVAL         0.01
131
132 #define MAX_POLLRATE         1.0
133 #define MIN_POLLRATE         0.01
134 #define MAX_NICCHGPOLLRT     100.0
135 #define MIN_NICCHGPOLLRT     1.0
136 #define MAX_DEBUGLVL         9
137 #define MIN_DEBUGLVL         0
138 #define MAX_TOS              252
139 #define MIN_TOS              0
140 #define MAX_WILLINGNESS      7
141 #define MIN_WILLINGNESS      0
142 #define MAX_MPR_COVERAGE     20
143 #define MIN_MPR_COVERAGE     1
144 #define MAX_TC_REDUNDANCY    2
145 #define MIN_TC_REDUNDANCY    0
146 #define MAX_HYST_PARAM       1.0
147 #define MIN_HYST_PARAM       0.0
148 #define MAX_LQ_LEVEL         2
149 #define MIN_LQ_LEVEL         0
150 #define MAX_LQ_AGING         1.0
151 #define MIN_LQ_AGING         0.01
152
153 #define MIN_SMARTGW_USE_COUNT_MIN  1
154 #define MAX_SMARTGW_USE_COUNT_MAX  64
155
156 #define MIN_SMARTGW_EGRESS_FILE_PERIOD 1000
157
158 #define MAX_SMARTGW_EGRESS_INTERFACE_COUNT_MAX 32
159
160 #define MIN_SMARTGW_PERIOD   1*1000
161 #define MAX_SMARTGW_PERIOD   320000*1000
162
163 #define MIN_SMARTGW_STABLE   1
164 #define MAX_SMARTGW_STABLE   254
165
166 #define MIN_SMARTGW_THRES    10
167 #define MAX_SMARTGW_THRES    100
168
169 #define MIN_SMARTGW_SPEED    1
170 #define MAX_SMARTGW_SPEED    320000000
171
172 #ifndef IPV6_ADDR_SITELOCAL
173 #define IPV6_ADDR_SITELOCAL    0x0040U
174 #endif /* IPV6_ADDR_SITELOCAL */
175
176 #include "interfaces.h"
177
178 enum smart_gw_uplinktype {
179   GW_UPLINK_NONE,
180   GW_UPLINK_IPV4,
181   GW_UPLINK_IPV6,
182   GW_UPLINK_IPV46,
183   GW_UPLINK_CNT,
184 };
185
186
187 typedef enum {
188   FIBM_FLAT,
189   FIBM_CORRECT,
190   FIBM_APPROX,
191   FIBM_CNT
192 } olsr_fib_metric_options;
193
194 enum olsr_if_mode {
195   IF_MODE_MESH,
196   IF_MODE_ETHER,
197   IF_MODE_CNT
198 };
199
200
201 struct olsr_msg_params {
202   float emission_interval;
203   float validity_time;
204 };
205
206 struct olsr_lq_mult {
207   union olsr_ip_addr addr;
208   uint32_t value;
209   struct olsr_lq_mult *next;
210 };
211
212 struct olsr_if_weight {
213   int value;
214   bool fixed;
215 };
216
217 struct if_config_options {
218   union olsr_ip_addr ipv4_multicast;
219   union olsr_ip_addr ipv6_multicast;
220
221   union olsr_ip_addr ipv4_src;
222   struct olsr_ip_prefix ipv6_src;
223
224   int mode;
225
226   struct olsr_if_weight weight;
227   struct olsr_msg_params hello_params;
228   struct olsr_msg_params tc_params;
229   struct olsr_msg_params mid_params;
230   struct olsr_msg_params hna_params;
231   struct olsr_lq_mult *lq_mult;
232   int orig_lq_mult_cnt;
233   bool autodetect_chg;
234 };
235
236 struct olsr_if {
237   char *name;
238   bool configured;
239   bool host_emul;
240   union olsr_ip_addr hemu_ip;
241   struct interface_olsr *interf;
242   struct if_config_options *cnf, *cnfi;
243   struct olsr_if *next;
244 };
245
246 struct ip_prefix_list {
247   struct olsr_ip_prefix net;
248   struct ip_prefix_list *next;
249 };
250
251 struct hyst_param {
252   float scaling;
253   float thr_high;
254   float thr_low;
255 };
256
257 struct plugin_param {
258   char *key;
259   char *value;
260   struct plugin_param *next;
261 };
262
263 struct plugin_entry {
264   char *name;
265   struct plugin_param *params;
266   struct plugin_entry *next;
267 };
268
269 /*
270  * The config struct
271  */
272
273 struct olsrd_config {
274   char * configuration_file;
275   uint16_t olsrport;
276   int debug_level;
277   bool no_fork;
278   char * pidfile;
279   bool host_emul;
280   int ip_version;
281   bool allow_no_interfaces;
282   uint8_t tos;
283   uint8_t rt_proto;
284   uint8_t rt_table, rt_table_default, rt_table_tunnel;
285   int32_t rt_table_pri, rt_table_tunnel_pri;
286   int32_t rt_table_defaultolsr_pri, rt_table_default_pri;
287   uint8_t willingness;
288   bool willingness_auto;
289   int ipc_connections;
290   bool use_hysteresis;
291   olsr_fib_metric_options fib_metric;
292   int fib_metric_default;
293   struct hyst_param hysteresis_param;
294   struct plugin_entry *plugins;
295   struct ip_prefix_list *hna_entries;
296   struct ip_prefix_list *ipc_nets;
297   struct if_config_options *interface_defaults;
298   struct olsr_if *interfaces;
299   float pollrate;
300   float nic_chgs_pollrate;
301   bool clear_screen;
302   uint8_t tc_redundancy;
303   uint8_t mpr_coverage;
304   uint8_t lq_level;
305   uint8_t lq_fish;
306   float lq_aging;
307   char *lq_algorithm;
308
309   float min_tc_vtime;
310
311   bool set_ip_forward;
312
313   char *lock_file;
314   bool use_niit;
315
316   bool smart_gw_active, smart_gw_always_remove_server_tunnel, smart_gw_allow_nat, smart_gw_uplink_nat;
317   uint8_t smart_gw_use_count;
318   uint8_t smart_gw_takedown_percentage;
319   char *smart_gw_policyrouting_script;
320   struct sgw_egress_if * smart_gw_egress_interfaces;
321   uint8_t smart_gw_egress_interfaces_count;
322   char *smart_gw_egress_file;
323   uint32_t smart_gw_egress_file_period;
324   char *smart_gw_status_file;
325   uint32_t smart_gw_offset_tables;
326   uint32_t smart_gw_offset_rules;
327   uint32_t smart_gw_period;
328   uint8_t smart_gw_stablecount;
329   uint8_t smart_gw_thresh;
330   uint8_t smart_gw_weight_exitlink_up;
331   uint8_t smart_gw_weight_exitlink_down;
332   uint8_t smart_gw_weight_etx;
333   uint32_t smart_gw_divider_etx;
334   enum smart_gw_uplinktype smart_gw_type;
335   uint32_t smart_gw_uplink, smart_gw_downlink;
336   struct olsr_ip_prefix smart_gw_prefix;
337
338   /* Main address of this node */
339   union olsr_ip_addr main_addr, unicast_src_ip;
340   bool use_src_ip_routes;
341
342   /* Stuff set by olsrd */
343   uint8_t maxplen;                     /* maximum prefix len */
344   size_t ipsize;                       /* Size of address */
345   bool del_gws;                        /* Delete InternetGWs at startup */
346   float will_int;
347   float max_jitter;
348   int exit_value;                      /* Global return value for process termination */
349   float max_tc_vtime;
350
351   int niit4to6_if_index, niit6to4_if_index;
352
353   /*many potential parameters or helper variables for smartgateway*/
354   bool has_ipv4_gateway, has_ipv6_gateway;
355
356   int ioctl_s;                         /* Socket used for ioctl calls */
357 #ifdef __linux__
358   int rtnl_s;                          /* Socket used for rtnetlink messages */
359   int rt_monitor_socket;
360 #endif /* __linux__ */
361
362 #if defined __FreeBSD__ || defined __FreeBSD_kernel__ || defined __APPLE__ || defined __NetBSD__ || defined __OpenBSD__
363   int rts;                             /* Socket used for route changes on BSDs */
364 #endif /* defined __FreeBSD__ || defined __FreeBSD_kernel__ || defined __APPLE__ || defined __NetBSD__ || defined __OpenBSD__ */
365   float lq_nat_thresh;
366
367 #ifdef HTTPINFO_PUD
368   TransmitGpsInformation * pud_position;
369 #endif /* HTTPINFO_PUD */
370 };
371
372 #if defined __cplusplus
373 extern "C" {
374 #endif /* defined __cplusplus */
375
376   extern const char *GW_UPLINK_TXT[];
377   extern const char *FIB_METRIC_TXT[];
378   extern const char *OLSR_IF_MODE[];
379
380 /*
381  * List functions
382  */
383
384   /**
385    * Count the number of olsr interfaces
386    *
387    * @return the number of olsr interfaces
388    */
389   static inline unsigned int getNrOfOlsrInterfaces(struct olsrd_config * cfg) {
390     struct olsr_if * ifn;
391     unsigned int i = 0;
392
393       for (ifn = cfg->interfaces; ifn; ifn = ifn->next, i++) {}
394       return i;
395   }
396
397
398   void ip_prefix_list_add(struct ip_prefix_list **, const union olsr_ip_addr *, uint8_t);
399
400   int ip_prefix_list_remove(struct ip_prefix_list **, const union olsr_ip_addr *, uint8_t);
401
402   struct ip_prefix_list *ip_prefix_list_find(struct ip_prefix_list *, const union olsr_ip_addr *net, uint8_t prefix_len);
403
404 /*
405  * Interface to parser
406  */
407
408   int olsrd_parse_cnf(const char *);
409
410   int olsrd_sanity_check_cnf(struct olsrd_config *);
411
412   void olsrd_free_cnf(struct olsrd_config *);
413
414   void olsrd_print_cnf(struct olsrd_config *);
415
416   void olsrd_write_cnf_autobuf(struct autobuf *out, struct olsrd_config *cnf);
417
418   int olsrd_write_cnf(struct olsrd_config *, const char *);
419
420   struct if_config_options *get_default_if_config(void);
421
422   struct olsrd_config *olsrd_get_default_cnf(char * configuration_file);
423
424 #if defined _WIN32
425   void win32_stdio_hack(unsigned int);
426
427   void *win32_olsrd_malloc(size_t size);
428
429   void win32_olsrd_free(void *ptr);
430 #endif /* defined _WIN32 */
431
432 #if defined __cplusplus
433 }
434 #endif /* defined __cplusplus */
435 #endif /* _OLSRD_CFGPARSER_H */
436
437 /*
438  * Local Variables:
439  * c-basic-offset: 2
440  * indent-tabs-mode: nil
441  * End:
442  */