|
@@ -44,6 +44,7 @@ enum filter_op_ids
|
|
|
OP_LE,
|
|
OP_LE,
|
|
|
OP_GT,
|
|
OP_GT,
|
|
|
OP_GE,
|
|
OP_GE,
|
|
|
|
|
+ OP_BAND,
|
|
|
OP_NONE,
|
|
OP_NONE,
|
|
|
OP_OPEN_PAREN,
|
|
OP_OPEN_PAREN,
|
|
|
};
|
|
};
|
|
@@ -54,6 +55,7 @@ struct filter_op {
|
|
|
int precedence;
|
|
int precedence;
|
|
|
};
|
|
};
|
|
|
|
|
|
|
|
|
|
+/* Order must be the same as enum filter_op_ids above */
|
|
|
static struct filter_op filter_ops[] = {
|
|
static struct filter_op filter_ops[] = {
|
|
|
{ OP_OR, "||", 1 },
|
|
{ OP_OR, "||", 1 },
|
|
|
{ OP_AND, "&&", 2 },
|
|
{ OP_AND, "&&", 2 },
|
|
@@ -64,6 +66,7 @@ static struct filter_op filter_ops[] = {
|
|
|
{ OP_LE, "<=", 5 },
|
|
{ OP_LE, "<=", 5 },
|
|
|
{ OP_GT, ">", 5 },
|
|
{ OP_GT, ">", 5 },
|
|
|
{ OP_GE, ">=", 5 },
|
|
{ OP_GE, ">=", 5 },
|
|
|
|
|
+ { OP_BAND, "&", 6 },
|
|
|
{ OP_NONE, "OP_NONE", 0 },
|
|
{ OP_NONE, "OP_NONE", 0 },
|
|
|
{ OP_OPEN_PAREN, "(", 0 },
|
|
{ OP_OPEN_PAREN, "(", 0 },
|
|
|
};
|
|
};
|
|
@@ -156,6 +159,9 @@ static int filter_pred_##type(struct filter_pred *pred, void *event) \
|
|
|
case OP_GE: \
|
|
case OP_GE: \
|
|
|
match = (*addr >= val); \
|
|
match = (*addr >= val); \
|
|
|
break; \
|
|
break; \
|
|
|
|
|
+ case OP_BAND: \
|
|
|
|
|
+ match = (*addr & val); \
|
|
|
|
|
+ break; \
|
|
|
default: \
|
|
default: \
|
|
|
break; \
|
|
break; \
|
|
|
} \
|
|
} \
|