@@ -85,8 +85,15 @@ enum byteorder {
struct expr;
+/**
+ * enum datatype_flags
+ *
+ * @DTYPE_F_ALLOC: datatype is dynamically allocated
+ * @DTYPE_F_PREFIX: preferred representation for ranges is a prefix
+ */
enum datatype_flags {
DTYPE_F_ALLOC = (1 << 0),
+ DTYPE_F_PREFIX = (1 << 1),
};
/**
@@ -398,6 +398,7 @@ const struct datatype ipaddr_type = {
.basetype = &integer_type,
.print = ipaddr_type_print,
.parse = ipaddr_type_parse,
+ .flags = DTYPE_F_PREFIX,
};
static void ip6addr_type_print(const struct expr *expr)
@@ -455,6 +456,7 @@ const struct datatype ip6addr_type = {
.basetype = &integer_type,
.print = ip6addr_type_print,
.parse = ip6addr_type_parse,
+ .flags = DTYPE_F_PREFIX,
};
static void inet_protocol_type_print(const struct expr *expr)
@@ -680,6 +682,7 @@ const struct datatype mark_type = {
.basefmt = "0x%.8Zx",
.print = mark_type_print,
.parse = mark_type_parse,
+ .flags = DTYPE_F_PREFIX,
};
static void time_type_print(const struct expr *expr)
@@ -61,6 +61,7 @@ static const struct datatype realm_type = {
.basetype = &integer_type,
.print = realm_type_print,
.parse = realm_type_parse,
+ .flags = DTYPE_F_PREFIX,
};
static void tchandle_type_print(const struct expr *expr)
@@ -552,7 +552,9 @@ void interval_map_decompose(struct expr *set)
if (!mpz_cmp_ui(range, 0))
compound_expr_add(set, low);
- else if (!range_is_prefix(range) || mpz_cmp_ui(p, 0)) {
+ else if ((!range_is_prefix(range) ||
+ !(i->dtype->flags & DTYPE_F_PREFIX)) ||
+ mpz_cmp_ui(p, 0)) {
struct expr *tmp;
tmp = constant_expr_alloc(&low->location, low->dtype,
It is uncommon to represent f.i. port number ranges as prefix expressions. Introduce a datatype DTYPE_F_PREFIX flag to indicate that the preferred representation of a range is a prefix and use it for segtree decomposition to decide whether to use a range or prefix expression. The ipaddr, ip6addr, mark and realm datatypes are changed to include the DTYPE_F_PREFIX flag. This fixes completely unreadable output in cases where the ranges are representable as prefixes, f.i. in case of port number: { 0/6 => jump chain1, 0/5 => jump chain2, 0/4 => continue} becomes: { 0-1023 => jump chain1, 1024-2047 => jump chain2, 2048-4095 => continue} Signed-off-by: Patrick McHardy <kaber@trash.net> --- include/datatype.h | 7 +++++++ src/datatype.c | 3 +++ src/meta.c | 1 + src/segtree.c | 4 +++- 4 files changed, 14 insertions(+), 1 deletion(-)