summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--include/expression.h1
-rw-r--r--src/evaluate.c3
-rw-r--r--src/parser_bison.y3
-rw-r--r--src/payload.c2
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);
}