luci-mod-network: check kernel for mptcp to display MPTCP options
authorPaul Donald <redacted>
Sat, 4 Apr 2026 17:12:54 +0000 (19:12 +0200)
committerPaul Donald <redacted>
Sat, 4 Apr 2026 17:12:54 +0000 (19:12 +0200)
https://www.kernel.org/doc/html/v6.12/networking/mptcp-sysctl.html

There may be user instances where mptcp was not compiled
into the kernel or is an unloaded module, so gate the options
behind the feature check.

Closes #8522

Signed-off-by: Paul Donald <redacted>
modules/luci-base/root/usr/share/rpcd/ucode/luci
modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js

index ca95ded897403e6aa2a1e30d8528ce614b4bc177..b54011a84f4f2f7b0eeb89dcb06034574cb49099 100644 (file)
@@ -242,6 +242,7 @@ const methods = {
                                ufpd:       access('/usr/sbin/ufpd') == true,
                                vrf:        access('/sys/module/vrf/refcnt') == true, // vrf.ko is loaded
                                netifd_vrf: false,
+                               mptcp:      access('/proc/sys/net/mptcp/enabled'),
                        };
 
                        const wifi_features = [ 
index 9fc453c38a1b96c0cf3e295d35d6ad43636b3c88..5fad6f343fa90d7ec465dffcbf7c1fd5bd982f5e 100644 (file)
@@ -1216,14 +1216,16 @@ return view.extend({
                                o.datatype = 'uinteger';
                                o.placeholder = '0';
 
-                               o = nettools.replaceOption(s, 'advanced', form.RichListValue, 'multipath', _('Multi-Path TCP'),
-                                       _('Multi-Path TCP') + ' %s'.format('<a href="%s" target="_blank">RFC8684</a>').format('https://www.rfc-editor.org/rfc/rfc8684.html') + '<br/>' +
-                                       _('For packets originating from this device, e.g. VPN.') );
-                               o.value('off', _('Off'), _('Disables this interface for MPTCP'));
-                               o.value('on', _('On'), _('No special configuration'));
-                               o.value('master', _('Master'), _('Sets default route for all traffic'));
-                               o.value('backup', _('Backup'), _('Hot standby; use this interface; do not forward traffic until no other interface is available (faster)'));
-                               o.value('handover', _('Handover'), _('Cold standby; Establish a connection only when no other interface is available (slower)'));
+                               if (L.hasSystemFeature('mptcp')) {
+                                       o = nettools.replaceOption(s, 'advanced', form.RichListValue, 'multipath', _('Multi-Path TCP'),
+                                               _('Multi-Path TCP') + ' %s'.format('<a href="%s" target="_blank">RFC8684</a>').format('https://www.rfc-editor.org/rfc/rfc8684.html') + '<br/>' +
+                                               _('For packets originating from this device, e.g. VPN.') );
+                                       o.value('off', _('Off'), _('Disables this interface for MPTCP'));
+                                       o.value('on', _('On'), _('No special configuration'));
+                                       o.value('master', _('Master'), _('Sets default route for all traffic'));
+                                       o.value('backup', _('Backup'), _('Hot standby; use this interface; do not forward traffic until no other interface is available (faster)'));
+                                       o.value('handover', _('Handover'), _('Cold standby; Establish a connection only when no other interface is available (slower)'));
+                               }
 
                                o = nettools.replaceOption(s, 'advanced', form.Value, 'ip4table', _('Override IPv4 routing table'));
                                o.datatype = 'or(uinteger, string)';
@@ -1774,8 +1776,10 @@ return view.extend({
                        _('This identifier is randomly generated the first time the device is booted.'));
                o.datatype = 'and(rangelength(6,260),hexstring)';
 
-               o = s.option(form.Flag, 'multipath', _('Multi-Path TCP'), _('For packets originating from this device, e.g. VPN.'));
-               o.optional = true;
+               if (L.hasSystemFeature('mptcp')) {
+                       o = s.option(form.Flag, 'multipath', _('Multi-Path TCP'), _('For packets originating from this device, e.g. VPN.'));
+                       o.optional = true;
+               }
 
                const l3mdevhelp1 = _('%s services running on this device in the default VRF context (ie., not bound to any VRF device) shall work across all VRF domains.');
                const l3mdevhelp2 = _('Off means VRF traffic will be handled exclusively by sockets bound to VRFs.');
git clone https://git.99rst.org/PROJECT