net: nexthop: Adjust netlink policy parsing for a new attribute
A following patch will introduce a new attribute, op-specific flags to adjust the behavior of an operation. Different operations will recognize different flags. - To make the differentiation possible, stop sharing the policies for get and del operations. - To allow querying for presence of the attribute, have all the attribute arrays sized to NHA_MAX, regardless of what is permitted by policy, and pass the corresponding value to nlmsg_parse() as well. Signed-off-by: Petr Machata <petrm@nvidia.com> Reviewed-by: David Ahern <dsahern@kernel.org> Reviewed-by: Ido Schimmel <idosch@nvidia.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
3b43f19d06
commit
2118f9390d
@ -43,6 +43,10 @@ static const struct nla_policy rtm_nh_policy_get[] = {
|
||||
[NHA_ID] = { .type = NLA_U32 },
|
||||
};
|
||||
|
||||
static const struct nla_policy rtm_nh_policy_del[] = {
|
||||
[NHA_ID] = { .type = NLA_U32 },
|
||||
};
|
||||
|
||||
static const struct nla_policy rtm_nh_policy_dump[] = {
|
||||
[NHA_OIF] = { .type = NLA_U32 },
|
||||
[NHA_GROUPS] = { .type = NLA_FLAG },
|
||||
@ -2966,9 +2970,9 @@ static int rtm_new_nexthop(struct sk_buff *skb, struct nlmsghdr *nlh,
|
||||
return err;
|
||||
}
|
||||
|
||||
static int __nh_valid_get_del_req(const struct nlmsghdr *nlh,
|
||||
struct nlattr **tb, u32 *id,
|
||||
struct netlink_ext_ack *extack)
|
||||
static int nh_valid_get_del_req(const struct nlmsghdr *nlh,
|
||||
struct nlattr **tb, u32 *id,
|
||||
struct netlink_ext_ack *extack)
|
||||
{
|
||||
struct nhmsg *nhm = nlmsg_data(nlh);
|
||||
|
||||
@ -2991,26 +2995,12 @@ static int __nh_valid_get_del_req(const struct nlmsghdr *nlh,
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int nh_valid_get_del_req(const struct nlmsghdr *nlh, u32 *id,
|
||||
struct netlink_ext_ack *extack)
|
||||
{
|
||||
struct nlattr *tb[ARRAY_SIZE(rtm_nh_policy_get)];
|
||||
int err;
|
||||
|
||||
err = nlmsg_parse(nlh, sizeof(struct nhmsg), tb,
|
||||
ARRAY_SIZE(rtm_nh_policy_get) - 1,
|
||||
rtm_nh_policy_get, extack);
|
||||
if (err < 0)
|
||||
return err;
|
||||
|
||||
return __nh_valid_get_del_req(nlh, tb, id, extack);
|
||||
}
|
||||
|
||||
/* rtnl */
|
||||
static int rtm_del_nexthop(struct sk_buff *skb, struct nlmsghdr *nlh,
|
||||
struct netlink_ext_ack *extack)
|
||||
{
|
||||
struct net *net = sock_net(skb->sk);
|
||||
struct nlattr *tb[NHA_MAX + 1];
|
||||
struct nl_info nlinfo = {
|
||||
.nlh = nlh,
|
||||
.nl_net = net,
|
||||
@ -3020,7 +3010,12 @@ static int rtm_del_nexthop(struct sk_buff *skb, struct nlmsghdr *nlh,
|
||||
int err;
|
||||
u32 id;
|
||||
|
||||
err = nh_valid_get_del_req(nlh, &id, extack);
|
||||
err = nlmsg_parse(nlh, sizeof(struct nhmsg), tb, NHA_MAX,
|
||||
rtm_nh_policy_del, extack);
|
||||
if (err < 0)
|
||||
return err;
|
||||
|
||||
err = nh_valid_get_del_req(nlh, tb, &id, extack);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
@ -3038,12 +3033,18 @@ static int rtm_get_nexthop(struct sk_buff *in_skb, struct nlmsghdr *nlh,
|
||||
struct netlink_ext_ack *extack)
|
||||
{
|
||||
struct net *net = sock_net(in_skb->sk);
|
||||
struct nlattr *tb[NHA_MAX + 1];
|
||||
struct sk_buff *skb = NULL;
|
||||
struct nexthop *nh;
|
||||
int err;
|
||||
u32 id;
|
||||
|
||||
err = nh_valid_get_del_req(nlh, &id, extack);
|
||||
err = nlmsg_parse(nlh, sizeof(struct nhmsg), tb, NHA_MAX,
|
||||
rtm_nh_policy_get, extack);
|
||||
if (err < 0)
|
||||
return err;
|
||||
|
||||
err = nh_valid_get_del_req(nlh, tb, &id, extack);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
@ -3157,11 +3158,10 @@ static int nh_valid_dump_req(const struct nlmsghdr *nlh,
|
||||
struct nh_dump_filter *filter,
|
||||
struct netlink_callback *cb)
|
||||
{
|
||||
struct nlattr *tb[ARRAY_SIZE(rtm_nh_policy_dump)];
|
||||
struct nlattr *tb[NHA_MAX + 1];
|
||||
int err;
|
||||
|
||||
err = nlmsg_parse(nlh, sizeof(struct nhmsg), tb,
|
||||
ARRAY_SIZE(rtm_nh_policy_dump) - 1,
|
||||
err = nlmsg_parse(nlh, sizeof(struct nhmsg), tb, NHA_MAX,
|
||||
rtm_nh_policy_dump, cb->extack);
|
||||
if (err < 0)
|
||||
return err;
|
||||
@ -3300,11 +3300,10 @@ static int nh_valid_dump_bucket_req(const struct nlmsghdr *nlh,
|
||||
struct netlink_callback *cb)
|
||||
{
|
||||
struct nlattr *res_tb[ARRAY_SIZE(rtm_nh_res_bucket_policy_dump)];
|
||||
struct nlattr *tb[ARRAY_SIZE(rtm_nh_policy_dump_bucket)];
|
||||
struct nlattr *tb[NHA_MAX + 1];
|
||||
int err;
|
||||
|
||||
err = nlmsg_parse(nlh, sizeof(struct nhmsg), tb,
|
||||
ARRAY_SIZE(rtm_nh_policy_dump_bucket) - 1,
|
||||
err = nlmsg_parse(nlh, sizeof(struct nhmsg), tb, NHA_MAX,
|
||||
rtm_nh_policy_dump_bucket, NULL);
|
||||
if (err < 0)
|
||||
return err;
|
||||
@ -3474,16 +3473,15 @@ static int nh_valid_get_bucket_req(const struct nlmsghdr *nlh,
|
||||
u32 *id, u16 *bucket_index,
|
||||
struct netlink_ext_ack *extack)
|
||||
{
|
||||
struct nlattr *tb[ARRAY_SIZE(rtm_nh_policy_get_bucket)];
|
||||
struct nlattr *tb[NHA_MAX + 1];
|
||||
int err;
|
||||
|
||||
err = nlmsg_parse(nlh, sizeof(struct nhmsg), tb,
|
||||
ARRAY_SIZE(rtm_nh_policy_get_bucket) - 1,
|
||||
err = nlmsg_parse(nlh, sizeof(struct nhmsg), tb, NHA_MAX,
|
||||
rtm_nh_policy_get_bucket, extack);
|
||||
if (err < 0)
|
||||
return err;
|
||||
|
||||
err = __nh_valid_get_del_req(nlh, tb, id, extack);
|
||||
err = nh_valid_get_del_req(nlh, tb, id, extack);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user