bce0935880c4eb153db4b565b3103a5c61ad933a
[olsrd.git] / src / olsr_cfg_gen.c
1
2 /*
3  * The olsr.org Optimized Link-State Routing daemon(olsrd)
4  * Copyright (c) 2004-2009, the olsr.org team - see HISTORY file
5  * All rights reserved.
6  *
7  * Redistribution and use in source and binary forms, with or without
8  * modification, are permitted provided that the following conditions
9  * are met:
10  *
11  * * Redistributions of source code must retain the above copyright
12  *   notice, this list of conditions and the following disclaimer.
13  * * Redistributions in binary form must reproduce the above copyright
14  *   notice, this list of conditions and the following disclaimer in
15  *   the documentation and/or other materials provided with the
16  *   distribution.
17  * * Neither the name of olsr.org, olsrd nor the names of its
18  *   contributors may be used to endorse or promote products derived
19  *   from this software without specific prior written permission.
20  *
21  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
22  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
23  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
24  * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
25  * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
26  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
27  * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
28  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
29  * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
30  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
31  * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
32  * POSSIBILITY OF SUCH DAMAGE.
33  *
34  * Visit http://www.olsr.org for more information.
35  *
36  * If you find this software useful feel free to make a donation
37  * to the project. For more information see the website or contact
38  * the copyright holders.
39  *
40  */
41
42 #include "olsr_cfg_gen.h"
43 #include "olsr_protocol.h"
44 #include "ipcalc.h"
45 #include "olsr_ip_prefix_list.h"
46 #include "olsr_time.h"
47
48 #include <errno.h>
49
50 static INLINE void
51 append_reltime(struct autobuf *abuf, const char *name, olsr_reltime val, olsr_reltime deflt, bool first)
52 {
53   struct time_txt buf;
54
55   if (val != deflt) {
56     abuf_appendf(abuf, "    %s\t%s\n", name, reltime_to_txt(&buf, val));
57   } else if (first) {
58     abuf_appendf(abuf, "    #%s\t%s\n", name, reltime_to_txt(&buf, val));
59   }
60 }
61
62 void
63 olsr_write_cnf_buf(struct autobuf *abuf, struct olsr_config *cnf, bool write_more_comments)
64 {
65   char ipv6_buf[INET6_ADDRSTRLEN];     /* buffer for IPv6 inet_ntop */
66   struct time_txt tbuf;
67   const char *s;
68
69   abuf_appendf(abuf, "#\n" "# Generated config file for %s\n" "#\n\n", olsrd_version);
70
71   /* IP version */
72   abuf_appendf(abuf, "# IP version to use (4 or 6)\n" "IpVersion\t%d\n\n", cnf->ip_version == AF_INET ? 4 : 6);
73
74   /* FIB Metric */
75   abuf_appendf(abuf, "# FIBMetric (\"%s\", \"%s\", or \"%s\")\n"
76                "FIBMetric\t\"%s\"\n\n",
77                CFG_FIBM_FLAT, CFG_FIBM_CORRECT, CFG_FIBM_APPROX,
78                FIBM_FLAT == cnf->fib_metric ? CFG_FIBM_FLAT : FIBM_CORRECT == cnf->fib_metric ? CFG_FIBM_CORRECT : CFG_FIBM_APPROX);
79
80   /* HNA IPv4/IPv6 */
81   abuf_appendf(abuf, "# HNA IPv%d routes\n"
82                "# syntax: netaddr/prefix\n" "Hna%d {\n", cnf->ip_version == AF_INET ? 4 : 6, cnf->ip_version == AF_INET ? 4 : 6);
83   if (!list_is_empty(&cnf->hna_entries)) {
84     struct ip_prefix_entry *h;
85
86     OLSR_FOR_ALL_IPPREFIX_ENTRIES(&cnf->hna_entries, h) {
87       struct ipprefix_str strbuf;
88       abuf_appendf(abuf, "    %s\n", ip_prefix_to_string(cnf->ip_version, &strbuf, &h->net));
89     } OLSR_FOR_ALL_IPPREFIX_ENTRIES_END()
90   }
91   abuf_appendf(abuf, "}\n\n");
92
93   /* No interfaces */
94   abuf_appendf(abuf, "# Should olsrd keep on running even if there are\n"
95                "# no interfaces available? This is a good idea\n"
96                "# for a PCMCIA/USB hotswap environment.\n"
97                "# \"yes\" OR \"no\"\n" "AllowNoInt\t%s\n\n", cnf->allow_no_interfaces ? "yes" : "no");
98
99   /* TOS */
100   abuf_appendf(abuf, "# TOS(type of service) to use. Default is 16\n" "TosValue\t%d\n\n", cnf->tos);
101
102   /* RtProto */
103   abuf_appendf(abuf, "# Routing proto flag to use. Operating system default is 0\n" "RtProto\t\t%d\n\n", cnf->rtproto);
104
105   /* RtTable */
106   abuf_appendf(abuf, "# Policy Routing Table to use. Default is 254\n" "RtTable\t\t%d\n\n", cnf->rttable);
107
108   /* RtTableDefault */
109   abuf_appendf(abuf,
110                "# Policy Routing Table to use for the default Route. Default is 0 (Take the same table as specified by RtTable)\n"
111                "RtTableDefault\t\t%d\n\n", cnf->rttable_default);
112
113   /* Willingness */
114   abuf_appendf(abuf, "# The fixed willingness to use(0-7)\n"
115                "# If not set willingness will be calculated\n"
116                "# dynammically based on battery/power status\n"
117                "%sWillingness\t%d\n\n", cnf->willingness_auto ? "#" : "", cnf->willingness_auto ? 4 : cnf->willingness);
118
119   if (list_is_empty(&cnf->ipc_nets.accept)) {
120     struct ip_prefix_entry *ie;
121     OLSR_FOR_ALL_IPPREFIX_ENTRIES(&cnf->ipc_nets.accept, ie) {
122       if (ie->net.prefix_len == 8 * cnf->ipsize) {
123         struct ipaddr_str strbuf;
124         abuf_appendf(abuf, "    Host\t\t%s\n", ip_to_string(cnf->ip_version, &strbuf, &ie->net.prefix));
125       } else {
126         struct ipprefix_str strbuf;
127         abuf_appendf(abuf, "    Net\t\t\t%s\n", ip_prefix_to_string(cnf->ip_version, &strbuf, &ie->net));
128       }
129     } OLSR_FOR_ALL_IPPREFIX_ENTRIES_END()
130   }
131
132   abuf_appendf(abuf, "}\n");
133
134   /* Pollrate */
135   abuf_appendf(abuf, "# Polling rate in seconds(float).\n"
136                "# Auto uses default value 0.05 sec\n" "Pollrate\t%s\n",
137                reltime_to_txt(&tbuf, cnf->pollrate));
138
139   /* NIC Changes Pollrate */
140   abuf_appendf(abuf, "# Interval to poll network interfaces for configuration\n"
141                "# changes. Defaults to 2.5 seconds\n" "NicChgsPollInt\t%s\n",
142                reltime_to_txt(&tbuf, cnf->nic_chgs_pollrate));
143
144   /* TC redundancy */
145   abuf_appendf(abuf, "# TC redundancy\n"
146                "# Specifies how much neighbor info should\n"
147                "# be sent in TC messages\n"
148                "# Possible values are:\n"
149                "# 0 - only send MPR selectors\n"
150                "# 1 - send MPR selectors and MPRs\n"
151                "# 2 - send all neighbors\n" "# defaults to 0\n" "TcRedundancy\t%d\n\n", cnf->tc_redundancy);
152
153   /* MPR coverage */
154   abuf_appendf(abuf, "# MPR coverage\n"
155                "# Specifies how many MPRs a node should\n"
156                "# try select to reach every 2 hop neighbor\n"
157                "# Can be set to any integer >0\n" "# defaults to 1\n" "MprCoverage\t%d\n\n", cnf->mpr_coverage);
158
159   abuf_appendf(abuf, "# Fish Eye algorithm\n"
160                "# 0 = do not use fish eye\n" "# 1 = use fish eye\n" "LinkQualityFishEye\t%d\n\n", cnf->lq_fish);
161
162   abuf_appendf(abuf, "# NAT threshold\n" "NatThreshold\t%s\n\n", reltime_to_txt(&tbuf, cnf->lq_nat_thresh));
163
164   abuf_appendf(abuf, "# Clear screen when printing debug output?\n" "ClearScreen\t%s\n\n", cnf->clear_screen ? "yes" : "no");
165
166   /* Plugins */
167   abuf_appendf(abuf, "# Olsrd plugins to load\n"
168                "# This must be the absolute path to the file\n"
169                "# or the loader will use the following scheme:\n"
170                "# - Try the paths in the LD_LIBRARY_PATH \n"
171                "#   environment variable.\n"
172                "# - The list of libraries cached in /etc/ld.so.cache\n" "# - /lib, followed by /usr/lib\n\n");
173   if (cnf->plugins) {
174     struct plugin_entry *pe;
175     for (pe = cnf->plugins; pe != NULL; pe = pe->next) {
176       struct plugin_param *pp;
177       abuf_appendf(abuf, "LoadPlugin \"%s\" {\n", pe->name);
178       for (pp = pe->params; pp != NULL; pp = pp->next) {
179         abuf_appendf(abuf, "    PlParam \"%s\"\t\"%s\"\n", pp->key, pp->value);
180       }
181       abuf_appendf(abuf, "}\n");
182     }
183   }
184   abuf_appendf(abuf, "\n");
185
186   /* Interfaces */
187   abuf_appendf(abuf, "# Interfaces\n"
188                "# Multiple interfaces with the same configuration\n"
189                "# can shar the same config block. Just list the\n" "# interfaces(e.g. Interface \"eth0\" \"eth2\"\n");
190   /* Interfaces */
191   if (cnf->if_configs) {
192     struct olsr_if_config *in;
193     bool first;
194     for (in = cnf->if_configs, first = write_more_comments; in != NULL; in = in->next, first = false) {
195       abuf_appendf(abuf, "Interface \"%s\" {\n", in->name);
196
197       if (first) {
198         abuf_appendf(abuf, "    # IPv4 broadcast address to use. The\n"
199                      "    # one usefull example would be 255.255.255.255\n"
200                      "    # If not defined the broadcastaddress\n" "    # every card is configured with is used\n\n");
201       }
202
203       if (in->cnf->ipv4_broadcast.v4.s_addr) {
204         abuf_appendf(abuf, "    Ip4Broadcast\t%s\n", inet_ntoa(in->cnf->ipv4_broadcast.v4));
205       } else if (first) {
206         abuf_appendf(abuf, "    #Ip4Broadcast\t255.255.255.255\n");
207       }
208
209       if (first) {
210         abuf_appendf(abuf, "\n    # IPv6 address type to use.\n"
211                      "    # Must be 'auto', 'site-local', 'unique-local' or 'global'\n\n");
212       }
213       if (in->cnf->ipv6_addrtype == OLSR_IP6T_SITELOCAL)
214         s = CFG_IP6T_SITELOCAL;
215       else if (in->cnf->ipv6_addrtype == OLSR_IP6T_UNIQUELOCAL)
216         s = CFG_IP6T_UNIQUELOCAL;
217       else if (in->cnf->ipv6_addrtype == OLSR_IP6T_GLOBAL)
218         s = CFG_IP6T_GLOBAL;
219       else
220         s = CFG_IP6T_AUTO;
221       abuf_appendf(abuf, "    Ip6AddrType\t%s\n\n", s);
222
223       if (first) {
224         abuf_appendf(abuf, "\n"
225                      "    # IPv6 multicast address to use when\n"
226                      "    # using site-local addresses.\n" "    # If not defined, ff05::15 is used\n");
227       }
228       abuf_appendf(abuf, "    Ip6MulticastSite\t%s\n",
229                    inet_ntop(AF_INET6, &in->cnf->ipv6_multi_site.v6, ipv6_buf, sizeof(ipv6_buf)));
230       if (first) {
231         abuf_appendf(abuf, "\n    # IPv6 multicast address to use when\n"
232                      "    # using global addresses\n" "    # If not defined, ff0e::1 is used\n");
233       }
234       abuf_appendf(abuf, "    Ip6MulticastGlobal\t%s\n",
235                    inet_ntop(AF_INET6, &in->cnf->ipv6_multi_glbl.v6, ipv6_buf, sizeof(ipv6_buf)));
236       if (first) {
237         abuf_appendf(abuf, "\n");
238       }
239       abuf_appendf(abuf, "    # Olsrd can autodetect changes in\n"
240                    "    # interface configurations. Enabled by default\n"
241                    "    # turn off to save CPU.\n" "    AutoDetectChanges: %s\n\n", in->cnf->autodetect_chg ? "yes" : "no");
242
243       if (first) {
244         abuf_appendf(abuf, "    # Emission and validity intervals.\n"
245                      "    # If not defined, RFC proposed values will\n" "    # in most cases be used.\n");
246       }
247       append_reltime(abuf, "HelloInterval", in->cnf->hello_params.emission_interval, HELLO_INTERVAL, first);
248       append_reltime(abuf, "HelloValidityTime", in->cnf->hello_params.validity_time, NEIGHB_HOLD_TIME, first);
249       append_reltime(abuf, "TcInterval", in->cnf->tc_params.emission_interval, TC_INTERVAL, first);
250       append_reltime(abuf, "TcValidityTime", in->cnf->tc_params.validity_time, TOP_HOLD_TIME, first);
251       append_reltime(abuf, "MidValidityTime", in->cnf->mid_params.validity_time, MID_HOLD_TIME, first);
252       append_reltime(abuf, "HnaInterval", in->cnf->hna_params.emission_interval, HNA_INTERVAL, first);
253       append_reltime(abuf, "HnaValidityTime", in->cnf->hna_params.validity_time, HNA_HOLD_TIME, first);
254       if (in->cnf->lq_mult == NULL) {
255         if (first) {
256           abuf_appendf(abuf, "    #LinkQualityMult\tdefault 1.0\n");
257         }
258       } else {
259         struct olsr_lq_mult *mult;
260         for (mult = in->cnf->lq_mult; mult != NULL; mult = mult->next) {
261           abuf_appendf(abuf, "    LinkQualityMult\t%s %0.2f\n",
262                        inet_ntop(cnf->ip_version, &mult->addr, ipv6_buf, sizeof(ipv6_buf)), (float)mult->value / 65536.0);
263         }
264       }
265
266       if (first) {
267         abuf_appendf(abuf, "    # When multiple links exist between hosts\n"
268                      "    # the weight of interface is used to determine\n"
269                      "    # the link to use. Normally the weight is\n"
270                      "    # automatically calculated by olsrd based\n"
271                      "    # on the characteristics of the interface,\n"
272                      "    # but here you can specify a fixed value.\n"
273                      "    # Olsrd will choose links with the lowest value.\n"
274                      "    # Note:\n"
275                      "    # Interface weight is used only when LinkQualityLevel is 0.\n"
276                      "    # For any other value of LinkQualityLevel, the interface ETX\n" "    # value is used instead.\n\n");
277       }
278       if (in->cnf->weight.fixed) {
279         abuf_appendf(abuf, "    Weight\t %d\n", in->cnf->weight.value);
280       } else if (first) {
281         abuf_appendf(abuf, "    #Weight\t 0\n");
282       }
283
284       abuf_appendf(abuf, "}\n\n");
285     }
286   }
287 }
288
289 /*
290  * Local Variables:
291  * c-basic-offset: 2
292  * indent-tabs-mode: nil
293  * End:
294  */