luci-base: make swconfig port state parsing more robust

Since swconfig output varies wildly among different switch drivers, rely
on a simpler more robust parsing approach to find the required information.

Ref: https://forum.openwrt.org/t/cannot-read-property-link/50766
Signed-off-by: Jo-Philipp Wich <jo@mein.io>
This commit is contained in:
Jo-Philipp Wich 2020-01-28 18:14:28 +01:00
parent 616d44c155
commit 6d59a6400e

View file

@ -363,25 +363,62 @@ local methods = {
while true do while true do
local line = swc:read("*l") local line = swc:read("*l")
if not line then break end if not line or (line:match("^VLAN %d+:") and #ports > 0) then
break
end
local port, up = line:match("port:(%d+) link:(%w+)") local pnum = line:match("^Port (%d+):")
if port then if pnum then
local speed = line:match(" speed:(%d+)") port = {
local duplex = line:match(" (%w+)-duplex") port = tonumber(pnum),
local txflow = line:match(" (txflow)") duplex = false,
local rxflow = line:match(" (rxflow)") speed = 0,
local auto = line:match(" (auto)") link = false,
auto = false,
ports[#ports+1] = { rxflow = false,
port = tonumber(port) or 0, txflow = false
speed = tonumber(speed) or 0,
link = (up == "up"),
duplex = (duplex == "full"),
rxflow = (not not rxflow),
txflow = (not not txflow),
auto = (not not auto)
} }
ports[#ports+1] = port
end
if port then
local m
if line:match("full[%- ]duplex") then
port.duplex = true
end
m = line:match(" speed:(%d+)")
if m then
port.speed = tonumber(m)
end
m = line:match("(%d+) Mbps")
if m and port.speed == 0 then
port.speed = tonumber(m)
end
m = line:match("link: (%d+)")
if m and port.speed == 0 then
port.speed = tonumber(m)
end
if line:match("link: ?up") or line:match("status: ?up") then
port.link = true
end
if line:match("auto%-negotiate") or line:match("link:.-auto") then
port.auto = true
end
if line:match("link:.-rxflow") then
port.rxflow = true
end
if line:match("link:.-txflow") then
port.txflow = true
end
end end
end end