X-Git-Url: http://git.openwrt.org/?a=blobdiff_plain;f=root%2Fusr%2Fshare%2Fucode%2Ffw4.uc;h=39e850741f75d294d9f3404b2f08b3c1a542eb0d;hb=b2682251a173103490a4a2556fb87e4df1d627b3;hp=12e0d8cfe2e092d94c60599da19e0dbb88b9358d;hpb=57984e0369974e3cf5830db4dfe5e93e8c494b09;p=project%2Ffirewall4.git diff --git a/root/usr/share/ucode/fw4.uc b/root/usr/share/ucode/fw4.uc index 12e0d8c..39e8507 100644 --- a/root/usr/share/ucode/fw4.uc +++ b/root/usr/share/ucode/fw4.uc @@ -356,53 +356,33 @@ function map_setmatch(set, match, proto) { return fields; } -function determine_device_type(devname) { - let uevent = fs.open(`/sys/class/net/${devname}/uevent`), - devtype = null; - - if (uevent) { - let line; - - while ((line = uevent.read('line')) != null) { - let m = match(line, /^DEVTYPE=(\w+)/); - - if (m) { - devtype = m[1]; - break; - } - } - - uevent.close(); - } - - return devtype; -} - -function resolve_lower_devices(devname) { - switch (determine_device_type(devname)) { - case null: - return []; - - case 'vlan': - case 'bridge': - let dir = fs.opendir(`/sys/class/net/${devname}`); - let lower = []; - - if (dir) { +function resolve_lower_devices(devstatus, devname, require_hwoffload) { + let dir = fs.opendir(`/sys/class/net/${devname}`); + let devs = []; + + if (dir) { + switch (devstatus[devname]?.devtype) { + case 'vlan': + case 'bridge': let e; while ((e = dir.read()) != null) if (index(e, "lower_") === 0) - push(lower, ...resolve_lower_devices(substr(e, 6))); + push(devs, ...resolve_lower_devices(devstatus, substr(e, 6), require_hwoffload)); - dir.close(); - } + break; + + default: + if (!require_hwoffload || devstatus[devname]?.["hw-tc-offload"]) + push(devs, devname); - return lower; + break; + } - default: - return [ devname ]; + dir.close(); } + + return devs; } function nft_json_command(...args) { @@ -460,24 +440,41 @@ return { }, resolve_offload_devices: function() { + if (!this.default_option("flow_offloading")) + return []; + + let devstatus = null; let devices = []; + let bus = ubus.connect(); - if (this.default_option("flow_offloading")) { + if (bus) { + devstatus = bus.call("network.device", "status") || {}; + bus.disconnect(); + } + + if (this.default_option("flow_offloading_hw")) { for (let zone in this.zones()) for (let device in zone.related_physdevs) - push(devices, ...resolve_lower_devices(device)); + push(devices, ...resolve_lower_devices(devstatus, device, true)); if (length(devices)) { devices = sort(uniq(devices)); - if (this.default_option("flow_offloading_hw") && !nft_try_hw_offload(devices)) { - this.warn('Hardware flow offloading unavailable, falling back to software offloading'); - this.state.defaults.flow_offloading_hw = false; - } + if (nft_try_hw_offload(devices)) + return devices; + + this.warn('Hardware flow offloading unavailable, falling back to software offloading'); + this.state.defaults.flow_offloading_hw = false; + + devices = []; } } - return devices; + for (let zone in this.zones()) + for (let device in zone.related_physdevs) + push(devices, ...resolve_lower_devices(devstatus, device, false)); + + return sort(uniq(devices)); }, check_set_types: function() {