From f9170d49b5af8bdbb762bb5f2abe9aa7cace3b9e Mon Sep 17 00:00:00 2001 From: Patrick McHardy Date: Wed, 25 Nov 2015 16:50:19 +0000 Subject: payload: add payload statement Add support for payload mangling using the payload statement. The syntax is similar to the other data changing statements: nft filter output tcp dport set 25 Signed-off-by: Patrick McHardy --- src/evaluate.c | 25 +++++++++++++++++++++++-- 1 file changed, 23 insertions(+), 2 deletions(-) (limited to 'src/evaluate.c') diff --git a/src/evaluate.c b/src/evaluate.c index 48f071f7..7aab6aac 100644 --- a/src/evaluate.c +++ b/src/evaluate.c @@ -438,9 +438,9 @@ static bool resolve_protocol_conflict(struct eval_ctx *ctx, * generate the necessary relational expression and prepend it to the current * statement. */ -static int expr_evaluate_payload(struct eval_ctx *ctx, struct expr **expr) +static int __expr_evaluate_payload(struct eval_ctx *ctx, struct expr *expr) { - struct expr *payload = *expr; + struct expr *payload = expr; enum proto_bases base = payload->payload.base; struct stmt *nstmt; @@ -454,6 +454,14 @@ static int expr_evaluate_payload(struct eval_ctx *ctx, struct expr **expr) ctx->pctx.protocol[base].desc->name, payload->payload.desc->name); + return 0; +} + +static int expr_evaluate_payload(struct eval_ctx *ctx, struct expr **expr) +{ + if (__expr_evaluate_payload(ctx, *expr) < 0) + return -1; + return expr_evaluate_primary(ctx, expr); } @@ -1353,6 +1361,17 @@ static int stmt_evaluate_verdict(struct eval_ctx *ctx, struct stmt *stmt) return 0; } +static int stmt_evaluate_payload(struct eval_ctx *ctx, struct stmt *stmt) +{ + if (__expr_evaluate_payload(ctx, stmt->payload.expr) < 0) + return -1; + + return stmt_evaluate_arg(ctx, stmt, + stmt->payload.expr->dtype, + stmt->payload.expr->len, + &stmt->payload.val); +} + static int stmt_evaluate_meta(struct eval_ctx *ctx, struct stmt *stmt) { return stmt_evaluate_arg(ctx, stmt, @@ -1916,6 +1935,8 @@ int stmt_evaluate(struct eval_ctx *ctx, struct stmt *stmt) return stmt_evaluate_expr(ctx, stmt); case STMT_VERDICT: return stmt_evaluate_verdict(ctx, stmt); + case STMT_PAYLOAD: + return stmt_evaluate_payload(ctx, stmt); case STMT_META: return stmt_evaluate_meta(ctx, stmt); case STMT_CT: -- cgit v1.2.3