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