@@ -1084,6 +1084,7 @@ static void relational_binop_postprocess(struct rule_pp_ctx *ctx, struct expr *e
struct expr *binop = expr->left, *value = expr->right;
if (binop->op == OP_AND && expr->op == OP_NEQ &&
+ value->dtype->basetype &&
value->dtype->basetype->type == TYPE_BITMASK &&
!mpz_cmp_ui(value->value, 0)) {
/* Flag comparison: data & flags != 0
@@ -6,6 +6,7 @@ vlan id 0;ok
# bad vlan id
vlan id 4096;fail
vlan id 4094 vlan cfi 0;ok
+vlan id 4094 vlan cfi != 1;ok
vlan id 4094 vlan cfi 1;ok
# bad cfi
vlan id 4094 vlan cfi 2;fail
@@ -25,6 +25,17 @@ bridge test-bridge input
[ bitwise reg 1 = (reg=1 & 0x00000010 ) ^ 0x00000000 ]
[ cmp eq reg 1 0x00000000 ]
+# vlan id 4094 vlan cfi != 1
+bridge test-bridge input
+ [ payload load 2b @ link header + 12 => reg 1 ]
+ [ cmp eq reg 1 0x00000081 ]
+ [ payload load 2b @ link header + 14 => reg 1 ]
+ [ bitwise reg 1 = (reg=1 & 0x0000ff0f ) ^ 0x00000000 ]
+ [ cmp eq reg 1 0x0000fe0f ]
+ [ payload load 1b @ link header + 15 => reg 1 ]
+ [ bitwise reg 1 = (reg=1 & 0x00000010 ) ^ 0x00000000 ]
+ [ cmp neq reg 1 0x00000010 ]
+
# vlan id 4094 vlan cfi 1
bridge test-bridge input
[ payload load 2b @ link header + 12 => reg 1 ]