Fresh pull from upstream 17.01 branch
[librecmc/librecmc.git] / package / kernel / mac80211 / patches / 007-revert-genetlink-changes.patch
1 --- a/net/wireless/nl80211.c
2 +++ b/net/wireless/nl80211.c
3 @@ -32,8 +32,22 @@ static int nl80211_crypto_settings(struc
4                                    struct cfg80211_crypto_settings *settings,
5                                    int cipher_limit);
6  
7 +static int nl80211_pre_doit(const struct genl_ops *ops, struct sk_buff *skb,
8 +                           struct genl_info *info);
9 +static void nl80211_post_doit(const struct genl_ops *ops, struct sk_buff *skb,
10 +                             struct genl_info *info);
11 +
12  /* the netlink family */
13 -static struct genl_family nl80211_fam;
14 +static struct genl_family nl80211_fam = {
15 +       .id = GENL_ID_GENERATE,         /* don't bother with a hardcoded ID */
16 +       .name = NL80211_GENL_NAME,      /* have users key off the name instead */
17 +       .hdrsize = 0,                   /* no private header */
18 +       .version = 1,                   /* no particular meaning now */
19 +       .maxattr = NL80211_ATTR_MAX,
20 +       .netnsok = true,
21 +       .pre_doit = nl80211_pre_doit,
22 +       .post_doit = nl80211_post_doit,
23 +};
24  
25  /* multicast groups */
26  enum nl80211_multicast_groups {
27 @@ -549,14 +563,13 @@ static int nl80211_prepare_wdev_dump(str
28  
29         if (!cb->args[0]) {
30                 err = nlmsg_parse(cb->nlh, GENL_HDRLEN + nl80211_fam.hdrsize,
31 -                                 genl_family_attrbuf(&nl80211_fam),
32 -                                 nl80211_fam.maxattr, nl80211_policy);
33 +                                 nl80211_fam.attrbuf, nl80211_fam.maxattr,
34 +                                 nl80211_policy);
35                 if (err)
36                         goto out_unlock;
37  
38 -               *wdev = __cfg80211_wdev_from_attrs(
39 -                                       sock_net(skb->sk),
40 -                                       genl_family_attrbuf(&nl80211_fam));
41 +               *wdev = __cfg80211_wdev_from_attrs(sock_net(skb->sk),
42 +                                                  nl80211_fam.attrbuf);
43                 if (IS_ERR(*wdev)) {
44                         err = PTR_ERR(*wdev);
45                         goto out_unlock;
46 @@ -1903,7 +1916,7 @@ static int nl80211_dump_wiphy_parse(stru
47                                     struct netlink_callback *cb,
48                                     struct nl80211_dump_wiphy_state *state)
49  {
50 -       struct nlattr **tb = genl_family_attrbuf(&nl80211_fam);
51 +       struct nlattr **tb = nl80211_fam.attrbuf;
52         int ret = nlmsg_parse(cb->nlh, GENL_HDRLEN + nl80211_fam.hdrsize,
53                               tb, nl80211_fam.maxattr, nl80211_policy);
54         /* ignore parse errors for backward compatibility */
55 @@ -7733,7 +7746,6 @@ static int nl80211_send_survey(struct sk
56  
57  static int nl80211_dump_survey(struct sk_buff *skb, struct netlink_callback *cb)
58  {
59 -       struct nlattr **attrbuf = genl_family_attrbuf(&nl80211_fam);
60         struct survey_info survey;
61         struct cfg80211_registered_device *rdev;
62         struct wireless_dev *wdev;
63 @@ -7746,7 +7758,7 @@ static int nl80211_dump_survey(struct sk
64                 return res;
65  
66         /* prepare_wdev_dump parsed the attributes */
67 -       radio_stats = attrbuf[NL80211_ATTR_SURVEY_RADIO_STATS];
68 +       radio_stats = nl80211_fam.attrbuf[NL80211_ATTR_SURVEY_RADIO_STATS];
69  
70         if (!wdev->netdev) {
71                 res = -EINVAL;
72 @@ -8594,14 +8606,14 @@ static int nl80211_testmode_dump(struct
73                  */
74                 phy_idx = cb->args[0] - 1;
75         } else {
76 -               struct nlattr **attrbuf = genl_family_attrbuf(&nl80211_fam);
77 -
78                 err = nlmsg_parse(cb->nlh, GENL_HDRLEN + nl80211_fam.hdrsize,
79 -                                 attrbuf, nl80211_fam.maxattr, nl80211_policy);
80 +                                 nl80211_fam.attrbuf, nl80211_fam.maxattr,
81 +                                 nl80211_policy);
82                 if (err)
83                         goto out_err;
84  
85 -               rdev = __cfg80211_rdev_from_attrs(sock_net(skb->sk), attrbuf);
86 +               rdev = __cfg80211_rdev_from_attrs(sock_net(skb->sk),
87 +                                                 nl80211_fam.attrbuf);
88                 if (IS_ERR(rdev)) {
89                         err = PTR_ERR(rdev);
90                         goto out_err;
91 @@ -8609,8 +8621,9 @@ static int nl80211_testmode_dump(struct
92                 phy_idx = rdev->wiphy_idx;
93                 rdev = NULL;
94  
95 -               if (attrbuf[NL80211_ATTR_TESTDATA])
96 -                       cb->args[1] = (long)attrbuf[NL80211_ATTR_TESTDATA];
97 +               if (nl80211_fam.attrbuf[NL80211_ATTR_TESTDATA])
98 +                       cb->args[1] =
99 +                               (long)nl80211_fam.attrbuf[NL80211_ATTR_TESTDATA];
100         }
101  
102         if (cb->args[1]) {
103 @@ -10814,7 +10827,8 @@ static int handle_nan_filter(struct nlat
104  
105         i = 0;
106         nla_for_each_nested(attr, attr_filter, rem) {
107 -               filter[i].filter = nla_memdup(attr, GFP_KERNEL);
108 +               filter[i].filter = kmemdup(nla_data(attr), nla_len(attr),
109 +                                          GFP_KERNEL);
110                 filter[i].len = nla_len(attr);
111                 i++;
112         }
113 @@ -11450,7 +11464,6 @@ static int nl80211_prepare_vendor_dump(s
114                                        struct cfg80211_registered_device **rdev,
115                                        struct wireless_dev **wdev)
116  {
117 -       struct nlattr **attrbuf = genl_family_attrbuf(&nl80211_fam);
118         u32 vid, subcmd;
119         unsigned int i;
120         int vcmd_idx = -1;
121 @@ -11486,28 +11499,31 @@ static int nl80211_prepare_vendor_dump(s
122         }
123  
124         err = nlmsg_parse(cb->nlh, GENL_HDRLEN + nl80211_fam.hdrsize,
125 -                         attrbuf, nl80211_fam.maxattr, nl80211_policy);
126 +                         nl80211_fam.attrbuf, nl80211_fam.maxattr,
127 +                         nl80211_policy);
128         if (err)
129                 goto out_unlock;
130  
131 -       if (!attrbuf[NL80211_ATTR_VENDOR_ID] ||
132 -           !attrbuf[NL80211_ATTR_VENDOR_SUBCMD]) {
133 +       if (!nl80211_fam.attrbuf[NL80211_ATTR_VENDOR_ID] ||
134 +           !nl80211_fam.attrbuf[NL80211_ATTR_VENDOR_SUBCMD]) {
135                 err = -EINVAL;
136                 goto out_unlock;
137         }
138  
139 -       *wdev = __cfg80211_wdev_from_attrs(sock_net(skb->sk), attrbuf);
140 +       *wdev = __cfg80211_wdev_from_attrs(sock_net(skb->sk),
141 +                                          nl80211_fam.attrbuf);
142         if (IS_ERR(*wdev))
143                 *wdev = NULL;
144  
145 -       *rdev = __cfg80211_rdev_from_attrs(sock_net(skb->sk), attrbuf);
146 +       *rdev = __cfg80211_rdev_from_attrs(sock_net(skb->sk),
147 +                                          nl80211_fam.attrbuf);
148         if (IS_ERR(*rdev)) {
149                 err = PTR_ERR(*rdev);
150                 goto out_unlock;
151         }
152  
153 -       vid = nla_get_u32(attrbuf[NL80211_ATTR_VENDOR_ID]);
154 -       subcmd = nla_get_u32(attrbuf[NL80211_ATTR_VENDOR_SUBCMD]);
155 +       vid = nla_get_u32(nl80211_fam.attrbuf[NL80211_ATTR_VENDOR_ID]);
156 +       subcmd = nla_get_u32(nl80211_fam.attrbuf[NL80211_ATTR_VENDOR_SUBCMD]);
157  
158         for (i = 0; i < (*rdev)->wiphy.n_vendor_commands; i++) {
159                 const struct wiphy_vendor_command *vcmd;
160 @@ -11531,9 +11547,9 @@ static int nl80211_prepare_vendor_dump(s
161                 goto out_unlock;
162         }
163  
164 -       if (attrbuf[NL80211_ATTR_VENDOR_DATA]) {
165 -               data = nla_data(attrbuf[NL80211_ATTR_VENDOR_DATA]);
166 -               data_len = nla_len(attrbuf[NL80211_ATTR_VENDOR_DATA]);
167 +       if (nl80211_fam.attrbuf[NL80211_ATTR_VENDOR_DATA]) {
168 +               data = nla_data(nl80211_fam.attrbuf[NL80211_ATTR_VENDOR_DATA]);
169 +               data_len = nla_len(nl80211_fam.attrbuf[NL80211_ATTR_VENDOR_DATA]);
170         }
171  
172         /* 0 is the first index - add 1 to parse only once */
173 @@ -12795,21 +12811,6 @@ static __genl_const struct genl_ops nl80
174         },
175  };
176  
177 -static struct genl_family nl80211_fam __ro_after_init = {
178 -       .name = NL80211_GENL_NAME,      /* have users key off the name instead */
179 -       .hdrsize = 0,                   /* no private header */
180 -       .version = 1,                   /* no particular meaning now */
181 -       .maxattr = NL80211_ATTR_MAX,
182 -       .netnsok = true,
183 -       .pre_doit = nl80211_pre_doit,
184 -       .post_doit = nl80211_post_doit,
185 -       .module = THIS_MODULE,
186 -       .ops = nl80211_ops,
187 -       .n_ops = ARRAY_SIZE(nl80211_ops),
188 -       .mcgrps = nl80211_mcgrps,
189 -       .n_mcgrps = ARRAY_SIZE(nl80211_mcgrps),
190 -};
191 -
192  /* notification functions */
193  
194  void nl80211_notify_wiphy(struct cfg80211_registered_device *rdev,
195 @@ -14759,11 +14760,12 @@ void nl80211_send_ap_stopped(struct wire
196  
197  /* initialisation/exit functions */
198  
199 -int __init nl80211_init(void)
200 +int nl80211_init(void)
201  {
202         int err;
203  
204 -       err = genl_register_family(&nl80211_fam);
205 +       err = genl_register_family_with_ops_groups(&nl80211_fam, nl80211_ops,
206 +                                                  nl80211_mcgrps);
207         if (err)
208                 return err;
209  
210 --- a/drivers/net/wireless/mac80211_hwsim.c
211 +++ b/drivers/net/wireless/mac80211_hwsim.c
212 @@ -587,8 +587,15 @@ struct hwsim_radiotap_ack_hdr {
213         __le16 rt_chbitmask;
214  } __packed;
215  
216 -/* MAC80211_HWSIM netlink family */
217 -static struct genl_family hwsim_genl_family;
218 +/* MAC80211_HWSIM netlinf family */
219 +static struct genl_family hwsim_genl_family = {
220 +       .id = GENL_ID_GENERATE,
221 +       .hdrsize = 0,
222 +       .name = "MAC80211_HWSIM",
223 +       .version = 1,
224 +       .maxattr = HWSIM_ATTR_MAX,
225 +       .netnsok = true,
226 +};
227  
228  enum hwsim_multicast_groups {
229         HWSIM_MCGRP_CONFIG,
230 @@ -3250,18 +3257,6 @@ static __genl_const struct genl_ops hwsi
231         },
232  };
233  
234 -static struct genl_family hwsim_genl_family __ro_after_init = {
235 -       .name = "MAC80211_HWSIM",
236 -       .version = 1,
237 -       .maxattr = HWSIM_ATTR_MAX,
238 -       .netnsok = true,
239 -       .module = THIS_MODULE,
240 -       .ops = hwsim_ops,
241 -       .n_ops = ARRAY_SIZE(hwsim_ops),
242 -       .mcgrps = hwsim_mcgrps,
243 -       .n_mcgrps = ARRAY_SIZE(hwsim_mcgrps),
244 -};
245 -
246  static void destroy_radio(struct work_struct *work)
247  {
248         struct mac80211_hwsim_data *data =
249 @@ -3309,13 +3304,15 @@ static struct notifier_block hwsim_netli
250         .notifier_call = mac80211_hwsim_netlink_notify,
251  };
252  
253 -static int __init hwsim_init_netlink(void)
254 +static int hwsim_init_netlink(void)
255  {
256         int rc;
257  
258         printk(KERN_INFO "mac80211_hwsim: initializing netlink\n");
259  
260 -       rc = genl_register_family(&hwsim_genl_family);
261 +       rc = genl_register_family_with_ops_groups(&hwsim_genl_family,
262 +                                                 hwsim_ops,
263 +                                                 hwsim_mcgrps);
264         if (rc)
265                 goto failure;
266