Commit 71d6ded3 authored by Jeremy Sowden's avatar Jeremy Sowden Committed by Pablo Neira Ayuso

netfilter: bitwise: add helper for evaluating boolean operations.

Split the code specific to evaluating bitwise boolean operations out
into a separate function.  Similar functions will be added later for
shift operations.
Signed-off-by: default avatarJeremy Sowden <jeremy@azazel.net>
Signed-off-by: default avatarPablo Neira Ayuso <pablo@netfilter.org>
parent 3f8d9eb0
...@@ -24,16 +24,27 @@ struct nft_bitwise { ...@@ -24,16 +24,27 @@ struct nft_bitwise {
struct nft_data xor; struct nft_data xor;
}; };
static void nft_bitwise_eval_bool(u32 *dst, const u32 *src,
const struct nft_bitwise *priv)
{
unsigned int i;
for (i = 0; i < DIV_ROUND_UP(priv->len, 4); i++)
dst[i] = (src[i] & priv->mask.data[i]) ^ priv->xor.data[i];
}
void nft_bitwise_eval(const struct nft_expr *expr, void nft_bitwise_eval(const struct nft_expr *expr,
struct nft_regs *regs, const struct nft_pktinfo *pkt) struct nft_regs *regs, const struct nft_pktinfo *pkt)
{ {
const struct nft_bitwise *priv = nft_expr_priv(expr); const struct nft_bitwise *priv = nft_expr_priv(expr);
const u32 *src = &regs->data[priv->sreg]; const u32 *src = &regs->data[priv->sreg];
u32 *dst = &regs->data[priv->dreg]; u32 *dst = &regs->data[priv->dreg];
unsigned int i;
for (i = 0; i < DIV_ROUND_UP(priv->len, 4); i++) switch (priv->op) {
dst[i] = (src[i] & priv->mask.data[i]) ^ priv->xor.data[i]; case NFT_BITWISE_BOOL:
nft_bitwise_eval_bool(dst, src, priv);
break;
}
} }
static const struct nla_policy nft_bitwise_policy[NFTA_BITWISE_MAX + 1] = { static const struct nla_policy nft_bitwise_policy[NFTA_BITWISE_MAX + 1] = {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment