From 9bee0c86f1794c6c5418f256420758dc15d91f77 Mon Sep 17 00:00:00 2001 From: Laura Garcia Liebana Date: Fri, 4 Nov 2016 14:01:12 +0100 Subject: src: add offset attribute for hash expression Add support to add an offset to the hash generator, eg. ct mark set hash ip saddr mod 10 offset 100 This will generate marks with series between 100-109. Signed-off-by: Laura Garcia Liebana Signed-off-by: Pablo Neira Ayuso --- src/hash.c | 9 +++++++-- src/netlink_delinearize.c | 5 +++-- src/netlink_linearize.c | 1 + src/parser_bison.y | 8 ++++---- 4 files changed, 15 insertions(+), 8 deletions(-) (limited to 'src') diff --git a/src/hash.c b/src/hash.c index 125b3202..d26b2eda 100644 --- a/src/hash.c +++ b/src/hash.c @@ -22,13 +22,16 @@ static void hash_expr_print(const struct expr *expr) printf(" mod %u", expr->hash.mod); if (expr->hash.seed) printf(" seed 0x%x", expr->hash.seed); + if (expr->hash.offset) + printf(" offset %u", expr->hash.offset); } static bool hash_expr_cmp(const struct expr *e1, const struct expr *e2) { return expr_cmp(e1->hash.expr, e2->hash.expr) && e1->hash.mod == e2->hash.mod && - e1->hash.seed == e2->hash.seed; + e1->hash.seed == e2->hash.seed && + e1->hash.offset == e2->hash.offset; } static void hash_expr_clone(struct expr *new, const struct expr *expr) @@ -36,6 +39,7 @@ static void hash_expr_clone(struct expr *new, const struct expr *expr) new->hash.expr = expr_clone(expr->hash.expr); new->hash.mod = expr->hash.mod; new->hash.seed = expr->hash.seed; + new->hash.offset = expr->hash.offset; } static const struct expr_ops hash_expr_ops = { @@ -47,7 +51,7 @@ static const struct expr_ops hash_expr_ops = { }; struct expr *hash_expr_alloc(const struct location *loc, uint32_t mod, - uint32_t seed) + uint32_t seed, uint32_t offset) { struct expr *expr; @@ -55,6 +59,7 @@ struct expr *hash_expr_alloc(const struct location *loc, uint32_t mod, BYTEORDER_HOST_ENDIAN, 4 * BITS_PER_BYTE); expr->hash.mod = mod; expr->hash.seed = seed; + expr->hash.offset = offset; return expr; } diff --git a/src/netlink_delinearize.c b/src/netlink_delinearize.c index f0df8848..434089b7 100644 --- a/src/netlink_delinearize.c +++ b/src/netlink_delinearize.c @@ -513,7 +513,7 @@ static void netlink_parse_hash(struct netlink_parse_ctx *ctx, { enum nft_registers sreg, dreg; struct expr *expr, *hexpr; - uint32_t mod, seed, len; + uint32_t mod, seed, len, offset; sreg = netlink_parse_register(nle, NFTNL_EXPR_HASH_SREG); hexpr = netlink_get_register(ctx, loc, sreg); @@ -521,6 +521,7 @@ static void netlink_parse_hash(struct netlink_parse_ctx *ctx, return netlink_error(ctx, loc, "hash statement has no expression"); + offset = nftnl_expr_get_u32(nle, NFTNL_EXPR_HASH_OFFSET); seed = nftnl_expr_get_u32(nle, NFTNL_EXPR_HASH_SEED); mod = nftnl_expr_get_u32(nle, NFTNL_EXPR_HASH_MODULUS); len = nftnl_expr_get_u32(nle, NFTNL_EXPR_HASH_LEN) * BITS_PER_BYTE; @@ -531,7 +532,7 @@ static void netlink_parse_hash(struct netlink_parse_ctx *ctx, return; } - expr = hash_expr_alloc(loc, mod, seed); + expr = hash_expr_alloc(loc, mod, seed, offset); expr->hash.expr = hexpr; dreg = netlink_parse_register(nle, NFTNL_EXPR_HASH_DREG); diff --git a/src/netlink_linearize.c b/src/netlink_linearize.c index 0458af95..6c0f39bf 100644 --- a/src/netlink_linearize.c +++ b/src/netlink_linearize.c @@ -136,6 +136,7 @@ static void netlink_gen_hash(struct netlink_linearize_ctx *ctx, div_round_up(expr->hash.expr->len, BITS_PER_BYTE)); nftnl_expr_set_u32(nle, NFTNL_EXPR_HASH_MODULUS, expr->hash.mod); nftnl_expr_set_u32(nle, NFTNL_EXPR_HASH_SEED, expr->hash.seed); + nftnl_expr_set_u32(nle, NFTNL_EXPR_HASH_OFFSET, expr->hash.offset); nftnl_rule_add_expr(ctx->nlr, nle); } diff --git a/src/parser_bison.y b/src/parser_bison.y index 82fec99c..74f24a52 100644 --- a/src/parser_bison.y +++ b/src/parser_bison.y @@ -2580,14 +2580,14 @@ numgen_expr : NUMGEN numgen_type MOD NUM offset_opt } ; -hash_expr : JHASH expr MOD NUM SEED NUM +hash_expr : JHASH expr MOD NUM SEED NUM offset_opt { - $$ = hash_expr_alloc(&@$, $4, $6); + $$ = hash_expr_alloc(&@$, $4, $6, $7); $$->hash.expr = $2; } - | JHASH expr MOD NUM + | JHASH expr MOD NUM offset_opt { - $$ = hash_expr_alloc(&@$, $4, 0); + $$ = hash_expr_alloc(&@$, $4, 0, $5); $$->hash.expr = $2; } ; -- cgit v1.2.3