Merge branch 'netlink-be-policy'
Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
commit
da7d8e65b3
@ -325,6 +325,7 @@ struct nla_policy {
|
|||||||
struct netlink_range_validation_signed *range_signed;
|
struct netlink_range_validation_signed *range_signed;
|
||||||
struct {
|
struct {
|
||||||
s16 min, max;
|
s16 min, max;
|
||||||
|
u8 network_byte_order:1;
|
||||||
};
|
};
|
||||||
int (*validate)(const struct nlattr *attr,
|
int (*validate)(const struct nlattr *attr,
|
||||||
struct netlink_ext_ack *extack);
|
struct netlink_ext_ack *extack);
|
||||||
@ -418,6 +419,14 @@ struct nla_policy {
|
|||||||
.type = NLA_ENSURE_INT_OR_BINARY_TYPE(tp), \
|
.type = NLA_ENSURE_INT_OR_BINARY_TYPE(tp), \
|
||||||
.validation_type = NLA_VALIDATE_MAX, \
|
.validation_type = NLA_VALIDATE_MAX, \
|
||||||
.max = _max, \
|
.max = _max, \
|
||||||
|
.network_byte_order = 0, \
|
||||||
|
}
|
||||||
|
|
||||||
|
#define NLA_POLICY_MAX_BE(tp, _max) { \
|
||||||
|
.type = NLA_ENSURE_UINT_TYPE(tp), \
|
||||||
|
.validation_type = NLA_VALIDATE_MAX, \
|
||||||
|
.max = _max, \
|
||||||
|
.network_byte_order = 1, \
|
||||||
}
|
}
|
||||||
|
|
||||||
#define NLA_POLICY_MASK(tp, _mask) { \
|
#define NLA_POLICY_MASK(tp, _mask) { \
|
||||||
|
31
lib/nlattr.c
31
lib/nlattr.c
@ -159,6 +159,31 @@ void nla_get_range_unsigned(const struct nla_policy *pt,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static u64 nla_get_attr_bo(const struct nla_policy *pt,
|
||||||
|
const struct nlattr *nla)
|
||||||
|
{
|
||||||
|
switch (pt->type) {
|
||||||
|
case NLA_U16:
|
||||||
|
if (pt->network_byte_order)
|
||||||
|
return ntohs(nla_get_be16(nla));
|
||||||
|
|
||||||
|
return nla_get_u16(nla);
|
||||||
|
case NLA_U32:
|
||||||
|
if (pt->network_byte_order)
|
||||||
|
return ntohl(nla_get_be32(nla));
|
||||||
|
|
||||||
|
return nla_get_u32(nla);
|
||||||
|
case NLA_U64:
|
||||||
|
if (pt->network_byte_order)
|
||||||
|
return be64_to_cpu(nla_get_be64(nla));
|
||||||
|
|
||||||
|
return nla_get_u64(nla);
|
||||||
|
}
|
||||||
|
|
||||||
|
WARN_ON_ONCE(1);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
static int nla_validate_range_unsigned(const struct nla_policy *pt,
|
static int nla_validate_range_unsigned(const struct nla_policy *pt,
|
||||||
const struct nlattr *nla,
|
const struct nlattr *nla,
|
||||||
struct netlink_ext_ack *extack,
|
struct netlink_ext_ack *extack,
|
||||||
@ -172,12 +197,10 @@ static int nla_validate_range_unsigned(const struct nla_policy *pt,
|
|||||||
value = nla_get_u8(nla);
|
value = nla_get_u8(nla);
|
||||||
break;
|
break;
|
||||||
case NLA_U16:
|
case NLA_U16:
|
||||||
value = nla_get_u16(nla);
|
|
||||||
break;
|
|
||||||
case NLA_U32:
|
case NLA_U32:
|
||||||
value = nla_get_u32(nla);
|
|
||||||
break;
|
|
||||||
case NLA_U64:
|
case NLA_U64:
|
||||||
|
value = nla_get_attr_bo(pt, nla);
|
||||||
|
break;
|
||||||
case NLA_MSECS:
|
case NLA_MSECS:
|
||||||
value = nla_get_u64(nla);
|
value = nla_get_u64(nla);
|
||||||
break;
|
break;
|
||||||
|
@ -173,10 +173,10 @@ static const struct nla_policy nft_payload_policy[NFTA_PAYLOAD_MAX + 1] = {
|
|||||||
[NFTA_PAYLOAD_SREG] = { .type = NLA_U32 },
|
[NFTA_PAYLOAD_SREG] = { .type = NLA_U32 },
|
||||||
[NFTA_PAYLOAD_DREG] = { .type = NLA_U32 },
|
[NFTA_PAYLOAD_DREG] = { .type = NLA_U32 },
|
||||||
[NFTA_PAYLOAD_BASE] = { .type = NLA_U32 },
|
[NFTA_PAYLOAD_BASE] = { .type = NLA_U32 },
|
||||||
[NFTA_PAYLOAD_OFFSET] = { .type = NLA_U32 },
|
[NFTA_PAYLOAD_OFFSET] = NLA_POLICY_MAX_BE(NLA_U32, 255),
|
||||||
[NFTA_PAYLOAD_LEN] = { .type = NLA_U32 },
|
[NFTA_PAYLOAD_LEN] = NLA_POLICY_MAX_BE(NLA_U32, 255),
|
||||||
[NFTA_PAYLOAD_CSUM_TYPE] = { .type = NLA_U32 },
|
[NFTA_PAYLOAD_CSUM_TYPE] = { .type = NLA_U32 },
|
||||||
[NFTA_PAYLOAD_CSUM_OFFSET] = { .type = NLA_U32 },
|
[NFTA_PAYLOAD_CSUM_OFFSET] = NLA_POLICY_MAX_BE(NLA_U32, 255),
|
||||||
[NFTA_PAYLOAD_CSUM_FLAGS] = { .type = NLA_U32 },
|
[NFTA_PAYLOAD_CSUM_FLAGS] = { .type = NLA_U32 },
|
||||||
};
|
};
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user