summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorJeremy Sowden <jeremy@azazel.net>2020-01-17 20:58:08 +0000
committerPablo Neira Ayuso <pablo@netfilter.org>2020-01-18 21:23:33 +0100
commit8fa63d78432f231c09aceaf632b8757b1c02b84d (patch)
treed9e23ee1f629b5b93e29276bf43836a142a35326 /src
parent3f232d785f1e14a0b1677266530d93f3b534cfaa (diff)
bitwise: add support for left- and right-shifts.
The kernel supports bitwise shifts. Add support to libnftnl. Signed-off-by: Jeremy Sowden <jeremy@azazel.net> Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
Diffstat (limited to 'src')
-rw-r--r--src/expr/bitwise.c22
1 files changed, 22 insertions, 0 deletions
diff --git a/src/expr/bitwise.c b/src/expr/bitwise.c
index 6ea39fb..9ea2f66 100644
--- a/src/expr/bitwise.c
+++ b/src/expr/bitwise.c
@@ -233,6 +233,25 @@ nftnl_expr_bitwise_snprintf_bool(char *buf, size_t size,
return offset;
}
+static int
+nftnl_expr_bitwise_snprintf_shift(char *buf, size_t size, const char *op,
+ const struct nftnl_expr_bitwise *bitwise)
+{ int remain = size, offset = 0, ret;
+
+ ret = snprintf(buf, remain, "reg %u = ( reg %u %s ",
+ bitwise->dreg, bitwise->sreg, op);
+ SNPRINTF_BUFFER_SIZE(ret, remain, offset);
+
+ ret = nftnl_data_reg_snprintf(buf + offset, remain, &bitwise->data,
+ NFTNL_OUTPUT_DEFAULT, 0, DATA_VALUE);
+ SNPRINTF_BUFFER_SIZE(ret, remain, offset);
+
+ ret = snprintf(buf + offset, remain, ") ");
+ SNPRINTF_BUFFER_SIZE(ret, remain, offset);
+
+ return offset;
+}
+
static int nftnl_expr_bitwise_snprintf_default(char *buf, size_t size,
const struct nftnl_expr *e)
{
@@ -244,7 +263,10 @@ static int nftnl_expr_bitwise_snprintf_default(char *buf, size_t size,
err = nftnl_expr_bitwise_snprintf_bool(buf, size, bitwise);
break;
case NFT_BITWISE_LSHIFT:
+ err = nftnl_expr_bitwise_snprintf_shift(buf, size, "<<", bitwise);
+ break;
case NFT_BITWISE_RSHIFT:
+ err = nftnl_expr_bitwise_snprintf_shift(buf, size, ">>", bitwise);
break;
}