@@ -43,7 +43,11 @@ extern void payload_dependency_store(struct payload_dep_ctx *ctx,
extern void __payload_dependency_kill(struct payload_dep_ctx *ctx,
enum proto_bases base);
extern void payload_dependency_kill(struct payload_dep_ctx *ctx,
- struct expr *expr);
+ const struct expr *expr);
+extern void payload_dependency_update(struct payload_dep_ctx *pdctx,
+ struct proto_ctx *ctx,
+ struct stmt *stmt,
+ enum proto_bases base);
extern bool payload_can_merge(const struct expr *e1, const struct expr *e2);
extern struct expr *payload_expr_join(const struct expr *e1,
@@ -2753,16 +2753,7 @@ next:
n++;
stacked = payload_is_stacked(desc, rel);
-
- if (lhs->flags & EXPR_F_PROTOCOL &&
- pctx->pbase == PROTO_BASE_INVALID) {
- payload_dependency_store(pctx, stmt, base - stacked);
- } else {
- payload_dependency_kill(pctx, lhs);
- if (lhs->flags & EXPR_F_PROTOCOL)
- payload_dependency_store(pctx, stmt, base - stacked);
- }
-
+ payload_dependency_update(pctx, ctx, stmt, base - stacked);
goto next;
}
}
@@ -1339,20 +1339,7 @@ static void payload_match_expand(struct rule_pp_ctx *ctx,
assert(base == left->payload.base);
stacked = payload_is_stacked(ctx->pctx.protocol[base].desc, nexpr);
-
- /* Remember the first payload protocol expression to
- * kill it later on if made redundant by a higher layer
- * payload expression.
- */
- if (ctx->pdctx.pbase == PROTO_BASE_INVALID &&
- expr->op == OP_EQ &&
- left->flags & EXPR_F_PROTOCOL) {
- payload_dependency_store(&ctx->pdctx, nstmt, base - stacked);
- } else {
- payload_dependency_kill(&ctx->pdctx, nexpr->left);
- if (expr->op == OP_EQ && left->flags & EXPR_F_PROTOCOL)
- payload_dependency_store(&ctx->pdctx, nstmt, base - stacked);
- }
+ payload_dependency_update(&ctx->pdctx, &ctx->pctx, nstmt, base - stacked);
}
list_del(&ctx->stmt->list);
stmt_free(ctx->stmt);
@@ -493,7 +493,30 @@ void __payload_dependency_kill(struct payload_dep_ctx *ctx,
}
}
-void payload_dependency_kill(struct payload_dep_ctx *ctx, struct expr *expr)
+void payload_dependency_update(struct payload_dep_ctx *pdctx,
+ struct proto_ctx *ctx,
+ struct stmt *stmt,
+ enum proto_bases base)
+{
+ const struct expr *expr = stmt->expr;
+ const struct expr *left;
+
+ assert(stmt->ops->type == STMT_EXPRESSION);
+ assert(expr->ops->type == EXPR_RELATIONAL);
+
+ left = expr->left;
+ if (pdctx->pbase == PROTO_BASE_INVALID &&
+ expr->op == OP_EQ &&
+ left->flags & EXPR_F_PROTOCOL) {
+ payload_dependency_store(pdctx, stmt, base);
+ } else {
+ payload_dependency_kill(pdctx, left);
+ if (expr->op == OP_EQ && left->flags & EXPR_F_PROTOCOL)
+ payload_dependency_store(pdctx, stmt, base);
+ }
+}
+
+void payload_dependency_kill(struct payload_dep_ctx *ctx, const struct expr *expr)
{
__payload_dependency_kill(ctx, expr_to_base(expr));
}
We have two places that kill previous dependency (if posssible) and then store current statement as new dependency (if eligible). Add a helper for this and use it both from netlink (trace monitor) and netlink_delinarize. Signed-off-by: Florian Westphal <fw@strlen.de> --- include/payload.h | 6 +++++- src/netlink.c | 11 +---------- src/netlink_delinearize.c | 15 +-------------- src/payload.c | 25 ++++++++++++++++++++++++- 4 files changed, 31 insertions(+), 26 deletions(-)