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,
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);
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,
21 + .pre_doit = nl80211_pre_doit,
22 + .post_doit = nl80211_post_doit,
25 /* multicast groups */
26 enum nl80211_multicast_groups {
27 @@ -549,14 +563,13 @@ static int nl80211_prepare_wdev_dump(str
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,
38 - *wdev = __cfg80211_wdev_from_attrs(
40 - genl_family_attrbuf(&nl80211_fam));
41 + *wdev = __cfg80211_wdev_from_attrs(sock_net(skb->sk),
42 + nl80211_fam.attrbuf);
46 @@ -1903,7 +1916,7 @@ static int nl80211_dump_wiphy_parse(stru
47 struct netlink_callback *cb,
48 struct nl80211_dump_wiphy_state *state)
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
57 static int nl80211_dump_survey(struct sk_buff *skb, struct netlink_callback *cb)
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
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];
72 @@ -8594,14 +8606,14 @@ static int nl80211_testmode_dump(struct
74 phy_idx = cb->args[0] - 1;
76 - struct nlattr **attrbuf = genl_family_attrbuf(&nl80211_fam);
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,
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);
91 @@ -8609,8 +8621,9 @@ static int nl80211_testmode_dump(struct
92 phy_idx = rdev->wiphy_idx;
95 - if (attrbuf[NL80211_ATTR_TESTDATA])
96 - cb->args[1] = (long)attrbuf[NL80211_ATTR_TESTDATA];
97 + if (nl80211_fam.attrbuf[NL80211_ATTR_TESTDATA])
99 + (long)nl80211_fam.attrbuf[NL80211_ATTR_TESTDATA];
103 @@ -10814,7 +10827,8 @@ static int handle_nan_filter(struct nlat
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),
110 filter[i].len = nla_len(attr);
113 @@ -11450,7 +11464,6 @@ static int nl80211_prepare_vendor_dump(s
114 struct cfg80211_registered_device **rdev,
115 struct wireless_dev **wdev)
117 - struct nlattr **attrbuf = genl_family_attrbuf(&nl80211_fam);
121 @@ -11486,28 +11499,31 @@ static int nl80211_prepare_vendor_dump(s
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,
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]) {
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);
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);
149 err = PTR_ERR(*rdev);
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]);
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
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]);
172 /* 0 is the first index - add 1 to parse only once */
173 @@ -12795,21 +12811,6 @@ static __genl_const struct genl_ops nl80
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,
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),
192 /* notification functions */
194 void nl80211_notify_wiphy(struct cfg80211_registered_device *rdev,
195 @@ -14759,11 +14760,12 @@ void nl80211_send_ap_stopped(struct wire
197 /* initialisation/exit functions */
199 -int __init nl80211_init(void)
200 +int nl80211_init(void)
204 - err = genl_register_family(&nl80211_fam);
205 + err = genl_register_family_with_ops_groups(&nl80211_fam, nl80211_ops,
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 {
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,
222 + .name = "MAC80211_HWSIM",
224 + .maxattr = HWSIM_ATTR_MAX,
228 enum hwsim_multicast_groups {
230 @@ -3250,18 +3257,6 @@ static __genl_const struct genl_ops hwsi
234 -static struct genl_family hwsim_genl_family __ro_after_init = {
235 - .name = "MAC80211_HWSIM",
237 - .maxattr = HWSIM_ATTR_MAX,
239 - .module = THIS_MODULE,
241 - .n_ops = ARRAY_SIZE(hwsim_ops),
242 - .mcgrps = hwsim_mcgrps,
243 - .n_mcgrps = ARRAY_SIZE(hwsim_mcgrps),
246 static void destroy_radio(struct work_struct *work)
248 struct mac80211_hwsim_data *data =
249 @@ -3309,13 +3304,15 @@ static struct notifier_block hwsim_netli
250 .notifier_call = mac80211_hwsim_netlink_notify,
253 -static int __init hwsim_init_netlink(void)
254 +static int hwsim_init_netlink(void)
258 printk(KERN_INFO "mac80211_hwsim: initializing netlink\n");
260 - rc = genl_register_family(&hwsim_genl_family);
261 + rc = genl_register_family_with_ops_groups(&hwsim_genl_family,