From be8b7165fcc1cb2df1f53995c3633b059b3d81f6 Mon Sep 17 00:00:00 2001 From: "Ycarus (Yannick Chabanois)" Date: Sat, 1 Apr 2023 08:31:11 +0200 Subject: [PATCH 1/3] Detect when VPS and router kernel doesn't match --- .../luasrc/view/openmptcprouter/wanstatus.htm | 6 ++++++ .../root/usr/libexec/rpcd/openmptcprouter | 7 +++++++ 2 files changed, 13 insertions(+) diff --git a/luci-app-openmptcprouter/luasrc/view/openmptcprouter/wanstatus.htm b/luci-app-openmptcprouter/luasrc/view/openmptcprouter/wanstatus.htm index fe573ae19..085bbce00 100644 --- a/luci-app-openmptcprouter/luasrc/view/openmptcprouter/wanstatus.htm +++ b/luci-app-openmptcprouter/luasrc/view/openmptcprouter/wanstatus.htm @@ -347,6 +347,12 @@ local statuslogo = ucic:get("openmptcprouter","settings","statuslogo") or "openm statusMessageClass = "warning"; statusIcon = "<%=resource%>/openmptcprouter/images/statusWarning.png"; } + if (mArray.openmptcprouter.kernel_match == false) + { + statusMessage += '<%:MPTCP kernel on router and VPS doesn't match%>' + '
'; + statusMessageClass = "warning"; + statusIcon = "<%=resource%>/openmptcprouter/images/statusWarning.png"; + } if (mArray.openmptcprouter.wan_addr6) { content += '<%:IPv6:%>' + " " + mArray.openmptcprouter.wan_addr6; diff --git a/luci-app-openmptcprouter/root/usr/libexec/rpcd/openmptcprouter b/luci-app-openmptcprouter/root/usr/libexec/rpcd/openmptcprouter index f6b275150..cec97258f 100755 --- a/luci-app-openmptcprouter/root/usr/libexec/rpcd/openmptcprouter +++ b/luci-app-openmptcprouter/root/usr/libexec/rpcd/openmptcprouter @@ -761,6 +761,7 @@ function interfaces_status() mArray.openmptcprouter["local_addr"] = ipaddr --mArray.openmptcprouter["local_addr"] = uci:get("network", "lan", "ipaddr") mArray.openmptcprouter["hostname"] = "OpenMPTCProuter" + mArray.openmptcprouter["kernel"] = sys.exec("uname -r") ucic:foreach("system", "system", function(s) mArray.openmptcprouter["hostname"] = uci:get("system",s[".name"],"hostname") or "OpenMPTCProuter" end) @@ -955,6 +956,12 @@ function interfaces_status() end end) + mArray.openmptcprouter["kernel_match"] = true + if mArray.openmptcprouter["vps_kernel"] ~= "" then + if mArray.openmptcprouter["kernel"]:sub(1,3) == "5.4" and mArray.openmptcprouter["vps_kernel"]:sub(1,3) ~= "5.4" then + mArray.openmptcprouter["kernel_match"] = false + end + end if mArray.openmptcprouter["vps_hostname"] == "" then mArray.openmptcprouter["vps_hostname"] = "Server" From 3e47ecf0c3f8477244571bbd29195da18b03fe29 Mon Sep 17 00:00:00 2001 From: "Ycarus (Yannick Chabanois)" Date: Sat, 1 Apr 2023 08:32:30 +0200 Subject: [PATCH 2/3] Add GSO/GRO/TSO/LRO & UFO configuration for each network interface --- .../luci-static/resources/tools/network.js | 15 +++++++++++++++ mptcp/files/etc/init.d/mptcp | 17 +++++++++++++++++ 2 files changed, 32 insertions(+) diff --git a/luci-mod-network/htdocs/luci-static/resources/tools/network.js b/luci-mod-network/htdocs/luci-static/resources/tools/network.js index 311242905..6f16713fe 100644 --- a/luci-mod-network/htdocs/luci-static/resources/tools/network.js +++ b/luci-mod-network/htdocs/luci-static/resources/tools/network.js @@ -625,6 +625,21 @@ return baseclass.extend({ o = this.replaceOption(s, 'devadvanced', form.Flag, 'autoneg', _('Autonegociation')); o.default = o.enabled; + o = this.replaceOption(s, 'devadvanced', form.Flag, 'gro', _('Generic Receive Offload (GRO)')); + o.default = o.enabled; + + o = this.replaceOption(s, 'devadvanced', form.Flag, 'gso', _('Generic Segmentation Offload (GSO)')); + o.default = o.enabled; + + o = this.replaceOption(s, 'devadvanced', form.Flag, 'tso', _('TCP Segmentation Offload (TSO)')); + o.default = o.enabled; + + o = this.replaceOption(s, 'devadvanced', form.Flag, 'lro', _('Large Receive Offload (LRO)')); + o.default = o.enabled; + + o = this.replaceOption(s, 'devadvanced', form.Flag, 'ufo', _('UDP Fragmentation Offload (UFO)')); + o.default = o.enabled; + o = this.replaceOption(s, 'devadvanced', form.Value, 'speed', _('Speed')); o.placeholder = dev ? dev.getSpeed() : ''; o.default = ''; diff --git a/mptcp/files/etc/init.d/mptcp b/mptcp/files/etc/init.d/mptcp index 0e3a0b391..b444420f4 100755 --- a/mptcp/files/etc/init.d/mptcp +++ b/mptcp/files/etc/init.d/mptcp @@ -116,6 +116,23 @@ interface_multipath_settings() { uci -q set openmptcprouter.${config}.metric=$metric config_get mode "$config" multipath id=$metric + [ -n "$iface" ] && { + gro=$(uci -q network.${config}.gro) + [ "$gro" = "1" ] && ethtool -K $iface gro on 2>&1 >/dev/null + [ "$gro" = "0" ] && ethtool -K $iface gro on 2>&1 >/dev/null + gso=$(uci -q network.${config}.gso) + [ "$gso" = "1" ] && ethtool -K $iface gso on 2>&1 >/dev/null + [ "$gso" = "0" ] && ethtool -K $iface gso on 2>&1 >/dev/null + lro=$(uci -q network.${config}.lro) + [ "$lro" = "1" ] && ethtool -K $iface lro on 2>&1 >/dev/null + [ "$lro" = "0" ] && ethtool -K $iface lro on 2>&1 >/dev/null + ufo=$(uci -q network.${config}.ufo) + [ "$ufo" = "1" ] && ethtool -K $iface ufo on 2>&1 >/dev/null + [ "$ufo" = "0" ] && ethtool -K $iface ufo on 2>&1 >/dev/null + tso=$(uci -q network.${config}.tso) + [ "$tso" = "1" ] && ethtool -K $iface tso on 2>&1 >/dev/null + [ "$tso" = "0" ] && ethtool -K $iface tso on 2>&1 >/dev/null + } [ "$mode" = "" ] && { mode="$(uci -q get openmptcprouter.${config}.multipath)" [ -n "$mode" ] && uci -q set network.${config}.multipath="$mode" From e99265278330f377f7f4c7c4d8841e6982f31ab4 Mon Sep 17 00:00:00 2001 From: "Ycarus (Yannick Chabanois)" Date: Sun, 2 Apr 2023 19:26:04 +0200 Subject: [PATCH 3/3] tun0 sqm autorate wizard config --- .../luasrc/controller/openmptcprouter.lua | 12 ++++++++ .../files/etc/uci-defaults/2040-omr-sqm | 28 +++++++++++++------ 2 files changed, 31 insertions(+), 9 deletions(-) diff --git a/luci-app-openmptcprouter/luasrc/controller/openmptcprouter.lua b/luci-app-openmptcprouter/luasrc/controller/openmptcprouter.lua index be6f36f31..ba87c23ee 100644 --- a/luci-app-openmptcprouter/luasrc/controller/openmptcprouter.lua +++ b/luci-app-openmptcprouter/luasrc/controller/openmptcprouter.lua @@ -258,6 +258,8 @@ function wizard_add() end -- Set interfaces settings + local downloadmax = 0 + local uploadmax = 0 local interfaces = luci.http.formvaluetable("intf") for intf, _ in pairs(interfaces) do local label = luci.http.formvalue("cbid.network.%s.label" % intf) or "" @@ -462,6 +464,7 @@ function wizard_add() end ucic:set("network",intf,"downloadspeed",downloadspeed) ucic:set("qos",intf,"download",math.ceil(downloadspeed*95/100)) + downloadmax = downloadmax + tonumber(downloadspeed) else ucic:delete("network",intf,"downloadspeed") ucic:set("sqm",intf,"download","0") @@ -477,6 +480,7 @@ function wizard_add() end ucic:set("network",intf,"uploadspeed",uploadspeed) ucic:set("qos",intf,"upload",math.ceil(uploadspeed*95/100)) + uploadmax = uploadmax + tonumber(uploadspeed) else ucic:delete("network",intf,"uploadspeed") ucic:set("sqm",intf,"upload","0") @@ -547,6 +551,14 @@ function wizard_add() vpn_intf = "bonding-omrvpn" ucic:set("network","omrvpn","proto","bonding") end + if downloadmax ~= 0 and uploadmax ~= 0 then + ucic:set("sqm","omrvpn","max_download",downloadmax) + ucic:set("sqm","omrvpn","max_upload",uploadmax) + ucic:set("sqm","omrvpn","download",math.ceil(downloadmax*50/100)) + ucic:set("sqm","omrvpn","min_download",math.ceil(downloadmax*8/100)) + ucic:set("sqm","omrvpn","upload",math.ceil(uploadmax*50/100)) + ucic:set("sqm","omrvpn","min_upload",math.ceil(uploadmax*8/100)) + end if vpn_intf ~= "" then ucic:set("network","omrvpn","device",vpn_intf) ucic:set("sqm","omrvpn","interface",vpn_intf) diff --git a/openmptcprouter/files/etc/uci-defaults/2040-omr-sqm b/openmptcprouter/files/etc/uci-defaults/2040-omr-sqm index ace19d8a4..6d3a09a12 100755 --- a/openmptcprouter/files/etc/uci-defaults/2040-omr-sqm +++ b/openmptcprouter/files/etc/uci-defaults/2040-omr-sqm @@ -6,8 +6,8 @@ if [ "$(uci -q get openmptcprouter.settings.version)" = "" ]; then uci -q batch <<-EOF >/dev/null delete sqm.eth1 set sqm.wan1=queue - set sqm.wan1.qdisc="fq_codel" - set sqm.wan1.script="simple.qos" + set sqm.wan1.qdisc="cake" + set sqm.wan1.script="piece_of_cake.qos" set sqm.wan1.qdisc_advanced='0' set sqm.wan1.linklayer='none' set sqm.wan1.enabled='1' @@ -19,8 +19,8 @@ if [ "$(uci -q get openmptcprouter.settings.version)" = "" ]; then set sqm.wan1.iqdisc_opts='autorate-ingress dual-dsthost' set sqm.wan1.eqdisc_opts='dual-srchost' set sqm.wan2=queue - set sqm.wan2.qdisc="fq_codel" - set sqm.wan2.script="simple.qos" + set sqm.wan2.qdisc="cake" + set sqm.wan2.script="piece_of_cake.qos" set sqm.wan2.qdisc_advanced='0' set sqm.wan2.linklayer='none' set sqm.wan2.enabled='1' @@ -37,8 +37,8 @@ if [ "$(uci -q get openmptcprouter.settings.version)" = "" ]; then wan3="$(uci -q get network.wan3.device)" uci -q batch <<-EOF >/dev/null set sqm.wan3=queue - set sqm.wan3.qdisc="fq_codel" - set sqm.wan3.script="simple.qos" + set sqm.wan3.qdisc="cake" + set sqm.wan3.script="piece_of_cake.qos" set sqm.wan3.qdisc_advanced='0' set sqm.wan3.linklayer='none' set sqm.wan3.enabled='1' @@ -56,8 +56,8 @@ if [ "$(uci -q get openmptcprouter.settings.version)" = "" ]; then wan4="$(uci -q get network.wan4.device)" uci -q batch <<-EOF >/dev/null set sqm.wan4=queue - set sqm.wan4.qdisc="fq_codel" - set sqm.wan4.script="simple.qos" + set sqm.wan4.qdisc="cake" + set sqm.wan4.script="piece_of_cake.qos" set sqm.wan4.qdisc_advanced='0' set sqm.wan4.linklayer='none' set sqm.wan4.enabled='1' @@ -74,7 +74,7 @@ if [ "$(uci -q get openmptcprouter.settings.version)" = "" ]; then fi fi -if [ "$(uci -q get sqm.omrvpn)" = "" ]; then +if [ "$(uci -q get sqm.omrvpn)" = "" ] || [ -z "$(uci -q get sqm.omrvpn.delay_thr_ms)" ]; then uci -q batch <<-EOF >/dev/null set sqm.omrvpn=queue set sqm.omrvpn.qdisc="cake" @@ -89,6 +89,16 @@ if [ "$(uci -q get sqm.omrvpn)" = "" ]; then set sqm.omrvpn.verbosity='5' set sqm.omrvpn.overhead='40' set sqm.omrvpn.iqdisc_opts='autorate-ingress' + set sqm.omrvpn.delay_thr_ms='300' + set sqm.omrvpn.reflector_ping_interval_s='0.5' + set sqm.omrvpn.download='20000' + set sqm.omrvpn.min_download='1000' + set sqm.omrvpn.max_download='60000' + set sqm.omrvpn.upload='20000' + set sqm.omrvpn.min_upload='1000' + set sqm.omrvpn.max_upload='60000' + set sqm.omrvpn.enable_sleep_function='0' + set sqm.omrvpn.autorate='1' commit sqm EOF fi