Commit 2182db91 authored by Johannes Berg's avatar Johannes Berg

nl80211: rework internal_flags usage

Since internal_flags is only 8 bits, we can only have one
more internal flag. However, we can obviously never use all
of possible the combinations, in fact, we only use 14 of
them (including no flags).

Since we want more flags for MLO (multi-link operation) in
the future, refactor the code to use a flags selector, so
wrap all of the .internal_flags assignments in a IFLAGS()
macro which selects the combination according to the pre-
defined list of combinations.

When we need a new combination, we'll have to add it, but
again we will never use all possible combinations.
Signed-off-by: default avatarJohannes Berg <johannes.berg@intel.com>
Link: https://lore.kernel.org/r/20220414140402.70ddf8af3eb0.I2cc38cb6a10bb4c3863ec9ee97edbcc70a07aa4b@changeidSigned-off-by: default avatarJohannes Berg <johannes.berg@intel.com>
parent 1b550a0b
...@@ -15287,23 +15287,79 @@ static int nl80211_set_fils_aad(struct sk_buff *skb, ...@@ -15287,23 +15287,79 @@ static int nl80211_set_fils_aad(struct sk_buff *skb,
#define NL80211_FLAG_CLEAR_SKB 0x20 #define NL80211_FLAG_CLEAR_SKB 0x20
#define NL80211_FLAG_NO_WIPHY_MTX 0x40 #define NL80211_FLAG_NO_WIPHY_MTX 0x40
#define INTERNAL_FLAG_SELECTORS(__sel) \
SELECTOR(__sel, NONE, 0) /* must be first */ \
SELECTOR(__sel, WIPHY, \
NL80211_FLAG_NEED_WIPHY) \
SELECTOR(__sel, WDEV, \
NL80211_FLAG_NEED_WDEV) \
SELECTOR(__sel, NETDEV, \
NL80211_FLAG_NEED_NETDEV) \
SELECTOR(__sel, WIPHY_RTNL, \
NL80211_FLAG_NEED_WIPHY | \
NL80211_FLAG_NEED_RTNL) \
SELECTOR(__sel, WIPHY_RTNL_NOMTX, \
NL80211_FLAG_NEED_WIPHY | \
NL80211_FLAG_NEED_RTNL | \
NL80211_FLAG_NO_WIPHY_MTX) \
SELECTOR(__sel, WDEV_RTNL, \
NL80211_FLAG_NEED_WDEV | \
NL80211_FLAG_NEED_RTNL) \
SELECTOR(__sel, NETDEV_RTNL, \
NL80211_FLAG_NEED_NETDEV | \
NL80211_FLAG_NEED_RTNL) \
SELECTOR(__sel, NETDEV_UP, \
NL80211_FLAG_NEED_NETDEV_UP) \
SELECTOR(__sel, NETDEV_UP_NOTMX, \
NL80211_FLAG_NEED_NETDEV_UP | \
NL80211_FLAG_NO_WIPHY_MTX) \
SELECTOR(__sel, NETDEV_UP_CLEAR, \
NL80211_FLAG_NEED_NETDEV_UP | \
NL80211_FLAG_CLEAR_SKB) \
SELECTOR(__sel, WDEV_UP, \
NL80211_FLAG_NEED_WDEV_UP) \
SELECTOR(__sel, WDEV_UP_RTNL, \
NL80211_FLAG_NEED_WDEV_UP | \
NL80211_FLAG_NEED_RTNL) \
SELECTOR(__sel, WIPHY_CLEAR, \
NL80211_FLAG_NEED_WIPHY | \
NL80211_FLAG_CLEAR_SKB)
enum nl80211_internal_flags_selector {
#define SELECTOR(_, name, value) NL80211_IFL_SEL_##name,
INTERNAL_FLAG_SELECTORS(_)
#undef SELECTOR
};
static u32 nl80211_internal_flags[] = {
#define SELECTOR(_, name, value) [NL80211_IFL_SEL_##name] = value,
INTERNAL_FLAG_SELECTORS(_)
#undef SELECTOR
};
static int nl80211_pre_doit(const struct genl_ops *ops, struct sk_buff *skb, static int nl80211_pre_doit(const struct genl_ops *ops, struct sk_buff *skb,
struct genl_info *info) struct genl_info *info)
{ {
struct cfg80211_registered_device *rdev = NULL; struct cfg80211_registered_device *rdev = NULL;
struct wireless_dev *wdev; struct wireless_dev *wdev;
struct net_device *dev; struct net_device *dev;
u32 internal_flags;
if (WARN_ON(ops->internal_flags >= ARRAY_SIZE(nl80211_internal_flags)))
return -EINVAL;
internal_flags = nl80211_internal_flags[ops->internal_flags];
rtnl_lock(); rtnl_lock();
if (ops->internal_flags & NL80211_FLAG_NEED_WIPHY) { if (internal_flags & NL80211_FLAG_NEED_WIPHY) {
rdev = cfg80211_get_dev_from_info(genl_info_net(info), info); rdev = cfg80211_get_dev_from_info(genl_info_net(info), info);
if (IS_ERR(rdev)) { if (IS_ERR(rdev)) {
rtnl_unlock(); rtnl_unlock();
return PTR_ERR(rdev); return PTR_ERR(rdev);
} }
info->user_ptr[0] = rdev; info->user_ptr[0] = rdev;
} else if (ops->internal_flags & NL80211_FLAG_NEED_NETDEV || } else if (internal_flags & NL80211_FLAG_NEED_NETDEV ||
ops->internal_flags & NL80211_FLAG_NEED_WDEV) { internal_flags & NL80211_FLAG_NEED_WDEV) {
wdev = __cfg80211_wdev_from_attrs(NULL, genl_info_net(info), wdev = __cfg80211_wdev_from_attrs(NULL, genl_info_net(info),
info->attrs); info->attrs);
if (IS_ERR(wdev)) { if (IS_ERR(wdev)) {
...@@ -15314,7 +15370,7 @@ static int nl80211_pre_doit(const struct genl_ops *ops, struct sk_buff *skb, ...@@ -15314,7 +15370,7 @@ static int nl80211_pre_doit(const struct genl_ops *ops, struct sk_buff *skb,
dev = wdev->netdev; dev = wdev->netdev;
rdev = wiphy_to_rdev(wdev->wiphy); rdev = wiphy_to_rdev(wdev->wiphy);
if (ops->internal_flags & NL80211_FLAG_NEED_NETDEV) { if (internal_flags & NL80211_FLAG_NEED_NETDEV) {
if (!dev) { if (!dev) {
rtnl_unlock(); rtnl_unlock();
return -EINVAL; return -EINVAL;
...@@ -15325,7 +15381,7 @@ static int nl80211_pre_doit(const struct genl_ops *ops, struct sk_buff *skb, ...@@ -15325,7 +15381,7 @@ static int nl80211_pre_doit(const struct genl_ops *ops, struct sk_buff *skb,
info->user_ptr[1] = wdev; info->user_ptr[1] = wdev;
} }
if (ops->internal_flags & NL80211_FLAG_CHECK_NETDEV_UP && if (internal_flags & NL80211_FLAG_CHECK_NETDEV_UP &&
!wdev_running(wdev)) { !wdev_running(wdev)) {
rtnl_unlock(); rtnl_unlock();
return -ENETDOWN; return -ENETDOWN;
...@@ -15335,12 +15391,12 @@ static int nl80211_pre_doit(const struct genl_ops *ops, struct sk_buff *skb, ...@@ -15335,12 +15391,12 @@ static int nl80211_pre_doit(const struct genl_ops *ops, struct sk_buff *skb,
info->user_ptr[0] = rdev; info->user_ptr[0] = rdev;
} }
if (rdev && !(ops->internal_flags & NL80211_FLAG_NO_WIPHY_MTX)) { if (rdev && !(internal_flags & NL80211_FLAG_NO_WIPHY_MTX)) {
wiphy_lock(&rdev->wiphy); wiphy_lock(&rdev->wiphy);
/* we keep the mutex locked until post_doit */ /* we keep the mutex locked until post_doit */
__release(&rdev->wiphy.mtx); __release(&rdev->wiphy.mtx);
} }
if (!(ops->internal_flags & NL80211_FLAG_NEED_RTNL)) if (!(internal_flags & NL80211_FLAG_NEED_RTNL))
rtnl_unlock(); rtnl_unlock();
return 0; return 0;
...@@ -15349,8 +15405,10 @@ static int nl80211_pre_doit(const struct genl_ops *ops, struct sk_buff *skb, ...@@ -15349,8 +15405,10 @@ static int nl80211_pre_doit(const struct genl_ops *ops, struct sk_buff *skb,
static void nl80211_post_doit(const struct genl_ops *ops, struct sk_buff *skb, static void nl80211_post_doit(const struct genl_ops *ops, struct sk_buff *skb,
struct genl_info *info) struct genl_info *info)
{ {
u32 internal_flags = nl80211_internal_flags[ops->internal_flags];
if (info->user_ptr[1]) { if (info->user_ptr[1]) {
if (ops->internal_flags & NL80211_FLAG_NEED_WDEV) { if (internal_flags & NL80211_FLAG_NEED_WDEV) {
struct wireless_dev *wdev = info->user_ptr[1]; struct wireless_dev *wdev = info->user_ptr[1];
dev_put(wdev->netdev); dev_put(wdev->netdev);
...@@ -15360,7 +15418,7 @@ static void nl80211_post_doit(const struct genl_ops *ops, struct sk_buff *skb, ...@@ -15360,7 +15418,7 @@ static void nl80211_post_doit(const struct genl_ops *ops, struct sk_buff *skb,
} }
if (info->user_ptr[0] && if (info->user_ptr[0] &&
!(ops->internal_flags & NL80211_FLAG_NO_WIPHY_MTX)) { !(internal_flags & NL80211_FLAG_NO_WIPHY_MTX)) {
struct cfg80211_registered_device *rdev = info->user_ptr[0]; struct cfg80211_registered_device *rdev = info->user_ptr[0];
/* we kept the mutex locked since pre_doit */ /* we kept the mutex locked since pre_doit */
...@@ -15368,7 +15426,7 @@ static void nl80211_post_doit(const struct genl_ops *ops, struct sk_buff *skb, ...@@ -15368,7 +15426,7 @@ static void nl80211_post_doit(const struct genl_ops *ops, struct sk_buff *skb,
wiphy_unlock(&rdev->wiphy); wiphy_unlock(&rdev->wiphy);
} }
if (ops->internal_flags & NL80211_FLAG_NEED_RTNL) if (internal_flags & NL80211_FLAG_NEED_RTNL)
rtnl_unlock(); rtnl_unlock();
/* If needed, clear the netlink message payload from the SKB /* If needed, clear the netlink message payload from the SKB
...@@ -15376,7 +15434,7 @@ static void nl80211_post_doit(const struct genl_ops *ops, struct sk_buff *skb, ...@@ -15376,7 +15434,7 @@ static void nl80211_post_doit(const struct genl_ops *ops, struct sk_buff *skb,
* the heap after the SKB is freed. The netlink message header * the heap after the SKB is freed. The netlink message header
* is still needed for further processing, so leave it intact. * is still needed for further processing, so leave it intact.
*/ */
if (ops->internal_flags & NL80211_FLAG_CLEAR_SKB) { if (internal_flags & NL80211_FLAG_CLEAR_SKB) {
struct nlmsghdr *nlh = nlmsg_hdr(skb); struct nlmsghdr *nlh = nlmsg_hdr(skb);
memset(nlmsg_data(nlh), 0, nlmsg_len(nlh)); memset(nlmsg_data(nlh), 0, nlmsg_len(nlh));
...@@ -15486,6 +15544,11 @@ static int nl80211_set_sar_specs(struct sk_buff *skb, struct genl_info *info) ...@@ -15486,6 +15544,11 @@ static int nl80211_set_sar_specs(struct sk_buff *skb, struct genl_info *info)
return err; return err;
} }
#define SELECTOR(__sel, name, value) \
((__sel) == (value)) ? NL80211_IFL_SEL_##name :
int __missing_selector(void);
#define IFLAGS(__val) INTERNAL_FLAG_SELECTORS(__val) __missing_selector()
static const struct genl_ops nl80211_ops[] = { static const struct genl_ops nl80211_ops[] = {
{ {
.cmd = NL80211_CMD_GET_WIPHY, .cmd = NL80211_CMD_GET_WIPHY,
...@@ -15494,7 +15557,7 @@ static const struct genl_ops nl80211_ops[] = { ...@@ -15494,7 +15557,7 @@ static const struct genl_ops nl80211_ops[] = {
.dumpit = nl80211_dump_wiphy, .dumpit = nl80211_dump_wiphy,
.done = nl80211_dump_wiphy_done, .done = nl80211_dump_wiphy_done,
/* can be retrieved by unprivileged users */ /* can be retrieved by unprivileged users */
.internal_flags = NL80211_FLAG_NEED_WIPHY, .internal_flags = IFLAGS(NL80211_FLAG_NEED_WIPHY),
}, },
}; };
...@@ -15511,112 +15574,113 @@ static const struct genl_small_ops nl80211_small_ops[] = { ...@@ -15511,112 +15574,113 @@ static const struct genl_small_ops nl80211_small_ops[] = {
.doit = nl80211_get_interface, .doit = nl80211_get_interface,
.dumpit = nl80211_dump_interface, .dumpit = nl80211_dump_interface,
/* can be retrieved by unprivileged users */ /* can be retrieved by unprivileged users */
.internal_flags = NL80211_FLAG_NEED_WDEV, .internal_flags = IFLAGS(NL80211_FLAG_NEED_WDEV),
}, },
{ {
.cmd = NL80211_CMD_SET_INTERFACE, .cmd = NL80211_CMD_SET_INTERFACE,
.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
.doit = nl80211_set_interface, .doit = nl80211_set_interface,
.flags = GENL_UNS_ADMIN_PERM, .flags = GENL_UNS_ADMIN_PERM,
.internal_flags = NL80211_FLAG_NEED_NETDEV | .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV |
NL80211_FLAG_NEED_RTNL, NL80211_FLAG_NEED_RTNL),
}, },
{ {
.cmd = NL80211_CMD_NEW_INTERFACE, .cmd = NL80211_CMD_NEW_INTERFACE,
.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
.doit = nl80211_new_interface, .doit = nl80211_new_interface,
.flags = GENL_UNS_ADMIN_PERM, .flags = GENL_UNS_ADMIN_PERM,
.internal_flags = NL80211_FLAG_NEED_WIPHY | .internal_flags =
IFLAGS(NL80211_FLAG_NEED_WIPHY |
NL80211_FLAG_NEED_RTNL | NL80211_FLAG_NEED_RTNL |
/* we take the wiphy mutex later ourselves */ /* we take the wiphy mutex later ourselves */
NL80211_FLAG_NO_WIPHY_MTX, NL80211_FLAG_NO_WIPHY_MTX),
}, },
{ {
.cmd = NL80211_CMD_DEL_INTERFACE, .cmd = NL80211_CMD_DEL_INTERFACE,
.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
.doit = nl80211_del_interface, .doit = nl80211_del_interface,
.flags = GENL_UNS_ADMIN_PERM, .flags = GENL_UNS_ADMIN_PERM,
.internal_flags = NL80211_FLAG_NEED_WDEV | .internal_flags = IFLAGS(NL80211_FLAG_NEED_WDEV |
NL80211_FLAG_NEED_RTNL, NL80211_FLAG_NEED_RTNL),
}, },
{ {
.cmd = NL80211_CMD_GET_KEY, .cmd = NL80211_CMD_GET_KEY,
.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
.doit = nl80211_get_key, .doit = nl80211_get_key,
.flags = GENL_UNS_ADMIN_PERM, .flags = GENL_UNS_ADMIN_PERM,
.internal_flags = NL80211_FLAG_NEED_NETDEV_UP, .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP),
}, },
{ {
.cmd = NL80211_CMD_SET_KEY, .cmd = NL80211_CMD_SET_KEY,
.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
.doit = nl80211_set_key, .doit = nl80211_set_key,
.flags = GENL_UNS_ADMIN_PERM, .flags = GENL_UNS_ADMIN_PERM,
.internal_flags = NL80211_FLAG_NEED_NETDEV_UP | .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP |
NL80211_FLAG_CLEAR_SKB, NL80211_FLAG_CLEAR_SKB),
}, },
{ {
.cmd = NL80211_CMD_NEW_KEY, .cmd = NL80211_CMD_NEW_KEY,
.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
.doit = nl80211_new_key, .doit = nl80211_new_key,
.flags = GENL_UNS_ADMIN_PERM, .flags = GENL_UNS_ADMIN_PERM,
.internal_flags = NL80211_FLAG_NEED_NETDEV_UP | .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP |
NL80211_FLAG_CLEAR_SKB, NL80211_FLAG_CLEAR_SKB),
}, },
{ {
.cmd = NL80211_CMD_DEL_KEY, .cmd = NL80211_CMD_DEL_KEY,
.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
.doit = nl80211_del_key, .doit = nl80211_del_key,
.flags = GENL_UNS_ADMIN_PERM, .flags = GENL_UNS_ADMIN_PERM,
.internal_flags = NL80211_FLAG_NEED_NETDEV_UP, .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP),
}, },
{ {
.cmd = NL80211_CMD_SET_BEACON, .cmd = NL80211_CMD_SET_BEACON,
.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
.flags = GENL_UNS_ADMIN_PERM, .flags = GENL_UNS_ADMIN_PERM,
.doit = nl80211_set_beacon, .doit = nl80211_set_beacon,
.internal_flags = NL80211_FLAG_NEED_NETDEV_UP, .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP),
}, },
{ {
.cmd = NL80211_CMD_START_AP, .cmd = NL80211_CMD_START_AP,
.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
.flags = GENL_UNS_ADMIN_PERM, .flags = GENL_UNS_ADMIN_PERM,
.doit = nl80211_start_ap, .doit = nl80211_start_ap,
.internal_flags = NL80211_FLAG_NEED_NETDEV_UP, .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP),
}, },
{ {
.cmd = NL80211_CMD_STOP_AP, .cmd = NL80211_CMD_STOP_AP,
.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
.flags = GENL_UNS_ADMIN_PERM, .flags = GENL_UNS_ADMIN_PERM,
.doit = nl80211_stop_ap, .doit = nl80211_stop_ap,
.internal_flags = NL80211_FLAG_NEED_NETDEV_UP, .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP),
}, },
{ {
.cmd = NL80211_CMD_GET_STATION, .cmd = NL80211_CMD_GET_STATION,
.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
.doit = nl80211_get_station, .doit = nl80211_get_station,
.dumpit = nl80211_dump_station, .dumpit = nl80211_dump_station,
.internal_flags = NL80211_FLAG_NEED_NETDEV, .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV),
}, },
{ {
.cmd = NL80211_CMD_SET_STATION, .cmd = NL80211_CMD_SET_STATION,
.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
.doit = nl80211_set_station, .doit = nl80211_set_station,
.flags = GENL_UNS_ADMIN_PERM, .flags = GENL_UNS_ADMIN_PERM,
.internal_flags = NL80211_FLAG_NEED_NETDEV_UP, .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP),
}, },
{ {
.cmd = NL80211_CMD_NEW_STATION, .cmd = NL80211_CMD_NEW_STATION,
.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
.doit = nl80211_new_station, .doit = nl80211_new_station,
.flags = GENL_UNS_ADMIN_PERM, .flags = GENL_UNS_ADMIN_PERM,
.internal_flags = NL80211_FLAG_NEED_NETDEV_UP, .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP),
}, },
{ {
.cmd = NL80211_CMD_DEL_STATION, .cmd = NL80211_CMD_DEL_STATION,
.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
.doit = nl80211_del_station, .doit = nl80211_del_station,
.flags = GENL_UNS_ADMIN_PERM, .flags = GENL_UNS_ADMIN_PERM,
.internal_flags = NL80211_FLAG_NEED_NETDEV_UP, .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP),
}, },
{ {
.cmd = NL80211_CMD_GET_MPATH, .cmd = NL80211_CMD_GET_MPATH,
...@@ -15624,7 +15688,7 @@ static const struct genl_small_ops nl80211_small_ops[] = { ...@@ -15624,7 +15688,7 @@ static const struct genl_small_ops nl80211_small_ops[] = {
.doit = nl80211_get_mpath, .doit = nl80211_get_mpath,
.dumpit = nl80211_dump_mpath, .dumpit = nl80211_dump_mpath,
.flags = GENL_UNS_ADMIN_PERM, .flags = GENL_UNS_ADMIN_PERM,
.internal_flags = NL80211_FLAG_NEED_NETDEV_UP, .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP),
}, },
{ {
.cmd = NL80211_CMD_GET_MPP, .cmd = NL80211_CMD_GET_MPP,
...@@ -15632,42 +15696,41 @@ static const struct genl_small_ops nl80211_small_ops[] = { ...@@ -15632,42 +15696,41 @@ static const struct genl_small_ops nl80211_small_ops[] = {
.doit = nl80211_get_mpp, .doit = nl80211_get_mpp,
.dumpit = nl80211_dump_mpp, .dumpit = nl80211_dump_mpp,
.flags = GENL_UNS_ADMIN_PERM, .flags = GENL_UNS_ADMIN_PERM,
.internal_flags = NL80211_FLAG_NEED_NETDEV_UP, .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP),
}, },
{ {
.cmd = NL80211_CMD_SET_MPATH, .cmd = NL80211_CMD_SET_MPATH,
.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
.doit = nl80211_set_mpath, .doit = nl80211_set_mpath,
.flags = GENL_UNS_ADMIN_PERM, .flags = GENL_UNS_ADMIN_PERM,
.internal_flags = NL80211_FLAG_NEED_NETDEV_UP, .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP),
}, },
{ {
.cmd = NL80211_CMD_NEW_MPATH, .cmd = NL80211_CMD_NEW_MPATH,
.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
.doit = nl80211_new_mpath, .doit = nl80211_new_mpath,
.flags = GENL_UNS_ADMIN_PERM, .flags = GENL_UNS_ADMIN_PERM,
.internal_flags = NL80211_FLAG_NEED_NETDEV_UP, .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP),
}, },
{ {
.cmd = NL80211_CMD_DEL_MPATH, .cmd = NL80211_CMD_DEL_MPATH,
.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
.doit = nl80211_del_mpath, .doit = nl80211_del_mpath,
.flags = GENL_UNS_ADMIN_PERM, .flags = GENL_UNS_ADMIN_PERM,
.internal_flags = NL80211_FLAG_NEED_NETDEV_UP, .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP),
}, },
{ {
.cmd = NL80211_CMD_SET_BSS, .cmd = NL80211_CMD_SET_BSS,
.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
.doit = nl80211_set_bss, .doit = nl80211_set_bss,
.flags = GENL_UNS_ADMIN_PERM, .flags = GENL_UNS_ADMIN_PERM,
.internal_flags = NL80211_FLAG_NEED_NETDEV_UP, .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP),
}, },
{ {
.cmd = NL80211_CMD_GET_REG, .cmd = NL80211_CMD_GET_REG,
.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
.doit = nl80211_get_reg_do, .doit = nl80211_get_reg_do,
.dumpit = nl80211_get_reg_dump, .dumpit = nl80211_get_reg_dump,
.internal_flags = 0,
/* can be retrieved by unprivileged users */ /* can be retrieved by unprivileged users */
}, },
#ifdef CONFIG_CFG80211_CRDA_SUPPORT #ifdef CONFIG_CFG80211_CRDA_SUPPORT
...@@ -15676,7 +15739,6 @@ static const struct genl_small_ops nl80211_small_ops[] = { ...@@ -15676,7 +15739,6 @@ static const struct genl_small_ops nl80211_small_ops[] = {
.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
.doit = nl80211_set_reg, .doit = nl80211_set_reg,
.flags = GENL_ADMIN_PERM, .flags = GENL_ADMIN_PERM,
.internal_flags = 0,
}, },
#endif #endif
{ {
...@@ -15696,28 +15758,28 @@ static const struct genl_small_ops nl80211_small_ops[] = { ...@@ -15696,28 +15758,28 @@ static const struct genl_small_ops nl80211_small_ops[] = {
.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
.doit = nl80211_get_mesh_config, .doit = nl80211_get_mesh_config,
/* can be retrieved by unprivileged users */ /* can be retrieved by unprivileged users */
.internal_flags = NL80211_FLAG_NEED_NETDEV_UP, .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP),
}, },
{ {
.cmd = NL80211_CMD_SET_MESH_CONFIG, .cmd = NL80211_CMD_SET_MESH_CONFIG,
.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
.doit = nl80211_update_mesh_config, .doit = nl80211_update_mesh_config,
.flags = GENL_UNS_ADMIN_PERM, .flags = GENL_UNS_ADMIN_PERM,
.internal_flags = NL80211_FLAG_NEED_NETDEV_UP, .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP),
}, },
{ {
.cmd = NL80211_CMD_TRIGGER_SCAN, .cmd = NL80211_CMD_TRIGGER_SCAN,
.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
.doit = nl80211_trigger_scan, .doit = nl80211_trigger_scan,
.flags = GENL_UNS_ADMIN_PERM, .flags = GENL_UNS_ADMIN_PERM,
.internal_flags = NL80211_FLAG_NEED_WDEV_UP, .internal_flags = IFLAGS(NL80211_FLAG_NEED_WDEV_UP),
}, },
{ {
.cmd = NL80211_CMD_ABORT_SCAN, .cmd = NL80211_CMD_ABORT_SCAN,
.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
.doit = nl80211_abort_scan, .doit = nl80211_abort_scan,
.flags = GENL_UNS_ADMIN_PERM, .flags = GENL_UNS_ADMIN_PERM,
.internal_flags = NL80211_FLAG_NEED_WDEV_UP, .internal_flags = IFLAGS(NL80211_FLAG_NEED_WDEV_UP),
}, },
{ {
.cmd = NL80211_CMD_GET_SCAN, .cmd = NL80211_CMD_GET_SCAN,
...@@ -15729,60 +15791,58 @@ static const struct genl_small_ops nl80211_small_ops[] = { ...@@ -15729,60 +15791,58 @@ static const struct genl_small_ops nl80211_small_ops[] = {
.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
.doit = nl80211_start_sched_scan, .doit = nl80211_start_sched_scan,
.flags = GENL_UNS_ADMIN_PERM, .flags = GENL_UNS_ADMIN_PERM,
.internal_flags = NL80211_FLAG_NEED_NETDEV_UP, .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP),
}, },
{ {
.cmd = NL80211_CMD_STOP_SCHED_SCAN, .cmd = NL80211_CMD_STOP_SCHED_SCAN,
.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
.doit = nl80211_stop_sched_scan, .doit = nl80211_stop_sched_scan,
.flags = GENL_UNS_ADMIN_PERM, .flags = GENL_UNS_ADMIN_PERM,
.internal_flags = NL80211_FLAG_NEED_NETDEV_UP, .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP),
}, },
{ {
.cmd = NL80211_CMD_AUTHENTICATE, .cmd = NL80211_CMD_AUTHENTICATE,
.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
.doit = nl80211_authenticate, .doit = nl80211_authenticate,
.flags = GENL_UNS_ADMIN_PERM, .flags = GENL_UNS_ADMIN_PERM,
.internal_flags = NL80211_FLAG_NEED_NETDEV_UP | .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP |
0 | NL80211_FLAG_CLEAR_SKB),
NL80211_FLAG_CLEAR_SKB,
}, },
{ {
.cmd = NL80211_CMD_ASSOCIATE, .cmd = NL80211_CMD_ASSOCIATE,
.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
.doit = nl80211_associate, .doit = nl80211_associate,
.flags = GENL_UNS_ADMIN_PERM, .flags = GENL_UNS_ADMIN_PERM,
.internal_flags = NL80211_FLAG_NEED_NETDEV_UP | .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP |
0 | NL80211_FLAG_CLEAR_SKB),
NL80211_FLAG_CLEAR_SKB,
}, },
{ {
.cmd = NL80211_CMD_DEAUTHENTICATE, .cmd = NL80211_CMD_DEAUTHENTICATE,
.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
.doit = nl80211_deauthenticate, .doit = nl80211_deauthenticate,
.flags = GENL_UNS_ADMIN_PERM, .flags = GENL_UNS_ADMIN_PERM,
.internal_flags = NL80211_FLAG_NEED_NETDEV_UP, .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP),
}, },
{ {
.cmd = NL80211_CMD_DISASSOCIATE, .cmd = NL80211_CMD_DISASSOCIATE,
.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
.doit = nl80211_disassociate, .doit = nl80211_disassociate,
.flags = GENL_UNS_ADMIN_PERM, .flags = GENL_UNS_ADMIN_PERM,
.internal_flags = NL80211_FLAG_NEED_NETDEV_UP, .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP),
}, },
{ {
.cmd = NL80211_CMD_JOIN_IBSS, .cmd = NL80211_CMD_JOIN_IBSS,
.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
.doit = nl80211_join_ibss, .doit = nl80211_join_ibss,
.flags = GENL_UNS_ADMIN_PERM, .flags = GENL_UNS_ADMIN_PERM,
.internal_flags = NL80211_FLAG_NEED_NETDEV_UP, .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP),
}, },
{ {
.cmd = NL80211_CMD_LEAVE_IBSS, .cmd = NL80211_CMD_LEAVE_IBSS,
.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
.doit = nl80211_leave_ibss, .doit = nl80211_leave_ibss,
.flags = GENL_UNS_ADMIN_PERM, .flags = GENL_UNS_ADMIN_PERM,
.internal_flags = NL80211_FLAG_NEED_NETDEV_UP, .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP),
}, },
#ifdef CONFIG_NL80211_TESTMODE #ifdef CONFIG_NL80211_TESTMODE
{ {
...@@ -15791,7 +15851,7 @@ static const struct genl_small_ops nl80211_small_ops[] = { ...@@ -15791,7 +15851,7 @@ static const struct genl_small_ops nl80211_small_ops[] = {
.doit = nl80211_testmode_do, .doit = nl80211_testmode_do,
.dumpit = nl80211_testmode_dump, .dumpit = nl80211_testmode_dump,
.flags = GENL_UNS_ADMIN_PERM, .flags = GENL_UNS_ADMIN_PERM,
.internal_flags = NL80211_FLAG_NEED_WIPHY, .internal_flags = IFLAGS(NL80211_FLAG_NEED_WIPHY),
}, },
#endif #endif
{ {
...@@ -15799,34 +15859,32 @@ static const struct genl_small_ops nl80211_small_ops[] = { ...@@ -15799,34 +15859,32 @@ static const struct genl_small_ops nl80211_small_ops[] = {
.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
.doit = nl80211_connect, .doit = nl80211_connect,
.flags = GENL_UNS_ADMIN_PERM, .flags = GENL_UNS_ADMIN_PERM,
.internal_flags = NL80211_FLAG_NEED_NETDEV_UP | .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP |
0 | NL80211_FLAG_CLEAR_SKB),
NL80211_FLAG_CLEAR_SKB,
}, },
{ {
.cmd = NL80211_CMD_UPDATE_CONNECT_PARAMS, .cmd = NL80211_CMD_UPDATE_CONNECT_PARAMS,
.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
.doit = nl80211_update_connect_params, .doit = nl80211_update_connect_params,
.flags = GENL_ADMIN_PERM, .flags = GENL_ADMIN_PERM,
.internal_flags = NL80211_FLAG_NEED_NETDEV_UP | .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP |
0 | NL80211_FLAG_CLEAR_SKB),
NL80211_FLAG_CLEAR_SKB,
}, },
{ {
.cmd = NL80211_CMD_DISCONNECT, .cmd = NL80211_CMD_DISCONNECT,
.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
.doit = nl80211_disconnect, .doit = nl80211_disconnect,
.flags = GENL_UNS_ADMIN_PERM, .flags = GENL_UNS_ADMIN_PERM,
.internal_flags = NL80211_FLAG_NEED_NETDEV_UP, .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP),
}, },
{ {
.cmd = NL80211_CMD_SET_WIPHY_NETNS, .cmd = NL80211_CMD_SET_WIPHY_NETNS,
.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
.doit = nl80211_wiphy_netns, .doit = nl80211_wiphy_netns,
.flags = GENL_UNS_ADMIN_PERM, .flags = GENL_UNS_ADMIN_PERM,
.internal_flags = NL80211_FLAG_NEED_WIPHY | .internal_flags = IFLAGS(NL80211_FLAG_NEED_WIPHY |
NL80211_FLAG_NEED_RTNL | NL80211_FLAG_NEED_RTNL |
NL80211_FLAG_NO_WIPHY_MTX, NL80211_FLAG_NO_WIPHY_MTX),
}, },
{ {
.cmd = NL80211_CMD_GET_SURVEY, .cmd = NL80211_CMD_GET_SURVEY,
...@@ -15838,121 +15896,120 @@ static const struct genl_small_ops nl80211_small_ops[] = { ...@@ -15838,121 +15896,120 @@ static const struct genl_small_ops nl80211_small_ops[] = {
.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
.doit = nl80211_setdel_pmksa, .doit = nl80211_setdel_pmksa,
.flags = GENL_UNS_ADMIN_PERM, .flags = GENL_UNS_ADMIN_PERM,
.internal_flags = NL80211_FLAG_NEED_NETDEV_UP | .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP |
0 | NL80211_FLAG_CLEAR_SKB),
NL80211_FLAG_CLEAR_SKB,
}, },
{ {
.cmd = NL80211_CMD_DEL_PMKSA, .cmd = NL80211_CMD_DEL_PMKSA,
.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
.doit = nl80211_setdel_pmksa, .doit = nl80211_setdel_pmksa,
.flags = GENL_UNS_ADMIN_PERM, .flags = GENL_UNS_ADMIN_PERM,
.internal_flags = NL80211_FLAG_NEED_NETDEV_UP, .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP),
}, },
{ {
.cmd = NL80211_CMD_FLUSH_PMKSA, .cmd = NL80211_CMD_FLUSH_PMKSA,
.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
.doit = nl80211_flush_pmksa, .doit = nl80211_flush_pmksa,
.flags = GENL_UNS_ADMIN_PERM, .flags = GENL_UNS_ADMIN_PERM,
.internal_flags = NL80211_FLAG_NEED_NETDEV_UP, .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP),
}, },
{ {
.cmd = NL80211_CMD_REMAIN_ON_CHANNEL, .cmd = NL80211_CMD_REMAIN_ON_CHANNEL,
.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
.doit = nl80211_remain_on_channel, .doit = nl80211_remain_on_channel,
.flags = GENL_UNS_ADMIN_PERM, .flags = GENL_UNS_ADMIN_PERM,
.internal_flags = NL80211_FLAG_NEED_WDEV_UP, .internal_flags = IFLAGS(NL80211_FLAG_NEED_WDEV_UP),
}, },
{ {
.cmd = NL80211_CMD_CANCEL_REMAIN_ON_CHANNEL, .cmd = NL80211_CMD_CANCEL_REMAIN_ON_CHANNEL,
.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
.doit = nl80211_cancel_remain_on_channel, .doit = nl80211_cancel_remain_on_channel,
.flags = GENL_UNS_ADMIN_PERM, .flags = GENL_UNS_ADMIN_PERM,
.internal_flags = NL80211_FLAG_NEED_WDEV_UP, .internal_flags = IFLAGS(NL80211_FLAG_NEED_WDEV_UP),
}, },
{ {
.cmd = NL80211_CMD_SET_TX_BITRATE_MASK, .cmd = NL80211_CMD_SET_TX_BITRATE_MASK,
.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
.doit = nl80211_set_tx_bitrate_mask, .doit = nl80211_set_tx_bitrate_mask,
.flags = GENL_UNS_ADMIN_PERM, .flags = GENL_UNS_ADMIN_PERM,
.internal_flags = NL80211_FLAG_NEED_NETDEV, .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV),
}, },
{ {
.cmd = NL80211_CMD_REGISTER_FRAME, .cmd = NL80211_CMD_REGISTER_FRAME,
.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
.doit = nl80211_register_mgmt, .doit = nl80211_register_mgmt,
.flags = GENL_UNS_ADMIN_PERM, .flags = GENL_UNS_ADMIN_PERM,
.internal_flags = NL80211_FLAG_NEED_WDEV, .internal_flags = IFLAGS(NL80211_FLAG_NEED_WDEV),
}, },
{ {
.cmd = NL80211_CMD_FRAME, .cmd = NL80211_CMD_FRAME,
.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
.doit = nl80211_tx_mgmt, .doit = nl80211_tx_mgmt,
.flags = GENL_UNS_ADMIN_PERM, .flags = GENL_UNS_ADMIN_PERM,
.internal_flags = NL80211_FLAG_NEED_WDEV_UP, .internal_flags = IFLAGS(NL80211_FLAG_NEED_WDEV_UP),
}, },
{ {
.cmd = NL80211_CMD_FRAME_WAIT_CANCEL, .cmd = NL80211_CMD_FRAME_WAIT_CANCEL,
.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
.doit = nl80211_tx_mgmt_cancel_wait, .doit = nl80211_tx_mgmt_cancel_wait,
.flags = GENL_UNS_ADMIN_PERM, .flags = GENL_UNS_ADMIN_PERM,
.internal_flags = NL80211_FLAG_NEED_WDEV_UP, .internal_flags = IFLAGS(NL80211_FLAG_NEED_WDEV_UP),
}, },
{ {
.cmd = NL80211_CMD_SET_POWER_SAVE, .cmd = NL80211_CMD_SET_POWER_SAVE,
.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
.doit = nl80211_set_power_save, .doit = nl80211_set_power_save,
.flags = GENL_UNS_ADMIN_PERM, .flags = GENL_UNS_ADMIN_PERM,
.internal_flags = NL80211_FLAG_NEED_NETDEV, .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV),
}, },
{ {
.cmd = NL80211_CMD_GET_POWER_SAVE, .cmd = NL80211_CMD_GET_POWER_SAVE,
.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
.doit = nl80211_get_power_save, .doit = nl80211_get_power_save,
/* can be retrieved by unprivileged users */ /* can be retrieved by unprivileged users */
.internal_flags = NL80211_FLAG_NEED_NETDEV, .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV),
}, },
{ {
.cmd = NL80211_CMD_SET_CQM, .cmd = NL80211_CMD_SET_CQM,
.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
.doit = nl80211_set_cqm, .doit = nl80211_set_cqm,
.flags = GENL_UNS_ADMIN_PERM, .flags = GENL_UNS_ADMIN_PERM,
.internal_flags = NL80211_FLAG_NEED_NETDEV, .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV),
}, },
{ {
.cmd = NL80211_CMD_SET_CHANNEL, .cmd = NL80211_CMD_SET_CHANNEL,
.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
.doit = nl80211_set_channel, .doit = nl80211_set_channel,
.flags = GENL_UNS_ADMIN_PERM, .flags = GENL_UNS_ADMIN_PERM,
.internal_flags = NL80211_FLAG_NEED_NETDEV, .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV),
}, },
{ {
.cmd = NL80211_CMD_JOIN_MESH, .cmd = NL80211_CMD_JOIN_MESH,
.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
.doit = nl80211_join_mesh, .doit = nl80211_join_mesh,
.flags = GENL_UNS_ADMIN_PERM, .flags = GENL_UNS_ADMIN_PERM,
.internal_flags = NL80211_FLAG_NEED_NETDEV_UP, .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP),
}, },
{ {
.cmd = NL80211_CMD_LEAVE_MESH, .cmd = NL80211_CMD_LEAVE_MESH,
.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
.doit = nl80211_leave_mesh, .doit = nl80211_leave_mesh,
.flags = GENL_UNS_ADMIN_PERM, .flags = GENL_UNS_ADMIN_PERM,
.internal_flags = NL80211_FLAG_NEED_NETDEV_UP, .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP),
}, },
{ {
.cmd = NL80211_CMD_JOIN_OCB, .cmd = NL80211_CMD_JOIN_OCB,
.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
.doit = nl80211_join_ocb, .doit = nl80211_join_ocb,
.flags = GENL_UNS_ADMIN_PERM, .flags = GENL_UNS_ADMIN_PERM,
.internal_flags = NL80211_FLAG_NEED_NETDEV_UP, .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP),
}, },
{ {
.cmd = NL80211_CMD_LEAVE_OCB, .cmd = NL80211_CMD_LEAVE_OCB,
.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
.doit = nl80211_leave_ocb, .doit = nl80211_leave_ocb,
.flags = GENL_UNS_ADMIN_PERM, .flags = GENL_UNS_ADMIN_PERM,
.internal_flags = NL80211_FLAG_NEED_NETDEV_UP, .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP),
}, },
#ifdef CONFIG_PM #ifdef CONFIG_PM
{ {
...@@ -15960,14 +16017,14 @@ static const struct genl_small_ops nl80211_small_ops[] = { ...@@ -15960,14 +16017,14 @@ static const struct genl_small_ops nl80211_small_ops[] = {
.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
.doit = nl80211_get_wowlan, .doit = nl80211_get_wowlan,
/* can be retrieved by unprivileged users */ /* can be retrieved by unprivileged users */
.internal_flags = NL80211_FLAG_NEED_WIPHY, .internal_flags = IFLAGS(NL80211_FLAG_NEED_WIPHY),
}, },
{ {
.cmd = NL80211_CMD_SET_WOWLAN, .cmd = NL80211_CMD_SET_WOWLAN,
.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
.doit = nl80211_set_wowlan, .doit = nl80211_set_wowlan,
.flags = GENL_UNS_ADMIN_PERM, .flags = GENL_UNS_ADMIN_PERM,
.internal_flags = NL80211_FLAG_NEED_WIPHY, .internal_flags = IFLAGS(NL80211_FLAG_NEED_WIPHY),
}, },
#endif #endif
{ {
...@@ -15975,126 +16032,125 @@ static const struct genl_small_ops nl80211_small_ops[] = { ...@@ -15975,126 +16032,125 @@ static const struct genl_small_ops nl80211_small_ops[] = {
.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
.doit = nl80211_set_rekey_data, .doit = nl80211_set_rekey_data,
.flags = GENL_UNS_ADMIN_PERM, .flags = GENL_UNS_ADMIN_PERM,
.internal_flags = NL80211_FLAG_NEED_NETDEV_UP | .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP |
0 | NL80211_FLAG_CLEAR_SKB),
NL80211_FLAG_CLEAR_SKB,
}, },
{ {
.cmd = NL80211_CMD_TDLS_MGMT, .cmd = NL80211_CMD_TDLS_MGMT,
.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
.doit = nl80211_tdls_mgmt, .doit = nl80211_tdls_mgmt,
.flags = GENL_UNS_ADMIN_PERM, .flags = GENL_UNS_ADMIN_PERM,
.internal_flags = NL80211_FLAG_NEED_NETDEV_UP, .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP),
}, },
{ {
.cmd = NL80211_CMD_TDLS_OPER, .cmd = NL80211_CMD_TDLS_OPER,
.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
.doit = nl80211_tdls_oper, .doit = nl80211_tdls_oper,
.flags = GENL_UNS_ADMIN_PERM, .flags = GENL_UNS_ADMIN_PERM,
.internal_flags = NL80211_FLAG_NEED_NETDEV_UP, .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP),
}, },
{ {
.cmd = NL80211_CMD_UNEXPECTED_FRAME, .cmd = NL80211_CMD_UNEXPECTED_FRAME,
.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
.doit = nl80211_register_unexpected_frame, .doit = nl80211_register_unexpected_frame,
.flags = GENL_UNS_ADMIN_PERM, .flags = GENL_UNS_ADMIN_PERM,
.internal_flags = NL80211_FLAG_NEED_NETDEV, .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV),
}, },
{ {
.cmd = NL80211_CMD_PROBE_CLIENT, .cmd = NL80211_CMD_PROBE_CLIENT,
.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
.doit = nl80211_probe_client, .doit = nl80211_probe_client,
.flags = GENL_UNS_ADMIN_PERM, .flags = GENL_UNS_ADMIN_PERM,
.internal_flags = NL80211_FLAG_NEED_NETDEV_UP, .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP),
}, },
{ {
.cmd = NL80211_CMD_REGISTER_BEACONS, .cmd = NL80211_CMD_REGISTER_BEACONS,
.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
.doit = nl80211_register_beacons, .doit = nl80211_register_beacons,
.flags = GENL_UNS_ADMIN_PERM, .flags = GENL_UNS_ADMIN_PERM,
.internal_flags = NL80211_FLAG_NEED_WIPHY, .internal_flags = IFLAGS(NL80211_FLAG_NEED_WIPHY),
}, },
{ {
.cmd = NL80211_CMD_SET_NOACK_MAP, .cmd = NL80211_CMD_SET_NOACK_MAP,
.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
.doit = nl80211_set_noack_map, .doit = nl80211_set_noack_map,
.flags = GENL_UNS_ADMIN_PERM, .flags = GENL_UNS_ADMIN_PERM,
.internal_flags = NL80211_FLAG_NEED_NETDEV, .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV),
}, },
{ {
.cmd = NL80211_CMD_START_P2P_DEVICE, .cmd = NL80211_CMD_START_P2P_DEVICE,
.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
.doit = nl80211_start_p2p_device, .doit = nl80211_start_p2p_device,
.flags = GENL_UNS_ADMIN_PERM, .flags = GENL_UNS_ADMIN_PERM,
.internal_flags = NL80211_FLAG_NEED_WDEV | .internal_flags = IFLAGS(NL80211_FLAG_NEED_WDEV |
NL80211_FLAG_NEED_RTNL, NL80211_FLAG_NEED_RTNL),
}, },
{ {
.cmd = NL80211_CMD_STOP_P2P_DEVICE, .cmd = NL80211_CMD_STOP_P2P_DEVICE,
.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
.doit = nl80211_stop_p2p_device, .doit = nl80211_stop_p2p_device,
.flags = GENL_UNS_ADMIN_PERM, .flags = GENL_UNS_ADMIN_PERM,
.internal_flags = NL80211_FLAG_NEED_WDEV_UP | .internal_flags = IFLAGS(NL80211_FLAG_NEED_WDEV_UP |
NL80211_FLAG_NEED_RTNL, NL80211_FLAG_NEED_RTNL),
}, },
{ {
.cmd = NL80211_CMD_START_NAN, .cmd = NL80211_CMD_START_NAN,
.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
.doit = nl80211_start_nan, .doit = nl80211_start_nan,
.flags = GENL_ADMIN_PERM, .flags = GENL_ADMIN_PERM,
.internal_flags = NL80211_FLAG_NEED_WDEV | .internal_flags = IFLAGS(NL80211_FLAG_NEED_WDEV |
NL80211_FLAG_NEED_RTNL, NL80211_FLAG_NEED_RTNL),
}, },
{ {
.cmd = NL80211_CMD_STOP_NAN, .cmd = NL80211_CMD_STOP_NAN,
.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
.doit = nl80211_stop_nan, .doit = nl80211_stop_nan,
.flags = GENL_ADMIN_PERM, .flags = GENL_ADMIN_PERM,
.internal_flags = NL80211_FLAG_NEED_WDEV_UP | .internal_flags = IFLAGS(NL80211_FLAG_NEED_WDEV_UP |
NL80211_FLAG_NEED_RTNL, NL80211_FLAG_NEED_RTNL),
}, },
{ {
.cmd = NL80211_CMD_ADD_NAN_FUNCTION, .cmd = NL80211_CMD_ADD_NAN_FUNCTION,
.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
.doit = nl80211_nan_add_func, .doit = nl80211_nan_add_func,
.flags = GENL_ADMIN_PERM, .flags = GENL_ADMIN_PERM,
.internal_flags = NL80211_FLAG_NEED_WDEV_UP, .internal_flags = IFLAGS(NL80211_FLAG_NEED_WDEV_UP),
}, },
{ {
.cmd = NL80211_CMD_DEL_NAN_FUNCTION, .cmd = NL80211_CMD_DEL_NAN_FUNCTION,
.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
.doit = nl80211_nan_del_func, .doit = nl80211_nan_del_func,
.flags = GENL_ADMIN_PERM, .flags = GENL_ADMIN_PERM,
.internal_flags = NL80211_FLAG_NEED_WDEV_UP, .internal_flags = IFLAGS(NL80211_FLAG_NEED_WDEV_UP),
}, },
{ {
.cmd = NL80211_CMD_CHANGE_NAN_CONFIG, .cmd = NL80211_CMD_CHANGE_NAN_CONFIG,
.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
.doit = nl80211_nan_change_config, .doit = nl80211_nan_change_config,
.flags = GENL_ADMIN_PERM, .flags = GENL_ADMIN_PERM,
.internal_flags = NL80211_FLAG_NEED_WDEV_UP, .internal_flags = IFLAGS(NL80211_FLAG_NEED_WDEV_UP),
}, },
{ {
.cmd = NL80211_CMD_SET_MCAST_RATE, .cmd = NL80211_CMD_SET_MCAST_RATE,
.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
.doit = nl80211_set_mcast_rate, .doit = nl80211_set_mcast_rate,
.flags = GENL_UNS_ADMIN_PERM, .flags = GENL_UNS_ADMIN_PERM,
.internal_flags = NL80211_FLAG_NEED_NETDEV, .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV),
}, },
{ {
.cmd = NL80211_CMD_SET_MAC_ACL, .cmd = NL80211_CMD_SET_MAC_ACL,
.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
.doit = nl80211_set_mac_acl, .doit = nl80211_set_mac_acl,
.flags = GENL_UNS_ADMIN_PERM, .flags = GENL_UNS_ADMIN_PERM,
.internal_flags = NL80211_FLAG_NEED_NETDEV, .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV),
}, },
{ {
.cmd = NL80211_CMD_RADAR_DETECT, .cmd = NL80211_CMD_RADAR_DETECT,
.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
.doit = nl80211_start_radar_detection, .doit = nl80211_start_radar_detection,
.flags = GENL_UNS_ADMIN_PERM, .flags = GENL_UNS_ADMIN_PERM,
.internal_flags = NL80211_FLAG_NEED_NETDEV_UP | .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP |
NL80211_FLAG_NO_WIPHY_MTX, NL80211_FLAG_NO_WIPHY_MTX),
}, },
{ {
.cmd = NL80211_CMD_GET_PROTOCOL_FEATURES, .cmd = NL80211_CMD_GET_PROTOCOL_FEATURES,
...@@ -16106,41 +16162,41 @@ static const struct genl_small_ops nl80211_small_ops[] = { ...@@ -16106,41 +16162,41 @@ static const struct genl_small_ops nl80211_small_ops[] = {
.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
.doit = nl80211_update_ft_ies, .doit = nl80211_update_ft_ies,
.flags = GENL_UNS_ADMIN_PERM, .flags = GENL_UNS_ADMIN_PERM,
.internal_flags = NL80211_FLAG_NEED_NETDEV_UP, .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP),
}, },
{ {
.cmd = NL80211_CMD_CRIT_PROTOCOL_START, .cmd = NL80211_CMD_CRIT_PROTOCOL_START,
.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
.doit = nl80211_crit_protocol_start, .doit = nl80211_crit_protocol_start,
.flags = GENL_UNS_ADMIN_PERM, .flags = GENL_UNS_ADMIN_PERM,
.internal_flags = NL80211_FLAG_NEED_WDEV_UP, .internal_flags = IFLAGS(NL80211_FLAG_NEED_WDEV_UP),
}, },
{ {
.cmd = NL80211_CMD_CRIT_PROTOCOL_STOP, .cmd = NL80211_CMD_CRIT_PROTOCOL_STOP,
.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
.doit = nl80211_crit_protocol_stop, .doit = nl80211_crit_protocol_stop,
.flags = GENL_UNS_ADMIN_PERM, .flags = GENL_UNS_ADMIN_PERM,
.internal_flags = NL80211_FLAG_NEED_WDEV_UP, .internal_flags = IFLAGS(NL80211_FLAG_NEED_WDEV_UP),
}, },
{ {
.cmd = NL80211_CMD_GET_COALESCE, .cmd = NL80211_CMD_GET_COALESCE,
.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
.doit = nl80211_get_coalesce, .doit = nl80211_get_coalesce,
.internal_flags = NL80211_FLAG_NEED_WIPHY, .internal_flags = IFLAGS(NL80211_FLAG_NEED_WIPHY),
}, },
{ {
.cmd = NL80211_CMD_SET_COALESCE, .cmd = NL80211_CMD_SET_COALESCE,
.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
.doit = nl80211_set_coalesce, .doit = nl80211_set_coalesce,
.flags = GENL_UNS_ADMIN_PERM, .flags = GENL_UNS_ADMIN_PERM,
.internal_flags = NL80211_FLAG_NEED_WIPHY, .internal_flags = IFLAGS(NL80211_FLAG_NEED_WIPHY),
}, },
{ {
.cmd = NL80211_CMD_CHANNEL_SWITCH, .cmd = NL80211_CMD_CHANNEL_SWITCH,
.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
.doit = nl80211_channel_switch, .doit = nl80211_channel_switch,
.flags = GENL_UNS_ADMIN_PERM, .flags = GENL_UNS_ADMIN_PERM,
.internal_flags = NL80211_FLAG_NEED_NETDEV_UP, .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP),
}, },
{ {
.cmd = NL80211_CMD_VENDOR, .cmd = NL80211_CMD_VENDOR,
...@@ -16148,139 +16204,137 @@ static const struct genl_small_ops nl80211_small_ops[] = { ...@@ -16148,139 +16204,137 @@ static const struct genl_small_ops nl80211_small_ops[] = {
.doit = nl80211_vendor_cmd, .doit = nl80211_vendor_cmd,
.dumpit = nl80211_vendor_cmd_dump, .dumpit = nl80211_vendor_cmd_dump,
.flags = GENL_UNS_ADMIN_PERM, .flags = GENL_UNS_ADMIN_PERM,
.internal_flags = NL80211_FLAG_NEED_WIPHY | .internal_flags = IFLAGS(NL80211_FLAG_NEED_WIPHY |
0 | NL80211_FLAG_CLEAR_SKB),
NL80211_FLAG_CLEAR_SKB,
}, },
{ {
.cmd = NL80211_CMD_SET_QOS_MAP, .cmd = NL80211_CMD_SET_QOS_MAP,
.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
.doit = nl80211_set_qos_map, .doit = nl80211_set_qos_map,
.flags = GENL_UNS_ADMIN_PERM, .flags = GENL_UNS_ADMIN_PERM,
.internal_flags = NL80211_FLAG_NEED_NETDEV_UP, .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP),
}, },
{ {
.cmd = NL80211_CMD_ADD_TX_TS, .cmd = NL80211_CMD_ADD_TX_TS,
.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
.doit = nl80211_add_tx_ts, .doit = nl80211_add_tx_ts,
.flags = GENL_UNS_ADMIN_PERM, .flags = GENL_UNS_ADMIN_PERM,
.internal_flags = NL80211_FLAG_NEED_NETDEV_UP, .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP),
}, },
{ {
.cmd = NL80211_CMD_DEL_TX_TS, .cmd = NL80211_CMD_DEL_TX_TS,
.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
.doit = nl80211_del_tx_ts, .doit = nl80211_del_tx_ts,
.flags = GENL_UNS_ADMIN_PERM, .flags = GENL_UNS_ADMIN_PERM,
.internal_flags = NL80211_FLAG_NEED_NETDEV_UP, .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP),
}, },
{ {
.cmd = NL80211_CMD_TDLS_CHANNEL_SWITCH, .cmd = NL80211_CMD_TDLS_CHANNEL_SWITCH,
.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
.doit = nl80211_tdls_channel_switch, .doit = nl80211_tdls_channel_switch,
.flags = GENL_UNS_ADMIN_PERM, .flags = GENL_UNS_ADMIN_PERM,
.internal_flags = NL80211_FLAG_NEED_NETDEV_UP, .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP),
}, },
{ {
.cmd = NL80211_CMD_TDLS_CANCEL_CHANNEL_SWITCH, .cmd = NL80211_CMD_TDLS_CANCEL_CHANNEL_SWITCH,
.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
.doit = nl80211_tdls_cancel_channel_switch, .doit = nl80211_tdls_cancel_channel_switch,
.flags = GENL_UNS_ADMIN_PERM, .flags = GENL_UNS_ADMIN_PERM,
.internal_flags = NL80211_FLAG_NEED_NETDEV_UP, .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP),
}, },
{ {
.cmd = NL80211_CMD_SET_MULTICAST_TO_UNICAST, .cmd = NL80211_CMD_SET_MULTICAST_TO_UNICAST,
.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
.doit = nl80211_set_multicast_to_unicast, .doit = nl80211_set_multicast_to_unicast,
.flags = GENL_UNS_ADMIN_PERM, .flags = GENL_UNS_ADMIN_PERM,
.internal_flags = NL80211_FLAG_NEED_NETDEV, .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV),
}, },
{ {
.cmd = NL80211_CMD_SET_PMK, .cmd = NL80211_CMD_SET_PMK,
.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
.doit = nl80211_set_pmk, .doit = nl80211_set_pmk,
.internal_flags = NL80211_FLAG_NEED_NETDEV_UP | .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP |
0 | NL80211_FLAG_CLEAR_SKB),
NL80211_FLAG_CLEAR_SKB,
}, },
{ {
.cmd = NL80211_CMD_DEL_PMK, .cmd = NL80211_CMD_DEL_PMK,
.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
.doit = nl80211_del_pmk, .doit = nl80211_del_pmk,
.internal_flags = NL80211_FLAG_NEED_NETDEV_UP, .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP),
}, },
{ {
.cmd = NL80211_CMD_EXTERNAL_AUTH, .cmd = NL80211_CMD_EXTERNAL_AUTH,
.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
.doit = nl80211_external_auth, .doit = nl80211_external_auth,
.flags = GENL_ADMIN_PERM, .flags = GENL_ADMIN_PERM,
.internal_flags = NL80211_FLAG_NEED_NETDEV_UP, .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP),
}, },
{ {
.cmd = NL80211_CMD_CONTROL_PORT_FRAME, .cmd = NL80211_CMD_CONTROL_PORT_FRAME,
.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
.doit = nl80211_tx_control_port, .doit = nl80211_tx_control_port,
.flags = GENL_UNS_ADMIN_PERM, .flags = GENL_UNS_ADMIN_PERM,
.internal_flags = NL80211_FLAG_NEED_NETDEV_UP, .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP),
}, },
{ {
.cmd = NL80211_CMD_GET_FTM_RESPONDER_STATS, .cmd = NL80211_CMD_GET_FTM_RESPONDER_STATS,
.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
.doit = nl80211_get_ftm_responder_stats, .doit = nl80211_get_ftm_responder_stats,
.internal_flags = NL80211_FLAG_NEED_NETDEV, .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV),
}, },
{ {
.cmd = NL80211_CMD_PEER_MEASUREMENT_START, .cmd = NL80211_CMD_PEER_MEASUREMENT_START,
.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
.doit = nl80211_pmsr_start, .doit = nl80211_pmsr_start,
.flags = GENL_UNS_ADMIN_PERM, .flags = GENL_UNS_ADMIN_PERM,
.internal_flags = NL80211_FLAG_NEED_WDEV_UP, .internal_flags = IFLAGS(NL80211_FLAG_NEED_WDEV_UP),
}, },
{ {
.cmd = NL80211_CMD_NOTIFY_RADAR, .cmd = NL80211_CMD_NOTIFY_RADAR,
.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
.doit = nl80211_notify_radar_detection, .doit = nl80211_notify_radar_detection,
.flags = GENL_UNS_ADMIN_PERM, .flags = GENL_UNS_ADMIN_PERM,
.internal_flags = NL80211_FLAG_NEED_NETDEV_UP, .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP),
}, },
{ {
.cmd = NL80211_CMD_UPDATE_OWE_INFO, .cmd = NL80211_CMD_UPDATE_OWE_INFO,
.doit = nl80211_update_owe_info, .doit = nl80211_update_owe_info,
.flags = GENL_ADMIN_PERM, .flags = GENL_ADMIN_PERM,
.internal_flags = NL80211_FLAG_NEED_NETDEV_UP, .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP),
}, },
{ {
.cmd = NL80211_CMD_PROBE_MESH_LINK, .cmd = NL80211_CMD_PROBE_MESH_LINK,
.doit = nl80211_probe_mesh_link, .doit = nl80211_probe_mesh_link,
.flags = GENL_UNS_ADMIN_PERM, .flags = GENL_UNS_ADMIN_PERM,
.internal_flags = NL80211_FLAG_NEED_NETDEV_UP, .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP),
}, },
{ {
.cmd = NL80211_CMD_SET_TID_CONFIG, .cmd = NL80211_CMD_SET_TID_CONFIG,
.doit = nl80211_set_tid_config, .doit = nl80211_set_tid_config,
.flags = GENL_UNS_ADMIN_PERM, .flags = GENL_UNS_ADMIN_PERM,
.internal_flags = NL80211_FLAG_NEED_NETDEV, .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV),
}, },
{ {
.cmd = NL80211_CMD_SET_SAR_SPECS, .cmd = NL80211_CMD_SET_SAR_SPECS,
.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
.doit = nl80211_set_sar_specs, .doit = nl80211_set_sar_specs,
.flags = GENL_UNS_ADMIN_PERM, .flags = GENL_UNS_ADMIN_PERM,
.internal_flags = NL80211_FLAG_NEED_WIPHY | .internal_flags = IFLAGS(NL80211_FLAG_NEED_WIPHY |
NL80211_FLAG_NEED_RTNL, NL80211_FLAG_NEED_RTNL),
}, },
{ {
.cmd = NL80211_CMD_COLOR_CHANGE_REQUEST, .cmd = NL80211_CMD_COLOR_CHANGE_REQUEST,
.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
.doit = nl80211_color_change, .doit = nl80211_color_change,
.flags = GENL_UNS_ADMIN_PERM, .flags = GENL_UNS_ADMIN_PERM,
.internal_flags = NL80211_FLAG_NEED_NETDEV_UP, .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP),
}, },
{ {
.cmd = NL80211_CMD_SET_FILS_AAD, .cmd = NL80211_CMD_SET_FILS_AAD,
.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
.doit = nl80211_set_fils_aad, .doit = nl80211_set_fils_aad,
.flags = GENL_UNS_ADMIN_PERM, .flags = GENL_UNS_ADMIN_PERM,
.internal_flags = NL80211_FLAG_NEED_NETDEV_UP, .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP),
}, },
}; };
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment