diff options
-rw-r--r-- | include/expression.h | 1 | ||||
-rw-r--r-- | src/evaluate.c | 3 | ||||
-rw-r--r-- | src/parser_bison.y | 3 | ||||
-rw-r--r-- | src/payload.c | 2 |
4 files changed, 8 insertions, 1 deletions
diff --git a/include/expression.h b/include/expression.h index 0a0e178f..26182120 100644 --- a/include/expression.h +++ b/include/expression.h @@ -279,6 +279,7 @@ struct expr { const struct proto_hdr_template *tmpl; enum proto_bases base; unsigned int offset; + bool is_raw; } payload; struct { /* EXPR_EXTHDR */ diff --git a/src/evaluate.c b/src/evaluate.c index c98749d9..6be3bf03 100644 --- a/src/evaluate.c +++ b/src/evaluate.c @@ -609,6 +609,9 @@ static int __expr_evaluate_payload(struct eval_ctx *ctx, struct expr *expr) struct stmt *nstmt; int err; + if (expr->ops->type == EXPR_PAYLOAD && expr->payload.is_raw) + return 0; + desc = ctx->pctx.protocol[base].desc; if (desc == NULL) { if (payload_gen_dependency(ctx, payload, &nstmt) < 0) diff --git a/src/parser_bison.y b/src/parser_bison.y index 56341115..ec8b0dd8 100644 --- a/src/parser_bison.y +++ b/src/parser_bison.y @@ -3465,6 +3465,9 @@ payload_raw_expr : AT payload_base_spec COMMA NUM COMMA NUM $$->payload.offset = $4; $$->len = $6; $$->dtype = &integer_type; + $$->byteorder = BYTEORDER_BIG_ENDIAN; + $$->payload.is_raw = true; + $$->flags = 0; } ; diff --git a/src/payload.c b/src/payload.c index ef437b44..09665a0e 100644 --- a/src/payload.c +++ b/src/payload.c @@ -48,7 +48,7 @@ static void payload_expr_print(const struct expr *expr, struct output_ctx *octx) if (payload_is_known(expr)) nft_print(octx, "%s %s", desc->name, tmpl->token); else - nft_print(octx, "payload @%s,%u,%u", + nft_print(octx, "@%s,%u,%u", proto_base_tokens[expr->payload.base], expr->payload.offset, expr->len); } |