123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266 |
- --- a/net/wireless/nl80211.c
- +++ b/net/wireless/nl80211.c
- @@ -32,8 +32,22 @@ static int nl80211_crypto_settings(struc
- struct cfg80211_crypto_settings *settings,
- int cipher_limit);
-
- +static int nl80211_pre_doit(const struct genl_ops *ops, struct sk_buff *skb,
- + struct genl_info *info);
- +static void nl80211_post_doit(const struct genl_ops *ops, struct sk_buff *skb,
- + struct genl_info *info);
- +
- /* the netlink family */
- -static struct genl_family nl80211_fam;
- +static struct genl_family nl80211_fam = {
- + .id = GENL_ID_GENERATE, /* don't bother with a hardcoded ID */
- + .name = NL80211_GENL_NAME, /* have users key off the name instead */
- + .hdrsize = 0, /* no private header */
- + .version = 1, /* no particular meaning now */
- + .maxattr = NL80211_ATTR_MAX,
- + .netnsok = true,
- + .pre_doit = nl80211_pre_doit,
- + .post_doit = nl80211_post_doit,
- +};
-
- /* multicast groups */
- enum nl80211_multicast_groups {
- @@ -549,14 +563,13 @@ static int nl80211_prepare_wdev_dump(str
-
- if (!cb->args[0]) {
- err = nlmsg_parse(cb->nlh, GENL_HDRLEN + nl80211_fam.hdrsize,
- - genl_family_attrbuf(&nl80211_fam),
- - nl80211_fam.maxattr, nl80211_policy);
- + nl80211_fam.attrbuf, nl80211_fam.maxattr,
- + nl80211_policy);
- if (err)
- goto out_unlock;
-
- - *wdev = __cfg80211_wdev_from_attrs(
- - sock_net(skb->sk),
- - genl_family_attrbuf(&nl80211_fam));
- + *wdev = __cfg80211_wdev_from_attrs(sock_net(skb->sk),
- + nl80211_fam.attrbuf);
- if (IS_ERR(*wdev)) {
- err = PTR_ERR(*wdev);
- goto out_unlock;
- @@ -1903,7 +1916,7 @@ static int nl80211_dump_wiphy_parse(stru
- struct netlink_callback *cb,
- struct nl80211_dump_wiphy_state *state)
- {
- - struct nlattr **tb = genl_family_attrbuf(&nl80211_fam);
- + struct nlattr **tb = nl80211_fam.attrbuf;
- int ret = nlmsg_parse(cb->nlh, GENL_HDRLEN + nl80211_fam.hdrsize,
- tb, nl80211_fam.maxattr, nl80211_policy);
- /* ignore parse errors for backward compatibility */
- @@ -7733,7 +7746,6 @@ static int nl80211_send_survey(struct sk
-
- static int nl80211_dump_survey(struct sk_buff *skb, struct netlink_callback *cb)
- {
- - struct nlattr **attrbuf = genl_family_attrbuf(&nl80211_fam);
- struct survey_info survey;
- struct cfg80211_registered_device *rdev;
- struct wireless_dev *wdev;
- @@ -7746,7 +7758,7 @@ static int nl80211_dump_survey(struct sk
- return res;
-
- /* prepare_wdev_dump parsed the attributes */
- - radio_stats = attrbuf[NL80211_ATTR_SURVEY_RADIO_STATS];
- + radio_stats = nl80211_fam.attrbuf[NL80211_ATTR_SURVEY_RADIO_STATS];
-
- if (!wdev->netdev) {
- res = -EINVAL;
- @@ -8594,14 +8606,14 @@ static int nl80211_testmode_dump(struct
- */
- phy_idx = cb->args[0] - 1;
- } else {
- - struct nlattr **attrbuf = genl_family_attrbuf(&nl80211_fam);
- -
- err = nlmsg_parse(cb->nlh, GENL_HDRLEN + nl80211_fam.hdrsize,
- - attrbuf, nl80211_fam.maxattr, nl80211_policy);
- + nl80211_fam.attrbuf, nl80211_fam.maxattr,
- + nl80211_policy);
- if (err)
- goto out_err;
-
- - rdev = __cfg80211_rdev_from_attrs(sock_net(skb->sk), attrbuf);
- + rdev = __cfg80211_rdev_from_attrs(sock_net(skb->sk),
- + nl80211_fam.attrbuf);
- if (IS_ERR(rdev)) {
- err = PTR_ERR(rdev);
- goto out_err;
- @@ -8609,8 +8621,9 @@ static int nl80211_testmode_dump(struct
- phy_idx = rdev->wiphy_idx;
- rdev = NULL;
-
- - if (attrbuf[NL80211_ATTR_TESTDATA])
- - cb->args[1] = (long)attrbuf[NL80211_ATTR_TESTDATA];
- + if (nl80211_fam.attrbuf[NL80211_ATTR_TESTDATA])
- + cb->args[1] =
- + (long)nl80211_fam.attrbuf[NL80211_ATTR_TESTDATA];
- }
-
- if (cb->args[1]) {
- @@ -10814,7 +10827,8 @@ static int handle_nan_filter(struct nlat
-
- i = 0;
- nla_for_each_nested(attr, attr_filter, rem) {
- - filter[i].filter = nla_memdup(attr, GFP_KERNEL);
- + filter[i].filter = kmemdup(nla_data(attr), nla_len(attr),
- + GFP_KERNEL);
- filter[i].len = nla_len(attr);
- i++;
- }
- @@ -11450,7 +11464,6 @@ static int nl80211_prepare_vendor_dump(s
- struct cfg80211_registered_device **rdev,
- struct wireless_dev **wdev)
- {
- - struct nlattr **attrbuf = genl_family_attrbuf(&nl80211_fam);
- u32 vid, subcmd;
- unsigned int i;
- int vcmd_idx = -1;
- @@ -11486,28 +11499,31 @@ static int nl80211_prepare_vendor_dump(s
- }
-
- err = nlmsg_parse(cb->nlh, GENL_HDRLEN + nl80211_fam.hdrsize,
- - attrbuf, nl80211_fam.maxattr, nl80211_policy);
- + nl80211_fam.attrbuf, nl80211_fam.maxattr,
- + nl80211_policy);
- if (err)
- goto out_unlock;
-
- - if (!attrbuf[NL80211_ATTR_VENDOR_ID] ||
- - !attrbuf[NL80211_ATTR_VENDOR_SUBCMD]) {
- + if (!nl80211_fam.attrbuf[NL80211_ATTR_VENDOR_ID] ||
- + !nl80211_fam.attrbuf[NL80211_ATTR_VENDOR_SUBCMD]) {
- err = -EINVAL;
- goto out_unlock;
- }
-
- - *wdev = __cfg80211_wdev_from_attrs(sock_net(skb->sk), attrbuf);
- + *wdev = __cfg80211_wdev_from_attrs(sock_net(skb->sk),
- + nl80211_fam.attrbuf);
- if (IS_ERR(*wdev))
- *wdev = NULL;
-
- - *rdev = __cfg80211_rdev_from_attrs(sock_net(skb->sk), attrbuf);
- + *rdev = __cfg80211_rdev_from_attrs(sock_net(skb->sk),
- + nl80211_fam.attrbuf);
- if (IS_ERR(*rdev)) {
- err = PTR_ERR(*rdev);
- goto out_unlock;
- }
-
- - vid = nla_get_u32(attrbuf[NL80211_ATTR_VENDOR_ID]);
- - subcmd = nla_get_u32(attrbuf[NL80211_ATTR_VENDOR_SUBCMD]);
- + vid = nla_get_u32(nl80211_fam.attrbuf[NL80211_ATTR_VENDOR_ID]);
- + subcmd = nla_get_u32(nl80211_fam.attrbuf[NL80211_ATTR_VENDOR_SUBCMD]);
-
- for (i = 0; i < (*rdev)->wiphy.n_vendor_commands; i++) {
- const struct wiphy_vendor_command *vcmd;
- @@ -11531,9 +11547,9 @@ static int nl80211_prepare_vendor_dump(s
- goto out_unlock;
- }
-
- - if (attrbuf[NL80211_ATTR_VENDOR_DATA]) {
- - data = nla_data(attrbuf[NL80211_ATTR_VENDOR_DATA]);
- - data_len = nla_len(attrbuf[NL80211_ATTR_VENDOR_DATA]);
- + if (nl80211_fam.attrbuf[NL80211_ATTR_VENDOR_DATA]) {
- + data = nla_data(nl80211_fam.attrbuf[NL80211_ATTR_VENDOR_DATA]);
- + data_len = nla_len(nl80211_fam.attrbuf[NL80211_ATTR_VENDOR_DATA]);
- }
-
- /* 0 is the first index - add 1 to parse only once */
- @@ -12795,21 +12811,6 @@ static __genl_const struct genl_ops nl80
- },
- };
-
- -static struct genl_family nl80211_fam __ro_after_init = {
- - .name = NL80211_GENL_NAME, /* have users key off the name instead */
- - .hdrsize = 0, /* no private header */
- - .version = 1, /* no particular meaning now */
- - .maxattr = NL80211_ATTR_MAX,
- - .netnsok = true,
- - .pre_doit = nl80211_pre_doit,
- - .post_doit = nl80211_post_doit,
- - .module = THIS_MODULE,
- - .ops = nl80211_ops,
- - .n_ops = ARRAY_SIZE(nl80211_ops),
- - .mcgrps = nl80211_mcgrps,
- - .n_mcgrps = ARRAY_SIZE(nl80211_mcgrps),
- -};
- -
- /* notification functions */
-
- void nl80211_notify_wiphy(struct cfg80211_registered_device *rdev,
- @@ -14759,11 +14760,12 @@ void nl80211_send_ap_stopped(struct wire
-
- /* initialisation/exit functions */
-
- -int __init nl80211_init(void)
- +int nl80211_init(void)
- {
- int err;
-
- - err = genl_register_family(&nl80211_fam);
- + err = genl_register_family_with_ops_groups(&nl80211_fam, nl80211_ops,
- + nl80211_mcgrps);
- if (err)
- return err;
-
- --- a/drivers/net/wireless/mac80211_hwsim.c
- +++ b/drivers/net/wireless/mac80211_hwsim.c
- @@ -587,8 +587,15 @@ struct hwsim_radiotap_ack_hdr {
- __le16 rt_chbitmask;
- } __packed;
-
- -/* MAC80211_HWSIM netlink family */
- -static struct genl_family hwsim_genl_family;
- +/* MAC80211_HWSIM netlinf family */
- +static struct genl_family hwsim_genl_family = {
- + .id = GENL_ID_GENERATE,
- + .hdrsize = 0,
- + .name = "MAC80211_HWSIM",
- + .version = 1,
- + .maxattr = HWSIM_ATTR_MAX,
- + .netnsok = true,
- +};
-
- enum hwsim_multicast_groups {
- HWSIM_MCGRP_CONFIG,
- @@ -3250,18 +3257,6 @@ static __genl_const struct genl_ops hwsi
- },
- };
-
- -static struct genl_family hwsim_genl_family __ro_after_init = {
- - .name = "MAC80211_HWSIM",
- - .version = 1,
- - .maxattr = HWSIM_ATTR_MAX,
- - .netnsok = true,
- - .module = THIS_MODULE,
- - .ops = hwsim_ops,
- - .n_ops = ARRAY_SIZE(hwsim_ops),
- - .mcgrps = hwsim_mcgrps,
- - .n_mcgrps = ARRAY_SIZE(hwsim_mcgrps),
- -};
- -
- static void destroy_radio(struct work_struct *work)
- {
- struct mac80211_hwsim_data *data =
- @@ -3309,13 +3304,15 @@ static struct notifier_block hwsim_netli
- .notifier_call = mac80211_hwsim_netlink_notify,
- };
-
- -static int __init hwsim_init_netlink(void)
- +static int hwsim_init_netlink(void)
- {
- int rc;
-
- printk(KERN_INFO "mac80211_hwsim: initializing netlink\n");
-
- - rc = genl_register_family(&hwsim_genl_family);
- + rc = genl_register_family_with_ops_groups(&hwsim_genl_family,
- + hwsim_ops,
- + hwsim_mcgrps);
- if (rc)
- goto failure;
-
|