From f50de419592d58160f15a04978b0de6e94b854fb Mon Sep 17 00:00:00 2001 From: Florian Eckert Date: Wed, 9 May 2018 13:13:20 +0200 Subject: [PATCH 1/2] luci-app-mwan3: honor dynamic interface to get gateway ip If a logical interface setup and adds in the protocol handler a dynamic interface then the gateway is configured in the dynamic interface and the setting up logical interface does not have a gateway specified. To fix this check first if a dynamic interface is present and use this gateway ip if found and if no dynamich interface is set then check for a gateway in the logical interface. Signed-off-by: Florian Eckert --- .../luci-app-mwan3/luasrc/controller/mwan3.lua | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/applications/luci-app-mwan3/luasrc/controller/mwan3.lua b/applications/luci-app-mwan3/luasrc/controller/mwan3.lua index d5fc4a3ede..01e40d9948 100644 --- a/applications/luci-app-mwan3/luasrc/controller/mwan3.lua +++ b/applications/luci-app-mwan3/luasrc/controller/mwan3.lua @@ -114,8 +114,14 @@ function diagnosticsData(interface, task) end function get_gateway(inteface) - local dump = require("luci.util").ubus("network.interface.%s" % interface, "status", {}) - local gateway + local gateway = nil + local dump = nil + + dump = require("luci.util").ubus("network.interface.%s_4" % interface, "status", {}) + if not dump then + dump = require("luci.util").ubus("network.interface.%s" % interface, "status", {}) + end + if dump and dump.route then local _, route for _, route in ipairs(dump.route) do From ee54a9542f7685ffa7c41ceaacedc0af9004d1a0 Mon Sep 17 00:00:00 2001 From: Florian Eckert Date: Wed, 9 May 2018 13:48:27 +0200 Subject: [PATCH 2/2] luci-app-mwan3: pin diag ping command to interface device If the physical device is not set in the diag_command then the ping will always use the route with the lowest metric from the default routing table. To fix this add the physical device of the logical interface to the ping command. Signed-off-by: Florian Eckert --- applications/luci-app-mwan3/luasrc/controller/mwan3.lua | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/applications/luci-app-mwan3/luasrc/controller/mwan3.lua b/applications/luci-app-mwan3/luasrc/controller/mwan3.lua index 01e40d9948..18c2135e43 100644 --- a/applications/luci-app-mwan3/luasrc/controller/mwan3.lua +++ b/applications/luci-app-mwan3/luasrc/controller/mwan3.lua @@ -97,9 +97,9 @@ function diagnosticsData(interface, task) return interfaceNumber end - function diag_command(cmd, addr) + function diag_command(cmd, device, addr) if addr and addr:match("^[a-zA-Z0-9%-%.:_]+$") then - local util = io.popen(cmd % ut.shellquote(addr)) + local util = io.popen(cmd %{ut.shellquote(device), ut.shellquote(addr)}) if util then while true do local ln = util:read("*l") @@ -145,7 +145,7 @@ function diagnosticsData(interface, task) if task == "ping_gateway" then local gateway = get_gateway(interface) if gateway ~= nil then - diag_command("ping -c 5 -W 1 %s 2>&1", gateway) + diag_command("ping -I %s -c 5 -W 1 %s 2>&1", device, gateway) else luci.http.prepare_content("text/plain") luci.http.write(string.format("No gateway for interface %s found.", interface)) @@ -154,7 +154,7 @@ function diagnosticsData(interface, task) local trackips = uci:get("mwan3", interface, "track_ip") if #trackips > 0 then for i in pairs(trackips) do - diag_command("ping -c 5 -W 1 %s 2>&1", trackips[i]) + diag_command("ping -I %s -c 5 -W 1 %s 2>&1", device, trackips[i]) end else luci.http.write(string.format("No tracking Hosts for interface %s defined.", interface))