diff --git a/src/etc/inc/interfaces.inc b/src/etc/inc/interfaces.inc
index 9a12ba7a4..3c7fd884d 100644
--- a/src/etc/inc/interfaces.inc
+++ b/src/etc/inc/interfaces.inc
@@ -161,7 +161,9 @@ function interfaces_vlan_configure($verbose = false)
}
}
foreach ($config['vlans']['vlan'] as $vlan) {
- $vlan['proto'] = empty($all_parents[$vlan['vlanif']]) ? '802.1q' : '802.1ad';
+ if (empty($vlan['proto'])) {
+ $vlan['proto'] = empty($all_parents[$vlan['vlanif']]) ? '802.1q' : '802.1ad';
+ }
_interfaces_vlan_configure($vlan);
}
diff --git a/src/opnsense/mvc/app/controllers/OPNsense/Interfaces/forms/dialogVlan.xml b/src/opnsense/mvc/app/controllers/OPNsense/Interfaces/forms/dialogVlan.xml
index 9ca7965cd..a7a0ac2cf 100644
--- a/src/opnsense/mvc/app/controllers/OPNsense/Interfaces/forms/dialogVlan.xml
+++ b/src/opnsense/mvc/app/controllers/OPNsense/Interfaces/forms/dialogVlan.xml
@@ -27,6 +27,15 @@
dropdown
802.1Q VLAN PCP (priority code point)
+
+ vlan.proto
+ dropdown
+ true
+
+ Enforce protocol selection, 802.1Qis the default for vlan interfaces,
+ 802.1ad is used when the parent is a vlan (QinQ)
+
+
vlan.descr
diff --git a/src/opnsense/mvc/app/models/OPNsense/Interfaces/Vlan.xml b/src/opnsense/mvc/app/models/OPNsense/Interfaces/Vlan.xml
index 28661af88..f4716a13c 100644
--- a/src/opnsense/mvc/app/models/OPNsense/Interfaces/Vlan.xml
+++ b/src/opnsense/mvc/app/models/OPNsense/Interfaces/Vlan.xml
@@ -42,6 +42,14 @@
Network Control (7, highest)
+
+ N
+ Auto
+
+ 802.1Q
+ 802.1ad
+
+
N
diff --git a/src/opnsense/scripts/interfaces/reconfigure_vlans.php b/src/opnsense/scripts/interfaces/reconfigure_vlans.php
index 8af4efffc..6b50fb2c3 100755
--- a/src/opnsense/scripts/interfaces/reconfigure_vlans.php
+++ b/src/opnsense/scripts/interfaces/reconfigure_vlans.php
@@ -74,7 +74,9 @@ foreach (legacy_interfaces_details() as $ifname => $ifdetails) {
legacy_interface_destroy($ifname);
} else {
$vlan = $all_vlans[$ifname];
- $vlan['proto'] = empty($all_parents[$vlan['vlanif']]) ? '802.1q' : '802.1ad';
+ if (empty($vlan['proto'])) {
+ $vlan['proto'] = empty($all_parents[$vlan['vlanif']]) ? '802.1q' : '802.1ad';
+ }
$cvlan = $ifdetails['vlan'];
if ($vlan['tag'] != $cvlan['tag'] || $vlan['if'] != $cvlan['parent']) {
/* option 2: changed vlan, unlink and relink */