🤞 Sync 2026-10-29 22:46:41

This commit is contained in:
github-actions[bot] committed 2026-10-29 22:46:41 +08:00
1 parent ff521a5a6a
commit 8d20d896c0
78 files changed
+16387 -1210

No files matched your search

@@ -146,7 +146,10 @@ return L.view.extend({
_('bpf_burst => same as the default scheduler') + '<br />' +
_('bpf_red => sends all packets redundantly on all available subflows') + '<br />' +
_('bpf_first => always picks the first subflow to send data') + '<br />' +
_('bpf_rr => always picks the next available subflow to send data (round-robin)')
_('bpf_rr => always picks the next available subflow to send data (round-robin)') + '<br />' +
_('bpf_ecf => sends on the lowest-latency subflow, and on a slower one only when that does not delay the data') + '<br />' +
_('bpf_blest => sends on the lowest-latency subflow, and on a slower one only when that does not block the fastest one') + '<br />' +
_('bpf_overflow => uses the subflows by weight: a lower weight only carries what the higher ones cannot')
);
scheduler.value("default", _("default"));
@@ -178,6 +181,9 @@ return L.view.extend({
// bpf_red => sends all packets redundantly on all available subflows
// bpf_first => always picks the first subflow to send data
// bpf_rr => always picks the next available subflow to send data (round-robin)
// bpf_ecf => sends on the lowest-latency subflow, and on a slower one only when that does not delay the data
// bpf_blest => sends on the lowest-latency subflow, and on a slower one only when that does not block the fastest one
// bpf_overflow => uses the subflows by weight: a lower weight only carries what the higher ones cannot
}
scheduler.onchange = function(ev, section_id, value) {
@@ -203,6 +209,7 @@ return L.view.extend({
o.depends("mptcp_scheduler", "bpf_weight");
o.depends("mptcp_scheduler", "bpf_weight_rr");
o.depends("mptcp_scheduler", "bpf_burstweight");
o.depends("mptcp_scheduler", "bpf_overflow");
/* Every option below that depends() on another field keeps its stored
* value while hidden: form.js otherwise removes it on any save, so a
* save made with another scheduler or with mptcp_pm_type=0 silently
@@ -402,7 +409,7 @@ return L.view.extend({
// (discussion #4368).
o.rmempty = false;
o = s.option(form.Value, "multipath_weight", _("Weight"), _("Only used by *weight schedulers/path managers. Ignored if no weight scheduler is selected.") + '<br />' + _("A weight >100 make it more attractive, a weight <100 make it less attractive. Max 256"));
o = s.option(form.Value, "multipath_weight", _("Weight"), _("Only used by the weight schedulers (bpf_weight, bpf_weight_rr, bpf_burstweight, bpf_overflow) and path managers. Ignored if no weight scheduler is selected.") + '<br />' + _("A weight >100 make it more attractive, a weight <100 make it less attractive. Max 256"));
// 1 to 256, as "ip route" takes it: the schedulers read 0 as no weight
// (neutral 100) and add the weight to a signed counter
o.datatype = "and(uinteger,range(1,256))";
@@ -96,7 +96,7 @@ return L.view.extend({
var mptcpScheduler = normalizeSchedulerValue(uci.get('network', 'globals', 'mptcp_scheduler'));
var mptcpHasDscpScheduler = (mptcpScheduler === 'bpf_dscp');
var mptcpHasWeightScheduler = (mptcpScheduler === 'bpf_weight' || mptcpScheduler === 'bpf_weight_rr' || mptcpScheduler === 'bpf_burstweight');
var mptcpHasWeightScheduler = (mptcpScheduler === 'bpf_weight' || mptcpScheduler === 'bpf_weight_rr' || mptcpScheduler === 'bpf_burstweight' || mptcpScheduler === 'bpf_overflow');
var mqvpnEnabled = (mqvpn.enabled === true);
var mqvpnScheduler = mqvpn.scheduler;
@@ -115,10 +115,10 @@ return L.view.extend({
var showWeight = mptcpHasWeightScheduler || mqvpnHasWeightScheduler;
m = new form.Map('network', _('DSCP / Weight Routing'),
_('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.'));
_('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.'));
if (!showDscp && !showWeight) {
m.description += '<br /><br />' + _('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.');
m.description += '<br /><br />' + _('Nothing to show yet: no DSCP scheduler (bpf_dscp) or weight scheduler (bpf_weight/bpf_weight_rr/bpf_burstweight/bpf_overflow, or mqvpn’s Weighted RTT/Weighted Round Robin) is currently selected on the MPTCP or MQVPN pages.');
return m.render();
}
@@ -170,7 +170,7 @@ 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/bpf_overflow) 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) && isMultipathEnabledIface(section);