luci-olsr split IPv6/4 configuration in 2 sections
[project/luci.git] / applications / luci-olsr / luasrc / model / cbi / olsr / olsrdiface6.lua
diff --git a/applications/luci-olsr/luasrc/model/cbi/olsr/olsrdiface6.lua b/applications/luci-olsr/luasrc/model/cbi/olsr/olsrdiface6.lua
new file mode 100644 (file)
index 0000000..85818ac
--- /dev/null
@@ -0,0 +1,176 @@
+--[[
+LuCI - Lua Configuration Interface
+
+Copyright 2010 Jo-Philipp Wich <xm@subsignal.org>
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+$Id$
+
+]]--
+
+local util = require "luci.util"
+local ip = require "luci.ip"
+
+function write_float(self, section, value)
+    local n = tonumber(value)
+    if n ~= nil then
+        return Value.write(self, section, "%.1f" % n)
+    end
+end
+
+m = Map("olsrd6", translate("OLSR Daemon - Interface"),
+        translate("The OLSR daemon is an implementation of the Optimized Link State Routing protocol. "..
+       "As such it allows mesh routing for any network equipment. "..
+       "It runs on any wifi card that supports ad-hoc mode and of course on any ethernet device. "..
+       "Visit <a href='http://www.olsr.org'>olsrd.org</a> for help and documentation."))
+
+m.redirect = luci.dispatcher.build_url("admin/services/olsrd6")
+
+if not arg[1] or m.uci:get("olsrd6", arg[1]) ~= "Interface" then
+       luci.http.redirect(m.redirect)
+       return
+end
+
+i = m:section(NamedSection, arg[1], "Interface", translate("Interface"))
+i.anonymous = true
+i.addremove = false
+
+i:tab("general", translate("General Settings"))
+i:tab("addrs",   translate("IP Addresses"))
+i:tab("timing",  translate("Timing and Validity"))
+
+ign = i:taboption("general", Flag, "ignore", translate("Enable"),
+       translate("Enable this interface."))
+ign.enabled  = "0"
+ign.disabled = "1"
+ign.rmempty = false
+function ign.cfgvalue(self, section)
+       return Flag.cfgvalue(self, section) or "0"
+end
+
+network = i:taboption("general", Value, "interface", translate("Network"),
+       translate("The interface OLSRd should serve."))
+
+network.template = "cbi/network_netlist"
+network.widget   = "radio"
+network.nocreate = true
+
+mode = i:taboption("general", ListValue, "Mode", translate("Mode"),
+       translate("Interface Mode is used to prevent unnecessary packet forwarding on switched ethernet interfaces. "..
+       "valid Modes are \"mesh\" and \"ether\". Default is \"mesh\"."))
+mode:value("mesh")
+mode:value("ether")
+mode.optional = true
+mode.rmempty = true
+
+
+weight = i:taboption("general", Value, "Weight", translate("Weight"),
+       translate("When multiple links exist between hosts the weight of interface is used to determine the link to use. "..
+       "Normally the weight is automatically calculated by olsrd based on the characteristics of the interface, "..
+       "but here you can specify a fixed value. Olsrd will choose links with the lowest value.<br />"..
+       "<b>Note:</b> Interface weight is used only when LinkQualityLevel is set to 0. "..
+       "For any other value of LinkQualityLevel, the interface ETX value is used instead."))
+weight.optional = true
+weight.datatype = "uinteger"
+weight.placeholder = "0"
+
+lqmult = i:taboption("general", DynamicList, "LinkQualityMult", translate("LinkQuality Multiplicator"),
+       translate("Multiply routes with the factor given here. Allowed values are between 0.01 and 1.0. "..
+       "It is only used when LQ-Level is greater than 0. Examples:<br />"..
+       "reduce LQ to fd91:662e:3c58::1 by half: fd91:662e:3c58::1 0.5<br />"..
+       "reduce LQ to all nodes on this interface by 20%: default 0.8"))
+lqmult.optional = true
+lqmult.rmempty = true
+lqmult.cast = "table"
+lqmult.placeholder = "default 1.0"
+
+function lqmult.validate(self, value)
+       for _, v in pairs(value) do
+               if v ~= "" then
+                       local val = util.split(v, " ")
+                       local host = val[1]
+                       local mult = val[2]
+                       if not host or not mult then
+                               return nil, translate("LQMult requires two values (IP address or 'default' and multiplicator) seperated by space.")
+                       end
+                       if not (host == "default" or ip.IPv6(host)) then
+                               return nil, translate("Can only be a valid IPv6 address or 'default'")
+                       end
+                       if not tonumber(mult) or tonumber(mult) > 1 or tonumber(mult) < 0.01 then
+                               return nil, translate("Invalid Value for LQMult-Value. Must be between 0.01 and 1.0.")
+                       end
+                       if not mult:match("[0-1]%.[0-9]+") then
+                               return nil, translate("Invalid Value for LQMult-Value. You must use a decimal number between 0.01 and 1.0 here.")
+                       end
+               end
+       end
+       return value
+end
+
+ip6m = i:taboption("addrs", Value, "IPv6Multicast", translate("IPv6 multicast"),
+       translate("IPv6 multicast address. Default is \"FF02::6D\", the manet-router linklocal multicast."))
+ip6m.optional = true
+ip6m.datatype = "ip6addr"
+ip6m.placeholder = "FF02::6D"
+
+ip6s = i:taboption("addrs", Value, "IPv6Src", translate("IPv6 source"),
+       translate("IPv6 src prefix. OLSRd will choose one of the interface IPs which matches the prefix of this parameter. "..
+       "Default is \"0::/0\", which triggers the usage of a not-linklocal interface IP."))
+ip6s.optional = true
+ip6s.datatype = "ip6addr"
+ip6s.placeholder = "0::/0"
+
+hi = i:taboption("timing", Value, "HelloInterval", translate("Hello interval"))
+hi.optional = true
+hi.datatype = "ufloat"
+hi.placeholder = "5.0"
+hi.write = write_float
+
+hv = i:taboption("timing", Value, "HelloValidityTime", translate("Hello validity time"))
+hv.optional = true
+hv.datatype = "ufloat"
+hv.placeholder = "40.0"
+hv.write = write_float
+
+ti = i:taboption("timing", Value, "TcInterval", translate("TC interval"))
+ti.optional = true
+ti.datatype = "ufloat"
+ti.placeholder = "2.0"
+ti.write = write_float
+
+tv = i:taboption("timing", Value, "TcValidityTime", translate("TC validity time"))
+tv.optional = true
+tv.datatype = "ufloat"
+tv.placeholder = "256.0"
+tv.write = write_float
+
+mi = i:taboption("timing", Value, "MidInterval", translate("MID interval"))
+mi.optional = true
+mi.datatype = "ufloat"
+mi.placeholder = "18.0"
+mi.write = write_float
+
+mv = i:taboption("timing", Value, "MidValidityTime", translate("MID validity time"))
+mv.optional = true
+mv.datatype = "ufloat"
+mv.placeholder = "324.0"
+mv.write = write_float
+
+ai = i:taboption("timing", Value, "HnaInterval", translate("HNA interval"))
+ai.optional = true
+ai.datatype = "ufloat"
+ai.placeholder = "18.0"
+ai.write = write_float
+
+av = i:taboption("timing", Value, "HnaValidityTime", translate("HNA validity time"))
+av.optional = true
+av.datatype = "ufloat"
+av.placeholder = "108.0"
+av.write = write_float
+
+return m