libnftnl/0008-data_reg-Introduce-struct-nftnl_data_reg-sizes-array.patch
Phil Sutter 69c15a0028 libnftnl-1.3.0-3.el10
* 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
2026-02-24 15:13:10 +01:00

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 */