cfgfile_gen: improve printing of HNAs
[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 #include "../egressTypes.h"
47
48 #include <stdarg.h>
49 #include <stdio.h>
50 #include <string.h>
51 #include <errno.h>
52 #include <sys/types.h>
53 #include <netinet/in.h>
54 #include <arpa/inet.h>
55
56 #ifdef __linux__
57 #include <linux/rtnetlink.h>
58 #else
59 #define RTPROT_BOOT 3
60 #endif
61
62 int olsrd_write_cnf(struct olsrd_config *cnf, const char *fname) {
63   FILE *fd;
64   struct autobuf abuf;
65
66   fd = fopen(fname, "w");
67
68   if (fd == NULL) {
69     fprintf(stderr, "Could not open file %s for writing\n%s\n", fname, strerror(errno));
70     return -1;
71   }
72
73   printf("Writing config to file \"%s\".... ", fname);
74   abuf_init(&abuf, 1024);
75   olsrd_write_cnf_autobuf(&abuf, cnf);
76   if (fwrite(abuf.buf, abuf.len, 1, fd) < (size_t)abuf.len) {
77     fprintf(stderr, "Error, could not write the complete config file.\n");
78   }
79   abuf_free(&abuf);
80   fclose(fd);
81
82   printf("DONE\n");
83
84   return 1;
85 }
86
87 static int
88 if_appendf(struct autobuf *autobuf, bool comments, const char *fmt, ...)  __attribute__ ((format(printf, 3, 4)));
89
90 static int
91 if_appendf(struct autobuf *autobuf, bool comments, const char *fmt, ...)
92 {
93   int rv;
94   va_list ap;
95   char *first;
96
97   if (!comments) {
98     va_start(ap, fmt);
99     first = va_arg(ap, char*);
100     va_end(ap);
101     if (*first) {
102       return 0;
103     }
104   }
105
106   va_start(ap, fmt);
107   rv = abuf_vappendf(autobuf, fmt, ap);
108   va_end(ap);
109   return rv;
110 }
111
112 static void olsrd_write_hna_autobuf(int ip_version, struct ip_prefix_list *hna, struct autobuf *out, struct olsrd_config *cnf) {
113   struct ip_prefix_list *hna1 = (cnf->ip_version == ip_version) ? hna : NULL;
114
115   abuf_appendf(out, "Hna%u\n"
116     "{\n",
117     ip_version == AF_INET ? 4 : 6);
118
119   if (!hna1) {
120     if (ip_version == AF_INET)
121       abuf_puts(out,
122           "# Internet gateway\n"
123           "# 0.0.0.0   0.0.0.0\n"
124           "# specific small networks reachable through this node\n"
125           "# 15.15.0.0 255.255.255.0\n");
126     else
127       abuf_puts(out,
128           "# Internet gateway\n"
129           "#   0::                     0\n"
130           "# specific small networks reachable through this node\n"
131           "#   fec0:2200:106:0:0:0:0:0 48\n");
132   } else
133     while (hna1) {
134       struct ipaddr_str strbuf;
135       abuf_appendf(out, "    %s\n", olsr_ip_prefix_to_string(&hna1->net));
136       hna1 = hna1->next;
137     }
138   abuf_appendf(out, "}\n");
139 }
140
141 static void olsrd_write_if_autobuf(struct autobuf *out, struct olsrd_config *cnf, struct if_config_options *cnfi, bool comments) {
142   struct ipaddr_str ipbuf;
143   struct olsr_lq_mult *mult;
144
145   abuf_puts(out, "{\n");
146   if (comments) abuf_appendf(out,
147     "    # Interface Mode is used to prevent unnecessary\n"
148     "    # packet forwarding on switched ethernet interfaces\n"
149     "    # valid Modes are \"mesh\" and \"ether\"\n"
150     "    # (default is \"%s\")\n"
151     "\n", OLSR_IF_MODE[DEF_IF_MODE]);
152   if_appendf(out, comments, "    %sMode \"%s\"\n",
153       cnfi->mode == DEF_IF_MODE ? "# " : "",
154       OLSR_IF_MODE[cnfi->mode]);
155   if (comments) abuf_puts(out,
156     "\n"
157     "    # IPv4 broadcast address for outgoing OLSR packets.\n"
158     "    # One useful example would be 255.255.255.255\n"
159     "    # The second useful value would be to\n"
160     "    # specify the peer address of an ptp-tunnel.\n"
161     "    # another name of this parameter is \"IPv4Multicast\"\n"
162     "    # (default is 0.0.0.0, which triggers the usage of the\n"
163     "    # interface broadcast IP)\n"
164     "\n");
165   if_appendf(out, comments, "    %sIp4Broadcast      %s\n",
166       cnfi->ipv4_multicast.v4.s_addr == 0 ? "# " : "",
167       inet_ntop(AF_INET, &cnfi->ipv4_multicast, ipbuf.buf, sizeof(ipbuf)));
168   if (comments) abuf_appendf(out,
169     "\n"
170     "    # IPv6 multicast address\n"
171     "    # (default is %s, the manet-router linklocal multicast)\n"
172     "\n", inet_ntop(AF_INET6, &ipv6_def_multicast, ipbuf.buf, sizeof(ipbuf)));
173   if_appendf(out, comments, "    %sIPv6Multicast %s\n",
174       memcmp(&cnfi->ipv6_multicast, &ipv6_def_multicast, sizeof(ipv6_def_multicast)) == 0 ? "# " : "",
175       inet_ntop(AF_INET6, &cnfi->ipv6_multicast, ipbuf.buf, sizeof(ipbuf)));
176   if (comments) abuf_puts(out,
177     "\n"
178     "    # IPv4 src address for outgoing OLSR packages\n"
179     "    # (default is 0.0.0.0, which triggers usage of the interface IP)\n"
180     "\n");
181   if_appendf(out, comments, "    %sIPv4Src %s\n",
182       cnfi->ipv4_src.v4.s_addr == 0 ? "# " : "",
183       inet_ntop(AF_INET, &cnfi->ipv4_src, ipbuf.buf, sizeof(ipbuf)));
184   if (comments) abuf_puts(out,
185     "\n"
186     "    # IPv6 src prefix. OLSRd will choose one of the interface IPs\n"
187     "    # which matches the prefix of this parameter.\n"
188     "    # (default is 0::/0, which triggers the usage\n"
189     "    # of a not-linklocal interface IP)\n"
190     "\n");
191   {
192     int saved = cnf->ip_version;
193     cnf->ip_version = AF_INET6;
194     if_appendf(out, comments, "    %sIPv6Src %s\n",
195       cnfi->ipv6_src.prefix_len == 0 ? "# " : "",
196           olsr_ip_prefix_to_string(&cnfi->ipv6_src));
197     cnf->ip_version = saved;
198   }
199   if (comments) abuf_appendf(out,
200     "\n"
201     "    # Emission intervals in seconds.\n"
202     "    # If not defined, Freifunk network defaults are used.\n"
203     "    # (defaults: Hello = %.1f/%.1f,  TC  = %.1f/%.1f,\n"
204     "    #            MID   = %.1f/%.1f, HNA = %.1f/%.1f)\n"
205     "\n",
206     (double)HELLO_INTERVAL, (double)NEIGHB_HOLD_TIME,
207     (double)TC_INTERVAL,    (double)TOP_HOLD_TIME,
208     (double)MID_INTERVAL,   (double)MID_HOLD_TIME,
209     (double)HNA_INTERVAL,   (double)HNA_HOLD_TIME
210     );
211   if_appendf(out, comments, "    %sHelloInterval       %3.1f\n",
212       cnfi->hello_params.emission_interval == HELLO_INTERVAL ? "# " : "",
213       (double)cnfi->hello_params.emission_interval);
214   if_appendf(out, comments, "    %sHelloValidityTime   %3.1f\n",
215       cnfi->hello_params.validity_time == NEIGHB_HOLD_TIME ? "# " : "",
216       (double)cnfi->hello_params.validity_time);
217   if_appendf(out, comments, "    %sTcInterval          %3.1f\n",
218       cnfi->tc_params.emission_interval == TC_INTERVAL ? "# " : "",
219       (double)cnfi->tc_params.emission_interval);
220   if_appendf(out, comments, "    %sTcValidityTime      %3.1f\n",
221       cnfi->tc_params.validity_time == TOP_HOLD_TIME ? "# " : "",
222       (double)cnfi->tc_params.validity_time);
223   if_appendf(out, comments, "    %sMidInterval         %3.1f\n",
224       cnfi->mid_params.emission_interval == MID_INTERVAL ? "# " : "",
225       (double)cnfi->mid_params.emission_interval);
226   if_appendf(out, comments, "    %sMidValidityTime     %3.1f\n",
227       cnfi->mid_params.validity_time == MID_HOLD_TIME ? "# " : "",
228       (double)cnfi->mid_params.validity_time);
229   if_appendf(out, comments, "    %sHnaInterval         %3.1f\n",
230       cnfi->hna_params.emission_interval == HNA_INTERVAL ? "# " : "",
231       (double)cnfi->hna_params.emission_interval);
232   if_appendf(out, comments, "    %sHnaValidityTime     %3.1f\n",
233       cnfi->hna_params.validity_time == HNA_HOLD_TIME ? "# " : "",
234       (double)cnfi->hna_params.validity_time);
235   if (comments) abuf_puts(out,
236     "\n"
237     "    # When multiple links exist between hosts\n"
238     "    # the weight of interface is used to determine\n"
239     "    # the link to use. Normally the weight is\n"
240     "    # automatically calculated by olsrd based\n"
241     "    # on the characteristics of the interface,\n"
242     "    # but here you can specify a fixed value.\n"
243     "    # Olsrd will choose links with the lowest value.\n"
244     "    # Note:\n"
245     "    # Interface weight is used only when LinkQualityLevel is set to 0.\n"
246     "    # For any other value of LinkQualityLevel, the interface ETX\n"
247     "    # value is used instead.\n");
248   if_appendf(out, comments, "    %sWeight %d\n",
249       !cnfi->weight.fixed ? "# " : "",
250       cnfi->weight.value);
251   if (comments) abuf_puts(out,
252     "\n"
253     "    # If a certain route should be preferred\n"
254     "    # or ignored by the mesh, the Link Quality\n"
255     "    # value of a node can be multiplied with a factor\n"
256     "    # entered here. In the example the route\n"
257     "    # using 192.168.0.1 would rather be ignored.\n"
258     "    # A multiplier of 0.5 will result in a small\n"
259     "    # (bad) LinkQuality value and a high (bad)\n"
260     "    # ETX value.\n"
261     "    # Note:\n"
262     "    # Link quality multiplier is used only when\n"
263     "    # LinkQualityLevel is greater than 0.\n"
264     "\n");
265   mult = cnfi->lq_mult;
266
267   if (mult == NULL) {
268     if (comments) {
269       abuf_puts(out, "    # example 1: reduce LQ to 192.168.0.1 by half\n");
270       abuf_puts(out, "    # LinkQualityMult 192.168.0.1 0.5\n");
271       abuf_puts(out, "\n");
272       abuf_puts(out, "    # example 2: reduce LQ to all nodes on this interface by 20%\n");
273       abuf_puts(out, "    # LinkQualityMult default 0.8\n");
274     }
275   } else {
276     while (mult != NULL) {
277       if_appendf(out, comments, "    LinkQualityMult    %s %0.2f\n",
278           olsr_ip_to_string(&ipbuf, &mult->addr),
279           (double)((float)(mult->value) / 65536.0f));
280       mult = mult->next;
281     }
282   }
283   abuf_puts(out, "}\n");
284 }
285
286 void olsrd_write_cnf_autobuf(struct autobuf *out, struct olsrd_config *cnf) {
287   struct ip_prefix_list *hna = cnf->hna_entries;
288   struct olsr_if *interf = cnf->interfaces;
289   struct plugin_entry *plugins = cnf->plugins;
290   struct plugin_param *pl_param;
291   struct ip_prefix_list *ipc_nets = cnf->ipc_nets;
292
293   struct ipaddr_str ipbuf;
294   bool first;
295
296   abuf_appendf(out, "#\n"
297       "# Configuration file for %s\n"
298       "# automatically generated by olsrd-cnf parser v. %s\n"
299       "#\n"
300       "\n",
301       olsrd_version, PARSER_VERSION);
302   abuf_appendf(out,
303     "# OLSR.org routing daemon config file\n"
304     "# This file contains ALL available options and explanations about them\n"
305     "#\n"
306     "# Lines starting with a # are discarded\n"
307     "#\n"
308     "\n"
309     "#### ATTENTION for IPv6 users ####\n"
310     "# Because of limitations in the parser IPv6 addresses must NOT\n"
311     "# begin with a \":\", so please add a \"0\" as a prefix.\n"
312     "\n"
313     "###########################\n"
314     "### Basic configuration ###\n"
315     "###########################\n"
316     "# keep this settings at the beginning of your first configuration file\n"
317     "\n"
318     "# Debug level (0-9)\n"
319     "# If set to 0 the daemon runs in the background, unless \"NoFork\" is set to true\n"
320     "# (default is %u)\n"
321     "\n", DEF_DEBUGLVL);
322   abuf_appendf(out, "%sDebugLevel  %d\n",
323       cnf->debug_level == DEF_DEBUGLVL ? "# " : "",
324       cnf->debug_level);
325   abuf_appendf(out,
326     "\n"
327     "# IP version to use (4 or 6)\n"
328     "# (default is %u)\n"
329     "\n", (DEF_IP_VERSION == AF_INET) ? 4 : 6);
330   abuf_appendf(out, "%sIpVersion %d\n",
331       cnf->ip_version == DEF_IP_VERSION ? "# " : "",
332       cnf->ip_version == AF_INET ? 4 : 6);
333   abuf_appendf(out,
334     "\n"
335     "#################################\n"
336     "### OLSRd agent configuration ###\n"
337     "#################################\n"
338     "# this parameters control the settings of the routing agent which are not\n"
339     "# related to the OLSR protocol and it's extensions\n"
340     "\n"
341     "# Clear the screen each time the internal state changes\n"
342     "# (default is %s)\n"
343     "\n", DEF_CLEAR_SCREEN ? "yes" : "no");
344   abuf_appendf(out, "%sClearScreen     %s\n",
345       cnf->clear_screen == DEF_CLEAR_SCREEN ? "# " : "",
346       cnf->clear_screen ? "yes" : "no");
347   abuf_appendf(out,
348     "\n"
349     "# Should olsrd keep on running even if there are\n"
350     "# no interfaces available? This is a good idea\n"
351     "# for a PCMCIA/USB hotswap environment.\n"
352     "# (default is %s)\n"
353     "\n", DEF_ALLOW_NO_INTS ? "yes" : "no");
354   abuf_appendf(out, "%sAllowNoInt  %s\n",
355       cnf->allow_no_interfaces == DEF_ALLOW_NO_INTS ? "# " : "",
356       cnf->allow_no_interfaces ? "yes" : "no");
357   abuf_puts(out,
358     "\n"
359     "# LockFile\n"
360     "# The lockfile is used to prevent multiple OLSR instances running at the same\n"
361     "# time.\n"
362     "# (Linux/BSD default is \"/var/run/olsrd-ipv(4/6).lock\")\n"
363     "# (Win32     default is \"[configfile]-ipv(4/6).lock\")\n"
364     "\n");
365   {
366     char * lockfile_default = olsrd_get_default_lockfile(cnf);
367     abuf_appendf(out, "%sLockFile \"%s\"\n",
368         !strcmp(cnf->lock_file, lockfile_default) ? "# " : "",
369         cnf->lock_file);
370     free(lockfile_default);
371   }
372   abuf_appendf(out,
373     "\n"
374     "# Polling rate for OLSR sockets in seconds (float).\n"
375     "# (default is %.2f)\n"
376     "\n", (double)DEF_POLLRATE);
377   abuf_appendf(out, "%sPollrate  %.2f\n",
378       cnf->pollrate == (float)DEF_POLLRATE ? "# " : "",
379       (double)cnf->pollrate);
380   abuf_appendf(out,
381     "\n"
382     "# Interval to poll network interfaces for configuration changes (in seconds).\n"
383     "# Linux systems can detect interface statechange via netlink sockets.\n"
384     "# (default is %.1f)\n"
385     "\n", (double)DEF_NICCHGPOLLRT);
386   abuf_appendf(out, "%sNicChgsPollInt  %.1f\n",
387       cnf->nic_chgs_pollrate == (float)DEF_NICCHGPOLLRT ? "# " : "",
388       (double)cnf->nic_chgs_pollrate);
389   abuf_appendf(out,
390     "\n"
391     "# TOS(type of service) value for the IP header of control traffic.\n"
392     "# (default is %u)\n"
393     "\n", DEF_TOS);
394   abuf_appendf(out, "%sTosValue %u\n",
395       cnf->tos == DEF_TOS ? "# " : "",
396       cnf->tos);
397   abuf_appendf(out,
398     "\n"
399     "# FIBMetric controls the metric value of the host-routes OLSRd sets.\n"
400     "# - \"flat\" means that the metric value is always 2 (or as configured\n"
401     "#   with FIBMetricDefault). This is the preferred value because it helps\n"
402     "#   the linux kernel routing to clean up older routes\n"
403     "# - \"correct\" use the hopcount as the metric value.\n"
404     "# - \"approx\" use the hopcount as the metric value too, but does only update the\n"
405     "#   hopcount if the nexthop changes too\n"
406     "# (default is \"%s\")\n"
407     "\n", FIB_METRIC_TXT[DEF_FIB_METRIC]);
408   abuf_appendf(out, "%sFIBMetric \"%s\"\n",
409       cnf->fib_metric == DEF_FIB_METRIC ? "# " : "",
410       FIB_METRIC_TXT[cnf->fib_metric]);
411   abuf_appendf(out,
412     "\n"
413     "# Default FIB metric.\n"
414     "# The kernel FIB does not need to know the metric of a route.\n"
415     "# This saves us from enqueuing/dequeueing hopcount only changes.\n"
416     "# (default is %u)\n"
417     "\n", DEF_FIB_METRIC_DEFAULT);
418   abuf_appendf(out, "%sFIBMetricDefault %u\n",
419       cnf->fib_metric_default == DEF_FIB_METRIC_DEFAULT? "# " : "",
420       cnf->fib_metric_default);
421   abuf_appendf(out,
422     "\n"
423     "#######################################\n"
424     "### Linux specific OLSRd extensions ###\n"
425     "#######################################\n"
426     "# these parameters are only working on linux at the moment, but might become\n"
427     "# useful on BSD in the future\n"
428     "\n"
429     "# SrcIpRoutes tells OLSRd to set the Src flag of host routes to the originator-ip\n"
430     "# of the node. In addition to this an additional localhost device is created\n"
431     "# to make sure the returning traffic can be received.\n"
432     "# (default is \"%s\")\n"
433     "\n", DEF_USE_SRCIP_ROUTES ? "yes" : "no");
434   abuf_appendf(out, "%sSrcIpRoutes %s\n",
435       cnf->use_src_ip_routes == DEF_USE_SRCIP_ROUTES ? "# " : "",
436       cnf->use_src_ip_routes ? "yes" : "no");
437   abuf_appendf(out,
438     "\n"
439     "# Specify the proto tag to be used for routes olsr inserts into kernel\n"
440     "# currently only implemented for linux\n"
441     "# valid values under linux are 1 .. 254\n"
442     "# 1 gets remapped by olsrd to 0 UNSPECIFIED (1 is reserved for ICMP redirects)\n"
443     "# 2 KERNEL routes (not very wise to use)\n"
444     "# 3 BOOT (should in fact not be used by routing daemons)\n"
445     "# 4 STATIC\n"
446     "# 8 .. 15 various routing daemons (gated, zebra, bird, & co)\n"
447     "# (default is %u which gets replaced by an OS-specific default value;\n"
448     "# %u (BOOT) under linux (for backward compatibility)\n"
449     "\n", DEF_RTPROTO, RTPROT_BOOT);
450   {
451     int expected = DEF_RTPROTO;
452 #ifdef __linux__
453     expected = RTPROT_BOOT;
454 #endif
455     abuf_appendf(out, "%sRtProto %u\n",
456         cnf->rt_proto == expected ? "# " : "",
457         cnf->rt_proto == expected ? DEF_RTPROTO : cnf->rt_proto);
458   }
459   abuf_appendf(out,
460     "\n"
461     "# Specifies the routing Table olsr uses\n"
462     "# RtTable is for host routes, RtTableDefault for the route to the default\n"
463     "# internet gateway (2 in case of IPv6+NIIT) and RtTableTunnel is for\n"
464     "# routes to the ipip tunnels, valid values are 1 to 254\n"
465     "# There is a special parameter \"auto\" (choose default below)\n"
466     "# (with    smartgw: default is %u/%u/%u)\n"
467     "# (without smartgw: default is %u/%u/%u, linux main table)\n"
468     "\n",
469     DEF_SGW_RT_TABLE_NR, DEF_SGW_RT_TABLE_DEFAULT_NR, DEF_SGW_RT_TABLE_TUNNEL_NR,
470     DEF_RT_TABLE_NR, DEF_RT_TABLE_DEFAULT_NR, DEF_RT_TABLE_TUNNEL_NR);
471   if (!cnf->smart_gw_active) {
472     abuf_appendf(out, "%sRtTable        %u\n",
473         cnf->rt_table == DEF_RT_TABLE_NR ? "# " : "",
474         cnf->rt_table);
475     abuf_appendf(out, "%sRtTableDefault %u\n",
476         cnf->rt_table_default == DEF_RT_TABLE_DEFAULT_NR ? "# " : "",
477         cnf->rt_table_default);
478     abuf_appendf(out, "%sRtTableTunnel  %u\n",
479         cnf->rt_table_tunnel == DEF_RT_TABLE_TUNNEL_NR ? "# " : "",
480         cnf->rt_table_tunnel);
481   } else {
482     abuf_appendf(out, "%sRtTable        %u\n",
483         cnf->rt_table == DEF_SGW_RT_TABLE_NR ? "# " : "",
484         cnf->rt_table);
485     abuf_appendf(out, "%sRtTableDefault %u\n",
486         cnf->rt_table_default == DEF_SGW_RT_TABLE_DEFAULT_NR ? "# " : "",
487         cnf->rt_table_default);
488     abuf_appendf(out, "%sRtTableTunnel  %u\n",
489         cnf->rt_table_tunnel == DEF_SGW_RT_TABLE_TUNNEL_NR ? "# " : "",
490         cnf->rt_table_tunnel);
491   }
492   abuf_appendf(out,
493     "\n"
494     "# Specifies the policy rule priorities for the three routing tables and\n"
495     "# a special rule for smartgateway routing (see README-Olsr-Extensions)\n"
496     "# Priorities can only be set if three different routing tables are set.\n"
497     "# if set the values must obey to condition\n"
498     "# RtTablePriority less than RtTableDefaultOlsrPriority\n"
499     "# less than RtTableTunnelPriority less than RtTableDefaultPriority\n"
500     "# There are two special parameters, \"auto\" (choose fitting to SmartGW\n"
501     "# mode) and \"none\" (do not set policy rule)\n"
502     "# (with    smartgw: default is %d/%u/%u/%u)\n"
503     "# (without smartgw: default is %d/%d   /%d   /%d   )\n"
504     "\n",
505     DEF_SGW_RT_TABLE_PRI,
506     DEF_SGW_RT_TABLE_PRI_BASE + DEF_SGW_RT_TABLE_DEFAULTOLSR_PRI_ADDER,
507     DEF_SGW_RT_TABLE_PRI_BASE + DEF_SGW_RT_TABLE_DEFAULTOLSR_PRI_ADDER + DEF_SGW_RT_TABLE_TUNNEL_PRI_ADDER,
508     DEF_SGW_RT_TABLE_PRI_BASE + DEF_SGW_RT_TABLE_DEFAULTOLSR_PRI_ADDER + DEF_SGW_RT_TABLE_TUNNEL_PRI_ADDER + DEF_SGW_RT_TABLE_DEFAULT_PRI_ADDER,
509     DEF_RT_TABLE_PRI,
510     DEF_RT_TABLE_DEFAULTOLSR_PRI,
511     DEF_RT_TABLE_TUNNEL_PRI,
512     DEF_RT_TABLE_DEFAULT_PRI);
513   if (!cnf->smart_gw_active) {
514     if (cnf->rt_table_pri == DEF_RT_TABLE_PRI) {
515       abuf_appendf(out, "# RtTablePriority            %d\n",
516           cnf->rt_table_pri);
517     } else {
518       abuf_appendf(out, "RtTablePriority            %u\n",
519           cnf->rt_table_pri);
520     }
521     if (cnf->rt_table_defaultolsr_pri == DEF_RT_TABLE_DEFAULTOLSR_PRI) {
522       abuf_appendf(out, "# RtTableDefaultOlsrPriority %d\n",
523           cnf->rt_table_defaultolsr_pri);
524     } else {
525       abuf_appendf(out, "RtTableDefaultOlsrPriority %u\n",
526           cnf->rt_table_defaultolsr_pri);
527     }
528     if (cnf->rt_table_tunnel_pri == DEF_RT_TABLE_TUNNEL_PRI) {
529       abuf_appendf(out, "# RtTableTunnelPriority      %d\n",
530           cnf->rt_table_tunnel_pri);
531     } else {
532       abuf_appendf(out, "RtTableTunnelPriority      %u\n",
533           cnf->rt_table_tunnel_pri);
534     }
535     if (cnf->rt_table_default_pri == DEF_RT_TABLE_DEFAULT_PRI) {
536       abuf_appendf(out, "# RtTableDefaultPriority     %d\n",
537           cnf->rt_table_default_pri);
538     } else {
539       abuf_appendf(out, "RtTableDefaultPriority     %u\n",
540           cnf->rt_table_default_pri);
541     }
542   } else {
543     if (cnf->rt_table_pri == DEF_SGW_RT_TABLE_PRI) {
544       abuf_appendf(out, "# RtTablePriority            %d\n",
545           cnf->rt_table_pri);
546     } else {
547       abuf_appendf(out, "RtTablePriority            %u\n",
548           cnf->rt_table_pri);
549     }
550     abuf_appendf(out, "%sRtTableDefaultOlsrPriority %u\n",
551         cnf->rt_table_defaultolsr_pri == (DEF_SGW_RT_TABLE_PRI_BASE + DEF_SGW_RT_TABLE_DEFAULTOLSR_PRI_ADDER) ? "# " : "",
552         cnf->rt_table_defaultolsr_pri);
553
554     abuf_appendf(out, "%sRtTableTunnelPriority      %u\n",
555         cnf->rt_table_tunnel_pri == (DEF_SGW_RT_TABLE_PRI_BASE + DEF_SGW_RT_TABLE_DEFAULTOLSR_PRI_ADDER + DEF_SGW_RT_TABLE_TUNNEL_PRI_ADDER) ? "# " : "",
556         cnf->rt_table_tunnel_pri);
557
558     abuf_appendf(out, "%sRtTableDefaultPriority     %u\n",
559         cnf->rt_table_default_pri == (DEF_SGW_RT_TABLE_PRI_BASE + DEF_SGW_RT_TABLE_DEFAULTOLSR_PRI_ADDER + DEF_SGW_RT_TABLE_TUNNEL_PRI_ADDER + DEF_SGW_RT_TABLE_DEFAULT_PRI_ADDER) ? "# " : "",
560         cnf->rt_table_default_pri);
561   }
562   abuf_appendf(out,
563     "\n"
564     "# Activates (in IPv6 mode) the automatic use of NIIT\n"
565     "# (see README-Olsr-Extensions)\n"
566     "# (default is \"%s\")\n"
567     "\n", DEF_USE_NIIT ? "yes" : "no");
568   abuf_appendf(out, "%sUseNiit %s\n",
569       cnf->use_niit == DEF_USE_NIIT ? "# " : "",
570       cnf->use_niit ? "yes" : "no");
571   abuf_appendf(out,
572     "\n"
573     "# Activates the smartgateway ipip tunnel feature.\n"
574     "# See README-Olsr-Extensions for a description of smartgateways.\n"
575     "# (default is \"%s\")\n"
576     "\n", DEF_SMART_GW ? "yes" : "no");
577   abuf_appendf(out, "%sSmartGateway %s\n",
578       cnf->smart_gw_active == DEF_SMART_GW ? "# " : "",
579       cnf->smart_gw_active ? "yes" : "no");
580   abuf_appendf(out,
581     "\n"
582     "# Signals that the server tunnel must always be removed on shutdown,\n"
583     "# irrespective of the interface up/down state during startup.\n"
584     "# (default is \"%s\")\n"
585     "\n", DEF_SMART_GW_ALWAYS_REMOVE_SERVER_TUNNEL ? "yes" : "no");
586   abuf_appendf(out, "%sSmartGatewayAlwaysRemoveServerTunnel %s\n",
587       cnf->smart_gw_always_remove_server_tunnel == DEF_SMART_GW_ALWAYS_REMOVE_SERVER_TUNNEL ? "# " : "",
588       cnf->smart_gw_always_remove_server_tunnel ? "yes" : "no");
589   abuf_appendf(out,
590     "\n"
591     "# Determines the maximum number of gateways that can be in use at any given\n"
592     "# time. This setting is used to mitigate the effects of breaking connections\n"
593     "# (due to the selection of a new gateway) on a dynamic network.\n"
594     "# (default is %u)\n"
595     "\n", DEF_GW_USE_COUNT);
596   abuf_appendf(out, "%sSmartGatewayUseCount %d\n",
597       cnf->smart_gw_use_count == DEF_GW_USE_COUNT ? "# " : "",
598       cnf->smart_gw_use_count);
599   abuf_appendf(out,
600     "\n"
601     "# Determines the take-down percentage for a non-current smart gateway tunnel.\n"
602     "# If the cost of the current smart gateway tunnel is less than this percentage\n"
603     "# of the cost of the non-current smart gateway tunnel, then the non-current smart\n"
604     "# gateway tunnel is taken down because it is then presumed to be 'too expensive'.\n"
605     "# This setting is only relevant when SmartGatewayUseCount is larger than 1;\n"
606     "# a value of 0 will result in the tunnels not being taken down proactively.\n"
607     "# (default is %u)\n"
608     "\n", DEF_GW_TAKEDOWN_PERCENTAGE);
609   abuf_appendf(out, "%sSmartGatewayTakeDownPercentage %d\n",
610       cnf->smart_gw_takedown_percentage == DEF_GW_TAKEDOWN_PERCENTAGE ? "# " : "",
611       cnf->smart_gw_takedown_percentage);
612   abuf_puts(out,
613     "\n"
614     "# Determines the policy routing script that is executed during startup and\n"
615     "# shutdown of olsrd. The script is only executed when SmartGatewayUseCount\n"
616     "# is set to a value larger than 1. The script must setup policy routing\n"
617     "# rules such that multi-gateway mode works. A sample script is included.\n"
618     "# (default is not set)\n"
619     "\n");
620   abuf_appendf(out, "%sSmartGatewayPolicyRoutingScript %s\n",
621       !cnf->smart_gw_policyrouting_script ? "# " : "",
622       !cnf->smart_gw_policyrouting_script ? "" : cnf->smart_gw_policyrouting_script);
623   abuf_puts(out,
624     "\n"
625     "# Determines the egress interfaces that are part of the multi-gateway setup and\n"
626     "# therefore only relevant when SmartGatewayUseCount is larger than 1 (in which\n"
627     "# case it must be explicitly set).\n"
628     "# (default is not set)\n"
629     "\n");
630   abuf_appendf(out, "%sSmartGatewayEgressInterfaces",
631       !cnf->smart_gw_egress_interfaces ? "# " : "");
632   {
633     struct sgw_egress_if * sgwegressif = olsr_cnf->smart_gw_egress_interfaces;
634     while (sgwegressif) {
635       abuf_appendf(out, " \"%s\"", sgwegressif->name);
636       sgwegressif = sgwegressif->next;
637     }
638     abuf_puts(out, "\n");
639   }
640   abuf_appendf(out,
641     "\n"
642     "# SmartGatewayEgressFile declares the file that contains the bandwidth\n"
643     "# parameters of the egress interfaces declared by SmartGatewayEgressInterfaces.\n"
644     "# Every line in the file declares bandwidth parameters of an egress interface,\n"
645     "# with the format:\n"
646     "#   # this is a comment\n"
647     "#   interface=upstream,downstream,pathcost,network/prefix,gateway\n"
648     "# Only the upstream and downstream fields are mandatory, the other fields are\n"
649     "# optional. An empty field signifies that its default should be used.\n"
650     "# The field defaults are:\n"
651     "#   upstream           = 0 (Kbps)\n"
652     "#   downstream         = 0 (Kbps)\n"
653     "#   pathcost           = 0 (dimensionless, 1024 is equivalent to 1 hop)\n"
654     "#   network/prefix     = no default / not set\n"
655     "#                        - network is an IP address\n"
656     "#                        - prefix is a number in the range [0, 24] for IPv4\n"
657     "#                          and in the range [0, 128] for IPv6\n"
658     "#   gateway            = no default / not set (IP address)\n"
659     "# (default is %s)\n"
660     "\n", DEF_GW_EGRESS_FILE);
661   {
662     bool def = !cnf->smart_gw_egress_file || !strcmp(cnf->smart_gw_egress_file, DEF_GW_EGRESS_FILE);
663     abuf_appendf(out, "%sSmartGatewayEgressFile %s\n",
664       def ? "# " : "", def ? DEF_GW_EGRESS_FILE : cnf->smart_gw_egress_file);
665   }
666   abuf_appendf(out,
667     "\n"
668     "# SmartGatewayEgressFilePeriod determines the period (in milliseconds) on which\n"
669     "# the SmartGatewayEgressFile is checked for changes and processed if changed.\n"
670     "# (default is %u)\n"
671     "\n", DEF_GW_EGRESS_FILE_PERIOD);
672   abuf_appendf(out, "%sSmartGatewayEgressFilePeriod %u\n",
673       cnf->smart_gw_egress_file_period == DEF_GW_EGRESS_FILE_PERIOD ? "# " : "",
674       cnf->smart_gw_egress_file_period);
675   abuf_appendf(out,
676     "\n"
677     "# Declares the file that is written by olsrd to contain the status of the smart\n"
678     "# gateways and is only relevant when SmartGatewayUseCount is larger than 1.\n"
679     "# (default is %s)\n"
680       "\n", "<not set>");
681     {
682       bool def = !cnf->smart_gw_status_file || !strlen(cnf->smart_gw_status_file);
683       abuf_appendf(out, "%sSmartGatewayStatusFile %s\n",
684         def ? "# " : "", def ? "<not set>" : cnf->smart_gw_status_file);
685     }
686   abuf_appendf(out,
687     "\n"
688     "# Determines the routing tables offset for multi-gateway policy routing tables\n"
689     "# See the policy routing script for an explanation.\n"
690     "# (default is %u)\n"
691     "\n", DEF_GW_OFFSET_TABLES);
692   abuf_appendf(out, "%sSmartGatewayTablesOffset %u\n",
693       cnf->smart_gw_offset_tables == DEF_GW_OFFSET_TABLES ? "# " : "",
694       cnf->smart_gw_offset_tables);
695   abuf_appendf(out,
696     "\n"
697     "# Determines the policy routing rules offset for multi-gateway policy routing\n"
698     "# rules. See the policy routing script for an explanation.\n"
699     "# (default is %u, which indicates that the rules and tables should be aligned and\n"
700     "# puts this value at SmartGatewayTablesOffset - # egress interfaces -\n"
701     "# # olsr interfaces)\n"
702     "\n", DEF_GW_OFFSET_RULES);
703   abuf_appendf(out, "%sSmartGatewayRulesOffset %u\n",
704       cnf->smart_gw_offset_rules == DEF_GW_OFFSET_RULES ? "# " : "",
705       cnf->smart_gw_offset_rules);
706   abuf_appendf(out,
707     "\n"
708     "# Allows the selection of a smartgateway with NAT (only for IPv4)\n"
709     "# (default is \"%s\")\n"
710     "\n", DEF_GW_ALLOW_NAT ? "yes" : "no");
711   abuf_appendf(out, "%sSmartGatewayAllowNAT %s\n",
712       cnf->smart_gw_allow_nat == DEF_GW_ALLOW_NAT ? "# " : "",
713       cnf->smart_gw_allow_nat ? "yes" : "no");
714   abuf_appendf(out,
715     "\n"
716     "# Determines the period (in milliseconds) on which a new smart gateway\n"
717     "# selection is performed.\n"
718     "# (default is %u milliseconds)\n"
719     "\n", DEF_GW_PERIOD);
720   abuf_appendf(out, "%sSmartGatewayPeriod %d\n",
721       cnf->smart_gw_period == DEF_GW_PERIOD ? "# " : "",
722       cnf->smart_gw_period);
723   abuf_appendf(out,
724     "\n"
725     "# Determines the number of times the link state database must be stable\n"
726     "# before a new smart gateway is selected.\n"
727     "# (default is %u)\n"
728     "\n", DEF_GW_STABLE_COUNT);
729   abuf_appendf(out, "%sSmartGatewayStableCount %d\n",
730       cnf->smart_gw_stablecount == DEF_GW_STABLE_COUNT ? "# " : "",
731       cnf->smart_gw_stablecount);
732   abuf_appendf(out,
733     "\n"
734     "# When another gateway than the current one has a cost of less than the cost\n"
735     "# of the current gateway multiplied by SmartGatewayThreshold then the smart\n"
736     "# gateway is switched to the other gateway. The unit is percentage.\n"
737     "# (default is %u)\n"
738     "\n", DEF_GW_THRESH);
739   abuf_appendf(out, "%sSmartGatewayThreshold %d\n",
740       cnf->smart_gw_thresh == DEF_GW_THRESH ? "# " : "",
741       cnf->smart_gw_thresh);
742   abuf_appendf(out,
743     "\n"
744     "# The weighing factor for the gateway uplink bandwidth (exit link, uplink).\n"
745     "# See README-Olsr-Extensions for a description of smart gateways.\n"
746     "# (default is %lu)\n"
747     "\n", (long unsigned int)DEF_GW_WEIGHT_EXITLINK_UP);
748   abuf_appendf(out, "%sSmartGatewayWeightExitLinkUp %d\n",
749       cnf->smart_gw_weight_exitlink_up == DEF_GW_WEIGHT_EXITLINK_UP ? "# " : "",
750       cnf->smart_gw_weight_exitlink_up);
751   abuf_appendf(out,
752     "\n"
753     "# The weighing factor for the gateway downlink bandwidth (exit link, downlink).\n"
754     "# See README-Olsr-Extensions for a description of smart gateways.\n"
755     "# (default is %lu)\n"
756     "\n", (long unsigned int)DEF_GW_WEIGHT_EXITLINK_DOWN);
757   abuf_appendf(out, "%sSmartGatewayWeightExitLinkDown %d\n",
758       cnf->smart_gw_weight_exitlink_down == DEF_GW_WEIGHT_EXITLINK_DOWN ? "# " : "",
759       cnf->smart_gw_weight_exitlink_down);
760   abuf_appendf(out,
761     "\n"
762     "# The weighing factor for the ETX costs.\n"
763     "# See README-Olsr-Extensions for a description of smart gateways.\n"
764     "# (default is %u)\n"
765     "\n", DEF_GW_WEIGHT_ETX);
766   abuf_appendf(out, "%sSmartGatewayWeightEtx %d\n",
767       cnf->smart_gw_weight_etx == DEF_GW_WEIGHT_ETX ? "# " : "",
768       cnf->smart_gw_weight_etx);
769   abuf_appendf(out,
770     "\n"
771     "# The divider for the ETX costs.\n"
772     "# See README-Olsr-Extensions for a description of smart gateways.\n"
773     "# (default is %u)\n"
774     "\n", DEF_GW_DIVIDER_ETX);
775   abuf_appendf(out, "%sSmartGatewayDividerEtx %d\n",
776       cnf->smart_gw_divider_etx == DEF_GW_DIVIDER_ETX ? "# " : "",
777       cnf->smart_gw_divider_etx);
778   abuf_appendf(out,
779     "\n"
780     "# Defines what kind of Uplink this node will publish as a\n"
781     "# smartgateway. The existence of the uplink is detected by\n"
782     "# a route to 0.0.0.0/0, ::ffff:0:0/96 and/or 2000::/3.\n"
783     "# possible values are \"none\", \"ipv4\", \"ipv6\", \"both\"\n"
784     "# (default is \"%s\")\n"
785     "\n", GW_UPLINK_TXT[DEF_GW_TYPE]);
786   abuf_appendf(out, "%sSmartGatewayUplink \"%s\"\n",
787       cnf->smart_gw_type == DEF_GW_TYPE ? "# " : "",
788       GW_UPLINK_TXT[cnf->smart_gw_type]);
789   abuf_appendf(out,
790     "\n"
791     "# Specifies if the local ipv4 uplink use NAT\n"
792     "# (default is \"%s\")\n"
793     "\n", DEF_GW_UPLINK_NAT ? "yes" : "no");
794   abuf_appendf(out, "%sSmartGatewayUplinkNAT %s\n",
795       cnf->smart_gw_uplink_nat == DEF_GW_UPLINK_NAT ? "# " : "",
796       cnf->smart_gw_uplink_nat ? "yes" : "no");
797   abuf_appendf(out,
798     "\n"
799     "# Specifies the speed of the uplink in kilobit/s.\n"
800     "# First parameter is upstream, second parameter is downstream\n"
801     "# (default is %u/%u)\n"
802     "\n", DEF_UPLINK_SPEED, DEF_DOWNLINK_SPEED);
803   abuf_appendf(out, "%sSmartGatewaySpeed %d %d\n",
804       cnf->smart_gw_uplink == DEF_UPLINK_SPEED && cnf->smart_gw_downlink == DEF_DOWNLINK_SPEED ? "# " : "",
805       cnf->smart_gw_uplink, cnf->smart_gw_downlink);
806   abuf_puts(out,
807     "\n"
808     "# Specifies the EXTERNAL ipv6 prefix of the uplink. A prefix\n"
809     "# length of more than 64 is not allowed.\n"
810     "# (default is 0::/0)\n"
811     "\n");
812   abuf_appendf(out, "%sSmartGatewayPrefix %s\n",
813       cnf->smart_gw_prefix.prefix_len == 0 ? "# " : "",
814       olsr_ip_prefix_to_string(&cnf->smart_gw_prefix));
815   abuf_appendf(out,
816     "\n"
817     "##############################\n"
818     "### OLSR protocol settings ###\n"
819     "##############################\n"
820     "\n"
821     "# For testing purposes it may be nice to use another port for olsrd\n"
822     "# for using another port than the IANA assigned one\n"
823     "# for a production network, there should be a good reason!!\n"
824     "# valid values are integers greater than 1, please be careful with\n"
825     "# using reserved port numbers\n"
826     "# (default is %u, the IANA assigned olsr-port)\n"
827     "\n", DEF_OLSRPORT);
828   abuf_appendf(out, "%sOlsrPort %u\n",
829       cnf->olsrport == DEF_OLSRPORT ? "# " : "",
830       cnf->olsrport);
831   abuf_puts(out,
832     "\n"
833     "# Sets the main IP (originator ip) of the router. This IP will NEVER\n"
834     "# change during the uptime of olsrd.\n"
835     "# (default is 0.0.0.0, which triggers usage of the IP of the first interface)\n"
836     "\n");
837   abuf_appendf(out, "MainIp %s\n",
838       olsr_ip_to_string(&ipbuf, &cnf->main_addr));
839   abuf_appendf(out,
840     "\n"
841     "# The fixed willingness to use (0-7)\n"
842     "# If not set willingness will be calculated\n"
843     "# dynamically based on battery/power status\n"
844     "# (default is %u)\n"
845     "\n", DEF_WILLINGNESS);
846   abuf_appendf(out, "%sWillingness     %u\n",
847       cnf->willingness == DEF_WILLINGNESS ? "# " : "",
848       cnf->willingness);
849   abuf_puts(out,
850     "\n"
851     "# HNA (Host network association) allows the OLSR to announce\n"
852     "# additional IPs or IP subnets to the net that are reachable\n"
853     "# through this node.\n"
854     "# Syntax for HNA4 is \"network-address    network-mask\"\n"
855     "# Syntax for HNA6 is \"network-address    prefix-length\"\n"
856     "# (default is no HNA)\n");
857   olsrd_write_hna_autobuf(AF_INET, hna, out, cnf);
858   olsrd_write_hna_autobuf(AF_INET6, hna, out, cnf);
859   abuf_appendf(out,
860     "\n"
861     "# Hysteresis for link sensing (only for hopcount metric)\n"
862     "# Hysteresis adds more robustness to the link sensing\n"
863     "# but delays neighbor registration.\n"
864     "# (default is %s)\n"
865     "\n", DEF_USE_HYST ? "yes" : "no");
866   abuf_appendf(out, "%sUseHysteresis %s\n",
867       cnf->use_hysteresis == DEF_USE_HYST ? "# " : "",
868       cnf->use_hysteresis ? "yes" : "no");
869   abuf_appendf(out,
870     "\n"
871     "# Hysteresis parameters (only for hopcount metric)\n"
872     "# Do not alter these unless you know what you are doing!\n"
873     "# Set to auto by default. Allowed values are floating point\n"
874     "# values in the interval 0,1\n"
875     "# THR_LOW must always be lower than THR_HIGH!!\n"
876     "# (default is %.2f/%.2f/%.2f)\n"
877     "\n", (double)HYST_SCALING, (double)HYST_THRESHOLD_HIGH, (double)HYST_THRESHOLD_LOW);
878   abuf_appendf(out, "%sHystScaling  %.2f\n",
879       cnf->hysteresis_param.scaling == (float)HYST_SCALING ? "# " : "",
880       (double)cnf->hysteresis_param.scaling);
881   abuf_appendf(out, "%sHystThrHigh  %.2f\n",
882       cnf->hysteresis_param.thr_high == (float)HYST_THRESHOLD_HIGH ? "# " : "",
883       (double)cnf->hysteresis_param.thr_high);
884   abuf_appendf(out, "%sHystThrLow   %.2f\n",
885       cnf->hysteresis_param.thr_low == (float)HYST_THRESHOLD_LOW ? "# " : "",
886       (double)cnf->hysteresis_param.thr_low);
887   abuf_appendf(out,
888     "\n"
889     "# TC redundancy\n"
890     "# Specifies how much neighbor info should be sent in\n"
891     "# TC messages. Because of a design problem in the 0.5.x\n"
892     "# dijkstra implementation this value must be set to 2.\n"
893     "# 2 - send all neighbors\n"
894     "# (default is %u)\n"
895     "\n", TC_REDUNDANCY);
896   abuf_appendf(out, "%sTcRedundancy  %d\n",
897       cnf->tc_redundancy == TC_REDUNDANCY ? "# " : "",
898       cnf->tc_redundancy);
899   abuf_appendf(out,
900     "\n"
901     "# MPR coverage specifies how many MPRs a node should\n"
902     "# try select to reach every 2 hop neighbor. Because of\n"
903     "# a design problem in the 0.5.x dijkstra algorithm this\n"
904     "# value should be set to 7.\n"
905     "# (default is %u)\n"
906     "\n", MPR_COVERAGE);
907   abuf_appendf(out, "%sMprCoverage %d\n",
908       cnf->mpr_coverage == MPR_COVERAGE ? "# " : "",
909       cnf->mpr_coverage);
910   abuf_appendf(out,
911     "\n"
912     "################################\n"
913     "### OLSR protocol extensions ###\n"
914     "################################\n"
915     "\n"
916     "# Link quality level switch between hopcount and\n"
917     "# cost-based (mostly ETX) routing. Because of\n"
918     "# a design problem in the 0.5.x dijkstra algorithm this\n"
919     "# value should not be set to 1.\n"
920     "# 0 = do not use link quality\n"
921     "# 2 = use link quality for MPR selection and routing\n"
922     "# (default is %u)\n"
923     "\n", DEF_LQ_LEVEL);
924   abuf_appendf(out, "%sLinkQualityLevel %d\n",
925       cnf->lq_level == DEF_LQ_LEVEL ? "# " : "",
926       cnf->lq_level);
927   abuf_appendf(out,
928     "\n"
929     "# Link quality algorithm (only for lq level 2)\n"
930     "# (see README-Olsr-Extensions)\n"
931     "# - \"etx_float\", a floating point  ETX with exponential aging\n"
932     "# - \"etx_fpm\", same as ext_float, but with integer arithmetic\n"
933     "# - \"etx_ff\" (ETX freifunk), an etx variant which use all OLSR\n"
934     "#   traffic (instead of only hellos) for ETX calculation\n"
935     "# - \"etx_ffeth\", an incompatible variant of etx_ff that allows\n"
936     "#   ethernet links with ETX 0.1.\n"
937     "# (default is \"%s\")\n"
938     "\n", DEF_LQ_ALGORITHM);
939   abuf_appendf(out, "%sLinkQualityAlgorithm    \"%s\"\n",
940       cnf->lq_algorithm == NULL ? "# " : "",
941       cnf->lq_algorithm == NULL ? DEF_LQ_ALGORITHM : cnf->lq_algorithm);
942   abuf_appendf(out,
943     "\n"
944     "# Link quality aging factor (only for lq level 2)\n"
945     "# Tuning parameter for etx_float and etx_fpm, smaller values\n"
946     "# mean slower changes of ETX value. (allowed values are\n"
947     "# between 0.01 and 1.0)\n"
948     "# (default is %.2f)\n"
949     "\n", (double)DEF_LQ_AGING);
950   abuf_appendf(out, "%sLinkQualityAging %.2f\n",
951       cnf->lq_aging == (float)DEF_LQ_AGING ? "# " : "",
952       (double)cnf->lq_aging);
953   abuf_appendf(out,
954     "\n"
955     "# Fisheye mechanism for TCs (0 meansoff, 1 means on)\n"
956     "# (default is %u)\n"
957     "\n", DEF_LQ_FISH);
958   abuf_appendf(out, "%sLinkQualityFishEye  %d\n",
959       cnf->lq_fish == DEF_LQ_FISH ? "# " : "",
960       cnf->lq_fish);
961   abuf_appendf(out,
962     "\n"
963     "#\n"
964     "# NatThreshold\n"
965     "#\n"
966     "# (currently this is only in the freifunk firmware)\n"
967     "# If the NAT-Endpoint (the preferred 0/0 HNA emitting node)\n"
968     "# is to be changed, the ETX value of the current 0/0 is\n"
969     "# multiplied with the NatThreshold value before being\n"
970     "# compared to the new one.\n"
971     "# The parameter can be a value between 0.1 and 1.0, but\n"
972     "# should be close to 1.0 if changed.\n"
973     "# WARNING: This parameter should not be used together with\n"
974     "# the etx_ffeth metric !!\n"
975     "# (default is %.1f)\n"
976     "\n", (double)DEF_LQ_NAT_THRESH);
977   abuf_appendf(out, "%sNatThreshold  %.1f\n",
978       cnf->lq_nat_thresh == (float)DEF_LQ_NAT_THRESH ? "# " : "",
979       (double)cnf->lq_nat_thresh);
980
981   abuf_puts(out,
982     "\n"
983     "#############################################################\n"
984     "### Configuration of the IPC to the windows GUI interface ###\n"
985     "#############################################################\n"
986     "\n"
987     "IpcConnect\n"
988     "{\n"
989     "     # Determines how many simultaneously\n"
990     "     # IPC connections that will be allowed\n"
991     "     # Setting this to 0 disables IPC\n"
992     "\n");
993   abuf_appendf(out, "     %sMaxConnections  %d\n",
994       cnf->ipc_connections == DEF_IPC_CONNECTIONS ? "# " : "",
995       cnf->ipc_connections);
996   abuf_puts(out,
997     "\n"
998     "     # By default only 127.0.0.1 is allowed\n"
999     "     # to connect. Here allowed hosts and networks can\n"
1000     "     # be added\n"
1001     "\n");
1002   if (!ipc_nets)
1003     abuf_puts(out,
1004       "     # Host            127.0.0.1\n"
1005       "     # Host            10.0.0.5\n"
1006       "     # Net             192.168.1.0 255.255.255.0\n");
1007   else
1008     while (ipc_nets) {
1009       if (ipc_nets->net.prefix_len == olsr_cnf->maxplen) {
1010         abuf_appendf(out, "    Host %s\n", olsr_ip_to_string(&ipbuf, &ipc_nets->net.prefix));
1011       } else {
1012         abuf_appendf(out, "    Net  %s\n", olsr_ip_prefix_to_string(&ipc_nets->net));
1013       }
1014       ipc_nets = ipc_nets->next;
1015     }
1016   abuf_puts(out,
1017     "}\n"
1018     "\n"
1019     "#####################################\n"
1020     "### Example plugin configurations ###\n"
1021     "#####################################\n"
1022     "# Olsrd plugins to load\n"
1023     "# This must be the absolute path to the file\n"
1024     "# or the loader will use the following scheme:\n"
1025     "# - Try the paths in the LD_LIBRARY_PATH\n"
1026     "#   environment variable.\n"
1027     "# - The list of libraries cached in /etc/ld.so.cache\n"
1028     "# - /lib, followed by /usr/lib\n"
1029     "#\n"
1030     "\n"
1031     "# Check whether a plugin is available for your operating system.\n"
1032     "# Each plugin should have a README file in it's lib subfolder.\n"
1033     "\n");
1034
1035   while (plugins) {
1036     abuf_appendf(out, "LoadPlugin \"%s\" {\n", plugins->name);
1037     pl_param = plugins->params;
1038     while (pl_param) {
1039       abuf_appendf(out, "    PlParam \"%s\" \"%s\"\n", pl_param->key, pl_param->value);
1040       pl_param = pl_param->next;
1041     }
1042     abuf_puts(out, "}\n"
1043         "\n");
1044     plugins = plugins->next;
1045   }
1046
1047   abuf_puts(out,
1048     "#############################################\n"
1049     "### OLSRD default interface configuration ###\n"
1050     "#############################################\n"
1051     "# the default interface section can have the same values as the following\n"
1052     "# interface configuration. It will allow you so set common options for all\n"
1053     "# interfaces.\n"
1054     "\n"
1055     "InterfaceDefaults\n");
1056   olsrd_write_if_autobuf(out, cnf, cnf->interface_defaults, false);
1057   abuf_puts(out,
1058     "\n"
1059     "######################################\n"
1060     "### OLSRd Interfaces configuration ###\n"
1061     "######################################\n"
1062     "# Multiple interfaces can be specified for a single configuration block, format:\n"
1063     "#   Interface \"<OLSRd-Interface1>\" \"<OLSRd-Interface2>\"\n"
1064     "#\n"
1065     "# Multiple configuration blocks can be specified.\n"
1066     "\n");
1067   first = true;
1068   while (interf) {
1069     abuf_appendf(out, "Interface \"%s\"\n", interf->name);
1070     olsrd_write_if_autobuf(out, cnf, interf->cnf, first);
1071
1072     first = false;
1073     interf = interf->next;
1074   }
1075
1076   abuf_puts(out,
1077       "\n"
1078       "# END AUTOGENERATED CONFIG\n");
1079 }
1080 /*
1081  * Local Variables:
1082  * c-basic-offset: 2
1083  * indent-tabs-mode: nil
1084  * End:
1085  */