aboutsummaryrefslogtreecommitdiffstats
path: root/package/kernel/mac80211/patches/007-revert-genetlink-changes.patch
diff options
context:
space:
mode:
Diffstat (limited to 'package/kernel/mac80211/patches/007-revert-genetlink-changes.patch')
-rw-r--r--package/kernel/mac80211/patches/007-revert-genetlink-changes.patch266
1 files changed, 266 insertions, 0 deletions
diff --git a/package/kernel/mac80211/patches/007-revert-genetlink-changes.patch b/package/kernel/mac80211/patches/007-revert-genetlink-changes.patch
new file mode 100644
index 0000000000..1a85106bc2
--- /dev/null
+++ b/package/kernel/mac80211/patches/007-revert-genetlink-changes.patch
@@ -0,0 +1,266 @@
+--- 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;
+