Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit b1c96ed3 authored by Patrick McHardy's avatar Patrick McHardy Committed by Pablo Neira Ayuso
Browse files

netfilter: nf_tables: add register parsing/dumping helpers



Add helper functions to parse and dump register values in netlink attributes.
These helpers will later be changed to take care of translation between the
old 128 bit and the new 32 bit register numbers.

Signed-off-by: default avatarPatrick McHardy <kaber@trash.net>
Signed-off-by: default avatarPablo Neira Ayuso <pablo@netfilter.org>
parent 8cd8937a
Loading
Loading
Loading
Loading
+3 −0
Original line number Diff line number Diff line
@@ -128,6 +128,9 @@ static inline enum nft_registers nft_type_to_reg(enum nft_data_types type)
	return type == NFT_DATA_VERDICT ? NFT_REG_VERDICT : NFT_REG_1;
}

unsigned int nft_parse_register(const struct nlattr *attr);
int nft_dump_register(struct sk_buff *skb, unsigned int attr, unsigned int reg);

int nft_validate_register_load(enum nft_registers reg, unsigned int len);
int nft_validate_register_store(const struct nft_ctx *ctx,
				enum nft_registers reg,
+1 −1
Original line number Diff line number Diff line
@@ -65,7 +65,7 @@ static int nft_meta_bridge_get_init(const struct nft_ctx *ctx,
		return nft_meta_get_init(ctx, expr, tb);
	}

	priv->dreg = ntohl(nla_get_be32(tb[NFTA_META_DREG]));
	priv->dreg = nft_parse_register(tb[NFTA_META_DREG]);
	return nft_validate_register_store(ctx, priv->dreg, NULL,
					   NFT_DATA_VALUE, len);
}
+12 −0
Original line number Diff line number Diff line
@@ -4122,6 +4122,18 @@ static int nf_tables_check_loops(const struct nft_ctx *ctx,
	return 0;
}

unsigned int nft_parse_register(const struct nlattr *attr)
{
	return ntohl(nla_get_be32(attr));
}
EXPORT_SYMBOL_GPL(nft_parse_register);

int nft_dump_register(struct sk_buff *skb, unsigned int attr, unsigned int reg)
{
	return nla_put_be32(skb, attr, htonl(reg));
}
EXPORT_SYMBOL_GPL(nft_dump_register);

/**
 *	nft_validate_register_load - validate a load from a register
 *
+4 −4
Original line number Diff line number Diff line
@@ -62,12 +62,12 @@ static int nft_bitwise_init(const struct nft_ctx *ctx,
		return -EINVAL;

	priv->len  = ntohl(nla_get_be32(tb[NFTA_BITWISE_LEN]));
	priv->sreg = ntohl(nla_get_be32(tb[NFTA_BITWISE_SREG]));
	priv->sreg = nft_parse_register(tb[NFTA_BITWISE_SREG]);
	err = nft_validate_register_load(priv->sreg, priv->len);
	if (err < 0)
		return err;

	priv->dreg = ntohl(nla_get_be32(tb[NFTA_BITWISE_DREG]));
	priv->dreg = nft_parse_register(tb[NFTA_BITWISE_DREG]);
	err = nft_validate_register_store(ctx, priv->dreg, NULL,
					  NFT_DATA_VALUE, priv->len);
	if (err < 0)
@@ -92,9 +92,9 @@ static int nft_bitwise_dump(struct sk_buff *skb, const struct nft_expr *expr)
{
	const struct nft_bitwise *priv = nft_expr_priv(expr);

	if (nla_put_be32(skb, NFTA_BITWISE_SREG, htonl(priv->sreg)))
	if (nft_dump_register(skb, NFTA_BITWISE_SREG, priv->sreg))
		goto nla_put_failure;
	if (nla_put_be32(skb, NFTA_BITWISE_DREG, htonl(priv->dreg)))
	if (nft_dump_register(skb, NFTA_BITWISE_DREG, priv->dreg))
		goto nla_put_failure;
	if (nla_put_be32(skb, NFTA_BITWISE_LEN, htonl(priv->len)))
		goto nla_put_failure;
+4 −4
Original line number Diff line number Diff line
@@ -106,13 +106,13 @@ static int nft_byteorder_init(const struct nft_ctx *ctx,
		return -EINVAL;
	}

	priv->sreg = ntohl(nla_get_be32(tb[NFTA_BYTEORDER_SREG]));
	priv->sreg = nft_parse_register(tb[NFTA_BYTEORDER_SREG]);
	priv->len  = ntohl(nla_get_be32(tb[NFTA_BYTEORDER_LEN]));
	err = nft_validate_register_load(priv->sreg, priv->len);
	if (err < 0)
		return err;

	priv->dreg = ntohl(nla_get_be32(tb[NFTA_BYTEORDER_DREG]));
	priv->dreg = nft_parse_register(tb[NFTA_BYTEORDER_DREG]);
	return nft_validate_register_store(ctx, priv->dreg, NULL,
					   NFT_DATA_VALUE, priv->len);
}
@@ -121,9 +121,9 @@ static int nft_byteorder_dump(struct sk_buff *skb, const struct nft_expr *expr)
{
	const struct nft_byteorder *priv = nft_expr_priv(expr);

	if (nla_put_be32(skb, NFTA_BYTEORDER_SREG, htonl(priv->sreg)))
	if (nft_dump_register(skb, NFTA_BYTEORDER_SREG, priv->sreg))
		goto nla_put_failure;
	if (nla_put_be32(skb, NFTA_BYTEORDER_DREG, htonl(priv->dreg)))
	if (nft_dump_register(skb, NFTA_BYTEORDER_DREG, priv->dreg))
		goto nla_put_failure;
	if (nla_put_be32(skb, NFTA_BYTEORDER_OP, htonl(priv->op)))
		goto nla_put_failure;
Loading