sgw: add SmartGatewayMaxCostMaxEtx configuration setting
[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_MAX_COST_MAX_ETX     2560
121 #define DEF_GW_TYPE          GW_UPLINK_IPV46
122 #define DEF_GW_UPLINK_NAT    true
123 #define DEF_UPLINK_SPEED     128
124 #define DEF_DOWNLINK_SPEED   1024
125 #define DEF_USE_SRCIP_ROUTES false
126
127 #define DEF_IF_MODE          IF_MODE_MESH
128
129 /* Bounds */
130
131 #define MIN_INTERVAL         0.01
132
133 #define MAX_POLLRATE         1.0
134 #define MIN_POLLRATE         0.01
135 #define MAX_NICCHGPOLLRT     100.0
136 #define MIN_NICCHGPOLLRT     1.0
137 #define MAX_DEBUGLVL         9
138 #define MIN_DEBUGLVL         0
139 #define MAX_TOS              252
140 #define MIN_TOS              0
141 #define MAX_WILLINGNESS      7
142 #define MIN_WILLINGNESS      0
143 #define MAX_MPR_COVERAGE     20
144 #define MIN_MPR_COVERAGE     1
145 #define MAX_TC_REDUNDANCY    2
146 #define MIN_TC_REDUNDANCY    0
147 #define MAX_HYST_PARAM       1.0
148 #define MIN_HYST_PARAM       0.0
149 #define MAX_LQ_LEVEL         2
150 #define MIN_LQ_LEVEL         0
151 #define MAX_LQ_AGING         1.0
152 #define MIN_LQ_AGING         0.01
153
154 #define MIN_SMARTGW_USE_COUNT_MIN  1
155 #define MAX_SMARTGW_USE_COUNT_MAX  64
156
157 #define MIN_SMARTGW_EGRESS_FILE_PERIOD 1000
158
159 #define MAX_SMARTGW_EGRESS_INTERFACE_COUNT_MAX 32
160
161 #define MIN_SMARTGW_PERIOD   1*1000
162 #define MAX_SMARTGW_PERIOD   320000*1000
163
164 #define MIN_SMARTGW_STABLE   1
165 #define MAX_SMARTGW_STABLE   254
166
167 #define MIN_SMARTGW_THRES    10
168 #define MAX_SMARTGW_THRES    100
169
170 #define MIN_SMARTGW_SPEED    1
171 #define MAX_SMARTGW_SPEED    320000000
172
173 #ifndef IPV6_ADDR_SITELOCAL
174 #define IPV6_ADDR_SITELOCAL    0x0040U
175 #endif /* IPV6_ADDR_SITELOCAL */
176
177 #include "interfaces.h"
178
179 enum smart_gw_uplinktype {
180   GW_UPLINK_NONE,
181   GW_UPLINK_IPV4,
182   GW_UPLINK_IPV6,
183   GW_UPLINK_IPV46,
184   GW_UPLINK_CNT,
185 };
186
187
188 typedef enum {
189   FIBM_FLAT,
190   FIBM_CORRECT,
191   FIBM_APPROX,
192   FIBM_CNT
193 } olsr_fib_metric_options;
194
195 enum olsr_if_mode {
196   IF_MODE_MESH,
197   IF_MODE_ETHER,
198   IF_MODE_CNT
199 };
200
201
202 struct olsr_msg_params {
203   float emission_interval;
204   float validity_time;
205 };
206
207 struct olsr_lq_mult {
208   union olsr_ip_addr addr;
209   uint32_t value;
210   struct olsr_lq_mult *next;
211 };
212
213 struct olsr_if_weight {
214   int value;
215   bool fixed;
216 };
217
218 struct if_config_options {
219   union olsr_ip_addr ipv4_multicast;
220   union olsr_ip_addr ipv6_multicast;
221
222   union olsr_ip_addr ipv4_src;
223   struct olsr_ip_prefix ipv6_src;
224
225   int mode;
226
227   struct olsr_if_weight weight;
228   struct olsr_msg_params hello_params;
229   struct olsr_msg_params tc_params;
230   struct olsr_msg_params mid_params;
231   struct olsr_msg_params hna_params;
232   struct olsr_lq_mult *lq_mult;
233   int orig_lq_mult_cnt;
234   bool autodetect_chg;
235 };
236
237 struct olsr_if {
238   char *name;
239   bool configured;
240   bool host_emul;
241   union olsr_ip_addr hemu_ip;
242   struct interface_olsr *interf;
243   struct if_config_options *cnf, *cnfi;
244   struct olsr_if *next;
245 };
246
247 struct ip_prefix_list {
248   struct olsr_ip_prefix net;
249   struct ip_prefix_list *next;
250 };
251
252 struct hyst_param {
253   float scaling;
254   float thr_high;
255   float thr_low;
256 };
257
258 struct plugin_param {
259   char *key;
260   char *value;
261   struct plugin_param *next;
262 };
263
264 struct plugin_entry {
265   char *name;
266   struct plugin_param *params;
267   struct plugin_entry *next;
268 };
269
270 /*
271  * The config struct
272  */
273
274 struct olsrd_config {
275   char * configuration_file;
276   uint16_t olsrport;
277   int debug_level;
278   bool no_fork;
279   char * pidfile;
280   bool host_emul;
281   int ip_version;
282   bool allow_no_interfaces;
283   uint8_t tos;
284   uint8_t rt_proto;
285   uint8_t rt_table, rt_table_default, rt_table_tunnel;
286   int32_t rt_table_pri, rt_table_tunnel_pri;
287   int32_t rt_table_defaultolsr_pri, rt_table_default_pri;
288   uint8_t willingness;
289   bool willingness_auto;
290   int ipc_connections;
291   bool use_hysteresis;
292   olsr_fib_metric_options fib_metric;
293   int fib_metric_default;
294   struct hyst_param hysteresis_param;
295   struct plugin_entry *plugins;
296   struct ip_prefix_list *hna_entries;
297   struct ip_prefix_list *ipc_nets;
298   struct if_config_options *interface_defaults;
299   struct olsr_if *interfaces;
300   float pollrate;
301   float nic_chgs_pollrate;
302   bool clear_screen;
303   uint8_t tc_redundancy;
304   uint8_t mpr_coverage;
305   uint8_t lq_level;
306   uint8_t lq_fish;
307   float lq_aging;
308   char *lq_algorithm;
309
310   float min_tc_vtime;
311
312   bool set_ip_forward;
313
314   char *lock_file;
315   bool use_niit;
316
317   bool smart_gw_active, smart_gw_always_remove_server_tunnel, smart_gw_allow_nat, smart_gw_uplink_nat;
318   uint8_t smart_gw_use_count;
319   uint8_t smart_gw_takedown_percentage;
320   char *smart_gw_policyrouting_script;
321   struct sgw_egress_if * smart_gw_egress_interfaces;
322   uint8_t smart_gw_egress_interfaces_count;
323   char *smart_gw_egress_file;
324   uint32_t smart_gw_egress_file_period;
325   char *smart_gw_status_file;
326   uint32_t smart_gw_offset_tables;
327   uint32_t smart_gw_offset_rules;
328   uint32_t smart_gw_period;
329   uint8_t smart_gw_stablecount;
330   uint8_t smart_gw_thresh;
331   uint8_t smart_gw_weight_exitlink_up;
332   uint8_t smart_gw_weight_exitlink_down;
333   uint8_t smart_gw_weight_etx;
334   uint32_t smart_gw_divider_etx;
335   uint32_t smart_gw_path_max_cost_etx_max;
336   enum smart_gw_uplinktype smart_gw_type;
337   uint32_t smart_gw_uplink, smart_gw_downlink;
338   bool smart_gateway_bandwidth_zero;
339   struct olsr_ip_prefix smart_gw_prefix;
340
341   /* Main address of this node */
342   union olsr_ip_addr main_addr, unicast_src_ip;
343   bool use_src_ip_routes;
344
345   /* Stuff set by olsrd */
346   uint8_t maxplen;                     /* maximum prefix len */
347   size_t ipsize;                       /* Size of address */
348   bool del_gws;                        /* Delete InternetGWs at startup */
349   float will_int;
350   float max_jitter;
351   int exit_value;                      /* Global return value for process termination */
352   float max_tc_vtime;
353
354   int niit4to6_if_index, niit6to4_if_index;
355
356   /*many potential parameters or helper variables for smartgateway*/
357   bool has_ipv4_gateway, has_ipv6_gateway;
358
359   int ioctl_s;                         /* Socket used for ioctl calls */
360 #ifdef __linux__
361   int rtnl_s;                          /* Socket used for rtnetlink messages */
362   int rt_monitor_socket;
363 #endif /* __linux__ */
364
365 #if defined __FreeBSD__ || defined __FreeBSD_kernel__ || defined __APPLE__ || defined __NetBSD__ || defined __OpenBSD__
366   int rts;                             /* Socket used for route changes on BSDs */
367 #endif /* defined __FreeBSD__ || defined __FreeBSD_kernel__ || defined __APPLE__ || defined __NetBSD__ || defined __OpenBSD__ */
368   float lq_nat_thresh;
369
370 #ifdef HTTPINFO_PUD
371   TransmitGpsInformation * pud_position;
372 #endif /* HTTPINFO_PUD */
373 };
374
375 #if defined __cplusplus
376 extern "C" {
377 #endif /* defined __cplusplus */
378
379   extern const char *GW_UPLINK_TXT[];
380   extern const char *FIB_METRIC_TXT[];
381   extern const char *OLSR_IF_MODE[];
382
383 /*
384  * List functions
385  */
386
387   /**
388    * Count the number of olsr interfaces
389    *
390    * @return the number of olsr interfaces
391    */
392   static inline unsigned int getNrOfOlsrInterfaces(struct olsrd_config * cfg) {
393     struct olsr_if * ifn;
394     unsigned int i = 0;
395
396       for (ifn = cfg->interfaces; ifn; ifn = ifn->next, i++) {}
397       return i;
398   }
399
400
401   void ip_prefix_list_add(struct ip_prefix_list **, const union olsr_ip_addr *, uint8_t);
402
403   int ip_prefix_list_remove(struct ip_prefix_list **, const union olsr_ip_addr *, uint8_t);
404
405   struct ip_prefix_list *ip_prefix_list_find(struct ip_prefix_list *, const union olsr_ip_addr *net, uint8_t prefix_len);
406
407 /*
408  * Interface to parser
409  */
410
411   int olsrd_parse_cnf(const char *);
412
413   int olsrd_sanity_check_cnf(struct olsrd_config *);
414
415   void olsrd_free_cnf(struct olsrd_config *);
416
417   void olsrd_print_cnf(struct olsrd_config *);
418
419   void olsrd_write_cnf_autobuf(struct autobuf *out, struct olsrd_config *cnf);
420
421   int olsrd_write_cnf(struct olsrd_config *, const char *);
422
423   struct if_config_options *get_default_if_config(void);
424
425   struct olsrd_config *olsrd_get_default_cnf(char * configuration_file);
426
427 #if defined _WIN32
428   void win32_stdio_hack(unsigned int);
429
430   void *win32_olsrd_malloc(size_t size);
431
432   void win32_olsrd_free(void *ptr);
433 #endif /* defined _WIN32 */
434
435   /*
436    * Smart-Gateway uplink/downlink accessors
437    */
438
439   static inline void set_smart_gateway_bandwidth_zero(struct olsrd_config *cnf) {
440     cnf->smart_gateway_bandwidth_zero = !cnf->smart_gw_uplink || !cnf->smart_gw_downlink;
441   }
442
443   static inline void smartgw_set_uplink(struct olsrd_config *cnf, uint32_t uplink) {
444     cnf->smart_gw_uplink = uplink;
445     set_smart_gateway_bandwidth_zero(cnf);
446   }
447
448   static inline void smartgw_set_downlink(struct olsrd_config *cnf, uint32_t downlink) {
449     cnf->smart_gw_downlink = downlink;
450     set_smart_gateway_bandwidth_zero(cnf);
451   }
452
453   static inline bool smartgw_is_zero_bandwidth(struct olsrd_config *cnf) {
454     return cnf->smart_gateway_bandwidth_zero;
455   }
456
457 #if defined __cplusplus
458 }
459 #endif /* defined __cplusplus */
460 #endif /* _OLSRD_CFGPARSER_H */
461
462 /*
463  * Local Variables:
464  * c-basic-offset: 2
465  * indent-tabs-mode: nil
466  * End:
467  */