diff --git a/net/firewall/src/opnsense/mvc/app/models/OPNsense/Firewall/FieldTypes/FilterRuleField.php b/net/firewall/src/opnsense/mvc/app/models/OPNsense/Firewall/FieldTypes/FilterRuleField.php
index 5f989c56c..4a73c35fc 100644
--- a/net/firewall/src/opnsense/mvc/app/models/OPNsense/Firewall/FieldTypes/FilterRuleField.php
+++ b/net/firewall/src/opnsense/mvc/app/models/OPNsense/Firewall/FieldTypes/FilterRuleField.php
@@ -30,6 +30,7 @@
namespace OPNsense\Firewall\FieldTypes;
+use OPNsense\Core\Config;
use OPNsense\Base\FieldTypes\ArrayField;
use OPNsense\Base\FieldTypes\ContainerField;
@@ -80,8 +81,35 @@ class FilterRuleContainerField extends ContainerField
//
$result['descr'] = (string)$this->description;
$result['type'] = (string)$this->action;
+ if (strpos((string)$this->interface, ",") !== false) {
+ $result['floating'] = true;
+ }
return $result;
}
+
+ /**
+ * rule priority is threaded equally to the legacy rules, first "floating" then groups and single interface
+ * rules are handled last
+ * @return int priority in the ruleset, sequence should determine sort order.
+ */
+ public function getPriority()
+ {
+ $configObj = Config::getInstance()->object();
+ $interface = (string)$this->interface;
+ if (strpos($interface, ",") !== false) {
+ // floating (multiple interfaces involved)
+ return 1000;
+ } elseif (!empty($configObj->interfaces) &&
+ !empty($configObj->interfaces->$interface) &&
+ !empty($configObj->interfaces->$interface->type) &&
+ $configObj->interfaces->$interface->type == 'group') {
+ // group type
+ return 2000;
+ } else {
+ // default
+ return 3000;
+ }
+ }
}
/**
diff --git a/net/firewall/src/opnsense/mvc/app/models/OPNsense/Firewall/Filter.xml b/net/firewall/src/opnsense/mvc/app/models/OPNsense/Firewall/Filter.xml
index 0c07fe855..0dcced43c 100644
--- a/net/firewall/src/opnsense/mvc/app/models/OPNsense/Firewall/Filter.xml
+++ b/net/firewall/src/opnsense/mvc/app/models/OPNsense/Firewall/Filter.xml
@@ -34,6 +34,7 @@
Y
Y
lan
+ Y
Y