summaryrefslogtreecommitdiffstats
path: root/src/payload.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/payload.c')
-rw-r--r--src/payload.c15
1 files changed, 9 insertions, 6 deletions
diff --git a/src/payload.c b/src/payload.c
index fd6f7011..66418cdd 100644
--- a/src/payload.c
+++ b/src/payload.c
@@ -153,9 +153,9 @@ static int payload_expr_build_udata(struct nftnl_udata_buf *udbuf,
expr->payload.base);
nftnl_udata_put_u32(udbuf, NFTNL_UDATA_SET_KEY_PAYLOAD_OFFSET,
expr->payload.offset);
- nftnl_udata_put_u32(udbuf, NFTNL_UDATA_SET_KEY_PAYLOAD_LEN,
- expr->len);
}
+ if (expr->dtype->type == TYPE_INTEGER)
+ nftnl_udata_put_u32(udbuf, NFTNL_UDATA_SET_KEY_PAYLOAD_LEN, expr->len);
return 0;
}
@@ -191,7 +191,7 @@ static int payload_parse_udata(const struct nftnl_udata *attr, void *data)
static struct expr *payload_expr_parse_udata(const struct nftnl_udata *attr)
{
const struct nftnl_udata *ud[NFTNL_UDATA_SET_KEY_PAYLOAD_MAX + 1] = {};
- unsigned int type, base, offset, len;
+ unsigned int type, base, offset, len = 0;
const struct proto_desc *desc;
bool is_raw = false;
struct expr *expr;
@@ -209,20 +209,23 @@ static struct expr *payload_expr_parse_udata(const struct nftnl_udata *attr)
desc = find_proto_desc(ud[NFTNL_UDATA_SET_KEY_PAYLOAD_DESC]);
if (!desc) {
if (!ud[NFTNL_UDATA_SET_KEY_PAYLOAD_BASE] ||
- !ud[NFTNL_UDATA_SET_KEY_PAYLOAD_OFFSET] ||
- !ud[NFTNL_UDATA_SET_KEY_PAYLOAD_LEN])
+ !ud[NFTNL_UDATA_SET_KEY_PAYLOAD_OFFSET])
return NULL;
base = nftnl_udata_get_u32(ud[NFTNL_UDATA_SET_KEY_PAYLOAD_BASE]);
offset = nftnl_udata_get_u32(ud[NFTNL_UDATA_SET_KEY_PAYLOAD_OFFSET]);
- len = nftnl_udata_get_u32(ud[NFTNL_UDATA_SET_KEY_PAYLOAD_LEN]);
is_raw = true;
}
type = nftnl_udata_get_u32(ud[NFTNL_UDATA_SET_KEY_PAYLOAD_TYPE]);
+ if (ud[NFTNL_UDATA_SET_KEY_PAYLOAD_LEN])
+ len = nftnl_udata_get_u32(ud[NFTNL_UDATA_SET_KEY_PAYLOAD_LEN]);
expr = payload_expr_alloc(&internal_location, desc, type);
+ if (len)
+ expr->len = len;
+
if (is_raw) {
struct datatype *dtype;