[PATCH 1/3] concat: add concat subtype lookup/id helpers

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Signed-off-by: Patrick McHardy <kaber@xxxxxxxxx>
---
 include/datatype.h | 16 ++++++++++++++++
 src/datatype.c     |  4 ++--
 src/evaluate.c     |  9 +++------
 src/parser_bison.y |  3 +--
 4 files changed, 22 insertions(+), 10 deletions(-)

diff --git a/include/datatype.h b/include/datatype.h
index f05f987..3c3f42f 100644
--- a/include/datatype.h
+++ b/include/datatype.h
@@ -215,4 +215,20 @@ extern const struct datatype time_type;
 extern const struct datatype *concat_type_alloc(uint32_t type);
 extern void concat_type_destroy(const struct datatype *dtype);
 
+static inline uint32_t concat_subtype_add(uint32_t type, uint32_t subtype)
+{
+	return type << TYPE_BITS | subtype;
+}
+
+static inline uint32_t concat_subtype_id(uint32_t type, unsigned int n)
+{
+	return (type >> TYPE_BITS * n) & TYPE_MASK;
+}
+
+static inline const struct datatype *
+concat_subtype_lookup(uint32_t type, unsigned int n)
+{
+	return datatype_lookup(concat_subtype_id(type, n));
+}
+
 #endif /* NFTABLES_DATATYPE_H */
diff --git a/src/datatype.c b/src/datatype.c
index 76f2af1..c93f76a 100644
--- a/src/datatype.c
+++ b/src/datatype.c
@@ -931,8 +931,8 @@ const struct datatype *concat_type_alloc(uint32_t type)
 	unsigned int size = 0, subtypes = 0, n;
 
 	n = div_round_up(fls(type), TYPE_BITS);
-	while ((type >> TYPE_BITS * --n) & TYPE_MASK) {
-		i = datatype_lookup((type >> TYPE_BITS * n) & TYPE_MASK);
+	while (concat_subtype_id(type, --n)) {
+		i = concat_subtype_lookup(type, n);
 		if (i == NULL)
 			return NULL;
 
diff --git a/src/evaluate.c b/src/evaluate.c
index 00c6d91..53f3cf0 100644
--- a/src/evaluate.c
+++ b/src/evaluate.c
@@ -612,25 +612,22 @@ static int expr_evaluate_concat(struct eval_ctx *ctx, struct expr **expr)
 	int off = dtype ? dtype->subtypes : 0;
 	unsigned int flags = EXPR_F_CONSTANT | EXPR_F_SINGLETON;
 	struct expr *i, *next;
-	unsigned int n;
 
-	n = 1;
 	list_for_each_entry_safe(i, next, &(*expr)->expressions, list) {
 		if (dtype && off == 0)
 			return expr_binary_error(ctx->msgs, i, *expr,
 						 "unexpected concat component, "
 						 "expecting %s",
 						 dtype->desc);
-		tmp = datatype_lookup((type >> TYPE_BITS * --off) & TYPE_MASK);
+
+		tmp = concat_subtype_lookup(type, --off);
 		expr_set_context(&ctx->ectx, tmp, tmp->size);
 
 		if (list_member_evaluate(ctx, &i) < 0)
 			return -1;
 		flags &= i->flags;
 
-		ntype <<= TYPE_BITS;
-		ntype  |= i->dtype->type;
-		n++;
+		ntype = concat_subtype_add(ntype, i->dtype->type);
 	}
 
 	(*expr)->flags |= flags;
diff --git a/src/parser_bison.y b/src/parser_bison.y
index b20f4de..6c46d09 100644
--- a/src/parser_bison.y
+++ b/src/parser_bison.y
@@ -1020,8 +1020,7 @@ type_identifier		:	identifier
 						   state->msgs);
 					YYERROR;
 				}
-				$$ <<= TYPE_BITS;
-				$$ |= dtype->type;
+				$$ = concat_subtype_add($$, dtype->type);
 			}
 			;
 
-- 
2.1.0

--
To unsubscribe from this list: send the line "unsubscribe netfilter-devel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html



[Index of Archives]     [Netfitler Users]     [LARTC]     [Bugtraq]     [Yosemite Forum]

  Powered by Linux