summaryrefslogtreecommitdiffstats
path: root/src/expr/payload.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/expr/payload.c')
-rw-r--r--src/expr/payload.c82
1 files changed, 24 insertions, 58 deletions
diff --git a/src/expr/payload.c b/src/expr/payload.c
index 8b41a9d..35cd10c 100644
--- a/src/expr/payload.c
+++ b/src/expr/payload.c
@@ -43,31 +43,29 @@ nftnl_expr_payload_set(struct nftnl_expr *e, uint16_t type,
switch(type) {
case NFTNL_EXPR_PAYLOAD_SREG:
- memcpy(&payload->sreg, data, sizeof(payload->sreg));
+ memcpy(&payload->sreg, data, data_len);
break;
case NFTNL_EXPR_PAYLOAD_DREG:
- memcpy(&payload->dreg, data, sizeof(payload->dreg));
+ memcpy(&payload->dreg, data, data_len);
break;
case NFTNL_EXPR_PAYLOAD_BASE:
- memcpy(&payload->base, data, sizeof(payload->base));
+ memcpy(&payload->base, data, data_len);
break;
case NFTNL_EXPR_PAYLOAD_OFFSET:
- memcpy(&payload->offset, data, sizeof(payload->offset));
+ memcpy(&payload->offset, data, data_len);
break;
case NFTNL_EXPR_PAYLOAD_LEN:
- memcpy(&payload->len, data, sizeof(payload->len));
+ memcpy(&payload->len, data, data_len);
break;
case NFTNL_EXPR_PAYLOAD_CSUM_TYPE:
- memcpy(&payload->csum_type, data, sizeof(payload->csum_type));
+ memcpy(&payload->csum_type, data, data_len);
break;
case NFTNL_EXPR_PAYLOAD_CSUM_OFFSET:
- memcpy(&payload->csum_offset, data, sizeof(payload->csum_offset));
+ memcpy(&payload->csum_offset, data, data_len);
break;
case NFTNL_EXPR_PAYLOAD_FLAGS:
- memcpy(&payload->csum_flags, data, sizeof(payload->csum_flags));
+ memcpy(&payload->csum_flags, data, data_len);
break;
- default:
- return -1;
}
return 0;
}
@@ -203,37 +201,12 @@ nftnl_expr_payload_parse(struct nftnl_expr *e, struct nlattr *attr)
return 0;
}
-static int nftnl_payload_reg_len(const struct nftnl_expr *expr)
-{
- const struct nftnl_expr_payload *payload = nftnl_expr_data(expr);
-
- return payload->len;
-}
-
-static bool nftnl_payload_reg_cmp(const struct nftnl_reg *reg,
- const struct nftnl_expr *e)
-{
- const struct nftnl_expr_payload *payload = nftnl_expr_data(e);
-
- return reg->payload.base == payload->base &&
- reg->payload.offset == payload->offset &&
- reg->len >= payload->len;
-}
-
-static void nftnl_payload_reg_update(struct nftnl_reg *reg,
- const struct nftnl_expr *e)
-{
- const struct nftnl_expr_payload *payload = nftnl_expr_data(e);
-
- reg->payload.base = payload->base;
- reg->payload.offset = payload->offset;
-}
-
-static const char *base2str_array[NFT_PAYLOAD_INNER_HEADER + 1] = {
+static const char *base2str_array[NFT_PAYLOAD_TUN_HEADER + 1] = {
[NFT_PAYLOAD_LL_HEADER] = "link",
[NFT_PAYLOAD_NETWORK_HEADER] = "network",
[NFT_PAYLOAD_TRANSPORT_HEADER] = "transport",
[NFT_PAYLOAD_INNER_HEADER] = "inner",
+ [NFT_PAYLOAD_TUN_HEADER] = "tunnel",
};
static const char *base2str(enum nft_payload_bases base)
@@ -244,20 +217,6 @@ static const char *base2str(enum nft_payload_bases base)
return base2str_array[base];
}
-static inline int nftnl_str2base(const char *base)
-{
- if (strcmp(base, "link") == 0)
- return NFT_PAYLOAD_LL_HEADER;
- else if (strcmp(base, "network") == 0)
- return NFT_PAYLOAD_NETWORK_HEADER;
- else if (strcmp(base, "transport") == 0)
- return NFT_PAYLOAD_TRANSPORT_HEADER;
- else {
- errno = EINVAL;
- return -1;
- }
-}
-
static int
nftnl_expr_payload_snprintf(char *buf, size_t len,
uint32_t flags, const struct nftnl_expr *e)
@@ -277,18 +236,25 @@ nftnl_expr_payload_snprintf(char *buf, size_t len,
payload->offset, payload->dreg);
}
+static struct attr_policy payload_attr_policy[__NFTNL_EXPR_PAYLOAD_MAX] = {
+ [NFTNL_EXPR_PAYLOAD_DREG] = { .maxlen = sizeof(uint32_t) },
+ [NFTNL_EXPR_PAYLOAD_BASE] = { .maxlen = sizeof(uint32_t) },
+ [NFTNL_EXPR_PAYLOAD_OFFSET] = { .maxlen = sizeof(uint32_t) },
+ [NFTNL_EXPR_PAYLOAD_LEN] = { .maxlen = sizeof(uint32_t) },
+ [NFTNL_EXPR_PAYLOAD_SREG] = { .maxlen = sizeof(uint32_t) },
+ [NFTNL_EXPR_PAYLOAD_CSUM_TYPE] = { .maxlen = sizeof(uint32_t) },
+ [NFTNL_EXPR_PAYLOAD_CSUM_OFFSET] = { .maxlen = sizeof(uint32_t) },
+ [NFTNL_EXPR_PAYLOAD_FLAGS] = { .maxlen = sizeof(uint32_t) },
+};
+
struct expr_ops expr_ops_payload = {
.name = "payload",
.alloc_len = sizeof(struct nftnl_expr_payload),
- .max_attr = NFTA_PAYLOAD_MAX,
+ .nftnl_max_attr = __NFTNL_EXPR_PAYLOAD_MAX - 1,
+ .attr_policy = payload_attr_policy,
.set = nftnl_expr_payload_set,
.get = nftnl_expr_payload_get,
.parse = nftnl_expr_payload_parse,
.build = nftnl_expr_payload_build,
- .snprintf = nftnl_expr_payload_snprintf,
- .reg = {
- .len = nftnl_payload_reg_len,
- .cmp = nftnl_payload_reg_cmp,
- .update = nftnl_payload_reg_update,
- },
+ .output = nftnl_expr_payload_snprintf,
};