add some more MSS-clamping wq
[olsrd.git] / README-Olsr-Extensions
1 =====================================================
2       OLSRd (version 0.6.0) protocol extensions
3 =====================================================
4
5 1.) Credits
6 2.) Link quality algorithms
7 3.) Fisheye
8 4.) NIIT (ipv4 over ipv6 traffic)
9 5.) Smart gateways (asymmetric gateway tunnels)
10 6.) NatThreshold
11
12 NIIT and Smart gateways are only supported for linux at the moment.
13
14     1.) Credits:
15 ********************
16
17 The concept of ETX (expected transmission count) has been developed by
18 Douglas S. J. De Couto at the Massachusetts Institute of Technology
19 (see http://en.wikipedia.org/wiki/Expected_Transmission_Count).
20
21 The original ETX design has been done by the Berlin Freifunk Network
22 (see www.freifunk.net and www.c-base.org), the code and message format
23 was coded by Thomas Lopatic.
24
25 Fisheye was implemented by Thomas Lopatic in 2005.
26
27 The LQ-Plugin rewrite was done by Henning Rogge in 2008.
28
29 The NIIT kernel module was written by lynxis in 2009.
30
31 The asymmetric gateway tunnels was written by Markus Kittenberger
32 and Henning Rogge, but the concept was used by B.A.T.M.A.N before OLSRd.
33
34
35
36     2.) Link quality algorithm
37 **********************************
38
39 Concept:
40 --------
41
42 OLSRd (since version 0.5.6) use a dimensionless integer value for a
43 representation of the 'cost' of each link. This is often called Link quality
44 (LQ for short). There are multiple LQ-Plugins, each of them calculating a cost
45 for the links of the router. At the moment (version 0.6.0) all lq_plugins are
46 using an ETX-metric (expected transmission count) but others would be possible
47 and imaginable, such as MIC [0], etc.
48
49
50 Each link is described by a LQ (link quality) and a NLQ (neighbor link quality)
51 value, which describe the quality towards the router (LQ) and towards the
52 neighbor (neighbor link quality, NLQ). Both LQ and NLQ can be a value between 0
53 and 1.  The total cost of the link is calculated as ETX = 1.0/(LQ * NLQ). The
54 ETX value of a link can be seen as the number of retransmissions necessary to
55 deliver the packet to the target. ETX 1.0 mean a perfect link without packet
56 loss.
57
58      +---+              +---+
59      | A |  <--- LQ --- | B |
60      +---+  ---- NLQ -->+---+
61
62 Note that the LQ and NLQ are always seen as from one nodes' perspective: the LQ
63 of node A towards B is the percentage of packets that A can transmit to B.
64 Hence, in the OLSR ETX implementation, B has to tell A it's LQ.
65
66 OLSRd chooses the path towards a target by selecting the path segments with the
67 smallest sum of link costs. In other words:
68
69    best_path(A,B) = minimum_sum({set of all paths between A and B})
70
71
72 Configuration:
73 --------------
74
75 The link quality system is activated by setting the config variable
76 "LinkQualityLevel" to 2.
77
78 You can use the "LinkQualityAlgorithm" parameter to choose the current
79 link quality algorithm in the config file. Some embedded OLSRd versions
80 are only compiled with one plugin (mostly etx_ff), so don't use the
81 configuration option with these agents.
82
83 There are four different link quality algorithms in OLSRd 0.6.0, two
84 current Funkfeuer/Freifunk ETX implementations and two legacy implementations.
85
86 LinkQuality-Algorithm "etx_ff":
87 -------------------------------
88
89 "Etx_ff" (ETX Funkfeuer/Freifunk) is the current default LQ algorithm for OLSRd.
90 It uses the sequence number of the OLSR packages (which are link specific)
91 to determine the current packet loss rate. Etx_ff includes a hysteresis
92 mechanism to suppress small fluctuations of the LQ and NLQ value. If
93 no packages are received from a certain neighbor at all, a timer begins
94 to lower the calculated LQ value until the next package is received or
95 the link is dropped.
96 Etx_ff only uses integer arithmetic, so it performs well on embedded
97 hardware having no FPU.
98
99 The message format of etx_ff is compatible with etx_fpm and etx_float.
100
101
102 LinkQuality-Algorithm "etx_ffeth"
103 --------------------------------
104
105 "Etx_ffeth" is an experimental and INCOMPATIBLE extension of etx_ff (meaning it
106 will not interoperate with etx_ff nodes).  The problem with etx_ff, etx_float
107 and etx_fpm is that they calculate ethernet links with the same cost as a
108 wireless link without packet loss (ETX 1.0) because the encoding of etx_ff
109 cannot encode link costs lower than 1.0. This means OLSRd prefers a single
110 wireless link with some loss (e.g. ETX 1.5) over a two hop route with one
111 ethernet link (ETX 1.0) and one perfect wireless link (ETX 1.0) *even though*
112 the latter path would be better!
113
114 "Etx_ffeth" tries to work around this problem by introducing a special
115 LQ encoding for the value ETX 0.1, which is only used for ethernet
116 links without packet loss. Because of the different encoding etx_ffeth
117 is not compatible with etx_ff, etx_fpm or etx_float. These three
118 implementations detect etx_ffeth nodes with LQ 0 (ETX infinite).
119
120 etx_ffeth only use integer arithmetic, so it performs well on embedded
121 hardware.
122
123 All ethernet interfaces must be marked with "mode ether" 
124 (see olsrd.conf.default.full) in their interface configuration to get any
125 useful advantage of etxff_eth.
126
127 At the time of this writing, etx_ffeth is the prefered metric for building new
128 mesh networks which include links over LAN cables (such as daisy chained
129 linksys routers).
130
131
132 Legacy LinkQuality-Algorithm "etx_float"
133 ----------------------------------------
134
135 "Etx_float" calculates the ETX value by using exponential aging (with
136 a configurable aging parameter) on the incoming (or lost) Hellos.
137 It is easier to understand than etx_ff, but the results are not as
138 good as in etx_ff, since it cannot use the TC messages for link
139 quality calculation.
140 Etx_float uses floating point math, so it might use more CPU on embedded
141 hardware.
142
143 The message format of etx_float is compatible with etx_fpm and etx_ff.
144
145
146 Legacy LinkQuality-Algorithm "etx_fpm"
147 --------------------------------------
148
149 "Etx_fpm" is a fixed point math implementation of etx_float. It
150 calculates the same link qualities as etx_float, but is much faster
151 on embedded hardware.
152
153 The message format of etx_fpm is compatible with etx_float and etx_ff.
154
155
156 Building your own LinkQuality Algorithm
157 ---------------------------------------- 
158
159 With the supplied samples OLSRd can be easily extended to support different
160 metrics. Please take a look at src/lq_plugin*.[ch] for inspiration and get in
161 contact with us on the OLSR development mailing list in case you plan to
162 implement a new metric.
163
164
165
166     3.) Fisheye
167 *******************
168
169 Normally OLSR floods all topology control (TC) messages to all
170 routes in the mesh, which can create a lot of overhead for large
171 meshs with hundreds of routers. Reducing the rate of TCs can reduce
172 this overhead, but delay route changes and correction of errors
173 in the routing tables.
174
175 The Fisheye (sometimes called Hazy Sighted Link State Routing [1])
176 mechanism implements a strategy to reach a compromise between
177 these two problems. When activated only every 8th TC is send
178 to all mesh nodes. Most TCs are given a reduced TTL (time to live)
179 and are only transmitted to the neighborhood of the router.
180
181 The current sequence of TTLs with active fisheye mechanism is
182 2, 8, 2, 16, 2, 8, 2 and 255 (maximum TTL).
183
184 The problem with Fisheye is that it introduces artifical borders
185 for flooding TCs, which can theoretically lead to inconsistent routes
186 and routing loops at the border of the fisheye circles. In practice
187 fisheye seems to work well enough that it is a mandatory feature
188 for most larger Funkfeuer/Freifunk meshs.
189
190
191     4.) NIIT (ipv4 over ipv6 traffic)
192 *****************************************
193 (see https://dev.dd19.de/cgi-bin/gitweb.cgi?p=niit.git;a=summary)
194
195 NIIT is a special linux kernel device that allows easy transmission of IPv4
196 unicast traffic through an IPv6 network. Since version 0.6.0 OLSRd has
197 integrated support for NIIT in the routing daemon. So setting up IPv4 traffic
198 over IPv6 OLSR meshs is very easy. Instead of creating routes and tunnels by
199 hand all the administrator of a router needs to do is to, is to set up his own
200 IPv4 targets as "IPv4-mapped" IPv6 HNAs.
201
202 Example configurations:
203 - connect a local 192.168.1.0/8 net to the mesh
204
205 HNA6 {
206   0::ffff:C0A8:01:00 120
207 }
208
209 - announce an IPv4 internet gateway
210
211 HNA6 {
212   0::ffff:0:0 96
213 }
214
215
216 More information on NIIT can be found at: http://wiki.freifunk.net/Niit
217 (german)
218
219
220     5.) Smart gateways (asymmetric gateway tunnels)
221 *******************************************************
222
223 The smartgateway mechanism was written by Markus Kittenberger and
224 Henning Rogge to allow an OLSR user to directly choose their default
225 internet gateway instead of relying on the hop by hop decisions on
226 the way to the gateway. OLSRd 0.6.0 can create an IPIP tunnel
227 to the gateways OLSRd address to sidestep the same nasty effects
228 described in the Nat-Threshold section.
229
230 The smartgateway code can be split into two sections, one is
231 responsible for announcing the existence of a smartgateway uplink
232 and one on the client nodes to choose an uplink and create the
233 tunnel to the gateway. It use a modified (but backward compatible)
234 special HNA to signal the gateways to the clients. The clients can
235 use a plugin (or the integrated default code) to choose one of the
236 available gateways and change it if necessary. 
237
238 The smartgateway system is setup by several configuration parameters,
239 most of them with a sane default setting. The whole system can be
240 switched on/off by the following parameter:
241
242 SmartGateway <yes/no>
243
244 All other parameters will be ignored if SmartGateway is set to "no"
245 (the default is "yes").
246
247 On the client side there is a single additional parameter which
248 controls if you want to allow the selection of an outgoing ipv4
249 gateway with NAT (network address translation).
250
251 SmartGatewayAllowNAT <yes/no>
252
253 The uplink side of the smartgateway code has four parameters to
254 set up the type of the uplink.
255
256 SmartGatewayUplink defines which kind of uplink is exported to the
257 other mesh nodes. The existence of the uplink is detected by looking
258 for a local HNA of 0.0.0.0/0, ::ffff:0:0/96 or 2000::/3. The default
259 setting is "both".
260 SmartGatewayUplinkNAT defines if the ipv4 part of the uplink use NAT.
261 The default of this setting is "yes".
262 SmartGatewaySpeed sets the uplink and downlink speed of the gateway,
263 which could be used by a plugin to choose the right gateway for a
264 client. The default is 128/1024 kbit/s.
265 The final parameter SmartGatewayPrefix can be used to signal the
266 external IPv6 prefix of the uplink to the clients. This might allow
267 a client to change it's local IPv6 address to use the IPv6 gateway
268 without any kind of address translation. The maximum prefix length
269 is 64 bits, the default is ::/0 (no prefix).
270
271 SmartGatewayUplink <none/ipv4/ipv6/both>
272 SmartGatewayUplinkNAT <yes/no>
273 SmartGatewaySpeed <uplink> <downlink>
274 SmartGatewayPrefix <prefix>
275
276 On the SmartGW server (the OLSR instance anncouning 'Internet here!' via
277 HNA0/0 or similar) the implicit tunl0 interface is used to forward  incoming 
278 packets originated by SmartGW clients to the internet route. This may be 
279 protected by the sysctl rp_filter setting. Note, that at least with RedHat kernel 
280 2.6.18, the net.ipv4.conf.tunl0.rp_filter sysctl file is not present after 
281 loading the "ipip" kernel module. Which prevents OLSRD from switching off the 
282 filter. As a workaround, add an "ip addr add 0.0.0.0/32 dev tunl0" after 
283 the "modprobe ipip" line in your OLSRD startup script. 
284
285 While the SmartGW function does a fine job on stand-alone PCs, system builders 
286 should keep in mind the following facts when setting up routing, firewalls 
287 and gateways:
288
289 a) The SmartGW tunnel communicates asymmetrically. An IP packet destinned to 
290 an Internet server is sent via the IPIP tunnel but returned via the standard 
291 OLSRD host route.
292
293 b) On the SmartGW server, you should double check your firewall rules and 
294 rp_filter defaults. While it's normally not possible to simply encap e.g. 
295 a "telnet 127.0.0.1" into IPIP and sent that to the SmartGW server, your 
296 specific configuration may open up other attack vectors for an intruder.
297
298 c) Do not forget to un-firewall tunl0->internet and (if required to 
299 NAT/MASQUERADE) this communication path.
300
301 d) While the SmartGW server does not use special routing, the SmartGW client
302 inserts policy routing rules for it's function. By using the default configuration,
303 the OLSRD standard default route is maintained in table 223 and the OLSRD SmartGW 
304 default route in table 224. Both tables are examined only, if you do not have
305 a default route in the main table (visible with "ip route ls"). Use "ip route ls
306 table 223" or "ip route ls table 224" for debugging/monitoring. You may also
307 activate the txtinfo plugin and "wget -O - http://localhost:2006/gateway".
308
309 e) For the stand-alone client (Notebook user running OLSRD in order to browse) 
310 the lowered IPIP tunnel MTU is no problem. If you do proxy routing, e.g. for 
311 attached LAN clients without OLSRD, you may want MSS-clamping for the tunnel 
312 interface created by OLSRD. Because OLSRD uses an arbitrary name for the tunnel
313 iface (e.g. tnl_7c41c668) you may want to include a wildcard iptables rule. Example:
314 iptables -A FORWARD -o tnl_+ -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu
315
316 Furthermore (or alternatively) you might consider to clamp all traffic to your ipip mtu
317 on your gateway nodes that is leaving your mesh. (regardless if the traffic comes out 
318 of the smartgateway tunnel or not!)
319 iptables -A FORWARD -o [your_gateway_interface] -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --set-mss 1480
320
321 Especially as during olsrd startup, before an smartgateway is choosen (which is delayed), 
322 new connections would use a larger MSS as the smartgateway tunnel can handle. 
323 So the approach to clamp on the gateways should give better results.
324
325 But if you don't NAT on your gateways (but want to use SmartGateway for some some 
326 special reason), you would have to do this on ALL gateways (Even on gateways that 
327 do not provide the SmartGateway functionality!)
328
329     6.) NatThreshold
330 ************************
331
332 The NatThreshold option was introduced by Sven Ola to suppress a very annoying
333 problem with OLSRd, switching default gateways. If a router is located between
334 two internet gateways with similar path costs the default route (0.0.0.0/0)
335 will constantly switch between the two gateways due to normal fluctuations of
336 the link metrics. Whenever OLSRd decides that the other NAT gateway is
337 "better", then switching to this new gateway will result in termination of all
338 connected sessions (TCP and HTTP). 
339 The user experience will be rather painful and users will experience hanging
340 SSH and HTTP sessions (or anything using TCP).
341
342 NatThreshold tries to help by introducing a hysteresis factor for
343 choosing the route to the default gateway. Only if the new gateway has
344 a lower cost than the current gateways path cost multiplied by
345 NatThreshold the node will switch the gateway. 
346 In short:
347
348   if (cost(new_gateway) < cost(current_gw)*NatThreshold)) {
349         switch_gateway();
350   }
351
352
353 Practical experience shows that this leads to much better quality of default
354 gateway selection, even if (in theory) a small NatThreshold together with
355 Fisheye can lead to  persistent routing loops.
356 Please note that even with NatThreshold enabled, some users will still experience
357 gateway switching. However, most users will not.
358
359 Smart Gateways can replace NatThreshold all together because they allow sending
360 traffic directly to a gateway circumventing the problems described above which
361 stem from a hop-by-hop routing approach 
362
363
364
365      7.) References
366 ************************
367 [0] MIC Metric: "Designing Routing Metrics for Mesh Networks", 
368         Yaling Yang, Jun Wang, Robin Kravets
369         http://www.cs.ucdavis.edu/~prasant/WIMESH/p6.pdf
370
371 [1] "Making link-state routing scale for ad hoc networks",
372         Cesar A. Santivanez, Ram Ramanathan, Ioannis Stavrakakis
373         http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.16.5940