diff --git a/amule/Makefile b/amule/Makefile
index e0ebd0b34..407440349 100644
--- a/amule/Makefile
+++ b/amule/Makefile
@@ -5,8 +5,8 @@
include $(TOPDIR)/rules.mk
PKG_NAME:=amule
-PKG_VERSION:=2.3.3
-PKG_RELEASE:=3
+PKG_VERSION:=3.0.0
+PKG_RELEASE:=4
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
PKG_SOURCE_URL:=https://codeload.github.com/amule-project/amule/tar.gz/$(PKG_VERSION)?
diff --git a/antileech/Makefile b/antileech/Makefile
index 6afb004f3..ac132c1a2 100644
--- a/antileech/Makefile
+++ b/antileech/Makefile
@@ -5,12 +5,12 @@
include $(TOPDIR)/rules.mk
PKG_NAME:=antileech
-PKG_RELEASE:=2
+PKG_RELEASE:=3
PKG_SOURCE_PROTO:=git
PKG_SOURCE_DATE:=2021-12-05
PKG_SOURCE_URL:=https://github.com/persmule/amule-dlp.antiLeech.git
-PKG_SOURCE_VERSION:=null
+PKG_SOURCE_VERSION:=1b14ed828ed227933333de31ffb8e24e6c10451c
PKG_MIRROR_HASH:=skip
PKG_FIXUP:=autoreconf
diff --git a/baidudrive/Makefile b/baidudrive/Makefile
index 54667e5e3..ba6c37581 100644
--- a/baidudrive/Makefile
+++ b/baidudrive/Makefile
@@ -10,8 +10,8 @@ include $(TOPDIR)/rules.mk
PKG_ARCH_BAIDUDRIVE:=$(ARCH)
PKG_NAME:=baidudrive
-PKG_VERSION:=1.0.4
-PKG_RELEASE:=11
+PKG_VERSION:=linkeasefull-runtime-v3.0.9
+PKG_RELEASE:=12
PKG_SOURCE:=$(PKG_NAME)-binary-$(PKG_VERSION).tar.gz
PKG_SOURCE_URL:=https://github.com/istoreos/istoreos-app-hub/releases/download/baidudrive-runtime-v$(PKG_VERSION)/
PKG_HASH:=skip
diff --git a/baidupcs-go/Makefile b/baidupcs-go/Makefile
index 6ef5fc3bd..2bc59e33d 100644
--- a/baidupcs-go/Makefile
+++ b/baidupcs-go/Makefile
@@ -6,8 +6,8 @@
include $(TOPDIR)/rules.mk
PKG_NAME:=BaiduPCS-Go
-PKG_VERSION:=3.9.0
-PKG_RELEASE:=6
+PKG_VERSION:=4.0.1
+PKG_RELEASE:=7
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
PKG_SOURCE_URL:=https://codeload.github.com/qjfoidnh/BaiduPCS-Go/tar.gz/v$(PKG_VERSION)?
diff --git a/beszel-agent/Makefile b/beszel-agent/Makefile
index 23b877e65..4b0351f51 100644
--- a/beszel-agent/Makefile
+++ b/beszel-agent/Makefile
@@ -1,8 +1,8 @@
include $(TOPDIR)/rules.mk
PKG_NAME:=beszel-agent
-PKG_VERSION:=0.18.7
-PKG_RELEASE:=7
+PKG_VERSION:=0.18.8
+PKG_RELEASE:=8
PKG_SOURCE:=$(PKG_NAME)_linux_$(or $(BESZEL_GOARCH),arm64).tar.gz
PKG_SOURCE_URL:=https://github.com/henrygd/beszel/releases/download/v$(PKG_VERSION)/
diff --git a/boltbrowser/Makefile b/boltbrowser/Makefile
index 271aa20fb..e6f62fd74 100644
--- a/boltbrowser/Makefile
+++ b/boltbrowser/Makefile
@@ -1,12 +1,12 @@
include $(TOPDIR)/rules.mk
PKG_NAME:=boltbrowser
-PKG_RELEASE:=7
+PKG_RELEASE:=8
PKG_SOURCE_PROTO:=git
PKG_SOURCE_URL:=https://github.com/br0xen/boltbrowser.git
PKG_SOURCE_DATE:=2023-05-31
-PKG_SOURCE_VERSION:=null
+PKG_SOURCE_VERSION:=6ad3511ddb3c271fbaed2f22e409aa453ed89042
PKG_MIRROR_HASH:=skip
PKG_LICENSE:=GPL-3.0-or-later
diff --git a/luci-app-bandix/Makefile b/luci-app-bandix/Makefile
index 5a9659b54..a7225a12a 100644
--- a/luci-app-bandix/Makefile
+++ b/luci-app-bandix/Makefile
@@ -10,8 +10,8 @@ LUCI_DEPENDS:=+luci-base +luci-lib-jsonc +curl +bandix
PKG_MAINTAINER:=timsaya
-PKG_VERSION:=0.12.9
-PKG_RELEASE:=8
+PKG_VERSION:=0.12.10
+PKG_RELEASE:=9
include $(TOPDIR)/feeds/luci/luci.mk
diff --git a/luci-app-bandix/htdocs/luci-static/resources/bandix/donate/alipay.jpg b/luci-app-bandix/htdocs/luci-static/resources/bandix/donate/alipay.jpg
deleted file mode 100644
index 5069c8e27..000000000
Binary files a/luci-app-bandix/htdocs/luci-static/resources/bandix/donate/alipay.jpg and /dev/null differ
diff --git a/luci-app-bandix/htdocs/luci-static/resources/bandix/donate/wechat-pay.png b/luci-app-bandix/htdocs/luci-static/resources/bandix/donate/wechat-pay.png
deleted file mode 100644
index f6b96a961..000000000
Binary files a/luci-app-bandix/htdocs/luci-static/resources/bandix/donate/wechat-pay.png and /dev/null differ
diff --git a/luci-app-bandix/htdocs/luci-static/resources/view/bandix/settings.js b/luci-app-bandix/htdocs/luci-static/resources/view/bandix/settings.js
index 96ab55567..706595604 100644
--- a/luci-app-bandix/htdocs/luci-static/resources/view/bandix/settings.js
+++ b/luci-app-bandix/htdocs/luci-static/resources/view/bandix/settings.js
@@ -673,46 +673,6 @@ return view.extend({
return false;
};
- // 支持作者(基本设置的最后一项)
- var alipayImage = L.resource('bandix/donate/alipay.jpg');
- var wechatImage = L.resource('bandix/donate/wechat-pay.png');
-
- function donationCard(title, imageUrl, altText, dotClass) {
- return E('div', { 'class': 'bandix-donation-card' }, [
- E('h4', { 'class': 'bandix-donation-card-title' }, [
- E('span', { 'class': 'bandix-donation-dot ' + dotClass }),
- title
- ]),
- E('a', {
- 'class': 'bandix-donation-image-link',
- 'href': imageUrl,
- 'target': '_blank',
- 'rel': 'noopener noreferrer',
- 'title': altText
- }, [
- E('img', {
- 'class': 'bandix-donation-image',
- 'src': imageUrl,
- 'alt': altText,
- 'loading': 'lazy'
- })
- ])
- ]);
- }
-
- o = s.option(form.DummyValue, '_donation_qr_codes', _('Support the Author'));
- o.renderWidget = function () {
- return E('div', { 'class': 'bandix-donation-content' }, [
- E('p', { 'class': 'bandix-donation-description' },
- _('If Bandix is useful to you, you can support its continued development.')),
- E('div', { 'class': 'bandix-donation-grid' }, [
- donationCard(_('Alipay'), alipayImage, _('Scan with Alipay to support'), 'bandix-donation-dot-alipay'),
- donationCard(_('WeChat Pay'), wechatImage, _('Scan with WeChat Pay to support'), 'bandix-donation-dot-wechat')
- ]),
- E('p', { 'class': 'bandix-donation-note' }, _('Donations are voluntary. Thank you for supporting Bandix.'))
- ]);
- };
-
// 2. 流量监控设置部分 (traffic)
s = m.section(form.NamedSection, 'traffic', 'traffic', _('Traffic Monitor Settings'));
s.description = _('Configure traffic monitoring related parameters');
@@ -866,98 +826,6 @@ return view.extend({
// 将 view 实例关联到 form map,以便在 cfgvalue 中访问
m.view = this;
- return m.render().then(function (mapEl) {
- var oldStyle = document.getElementById('bandix-donation-styles');
- if (oldStyle && oldStyle.parentNode) oldStyle.parentNode.removeChild(oldStyle);
-
- document.head.appendChild(E('style', { 'id': 'bandix-donation-styles' }, `
- .bandix-donation-content {
- text-align: center;
- }
-
- .bandix-donation-description {
- margin: 0 auto 18px;
- max-width: 620px;
- opacity: 0.72;
- line-height: 1.6;
- }
-
- .bandix-donation-grid {
- display: grid;
- grid-template-columns: repeat(2, minmax(220px, 280px));
- justify-content: center;
- gap: 20px;
- }
-
- .bandix-donation-card {
- padding: 12px;
- border: 1px solid rgba(107, 114, 128, 0.3);
- border-radius: 10px;
- background: rgba(107, 114, 128, 0.04);
- box-sizing: border-box;
- transition: transform 0.2s ease, box-shadow 0.2s ease, border-color 0.2s ease;
- }
-
- .bandix-donation-card:hover {
- border-color: rgba(59, 130, 246, 0.55);
- box-shadow: 0 8px 24px rgba(15, 23, 42, 0.1);
- transform: translateY(-2px);
- }
-
- .bandix-donation-card-title {
- display: flex;
- align-items: center;
- justify-content: center;
- gap: 7px;
- margin: 0 0 10px;
- font-size: 1rem;
- font-weight: 600;
- }
-
- .bandix-donation-dot {
- width: 9px;
- height: 9px;
- border-radius: 50%;
- flex-shrink: 0;
- }
-
- .bandix-donation-dot-alipay {
- background: #1677ff;
- }
-
- .bandix-donation-dot-wechat {
- background: #07c160;
- }
-
- .bandix-donation-image-link {
- display: block;
- border-radius: 7px;
- overflow: hidden;
- background: #ffffff;
- line-height: 0;
- }
-
- .bandix-donation-image {
- display: block;
- width: 100%;
- height: auto;
- }
-
- .bandix-donation-note {
- margin: 14px 0 0;
- font-size: 0.75rem;
- opacity: 0.58;
- }
-
- @media (max-width: 600px) {
- .bandix-donation-grid {
- grid-template-columns: minmax(200px, 280px);
- gap: 14px;
- }
- }
- `));
-
- return mapEl;
- });
+ return m.render();
}
});
diff --git a/luci-app-bandix/po/es/bandix.po b/luci-app-bandix/po/es/bandix.po
index 9a12acca2..9a5e5885e 100644
--- a/luci-app-bandix/po/es/bandix.po
+++ b/luci-app-bandix/po/es/bandix.po
@@ -1115,27 +1115,6 @@ msgstr "Hoy"
msgid "Yesterday"
msgstr "Ayer"
-msgid "Support the Author"
-msgstr "Apoyar al autor"
-
-msgid "If Bandix is useful to you, you can support its continued development."
-msgstr "Si Bandix te resulta útil, puedes apoyar su desarrollo continuo."
-
-msgid "Alipay"
-msgstr "Alipay"
-
-msgid "Scan with Alipay to support"
-msgstr "Escanea con Alipay para apoyar"
-
-msgid "WeChat Pay"
-msgstr "WeChat Pay"
-
-msgid "Scan with WeChat Pay to support"
-msgstr "Escanea con WeChat Pay para apoyar"
-
-msgid "Donations are voluntary. Thank you for supporting Bandix."
-msgstr "Las donaciones son voluntarias. Gracias por apoyar a Bandix."
-
msgid "This Week"
msgstr "Esta Semana"
diff --git a/luci-app-bandix/po/fr/bandix.po b/luci-app-bandix/po/fr/bandix.po
index a32ab4cfe..f4dd364ce 100644
--- a/luci-app-bandix/po/fr/bandix.po
+++ b/luci-app-bandix/po/fr/bandix.po
@@ -1115,27 +1115,6 @@ msgstr "Aujourd'hui"
msgid "Yesterday"
msgstr "Hier"
-msgid "Support the Author"
-msgstr "Soutenir l’auteur"
-
-msgid "If Bandix is useful to you, you can support its continued development."
-msgstr "Si Bandix vous est utile, vous pouvez soutenir la poursuite de son développement."
-
-msgid "Alipay"
-msgstr "Alipay"
-
-msgid "Scan with Alipay to support"
-msgstr "Scannez avec Alipay pour nous soutenir"
-
-msgid "WeChat Pay"
-msgstr "WeChat Pay"
-
-msgid "Scan with WeChat Pay to support"
-msgstr "Scannez avec WeChat Pay pour nous soutenir"
-
-msgid "Donations are voluntary. Thank you for supporting Bandix."
-msgstr "Les dons sont facultatifs. Merci de soutenir Bandix."
-
msgid "This Week"
msgstr "Cette Semaine"
diff --git a/luci-app-bandix/po/ja/bandix.po b/luci-app-bandix/po/ja/bandix.po
index a27fc1d25..2387a50e3 100644
--- a/luci-app-bandix/po/ja/bandix.po
+++ b/luci-app-bandix/po/ja/bandix.po
@@ -1115,27 +1115,6 @@ msgstr "今日"
msgid "Yesterday"
msgstr "昨日"
-msgid "Support the Author"
-msgstr "作者を支援"
-
-msgid "If Bandix is useful to you, you can support its continued development."
-msgstr "Bandix が役に立った場合は、継続的な開発をご支援いただけます。"
-
-msgid "Alipay"
-msgstr "Alipay"
-
-msgid "Scan with Alipay to support"
-msgstr "Alipay でスキャンして支援"
-
-msgid "WeChat Pay"
-msgstr "WeChat Pay"
-
-msgid "Scan with WeChat Pay to support"
-msgstr "WeChat Pay でスキャンして支援"
-
-msgid "Donations are voluntary. Thank you for supporting Bandix."
-msgstr "寄付は任意です。Bandix をご支援いただきありがとうございます。"
-
msgid "This Week"
msgstr "今週"
diff --git a/luci-app-bandix/po/pl/bandix.po b/luci-app-bandix/po/pl/bandix.po
index 163cb6e2b..60f924267 100644
--- a/luci-app-bandix/po/pl/bandix.po
+++ b/luci-app-bandix/po/pl/bandix.po
@@ -1115,27 +1115,6 @@ msgstr "Dzisiaj"
msgid "Yesterday"
msgstr "Wczoraj"
-msgid "Support the Author"
-msgstr "Wesprzyj autora"
-
-msgid "If Bandix is useful to you, you can support its continued development."
-msgstr "Jeśli Bandix jest dla Ciebie przydatny, możesz wesprzeć jego dalszy rozwój."
-
-msgid "Alipay"
-msgstr "Alipay"
-
-msgid "Scan with Alipay to support"
-msgstr "Zeskanuj w Alipay, aby wesprzeć"
-
-msgid "WeChat Pay"
-msgstr "WeChat Pay"
-
-msgid "Scan with WeChat Pay to support"
-msgstr "Zeskanuj w WeChat Pay, aby wesprzeć"
-
-msgid "Donations are voluntary. Thank you for supporting Bandix."
-msgstr "Darowizny są dobrowolne. Dziękujemy za wsparcie Bandix."
-
msgid "This Week"
msgstr "Ten Tydzień"
diff --git a/luci-app-bandix/po/ru/bandix.po b/luci-app-bandix/po/ru/bandix.po
index d90852710..67d5b403b 100644
--- a/luci-app-bandix/po/ru/bandix.po
+++ b/luci-app-bandix/po/ru/bandix.po
@@ -1115,27 +1115,6 @@ msgstr "Сегодня"
msgid "Yesterday"
msgstr "Вчера"
-msgid "Support the Author"
-msgstr "Поддержать автора"
-
-msgid "If Bandix is useful to you, you can support its continued development."
-msgstr "Если Bandix полезен вам, вы можете поддержать его дальнейшую разработку."
-
-msgid "Alipay"
-msgstr "Alipay"
-
-msgid "Scan with Alipay to support"
-msgstr "Отсканируйте в Alipay, чтобы поддержать"
-
-msgid "WeChat Pay"
-msgstr "WeChat Pay"
-
-msgid "Scan with WeChat Pay to support"
-msgstr "Отсканируйте в WeChat Pay, чтобы поддержать"
-
-msgid "Donations are voluntary. Thank you for supporting Bandix."
-msgstr "Пожертвования добровольны. Спасибо за поддержку Bandix."
-
msgid "This Week"
msgstr "На этой неделе"
diff --git a/luci-app-bandix/po/zh_Hans/bandix.po b/luci-app-bandix/po/zh_Hans/bandix.po
index ee1c19451..8307d54a1 100644
--- a/luci-app-bandix/po/zh_Hans/bandix.po
+++ b/luci-app-bandix/po/zh_Hans/bandix.po
@@ -1118,27 +1118,6 @@ msgstr "今天"
msgid "Yesterday"
msgstr "昨天"
-msgid "Support the Author"
-msgstr "支持作者"
-
-msgid "If Bandix is useful to you, you can support its continued development."
-msgstr "如果 Bandix 对您有帮助,您可以支持项目的持续开发。"
-
-msgid "Alipay"
-msgstr "支付宝"
-
-msgid "Scan with Alipay to support"
-msgstr "使用支付宝扫码支持"
-
-msgid "WeChat Pay"
-msgstr "微信支付"
-
-msgid "Scan with WeChat Pay to support"
-msgstr "使用微信支付扫码支持"
-
-msgid "Donations are voluntary. Thank you for supporting Bandix."
-msgstr "赞助完全自愿。感谢您对 Bandix 的支持。"
-
msgid "This Week"
msgstr "本周"
diff --git a/luci-app-bandix/po/zh_Hant/bandix.po b/luci-app-bandix/po/zh_Hant/bandix.po
index 43d3a9cb7..1d6a37d25 100644
--- a/luci-app-bandix/po/zh_Hant/bandix.po
+++ b/luci-app-bandix/po/zh_Hant/bandix.po
@@ -1115,27 +1115,6 @@ msgstr "今天"
msgid "Yesterday"
msgstr "昨天"
-msgid "Support the Author"
-msgstr "支持作者"
-
-msgid "If Bandix is useful to you, you can support its continued development."
-msgstr "如果 Bandix 對您有幫助,您可以支持專案的持續開發。"
-
-msgid "Alipay"
-msgstr "支付寶"
-
-msgid "Scan with Alipay to support"
-msgstr "使用支付寶掃碼支持"
-
-msgid "WeChat Pay"
-msgstr "微信支付"
-
-msgid "Scan with WeChat Pay to support"
-msgstr "使用微信支付掃碼支持"
-
-msgid "Donations are voluntary. Thank you for supporting Bandix."
-msgstr "贊助完全自願。感謝您對 Bandix 的支持。"
-
msgid "This Week"
msgstr "本週"
diff --git a/luci-app-mptcp/htdocs/luci-static/resources/mptcp/css/mptcp_diagnostics.css b/luci-app-mptcp/htdocs/luci-static/resources/mptcp/css/mptcp_diagnostics.css
new file mode 100644
index 000000000..22d69340f
--- /dev/null
+++ b/luci-app-mptcp/htdocs/luci-static/resources/mptcp/css/mptcp_diagnostics.css
@@ -0,0 +1,93 @@
+/* ── CSS custom properties (same palette as wanstatus.css, duplicated so
+ this page doesn't depend on wanstatus.css having been loaded first) ── */
+:root {
+ --diag-bg: #ffffff;
+ --diag-border: #e2e6ea;
+ --diag-text: #1a2332;
+ --diag-muted: #6b7a8d;
+ --diag-ok: #22c55e;
+ --diag-warn: #f59e0b;
+ --diag-err: #ef4444;
+ --diag-ok-bg: #f0fdf4;
+ --diag-warn-bg: #fffbeb;
+ --diag-err-bg: #fef2f2;
+ --diag-ok-border: #bbf7d0;
+ --diag-warn-border:#fde68a;
+ --diag-err-border: #fecaca;
+ --diag-radius: 10px;
+}
+
+.omrdiag-summary {
+ display: flex;
+ flex-direction: column;
+ gap: 10px;
+ margin: 10px 0 20px 0;
+}
+
+.omrdiag-issue {
+ display: flex;
+ gap: 10px;
+ align-items: flex-start;
+ padding: 10px 14px;
+ border-radius: var(--diag-radius);
+ border: 1px solid var(--diag-border);
+ background: var(--diag-bg);
+}
+.omrdiag-issue.ok { border-color: var(--diag-ok-border); background: var(--diag-ok-bg); }
+.omrdiag-issue.warning { border-color: var(--diag-warn-border); background: var(--diag-warn-bg); }
+.omrdiag-issue.error { border-color: var(--diag-err-border); background: var(--diag-err-bg); }
+
+.omrdiag-issue .omrdiag-dot {
+ flex: 0 0 10px;
+ width: 10px;
+ height: 10px;
+ border-radius: 50%;
+ margin-top: 5px;
+ background: var(--diag-muted);
+}
+.omrdiag-issue.ok .omrdiag-dot { background: var(--diag-ok); }
+.omrdiag-issue.warning .omrdiag-dot { background: var(--diag-warn); }
+.omrdiag-issue.error .omrdiag-dot { background: var(--diag-err); }
+
+.omrdiag-issue .omrdiag-body { flex: 1; min-width: 0; }
+.omrdiag-issue .omrdiag-message { font-weight: 700; color: var(--diag-text); }
+.omrdiag-issue .omrdiag-detail { font-size: 12px; color: var(--diag-muted); margin-top: 3px; line-height: 1.5; }
+
+.omrdiag-wan-table,
+.omrdiag-counters-table {
+ border-collapse: collapse;
+ width: 100%;
+ margin: 8px 0 18px 0;
+}
+.omrdiag-wan-table th,
+.omrdiag-wan-table td,
+.omrdiag-counters-table th,
+.omrdiag-counters-table td {
+ border: 1px solid var(--diag-border);
+ padding: 6px 10px;
+ text-align: left;
+ font-size: 12.5px;
+}
+.omrdiag-wan-table th,
+.omrdiag-counters-table th {
+ background: rgba(0,0,0,.03);
+ font-weight: 700;
+}
+.omrdiag-badge {
+ display: inline-block;
+ padding: 1px 8px;
+ border-radius: 999px;
+ font-size: 11px;
+ font-weight: 700;
+}
+.omrdiag-badge.ok { background: var(--diag-ok-bg); color: #15803d; border: 1px solid var(--diag-ok-border); }
+.omrdiag-badge.warning { background: var(--diag-warn-bg); color: #b45309; border: 1px solid var(--diag-warn-border); }
+.omrdiag-badge.error { background: var(--diag-err-bg); color: #b91c1c; border: 1px solid var(--diag-err-border); }
+
+.omrdiag-counters-table td.omrdiag-nonzero { font-weight: 700; color: #b45309; }
+
+.omrdiag-updated {
+ font-size: 11px;
+ color: var(--diag-muted);
+ margin-bottom: 6px;
+}
diff --git a/luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js b/luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js
new file mode 100644
index 000000000..939c4b88e
--- /dev/null
+++ b/luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js
@@ -0,0 +1,305 @@
+'use strict';
+'require view';
+'require poll';
+'require rpc';
+
+var callDiagnose = rpc.declare({
+ object: 'luci.mptcp',
+ method: 'diagnose',
+ expect: { '': {} }
+});
+
+var COUNTER_LABELS = {
+ /* Initial MP_CAPABLE handshake (does this connection become MPTCP at all?) */
+ MPCapableSYNTX: _('MPTCP handshake attempts sent (SYN)'),
+ MPCapableSYNRX: _('MPTCP handshake attempts received (SYN)'),
+ MPCapableSYNACKRX: _('MPTCP handshake accepted by peer (SYN/ACK)'),
+ MPCapableACKRX: _('MPTCP handshake completed (ACK)'),
+ MPCapableFallbackSYNACK: _('Fallback to TCP (SYN/ACK stripped)'),
+ MPCapableFallbackACK: _('Fallback to TCP (ACK stripped)'),
+ MPCapableSYNTXDrop: _('MPTCP handshake dropped client-side, fell back to TCP'),
+ MPCapableSYNTXDisabled: _('MPTCP handshake disabled client-side after past issues'),
+ MPCapableEndpAttempt: _('MPTCP rejected on a port-only endpoint'),
+ MPFallbackTokenInit: _('Could not allocate an MPTCP token, fell back to TCP'),
+
+ /* MP_JOIN handshake (does a WAN succeed in adding a subflow?) */
+ MPJoinSynTx: _('Subflow JOIN attempts sent (SYN)'),
+ MPJoinSynTxCreatSkErr: _('Subflow JOIN failed: could not create socket'),
+ MPJoinSynTxBindErr: _('Subflow JOIN failed: could not bind address'),
+ MPJoinSynTxConnectErr: _('Subflow JOIN failed: could not connect'),
+ MPJoinSynRx: _('Subflow JOIN attempts received (SYN)'),
+ MPJoinSynBackupRx: _('Subflow JOIN attempts received (SYN, backup)'),
+ MPJoinSynAckRx: _('Subflow JOIN accepted by peer (SYN/ACK)'),
+ MPJoinSynAckBackupRx: _('Subflow JOIN accepted by peer (SYN/ACK, backup)'),
+ MPJoinSynAckHMacFailure: _('JOIN SYN/ACK authentication failures'),
+ MPJoinAckRx: _('Subflow JOIN completed (ACK)'),
+ MPJoinAckHMacFailure: _('JOIN ACK authentication failures'),
+ MPJoinNoTokenFound: _('JOIN attempts with unknown token'),
+ MPJoinRejected: _('JOIN request rejected by the path manager'),
+ MPJoinPortSynRx: _('Subflow JOIN SYN received on a different port'),
+ MPJoinPortSynAckRx: _('Subflow JOIN SYN/ACK received on a different port'),
+ MPJoinPortAckRx: _('Subflow JOIN ACK received on a different port'),
+ MismatchPortSynRx: _('Subflow JOIN SYN with mismatched port'),
+ MismatchPortAckRx: _('Subflow JOIN ACK with mismatched port'),
+
+ /* Data-sequence mapping / data path integrity */
+ MPTCPRetrans: _('MPTCP-level retransmissions'),
+ DSSNotMatching: _('Data sequence mapping did not match the previous one'),
+ DSSCorruptionFallback: _('DSS corruption detected, fell back to plain TCP'),
+ DSSCorruptionReset: _('DSS corruption detected, subflow reset'),
+ DSSNoMatchTCP: _('Data sequence mapping did not match TCP sequence numbers'),
+ InfiniteMapTx: _('Infinite mapping sent (fell back to plain TCP semantics)'),
+ InfiniteMapRx: _('Infinite mapping received (peer fell back to plain TCP semantics)'),
+ DataCsumErr: _('Data checksum errors'),
+ NoDSSInWindow: _('Segments received outside the MPTCP mapping window'),
+ DuplicateData: _('Duplicate data segments discarded'),
+ OFOQueueTail: _('Out-of-order segments queued at tail'),
+ OFOQueue: _('Out-of-order segments queued'),
+ OFOMerge: _('Out-of-order segments merged'),
+
+ /* Subflow lifecycle: stale/blackhole detection and removal */
+ Blackhole: _('Blackhole detected on the path'),
+ SubflowStale: _('Subflows marked stale (possible blackhole)'),
+ SubflowRecover: _('Stale subflows recovered'),
+ RmSubflow: _('Subflows removed'),
+
+ /* ADD_ADDR / RM_ADDR signalling (extra WAN addresses advertised to the peer) */
+ AddAddr: _('ADD_ADDR signals received'),
+ AddAddrTx: _('ADD_ADDR signals sent'),
+ AddAddrTxDrop: _('ADD_ADDR signals failed to send'),
+ AddAddrDrop: _('ADD_ADDR signals dropped'),
+ EchoAdd: _('ADD_ADDR echo received'),
+ EchoAddTx: _('ADD_ADDR echo sent'),
+ EchoAddTxDrop: _('ADD_ADDR echo failed to send'),
+ PortAdd: _('ADD_ADDR received with a port number'),
+ RmAddr: _('RM_ADDR signals received'),
+ RmAddrTx: _('RM_ADDR signals sent'),
+ RmAddrTxDrop: _('RM_ADDR signals failed to send'),
+ RmAddrDrop: _('RM_ADDR signals dropped'),
+
+ /* Subflow priority (MP_PRIO: backup/non-backup flag changes) */
+ MPPrioTx: _('Subflow priority change sent (MP_PRIO)'),
+ MPPrioRx: _('Subflow priority change received (MP_PRIO)'),
+
+ /* Connection teardown */
+ MPFailTx: _('Data mapping failures sent (MP_FAIL)'),
+ MPFailRx: _('Data mapping failures received (MP_FAIL)'),
+ MPFastcloseTx: _('Fastclose sent'),
+ MPFastcloseRx: _('Fastclose received'),
+ MPRstTx: _('MPTCP resets sent'),
+ MPRstRx: _('MPTCP resets received'),
+
+ /* Receive-window sharing across subflows */
+ SndWndShared: _('Send window shared across subflows'),
+ RcvWndShared: _('Receive window shared across subflows'),
+ RcvWndConflictUpdate: _('Receive window conflict resolved on update'),
+ RcvWndConflict: _('Receive window update conflicts'),
+
+ /* Misc: whole-connection fallback reasons, gauges */
+ MPCurrEstab: _('Established MPTCP connections (current)'),
+ MPCapableDataFallback: _('Fell back to TCP: missing data on first established packet'),
+ MD5SigFallback: _('Fell back to TCP: conflicting TCP MD5SIG option'),
+ DssFallback: _('Fell back to TCP: bad or missing data sequence signal'),
+ SimultConnectFallback: _('Fell back to TCP: simultaneous connect'),
+ FallbackFailed: _("Couldn't fall back to TCP (connection state didn't allow it)"),
+ WinProbe: _('MPTCP-level zero-window probes')
+};
+
+return view.extend({
+ load: function() {
+ return callDiagnose().catch(function() { return null; });
+ },
+
+ pollData: function(container) {
+ poll.add(L.bind(function() {
+ return callDiagnose().then(L.bind(function(data) {
+ this.renderAll(container, data);
+ }, this)).catch(function() {
+ /* Ignore transient poll errors -- keep showing the last good snapshot */
+ });
+ }, this), 15);
+ },
+
+ render: function(initialData) {
+ if (!document.querySelector('link[href*="mptcp_diagnostics.css"]')) {
+ var link = document.createElement('link');
+ link.rel = 'stylesheet';
+ link.type = 'text/css';
+ link.href = L.resource('mptcp/css/mptcp_diagnostics.css');
+ document.head.appendChild(link);
+ }
+
+ var container = E('div', { 'id': 'omrdiag-container' }, [
+ E('img', { 'src': L.resource('spinner.gif') })
+ ]);
+
+ var seeAlso = E('div', { 'class': 'cbi-section' }, [
+ E('legend', {}, [ _('Related pages') ]),
+ E('ul', {}, [
+ E('li', {}, [ E('a', { 'href': L.url('admin/system/openmptcprouter/status') }, [ _('OpenMPTCProuter Network overview / Status') ]) ]),
+ E('li', {}, [ E('a', { 'href': L.url('admin/network/mptcp/mptcp') }, [ _('MPTCP Settings') ]) ]),
+ E('li', {}, [ E('a', { 'href': L.url('admin/network/mptcp/mptcp_fullmesh') }, [ _('MPTCP Fullmesh (subflow map)') ]) ]),
+ E('li', {}, [ E('a', { 'href': L.url('admin/network/mptcp/mptcp_connections') }, [ _('MPTCP Established connections') ]) ]),
+ E('li', {}, [ E('a', { 'href': L.url('admin/network/mptcp/mptcp_monitor') }, [ _('MPTCP monitoring (raw kernel counters)') ]) ])
+ ])
+ ]);
+
+ var page = E('div', {}, [
+ E('h2', {}, [ _('MPTCP Diagnostics') ]),
+ E('div', { 'class': 'cbi-map-descr' }, [
+ _('Helps explain why MPTCP might not be aggregating your WANs correctly: fallback to plain TCP, ' +
+ 'blackholed/stale subflows, resets, checksum errors, and WANs that never got an MPTCP endpoint ' +
+ 'registered at all. Refreshes automatically every 15 seconds.')
+ ]),
+ container,
+ seeAlso
+ ]);
+
+ this.renderAll(container, initialData);
+ this.pollData(container);
+
+ return page;
+ },
+
+ renderAll: function(container, data) {
+ if (!container) return;
+ var d = data || {};
+
+ container.textContent = '';
+ container.appendChild(E('div', { 'class': 'omrdiag-updated' },
+ [ _('Last updated:') + ' ' + (new Date()).toLocaleTimeString() ]));
+
+ container.appendChild(this.renderIssues(d.issues || []));
+ container.appendChild(this.renderWanTable(d.wans || []));
+ container.appendChild(this.renderSettings(d.settings || {}, d.limits || {}, d.established_count));
+ container.appendChild(this.renderCounters(d.counters || {}));
+ },
+
+ renderIssues: function(issues) {
+ var box = E('div', { 'class': 'omrdiag-summary' });
+ if (!issues.length) {
+ box.appendChild(E('div', { 'class': 'omrdiag-issue' }, [
+ E('div', { 'class': 'omrdiag-dot' }),
+ E('div', { 'class': 'omrdiag-body' }, [
+ E('div', { 'class': 'omrdiag-message' }, [ _('No diagnostic data available yet.') ])
+ ])
+ ]));
+ return box;
+ }
+ issues.forEach(function(issue) {
+ var sev = issue.severity || 'warning';
+ box.appendChild(E('div', { 'class': 'omrdiag-issue ' + sev }, [
+ E('div', { 'class': 'omrdiag-dot' }),
+ E('div', { 'class': 'omrdiag-body' }, [
+ E('div', { 'class': 'omrdiag-message' }, [ issue.message || '' ]),
+ issue.detail ? E('div', { 'class': 'omrdiag-detail' }, [ issue.detail ]) : ''
+ ])
+ ]));
+ });
+ return box;
+ },
+
+ renderWanTable: function(wans) {
+ var wrap = E('div', {}, [ E('h3', {}, [ _('Per-WAN MPTCP endpoint status') ]) ]);
+ if (!wans.length) {
+ wrap.appendChild(E('p', {}, [ _('No multipath-enabled WAN interfaces found.') ]));
+ return wrap;
+ }
+ var table = E('table', { 'class': 'omrdiag-wan-table' }, [
+ E('tr', {}, [
+ E('th', {}, [ _('WAN') ]),
+ E('th', {}, [ _('Device') ]),
+ E('th', {}, [ _('Mode') ]),
+ E('th', {}, [ _('MPTCP endpoint') ]),
+ E('th', {}, [ _('Endpoint flags') ])
+ ])
+ ]);
+ wans.forEach(function(wan) {
+ var ok = !!wan.has_endpoint;
+ table.appendChild(E('tr', {}, [
+ E('td', {}, [ wan.name || '' ]),
+ E('td', {}, [ wan.device || '-' ]),
+ E('td', {}, [ wan.multipath || 'off' ]),
+ E('td', {}, [
+ E('span', { 'class': 'omrdiag-badge ' + (ok ? 'ok' : 'error') },
+ [ ok ? _('registered') : _('missing') ])
+ ]),
+ E('td', {}, [ wan.endpoint_flags || '-' ])
+ ]));
+ });
+ wrap.appendChild(table);
+ return wrap;
+ },
+
+ renderSettings: function(settings, limits, establishedCount) {
+ // "1"/"0" mean enabled/disabled for the enabled and checksum sysctls --
+ // but NOT for path_manager: on the in-kernel MPTCP sysctl layout,
+ // net.mptcp.pm_type is a selector between two path manager
+ // *implementations* (0 = in-kernel, 1 = userspace/mptcpd), not an
+ // on/off switch -- "0" here is the normal default, not "disabled".
+ // On the legacy out-of-tree sysctl layout path_manager is already a
+ // name (e.g. "fullmesh"), not a 0/1 code, so leave those untouched.
+ var formatBool = function(v) {
+ if (v === '1') return _('Enabled') + ' (1)';
+ if (v === '0') return _('Disabled') + ' (0)';
+ return v;
+ };
+ var formatPathManager = function(v) {
+ if (v === '0') return _('In-kernel') + ' (0)';
+ if (v === '1') return _('Userspace') + ' (1)';
+ return v;
+ };
+ var rows = [
+ [ _('MPTCP enabled'), formatBool(settings.enabled) ],
+ [ _('Path manager'), formatPathManager(settings.path_manager) ],
+ [ _('Scheduler'), settings.scheduler ],
+ [ _('Checksum'), formatBool(settings.checksum) ],
+ [ _('Stale loss count threshold'), settings.stale_loss_cnt ],
+ [ _('Blackhole timeout (s)'), settings.blackhole_timeout ],
+ [ _('Add-addr timeout (s)'), settings.add_addr_timeout ],
+ [ _('Close timeout (s)'), settings.close_timeout ],
+ [ _('Subflow limit'), limits.subflows ],
+ [ _('Accepted ADD_ADDR limit'), limits.add_addr_accepted ],
+ [ _('Established MPTCP connections (right now)'), establishedCount ]
+ ];
+ var wrap = E('div', {}, [ E('h3', {}, [ _('Kernel MPTCP configuration') ]) ]);
+ var table = E('table', { 'class': 'omrdiag-wan-table' });
+ rows.forEach(function(r) {
+ if (r[1] === undefined || r[1] === null || r[1] === '') return;
+ table.appendChild(E('tr', {}, [ E('th', {}, [ r[0] ]), E('td', {}, [ String(r[1]) ]) ]));
+ });
+ wrap.appendChild(table);
+ return wrap;
+ },
+
+ renderCounters: function(counters) {
+ var keys = Object.keys(counters || {});
+ var wrap = E('div', {}, [ E('h3', {}, [ _('MPTCP kernel counters (since boot)') ]) ]);
+ if (!keys.length) {
+ wrap.appendChild(E('p', {}, [ _('No counters available (nstat/multipath -m returned nothing).') ]));
+ return wrap;
+ }
+ keys.sort(function(a, b) {
+ var av = counters[a] || 0, bv = counters[b] || 0;
+ if (av !== bv) return bv - av;
+ return a < b ? -1 : (a > b ? 1 : 0);
+ });
+ var table = E('table', { 'class': 'omrdiag-counters-table' }, [
+ E('tr', {}, [ E('th', {}, [ _('Counter') ]), E('th', {}, [ _('Value') ]) ])
+ ]);
+ keys.forEach(function(key) {
+ var value = counters[key] || 0;
+ var label = COUNTER_LABELS[key] ? (COUNTER_LABELS[key] + ' (' + key + ')') : key;
+ table.appendChild(E('tr', {}, [
+ E('td', {}, [ label ]),
+ E('td', { 'class': value > 0 ? 'omrdiag-nonzero' : '' }, [ String(value) ])
+ ]));
+ });
+ wrap.appendChild(table);
+ return wrap;
+ },
+
+ handleSave: null,
+ handleSaveApply: null,
+ handleReset: null
+});
diff --git a/luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_dscp_routing.js b/luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_dscp_routing.js
index 2c9fbc2fc..7d12ece3d 100644
--- a/luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_dscp_routing.js
+++ b/luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_dscp_routing.js
@@ -41,6 +41,15 @@ function isEligibleIface(name) {
name !== 'omrvpn' && name !== 'OWVPN' && name !== 'omr6in4';
}
+// Same "multipath actually turned on" whitelist as the bandwidth page's
+// _getMultipathIfaces (multipath.js) and the rpcd backend's
+// multipath_bandwidth: "off"/unset doesn't count.
+function isMultipathEnabledIface(name) {
+ var multipath = uci.get('network', name, 'multipath');
+ return multipath === 'on' || multipath === 'master' ||
+ multipath === 'backup' || multipath === 'handover';
+}
+
function fillIfaceOptions(option) {
option.value('', _('-- not pinned --'));
uci.sections('network', 'interface', function(ifc) {
@@ -140,7 +149,9 @@ return L.view.extend({
if (vpsSyncEnabled) {
o = s.option(form.ListValue, 'download_interface', _('Download interface'),
- _('Gateway (VPS) → router. Only takes effect for MPTCP’s bpf_dscp scheduler (pins the VPS’s own send-side choice via dscp_remote_id) and can be a different WAN than Upload. mqvpn has no equivalent: its downlink always mirrors whichever WAN carries the class on upload, so this field has no effect on mqvpn.'));
+ _('Gateway (VPS) → router. Only takes effect for MPTCP’s bpf_dscp scheduler (pins the VPS’s own send-side choice via dscp_remote_id) and can be a different WAN than Upload.') + ' ' +
+ _('Leave empty to just mirror this row’s Upload interface to the gateway instead -- the same "download always follows upload" behavior mqvpn already has built in natively.') + ' ' +
+ _('mqvpn has no equivalent: its downlink always mirrors whichever WAN carries the class on upload, so this field has no effect on mqvpn.'));
o.load = function(section_id) {
fillIfaceOptions(this);
return this.super('load', [section_id]);
@@ -150,9 +161,10 @@ return L.view.extend({
if (showWeight) {
s = m.section(form.TypedSection, 'interface', _('WAN weight'),
- _('Used by the *weight MPTCP schedulers (bpf_weight/bpf_weight_rr) and by mqvpn’s "Weighted RTT"/"Weighted Round Robin" schedulers -- same value, applies to both upload and download (mirrored to the gateway automatically). Unlike the DSCP pins above, weight is a single value per WAN, not per traffic class.'));
+ _('Used by the *weight MPTCP schedulers (bpf_weight/bpf_weight_rr) and by mqvpn’s "Weighted RTT"/"Weighted Round Robin" schedulers -- same value, applies to both upload and download (mirrored to the gateway automatically). Unlike the DSCP pins above, weight is a single value per WAN, not per traffic class.') + ' ' +
+ _('Only WANs with Multipath TCP enabled (the “Multipath TCP” option on the MPTCP page’s Interfaces Settings) are listed below.'));
s.filter = function(section) {
- return isEligibleIface(section);
+ return isEligibleIface(section) && isMultipathEnabledIface(section);
};
o = s.option(form.Value, 'multipath_weight', _('Weight'),
diff --git a/luci-app-mptcp/po/de/mptcp.po b/luci-app-mptcp/po/de/mptcp.po
index e1c45fcfb..d5b90262d 100644
--- a/luci-app-mptcp/po/de/mptcp.po
+++ b/luci-app-mptcp/po/de/mptcp.po
@@ -12,362 +12,923 @@ msgstr ""
"Plural-Forms: nplurals=2; plural=n != 1;\n"
"X-Generator: Weblate 4.0.4\n"
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:775
-msgid "(%d minute window, %d second interval)"
-msgstr "(Fenster von %d Minuten, %d Sekunden Intervall)"
-
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:241
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:242
-msgid "(%d minutes window, %d seconds interval)"
-msgstr "(Fenster %d Minunten, %d Sekunden Intervall)"
-
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:315
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:318
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:373
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:932
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:942
-msgid "Average:"
-msgstr "Durchschnitt:"
-
-#: luci-app-mptcp/luasrc/controller/mptcp.lua:11
-msgid "Bandwidth"
-msgstr "Bandbreite"
-
-#: luci-app-mptcp/luasrc/view/mptcp/mptcp_check.htm:43
-msgid "Check if MPTCP between interface and server is working."
-msgstr ""
-"Prüfung auf transparenten Transport von MPTCP-Paketen zwischen Anschluss und "
-"Server."
-
-#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:52
-msgid "Congestion Control"
-msgstr "Überlauf-Steuerung"
-
-#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:97
-msgid "Consecutive segments that should be sent for round robin"
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_fullmesh.js:26
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_monitor.js:27
+msgid "(no output)"
msgstr ""
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:311
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:314
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:369
-msgid "Current:"
-msgstr "derzeit:"
-
-#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:52
-#, fuzzy
-msgid "Default is cubic"
-msgstr "Voreinstellung ist 'bbr'"
-
-#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:21
-#, fuzzy
-msgid "Default is fullmesh"
-msgstr "Voreinstellung ist 'bbr'"
-
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:908
-msgid "Download:"
-msgstr "Downstream:"
-
-#: luci-app-mptcp/luasrc/view/mptcp/mptcp_check.htm:31
-#: luci-app-mptcp/luasrc/view/mptcp/mptcp_connections.htm:31
-#: luci-app-mptcp/luasrc/view/mptcp/mptcp_fullmesh.htm:31
-#: luci-app-mptcp/luasrc/view/mptcp/mptcp_monitor.htm:24
-msgid "Error"
-msgstr "Fehler"
-
-#: luci-app-mptcp/luasrc/controller/mptcp.lua:18
-msgid "Established connections"
-msgstr "aufgebaute Verbindungen"
-
-#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:91
-msgid "Fill the congestion window on all subflows for round robin"
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_dscp_routing.js:45
+msgid "-- not pinned --"
msgstr ""
-#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:74
-msgid "Fullmesh subflows for each pair of IP addresses"
-msgstr ""
-"Datenströme im vollvermaschter Betrieb für die jeweiligen Gegegenstellen-"
-"Paare"
-
-#: luci-app-mptcp/root/usr/share/rpcd/acl.d/luci-app-mptcp.json:3
-msgid "Grant UCI access for luci-app-mptcp"
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:133
+msgid "0"
msgstr ""
-#: luci-app-mptcp/luasrc/view/mptcp/mptcp_check.htm:73
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:134
+msgid "1"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:304
msgid ""
-"If you get \"TCPOptionMPTCPCapable [...] Sender's Key\" at the end, then "
-"MPTCP is supported. If there is a \"-TCPOptionMPTCPCapable\", then it's "
-"blocked."
+"A weight >100 make it more attractive, a weight <100 make it less "
+"attractive. Max 256"
msgstr ""
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:929
-msgid "Inbound:"
-msgstr "Ankommend:"
-
-#: luci-app-mptcp/luasrc/view/mptcp/mptcp_check.htm:48
-msgid "Interface"
-msgstr "Schnittstelle"
-
-#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:104
-msgid "Interfaces Settings"
-msgstr "Anschluss-Einstellungen"
-
-#: luci-app-mptcp/luasrc/view/mptcp/mptcp_check.htm:21
-#: luci-app-mptcp/luasrc/view/mptcp/mptcp_connections.htm:21
-#: luci-app-mptcp/luasrc/view/mptcp/mptcp_fullmesh.htm:21
-#: luci-app-mptcp/luasrc/view/mptcp/mptcp_monitor.htm:14
-msgid "Loading"
-msgstr "Wird geladen"
-
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:93
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:686
-msgid "MB/s"
-msgstr "MByte/s"
-
-#: luci-app-mptcp/luasrc/controller/mptcp.lua:9
-#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:7
-#: luci-app-mptcp/root/usr/share/luci/menu.d/luci-app-mptcp.json:3
-msgid "MPTCP"
-msgstr "MPTCP"
-
-#: luci-app-mptcp/luasrc/controller/mptcp.lua:16
-msgid "MPTCP Fullmesh"
-msgstr "MPTCP Vollvermaschung"
-
-#: luci-app-mptcp/luasrc/controller/mptcp.lua:14
-#: luci-app-mptcp/luasrc/view/mptcp/mptcp_check.htm:42
-msgid "MPTCP Support Check"
-msgstr "Prüfung auf Transparenz für MPTCP"
-
-#: luci-app-mptcp/luasrc/controller/mptcp.lua:20
-msgid "MPTCP monitoring"
-msgstr ""
-
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:102
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:695
-msgid "Mbit/s"
-msgstr "MBit/s"
-
-#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:18
-msgid "Multipath Debug"
-msgstr "Mehrfachausbreitungspfad-Analyse"
-
-#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:12
-#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:108
-msgid "Multipath TCP"
-msgstr "Multipath-TCP"
-
-#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:42
-msgid "Multipath TCP SYN retries"
-msgstr "Multipath TCP SYN Wiederholungen"
-
-#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:15
-msgid "Multipath TCP checksum"
-msgstr "Multipath TCP Prüfummen"
-
-#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:21
-msgid "Multipath TCP path-manager"
-msgstr "Multipath TCP Pfadkontrolle"
-
-#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:31
-msgid "Multipath TCP scheduler"
-msgstr "Multpath TCP Priorisierungskontrolle"
-
-#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:47
-#, fuzzy
-#| msgid "Multipath TCP"
-msgid "Multipath TCP version"
-msgstr "Multipath-TCP"
-
-#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:28
-msgid "Netlink"
-msgstr "Netlink-Layer"
-
-#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:7
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_dscp_routing.js:171
msgid ""
-"Networks MPTCP settings. Visit http://multipath-tcp.org/pmwiki.php/Users/"
-"ConfigureMPTCP for help."
-msgstr ""
-"Netzwerk-MPTCP Einstellungen. Dokumentation auf http://multipath-tcp.org/pmwiki.php/"
-"Users/ConfigureMPTCP (english)."
-
-#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:108
-msgid "One interface must be set as master"
-msgstr "Ein Anschluss muss als 'primär' defininiert werden."
-
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:939
-msgid "Outbound:"
-msgstr "Abgehend:"
-
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:319
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:322
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:377
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:935
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:945
-msgid "Peak:"
-msgstr "Spitze:"
-
-#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:80
-msgid "Re-create fullmesh subflows after a timeout"
-msgstr "Wiederverbindungs-Wartezeit der Vollvermaschungs-Verbindungen"
-
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:891
-msgid "Realtime Traffic"
-msgstr "Echtzeit-Daten"
-
-#: luci-app-mptcp/luasrc/controller/mptcp.lua:10
-#: luci-app-mptcp/luasrc/view/mptcp/mptcp_check.htm:45
-msgid "Settings"
-msgstr "Einstellungen"
-
-#: luci-app-mptcp/luasrc/view/mptcp/mptcp_check.htm:65
-msgid "Test"
-msgstr "Test"
-
-#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:69
-msgid ""
-"The number of MPTCP-level retransmission intervals with no traffic and "
-"pending outstanding data on a given subflow required to declare it stale"
+"A weight >100 makes a WAN more attractive, a weight <100 makes it less "
+"attractive. Max 256."
msgstr ""
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:914
-msgid "Upload:"
-msgstr "Upstream:"
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:73
+msgid "ADD_ADDR echo failed to send"
+msgstr ""
-#: luci-app-mptcp/luasrc/view/mptcp/mptcp_check.htm:21
-#: luci-app-mptcp/luasrc/view/mptcp/mptcp_connections.htm:21
-#: luci-app-mptcp/luasrc/view/mptcp/mptcp_fullmesh.htm:21
-#: luci-app-mptcp/luasrc/view/mptcp/mptcp_monitor.htm:14
-msgid "Waiting for command to complete..."
-msgstr "Warte auf Abschluss der Aufgaben"
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:71
+msgid "ADD_ADDR echo received"
+msgstr ""
-#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:112
-msgid "backup"
-msgstr "Sicherung"
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:72
+msgid "ADD_ADDR echo sent"
+msgstr ""
-#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:22
-#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:32
-msgid "default"
-msgstr "Voreinstellung"
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:74
+msgid "ADD_ADDR received with a port number"
+msgstr ""
-#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:14
-#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:17
-#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:20
-#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:82
-#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:93
-msgid "disable"
-msgstr "ausschalten"
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:70
+msgid "ADD_ADDR signals dropped"
+msgstr ""
-#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:110
-msgid "disabled"
-msgstr "aus"
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:69
+msgid "ADD_ADDR signals failed to send"
+msgstr ""
-#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:13
-#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:16
-#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:19
-#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:81
-#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:92
-msgid "enable"
-msgstr "anschalten"
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:67
+msgid "ADD_ADDR signals received"
+msgstr ""
-#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:109
-msgid "enabled"
-msgstr "an"
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:68
+msgid "ADD_ADDR signals sent"
+msgstr ""
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:88
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:314
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:318
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:322
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:372
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:376
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:380
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:681
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:930
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:933
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:936
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:940
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:943
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:946
-msgid "kB/s"
-msgstr "kBytes/s"
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:262
+msgid "Accepted ADD_ADDR limit"
+msgstr ""
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:97
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:314
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:318
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:322
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:372
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:376
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:380
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:690
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:930
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:933
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:936
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:940
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:943
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:946
-msgid "kbit/s"
-msgstr "kBit/s"
-
-#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:111
-msgid "master"
-msgstr "primär"
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:259
+msgid "Add-addr timeout (s)"
+msgstr ""
#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/multipath.js:326
msgid "All interfaces"
msgstr "Alle Schnittstellen"
-#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/multipath.js:456
-msgid "All interfaces – combined view"
-msgstr "Alle Schnittstellen - kombinierte Ansicht"
-
#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/multipath.js:457
msgid "All interfaces overlaid, inbound and outbound separately"
msgstr "Alle Schnittstellen überlagert, eingehend und ausgehend getrennt"
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/multipath.js:456
+msgid "All interfaces – combined view"
+msgstr "Alle Schnittstellen - kombinierte Ansicht"
+
#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/multipath.js:422
#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/multipath.js:615
msgid "Average"
msgstr "Durchschnitt"
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:75
+msgid "BPF schedulers (not available on all platforms):"
+msgstr ""
+
+#: luci-app-mptcp/root/usr/share/luci/menu.d/luci-app-mptcp.json:47
+msgid "Bandwidth"
+msgstr "Bandbreite"
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:61
+msgid "Blackhole detected on the path"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:238
+msgid "Blackhole timeout"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:258
+msgid "Blackhole timeout (s)"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_dscp_routing.js:13
+msgid "CS0 (0) - Best effort"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_dscp_routing.js:14
+msgid "CS1 (8) - Low priority"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_dscp_routing.js:15
+msgid "CS2 (16) - High priority"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_dscp_routing.js:16
+msgid "CS3 (24) - SIP/signaling"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_dscp_routing.js:17
+msgid "CS4 (32) - Real-time interactive"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_dscp_routing.js:18
+msgid "CS5 (40) - Broadcast video"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_dscp_routing.js:19
+msgid "CS6 (48) - Network control"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_dscp_routing.js:20
+msgid "CS7 (56) - Latency sensitive"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_check.js:48
+msgid "Check if MPTCP between interface and server is working."
+msgstr ""
+"Prüfung auf transparenten Transport von MPTCP-Paketen zwischen Anschluss und "
+"Server."
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:256
+msgid "Checksum"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_dscp_routing.js:109
+msgid ""
+"Choose which WAN carries each DSCP-tagged traffic class -- for the MPTCP "
+"bpf_dscp scheduler and for mqvpn -- and review the per-WAN weight used by "
+"the *weight schedulers on both. This page only edits the pins/weights; pick "
+"the scheduler that actually uses them on the MPTCP and MQVPN pages "
+"themselves."
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:243
+msgid "Close timeout"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:260
+msgid "Close timeout (s)"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:138
+msgid "Congestion Control"
+msgstr "Überlauf-Steuerung"
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:277
+msgid "Consecutive segments that should be sent for round robin"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:233
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:248
+msgid "Control message timeout"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:23
+msgid "Could not allocate an MPTCP token, fell back to TCP"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:104
+msgid "Couldn't fall back to TCP (connection state didn't allow it)"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:288
+msgid "Counter"
+msgstr ""
+
#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/multipath.js:422
#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/multipath.js:611
msgid "Current"
msgstr "Aktuell"
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_dscp_routing.js:108
+#: luci-app-mptcp/root/usr/share/luci/menu.d/luci-app-mptcp.json:36
+msgid "DSCP / Weight Routing"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_dscp_routing.js:139
+msgid "DSCP class"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_dscp_routing.js:134
+msgid "DSCP class pins"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:48
+msgid "DSS corruption detected, fell back to plain TCP"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:49
+msgid "DSS corruption detected, subflow reset"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:53
+msgid "Data checksum errors"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:86
+msgid "Data mapping failures received (MP_FAIL)"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:85
+msgid "Data mapping failures sent (MP_FAIL)"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:50
+msgid "Data sequence mapping did not match TCP sequence numbers"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:47
+msgid "Data sequence mapping did not match the previous one"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:138
+#, fuzzy
+msgid "Default is cubic"
+msgstr "Voreinstellung ist 'bbr'"
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:65
+#, fuzzy
+msgid "Default is fullmesh"
+msgstr "Voreinstellung ist 'bbr'"
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:211
+msgid "Device"
+msgstr ""
+
+#: luci-app-mptcp/root/usr/share/luci/menu.d/luci-app-mptcp.json:25
+msgid "Diagnostics"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:244
+msgid "Disabled"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_dscp_routing.js:151
+msgid "Download interface"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:55
+msgid "Duplicate data segments discarded"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_dscp_routing.js:34
+msgid "EF (46) - Voice"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:177
+msgid "Enable MPTCPd"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:243
+msgid "Enabled"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:214
+msgid "Endpoint flags"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_check.js:72
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_check.js:74
+msgid "Error"
+msgstr "Fehler"
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_connections.js:28
+msgid "Error fetching connections data."
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_fullmesh.js:28
+msgid "Error fetching fullmesh data."
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_monitor.js:29
+msgid "Error fetching monitor data."
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:99
+msgid "Established MPTCP connections (current)"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:263
+msgid "Established MPTCP connections (right now)"
+msgstr ""
+
+#: luci-app-mptcp/root/usr/share/luci/menu.d/luci-app-mptcp.json:58
+msgid "Established connections"
+msgstr "aufgebaute Verbindungen"
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:19
+msgid "Fallback to TCP (ACK stripped)"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:18
+msgid "Fallback to TCP (SYN/ACK stripped)"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:88
+msgid "Fastclose received"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:87
+msgid "Fastclose sent"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:102
+msgid "Fell back to TCP: bad or missing data sequence signal"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:101
+msgid "Fell back to TCP: conflicting TCP MD5SIG option"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:100
+msgid "Fell back to TCP: missing data on first established packet"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:103
+msgid "Fell back to TCP: simultaneous connect"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:271
+msgid "Fill the congestion window on all subflows for round robin"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:171
+msgid "Force Multipath configuration"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:254
+msgid "Fullmesh subflows for each pair of IP addresses"
+msgstr ""
+"Datenströme im vollvermaschter Betrieb für die jeweiligen Gegegenstellen-"
+"Paare"
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_dscp_routing.js:152
+msgid ""
+"Gateway (VPS) → router. Only takes effect for MPTCP’s bpf_dscp scheduler "
+"(pins the VPS’s own send-side choice via dscp_remote_id) and can be a "
+"different WAN than Upload."
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_dscp_routing.js:124
+msgid "Gateway sync"
+msgstr ""
+
+#: luci-app-mptcp/root/usr/share/rpcd/acl.d/luci-app-mptcp.json:3
+msgid "Grant UCI access for luci-app-mptcp"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:150
+msgid ""
+"Helps explain why MPTCP might not be aggregating your WANs correctly: "
+"fallback to plain TCP, blackholed/stale subflows, resets, checksum errors, "
+"and WANs that never got an MPTCP endpoint registered at all. Refreshes "
+"automatically every 15 seconds."
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_check.js:60
+msgid ""
+"If you get \"TCPOptionMPTCPCapable [...] Sender's Key\" at the end, then "
+"MPTCP is supported. If there is a \"-TCPOptionMPTCPCapable\", then it's "
+"blocked."
+msgstr ""
+
#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/multipath.js:693
msgid "In"
msgstr "Eingehend"
-#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/multipath.js:462
-msgid "Inbound – all interfaces"
-msgstr "Eingehend - alle Schnittstellen"
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:248
+msgid "In-kernel"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:151
+msgid "In-kernel path manager"
+msgstr ""
#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/multipath.js:634
msgid "Inbound traffic"
msgstr "Eingehender Verkehr"
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/multipath.js:462
+msgid "Inbound – all interfaces"
+msgstr "Eingehend - alle Schnittstellen"
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:52
+msgid "Infinite mapping received (peer fell back to plain TCP semantics)"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:51
+msgid "Infinite mapping sent (fell back to plain TCP semantics)"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:165
+msgid "Initial MPTCP configuration"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:238
+msgid ""
+"Initial time period in second to disable MPTCP on active MPTCP sockets when "
+"a MPTCP firewall blackhole issue happens. This time period will grow "
+"exponentially when more blackhole issues get detected right after MPTCP is "
+"re-enabled and will reset to the initial value when the blackhole issue goes "
+"away."
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_check.js:52
+msgid "Interface"
+msgstr "Schnittstelle"
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:284
+msgid "Interfaces Settings"
+msgstr "Anschluss-Einstellungen"
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:36
+msgid "JOIN ACK authentication failures"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:34
+msgid "JOIN SYN/ACK authentication failures"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:37
+msgid "JOIN attempts with unknown token"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:38
+msgid "JOIN request rejected by the path manager"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:265
+msgid "Kernel MPTCP configuration"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_dscp_routing.js:21
+msgid "LE (1) - Lower effort"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:170
+msgid "Last updated:"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_dscp_routing.js:153
+msgid ""
+"Leave empty to just mirror this row’s Upload interface to the gateway "
+"instead -- the same \"download always follows upload\" behavior mqvpn "
+"already has built in natively."
+msgstr ""
+"Leer lassen, um einfach die Upload-Schnittstelle dieser Zeile auf das "
+"Gateway zu spiegeln -- das gleiche Verhalten \"Download folgt immer dem "
+"Upload\", das mqvpn bereits nativ eingebaut hat."
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/multipath.js:75
+msgid "MB/s"
+msgstr "MByte/s"
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:46
+#: luci-app-mptcp/root/usr/share/luci/menu.d/luci-app-mptcp.json:3
+#: luci-app-mptcp/root/usr/share/luci/menu.d/luci-app-mptcp.json:14
+msgid "MPTCP"
+msgstr "MPTCP"
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:148
+msgid "MPTCP Diagnostics"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:142
+msgid "MPTCP Established connections"
+msgstr ""
+
+#: luci-app-mptcp/root/usr/share/luci/menu.d/luci-app-mptcp.json:69
+msgid "MPTCP Fullmesh"
+msgstr "MPTCP Vollvermaschung"
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:141
+msgid "MPTCP Fullmesh (subflow map)"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:140
+msgid "MPTCP Settings"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_check.js:46
+msgid "MPTCP Support Check"
+msgstr "Prüfung auf Transparenz für MPTCP"
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:253
+msgid "MPTCP enabled"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:213
+msgid "MPTCP endpoint"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:16
+msgid "MPTCP handshake accepted by peer (SYN/ACK)"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:15
+msgid "MPTCP handshake attempts received (SYN)"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:14
+msgid "MPTCP handshake attempts sent (SYN)"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:17
+msgid "MPTCP handshake completed (ACK)"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:21
+msgid "MPTCP handshake disabled client-side after past issues"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:20
+msgid "MPTCP handshake dropped client-side, fell back to TCP"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:277
+msgid "MPTCP kernel counters (since boot)"
+msgstr ""
+
+#: luci-app-mptcp/root/usr/share/luci/menu.d/luci-app-mptcp.json:80
+msgid "MPTCP monitoring"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:143
+msgid "MPTCP monitoring (raw kernel counters)"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:22
+msgid "MPTCP rejected on a port-only endpoint"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:90
+msgid "MPTCP resets received"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:89
+msgid "MPTCP resets sent"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:46
+msgid "MPTCP-level retransmissions"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:105
+msgid "MPTCP-level zero-window probes"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:205
+msgid "MPTCPd Address annoucement flags"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:212
+msgid "MPTCPd Address notification flags"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:183
+msgid "MPTCPd path managers"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:194
+msgid "MPTCPd plugins"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:228
+msgid "Max add address"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:218
+msgid "Max subflows"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/multipath.js:77
+msgid "Mbit/s"
+msgstr "MBit/s"
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:117
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_dscp_routing.js:126
+msgid "Mirror DSCP/weight pins to gateway"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:212
+msgid "Mode"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:60
+msgid "Multipath Debug"
+msgstr "Mehrfachausbreitungspfad-Analyse"
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:50
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:289
+msgid "Multipath TCP"
+msgstr "Multipath-TCP"
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:126
+msgid "Multipath TCP SYN retries"
+msgstr "Multipath TCP SYN Wiederholungen"
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:55
+msgid "Multipath TCP checksum"
+msgstr "Multipath TCP Prüfummen"
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:65
+msgid "Multipath TCP path-manager"
+msgstr "Multipath TCP Pfadkontrolle"
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:75
+msgid "Multipath TCP scheduler"
+msgstr "Multpath TCP Priorisierungskontrolle"
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:132
+#, fuzzy
+msgid "Multipath TCP version"
+msgstr "Multipath-TCP"
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:72
+msgid "Netlink"
+msgstr "Netlink-Layer"
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:46
+msgid "Networks MPTCP settings."
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:279
+msgid "No counters available (nstat/multipath -m returned nothing)."
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_connections.js:26
+msgid "No data"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:184
+msgid "No diagnostic data available yet."
+msgstr ""
+
#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/multipath.js:394
msgid "No multipath WAN interface is currently available."
msgstr "Derzeit ist keine Multipath-WAN-Schnittstelle verfügbar."
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:205
+msgid "No multipath-enabled WAN interfaces found."
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_dscp_routing.js:112
+msgid ""
+"Nothing to show yet: no DSCP scheduler (bpf_dscp) or weight scheduler "
+"(bpf_weight/bpf_weight_rr/bpf_burstweight, or mqvpn’s Weighted RTT/Weighted "
+"Round Robin) is currently selected on the MPTCP or MQVPN pages."
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:289
+msgid "One interface must be set as master"
+msgstr "Ein Anschluss muss als 'primär' defininiert werden."
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_dscp_routing.js:165
+msgid ""
+"Only WANs with Multipath TCP enabled (the “Multipath TCP” option on the "
+"MPTCP page’s Interfaces Settings) are listed below."
+msgstr ""
+"Es werden nur WANs mit aktiviertem Multipath TCP aufgelistet (die Option "
+"„Multipath TCP“ im Abschnitt „Schnittstelleneinstellungen“ der MPTCP-Seite)."
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:304
+msgid ""
+"Only used by *weight schedulers/path managers. Ignored if no weight "
+"scheduler is selected."
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:139
+msgid "OpenMPTCProuter Network overview / Status"
+msgstr ""
+
#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/multipath.js:700
msgid "Out"
msgstr "Ausgehend"
-#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/multipath.js:468
-msgid "Outbound – all interfaces"
-msgstr "Ausgehend - alle Schnittstellen"
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:58
+msgid "Out-of-order segments merged"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:57
+msgid "Out-of-order segments queued"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:56
+msgid "Out-of-order segments queued at tail"
+msgstr ""
#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/multipath.js:640
msgid "Outbound traffic"
msgstr "Ausgehender Verkehr"
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/multipath.js:468
+msgid "Outbound – all interfaces"
+msgstr "Ausgehend - alle Schnittstellen"
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:150
+msgid "Path Manager type"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:254
+msgid "Path manager"
+msgstr ""
+
#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/multipath.js:422
#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/multipath.js:619
msgid "Peak"
msgstr "Spitze"
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:203
+msgid "Per-WAN MPTCP endpoint status"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:78
+msgid "RM_ADDR signals dropped"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:77
+msgid "RM_ADDR signals failed to send"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:75
+msgid "RM_ADDR signals received"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:76
+msgid "RM_ADDR signals sent"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:260
+msgid "Re-create fullmesh subflows after a timeout"
+msgstr "Wiederverbindungs-Wartezeit der Vollvermaschungs-Verbindungen"
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:95
+msgid "Receive window conflict resolved on update"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:94
+msgid "Receive window shared across subflows"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:96
+msgid "Receive window update conflicts"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:137
+msgid "Related pages"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:223
+msgid "Retranmission intervals"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_dscp_routing.js:144
+msgid ""
+"Router → internet. Pins this class to a WAN for MPTCP’s bpf_dscp scheduler "
+"(local dscp_iface map) and, for mqvpn, announces the class on this path’s "
+"DSCP mask via the control API."
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:255
+msgid "Scheduler"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:54
+msgid "Segments received outside the MPTCP mapping window"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:93
+msgid "Send window shared across subflows"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:243
+msgid ""
+"Set the make-after-break timeout: in absence of any close or shutdown "
+"syscall, MPTCP sockets will maintain the status unchanged for such time, "
+"after the last subflow removal, before moving to TCP_CLOSE."
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:233
+msgid ""
+"Set the timeout after which an ADD_ADDR (add address) control message will "
+"be resent to an MPTCP peer that has not acknowledged a previous ADD_ADDR "
+"message."
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_check.js:50
+msgid "Settings"
+msgstr "Einstellungen"
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:257
+msgid "Stale loss count threshold"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:63
+msgid "Stale subflows recovered"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:41
+msgid "Subflow JOIN ACK received on a different port"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:43
+msgid "Subflow JOIN ACK with mismatched port"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:39
+msgid "Subflow JOIN SYN received on a different port"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:42
+msgid "Subflow JOIN SYN with mismatched port"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:40
+msgid "Subflow JOIN SYN/ACK received on a different port"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:32
+msgid "Subflow JOIN accepted by peer (SYN/ACK)"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:33
+msgid "Subflow JOIN accepted by peer (SYN/ACK, backup)"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:30
+msgid "Subflow JOIN attempts received (SYN)"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:31
+msgid "Subflow JOIN attempts received (SYN, backup)"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:26
+msgid "Subflow JOIN attempts sent (SYN)"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:35
+msgid "Subflow JOIN completed (ACK)"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:28
+msgid "Subflow JOIN failed: could not bind address"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:29
+msgid "Subflow JOIN failed: could not connect"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:27
+msgid "Subflow JOIN failed: could not create socket"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:261
+msgid "Subflow limit"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:82
+msgid "Subflow priority change received (MP_PRIO)"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:81
+msgid "Subflow priority change sent (MP_PRIO)"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:62
+msgid "Subflows marked stale (possible blackhole)"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:64
+msgid "Subflows removed"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_check.js:40
+msgid "Test"
+msgstr "Test"
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:223
+msgid ""
+"The number of MPTCP-level retransmission intervals with no traffic and "
+"pending outstanding data on a given subflow required to declare it stale. A "
+"low stale_loss_cnt value allows for fast active-backup switch-over, an high "
+"value maximize links utilization on edge scenarios e.g. lossy link with high "
+"BER or peer pausing the data processing."
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:248
+msgid ""
+"The number of SYN + MP_CAPABLE retransmissions before falling back to TCP, "
+"i.e. dropping the MPTCP options."
+msgstr ""
+
#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/multipath.js:442
#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/multipath.js:570
#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/multipath.js:585
@@ -382,6 +943,139 @@ msgstr "Gesamt eingehend"
msgid "Total out"
msgstr "Gesamt ausgehend"
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_dscp_routing.js:143
+msgid "Upload interface"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_dscp_routing.js:164
+msgid ""
+"Used by the *weight MPTCP schedulers (bpf_weight/bpf_weight_rr) and by "
+"mqvpn’s \"Weighted RTT\"/\"Weighted Round Robin\" schedulers -- same value, "
+"applies to both upload and download (mirrored to the gateway automatically). "
+"Unlike the DSCP pins above, weight is a single value per WAN, not per "
+"traffic class."
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:249
+msgid "Userspace"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:152
+msgid "Userspace path manager"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:288
+msgid "Value"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:210
+msgid "WAN"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_dscp_routing.js:163
+msgid "WAN weight"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_check.js:69
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_connections.js:15
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_fullmesh.js:15
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_monitor.js:15
+msgid "Waiting for command to complete…"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:304
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_dscp_routing.js:170
+msgid "Weight"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:118
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_dscp_routing.js:127
+msgid ""
+"When using a DSCP or weight BPF scheduler, also sync each WAN’s pin to the "
+"gateway (VPS) so it also holds for traffic the gateway sends (downloads), "
+"not just traffic the router sends (uploads). Disabling this only stops "
+"future syncs -- it does not remove pins already pushed to the gateway."
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_dscp_routing.js:128
+msgid ""
+"While disabled, the DSCP table below only shows Upload -- Download has no "
+"effect until this is re-enabled and applied."
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:293
+msgid "backup"
+msgstr "Sicherung"
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:76
+msgid "bpf_burst => same as the default scheduler"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:78
+msgid "bpf_first => always picks the first subflow to send data"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:77
+msgid "bpf_red => sends all packets redundantly on all available subflows"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:79
+msgid ""
+"bpf_rr => always picks the next available subflow to send data (round-robin)"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:66
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:82
+msgid "default"
+msgstr "Voreinstellung"
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:52
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:57
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:62
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:168
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:174
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:180
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:262
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:273
+msgid "disable"
+msgstr "ausschalten"
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:291
+msgid "disabled"
+msgstr "aus"
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:51
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:56
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:61
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:167
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:173
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:179
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:261
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:272
+msgid "enable"
+msgstr "anschalten"
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:290
+msgid "enabled"
+msgstr "an"
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/multipath.js:74
+msgid "kB/s"
+msgstr "kBytes/s"
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/multipath.js:76
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/multipath.js:436
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/multipath.js:446
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/multipath.js:612
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/multipath.js:616
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/multipath.js:620
+msgid "kbit/s"
+msgstr "kBit/s"
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:292
+msgid "master"
+msgstr "primär"
+
#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/multipath.js:540
#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/multipath.js:541
#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/multipath.js:673
@@ -389,22 +1083,81 @@ msgstr "Gesamt ausgehend"
msgid "minutes window, 1 second interval"
msgstr "Minuten Zeitfenster, 1-Sekunden-Intervall"
-#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:85
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:225
+msgid "missing"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_dscp_routing.js:154
+msgid ""
+"mqvpn has no equivalent: its downlink always mirrors whichever WAN carries "
+"the class on upload, so this field has no effect on mqvpn."
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:265
msgid "ndiffports subflows number"
msgstr "ndiff-Ports Verbindungs-Nummer"
-#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:64
-msgid ""
-"specifies the maximum number of ADD_ADDR suboptions accepted for each MPTCP "
-"connection"
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:225
+msgid "registered"
msgstr ""
-#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:59
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:228
+msgid ""
+"specifies the maximum number of ADD_ADDR (add address) suboptions accepted "
+"for each MPTCP connection"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:218
msgid ""
"specifies the maximum number of additional subflows allowed for each MPTCP "
"connection"
msgstr ""
+#~ msgid "(%d minute window, %d second interval)"
+#~ msgstr "(Fenster von %d Minuten, %d Sekunden Intervall)"
+
+#~ msgid "(%d minutes window, %d seconds interval)"
+#~ msgstr "(Fenster %d Minunten, %d Sekunden Intervall)"
+
+#~ msgid "Average:"
+#~ msgstr "Durchschnitt:"
+
+#~ msgid "Current:"
+#~ msgstr "derzeit:"
+
+#~ msgid "Download:"
+#~ msgstr "Downstream:"
+
+#~ msgid "Inbound:"
+#~ msgstr "Ankommend:"
+
+#~ msgid "Loading"
+#~ msgstr "Wird geladen"
+
+#~ msgid ""
+#~ "Networks MPTCP settings. Visit http://multipath-tcp.org/pmwiki.php/"
+#~ "Users/ConfigureMPTCP for help."
+#~ msgstr ""
+#~ "Netzwerk-MPTCP Einstellungen. Dokumentation auf http://multipath-tcp.org/"
+#~ "pmwiki.php/Users/ConfigureMPTCP (english)."
+
+#~ msgid "Outbound:"
+#~ msgstr "Abgehend:"
+
+#~ msgid "Peak:"
+#~ msgstr "Spitze:"
+
+#~ msgid "Realtime Traffic"
+#~ msgstr "Echtzeit-Daten"
+
+#~ msgid "Upload:"
+#~ msgstr "Upstream:"
+
+#~ msgid "Waiting for command to complete..."
+#~ msgstr "Warte auf Abschluss der Aufgaben"
+
#~ msgid "BLEST"
#~ msgstr "Blockierungsvorhersage-Betrieb"
diff --git a/luci-app-mptcp/po/fr/mptcp.po b/luci-app-mptcp/po/fr/mptcp.po
index fc9c78941..417e0a3fa 100644
--- a/luci-app-mptcp/po/fr/mptcp.po
+++ b/luci-app-mptcp/po/fr/mptcp.po
@@ -13,82 +13,382 @@ msgstr ""
"Plural-Forms: nplurals=2; plural=n > 1;\n"
"X-Generator: Weblate 4.10.1\n"
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:775
-msgid "(%d minute window, %d second interval)"
-msgstr "(fenêtre de %d minute, intervalle de %d seconde)"
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_fullmesh.js:26
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_monitor.js:27
+msgid "(no output)"
+msgstr ""
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:241
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:242
-msgid "(%d minutes window, %d seconds interval)"
-msgstr "(fenêtre de %d minutes, intervalle de %d secondes)"
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_dscp_routing.js:45
+msgid "-- not pinned --"
+msgstr ""
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:315
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:318
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:373
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:932
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:942
-msgid "Average:"
-msgstr "Moyenne :"
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:133
+msgid "0"
+msgstr ""
-#: luci-app-mptcp/luasrc/controller/mptcp.lua:11
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:134
+msgid "1"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:304
+msgid ""
+"A weight >100 make it more attractive, a weight <100 make it less "
+"attractive. Max 256"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_dscp_routing.js:171
+msgid ""
+"A weight >100 makes a WAN more attractive, a weight <100 makes it less "
+"attractive. Max 256."
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:73
+msgid "ADD_ADDR echo failed to send"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:71
+msgid "ADD_ADDR echo received"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:72
+msgid "ADD_ADDR echo sent"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:74
+msgid "ADD_ADDR received with a port number"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:70
+msgid "ADD_ADDR signals dropped"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:69
+msgid "ADD_ADDR signals failed to send"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:67
+msgid "ADD_ADDR signals received"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:68
+msgid "ADD_ADDR signals sent"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:262
+msgid "Accepted ADD_ADDR limit"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:259
+msgid "Add-addr timeout (s)"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/multipath.js:326
+msgid "All interfaces"
+msgstr "Toutes les interfaces"
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/multipath.js:457
+msgid "All interfaces overlaid, inbound and outbound separately"
+msgstr "Toutes les interfaces superposées, entrant et sortant séparés"
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/multipath.js:456
+msgid "All interfaces – combined view"
+msgstr "Toutes les interfaces - vue combinée"
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/multipath.js:422
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/multipath.js:615
+msgid "Average"
+msgstr "Moyenne"
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:75
+msgid "BPF schedulers (not available on all platforms):"
+msgstr ""
+
+#: luci-app-mptcp/root/usr/share/luci/menu.d/luci-app-mptcp.json:47
msgid "Bandwidth"
msgstr "Bande passante"
-#: luci-app-mptcp/luasrc/view/mptcp/mptcp_check.htm:43
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:61
+msgid "Blackhole detected on the path"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:238
+msgid "Blackhole timeout"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:258
+msgid "Blackhole timeout (s)"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_dscp_routing.js:13
+msgid "CS0 (0) - Best effort"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_dscp_routing.js:14
+msgid "CS1 (8) - Low priority"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_dscp_routing.js:15
+msgid "CS2 (16) - High priority"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_dscp_routing.js:16
+msgid "CS3 (24) - SIP/signaling"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_dscp_routing.js:17
+msgid "CS4 (32) - Real-time interactive"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_dscp_routing.js:18
+msgid "CS5 (40) - Broadcast video"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_dscp_routing.js:19
+msgid "CS6 (48) - Network control"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_dscp_routing.js:20
+msgid "CS7 (56) - Latency sensitive"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_check.js:48
msgid "Check if MPTCP between interface and server is working."
msgstr "Vérifiez si MPTCP entre l'interface et le serveur fonctionne."
-#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:52
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:256
+msgid "Checksum"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_dscp_routing.js:109
+msgid ""
+"Choose which WAN carries each DSCP-tagged traffic class -- for the MPTCP "
+"bpf_dscp scheduler and for mqvpn -- and review the per-WAN weight used by "
+"the *weight schedulers on both. This page only edits the pins/weights; pick "
+"the scheduler that actually uses them on the MPTCP and MQVPN pages "
+"themselves."
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:243
+msgid "Close timeout"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:260
+msgid "Close timeout (s)"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:138
msgid "Congestion Control"
msgstr "Contrôle de la congestion"
-#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:97
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:277
msgid "Consecutive segments that should be sent for round robin"
msgstr "Segments consécutifs à envoyer pour round robin"
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:311
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:314
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:369
-msgid "Current:"
-msgstr "Actuellement :"
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:233
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:248
+msgid "Control message timeout"
+msgstr ""
-#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:52
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:23
+msgid "Could not allocate an MPTCP token, fell back to TCP"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:104
+msgid "Couldn't fall back to TCP (connection state didn't allow it)"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:288
+msgid "Counter"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/multipath.js:422
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/multipath.js:611
+msgid "Current"
+msgstr "Actuel"
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_dscp_routing.js:108
+#: luci-app-mptcp/root/usr/share/luci/menu.d/luci-app-mptcp.json:36
+msgid "DSCP / Weight Routing"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_dscp_routing.js:139
+msgid "DSCP class"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_dscp_routing.js:134
+msgid "DSCP class pins"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:48
+msgid "DSS corruption detected, fell back to plain TCP"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:49
+msgid "DSS corruption detected, subflow reset"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:53
+msgid "Data checksum errors"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:86
+msgid "Data mapping failures received (MP_FAIL)"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:85
+msgid "Data mapping failures sent (MP_FAIL)"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:50
+msgid "Data sequence mapping did not match TCP sequence numbers"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:47
+msgid "Data sequence mapping did not match the previous one"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:138
msgid "Default is cubic"
msgstr "La valeur par défaut est cubic"
-#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:21
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:65
msgid "Default is fullmesh"
msgstr "La valeur par défaut est fullmesh"
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:908
-msgid "Download:"
-msgstr "Téléchargement :"
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:211
+msgid "Device"
+msgstr ""
-#: luci-app-mptcp/luasrc/view/mptcp/mptcp_check.htm:31
-#: luci-app-mptcp/luasrc/view/mptcp/mptcp_connections.htm:31
-#: luci-app-mptcp/luasrc/view/mptcp/mptcp_fullmesh.htm:31
-#: luci-app-mptcp/luasrc/view/mptcp/mptcp_monitor.htm:24
+#: luci-app-mptcp/root/usr/share/luci/menu.d/luci-app-mptcp.json:25
+msgid "Diagnostics"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:244
+msgid "Disabled"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_dscp_routing.js:151
+msgid "Download interface"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:55
+msgid "Duplicate data segments discarded"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_dscp_routing.js:34
+msgid "EF (46) - Voice"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:177
+msgid "Enable MPTCPd"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:243
+msgid "Enabled"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:214
+msgid "Endpoint flags"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_check.js:72
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_check.js:74
msgid "Error"
msgstr "Erreur"
-#: luci-app-mptcp/luasrc/controller/mptcp.lua:18
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_connections.js:28
+msgid "Error fetching connections data."
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_fullmesh.js:28
+msgid "Error fetching fullmesh data."
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_monitor.js:29
+msgid "Error fetching monitor data."
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:99
+msgid "Established MPTCP connections (current)"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:263
+msgid "Established MPTCP connections (right now)"
+msgstr ""
+
+#: luci-app-mptcp/root/usr/share/luci/menu.d/luci-app-mptcp.json:58
msgid "Established connections"
msgstr "Connexions établies"
-#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:91
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:19
+msgid "Fallback to TCP (ACK stripped)"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:18
+msgid "Fallback to TCP (SYN/ACK stripped)"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:88
+msgid "Fastclose received"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:87
+msgid "Fastclose sent"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:102
+msgid "Fell back to TCP: bad or missing data sequence signal"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:101
+msgid "Fell back to TCP: conflicting TCP MD5SIG option"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:100
+msgid "Fell back to TCP: missing data on first established packet"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:103
+msgid "Fell back to TCP: simultaneous connect"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:271
msgid "Fill the congestion window on all subflows for round robin"
msgstr ""
"Remplir la fenêtre de congestion de tous les sous-flux pour round robin"
-#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:74
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:171
+msgid "Force Multipath configuration"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:254
msgid "Fullmesh subflows for each pair of IP addresses"
msgstr "Sous-flux Fullmesh pour chaque paire d'adresses IP"
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_dscp_routing.js:152
+msgid ""
+"Gateway (VPS) → router. Only takes effect for MPTCP’s bpf_dscp scheduler "
+"(pins the VPS’s own send-side choice via dscp_remote_id) and can be a "
+"different WAN than Upload."
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_dscp_routing.js:124
+msgid "Gateway sync"
+msgstr ""
+
#: luci-app-mptcp/root/usr/share/rpcd/acl.d/luci-app-mptcp.json:3
msgid "Grant UCI access for luci-app-mptcp"
msgstr "Accorder l'accès UCI pour luci-app-mlvpn"
-#: luci-app-mptcp/luasrc/view/mptcp/mptcp_check.htm:73
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:150
+msgid ""
+"Helps explain why MPTCP might not be aggregating your WANs correctly: "
+"fallback to plain TCP, blackholed/stale subflows, resets, checksum errors, "
+"and WANs that never got an MPTCP endpoint registered at all. Refreshes "
+"automatically every 15 seconds."
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_check.js:60
msgid ""
"If you get \"TCPOptionMPTCPCapable [...] Sender's Key\" at the end, then "
"MPTCP is supported. If there is a \"-TCPOptionMPTCPCapable\", then it's "
@@ -98,275 +398,536 @@ msgstr ""
"MPTCP est pris en charge. Si il y a \"-TCPOptionMPTCPCapable\", alors il est "
"bloqué."
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:929
-msgid "Inbound:"
-msgstr "Entrant :"
-
-#: luci-app-mptcp/luasrc/view/mptcp/mptcp_check.htm:48
-msgid "Interface"
-msgstr "Interface"
-
-#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:104
-msgid "Interfaces Settings"
-msgstr "Paramètres des interfaces"
-
-#: luci-app-mptcp/luasrc/view/mptcp/mptcp_check.htm:21
-#: luci-app-mptcp/luasrc/view/mptcp/mptcp_connections.htm:21
-#: luci-app-mptcp/luasrc/view/mptcp/mptcp_fullmesh.htm:21
-#: luci-app-mptcp/luasrc/view/mptcp/mptcp_monitor.htm:14
-msgid "Loading"
-msgstr "Chargement"
-
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:93
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:686
-msgid "MB/s"
-msgstr "Mo/s"
-
-#: luci-app-mptcp/luasrc/controller/mptcp.lua:9
-#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:7
-#: luci-app-mptcp/root/usr/share/luci/menu.d/luci-app-mptcp.json:3
-msgid "MPTCP"
-msgstr "MPTCP"
-
-#: luci-app-mptcp/luasrc/controller/mptcp.lua:16
-msgid "MPTCP Fullmesh"
-msgstr "MPTCP Fullmesh"
-
-#: luci-app-mptcp/luasrc/controller/mptcp.lua:14
-#: luci-app-mptcp/luasrc/view/mptcp/mptcp_check.htm:42
-msgid "MPTCP Support Check"
-msgstr "Vérification du support MPTCP"
-
-#: luci-app-mptcp/luasrc/controller/mptcp.lua:20
-msgid "MPTCP monitoring"
-msgstr "Surveillance MPTCP"
-
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:102
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:695
-msgid "Mbit/s"
-msgstr "Mbit/s"
-
-#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:18
-msgid "Multipath Debug"
-msgstr "Débogage multipath"
-
-#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:12
-#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:108
-msgid "Multipath TCP"
-msgstr "Multipath TCP"
-
-#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:42
-msgid "Multipath TCP SYN retries"
-msgstr "Tentatives Multipath TCP SYN"
-
-#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:15
-msgid "Multipath TCP checksum"
-msgstr "Somme de contrôle Multipath TCP"
-
-#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:21
-msgid "Multipath TCP path-manager"
-msgstr "Gestionnaire de chemins Multipath TCP"
-
-#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:31
-msgid "Multipath TCP scheduler"
-msgstr "Planificateur Multipath TCP"
-
-#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:47
-msgid "Multipath TCP version"
-msgstr "Version de Multipath TCP"
-
-#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:28
-msgid "Netlink"
-msgstr "Netlink"
-
-#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:7
-msgid ""
-"Networks MPTCP settings. Visit http://multipath-tcp.org/pmwiki.php/Users/"
-"ConfigureMPTCP for help."
-msgstr ""
-"Paramètres réseaux MPTCP. Visiter http://multipath-tcp.org/pmwiki.php/Users/"
-"ConfigureMPTCP pour de l'aide."
-
-#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:108
-msgid "One interface must be set as master"
-msgstr "Une interface doit être configuré en temps que maître"
-
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:939
-msgid "Outbound:"
-msgstr "Sortant :"
-
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:319
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:322
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:377
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:935
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:945
-msgid "Peak:"
-msgstr "Pointe :"
-
-#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:80
-msgid "Re-create fullmesh subflows after a timeout"
-msgstr "Recréer les sous-flux fullmesh après le délai d'expiration"
-
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:891
-msgid "Realtime Traffic"
-msgstr "Trafic temps réel"
-
-#: luci-app-mptcp/luasrc/controller/mptcp.lua:10
-#: luci-app-mptcp/luasrc/view/mptcp/mptcp_check.htm:45
-msgid "Settings"
-msgstr "Paramètres"
-
-#: luci-app-mptcp/luasrc/view/mptcp/mptcp_check.htm:65
-msgid "Test"
-msgstr "Essai"
-
-#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:69
-msgid ""
-"The number of MPTCP-level retransmission intervals with no traffic and "
-"pending outstanding data on a given subflow required to declare it stale"
-msgstr ""
-"Le nombre d'intervalles de retransmission au niveau de MPTCP sans trafic et "
-"en attente de données sur un sous-flux requis pour le déclarer obsolète"
-
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:914
-msgid "Upload:"
-msgstr "Envoie :"
-
-#: luci-app-mptcp/luasrc/view/mptcp/mptcp_check.htm:21
-#: luci-app-mptcp/luasrc/view/mptcp/mptcp_connections.htm:21
-#: luci-app-mptcp/luasrc/view/mptcp/mptcp_fullmesh.htm:21
-#: luci-app-mptcp/luasrc/view/mptcp/mptcp_monitor.htm:14
-msgid "Waiting for command to complete..."
-msgstr "En attente de la réponse de la commande..."
-
-#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:112
-msgid "backup"
-msgstr "remplaçant"
-
-#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:22
-#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:32
-msgid "default"
-msgstr "Défaut"
-
-#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:14
-#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:17
-#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:20
-#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:82
-#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:93
-msgid "disable"
-msgstr "Désactive"
-
-#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:110
-msgid "disabled"
-msgstr "Désactivé"
-
-#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:13
-#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:16
-#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:19
-#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:81
-#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:92
-msgid "enable"
-msgstr "Active"
-
-#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:109
-msgid "enabled"
-msgstr "Activé"
-
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:88
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:314
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:318
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:322
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:372
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:376
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:380
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:681
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:930
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:933
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:936
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:940
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:943
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:946
-msgid "kB/s"
-msgstr "Ko/s"
-
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:97
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:314
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:318
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:322
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:372
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:376
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:380
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:690
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:930
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:933
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:936
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:940
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:943
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:946
-msgid "kbit/s"
-msgstr "kbit/s"
-
-#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:111
-msgid "master"
-msgstr "maître"
-
-#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/multipath.js:326
-msgid "All interfaces"
-msgstr "Toutes les interfaces"
-
-#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/multipath.js:456
-msgid "All interfaces – combined view"
-msgstr "Toutes les interfaces - vue combinée"
-
-#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/multipath.js:457
-msgid "All interfaces overlaid, inbound and outbound separately"
-msgstr "Toutes les interfaces superposées, entrant et sortant séparés"
-
-#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/multipath.js:422
-#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/multipath.js:615
-msgid "Average"
-msgstr "Moyenne"
-
-#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/multipath.js:422
-#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/multipath.js:611
-msgid "Current"
-msgstr "Actuel"
-
#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/multipath.js:693
msgid "In"
msgstr "Entrant"
-#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/multipath.js:462
-msgid "Inbound – all interfaces"
-msgstr "Entrant - toutes les interfaces"
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:248
+msgid "In-kernel"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:151
+msgid "In-kernel path manager"
+msgstr ""
#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/multipath.js:634
msgid "Inbound traffic"
msgstr "Trafic entrant"
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/multipath.js:462
+msgid "Inbound – all interfaces"
+msgstr "Entrant - toutes les interfaces"
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:52
+msgid "Infinite mapping received (peer fell back to plain TCP semantics)"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:51
+msgid "Infinite mapping sent (fell back to plain TCP semantics)"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:165
+msgid "Initial MPTCP configuration"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:238
+msgid ""
+"Initial time period in second to disable MPTCP on active MPTCP sockets when "
+"a MPTCP firewall blackhole issue happens. This time period will grow "
+"exponentially when more blackhole issues get detected right after MPTCP is "
+"re-enabled and will reset to the initial value when the blackhole issue goes "
+"away."
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_check.js:52
+msgid "Interface"
+msgstr "Interface"
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:284
+msgid "Interfaces Settings"
+msgstr "Paramètres des interfaces"
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:36
+msgid "JOIN ACK authentication failures"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:34
+msgid "JOIN SYN/ACK authentication failures"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:37
+msgid "JOIN attempts with unknown token"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:38
+msgid "JOIN request rejected by the path manager"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:265
+msgid "Kernel MPTCP configuration"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_dscp_routing.js:21
+msgid "LE (1) - Lower effort"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:170
+msgid "Last updated:"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_dscp_routing.js:153
+msgid ""
+"Leave empty to just mirror this row’s Upload interface to the gateway "
+"instead -- the same \"download always follows upload\" behavior mqvpn "
+"already has built in natively."
+msgstr ""
+"Laisser vide pour simplement refléter l’interface Upload de cette ligne "
+"vers la passerelle -- le même comportement \"le téléchargement suit "
+"toujours l’envoi\" que mqvpn a déjà nativement."
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/multipath.js:75
+msgid "MB/s"
+msgstr "Mo/s"
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:46
+#: luci-app-mptcp/root/usr/share/luci/menu.d/luci-app-mptcp.json:3
+#: luci-app-mptcp/root/usr/share/luci/menu.d/luci-app-mptcp.json:14
+msgid "MPTCP"
+msgstr "MPTCP"
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:148
+msgid "MPTCP Diagnostics"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:142
+msgid "MPTCP Established connections"
+msgstr ""
+
+#: luci-app-mptcp/root/usr/share/luci/menu.d/luci-app-mptcp.json:69
+msgid "MPTCP Fullmesh"
+msgstr "MPTCP Fullmesh"
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:141
+msgid "MPTCP Fullmesh (subflow map)"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:140
+msgid "MPTCP Settings"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_check.js:46
+msgid "MPTCP Support Check"
+msgstr "Vérification du support MPTCP"
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:253
+msgid "MPTCP enabled"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:213
+msgid "MPTCP endpoint"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:16
+msgid "MPTCP handshake accepted by peer (SYN/ACK)"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:15
+msgid "MPTCP handshake attempts received (SYN)"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:14
+msgid "MPTCP handshake attempts sent (SYN)"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:17
+msgid "MPTCP handshake completed (ACK)"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:21
+msgid "MPTCP handshake disabled client-side after past issues"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:20
+msgid "MPTCP handshake dropped client-side, fell back to TCP"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:277
+msgid "MPTCP kernel counters (since boot)"
+msgstr ""
+
+#: luci-app-mptcp/root/usr/share/luci/menu.d/luci-app-mptcp.json:80
+msgid "MPTCP monitoring"
+msgstr "Surveillance MPTCP"
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:143
+msgid "MPTCP monitoring (raw kernel counters)"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:22
+msgid "MPTCP rejected on a port-only endpoint"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:90
+msgid "MPTCP resets received"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:89
+msgid "MPTCP resets sent"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:46
+msgid "MPTCP-level retransmissions"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:105
+msgid "MPTCP-level zero-window probes"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:205
+msgid "MPTCPd Address annoucement flags"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:212
+msgid "MPTCPd Address notification flags"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:183
+msgid "MPTCPd path managers"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:194
+msgid "MPTCPd plugins"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:228
+msgid "Max add address"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:218
+msgid "Max subflows"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/multipath.js:77
+msgid "Mbit/s"
+msgstr "Mbit/s"
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:117
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_dscp_routing.js:126
+msgid "Mirror DSCP/weight pins to gateway"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:212
+msgid "Mode"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:60
+msgid "Multipath Debug"
+msgstr "Débogage multipath"
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:50
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:289
+msgid "Multipath TCP"
+msgstr "Multipath TCP"
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:126
+msgid "Multipath TCP SYN retries"
+msgstr "Tentatives Multipath TCP SYN"
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:55
+msgid "Multipath TCP checksum"
+msgstr "Somme de contrôle Multipath TCP"
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:65
+msgid "Multipath TCP path-manager"
+msgstr "Gestionnaire de chemins Multipath TCP"
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:75
+msgid "Multipath TCP scheduler"
+msgstr "Planificateur Multipath TCP"
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:132
+msgid "Multipath TCP version"
+msgstr "Version de Multipath TCP"
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:72
+msgid "Netlink"
+msgstr "Netlink"
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:46
+msgid "Networks MPTCP settings."
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:279
+msgid "No counters available (nstat/multipath -m returned nothing)."
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_connections.js:26
+msgid "No data"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:184
+msgid "No diagnostic data available yet."
+msgstr ""
+
#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/multipath.js:394
msgid "No multipath WAN interface is currently available."
msgstr "Aucune interface WAN multipath n'est actuellement disponible."
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:205
+msgid "No multipath-enabled WAN interfaces found."
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_dscp_routing.js:112
+msgid ""
+"Nothing to show yet: no DSCP scheduler (bpf_dscp) or weight scheduler "
+"(bpf_weight/bpf_weight_rr/bpf_burstweight, or mqvpn’s Weighted RTT/Weighted "
+"Round Robin) is currently selected on the MPTCP or MQVPN pages."
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:289
+msgid "One interface must be set as master"
+msgstr "Une interface doit être configuré en temps que maître"
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_dscp_routing.js:165
+msgid ""
+"Only WANs with Multipath TCP enabled (the “Multipath TCP” option on the "
+"MPTCP page’s Interfaces Settings) are listed below."
+msgstr ""
+"Seuls les WAN avec Multipath TCP activé (l’option « Multipath TCP » de la "
+"section Configuration des interfaces de la page MPTCP) sont listés "
+"ci-dessous."
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:304
+msgid ""
+"Only used by *weight schedulers/path managers. Ignored if no weight "
+"scheduler is selected."
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:139
+msgid "OpenMPTCProuter Network overview / Status"
+msgstr ""
+
#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/multipath.js:700
msgid "Out"
msgstr "Sortant"
-#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/multipath.js:468
-msgid "Outbound – all interfaces"
-msgstr "Sortant - toutes les interfaces"
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:58
+msgid "Out-of-order segments merged"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:57
+msgid "Out-of-order segments queued"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:56
+msgid "Out-of-order segments queued at tail"
+msgstr ""
#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/multipath.js:640
msgid "Outbound traffic"
msgstr "Trafic sortant"
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/multipath.js:468
+msgid "Outbound – all interfaces"
+msgstr "Sortant - toutes les interfaces"
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:150
+msgid "Path Manager type"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:254
+msgid "Path manager"
+msgstr ""
+
#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/multipath.js:422
#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/multipath.js:619
msgid "Peak"
msgstr "Pointe"
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:203
+msgid "Per-WAN MPTCP endpoint status"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:78
+msgid "RM_ADDR signals dropped"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:77
+msgid "RM_ADDR signals failed to send"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:75
+msgid "RM_ADDR signals received"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:76
+msgid "RM_ADDR signals sent"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:260
+msgid "Re-create fullmesh subflows after a timeout"
+msgstr "Recréer les sous-flux fullmesh après le délai d'expiration"
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:95
+msgid "Receive window conflict resolved on update"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:94
+msgid "Receive window shared across subflows"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:96
+msgid "Receive window update conflicts"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:137
+msgid "Related pages"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:223
+msgid "Retranmission intervals"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_dscp_routing.js:144
+msgid ""
+"Router → internet. Pins this class to a WAN for MPTCP’s bpf_dscp scheduler "
+"(local dscp_iface map) and, for mqvpn, announces the class on this path’s "
+"DSCP mask via the control API."
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:255
+msgid "Scheduler"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:54
+msgid "Segments received outside the MPTCP mapping window"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:93
+msgid "Send window shared across subflows"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:243
+msgid ""
+"Set the make-after-break timeout: in absence of any close or shutdown "
+"syscall, MPTCP sockets will maintain the status unchanged for such time, "
+"after the last subflow removal, before moving to TCP_CLOSE."
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:233
+msgid ""
+"Set the timeout after which an ADD_ADDR (add address) control message will "
+"be resent to an MPTCP peer that has not acknowledged a previous ADD_ADDR "
+"message."
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_check.js:50
+msgid "Settings"
+msgstr "Paramètres"
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:257
+msgid "Stale loss count threshold"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:63
+msgid "Stale subflows recovered"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:41
+msgid "Subflow JOIN ACK received on a different port"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:43
+msgid "Subflow JOIN ACK with mismatched port"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:39
+msgid "Subflow JOIN SYN received on a different port"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:42
+msgid "Subflow JOIN SYN with mismatched port"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:40
+msgid "Subflow JOIN SYN/ACK received on a different port"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:32
+msgid "Subflow JOIN accepted by peer (SYN/ACK)"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:33
+msgid "Subflow JOIN accepted by peer (SYN/ACK, backup)"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:30
+msgid "Subflow JOIN attempts received (SYN)"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:31
+msgid "Subflow JOIN attempts received (SYN, backup)"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:26
+msgid "Subflow JOIN attempts sent (SYN)"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:35
+msgid "Subflow JOIN completed (ACK)"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:28
+msgid "Subflow JOIN failed: could not bind address"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:29
+msgid "Subflow JOIN failed: could not connect"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:27
+msgid "Subflow JOIN failed: could not create socket"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:261
+msgid "Subflow limit"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:82
+msgid "Subflow priority change received (MP_PRIO)"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:81
+msgid "Subflow priority change sent (MP_PRIO)"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:62
+msgid "Subflows marked stale (possible blackhole)"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:64
+msgid "Subflows removed"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_check.js:40
+msgid "Test"
+msgstr "Essai"
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:223
+msgid ""
+"The number of MPTCP-level retransmission intervals with no traffic and "
+"pending outstanding data on a given subflow required to declare it stale. A "
+"low stale_loss_cnt value allows for fast active-backup switch-over, an high "
+"value maximize links utilization on edge scenarios e.g. lossy link with high "
+"BER or peer pausing the data processing."
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:248
+msgid ""
+"The number of SYN + MP_CAPABLE retransmissions before falling back to TCP, "
+"i.e. dropping the MPTCP options."
+msgstr ""
+
#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/multipath.js:442
#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/multipath.js:570
#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/multipath.js:585
@@ -381,6 +942,139 @@ msgstr "Total entrant"
msgid "Total out"
msgstr "Total sortant"
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_dscp_routing.js:143
+msgid "Upload interface"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_dscp_routing.js:164
+msgid ""
+"Used by the *weight MPTCP schedulers (bpf_weight/bpf_weight_rr) and by "
+"mqvpn’s \"Weighted RTT\"/\"Weighted Round Robin\" schedulers -- same value, "
+"applies to both upload and download (mirrored to the gateway automatically). "
+"Unlike the DSCP pins above, weight is a single value per WAN, not per "
+"traffic class."
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:249
+msgid "Userspace"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:152
+msgid "Userspace path manager"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:288
+msgid "Value"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:210
+msgid "WAN"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_dscp_routing.js:163
+msgid "WAN weight"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_check.js:69
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_connections.js:15
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_fullmesh.js:15
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_monitor.js:15
+msgid "Waiting for command to complete…"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:304
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_dscp_routing.js:170
+msgid "Weight"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:118
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_dscp_routing.js:127
+msgid ""
+"When using a DSCP or weight BPF scheduler, also sync each WAN’s pin to the "
+"gateway (VPS) so it also holds for traffic the gateway sends (downloads), "
+"not just traffic the router sends (uploads). Disabling this only stops "
+"future syncs -- it does not remove pins already pushed to the gateway."
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_dscp_routing.js:128
+msgid ""
+"While disabled, the DSCP table below only shows Upload -- Download has no "
+"effect until this is re-enabled and applied."
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:293
+msgid "backup"
+msgstr "remplaçant"
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:76
+msgid "bpf_burst => same as the default scheduler"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:78
+msgid "bpf_first => always picks the first subflow to send data"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:77
+msgid "bpf_red => sends all packets redundantly on all available subflows"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:79
+msgid ""
+"bpf_rr => always picks the next available subflow to send data (round-robin)"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:66
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:82
+msgid "default"
+msgstr "Défaut"
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:52
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:57
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:62
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:168
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:174
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:180
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:262
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:273
+msgid "disable"
+msgstr "Désactive"
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:291
+msgid "disabled"
+msgstr "Désactivé"
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:51
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:56
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:61
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:167
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:173
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:179
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:261
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:272
+msgid "enable"
+msgstr "Active"
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:290
+msgid "enabled"
+msgstr "Activé"
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/multipath.js:74
+msgid "kB/s"
+msgstr "Ko/s"
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/multipath.js:76
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/multipath.js:436
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/multipath.js:446
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/multipath.js:612
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/multipath.js:616
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/multipath.js:620
+msgid "kbit/s"
+msgstr "kbit/s"
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:292
+msgid "master"
+msgstr "maître"
+
#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/multipath.js:540
#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/multipath.js:541
#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/multipath.js:673
@@ -388,19 +1082,31 @@ msgstr "Total sortant"
msgid "minutes window, 1 second interval"
msgstr "minutes de fenêtre, intervalle d'une seconde"
-#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:85
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:225
+msgid "missing"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_dscp_routing.js:154
+msgid ""
+"mqvpn has no equivalent: its downlink always mirrors whichever WAN carries "
+"the class on upload, so this field has no effect on mqvpn."
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:265
msgid "ndiffports subflows number"
msgstr "Nombre de sous-flux ndiffports"
-#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:64
-msgid ""
-"specifies the maximum number of ADD_ADDR suboptions accepted for each MPTCP "
-"connection"
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:225
+msgid "registered"
msgstr ""
-"spécifie le nombre maximum de sous-options ADD_ADDR acceptées pour chaque "
-"connexion MPTCP"
-#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:59
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:228
+msgid ""
+"specifies the maximum number of ADD_ADDR (add address) suboptions accepted "
+"for each MPTCP connection"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:218
msgid ""
"specifies the maximum number of additional subflows allowed for each MPTCP "
"connection"
@@ -408,6 +1114,65 @@ msgstr ""
"spécifie le nombre maximum de sous-flux ADD_ADDR acceptées pour chaque "
"connexion MPTCP"
+#~ msgid "(%d minute window, %d second interval)"
+#~ msgstr "(fenêtre de %d minute, intervalle de %d seconde)"
+
+#~ msgid "(%d minutes window, %d seconds interval)"
+#~ msgstr "(fenêtre de %d minutes, intervalle de %d secondes)"
+
+#~ msgid "Average:"
+#~ msgstr "Moyenne :"
+
+#~ msgid "Current:"
+#~ msgstr "Actuellement :"
+
+#~ msgid "Download:"
+#~ msgstr "Téléchargement :"
+
+#~ msgid "Inbound:"
+#~ msgstr "Entrant :"
+
+#~ msgid "Loading"
+#~ msgstr "Chargement"
+
+#~ msgid ""
+#~ "Networks MPTCP settings. Visit http://multipath-tcp.org/pmwiki.php/"
+#~ "Users/ConfigureMPTCP for help."
+#~ msgstr ""
+#~ "Paramètres réseaux MPTCP. Visiter http://multipath-tcp.org/pmwiki.php/"
+#~ "Users/ConfigureMPTCP pour de l'aide."
+
+#~ msgid "Outbound:"
+#~ msgstr "Sortant :"
+
+#~ msgid "Peak:"
+#~ msgstr "Pointe :"
+
+#~ msgid "Realtime Traffic"
+#~ msgstr "Trafic temps réel"
+
+#~ msgid ""
+#~ "The number of MPTCP-level retransmission intervals with no traffic and "
+#~ "pending outstanding data on a given subflow required to declare it stale"
+#~ msgstr ""
+#~ "Le nombre d'intervalles de retransmission au niveau de MPTCP sans trafic "
+#~ "et en attente de données sur un sous-flux requis pour le déclarer obsolète"
+
+#~ msgid "Upload:"
+#~ msgstr "Envoie :"
+
+#~ msgid "Waiting for command to complete..."
+#~ msgstr "En attente de la réponse de la commande..."
+
+#~ msgid ""
+#~ "specifies the maximum number of ADD_ADDR suboptions accepted for each "
+#~ "MPTCP connection"
+#~ msgstr ""
+#~ "spécifie le nombre maximum de sous-options ADD_ADDR acceptées pour chaque "
+#~ "connexion MPTCP"
+
#~ msgid "binder"
#~ msgstr "lier"
diff --git a/luci-app-mptcp/po/it/mptcp.po b/luci-app-mptcp/po/it/mptcp.po
index 4e9f45f6d..52e27146b 100644
--- a/luci-app-mptcp/po/it/mptcp.po
+++ b/luci-app-mptcp/po/it/mptcp.po
@@ -12,355 +12,920 @@ msgstr ""
"Plural-Forms: nplurals=2; plural=n != 1;\n"
"X-Generator: Weblate 4.0.4\n"
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:775
-msgid "(%d minute window, %d second interval)"
-msgstr "(finestra di% d minuti, intervallo di% d secondi)"
-
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:241
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:242
-msgid "(%d minutes window, %d seconds interval)"
-msgstr "(finestra di% d minuti, intervallo di% d secondi)"
-
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:315
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:318
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:373
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:932
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:942
-msgid "Average:"
-msgstr "Media:"
-
-#: luci-app-mptcp/luasrc/controller/mptcp.lua:11
-msgid "Bandwidth"
-msgstr "Larghezza banda"
-
-#: luci-app-mptcp/luasrc/view/mptcp/mptcp_check.htm:43
-msgid "Check if MPTCP between interface and server is working."
-msgstr "Controlla se MPTCP tra l'interfaccia e il server funziona."
-
-#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:52
-msgid "Congestion Control"
-msgstr "Controllo della congestione"
-
-#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:97
-msgid "Consecutive segments that should be sent for round robin"
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_fullmesh.js:26
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_monitor.js:27
+msgid "(no output)"
msgstr ""
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:311
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:314
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:369
-msgid "Current:"
-msgstr "Corrente:"
-
-#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:52
-#, fuzzy
-msgid "Default is cubic"
-msgstr "L'impostazione predefinita è bbr"
-
-#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:21
-#, fuzzy
-msgid "Default is fullmesh"
-msgstr "L'impostazione predefinita è bbr"
-
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:908
-msgid "Download:"
-msgstr "Scarica:"
-
-#: luci-app-mptcp/luasrc/view/mptcp/mptcp_check.htm:31
-#: luci-app-mptcp/luasrc/view/mptcp/mptcp_connections.htm:31
-#: luci-app-mptcp/luasrc/view/mptcp/mptcp_fullmesh.htm:31
-#: luci-app-mptcp/luasrc/view/mptcp/mptcp_monitor.htm:24
-msgid "Error"
-msgstr "Errore"
-
-#: luci-app-mptcp/luasrc/controller/mptcp.lua:18
-msgid "Established connections"
-msgstr "Connessioni stabilite"
-
-#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:91
-msgid "Fill the congestion window on all subflows for round robin"
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_dscp_routing.js:45
+msgid "-- not pinned --"
msgstr ""
-#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:74
-msgid "Fullmesh subflows for each pair of IP addresses"
-msgstr "Flussi secondari fullmesh per ogni coppia di indirizzi IP"
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:133
+msgid "0"
+msgstr ""
-#: luci-app-mptcp/root/usr/share/rpcd/acl.d/luci-app-mptcp.json:3
-msgid "Grant UCI access for luci-app-mptcp"
-msgstr "Concedi l'accesso UCI per luci-app-mptcp"
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:134
+msgid "1"
+msgstr ""
-#: luci-app-mptcp/luasrc/view/mptcp/mptcp_check.htm:73
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:304
msgid ""
-"If you get \"TCPOptionMPTCPCapable [...] Sender's Key\" at the end, then "
-"MPTCP is supported. If there is a \"-TCPOptionMPTCPCapable\", then it's "
-"blocked."
+"A weight >100 make it more attractive, a weight <100 make it less "
+"attractive. Max 256"
msgstr ""
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:929
-msgid "Inbound:"
-msgstr "In entrata:"
-
-#: luci-app-mptcp/luasrc/view/mptcp/mptcp_check.htm:48
-msgid "Interface"
-msgstr "Interfaccia"
-
-#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:104
-msgid "Interfaces Settings"
-msgstr "Impostazioni delle interfacce"
-
-#: luci-app-mptcp/luasrc/view/mptcp/mptcp_check.htm:21
-#: luci-app-mptcp/luasrc/view/mptcp/mptcp_connections.htm:21
-#: luci-app-mptcp/luasrc/view/mptcp/mptcp_fullmesh.htm:21
-#: luci-app-mptcp/luasrc/view/mptcp/mptcp_monitor.htm:14
-msgid "Loading"
-msgstr "Caricamento in corso"
-
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:93
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:686
-msgid "MB/s"
-msgstr "MB/s"
-
-#: luci-app-mptcp/luasrc/controller/mptcp.lua:9
-#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:7
-#: luci-app-mptcp/root/usr/share/luci/menu.d/luci-app-mptcp.json:3
-msgid "MPTCP"
-msgstr "MPTCP"
-
-#: luci-app-mptcp/luasrc/controller/mptcp.lua:16
-msgid "MPTCP Fullmesh"
-msgstr "MPTCP Fullmesh"
-
-#: luci-app-mptcp/luasrc/controller/mptcp.lua:14
-#: luci-app-mptcp/luasrc/view/mptcp/mptcp_check.htm:42
-msgid "MPTCP Support Check"
-msgstr "Verifica supporto MPTCP"
-
-#: luci-app-mptcp/luasrc/controller/mptcp.lua:20
-msgid "MPTCP monitoring"
-msgstr ""
-
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:102
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:695
-msgid "Mbit/s"
-msgstr "Mbit/s"
-
-#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:18
-msgid "Multipath Debug"
-msgstr "Debug multipath"
-
-#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:12
-#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:108
-msgid "Multipath TCP"
-msgstr "Multipath TCP"
-
-#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:42
-msgid "Multipath TCP SYN retries"
-msgstr "Multipath TCP SYN riprova"
-
-#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:15
-msgid "Multipath TCP checksum"
-msgstr "Multipath TCP checksum"
-
-#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:21
-msgid "Multipath TCP path-manager"
-msgstr "Multipath TCP path-manager"
-
-#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:31
-msgid "Multipath TCP scheduler"
-msgstr "Multipath TCP scheduler"
-
-#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:47
-#, fuzzy
-#| msgid "Multipath TCP"
-msgid "Multipath TCP version"
-msgstr "Multipath TCP"
-
-#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:28
-msgid "Netlink"
-msgstr "Netlink"
-
-#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:7
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_dscp_routing.js:171
msgid ""
-"Networks MPTCP settings. Visit http://multipath-tcp.org/pmwiki.php/Users/"
-"ConfigureMPTCP for help."
+"A weight >100 makes a WAN more attractive, a weight <100 makes it less "
+"attractive. Max 256."
msgstr ""
-#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:108
-msgid "One interface must be set as master"
-msgstr "Un'interfaccia deve essere impostata come master"
-
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:939
-msgid "Outbound:"
-msgstr "Upload:"
-
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:319
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:322
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:377
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:935
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:945
-msgid "Peak:"
-msgstr "Picco:"
-
-#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:80
-msgid "Re-create fullmesh subflows after a timeout"
-msgstr "Ricrea i flussi secondari fullmesh dopo un timeout"
-
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:891
-msgid "Realtime Traffic"
-msgstr "Traffico in tempo reale"
-
-#: luci-app-mptcp/luasrc/controller/mptcp.lua:10
-#: luci-app-mptcp/luasrc/view/mptcp/mptcp_check.htm:45
-msgid "Settings"
-msgstr "Impostazioni"
-
-#: luci-app-mptcp/luasrc/view/mptcp/mptcp_check.htm:65
-msgid "Test"
-msgstr "Test"
-
-#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:69
-msgid ""
-"The number of MPTCP-level retransmission intervals with no traffic and "
-"pending outstanding data on a given subflow required to declare it stale"
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:73
+msgid "ADD_ADDR echo failed to send"
msgstr ""
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:914
-msgid "Upload:"
-msgstr "Upload:"
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:71
+msgid "ADD_ADDR echo received"
+msgstr ""
-#: luci-app-mptcp/luasrc/view/mptcp/mptcp_check.htm:21
-#: luci-app-mptcp/luasrc/view/mptcp/mptcp_connections.htm:21
-#: luci-app-mptcp/luasrc/view/mptcp/mptcp_fullmesh.htm:21
-#: luci-app-mptcp/luasrc/view/mptcp/mptcp_monitor.htm:14
-msgid "Waiting for command to complete..."
-msgstr "In attesa del completamento del comando ..."
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:72
+msgid "ADD_ADDR echo sent"
+msgstr ""
-#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:112
-msgid "backup"
-msgstr "backup"
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:74
+msgid "ADD_ADDR received with a port number"
+msgstr ""
-#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:22
-#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:32
-msgid "default"
-msgstr "predefinito"
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:70
+msgid "ADD_ADDR signals dropped"
+msgstr ""
-#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:14
-#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:17
-#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:20
-#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:82
-#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:93
-msgid "disable"
-msgstr "disabilita"
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:69
+msgid "ADD_ADDR signals failed to send"
+msgstr ""
-#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:110
-msgid "disabled"
-msgstr "disabilitato"
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:67
+msgid "ADD_ADDR signals received"
+msgstr ""
-#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:13
-#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:16
-#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:19
-#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:81
-#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:92
-msgid "enable"
-msgstr "Attivare"
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:68
+msgid "ADD_ADDR signals sent"
+msgstr ""
-#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:109
-msgid "enabled"
-msgstr "Abilitato"
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:262
+msgid "Accepted ADD_ADDR limit"
+msgstr ""
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:88
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:314
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:318
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:322
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:372
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:376
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:380
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:681
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:930
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:933
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:936
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:940
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:943
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:946
-msgid "kB/s"
-msgstr "kB/s"
-
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:97
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:314
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:318
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:322
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:372
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:376
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:380
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:690
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:930
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:933
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:936
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:940
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:943
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:946
-msgid "kbit/s"
-msgstr "kbit/s"
-
-#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:111
-msgid "master"
-msgstr "Principale"
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:259
+msgid "Add-addr timeout (s)"
+msgstr ""
#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/multipath.js:326
msgid "All interfaces"
msgstr "Tutte le interfacce"
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/multipath.js:457
+msgid "All interfaces overlaid, inbound and outbound separately"
+msgstr ""
+"Tutte le interfacce sovrapposte, traffico in entrata e in uscita separato"
+
#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/multipath.js:456
msgid "All interfaces – combined view"
msgstr "Tutte le interfacce - vista combinata"
-#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/multipath.js:457
-msgid "All interfaces overlaid, inbound and outbound separately"
-msgstr "Tutte le interfacce sovrapposte, traffico in entrata e in uscita separato"
-
#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/multipath.js:422
#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/multipath.js:615
msgid "Average"
msgstr "Media"
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:75
+msgid "BPF schedulers (not available on all platforms):"
+msgstr ""
+
+#: luci-app-mptcp/root/usr/share/luci/menu.d/luci-app-mptcp.json:47
+msgid "Bandwidth"
+msgstr "Larghezza banda"
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:61
+msgid "Blackhole detected on the path"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:238
+msgid "Blackhole timeout"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:258
+msgid "Blackhole timeout (s)"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_dscp_routing.js:13
+msgid "CS0 (0) - Best effort"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_dscp_routing.js:14
+msgid "CS1 (8) - Low priority"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_dscp_routing.js:15
+msgid "CS2 (16) - High priority"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_dscp_routing.js:16
+msgid "CS3 (24) - SIP/signaling"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_dscp_routing.js:17
+msgid "CS4 (32) - Real-time interactive"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_dscp_routing.js:18
+msgid "CS5 (40) - Broadcast video"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_dscp_routing.js:19
+msgid "CS6 (48) - Network control"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_dscp_routing.js:20
+msgid "CS7 (56) - Latency sensitive"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_check.js:48
+msgid "Check if MPTCP between interface and server is working."
+msgstr "Controlla se MPTCP tra l'interfaccia e il server funziona."
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:256
+msgid "Checksum"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_dscp_routing.js:109
+msgid ""
+"Choose which WAN carries each DSCP-tagged traffic class -- for the MPTCP "
+"bpf_dscp scheduler and for mqvpn -- and review the per-WAN weight used by "
+"the *weight schedulers on both. This page only edits the pins/weights; pick "
+"the scheduler that actually uses them on the MPTCP and MQVPN pages "
+"themselves."
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:243
+msgid "Close timeout"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:260
+msgid "Close timeout (s)"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:138
+msgid "Congestion Control"
+msgstr "Controllo della congestione"
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:277
+msgid "Consecutive segments that should be sent for round robin"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:233
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:248
+msgid "Control message timeout"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:23
+msgid "Could not allocate an MPTCP token, fell back to TCP"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:104
+msgid "Couldn't fall back to TCP (connection state didn't allow it)"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:288
+msgid "Counter"
+msgstr ""
+
#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/multipath.js:422
#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/multipath.js:611
msgid "Current"
msgstr "Attuale"
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_dscp_routing.js:108
+#: luci-app-mptcp/root/usr/share/luci/menu.d/luci-app-mptcp.json:36
+msgid "DSCP / Weight Routing"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_dscp_routing.js:139
+msgid "DSCP class"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_dscp_routing.js:134
+msgid "DSCP class pins"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:48
+msgid "DSS corruption detected, fell back to plain TCP"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:49
+msgid "DSS corruption detected, subflow reset"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:53
+msgid "Data checksum errors"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:86
+msgid "Data mapping failures received (MP_FAIL)"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:85
+msgid "Data mapping failures sent (MP_FAIL)"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:50
+msgid "Data sequence mapping did not match TCP sequence numbers"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:47
+msgid "Data sequence mapping did not match the previous one"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:138
+#, fuzzy
+msgid "Default is cubic"
+msgstr "L'impostazione predefinita è bbr"
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:65
+#, fuzzy
+msgid "Default is fullmesh"
+msgstr "L'impostazione predefinita è bbr"
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:211
+msgid "Device"
+msgstr ""
+
+#: luci-app-mptcp/root/usr/share/luci/menu.d/luci-app-mptcp.json:25
+msgid "Diagnostics"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:244
+msgid "Disabled"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_dscp_routing.js:151
+msgid "Download interface"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:55
+msgid "Duplicate data segments discarded"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_dscp_routing.js:34
+msgid "EF (46) - Voice"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:177
+msgid "Enable MPTCPd"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:243
+msgid "Enabled"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:214
+msgid "Endpoint flags"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_check.js:72
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_check.js:74
+msgid "Error"
+msgstr "Errore"
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_connections.js:28
+msgid "Error fetching connections data."
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_fullmesh.js:28
+msgid "Error fetching fullmesh data."
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_monitor.js:29
+msgid "Error fetching monitor data."
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:99
+msgid "Established MPTCP connections (current)"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:263
+msgid "Established MPTCP connections (right now)"
+msgstr ""
+
+#: luci-app-mptcp/root/usr/share/luci/menu.d/luci-app-mptcp.json:58
+msgid "Established connections"
+msgstr "Connessioni stabilite"
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:19
+msgid "Fallback to TCP (ACK stripped)"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:18
+msgid "Fallback to TCP (SYN/ACK stripped)"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:88
+msgid "Fastclose received"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:87
+msgid "Fastclose sent"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:102
+msgid "Fell back to TCP: bad or missing data sequence signal"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:101
+msgid "Fell back to TCP: conflicting TCP MD5SIG option"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:100
+msgid "Fell back to TCP: missing data on first established packet"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:103
+msgid "Fell back to TCP: simultaneous connect"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:271
+msgid "Fill the congestion window on all subflows for round robin"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:171
+msgid "Force Multipath configuration"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:254
+msgid "Fullmesh subflows for each pair of IP addresses"
+msgstr "Flussi secondari fullmesh per ogni coppia di indirizzi IP"
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_dscp_routing.js:152
+msgid ""
+"Gateway (VPS) → router. Only takes effect for MPTCP’s bpf_dscp scheduler "
+"(pins the VPS’s own send-side choice via dscp_remote_id) and can be a "
+"different WAN than Upload."
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_dscp_routing.js:124
+msgid "Gateway sync"
+msgstr ""
+
+#: luci-app-mptcp/root/usr/share/rpcd/acl.d/luci-app-mptcp.json:3
+msgid "Grant UCI access for luci-app-mptcp"
+msgstr "Concedi l'accesso UCI per luci-app-mptcp"
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:150
+msgid ""
+"Helps explain why MPTCP might not be aggregating your WANs correctly: "
+"fallback to plain TCP, blackholed/stale subflows, resets, checksum errors, "
+"and WANs that never got an MPTCP endpoint registered at all. Refreshes "
+"automatically every 15 seconds."
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_check.js:60
+msgid ""
+"If you get \"TCPOptionMPTCPCapable [...] Sender's Key\" at the end, then "
+"MPTCP is supported. If there is a \"-TCPOptionMPTCPCapable\", then it's "
+"blocked."
+msgstr ""
+
#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/multipath.js:693
msgid "In"
msgstr "Entrata"
-#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/multipath.js:462
-msgid "Inbound – all interfaces"
-msgstr "Entrata - tutte le interfacce"
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:248
+msgid "In-kernel"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:151
+msgid "In-kernel path manager"
+msgstr ""
#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/multipath.js:634
msgid "Inbound traffic"
msgstr "Traffico in entrata"
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/multipath.js:462
+msgid "Inbound – all interfaces"
+msgstr "Entrata - tutte le interfacce"
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:52
+msgid "Infinite mapping received (peer fell back to plain TCP semantics)"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:51
+msgid "Infinite mapping sent (fell back to plain TCP semantics)"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:165
+msgid "Initial MPTCP configuration"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:238
+msgid ""
+"Initial time period in second to disable MPTCP on active MPTCP sockets when "
+"a MPTCP firewall blackhole issue happens. This time period will grow "
+"exponentially when more blackhole issues get detected right after MPTCP is "
+"re-enabled and will reset to the initial value when the blackhole issue goes "
+"away."
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_check.js:52
+msgid "Interface"
+msgstr "Interfaccia"
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:284
+msgid "Interfaces Settings"
+msgstr "Impostazioni delle interfacce"
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:36
+msgid "JOIN ACK authentication failures"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:34
+msgid "JOIN SYN/ACK authentication failures"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:37
+msgid "JOIN attempts with unknown token"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:38
+msgid "JOIN request rejected by the path manager"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:265
+msgid "Kernel MPTCP configuration"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_dscp_routing.js:21
+msgid "LE (1) - Lower effort"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:170
+msgid "Last updated:"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_dscp_routing.js:153
+msgid ""
+"Leave empty to just mirror this row’s Upload interface to the gateway "
+"instead -- the same \"download always follows upload\" behavior mqvpn "
+"already has built in natively."
+msgstr ""
+"Lasciare vuoto per limitarsi a rispecchiare l’interfaccia Upload di questa "
+"riga verso il gateway -- lo stesso comportamento \"il download segue sempre "
+"l’upload\" che mqvpn ha già integrato nativamente."
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/multipath.js:75
+msgid "MB/s"
+msgstr "MB/s"
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:46
+#: luci-app-mptcp/root/usr/share/luci/menu.d/luci-app-mptcp.json:3
+#: luci-app-mptcp/root/usr/share/luci/menu.d/luci-app-mptcp.json:14
+msgid "MPTCP"
+msgstr "MPTCP"
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:148
+msgid "MPTCP Diagnostics"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:142
+msgid "MPTCP Established connections"
+msgstr ""
+
+#: luci-app-mptcp/root/usr/share/luci/menu.d/luci-app-mptcp.json:69
+msgid "MPTCP Fullmesh"
+msgstr "MPTCP Fullmesh"
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:141
+msgid "MPTCP Fullmesh (subflow map)"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:140
+msgid "MPTCP Settings"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_check.js:46
+msgid "MPTCP Support Check"
+msgstr "Verifica supporto MPTCP"
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:253
+msgid "MPTCP enabled"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:213
+msgid "MPTCP endpoint"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:16
+msgid "MPTCP handshake accepted by peer (SYN/ACK)"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:15
+msgid "MPTCP handshake attempts received (SYN)"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:14
+msgid "MPTCP handshake attempts sent (SYN)"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:17
+msgid "MPTCP handshake completed (ACK)"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:21
+msgid "MPTCP handshake disabled client-side after past issues"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:20
+msgid "MPTCP handshake dropped client-side, fell back to TCP"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:277
+msgid "MPTCP kernel counters (since boot)"
+msgstr ""
+
+#: luci-app-mptcp/root/usr/share/luci/menu.d/luci-app-mptcp.json:80
+msgid "MPTCP monitoring"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:143
+msgid "MPTCP monitoring (raw kernel counters)"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:22
+msgid "MPTCP rejected on a port-only endpoint"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:90
+msgid "MPTCP resets received"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:89
+msgid "MPTCP resets sent"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:46
+msgid "MPTCP-level retransmissions"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:105
+msgid "MPTCP-level zero-window probes"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:205
+msgid "MPTCPd Address annoucement flags"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:212
+msgid "MPTCPd Address notification flags"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:183
+msgid "MPTCPd path managers"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:194
+msgid "MPTCPd plugins"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:228
+msgid "Max add address"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:218
+msgid "Max subflows"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/multipath.js:77
+msgid "Mbit/s"
+msgstr "Mbit/s"
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:117
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_dscp_routing.js:126
+msgid "Mirror DSCP/weight pins to gateway"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:212
+msgid "Mode"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:60
+msgid "Multipath Debug"
+msgstr "Debug multipath"
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:50
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:289
+msgid "Multipath TCP"
+msgstr "Multipath TCP"
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:126
+msgid "Multipath TCP SYN retries"
+msgstr "Multipath TCP SYN riprova"
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:55
+msgid "Multipath TCP checksum"
+msgstr "Multipath TCP checksum"
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:65
+msgid "Multipath TCP path-manager"
+msgstr "Multipath TCP path-manager"
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:75
+msgid "Multipath TCP scheduler"
+msgstr "Multipath TCP scheduler"
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:132
+#, fuzzy
+msgid "Multipath TCP version"
+msgstr "Multipath TCP"
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:72
+msgid "Netlink"
+msgstr "Netlink"
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:46
+msgid "Networks MPTCP settings."
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:279
+msgid "No counters available (nstat/multipath -m returned nothing)."
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_connections.js:26
+msgid "No data"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:184
+msgid "No diagnostic data available yet."
+msgstr ""
+
#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/multipath.js:394
msgid "No multipath WAN interface is currently available."
msgstr "Nessuna interfaccia WAN multipath e attualmente disponibile."
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:205
+msgid "No multipath-enabled WAN interfaces found."
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_dscp_routing.js:112
+msgid ""
+"Nothing to show yet: no DSCP scheduler (bpf_dscp) or weight scheduler "
+"(bpf_weight/bpf_weight_rr/bpf_burstweight, or mqvpn’s Weighted RTT/Weighted "
+"Round Robin) is currently selected on the MPTCP or MQVPN pages."
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:289
+msgid "One interface must be set as master"
+msgstr "Un'interfaccia deve essere impostata come master"
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_dscp_routing.js:165
+msgid ""
+"Only WANs with Multipath TCP enabled (the “Multipath TCP” option on the "
+"MPTCP page’s Interfaces Settings) are listed below."
+msgstr ""
+"Sono elencate qui sotto solo le WAN con Multipath TCP abilitato (l’opzione "
+"“Multipath TCP” nella sezione Impostazioni interfacce della pagina MPTCP)."
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:304
+msgid ""
+"Only used by *weight schedulers/path managers. Ignored if no weight "
+"scheduler is selected."
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:139
+msgid "OpenMPTCProuter Network overview / Status"
+msgstr ""
+
#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/multipath.js:700
msgid "Out"
msgstr "Uscita"
-#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/multipath.js:468
-msgid "Outbound – all interfaces"
-msgstr "Uscita - tutte le interfacce"
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:58
+msgid "Out-of-order segments merged"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:57
+msgid "Out-of-order segments queued"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:56
+msgid "Out-of-order segments queued at tail"
+msgstr ""
#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/multipath.js:640
msgid "Outbound traffic"
msgstr "Traffico in uscita"
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/multipath.js:468
+msgid "Outbound – all interfaces"
+msgstr "Uscita - tutte le interfacce"
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:150
+msgid "Path Manager type"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:254
+msgid "Path manager"
+msgstr ""
+
#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/multipath.js:422
#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/multipath.js:619
msgid "Peak"
msgstr "Picco"
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:203
+msgid "Per-WAN MPTCP endpoint status"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:78
+msgid "RM_ADDR signals dropped"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:77
+msgid "RM_ADDR signals failed to send"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:75
+msgid "RM_ADDR signals received"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:76
+msgid "RM_ADDR signals sent"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:260
+msgid "Re-create fullmesh subflows after a timeout"
+msgstr "Ricrea i flussi secondari fullmesh dopo un timeout"
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:95
+msgid "Receive window conflict resolved on update"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:94
+msgid "Receive window shared across subflows"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:96
+msgid "Receive window update conflicts"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:137
+msgid "Related pages"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:223
+msgid "Retranmission intervals"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_dscp_routing.js:144
+msgid ""
+"Router → internet. Pins this class to a WAN for MPTCP’s bpf_dscp scheduler "
+"(local dscp_iface map) and, for mqvpn, announces the class on this path’s "
+"DSCP mask via the control API."
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:255
+msgid "Scheduler"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:54
+msgid "Segments received outside the MPTCP mapping window"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:93
+msgid "Send window shared across subflows"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:243
+msgid ""
+"Set the make-after-break timeout: in absence of any close or shutdown "
+"syscall, MPTCP sockets will maintain the status unchanged for such time, "
+"after the last subflow removal, before moving to TCP_CLOSE."
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:233
+msgid ""
+"Set the timeout after which an ADD_ADDR (add address) control message will "
+"be resent to an MPTCP peer that has not acknowledged a previous ADD_ADDR "
+"message."
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_check.js:50
+msgid "Settings"
+msgstr "Impostazioni"
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:257
+msgid "Stale loss count threshold"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:63
+msgid "Stale subflows recovered"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:41
+msgid "Subflow JOIN ACK received on a different port"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:43
+msgid "Subflow JOIN ACK with mismatched port"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:39
+msgid "Subflow JOIN SYN received on a different port"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:42
+msgid "Subflow JOIN SYN with mismatched port"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:40
+msgid "Subflow JOIN SYN/ACK received on a different port"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:32
+msgid "Subflow JOIN accepted by peer (SYN/ACK)"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:33
+msgid "Subflow JOIN accepted by peer (SYN/ACK, backup)"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:30
+msgid "Subflow JOIN attempts received (SYN)"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:31
+msgid "Subflow JOIN attempts received (SYN, backup)"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:26
+msgid "Subflow JOIN attempts sent (SYN)"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:35
+msgid "Subflow JOIN completed (ACK)"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:28
+msgid "Subflow JOIN failed: could not bind address"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:29
+msgid "Subflow JOIN failed: could not connect"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:27
+msgid "Subflow JOIN failed: could not create socket"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:261
+msgid "Subflow limit"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:82
+msgid "Subflow priority change received (MP_PRIO)"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:81
+msgid "Subflow priority change sent (MP_PRIO)"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:62
+msgid "Subflows marked stale (possible blackhole)"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:64
+msgid "Subflows removed"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_check.js:40
+msgid "Test"
+msgstr "Test"
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:223
+msgid ""
+"The number of MPTCP-level retransmission intervals with no traffic and "
+"pending outstanding data on a given subflow required to declare it stale. A "
+"low stale_loss_cnt value allows for fast active-backup switch-over, an high "
+"value maximize links utilization on edge scenarios e.g. lossy link with high "
+"BER or peer pausing the data processing."
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:248
+msgid ""
+"The number of SYN + MP_CAPABLE retransmissions before falling back to TCP, "
+"i.e. dropping the MPTCP options."
+msgstr ""
+
#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/multipath.js:442
#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/multipath.js:570
#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/multipath.js:585
@@ -375,6 +940,139 @@ msgstr "Totale in entrata"
msgid "Total out"
msgstr "Totale in uscita"
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_dscp_routing.js:143
+msgid "Upload interface"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_dscp_routing.js:164
+msgid ""
+"Used by the *weight MPTCP schedulers (bpf_weight/bpf_weight_rr) and by "
+"mqvpn’s \"Weighted RTT\"/\"Weighted Round Robin\" schedulers -- same value, "
+"applies to both upload and download (mirrored to the gateway automatically). "
+"Unlike the DSCP pins above, weight is a single value per WAN, not per "
+"traffic class."
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:249
+msgid "Userspace"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:152
+msgid "Userspace path manager"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:288
+msgid "Value"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:210
+msgid "WAN"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_dscp_routing.js:163
+msgid "WAN weight"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_check.js:69
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_connections.js:15
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_fullmesh.js:15
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_monitor.js:15
+msgid "Waiting for command to complete…"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:304
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_dscp_routing.js:170
+msgid "Weight"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:118
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_dscp_routing.js:127
+msgid ""
+"When using a DSCP or weight BPF scheduler, also sync each WAN’s pin to the "
+"gateway (VPS) so it also holds for traffic the gateway sends (downloads), "
+"not just traffic the router sends (uploads). Disabling this only stops "
+"future syncs -- it does not remove pins already pushed to the gateway."
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_dscp_routing.js:128
+msgid ""
+"While disabled, the DSCP table below only shows Upload -- Download has no "
+"effect until this is re-enabled and applied."
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:293
+msgid "backup"
+msgstr "backup"
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:76
+msgid "bpf_burst => same as the default scheduler"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:78
+msgid "bpf_first => always picks the first subflow to send data"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:77
+msgid "bpf_red => sends all packets redundantly on all available subflows"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:79
+msgid ""
+"bpf_rr => always picks the next available subflow to send data (round-robin)"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:66
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:82
+msgid "default"
+msgstr "predefinito"
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:52
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:57
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:62
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:168
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:174
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:180
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:262
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:273
+msgid "disable"
+msgstr "disabilita"
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:291
+msgid "disabled"
+msgstr "disabilitato"
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:51
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:56
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:61
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:167
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:173
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:179
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:261
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:272
+msgid "enable"
+msgstr "Attivare"
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:290
+msgid "enabled"
+msgstr "Abilitato"
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/multipath.js:74
+msgid "kB/s"
+msgstr "kB/s"
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/multipath.js:76
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/multipath.js:436
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/multipath.js:446
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/multipath.js:612
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/multipath.js:616
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/multipath.js:620
+msgid "kbit/s"
+msgstr "kbit/s"
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:292
+msgid "master"
+msgstr "Principale"
+
#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/multipath.js:540
#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/multipath.js:541
#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/multipath.js:673
@@ -382,22 +1080,72 @@ msgstr "Totale in uscita"
msgid "minutes window, 1 second interval"
msgstr "finestra in minuti, intervallo di 1 secondo"
-#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:85
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:225
+msgid "missing"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_dscp_routing.js:154
+msgid ""
+"mqvpn has no equivalent: its downlink always mirrors whichever WAN carries "
+"the class on upload, so this field has no effect on mqvpn."
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:265
msgid "ndiffports subflows number"
msgstr "ndiffports subflows number"
-#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:64
-msgid ""
-"specifies the maximum number of ADD_ADDR suboptions accepted for each MPTCP "
-"connection"
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:225
+msgid "registered"
msgstr ""
-#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:59
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:228
+msgid ""
+"specifies the maximum number of ADD_ADDR (add address) suboptions accepted "
+"for each MPTCP connection"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:218
msgid ""
"specifies the maximum number of additional subflows allowed for each MPTCP "
"connection"
msgstr ""
+#~ msgid "(%d minute window, %d second interval)"
+#~ msgstr "(finestra di% d minuti, intervallo di% d secondi)"
+
+#~ msgid "(%d minutes window, %d seconds interval)"
+#~ msgstr "(finestra di% d minuti, intervallo di% d secondi)"
+
+#~ msgid "Average:"
+#~ msgstr "Media:"
+
+#~ msgid "Current:"
+#~ msgstr "Corrente:"
+
+#~ msgid "Download:"
+#~ msgstr "Scarica:"
+
+#~ msgid "Inbound:"
+#~ msgstr "In entrata:"
+
+#~ msgid "Loading"
+#~ msgstr "Caricamento in corso"
+
+#~ msgid "Outbound:"
+#~ msgstr "Upload:"
+
+#~ msgid "Peak:"
+#~ msgstr "Picco:"
+
+#~ msgid "Realtime Traffic"
+#~ msgstr "Traffico in tempo reale"
+
+#~ msgid "Upload:"
+#~ msgstr "Upload:"
+
+#~ msgid "Waiting for command to complete..."
+#~ msgstr "In attesa del completamento del comando ..."
+
#~ msgid "BLEST"
#~ msgstr "BLEST"
diff --git a/luci-app-mptcp/po/oc/mptcp.po b/luci-app-mptcp/po/oc/mptcp.po
index f9bd5bda5..46d5ade12 100644
--- a/luci-app-mptcp/po/oc/mptcp.po
+++ b/luci-app-mptcp/po/oc/mptcp.po
@@ -10,319 +10,1149 @@ msgstr ""
"Plural-Forms: nplurals=2; plural=n > 1;\n"
"X-Generator: Weblate 4.0.4\n"
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:775
-msgid "(%d minute window, %d second interval)"
-msgstr "(fenèstra de %d minuta,interval de %d segonda)"
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_fullmesh.js:26
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_monitor.js:27
+msgid "(no output)"
+msgstr ""
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:241
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:242
-msgid "(%d minutes window, %d seconds interval)"
-msgstr "(fenèstra de %d minutas,interval de %d segondas)"
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_dscp_routing.js:45
+msgid "-- not pinned --"
+msgstr ""
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:315
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:318
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:373
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:932
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:942
-msgid "Average:"
-msgstr "Mejana :"
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:133
+msgid "0"
+msgstr ""
-#: luci-app-mptcp/luasrc/controller/mptcp.lua:11
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:134
+msgid "1"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:304
+msgid ""
+"A weight >100 make it more attractive, a weight <100 make it less "
+"attractive. Max 256"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_dscp_routing.js:171
+msgid ""
+"A weight >100 makes a WAN more attractive, a weight <100 makes it less "
+"attractive. Max 256."
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:73
+msgid "ADD_ADDR echo failed to send"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:71
+msgid "ADD_ADDR echo received"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:72
+msgid "ADD_ADDR echo sent"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:74
+msgid "ADD_ADDR received with a port number"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:70
+msgid "ADD_ADDR signals dropped"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:69
+msgid "ADD_ADDR signals failed to send"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:67
+msgid "ADD_ADDR signals received"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:68
+msgid "ADD_ADDR signals sent"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:262
+msgid "Accepted ADD_ADDR limit"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:259
+msgid "Add-addr timeout (s)"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/multipath.js:326
+msgid "All interfaces"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/multipath.js:457
+msgid "All interfaces overlaid, inbound and outbound separately"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/multipath.js:456
+msgid "All interfaces – combined view"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/multipath.js:422
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/multipath.js:615
+msgid "Average"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:75
+msgid "BPF schedulers (not available on all platforms):"
+msgstr ""
+
+#: luci-app-mptcp/root/usr/share/luci/menu.d/luci-app-mptcp.json:47
msgid "Bandwidth"
msgstr "Benda passanta"
-#: luci-app-mptcp/luasrc/view/mptcp/mptcp_check.htm:43
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:61
+msgid "Blackhole detected on the path"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:238
+msgid "Blackhole timeout"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:258
+msgid "Blackhole timeout (s)"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_dscp_routing.js:13
+msgid "CS0 (0) - Best effort"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_dscp_routing.js:14
+msgid "CS1 (8) - Low priority"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_dscp_routing.js:15
+msgid "CS2 (16) - High priority"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_dscp_routing.js:16
+msgid "CS3 (24) - SIP/signaling"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_dscp_routing.js:17
+msgid "CS4 (32) - Real-time interactive"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_dscp_routing.js:18
+msgid "CS5 (40) - Broadcast video"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_dscp_routing.js:19
+msgid "CS6 (48) - Network control"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_dscp_routing.js:20
+msgid "CS7 (56) - Latency sensitive"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_check.js:48
msgid "Check if MPTCP between interface and server is working."
msgstr "Verificar se MPTCP entre l‘interfàcia e lo servidor fonciona."
-#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:52
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:256
+msgid "Checksum"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_dscp_routing.js:109
+msgid ""
+"Choose which WAN carries each DSCP-tagged traffic class -- for the MPTCP "
+"bpf_dscp scheduler and for mqvpn -- and review the per-WAN weight used by "
+"the *weight schedulers on both. This page only edits the pins/weights; pick "
+"the scheduler that actually uses them on the MPTCP and MQVPN pages "
+"themselves."
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:243
+msgid "Close timeout"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:260
+msgid "Close timeout (s)"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:138
msgid "Congestion Control"
msgstr "Contraròtle de congestion"
-#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:97
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:277
msgid "Consecutive segments that should be sent for round robin"
msgstr ""
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:311
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:314
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:369
-msgid "Current:"
-msgstr "Actualament :"
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:233
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:248
+msgid "Control message timeout"
+msgstr ""
-#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:52
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:23
+msgid "Could not allocate an MPTCP token, fell back to TCP"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:104
+msgid "Couldn't fall back to TCP (connection state didn't allow it)"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:288
+msgid "Counter"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/multipath.js:422
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/multipath.js:611
+msgid "Current"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_dscp_routing.js:108
+#: luci-app-mptcp/root/usr/share/luci/menu.d/luci-app-mptcp.json:36
+msgid "DSCP / Weight Routing"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_dscp_routing.js:139
+msgid "DSCP class"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_dscp_routing.js:134
+msgid "DSCP class pins"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:48
+msgid "DSS corruption detected, fell back to plain TCP"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:49
+msgid "DSS corruption detected, subflow reset"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:53
+msgid "Data checksum errors"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:86
+msgid "Data mapping failures received (MP_FAIL)"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:85
+msgid "Data mapping failures sent (MP_FAIL)"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:50
+msgid "Data sequence mapping did not match TCP sequence numbers"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:47
+msgid "Data sequence mapping did not match the previous one"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:138
#, fuzzy
msgid "Default is cubic"
msgstr "Per defaut bbr"
-#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:21
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:65
#, fuzzy
msgid "Default is fullmesh"
msgstr "Per defaut bbr"
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:908
-msgid "Download:"
-msgstr "Telecargament :"
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:211
+msgid "Device"
+msgstr ""
-#: luci-app-mptcp/luasrc/view/mptcp/mptcp_check.htm:31
-#: luci-app-mptcp/luasrc/view/mptcp/mptcp_connections.htm:31
-#: luci-app-mptcp/luasrc/view/mptcp/mptcp_fullmesh.htm:31
-#: luci-app-mptcp/luasrc/view/mptcp/mptcp_monitor.htm:24
+#: luci-app-mptcp/root/usr/share/luci/menu.d/luci-app-mptcp.json:25
+msgid "Diagnostics"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:244
+msgid "Disabled"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_dscp_routing.js:151
+msgid "Download interface"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:55
+msgid "Duplicate data segments discarded"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_dscp_routing.js:34
+msgid "EF (46) - Voice"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:177
+msgid "Enable MPTCPd"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:243
+msgid "Enabled"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:214
+msgid "Endpoint flags"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_check.js:72
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_check.js:74
msgid "Error"
msgstr "Error"
-#: luci-app-mptcp/luasrc/controller/mptcp.lua:18
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_connections.js:28
+msgid "Error fetching connections data."
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_fullmesh.js:28
+msgid "Error fetching fullmesh data."
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_monitor.js:29
+msgid "Error fetching monitor data."
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:99
+msgid "Established MPTCP connections (current)"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:263
+msgid "Established MPTCP connections (right now)"
+msgstr ""
+
+#: luci-app-mptcp/root/usr/share/luci/menu.d/luci-app-mptcp.json:58
msgid "Established connections"
msgstr "Connexions establidas"
-#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:91
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:19
+msgid "Fallback to TCP (ACK stripped)"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:18
+msgid "Fallback to TCP (SYN/ACK stripped)"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:88
+msgid "Fastclose received"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:87
+msgid "Fastclose sent"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:102
+msgid "Fell back to TCP: bad or missing data sequence signal"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:101
+msgid "Fell back to TCP: conflicting TCP MD5SIG option"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:100
+msgid "Fell back to TCP: missing data on first established packet"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:103
+msgid "Fell back to TCP: simultaneous connect"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:271
msgid "Fill the congestion window on all subflows for round robin"
msgstr ""
-#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:74
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:171
+msgid "Force Multipath configuration"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:254
msgid "Fullmesh subflows for each pair of IP addresses"
msgstr "Jos flux Fullmesh per cada parelh d’adreças IP"
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_dscp_routing.js:152
+msgid ""
+"Gateway (VPS) → router. Only takes effect for MPTCP’s bpf_dscp scheduler "
+"(pins the VPS’s own send-side choice via dscp_remote_id) and can be a "
+"different WAN than Upload."
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_dscp_routing.js:124
+msgid "Gateway sync"
+msgstr ""
+
#: luci-app-mptcp/root/usr/share/rpcd/acl.d/luci-app-mptcp.json:3
msgid "Grant UCI access for luci-app-mptcp"
msgstr ""
-#: luci-app-mptcp/luasrc/view/mptcp/mptcp_check.htm:73
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:150
+msgid ""
+"Helps explain why MPTCP might not be aggregating your WANs correctly: "
+"fallback to plain TCP, blackholed/stale subflows, resets, checksum errors, "
+"and WANs that never got an MPTCP endpoint registered at all. Refreshes "
+"automatically every 15 seconds."
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_check.js:60
msgid ""
"If you get \"TCPOptionMPTCPCapable [...] Sender's Key\" at the end, then "
"MPTCP is supported. If there is a \"-TCPOptionMPTCPCapable\", then it's "
"blocked."
msgstr ""
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:929
-msgid "Inbound:"
-msgstr "Dintrant :"
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/multipath.js:693
+msgid "In"
+msgstr ""
-#: luci-app-mptcp/luasrc/view/mptcp/mptcp_check.htm:48
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:248
+msgid "In-kernel"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:151
+msgid "In-kernel path manager"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/multipath.js:634
+msgid "Inbound traffic"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/multipath.js:462
+msgid "Inbound – all interfaces"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:52
+msgid "Infinite mapping received (peer fell back to plain TCP semantics)"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:51
+msgid "Infinite mapping sent (fell back to plain TCP semantics)"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:165
+msgid "Initial MPTCP configuration"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:238
+msgid ""
+"Initial time period in second to disable MPTCP on active MPTCP sockets when "
+"a MPTCP firewall blackhole issue happens. This time period will grow "
+"exponentially when more blackhole issues get detected right after MPTCP is "
+"re-enabled and will reset to the initial value when the blackhole issue goes "
+"away."
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_check.js:52
msgid "Interface"
msgstr "Interfàcia"
-#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:104
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:284
msgid "Interfaces Settings"
msgstr "Paramètres de las interfàcias"
-#: luci-app-mptcp/luasrc/view/mptcp/mptcp_check.htm:21
-#: luci-app-mptcp/luasrc/view/mptcp/mptcp_connections.htm:21
-#: luci-app-mptcp/luasrc/view/mptcp/mptcp_fullmesh.htm:21
-#: luci-app-mptcp/luasrc/view/mptcp/mptcp_monitor.htm:14
-msgid "Loading"
-msgstr "Cargament"
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:36
+msgid "JOIN ACK authentication failures"
+msgstr ""
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:93
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:686
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:34
+msgid "JOIN SYN/ACK authentication failures"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:37
+msgid "JOIN attempts with unknown token"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:38
+msgid "JOIN request rejected by the path manager"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:265
+msgid "Kernel MPTCP configuration"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_dscp_routing.js:21
+msgid "LE (1) - Lower effort"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:170
+msgid "Last updated:"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_dscp_routing.js:153
+msgid ""
+"Leave empty to just mirror this row’s Upload interface to the gateway "
+"instead -- the same \"download always follows upload\" behavior mqvpn "
+"already has built in natively."
+msgstr ""
+"Daissatz void per simplament miralhar l’interfàcia Upload d’aquesta linha "
+"cap a la passarèla -- lo meteis compòrtament \"lo telecargament seguís "
+"totjorn l’mandadís\" que mqvpn a ja integrat nativament."
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/multipath.js:75
msgid "MB/s"
msgstr "Mo/s"
-#: luci-app-mptcp/luasrc/controller/mptcp.lua:9
-#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:7
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:46
#: luci-app-mptcp/root/usr/share/luci/menu.d/luci-app-mptcp.json:3
+#: luci-app-mptcp/root/usr/share/luci/menu.d/luci-app-mptcp.json:14
msgid "MPTCP"
msgstr "MPTCP"
-#: luci-app-mptcp/luasrc/controller/mptcp.lua:16
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:148
+msgid "MPTCP Diagnostics"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:142
+msgid "MPTCP Established connections"
+msgstr ""
+
+#: luci-app-mptcp/root/usr/share/luci/menu.d/luci-app-mptcp.json:69
msgid "MPTCP Fullmesh"
msgstr "MPTCP Fullmesh"
-#: luci-app-mptcp/luasrc/controller/mptcp.lua:14
-#: luci-app-mptcp/luasrc/view/mptcp/mptcp_check.htm:42
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:141
+msgid "MPTCP Fullmesh (subflow map)"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:140
+msgid "MPTCP Settings"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_check.js:46
msgid "MPTCP Support Check"
msgstr ""
-#: luci-app-mptcp/luasrc/controller/mptcp.lua:20
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:253
+msgid "MPTCP enabled"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:213
+msgid "MPTCP endpoint"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:16
+msgid "MPTCP handshake accepted by peer (SYN/ACK)"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:15
+msgid "MPTCP handshake attempts received (SYN)"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:14
+msgid "MPTCP handshake attempts sent (SYN)"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:17
+msgid "MPTCP handshake completed (ACK)"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:21
+msgid "MPTCP handshake disabled client-side after past issues"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:20
+msgid "MPTCP handshake dropped client-side, fell back to TCP"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:277
+msgid "MPTCP kernel counters (since boot)"
+msgstr ""
+
+#: luci-app-mptcp/root/usr/share/luci/menu.d/luci-app-mptcp.json:80
msgid "MPTCP monitoring"
msgstr ""
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:102
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:695
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:143
+msgid "MPTCP monitoring (raw kernel counters)"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:22
+msgid "MPTCP rejected on a port-only endpoint"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:90
+msgid "MPTCP resets received"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:89
+msgid "MPTCP resets sent"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:46
+msgid "MPTCP-level retransmissions"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:105
+msgid "MPTCP-level zero-window probes"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:205
+msgid "MPTCPd Address annoucement flags"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:212
+msgid "MPTCPd Address notification flags"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:183
+msgid "MPTCPd path managers"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:194
+msgid "MPTCPd plugins"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:228
+msgid "Max add address"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:218
+msgid "Max subflows"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/multipath.js:77
msgid "Mbit/s"
msgstr "Mbit/s"
-#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:18
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:117
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_dscp_routing.js:126
+msgid "Mirror DSCP/weight pins to gateway"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:212
+msgid "Mode"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:60
msgid "Multipath Debug"
msgstr "Desbugatge multipath"
-#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:12
-#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:108
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:50
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:289
msgid "Multipath TCP"
msgstr "Multipath TCP"
-#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:42
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:126
msgid "Multipath TCP SYN retries"
msgstr "Ensages Multipath TCP SYN"
-#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:15
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:55
msgid "Multipath TCP checksum"
msgstr "Sòma de contraròtle Multipath TCP"
-#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:21
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:65
msgid "Multipath TCP path-manager"
msgstr "Gestionari dels camins Multipath TCP"
-#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:31
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:75
msgid "Multipath TCP scheduler"
msgstr "Planificator Multipath TCP"
-#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:47
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:132
#, fuzzy
-#| msgid "Multipath TCP"
msgid "Multipath TCP version"
msgstr "Multipath TCP"
-#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:28
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:72
msgid "Netlink"
msgstr "Ligam ret"
-#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:7
-msgid ""
-"Networks MPTCP settings. Visit http://multipath-tcp.org/pmwiki.php/Users/"
-"ConfigureMPTCP for help."
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:46
+msgid "Networks MPTCP settings."
msgstr ""
-"Paramètres ret MPTCP. Consulatz http://multipath-tcp.org/pmwiki.php/Users/"
-"ConfigureMPTCP per d’ajuda."
-#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:108
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:279
+msgid "No counters available (nstat/multipath -m returned nothing)."
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_connections.js:26
+msgid "No data"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:184
+msgid "No diagnostic data available yet."
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/multipath.js:394
+msgid "No multipath WAN interface is currently available."
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:205
+msgid "No multipath-enabled WAN interfaces found."
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_dscp_routing.js:112
+msgid ""
+"Nothing to show yet: no DSCP scheduler (bpf_dscp) or weight scheduler "
+"(bpf_weight/bpf_weight_rr/bpf_burstweight, or mqvpn’s Weighted RTT/Weighted "
+"Round Robin) is currently selected on the MPTCP or MQVPN pages."
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:289
msgid "One interface must be set as master"
msgstr "Una interfàcia deu èsser configurada coma principala"
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:939
-msgid "Outbound:"
-msgstr "Sortent :"
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_dscp_routing.js:165
+msgid ""
+"Only WANs with Multipath TCP enabled (the “Multipath TCP” option on the "
+"MPTCP page’s Interfaces Settings) are listed below."
+msgstr ""
+"Solament los WAN amb Multipath TCP activat (l’opcion « Multipath TCP » de "
+"la seccion Configuracion de las interfàcias de la pagina MPTCP) son listats "
+"çai-jós."
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:319
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:322
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:377
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:935
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:945
-msgid "Peak:"
-msgstr "Punta :"
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:304
+msgid ""
+"Only used by *weight schedulers/path managers. Ignored if no weight "
+"scheduler is selected."
+msgstr ""
-#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:80
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:139
+msgid "OpenMPTCProuter Network overview / Status"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/multipath.js:700
+msgid "Out"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:58
+msgid "Out-of-order segments merged"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:57
+msgid "Out-of-order segments queued"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:56
+msgid "Out-of-order segments queued at tail"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/multipath.js:640
+msgid "Outbound traffic"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/multipath.js:468
+msgid "Outbound – all interfaces"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:150
+msgid "Path Manager type"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:254
+msgid "Path manager"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/multipath.js:422
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/multipath.js:619
+msgid "Peak"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:203
+msgid "Per-WAN MPTCP endpoint status"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:78
+msgid "RM_ADDR signals dropped"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:77
+msgid "RM_ADDR signals failed to send"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:75
+msgid "RM_ADDR signals received"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:76
+msgid "RM_ADDR signals sent"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:260
msgid "Re-create fullmesh subflows after a timeout"
msgstr "Tornar crear los jos-flus fullmesh aprèp lo relambi d’expiracion"
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:891
-msgid "Realtime Traffic"
-msgstr "Trafic dirèct"
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:95
+msgid "Receive window conflict resolved on update"
+msgstr ""
-#: luci-app-mptcp/luasrc/controller/mptcp.lua:10
-#: luci-app-mptcp/luasrc/view/mptcp/mptcp_check.htm:45
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:94
+msgid "Receive window shared across subflows"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:96
+msgid "Receive window update conflicts"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:137
+msgid "Related pages"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:223
+msgid "Retranmission intervals"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_dscp_routing.js:144
+msgid ""
+"Router → internet. Pins this class to a WAN for MPTCP’s bpf_dscp scheduler "
+"(local dscp_iface map) and, for mqvpn, announces the class on this path’s "
+"DSCP mask via the control API."
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:255
+msgid "Scheduler"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:54
+msgid "Segments received outside the MPTCP mapping window"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:93
+msgid "Send window shared across subflows"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:243
+msgid ""
+"Set the make-after-break timeout: in absence of any close or shutdown "
+"syscall, MPTCP sockets will maintain the status unchanged for such time, "
+"after the last subflow removal, before moving to TCP_CLOSE."
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:233
+msgid ""
+"Set the timeout after which an ADD_ADDR (add address) control message will "
+"be resent to an MPTCP peer that has not acknowledged a previous ADD_ADDR "
+"message."
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_check.js:50
msgid "Settings"
msgstr "Paramètres"
-#: luci-app-mptcp/luasrc/view/mptcp/mptcp_check.htm:65
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:257
+msgid "Stale loss count threshold"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:63
+msgid "Stale subflows recovered"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:41
+msgid "Subflow JOIN ACK received on a different port"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:43
+msgid "Subflow JOIN ACK with mismatched port"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:39
+msgid "Subflow JOIN SYN received on a different port"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:42
+msgid "Subflow JOIN SYN with mismatched port"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:40
+msgid "Subflow JOIN SYN/ACK received on a different port"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:32
+msgid "Subflow JOIN accepted by peer (SYN/ACK)"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:33
+msgid "Subflow JOIN accepted by peer (SYN/ACK, backup)"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:30
+msgid "Subflow JOIN attempts received (SYN)"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:31
+msgid "Subflow JOIN attempts received (SYN, backup)"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:26
+msgid "Subflow JOIN attempts sent (SYN)"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:35
+msgid "Subflow JOIN completed (ACK)"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:28
+msgid "Subflow JOIN failed: could not bind address"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:29
+msgid "Subflow JOIN failed: could not connect"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:27
+msgid "Subflow JOIN failed: could not create socket"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:261
+msgid "Subflow limit"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:82
+msgid "Subflow priority change received (MP_PRIO)"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:81
+msgid "Subflow priority change sent (MP_PRIO)"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:62
+msgid "Subflows marked stale (possible blackhole)"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:64
+msgid "Subflows removed"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_check.js:40
msgid "Test"
msgstr "Pròva"
-#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:69
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:223
msgid ""
"The number of MPTCP-level retransmission intervals with no traffic and "
-"pending outstanding data on a given subflow required to declare it stale"
+"pending outstanding data on a given subflow required to declare it stale. A "
+"low stale_loss_cnt value allows for fast active-backup switch-over, an high "
+"value maximize links utilization on edge scenarios e.g. lossy link with high "
+"BER or peer pausing the data processing."
msgstr ""
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:914
-msgid "Upload:"
-msgstr "Mandadís :"
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:248
+msgid ""
+"The number of SYN + MP_CAPABLE retransmissions before falling back to TCP, "
+"i.e. dropping the MPTCP options."
+msgstr ""
-#: luci-app-mptcp/luasrc/view/mptcp/mptcp_check.htm:21
-#: luci-app-mptcp/luasrc/view/mptcp/mptcp_connections.htm:21
-#: luci-app-mptcp/luasrc/view/mptcp/mptcp_fullmesh.htm:21
-#: luci-app-mptcp/luasrc/view/mptcp/mptcp_monitor.htm:14
-msgid "Waiting for command to complete..."
-msgstr "En espèra d’una responsa de la comanda..."
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/multipath.js:442
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/multipath.js:570
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/multipath.js:585
+msgid "Total"
+msgstr ""
-#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:112
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/multipath.js:404
+msgid "Total in"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/multipath.js:408
+msgid "Total out"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_dscp_routing.js:143
+msgid "Upload interface"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_dscp_routing.js:164
+msgid ""
+"Used by the *weight MPTCP schedulers (bpf_weight/bpf_weight_rr) and by "
+"mqvpn’s \"Weighted RTT\"/\"Weighted Round Robin\" schedulers -- same value, "
+"applies to both upload and download (mirrored to the gateway automatically). "
+"Unlike the DSCP pins above, weight is a single value per WAN, not per "
+"traffic class."
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:249
+msgid "Userspace"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:152
+msgid "Userspace path manager"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:288
+msgid "Value"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:210
+msgid "WAN"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_dscp_routing.js:163
+msgid "WAN weight"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_check.js:69
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_connections.js:15
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_fullmesh.js:15
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_monitor.js:15
+msgid "Waiting for command to complete…"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:304
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_dscp_routing.js:170
+msgid "Weight"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:118
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_dscp_routing.js:127
+msgid ""
+"When using a DSCP or weight BPF scheduler, also sync each WAN’s pin to the "
+"gateway (VPS) so it also holds for traffic the gateway sends (downloads), "
+"not just traffic the router sends (uploads). Disabling this only stops "
+"future syncs -- it does not remove pins already pushed to the gateway."
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_dscp_routing.js:128
+msgid ""
+"While disabled, the DSCP table below only shows Upload -- Download has no "
+"effect until this is re-enabled and applied."
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:293
msgid "backup"
msgstr "subordinat"
-#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:22
-#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:32
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:76
+msgid "bpf_burst => same as the default scheduler"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:78
+msgid "bpf_first => always picks the first subflow to send data"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:77
+msgid "bpf_red => sends all packets redundantly on all available subflows"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:79
+msgid ""
+"bpf_rr => always picks the next available subflow to send data (round-robin)"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:66
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:82
msgid "default"
msgstr "Defaut"
-#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:14
-#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:17
-#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:20
-#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:82
-#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:93
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:52
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:57
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:62
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:168
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:174
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:180
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:262
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:273
msgid "disable"
msgstr "desactivar"
-#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:110
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:291
msgid "disabled"
msgstr "desactivat"
-#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:13
-#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:16
-#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:19
-#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:81
-#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:92
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:51
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:56
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:61
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:167
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:173
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:179
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:261
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:272
msgid "enable"
msgstr "Activar"
-#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:109
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:290
msgid "enabled"
msgstr "Activat"
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:88
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:314
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:318
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:322
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:372
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:376
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:380
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:681
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:930
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:933
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:936
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:940
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:943
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:946
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/multipath.js:74
msgid "kB/s"
msgstr "kB/s"
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:97
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:314
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:318
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:322
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:372
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:376
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:380
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:690
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:930
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:933
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:936
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:940
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:943
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:946
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/multipath.js:76
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/multipath.js:436
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/multipath.js:446
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/multipath.js:612
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/multipath.js:616
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/multipath.js:620
msgid "kbit/s"
msgstr "kbit/s"
-#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:111
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:292
msgid "master"
msgstr "màger"
-#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:85
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/multipath.js:540
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/multipath.js:541
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/multipath.js:673
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/multipath.js:674
+msgid "minutes window, 1 second interval"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:225
+msgid "missing"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_dscp_routing.js:154
+msgid ""
+"mqvpn has no equivalent: its downlink always mirrors whichever WAN carries "
+"the class on upload, so this field has no effect on mqvpn."
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:265
msgid "ndiffports subflows number"
msgstr "Nombre de jos-flux ndiffports"
-#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:64
-msgid ""
-"specifies the maximum number of ADD_ADDR suboptions accepted for each MPTCP "
-"connection"
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:225
+msgid "registered"
msgstr ""
-#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:59
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:228
+msgid ""
+"specifies the maximum number of ADD_ADDR (add address) suboptions accepted "
+"for each MPTCP connection"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:218
msgid ""
"specifies the maximum number of additional subflows allowed for each MPTCP "
"connection"
msgstr ""
+#~ msgid "(%d minute window, %d second interval)"
+#~ msgstr "(fenèstra de %d minuta,interval de %d segonda)"
+
+#~ msgid "(%d minutes window, %d seconds interval)"
+#~ msgstr "(fenèstra de %d minutas,interval de %d segondas)"
+
+#~ msgid "Average:"
+#~ msgstr "Mejana :"
+
+#~ msgid "Current:"
+#~ msgstr "Actualament :"
+
+#~ msgid "Download:"
+#~ msgstr "Telecargament :"
+
+#~ msgid "Inbound:"
+#~ msgstr "Dintrant :"
+
+#~ msgid "Loading"
+#~ msgstr "Cargament"
+
+#~ msgid ""
+#~ "Networks MPTCP settings. Visit http://multipath-tcp.org/pmwiki.php/"
+#~ "Users/ConfigureMPTCP for help."
+#~ msgstr ""
+#~ "Paramètres ret MPTCP. Consulatz http://multipath-tcp.org/pmwiki.php/"
+#~ "Users/ConfigureMPTCP per d’ajuda."
+
+#~ msgid "Outbound:"
+#~ msgstr "Sortent :"
+
+#~ msgid "Peak:"
+#~ msgstr "Punta :"
+
+#~ msgid "Realtime Traffic"
+#~ msgstr "Trafic dirèct"
+
+#~ msgid "Upload:"
+#~ msgstr "Mandadís :"
+
+#~ msgid "Waiting for command to complete..."
+#~ msgstr "En espèra d’una responsa de la comanda..."
+
#, fuzzy
#~ msgid "BLEST"
#~ msgstr "BLEST"
diff --git a/luci-app-mptcp/po/ru/mptcp.po b/luci-app-mptcp/po/ru/mptcp.po
index ddacab82c..3a56f286f 100644
--- a/luci-app-mptcp/po/ru/mptcp.po
+++ b/luci-app-mptcp/po/ru/mptcp.po
@@ -11,81 +11,381 @@ msgstr ""
"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
"X-Generator: Weblate 4.6.1\n"
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:775
-msgid "(%d minute window, %d second interval)"
-msgstr "(% d минутное окно,% d секундный интервал)"
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_fullmesh.js:26
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_monitor.js:27
+msgid "(no output)"
+msgstr ""
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:241
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:242
-msgid "(%d minutes window, %d seconds interval)"
-msgstr "(% d минутное окно,% d секундный интервал)"
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_dscp_routing.js:45
+msgid "-- not pinned --"
+msgstr ""
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:315
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:318
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:373
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:932
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:942
-msgid "Average:"
-msgstr "Среднее:"
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:133
+msgid "0"
+msgstr ""
-#: luci-app-mptcp/luasrc/controller/mptcp.lua:11
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:134
+msgid "1"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:304
+msgid ""
+"A weight >100 make it more attractive, a weight <100 make it less "
+"attractive. Max 256"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_dscp_routing.js:171
+msgid ""
+"A weight >100 makes a WAN more attractive, a weight <100 makes it less "
+"attractive. Max 256."
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:73
+msgid "ADD_ADDR echo failed to send"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:71
+msgid "ADD_ADDR echo received"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:72
+msgid "ADD_ADDR echo sent"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:74
+msgid "ADD_ADDR received with a port number"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:70
+msgid "ADD_ADDR signals dropped"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:69
+msgid "ADD_ADDR signals failed to send"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:67
+msgid "ADD_ADDR signals received"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:68
+msgid "ADD_ADDR signals sent"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:262
+msgid "Accepted ADD_ADDR limit"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:259
+msgid "Add-addr timeout (s)"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/multipath.js:326
+msgid "All interfaces"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/multipath.js:457
+msgid "All interfaces overlaid, inbound and outbound separately"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/multipath.js:456
+msgid "All interfaces – combined view"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/multipath.js:422
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/multipath.js:615
+msgid "Average"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:75
+msgid "BPF schedulers (not available on all platforms):"
+msgstr ""
+
+#: luci-app-mptcp/root/usr/share/luci/menu.d/luci-app-mptcp.json:47
msgid "Bandwidth"
msgstr "Пропускная способность"
-#: luci-app-mptcp/luasrc/view/mptcp/mptcp_check.htm:43
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:61
+msgid "Blackhole detected on the path"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:238
+msgid "Blackhole timeout"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:258
+msgid "Blackhole timeout (s)"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_dscp_routing.js:13
+msgid "CS0 (0) - Best effort"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_dscp_routing.js:14
+msgid "CS1 (8) - Low priority"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_dscp_routing.js:15
+msgid "CS2 (16) - High priority"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_dscp_routing.js:16
+msgid "CS3 (24) - SIP/signaling"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_dscp_routing.js:17
+msgid "CS4 (32) - Real-time interactive"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_dscp_routing.js:18
+msgid "CS5 (40) - Broadcast video"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_dscp_routing.js:19
+msgid "CS6 (48) - Network control"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_dscp_routing.js:20
+msgid "CS7 (56) - Latency sensitive"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_check.js:48
msgid "Check if MPTCP between interface and server is working."
msgstr "Проверьте, работает ли MPTCP между интерфейсом и сервером."
-#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:52
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:256
+msgid "Checksum"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_dscp_routing.js:109
+msgid ""
+"Choose which WAN carries each DSCP-tagged traffic class -- for the MPTCP "
+"bpf_dscp scheduler and for mqvpn -- and review the per-WAN weight used by "
+"the *weight schedulers on both. This page only edits the pins/weights; pick "
+"the scheduler that actually uses them on the MPTCP and MQVPN pages "
+"themselves."
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:243
+msgid "Close timeout"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:260
+msgid "Close timeout (s)"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:138
msgid "Congestion Control"
msgstr "Контроль перегрузки"
-#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:97
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:277
msgid "Consecutive segments that should be sent for round robin"
msgstr "Последовательные сегменты, которые следует отправлять для round-robin"
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:311
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:314
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:369
-msgid "Current:"
-msgstr "Текущая:"
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:233
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:248
+msgid "Control message timeout"
+msgstr ""
-#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:52
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:23
+msgid "Could not allocate an MPTCP token, fell back to TCP"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:104
+msgid "Couldn't fall back to TCP (connection state didn't allow it)"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:288
+msgid "Counter"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/multipath.js:422
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/multipath.js:611
+msgid "Current"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_dscp_routing.js:108
+#: luci-app-mptcp/root/usr/share/luci/menu.d/luci-app-mptcp.json:36
+msgid "DSCP / Weight Routing"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_dscp_routing.js:139
+msgid "DSCP class"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_dscp_routing.js:134
+msgid "DSCP class pins"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:48
+msgid "DSS corruption detected, fell back to plain TCP"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:49
+msgid "DSS corruption detected, subflow reset"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:53
+msgid "Data checksum errors"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:86
+msgid "Data mapping failures received (MP_FAIL)"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:85
+msgid "Data mapping failures sent (MP_FAIL)"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:50
+msgid "Data sequence mapping did not match TCP sequence numbers"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:47
+msgid "Data sequence mapping did not match the previous one"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:138
msgid "Default is cubic"
msgstr "По умолчанию кубический"
-#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:21
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:65
msgid "Default is fullmesh"
msgstr "По умолчанию - fullmesh"
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:908
-msgid "Download:"
-msgstr "Загрузка:"
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:211
+msgid "Device"
+msgstr ""
-#: luci-app-mptcp/luasrc/view/mptcp/mptcp_check.htm:31
-#: luci-app-mptcp/luasrc/view/mptcp/mptcp_connections.htm:31
-#: luci-app-mptcp/luasrc/view/mptcp/mptcp_fullmesh.htm:31
-#: luci-app-mptcp/luasrc/view/mptcp/mptcp_monitor.htm:24
+#: luci-app-mptcp/root/usr/share/luci/menu.d/luci-app-mptcp.json:25
+msgid "Diagnostics"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:244
+msgid "Disabled"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_dscp_routing.js:151
+msgid "Download interface"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:55
+msgid "Duplicate data segments discarded"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_dscp_routing.js:34
+msgid "EF (46) - Voice"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:177
+msgid "Enable MPTCPd"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:243
+msgid "Enabled"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:214
+msgid "Endpoint flags"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_check.js:72
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_check.js:74
msgid "Error"
msgstr "Ошибка"
-#: luci-app-mptcp/luasrc/controller/mptcp.lua:18
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_connections.js:28
+msgid "Error fetching connections data."
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_fullmesh.js:28
+msgid "Error fetching fullmesh data."
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_monitor.js:29
+msgid "Error fetching monitor data."
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:99
+msgid "Established MPTCP connections (current)"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:263
+msgid "Established MPTCP connections (right now)"
+msgstr ""
+
+#: luci-app-mptcp/root/usr/share/luci/menu.d/luci-app-mptcp.json:58
msgid "Established connections"
msgstr "Установленные соединения"
-#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:91
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:19
+msgid "Fallback to TCP (ACK stripped)"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:18
+msgid "Fallback to TCP (SYN/ACK stripped)"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:88
+msgid "Fastclose received"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:87
+msgid "Fastclose sent"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:102
+msgid "Fell back to TCP: bad or missing data sequence signal"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:101
+msgid "Fell back to TCP: conflicting TCP MD5SIG option"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:100
+msgid "Fell back to TCP: missing data on first established packet"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:103
+msgid "Fell back to TCP: simultaneous connect"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:271
msgid "Fill the congestion window on all subflows for round robin"
msgstr "Заполнение окна перегрузки для всех подпотоков для round-robin"
-#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:74
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:171
+msgid "Force Multipath configuration"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:254
msgid "Fullmesh subflows for each pair of IP addresses"
msgstr "Подпотоки Fullmesh для каждой пары IP-адресов"
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_dscp_routing.js:152
+msgid ""
+"Gateway (VPS) → router. Only takes effect for MPTCP’s bpf_dscp scheduler "
+"(pins the VPS’s own send-side choice via dscp_remote_id) and can be a "
+"different WAN than Upload."
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_dscp_routing.js:124
+msgid "Gateway sync"
+msgstr ""
+
#: luci-app-mptcp/root/usr/share/rpcd/acl.d/luci-app-mptcp.json:3
msgid "Grant UCI access for luci-app-mptcp"
msgstr "Предоставить доступ UCI для luci-app-mptcp"
-#: luci-app-mptcp/luasrc/view/mptcp/mptcp_check.htm:73
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:150
+msgid ""
+"Helps explain why MPTCP might not be aggregating your WANs correctly: "
+"fallback to plain TCP, blackholed/stale subflows, resets, checksum errors, "
+"and WANs that never got an MPTCP endpoint registered at all. Refreshes "
+"automatically every 15 seconds."
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_check.js:60
msgid ""
"If you get \"TCPOptionMPTCPCapable [...] Sender's Key\" at the end, then "
"MPTCP is supported. If there is a \"-TCPOptionMPTCPCapable\", then it's "
@@ -94,235 +394,777 @@ msgstr ""
"Если в конце вы получите «TCPOptionMPTCPCapable [...] Sender's Key», то "
"MPTCP поддерживается. Если \"-TCPOptionMPTCPCapable\", то MPTCP заблокирован."
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:929
-msgid "Inbound:"
-msgstr "Входящий:"
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/multipath.js:693
+msgid "In"
+msgstr ""
-#: luci-app-mptcp/luasrc/view/mptcp/mptcp_check.htm:48
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:248
+msgid "In-kernel"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:151
+msgid "In-kernel path manager"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/multipath.js:634
+msgid "Inbound traffic"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/multipath.js:462
+msgid "Inbound – all interfaces"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:52
+msgid "Infinite mapping received (peer fell back to plain TCP semantics)"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:51
+msgid "Infinite mapping sent (fell back to plain TCP semantics)"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:165
+msgid "Initial MPTCP configuration"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:238
+msgid ""
+"Initial time period in second to disable MPTCP on active MPTCP sockets when "
+"a MPTCP firewall blackhole issue happens. This time period will grow "
+"exponentially when more blackhole issues get detected right after MPTCP is "
+"re-enabled and will reset to the initial value when the blackhole issue goes "
+"away."
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_check.js:52
msgid "Interface"
msgstr "Интерфейс"
-#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:104
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:284
msgid "Interfaces Settings"
msgstr "Настройки интерфейсов"
-#: luci-app-mptcp/luasrc/view/mptcp/mptcp_check.htm:21
-#: luci-app-mptcp/luasrc/view/mptcp/mptcp_connections.htm:21
-#: luci-app-mptcp/luasrc/view/mptcp/mptcp_fullmesh.htm:21
-#: luci-app-mptcp/luasrc/view/mptcp/mptcp_monitor.htm:14
-msgid "Loading"
-msgstr "Загрузка"
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:36
+msgid "JOIN ACK authentication failures"
+msgstr ""
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:93
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:686
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:34
+msgid "JOIN SYN/ACK authentication failures"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:37
+msgid "JOIN attempts with unknown token"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:38
+msgid "JOIN request rejected by the path manager"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:265
+msgid "Kernel MPTCP configuration"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_dscp_routing.js:21
+msgid "LE (1) - Lower effort"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:170
+msgid "Last updated:"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_dscp_routing.js:153
+msgid ""
+"Leave empty to just mirror this row’s Upload interface to the gateway "
+"instead -- the same \"download always follows upload\" behavior mqvpn "
+"already has built in natively."
+msgstr ""
+"Оставьте пустым, чтобы просто отразить интерфейс Upload этой строки на "
+"шлюз -- то же поведение \"скачивание всегда следует за отправкой\", которое "
+"уже встроено в mqvpn."
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/multipath.js:75
msgid "MB/s"
msgstr "MB/s"
-#: luci-app-mptcp/luasrc/controller/mptcp.lua:9
-#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:7
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:46
#: luci-app-mptcp/root/usr/share/luci/menu.d/luci-app-mptcp.json:3
+#: luci-app-mptcp/root/usr/share/luci/menu.d/luci-app-mptcp.json:14
msgid "MPTCP"
msgstr "MPTCP"
-#: luci-app-mptcp/luasrc/controller/mptcp.lua:16
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:148
+msgid "MPTCP Diagnostics"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:142
+msgid "MPTCP Established connections"
+msgstr ""
+
+#: luci-app-mptcp/root/usr/share/luci/menu.d/luci-app-mptcp.json:69
msgid "MPTCP Fullmesh"
msgstr "MPTCP Fullmesh"
-#: luci-app-mptcp/luasrc/controller/mptcp.lua:14
-#: luci-app-mptcp/luasrc/view/mptcp/mptcp_check.htm:42
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:141
+msgid "MPTCP Fullmesh (subflow map)"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:140
+msgid "MPTCP Settings"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_check.js:46
msgid "MPTCP Support Check"
msgstr "Проверка поддержки MPTCP"
-#: luci-app-mptcp/luasrc/controller/mptcp.lua:20
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:253
+msgid "MPTCP enabled"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:213
+msgid "MPTCP endpoint"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:16
+msgid "MPTCP handshake accepted by peer (SYN/ACK)"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:15
+msgid "MPTCP handshake attempts received (SYN)"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:14
+msgid "MPTCP handshake attempts sent (SYN)"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:17
+msgid "MPTCP handshake completed (ACK)"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:21
+msgid "MPTCP handshake disabled client-side after past issues"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:20
+msgid "MPTCP handshake dropped client-side, fell back to TCP"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:277
+msgid "MPTCP kernel counters (since boot)"
+msgstr ""
+
+#: luci-app-mptcp/root/usr/share/luci/menu.d/luci-app-mptcp.json:80
msgid "MPTCP monitoring"
msgstr "Мониторинг MPTCP"
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:102
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:695
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:143
+msgid "MPTCP monitoring (raw kernel counters)"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:22
+msgid "MPTCP rejected on a port-only endpoint"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:90
+msgid "MPTCP resets received"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:89
+msgid "MPTCP resets sent"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:46
+msgid "MPTCP-level retransmissions"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:105
+msgid "MPTCP-level zero-window probes"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:205
+msgid "MPTCPd Address annoucement flags"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:212
+msgid "MPTCPd Address notification flags"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:183
+msgid "MPTCPd path managers"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:194
+msgid "MPTCPd plugins"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:228
+msgid "Max add address"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:218
+msgid "Max subflows"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/multipath.js:77
msgid "Mbit/s"
msgstr "Mbit/s"
-#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:18
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:117
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_dscp_routing.js:126
+msgid "Mirror DSCP/weight pins to gateway"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:212
+msgid "Mode"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:60
msgid "Multipath Debug"
msgstr "Многоуровневая отладка"
-#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:12
-#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:108
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:50
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:289
msgid "Multipath TCP"
msgstr "Многопоточный TCP"
-#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:42
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:126
msgid "Multipath TCP SYN retries"
msgstr "Попытки многопоточной TCP SYN"
-#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:15
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:55
msgid "Multipath TCP checksum"
msgstr "Контрольная сумма многопоточного TCP"
-#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:21
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:65
msgid "Multipath TCP path-manager"
msgstr "Многопоточный TCP менеджер"
-#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:31
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:75
msgid "Multipath TCP scheduler"
msgstr "Планировщик многопоточного TCP"
-#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:47
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:132
#, fuzzy
-#| msgid "Multipath TCP"
msgid "Multipath TCP version"
msgstr "Многопоточный TCP"
-#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:28
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:72
msgid "Netlink"
msgstr "Netlink"
-#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:7
-msgid ""
-"Networks MPTCP settings. Visit http://multipath-tcp.org/pmwiki.php/Users/"
-"ConfigureMPTCP for help."
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:46
+msgid "Networks MPTCP settings."
msgstr ""
-"Настройки сети MPTCP. Посетите http://multipath-tcp.org/pmwiki.php/Users/"
-"ConfigureMPTCP для справки."
-#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:108
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:279
+msgid "No counters available (nstat/multipath -m returned nothing)."
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_connections.js:26
+msgid "No data"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:184
+msgid "No diagnostic data available yet."
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/multipath.js:394
+msgid "No multipath WAN interface is currently available."
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:205
+msgid "No multipath-enabled WAN interfaces found."
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_dscp_routing.js:112
+msgid ""
+"Nothing to show yet: no DSCP scheduler (bpf_dscp) or weight scheduler "
+"(bpf_weight/bpf_weight_rr/bpf_burstweight, or mqvpn’s Weighted RTT/Weighted "
+"Round Robin) is currently selected on the MPTCP or MQVPN pages."
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:289
msgid "One interface must be set as master"
msgstr "Один интерфейс должен быть установлен как главный"
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:939
-msgid "Outbound:"
-msgstr "Отправка:"
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_dscp_routing.js:165
+msgid ""
+"Only WANs with Multipath TCP enabled (the “Multipath TCP” option on the "
+"MPTCP page’s Interfaces Settings) are listed below."
+msgstr ""
+"Ниже перечислены только WAN с включённым Multipath TCP (опция «Multipath "
+"TCP» в разделе «Настройки интерфейсов» страницы MPTCP)."
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:319
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:322
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:377
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:935
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:945
-msgid "Peak:"
-msgstr "Пиковое значение:"
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:304
+msgid ""
+"Only used by *weight schedulers/path managers. Ignored if no weight "
+"scheduler is selected."
+msgstr ""
-#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:80
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:139
+msgid "OpenMPTCProuter Network overview / Status"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/multipath.js:700
+msgid "Out"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:58
+msgid "Out-of-order segments merged"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:57
+msgid "Out-of-order segments queued"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:56
+msgid "Out-of-order segments queued at tail"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/multipath.js:640
+msgid "Outbound traffic"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/multipath.js:468
+msgid "Outbound – all interfaces"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:150
+msgid "Path Manager type"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:254
+msgid "Path manager"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/multipath.js:422
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/multipath.js:619
+msgid "Peak"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:203
+msgid "Per-WAN MPTCP endpoint status"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:78
+msgid "RM_ADDR signals dropped"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:77
+msgid "RM_ADDR signals failed to send"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:75
+msgid "RM_ADDR signals received"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:76
+msgid "RM_ADDR signals sent"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:260
msgid "Re-create fullmesh subflows after a timeout"
msgstr "Повторно создать подпотоки fullmesh после тайм-аута"
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:891
-msgid "Realtime Traffic"
-msgstr "Трафик в реальном времени"
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:95
+msgid "Receive window conflict resolved on update"
+msgstr ""
-#: luci-app-mptcp/luasrc/controller/mptcp.lua:10
-#: luci-app-mptcp/luasrc/view/mptcp/mptcp_check.htm:45
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:94
+msgid "Receive window shared across subflows"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:96
+msgid "Receive window update conflicts"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:137
+msgid "Related pages"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:223
+msgid "Retranmission intervals"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_dscp_routing.js:144
+msgid ""
+"Router → internet. Pins this class to a WAN for MPTCP’s bpf_dscp scheduler "
+"(local dscp_iface map) and, for mqvpn, announces the class on this path’s "
+"DSCP mask via the control API."
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:255
+msgid "Scheduler"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:54
+msgid "Segments received outside the MPTCP mapping window"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:93
+msgid "Send window shared across subflows"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:243
+msgid ""
+"Set the make-after-break timeout: in absence of any close or shutdown "
+"syscall, MPTCP sockets will maintain the status unchanged for such time, "
+"after the last subflow removal, before moving to TCP_CLOSE."
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:233
+msgid ""
+"Set the timeout after which an ADD_ADDR (add address) control message will "
+"be resent to an MPTCP peer that has not acknowledged a previous ADD_ADDR "
+"message."
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_check.js:50
msgid "Settings"
msgstr "Настройки"
-#: luci-app-mptcp/luasrc/view/mptcp/mptcp_check.htm:65
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:257
+msgid "Stale loss count threshold"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:63
+msgid "Stale subflows recovered"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:41
+msgid "Subflow JOIN ACK received on a different port"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:43
+msgid "Subflow JOIN ACK with mismatched port"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:39
+msgid "Subflow JOIN SYN received on a different port"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:42
+msgid "Subflow JOIN SYN with mismatched port"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:40
+msgid "Subflow JOIN SYN/ACK received on a different port"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:32
+msgid "Subflow JOIN accepted by peer (SYN/ACK)"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:33
+msgid "Subflow JOIN accepted by peer (SYN/ACK, backup)"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:30
+msgid "Subflow JOIN attempts received (SYN)"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:31
+msgid "Subflow JOIN attempts received (SYN, backup)"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:26
+msgid "Subflow JOIN attempts sent (SYN)"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:35
+msgid "Subflow JOIN completed (ACK)"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:28
+msgid "Subflow JOIN failed: could not bind address"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:29
+msgid "Subflow JOIN failed: could not connect"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:27
+msgid "Subflow JOIN failed: could not create socket"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:261
+msgid "Subflow limit"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:82
+msgid "Subflow priority change received (MP_PRIO)"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:81
+msgid "Subflow priority change sent (MP_PRIO)"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:62
+msgid "Subflows marked stale (possible blackhole)"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:64
+msgid "Subflows removed"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_check.js:40
msgid "Test"
msgstr "Тест"
-#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:69
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:223
msgid ""
"The number of MPTCP-level retransmission intervals with no traffic and "
-"pending outstanding data on a given subflow required to declare it stale"
+"pending outstanding data on a given subflow required to declare it stale. A "
+"low stale_loss_cnt value allows for fast active-backup switch-over, an high "
+"value maximize links utilization on edge scenarios e.g. lossy link with high "
+"BER or peer pausing the data processing."
msgstr ""
-"Количество интервалов повторной передачи MPTCP без трафика и с ожидающими данными на заданном подпотоке, необходимых для его объявления устаревшим"
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:914
-msgid "Upload:"
-msgstr "Отправка:"
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:248
+msgid ""
+"The number of SYN + MP_CAPABLE retransmissions before falling back to TCP, "
+"i.e. dropping the MPTCP options."
+msgstr ""
-#: luci-app-mptcp/luasrc/view/mptcp/mptcp_check.htm:21
-#: luci-app-mptcp/luasrc/view/mptcp/mptcp_connections.htm:21
-#: luci-app-mptcp/luasrc/view/mptcp/mptcp_fullmesh.htm:21
-#: luci-app-mptcp/luasrc/view/mptcp/mptcp_monitor.htm:14
-msgid "Waiting for command to complete..."
-msgstr "Ожидание завершения команды..."
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/multipath.js:442
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/multipath.js:570
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/multipath.js:585
+msgid "Total"
+msgstr ""
-#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:112
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/multipath.js:404
+msgid "Total in"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/multipath.js:408
+msgid "Total out"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_dscp_routing.js:143
+msgid "Upload interface"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_dscp_routing.js:164
+msgid ""
+"Used by the *weight MPTCP schedulers (bpf_weight/bpf_weight_rr) and by "
+"mqvpn’s \"Weighted RTT\"/\"Weighted Round Robin\" schedulers -- same value, "
+"applies to both upload and download (mirrored to the gateway automatically). "
+"Unlike the DSCP pins above, weight is a single value per WAN, not per "
+"traffic class."
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:249
+msgid "Userspace"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:152
+msgid "Userspace path manager"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:288
+msgid "Value"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:210
+msgid "WAN"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_dscp_routing.js:163
+msgid "WAN weight"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_check.js:69
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_connections.js:15
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_fullmesh.js:15
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_monitor.js:15
+msgid "Waiting for command to complete…"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:304
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_dscp_routing.js:170
+msgid "Weight"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:118
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_dscp_routing.js:127
+msgid ""
+"When using a DSCP or weight BPF scheduler, also sync each WAN’s pin to the "
+"gateway (VPS) so it also holds for traffic the gateway sends (downloads), "
+"not just traffic the router sends (uploads). Disabling this only stops "
+"future syncs -- it does not remove pins already pushed to the gateway."
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_dscp_routing.js:128
+msgid ""
+"While disabled, the DSCP table below only shows Upload -- Download has no "
+"effect until this is re-enabled and applied."
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:293
msgid "backup"
msgstr "Резервирование"
-#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:22
-#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:32
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:76
+msgid "bpf_burst => same as the default scheduler"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:78
+msgid "bpf_first => always picks the first subflow to send data"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:77
+msgid "bpf_red => sends all packets redundantly on all available subflows"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:79
+msgid ""
+"bpf_rr => always picks the next available subflow to send data (round-robin)"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:66
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:82
msgid "default"
msgstr "По умолчанию"
-#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:14
-#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:17
-#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:20
-#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:82
-#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:93
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:52
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:57
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:62
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:168
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:174
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:180
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:262
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:273
msgid "disable"
msgstr "отключить"
-#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:110
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:291
msgid "disabled"
msgstr "отключить"
-#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:13
-#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:16
-#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:19
-#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:81
-#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:92
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:51
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:56
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:61
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:167
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:173
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:179
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:261
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:272
msgid "enable"
msgstr "включить"
-#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:109
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:290
msgid "enabled"
msgstr "Установлено"
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:88
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:314
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:318
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:322
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:372
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:376
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:380
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:681
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:930
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:933
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:936
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:940
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:943
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:946
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/multipath.js:74
msgid "kB/s"
msgstr "kB/s"
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:97
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:314
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:318
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:322
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:372
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:376
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:380
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:690
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:930
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:933
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:936
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:940
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:943
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:946
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/multipath.js:76
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/multipath.js:436
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/multipath.js:446
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/multipath.js:612
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/multipath.js:616
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/multipath.js:620
msgid "kbit/s"
msgstr "kbit/s"
-#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:111
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:292
msgid "master"
msgstr "мастер"
-#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:85
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/multipath.js:540
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/multipath.js:541
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/multipath.js:673
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/multipath.js:674
+msgid "minutes window, 1 second interval"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:225
+msgid "missing"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_dscp_routing.js:154
+msgid ""
+"mqvpn has no equivalent: its downlink always mirrors whichever WAN carries "
+"the class on upload, so this field has no effect on mqvpn."
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:265
msgid "ndiffports subflows number"
msgstr "количество подпотоков ndiffports"
-#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:64
-msgid ""
-"specifies the maximum number of ADD_ADDR suboptions accepted for each MPTCP "
-"connection"
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:225
+msgid "registered"
msgstr ""
-"задаёт максимальное количество подопций ADD_ADDR, принимаемых для каждого соединения MPTCP"
-#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:59
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:228
+msgid ""
+"specifies the maximum number of ADD_ADDR (add address) suboptions accepted "
+"for each MPTCP connection"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:218
msgid ""
"specifies the maximum number of additional subflows allowed for each MPTCP "
"connection"
msgstr ""
-"задаёт максимальное количество дополнительных подпотоков, разрешённых для каждого соединения MPTCP"
+"задаёт максимальное количество дополнительных подпотоков, разрешённых для "
+"каждого соединения MPTCP"
+
+#~ msgid "(%d minute window, %d second interval)"
+#~ msgstr "(% d минутное окно,% d секундный интервал)"
+
+#~ msgid "(%d minutes window, %d seconds interval)"
+#~ msgstr "(% d минутное окно,% d секундный интервал)"
+
+#~ msgid "Average:"
+#~ msgstr "Среднее:"
+
+#~ msgid "Current:"
+#~ msgstr "Текущая:"
+
+#~ msgid "Download:"
+#~ msgstr "Загрузка:"
+
+#~ msgid "Inbound:"
+#~ msgstr "Входящий:"
+
+#~ msgid "Loading"
+#~ msgstr "Загрузка"
+
+#~ msgid ""
+#~ "Networks MPTCP settings. Visit http://multipath-tcp.org/pmwiki.php/"
+#~ "Users/ConfigureMPTCP for help."
+#~ msgstr ""
+#~ "Настройки сети MPTCP. Посетите http://multipath-tcp.org/pmwiki.php/"
+#~ "Users/ConfigureMPTCP для справки."
+
+#~ msgid "Outbound:"
+#~ msgstr "Отправка:"
+
+#~ msgid "Peak:"
+#~ msgstr "Пиковое значение:"
+
+#~ msgid "Realtime Traffic"
+#~ msgstr "Трафик в реальном времени"
+
+#~ msgid ""
+#~ "The number of MPTCP-level retransmission intervals with no traffic and "
+#~ "pending outstanding data on a given subflow required to declare it stale"
+#~ msgstr ""
+#~ "Количество интервалов повторной передачи MPTCP без трафика и с ожидающими "
+#~ "данными на заданном подпотоке, необходимых для его объявления устаревшим"
+
+#~ msgid "Upload:"
+#~ msgstr "Отправка:"
+
+#~ msgid "Waiting for command to complete..."
+#~ msgstr "Ожидание завершения команды..."
+
+#~ msgid ""
+#~ "specifies the maximum number of ADD_ADDR suboptions accepted for each "
+#~ "MPTCP connection"
+#~ msgstr ""
+#~ "задаёт максимальное количество подопций ADD_ADDR, принимаемых для каждого "
+#~ "соединения MPTCP"
diff --git a/luci-app-mptcp/po/templates/mptcp.pot b/luci-app-mptcp/po/templates/mptcp.pot
index d53508f13..3107b03d7 100644
--- a/luci-app-mptcp/po/templates/mptcp.pot
+++ b/luci-app-mptcp/po/templates/mptcp.pot
@@ -1,8 +1,8 @@
msgid ""
msgstr ""
"Project-Id-Version: luci-app-mptcp\n"
-"POT-Creation-Date: 2026-04-10 00:00+0000\n"
-"PO-Revision-Date: 2026-04-10 00:00+0000\n"
+"POT-Creation-Date: 2026-08-16 00:00+0000\n"
+"PO-Revision-Date: 2026-08-16 00:00+0000\n"
"Last-Translator: \n"
"Language-Team: \n"
"Language: en\n"
@@ -10,351 +10,911 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:775
-msgid "(%d minute window, %d second interval)"
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_fullmesh.js:26
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_monitor.js:27
+msgid "(no output)"
msgstr ""
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:241
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:242
-msgid "(%d minutes window, %d seconds interval)"
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_dscp_routing.js:45
+msgid "-- not pinned --"
msgstr ""
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:315
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:318
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:373
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:932
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:942
-msgid "Average:"
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:133
+msgid "0"
msgstr ""
-#: luci-app-mptcp/luasrc/controller/mptcp.lua:11
-msgid "Bandwidth"
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:134
+msgid "1"
msgstr ""
-#: luci-app-mptcp/luasrc/view/mptcp/mptcp_check.htm:43
-msgid "Check if MPTCP between interface and server is working."
-msgstr ""
-
-#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:52
-msgid "Congestion Control"
-msgstr ""
-
-#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:97
-msgid "Consecutive segments that should be sent for round robin"
-msgstr ""
-
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:311
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:314
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:369
-msgid "Current:"
-msgstr ""
-
-#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:52
-msgid "Default is cubic"
-msgstr ""
-
-#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:21
-msgid "Default is fullmesh"
-msgstr ""
-
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:908
-msgid "Download:"
-msgstr ""
-
-#: luci-app-mptcp/luasrc/view/mptcp/mptcp_check.htm:31
-#: luci-app-mptcp/luasrc/view/mptcp/mptcp_connections.htm:31
-#: luci-app-mptcp/luasrc/view/mptcp/mptcp_fullmesh.htm:31
-#: luci-app-mptcp/luasrc/view/mptcp/mptcp_monitor.htm:24
-msgid "Error"
-msgstr ""
-
-#: luci-app-mptcp/luasrc/controller/mptcp.lua:18
-msgid "Established connections"
-msgstr ""
-
-#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:91
-msgid "Fill the congestion window on all subflows for round robin"
-msgstr ""
-
-#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:74
-msgid "Fullmesh subflows for each pair of IP addresses"
-msgstr ""
-
-#: luci-app-mptcp/root/usr/share/rpcd/acl.d/luci-app-mptcp.json:3
-msgid "Grant UCI access for luci-app-mptcp"
-msgstr ""
-
-#: luci-app-mptcp/luasrc/view/mptcp/mptcp_check.htm:73
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:304
msgid ""
-"If you get \"TCPOptionMPTCPCapable [...] Sender's Key\" at the end, then "
-"MPTCP is supported. If there is a \"-TCPOptionMPTCPCapable\", then it's "
-"blocked."
+"A weight >100 make it more attractive, a weight <100 make it less "
+"attractive. Max 256"
msgstr ""
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:929
-msgid "Inbound:"
-msgstr ""
-
-#: luci-app-mptcp/luasrc/view/mptcp/mptcp_check.htm:48
-msgid "Interface"
-msgstr ""
-
-#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:104
-msgid "Interfaces Settings"
-msgstr ""
-
-#: luci-app-mptcp/luasrc/view/mptcp/mptcp_check.htm:21
-#: luci-app-mptcp/luasrc/view/mptcp/mptcp_connections.htm:21
-#: luci-app-mptcp/luasrc/view/mptcp/mptcp_fullmesh.htm:21
-#: luci-app-mptcp/luasrc/view/mptcp/mptcp_monitor.htm:14
-msgid "Loading"
-msgstr ""
-
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:93
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:686
-msgid "MB/s"
-msgstr ""
-
-#: luci-app-mptcp/luasrc/controller/mptcp.lua:9
-#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:7
-#: luci-app-mptcp/root/usr/share/luci/menu.d/luci-app-mptcp.json:3
-msgid "MPTCP"
-msgstr ""
-
-#: luci-app-mptcp/luasrc/controller/mptcp.lua:16
-msgid "MPTCP Fullmesh"
-msgstr ""
-
-#: luci-app-mptcp/luasrc/controller/mptcp.lua:14
-#: luci-app-mptcp/luasrc/view/mptcp/mptcp_check.htm:42
-msgid "MPTCP Support Check"
-msgstr ""
-
-#: luci-app-mptcp/luasrc/controller/mptcp.lua:20
-msgid "MPTCP monitoring"
-msgstr ""
-
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:102
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:695
-msgid "Mbit/s"
-msgstr ""
-
-#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:18
-msgid "Multipath Debug"
-msgstr ""
-
-#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:12
-#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:108
-msgid "Multipath TCP"
-msgstr ""
-
-#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:42
-msgid "Multipath TCP SYN retries"
-msgstr ""
-
-#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:15
-msgid "Multipath TCP checksum"
-msgstr ""
-
-#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:21
-msgid "Multipath TCP path-manager"
-msgstr ""
-
-#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:31
-msgid "Multipath TCP scheduler"
-msgstr ""
-
-#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:47
-msgid "Multipath TCP version"
-msgstr ""
-
-#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:28
-msgid "Netlink"
-msgstr ""
-
-#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:7
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_dscp_routing.js:171
msgid ""
-"Networks MPTCP settings. Visit http://multipath-tcp.org/pmwiki.php/Users/"
-"ConfigureMPTCP for help."
+"A weight >100 makes a WAN more attractive, a weight <100 makes it less "
+"attractive. Max 256."
msgstr ""
-#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:108
-msgid "One interface must be set as master"
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:73
+msgid "ADD_ADDR echo failed to send"
msgstr ""
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:939
-msgid "Outbound:"
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:71
+msgid "ADD_ADDR echo received"
msgstr ""
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:319
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:322
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:377
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:935
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:945
-msgid "Peak:"
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:72
+msgid "ADD_ADDR echo sent"
msgstr ""
-#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:80
-msgid "Re-create fullmesh subflows after a timeout"
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:74
+msgid "ADD_ADDR received with a port number"
msgstr ""
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:891
-msgid "Realtime Traffic"
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:70
+msgid "ADD_ADDR signals dropped"
msgstr ""
-#: luci-app-mptcp/luasrc/controller/mptcp.lua:10
-#: luci-app-mptcp/luasrc/view/mptcp/mptcp_check.htm:45
-msgid "Settings"
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:69
+msgid "ADD_ADDR signals failed to send"
msgstr ""
-#: luci-app-mptcp/luasrc/view/mptcp/mptcp_check.htm:65
-msgid "Test"
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:67
+msgid "ADD_ADDR signals received"
msgstr ""
-#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:69
-msgid ""
-"The number of MPTCP-level retransmission intervals with no traffic and "
-"pending outstanding data on a given subflow required to declare it stale"
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:68
+msgid "ADD_ADDR signals sent"
msgstr ""
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:914
-msgid "Upload:"
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:262
+msgid "Accepted ADD_ADDR limit"
msgstr ""
-#: luci-app-mptcp/luasrc/view/mptcp/mptcp_check.htm:21
-#: luci-app-mptcp/luasrc/view/mptcp/mptcp_connections.htm:21
-#: luci-app-mptcp/luasrc/view/mptcp/mptcp_fullmesh.htm:21
-#: luci-app-mptcp/luasrc/view/mptcp/mptcp_monitor.htm:14
-msgid "Waiting for command to complete..."
-msgstr ""
-
-#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:112
-msgid "backup"
-msgstr ""
-
-#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:22
-#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:32
-msgid "default"
-msgstr ""
-
-#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:14
-#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:17
-#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:20
-#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:82
-#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:93
-msgid "disable"
-msgstr ""
-
-#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:110
-msgid "disabled"
-msgstr ""
-
-#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:13
-#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:16
-#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:19
-#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:81
-#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:92
-msgid "enable"
-msgstr ""
-
-#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:109
-msgid "enabled"
-msgstr ""
-
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:88
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:314
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:318
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:322
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:372
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:376
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:380
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:681
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:930
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:933
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:936
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:940
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:943
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:946
-msgid "kB/s"
-msgstr ""
-
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:97
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:314
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:318
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:322
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:372
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:376
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:380
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:690
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:930
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:933
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:936
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:940
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:943
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:946
-msgid "kbit/s"
-msgstr ""
-
-#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:111
-msgid "master"
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:259
+msgid "Add-addr timeout (s)"
msgstr ""
#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/multipath.js:326
msgid "All interfaces"
msgstr ""
-#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/multipath.js:456
-msgid "All interfaces – combined view"
-msgstr ""
-
#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/multipath.js:457
msgid "All interfaces overlaid, inbound and outbound separately"
msgstr ""
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/multipath.js:456
+msgid "All interfaces – combined view"
+msgstr ""
+
#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/multipath.js:422
#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/multipath.js:615
msgid "Average"
msgstr ""
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:75
+msgid "BPF schedulers (not available on all platforms):"
+msgstr ""
+
+#: luci-app-mptcp/root/usr/share/luci/menu.d/luci-app-mptcp.json:47
+msgid "Bandwidth"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:61
+msgid "Blackhole detected on the path"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:238
+msgid "Blackhole timeout"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:258
+msgid "Blackhole timeout (s)"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_dscp_routing.js:13
+msgid "CS0 (0) - Best effort"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_dscp_routing.js:14
+msgid "CS1 (8) - Low priority"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_dscp_routing.js:15
+msgid "CS2 (16) - High priority"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_dscp_routing.js:16
+msgid "CS3 (24) - SIP/signaling"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_dscp_routing.js:17
+msgid "CS4 (32) - Real-time interactive"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_dscp_routing.js:18
+msgid "CS5 (40) - Broadcast video"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_dscp_routing.js:19
+msgid "CS6 (48) - Network control"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_dscp_routing.js:20
+msgid "CS7 (56) - Latency sensitive"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_check.js:48
+msgid "Check if MPTCP between interface and server is working."
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:256
+msgid "Checksum"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_dscp_routing.js:109
+msgid ""
+"Choose which WAN carries each DSCP-tagged traffic class -- for the MPTCP "
+"bpf_dscp scheduler and for mqvpn -- and review the per-WAN weight used by "
+"the *weight schedulers on both. This page only edits the pins/weights; pick "
+"the scheduler that actually uses them on the MPTCP and MQVPN pages "
+"themselves."
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:243
+msgid "Close timeout"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:260
+msgid "Close timeout (s)"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:138
+msgid "Congestion Control"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:277
+msgid "Consecutive segments that should be sent for round robin"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:233
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:248
+msgid "Control message timeout"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:23
+msgid "Could not allocate an MPTCP token, fell back to TCP"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:104
+msgid "Couldn't fall back to TCP (connection state didn't allow it)"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:288
+msgid "Counter"
+msgstr ""
+
#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/multipath.js:422
#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/multipath.js:611
msgid "Current"
msgstr ""
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_dscp_routing.js:108
+#: luci-app-mptcp/root/usr/share/luci/menu.d/luci-app-mptcp.json:36
+msgid "DSCP / Weight Routing"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_dscp_routing.js:139
+msgid "DSCP class"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_dscp_routing.js:134
+msgid "DSCP class pins"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:48
+msgid "DSS corruption detected, fell back to plain TCP"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:49
+msgid "DSS corruption detected, subflow reset"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:53
+msgid "Data checksum errors"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:86
+msgid "Data mapping failures received (MP_FAIL)"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:85
+msgid "Data mapping failures sent (MP_FAIL)"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:50
+msgid "Data sequence mapping did not match TCP sequence numbers"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:47
+msgid "Data sequence mapping did not match the previous one"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:138
+msgid "Default is cubic"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:65
+msgid "Default is fullmesh"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:211
+msgid "Device"
+msgstr ""
+
+#: luci-app-mptcp/root/usr/share/luci/menu.d/luci-app-mptcp.json:25
+msgid "Diagnostics"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:244
+msgid "Disabled"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_dscp_routing.js:151
+msgid "Download interface"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:55
+msgid "Duplicate data segments discarded"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_dscp_routing.js:34
+msgid "EF (46) - Voice"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:177
+msgid "Enable MPTCPd"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:243
+msgid "Enabled"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:214
+msgid "Endpoint flags"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_check.js:72
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_check.js:74
+msgid "Error"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_connections.js:28
+msgid "Error fetching connections data."
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_fullmesh.js:28
+msgid "Error fetching fullmesh data."
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_monitor.js:29
+msgid "Error fetching monitor data."
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:99
+msgid "Established MPTCP connections (current)"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:263
+msgid "Established MPTCP connections (right now)"
+msgstr ""
+
+#: luci-app-mptcp/root/usr/share/luci/menu.d/luci-app-mptcp.json:58
+msgid "Established connections"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:19
+msgid "Fallback to TCP (ACK stripped)"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:18
+msgid "Fallback to TCP (SYN/ACK stripped)"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:88
+msgid "Fastclose received"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:87
+msgid "Fastclose sent"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:102
+msgid "Fell back to TCP: bad or missing data sequence signal"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:101
+msgid "Fell back to TCP: conflicting TCP MD5SIG option"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:100
+msgid "Fell back to TCP: missing data on first established packet"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:103
+msgid "Fell back to TCP: simultaneous connect"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:271
+msgid "Fill the congestion window on all subflows for round robin"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:171
+msgid "Force Multipath configuration"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:254
+msgid "Fullmesh subflows for each pair of IP addresses"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_dscp_routing.js:152
+msgid ""
+"Gateway (VPS) → router. Only takes effect for MPTCP’s bpf_dscp scheduler "
+"(pins the VPS’s own send-side choice via dscp_remote_id) and can be a "
+"different WAN than Upload."
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_dscp_routing.js:124
+msgid "Gateway sync"
+msgstr ""
+
+#: luci-app-mptcp/root/usr/share/rpcd/acl.d/luci-app-mptcp.json:3
+msgid "Grant UCI access for luci-app-mptcp"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:150
+msgid ""
+"Helps explain why MPTCP might not be aggregating your WANs correctly: "
+"fallback to plain TCP, blackholed/stale subflows, resets, checksum errors, "
+"and WANs that never got an MPTCP endpoint registered at all. Refreshes "
+"automatically every 15 seconds."
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_check.js:60
+msgid ""
+"If you get \"TCPOptionMPTCPCapable [...] Sender's Key\" at the end, then "
+"MPTCP is supported. If there is a \"-TCPOptionMPTCPCapable\", then it's "
+"blocked."
+msgstr ""
+
#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/multipath.js:693
msgid "In"
msgstr ""
-#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/multipath.js:462
-msgid "Inbound – all interfaces"
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:248
+msgid "In-kernel"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:151
+msgid "In-kernel path manager"
msgstr ""
#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/multipath.js:634
msgid "Inbound traffic"
msgstr ""
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/multipath.js:462
+msgid "Inbound – all interfaces"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:52
+msgid "Infinite mapping received (peer fell back to plain TCP semantics)"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:51
+msgid "Infinite mapping sent (fell back to plain TCP semantics)"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:165
+msgid "Initial MPTCP configuration"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:238
+msgid ""
+"Initial time period in second to disable MPTCP on active MPTCP sockets when "
+"a MPTCP firewall blackhole issue happens. This time period will grow "
+"exponentially when more blackhole issues get detected right after MPTCP is "
+"re-enabled and will reset to the initial value when the blackhole issue goes "
+"away."
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_check.js:52
+msgid "Interface"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:284
+msgid "Interfaces Settings"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:36
+msgid "JOIN ACK authentication failures"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:34
+msgid "JOIN SYN/ACK authentication failures"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:37
+msgid "JOIN attempts with unknown token"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:38
+msgid "JOIN request rejected by the path manager"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:265
+msgid "Kernel MPTCP configuration"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_dscp_routing.js:21
+msgid "LE (1) - Lower effort"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:170
+msgid "Last updated:"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_dscp_routing.js:153
+msgid ""
+"Leave empty to just mirror this row’s Upload interface to the gateway "
+"instead -- the same \"download always follows upload\" behavior mqvpn "
+"already has built in natively."
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/multipath.js:75
+msgid "MB/s"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:46
+#: luci-app-mptcp/root/usr/share/luci/menu.d/luci-app-mptcp.json:3
+#: luci-app-mptcp/root/usr/share/luci/menu.d/luci-app-mptcp.json:14
+msgid "MPTCP"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:148
+msgid "MPTCP Diagnostics"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:142
+msgid "MPTCP Established connections"
+msgstr ""
+
+#: luci-app-mptcp/root/usr/share/luci/menu.d/luci-app-mptcp.json:69
+msgid "MPTCP Fullmesh"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:141
+msgid "MPTCP Fullmesh (subflow map)"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:140
+msgid "MPTCP Settings"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_check.js:46
+msgid "MPTCP Support Check"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:253
+msgid "MPTCP enabled"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:213
+msgid "MPTCP endpoint"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:16
+msgid "MPTCP handshake accepted by peer (SYN/ACK)"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:15
+msgid "MPTCP handshake attempts received (SYN)"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:14
+msgid "MPTCP handshake attempts sent (SYN)"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:17
+msgid "MPTCP handshake completed (ACK)"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:21
+msgid "MPTCP handshake disabled client-side after past issues"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:20
+msgid "MPTCP handshake dropped client-side, fell back to TCP"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:277
+msgid "MPTCP kernel counters (since boot)"
+msgstr ""
+
+#: luci-app-mptcp/root/usr/share/luci/menu.d/luci-app-mptcp.json:80
+msgid "MPTCP monitoring"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:143
+msgid "MPTCP monitoring (raw kernel counters)"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:22
+msgid "MPTCP rejected on a port-only endpoint"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:90
+msgid "MPTCP resets received"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:89
+msgid "MPTCP resets sent"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:46
+msgid "MPTCP-level retransmissions"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:105
+msgid "MPTCP-level zero-window probes"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:205
+msgid "MPTCPd Address annoucement flags"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:212
+msgid "MPTCPd Address notification flags"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:183
+msgid "MPTCPd path managers"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:194
+msgid "MPTCPd plugins"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:228
+msgid "Max add address"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:218
+msgid "Max subflows"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/multipath.js:77
+msgid "Mbit/s"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:117
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_dscp_routing.js:126
+msgid "Mirror DSCP/weight pins to gateway"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:212
+msgid "Mode"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:60
+msgid "Multipath Debug"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:50
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:289
+msgid "Multipath TCP"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:126
+msgid "Multipath TCP SYN retries"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:55
+msgid "Multipath TCP checksum"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:65
+msgid "Multipath TCP path-manager"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:75
+msgid "Multipath TCP scheduler"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:132
+msgid "Multipath TCP version"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:72
+msgid "Netlink"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:46
+msgid "Networks MPTCP settings."
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:279
+msgid "No counters available (nstat/multipath -m returned nothing)."
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_connections.js:26
+msgid "No data"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:184
+msgid "No diagnostic data available yet."
+msgstr ""
+
#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/multipath.js:394
msgid "No multipath WAN interface is currently available."
msgstr ""
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:205
+msgid "No multipath-enabled WAN interfaces found."
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_dscp_routing.js:112
+msgid ""
+"Nothing to show yet: no DSCP scheduler (bpf_dscp) or weight scheduler "
+"(bpf_weight/bpf_weight_rr/bpf_burstweight, or mqvpn’s Weighted RTT/Weighted "
+"Round Robin) is currently selected on the MPTCP or MQVPN pages."
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:289
+msgid "One interface must be set as master"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_dscp_routing.js:165
+msgid ""
+"Only WANs with Multipath TCP enabled (the “Multipath TCP” option on the "
+"MPTCP page’s Interfaces Settings) are listed below."
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:304
+msgid ""
+"Only used by *weight schedulers/path managers. Ignored if no weight "
+"scheduler is selected."
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:139
+msgid "OpenMPTCProuter Network overview / Status"
+msgstr ""
+
#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/multipath.js:700
msgid "Out"
msgstr ""
-#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/multipath.js:468
-msgid "Outbound – all interfaces"
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:58
+msgid "Out-of-order segments merged"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:57
+msgid "Out-of-order segments queued"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:56
+msgid "Out-of-order segments queued at tail"
msgstr ""
#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/multipath.js:640
msgid "Outbound traffic"
msgstr ""
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/multipath.js:468
+msgid "Outbound – all interfaces"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:150
+msgid "Path Manager type"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:254
+msgid "Path manager"
+msgstr ""
+
#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/multipath.js:422
#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/multipath.js:619
msgid "Peak"
msgstr ""
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:203
+msgid "Per-WAN MPTCP endpoint status"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:78
+msgid "RM_ADDR signals dropped"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:77
+msgid "RM_ADDR signals failed to send"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:75
+msgid "RM_ADDR signals received"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:76
+msgid "RM_ADDR signals sent"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:260
+msgid "Re-create fullmesh subflows after a timeout"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:95
+msgid "Receive window conflict resolved on update"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:94
+msgid "Receive window shared across subflows"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:96
+msgid "Receive window update conflicts"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:137
+msgid "Related pages"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:223
+msgid "Retranmission intervals"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_dscp_routing.js:144
+msgid ""
+"Router → internet. Pins this class to a WAN for MPTCP’s bpf_dscp scheduler "
+"(local dscp_iface map) and, for mqvpn, announces the class on this path’s "
+"DSCP mask via the control API."
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:255
+msgid "Scheduler"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:54
+msgid "Segments received outside the MPTCP mapping window"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:93
+msgid "Send window shared across subflows"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:243
+msgid ""
+"Set the make-after-break timeout: in absence of any close or shutdown "
+"syscall, MPTCP sockets will maintain the status unchanged for such time, "
+"after the last subflow removal, before moving to TCP_CLOSE."
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:233
+msgid ""
+"Set the timeout after which an ADD_ADDR (add address) control message will "
+"be resent to an MPTCP peer that has not acknowledged a previous ADD_ADDR "
+"message."
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_check.js:50
+msgid "Settings"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:257
+msgid "Stale loss count threshold"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:63
+msgid "Stale subflows recovered"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:41
+msgid "Subflow JOIN ACK received on a different port"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:43
+msgid "Subflow JOIN ACK with mismatched port"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:39
+msgid "Subflow JOIN SYN received on a different port"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:42
+msgid "Subflow JOIN SYN with mismatched port"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:40
+msgid "Subflow JOIN SYN/ACK received on a different port"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:32
+msgid "Subflow JOIN accepted by peer (SYN/ACK)"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:33
+msgid "Subflow JOIN accepted by peer (SYN/ACK, backup)"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:30
+msgid "Subflow JOIN attempts received (SYN)"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:31
+msgid "Subflow JOIN attempts received (SYN, backup)"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:26
+msgid "Subflow JOIN attempts sent (SYN)"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:35
+msgid "Subflow JOIN completed (ACK)"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:28
+msgid "Subflow JOIN failed: could not bind address"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:29
+msgid "Subflow JOIN failed: could not connect"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:27
+msgid "Subflow JOIN failed: could not create socket"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:261
+msgid "Subflow limit"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:82
+msgid "Subflow priority change received (MP_PRIO)"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:81
+msgid "Subflow priority change sent (MP_PRIO)"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:62
+msgid "Subflows marked stale (possible blackhole)"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:64
+msgid "Subflows removed"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_check.js:40
+msgid "Test"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:223
+msgid ""
+"The number of MPTCP-level retransmission intervals with no traffic and "
+"pending outstanding data on a given subflow required to declare it stale. A "
+"low stale_loss_cnt value allows for fast active-backup switch-over, an high "
+"value maximize links utilization on edge scenarios e.g. lossy link with high "
+"BER or peer pausing the data processing."
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:248
+msgid ""
+"The number of SYN + MP_CAPABLE retransmissions before falling back to TCP, "
+"i.e. dropping the MPTCP options."
+msgstr ""
+
#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/multipath.js:442
#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/multipath.js:570
#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/multipath.js:585
@@ -369,6 +929,139 @@ msgstr ""
msgid "Total out"
msgstr ""
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_dscp_routing.js:143
+msgid "Upload interface"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_dscp_routing.js:164
+msgid ""
+"Used by the *weight MPTCP schedulers (bpf_weight/bpf_weight_rr) and by "
+"mqvpn’s \"Weighted RTT\"/\"Weighted Round Robin\" schedulers -- same value, "
+"applies to both upload and download (mirrored to the gateway automatically). "
+"Unlike the DSCP pins above, weight is a single value per WAN, not per "
+"traffic class."
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:249
+msgid "Userspace"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:152
+msgid "Userspace path manager"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:288
+msgid "Value"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:210
+msgid "WAN"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_dscp_routing.js:163
+msgid "WAN weight"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_check.js:69
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_connections.js:15
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_fullmesh.js:15
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_monitor.js:15
+msgid "Waiting for command to complete…"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:304
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_dscp_routing.js:170
+msgid "Weight"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:118
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_dscp_routing.js:127
+msgid ""
+"When using a DSCP or weight BPF scheduler, also sync each WAN’s pin to the "
+"gateway (VPS) so it also holds for traffic the gateway sends (downloads), "
+"not just traffic the router sends (uploads). Disabling this only stops "
+"future syncs -- it does not remove pins already pushed to the gateway."
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_dscp_routing.js:128
+msgid ""
+"While disabled, the DSCP table below only shows Upload -- Download has no "
+"effect until this is re-enabled and applied."
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:293
+msgid "backup"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:76
+msgid "bpf_burst => same as the default scheduler"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:78
+msgid "bpf_first => always picks the first subflow to send data"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:77
+msgid "bpf_red => sends all packets redundantly on all available subflows"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:79
+msgid ""
+"bpf_rr => always picks the next available subflow to send data (round-robin)"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:66
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:82
+msgid "default"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:52
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:57
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:62
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:168
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:174
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:180
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:262
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:273
+msgid "disable"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:291
+msgid "disabled"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:51
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:56
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:61
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:167
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:173
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:179
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:261
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:272
+msgid "enable"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:290
+msgid "enabled"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/multipath.js:74
+msgid "kB/s"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/multipath.js:76
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/multipath.js:436
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/multipath.js:446
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/multipath.js:612
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/multipath.js:616
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/multipath.js:620
+msgid "kbit/s"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:292
+msgid "master"
+msgstr ""
+
#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/multipath.js:540
#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/multipath.js:541
#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/multipath.js:673
@@ -376,17 +1069,31 @@ msgstr ""
msgid "minutes window, 1 second interval"
msgstr ""
-#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:85
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:225
+msgid "missing"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_dscp_routing.js:154
+msgid ""
+"mqvpn has no equivalent: its downlink always mirrors whichever WAN carries "
+"the class on upload, so this field has no effect on mqvpn."
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:265
msgid "ndiffports subflows number"
msgstr ""
-#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:64
-msgid ""
-"specifies the maximum number of ADD_ADDR suboptions accepted for each MPTCP "
-"connection"
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:225
+msgid "registered"
msgstr ""
-#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:59
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:228
+msgid ""
+"specifies the maximum number of ADD_ADDR (add address) suboptions accepted "
+"for each MPTCP connection"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:218
msgid ""
"specifies the maximum number of additional subflows allowed for each MPTCP "
"connection"
diff --git a/luci-app-mptcp/po/zh_Hans/mptcp.po b/luci-app-mptcp/po/zh_Hans/mptcp.po
index 044629688..4409fb983 100644
--- a/luci-app-mptcp/po/zh_Hans/mptcp.po
+++ b/luci-app-mptcp/po/zh_Hans/mptcp.po
@@ -10,371 +10,917 @@ msgstr ""
"Plural-Forms: nplurals=1; plural=0;\n"
"X-Generator: Weblate 4.10.1\n"
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:775
-msgid "(%d minute window, %d second interval)"
-msgstr "(%d 分钟刷新, %d 秒钟刷新)"
-
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:241
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:242
-msgid "(%d minutes window, %d seconds interval)"
-msgstr "(%d 分钟间隔, %d 秒钟刷新)"
-
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:315
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:318
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:373
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:932
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:942
-msgid "Average:"
-msgstr "平均:"
-
-#: luci-app-mptcp/luasrc/controller/mptcp.lua:11
-msgid "Bandwidth"
-msgstr "带宽"
-
-#: luci-app-mptcp/luasrc/view/mptcp/mptcp_check.htm:43
-msgid "Check if MPTCP between interface and server is working."
-msgstr "检查接口和服务器之间的MPTCP是否正常工作."
-
-#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:52
-msgid "Congestion Control"
-msgstr "阻塞控制"
-
-#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:97
-msgid "Consecutive segments that should be sent for round robin"
-msgstr "连续轮播应发送的连续段"
-
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:311
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:314
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:369
-msgid "Current:"
-msgstr "实时:"
-
-#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:52
-msgid "Default is cubic"
-msgstr "默认设置 cubic"
-
-#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:21
-msgid "Default is fullmesh"
-msgstr "默认设置fullmesh"
-
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:908
-msgid "Download:"
-msgstr "下载:"
-
-#: luci-app-mptcp/luasrc/view/mptcp/mptcp_check.htm:31
-#: luci-app-mptcp/luasrc/view/mptcp/mptcp_connections.htm:31
-#: luci-app-mptcp/luasrc/view/mptcp/mptcp_fullmesh.htm:31
-#: luci-app-mptcp/luasrc/view/mptcp/mptcp_monitor.htm:24
-msgid "Error"
-msgstr "错误"
-
-#: luci-app-mptcp/luasrc/controller/mptcp.lua:18
-msgid "Established connections"
-msgstr "建立的连接"
-
-#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:91
-msgid "Fill the congestion window on all subflows for round robin"
-msgstr "在循环的所有子流上填充拥塞窗口"
-
-#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:74
-msgid "Fullmesh subflows for each pair of IP addresses"
-msgstr "每对IP地址的全网格子流"
-
-#: luci-app-mptcp/root/usr/share/rpcd/acl.d/luci-app-mptcp.json:3
-msgid "Grant UCI access for luci-app-mptcp"
-msgstr "授予UCI访问luci-app-mptcp的权限"
-
-#: luci-app-mptcp/luasrc/view/mptcp/mptcp_check.htm:73
-msgid ""
-"If you get \"TCPOptionMPTCPCapable [...] Sender's Key\" at the end, then "
-"MPTCP is supported. If there is a \"-TCPOptionMPTCPCapable\", then it's "
-"blocked."
-msgstr "如果您在末尾获得“TCPOptionMPTCPCapable [...] Sender 's Key” ,则支持MPTCP"
-
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:929
-msgid "Inbound:"
-msgstr "入站:"
-
-#: luci-app-mptcp/luasrc/view/mptcp/mptcp_check.htm:48
-msgid "Interface"
-msgstr "接口"
-
-#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:104
-msgid "Interfaces Settings"
-msgstr "网卡设置"
-
-#: luci-app-mptcp/luasrc/view/mptcp/mptcp_check.htm:21
-#: luci-app-mptcp/luasrc/view/mptcp/mptcp_connections.htm:21
-#: luci-app-mptcp/luasrc/view/mptcp/mptcp_fullmesh.htm:21
-#: luci-app-mptcp/luasrc/view/mptcp/mptcp_monitor.htm:14
-msgid "Loading"
-msgstr "载入中"
-
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:93
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:686
-msgid "MB/s"
-msgstr "MB/s"
-
-#: luci-app-mptcp/luasrc/controller/mptcp.lua:9
-#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:7
-#: luci-app-mptcp/root/usr/share/luci/menu.d/luci-app-mptcp.json:3
-msgid "MPTCP"
-msgstr "MPTCP"
-
-#: luci-app-mptcp/luasrc/controller/mptcp.lua:16
-msgid "MPTCP Fullmesh"
-msgstr "设置MPTCP全网"
-
-#: luci-app-mptcp/luasrc/controller/mptcp.lua:14
-#: luci-app-mptcp/luasrc/view/mptcp/mptcp_check.htm:42
-msgid "MPTCP Support Check"
-msgstr "MPTCP支持检查"
-
-#: luci-app-mptcp/luasrc/controller/mptcp.lua:20
-msgid "MPTCP monitoring"
-msgstr "MPTCP监控"
-
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:102
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:695
-msgid "Mbit/s"
-msgstr "Mbit/s"
-
-#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:18
-msgid "Multipath Debug"
-msgstr "Multipath 调试"
-
-#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:12
-#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:108
-msgid "Multipath TCP"
-msgstr "多路径TCP"
-
-#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:42
-msgid "Multipath TCP SYN retries"
-msgstr "多路径 TCP SYN 重试"
-
-#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:15
-msgid "Multipath TCP checksum"
-msgstr "多路径TCP校验和"
-
-#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:21
-msgid "Multipath TCP path-manager"
-msgstr "多路径TCP路径管理器"
-
-#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:31
-msgid "Multipath TCP scheduler"
-msgstr "多路径TCP调度程序"
-
-#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:47
-#, fuzzy
-msgid "Multipath TCP version"
-msgstr "多路径TCP"
-
-#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:28
-msgid "Netlink"
-msgstr "网络链接"
-
-#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:7
-msgid ""
-"Networks MPTCP settings. Visit http://multipath-tcp.org/pmwiki.php/Users/"
-"ConfigureMPTCP for help."
-msgstr ""
-"网络MPTCP设置. 访问http://multipath-tcp.org/pmwiki.php/Users/ConfigureMPTCP4"
-"a> 获取更多的支持."
-
-#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:108
-msgid "One interface must be set as master"
-msgstr "必须设置一个网卡为主接口"
-
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:939
-msgid "Outbound:"
-msgstr "出站:"
-
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:319
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:322
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:377
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:935
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:945
-msgid "Peak:"
-msgstr "峰值:"
-
-#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:80
-msgid "Re-create fullmesh subflows after a timeout"
-msgstr "超时后重新创建全网格子流"
-
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:891
-msgid "Realtime Traffic"
-msgstr "实时流量"
-
-#: luci-app-mptcp/luasrc/controller/mptcp.lua:10
-#: luci-app-mptcp/luasrc/view/mptcp/mptcp_check.htm:45
-msgid "Settings"
-msgstr "设置"
-
-#: luci-app-mptcp/luasrc/view/mptcp/mptcp_check.htm:65
-msgid "Test"
-msgstr "测试"
-
-#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:69
-msgid ""
-"The number of MPTCP-level retransmission intervals with no traffic and "
-"pending outstanding data on a given subflow required to declare it stale"
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_fullmesh.js:26
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_monitor.js:27
+msgid "(no output)"
msgstr ""
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:914
-msgid "Upload:"
-msgstr "上传:"
-
-#: luci-app-mptcp/luasrc/view/mptcp/mptcp_check.htm:21
-#: luci-app-mptcp/luasrc/view/mptcp/mptcp_connections.htm:21
-#: luci-app-mptcp/luasrc/view/mptcp/mptcp_fullmesh.htm:21
-#: luci-app-mptcp/luasrc/view/mptcp/mptcp_monitor.htm:14
-msgid "Waiting for command to complete..."
-msgstr "等待命令完成..."
-
-#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:112
-msgid "backup"
-msgstr "备份"
-
-#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:22
-#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:32
-msgid "default"
-msgstr "默认"
-
-#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:14
-#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:17
-#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:20
-#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:82
-#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:93
-msgid "disable"
-msgstr "禁用"
-
-#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:110
-msgid "disabled"
-msgstr "禁用"
-
-#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:13
-#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:16
-#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:19
-#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:81
-#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:92
-msgid "enable"
-msgstr "启用"
-
-#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:109
-msgid "enabled"
-msgstr "启用"
-
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:88
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:314
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:318
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:322
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:372
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:376
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:380
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:681
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:930
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:933
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:936
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:940
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:943
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:946
-msgid "kB/s"
-msgstr "kB/秒"
-
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:97
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:314
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:318
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:322
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:372
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:376
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:380
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:690
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:930
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:933
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:936
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:940
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:943
-#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:946
-msgid "kbit/s"
-msgstr "kbit/秒"
-
-#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:111
-msgid "master"
-msgstr "主"
-
-#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:85
-msgid "ndiffports subflows number"
-msgstr "ndiffports子流数"
-
-#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:64
-msgid ""
-"specifies the maximum number of ADD_ADDR suboptions accepted for each MPTCP "
-"connection"
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_dscp_routing.js:45
+msgid "-- not pinned --"
msgstr ""
-#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:59
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:133
+msgid "0"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:134
+msgid "1"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:304
msgid ""
-"specifies the maximum number of additional subflows allowed for each MPTCP "
-"connection"
+"A weight >100 make it more attractive, a weight <100 make it less "
+"attractive. Max 256"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_dscp_routing.js:171
+msgid ""
+"A weight >100 makes a WAN more attractive, a weight <100 makes it less "
+"attractive. Max 256."
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:73
+msgid "ADD_ADDR echo failed to send"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:71
+msgid "ADD_ADDR echo received"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:72
+msgid "ADD_ADDR echo sent"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:74
+msgid "ADD_ADDR received with a port number"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:70
+msgid "ADD_ADDR signals dropped"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:69
+msgid "ADD_ADDR signals failed to send"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:67
+msgid "ADD_ADDR signals received"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:68
+msgid "ADD_ADDR signals sent"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:262
+msgid "Accepted ADD_ADDR limit"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:259
+msgid "Add-addr timeout (s)"
msgstr ""
#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/multipath.js:326
msgid "All interfaces"
msgstr "所有接口"
-#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/multipath.js:456
-msgid "All interfaces – combined view"
-msgstr "所有接口 – 合并视图"
-
#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/multipath.js:457
msgid "All interfaces overlaid, inbound and outbound separately"
msgstr "所有接口叠加显示,入站与出站分开"
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/multipath.js:456
+msgid "All interfaces – combined view"
+msgstr "所有接口 – 合并视图"
+
#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/multipath.js:422
#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/multipath.js:615
msgid "Average"
msgstr "平均"
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:75
+msgid "BPF schedulers (not available on all platforms):"
+msgstr ""
+
+#: luci-app-mptcp/root/usr/share/luci/menu.d/luci-app-mptcp.json:47
+msgid "Bandwidth"
+msgstr "带宽"
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:61
+msgid "Blackhole detected on the path"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:238
+msgid "Blackhole timeout"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:258
+msgid "Blackhole timeout (s)"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_dscp_routing.js:13
+msgid "CS0 (0) - Best effort"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_dscp_routing.js:14
+msgid "CS1 (8) - Low priority"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_dscp_routing.js:15
+msgid "CS2 (16) - High priority"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_dscp_routing.js:16
+msgid "CS3 (24) - SIP/signaling"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_dscp_routing.js:17
+msgid "CS4 (32) - Real-time interactive"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_dscp_routing.js:18
+msgid "CS5 (40) - Broadcast video"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_dscp_routing.js:19
+msgid "CS6 (48) - Network control"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_dscp_routing.js:20
+msgid "CS7 (56) - Latency sensitive"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_check.js:48
+msgid "Check if MPTCP between interface and server is working."
+msgstr "检查接口和服务器之间的MPTCP是否正常工作."
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:256
+msgid "Checksum"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_dscp_routing.js:109
+msgid ""
+"Choose which WAN carries each DSCP-tagged traffic class -- for the MPTCP "
+"bpf_dscp scheduler and for mqvpn -- and review the per-WAN weight used by "
+"the *weight schedulers on both. This page only edits the pins/weights; pick "
+"the scheduler that actually uses them on the MPTCP and MQVPN pages "
+"themselves."
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:243
+msgid "Close timeout"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:260
+msgid "Close timeout (s)"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:138
+msgid "Congestion Control"
+msgstr "阻塞控制"
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:277
+msgid "Consecutive segments that should be sent for round robin"
+msgstr "连续轮播应发送的连续段"
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:233
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:248
+msgid "Control message timeout"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:23
+msgid "Could not allocate an MPTCP token, fell back to TCP"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:104
+msgid "Couldn't fall back to TCP (connection state didn't allow it)"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:288
+msgid "Counter"
+msgstr ""
+
#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/multipath.js:422
#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/multipath.js:611
msgid "Current"
msgstr "当前"
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_dscp_routing.js:108
+#: luci-app-mptcp/root/usr/share/luci/menu.d/luci-app-mptcp.json:36
+msgid "DSCP / Weight Routing"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_dscp_routing.js:139
+msgid "DSCP class"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_dscp_routing.js:134
+msgid "DSCP class pins"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:48
+msgid "DSS corruption detected, fell back to plain TCP"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:49
+msgid "DSS corruption detected, subflow reset"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:53
+msgid "Data checksum errors"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:86
+msgid "Data mapping failures received (MP_FAIL)"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:85
+msgid "Data mapping failures sent (MP_FAIL)"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:50
+msgid "Data sequence mapping did not match TCP sequence numbers"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:47
+msgid "Data sequence mapping did not match the previous one"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:138
+msgid "Default is cubic"
+msgstr "默认设置 cubic"
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:65
+msgid "Default is fullmesh"
+msgstr "默认设置fullmesh"
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:211
+msgid "Device"
+msgstr ""
+
+#: luci-app-mptcp/root/usr/share/luci/menu.d/luci-app-mptcp.json:25
+msgid "Diagnostics"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:244
+msgid "Disabled"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_dscp_routing.js:151
+msgid "Download interface"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:55
+msgid "Duplicate data segments discarded"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_dscp_routing.js:34
+msgid "EF (46) - Voice"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:177
+msgid "Enable MPTCPd"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:243
+msgid "Enabled"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:214
+msgid "Endpoint flags"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_check.js:72
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_check.js:74
+msgid "Error"
+msgstr "错误"
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_connections.js:28
+msgid "Error fetching connections data."
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_fullmesh.js:28
+msgid "Error fetching fullmesh data."
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_monitor.js:29
+msgid "Error fetching monitor data."
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:99
+msgid "Established MPTCP connections (current)"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:263
+msgid "Established MPTCP connections (right now)"
+msgstr ""
+
+#: luci-app-mptcp/root/usr/share/luci/menu.d/luci-app-mptcp.json:58
+msgid "Established connections"
+msgstr "建立的连接"
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:19
+msgid "Fallback to TCP (ACK stripped)"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:18
+msgid "Fallback to TCP (SYN/ACK stripped)"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:88
+msgid "Fastclose received"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:87
+msgid "Fastclose sent"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:102
+msgid "Fell back to TCP: bad or missing data sequence signal"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:101
+msgid "Fell back to TCP: conflicting TCP MD5SIG option"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:100
+msgid "Fell back to TCP: missing data on first established packet"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:103
+msgid "Fell back to TCP: simultaneous connect"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:271
+msgid "Fill the congestion window on all subflows for round robin"
+msgstr "在循环的所有子流上填充拥塞窗口"
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:171
+msgid "Force Multipath configuration"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:254
+msgid "Fullmesh subflows for each pair of IP addresses"
+msgstr "每对IP地址的全网格子流"
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_dscp_routing.js:152
+msgid ""
+"Gateway (VPS) → router. Only takes effect for MPTCP’s bpf_dscp scheduler "
+"(pins the VPS’s own send-side choice via dscp_remote_id) and can be a "
+"different WAN than Upload."
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_dscp_routing.js:124
+msgid "Gateway sync"
+msgstr ""
+
+#: luci-app-mptcp/root/usr/share/rpcd/acl.d/luci-app-mptcp.json:3
+msgid "Grant UCI access for luci-app-mptcp"
+msgstr "授予UCI访问luci-app-mptcp的权限"
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:150
+msgid ""
+"Helps explain why MPTCP might not be aggregating your WANs correctly: "
+"fallback to plain TCP, blackholed/stale subflows, resets, checksum errors, "
+"and WANs that never got an MPTCP endpoint registered at all. Refreshes "
+"automatically every 15 seconds."
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_check.js:60
+msgid ""
+"If you get \"TCPOptionMPTCPCapable [...] Sender's Key\" at the end, then "
+"MPTCP is supported. If there is a \"-TCPOptionMPTCPCapable\", then it's "
+"blocked."
+msgstr ""
+"如果您在末尾获得“TCPOptionMPTCPCapable [...] Sender 's Key” ,则支持MPTCP"
+
#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/multipath.js:693
msgid "In"
msgstr "入站"
-#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/multipath.js:462
-msgid "Inbound – all interfaces"
-msgstr "入站 – 所有接口"
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:248
+msgid "In-kernel"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:151
+msgid "In-kernel path manager"
+msgstr ""
#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/multipath.js:634
msgid "Inbound traffic"
msgstr "入站流量"
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/multipath.js:462
+msgid "Inbound – all interfaces"
+msgstr "入站 – 所有接口"
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:52
+msgid "Infinite mapping received (peer fell back to plain TCP semantics)"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:51
+msgid "Infinite mapping sent (fell back to plain TCP semantics)"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:165
+msgid "Initial MPTCP configuration"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:238
+msgid ""
+"Initial time period in second to disable MPTCP on active MPTCP sockets when "
+"a MPTCP firewall blackhole issue happens. This time period will grow "
+"exponentially when more blackhole issues get detected right after MPTCP is "
+"re-enabled and will reset to the initial value when the blackhole issue goes "
+"away."
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_check.js:52
+msgid "Interface"
+msgstr "接口"
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:284
+msgid "Interfaces Settings"
+msgstr "网卡设置"
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:36
+msgid "JOIN ACK authentication failures"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:34
+msgid "JOIN SYN/ACK authentication failures"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:37
+msgid "JOIN attempts with unknown token"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:38
+msgid "JOIN request rejected by the path manager"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:265
+msgid "Kernel MPTCP configuration"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_dscp_routing.js:21
+msgid "LE (1) - Lower effort"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:170
+msgid "Last updated:"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_dscp_routing.js:153
+msgid ""
+"Leave empty to just mirror this row’s Upload interface to the gateway "
+"instead -- the same \"download always follows upload\" behavior mqvpn "
+"already has built in natively."
+msgstr ""
+"留空则只是把本行的上传接口镜像到网关 -- 与 mqvpn 原生自带的\"下载始终跟随上传"
+"\"行为相同。"
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/multipath.js:75
+msgid "MB/s"
+msgstr "MB/s"
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:46
+#: luci-app-mptcp/root/usr/share/luci/menu.d/luci-app-mptcp.json:3
+#: luci-app-mptcp/root/usr/share/luci/menu.d/luci-app-mptcp.json:14
+msgid "MPTCP"
+msgstr "MPTCP"
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:148
+msgid "MPTCP Diagnostics"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:142
+msgid "MPTCP Established connections"
+msgstr ""
+
+#: luci-app-mptcp/root/usr/share/luci/menu.d/luci-app-mptcp.json:69
+msgid "MPTCP Fullmesh"
+msgstr "设置MPTCP全网"
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:141
+msgid "MPTCP Fullmesh (subflow map)"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:140
+msgid "MPTCP Settings"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_check.js:46
+msgid "MPTCP Support Check"
+msgstr "MPTCP支持检查"
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:253
+msgid "MPTCP enabled"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:213
+msgid "MPTCP endpoint"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:16
+msgid "MPTCP handshake accepted by peer (SYN/ACK)"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:15
+msgid "MPTCP handshake attempts received (SYN)"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:14
+msgid "MPTCP handshake attempts sent (SYN)"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:17
+msgid "MPTCP handshake completed (ACK)"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:21
+msgid "MPTCP handshake disabled client-side after past issues"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:20
+msgid "MPTCP handshake dropped client-side, fell back to TCP"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:277
+msgid "MPTCP kernel counters (since boot)"
+msgstr ""
+
+#: luci-app-mptcp/root/usr/share/luci/menu.d/luci-app-mptcp.json:80
+msgid "MPTCP monitoring"
+msgstr "MPTCP监控"
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:143
+msgid "MPTCP monitoring (raw kernel counters)"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:22
+msgid "MPTCP rejected on a port-only endpoint"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:90
+msgid "MPTCP resets received"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:89
+msgid "MPTCP resets sent"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:46
+msgid "MPTCP-level retransmissions"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:105
+msgid "MPTCP-level zero-window probes"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:205
+msgid "MPTCPd Address annoucement flags"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:212
+msgid "MPTCPd Address notification flags"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:183
+msgid "MPTCPd path managers"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:194
+msgid "MPTCPd plugins"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:228
+msgid "Max add address"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:218
+msgid "Max subflows"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/multipath.js:77
+msgid "Mbit/s"
+msgstr "Mbit/s"
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:117
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_dscp_routing.js:126
+msgid "Mirror DSCP/weight pins to gateway"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:212
+msgid "Mode"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:60
+msgid "Multipath Debug"
+msgstr "Multipath 调试"
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:50
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:289
+msgid "Multipath TCP"
+msgstr "多路径TCP"
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:126
+msgid "Multipath TCP SYN retries"
+msgstr "多路径 TCP SYN 重试"
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:55
+msgid "Multipath TCP checksum"
+msgstr "多路径TCP校验和"
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:65
+msgid "Multipath TCP path-manager"
+msgstr "多路径TCP路径管理器"
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:75
+msgid "Multipath TCP scheduler"
+msgstr "多路径TCP调度程序"
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:132
+#, fuzzy
+msgid "Multipath TCP version"
+msgstr "多路径TCP"
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:72
+msgid "Netlink"
+msgstr "网络链接"
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:46
+msgid "Networks MPTCP settings."
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:279
+msgid "No counters available (nstat/multipath -m returned nothing)."
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_connections.js:26
+msgid "No data"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:184
+msgid "No diagnostic data available yet."
+msgstr ""
+
#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/multipath.js:394
msgid "No multipath WAN interface is currently available."
msgstr "当前没有可用的多路径 WAN 接口。"
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:205
+msgid "No multipath-enabled WAN interfaces found."
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_dscp_routing.js:112
+msgid ""
+"Nothing to show yet: no DSCP scheduler (bpf_dscp) or weight scheduler "
+"(bpf_weight/bpf_weight_rr/bpf_burstweight, or mqvpn’s Weighted RTT/Weighted "
+"Round Robin) is currently selected on the MPTCP or MQVPN pages."
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:289
+msgid "One interface must be set as master"
+msgstr "必须设置一个网卡为主接口"
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_dscp_routing.js:165
+msgid ""
+"Only WANs with Multipath TCP enabled (the “Multipath TCP” option on the "
+"MPTCP page’s Interfaces Settings) are listed below."
+msgstr ""
+"下面仅列出已启用 Multipath TCP 的 WAN(即 MPTCP 页面“接口设置”中的“Multipath "
+"TCP”选项)。"
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:304
+msgid ""
+"Only used by *weight schedulers/path managers. Ignored if no weight "
+"scheduler is selected."
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:139
+msgid "OpenMPTCProuter Network overview / Status"
+msgstr ""
+
#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/multipath.js:700
msgid "Out"
msgstr "出站"
-#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/multipath.js:468
-msgid "Outbound – all interfaces"
-msgstr "出站 – 所有接口"
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:58
+msgid "Out-of-order segments merged"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:57
+msgid "Out-of-order segments queued"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:56
+msgid "Out-of-order segments queued at tail"
+msgstr ""
#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/multipath.js:640
msgid "Outbound traffic"
msgstr "出站流量"
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/multipath.js:468
+msgid "Outbound – all interfaces"
+msgstr "出站 – 所有接口"
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:150
+msgid "Path Manager type"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:254
+msgid "Path manager"
+msgstr ""
+
#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/multipath.js:422
#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/multipath.js:619
msgid "Peak"
msgstr "峰值"
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:203
+msgid "Per-WAN MPTCP endpoint status"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:78
+msgid "RM_ADDR signals dropped"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:77
+msgid "RM_ADDR signals failed to send"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:75
+msgid "RM_ADDR signals received"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:76
+msgid "RM_ADDR signals sent"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:260
+msgid "Re-create fullmesh subflows after a timeout"
+msgstr "超时后重新创建全网格子流"
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:95
+msgid "Receive window conflict resolved on update"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:94
+msgid "Receive window shared across subflows"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:96
+msgid "Receive window update conflicts"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:137
+msgid "Related pages"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:223
+msgid "Retranmission intervals"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_dscp_routing.js:144
+msgid ""
+"Router → internet. Pins this class to a WAN for MPTCP’s bpf_dscp scheduler "
+"(local dscp_iface map) and, for mqvpn, announces the class on this path’s "
+"DSCP mask via the control API."
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:255
+msgid "Scheduler"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:54
+msgid "Segments received outside the MPTCP mapping window"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:93
+msgid "Send window shared across subflows"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:243
+msgid ""
+"Set the make-after-break timeout: in absence of any close or shutdown "
+"syscall, MPTCP sockets will maintain the status unchanged for such time, "
+"after the last subflow removal, before moving to TCP_CLOSE."
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:233
+msgid ""
+"Set the timeout after which an ADD_ADDR (add address) control message will "
+"be resent to an MPTCP peer that has not acknowledged a previous ADD_ADDR "
+"message."
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_check.js:50
+msgid "Settings"
+msgstr "设置"
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:257
+msgid "Stale loss count threshold"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:63
+msgid "Stale subflows recovered"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:41
+msgid "Subflow JOIN ACK received on a different port"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:43
+msgid "Subflow JOIN ACK with mismatched port"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:39
+msgid "Subflow JOIN SYN received on a different port"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:42
+msgid "Subflow JOIN SYN with mismatched port"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:40
+msgid "Subflow JOIN SYN/ACK received on a different port"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:32
+msgid "Subflow JOIN accepted by peer (SYN/ACK)"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:33
+msgid "Subflow JOIN accepted by peer (SYN/ACK, backup)"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:30
+msgid "Subflow JOIN attempts received (SYN)"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:31
+msgid "Subflow JOIN attempts received (SYN, backup)"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:26
+msgid "Subflow JOIN attempts sent (SYN)"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:35
+msgid "Subflow JOIN completed (ACK)"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:28
+msgid "Subflow JOIN failed: could not bind address"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:29
+msgid "Subflow JOIN failed: could not connect"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:27
+msgid "Subflow JOIN failed: could not create socket"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:261
+msgid "Subflow limit"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:82
+msgid "Subflow priority change received (MP_PRIO)"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:81
+msgid "Subflow priority change sent (MP_PRIO)"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:62
+msgid "Subflows marked stale (possible blackhole)"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:64
+msgid "Subflows removed"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_check.js:40
+msgid "Test"
+msgstr "测试"
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:223
+msgid ""
+"The number of MPTCP-level retransmission intervals with no traffic and "
+"pending outstanding data on a given subflow required to declare it stale. A "
+"low stale_loss_cnt value allows for fast active-backup switch-over, an high "
+"value maximize links utilization on edge scenarios e.g. lossy link with high "
+"BER or peer pausing the data processing."
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:248
+msgid ""
+"The number of SYN + MP_CAPABLE retransmissions before falling back to TCP, "
+"i.e. dropping the MPTCP options."
+msgstr ""
+
#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/multipath.js:442
#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/multipath.js:570
#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/multipath.js:585
@@ -389,6 +935,139 @@ msgstr "总入站"
msgid "Total out"
msgstr "总出站"
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_dscp_routing.js:143
+msgid "Upload interface"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_dscp_routing.js:164
+msgid ""
+"Used by the *weight MPTCP schedulers (bpf_weight/bpf_weight_rr) and by "
+"mqvpn’s \"Weighted RTT\"/\"Weighted Round Robin\" schedulers -- same value, "
+"applies to both upload and download (mirrored to the gateway automatically). "
+"Unlike the DSCP pins above, weight is a single value per WAN, not per "
+"traffic class."
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:249
+msgid "Userspace"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:152
+msgid "Userspace path manager"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:288
+msgid "Value"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:210
+msgid "WAN"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_dscp_routing.js:163
+msgid "WAN weight"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_check.js:69
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_connections.js:15
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_fullmesh.js:15
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_monitor.js:15
+msgid "Waiting for command to complete…"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:304
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_dscp_routing.js:170
+msgid "Weight"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:118
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_dscp_routing.js:127
+msgid ""
+"When using a DSCP or weight BPF scheduler, also sync each WAN’s pin to the "
+"gateway (VPS) so it also holds for traffic the gateway sends (downloads), "
+"not just traffic the router sends (uploads). Disabling this only stops "
+"future syncs -- it does not remove pins already pushed to the gateway."
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_dscp_routing.js:128
+msgid ""
+"While disabled, the DSCP table below only shows Upload -- Download has no "
+"effect until this is re-enabled and applied."
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:293
+msgid "backup"
+msgstr "备份"
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:76
+msgid "bpf_burst => same as the default scheduler"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:78
+msgid "bpf_first => always picks the first subflow to send data"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:77
+msgid "bpf_red => sends all packets redundantly on all available subflows"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:79
+msgid ""
+"bpf_rr => always picks the next available subflow to send data (round-robin)"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:66
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:82
+msgid "default"
+msgstr "默认"
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:52
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:57
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:62
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:168
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:174
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:180
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:262
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:273
+msgid "disable"
+msgstr "禁用"
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:291
+msgid "disabled"
+msgstr "禁用"
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:51
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:56
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:61
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:167
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:173
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:179
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:261
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:272
+msgid "enable"
+msgstr "启用"
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:290
+msgid "enabled"
+msgstr "启用"
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/multipath.js:74
+msgid "kB/s"
+msgstr "kB/秒"
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/multipath.js:76
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/multipath.js:436
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/multipath.js:446
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/multipath.js:612
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/multipath.js:616
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/multipath.js:620
+msgid "kbit/s"
+msgstr "kbit/秒"
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:292
+msgid "master"
+msgstr "主"
+
#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/multipath.js:540
#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/multipath.js:541
#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/multipath.js:673
@@ -396,6 +1075,81 @@ msgstr "总出站"
msgid "minutes window, 1 second interval"
msgstr "分钟窗口,1 秒间隔"
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:225
+msgid "missing"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_dscp_routing.js:154
+msgid ""
+"mqvpn has no equivalent: its downlink always mirrors whichever WAN carries "
+"the class on upload, so this field has no effect on mqvpn."
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:265
+msgid "ndiffports subflows number"
+msgstr "ndiffports子流数"
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp_diagnostics.js:225
+msgid "registered"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:228
+msgid ""
+"specifies the maximum number of ADD_ADDR (add address) suboptions accepted "
+"for each MPTCP connection"
+msgstr ""
+
+#: luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js:218
+msgid ""
+"specifies the maximum number of additional subflows allowed for each MPTCP "
+"connection"
+msgstr ""
+
+#~ msgid "(%d minute window, %d second interval)"
+#~ msgstr "(%d 分钟刷新, %d 秒钟刷新)"
+
+#~ msgid "(%d minutes window, %d seconds interval)"
+#~ msgstr "(%d 分钟间隔, %d 秒钟刷新)"
+
+#~ msgid "Average:"
+#~ msgstr "平均:"
+
+#~ msgid "Current:"
+#~ msgstr "实时:"
+
+#~ msgid "Download:"
+#~ msgstr "下载:"
+
+#~ msgid "Inbound:"
+#~ msgstr "入站:"
+
+#~ msgid "Loading"
+#~ msgstr "载入中"
+
+#~ msgid ""
+#~ "Networks MPTCP settings. Visit http://multipath-tcp.org/pmwiki.php/"
+#~ "Users/ConfigureMPTCP for help."
+#~ msgstr ""
+#~ "网络MPTCP设置. 访问http://multipath-tcp.org/pmwiki.php/Users/"
+#~ "ConfigureMPTCP4 获取更多的支持."
+
+#~ msgid "Outbound:"
+#~ msgstr "出站:"
+
+#~ msgid "Peak:"
+#~ msgstr "峰值:"
+
+#~ msgid "Realtime Traffic"
+#~ msgstr "实时流量"
+
+#~ msgid "Upload:"
+#~ msgstr "上传:"
+
+#~ msgid "Waiting for command to complete..."
+#~ msgstr "等待命令完成..."
+
#~ msgid "BLEST"
#~ msgstr "最好的"
diff --git a/luci-app-mptcp/root/usr/libexec/rpcd/luci.mptcp b/luci-app-mptcp/root/usr/libexec/rpcd/luci.mptcp
index 87bbcb37f..7a42ed07d 100755
--- a/luci-app-mptcp/root/usr/libexec/rpcd/luci.mptcp
+++ b/luci-app-mptcp/root/usr/libexec/rpcd/luci.mptcp
@@ -51,6 +51,369 @@ local function bwc_rows(dev)
return {}
end
+local IP_BIN = "/sbin/ip"
+
+local function trim(s)
+ return (tostring(s or ""):gsub("^%s+", ""):gsub("%s+$", ""))
+end
+
+local function read_proc(path)
+ local f = io.open(path, "r")
+ if not f then return nil end
+ local v = f:read("*l")
+ f:close()
+ if v == nil then return nil end
+ return trim(v)
+end
+
+-- First field of /proc/uptime (seconds since boot), used to turn raw
+-- cumulative MPTcpExt counters into an "events/hour since boot" rate --
+-- a bare cumulative count (e.g. "7021 resets") doesn't say whether that's
+-- alarming or a trickle, since it doesn't say over what timespan.
+local function uptime_seconds()
+ local raw = read_proc("/proc/uptime")
+ local secs = raw and raw:match("^(%S+)")
+ return secs and tonumber(secs) or nil
+end
+
+-- -------------------------------------------------------------------------
+-- MPTCP Diagnostics: explain *why* MPTCP might not be aggregating WANs
+-- correctly -- kernel-level MPTCP counters (fallback to plain TCP,
+-- blackhole/stale-subflow detection, resets, checksum errors, JOIN
+-- failures, ...), the live endpoint/limits state, and a per-WAN cross-check
+-- of whether each multipath-enabled interface actually has a registered
+-- MPTCP endpoint -- turned into a plain-English issue list.
+--
+-- All the underlying commands (multipath -k/-m/-c, ip mptcp ...) are
+-- read-only/local and near-instant, so none of them are timeout-wrapped.
+-- NOTE: never wrap "ip" in "timeout" here -- on this router's busybox
+-- userland, "timeout N ip ..." has been seen to silently dispatch
+-- busybox's own crippled "ip" applet instead of the real /sbin/ip, which
+-- has no "mptcp" subcommand at all. Always call /sbin/ip directly.
+-- -------------------------------------------------------------------------
+
+-- Kernel MPTCP sysctl snapshot (works across the legacy out-of-tree sysctl
+-- layout AND the current in-kernel net.mptcp.* layout -- whichever files
+-- actually exist on this kernel).
+function kernel_settings()
+ local settings = {}
+ settings.enabled = read_proc("/proc/sys/net/mptcp/mptcp_enabled")
+ or read_proc("/proc/sys/net/mptcp/enabled")
+ settings.checksum = read_proc("/proc/sys/net/mptcp/mptcp_checksum")
+ or read_proc("/proc/sys/net/mptcp/checksum_enabled")
+ settings.path_manager = read_proc("/proc/sys/net/mptcp/mptcp_path_manager")
+ or read_proc("/proc/sys/net/mptcp/pm_type")
+ settings.scheduler = read_proc("/proc/sys/net/mptcp/mptcp_scheduler")
+ or read_proc("/proc/sys/net/mptcp/scheduler")
+ settings.syn_retries = read_proc("/proc/sys/net/mptcp/mptcp_syn_retries")
+ settings.stale_loss_cnt = read_proc("/proc/sys/net/mptcp/stale_loss_cnt")
+ settings.add_addr_timeout = read_proc("/proc/sys/net/mptcp/add_addr_timeout")
+ settings.close_timeout = read_proc("/proc/sys/net/mptcp/close_timeout")
+ settings.blackhole_timeout = read_proc("/proc/sys/net/mptcp/blackhole_timeout")
+ settings.allow_join_initial_addr_port = read_proc("/proc/sys/net/mptcp/allow_join_initial_addr_port")
+ return settings
+end
+
+-- The kernel's MPTcpExt* MIB counters, either as the "nstat -z" layout
+-- (name, value, rate -- one counter per line, what "multipath -m" prints)
+-- or the SNMP-style two-line layout (a header line of field names followed
+-- by a value line, both prefixed "MPTcpExt:", found in /proc/net/netstat
+-- and the legacy /proc/net/mptcp_net/snmp). Parse both.
+function parse_counters(raw)
+ local counters = {}
+ local header
+
+ for line in (raw or ""):gmatch("[^\n]+") do
+ -- The nstat-style counter name always continues with a letter right
+ -- after the "MPTcpExt" prefix (e.g. "MPTcpExtMPCapableSYNTX"); the
+ -- SNMP-style header/value lines start "MPTcpExt:" instead. Requiring
+ -- a letter here keeps the two forms from being confused with each
+ -- other (a bare "MPTcpExt:" line's second "word" can itself be a
+ -- number, which would otherwise wrongly match as a counter).
+ local name, value = line:match("^%s*(MPTcpExt%a%w*)%s+(%-?%d+)")
+ if name and value then
+ counters[name:gsub("^MPTcpExt", "")] = tonumber(value)
+ elseif line:match("^MPTcpExt:") then
+ -- SNMP-style: first "MPTcpExt:" line is field names, the next is values
+ if not header then
+ header = {}
+ for field in line:gmatch("%S+") do header[#header + 1] = field end
+ else
+ local i = 0
+ for field in line:gmatch("%S+") do
+ i = i + 1
+ local key = header[i]
+ if key and key ~= "MPTcpExt:" then
+ counters[key] = tonumber(field)
+ end
+ end
+ end
+ end
+ end
+ return counters
+end
+
+-- Where to read the MPTcpExt* counters from for Diagnostics. Deliberately
+-- NOT "multipath -m" here: that wraps "nstat -z", and nstat (without -a)
+-- reports the delta since the *previous* nstat invocation by anyone on the
+-- box (it keeps a shared per-uid history file) -- confirmed live: two
+-- consecutive calls a couple seconds apart came back ~0, while "nstat -a -z"
+-- (ignore history) matched /proc/net/netstat exactly. A page that polls
+-- every 15s and calls that would show "since last poll" numbers while
+-- labelling them "since boot", and would race with anything else on the
+-- router that also calls nstat. Reading the kernel's own procfs SNMP-style
+-- counters directly sidesteps all of that -- always the true cumulative
+-- count, no shared state with other callers.
+function mptcp_counters_raw()
+ local raw = exec_output("cat /proc/net/mptcp_net/snmp 2>/dev/null")
+ if raw == "" then
+ raw = exec_output("grep '^MPTcpExt:' /proc/net/netstat 2>/dev/null")
+ end
+ return raw
+end
+
+-- "ip mptcp endpoint show": one line per registered endpoint, e.g.
+-- 10.0.0.2 id 1 subflow dev eth0
+-- 88.1.2.3 id 2 signal dev wwan0
+-- 10.0.0.5 id 3 subflow backup fullmesh dev eth1
+function parse_endpoints(raw)
+ local endpoints = {}
+ for line in (raw or ""):gmatch("[^\n]+") do
+ local id = line:match("id%s+(%d+)")
+ local dev = line:match("dev%s+(%S+)")
+ local addr = line:match("^%s*(%S+)")
+ if id and addr and addr ~= "id" then
+ endpoints[#endpoints + 1] = {
+ id = tonumber(id),
+ address = addr,
+ dev = dev or "",
+ signal = line:match("%f[%a]signal%f[%A]") ~= nil,
+ subflow = line:match("%f[%a]subflow%f[%A]") ~= nil,
+ backup = line:match("%f[%a]backup%f[%A]") ~= nil,
+ fullmesh = line:match("%f[%a]fullmesh%f[%A]") ~= nil,
+ }
+ end
+ end
+ return endpoints
+end
+
+-- "ip mptcp limits show" -> "add_addr_accepted 8 subflows 8"
+function parse_limits(raw)
+ local limits = {}
+ for key, value in (raw or ""):gmatch("(%a[%w_]*)%s+(%d+)") do
+ limits[key] = tonumber(value)
+ end
+ return limits
+end
+
+-- Per-WAN endpoint cross-check: for every interface the router considers
+-- multipath-enabled, is its device actually registered as an MPTCP
+-- endpoint? If not, that WAN can never carry an MPTCP subflow no matter
+-- what the schedulers/counters say.
+function wan_endpoint_status(endpoints)
+ local wans = {}
+ uci:foreach("network", "interface", function(s)
+ local name = s[".name"]
+ if name == "loopback" then return end
+
+ local multipath = s["multipath"]
+ if multipath == nil or multipath == "" then
+ multipath = uci:get("openmptcprouter", name, "multipath")
+ end
+ multipath = multipath or "off"
+ if multipath == "off" then return end
+
+ local dev = get_device(name)
+ if dev == "" then dev = s["device"] or s["ifname"] or "" end
+
+ local has_endpoint = false
+ local endpoint_flags = ""
+ for _, ep in ipairs(endpoints) do
+ if dev ~= "" and ep.dev == dev then
+ has_endpoint = true
+ local flags = {}
+ if ep.signal then flags[#flags + 1] = "signal" end
+ if ep.subflow then flags[#flags + 1] = "subflow" end
+ if ep.backup then flags[#flags + 1] = "backup" end
+ if ep.fullmesh then flags[#flags + 1] = "fullmesh" end
+ endpoint_flags = table.concat(flags, ",")
+ break
+ end
+ end
+
+ wans[#wans + 1] = {
+ name = name,
+ device = dev,
+ multipath = multipath,
+ has_endpoint = has_endpoint,
+ endpoint_flags = endpoint_flags,
+ }
+ end)
+ return wans
+end
+
+-- Turn everything above into a plain-English issue list.
+local function add_issue(issues, severity, code, message, detail)
+ issues[#issues + 1] = {
+ severity = severity,
+ code = code,
+ message = message,
+ detail = detail or "",
+ }
+end
+
+function build_issues(settings, counters, wans)
+ local issues = {}
+
+ if settings.enabled == "0" then
+ add_issue(issues, "error", "mptcp_disabled",
+ "MPTCP is disabled in the kernel.",
+ "No connection can use more than one WAN until MPTCP is re-enabled.")
+ end
+
+ for _, wan in ipairs(wans) do
+ if wan.device == "" then
+ add_issue(issues, "warning", "wan_no_device",
+ string.format("%s: multipath is enabled but the interface has no device yet.", wan.name),
+ "The interface may still be coming up (no IP/link yet).")
+ elseif not wan.has_endpoint then
+ add_issue(issues, "error", "wan_no_endpoint",
+ string.format("%s (%s): no MPTCP endpoint registered for this WAN.", wan.name, wan.device),
+ "This WAN will never be used for an MPTCP subflow, regardless of scheduler/weight settings. " ..
+ "Usually fixed by a hotplug/interface restart (which re-runs 'multipath on|backup'), " ..
+ "or by checking that the interface actually has a global (non-private-only, non-CGNAT) IP.")
+ end
+ end
+
+ local fallback = (counters.MPCapableFallbackSYNACK or 0) + (counters.MPCapableFallbackACK or 0)
+ if fallback > 0 then
+ add_issue(issues, "warning", "mptcp_fallback",
+ string.format("MPTCP fell back to plain TCP %d time(s).", fallback),
+ "A device on the path (firewall/middlebox/some ISP CGNAT boxes) is stripping the MPTCP TCP option " ..
+ "from the SYN or SYN/ACK, so the kernel gave up and used regular single-path TCP for those " ..
+ "connections. Use the MPTCP Support Check page (tracebox) per-WAN to confirm which WAN(s) strip it.")
+ end
+
+ local stale, recover = counters.SubflowStale or 0, counters.SubflowRecover or 0
+ if stale > 0 then
+ local stuck = stale - recover
+ if stuck > 0 then
+ add_issue(issues, "error", "mptcp_blackhole",
+ string.format("%d subflow(s) currently marked stale (possible blackhole) out of %d total.", stuck, stale),
+ "A path stopped acknowledging data for one or more subflows; the kernel is avoiding it. " ..
+ "If this keeps climbing on one specific WAN, that WAN's path is likely being blackholed.")
+ else
+ add_issue(issues, "warning", "mptcp_blackhole_recovered",
+ string.format("%d subflow(s) were marked stale but all recovered.", stale),
+ "Transient -- a path briefly stopped acking data and the kernel recovered it automatically.")
+ end
+ end
+
+ local hmac_fail = (counters.MPJoinSynAckHMacFailure or 0) + (counters.MPJoinAckHMacFailure or 0)
+ if hmac_fail > 0 then
+ add_issue(issues, "warning", "mptcp_join_hmac_failure",
+ string.format("%d MPTCP JOIN handshake authentication failure(s).", hmac_fail),
+ "A new subflow's JOIN handshake failed HMAC verification -- either packets were altered in " ..
+ "transit or the two ends disagree on the connection's key/token.")
+ end
+
+ if (counters.MPJoinNoTokenFound or 0) > 0 then
+ add_issue(issues, "warning", "mptcp_join_no_token",
+ string.format("%d subflow JOIN attempt(s) referenced an unknown token.", counters.MPJoinNoTokenFound),
+ "The peer (usually the VPS) no longer recognizes the MPTCP connection -- often because its proxy " ..
+ "process restarted and lost state. A new subflow can't attach to a connection the peer forgot.")
+ end
+
+ if (counters.DataCsumErr or 0) > 0 then
+ add_issue(issues, "warning", "mptcp_checksum_error",
+ string.format("%d MPTCP data checksum error(s).", counters.DataCsumErr),
+ "Check that 'mptcp_checksum' matches on both the router and the VPS -- a mismatch (or a path " ..
+ "that corrupts data) triggers this.")
+ end
+
+ -- Split by direction, not just summed: which side is doing the closing
+ -- matters. Confirmed live on the bench (2026-08-16) -- a steady climb
+ -- here traced back to OMR's own per-WAN shadowsocks health-check loop
+ -- (omr-tracker-ss) opening a fresh MPTCP connection through the
+ -- mptcp-enabled sslocal proxy every ~10s and closing it abortively, NOT
+ -- to path interference or the VPS dropping the tunnel -- confirmed by
+ -- MPRstRx staying ~0 while MPRstTx climbed, and by reproducing an
+ -- MPRstTx increment live by firing that exact health-check request.
+ local reset_tx = (counters.MPRstTx or 0) + (counters.MPFastcloseTx or 0)
+ local reset_rx = (counters.MPRstRx or 0) + (counters.MPFastcloseRx or 0)
+ local resets = reset_tx + reset_rx
+ if resets > 0 then
+ local rate_suffix = ""
+ local uptime = uptime_seconds()
+ if uptime and uptime >= 60 then
+ rate_suffix = string.format(" (~%.1f/hour since boot)", resets / (uptime / 3600))
+ end
+ if reset_rx == 0 or reset_tx >= reset_rx * 3 then
+ -- Tx-heavy: this router is doing almost all the closing and the
+ -- peer is barely ever resetting back. That's the signature of a
+ -- local abortive close (e.g. a health-check script tearing down
+ -- its own short-lived proxied connection), not the peer/path
+ -- forcing the connection shut.
+ add_issue(issues, "warning", "mptcp_resets",
+ string.format("%d MPTCP-level reset/fastclose event(s) sent by this router%s.", reset_tx, rate_suffix),
+ "Almost all of these were sent by this router, not the peer (received resets are near zero) -- " ..
+ "that points at something local doing an abortive close of its own MPTCP connections (a common " ..
+ "cause: a health-check/keepalive script that opens a proxied connection, makes one quick request, " ..
+ "then closes it hard) rather than active interference on the path or the VPS dropping the tunnel. " ..
+ "Only worth escalating if it's paired with rising SubflowStale/Blackhole counters above.")
+ else
+ add_issue(issues, "warning", "mptcp_resets",
+ string.format("%d MPTCP-level reset/fastclose event(s)%s.", resets, rate_suffix),
+ "One side force-closed the whole MPTCP connection (all subflows at once) rather than a single " ..
+ "subflow -- can indicate active interference or the proxy/VPN tunnel dropping abruptly.")
+ end
+ end
+
+ local addr_drop = (counters.AddAddrDrop or 0) + (counters.RmAddrDrop or 0)
+ if addr_drop > 0 then
+ -- A handful of drops only matters relative to how much ADD_ADDR/RM_ADDR
+ -- traffic there's actually been -- against a large total it's usually a
+ -- one-off from an interface flap or brief restart, already self-healed
+ -- by the next successful signal, not an ongoing problem. Only surface
+ -- this as an issue once drops are a meaningful share of that traffic
+ -- (>1%); with no successful signals at all to compare against, treat
+ -- it as 100% (nothing has gotten through), which is always worth
+ -- surfacing.
+ local addr_total = (counters.AddAddr or 0) + (counters.AddAddrTx or 0)
+ + (counters.RmAddr or 0) + (counters.RmAddrTx or 0)
+ local addr_drop_pct = addr_total > 0 and (100 * addr_drop / addr_total) or 100
+ if addr_drop_pct > 1 then
+ local ratio_suffix = ""
+ if addr_total > 0 then
+ ratio_suffix = string.format(" (%d of %d ADD_ADDR/RM_ADDR signals, %.3g%%)",
+ addr_drop, addr_total, addr_drop_pct)
+ end
+ add_issue(issues, "warning", "mptcp_addr_signal_dropped",
+ string.format("%d ADD_ADDR/RM_ADDR signal(s) dropped%s.", addr_drop, ratio_suffix),
+ "A WAN address announcement (or removal) didn't make it to the peer, so the peer may never " ..
+ "attempt a subflow toward that WAN. A handful of drops against a much larger signal volume is " ..
+ "usually a one-off from an interface flap or a brief proxy restart, and self-heals on the next " ..
+ "successful signal -- only worth chasing further if this keeps climbing.")
+ end
+ end
+
+ if (counters.MPFailTx or 0) > 0 or (counters.MPFailRx or 0) > 0 then
+ add_issue(issues, "warning", "mptcp_mapping_failure",
+ "MPTCP data mapping failure signalled (MP_FAIL).",
+ "One side couldn't map received data to the right place in the byte stream on a subflow -- " ..
+ "that subflow gets torn down and traffic continues on the others, if any remain.")
+ end
+
+ if #issues == 0 then
+ add_issue(issues, "ok", "no_issues_detected",
+ "No MPTCP fallback, blackhole, reset or checksum issues detected right now.",
+ "This only reflects counters since boot/last reset -- a healthy snapshot doesn't rule out an " ..
+ "intermittent issue on a specific path; keep this page open while reproducing the problem.")
+ end
+
+ return issues
+end
+
-- -------------------------------------------------------------------------
-- RPC methods
-- -------------------------------------------------------------------------
@@ -354,6 +717,36 @@ local methods = {
return { output = exec_output(cmd) }
end
},
+
+ -- Diagnostics: kernel MPTCP counters/endpoints/limits + a per-WAN
+ -- endpoint cross-check, turned into a plain-English issue list. See the
+ -- helpers above ("MPTCP Diagnostics" section) for the actual logic.
+ diagnose = {
+ call = function()
+ local settings = kernel_settings()
+ local counters = parse_counters(mptcp_counters_raw())
+ local endpoints = parse_endpoints(exec_output(IP_BIN .. " mptcp endpoint show 2>/dev/null"))
+ local limits = parse_limits(exec_output(IP_BIN .. " mptcp limits show 2>/dev/null"))
+ local wans = wan_endpoint_status(endpoints)
+ local issues = build_issues(settings, counters, wans)
+
+ local connections_raw = exec_output("multipath -c 2>/dev/null")
+ local established_count = 0
+ for _ in connections_raw:gmatch("[Ee][Ss][Tt][Aa][Bb]") do
+ established_count = established_count + 1
+ end
+
+ return {
+ settings = settings,
+ counters = counters,
+ endpoints = endpoints,
+ limits = limits,
+ wans = wans,
+ issues = issues,
+ established_count = established_count,
+ }
+ end
+ },
}
-- -------------------------------------------------------------------------
diff --git a/luci-app-mptcp/root/usr/share/luci/menu.d/luci-app-mptcp.json b/luci-app-mptcp/root/usr/share/luci/menu.d/luci-app-mptcp.json
index 3db1c4762..a402c8155 100644
--- a/luci-app-mptcp/root/usr/share/luci/menu.d/luci-app-mptcp.json
+++ b/luci-app-mptcp/root/usr/share/luci/menu.d/luci-app-mptcp.json
@@ -21,6 +21,17 @@
"acl": [ "luci-app-mptcp" ]
}
},
+ "admin/network/mptcp/mptcp_diagnostics": {
+ "title": "Diagnostics",
+ "order": 12,
+ "action": {
+ "type": "view",
+ "path": "mptcp/mptcp_diagnostics"
+ },
+ "depends": {
+ "acl": [ "luci-app-mptcp" ]
+ }
+ },
"admin/network/mptcp/mptcp_dscp_routing": {
"title": "DSCP / Weight Routing",
"order": 15,
diff --git a/luci-app-mptcp/root/usr/share/rpcd/acl.d/luci-app-mptcp.json b/luci-app-mptcp/root/usr/share/rpcd/acl.d/luci-app-mptcp.json
index 12179b086..cdb82bfa8 100644
--- a/luci-app-mptcp/root/usr/share/rpcd/acl.d/luci-app-mptcp.json
+++ b/luci-app-mptcp/root/usr/share/rpcd/acl.d/luci-app-mptcp.json
@@ -22,7 +22,8 @@
"get_settings",
"set_settings",
"get_interface_settings",
- "set_interface_settings"
+ "set_interface_settings",
+ "diagnose"
]
}
},
diff --git a/luci-app-passwall/Makefile b/luci-app-passwall/Makefile
index 27b248dfc..da9d9036c 100644
--- a/luci-app-passwall/Makefile
+++ b/luci-app-passwall/Makefile
@@ -8,7 +8,7 @@ include $(TOPDIR)/rules.mk
PKG_NAME:=luci-app-passwall
PKG_VERSION:=26.8.12
-PKG_RELEASE:=226
+PKG_RELEASE:=227
PKG_PO_VERSION:=$(PKG_VERSION)
PKG_CONFIG_DEPENDS:= \
@@ -17,6 +17,7 @@ PKG_CONFIG_DEPENDS:= \
CONFIG_PACKAGE_$(PKG_NAME)_INCLUDE_Geoview \
CONFIG_PACKAGE_$(PKG_NAME)_INCLUDE_Haproxy \
CONFIG_PACKAGE_$(PKG_NAME)_INCLUDE_Hysteria \
+ CONFIG_PACKAGE_$(PKG_NAME)_INCLUDE_NaiveProxy \
CONFIG_PACKAGE_$(PKG_NAME)_INCLUDE_Shadowsocks_Rust_Client \
CONFIG_PACKAGE_$(PKG_NAME)_INCLUDE_Shadowsocks_Rust_Server \
CONFIG_PACKAGE_$(PKG_NAME)_INCLUDE_ShadowsocksR_Libev_Client \
@@ -96,6 +97,12 @@ config PACKAGE_$(PKG_NAME)_INCLUDE_Hysteria
select PACKAGE_hysteria
default n
+config PACKAGE_$(PKG_NAME)_INCLUDE_NaiveProxy
+ bool "Include NaiveProxy"
+ depends on !(arc||armeb||loongarch64||mips||mips64||powerpc||TARGET_gemini)
+ select PACKAGE_naiveproxy
+ default n
+
config PACKAGE_$(PKG_NAME)_INCLUDE_Shadowsocks_Rust_Client
bool "Include Shadowsocks Rust Client"
depends on !i386
diff --git a/luci-app-passwall/luasrc/model/cbi/passwall/client/type/6_naive.lua b/luci-app-passwall/luasrc/model/cbi/passwall/client/type/6_naive.lua
new file mode 100644
index 000000000..b00c0c3fc
--- /dev/null
+++ b/luci-app-passwall/luasrc/model/cbi/passwall/client/type/6_naive.lua
@@ -0,0 +1,33 @@
+if not api.is_finded("naive") then
+ return
+end
+
+-- [[ Naive ]]
+local m, s1 = ...
+local type_name = "Naiveproxy"
+
+s1.fields["type"]:value(type_name, "NaïveProxy")
+
+if s1.val["type"] ~= type_name then
+ return
+end
+
+local s = NamedSection(m, arg[1], "server")
+s.type_name = type_name
+s.option_prefix = "naive_"
+
+o = s:option(ListValue, "protocol", translate("Protocol"))
+o:value("https", translate("HTTPS"))
+o:value("quic", translate("QUIC"))
+
+o = s:option(Value, "address", translate("Address (Support Domain Name)"))
+
+o = s:option(Value, "port", translate("Port"))
+o.datatype = "port"
+
+o = s:option(Value, "username", translate("Username"))
+
+o = s:option(Value, "password", translate("Password"))
+o.password = true
+
+api.luci_types(s1, s)
diff --git a/luci-app-passwall/luasrc/passwall/util_naiveproxy.lua b/luci-app-passwall/luasrc/passwall/util_naiveproxy.lua
new file mode 100644
index 000000000..a29cfafe6
--- /dev/null
+++ b/luci-app-passwall/luasrc/passwall/util_naiveproxy.lua
@@ -0,0 +1,42 @@
+module("luci.passwall.util_naiveproxy", package.seeall)
+local api = require "luci.passwall.api"
+local jsonc = api.jsonc
+
+function gen_config(var)
+ local node_id = var["node"]
+ if not node_id then
+ print("node 不能为空")
+ return
+ end
+ local node = api.uci_get_c(node_id)
+ local run_type = var["run_type"]
+ local local_addr = var["local_addr"]
+ local local_port = var["local_port"]
+ local server_host = var["server_host"] or (node.address or ""):lower()
+ local server_port = var["server_port"] or node.port
+
+ if api.is_ipv6(server_host) then
+ server_host = api.get_ipv6_full(server_host)
+ end
+ local server = server_host .. ":" .. server_port
+
+ local config = {
+ listen = run_type .. "://" .. local_addr .. ":" .. local_port,
+ proxy = node.protocol .. "://" .. node.username .. ":" .. node.password .. "@" .. server
+ }
+
+ return jsonc.stringify(config, 1)
+end
+
+_G.gen_config = gen_config
+
+if arg[1] then
+ local func =_G[arg[1]]
+ if func then
+ local var = nil
+ if arg[2] then
+ var = jsonc.parse(arg[2])
+ end
+ print(func(var))
+ end
+end
diff --git a/luci-app-passwall/root/usr/share/passwall/app.sh b/luci-app-passwall/root/usr/share/passwall/app.sh
index 847390709..d0e914264 100755
--- a/luci-app-passwall/root/usr/share/passwall/app.sh
+++ b/luci-app-passwall/root/usr/share/passwall/app.sh
@@ -13,6 +13,7 @@ LUA_UTIL_PATH=/usr/lib/lua/luci/passwall
UTIL_SINGBOX=$LUA_UTIL_PATH/util_sing-box.lua
UTIL_SS=$LUA_UTIL_PATH/util_shadowsocks.lua
UTIL_XRAY=$LUA_UTIL_PATH/util_xray.lua
+UTIL_NAIVE=$LUA_UTIL_PATH/util_naiveproxy.lua
UTIL_HYSTERIA2=$LUA_UTIL_PATH/util_hysteria2.lua
SINGBOX_BIN=$(first_type $(config_t_get global_app sing_box_file) sing-box)
XRAY_BIN=$(first_type $(config_t_get global_app xray_file) xray)
@@ -455,6 +456,13 @@ run_socks() {
[ -n "$no_run" ] && _args="${_args} no_run=1"
run_xray flag=$flag node=$node socks_address=$bind socks_port=$socks_port config_file=$config_file log_file=$log_file ${_args}
;;
+ naiveproxy)
+ json_add_string "run_type" "socks"
+ json_add_string "local_addr" "$bind"
+ json_add_string "local_port" "$socks_port"
+ lua $UTIL_NAIVE gen_config "$(json_dump)" > $config_file
+ [ -n "$no_run" ] || ln_run "$(first_type naive)" naive $log_file "$config_file"
+ ;;
ssr)
json_add_string "local_addr" "$bind"
json_add_string "local_port" "$socks_port"
diff --git a/luci-theme-footstrap/Makefile b/luci-theme-footstrap/Makefile
index ce07ba1f0..4eaec10c1 100644
--- a/luci-theme-footstrap/Makefile
+++ b/luci-theme-footstrap/Makefile
@@ -17,7 +17,7 @@ LUCI_NAME:=luci-theme-footstrap
FOOTSTRAP_VERSION?=
ifneq ($(FOOTSTRAP_VERSION),)
PKG_VERSION:=$(FOOTSTRAP_VERSION)
-PKG_RELEASE:=22
+PKG_RELEASE:=23
endif
LUCI_TITLE:=Footstrap Theme
diff --git a/luci-theme-footstrap/dev-sync.sh b/luci-theme-footstrap/dev-sync.sh
index 46af51b80..392643b7f 100755
--- a/luci-theme-footstrap/dev-sync.sh
+++ b/luci-theme-footstrap/dev-sync.sh
@@ -132,4 +132,19 @@ rm -f /tmp/luci-indexcache*"
scp -q "$D"/root/etc/uci-defaults/30_luci-theme-footstrap "$R":/tmp/30_luci-theme-footstrap
ssh "$R" "PKG_UPGRADE=1 sh /tmp/30_luci-theme-footstrap; rm -f /tmp/30_luci-theme-footstrap /tmp/luci-indexcache*"
+
+# ---- BUST THE BROWSER CACHE, or a dev deploy is invisible to the device you are testing on ----
+#
+# head.ut versions every asset with `?v={{ pkgs_update_time }}`, and luci-base derives that from the
+# mtime of the PACKAGE DATABASE (runtime.uc: /lib/apk/db/installed, falling back to
+# /usr/lib/opkg/status). Installing a package moves it; scp'ing files over an existing install does
+# not — so a dev deploy leaves the URL identical while the bytes underneath change, and a browser is
+# entitled to keep serving what it already has. On a phone that is not a theory: a whole afternoon of
+# "still shakes" reports were taken against a stylesheet several deploys old.
+#
+# Touching the database file is what an install would have done to it, so the next page carries a new
+# `?v=` for every asset and nothing can be stale. Router-only, dev-only: nothing in the package does
+# this.
+ssh "$R" 'touch /lib/apk/db/installed 2>/dev/null || touch /usr/lib/opkg/status 2>/dev/null || true'
+
echo "synced to $R (single Footstrap theme registered, active theme unchanged)"
diff --git a/luci-theme-footstrap/htdocs/luci-static/resources/fs-chrome.js b/luci-theme-footstrap/htdocs/luci-static/resources/fs-chrome.js
index 8d08c7952..e53965512 100644
--- a/luci-theme-footstrap/htdocs/luci-static/resources/fs-chrome.js
+++ b/luci-theme-footstrap/htdocs/luci-static/resources/fs-chrome.js
@@ -210,6 +210,14 @@ function fitShell() {
}
function fitChrome() {
+ /* Nothing this function asks can change while the reader scrolls — the bar's width, the menu's
+ * width, the room beside the brand — and every one of those questions is a layout read landing
+ * in the middle of a flick. Put off until the scrolling stops; see fs-fit.js. */
+ if (fit.scrolling()) {
+ fit.deferMeasurement();
+ return;
+ }
+
fitShell();
const bar = document.querySelector('.fs-sidebar');
@@ -463,5 +471,20 @@ return baseclass.extend({
/* registered with fs-fit by the theme's init(): the bar's "does the menu fit beside the brand"
* measurement rides the same engine as the data tables' */
fitChrome,
+
+ /* The width a page's content column has, WITHOUT reading layout. The sidebar (or the rail) eats
+ * a known amount of the window and the shell adds a known padding, and all three are already
+ * memoised against the density attribute for `fitShell()`. It is exported because a pass that
+ * must answer mid-scroll — fs-select's, for a table the poll has just brought in — otherwise has
+ * only `window.innerWidth`, which in the sidebar layout is the wrong number by exactly the
+ * sidebar: at an 800px window the column is 520px, so the cheap judgement said "plenty of room"
+ * for a table that then overflowed and was clipped. */
+ contentWidth() {
+ const g = shellGeometry();
+ const narrow = document.documentElement.hasAttribute('data-narrow');
+ /* in the bar layout the chrome is above the content, not beside it */
+ const cut = narrow ? 0 : (prefs.currentRail() ? g.railW : g.sidebarW);
+ return Math.max(0, window.innerWidth - cut - (g.contentPad * 2));
+ },
wireRail
});
diff --git a/luci-theme-footstrap/htdocs/luci-static/resources/fs-fit.js b/luci-theme-footstrap/htdocs/luci-static/resources/fs-fit.js
index ae82bf1dc..2e72e29ac 100644
--- a/luci-theme-footstrap/htdocs/luci-static/resources/fs-fit.js
+++ b/luci-theme-footstrap/htdocs/luci-static/resources/fs-fit.js
@@ -20,21 +20,184 @@
* ResizeObserver, not onresize: a rail collapse and a layout toggle change the content width
* without resizing the window. */
+/* THE STYLESHEET MAY ONLY HIDE WHAT THIS FILE WILL SHOW, AND THE ARM BELONGS TO THE DISARM.
+ * `theme/30-tables.css` keeps a data table out of the layout until something marks it `.fs-fitted`.
+ * This attribute is what arms that rule — and it used to be written here, at module eval, while the
+ * only code that ever writes `.fs-fitted` lives in fs-select.js, which the footer requires
+ * SEPARATELY (`partials/footer.ut`: one require for menu-footstrap, another for fs-select, with no
+ * dependency edge between them). A document that loaded this file and not that one — a failed
+ * fetch, a parse error, a throw in fs-select's own init — armed a rule nobody could clear, and every
+ * data table on Status/Leases/Processes/Wireless rendered as nothing at all, silently.
+ *
+ * So the arming is exported instead, and the module that clears the rule is the one that raises it.
+ * A document where fs-select never ran carries no attribute and shows every table exactly as it did
+ * before the rule existed. */
+function armGate() {
+ if (!fittersEnabled()) return;
+ try { document.documentElement.dataset.fsFit = '1'; } catch (e) { /* no document, no gate */ }
+}
+
const _fitters = [];
let _rafPending = false;
let _ro = null, _mo = null, _moFlag = null;
-/* Run every fitter NOW, synchronously. A fitter must be idempotent — this fires on every
- * relevant mutation. */
-function run() {
- for (const fit of _fitters) {
+/* ---- A PASS THAT READS LAYOUT MAY NOT RUN WHILE THE READER SCROLLS ----
+ *
+ * Reading layout — `getBoundingClientRect()`, `clientWidth`, `scrollWidth` — forces the engine to
+ * lay the page out synchronously. Once a second, from a poll tick, in the middle of a flick on a
+ * phone, that is what iOS holds the main thread back to prevent, and it was the largest part of the
+ * shaking reported from an iPhone; a stock theme has no JS in that path at all.
+ *
+ * The rule is stated by each pass rather than by this file, and that is not an oversight — the
+ * central version was written, measured and reverted, because moving the decision here also moved
+ * WHEN the deferred work lands and the device started shaking again. A pass that reads layout asks
+ * `scrolling()` and calls `deferMeasurement()`; a pass that only writes does neither and runs
+ * always. The one that must run always is the marking of a freshly polled table: the stylesheet
+ * keeps an unmarked data table out of the layout, so waiting would leave it invisible for as long
+ * as the reader keeps scrolling. */
+function runAll(list, what) {
+ for (const fit of list) {
try { fit(); }
/* one broken fitter must take neither the others nor the poll's MutationObserver
* callback with it — that would silently stop ALL re-fitting */
- catch (e) { console.error('fs-fit: a fitter threw', e); }
+ catch (e) { console.error('fs-fit: a ' + what + ' threw', e); }
}
}
+/* Everything that may run right now, with the reader kept where they were.
+ *
+ * ONE PATH: the mutation observer, the coalesced re-fit and the pass that was put off during a
+ * scroll all come through here, so the order — reference, work, correction — is stated once.
+ * `anchorRef()` answers null while the reader scrolls and the correction below does nothing with a
+ * pass that happens mid-scroll costs neither of the two layout reads.
+ *
+ * WHAT MAY RUN MID-SCROLL IS EACH PASS'S OWN ANSWER, not this function's. A pass that only writes —
+ * marking a freshly polled table, which cannot wait because the stylesheet holds an unmarked table
+ * out of the layout — runs always; a pass that reads layout asks `scrolling()` first and calls
+ * `deferMeasurement()`. Deciding it here instead was tried and reverted: it changed WHEN the
+ * deferred work lands, and the device that had the problem started shaking again. */
+/* DEV SWITCH: `localStorage.fsFit = 'off'` stops every fitter. It exists because the only way to
+ * tell "the theme's measuring is what shakes this phone" from "something else is" is to turn the
+ * measuring off ON THAT PHONE, and a laptop cannot answer it. */
+function fittersEnabled() {
+ try { return localStorage.getItem('fsFit') !== 'off'; }
+ catch (e) { return true; }
+}
+function run() {
+ if (!fittersEnabled()) return;
+ runAll(_fitters, 'fitter');
+}
+
+/* ---- IS THE PAGE MOVING RIGHT NOW? — ASKED OF THE POSITION, NEVER OF THE EVENTS ----
+ *
+ * A pass that reads layout must not run while the page moves: on a phone every such read forces a
+ * synchronous layout in the middle of a flick, which is the work iOS holds the main thread back to
+ * prevent. So the passes ask this before measuring, and what they skipped is run once the movement
+ * stops.
+ *
+ * THE FIRST VERSION ASKED THE EVENTS — `scroll`, `wheel`, `touchmove`, plus 200 ms of quiet — and it
+ * was wrong in the one place it mattered. On iOS the momentum keeps carrying the page long after the
+ * finger has gone, and events do not reliably arrive through it; the timer then declared the reader
+ * still and dropped the whole deferred pass — every table stripped and measured, the chrome
+ * re-fitted — into the middle of the glide. That is a stall and a relayout while the page is
+ * visibly moving, and it is the shaking that came BACK when a refactor made less work happen during
+ * the scroll and more of it land in that burst. The measurement that named it: the same device
+ * shook more with strictly less work in the scroll path.
+ *
+ * So movement is read from the SCROLL POSITION. A frame in which the offset differs from the last is
+ * movement, whatever the event stream is doing; the sampler runs only while there is reason to
+ * think the page moves, and stops itself when the offset has held for SCROLL_IDLE. Momentum,
+ * rubber-banding and a programmatic `scrollTo` all look the same to it, which is the point.
+ *
+ * The offset read is one per frame, and it is the cheapest question there is — no geometry, no
+ * element, no forced layout beyond what the frame already needs. */
+/* HOW LONG THE PAGE MUST HOLD STILL BEFORE THE PUT-OFF WORK MAY RUN, and the number is the fix for
+ * the shaking, not a tuning knob.
+ *
+ * 200ms was shorter than the pauses a slow reader leaves. Rocking a page gently at the tables — the
+ * reader's own description of when it happens — the offset stops for a moment between one movement
+ * and the next, this timer called that a stop, and the whole deferred pass landed in the middle of
+ * the gesture: every table stripped of its marks, measured, marked again. That is a full relayout
+ * while the page is visibly moving, and it is what "jerks back and forth" was.
+ *
+ * Measured on a stand with the reader's motion imitated (a slow rock, 60 frames, the error between
+ * what the wheel asked for and what the page did, summed): 137-256px of roughness at 200ms with
+ * every twentieth frame off by 40px, and 59px — the floor, one pixel of rounding per frame, the same
+ * as switching the fitters off entirely — at 250ms and above. 400 is that floor with room to spare,
+ * and still well inside the time a reader takes to look at what they scrolled to. */
+const SCROLL_IDLE = 400;
+/* set by a pass that skipped its measurement because the page was moving; consumed by the sampler
+ * below the moment it stops */
+let _deferred = false;
+function deferMeasurement() { _deferred = true; }
+let _movingUntil = 0;
+let _lastOffset = null;
+let _sampling = false;
+
+/* WHICH ELEMENT SCROLLS, ASKED ONCE PER WIDTH RATHER THAN ONCE PER FRAME.
+ *
+ * This function is the one every other pass consults before it dares to measure, and it ran in the
+ * frame loop below for as long as the page moved — so the `scrollHeight`/`clientHeight` probe it
+ * used to make WAS a forced synchronous layout, once per frame, in the middle of the flick this file
+ * exists to keep clear. Worse, a poll tick lands as a microtask that writes classes, so the very
+ * next frame's probe paid for a layout that had just been dirtied; and `touchstart` starts the
+ * sampler, so a plain tap on a button bought ~24 of them.
+ *
+ * The answer cannot change without the room changing: the two layouts scroll different elements and
+ * the switch between them is a width change, which `onResize` already watches and stamps. So the
+ * verdict is cached against that stamp and the offset is then read from the scroller directly —
+ * `scrollTop` on an element and `scrollY` on the window are both free. */
+let _scroller = null, _scrollerAt = -1;
+function scroller() {
+ if (_scrollerAt === _resizeSeq && (_scroller === null || _scroller.isConnected)) return _scroller;
+ const sc = document.getElementById('maincontent');
+ _scroller = (sc && sc.scrollHeight - sc.clientHeight > 4) ? sc : null;
+ _scrollerAt = _resizeSeq;
+ return _scroller;
+}
+function scrollTop() {
+ const sc = scroller();
+ return sc ? sc.scrollTop : window.scrollY;
+}
+
+function scrolling() { return Date.now() < _movingUntil; }
+
+function sampleMotion() {
+ const y = scrollTop();
+ if (_lastOffset === null || y !== _lastOffset) {
+ _lastOffset = y;
+ _movingUntil = Date.now() + SCROLL_IDLE;
+ }
+ if (scrolling()) { requestAnimationFrame(sampleMotion); return; }
+ _sampling = false;
+ /* the page has held still for SCROLL_IDLE: whatever was put off may run now */
+ if (_deferred) {
+ _deferred = false;
+ const ref = anchorRef();
+ run();
+ scheduleAnchor(ref);
+ }
+}
+
+function noteMotion() {
+ _movingUntil = Date.now() + SCROLL_IDLE;
+ if (_sampling) return;
+ _sampling = true;
+ requestAnimationFrame(sampleMotion);
+}
+
+/* `passive: true` and `capture: true`: this must never sit in front of the scroll it is watching,
+ * and `scroll` does not bubble from an element — it only travels down the capture phase, which is
+ * how the sidebar layout's inner scroller is seen as well as the document. The events only START
+ * the sampler; whether the page is still moving is the sampler's answer, not theirs. */
+(function watchMotion() {
+ const opts = { passive: true, capture: true };
+ window.addEventListener('scroll', noteMotion, opts);
+ window.addEventListener('wheel', noteMotion, opts);
+ window.addEventListener('touchstart', noteMotion, opts);
+ window.addEventListener('touchmove', noteMotion, opts);
+})();
+
/* Next frame, at most once per frame (rule 3). */
function schedule() {
if (_rafPending) return;
@@ -59,6 +222,9 @@ function schedule() {
*
* Per element, because the roots are observed separately and a dialog can resize while #view does
* not. The first entry for an element always counts as a change, so nothing is lost at start-up. */
+/* bumped whenever an observed root changes WIDTH — the only thing that can change which element
+ * scrolls, and therefore what `scroller()` above may cache */
+let _resizeSeq = 0;
const _lastWidth = new WeakMap();
function onResize(entries) {
let widthMoved = false;
@@ -71,7 +237,7 @@ function onResize(entries) {
widthMoved = true;
}
}
- if (widthMoved) schedule();
+ if (widthMoved) { _resizeSeq++; schedule(); }
}
/* Watch an element's size. A change in WIDTH re-fits everything — the fitters are cheap and few. */
@@ -85,6 +251,111 @@ function watch(el) {
_ro.observe(el);
}
+/* ---- SCROLL ANCHORING, WHERE THE ENGINE HAS NONE ----
+ *
+ * A poll tick changes the height of what is ABOVE the reader: a lease expires, a station joins, a
+ * section renders one row fewer. An engine with scroll anchoring absorbs that — it moves the scroll
+ * offset by the same amount, so the page under the reader does not move. WebKit has none, and it is
+ * every browser on iOS: measured on the reporter's own router, `content +133px, +134px, +123px,
+ * +108px…` one after another, each next to a `child +1/-1` in a polled section. That is the shaking,
+ * and it is not the tall-intermediate problem the rest of this file solves — the height change here
+ * is REAL, and simply nobody compensates for it.
+ *
+ * So this compensates for it, and only when nobody else did. A reference is taken from the elements
+ * that survive a poll — the section frames — choosing the one that crosses the top of the viewport,
+ * because that is the boundary a reader perceives as "where I am". The fitters run, the reference is
+ * read again, and the offset is moved by however far it drifted.
+ *
+ * WHY THIS IS SAFE ON AN ENGINE THAT DOES ANCHOR, which an earlier attempt got wrong by measuring
+ * the wrong thing: the correction is computed from the REFERENCE, not from the scroll offset. An
+ * anchoring engine has already put the reference back where it was by the time this reads it — the
+ * read forces layout, and the adjustment happens during layout — so the drift is zero and this does
+ * nothing at all. Measuring the offset instead reads an anchoring adjustment as a fault and corrects
+ * a correction, which is exactly how a previous version made Chromium worse (16 movements, 1827px).
+ *
+ * It never fights the user: a page at the very top has no offset to give back and is left alone, and
+ * a drift under a pixel is rounding rather than movement. */
+function anchorRef() {
+ /* NOT WHILE THE READER SCROLLS. Every rect read here is a forced layout, and this runs on every
+ * content mutation — i.e. once a second, in the middle of a flick, which is the work iOS holds
+ * the main thread back to avoid. The compensation exists for a page the reader is looking at,
+ * not for one they are already moving; while they scroll there is nothing to keep still. */
+ if (scrolling()) return null;
+ const frames = document.querySelectorAll('#view .cbi-section, #view > .cbi-section-node, #view > div');
+ for (const el of frames) {
+ const r = el.getBoundingClientRect();
+ /* the frame the viewport's top edge cuts through */
+ if (r.top <= 0 && r.bottom > 0) return { el, top: r.top };
+ }
+ return null;
+}
+/* THE CORRECTION IS UNCONDITIONAL, AND IT IS A NO-OP WHERE THE ENGINE DOES THE JOB.
+ *
+ * There used to be a watching phase here: the first three mutations were only measured, and a
+ * reference that had held still meant "this engine anchors, never touch the offset again". It was
+ * wrong in the way that mattered. WebKit does not anchor, but the drift it leaves is often small —
+ * a value grew a line, a row appeared — so three quiet samples were easy to come by, the
+ * compensation switched itself off for the life of the document, and the page walked downwards a
+ * few pixels at a time, once per poll tick. That is exactly how it was reported: "jerks a little
+ * downwards, all the time".
+ *
+ * Correcting always is safe because the correction is computed from the REFERENCE, not from the
+ * scroll offset: an engine that anchors has already put the reference back by the time this reads
+ * it — the read forces layout, and the adjustment happens during layout — so the drift is zero and
+ * nothing is written. Measuring the OFFSET instead reads an anchoring adjustment as a fault and
+ * corrects a correction, which is how an earlier version made Chromium worse (10 movements up to
+ * 1616px against 0 without it); that mistake is not in this shape.
+ *
+ * Two guards remain, and both are about not fighting the reader: a page at the very top has no
+ * offset to give back, and a drift under a pixel is rounding rather than movement. */
+/* ONCE PER FRAME, AFTER EVERYTHING HAS LANDED — not once per mutation batch.
+ *
+ * A poll tick does not arrive as one mutation: luci-mod-status fills its sections one after another,
+ * and each fill wakes this observer. Correcting on each of them measures a page that is still being
+ * written: the reference is read between two batches, the drift is computed against a layout that
+ * the next batch immediately invalidates, and the correction is wrong by whatever the rest of the
+ * tick brought. The next tick corrects the other way. That is a page that jerks while nobody
+ * touches it, and it is what was reported — with a telling detail: it went away whenever a
+ * diagnostic probe that forced layout on EVERY frame was loaded, because then every reading this
+ * code took happened to be against a settled layout.
+ *
+ * So the reference is taken at the first mutation of a batch and the correction is applied in a
+ * requestAnimationFrame — after the batch, after style and layout have settled, once. A newer
+ * reference is not taken while one is pending: the first one is where the reader actually was. */
+let _anchorPending = null;
+let _anchorFrame = 0;
+/* DEV SWITCH, for the device that has the problem: `localStorage.fsAnchor = 'off'` stops the theme
+ * from ever writing the scroll offset, which is the one thing here that can move a page nobody is
+ * touching. It exists to answer a question a laptop cannot — whether the correction is the cure or
+ * the disease — and comes out with the answer. */
+function anchorEnabled() {
+ try { return localStorage.getItem('fsAnchor') !== 'off'; }
+ catch (e) { return true; }
+}
+function scheduleAnchor(ref) {
+ if (!ref || !anchorEnabled()) return;
+ if (_anchorPending) return;
+ _anchorPending = ref;
+ if (_anchorFrame) return;
+ _anchorFrame = requestAnimationFrame(() => {
+ _anchorFrame = 0;
+ const pending = _anchorPending;
+ _anchorPending = null;
+ applyAnchor(pending);
+ });
+}
+function applyAnchor(ref) {
+ if (!ref || !ref.el.isConnected) return;
+ const sc = document.getElementById('maincontent');
+ const inner = sc && sc.scrollHeight - sc.clientHeight > 4;
+ const at = inner ? sc.scrollTop : window.scrollY;
+ if (at <= 0) return;
+ const drift = ref.el.getBoundingClientRect().top - ref.top;
+ if (Math.abs(drift) < 1) return;
+ if (inner) sc.scrollTop = at + drift;
+ else window.scrollTo(0, at + drift);
+}
+
/* Rule 2's mutation side. Deliberately NOT filtered by node type: a filter is a second place to
* get wrong (the table fitter's own once said `table.table`, and LuCI renders most of its tables
* as DIVs — so the poll never re-measured at all), and run() is a handful of measurements. */
@@ -100,7 +371,12 @@ function watch(el) {
* constructor, and luci-base instantiates a class exactly once, at the first require. */
function observeContent() {
if (_mo) return;
- _mo = new MutationObserver(run);
+ _mo = new MutationObserver(() => {
+ /* what the reader is looking at, before the poll's mutation and the fitters move anything */
+ const ref = anchorRef();
+ run();
+ scheduleAnchor(ref);
+ });
for (const host of [ document.getElementById('view') || document.body, document.getElementById('modal_overlay') ]) {
if (!host) continue;
_mo.observe(host, { childList: true, subtree: true });
@@ -136,11 +412,21 @@ return baseclass.extend({
fit();
},
+ /* Is the reader scrolling, and "I could not measure, wake me when they stop". A pass that has to
+ * read layout asks the first and calls the second; a pass that only writes does neither. */
+ scrolling,
+ deferMeasurement,
+
+ /* Raise the stylesheet's "an unanswered table takes no room" rule. Called by the module that
+ * answers — see armGate above; nothing else may call it. */
+ armGate,
+
/* Re-fit on the next frame, coalesced. (There is no exported `run`: everything that changes
* the available room — the layout toggle, the rail collapse — schedules. Only the mutation
* observer re-fits synchronously, and that is rule 2's whole point.) */
schedule,
+
/* Coalesce ANY callback into one call per frame (rule 3, for non-fitters): schedule() runs
* EVERY fitter, so a caller wanting only its own work batched cannot use it — three had
* hand-rolled the identical five lines. NOT for the per-element case: menu-footstrap.js's
diff --git a/luci-theme-footstrap/htdocs/luci-static/resources/fs-router.js b/luci-theme-footstrap/htdocs/luci-static/resources/fs-router.js
index 254ee8b55..ae560e17c 100644
--- a/luci-theme-footstrap/htdocs/luci-static/resources/fs-router.js
+++ b/luci-theme-footstrap/htdocs/luci-static/resources/fs-router.js
@@ -32,20 +32,45 @@
* Hooked at module eval — before any view render can set a timer, and LuCI resolves a module's
* dependencies BEFORE running the dependent's factory, so this runs no later than it used to when
* it sat in menu-footstrap-common.js itself. */
-const _viewIntervals = (window.__fsViewIntervals || (window.__fsViewIntervals = new Set()));
+const _viewIntervals = (window.__fsViewIntervals || (window.__fsViewIntervals = new Map()));
(function hookIntervals() {
if (window.__fsIntervalsHooked) return;
window.__fsIntervalsHooked = true;
const _si = window.setInterval, _ci = window.clearInterval;
- window.setInterval = function () {
+ window.setInterval = function (fn, ms) {
const id = _si.apply(window, arguments);
- _viewIntervals.add(id);
+ /* the arguments are kept, not just the id: a paused timer has to be re-armed with what it
+ * was armed with, and a `setInterval` id carries none of that back */
+ _viewIntervals.set(id, { fn, ms, rest: Array.prototype.slice.call(arguments, 2) });
return id;
};
window.clearInterval = function (id) {
_viewIntervals.delete(id);
return _ci.apply(window, arguments);
};
+ /* A HIDDEN TAB MUST NOT KEEP CALLING THE ROUTER. `wireVisibility()` below stops LuCI's own poll
+ * when the tab goes away, which is most of the traffic — but a view is free to run a plain
+ * `setInterval` of its own (luci-app-podkop's log tailer does), and those kept hammering ubus in
+ * a background tab for as long as it stayed open. The registry that navigation already uses to
+ * clear them is enough to pause them too: cleared on hide, re-armed on show with the same
+ * callback and period, so a view that was polling every 3 s is polling every 3 s again and one
+ * that was cleared meanwhile stays cleared. */
+ let _paused = [];
+ document.addEventListener('visibilitychange', () => {
+ if (document.hidden) {
+ _paused = [];
+ for (const [ id, spec ] of _viewIntervals) {
+ _paused.push(spec);
+ _ci.call(window, id);
+ _viewIntervals.delete(id);
+ }
+ }
+ else {
+ const back = _paused;
+ _paused = [];
+ for (const spec of back) window.setInterval(spec.fn, spec.ms, ...spec.rest);
+ }
+ });
})();
function clearViewIntervals() {
/* `L.Poll.timer` is the id of LuCI's OWN 1 s tick, and it is private state — `add`/`remove`/
@@ -84,7 +109,8 @@ function clearViewIntervals() {
return;
}
const keep = running ? L.Poll.timer : null;
- _viewIntervals.forEach((id) => { if (id !== keep) window.clearInterval(id); });
+ /* Map, not Set: the key is the timer id and the value is what it would take to re-arm it */
+ _viewIntervals.forEach((spec, id) => { if (id !== keep) window.clearInterval(id); });
}
/* ONE line per document whatever went wrong: this runs on every navigation, and a router that
* cannot read L.Poll cannot read it on the next click either — a message per click would bury the
diff --git a/luci-theme-footstrap/htdocs/luci-static/resources/fs-select.js b/luci-theme-footstrap/htdocs/luci-static/resources/fs-select.js
index 967561153..c9d92b891 100644
--- a/luci-theme-footstrap/htdocs/luci-static/resources/fs-select.js
+++ b/luci-theme-footstrap/htdocs/luci-static/resources/fs-select.js
@@ -3,6 +3,8 @@
'require ui';
'require dom';
'require fs-fit as fit';
+/* for the content column's width without a layout read — see the mid-scroll branch in fitTables */
+'require fs-chrome as chrome';
/* Theme plain LuCI