cfgfile: don't hard-code defaults in texts
[olsrd.git] / src / cfgparser / cfgfile_gen.c
1 /*
2  * The olsr.org Optimized Link-State Routing daemon(olsrd)
3  * Copyright (c) 2005, Andreas Tonnesen(andreto@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
11  *   notice, this list of conditions and the following disclaimer.
12  * * Redistributions in binary form must reproduce the above copyright
13  *   notice, this list of conditions and the following disclaimer in
14  *   the documentation and/or other materials provided with the
15  *   distribution.
16  * * Neither the name of olsr.org, olsrd nor the names of its
17  *   contributors may be used to endorse or promote products derived
18  *   from this software without specific prior written permission.
19  *
20  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
21  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
22  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
23  * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
24  * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
25  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
26  * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
27  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
28  * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
29  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
30  * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
31  * POSSIBILITY OF SUCH DAMAGE.
32  *
33  * Visit http://www.olsr.org for more information.
34  *
35  * If you find this software useful feel free to make a donation
36  * to the project. For more information see the website or contact
37  * the copyright holders.
38  *
39  */
40
41 #include "olsrd_conf.h"
42 #include "builddata.h"
43 #include "../ipcalc.h"
44 #include "../net_olsr.h"
45 #include "../common/autobuf.h"
46
47 #include <stdarg.h>
48 #include <stdio.h>
49 #include <string.h>
50 #include <errno.h>
51 #include <sys/types.h>
52 #include <netinet/in.h>
53 #include <arpa/inet.h>
54
55 int olsrd_write_cnf(struct olsrd_config *cnf, const char *fname) {
56   FILE *fd;
57   struct autobuf abuf;
58
59   fd = fopen(fname, "w");
60
61   if (fd == NULL) {
62     fprintf(stderr, "Could not open file %s for writing\n%s\n", fname, strerror(errno));
63     return -1;
64   }
65
66   printf("Writing config to file \"%s\".... ", fname);
67   abuf_init(&abuf, 1024);
68   olsrd_write_cnf_autobuf(&abuf, cnf);
69   if (fwrite(abuf.buf, abuf.len, 1, fd) < (size_t)abuf.len) {
70     fprintf(stderr, "Error, could not write the complete config file.\n");
71   }
72   abuf_free(&abuf);
73   fclose(fd);
74
75   printf("DONE\n");
76
77   return 1;
78 }
79
80 static int
81 if_appendf(struct autobuf *autobuf, bool comments, const char *fmt, ...)  __attribute__ ((format(printf, 3, 4)));
82
83 static int
84 if_appendf(struct autobuf *autobuf, bool comments, const char *fmt, ...)
85 {
86   int rv;
87   va_list ap;
88   char *first;
89
90   if (!comments) {
91     va_start(ap, fmt);
92     first = va_arg(ap, char*);
93     va_end(ap);
94     if (*first) {
95       return 0;
96     }
97   }
98
99   va_start(ap, fmt);
100   rv = abuf_vappendf(autobuf, fmt, ap);
101   va_end(ap);
102   return rv;
103 }
104
105 static void olsrd_write_if_autobuf(struct autobuf *out, struct if_config_options *cnfi, bool comments) {
106   struct ipaddr_str ipbuf;
107   struct olsr_lq_mult *mult;
108
109   abuf_puts(out, "{\n");
110   if (comments) abuf_appendf(out,
111     "    # Interface Mode is used to prevent unnecessary\n"
112     "    # packet forwarding on switched ethernet interfaces\n"
113     "    # valid Modes are \"mesh\" and \"ether\"\n"
114     "    # (default is \"%s\")\n"
115     "    \n", OLSR_IF_MODE[DEF_IF_MODE]);
116   if_appendf(out, comments, "    %sMode \"%s\"\n",
117       cnfi->mode == DEF_IF_MODE ? "# " : "",
118       OLSR_IF_MODE[cnfi->mode]);
119   if (comments) abuf_puts(out,
120     "    \n"
121     "    # IPv4 broadcast address for outgoing OLSR packets.\n"
122     "    # One useful example would be 255.255.255.255\n"
123     "    # The second useful value would be to\n"
124     "    # specify the peer address of an ptp-tunnel.\n"
125     "    # another name of this parameter is \"IPv4Multicast\"\n"
126     "    # (default is 0.0.0.0, which triggers the usage of the\n"
127     "    # interface broadcast IP)\n"
128     "    \n");
129   if_appendf(out, comments, "    %sIp4Broadcast      %s\n",
130       cnfi->ipv4_multicast.v4.s_addr == 0 ? "# " : "",
131       inet_ntop(AF_INET, &cnfi->ipv4_multicast, ipbuf.buf, sizeof(ipbuf)));
132   if (comments) abuf_appendf(out,
133     "    \n"
134     "    # IPv6 multicast address\n"
135     "    # (default is %s, the manet-router linklocal multicast)\n"
136     "    \n", inet_ntop(AF_INET6, &ipv6_def_multicast, ipbuf.buf, sizeof(ipbuf)));
137   if_appendf(out, comments, "    %sIPv6Multicast %s\n",
138       memcmp(&cnfi->ipv6_multicast, &ipv6_def_multicast, sizeof(ipv6_def_multicast)) == 0 ? "# " : "",
139       inet_ntop(AF_INET6, &cnfi->ipv6_multicast, ipbuf.buf, sizeof(ipbuf)));
140   if (comments) abuf_puts(out,
141     "    \n"
142     "    # IPv4 src address for outgoing OLSR packages\n"
143     "    # (default is 0.0.0.0, which triggers usage of the interface IP)\n"
144     "    \n");
145   if_appendf(out, comments, "    %sIPv4Src %s\n",
146       cnfi->ipv4_src.v4.s_addr == 0 ? "# " : "",
147       inet_ntop(AF_INET, &cnfi->ipv4_src, ipbuf.buf, sizeof(ipbuf)));
148   if (comments) abuf_puts(out,
149     "    \n"
150     "    # IPv6 src prefix. OLSRd will choose one of the interface IPs\n"
151     "    # which matches the prefix of this parameter.\n"
152     "    # (default is 0::/0, which triggers the usage\n"
153     "    # of a not-linklocal interface IP)\n"
154     "    \n");
155   if_appendf(out, comments, "    %sIPv6Src %s\n",
156       cnfi->ipv6_src.prefix_len == 0 ? "# " : "",
157       inet_ntop(AF_INET6, &cnfi->ipv6_src, ipbuf.buf, sizeof(ipbuf)));
158   if (comments) abuf_appendf(out,
159     "    \n"
160     "    # Emission intervals in seconds.\n"
161     "    # If not defined, Freifunk network defaults are used.\n"
162     "    # (defaults: Hello = %.1f/%.1f,  TC  = %.1f/%.1f,\n"
163     "    #            MID   = %.1f/%.1f, HNA = %.1f/%.1f)\n"
164     "    \n",
165     (double)HELLO_INTERVAL, (double)NEIGHB_HOLD_TIME,
166     (double)TC_INTERVAL,    (double)TOP_HOLD_TIME,
167     (double)MID_INTERVAL,   (double)MID_HOLD_TIME,
168     (double)HNA_INTERVAL,   (double)HNA_HOLD_TIME
169     );
170   if_appendf(out, comments, "    %sHelloInterval       %3.1f\n",
171       cnfi->hello_params.emission_interval == HELLO_INTERVAL ? "# " : "",
172       (double)cnfi->hello_params.emission_interval);
173   if_appendf(out, comments, "    %sHelloValidityTime   %3.1f\n",
174       cnfi->hello_params.validity_time == NEIGHB_HOLD_TIME ? "# " : "",
175       (double)cnfi->hello_params.validity_time);
176   if_appendf(out, comments, "    %sTcInterval          %3.1f\n",
177       cnfi->tc_params.emission_interval == TC_INTERVAL ? "# " : "",
178       (double)cnfi->tc_params.emission_interval);
179   if_appendf(out, comments, "    %sTcValidityTime      %3.1f\n",
180       cnfi->tc_params.validity_time == TOP_HOLD_TIME ? "# " : "",
181       (double)cnfi->tc_params.validity_time);
182   if_appendf(out, comments, "    %sMidInterval         %3.1f\n",
183       cnfi->mid_params.emission_interval == MID_INTERVAL ? "# " : "",
184       (double)cnfi->mid_params.emission_interval);
185   if_appendf(out, comments, "    %sMidValidityTime     %3.1f\n",
186       cnfi->mid_params.validity_time == MID_HOLD_TIME ? "# " : "",
187       (double)cnfi->mid_params.validity_time);
188   if_appendf(out, comments, "    %sHnaInterval         %3.1f\n",
189       cnfi->hna_params.emission_interval == HNA_INTERVAL ? "# " : "",
190       (double)cnfi->hna_params.emission_interval);
191   if_appendf(out, comments, "    %sHnaValidityTime     %3.1f\n",
192       cnfi->hna_params.validity_time == HNA_HOLD_TIME ? "# " : "",
193       (double)cnfi->hna_params.validity_time);
194   if (comments) abuf_puts(out,
195     "    \n"
196     "    # When multiple links exist between hosts\n"
197     "    # the weight of interface is used to determine\n"
198     "    # the link to use. Normally the weight is\n"
199     "    # automatically calculated by olsrd based\n"
200     "    # on the characteristics of the interface,\n"
201     "    # but here you can specify a fixed value.\n"
202     "    # Olsrd will choose links with the lowest value.\n"
203     "    # Note:\n"
204     "    # Interface weight is used only when LinkQualityLevel is set to 0.\n"
205     "    # For any other value of LinkQualityLevel, the interface ETX\n"
206     "    # value is used instead.\n");
207   if_appendf(out, comments, "    %sWeight %d\n",
208       !cnfi->weight.fixed ? "# " : "",
209       cnfi->weight.value);
210   if (comments) abuf_puts(out,
211     "    \n"
212     "    # If a certain route should be preferred\n"
213     "    # or ignored by the mesh, the Link Quality\n"
214     "    # value of a node can be multiplied with a factor\n"
215     "    # entered here. In the example the route\n"
216     "    # using 192.168.0.1 would rather be ignored.\n"
217     "    # A multiplier of 0.5 will result in a small\n"
218     "    # (bad) LinkQuality value and a high (bad)\n"
219     "    # ETX value.\n"
220     "    # Note:\n"
221     "    # Link quality multiplier is used only when\n"
222     "    # LinkQualityLevel is greater than 0.\n"
223     "    \n");
224   mult = cnfi->lq_mult;
225
226   if (mult == NULL) {
227     if (comments) abuf_puts(out, "    # LinkQualityMult 192.168.0.1 0.5\n");
228   } else {
229     while (mult != NULL) {
230       if_appendf(out, comments, "    LinkQualityMult    %s %0.2f\n",
231           olsr_ip_to_string(&ipbuf, &mult->addr),
232           (double)((float)(mult->value) / 65536.0f));
233       mult = mult->next;
234     }
235   }
236   abuf_puts(out, "}\n");
237 }
238
239 void olsrd_write_cnf_autobuf(struct autobuf *out, struct olsrd_config *cnf) {
240   struct ip_prefix_list *hna = cnf->hna_entries;
241   struct olsr_if *interf = cnf->interfaces;
242   struct plugin_entry *plugins = cnf->plugins;
243   struct plugin_param *pl_param;
244   struct ip_prefix_list *ipc_nets = cnf->ipc_nets;
245
246   struct ipaddr_str ipbuf;
247   bool first;
248
249   abuf_appendf(out, "#\n"
250       "# Configuration file for %s\n"
251       "# automatically generated by olsrd-cnf parser v. %s\n"
252       "#\n"
253       "\n",
254       olsrd_version, PARSER_VERSION);
255   abuf_appendf(out,
256     "# OLSR.org routing daemon config file\n"
257     "# This file contains ALL available options and explanations about them\n"
258     "#\n"
259     "# Lines starting with a # are discarded\n"
260     "#\n"
261     "\n"
262     "#### ATTENTION for IPv6 users ####\n"
263     "# Because of limitations in the parser IPv6 addresses must NOT\n"
264     "# begin with a \":\", so please add a \"0\" as a prefix.\n"
265     "\n"
266     "###########################\n"
267     "### Basic configuration ###\n"
268     "###########################\n"
269     "# keep this settings at the beginning of your first configuration file\n"
270     "\n"
271     "# Debug level (0-9)\n"
272     "# If set to 0 the daemon runs in the background, unless \"NoFork\" is set to true\n"
273     "# (default is %u)\n"
274     "\n", DEF_DEBUGLVL);
275   abuf_appendf(out, "%sDebugLevel  %d\n",
276       cnf->debug_level == DEF_DEBUGLVL ? "# " : "",
277       cnf->debug_level);
278   abuf_appendf(out,
279     "\n"
280     "# IP version to use (4 or 6)\n"
281     "# (default is %u)\n"
282     "\n", (DEF_IP_VERSION == AF_INET) ? 4 : 6);
283   abuf_appendf(out, "%sIpVersion %d\n",
284       cnf->ip_version == DEF_IP_VERSION ? "# " : "",
285       cnf->ip_version == AF_INET ? 4 : 6);
286   abuf_appendf(out,
287     "\n"
288     "#################################\n"
289     "### OLSRd agent configuration ###\n"
290     "#################################\n"
291     "# this parameters control the settings of the routing agent which are not\n"
292     "# related to the OLSR protocol and it's extensions\n"
293     "\n"
294     "# Clear the screen each time the internal state changes\n"
295     "# (default is %s)\n"
296     "\n", DEF_CLEAR_SCREEN ? "yes" : "no");
297   abuf_appendf(out, "%sClearScreen     %s\n",
298       cnf->clear_screen == DEF_CLEAR_SCREEN ? "# " : "",
299       cnf->clear_screen ? "yes" : "no");
300   abuf_appendf(out,
301     "\n"
302     "# Should olsrd keep on running even if there are\n"
303     "# no interfaces available? This is a good idea\n"
304     "# for a PCMCIA/USB hotswap environment.\n"
305     "# (default is %s)\n"
306     "\n", DEF_ALLOW_NO_INTS ? "yes" : "no");
307   abuf_appendf(out, "%sAllowNoInt  %s\n",
308       cnf->allow_no_interfaces == DEF_ALLOW_NO_INTS ? "# " : "",
309       cnf->allow_no_interfaces ? "yes" : "no");
310   abuf_puts(out,
311     "\n"
312     "# LockFile\n"
313     "# The lockfile is used to prevent multiple OLSR instances running at the same\n"
314     "# time.\n"
315     "# (Linux/BSD default is \"/var/run/olsrd-ipv(4/6).lock\")\n"
316     "# (Win32     default is \"configfile-ipv(4/6).lock\")\n"
317     "\n");
318   abuf_appendf(out, "%sLockFile \"%s\"\n",
319       cnf->lock_file == NULL ? "# " : "",
320       cnf->lock_file ? cnf->lock_file : "lockfile");
321   abuf_appendf(out,
322     "\n"
323     "# Polling rate for OLSR sockets in seconds (float). \n"
324     "# (default is %.2f)\n"
325     "\n", (double)DEF_POLLRATE);
326   abuf_appendf(out, "%sPollrate  %.2f\n",
327       cnf->pollrate == (float)DEF_POLLRATE ? "# " : "",
328       (double)cnf->pollrate);
329   abuf_appendf(out,
330     "\n"
331     "# Interval to poll network interfaces for configuration changes (in seconds).\n"
332     "# Linux systems can detect interface statechange via netlink sockets.\n"
333     "# (default is %.1f)\n"
334     "\n", (double)DEF_NICCHGPOLLRT);
335   abuf_appendf(out, "%sNicChgsPollInt  %.1f\n",
336       cnf->nic_chgs_pollrate == (float)DEF_NICCHGPOLLRT ? "# " : "",
337       (double)cnf->nic_chgs_pollrate);
338   abuf_appendf(out,
339     "\n"
340     "# TOS(type of service) value for the IP header of control traffic.\n"
341     "# (default is %u)\n"
342     "\n", DEF_TOS);
343   abuf_appendf(out, "%sTosValue %u\n",
344       cnf->tos == DEF_TOS ? "# " : "",
345       cnf->tos);
346   abuf_appendf(out,
347     "\n"
348     "# FIBMetric controls the metric value of the host-routes OLSRd sets.\n"
349     "# - \"flat\" means that the metric value is always 2. This is the preferred value\n"
350     "#   because it helps the linux kernel routing to clean up older routes\n"
351     "# - \"correct\" use the hopcount as the metric value.\n"
352     "# - \"approx\" use the hopcount as the metric value too, but does only update the\n"
353     "#   hopcount if the nexthop changes too\n"
354     "# (default is \"%s\")\n"
355     "\n", FIB_METRIC_TXT[DEF_FIB_METRIC]);
356   abuf_appendf(out, "%sFIBMetric \"%s\"\n",
357       cnf->fib_metric == DEF_FIB_METRIC ? "# " : "",
358       FIB_METRIC_TXT[cnf->fib_metric]);
359   abuf_appendf(out,
360     "\n"
361     "#######################################\n"
362     "### Linux specific OLSRd extensions ###\n"
363     "#######################################\n"
364     "# these parameters are only working on linux at the moment, but might become\n"
365     "# useful on BSD in the future\n"
366     "\n"
367     "# SrcIpRoutes tells OLSRd to set the Src flag of host routes to the originator-ip\n"
368     "# of the node. In addition to this an additional localhost device is created\n"
369     "# to make sure the returning traffic can be received.\n"
370     "# (default is \"%s\")\n"
371     "\n", DEF_USE_SRCIP_ROUTES ? "yes" : "no");
372   abuf_appendf(out, "%sSrcIpRoutes %s\n",
373       cnf->use_src_ip_routes == DEF_USE_SRCIP_ROUTES ? "# " : "",
374       cnf->use_src_ip_routes ? "yes" : "no");
375   abuf_appendf(out,
376     "\n"
377     "# Specify the proto tag to be used for routes olsr inserts into kernel\n"
378     "# currently only implemented for linux\n"
379     "# valid values under linux are 1 .. 254\n"
380     "# 1 gets remapped by olsrd to 0 UNSPECIFIED (1 is reserved for ICMP redirects)\n"
381     "# 2 KERNEL routes (not very wise to use)\n"
382     "# 3 BOOT (should in fact not be used by routing daemons)\n"
383     "# 4 STATIC \n"
384     "# 8 .. 15 various routing daemons (gated, zebra, bird, & co)\n"
385     "# (default is %u which gets replaced by an OS-specific default value\n"
386     "# under linux 3 (BOOT) (for backward compatibility)\n"
387     "\n", DEF_RTPROTO);
388   abuf_appendf(out, "%sRtProto %u\n",
389       cnf->rt_proto == DEF_RTPROTO ? "# " : "",
390       cnf->rt_proto);
391   abuf_puts(out,
392     "\n"
393     "# Specifies the routing Table olsr uses\n"
394     "# RtTable is for host routes, RtTableDefault for the route to the default\n"
395     "# internet gateway (2 in case of IPv6+NIIT) and RtTableTunnel is for\n"
396     "# routes to the ipip tunnels, valid values are 1 to 254\n"
397     "# There is a special parameter \"auto\" (choose default below)\n"
398     "# (with    smartgw: default is 254/223/224)\n"
399     "# (without smartgw: default is 254/254/254, linux main table)\n"
400     "\n");
401   abuf_appendf(out, "RtTable %u\n",
402       cnf->rt_table);
403   abuf_appendf(out, "RtTableDefault %u\n",
404       cnf->rt_table_default);
405   abuf_appendf(out, "RtTableTunnel %u\n",
406       cnf->rt_table_tunnel);
407   abuf_puts(out,
408     "\n"
409     "# Specifies the policy rule priorities for the three routing tables and\n"
410     "# a special rule for smartgateway routing (see README-Olsr-Extensions)\n"
411     "# Priorities can only be set if three different routing tables are set.\n"
412     "# if set the values must obey to condition\n"
413     "# RtTablePriority less than RtTableDefaultOlsrPriority\n"
414     "# less than RtTableTunnelPriority less than RtTableDefaultPriority\n"
415     "# There are two special parameters, \"auto\" (choose fitting to SmartGW\n"
416     "# mode) and \"none\" (do not set policy rule)\n"
417     "# (with    smartgw: default is none/32776/32786/32796)\n"
418     "# (without smartgw: default is none/none /none /none )\n"
419     "\n");
420   abuf_appendf(out, "RtTablePriority %u\n",
421       cnf->rt_table_pri);
422   abuf_appendf(out, "RtTableDefaultOlsrPriority %u\n",
423       cnf->rt_table_default_pri);
424   abuf_appendf(out, "RtTableTunnelPriority %u\n",
425       cnf->rt_table_tunnel_pri);
426   abuf_appendf(out, "RtTableDefaultPriority %u\n",
427       cnf->rt_table_defaultolsr_pri);
428   abuf_appendf(out,
429     "\n"
430     "# Activates (in IPv6 mode) the automatic use of NIIT\n"
431     "# (see README-Olsr-Extensions)\n"
432     "# (default is \"%s\")\n"
433     "\n", DEF_USE_NIIT ? "yes" : "no");
434   abuf_appendf(out, "%sUseNiit %s\n",
435       cnf->use_niit == DEF_USE_NIIT ? "# " : "",
436       cnf->use_niit ? "yes" : "no");
437   abuf_appendf(out,
438     "\n"
439     "# Activates the smartgateway ipip tunnel feature.\n"
440     "# See README-Olsr-Extensions for a description of smartgateways.\n"
441     "# (default is \"%s\")\n"
442     "\n", DEF_SMART_GW ? "yes" : "no");
443   abuf_appendf(out, "%sSmartGateway %s\n",
444       cnf->smart_gw_active == DEF_SMART_GW ? "# " : "",
445       cnf->smart_gw_active ? "yes" : "no");
446   abuf_appendf(out,
447     "\n"
448     "# Signals that the server tunnel must always be removed on shutdown,\n"
449     "# irrespective of the interface up/down state during startup.\n"
450     "# (default is \"%s\")\n"
451     "\n", DEF_SMART_GW_ALWAYS_REMOVE_SERVER_TUNNEL ? "yes" : "no");
452   abuf_appendf(out, "%sSmartGatewayAlwaysRemoveServerTunnel %s\n",
453       cnf->smart_gw_always_remove_server_tunnel == DEF_SMART_GW_ALWAYS_REMOVE_SERVER_TUNNEL ? "# " : "",
454       cnf->smart_gw_always_remove_server_tunnel ? "yes" : "no");
455   abuf_appendf(out,
456     "\n"
457     "# Determines the maximum number of gateways that can be in use at any given\n"
458     "# time. This setting is used to mitigate the effects of breaking connections\n"
459     "# (due to the selection of a new gateway) on a dynamic network.\n"
460     "# (default is %u)\n"
461     "\n", DEF_GW_USE_COUNT);
462   abuf_appendf(out, "%sSmartGatewayUseCount %d\n",
463       cnf->smart_gw_use_count == DEF_GW_USE_COUNT ? "# " : "",
464       cnf->smart_gw_use_count);
465   abuf_appendf(out,
466     "\n"
467     "# Determines the take-down percentage for a non-current smart gateway tunnel.\n"
468     "# If the cost of the current smart gateway tunnel is less than this percentage\n"
469     "# of the cost of the non-current smart gateway tunnel, then the non-current smart\n"
470     "# gateway tunnel is taken down because it is then presumed to be 'too expensive'.\n"
471     "# This setting is only relevant when SmartGatewayUseCount is larger than 1;\n"
472     "# a value of 0 will result in the tunnels not being taken down proactively.\n"
473     "# (default is %u)\n"
474     "\n", DEF_GW_TAKEDOWN_PERCENTAGE);
475   abuf_appendf(out, "%sSmartGatewayTakeDownPercentage %d\n",
476       cnf->smart_gw_takedown_percentage == DEF_GW_TAKEDOWN_PERCENTAGE ? "# " : "",
477       cnf->smart_gw_takedown_percentage);
478   abuf_puts(out,
479     "\n"
480     "# Determines the policy routing script that is executed during startup and\n"
481     "# shutdown of olsrd. The script is only executed when SmartGatewayUseCount\n"
482     "# is set to a value larger than 1. The script must setup policy routing\n"
483     "# rules such that multi-gateway mode works. A sample script is included.\n"
484     "# (default is not set)\n"
485     "\n");
486   abuf_appendf(out, "%sSmartGatewayPolicyRoutingScript %s\n",
487       !cnf->smart_gw_policyrouting_script ? "# " : "",
488       !cnf->smart_gw_policyrouting_script ? "" : cnf->smart_gw_policyrouting_script);
489   abuf_puts(out,
490     "\n"
491     "# Determines the egress interfaces that are part of the multi-gateway setup and\n"
492     "# therefore only relevant when SmartGatewayUseCount is larger than 1 (in which\n"
493     "# case it must be explicitly set).\n"
494     "# (default is not set)\n"
495     "\n");
496   abuf_appendf(out, "%sSmartGatewayEgressInterfaces",
497       !cnf->smart_gw_egress_interfaces ? "# " : "");
498   {
499     struct sgw_egress_if * sgwegressif = olsr_cnf->smart_gw_egress_interfaces;
500     while (sgwegressif) {
501       abuf_appendf(out, " \"%s\"", sgwegressif->name);
502       sgwegressif = sgwegressif->next;
503     }
504     abuf_puts(out, "\n");
505   }
506   abuf_appendf(out,
507     "\n"
508     "# Determines the offset of the smart gateway egress interfaces mark that are\n"
509     "# used in the policy routing rules in a multi-gateway setup. Only relevant\n"
510     "# when a multi-gateway setup is used.\n"
511     "# (default is %u)\n"
512     "\n", DEF_GW_MARK_OFFSET_EGRESS);
513   abuf_appendf(out, "%sSmartGatewayMarkOffsetEgress %u\n",
514       cnf->smart_gw_mark_offset_egress == DEF_GW_MARK_OFFSET_EGRESS ? "# " : "",
515       cnf->smart_gw_mark_offset_egress);
516   abuf_appendf(out,
517     "\n"
518     "# Determines the offset of the smart gateway tunnel interfaces mark that are\n"
519     "# used in the policy routing rules in a multi-gateway setup. Only relevant\n"
520     "# when a multi-gateway setup is used.\n"
521     "# The ranges [egress offset, egress offset + egress count] and\n"
522     "# [tunnel offset, tunnel offset + use count] are not allowed to overlap.\n"
523     "# (default is %u)\n"
524     "\n", DEF_GW_MARK_OFFSET_TUNNELS);
525   abuf_appendf(out, "%sSmartGatewayMarkOffsetTunnels %u\n",
526       cnf->smart_gw_mark_offset_tunnels == DEF_GW_MARK_OFFSET_TUNNELS ? "# " : "",
527       cnf->smart_gw_mark_offset_tunnels);
528   abuf_appendf(out,
529     "\n"
530     "# Allows the selection of a smartgateway with NAT (only for IPv4)\n"
531     "# (default is \"%s\")\n"
532     "\n", DEF_GW_ALLOW_NAT ? "yes" : "no");
533   abuf_appendf(out, "%sSmartGatewayAllowNAT %s\n",
534       cnf->smart_gw_allow_nat == DEF_GW_ALLOW_NAT ? "# " : "",
535       cnf->smart_gw_allow_nat ? "yes" : "no");
536   abuf_appendf(out,
537     "\n"
538     "# Determines the period (in milliseconds) on which a new smart gateway\n"
539     "# selection is performed.\n"
540     "# (default is %u milliseconds)\n"
541     "\n", DEF_GW_PERIOD);
542   abuf_appendf(out, "%sSmartGatewayPeriod %d\n",
543       cnf->smart_gw_period == DEF_GW_PERIOD ? "# " : "",
544       cnf->smart_gw_period);
545   abuf_appendf(out,
546     "\n"
547     "# Determines the number of times the link state database must be stable\n"
548     "# before a new smart gateway is selected.\n"
549     "# (default is %u)\n"
550     "\n", DEF_GW_STABLE_COUNT);
551   abuf_appendf(out, "%sSmartGatewayStableCount %d\n",
552       cnf->smart_gw_stablecount == DEF_GW_STABLE_COUNT ? "# " : "",
553       cnf->smart_gw_stablecount);
554   abuf_appendf(out,
555     "\n"
556     "# When another gateway than the current one has a cost of less than the cost\n"
557     "# of the current gateway multiplied by SmartGatewayThreshold then the smart\n"
558     "# gateway is switched to the other gateway. The unit is percentage.\n"
559     "# (default is %u)\n"
560     "\n", DEF_GW_THRESH);
561   abuf_appendf(out, "%sSmartGatewayThreshold  %d\n",
562       cnf->smart_gw_thresh == DEF_GW_THRESH ? "# " : "",
563       cnf->smart_gw_thresh);
564   abuf_appendf(out,
565     "\n"
566     "# The weighing factor for the gateway uplink bandwidth (exit link, uplink).\n"
567     "# See README-Olsr-Extensions for a description of smart gateways.\n"
568     "# (default is %lu)\n"
569     "\n", (long unsigned int)DEF_GW_WEIGHT_EXITLINK_UP);
570   abuf_appendf(out, "%sSmartGatewayWeightExitLinkUp  %d\n",
571       cnf->smart_gw_weight_exitlink_up == DEF_GW_WEIGHT_EXITLINK_UP ? "# " : "",
572       cnf->smart_gw_weight_exitlink_up);
573   abuf_appendf(out,
574     "\n"
575     "# The weighing factor for the gateway downlink bandwidth (exit link, downlink).\n"
576     "# See README-Olsr-Extensions for a description of smart gateways.\n"
577     "# (default is %lu)\n"
578     "\n", (long unsigned int)DEF_GW_WEIGHT_EXITLINK_DOWN);
579   abuf_appendf(out, "%sSmartGatewayWeightExitLinkDown  %d\n",
580       cnf->smart_gw_weight_exitlink_down == DEF_GW_WEIGHT_EXITLINK_DOWN ? "# " : "",
581       cnf->smart_gw_weight_exitlink_down);
582   abuf_appendf(out,
583     "\n"
584     "# The weighing factor for the ETX costs.\n"
585     "# See README-Olsr-Extensions for a description of smart gateways.\n"
586     "# (default is %u)\n"
587     "\n", DEF_GW_WEIGHT_ETX);
588   abuf_appendf(out, "%sSmartGatewayWeightEtx  %d\n",
589       cnf->smart_gw_weight_etx == DEF_GW_WEIGHT_ETX ? "# " : "",
590       cnf->smart_gw_weight_etx);
591   abuf_appendf(out,
592     "\n"
593     "# The divider for the ETX costs.\n"
594     "# See README-Olsr-Extensions for a description of smart gateways.\n"
595     "# (default is %u)\n"
596     "\n", DEF_GW_DIVIDER_ETX);
597   abuf_appendf(out, "%sSmartGatewayDividerEtx  %d\n",
598       cnf->smart_gw_divider_etx == DEF_GW_DIVIDER_ETX ? "# " : "",
599       cnf->smart_gw_divider_etx);
600   abuf_appendf(out,
601     "\n"
602     "# Defines what kind of Uplink this node will publish as a\n"
603     "# smartgateway. The existence of the uplink is detected by\n"
604     "# a route to 0.0.0.0/0, ::ffff:0:0/96 and/or 2000::/3.\n"
605     "# possible values are \"none\", \"ipv4\", \"ipv6\", \"both\"\n"
606     "# (default is \"%s\")\n"
607     "\n", GW_UPLINK_TXT[DEF_GW_TYPE]);
608   abuf_appendf(out, "%sSmartGatewayUplink \"%s\"\n",
609       cnf->smart_gw_type == DEF_GW_TYPE ? "# " : "",
610       GW_UPLINK_TXT[cnf->smart_gw_type]);
611   abuf_appendf(out,
612     "\n"
613     "# Specifies if the local ipv4 uplink use NAT\n"
614     "# (default is \"%s\")\n"
615     "\n", DEF_GW_UPLINK_NAT ? "yes" : "no");
616   abuf_appendf(out, "%sSmartGatewayUplinkNAT %s\n",
617       cnf->smart_gw_uplink_nat == DEF_GW_UPLINK_NAT ? "# " : "",
618       cnf->smart_gw_uplink_nat ? "yes" : "no");
619   abuf_appendf(out,
620     "\n"
621     "# Specifies the speed of the uplink in kilobit/s.\n"
622     "# First parameter is upstream, second parameter is downstream\n"
623     "# (default is %u/%u)\n"
624     "\n", DEF_UPLINK_SPEED, DEF_DOWNLINK_SPEED);
625   abuf_appendf(out, "%sSmartGatewaySpeed %d %d\n",
626       cnf->smart_gw_uplink == DEF_UPLINK_SPEED && cnf->smart_gw_downlink == DEF_DOWNLINK_SPEED ? "# " : "",
627       cnf->smart_gw_uplink, cnf->smart_gw_downlink);
628   abuf_puts(out,
629     "\n"
630     "# Specifies the EXTERNAL ipv6 prefix of the uplink. A prefix\n"
631     "# length of more than 64 is not allowed.\n"
632     "# (default is 0::/0\n"
633     "\n");
634   abuf_appendf(out, "%sSmartGatewayPrefix %s\n",
635       cnf->smart_gw_prefix.prefix_len == 0 ? "# " : "",
636       olsr_ip_prefix_to_string(&cnf->smart_gw_prefix));
637   abuf_appendf(out,
638     "\n"
639     "##############################\n"
640     "### OLSR protocol settings ###\n"
641     "##############################\n"
642     "\n"
643     "# For testing purposes it may be nice to use another port for olsrd\n"
644     "# for using another port than the IANA assigned one \n"
645     "# for a production network, there should be a good reason!!\n"
646     "# valid values are integers greater than 1, please be careful with\n"
647     "# using reserved port numbers\n"
648     "# (default is %u, the IANA assigned olsr-port)\n"
649     "\n", DEF_OLSRPORT);
650   abuf_appendf(out, "%sOlsrPort %u\n",
651       cnf->olsrport == DEF_OLSRPORT ? "# " : "",
652       cnf->olsrport);
653   abuf_puts(out,
654     "\n"
655     "# Sets the main IP (originator ip) of the router. This IP will NEVER\n"
656     "# change during the uptime of olsrd.\n"
657     "# (default is 0.0.0.0, which triggers usage of the IP of the first interface)\n"
658     "\n");
659   abuf_appendf(out, "MainIp %s\n",
660       olsr_ip_to_string(&ipbuf, &cnf->main_addr));
661   abuf_appendf(out,
662     "\n"
663     "# The fixed willingness to use (0-7)\n"
664     "# If not set willingness will be calculated\n"
665     "# dynamically based on battery/power status\n"
666     "# (default is %u)\n"
667     "\n", DEF_WILLINGNESS);
668   abuf_appendf(out, "%sWillingness     %u\n",
669       cnf->willingness == DEF_WILLINGNESS ? "# " : "",
670       cnf->willingness);
671   abuf_puts(out,
672     "\n"
673     "# HNA (Host network association) allows the OLSR to announce\n"
674     "# additional IPs or IP subnets to the net that are reachable\n"
675     "# through this node.\n"
676     "# Syntax for HNA4 is \"network-address    network-mask\"\n"
677     "# Syntax for HNA6 is \"network-address    prefix-length\"\n"
678     "# (default is no HNA)\n");
679   abuf_appendf(out, "Hna%u\n"
680     "{\n",
681     cnf->ip_version == AF_INET ? 4 : 6);
682   while (hna) {
683     struct ipaddr_str strbuf;
684     abuf_appendf(out, "    %s\n", olsr_ip_prefix_to_string(&hna->net));
685     hna = hna->next;
686   }
687   abuf_appendf(out,
688     "}\n"
689     "\n"
690     "# Hysteresis for link sensing (only for hopcount metric)\n"
691     "# Hysteresis adds more robustness to the link sensing\n"
692     "# but delays neighbor registration.\n"
693     "# (default is %s)\n"
694     "\n", DEF_USE_HYST ? "yes" : "no");
695   abuf_appendf(out, "%sUseHysteresis %s\n",
696       cnf->use_hysteresis == DEF_USE_HYST ? "# " : "",
697       cnf->use_hysteresis ? "yes" : "no");
698   abuf_appendf(out,
699     "\n"
700     "# Hysteresis parameters (only for hopcount metric)\n"
701     "# Do not alter these unless you know what you are doing!\n"
702     "# Set to auto by default. Allowed values are floating point\n"
703     "# values in the interval 0,1\n"
704     "# THR_LOW must always be lower than THR_HIGH!!\n"
705     "# (default is %.2f/%.2f/%.2f)\n"
706     "\n", (double)HYST_SCALING, (double)HYST_THRESHOLD_HIGH, (double)HYST_THRESHOLD_LOW);
707   abuf_appendf(out, "%sHystScaling  %.2f\n",
708       cnf->hysteresis_param.scaling == (float)HYST_SCALING ? "# " : "",
709       (double)cnf->hysteresis_param.scaling);
710   abuf_appendf(out, "%sHystThrHigh  %.2f\n",
711       cnf->hysteresis_param.thr_high == (float)HYST_THRESHOLD_HIGH ? "# " : "",
712       (double)cnf->hysteresis_param.thr_high);
713   abuf_appendf(out, "%sHystThrLow  %.2f\n",
714       cnf->hysteresis_param.thr_low == (float)HYST_THRESHOLD_LOW ? "# " : "",
715       (double)cnf->hysteresis_param.thr_low);
716   abuf_appendf(out,
717     "\n"
718     "# TC redundancy\n"
719     "# Specifies how much neighbor info should be sent in\n"
720     "# TC messages. Because of a design problem in the 0.5.x\n"
721     "# dijkstra implementation this value must be set to 2.\n"
722     "# 2 - send all neighbors\n"
723     "# (default is %u)\n"
724     "\n", TC_REDUNDANCY);
725   abuf_appendf(out, "%sTcRedundancy  %d\n",
726       cnf->tc_redundancy == TC_REDUNDANCY ? "# " : "",
727       cnf->tc_redundancy);
728   abuf_appendf(out,
729     "\n"
730     "# MPR coverage specifies how many MPRs a node should\n"
731     "# try select to reach every 2 hop neighbor. Because of\n"
732     "# a design problem in the 0.5.x dijkstra algorithm this\n"
733     "# value should be set to 7.\n"
734     "# (default is %u)\n"
735     "\n", MPR_COVERAGE);
736   abuf_appendf(out, "%sMprCoverage %d\n",
737       cnf->mpr_coverage == MPR_COVERAGE ? "# " : "",
738       cnf->mpr_coverage);
739   abuf_appendf(out,
740     "\n"
741     "################################\n"
742     "### OLSR protocol extensions ###\n"
743     "################################\n"
744     "\n"
745     "# Link quality level switch between hopcount and \n"
746     "# cost-based (mostly ETX) routing. Because of\n"
747     "# a design problem in the 0.5.x dijkstra algorithm this\n"
748     "# value should not be set to 1.\n"
749     "# 0 = do not use link quality\n"
750     "# 2 = use link quality for MPR selection and routing\n"
751     "# (default is %u)\n"
752     "\n", DEF_LQ_LEVEL);
753   abuf_appendf(out, "%sLinkQualityLevel %d\n",
754       cnf->lq_level == DEF_LQ_LEVEL ? "# " : "",
755       cnf->lq_level);
756   abuf_appendf(out,
757     "\n"
758     "# Link quality algorithm (only for lq level 2)\n"
759     "# (see README-Olsr-Extensions)\n"
760     "# - \"etx_float\", a floating point  ETX with exponential aging\n"
761     "# - \"etx_fpm\", same as ext_float, but with integer arithmetic\n"
762     "# - \"etx_ff\" (ETX freifunk), an etx variant which use all OLSR\n"
763     "#   traffic (instead of only hellos) for ETX calculation\n"
764     "# - \"etx_ffeth\", an incompatible variant of etx_ff that allows\n"
765     "#   ethernet links with ETX 0.1.\n"
766     "# (default is \"%s\")\n"
767     "\n", DEF_LQ_ALGORITHM);
768   abuf_appendf(out, "%sLinkQualityAlgorithm    \"%s\"\n",
769       cnf->lq_algorithm == NULL ? "# " : "",
770       cnf->lq_algorithm == NULL ? DEF_LQ_ALGORITHM : cnf->lq_algorithm);
771   abuf_appendf(out,
772     "\n"
773     "# Link quality aging factor (only for lq level 2)\n"
774     "# Tuning parameter for etx_float and etx_fpm, smaller values\n"
775     "# mean slower changes of ETX value. (allowed values are\n"
776     "# between 0.01 and 1.0)\n"
777     "# (default is %.2f)\n"
778     "\n", (double)DEF_LQ_AGING);
779   abuf_appendf(out, "%sLinkQualityAging %.2f\n",
780       cnf->lq_aging == (float)DEF_LQ_AGING ? "# " : "",
781       (double)cnf->lq_aging);
782   abuf_appendf(out,
783     "\n"
784     "# Fisheye mechanism for TCs (0 meansoff, 1 means on)\n"
785     "# (default is %u)\n"
786     "\n", DEF_LQ_FISH);
787   abuf_appendf(out, "%sLinkQualityFishEye  %d\n",
788       cnf->lq_fish == DEF_LQ_FISH ? "# " : "",
789       cnf->lq_fish);
790   abuf_appendf(out,
791     "\n"
792     "#\n"
793     "# NatThreshold \n"
794     "#\n"
795     "# (currently this is only in the freifunk firmware)\n"
796     "# If the NAT-Endpoint (the preferred 0/0 HNA emitting node)\n"
797     "# is to be changed, the ETX value of the current 0/0 is \n"
798     "# multiplied with the NatThreshold value before being\n"
799     "# compared to the new one.\n"
800     "# The parameter can be a value between 0.1 and 1.0, but\n"
801     "# should be close to 1.0 if changed.\n"
802     "# WARNING: This parameter should not be used together with\n"
803     "# the etx_ffeth metric !!\n"
804     "# (default is %.1f)\n"
805     "\n", (double)DEF_LQ_NAT_THRESH);
806   abuf_appendf(out, "%sNatThreshold  %.1f\n",
807       cnf->lq_nat_thresh == (float)DEF_LQ_NAT_THRESH ? "# " : "",
808       (double)cnf->lq_nat_thresh);
809
810   abuf_puts(out,
811     "\n"
812     "#############################################################\n"
813     "### Configuration of the IPC to the windows GUI interface ###\n"
814     "#############################################################\n"
815     "\n"
816     "IpcConnect\n"
817     "{\n"
818     "    # Determines how many simultaneously\n"
819     "    # IPC connections that will be allowed\n"
820     "    # Setting this to 0 disables IPC\n"
821     "\n");
822   abuf_appendf(out, "  %sMaxConnections  %d\n",
823       cnf->ipc_connections == DEF_IPC_CONNECTIONS ? "# " : "",
824       cnf->ipc_connections);
825   abuf_puts(out,
826     "\n"
827     "    # By default only 127.0.0.1 is allowed\n"
828     "    # to connect. Here allowed hosts and networks can\n"
829     "    # be added\n"
830     "\n");
831
832   while (ipc_nets) {
833     if (ipc_nets->net.prefix_len == olsr_cnf->maxplen) {
834       abuf_appendf(out, "    Host %s\n", olsr_ip_to_string(&ipbuf, &ipc_nets->net.prefix));
835     } else {
836       abuf_appendf(out, "    Net  %s\n", olsr_ip_prefix_to_string(&ipc_nets->net));
837     }
838     ipc_nets = ipc_nets->next;
839   }
840   abuf_puts(out,
841     "}\n"
842     "\n"
843     "#####################################\n"
844     "### Example plugin configurations ###\n"
845     "#####################################\n"
846     "# Olsrd plugins to load\n"
847     "# This must be the absolute path to the file\n"
848     "# or the loader will use the following scheme:\n"
849     "# - Try the paths in the LD_LIBRARY_PATH \n"
850     "#   environment variable.\n"
851     "# - The list of libraries cached in /etc/ld.so.cache\n"
852     "# - /lib, followed by /usr/lib\n"
853     "\n");
854
855   while (plugins) {
856     abuf_appendf(out, "LoadPlugin \"%s\" {\n", plugins->name);
857     pl_param = plugins->params;
858     while (pl_param) {
859       abuf_appendf(out, "    PlParam \"%s\"\t\"%s\"\n", pl_param->key, pl_param->value);
860       pl_param = pl_param->next;
861     }
862     abuf_puts(out, "}\n"
863         "\n");
864     plugins = plugins->next;
865   }
866
867   abuf_puts(out,
868     "#############################################\n"
869     "### OLSRD default interface configuration ###\n"
870     "#############################################\n"
871     "# the default interface section can have the same values as the following\n"
872     "# interface configuration. It will allow you so set common options for all\n"
873     "# interfaces.\n"
874     "\n"
875     "InterfaceDefaults\n");
876   olsrd_write_if_autobuf(out, cnf->interface_defaults, false);
877   abuf_puts(out,
878     "\n"
879     "######################################\n"
880     "### OLSRd Interfaces configuration ###\n"
881     "######################################\n"
882     "# multiple interfaces can be specified for a single configuration block\n"
883     "# multiple configuration blocks can be specified\n"
884     "\n");
885   first = true;
886   while (interf) {
887     abuf_appendf(out, "Interface \"%s\"\n", interf->name);
888     olsrd_write_if_autobuf(out, interf->cnf, first);
889
890     first = false;
891     interf = interf->next;
892   }
893
894   abuf_puts(out,
895       "\n"
896       "# END AUTOGENERATED CONFIG\n");
897 }
898 /*
899  * Local Variables:
900  * c-basic-offset: 2
901  * indent-tabs-mode: nil
902  * End:
903  */