netfilter: nft_bitwise: add offload support
Extract mask from bitwise operation and store it into the corresponding context register so the cmp instruction can set the mask accordingly. Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
This commit is contained in:
Родитель
7e59b3fea2
Коммит
bd8699e9e2
|
@ -13,6 +13,7 @@
|
||||||
#include <linux/netfilter/nf_tables.h>
|
#include <linux/netfilter/nf_tables.h>
|
||||||
#include <net/netfilter/nf_tables_core.h>
|
#include <net/netfilter/nf_tables_core.h>
|
||||||
#include <net/netfilter/nf_tables.h>
|
#include <net/netfilter/nf_tables.h>
|
||||||
|
#include <net/netfilter/nf_tables_offload.h>
|
||||||
|
|
||||||
struct nft_bitwise {
|
struct nft_bitwise {
|
||||||
enum nft_registers sreg:8;
|
enum nft_registers sreg:8;
|
||||||
|
@ -126,12 +127,30 @@ nla_put_failure:
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static struct nft_data zero;
|
||||||
|
|
||||||
|
static int nft_bitwise_offload(struct nft_offload_ctx *ctx,
|
||||||
|
struct nft_flow_rule *flow,
|
||||||
|
const struct nft_expr *expr)
|
||||||
|
{
|
||||||
|
const struct nft_bitwise *priv = nft_expr_priv(expr);
|
||||||
|
|
||||||
|
if (memcmp(&priv->xor, &zero, sizeof(priv->xor) ||
|
||||||
|
priv->sreg != priv->dreg))
|
||||||
|
return -EOPNOTSUPP;
|
||||||
|
|
||||||
|
memcpy(&ctx->regs[priv->dreg].mask, &priv->mask, sizeof(priv->mask));
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
static const struct nft_expr_ops nft_bitwise_ops = {
|
static const struct nft_expr_ops nft_bitwise_ops = {
|
||||||
.type = &nft_bitwise_type,
|
.type = &nft_bitwise_type,
|
||||||
.size = NFT_EXPR_SIZE(sizeof(struct nft_bitwise)),
|
.size = NFT_EXPR_SIZE(sizeof(struct nft_bitwise)),
|
||||||
.eval = nft_bitwise_eval,
|
.eval = nft_bitwise_eval,
|
||||||
.init = nft_bitwise_init,
|
.init = nft_bitwise_init,
|
||||||
.dump = nft_bitwise_dump,
|
.dump = nft_bitwise_dump,
|
||||||
|
.offload = nft_bitwise_offload,
|
||||||
};
|
};
|
||||||
|
|
||||||
struct nft_expr_type nft_bitwise_type __read_mostly = {
|
struct nft_expr_type nft_bitwise_type __read_mostly = {
|
||||||
|
|
Загрузка…
Ссылка в новой задаче