* Tue Feb 24 2026 Phil Sutter <psutter@redhat.com> [1.3.0-3.el10]
- src: Do not include userdata content in debug output (Phil Sutter) [RHEL-119650]
- Revert "udata: Store u32 udata values in Big Endian" (Phil Sutter) [RHEL-119650]
- udata: Store u32 udata values in Big Endian (Phil Sutter) [RHEL-119650]
- data_reg: Support concatenated data (Phil Sutter) [RHEL-119650]
- data_reg: Respect data byteorder when printing (Phil Sutter) [RHEL-119650]
- Introduce nftnl_{expr,set_elem}_set_imm() (Phil Sutter) [RHEL-119650]
- data_reg: Introduce struct nftnl_data_reg::sizes array (Phil Sutter) [RHEL-119650]
- data_reg: Introduce struct nftnl_data_reg::byteorder field (Phil Sutter) [RHEL-119650]
- expr: Pass byteorder to struct expr_ops::set callback (Phil Sutter) [RHEL-119650]
- expr: data_reg: Avoid extra whitespace (Phil Sutter) [RHEL-119650]
- set_elem: Review debug output (Phil Sutter) [RHEL-119650]
Resolves: RHEL-119650
167 lines
5.7 KiB
Diff
167 lines
5.7 KiB
Diff
From 3ad775bd24ef85034ec38f73d3eb359e15ad2c25 Mon Sep 17 00:00:00 2001
|
|
From: Phil Sutter <psutter@redhat.com>
|
|
Date: Tue, 24 Feb 2026 15:05:32 +0100
|
|
Subject: [PATCH] data_reg: Introduce struct nftnl_data_reg::sizes array
|
|
|
|
JIRA: https://issues.redhat.com/browse/RHEL-119650
|
|
Upstream Status: libnftnl commit 6077bf5cadd980038c223841c886aa8bc1d5abec
|
|
|
|
commit 6077bf5cadd980038c223841c886aa8bc1d5abec
|
|
Author: Phil Sutter <phil@nwl.cc>
|
|
Date: Thu Oct 16 01:30:20 2025 +0200
|
|
|
|
data_reg: Introduce struct nftnl_data_reg::sizes array
|
|
|
|
This will hold the actual size of each component in concatenated data.
|
|
|
|
Signed-off-by: Phil Sutter <phil@nwl.cc>
|
|
|
|
Signed-off-by: Phil Sutter <psutter@redhat.com>
|
|
---
|
|
include/data_reg.h | 3 ++-
|
|
src/expr/bitwise.c | 9 ++++++---
|
|
src/expr/cmp.c | 3 ++-
|
|
src/expr/data_reg.c | 6 +++++-
|
|
src/expr/immediate.c | 3 ++-
|
|
src/expr/range.c | 4 ++--
|
|
src/set_elem.c | 6 +++---
|
|
7 files changed, 22 insertions(+), 12 deletions(-)
|
|
|
|
diff --git a/include/data_reg.h b/include/data_reg.h
|
|
index e22acd1..5cdeba0 100644
|
|
--- a/include/data_reg.h
|
|
+++ b/include/data_reg.h
|
|
@@ -22,6 +22,7 @@ union nftnl_data_reg {
|
|
uint32_t val[NFT_DATA_VALUE_MAXLEN / sizeof(uint32_t)];
|
|
uint32_t len;
|
|
uint32_t byteorder;
|
|
+ uint8_t sizes[NFT_REG32_COUNT];
|
|
};
|
|
struct {
|
|
uint32_t verdict;
|
|
@@ -37,6 +38,6 @@ struct nlattr;
|
|
|
|
int nftnl_parse_data(union nftnl_data_reg *data, struct nlattr *attr, int *type);
|
|
int nftnl_data_cpy(union nftnl_data_reg *dreg, const void *src,
|
|
- uint32_t len, uint32_t byteorder);
|
|
+ uint32_t len, uint32_t byteorder, uint8_t *sizes);
|
|
|
|
#endif
|
|
diff --git a/src/expr/bitwise.c b/src/expr/bitwise.c
|
|
index a775285..a838e6c 100644
|
|
--- a/src/expr/bitwise.c
|
|
+++ b/src/expr/bitwise.c
|
|
@@ -51,11 +51,14 @@ nftnl_expr_bitwise_set(struct nftnl_expr *e, uint16_t type,
|
|
memcpy(&bitwise->len, data, data_len);
|
|
break;
|
|
case NFTNL_EXPR_BITWISE_MASK:
|
|
- return nftnl_data_cpy(&bitwise->mask, data, data_len, byteorder);
|
|
+ return nftnl_data_cpy(&bitwise->mask, data,
|
|
+ data_len, byteorder, NULL);
|
|
case NFTNL_EXPR_BITWISE_XOR:
|
|
- return nftnl_data_cpy(&bitwise->xor, data, data_len, byteorder);
|
|
+ return nftnl_data_cpy(&bitwise->xor, data,
|
|
+ data_len, byteorder, NULL);
|
|
case NFTNL_EXPR_BITWISE_DATA:
|
|
- return nftnl_data_cpy(&bitwise->data, data, data_len, byteorder);
|
|
+ return nftnl_data_cpy(&bitwise->data, data,
|
|
+ data_len, byteorder, NULL);
|
|
}
|
|
return 0;
|
|
}
|
|
diff --git a/src/expr/cmp.c b/src/expr/cmp.c
|
|
index c88e06a..ec5dd62 100644
|
|
--- a/src/expr/cmp.c
|
|
+++ b/src/expr/cmp.c
|
|
@@ -38,7 +38,8 @@ nftnl_expr_cmp_set(struct nftnl_expr *e, uint16_t type,
|
|
memcpy(&cmp->op, data, data_len);
|
|
break;
|
|
case NFTNL_EXPR_CMP_DATA:
|
|
- return nftnl_data_cpy(&cmp->data, data, data_len, byteorder);
|
|
+ return nftnl_data_cpy(&cmp->data, data,
|
|
+ data_len, byteorder, NULL);
|
|
}
|
|
return 0;
|
|
}
|
|
diff --git a/src/expr/data_reg.c b/src/expr/data_reg.c
|
|
index 45f2d94..d1aadcc 100644
|
|
--- a/src/expr/data_reg.c
|
|
+++ b/src/expr/data_reg.c
|
|
@@ -202,7 +202,7 @@ int nftnl_parse_data(union nftnl_data_reg *data, struct nlattr *attr, int *type)
|
|
}
|
|
|
|
int nftnl_data_cpy(union nftnl_data_reg *dreg, const void *src,
|
|
- uint32_t len, uint32_t byteorder)
|
|
+ uint32_t len, uint32_t byteorder, uint8_t *sizes)
|
|
{
|
|
int ret = 0;
|
|
|
|
@@ -214,5 +214,9 @@ int nftnl_data_cpy(union nftnl_data_reg *dreg, const void *src,
|
|
memcpy(dreg->val, src, len);
|
|
dreg->len = len;
|
|
dreg->byteorder = byteorder;
|
|
+ if (sizes)
|
|
+ memcpy(dreg->sizes, sizes, sizeof(dreg->sizes));
|
|
+ else
|
|
+ memset(dreg->sizes, 0, sizeof(dreg->sizes));
|
|
return ret;
|
|
}
|
|
diff --git a/src/expr/immediate.c b/src/expr/immediate.c
|
|
index f27b6e6..9453198 100644
|
|
--- a/src/expr/immediate.c
|
|
+++ b/src/expr/immediate.c
|
|
@@ -32,7 +32,8 @@ nftnl_expr_immediate_set(struct nftnl_expr *e, uint16_t type,
|
|
memcpy(&imm->dreg, data, data_len);
|
|
break;
|
|
case NFTNL_EXPR_IMM_DATA:
|
|
- return nftnl_data_cpy(&imm->data, data, data_len, byteorder);
|
|
+ return nftnl_data_cpy(&imm->data, data,
|
|
+ data_len, byteorder, NULL);
|
|
case NFTNL_EXPR_IMM_VERDICT:
|
|
memcpy(&imm->data.verdict, data, data_len);
|
|
break;
|
|
diff --git a/src/expr/range.c b/src/expr/range.c
|
|
index 4b3101e..12c91e9 100644
|
|
--- a/src/expr/range.c
|
|
+++ b/src/expr/range.c
|
|
@@ -38,10 +38,10 @@ nftnl_expr_range_set(struct nftnl_expr *e, uint16_t type,
|
|
break;
|
|
case NFTNL_EXPR_RANGE_FROM_DATA:
|
|
return nftnl_data_cpy(&range->data_from, data,
|
|
- data_len, byteorder);
|
|
+ data_len, byteorder, NULL);
|
|
case NFTNL_EXPR_RANGE_TO_DATA:
|
|
return nftnl_data_cpy(&range->data_to, data,
|
|
- data_len, byteorder);
|
|
+ data_len, byteorder, NULL);
|
|
}
|
|
return 0;
|
|
}
|
|
diff --git a/src/set_elem.c b/src/set_elem.c
|
|
index 1c2780b..7ec65b9 100644
|
|
--- a/src/set_elem.c
|
|
+++ b/src/set_elem.c
|
|
@@ -122,11 +122,11 @@ int nftnl_set_elem_set(struct nftnl_set_elem *s, uint16_t attr,
|
|
memcpy(&s->set_elem_flags, data, sizeof(s->set_elem_flags));
|
|
break;
|
|
case NFTNL_SET_ELEM_KEY: /* NFTA_SET_ELEM_KEY */
|
|
- if (nftnl_data_cpy(&s->key, data, data_len, 0) < 0)
|
|
+ if (nftnl_data_cpy(&s->key, data, data_len, 0, NULL) < 0)
|
|
return -1;
|
|
break;
|
|
case NFTNL_SET_ELEM_KEY_END: /* NFTA_SET_ELEM_KEY_END */
|
|
- if (nftnl_data_cpy(&s->key_end, data, data_len, 0) < 0)
|
|
+ if (nftnl_data_cpy(&s->key_end, data, data_len, 0, NULL) < 0)
|
|
return -1;
|
|
break;
|
|
case NFTNL_SET_ELEM_VERDICT: /* NFTA_SET_ELEM_DATA */
|
|
@@ -141,7 +141,7 @@ int nftnl_set_elem_set(struct nftnl_set_elem *s, uint16_t attr,
|
|
return -1;
|
|
break;
|
|
case NFTNL_SET_ELEM_DATA: /* NFTA_SET_ELEM_DATA */
|
|
- if (nftnl_data_cpy(&s->data, data, data_len, 0) < 0)
|
|
+ if (nftnl_data_cpy(&s->data, data, data_len, 0, NULL) < 0)
|
|
return -1;
|
|
break;
|
|
case NFTNL_SET_ELEM_TIMEOUT: /* NFTA_SET_ELEM_TIMEOUT */
|