@@ -178,6 +178,11 @@ public function searchRuleAction()
178178 $ is_cat = empty ($ categories ) || array_intersect (explode (', ' , $ record ->categories ), $ categories );
179179 $ rule_interfaces = array_filter (explode (', ' , (string )$ record ->interface ));
180180
181+ /* inverted interface acts as floating rule */
182+ if ((string )$ record ->interfacenot === "1 " ) {
183+ $ rule_interfaces = [];
184+ }
185+
181186 if (empty ($ interfaces )) {
182187 $ is_if = count ($ rule_interfaces ) != 1 ;
183188 } elseif ($ show_all ) {
@@ -221,6 +226,9 @@ public function searchRuleAction()
221226
222227 if (empty ($ interfaces )) {
223228 $ is_if = empty ($ record ['interface ' ]) || count (explode (', ' , $ record ['interface ' ])) > 1 ;
229+ } elseif ((string )$ record ['interfacenot ' ] === "1 " ) {
230+ /* inverted interface acts as floating rule */
231+ $ is_if = true ;
224232 } else {
225233 $ is_if = array_intersect (explode (', ' , $ record ['interface ' ] ?? '' ), $ interfaces );
226234 $ is_if = $ is_if || empty ($ record ['interface ' ]);
@@ -481,8 +489,8 @@ public function getInterfaceListAction()
481489 foreach ((new \OPNsense \Firewall \Filter ())->rules ->rule ->iterateItems () as $ rule ) {
482490 $ interfaces = array_filter (explode (', ' , (string )$ rule ->interface ));
483491
484- if (count ($ interfaces ) !== 1 ) {
485- // floating: empty or multiple interfaces
492+ if (( string ) $ rule -> interfacenot === " 1 " || count ($ interfaces ) !== 1 ) {
493+ // floating: empty, multiple, or inverted interface
486494 $ ruleCounts ['floating ' ] = ($ ruleCounts ['floating ' ] ?? 0 ) + 1 ;
487495 } else {
488496 // single interface
0 commit comments