projects
/
deliverable
/
linux.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
netfilter: nf_tables: add register parsing/dumping helpers
[deliverable/linux.git]
/
net
/
netfilter
/
nft_cmp.c
diff --git
a/net/netfilter/nft_cmp.c
b/net/netfilter/nft_cmp.c
index e2b3f51c81f1df0289d75142689fcd109c351d0b..ffaf214dd2564eda82dfb06669db223d1bdc197b 100644
(file)
--- a/
net/netfilter/nft_cmp.c
+++ b/
net/netfilter/nft_cmp.c
@@
-25,13
+25,13
@@
struct nft_cmp_expr {
};
static void nft_cmp_eval(const struct nft_expr *expr,
};
static void nft_cmp_eval(const struct nft_expr *expr,
- struct nft_
data data[NFT_REG_MAX + 1]
,
+ struct nft_
regs *regs
,
const struct nft_pktinfo *pkt)
{
const struct nft_cmp_expr *priv = nft_expr_priv(expr);
int d;
const struct nft_pktinfo *pkt)
{
const struct nft_cmp_expr *priv = nft_expr_priv(expr);
int d;
- d =
nft_data_cmp(&
data[priv->sreg], &priv->data, priv->len);
+ d =
memcmp(®s->
data[priv->sreg], &priv->data, priv->len);
switch (priv->op) {
case NFT_CMP_EQ:
if (d != 0)
switch (priv->op) {
case NFT_CMP_EQ:
if (d != 0)
@@
-59,7
+59,7
@@
static void nft_cmp_eval(const struct nft_expr *expr,
return;
mismatch:
return;
mismatch:
-
data[NFT_REG_VERDICT].verdict
= NFT_BREAK;
+
regs->verdict.code
= NFT_BREAK;
}
static const struct nla_policy nft_cmp_policy[NFTA_CMP_MAX + 1] = {
}
static const struct nla_policy nft_cmp_policy[NFTA_CMP_MAX + 1] = {
@@
-75,12
+75,15
@@
static int nft_cmp_init(const struct nft_ctx *ctx, const struct nft_expr *expr,
struct nft_data_desc desc;
int err;
struct nft_data_desc desc;
int err;
- priv->sreg = ntohl(nla_get_be32(tb[NFTA_CMP_SREG]));
- priv->op = ntohl(nla_get_be32(tb[NFTA_CMP_OP]));
-
err = nft_data_init(NULL, &priv->data, &desc, tb[NFTA_CMP_DATA]);
BUG_ON(err < 0);
err = nft_data_init(NULL, &priv->data, &desc, tb[NFTA_CMP_DATA]);
BUG_ON(err < 0);
+ priv->sreg = nft_parse_register(tb[NFTA_CMP_SREG]);
+ err = nft_validate_register_load(priv->sreg, desc.len);
+ if (err < 0)
+ return err;
+
+ priv->op = ntohl(nla_get_be32(tb[NFTA_CMP_OP]));
priv->len = desc.len;
return 0;
}
priv->len = desc.len;
return 0;
}
@@
-89,7
+92,7
@@
static int nft_cmp_dump(struct sk_buff *skb, const struct nft_expr *expr)
{
const struct nft_cmp_expr *priv = nft_expr_priv(expr);
{
const struct nft_cmp_expr *priv = nft_expr_priv(expr);
- if (n
la_put_be32(skb, NFTA_CMP_SREG, htonl(priv->sreg)
))
+ if (n
ft_dump_register(skb, NFTA_CMP_SREG, priv->sreg
))
goto nla_put_failure;
if (nla_put_be32(skb, NFTA_CMP_OP, htonl(priv->op)))
goto nla_put_failure;
goto nla_put_failure;
if (nla_put_be32(skb, NFTA_CMP_OP, htonl(priv->op)))
goto nla_put_failure;
@@
-122,13
+125,17
@@
static int nft_cmp_fast_init(const struct nft_ctx *ctx,
u32 mask;
int err;
u32 mask;
int err;
- priv->sreg = ntohl(nla_get_be32(tb[NFTA_CMP_SREG]));
-
err = nft_data_init(NULL, &data, &desc, tb[NFTA_CMP_DATA]);
BUG_ON(err < 0);
err = nft_data_init(NULL, &data, &desc, tb[NFTA_CMP_DATA]);
BUG_ON(err < 0);
- desc.len *= BITS_PER_BYTE;
+ priv->sreg = nft_parse_register(tb[NFTA_CMP_SREG]);
+ err = nft_validate_register_load(priv->sreg, desc.len);
+ if (err < 0)
+ return err;
+
+ desc.len *= BITS_PER_BYTE;
mask = nft_cmp_fast_mask(desc.len);
mask = nft_cmp_fast_mask(desc.len);
+
priv->data = data.data[0] & mask;
priv->len = desc.len;
return 0;
priv->data = data.data[0] & mask;
priv->len = desc.len;
return 0;
@@
-139,7
+146,7
@@
static int nft_cmp_fast_dump(struct sk_buff *skb, const struct nft_expr *expr)
const struct nft_cmp_fast_expr *priv = nft_expr_priv(expr);
struct nft_data data;
const struct nft_cmp_fast_expr *priv = nft_expr_priv(expr);
struct nft_data data;
- if (n
la_put_be32(skb, NFTA_CMP_SREG, htonl(priv->sreg)
))
+ if (n
ft_dump_register(skb, NFTA_CMP_SREG, priv->sreg
))
goto nla_put_failure;
if (nla_put_be32(skb, NFTA_CMP_OP, htonl(NFT_CMP_EQ)))
goto nla_put_failure;
goto nla_put_failure;
if (nla_put_be32(skb, NFTA_CMP_OP, htonl(NFT_CMP_EQ)))
goto nla_put_failure;
@@
-167,7
+174,6
@@
nft_cmp_select_ops(const struct nft_ctx *ctx, const struct nlattr * const tb[])
{
struct nft_data_desc desc;
struct nft_data data;
{
struct nft_data_desc desc;
struct nft_data data;
- enum nft_registers sreg;
enum nft_cmp_ops op;
int err;
enum nft_cmp_ops op;
int err;
@@
-176,11
+182,6
@@
nft_cmp_select_ops(const struct nft_ctx *ctx, const struct nlattr * const tb[])
tb[NFTA_CMP_DATA] == NULL)
return ERR_PTR(-EINVAL);
tb[NFTA_CMP_DATA] == NULL)
return ERR_PTR(-EINVAL);
- sreg = ntohl(nla_get_be32(tb[NFTA_CMP_SREG]));
- err = nft_validate_input_register(sreg);
- if (err < 0)
- return ERR_PTR(err);
-
op = ntohl(nla_get_be32(tb[NFTA_CMP_OP]));
switch (op) {
case NFT_CMP_EQ:
op = ntohl(nla_get_be32(tb[NFTA_CMP_OP]));
switch (op) {
case NFT_CMP_EQ:
This page took
0.028365 seconds
and
5
git commands to generate.