porting routing code from stable to master (and change many arm-nowarn-alignments)
[olsrd.git] / src / olsr_cfg.h
1
2 /*
3  * The olsr.org Optimized Link-State Routing daemon(olsrd)
4  * Copyright (c) 2004-2009, the olsr.org team - see HISTORY file
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_CFG_H
43 #define _OLSRD_CFG_H
44
45 /* Default values not declared in olsr_protocol.h */
46 #define DEF_POLLRATE           50
47 #define DEF_NICCHGPOLLRT       2500
48 #define DEF_WILL_AUTO          true
49 #define DEF_ALLOW_NO_INTS      true
50 #define DEF_TOS                16
51 #define DEF_DEBUGLVL           "0"
52 #define DEF_IPC_CONNECTIONS    0
53 #define DEF_FIB_METRIC         FIBM_FLAT
54 #define DEF_LQ_ALWAYS_SEND_TC  true
55 #define DEF_LQ_FISH            0
56 #define DEF_LQ_DIJK_LIMIT      255
57 #define DEF_LQ_DIJK_INTER      0
58 #define DEF_LQ_NAT_THRESH      1000
59 #define DEF_CLEAR_SCREEN       false
60 #define DEF_HTTPPORT           8080
61 #define DEF_HTTPLIMIT          3
62 #define DEF_TXTPORT            2006
63 #define DEF_TXTLIMIT           3
64
65 /* Bounds */
66
67 #define MIN_INTERVAL        0.01
68
69 #define MAX_POLLRATE        10000
70 #define MIN_POLLRATE        10
71 #define MAX_NICCHGPOLLRT    100000
72 #define MIN_NICCHGPOLLRT    1000
73 #define MAX_DEBUGLVL        3
74 #define MIN_DEBUGLVL        -2
75 #define MAX_TOS             16
76 #define MAX_WILLINGNESS     7
77 #define MIN_WILLINGNESS     0
78 #define MAX_MPR_COVERAGE    20
79 #define MIN_MPR_COVERAGE    1
80 #define MAX_TC_REDUNDANCY   2
81 #define MAX_HYST_PARAM      1.0
82 #define MIN_HYST_PARAM      0.0
83 #define MAX_LQ_AGING        1.0
84 #define MIN_LQ_AGING        0.01
85
86 /* Option values */
87 #define CFG_FIBM_FLAT          "flat"
88 #define CFG_FIBM_CORRECT       "correct"
89 #define CFG_FIBM_APPROX        "approx"
90
91 #define CFG_IP6T_AUTO          "auto"
92 #define CFG_IP6T_SITELOCAL     "site-local"
93 #define CFG_IP6T_UNIQUELOCAL   "unique-local"
94 #define CFG_IP6T_GLOBAL        "global"
95
96 #define OLSR_IP6T_AUTO         0
97 #define OLSR_IP6T_SITELOCAL    1
98 #define OLSR_IP6T_UNIQUELOCAL  2
99 #define OLSR_IP6T_GLOBAL       3
100
101 #ifndef IPV6_ADDR_GLOBAL
102 #define IPV6_ADDR_GLOBAL       0x0000U
103 #endif
104
105 #ifndef IPV6_ADDR_SITELOCAL
106 #define IPV6_ADDR_SITELOCAL    0x0040U
107 #endif
108
109 #include "interfaces.h"
110 #include "olsr_ip_acl.h"
111 #include "olsr_cfg_data.h"
112
113 enum smart_gw_uplinktype {
114   GW_UPLINK_NONE,
115   GW_UPLINK_IPV4,
116   GW_UPLINK_IPV6,
117   GW_UPLINK_IPV46,
118   GW_UPLINK_CNT,
119 };
120
121 struct olsr_msg_params {
122   uint32_t emission_interval;
123   uint32_t validity_time;
124 };
125
126 struct olsr_lq_mult {
127   union olsr_ip_addr addr;
128   uint32_t value;
129   struct olsr_lq_mult *next;
130 };
131
132 struct olsr_if_weight {
133   int value;
134   bool fixed;
135 };
136
137 struct olsr_if_options {
138   union olsr_ip_addr ipv4_broadcast;
139   int ipv6_addrtype;
140   union olsr_ip_addr ipv6_multi_site;
141   union olsr_ip_addr ipv6_multi_glbl;
142   struct olsr_if_weight weight;
143   struct olsr_msg_params hello_params;
144   struct olsr_lq_mult *lq_mult;
145   bool autodetect_chg;
146   enum interface_mode mode;
147 };
148
149 struct olsr_if_config {
150   char *name;
151   char *config;
152   struct interface *interf;
153   struct olsr_if_options *cnf;
154   struct olsr_if_config *next;
155 };
156
157 struct plugin_param {
158   char *key;
159   char *value;
160   struct plugin_param *next;
161 };
162
163 struct plugin_entry {
164   char *name;
165   struct plugin_param *params;
166   struct plugin_entry *next;
167 };
168
169 typedef enum {
170   FIBM_FLAT,
171   FIBM_CORRECT,
172   FIBM_APPROX
173 } olsr_fib_metric_options;
174
175 /*
176  * The config struct
177  */
178
179 struct olsr_config {
180   int ip_version;                      /* AF_INET of AF_INET6 */
181   size_t ipsize;                       /* Size of address */
182
183   unsigned char no_fork:1;             /* Should olsrd run in foreground? */
184   unsigned char allow_no_interfaces:1; /* Should olsrd stop if no ifaces? */
185   unsigned char willingness_auto:1;    /* Willingness in auto mode? */
186   unsigned char clear_screen:1;        /* Clear screen during debug output? */
187   unsigned char del_gws:1;             /* Delete InternetGWs at startup? */
188   unsigned char source_ip_mode:1;      /* Run OLSR routing in sourceip mode */
189
190   uint16_t tos;                        /* IP Type of Service Byte */
191   uint8_t rt_proto;                     /* Policy routing proto, 0 == operating sys default */
192   uint8_t rt_table;                     /* Policy routing table, 254(main) is default */
193   uint8_t rt_table_default;             /* Polroute table for default route, 0==use rttable */
194   olsr_fib_metric_options fib_metric;  /* Determines route metrics update mode */
195
196   /* logging information */
197   bool log_event[LOG_SEVERITY_COUNT][LOG_SOURCE_COUNT]; /* New style */
198   bool log_target_stderr;              /* Log output to stderr? */
199   char *log_target_file;               /* Filename for log output file, NULL if unused */
200   bool log_target_syslog;              /* Log output also to syslog? */
201
202   struct plugin_entry *plugins;        /* List of plugins to load with plparams */
203   struct list_entity hna_entries;      /* List of manually configured HNA entries */
204   struct olsr_if_config *if_configs;   /* List of devices to be used by olsrd */
205
206   uint32_t pollrate;               /* Main loop poll rate, in milliseconds */
207   uint32_t nic_chgs_pollrate;      /* Interface poll rate */
208   uint32_t lq_nat_thresh;              /* Link quality NAT threshold, 1000 == unused */
209   uint8_t tc_redundancy;               /* TC anncoument mode, 0=only MPR, 1=MPR+MPRS, 2=All sym neighs */
210   uint8_t mpr_coverage;                /* How many additional MPRs should be selected */
211   uint8_t lq_fish;                     /* 0==Fisheye off, 1=Fisheye on */
212   uint32_t lq_dinter;              /* Dijkstra Calculation interval */
213   uint8_t lq_dlimit;                   /* Dijkstra Calculation limit */
214   uint8_t willingness;                 /* Manual Configured Willingness value */
215
216   uint16_t olsr_port;                  /* port number used for OLSR packages */
217   char *dlPath;                        /* absolute path for dynamic libraries */
218
219   uint16_t comport_http;               /* communication port for http connections */
220   uint16_t comport_http_limit;         /* maximum number of connections (including interactive ones) */
221   uint16_t comport_txt;                /* communication port for txt connections */
222   uint16_t comport_txt_limit;          /* maximum number of interactive connections */
223
224   struct olsr_msg_params tc_params;
225   struct olsr_msg_params mid_params;
226   struct olsr_msg_params hna_params;
227
228   /*
229    * Someone has added global variables to the config struct.
230    * Because this saves binary link info we keep it that way.
231    * ========= Please add globals below this line. =========
232    */
233
234   union olsr_ip_addr router_id;        /* Main address of this node */
235   uint32_t will_int;                      /* Willingness update interval if willingness_auto */
236   int exit_value;                      /* Global return value for process termination */
237
238   int ioctl_s;                         /* Socket used for ioctl calls */
239
240   union olsr_ip_addr main_addr, unicast_src_ip;
241
242 #if defined linux
243   uint8_t rt_table_tunnel;
244   int32_t rt_table_pri, rt_table_tunnel_pri;
245   int32_t rt_table_defaultolsr_pri, rt_table_default_pri;
246
247   bool use_niit;
248   bool use_src_ip_routes;
249
250   bool smart_gw_active, smart_gw_allow_nat, smart_gw_uplink_nat;
251   enum smart_gw_uplinktype smart_gw_type;
252   uint32_t smart_gw_uplink, smart_gw_downlink;
253   struct olsr_ip_prefix smart_gw_prefix;
254
255   int rtnl_s;                       /* Socket used for rtnetlink messages */
256   int rt_monitor_socket;
257
258   int niit4to6_if_index, niit6to4_if_index;
259
260 /*many potential parameters or helper variables for smartgateway*/
261   bool has_ipv4_gateway, has_ipv6_gateway;
262 #endif
263 #if defined __FreeBSD__ || defined __MacOSX__ || defined __NetBSD__ || defined __OpenBSD__
264   int rts_bsd;                         /* Socket used for route changes on BSDs */
265 #endif
266 };
267
268 /*
269  * Global olsrd configuragtion
270  */
271 extern struct olsr_config *EXPORT(olsr_cnf);
272
273 /*
274  * Interface to parser
275  */
276
277 typedef enum {
278   CFG_ERROR,                           /* Severe parsing error, e.g. file not found, mixed up args */
279   CFG_WARN,                            /* Non-severe error, e.g. use of deprecated option */
280   CFG_EXIT,                            /* Given options will exit() e.g. "--version" or "--help" */
281   CFG_OK                               /* Config is parsed and does not have any errors */
282 } olsr_parse_cfg_result;
283
284 olsr_parse_cfg_result olsr_parse_cfg(int argc, char *argv[], const char *file, char *rmsg, struct olsr_config **rcfg);
285 struct olsr_if_options *olsr_get_default_if_options(void);
286 struct olsr_config *olsr_get_default_cfg(void);
287 int olsr_sanity_check_cfg(struct olsr_config *cfg);
288 void olsr_free_cfg(struct olsr_config *cfg);
289
290 #endif /* _OLSRD_CFG_H */
291
292 /*
293  * Local Variables:
294  * c-basic-offset: 2
295  * indent-tabs-mode: nil
296  * End:
297  */