summaryrefslogtreecommitdiffstats
path: root/src/expr/data_reg.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/expr/data_reg.c')
-rw-r--r--src/expr/data_reg.c60
1 files changed, 24 insertions, 36 deletions
diff --git a/src/expr/data_reg.c b/src/expr/data_reg.c
index 67165fe..d2ccf2e 100644
--- a/src/expr/data_reg.c
+++ b/src/expr/data_reg.c
@@ -25,14 +25,18 @@
#include "internal.h"
static int
-nftnl_data_reg_value_snprintf_default(char *buf, size_t size,
+nftnl_data_reg_value_snprintf_default(char *buf, size_t remain,
const union nftnl_data_reg *reg,
uint32_t flags)
{
- int remain = size, offset = 0, ret, i;
+ const char *pfx = flags & DATA_F_NOPFX ? "" : "0x";
+ int offset = 0, ret, i;
+
+
for (i = 0; i < div_round_up(reg->len, sizeof(uint32_t)); i++) {
- ret = snprintf(buf + offset, remain, "0x%.8x ", reg->val[i]);
+ ret = snprintf(buf + offset, remain,
+ "%s%.8x ", pfx, reg->val[i]);
SNPRINTF_BUFFER_SIZE(ret, remain, offset);
}
@@ -59,38 +63,19 @@ nftnl_data_reg_verdict_snprintf_def(char *buf, size_t size,
int nftnl_data_reg_snprintf(char *buf, size_t size,
const union nftnl_data_reg *reg,
- uint32_t output_format, uint32_t flags,
- int reg_type)
+ uint32_t flags, int reg_type)
{
switch(reg_type) {
case DATA_VALUE:
- switch(output_format) {
- case NFTNL_OUTPUT_DEFAULT:
- return nftnl_data_reg_value_snprintf_default(buf, size,
- reg, flags);
- case NFTNL_OUTPUT_JSON:
- case NFTNL_OUTPUT_XML:
- default:
- break;
- }
- break;
+ return nftnl_data_reg_value_snprintf_default(buf, size,
+ reg, flags);
case DATA_VERDICT:
case DATA_CHAIN:
- switch(output_format) {
- case NFTNL_OUTPUT_DEFAULT:
- return nftnl_data_reg_verdict_snprintf_def(buf, size,
- reg, flags);
- case NFTNL_OUTPUT_JSON:
- case NFTNL_OUTPUT_XML:
- default:
- break;
- }
- break;
+ return nftnl_data_reg_verdict_snprintf_def(buf, size,
+ reg, flags);
default:
- break;
+ return -1;
}
-
- return -1;
}
static int nftnl_data_parse_cb(const struct nlattr *attr, void *data)
@@ -125,6 +110,7 @@ static int nftnl_verdict_parse_cb(const struct nlattr *attr, void *data)
switch(type) {
case NFTA_VERDICT_CODE:
+ case NFTA_VERDICT_CHAIN_ID:
if (mnl_attr_validate(attr, MNL_TYPE_U32) < 0)
abi_breakage();
break;
@@ -220,14 +206,16 @@ int nftnl_parse_data(union nftnl_data_reg *data, struct nlattr *attr, int *type)
return ret;
}
-void nftnl_free_verdict(const union nftnl_data_reg *data)
+int nftnl_data_cpy(union nftnl_data_reg *dreg, const void *src, uint32_t len)
{
- switch(data->verdict) {
- case NFT_JUMP:
- case NFT_GOTO:
- xfree(data->chain);
- break;
- default:
- break;
+ int ret = 0;
+
+ if (len > sizeof(dreg->val)) {
+ len = sizeof(dreg->val);
+ ret = -1;
}
+
+ memcpy(dreg->val, src, len);
+ dreg->len = len;
+ return ret;
}