luci-0.8: merge r3809-r3822
[oweals/luci.git] / libs / sys / luasrc / sys.lua
index 52ed0c36d9d2b36d48c917b3616432fa64597f19..b7e374d7cf613ee2c990cac96b30220d4f133ca3 100644 (file)
@@ -361,6 +361,53 @@ function net.routes()
        return _parse_delimited_table(io.lines("/proc/net/route"))
 end
 
+--- Returns the current ipv6 kernel routing table entries.
+-- @return     Table of tables with properties of the corresponding routes.
+--                     The following fields are defined for route entry tables:
+--                     { "src_ip", "src_prefix", "dst_ip", "dst_prefix", "nexthop_ip",
+--            "metric", "refcount", "usecount", "flags", "device" }
+function net.routes6()
+       local routes = { }
+
+       for line in io.lines("/proc/net/ipv6_route") do
+
+               local dst_ip, dst_prefix, src_ip, src_prefix, nexthop,
+                         metric, refcnt, usecnt, flags, dev = line:match(
+                       "([a-f0-9]+) ([a-f0-9]+) " ..
+                       "([a-f0-9]+) ([a-f0-9]+) " ..
+                       "([a-f0-9]+) ([a-f0-9]+) " ..
+                       "([a-f0-9]+) ([a-f0-9]+) " ..
+                       "([^%s]+) +([^%s]+)"
+               )
+
+               src_ip = luci.ip.Hex(
+                       src_ip, tonumber(src_prefix, 16),
+                       luci.ip.FAMILY_INET6, false
+               )
+
+               dst_ip = luci.ip.Hex(
+                       dst_ip, tonumber(dst_prefix, 16),
+                       luci.ip.FAMILY_INET6, false
+               )
+
+               nexthop = luci.ip.Hex( nexthop, 128, luci.ip.FAMILY_INET6, false )
+
+               routes[#routes+1] = {
+                       src_ip     = src_ip:host():string(),
+                       src_prefix = src_ip:prefix(),
+                       dst_ip     = dst_ip:host():string(),
+                       dst_prefix = dst_ip:prefix(),
+                       nexthop_ip = nexthop:string(),
+                       metric     = tonumber(metric, 16),
+                       refcount   = tonumber(refcnt, 16),
+                       usecount   = tonumber(usecnt, 16),
+                       flags      = tonumber(flags), -- hex?
+                       device     = dev
+               }
+       end
+
+       return routes
+end
 
 --- Tests whether the given host responds to ping probes.
 -- @param host String containing a hostname or IPv4 address