PageRenderTime 91ms CodeModel.GetById 24ms RepoModel.GetById 1ms app.codeStats 1ms

/net/wireless/nl80211.c

https://bitbucket.org/bigxie/android-omap-tuna
C | 6915 lines | 5604 code | 1177 blank | 134 comment | 1094 complexity | 5fc482e123d7ee48cbfb6e05badf9aa2 MD5 | raw file
Possible License(s): GPL-2.0, LGPL-2.0, AGPL-1.0
  1. /*
  2. * This is the new netlink-based wireless configuration interface.
  3. *
  4. * Copyright 2006-2010 Johannes Berg <johannes@sipsolutions.net>
  5. */
  6. #include <linux/if.h>
  7. #include <linux/module.h>
  8. #include <linux/err.h>
  9. #include <linux/slab.h>
  10. #include <linux/list.h>
  11. #include <linux/if_ether.h>
  12. #include <linux/ieee80211.h>
  13. #include <linux/nl80211.h>
  14. #include <linux/rtnetlink.h>
  15. #include <linux/netlink.h>
  16. #include <linux/etherdevice.h>
  17. #include <net/net_namespace.h>
  18. #include <net/genetlink.h>
  19. #include <net/cfg80211.h>
  20. #include <net/sock.h>
  21. #include "core.h"
  22. #include "nl80211.h"
  23. #include "reg.h"
  24. static int nl80211_pre_doit(struct genl_ops *ops, struct sk_buff *skb,
  25. struct genl_info *info);
  26. static void nl80211_post_doit(struct genl_ops *ops, struct sk_buff *skb,
  27. struct genl_info *info);
  28. /* the netlink family */
  29. static struct genl_family nl80211_fam = {
  30. .id = GENL_ID_GENERATE, /* don't bother with a hardcoded ID */
  31. .name = "nl80211", /* have users key off the name instead */
  32. .hdrsize = 0, /* no private header */
  33. .version = 1, /* no particular meaning now */
  34. .maxattr = NL80211_ATTR_MAX,
  35. .netnsok = true,
  36. .pre_doit = nl80211_pre_doit,
  37. .post_doit = nl80211_post_doit,
  38. };
  39. /* internal helper: get rdev and dev */
  40. static int get_rdev_dev_by_info_ifindex(struct genl_info *info,
  41. struct cfg80211_registered_device **rdev,
  42. struct net_device **dev)
  43. {
  44. struct nlattr **attrs = info->attrs;
  45. int ifindex;
  46. if (!attrs[NL80211_ATTR_IFINDEX])
  47. return -EINVAL;
  48. ifindex = nla_get_u32(attrs[NL80211_ATTR_IFINDEX]);
  49. *dev = dev_get_by_index(genl_info_net(info), ifindex);
  50. if (!*dev)
  51. return -ENODEV;
  52. *rdev = cfg80211_get_dev_from_ifindex(genl_info_net(info), ifindex);
  53. if (IS_ERR(*rdev)) {
  54. dev_put(*dev);
  55. return PTR_ERR(*rdev);
  56. }
  57. return 0;
  58. }
  59. /* policy for the attributes */
  60. static const struct nla_policy nl80211_policy[NL80211_ATTR_MAX+1] = {
  61. [NL80211_ATTR_WIPHY] = { .type = NLA_U32 },
  62. [NL80211_ATTR_WIPHY_NAME] = { .type = NLA_NUL_STRING,
  63. .len = 20-1 },
  64. [NL80211_ATTR_WIPHY_TXQ_PARAMS] = { .type = NLA_NESTED },
  65. [NL80211_ATTR_WIPHY_FREQ] = { .type = NLA_U32 },
  66. [NL80211_ATTR_WIPHY_CHANNEL_TYPE] = { .type = NLA_U32 },
  67. [NL80211_ATTR_WIPHY_RETRY_SHORT] = { .type = NLA_U8 },
  68. [NL80211_ATTR_WIPHY_RETRY_LONG] = { .type = NLA_U8 },
  69. [NL80211_ATTR_WIPHY_FRAG_THRESHOLD] = { .type = NLA_U32 },
  70. [NL80211_ATTR_WIPHY_RTS_THRESHOLD] = { .type = NLA_U32 },
  71. [NL80211_ATTR_WIPHY_COVERAGE_CLASS] = { .type = NLA_U8 },
  72. [NL80211_ATTR_IFTYPE] = { .type = NLA_U32 },
  73. [NL80211_ATTR_IFINDEX] = { .type = NLA_U32 },
  74. [NL80211_ATTR_IFNAME] = { .type = NLA_NUL_STRING, .len = IFNAMSIZ-1 },
  75. [NL80211_ATTR_MAC] = { .len = ETH_ALEN },
  76. [NL80211_ATTR_PREV_BSSID] = { .len = ETH_ALEN },
  77. [NL80211_ATTR_KEY] = { .type = NLA_NESTED, },
  78. [NL80211_ATTR_KEY_DATA] = { .type = NLA_BINARY,
  79. .len = WLAN_MAX_KEY_LEN },
  80. [NL80211_ATTR_KEY_IDX] = { .type = NLA_U8 },
  81. [NL80211_ATTR_KEY_CIPHER] = { .type = NLA_U32 },
  82. [NL80211_ATTR_KEY_DEFAULT] = { .type = NLA_FLAG },
  83. [NL80211_ATTR_KEY_SEQ] = { .type = NLA_BINARY, .len = 8 },
  84. [NL80211_ATTR_KEY_TYPE] = { .type = NLA_U32 },
  85. [NL80211_ATTR_BEACON_INTERVAL] = { .type = NLA_U32 },
  86. [NL80211_ATTR_DTIM_PERIOD] = { .type = NLA_U32 },
  87. [NL80211_ATTR_BEACON_HEAD] = { .type = NLA_BINARY,
  88. .len = IEEE80211_MAX_DATA_LEN },
  89. [NL80211_ATTR_BEACON_TAIL] = { .type = NLA_BINARY,
  90. .len = IEEE80211_MAX_DATA_LEN },
  91. [NL80211_ATTR_STA_AID] = { .type = NLA_U16 },
  92. [NL80211_ATTR_STA_FLAGS] = { .type = NLA_NESTED },
  93. [NL80211_ATTR_STA_LISTEN_INTERVAL] = { .type = NLA_U16 },
  94. [NL80211_ATTR_STA_SUPPORTED_RATES] = { .type = NLA_BINARY,
  95. .len = NL80211_MAX_SUPP_RATES },
  96. [NL80211_ATTR_STA_PLINK_ACTION] = { .type = NLA_U8 },
  97. [NL80211_ATTR_STA_VLAN] = { .type = NLA_U32 },
  98. [NL80211_ATTR_MNTR_FLAGS] = { /* NLA_NESTED can't be empty */ },
  99. [NL80211_ATTR_MESH_ID] = { .type = NLA_BINARY,
  100. .len = IEEE80211_MAX_MESH_ID_LEN },
  101. [NL80211_ATTR_MPATH_NEXT_HOP] = { .type = NLA_U32 },
  102. [NL80211_ATTR_REG_ALPHA2] = { .type = NLA_STRING, .len = 2 },
  103. [NL80211_ATTR_REG_RULES] = { .type = NLA_NESTED },
  104. [NL80211_ATTR_BSS_CTS_PROT] = { .type = NLA_U8 },
  105. [NL80211_ATTR_BSS_SHORT_PREAMBLE] = { .type = NLA_U8 },
  106. [NL80211_ATTR_BSS_SHORT_SLOT_TIME] = { .type = NLA_U8 },
  107. [NL80211_ATTR_BSS_BASIC_RATES] = { .type = NLA_BINARY,
  108. .len = NL80211_MAX_SUPP_RATES },
  109. [NL80211_ATTR_BSS_HT_OPMODE] = { .type = NLA_U16 },
  110. [NL80211_ATTR_MESH_CONFIG] = { .type = NLA_NESTED },
  111. [NL80211_ATTR_SUPPORT_MESH_AUTH] = { .type = NLA_FLAG },
  112. [NL80211_ATTR_HT_CAPABILITY] = { .len = NL80211_HT_CAPABILITY_LEN },
  113. [NL80211_ATTR_MGMT_SUBTYPE] = { .type = NLA_U8 },
  114. [NL80211_ATTR_IE] = { .type = NLA_BINARY,
  115. .len = IEEE80211_MAX_DATA_LEN },
  116. [NL80211_ATTR_SCAN_FREQUENCIES] = { .type = NLA_NESTED },
  117. [NL80211_ATTR_SCAN_SSIDS] = { .type = NLA_NESTED },
  118. [NL80211_ATTR_SSID] = { .type = NLA_BINARY,
  119. .len = IEEE80211_MAX_SSID_LEN },
  120. [NL80211_ATTR_AUTH_TYPE] = { .type = NLA_U32 },
  121. [NL80211_ATTR_REASON_CODE] = { .type = NLA_U16 },
  122. [NL80211_ATTR_FREQ_FIXED] = { .type = NLA_FLAG },
  123. [NL80211_ATTR_TIMED_OUT] = { .type = NLA_FLAG },
  124. [NL80211_ATTR_USE_MFP] = { .type = NLA_U32 },
  125. [NL80211_ATTR_STA_FLAGS2] = {
  126. .len = sizeof(struct nl80211_sta_flag_update),
  127. },
  128. [NL80211_ATTR_CONTROL_PORT] = { .type = NLA_FLAG },
  129. [NL80211_ATTR_CONTROL_PORT_ETHERTYPE] = { .type = NLA_U16 },
  130. [NL80211_ATTR_CONTROL_PORT_NO_ENCRYPT] = { .type = NLA_FLAG },
  131. [NL80211_ATTR_PRIVACY] = { .type = NLA_FLAG },
  132. [NL80211_ATTR_CIPHER_SUITE_GROUP] = { .type = NLA_U32 },
  133. [NL80211_ATTR_WPA_VERSIONS] = { .type = NLA_U32 },
  134. [NL80211_ATTR_PID] = { .type = NLA_U32 },
  135. [NL80211_ATTR_4ADDR] = { .type = NLA_U8 },
  136. [NL80211_ATTR_PMKID] = { .type = NLA_BINARY,
  137. .len = WLAN_PMKID_LEN },
  138. [NL80211_ATTR_DURATION] = { .type = NLA_U32 },
  139. [NL80211_ATTR_COOKIE] = { .type = NLA_U64 },
  140. [NL80211_ATTR_TX_RATES] = { .type = NLA_NESTED },
  141. [NL80211_ATTR_FRAME] = { .type = NLA_BINARY,
  142. .len = IEEE80211_MAX_DATA_LEN },
  143. [NL80211_ATTR_FRAME_MATCH] = { .type = NLA_BINARY, },
  144. [NL80211_ATTR_PS_STATE] = { .type = NLA_U32 },
  145. [NL80211_ATTR_CQM] = { .type = NLA_NESTED, },
  146. [NL80211_ATTR_LOCAL_STATE_CHANGE] = { .type = NLA_FLAG },
  147. [NL80211_ATTR_AP_ISOLATE] = { .type = NLA_U8 },
  148. [NL80211_ATTR_WIPHY_TX_POWER_SETTING] = { .type = NLA_U32 },
  149. [NL80211_ATTR_WIPHY_TX_POWER_LEVEL] = { .type = NLA_U32 },
  150. [NL80211_ATTR_FRAME_TYPE] = { .type = NLA_U16 },
  151. [NL80211_ATTR_WIPHY_ANTENNA_TX] = { .type = NLA_U32 },
  152. [NL80211_ATTR_WIPHY_ANTENNA_RX] = { .type = NLA_U32 },
  153. [NL80211_ATTR_MCAST_RATE] = { .type = NLA_U32 },
  154. [NL80211_ATTR_OFFCHANNEL_TX_OK] = { .type = NLA_FLAG },
  155. [NL80211_ATTR_KEY_DEFAULT_TYPES] = { .type = NLA_NESTED },
  156. [NL80211_ATTR_WOWLAN_TRIGGERS] = { .type = NLA_NESTED },
  157. [NL80211_ATTR_STA_PLINK_STATE] = { .type = NLA_U8 },
  158. [NL80211_ATTR_SCHED_SCAN_INTERVAL] = { .type = NLA_U32 },
  159. };
  160. /* policy for the key attributes */
  161. static const struct nla_policy nl80211_key_policy[NL80211_KEY_MAX + 1] = {
  162. [NL80211_KEY_DATA] = { .type = NLA_BINARY, .len = WLAN_MAX_KEY_LEN },
  163. [NL80211_KEY_IDX] = { .type = NLA_U8 },
  164. [NL80211_KEY_CIPHER] = { .type = NLA_U32 },
  165. [NL80211_KEY_SEQ] = { .type = NLA_BINARY, .len = 8 },
  166. [NL80211_KEY_DEFAULT] = { .type = NLA_FLAG },
  167. [NL80211_KEY_DEFAULT_MGMT] = { .type = NLA_FLAG },
  168. [NL80211_KEY_TYPE] = { .type = NLA_U32 },
  169. [NL80211_KEY_DEFAULT_TYPES] = { .type = NLA_NESTED },
  170. };
  171. /* policy for the key default flags */
  172. static const struct nla_policy
  173. nl80211_key_default_policy[NUM_NL80211_KEY_DEFAULT_TYPES] = {
  174. [NL80211_KEY_DEFAULT_TYPE_UNICAST] = { .type = NLA_FLAG },
  175. [NL80211_KEY_DEFAULT_TYPE_MULTICAST] = { .type = NLA_FLAG },
  176. };
  177. /* policy for WoWLAN attributes */
  178. static const struct nla_policy
  179. nl80211_wowlan_policy[NUM_NL80211_WOWLAN_TRIG] = {
  180. [NL80211_WOWLAN_TRIG_ANY] = { .type = NLA_FLAG },
  181. [NL80211_WOWLAN_TRIG_DISCONNECT] = { .type = NLA_FLAG },
  182. [NL80211_WOWLAN_TRIG_MAGIC_PKT] = { .type = NLA_FLAG },
  183. [NL80211_WOWLAN_TRIG_PKT_PATTERN] = { .type = NLA_NESTED },
  184. };
  185. /* ifidx get helper */
  186. static int nl80211_get_ifidx(struct netlink_callback *cb)
  187. {
  188. int res;
  189. res = nlmsg_parse(cb->nlh, GENL_HDRLEN + nl80211_fam.hdrsize,
  190. nl80211_fam.attrbuf, nl80211_fam.maxattr,
  191. nl80211_policy);
  192. if (res)
  193. return res;
  194. if (!nl80211_fam.attrbuf[NL80211_ATTR_IFINDEX])
  195. return -EINVAL;
  196. res = nla_get_u32(nl80211_fam.attrbuf[NL80211_ATTR_IFINDEX]);
  197. if (!res)
  198. return -EINVAL;
  199. return res;
  200. }
  201. static int nl80211_prepare_netdev_dump(struct sk_buff *skb,
  202. struct netlink_callback *cb,
  203. struct cfg80211_registered_device **rdev,
  204. struct net_device **dev)
  205. {
  206. int ifidx = cb->args[0];
  207. int err;
  208. if (!ifidx)
  209. ifidx = nl80211_get_ifidx(cb);
  210. if (ifidx < 0)
  211. return ifidx;
  212. cb->args[0] = ifidx;
  213. rtnl_lock();
  214. *dev = __dev_get_by_index(sock_net(skb->sk), ifidx);
  215. if (!*dev) {
  216. err = -ENODEV;
  217. goto out_rtnl;
  218. }
  219. *rdev = cfg80211_get_dev_from_ifindex(sock_net(skb->sk), ifidx);
  220. if (IS_ERR(*rdev)) {
  221. err = PTR_ERR(*rdev);
  222. goto out_rtnl;
  223. }
  224. return 0;
  225. out_rtnl:
  226. rtnl_unlock();
  227. return err;
  228. }
  229. static void nl80211_finish_netdev_dump(struct cfg80211_registered_device *rdev)
  230. {
  231. cfg80211_unlock_rdev(rdev);
  232. rtnl_unlock();
  233. }
  234. /* IE validation */
  235. static bool is_valid_ie_attr(const struct nlattr *attr)
  236. {
  237. const u8 *pos;
  238. int len;
  239. if (!attr)
  240. return true;
  241. pos = nla_data(attr);
  242. len = nla_len(attr);
  243. while (len) {
  244. u8 elemlen;
  245. if (len < 2)
  246. return false;
  247. len -= 2;
  248. elemlen = pos[1];
  249. if (elemlen > len)
  250. return false;
  251. len -= elemlen;
  252. pos += 2 + elemlen;
  253. }
  254. return true;
  255. }
  256. /* message building helper */
  257. static inline void *nl80211hdr_put(struct sk_buff *skb, u32 pid, u32 seq,
  258. int flags, u8 cmd)
  259. {
  260. /* since there is no private header just add the generic one */
  261. return genlmsg_put(skb, pid, seq, &nl80211_fam, flags, cmd);
  262. }
  263. static int nl80211_msg_put_channel(struct sk_buff *msg,
  264. struct ieee80211_channel *chan)
  265. {
  266. NLA_PUT_U32(msg, NL80211_FREQUENCY_ATTR_FREQ,
  267. chan->center_freq);
  268. if (chan->flags & IEEE80211_CHAN_DISABLED)
  269. NLA_PUT_FLAG(msg, NL80211_FREQUENCY_ATTR_DISABLED);
  270. if (chan->flags & IEEE80211_CHAN_PASSIVE_SCAN)
  271. NLA_PUT_FLAG(msg, NL80211_FREQUENCY_ATTR_PASSIVE_SCAN);
  272. if (chan->flags & IEEE80211_CHAN_NO_IBSS)
  273. NLA_PUT_FLAG(msg, NL80211_FREQUENCY_ATTR_NO_IBSS);
  274. if (chan->flags & IEEE80211_CHAN_RADAR)
  275. NLA_PUT_FLAG(msg, NL80211_FREQUENCY_ATTR_RADAR);
  276. NLA_PUT_U32(msg, NL80211_FREQUENCY_ATTR_MAX_TX_POWER,
  277. DBM_TO_MBM(chan->max_power));
  278. return 0;
  279. nla_put_failure:
  280. return -ENOBUFS;
  281. }
  282. /* netlink command implementations */
  283. struct key_parse {
  284. struct key_params p;
  285. int idx;
  286. int type;
  287. bool def, defmgmt;
  288. bool def_uni, def_multi;
  289. };
  290. static int nl80211_parse_key_new(struct nlattr *key, struct key_parse *k)
  291. {
  292. struct nlattr *tb[NL80211_KEY_MAX + 1];
  293. int err = nla_parse_nested(tb, NL80211_KEY_MAX, key,
  294. nl80211_key_policy);
  295. if (err)
  296. return err;
  297. k->def = !!tb[NL80211_KEY_DEFAULT];
  298. k->defmgmt = !!tb[NL80211_KEY_DEFAULT_MGMT];
  299. if (k->def) {
  300. k->def_uni = true;
  301. k->def_multi = true;
  302. }
  303. if (k->defmgmt)
  304. k->def_multi = true;
  305. if (tb[NL80211_KEY_IDX])
  306. k->idx = nla_get_u8(tb[NL80211_KEY_IDX]);
  307. if (tb[NL80211_KEY_DATA]) {
  308. k->p.key = nla_data(tb[NL80211_KEY_DATA]);
  309. k->p.key_len = nla_len(tb[NL80211_KEY_DATA]);
  310. }
  311. if (tb[NL80211_KEY_SEQ]) {
  312. k->p.seq = nla_data(tb[NL80211_KEY_SEQ]);
  313. k->p.seq_len = nla_len(tb[NL80211_KEY_SEQ]);
  314. }
  315. if (tb[NL80211_KEY_CIPHER])
  316. k->p.cipher = nla_get_u32(tb[NL80211_KEY_CIPHER]);
  317. if (tb[NL80211_KEY_TYPE]) {
  318. k->type = nla_get_u32(tb[NL80211_KEY_TYPE]);
  319. if (k->type < 0 || k->type >= NUM_NL80211_KEYTYPES)
  320. return -EINVAL;
  321. }
  322. if (tb[NL80211_KEY_DEFAULT_TYPES]) {
  323. struct nlattr *kdt[NUM_NL80211_KEY_DEFAULT_TYPES];
  324. int err = nla_parse_nested(kdt,
  325. NUM_NL80211_KEY_DEFAULT_TYPES - 1,
  326. tb[NL80211_KEY_DEFAULT_TYPES],
  327. nl80211_key_default_policy);
  328. if (err)
  329. return err;
  330. k->def_uni = kdt[NL80211_KEY_DEFAULT_TYPE_UNICAST];
  331. k->def_multi = kdt[NL80211_KEY_DEFAULT_TYPE_MULTICAST];
  332. }
  333. return 0;
  334. }
  335. static int nl80211_parse_key_old(struct genl_info *info, struct key_parse *k)
  336. {
  337. if (info->attrs[NL80211_ATTR_KEY_DATA]) {
  338. k->p.key = nla_data(info->attrs[NL80211_ATTR_KEY_DATA]);
  339. k->p.key_len = nla_len(info->attrs[NL80211_ATTR_KEY_DATA]);
  340. }
  341. if (info->attrs[NL80211_ATTR_KEY_SEQ]) {
  342. k->p.seq = nla_data(info->attrs[NL80211_ATTR_KEY_SEQ]);
  343. k->p.seq_len = nla_len(info->attrs[NL80211_ATTR_KEY_SEQ]);
  344. }
  345. if (info->attrs[NL80211_ATTR_KEY_IDX])
  346. k->idx = nla_get_u8(info->attrs[NL80211_ATTR_KEY_IDX]);
  347. if (info->attrs[NL80211_ATTR_KEY_CIPHER])
  348. k->p.cipher = nla_get_u32(info->attrs[NL80211_ATTR_KEY_CIPHER]);
  349. k->def = !!info->attrs[NL80211_ATTR_KEY_DEFAULT];
  350. k->defmgmt = !!info->attrs[NL80211_ATTR_KEY_DEFAULT_MGMT];
  351. if (k->def) {
  352. k->def_uni = true;
  353. k->def_multi = true;
  354. }
  355. if (k->defmgmt)
  356. k->def_multi = true;
  357. if (info->attrs[NL80211_ATTR_KEY_TYPE]) {
  358. k->type = nla_get_u32(info->attrs[NL80211_ATTR_KEY_TYPE]);
  359. if (k->type < 0 || k->type >= NUM_NL80211_KEYTYPES)
  360. return -EINVAL;
  361. }
  362. if (info->attrs[NL80211_ATTR_KEY_DEFAULT_TYPES]) {
  363. struct nlattr *kdt[NUM_NL80211_KEY_DEFAULT_TYPES];
  364. int err = nla_parse_nested(
  365. kdt, NUM_NL80211_KEY_DEFAULT_TYPES - 1,
  366. info->attrs[NL80211_ATTR_KEY_DEFAULT_TYPES],
  367. nl80211_key_default_policy);
  368. if (err)
  369. return err;
  370. k->def_uni = kdt[NL80211_KEY_DEFAULT_TYPE_UNICAST];
  371. k->def_multi = kdt[NL80211_KEY_DEFAULT_TYPE_MULTICAST];
  372. }
  373. return 0;
  374. }
  375. static int nl80211_parse_key(struct genl_info *info, struct key_parse *k)
  376. {
  377. int err;
  378. memset(k, 0, sizeof(*k));
  379. k->idx = -1;
  380. k->type = -1;
  381. if (info->attrs[NL80211_ATTR_KEY])
  382. err = nl80211_parse_key_new(info->attrs[NL80211_ATTR_KEY], k);
  383. else
  384. err = nl80211_parse_key_old(info, k);
  385. if (err)
  386. return err;
  387. if (k->def && k->defmgmt)
  388. return -EINVAL;
  389. if (k->defmgmt) {
  390. if (k->def_uni || !k->def_multi)
  391. return -EINVAL;
  392. }
  393. if (k->idx != -1) {
  394. if (k->defmgmt) {
  395. if (k->idx < 4 || k->idx > 5)
  396. return -EINVAL;
  397. } else if (k->def) {
  398. if (k->idx < 0 || k->idx > 3)
  399. return -EINVAL;
  400. } else {
  401. if (k->idx < 0 || k->idx > 5)
  402. return -EINVAL;
  403. }
  404. }
  405. return 0;
  406. }
  407. static struct cfg80211_cached_keys *
  408. nl80211_parse_connkeys(struct cfg80211_registered_device *rdev,
  409. struct nlattr *keys)
  410. {
  411. struct key_parse parse;
  412. struct nlattr *key;
  413. struct cfg80211_cached_keys *result;
  414. int rem, err, def = 0;
  415. result = kzalloc(sizeof(*result), GFP_KERNEL);
  416. if (!result)
  417. return ERR_PTR(-ENOMEM);
  418. result->def = -1;
  419. result->defmgmt = -1;
  420. nla_for_each_nested(key, keys, rem) {
  421. memset(&parse, 0, sizeof(parse));
  422. parse.idx = -1;
  423. err = nl80211_parse_key_new(key, &parse);
  424. if (err)
  425. goto error;
  426. err = -EINVAL;
  427. if (!parse.p.key)
  428. goto error;
  429. if (parse.idx < 0 || parse.idx > 4)
  430. goto error;
  431. if (parse.def) {
  432. if (def)
  433. goto error;
  434. def = 1;
  435. result->def = parse.idx;
  436. if (!parse.def_uni || !parse.def_multi)
  437. goto error;
  438. } else if (parse.defmgmt)
  439. goto error;
  440. err = cfg80211_validate_key_settings(rdev, &parse.p,
  441. parse.idx, false, NULL);
  442. if (err)
  443. goto error;
  444. result->params[parse.idx].cipher = parse.p.cipher;
  445. result->params[parse.idx].key_len = parse.p.key_len;
  446. result->params[parse.idx].key = result->data[parse.idx];
  447. memcpy(result->data[parse.idx], parse.p.key, parse.p.key_len);
  448. }
  449. return result;
  450. error:
  451. kfree(result);
  452. return ERR_PTR(err);
  453. }
  454. static int nl80211_key_allowed(struct wireless_dev *wdev)
  455. {
  456. ASSERT_WDEV_LOCK(wdev);
  457. switch (wdev->iftype) {
  458. case NL80211_IFTYPE_AP:
  459. case NL80211_IFTYPE_AP_VLAN:
  460. case NL80211_IFTYPE_P2P_GO:
  461. case NL80211_IFTYPE_MESH_POINT:
  462. break;
  463. case NL80211_IFTYPE_ADHOC:
  464. if (!wdev->current_bss)
  465. return -ENOLINK;
  466. break;
  467. case NL80211_IFTYPE_STATION:
  468. case NL80211_IFTYPE_P2P_CLIENT:
  469. if (wdev->sme_state != CFG80211_SME_CONNECTED)
  470. return -ENOLINK;
  471. break;
  472. default:
  473. return -EINVAL;
  474. }
  475. return 0;
  476. }
  477. static int nl80211_put_iftypes(struct sk_buff *msg, u32 attr, u16 ifmodes)
  478. {
  479. struct nlattr *nl_modes = nla_nest_start(msg, attr);
  480. int i;
  481. if (!nl_modes)
  482. goto nla_put_failure;
  483. i = 0;
  484. while (ifmodes) {
  485. if (ifmodes & 1)
  486. NLA_PUT_FLAG(msg, i);
  487. ifmodes >>= 1;
  488. i++;
  489. }
  490. nla_nest_end(msg, nl_modes);
  491. return 0;
  492. nla_put_failure:
  493. return -ENOBUFS;
  494. }
  495. static int nl80211_put_iface_combinations(struct wiphy *wiphy,
  496. struct sk_buff *msg)
  497. {
  498. struct nlattr *nl_combis;
  499. int i, j;
  500. nl_combis = nla_nest_start(msg,
  501. NL80211_ATTR_INTERFACE_COMBINATIONS);
  502. if (!nl_combis)
  503. goto nla_put_failure;
  504. for (i = 0; i < wiphy->n_iface_combinations; i++) {
  505. const struct ieee80211_iface_combination *c;
  506. struct nlattr *nl_combi, *nl_limits;
  507. c = &wiphy->iface_combinations[i];
  508. nl_combi = nla_nest_start(msg, i + 1);
  509. if (!nl_combi)
  510. goto nla_put_failure;
  511. nl_limits = nla_nest_start(msg, NL80211_IFACE_COMB_LIMITS);
  512. if (!nl_limits)
  513. goto nla_put_failure;
  514. for (j = 0; j < c->n_limits; j++) {
  515. struct nlattr *nl_limit;
  516. nl_limit = nla_nest_start(msg, j + 1);
  517. if (!nl_limit)
  518. goto nla_put_failure;
  519. NLA_PUT_U32(msg, NL80211_IFACE_LIMIT_MAX,
  520. c->limits[j].max);
  521. if (nl80211_put_iftypes(msg, NL80211_IFACE_LIMIT_TYPES,
  522. c->limits[j].types))
  523. goto nla_put_failure;
  524. nla_nest_end(msg, nl_limit);
  525. }
  526. nla_nest_end(msg, nl_limits);
  527. if (c->beacon_int_infra_match)
  528. NLA_PUT_FLAG(msg,
  529. NL80211_IFACE_COMB_STA_AP_BI_MATCH);
  530. NLA_PUT_U32(msg, NL80211_IFACE_COMB_NUM_CHANNELS,
  531. c->num_different_channels);
  532. NLA_PUT_U32(msg, NL80211_IFACE_COMB_MAXNUM,
  533. c->max_interfaces);
  534. nla_nest_end(msg, nl_combi);
  535. }
  536. nla_nest_end(msg, nl_combis);
  537. return 0;
  538. nla_put_failure:
  539. return -ENOBUFS;
  540. }
  541. static int nl80211_send_wiphy(struct sk_buff *msg, u32 pid, u32 seq, int flags,
  542. struct cfg80211_registered_device *dev)
  543. {
  544. void *hdr;
  545. struct nlattr *nl_bands, *nl_band;
  546. struct nlattr *nl_freqs, *nl_freq;
  547. struct nlattr *nl_rates, *nl_rate;
  548. struct nlattr *nl_cmds;
  549. enum ieee80211_band band;
  550. struct ieee80211_channel *chan;
  551. struct ieee80211_rate *rate;
  552. int i;
  553. const struct ieee80211_txrx_stypes *mgmt_stypes =
  554. dev->wiphy.mgmt_stypes;
  555. hdr = nl80211hdr_put(msg, pid, seq, flags, NL80211_CMD_NEW_WIPHY);
  556. if (!hdr)
  557. return -1;
  558. NLA_PUT_U32(msg, NL80211_ATTR_WIPHY, dev->wiphy_idx);
  559. NLA_PUT_STRING(msg, NL80211_ATTR_WIPHY_NAME, wiphy_name(&dev->wiphy));
  560. NLA_PUT_U32(msg, NL80211_ATTR_GENERATION,
  561. cfg80211_rdev_list_generation);
  562. NLA_PUT_U8(msg, NL80211_ATTR_WIPHY_RETRY_SHORT,
  563. dev->wiphy.retry_short);
  564. NLA_PUT_U8(msg, NL80211_ATTR_WIPHY_RETRY_LONG,
  565. dev->wiphy.retry_long);
  566. NLA_PUT_U32(msg, NL80211_ATTR_WIPHY_FRAG_THRESHOLD,
  567. dev->wiphy.frag_threshold);
  568. NLA_PUT_U32(msg, NL80211_ATTR_WIPHY_RTS_THRESHOLD,
  569. dev->wiphy.rts_threshold);
  570. NLA_PUT_U8(msg, NL80211_ATTR_WIPHY_COVERAGE_CLASS,
  571. dev->wiphy.coverage_class);
  572. NLA_PUT_U8(msg, NL80211_ATTR_MAX_NUM_SCAN_SSIDS,
  573. dev->wiphy.max_scan_ssids);
  574. NLA_PUT_U16(msg, NL80211_ATTR_MAX_SCAN_IE_LEN,
  575. dev->wiphy.max_scan_ie_len);
  576. if (dev->wiphy.flags & WIPHY_FLAG_IBSS_RSN)
  577. NLA_PUT_FLAG(msg, NL80211_ATTR_SUPPORT_IBSS_RSN);
  578. if (dev->wiphy.flags & WIPHY_FLAG_MESH_AUTH)
  579. NLA_PUT_FLAG(msg, NL80211_ATTR_SUPPORT_MESH_AUTH);
  580. NLA_PUT(msg, NL80211_ATTR_CIPHER_SUITES,
  581. sizeof(u32) * dev->wiphy.n_cipher_suites,
  582. dev->wiphy.cipher_suites);
  583. NLA_PUT_U8(msg, NL80211_ATTR_MAX_NUM_PMKIDS,
  584. dev->wiphy.max_num_pmkids);
  585. if (dev->wiphy.flags & WIPHY_FLAG_CONTROL_PORT_PROTOCOL)
  586. NLA_PUT_FLAG(msg, NL80211_ATTR_CONTROL_PORT_ETHERTYPE);
  587. NLA_PUT_U32(msg, NL80211_ATTR_WIPHY_ANTENNA_AVAIL_TX,
  588. dev->wiphy.available_antennas_tx);
  589. NLA_PUT_U32(msg, NL80211_ATTR_WIPHY_ANTENNA_AVAIL_RX,
  590. dev->wiphy.available_antennas_rx);
  591. if ((dev->wiphy.available_antennas_tx ||
  592. dev->wiphy.available_antennas_rx) && dev->ops->get_antenna) {
  593. u32 tx_ant = 0, rx_ant = 0;
  594. int res;
  595. res = dev->ops->get_antenna(&dev->wiphy, &tx_ant, &rx_ant);
  596. if (!res) {
  597. NLA_PUT_U32(msg, NL80211_ATTR_WIPHY_ANTENNA_TX, tx_ant);
  598. NLA_PUT_U32(msg, NL80211_ATTR_WIPHY_ANTENNA_RX, rx_ant);
  599. }
  600. }
  601. if (nl80211_put_iftypes(msg, NL80211_ATTR_SUPPORTED_IFTYPES,
  602. dev->wiphy.interface_modes))
  603. goto nla_put_failure;
  604. nl_bands = nla_nest_start(msg, NL80211_ATTR_WIPHY_BANDS);
  605. if (!nl_bands)
  606. goto nla_put_failure;
  607. for (band = 0; band < IEEE80211_NUM_BANDS; band++) {
  608. if (!dev->wiphy.bands[band])
  609. continue;
  610. nl_band = nla_nest_start(msg, band);
  611. if (!nl_band)
  612. goto nla_put_failure;
  613. /* add HT info */
  614. if (dev->wiphy.bands[band]->ht_cap.ht_supported) {
  615. NLA_PUT(msg, NL80211_BAND_ATTR_HT_MCS_SET,
  616. sizeof(dev->wiphy.bands[band]->ht_cap.mcs),
  617. &dev->wiphy.bands[band]->ht_cap.mcs);
  618. NLA_PUT_U16(msg, NL80211_BAND_ATTR_HT_CAPA,
  619. dev->wiphy.bands[band]->ht_cap.cap);
  620. NLA_PUT_U8(msg, NL80211_BAND_ATTR_HT_AMPDU_FACTOR,
  621. dev->wiphy.bands[band]->ht_cap.ampdu_factor);
  622. NLA_PUT_U8(msg, NL80211_BAND_ATTR_HT_AMPDU_DENSITY,
  623. dev->wiphy.bands[band]->ht_cap.ampdu_density);
  624. }
  625. /* add frequencies */
  626. nl_freqs = nla_nest_start(msg, NL80211_BAND_ATTR_FREQS);
  627. if (!nl_freqs)
  628. goto nla_put_failure;
  629. for (i = 0; i < dev->wiphy.bands[band]->n_channels; i++) {
  630. nl_freq = nla_nest_start(msg, i);
  631. if (!nl_freq)
  632. goto nla_put_failure;
  633. chan = &dev->wiphy.bands[band]->channels[i];
  634. if (nl80211_msg_put_channel(msg, chan))
  635. goto nla_put_failure;
  636. nla_nest_end(msg, nl_freq);
  637. }
  638. nla_nest_end(msg, nl_freqs);
  639. /* add bitrates */
  640. nl_rates = nla_nest_start(msg, NL80211_BAND_ATTR_RATES);
  641. if (!nl_rates)
  642. goto nla_put_failure;
  643. for (i = 0; i < dev->wiphy.bands[band]->n_bitrates; i++) {
  644. nl_rate = nla_nest_start(msg, i);
  645. if (!nl_rate)
  646. goto nla_put_failure;
  647. rate = &dev->wiphy.bands[band]->bitrates[i];
  648. NLA_PUT_U32(msg, NL80211_BITRATE_ATTR_RATE,
  649. rate->bitrate);
  650. if (rate->flags & IEEE80211_RATE_SHORT_PREAMBLE)
  651. NLA_PUT_FLAG(msg,
  652. NL80211_BITRATE_ATTR_2GHZ_SHORTPREAMBLE);
  653. nla_nest_end(msg, nl_rate);
  654. }
  655. nla_nest_end(msg, nl_rates);
  656. nla_nest_end(msg, nl_band);
  657. }
  658. nla_nest_end(msg, nl_bands);
  659. nl_cmds = nla_nest_start(msg, NL80211_ATTR_SUPPORTED_COMMANDS);
  660. if (!nl_cmds)
  661. goto nla_put_failure;
  662. i = 0;
  663. #define CMD(op, n) \
  664. do { \
  665. if (dev->ops->op) { \
  666. i++; \
  667. NLA_PUT_U32(msg, i, NL80211_CMD_ ## n); \
  668. } \
  669. } while (0)
  670. CMD(add_virtual_intf, NEW_INTERFACE);
  671. CMD(change_virtual_intf, SET_INTERFACE);
  672. CMD(add_key, NEW_KEY);
  673. CMD(add_beacon, NEW_BEACON);
  674. CMD(add_station, NEW_STATION);
  675. CMD(add_mpath, NEW_MPATH);
  676. CMD(update_mesh_config, SET_MESH_CONFIG);
  677. CMD(change_bss, SET_BSS);
  678. CMD(auth, AUTHENTICATE);
  679. CMD(assoc, ASSOCIATE);
  680. CMD(deauth, DEAUTHENTICATE);
  681. CMD(disassoc, DISASSOCIATE);
  682. CMD(join_ibss, JOIN_IBSS);
  683. CMD(join_mesh, JOIN_MESH);
  684. CMD(set_pmksa, SET_PMKSA);
  685. CMD(del_pmksa, DEL_PMKSA);
  686. CMD(flush_pmksa, FLUSH_PMKSA);
  687. CMD(remain_on_channel, REMAIN_ON_CHANNEL);
  688. CMD(set_bitrate_mask, SET_TX_BITRATE_MASK);
  689. CMD(mgmt_tx, FRAME);
  690. CMD(mgmt_tx_cancel_wait, FRAME_WAIT_CANCEL);
  691. if (dev->wiphy.flags & WIPHY_FLAG_NETNS_OK) {
  692. i++;
  693. NLA_PUT_U32(msg, i, NL80211_CMD_SET_WIPHY_NETNS);
  694. }
  695. CMD(set_channel, SET_CHANNEL);
  696. CMD(set_wds_peer, SET_WDS_PEER);
  697. if (dev->wiphy.flags & WIPHY_FLAG_SUPPORTS_SCHED_SCAN)
  698. CMD(sched_scan_start, START_SCHED_SCAN);
  699. #undef CMD
  700. if (dev->ops->connect || dev->ops->auth) {
  701. i++;
  702. NLA_PUT_U32(msg, i, NL80211_CMD_CONNECT);
  703. }
  704. if (dev->ops->disconnect || dev->ops->deauth) {
  705. i++;
  706. NLA_PUT_U32(msg, i, NL80211_CMD_DISCONNECT);
  707. }
  708. nla_nest_end(msg, nl_cmds);
  709. if (dev->ops->remain_on_channel)
  710. NLA_PUT_U32(msg, NL80211_ATTR_MAX_REMAIN_ON_CHANNEL_DURATION,
  711. dev->wiphy.max_remain_on_channel_duration);
  712. /* for now at least assume all drivers have it */
  713. if (dev->ops->mgmt_tx)
  714. NLA_PUT_FLAG(msg, NL80211_ATTR_OFFCHANNEL_TX_OK);
  715. if (mgmt_stypes) {
  716. u16 stypes;
  717. struct nlattr *nl_ftypes, *nl_ifs;
  718. enum nl80211_iftype ift;
  719. nl_ifs = nla_nest_start(msg, NL80211_ATTR_TX_FRAME_TYPES);
  720. if (!nl_ifs)
  721. goto nla_put_failure;
  722. for (ift = 0; ift < NUM_NL80211_IFTYPES; ift++) {
  723. nl_ftypes = nla_nest_start(msg, ift);
  724. if (!nl_ftypes)
  725. goto nla_put_failure;
  726. i = 0;
  727. stypes = mgmt_stypes[ift].tx;
  728. while (stypes) {
  729. if (stypes & 1)
  730. NLA_PUT_U16(msg, NL80211_ATTR_FRAME_TYPE,
  731. (i << 4) | IEEE80211_FTYPE_MGMT);
  732. stypes >>= 1;
  733. i++;
  734. }
  735. nla_nest_end(msg, nl_ftypes);
  736. }
  737. nla_nest_end(msg, nl_ifs);
  738. nl_ifs = nla_nest_start(msg, NL80211_ATTR_RX_FRAME_TYPES);
  739. if (!nl_ifs)
  740. goto nla_put_failure;
  741. for (ift = 0; ift < NUM_NL80211_IFTYPES; ift++) {
  742. nl_ftypes = nla_nest_start(msg, ift);
  743. if (!nl_ftypes)
  744. goto nla_put_failure;
  745. i = 0;
  746. stypes = mgmt_stypes[ift].rx;
  747. while (stypes) {
  748. if (stypes & 1)
  749. NLA_PUT_U16(msg, NL80211_ATTR_FRAME_TYPE,
  750. (i << 4) | IEEE80211_FTYPE_MGMT);
  751. stypes >>= 1;
  752. i++;
  753. }
  754. nla_nest_end(msg, nl_ftypes);
  755. }
  756. nla_nest_end(msg, nl_ifs);
  757. }
  758. if (dev->wiphy.wowlan.flags || dev->wiphy.wowlan.n_patterns) {
  759. struct nlattr *nl_wowlan;
  760. nl_wowlan = nla_nest_start(msg,
  761. NL80211_ATTR_WOWLAN_TRIGGERS_SUPPORTED);
  762. if (!nl_wowlan)
  763. goto nla_put_failure;
  764. if (dev->wiphy.wowlan.flags & WIPHY_WOWLAN_ANY)
  765. NLA_PUT_FLAG(msg, NL80211_WOWLAN_TRIG_ANY);
  766. if (dev->wiphy.wowlan.flags & WIPHY_WOWLAN_DISCONNECT)
  767. NLA_PUT_FLAG(msg, NL80211_WOWLAN_TRIG_DISCONNECT);
  768. if (dev->wiphy.wowlan.flags & WIPHY_WOWLAN_MAGIC_PKT)
  769. NLA_PUT_FLAG(msg, NL80211_WOWLAN_TRIG_MAGIC_PKT);
  770. if (dev->wiphy.wowlan.n_patterns) {
  771. struct nl80211_wowlan_pattern_support pat = {
  772. .max_patterns = dev->wiphy.wowlan.n_patterns,
  773. .min_pattern_len =
  774. dev->wiphy.wowlan.pattern_min_len,
  775. .max_pattern_len =
  776. dev->wiphy.wowlan.pattern_max_len,
  777. };
  778. NLA_PUT(msg, NL80211_WOWLAN_TRIG_PKT_PATTERN,
  779. sizeof(pat), &pat);
  780. }
  781. nla_nest_end(msg, nl_wowlan);
  782. }
  783. if (nl80211_put_iftypes(msg, NL80211_ATTR_SOFTWARE_IFTYPES,
  784. dev->wiphy.software_iftypes))
  785. goto nla_put_failure;
  786. if (nl80211_put_iface_combinations(&dev->wiphy, msg))
  787. goto nla_put_failure;
  788. return genlmsg_end(msg, hdr);
  789. nla_put_failure:
  790. genlmsg_cancel(msg, hdr);
  791. return -EMSGSIZE;
  792. }
  793. static int nl80211_dump_wiphy(struct sk_buff *skb, struct netlink_callback *cb)
  794. {
  795. int idx = 0;
  796. int start = cb->args[0];
  797. struct cfg80211_registered_device *dev;
  798. mutex_lock(&cfg80211_mutex);
  799. list_for_each_entry(dev, &cfg80211_rdev_list, list) {
  800. if (!net_eq(wiphy_net(&dev->wiphy), sock_net(skb->sk)))
  801. continue;
  802. if (++idx <= start)
  803. continue;
  804. if (nl80211_send_wiphy(skb, NETLINK_CB(cb->skb).pid,
  805. cb->nlh->nlmsg_seq, NLM_F_MULTI,
  806. dev) < 0) {
  807. idx--;
  808. break;
  809. }
  810. }
  811. mutex_unlock(&cfg80211_mutex);
  812. cb->args[0] = idx;
  813. return skb->len;
  814. }
  815. static int nl80211_get_wiphy(struct sk_buff *skb, struct genl_info *info)
  816. {
  817. struct sk_buff *msg;
  818. struct cfg80211_registered_device *dev = info->user_ptr[0];
  819. msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
  820. if (!msg)
  821. return -ENOMEM;
  822. if (nl80211_send_wiphy(msg, info->snd_pid, info->snd_seq, 0, dev) < 0) {
  823. nlmsg_free(msg);
  824. return -ENOBUFS;
  825. }
  826. return genlmsg_reply(msg, info);
  827. }
  828. static const struct nla_policy txq_params_policy[NL80211_TXQ_ATTR_MAX + 1] = {
  829. [NL80211_TXQ_ATTR_QUEUE] = { .type = NLA_U8 },
  830. [NL80211_TXQ_ATTR_TXOP] = { .type = NLA_U16 },
  831. [NL80211_TXQ_ATTR_CWMIN] = { .type = NLA_U16 },
  832. [NL80211_TXQ_ATTR_CWMAX] = { .type = NLA_U16 },
  833. [NL80211_TXQ_ATTR_AIFS] = { .type = NLA_U8 },
  834. };
  835. static int parse_txq_params(struct nlattr *tb[],
  836. struct ieee80211_txq_params *txq_params)
  837. {
  838. if (!tb[NL80211_TXQ_ATTR_QUEUE] || !tb[NL80211_TXQ_ATTR_TXOP] ||
  839. !tb[NL80211_TXQ_ATTR_CWMIN] || !tb[NL80211_TXQ_ATTR_CWMAX] ||
  840. !tb[NL80211_TXQ_ATTR_AIFS])
  841. return -EINVAL;
  842. txq_params->queue = nla_get_u8(tb[NL80211_TXQ_ATTR_QUEUE]);
  843. txq_params->txop = nla_get_u16(tb[NL80211_TXQ_ATTR_TXOP]);
  844. txq_params->cwmin = nla_get_u16(tb[NL80211_TXQ_ATTR_CWMIN]);
  845. txq_params->cwmax = nla_get_u16(tb[NL80211_TXQ_ATTR_CWMAX]);
  846. txq_params->aifs = nla_get_u8(tb[NL80211_TXQ_ATTR_AIFS]);
  847. return 0;
  848. }
  849. static bool nl80211_can_set_dev_channel(struct wireless_dev *wdev)
  850. {
  851. /*
  852. * You can only set the channel explicitly for AP, mesh
  853. * and WDS type interfaces; all others have their channel
  854. * managed via their respective "establish a connection"
  855. * command (connect, join, ...)
  856. *
  857. * Monitors are special as they are normally slaved to
  858. * whatever else is going on, so they behave as though
  859. * you tried setting the wiphy channel itself.
  860. */
  861. return !wdev ||
  862. wdev->iftype == NL80211_IFTYPE_AP ||
  863. wdev->iftype == NL80211_IFTYPE_WDS ||
  864. wdev->iftype == NL80211_IFTYPE_MESH_POINT ||
  865. wdev->iftype == NL80211_IFTYPE_MONITOR ||
  866. wdev->iftype == NL80211_IFTYPE_P2P_GO;
  867. }
  868. static int __nl80211_set_channel(struct cfg80211_registered_device *rdev,
  869. struct wireless_dev *wdev,
  870. struct genl_info *info)
  871. {
  872. enum nl80211_channel_type channel_type = NL80211_CHAN_NO_HT;
  873. u32 freq;
  874. int result;
  875. if (!info->attrs[NL80211_ATTR_WIPHY_FREQ])
  876. return -EINVAL;
  877. if (!nl80211_can_set_dev_channel(wdev))
  878. return -EOPNOTSUPP;
  879. if (info->attrs[NL80211_ATTR_WIPHY_CHANNEL_TYPE]) {
  880. channel_type = nla_get_u32(info->attrs[
  881. NL80211_ATTR_WIPHY_CHANNEL_TYPE]);
  882. if (channel_type != NL80211_CHAN_NO_HT &&
  883. channel_type != NL80211_CHAN_HT20 &&
  884. channel_type != NL80211_CHAN_HT40PLUS &&
  885. channel_type != NL80211_CHAN_HT40MINUS)
  886. return -EINVAL;
  887. }
  888. freq = nla_get_u32(info->attrs[NL80211_ATTR_WIPHY_FREQ]);
  889. mutex_lock(&rdev->devlist_mtx);
  890. if (wdev) {
  891. wdev_lock(wdev);
  892. result = cfg80211_set_freq(rdev, wdev, freq, channel_type);
  893. wdev_unlock(wdev);
  894. } else {
  895. result = cfg80211_set_freq(rdev, NULL, freq, channel_type);
  896. }
  897. mutex_unlock(&rdev->devlist_mtx);
  898. return result;
  899. }
  900. static int nl80211_set_channel(struct sk_buff *skb, struct genl_info *info)
  901. {
  902. struct cfg80211_registered_device *rdev = info->user_ptr[0];
  903. struct net_device *netdev = info->user_ptr[1];
  904. return __nl80211_set_channel(rdev, netdev->ieee80211_ptr, info);
  905. }
  906. static int nl80211_set_wds_peer(struct sk_buff *skb, struct genl_info *info)
  907. {
  908. struct cfg80211_registered_device *rdev = info->user_ptr[0];
  909. struct net_device *dev = info->user_ptr[1];
  910. struct wireless_dev *wdev = dev->ieee80211_ptr;
  911. const u8 *bssid;
  912. if (!info->attrs[NL80211_ATTR_MAC])
  913. return -EINVAL;
  914. if (netif_running(dev))
  915. return -EBUSY;
  916. if (!rdev->ops->set_wds_peer)
  917. return -EOPNOTSUPP;
  918. if (wdev->iftype != NL80211_IFTYPE_WDS)
  919. return -EOPNOTSUPP;
  920. bssid = nla_data(info->attrs[NL80211_ATTR_MAC]);
  921. return rdev->ops->set_wds_peer(wdev->wiphy, dev, bssid);
  922. }
  923. static int nl80211_set_wiphy(struct sk_buff *skb, struct genl_info *info)
  924. {
  925. struct cfg80211_registered_device *rdev;
  926. struct net_device *netdev = NULL;
  927. struct wireless_dev *wdev;
  928. int result = 0, rem_txq_params = 0;
  929. struct nlattr *nl_txq_params;
  930. u32 changed;
  931. u8 retry_short = 0, retry_long = 0;
  932. u32 frag_threshold = 0, rts_threshold = 0;
  933. u8 coverage_class = 0;
  934. /*
  935. * Try to find the wiphy and netdev. Normally this
  936. * function shouldn't need the netdev, but this is
  937. * done for backward compatibility -- previously
  938. * setting the channel was done per wiphy, but now
  939. * it is per netdev. Previous userland like hostapd
  940. * also passed a netdev to set_wiphy, so that it is
  941. * possible to let that go to the right netdev!
  942. */
  943. mutex_lock(&cfg80211_mutex);
  944. if (info->attrs[NL80211_ATTR_IFINDEX]) {
  945. int ifindex = nla_get_u32(info->attrs[NL80211_ATTR_IFINDEX]);
  946. netdev = dev_get_by_index(genl_info_net(info), ifindex);
  947. if (netdev && netdev->ieee80211_ptr) {
  948. rdev = wiphy_to_dev(netdev->ieee80211_ptr->wiphy);
  949. mutex_lock(&rdev->mtx);
  950. } else
  951. netdev = NULL;
  952. }
  953. if (!netdev) {
  954. rdev = __cfg80211_rdev_from_info(info);
  955. if (IS_ERR(rdev)) {
  956. mutex_unlock(&cfg80211_mutex);
  957. return PTR_ERR(rdev);
  958. }
  959. wdev = NULL;
  960. netdev = NULL;
  961. result = 0;
  962. mutex_lock(&rdev->mtx);
  963. } else if (netif_running(netdev) &&
  964. nl80211_can_set_dev_channel(netdev->ieee80211_ptr))
  965. wdev = netdev->ieee80211_ptr;
  966. else
  967. wdev = NULL;
  968. /*
  969. * end workaround code, by now the rdev is available
  970. * and locked, and wdev may or may not be NULL.
  971. */
  972. if (info->attrs[NL80211_ATTR_WIPHY_NAME])
  973. result = cfg80211_dev_rename(
  974. rdev, nla_data(info->attrs[NL80211_ATTR_WIPHY_NAME]));
  975. mutex_unlock(&cfg80211_mutex);
  976. if (result)
  977. goto bad_res;
  978. if (info->attrs[NL80211_ATTR_WIPHY_TXQ_PARAMS]) {
  979. struct ieee80211_txq_params txq_params;
  980. struct nlattr *tb[NL80211_TXQ_ATTR_MAX + 1];
  981. if (!rdev->ops->set_txq_params) {
  982. result = -EOPNOTSUPP;
  983. goto bad_res;
  984. }
  985. nla_for_each_nested(nl_txq_params,
  986. info->attrs[NL80211_ATTR_WIPHY_TXQ_PARAMS],
  987. rem_txq_params) {
  988. nla_parse(tb, NL80211_TXQ_ATTR_MAX,
  989. nla_data(nl_txq_params),
  990. nla_len(nl_txq_params),
  991. txq_params_policy);
  992. result = parse_txq_params(tb, &txq_params);
  993. if (result)
  994. goto bad_res;
  995. result = rdev->ops->set_txq_params(&rdev->wiphy,
  996. &txq_params);
  997. if (result)
  998. goto bad_res;
  999. }
  1000. }
  1001. if (info->attrs[NL80211_ATTR_WIPHY_FREQ]) {
  1002. result = __nl80211_set_channel(rdev, wdev, info);
  1003. if (result)
  1004. goto bad_res;
  1005. }
  1006. if (info->attrs[NL80211_ATTR_WIPHY_TX_POWER_SETTING]) {
  1007. enum nl80211_tx_power_setting type;
  1008. int idx, mbm = 0;
  1009. if (!rdev->ops->set_tx_power) {
  1010. result = -EOPNOTSUPP;
  1011. goto bad_res;
  1012. }
  1013. idx = NL80211_ATTR_WIPHY_TX_POWER_SETTING;
  1014. type = nla_get_u32(info->attrs[idx]);
  1015. if (!info->attrs[NL80211_ATTR_WIPHY_TX_POWER_LEVEL] &&
  1016. (type != NL80211_TX_POWER_AUTOMATIC)) {
  1017. result = -EINVAL;
  1018. goto bad_res;
  1019. }
  1020. if (type != NL80211_TX_POWER_AUTOMATIC) {
  1021. idx = NL80211_ATTR_WIPHY_TX_POWER_LEVEL;
  1022. mbm = nla_get_u32(info->attrs[idx]);
  1023. }
  1024. result = rdev->ops->set_tx_power(&rdev->wiphy, type, mbm);
  1025. if (result)
  1026. goto bad_res;
  1027. }
  1028. if (info->attrs[NL80211_ATTR_WIPHY_ANTENNA_TX] &&
  1029. info->attrs[NL80211_ATTR_WIPHY_ANTENNA_RX]) {
  1030. u32 tx_ant, rx_ant;
  1031. if ((!rdev->wiphy.available_antennas_tx &&
  1032. !rdev->wiphy.available_antennas_rx) ||
  1033. !rdev->ops->set_antenna) {
  1034. result = -EOPNOTSUPP;
  1035. goto bad_res;
  1036. }
  1037. tx_ant = nla_get_u32(info->attrs[NL80211_ATTR_WIPHY_ANTENNA_TX]);
  1038. rx_ant = nla_get_u32(info->attrs[NL80211_ATTR_WIPHY_ANTENNA_RX]);
  1039. /* reject antenna configurations which don't match the
  1040. * available antenna masks, except for the "all" mask */
  1041. if ((~tx_ant && (tx_ant & ~rdev->wiphy.available_antennas_tx)) ||
  1042. (~rx_ant && (rx_ant & ~rdev->wiphy.available_antennas_rx))) {
  1043. result = -EINVAL;
  1044. goto bad_res;
  1045. }
  1046. tx_ant = tx_ant & rdev->wiphy.available_antennas_tx;
  1047. rx_ant = rx_ant & rdev->wiphy.available_antennas_rx;
  1048. result = rdev->ops->set_antenna(&rdev->wiphy, tx_ant, rx_ant);
  1049. if (result)
  1050. goto bad_res;
  1051. }
  1052. changed = 0;
  1053. if (info->attrs[NL80211_ATTR_WIPHY_RETRY_SHORT]) {
  1054. retry_short = nla_get_u8(
  1055. info->attrs[NL80211_ATTR_WIPHY_RETRY_SHORT]);
  1056. if (retry_short == 0) {
  1057. result = -EINVAL;
  1058. goto bad_res;
  1059. }
  1060. changed |= WIPHY_PARAM_RETRY_SHORT;
  1061. }
  1062. if (info->attrs[NL80211_ATTR_WIPHY_RETRY_LONG]) {
  1063. retry_long = nla_get_u8(
  1064. info->attrs[NL80211_ATTR_WIPHY_RETRY_LONG]);
  1065. if (retry_long == 0) {
  1066. result = -EINVAL;
  1067. goto bad_res;
  1068. }
  1069. changed |= WIPHY_PARAM_RETRY_LONG;
  1070. }
  1071. if (info->attrs[NL80211_ATTR_WIPHY_FRAG_THRESHOLD]) {
  1072. frag_threshold = nla_get_u32(
  1073. info->attrs[NL80211_ATTR_WIPHY_FRAG_THRESHOLD]);
  1074. if (frag_threshold < 256) {
  1075. result = -EINVAL;
  1076. goto bad_res;
  1077. }
  1078. if (frag_threshold != (u32) -1) {
  1079. /*
  1080. * Fragments (apart from the last one) are required to
  1081. * have even length. Make the fragmentation code
  1082. * simpler by stripping LSB should someone try to use
  1083. * odd threshold value.
  1084. */
  1085. frag_threshold &= ~0x1;
  1086. }
  1087. changed |= WIPHY_PARAM_FRAG_THRESHOLD;
  1088. }
  1089. if (info->attrs[NL80211_ATTR_WIPHY_RTS_THRESHOLD]) {
  1090. rts_threshold = nla_get_u32(
  1091. info->attrs[NL80211_ATTR_WIPHY_RTS_THRESHOLD]);
  1092. changed |= WIPHY_PARAM_RTS_THRESHOLD;
  1093. }
  1094. if (info->attrs[NL80211_ATTR_WIPHY_COVERAGE_CLASS]) {
  1095. coverage_class = nla_get_u8(
  1096. info->attrs[NL80211_ATTR_WIPHY_COVERAGE_CLASS]);
  1097. changed |= WIPHY_PARAM_COVERAGE_CLASS;
  1098. }
  1099. if (changed) {
  1100. u8 old_retry_short, old_retry_long;
  1101. u32 old_frag_threshold, old_rts_threshold;
  1102. u8 old_coverage_class;
  1103. if (!rdev->ops->set_wiphy_params) {
  1104. result = -EOPNOTSUPP;
  1105. goto bad_res;
  1106. }
  1107. old_retry_short = rdev->wiphy.retry_short;
  1108. old_retry_long = rdev->wiphy.retry_long;
  1109. old_frag_threshold = rdev->wiphy.frag_threshold;
  1110. old_rts_threshold = rdev->wiphy.rts_threshold;
  1111. old_coverage_class = rdev->wiphy.coverage_class;
  1112. if (changed & WIPHY_PARAM_RETRY_SHORT)
  1113. rdev->wiphy.retry_short = retry_short;
  1114. if (changed & WIPHY_PARAM_RETRY_LONG)
  1115. rdev->wiphy.retry_long = retry_long;
  1116. if (changed & WIPHY_PARAM_FRAG_THRESHOLD)
  1117. rdev->wiphy.frag_threshold = frag_threshold;
  1118. if (changed & WIPHY_PARAM_RTS_THRESHOLD)
  1119. rdev->wiphy.rts_threshold = rts_threshold;
  1120. if (changed & WIPHY_PARAM_COVERAGE_CLASS)
  1121. rdev->wiphy.coverage_class = coverage_class;
  1122. result = rdev->ops->set_wiphy_params(&rdev->wiphy, changed);
  1123. if (result) {
  1124. rdev->wiphy.retry_short = old_retry_short;
  1125. rdev->wiphy.retry_long = old_retry_long;
  1126. rdev->wiphy.frag_threshold = old_frag_threshold;
  1127. rdev->wiphy.rts_threshold = old_rts_threshold;
  1128. rdev->wiphy.coverage_class = old_coverage_class;
  1129. }
  1130. }
  1131. bad_res:
  1132. mutex_unlock(&rdev->mtx);
  1133. if (netdev)
  1134. dev_put(netdev);
  1135. return result;
  1136. }
  1137. static int nl80211_send_iface(struct sk_buff *msg, u32 pid, u32 seq, int flags,
  1138. struct cfg80211_registered_device *rdev,
  1139. struct net_device *dev)
  1140. {
  1141. void *hdr;
  1142. hdr = nl80211hdr_put(msg, pid, seq, flags, NL80211_CMD_NEW_INTERFACE);
  1143. if (!hdr)
  1144. return -1;
  1145. NLA_PUT_U32(msg, NL80211_ATTR_IFINDEX, dev->ifindex);
  1146. NLA_PUT_U32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx);
  1147. NLA_PUT_STRING(msg, NL80211_ATTR_IFNAME, dev->name);
  1148. NLA_PUT_U32(msg, NL80211_ATTR_IFTYPE, dev->ieee80211_ptr->iftype);
  1149. NLA_PUT_U32(msg, NL80211_ATTR_GENERATION,
  1150. rdev->devlist_generation ^
  1151. (cfg80211_rdev_list_generation << 2));
  1152. return genlmsg_end(msg, hdr);
  1153. nla_put_failure:
  1154. genlmsg_cancel(msg, hdr);
  1155. return -EMSGSIZE;
  1156. }
  1157. static int nl80211_dump_interface(struct sk_buff *skb, struct netlink_callback *cb)
  1158. {
  1159. int wp_idx = 0;
  1160. int if_idx = 0;
  1161. int wp_start = cb->args[0];
  1162. int if_start = cb->args[1];
  1163. struct cfg80211_registered_device *rdev;
  1164. struct wireless_dev *wdev;
  1165. mutex_lock(&cfg80211_mutex);
  1166. list_for_each_entry(rdev, &cfg80211_rdev_list, list) {
  1167. if (!net_eq(wiphy_net(&rdev->wiphy), sock_net(skb->sk)))
  1168. continue;
  1169. if (wp_idx < wp_start) {
  1170. wp_idx++;
  1171. continue;
  1172. }
  1173. if_idx = 0;
  1174. mutex_lock(&rdev->devlist_mtx);
  1175. list_for_each_entry(wdev, &rdev->netdev_list, list) {
  1176. if (if_idx < if_start) {
  1177. if_idx++;
  1178. continue;
  1179. }
  1180. if (nl80211_send_iface(skb, NETLINK_CB(cb->skb).pid,
  1181. cb->nlh->nlmsg_seq, NLM_F_MULTI,
  1182. rdev, wdev->netdev) < 0) {
  1183. mutex_unlock(&rdev->devlist_mtx);
  1184. goto out;
  1185. }
  1186. if_idx++;
  1187. }
  1188. mutex_unlock(&rdev->devlist_mtx);
  1189. wp_idx++;
  1190. }
  1191. out:
  1192. mutex_unlock(&cfg80211_mutex);
  1193. cb->args[0] = wp_idx;
  1194. cb->args[1] = if_idx;
  1195. return skb->len;
  1196. }
  1197. static int nl80211_get_interface(struct sk_buff *skb, struct genl_info *info)
  1198. {
  1199. struct sk_buff *msg;
  1200. struct cfg80211_registered_device *dev = info->user_ptr[0];
  1201. struct net_device *netdev = info->user_ptr[1];
  1202. msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
  1203. if (!msg)
  1204. return -ENOMEM;
  1205. if (nl80211_send_iface(msg, info->snd_pid, info->snd_seq, 0,
  1206. dev, netdev) < 0) {
  1207. nlmsg_free(msg);
  1208. return -ENOBUFS;
  1209. }
  1210. return genlmsg_reply(msg, info);
  1211. }
  1212. static const struct nla_policy mntr_flags_policy[NL80211_MNTR_FLAG_MAX + 1] = {
  1213. [NL80211_MNTR_FLAG_FCSFAIL] = { .type = NLA_FLAG },
  1214. [NL80211_MNTR_FLAG_PLCPFAIL] = { .type = NLA_FLAG },
  1215. [NL80211_MNTR_FLAG_CONTROL] = { .type = NLA_FLAG },
  1216. [NL80211_MNTR_FLAG_OTHER_BSS] = { .type = NLA_FLAG },
  1217. [NL80211_MNTR_FLAG_COOK_FRAMES] = { .type = NLA_FLAG },
  1218. };
  1219. static int parse_monitor_flags(struct nlattr *nla, u32 *mntrflags)
  1220. {
  1221. struct nlattr *flags[NL80211_MNTR_FLAG_MAX + 1];
  1222. int flag;
  1223. *mntrflags = 0;
  1224. if (!nla)
  1225. return -EINVAL;
  1226. if (nla_parse_nested(flags, NL80211_MNTR_FLAG_MAX,
  1227. nla, mntr_flags_policy))
  1228. return -EINVAL;
  1229. for (flag = 1; flag <= NL80211_MNTR_FLAG_MAX; flag++)
  1230. if (flags[flag])
  1231. *mntrflags |= (1<<flag);
  1232. return 0;
  1233. }
  1234. static int nl80211_valid_4addr(struct cfg80211_registered_device *rdev,
  1235. struct net_device *netdev, u8 use_4addr,
  1236. enum nl80211_iftype iftype)
  1237. {
  1238. if (!use_4addr) {
  1239. if (netdev && (netdev->priv_flags & IFF_BRIDGE_PORT))
  1240. return -EBUSY;
  1241. return 0;
  1242. }
  1243. switch (iftype) {
  1244. case NL80211_IFTYPE_AP_VLAN:
  1245. if (rdev->wiphy.flags & WIPHY_FLAG_4ADDR_AP)
  1246. return 0;
  1247. break;
  1248. case NL80211_IFTYPE_STATION:
  1249. if (rdev->wiphy.flags & WIPHY_FLAG_4ADDR_STATION)
  1250. return 0;
  1251. break;
  1252. default:
  1253. break;
  1254. }
  1255. return -EOPNOTSUPP;
  1256. }
  1257. static int nl80211_set_interface(struct sk_buff *skb, struct genl_info *info)
  1258. {
  1259. struct cfg80211_registered_device *rdev = info->user_ptr[0];
  1260. struct vif_params params;
  1261. int err;
  1262. enum nl80211_iftype otype, ntype;
  1263. struct net_device *dev = info->user_ptr[1];
  1264. u32 _flags, *flags = NULL;
  1265. bool change = false;
  1266. memset(&params, 0, sizeof(params));
  1267. otype = ntype = dev->ieee80211_ptr->iftype;
  1268. if (info->attrs[NL80211_ATTR_IFTYPE]) {
  1269. ntype = nla_get_u32(info->attrs[NL80211_ATTR_IFTYPE]);
  1270. if (otype != ntype)
  1271. change = true;
  1272. if (ntype > NL80211_IFTYPE_MAX)
  1273. return -EINVAL;
  1274. }
  1275. if (info->attrs[NL80211_ATTR_MESH_ID]) {
  1276. struct wireless_dev *wdev = dev->ieee80211_ptr;
  1277. if (ntype != NL80211_IFTYPE_MESH_POINT)
  1278. return -EINVAL;
  1279. if (netif_running(dev))
  1280. return -EBUSY;
  1281. wdev_lock(wdev);
  1282. BUILD_BUG_ON(IEEE80211_MAX_SSID_LEN !=
  1283. IEEE80211_MAX_MESH_ID_LEN);
  1284. wdev->mesh_id_up_len =
  1285. nla_len(info->attrs[NL80211_ATTR_MESH_ID]);
  1286. memcpy(wdev->ssid, nla_data(info->attrs[NL80211_ATTR_MESH_ID]),
  1287. wdev->mesh_id_up_len);
  1288. wdev_unlock(wdev);
  1289. }
  1290. if (info->attrs[NL80211_ATTR_4ADDR]) {
  1291. params.use_4addr = !!nla_get_u8(info->attrs[NL80211_ATTR_4ADDR]);
  1292. change = true;
  1293. err = nl80211_valid_4addr(rdev, dev, params.use_4addr, ntype);
  1294. if (err)
  1295. return err;
  1296. } else {
  1297. params.use_4addr = -1;
  1298. }
  1299. if (info->attrs[NL80211_ATTR_MNTR_FLAGS]) {
  1300. if (ntype != NL80211_IFTYPE_MONITOR)
  1301. return -EINVAL;
  1302. err = parse_monitor_flags(info->attrs[NL80211_ATTR_MNTR_FLAGS],
  1303. &_flags);
  1304. if (err)
  1305. return err;
  1306. flags = &_flags;
  1307. change = true;
  1308. }
  1309. if (change)
  1310. err = cfg80211_change_iface(rdev, dev, ntype, flags, &params);
  1311. else
  1312. err = 0;
  1313. if (!err && params.use_4addr != -1)
  1314. dev->ieee80211_ptr->use_4addr = params.use_4addr;
  1315. return err;
  1316. }
  1317. static int nl80211_new_interface(struct sk_buff *skb, struct genl_info *info)
  1318. {
  1319. struct cfg80211_registered_device *rdev = info->user_ptr[0];
  1320. struct vif_params params;
  1321. struct net_device *dev;
  1322. int err;
  1323. enum nl80211_iftype type = NL80211_IFTYPE_UNSPECIFIED;
  1324. u32 flags;
  1325. memset(&params, 0, sizeof(params));
  1326. if (!info->attrs[NL80211_ATTR_IFNAME])
  1327. return -EINVAL;
  1328. if (info->attrs[NL80211_ATTR_IFTYPE]) {
  1329. type = nla_get_u32(info->attrs[NL80211_ATTR_IFTYPE]);
  1330. if (type > NL80211_IFTYPE_MAX)
  1331. return -EINVAL;
  1332. }
  1333. if (!rdev->ops->add_virtual_intf ||
  1334. !(rdev->wiphy.interface_modes & (1 << type)))
  1335. return -EOPNOTSUPP;
  1336. if (info->attrs[NL80211_ATTR_4ADDR]) {
  1337. params.use_4addr = !!nla_get_u8(info->attrs[NL80211_ATTR_4ADDR]);
  1338. err = nl80211_valid_4addr(rdev, NULL, params.use_4addr, type);
  1339. if (err)
  1340. return err;
  1341. }
  1342. err = parse_monitor_flags(type == NL80211_IFTYPE_MONITOR ?
  1343. info->attrs[NL80211_ATTR_MNTR_FLAGS] : NULL,
  1344. &flags);
  1345. dev = rdev->ops->add_virtual_intf(&rdev->wiphy,
  1346. nla_data(info->attrs[NL80211_ATTR_IFNAME]),
  1347. type, err ? NULL : &flags, &params);
  1348. if (IS_ERR(dev))
  1349. return PTR_ERR(dev);
  1350. if (type == NL80211_IFTYPE_MESH_POINT &&
  1351. info->attrs[NL80211_ATTR_MESH_ID]) {
  1352. struct wireless_dev *wdev = dev->ieee80211_ptr;
  1353. wdev_lock(wdev);
  1354. BUILD_BUG_ON(IEEE80211_MAX_SSID_LEN !=
  1355. IEEE80211_MAX_MESH_ID_LEN);
  1356. wdev->mesh_id_up_len =
  1357. nla_len(info->attrs[NL80211_ATTR_MESH_ID]);
  1358. memcpy(wdev->ssid, nla_data(info->attrs[NL80211_ATTR_MESH_ID]),
  1359. wdev->mesh_id_up_len);
  1360. wdev_unlock(wdev);
  1361. }
  1362. return 0;
  1363. }
  1364. static int nl80211_del_interface(struct sk_buff *skb, struct genl_info *info)
  1365. {
  1366. struct cfg80211_registered_device *rdev = info->user_ptr[0];
  1367. struct net_device *dev = info->user_ptr[1];
  1368. if (!rdev->ops->del_virtual_intf)
  1369. return -EOPNOTSUPP;
  1370. return rdev->ops->del_virtual_intf(&rdev->wiphy, dev);
  1371. }
  1372. struct get_key_cookie {
  1373. struct sk_buff *msg;
  1374. int error;
  1375. int idx;
  1376. };
  1377. static void get_key_callback(void *c, struct key_params *params)
  1378. {
  1379. struct nlattr *key;
  1380. struct get_key_cookie *cookie = c;
  1381. if (params->key)
  1382. NLA_PUT(cookie->msg, NL80211_ATTR_KEY_DATA,
  1383. params->key_len, params->key);
  1384. if (params->seq)
  1385. NLA_PUT(cookie->msg, NL80211_ATTR_KEY_SEQ,
  1386. params->seq_len, params->seq);
  1387. if (params->cipher)
  1388. NLA_PUT_U32(cookie->msg, NL80211_ATTR_KEY_CIPHER,
  1389. params->cipher);
  1390. key = nla_nest_start(cookie->msg, NL80211_ATTR_KEY);
  1391. if (!key)
  1392. goto nla_put_failure;
  1393. if (params->key)
  1394. NLA_PUT(cookie->msg, NL80211_KEY_DATA,
  1395. params->key_len, params->key);
  1396. if (params->seq)
  1397. NLA_PUT(cookie->msg, NL80211_KEY_SEQ,
  1398. params->seq_len, params->seq);
  1399. if (params->cipher)
  1400. NLA_PUT_U32(cookie->msg, NL80211_KEY_CIPHER,
  1401. params->cipher);
  1402. NLA_PUT_U8(cookie->msg, NL80211_ATTR_KEY_IDX, cookie->idx);
  1403. nla_nest_end(cookie->msg, key);
  1404. return;
  1405. nla_put_failure:
  1406. cookie->error = 1;
  1407. }
  1408. static int nl80211_get_key(struct sk_buff *skb, struct genl_info *info)
  1409. {
  1410. struct cfg80211_registered_device *rdev = info->user_ptr[0];
  1411. int err;
  1412. struct net_device *dev = info->user_ptr[1];
  1413. u8 key_idx = 0;
  1414. const u8 *mac_addr = NULL;
  1415. bool pairwise;
  1416. struct get_key_cookie cookie = {
  1417. .error = 0,
  1418. };
  1419. void *hdr;
  1420. struct sk_buff *msg;
  1421. if (info->attrs[NL80211_ATTR_KEY_IDX])
  1422. key_idx = nla_get_u8(info->attrs[NL80211_ATTR_KEY_IDX]);
  1423. if (key_idx > 5)
  1424. return -EINVAL;
  1425. if (info->attrs[NL80211_ATTR_MAC])
  1426. mac_addr = nla_data(info->attrs[NL80211_ATTR_MAC]);
  1427. pairwise = !!mac_addr;
  1428. if (info->attrs[NL80211_ATTR_KEY_TYPE]) {
  1429. u32 kt = nla_get_u32(info->attrs[NL80211_ATTR_KEY_TYPE]);
  1430. if (kt >= NUM_NL80211_KEYTYPES)
  1431. return -EINVAL;
  1432. if (kt != NL80211_KEYTYPE_GROUP &&
  1433. kt != NL80211_KEYTYPE_PAIRWISE)
  1434. return -EINVAL;
  1435. pairwise = kt == NL80211_KEYTYPE_PAIRWISE;
  1436. }
  1437. if (!rdev->ops->get_key)
  1438. return -EOPNOTSUPP;
  1439. msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
  1440. if (!msg)
  1441. return -ENOMEM;
  1442. hdr = nl80211hdr_put(msg, info->snd_pid, info->snd_seq, 0,
  1443. NL80211_CMD_NEW_KEY);
  1444. if (IS_ERR(hdr))
  1445. return PTR_ERR(hdr);
  1446. cookie.msg = msg;
  1447. cookie.idx = key_idx;
  1448. NLA_PUT_U32(msg, NL80211_ATTR_IFINDEX, dev->ifindex);
  1449. NLA_PUT_U8(msg, NL80211_ATTR_KEY_IDX, key_idx);
  1450. if (mac_addr)
  1451. NLA_PUT(msg, NL80211_ATTR_MAC, ETH_ALEN, mac_addr);
  1452. if (pairwise && mac_addr &&
  1453. !(rdev->wiphy.flags & WIPHY_FLAG_IBSS_RSN))
  1454. return -ENOENT;
  1455. err = rdev->ops->get_key(&rdev->wiphy, dev, key_idx, pairwise,
  1456. mac_addr, &cookie, get_key_callback);
  1457. if (err)
  1458. goto free_msg;
  1459. if (cookie.error)
  1460. goto nla_put_failure;
  1461. genlmsg_end(msg, hdr);
  1462. return genlmsg_reply(msg, info);
  1463. nla_put_failure:
  1464. err = -ENOBUFS;
  1465. free_msg:
  1466. nlmsg_free(msg);
  1467. return err;
  1468. }
  1469. static int nl80211_set_key(struct sk_buff *skb, struct genl_info *info)
  1470. {
  1471. struct cfg80211_registered_device *rdev = info->user_ptr[0];
  1472. struct key_parse key;
  1473. int err;
  1474. struct net_device *dev = info->user_ptr[1];
  1475. err = nl80211_parse_key(info, &key);
  1476. if (err)
  1477. return err;
  1478. if (key.idx < 0)
  1479. return -EINVAL;
  1480. /* only support setting default key */
  1481. if (!key.def && !key.defmgmt)
  1482. return -EINVAL;
  1483. wdev_lock(dev->ieee80211_ptr);
  1484. if (key.def) {
  1485. if (!rdev->ops->set_default_key) {
  1486. err = -EOPNOTSUPP;
  1487. goto out;
  1488. }
  1489. err = nl80211_key_allowed(dev->ieee80211_ptr);
  1490. if (err)
  1491. goto out;
  1492. err = rdev->ops->set_default_key(&rdev->wiphy, dev, key.idx,
  1493. key.def_uni, key.def_multi);
  1494. if (err)
  1495. goto out;
  1496. #ifdef CONFIG_CFG80211_WEXT
  1497. dev->ieee80211_ptr->wext.default_key = key.idx;
  1498. #endif
  1499. } else {
  1500. if (key.def_uni || !key.def_multi) {
  1501. err = -EINVAL;
  1502. goto out;
  1503. }
  1504. if (!rdev->ops->set_default_mgmt_key) {
  1505. err = -EOPNOTSUPP;
  1506. goto out;
  1507. }
  1508. err = nl80211_key_allowed(dev->ieee80211_ptr);
  1509. if (err)
  1510. goto out;
  1511. err = rdev->ops->set_default_mgmt_key(&rdev->wiphy,
  1512. dev, key.idx);
  1513. if (err)
  1514. goto out;
  1515. #ifdef CONFIG_CFG80211_WEXT
  1516. dev->ieee80211_ptr->wext.default_mgmt_key = key.idx;
  1517. #endif
  1518. }
  1519. out:
  1520. wdev_unlock(dev->ieee80211_ptr);
  1521. return err;
  1522. }
  1523. static int nl80211_new_key(struct sk_buff *skb, struct genl_info *info)
  1524. {
  1525. struct cfg80211_registered_device *rdev = info->user_ptr[0];
  1526. int err;
  1527. struct net_device *dev = info->user_ptr[1];
  1528. struct key_parse key;
  1529. const u8 *mac_addr = NULL;
  1530. err = nl80211_parse_key(info, &key);
  1531. if (err)
  1532. return err;
  1533. if (!key.p.key)
  1534. return -EINVAL;
  1535. if (info->attrs[NL80211_ATTR_MAC])
  1536. mac_addr = nla_data(info->attrs[NL80211_ATTR_MAC]);
  1537. if (key.type == -1) {
  1538. if (mac_addr)
  1539. key.type = NL80211_KEYTYPE_PAIRWISE;
  1540. else
  1541. key.type = NL80211_KEYTYPE_GROUP;
  1542. }
  1543. /* for now */
  1544. if (key.type != NL80211_KEYTYPE_PAIRWISE &&
  1545. key.type != NL80211_KEYTYPE_GROUP)
  1546. return -EINVAL;
  1547. if (!rdev->ops->add_key)
  1548. return -EOPNOTSUPP;
  1549. if (cfg80211_validate_key_settings(rdev, &key.p, key.idx,
  1550. key.type == NL80211_KEYTYPE_PAIRWISE,
  1551. mac_addr))
  1552. return -EINVAL;
  1553. wdev_lock(dev->ieee80211_ptr);
  1554. err = nl80211_key_allowed(dev->ieee80211_ptr);
  1555. if (!err)
  1556. err = rdev->ops->add_key(&rdev->wiphy, dev, key.idx,
  1557. key.type == NL80211_KEYTYPE_PAIRWISE,
  1558. mac_addr, &key.p);
  1559. wdev_unlock(dev->ieee80211_ptr);
  1560. return err;
  1561. }
  1562. static int nl80211_del_key(struct sk_buff *skb, struct genl_info *info)
  1563. {
  1564. struct cfg80211_registered_device *rdev = info->user_ptr[0];
  1565. int err;
  1566. struct net_device *dev = info->user_ptr[1];
  1567. u8 *mac_addr = NULL;
  1568. struct key_parse key;
  1569. err = nl80211_parse_key(info, &key);
  1570. if (err)
  1571. return err;
  1572. if (info->attrs[NL80211_ATTR_MAC])
  1573. mac_addr = nla_data(info->attrs[NL80211_ATTR_MAC]);
  1574. if (key.type == -1) {
  1575. if (mac_addr)
  1576. key.type = NL80211_KEYTYPE_PAIRWISE;
  1577. else
  1578. key.type = NL80211_KEYTYPE_GROUP;
  1579. }
  1580. /* for now */
  1581. if (key.type != NL80211_KEYTYPE_PAIRWISE &&
  1582. key.type != NL80211_KEYTYPE_GROUP)
  1583. return -EINVAL;
  1584. if (!rdev->ops->del_key)
  1585. return -EOPNOTSUPP;
  1586. wdev_lock(dev->ieee80211_ptr);
  1587. err = nl80211_key_allowed(dev->ieee80211_ptr);
  1588. if (key.type == NL80211_KEYTYPE_PAIRWISE && mac_addr &&
  1589. !(rdev->wiphy.flags & WIPHY_FLAG_IBSS_RSN))
  1590. err = -ENOENT;
  1591. if (!err)
  1592. err = rdev->ops->del_key(&rdev->wiphy, dev, key.idx,
  1593. key.type == NL80211_KEYTYPE_PAIRWISE,
  1594. mac_addr);
  1595. #ifdef CONFIG_CFG80211_WEXT
  1596. if (!err) {
  1597. if (key.idx == dev->ieee80211_ptr->wext.default_key)
  1598. dev->ieee80211_ptr->wext.default_key = -1;
  1599. else if (key.idx == dev->ieee80211_ptr->wext.default_mgmt_key)
  1600. dev->ieee80211_ptr->wext.default_mgmt_key = -1;
  1601. }
  1602. #endif
  1603. wdev_unlock(dev->ieee80211_ptr);
  1604. return err;
  1605. }
  1606. static int nl80211_addset_beacon(struct sk_buff *skb, struct genl_info *info)
  1607. {
  1608. int (*call)(struct wiphy *wiphy, struct net_device *dev,
  1609. struct beacon_parameters *info);
  1610. struct cfg80211_registered_device *rdev = info->user_ptr[0];
  1611. struct net_device *dev = info->user_ptr[1];
  1612. struct wireless_dev *wdev = dev->ieee80211_ptr;
  1613. struct beacon_parameters params;
  1614. int haveinfo = 0, err;
  1615. if (!is_valid_ie_attr(info->attrs[NL80211_ATTR_BEACON_TAIL]))
  1616. return -EINVAL;
  1617. if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_AP &&
  1618. dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_GO)
  1619. return -EOPNOTSUPP;
  1620. memset(&params, 0, sizeof(params));
  1621. switch (info->genlhdr->cmd) {
  1622. case NL80211_CMD_NEW_BEACON:
  1623. /* these are required for NEW_BEACON */
  1624. if (!info->attrs[NL80211_ATTR_BEACON_INTERVAL] ||
  1625. !info->attrs[NL80211_ATTR_DTIM_PERIOD] ||
  1626. !info->attrs[NL80211_ATTR_BEACON_HEAD])
  1627. return -EINVAL;
  1628. params.interval =
  1629. nla_get_u32(info->attrs[NL80211_ATTR_BEACON_INTERVAL]);
  1630. params.dtim_period =
  1631. nla_get_u32(info->attrs[NL80211_ATTR_DTIM_PERIOD]);
  1632. err = cfg80211_validate_beacon_int(rdev, params.interval);
  1633. if (err)
  1634. return err;
  1635. call = rdev->ops->add_beacon;
  1636. break;
  1637. case NL80211_CMD_SET_BEACON:
  1638. call = rdev->ops->set_beacon;
  1639. break;
  1640. default:
  1641. WARN_ON(1);
  1642. return -EOPNOTSUPP;
  1643. }
  1644. if (!call)
  1645. return -EOPNOTSUPP;
  1646. if (info->attrs[NL80211_ATTR_BEACON_HEAD]) {
  1647. params.head = nla_data(info->attrs[NL80211_ATTR_BEACON_HEAD]);
  1648. params.head_len =
  1649. nla_len(info->attrs[NL80211_ATTR_BEACON_HEAD]);
  1650. haveinfo = 1;
  1651. }
  1652. if (info->attrs[NL80211_ATTR_BEACON_TAIL]) {
  1653. params.tail = nla_data(info->attrs[NL80211_ATTR_BEACON_TAIL]);
  1654. params.tail_len =
  1655. nla_len(info->attrs[NL80211_ATTR_BEACON_TAIL]);
  1656. haveinfo = 1;
  1657. }
  1658. if (!haveinfo)
  1659. return -EINVAL;
  1660. err = call(&rdev->wiphy, dev, &params);
  1661. if (!err && params.interval)
  1662. wdev->beacon_interval = params.interval;
  1663. return err;
  1664. }
  1665. static int nl80211_del_beacon(struct sk_buff *skb, struct genl_info *info)
  1666. {
  1667. struct cfg80211_registered_device *rdev = info->user_ptr[0];
  1668. struct net_device *dev = info->user_ptr[1];
  1669. struct wireless_dev *wdev = dev->ieee80211_ptr;
  1670. int err;
  1671. if (!rdev->ops->del_beacon)
  1672. return -EOPNOTSUPP;
  1673. if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_AP &&
  1674. dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_GO)
  1675. return -EOPNOTSUPP;
  1676. err = rdev->ops->del_beacon(&rdev->wiphy, dev);
  1677. if (!err)
  1678. wdev->beacon_interval = 0;
  1679. return err;
  1680. }
  1681. static const struct nla_policy sta_flags_policy[NL80211_STA_FLAG_MAX + 1] = {
  1682. [NL80211_STA_FLAG_AUTHORIZED] = { .type = NLA_FLAG },
  1683. [NL80211_STA_FLAG_SHORT_PREAMBLE] = { .type = NLA_FLAG },
  1684. [NL80211_STA_FLAG_WME] = { .type = NLA_FLAG },
  1685. [NL80211_STA_FLAG_MFP] = { .type = NLA_FLAG },
  1686. [NL80211_STA_FLAG_AUTHENTICATED] = { .type = NLA_FLAG },
  1687. };
  1688. static int parse_station_flags(struct genl_info *info,
  1689. struct station_parameters *params)
  1690. {
  1691. struct nlattr *flags[NL80211_STA_FLAG_MAX + 1];
  1692. struct nlattr *nla;
  1693. int flag;
  1694. /*
  1695. * Try parsing the new attribute first so userspace
  1696. * can specify both for older kernels.
  1697. */
  1698. nla = info->attrs[NL80211_ATTR_STA_FLAGS2];
  1699. if (nla) {
  1700. struct nl80211_sta_flag_update *sta_flags;
  1701. sta_flags = nla_data(nla);
  1702. params->sta_flags_mask = sta_flags->mask;
  1703. params->sta_flags_set = sta_flags->set;
  1704. if ((params->sta_flags_mask |
  1705. params->sta_flags_set) & BIT(__NL80211_STA_FLAG_INVALID))
  1706. return -EINVAL;
  1707. return 0;
  1708. }
  1709. /* if present, parse the old attribute */
  1710. nla = info->attrs[NL80211_ATTR_STA_FLAGS];
  1711. if (!nla)
  1712. return 0;
  1713. if (nla_parse_nested(flags, NL80211_STA_FLAG_MAX,
  1714. nla, sta_flags_policy))
  1715. return -EINVAL;
  1716. params->sta_flags_mask = (1 << __NL80211_STA_FLAG_AFTER_LAST) - 1;
  1717. params->sta_flags_mask &= ~1;
  1718. for (flag = 1; flag <= NL80211_STA_FLAG_MAX; flag++)
  1719. if (flags[flag])
  1720. params->sta_flags_set |= (1<<flag);
  1721. return 0;
  1722. }
  1723. static bool nl80211_put_sta_rate(struct sk_buff *msg, struct rate_info *info,
  1724. int attr)
  1725. {
  1726. struct nlattr *rate;
  1727. u16 bitrate;
  1728. rate = nla_nest_start(msg, attr);
  1729. if (!rate)
  1730. goto nla_put_failure;
  1731. /* cfg80211_calculate_bitrate will return 0 for mcs >= 32 */
  1732. bitrate = cfg80211_calculate_bitrate(info);
  1733. if (bitrate > 0)
  1734. NLA_PUT_U16(msg, NL80211_RATE_INFO_BITRATE, bitrate);
  1735. if (info->flags & RATE_INFO_FLAGS_MCS)
  1736. NLA_PUT_U8(msg, NL80211_RATE_INFO_MCS, info->mcs);
  1737. if (info->flags & RATE_INFO_FLAGS_40_MHZ_WIDTH)
  1738. NLA_PUT_FLAG(msg, NL80211_RATE_INFO_40_MHZ_WIDTH);
  1739. if (info->flags & RATE_INFO_FLAGS_SHORT_GI)
  1740. NLA_PUT_FLAG(msg, NL80211_RATE_INFO_SHORT_GI);
  1741. nla_nest_end(msg, rate);
  1742. return true;
  1743. nla_put_failure:
  1744. return false;
  1745. }
  1746. static int nl80211_send_station(struct sk_buff *msg, u32 pid, u32 seq,
  1747. int flags, struct net_device *dev,
  1748. const u8 *mac_addr, struct station_info *sinfo)
  1749. {
  1750. void *hdr;
  1751. struct nlattr *sinfoattr, *bss_param;
  1752. hdr = nl80211hdr_put(msg, pid, seq, flags, NL80211_CMD_NEW_STATION);
  1753. if (!hdr)
  1754. return -1;
  1755. NLA_PUT_U32(msg, NL80211_ATTR_IFINDEX, dev->ifindex);
  1756. NLA_PUT(msg, NL80211_ATTR_MAC, ETH_ALEN, mac_addr);
  1757. NLA_PUT_U32(msg, NL80211_ATTR_GENERATION, sinfo->generation);
  1758. sinfoattr = nla_nest_start(msg, NL80211_ATTR_STA_INFO);
  1759. if (!sinfoattr)
  1760. goto nla_put_failure;
  1761. if (sinfo->filled & STATION_INFO_CONNECTED_TIME)
  1762. NLA_PUT_U32(msg, NL80211_STA_INFO_CONNECTED_TIME,
  1763. sinfo->connected_time);
  1764. if (sinfo->filled & STATION_INFO_INACTIVE_TIME)
  1765. NLA_PUT_U32(msg, NL80211_STA_INFO_INACTIVE_TIME,
  1766. sinfo->inactive_time);
  1767. if (sinfo->filled & STATION_INFO_RX_BYTES)
  1768. NLA_PUT_U32(msg, NL80211_STA_INFO_RX_BYTES,
  1769. sinfo->rx_bytes);
  1770. if (sinfo->filled & STATION_INFO_TX_BYTES)
  1771. NLA_PUT_U32(msg, NL80211_STA_INFO_TX_BYTES,
  1772. sinfo->tx_bytes);
  1773. if (sinfo->filled & STATION_INFO_LLID)
  1774. NLA_PUT_U16(msg, NL80211_STA_INFO_LLID,
  1775. sinfo->llid);
  1776. if (sinfo->filled & STATION_INFO_PLID)
  1777. NLA_PUT_U16(msg, NL80211_STA_INFO_PLID,
  1778. sinfo->plid);
  1779. if (sinfo->filled & STATION_INFO_PLINK_STATE)
  1780. NLA_PUT_U8(msg, NL80211_STA_INFO_PLINK_STATE,
  1781. sinfo->plink_state);
  1782. if (sinfo->filled & STATION_INFO_SIGNAL)
  1783. NLA_PUT_U8(msg, NL80211_STA_INFO_SIGNAL,
  1784. sinfo->signal);
  1785. if (sinfo->filled & STATION_INFO_SIGNAL_AVG)
  1786. NLA_PUT_U8(msg, NL80211_STA_INFO_SIGNAL_AVG,
  1787. sinfo->signal_avg);
  1788. if (sinfo->filled & STATION_INFO_TX_BITRATE) {
  1789. if (!nl80211_put_sta_rate(msg, &sinfo->txrate,
  1790. NL80211_STA_INFO_TX_BITRATE))
  1791. goto nla_put_failure;
  1792. }
  1793. if (sinfo->filled & STATION_INFO_RX_BITRATE) {
  1794. if (!nl80211_put_sta_rate(msg, &sinfo->rxrate,
  1795. NL80211_STA_INFO_RX_BITRATE))
  1796. goto nla_put_failure;
  1797. }
  1798. if (sinfo->filled & STATION_INFO_RX_PACKETS)
  1799. NLA_PUT_U32(msg, NL80211_STA_INFO_RX_PACKETS,
  1800. sinfo->rx_packets);
  1801. if (sinfo->filled & STATION_INFO_TX_PACKETS)
  1802. NLA_PUT_U32(msg, NL80211_STA_INFO_TX_PACKETS,
  1803. sinfo->tx_packets);
  1804. if (sinfo->filled & STATION_INFO_TX_RETRIES)
  1805. NLA_PUT_U32(msg, NL80211_STA_INFO_TX_RETRIES,
  1806. sinfo->tx_retries);
  1807. if (sinfo->filled & STATION_INFO_TX_FAILED)
  1808. NLA_PUT_U32(msg, NL80211_STA_INFO_TX_FAILED,
  1809. sinfo->tx_failed);
  1810. if (sinfo->filled & STATION_INFO_BSS_PARAM) {
  1811. bss_param = nla_nest_start(msg, NL80211_STA_INFO_BSS_PARAM);
  1812. if (!bss_param)
  1813. goto nla_put_failure;
  1814. if (sinfo->bss_param.flags & BSS_PARAM_FLAGS_CTS_PROT)
  1815. NLA_PUT_FLAG(msg, NL80211_STA_BSS_PARAM_CTS_PROT);
  1816. if (sinfo->bss_param.flags & BSS_PARAM_FLAGS_SHORT_PREAMBLE)
  1817. NLA_PUT_FLAG(msg, NL80211_STA_BSS_PARAM_SHORT_PREAMBLE);
  1818. if (sinfo->bss_param.flags & BSS_PARAM_FLAGS_SHORT_SLOT_TIME)
  1819. NLA_PUT_FLAG(msg,
  1820. NL80211_STA_BSS_PARAM_SHORT_SLOT_TIME);
  1821. NLA_PUT_U8(msg, NL80211_STA_BSS_PARAM_DTIM_PERIOD,
  1822. sinfo->bss_param.dtim_period);
  1823. NLA_PUT_U16(msg, NL80211_STA_BSS_PARAM_BEACON_INTERVAL,
  1824. sinfo->bss_param.beacon_interval);
  1825. nla_nest_end(msg, bss_param);
  1826. }
  1827. nla_nest_end(msg, sinfoattr);
  1828. return genlmsg_end(msg, hdr);
  1829. nla_put_failure:
  1830. genlmsg_cancel(msg, hdr);
  1831. return -EMSGSIZE;
  1832. }
  1833. static int nl80211_dump_station(struct sk_buff *skb,
  1834. struct netlink_callback *cb)
  1835. {
  1836. struct station_info sinfo;
  1837. struct cfg80211_registered_device *dev;
  1838. struct net_device *netdev;
  1839. u8 mac_addr[ETH_ALEN];
  1840. int sta_idx = cb->args[1];
  1841. int err;
  1842. err = nl80211_prepare_netdev_dump(skb, cb, &dev, &netdev);
  1843. if (err)
  1844. return err;
  1845. if (!dev->ops->dump_station) {
  1846. err = -EOPNOTSUPP;
  1847. goto out_err;
  1848. }
  1849. while (1) {
  1850. err = dev->ops->dump_station(&dev->wiphy, netdev, sta_idx,
  1851. mac_addr, &sinfo);
  1852. if (err == -ENOENT)
  1853. break;
  1854. if (err)
  1855. goto out_err;
  1856. if (nl80211_send_station(skb,
  1857. NETLINK_CB(cb->skb).pid,
  1858. cb->nlh->nlmsg_seq, NLM_F_MULTI,
  1859. netdev, mac_addr,
  1860. &sinfo) < 0)
  1861. goto out;
  1862. sta_idx++;
  1863. }
  1864. out:
  1865. cb->args[1] = sta_idx;
  1866. err = skb->len;
  1867. out_err:
  1868. nl80211_finish_netdev_dump(dev);
  1869. return err;
  1870. }
  1871. static int nl80211_get_station(struct sk_buff *skb, struct genl_info *info)
  1872. {
  1873. struct cfg80211_registered_device *rdev = info->user_ptr[0];
  1874. struct net_device *dev = info->user_ptr[1];
  1875. struct station_info sinfo;
  1876. struct sk_buff *msg;
  1877. u8 *mac_addr = NULL;
  1878. int err;
  1879. memset(&sinfo, 0, sizeof(sinfo));
  1880. if (!info->attrs[NL80211_ATTR_MAC])
  1881. return -EINVAL;
  1882. mac_addr = nla_data(info->attrs[NL80211_ATTR_MAC]);
  1883. if (!rdev->ops->get_station)
  1884. return -EOPNOTSUPP;
  1885. err = rdev->ops->get_station(&rdev->wiphy, dev, mac_addr, &sinfo);
  1886. if (err)
  1887. return err;
  1888. msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
  1889. if (!msg)
  1890. return -ENOMEM;
  1891. if (nl80211_send_station(msg, info->snd_pid, info->snd_seq, 0,
  1892. dev, mac_addr, &sinfo) < 0) {
  1893. nlmsg_free(msg);
  1894. return -ENOBUFS;
  1895. }
  1896. return genlmsg_reply(msg, info);
  1897. }
  1898. /*
  1899. * Get vlan interface making sure it is running and on the right wiphy.
  1900. */
  1901. static int get_vlan(struct genl_info *info,
  1902. struct cfg80211_registered_device *rdev,
  1903. struct net_device **vlan)
  1904. {
  1905. struct nlattr *vlanattr = info->attrs[NL80211_ATTR_STA_VLAN];
  1906. *vlan = NULL;
  1907. if (vlanattr) {
  1908. *vlan = dev_get_by_index(genl_info_net(info),
  1909. nla_get_u32(vlanattr));
  1910. if (!*vlan)
  1911. return -ENODEV;
  1912. if (!(*vlan)->ieee80211_ptr)
  1913. return -EINVAL;
  1914. if ((*vlan)->ieee80211_ptr->wiphy != &rdev->wiphy)
  1915. return -EINVAL;
  1916. if (!netif_running(*vlan))
  1917. return -ENETDOWN;
  1918. }
  1919. return 0;
  1920. }
  1921. static int nl80211_set_station(struct sk_buff *skb, struct genl_info *info)
  1922. {
  1923. struct cfg80211_registered_device *rdev = info->user_ptr[0];
  1924. int err;
  1925. struct net_device *dev = info->user_ptr[1];
  1926. struct station_parameters params;
  1927. u8 *mac_addr = NULL;
  1928. memset(&params, 0, sizeof(params));
  1929. params.listen_interval = -1;
  1930. params.plink_state = -1;
  1931. if (info->attrs[NL80211_ATTR_STA_AID])
  1932. return -EINVAL;
  1933. if (!info->attrs[NL80211_ATTR_MAC])
  1934. return -EINVAL;
  1935. mac_addr = nla_data(info->attrs[NL80211_ATTR_MAC]);
  1936. if (info->attrs[NL80211_ATTR_STA_SUPPORTED_RATES]) {
  1937. params.supported_rates =
  1938. nla_data(info->attrs[NL80211_ATTR_STA_SUPPORTED_RATES]);
  1939. params.supported_rates_len =
  1940. nla_len(info->attrs[NL80211_ATTR_STA_SUPPORTED_RATES]);
  1941. }
  1942. if (info->attrs[NL80211_ATTR_STA_LISTEN_INTERVAL])
  1943. params.listen_interval =
  1944. nla_get_u16(info->attrs[NL80211_ATTR_STA_LISTEN_INTERVAL]);
  1945. if (info->attrs[NL80211_ATTR_HT_CAPABILITY])
  1946. params.ht_capa =
  1947. nla_data(info->attrs[NL80211_ATTR_HT_CAPABILITY]);
  1948. if (parse_station_flags(info, &params))
  1949. return -EINVAL;
  1950. if (info->attrs[NL80211_ATTR_STA_PLINK_ACTION])
  1951. params.plink_action =
  1952. nla_get_u8(info->attrs[NL80211_ATTR_STA_PLINK_ACTION]);
  1953. if (info->attrs[NL80211_ATTR_STA_PLINK_STATE])
  1954. params.plink_state =
  1955. nla_get_u8(info->attrs[NL80211_ATTR_STA_PLINK_STATE]);
  1956. err = get_vlan(info, rdev, &params.vlan);
  1957. if (err)
  1958. goto out;
  1959. /* validate settings */
  1960. err = 0;
  1961. switch (dev->ieee80211_ptr->iftype) {
  1962. case NL80211_IFTYPE_AP:
  1963. case NL80211_IFTYPE_AP_VLAN:
  1964. case NL80211_IFTYPE_P2P_GO:
  1965. /* disallow mesh-specific things */
  1966. if (params.plink_action)
  1967. err = -EINVAL;
  1968. break;
  1969. case NL80211_IFTYPE_P2P_CLIENT:
  1970. case NL80211_IFTYPE_STATION:
  1971. /* disallow everything but AUTHORIZED flag */
  1972. if (params.plink_action)
  1973. err = -EINVAL;
  1974. if (params.vlan)
  1975. err = -EINVAL;
  1976. if (params.supported_rates)
  1977. err = -EINVAL;
  1978. if (params.ht_capa)
  1979. err = -EINVAL;
  1980. if (params.listen_interval >= 0)
  1981. err = -EINVAL;
  1982. if (params.sta_flags_mask & ~BIT(NL80211_STA_FLAG_AUTHORIZED))
  1983. err = -EINVAL;
  1984. break;
  1985. case NL80211_IFTYPE_MESH_POINT:
  1986. /* disallow things mesh doesn't support */
  1987. if (params.vlan)
  1988. err = -EINVAL;
  1989. if (params.ht_capa)
  1990. err = -EINVAL;
  1991. if (params.listen_interval >= 0)
  1992. err = -EINVAL;
  1993. if (params.sta_flags_mask &
  1994. ~(BIT(NL80211_STA_FLAG_AUTHENTICATED) |
  1995. BIT(NL80211_STA_FLAG_MFP) |
  1996. BIT(NL80211_STA_FLAG_AUTHORIZED)))
  1997. err = -EINVAL;
  1998. break;
  1999. default:
  2000. err = -EINVAL;
  2001. }
  2002. if (err)
  2003. goto out;
  2004. if (!rdev->ops->change_station) {
  2005. err = -EOPNOTSUPP;
  2006. goto out;
  2007. }
  2008. err = rdev->ops->change_station(&rdev->wiphy, dev, mac_addr, &params);
  2009. out:
  2010. if (params.vlan)
  2011. dev_put(params.vlan);
  2012. return err;
  2013. }
  2014. static int nl80211_new_station(struct sk_buff *skb, struct genl_info *info)
  2015. {
  2016. struct cfg80211_registered_device *rdev = info->user_ptr[0];
  2017. int err;
  2018. struct net_device *dev = info->user_ptr[1];
  2019. struct station_parameters params;
  2020. u8 *mac_addr = NULL;
  2021. memset(&params, 0, sizeof(params));
  2022. if (!info->attrs[NL80211_ATTR_MAC])
  2023. return -EINVAL;
  2024. if (!info->attrs[NL80211_ATTR_STA_LISTEN_INTERVAL])
  2025. return -EINVAL;
  2026. if (!info->attrs[NL80211_ATTR_STA_SUPPORTED_RATES])
  2027. return -EINVAL;
  2028. if (!info->attrs[NL80211_ATTR_STA_AID])
  2029. return -EINVAL;
  2030. mac_addr = nla_data(info->attrs[NL80211_ATTR_MAC]);
  2031. params.supported_rates =
  2032. nla_data(info->attrs[NL80211_ATTR_STA_SUPPORTED_RATES]);
  2033. params.supported_rates_len =
  2034. nla_len(info->attrs[NL80211_ATTR_STA_SUPPORTED_RATES]);
  2035. params.listen_interval =
  2036. nla_get_u16(info->attrs[NL80211_ATTR_STA_LISTEN_INTERVAL]);
  2037. params.aid = nla_get_u16(info->attrs[NL80211_ATTR_STA_AID]);
  2038. if (!params.aid || params.aid > IEEE80211_MAX_AID)
  2039. return -EINVAL;
  2040. if (info->attrs[NL80211_ATTR_HT_CAPABILITY])
  2041. params.ht_capa =
  2042. nla_data(info->attrs[NL80211_ATTR_HT_CAPABILITY]);
  2043. if (info->attrs[NL80211_ATTR_STA_PLINK_ACTION])
  2044. params.plink_action =
  2045. nla_get_u8(info->attrs[NL80211_ATTR_STA_PLINK_ACTION]);
  2046. if (parse_station_flags(info, &params))
  2047. return -EINVAL;
  2048. if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_AP &&
  2049. dev->ieee80211_ptr->iftype != NL80211_IFTYPE_AP_VLAN &&
  2050. dev->ieee80211_ptr->iftype != NL80211_IFTYPE_MESH_POINT &&
  2051. dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_GO)
  2052. return -EINVAL;
  2053. err = get_vlan(info, rdev, &params.vlan);
  2054. if (err)
  2055. goto out;
  2056. /* validate settings */
  2057. err = 0;
  2058. if (!rdev->ops->add_station) {
  2059. err = -EOPNOTSUPP;
  2060. goto out;
  2061. }
  2062. err = rdev->ops->add_station(&rdev->wiphy, dev, mac_addr, &params);
  2063. out:
  2064. if (params.vlan)
  2065. dev_put(params.vlan);
  2066. return err;
  2067. }
  2068. static int nl80211_del_station(struct sk_buff *skb, struct genl_info *info)
  2069. {
  2070. struct cfg80211_registered_device *rdev = info->user_ptr[0];
  2071. struct net_device *dev = info->user_ptr[1];
  2072. u8 *mac_addr = NULL;
  2073. if (info->attrs[NL80211_ATTR_MAC])
  2074. mac_addr = nla_data(info->attrs[NL80211_ATTR_MAC]);
  2075. if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_AP &&
  2076. dev->ieee80211_ptr->iftype != NL80211_IFTYPE_AP_VLAN &&
  2077. dev->ieee80211_ptr->iftype != NL80211_IFTYPE_MESH_POINT &&
  2078. dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_GO)
  2079. return -EINVAL;
  2080. if (!rdev->ops->del_station)
  2081. return -EOPNOTSUPP;
  2082. return rdev->ops->del_station(&rdev->wiphy, dev, mac_addr);
  2083. }
  2084. static int nl80211_send_mpath(struct sk_buff *msg, u32 pid, u32 seq,
  2085. int flags, struct net_device *dev,
  2086. u8 *dst, u8 *next_hop,
  2087. struct mpath_info *pinfo)
  2088. {
  2089. void *hdr;
  2090. struct nlattr *pinfoattr;
  2091. hdr = nl80211hdr_put(msg, pid, seq, flags, NL80211_CMD_NEW_STATION);
  2092. if (!hdr)
  2093. return -1;
  2094. NLA_PUT_U32(msg, NL80211_ATTR_IFINDEX, dev->ifindex);
  2095. NLA_PUT(msg, NL80211_ATTR_MAC, ETH_ALEN, dst);
  2096. NLA_PUT(msg, NL80211_ATTR_MPATH_NEXT_HOP, ETH_ALEN, next_hop);
  2097. NLA_PUT_U32(msg, NL80211_ATTR_GENERATION, pinfo->generation);
  2098. pinfoattr = nla_nest_start(msg, NL80211_ATTR_MPATH_INFO);
  2099. if (!pinfoattr)
  2100. goto nla_put_failure;
  2101. if (pinfo->filled & MPATH_INFO_FRAME_QLEN)
  2102. NLA_PUT_U32(msg, NL80211_MPATH_INFO_FRAME_QLEN,
  2103. pinfo->frame_qlen);
  2104. if (pinfo->filled & MPATH_INFO_SN)
  2105. NLA_PUT_U32(msg, NL80211_MPATH_INFO_SN,
  2106. pinfo->sn);
  2107. if (pinfo->filled & MPATH_INFO_METRIC)
  2108. NLA_PUT_U32(msg, NL80211_MPATH_INFO_METRIC,
  2109. pinfo->metric);
  2110. if (pinfo->filled & MPATH_INFO_EXPTIME)
  2111. NLA_PUT_U32(msg, NL80211_MPATH_INFO_EXPTIME,
  2112. pinfo->exptime);
  2113. if (pinfo->filled & MPATH_INFO_FLAGS)
  2114. NLA_PUT_U8(msg, NL80211_MPATH_INFO_FLAGS,
  2115. pinfo->flags);
  2116. if (pinfo->filled & MPATH_INFO_DISCOVERY_TIMEOUT)
  2117. NLA_PUT_U32(msg, NL80211_MPATH_INFO_DISCOVERY_TIMEOUT,
  2118. pinfo->discovery_timeout);
  2119. if (pinfo->filled & MPATH_INFO_DISCOVERY_RETRIES)
  2120. NLA_PUT_U8(msg, NL80211_MPATH_INFO_DISCOVERY_RETRIES,
  2121. pinfo->discovery_retries);
  2122. nla_nest_end(msg, pinfoattr);
  2123. return genlmsg_end(msg, hdr);
  2124. nla_put_failure:
  2125. genlmsg_cancel(msg, hdr);
  2126. return -EMSGSIZE;
  2127. }
  2128. static int nl80211_dump_mpath(struct sk_buff *skb,
  2129. struct netlink_callback *cb)
  2130. {
  2131. struct mpath_info pinfo;
  2132. struct cfg80211_registered_device *dev;
  2133. struct net_device *netdev;
  2134. u8 dst[ETH_ALEN];
  2135. u8 next_hop[ETH_ALEN];
  2136. int path_idx = cb->args[1];
  2137. int err;
  2138. err = nl80211_prepare_netdev_dump(skb, cb, &dev, &netdev);
  2139. if (err)
  2140. return err;
  2141. if (!dev->ops->dump_mpath) {
  2142. err = -EOPNOTSUPP;
  2143. goto out_err;
  2144. }
  2145. if (netdev->ieee80211_ptr->iftype != NL80211_IFTYPE_MESH_POINT) {
  2146. err = -EOPNOTSUPP;
  2147. goto out_err;
  2148. }
  2149. while (1) {
  2150. err = dev->ops->dump_mpath(&dev->wiphy, netdev, path_idx,
  2151. dst, next_hop, &pinfo);
  2152. if (err == -ENOENT)
  2153. break;
  2154. if (err)
  2155. goto out_err;
  2156. if (nl80211_send_mpath(skb, NETLINK_CB(cb->skb).pid,
  2157. cb->nlh->nlmsg_seq, NLM_F_MULTI,
  2158. netdev, dst, next_hop,
  2159. &pinfo) < 0)
  2160. goto out;
  2161. path_idx++;
  2162. }
  2163. out:
  2164. cb->args[1] = path_idx;
  2165. err = skb->len;
  2166. out_err:
  2167. nl80211_finish_netdev_dump(dev);
  2168. return err;
  2169. }
  2170. static int nl80211_get_mpath(struct sk_buff *skb, struct genl_info *info)
  2171. {
  2172. struct cfg80211_registered_device *rdev = info->user_ptr[0];
  2173. int err;
  2174. struct net_device *dev = info->user_ptr[1];
  2175. struct mpath_info pinfo;
  2176. struct sk_buff *msg;
  2177. u8 *dst = NULL;
  2178. u8 next_hop[ETH_ALEN];
  2179. memset(&pinfo, 0, sizeof(pinfo));
  2180. if (!info->attrs[NL80211_ATTR_MAC])
  2181. return -EINVAL;
  2182. dst = nla_data(info->attrs[NL80211_ATTR_MAC]);
  2183. if (!rdev->ops->get_mpath)
  2184. return -EOPNOTSUPP;
  2185. if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_MESH_POINT)
  2186. return -EOPNOTSUPP;
  2187. err = rdev->ops->get_mpath(&rdev->wiphy, dev, dst, next_hop, &pinfo);
  2188. if (err)
  2189. return err;
  2190. msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
  2191. if (!msg)
  2192. return -ENOMEM;
  2193. if (nl80211_send_mpath(msg, info->snd_pid, info->snd_seq, 0,
  2194. dev, dst, next_hop, &pinfo) < 0) {
  2195. nlmsg_free(msg);
  2196. return -ENOBUFS;
  2197. }
  2198. return genlmsg_reply(msg, info);
  2199. }
  2200. static int nl80211_set_mpath(struct sk_buff *skb, struct genl_info *info)
  2201. {
  2202. struct cfg80211_registered_device *rdev = info->user_ptr[0];
  2203. struct net_device *dev = info->user_ptr[1];
  2204. u8 *dst = NULL;
  2205. u8 *next_hop = NULL;
  2206. if (!info->attrs[NL80211_ATTR_MAC])
  2207. return -EINVAL;
  2208. if (!info->attrs[NL80211_ATTR_MPATH_NEXT_HOP])
  2209. return -EINVAL;
  2210. dst = nla_data(info->attrs[NL80211_ATTR_MAC]);
  2211. next_hop = nla_data(info->attrs[NL80211_ATTR_MPATH_NEXT_HOP]);
  2212. if (!rdev->ops->change_mpath)
  2213. return -EOPNOTSUPP;
  2214. if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_MESH_POINT)
  2215. return -EOPNOTSUPP;
  2216. return rdev->ops->change_mpath(&rdev->wiphy, dev, dst, next_hop);
  2217. }
  2218. static int nl80211_new_mpath(struct sk_buff *skb, struct genl_info *info)
  2219. {
  2220. struct cfg80211_registered_device *rdev = info->user_ptr[0];
  2221. struct net_device *dev = info->user_ptr[1];
  2222. u8 *dst = NULL;
  2223. u8 *next_hop = NULL;
  2224. if (!info->attrs[NL80211_ATTR_MAC])
  2225. return -EINVAL;
  2226. if (!info->attrs[NL80211_ATTR_MPATH_NEXT_HOP])
  2227. return -EINVAL;
  2228. dst = nla_data(info->attrs[NL80211_ATTR_MAC]);
  2229. next_hop = nla_data(info->attrs[NL80211_ATTR_MPATH_NEXT_HOP]);
  2230. if (!rdev->ops->add_mpath)
  2231. return -EOPNOTSUPP;
  2232. if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_MESH_POINT)
  2233. return -EOPNOTSUPP;
  2234. return rdev->ops->add_mpath(&rdev->wiphy, dev, dst, next_hop);
  2235. }
  2236. static int nl80211_del_mpath(struct sk_buff *skb, struct genl_info *info)
  2237. {
  2238. struct cfg80211_registered_device *rdev = info->user_ptr[0];
  2239. struct net_device *dev = info->user_ptr[1];
  2240. u8 *dst = NULL;
  2241. if (info->attrs[NL80211_ATTR_MAC])
  2242. dst = nla_data(info->attrs[NL80211_ATTR_MAC]);
  2243. if (!rdev->ops->del_mpath)
  2244. return -EOPNOTSUPP;
  2245. return rdev->ops->del_mpath(&rdev->wiphy, dev, dst);
  2246. }
  2247. static int nl80211_set_bss(struct sk_buff *skb, struct genl_info *info)
  2248. {
  2249. struct cfg80211_registered_device *rdev = info->user_ptr[0];
  2250. struct net_device *dev = info->user_ptr[1];
  2251. struct bss_parameters params;
  2252. memset(&params, 0, sizeof(params));
  2253. /* default to not changing parameters */
  2254. params.use_cts_prot = -1;
  2255. params.use_short_preamble = -1;
  2256. params.use_short_slot_time = -1;
  2257. params.ap_isolate = -1;
  2258. params.ht_opmode = -1;
  2259. if (info->attrs[NL80211_ATTR_BSS_CTS_PROT])
  2260. params.use_cts_prot =
  2261. nla_get_u8(info->attrs[NL80211_ATTR_BSS_CTS_PROT]);
  2262. if (info->attrs[NL80211_ATTR_BSS_SHORT_PREAMBLE])
  2263. params.use_short_preamble =
  2264. nla_get_u8(info->attrs[NL80211_ATTR_BSS_SHORT_PREAMBLE]);
  2265. if (info->attrs[NL80211_ATTR_BSS_SHORT_SLOT_TIME])
  2266. params.use_short_slot_time =
  2267. nla_get_u8(info->attrs[NL80211_ATTR_BSS_SHORT_SLOT_TIME]);
  2268. if (info->attrs[NL80211_ATTR_BSS_BASIC_RATES]) {
  2269. params.basic_rates =
  2270. nla_data(info->attrs[NL80211_ATTR_BSS_BASIC_RATES]);
  2271. params.basic_rates_len =
  2272. nla_len(info->attrs[NL80211_ATTR_BSS_BASIC_RATES]);
  2273. }
  2274. if (info->attrs[NL80211_ATTR_AP_ISOLATE])
  2275. params.ap_isolate = !!nla_get_u8(info->attrs[NL80211_ATTR_AP_ISOLATE]);
  2276. if (info->attrs[NL80211_ATTR_BSS_HT_OPMODE])
  2277. params.ht_opmode =
  2278. nla_get_u16(info->attrs[NL80211_ATTR_BSS_HT_OPMODE]);
  2279. if (!rdev->ops->change_bss)
  2280. return -EOPNOTSUPP;
  2281. if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_AP &&
  2282. dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_GO)
  2283. return -EOPNOTSUPP;
  2284. return rdev->ops->change_bss(&rdev->wiphy, dev, &params);
  2285. }
  2286. static const struct nla_policy reg_rule_policy[NL80211_REG_RULE_ATTR_MAX + 1] = {
  2287. [NL80211_ATTR_REG_RULE_FLAGS] = { .type = NLA_U32 },
  2288. [NL80211_ATTR_FREQ_RANGE_START] = { .type = NLA_U32 },
  2289. [NL80211_ATTR_FREQ_RANGE_END] = { .type = NLA_U32 },
  2290. [NL80211_ATTR_FREQ_RANGE_MAX_BW] = { .type = NLA_U32 },
  2291. [NL80211_ATTR_POWER_RULE_MAX_ANT_GAIN] = { .type = NLA_U32 },
  2292. [NL80211_ATTR_POWER_RULE_MAX_EIRP] = { .type = NLA_U32 },
  2293. };
  2294. static int parse_reg_rule(struct nlattr *tb[],
  2295. struct ieee80211_reg_rule *reg_rule)
  2296. {
  2297. struct ieee80211_freq_range *freq_range = &reg_rule->freq_range;
  2298. struct ieee80211_power_rule *power_rule = &reg_rule->power_rule;
  2299. if (!tb[NL80211_ATTR_REG_RULE_FLAGS])
  2300. return -EINVAL;
  2301. if (!tb[NL80211_ATTR_FREQ_RANGE_START])
  2302. return -EINVAL;
  2303. if (!tb[NL80211_ATTR_FREQ_RANGE_END])
  2304. return -EINVAL;
  2305. if (!tb[NL80211_ATTR_FREQ_RANGE_MAX_BW])
  2306. return -EINVAL;
  2307. if (!tb[NL80211_ATTR_POWER_RULE_MAX_EIRP])
  2308. return -EINVAL;
  2309. reg_rule->flags = nla_get_u32(tb[NL80211_ATTR_REG_RULE_FLAGS]);
  2310. freq_range->start_freq_khz =
  2311. nla_get_u32(tb[NL80211_ATTR_FREQ_RANGE_START]);
  2312. freq_range->end_freq_khz =
  2313. nla_get_u32(tb[NL80211_ATTR_FREQ_RANGE_END]);
  2314. freq_range->max_bandwidth_khz =
  2315. nla_get_u32(tb[NL80211_ATTR_FREQ_RANGE_MAX_BW]);
  2316. power_rule->max_eirp =
  2317. nla_get_u32(tb[NL80211_ATTR_POWER_RULE_MAX_EIRP]);
  2318. if (tb[NL80211_ATTR_POWER_RULE_MAX_ANT_GAIN])
  2319. power_rule->max_antenna_gain =
  2320. nla_get_u32(tb[NL80211_ATTR_POWER_RULE_MAX_ANT_GAIN]);
  2321. return 0;
  2322. }
  2323. static int nl80211_req_set_reg(struct sk_buff *skb, struct genl_info *info)
  2324. {
  2325. int r;
  2326. char *data = NULL;
  2327. /*
  2328. * You should only get this when cfg80211 hasn't yet initialized
  2329. * completely when built-in to the kernel right between the time
  2330. * window between nl80211_init() and regulatory_init(), if that is
  2331. * even possible.
  2332. */
  2333. mutex_lock(&cfg80211_mutex);
  2334. if (unlikely(!cfg80211_regdomain)) {
  2335. mutex_unlock(&cfg80211_mutex);
  2336. return -EINPROGRESS;
  2337. }
  2338. mutex_unlock(&cfg80211_mutex);
  2339. if (!info->attrs[NL80211_ATTR_REG_ALPHA2])
  2340. return -EINVAL;
  2341. data = nla_data(info->attrs[NL80211_ATTR_REG_ALPHA2]);
  2342. r = regulatory_hint_user(data);
  2343. return r;
  2344. }
  2345. static int nl80211_get_mesh_config(struct sk_buff *skb,
  2346. struct genl_info *info)
  2347. {
  2348. struct cfg80211_registered_device *rdev = info->user_ptr[0];
  2349. struct net_device *dev = info->user_ptr[1];
  2350. struct wireless_dev *wdev = dev->ieee80211_ptr;
  2351. struct mesh_config cur_params;
  2352. int err = 0;
  2353. void *hdr;
  2354. struct nlattr *pinfoattr;
  2355. struct sk_buff *msg;
  2356. if (wdev->iftype != NL80211_IFTYPE_MESH_POINT)
  2357. return -EOPNOTSUPP;
  2358. if (!rdev->ops->get_mesh_config)
  2359. return -EOPNOTSUPP;
  2360. wdev_lock(wdev);
  2361. /* If not connected, get default parameters */
  2362. if (!wdev->mesh_id_len)
  2363. memcpy(&cur_params, &default_mesh_config, sizeof(cur_params));
  2364. else
  2365. err = rdev->ops->get_mesh_config(&rdev->wiphy, dev,
  2366. &cur_params);
  2367. wdev_unlock(wdev);
  2368. if (err)
  2369. return err;
  2370. /* Draw up a netlink message to send back */
  2371. msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
  2372. if (!msg)
  2373. return -ENOMEM;
  2374. hdr = nl80211hdr_put(msg, info->snd_pid, info->snd_seq, 0,
  2375. NL80211_CMD_GET_MESH_CONFIG);
  2376. if (!hdr)
  2377. goto out;
  2378. pinfoattr = nla_nest_start(msg, NL80211_ATTR_MESH_CONFIG);
  2379. if (!pinfoattr)
  2380. goto nla_put_failure;
  2381. NLA_PUT_U32(msg, NL80211_ATTR_IFINDEX, dev->ifindex);
  2382. NLA_PUT_U16(msg, NL80211_MESHCONF_RETRY_TIMEOUT,
  2383. cur_params.dot11MeshRetryTimeout);
  2384. NLA_PUT_U16(msg, NL80211_MESHCONF_CONFIRM_TIMEOUT,
  2385. cur_params.dot11MeshConfirmTimeout);
  2386. NLA_PUT_U16(msg, NL80211_MESHCONF_HOLDING_TIMEOUT,
  2387. cur_params.dot11MeshHoldingTimeout);
  2388. NLA_PUT_U16(msg, NL80211_MESHCONF_MAX_PEER_LINKS,
  2389. cur_params.dot11MeshMaxPeerLinks);
  2390. NLA_PUT_U8(msg, NL80211_MESHCONF_MAX_RETRIES,
  2391. cur_params.dot11MeshMaxRetries);
  2392. NLA_PUT_U8(msg, NL80211_MESHCONF_TTL,
  2393. cur_params.dot11MeshTTL);
  2394. NLA_PUT_U8(msg, NL80211_MESHCONF_ELEMENT_TTL,
  2395. cur_params.element_ttl);
  2396. NLA_PUT_U8(msg, NL80211_MESHCONF_AUTO_OPEN_PLINKS,
  2397. cur_params.auto_open_plinks);
  2398. NLA_PUT_U8(msg, NL80211_MESHCONF_HWMP_MAX_PREQ_RETRIES,
  2399. cur_params.dot11MeshHWMPmaxPREQretries);
  2400. NLA_PUT_U32(msg, NL80211_MESHCONF_PATH_REFRESH_TIME,
  2401. cur_params.path_refresh_time);
  2402. NLA_PUT_U16(msg, NL80211_MESHCONF_MIN_DISCOVERY_TIMEOUT,
  2403. cur_params.min_discovery_timeout);
  2404. NLA_PUT_U32(msg, NL80211_MESHCONF_HWMP_ACTIVE_PATH_TIMEOUT,
  2405. cur_params.dot11MeshHWMPactivePathTimeout);
  2406. NLA_PUT_U16(msg, NL80211_MESHCONF_HWMP_PREQ_MIN_INTERVAL,
  2407. cur_params.dot11MeshHWMPpreqMinInterval);
  2408. NLA_PUT_U16(msg, NL80211_MESHCONF_HWMP_NET_DIAM_TRVS_TIME,
  2409. cur_params.dot11MeshHWMPnetDiameterTraversalTime);
  2410. NLA_PUT_U8(msg, NL80211_MESHCONF_HWMP_ROOTMODE,
  2411. cur_params.dot11MeshHWMPRootMode);
  2412. nla_nest_end(msg, pinfoattr);
  2413. genlmsg_end(msg, hdr);
  2414. return genlmsg_reply(msg, info);
  2415. nla_put_failure:
  2416. genlmsg_cancel(msg, hdr);
  2417. out:
  2418. nlmsg_free(msg);
  2419. return -ENOBUFS;
  2420. }
  2421. static const struct nla_policy nl80211_meshconf_params_policy[NL80211_MESHCONF_ATTR_MAX+1] = {
  2422. [NL80211_MESHCONF_RETRY_TIMEOUT] = { .type = NLA_U16 },
  2423. [NL80211_MESHCONF_CONFIRM_TIMEOUT] = { .type = NLA_U16 },
  2424. [NL80211_MESHCONF_HOLDING_TIMEOUT] = { .type = NLA_U16 },
  2425. [NL80211_MESHCONF_MAX_PEER_LINKS] = { .type = NLA_U16 },
  2426. [NL80211_MESHCONF_MAX_RETRIES] = { .type = NLA_U8 },
  2427. [NL80211_MESHCONF_TTL] = { .type = NLA_U8 },
  2428. [NL80211_MESHCONF_ELEMENT_TTL] = { .type = NLA_U8 },
  2429. [NL80211_MESHCONF_AUTO_OPEN_PLINKS] = { .type = NLA_U8 },
  2430. [NL80211_MESHCONF_HWMP_MAX_PREQ_RETRIES] = { .type = NLA_U8 },
  2431. [NL80211_MESHCONF_PATH_REFRESH_TIME] = { .type = NLA_U32 },
  2432. [NL80211_MESHCONF_MIN_DISCOVERY_TIMEOUT] = { .type = NLA_U16 },
  2433. [NL80211_MESHCONF_HWMP_ACTIVE_PATH_TIMEOUT] = { .type = NLA_U32 },
  2434. [NL80211_MESHCONF_HWMP_PREQ_MIN_INTERVAL] = { .type = NLA_U16 },
  2435. [NL80211_MESHCONF_HWMP_NET_DIAM_TRVS_TIME] = { .type = NLA_U16 },
  2436. };
  2437. static const struct nla_policy
  2438. nl80211_mesh_setup_params_policy[NL80211_MESH_SETUP_ATTR_MAX+1] = {
  2439. [NL80211_MESH_SETUP_ENABLE_VENDOR_PATH_SEL] = { .type = NLA_U8 },
  2440. [NL80211_MESH_SETUP_ENABLE_VENDOR_METRIC] = { .type = NLA_U8 },
  2441. [NL80211_MESH_SETUP_USERSPACE_AUTH] = { .type = NLA_FLAG },
  2442. [NL80211_MESH_SETUP_IE] = { .type = NLA_BINARY,
  2443. .len = IEEE80211_MAX_DATA_LEN },
  2444. [NL80211_MESH_SETUP_USERSPACE_AMPE] = { .type = NLA_FLAG },
  2445. };
  2446. static int nl80211_parse_mesh_config(struct genl_info *info,
  2447. struct mesh_config *cfg,
  2448. u32 *mask_out)
  2449. {
  2450. struct nlattr *tb[NL80211_MESHCONF_ATTR_MAX + 1];
  2451. u32 mask = 0;
  2452. #define FILL_IN_MESH_PARAM_IF_SET(table, cfg, param, mask, attr_num, nla_fn) \
  2453. do {\
  2454. if (table[attr_num]) {\
  2455. cfg->param = nla_fn(table[attr_num]); \
  2456. mask |= (1 << (attr_num - 1)); \
  2457. } \
  2458. } while (0);\
  2459. if (!info->attrs[NL80211_ATTR_MESH_CONFIG])
  2460. return -EINVAL;
  2461. if (nla_parse_nested(tb, NL80211_MESHCONF_ATTR_MAX,
  2462. info->attrs[NL80211_ATTR_MESH_CONFIG],
  2463. nl80211_meshconf_params_policy))
  2464. return -EINVAL;
  2465. /* This makes sure that there aren't more than 32 mesh config
  2466. * parameters (otherwise our bitfield scheme would not work.) */
  2467. BUILD_BUG_ON(NL80211_MESHCONF_ATTR_MAX > 32);
  2468. /* Fill in the params struct */
  2469. FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshRetryTimeout,
  2470. mask, NL80211_MESHCONF_RETRY_TIMEOUT, nla_get_u16);
  2471. FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshConfirmTimeout,
  2472. mask, NL80211_MESHCONF_CONFIRM_TIMEOUT, nla_get_u16);
  2473. FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshHoldingTimeout,
  2474. mask, NL80211_MESHCONF_HOLDING_TIMEOUT, nla_get_u16);
  2475. FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshMaxPeerLinks,
  2476. mask, NL80211_MESHCONF_MAX_PEER_LINKS, nla_get_u16);
  2477. FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshMaxRetries,
  2478. mask, NL80211_MESHCONF_MAX_RETRIES, nla_get_u8);
  2479. FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshTTL,
  2480. mask, NL80211_MESHCONF_TTL, nla_get_u8);
  2481. FILL_IN_MESH_PARAM_IF_SET(tb, cfg, element_ttl,
  2482. mask, NL80211_MESHCONF_ELEMENT_TTL, nla_get_u8);
  2483. FILL_IN_MESH_PARAM_IF_SET(tb, cfg, auto_open_plinks,
  2484. mask, NL80211_MESHCONF_AUTO_OPEN_PLINKS, nla_get_u8);
  2485. FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshHWMPmaxPREQretries,
  2486. mask, NL80211_MESHCONF_HWMP_MAX_PREQ_RETRIES,
  2487. nla_get_u8);
  2488. FILL_IN_MESH_PARAM_IF_SET(tb, cfg, path_refresh_time,
  2489. mask, NL80211_MESHCONF_PATH_REFRESH_TIME, nla_get_u32);
  2490. FILL_IN_MESH_PARAM_IF_SET(tb, cfg, min_discovery_timeout,
  2491. mask, NL80211_MESHCONF_MIN_DISCOVERY_TIMEOUT,
  2492. nla_get_u16);
  2493. FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshHWMPactivePathTimeout,
  2494. mask, NL80211_MESHCONF_HWMP_ACTIVE_PATH_TIMEOUT,
  2495. nla_get_u32);
  2496. FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshHWMPpreqMinInterval,
  2497. mask, NL80211_MESHCONF_HWMP_PREQ_MIN_INTERVAL,
  2498. nla_get_u16);
  2499. FILL_IN_MESH_PARAM_IF_SET(tb, cfg,
  2500. dot11MeshHWMPnetDiameterTraversalTime,
  2501. mask, NL80211_MESHCONF_HWMP_NET_DIAM_TRVS_TIME,
  2502. nla_get_u16);
  2503. FILL_IN_MESH_PARAM_IF_SET(tb, cfg,
  2504. dot11MeshHWMPRootMode, mask,
  2505. NL80211_MESHCONF_HWMP_ROOTMODE,
  2506. nla_get_u8);
  2507. if (mask_out)
  2508. *mask_out = mask;
  2509. return 0;
  2510. #undef FILL_IN_MESH_PARAM_IF_SET
  2511. }
  2512. static int nl80211_parse_mesh_setup(struct genl_info *info,
  2513. struct mesh_setup *setup)
  2514. {
  2515. struct nlattr *tb[NL80211_MESH_SETUP_ATTR_MAX + 1];
  2516. if (!info->attrs[NL80211_ATTR_MESH_SETUP])
  2517. return -EINVAL;
  2518. if (nla_parse_nested(tb, NL80211_MESH_SETUP_ATTR_MAX,
  2519. info->attrs[NL80211_ATTR_MESH_SETUP],
  2520. nl80211_mesh_setup_params_policy))
  2521. return -EINVAL;
  2522. if (tb[NL80211_MESH_SETUP_ENABLE_VENDOR_PATH_SEL])
  2523. setup->path_sel_proto =
  2524. (nla_get_u8(tb[NL80211_MESH_SETUP_ENABLE_VENDOR_PATH_SEL])) ?
  2525. IEEE80211_PATH_PROTOCOL_VENDOR :
  2526. IEEE80211_PATH_PROTOCOL_HWMP;
  2527. if (tb[NL80211_MESH_SETUP_ENABLE_VENDOR_METRIC])
  2528. setup->path_metric =
  2529. (nla_get_u8(tb[NL80211_MESH_SETUP_ENABLE_VENDOR_METRIC])) ?
  2530. IEEE80211_PATH_METRIC_VENDOR :
  2531. IEEE80211_PATH_METRIC_AIRTIME;
  2532. if (tb[NL80211_MESH_SETUP_IE]) {
  2533. struct nlattr *ieattr =
  2534. tb[NL80211_MESH_SETUP_IE];
  2535. if (!is_valid_ie_attr(ieattr))
  2536. return -EINVAL;
  2537. setup->ie = nla_data(ieattr);
  2538. setup->ie_len = nla_len(ieattr);
  2539. }
  2540. setup->is_authenticated = nla_get_flag(tb[NL80211_MESH_SETUP_USERSPACE_AUTH]);
  2541. setup->is_secure = nla_get_flag(tb[NL80211_MESH_SETUP_USERSPACE_AMPE]);
  2542. return 0;
  2543. }
  2544. static int nl80211_update_mesh_config(struct sk_buff *skb,
  2545. struct genl_info *info)
  2546. {
  2547. struct cfg80211_registered_device *rdev = info->user_ptr[0];
  2548. struct net_device *dev = info->user_ptr[1];
  2549. struct wireless_dev *wdev = dev->ieee80211_ptr;
  2550. struct mesh_config cfg;
  2551. u32 mask;
  2552. int err;
  2553. if (wdev->iftype != NL80211_IFTYPE_MESH_POINT)
  2554. return -EOPNOTSUPP;
  2555. if (!rdev->ops->update_mesh_config)
  2556. return -EOPNOTSUPP;
  2557. err = nl80211_parse_mesh_config(info, &cfg, &mask);
  2558. if (err)
  2559. return err;
  2560. wdev_lock(wdev);
  2561. if (!wdev->mesh_id_len)
  2562. err = -ENOLINK;
  2563. if (!err)
  2564. err = rdev->ops->update_mesh_config(&rdev->wiphy, dev,
  2565. mask, &cfg);
  2566. wdev_unlock(wdev);
  2567. return err;
  2568. }
  2569. static int nl80211_get_reg(struct sk_buff *skb, struct genl_info *info)
  2570. {
  2571. struct sk_buff *msg;
  2572. void *hdr = NULL;
  2573. struct nlattr *nl_reg_rules;
  2574. unsigned int i;
  2575. int err = -EINVAL;
  2576. mutex_lock(&cfg80211_mutex);
  2577. if (!cfg80211_regdomain)
  2578. goto out;
  2579. msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
  2580. if (!msg) {
  2581. err = -ENOBUFS;
  2582. goto out;
  2583. }
  2584. hdr = nl80211hdr_put(msg, info->snd_pid, info->snd_seq, 0,
  2585. NL80211_CMD_GET_REG);
  2586. if (!hdr)
  2587. goto put_failure;
  2588. NLA_PUT_STRING(msg, NL80211_ATTR_REG_ALPHA2,
  2589. cfg80211_regdomain->alpha2);
  2590. nl_reg_rules = nla_nest_start(msg, NL80211_ATTR_REG_RULES);
  2591. if (!nl_reg_rules)
  2592. goto nla_put_failure;
  2593. for (i = 0; i < cfg80211_regdomain->n_reg_rules; i++) {
  2594. struct nlattr *nl_reg_rule;
  2595. const struct ieee80211_reg_rule *reg_rule;
  2596. const struct ieee80211_freq_range *freq_range;
  2597. const struct ieee80211_power_rule *power_rule;
  2598. reg_rule = &cfg80211_regdomain->reg_rules[i];
  2599. freq_range = &reg_rule->freq_range;
  2600. power_rule = &reg_rule->power_rule;
  2601. nl_reg_rule = nla_nest_start(msg, i);
  2602. if (!nl_reg_rule)
  2603. goto nla_put_failure;
  2604. NLA_PUT_U32(msg, NL80211_ATTR_REG_RULE_FLAGS,
  2605. reg_rule->flags);
  2606. NLA_PUT_U32(msg, NL80211_ATTR_FREQ_RANGE_START,
  2607. freq_range->start_freq_khz);
  2608. NLA_PUT_U32(msg, NL80211_ATTR_FREQ_RANGE_END,
  2609. freq_range->end_freq_khz);
  2610. NLA_PUT_U32(msg, NL80211_ATTR_FREQ_RANGE_MAX_BW,
  2611. freq_range->max_bandwidth_khz);
  2612. NLA_PUT_U32(msg, NL80211_ATTR_POWER_RULE_MAX_ANT_GAIN,
  2613. power_rule->max_antenna_gain);
  2614. NLA_PUT_U32(msg, NL80211_ATTR_POWER_RULE_MAX_EIRP,
  2615. power_rule->max_eirp);
  2616. nla_nest_end(msg, nl_reg_rule);
  2617. }
  2618. nla_nest_end(msg, nl_reg_rules);
  2619. genlmsg_end(msg, hdr);
  2620. err = genlmsg_reply(msg, info);
  2621. goto out;
  2622. nla_put_failure:
  2623. genlmsg_cancel(msg, hdr);
  2624. put_failure:
  2625. nlmsg_free(msg);
  2626. err = -EMSGSIZE;
  2627. out:
  2628. mutex_unlock(&cfg80211_mutex);
  2629. return err;
  2630. }
  2631. static int nl80211_set_reg(struct sk_buff *skb, struct genl_info *info)
  2632. {
  2633. struct nlattr *tb[NL80211_REG_RULE_ATTR_MAX + 1];
  2634. struct nlattr *nl_reg_rule;
  2635. char *alpha2 = NULL;
  2636. int rem_reg_rules = 0, r = 0;
  2637. u32 num_rules = 0, rule_idx = 0, size_of_regd;
  2638. struct ieee80211_regdomain *rd = NULL;
  2639. if (!info->attrs[NL80211_ATTR_REG_ALPHA2])
  2640. return -EINVAL;
  2641. if (!info->attrs[NL80211_ATTR_REG_RULES])
  2642. return -EINVAL;
  2643. alpha2 = nla_data(info->attrs[NL80211_ATTR_REG_ALPHA2]);
  2644. nla_for_each_nested(nl_reg_rule, info->attrs[NL80211_ATTR_REG_RULES],
  2645. rem_reg_rules) {
  2646. num_rules++;
  2647. if (num_rules > NL80211_MAX_SUPP_REG_RULES)
  2648. return -EINVAL;
  2649. }
  2650. mutex_lock(&cfg80211_mutex);
  2651. if (!reg_is_valid_request(alpha2)) {
  2652. r = -EINVAL;
  2653. goto bad_reg;
  2654. }
  2655. size_of_regd = sizeof(struct ieee80211_regdomain) +
  2656. (num_rules * sizeof(struct ieee80211_reg_rule));
  2657. rd = kzalloc(size_of_regd, GFP_KERNEL);
  2658. if (!rd) {
  2659. r = -ENOMEM;
  2660. goto bad_reg;
  2661. }
  2662. rd->n_reg_rules = num_rules;
  2663. rd->alpha2[0] = alpha2[0];
  2664. rd->alpha2[1] = alpha2[1];
  2665. nla_for_each_nested(nl_reg_rule, info->attrs[NL80211_ATTR_REG_RULES],
  2666. rem_reg_rules) {
  2667. nla_parse(tb, NL80211_REG_RULE_ATTR_MAX,
  2668. nla_data(nl_reg_rule), nla_len(nl_reg_rule),
  2669. reg_rule_policy);
  2670. r = parse_reg_rule(tb, &rd->reg_rules[rule_idx]);
  2671. if (r)
  2672. goto bad_reg;
  2673. rule_idx++;
  2674. if (rule_idx > NL80211_MAX_SUPP_REG_RULES) {
  2675. r = -EINVAL;
  2676. goto bad_reg;
  2677. }
  2678. }
  2679. BUG_ON(rule_idx != num_rules);
  2680. r = set_regdom(rd);
  2681. mutex_unlock(&cfg80211_mutex);
  2682. return r;
  2683. bad_reg:
  2684. mutex_unlock(&cfg80211_mutex);
  2685. kfree(rd);
  2686. return r;
  2687. }
  2688. static int validate_scan_freqs(struct nlattr *freqs)
  2689. {
  2690. struct nlattr *attr1, *attr2;
  2691. int n_channels = 0, tmp1, tmp2;
  2692. nla_for_each_nested(attr1, freqs, tmp1) {
  2693. n_channels++;
  2694. /*
  2695. * Some hardware has a limited channel list for
  2696. * scanning, and it is pretty much nonsensical
  2697. * to scan for a channel twice, so disallow that
  2698. * and don't require drivers to check that the
  2699. * channel list they get isn't longer than what
  2700. * they can scan, as long as they can scan all
  2701. * the channels they registered at once.
  2702. */
  2703. nla_for_each_nested(attr2, freqs, tmp2)
  2704. if (attr1 != attr2 &&
  2705. nla_get_u32(attr1) == nla_get_u32(attr2))
  2706. return 0;
  2707. }
  2708. return n_channels;
  2709. }
  2710. static int nl80211_trigger_scan(struct sk_buff *skb, struct genl_info *info)
  2711. {
  2712. struct cfg80211_registered_device *rdev = info->user_ptr[0];
  2713. struct net_device *dev = info->user_ptr[1];
  2714. struct cfg80211_scan_request *request;
  2715. struct nlattr *attr;
  2716. struct wiphy *wiphy;
  2717. int err, tmp, n_ssids = 0, n_channels, i;
  2718. enum ieee80211_band band;
  2719. size_t ie_len;
  2720. if (!is_valid_ie_attr(info->attrs[NL80211_ATTR_IE]))
  2721. return -EINVAL;
  2722. wiphy = &rdev->wiphy;
  2723. if (!rdev->ops->scan)
  2724. return -EOPNOTSUPP;
  2725. if (rdev->scan_req)
  2726. return -EBUSY;
  2727. if (info->attrs[NL80211_ATTR_SCAN_FREQUENCIES]) {
  2728. n_channels = validate_scan_freqs(
  2729. info->attrs[NL80211_ATTR_SCAN_FREQUENCIES]);
  2730. if (!n_channels)
  2731. return -EINVAL;
  2732. } else {
  2733. n_channels = 0;
  2734. for (band = 0; band < IEEE80211_NUM_BANDS; band++)
  2735. if (wiphy->bands[band])
  2736. n_channels += wiphy->bands[band]->n_channels;
  2737. }
  2738. if (info->attrs[NL80211_ATTR_SCAN_SSIDS])
  2739. nla_for_each_nested(attr, info->attrs[NL80211_ATTR_SCAN_SSIDS], tmp)
  2740. n_ssids++;
  2741. if (n_ssids > wiphy->max_scan_ssids)
  2742. return -EINVAL;
  2743. if (info->attrs[NL80211_ATTR_IE])
  2744. ie_len = nla_len(info->attrs[NL80211_ATTR_IE]);
  2745. else
  2746. ie_len = 0;
  2747. if (ie_len > wiphy->max_scan_ie_len)
  2748. return -EINVAL;
  2749. request = kzalloc(sizeof(*request)
  2750. + sizeof(*request->ssids) * n_ssids
  2751. + sizeof(*request->channels) * n_channels
  2752. + ie_len, GFP_KERNEL);
  2753. if (!request)
  2754. return -ENOMEM;
  2755. if (n_ssids)
  2756. request->ssids = (void *)&request->channels[n_channels];
  2757. request->n_ssids = n_ssids;
  2758. if (ie_len) {
  2759. if (request->ssids)
  2760. request->ie = (void *)(request->ssids + n_ssids);
  2761. else
  2762. request->ie = (void *)(request->channels + n_channels);
  2763. }
  2764. i = 0;
  2765. if (info->attrs[NL80211_ATTR_SCAN_FREQUENCIES]) {
  2766. /* user specified, bail out if channel not found */
  2767. nla_for_each_nested(attr, info->attrs[NL80211_ATTR_SCAN_FREQUENCIES], tmp) {
  2768. struct ieee80211_channel *chan;
  2769. chan = ieee80211_get_channel(wiphy, nla_get_u32(attr));
  2770. if (!chan) {
  2771. err = -EINVAL;
  2772. goto out_free;
  2773. }
  2774. /* ignore disabled channels */
  2775. if (chan->flags & IEEE80211_CHAN_DISABLED)
  2776. continue;
  2777. request->channels[i] = chan;
  2778. i++;
  2779. }
  2780. } else {
  2781. /* all channels */
  2782. for (band = 0; band < IEEE80211_NUM_BANDS; band++) {
  2783. int j;
  2784. if (!wiphy->bands[band])
  2785. continue;
  2786. for (j = 0; j < wiphy->bands[band]->n_channels; j++) {
  2787. struct ieee80211_channel *chan;
  2788. chan = &wiphy->bands[band]->channels[j];
  2789. if (chan->flags & IEEE80211_CHAN_DISABLED)
  2790. continue;
  2791. request->channels[i] = chan;
  2792. i++;
  2793. }
  2794. }
  2795. }
  2796. if (!i) {
  2797. err = -EINVAL;
  2798. goto out_free;
  2799. }
  2800. request->n_channels = i;
  2801. i = 0;
  2802. if (info->attrs[NL80211_ATTR_SCAN_SSIDS]) {
  2803. nla_for_each_nested(attr, info->attrs[NL80211_ATTR_SCAN_SSIDS], tmp) {
  2804. if (nla_len(attr) > IEEE80211_MAX_SSID_LEN) {
  2805. err = -EINVAL;
  2806. goto out_free;
  2807. }
  2808. request->ssids[i].ssid_len = nla_len(attr);
  2809. memcpy(request->ssids[i].ssid, nla_data(attr), nla_len(attr));
  2810. i++;
  2811. }
  2812. }
  2813. if (info->attrs[NL80211_ATTR_IE]) {
  2814. request->ie_len = nla_len(info->attrs[NL80211_ATTR_IE]);
  2815. memcpy((void *)request->ie,
  2816. nla_data(info->attrs[NL80211_ATTR_IE]),
  2817. request->ie_len);
  2818. }
  2819. request->dev = dev;
  2820. request->wiphy = &rdev->wiphy;
  2821. rdev->scan_req = request;
  2822. err = rdev->ops->scan(&rdev->wiphy, dev, request);
  2823. if (!err) {
  2824. nl80211_send_scan_start(rdev, dev);
  2825. dev_hold(dev);
  2826. } else {
  2827. out_free:
  2828. rdev->scan_req = NULL;
  2829. kfree(request);
  2830. }
  2831. return err;
  2832. }
  2833. static int nl80211_start_sched_scan(struct sk_buff *skb,
  2834. struct genl_info *info)
  2835. {
  2836. struct cfg80211_sched_scan_request *request;
  2837. struct cfg80211_registered_device *rdev = info->user_ptr[0];
  2838. struct net_device *dev = info->user_ptr[1];
  2839. struct nlattr *attr;
  2840. struct wiphy *wiphy;
  2841. int err, tmp, n_ssids = 0, n_channels, i;
  2842. u32 interval;
  2843. enum ieee80211_band band;
  2844. size_t ie_len;
  2845. if (!(rdev->wiphy.flags & WIPHY_FLAG_SUPPORTS_SCHED_SCAN) ||
  2846. !rdev->ops->sched_scan_start)
  2847. return -EOPNOTSUPP;
  2848. if (!is_valid_ie_attr(info->attrs[NL80211_ATTR_IE]))
  2849. return -EINVAL;
  2850. if (!info->attrs[NL80211_ATTR_SCHED_SCAN_INTERVAL])
  2851. return -EINVAL;
  2852. interval = nla_get_u32(info->attrs[NL80211_ATTR_SCHED_SCAN_INTERVAL]);
  2853. if (interval == 0)
  2854. return -EINVAL;
  2855. wiphy = &rdev->wiphy;
  2856. if (info->attrs[NL80211_ATTR_SCAN_FREQUENCIES]) {
  2857. n_channels = validate_scan_freqs(
  2858. info->attrs[NL80211_ATTR_SCAN_FREQUENCIES]);
  2859. if (!n_channels)
  2860. return -EINVAL;
  2861. } else {
  2862. n_channels = 0;
  2863. for (band = 0; band < IEEE80211_NUM_BANDS; band++)
  2864. if (wiphy->bands[band])
  2865. n_channels += wiphy->bands[band]->n_channels;
  2866. }
  2867. if (info->attrs[NL80211_ATTR_SCAN_SSIDS])
  2868. nla_for_each_nested(attr, info->attrs[NL80211_ATTR_SCAN_SSIDS],
  2869. tmp)
  2870. n_ssids++;
  2871. if (n_ssids > wiphy->max_scan_ssids)
  2872. return -EINVAL;
  2873. if (info->attrs[NL80211_ATTR_IE])
  2874. ie_len = nla_len(info->attrs[NL80211_ATTR_IE]);
  2875. else
  2876. ie_len = 0;
  2877. if (ie_len > wiphy->max_scan_ie_len)
  2878. return -EINVAL;
  2879. mutex_lock(&rdev->sched_scan_mtx);
  2880. if (rdev->sched_scan_req) {
  2881. err = -EINPROGRESS;
  2882. goto out;
  2883. }
  2884. request = kzalloc(sizeof(*request)
  2885. + sizeof(*request->ssids) * n_ssids
  2886. + sizeof(*request->channels) * n_channels
  2887. + ie_len, GFP_KERNEL);
  2888. if (!request) {
  2889. err = -ENOMEM;
  2890. goto out;
  2891. }
  2892. if (n_ssids)
  2893. request->ssids = (void *)&request->channels[n_channels];
  2894. request->n_ssids = n_ssids;
  2895. if (ie_len) {
  2896. if (request->ssids)
  2897. request->ie = (void *)(request->ssids + n_ssids);
  2898. else
  2899. request->ie = (void *)(request->channels + n_channels);
  2900. }
  2901. i = 0;
  2902. if (info->attrs[NL80211_ATTR_SCAN_FREQUENCIES]) {
  2903. /* user specified, bail out if channel not found */
  2904. nla_for_each_nested(attr,
  2905. info->attrs[NL80211_ATTR_SCAN_FREQUENCIES],
  2906. tmp) {
  2907. struct ieee80211_channel *chan;
  2908. chan = ieee80211_get_channel(wiphy, nla_get_u32(attr));
  2909. if (!chan) {
  2910. err = -EINVAL;
  2911. goto out_free;
  2912. }
  2913. /* ignore disabled channels */
  2914. if (chan->flags & IEEE80211_CHAN_DISABLED)
  2915. continue;
  2916. request->channels[i] = chan;
  2917. i++;
  2918. }
  2919. } else {
  2920. /* all channels */
  2921. for (band = 0; band < IEEE80211_NUM_BANDS; band++) {
  2922. int j;
  2923. if (!wiphy->bands[band])
  2924. continue;
  2925. for (j = 0; j < wiphy->bands[band]->n_channels; j++) {
  2926. struct ieee80211_channel *chan;
  2927. chan = &wiphy->bands[band]->channels[j];
  2928. if (chan->flags & IEEE80211_CHAN_DISABLED)
  2929. continue;
  2930. request->channels[i] = chan;
  2931. i++;
  2932. }
  2933. }
  2934. }
  2935. if (!i) {
  2936. err = -EINVAL;
  2937. goto out_free;
  2938. }
  2939. request->n_channels = i;
  2940. i = 0;
  2941. if (info->attrs[NL80211_ATTR_SCAN_SSIDS]) {
  2942. nla_for_each_nested(attr, info->attrs[NL80211_ATTR_SCAN_SSIDS],
  2943. tmp) {
  2944. if (nla_len(attr) > IEEE80211_MAX_SSID_LEN) {
  2945. err = -EINVAL;
  2946. goto out_free;
  2947. }
  2948. request->ssids[i].ssid_len = nla_len(attr);
  2949. memcpy(request->ssids[i].ssid, nla_data(attr),
  2950. nla_len(attr));
  2951. i++;
  2952. }
  2953. }
  2954. if (info->attrs[NL80211_ATTR_IE]) {
  2955. request->ie_len = nla_len(info->attrs[NL80211_ATTR_IE]);
  2956. memcpy((void *)request->ie,
  2957. nla_data(info->attrs[NL80211_ATTR_IE]),
  2958. request->ie_len);
  2959. }
  2960. request->dev = dev;
  2961. request->wiphy = &rdev->wiphy;
  2962. request->interval = interval;
  2963. err = rdev->ops->sched_scan_start(&rdev->wiphy, dev, request);
  2964. if (!err) {
  2965. rdev->sched_scan_req = request;
  2966. nl80211_send_sched_scan(rdev, dev,
  2967. NL80211_CMD_START_SCHED_SCAN);
  2968. goto out;
  2969. }
  2970. out_free:
  2971. kfree(request);
  2972. out:
  2973. mutex_unlock(&rdev->sched_scan_mtx);
  2974. return err;
  2975. }
  2976. static int nl80211_stop_sched_scan(struct sk_buff *skb,
  2977. struct genl_info *info)
  2978. {
  2979. struct cfg80211_registered_device *rdev = info->user_ptr[0];
  2980. int err;
  2981. if (!(rdev->wiphy.flags & WIPHY_FLAG_SUPPORTS_SCHED_SCAN) ||
  2982. !rdev->ops->sched_scan_stop)
  2983. return -EOPNOTSUPP;
  2984. mutex_lock(&rdev->sched_scan_mtx);
  2985. err = __cfg80211_stop_sched_scan(rdev, false);
  2986. mutex_unlock(&rdev->sched_scan_mtx);
  2987. return err;
  2988. }
  2989. static int nl80211_send_bss(struct sk_buff *msg, u32 pid, u32 seq, int flags,
  2990. struct cfg80211_registered_device *rdev,
  2991. struct wireless_dev *wdev,
  2992. struct cfg80211_internal_bss *intbss)
  2993. {
  2994. struct cfg80211_bss *res = &intbss->pub;
  2995. void *hdr;
  2996. struct nlattr *bss;
  2997. int i;
  2998. ASSERT_WDEV_LOCK(wdev);
  2999. hdr = nl80211hdr_put(msg, pid, seq, flags,
  3000. NL80211_CMD_NEW_SCAN_RESULTS);
  3001. if (!hdr)
  3002. return -1;
  3003. NLA_PUT_U32(msg, NL80211_ATTR_GENERATION, rdev->bss_generation);
  3004. NLA_PUT_U32(msg, NL80211_ATTR_IFINDEX, wdev->netdev->ifindex);
  3005. bss = nla_nest_start(msg, NL80211_ATTR_BSS);
  3006. if (!bss)
  3007. goto nla_put_failure;
  3008. if (!is_zero_ether_addr(res->bssid))
  3009. NLA_PUT(msg, NL80211_BSS_BSSID, ETH_ALEN, res->bssid);
  3010. if (res->information_elements && res->len_information_elements)
  3011. NLA_PUT(msg, NL80211_BSS_INFORMATION_ELEMENTS,
  3012. res->len_information_elements,
  3013. res->information_elements);
  3014. if (res->beacon_ies && res->len_beacon_ies &&
  3015. res->beacon_ies != res->information_elements)
  3016. NLA_PUT(msg, NL80211_BSS_BEACON_IES,
  3017. res->len_beacon_ies, res->beacon_ies);
  3018. if (res->tsf)
  3019. NLA_PUT_U64(msg, NL80211_BSS_TSF, res->tsf);
  3020. if (res->beacon_interval)
  3021. NLA_PUT_U16(msg, NL80211_BSS_BEACON_INTERVAL, res->beacon_interval);
  3022. NLA_PUT_U16(msg, NL80211_BSS_CAPABILITY, res->capability);
  3023. NLA_PUT_U32(msg, NL80211_BSS_FREQUENCY, res->channel->center_freq);
  3024. NLA_PUT_U32(msg, NL80211_BSS_SEEN_MS_AGO,
  3025. jiffies_to_msecs(jiffies - intbss->ts));
  3026. switch (rdev->wiphy.signal_type) {
  3027. case CFG80211_SIGNAL_TYPE_MBM:
  3028. NLA_PUT_U32(msg, NL80211_BSS_SIGNAL_MBM, res->signal);
  3029. break;
  3030. case CFG80211_SIGNAL_TYPE_UNSPEC:
  3031. NLA_PUT_U8(msg, NL80211_BSS_SIGNAL_UNSPEC, res->signal);
  3032. break;
  3033. default:
  3034. break;
  3035. }
  3036. switch (wdev->iftype) {
  3037. case NL80211_IFTYPE_P2P_CLIENT:
  3038. case NL80211_IFTYPE_STATION:
  3039. if (intbss == wdev->current_bss)
  3040. NLA_PUT_U32(msg, NL80211_BSS_STATUS,
  3041. NL80211_BSS_STATUS_ASSOCIATED);
  3042. else for (i = 0; i < MAX_AUTH_BSSES; i++) {
  3043. if (intbss != wdev->auth_bsses[i])
  3044. continue;
  3045. NLA_PUT_U32(msg, NL80211_BSS_STATUS,
  3046. NL80211_BSS_STATUS_AUTHENTICATED);
  3047. break;
  3048. }
  3049. break;
  3050. case NL80211_IFTYPE_ADHOC:
  3051. if (intbss == wdev->current_bss)
  3052. NLA_PUT_U32(msg, NL80211_BSS_STATUS,
  3053. NL80211_BSS_STATUS_IBSS_JOINED);
  3054. break;
  3055. default:
  3056. break;
  3057. }
  3058. nla_nest_end(msg, bss);
  3059. return genlmsg_end(msg, hdr);
  3060. nla_put_failure:
  3061. genlmsg_cancel(msg, hdr);
  3062. return -EMSGSIZE;
  3063. }
  3064. static int nl80211_dump_scan(struct sk_buff *skb,
  3065. struct netlink_callback *cb)
  3066. {
  3067. struct cfg80211_registered_device *rdev;
  3068. struct net_device *dev;
  3069. struct cfg80211_internal_bss *scan;
  3070. struct wireless_dev *wdev;
  3071. int start = cb->args[1], idx = 0;
  3072. int err;
  3073. err = nl80211_prepare_netdev_dump(skb, cb, &rdev, &dev);
  3074. if (err)
  3075. return err;
  3076. wdev = dev->ieee80211_ptr;
  3077. wdev_lock(wdev);
  3078. spin_lock_bh(&rdev->bss_lock);
  3079. cfg80211_bss_expire(rdev);
  3080. list_for_each_entry(scan, &rdev->bss_list, list) {
  3081. if (++idx <= start)
  3082. continue;
  3083. if (nl80211_send_bss(skb,
  3084. NETLINK_CB(cb->skb).pid,
  3085. cb->nlh->nlmsg_seq, NLM_F_MULTI,
  3086. rdev, wdev, scan) < 0) {
  3087. idx--;
  3088. break;
  3089. }
  3090. }
  3091. spin_unlock_bh(&rdev->bss_lock);
  3092. wdev_unlock(wdev);
  3093. cb->args[1] = idx;
  3094. nl80211_finish_netdev_dump(rdev);
  3095. return skb->len;
  3096. }
  3097. static int nl80211_send_survey(struct sk_buff *msg, u32 pid, u32 seq,
  3098. int flags, struct net_device *dev,
  3099. struct survey_info *survey)
  3100. {
  3101. void *hdr;
  3102. struct nlattr *infoattr;
  3103. /* Survey without a channel doesn't make sense */
  3104. if (!survey->channel)
  3105. return -EINVAL;
  3106. hdr = nl80211hdr_put(msg, pid, seq, flags,
  3107. NL80211_CMD_NEW_SURVEY_RESULTS);
  3108. if (!hdr)
  3109. return -ENOMEM;
  3110. NLA_PUT_U32(msg, NL80211_ATTR_IFINDEX, dev->ifindex);
  3111. infoattr = nla_nest_start(msg, NL80211_ATTR_SURVEY_INFO);
  3112. if (!infoattr)
  3113. goto nla_put_failure;
  3114. NLA_PUT_U32(msg, NL80211_SURVEY_INFO_FREQUENCY,
  3115. survey->channel->center_freq);
  3116. if (survey->filled & SURVEY_INFO_NOISE_DBM)
  3117. NLA_PUT_U8(msg, NL80211_SURVEY_INFO_NOISE,
  3118. survey->noise);
  3119. if (survey->filled & SURVEY_INFO_IN_USE)
  3120. NLA_PUT_FLAG(msg, NL80211_SURVEY_INFO_IN_USE);
  3121. if (survey->filled & SURVEY_INFO_CHANNEL_TIME)
  3122. NLA_PUT_U64(msg, NL80211_SURVEY_INFO_CHANNEL_TIME,
  3123. survey->channel_time);
  3124. if (survey->filled & SURVEY_INFO_CHANNEL_TIME_BUSY)
  3125. NLA_PUT_U64(msg, NL80211_SURVEY_INFO_CHANNEL_TIME_BUSY,
  3126. survey->channel_time_busy);
  3127. if (survey->filled & SURVEY_INFO_CHANNEL_TIME_EXT_BUSY)
  3128. NLA_PUT_U64(msg, NL80211_SURVEY_INFO_CHANNEL_TIME_EXT_BUSY,
  3129. survey->channel_time_ext_busy);
  3130. if (survey->filled & SURVEY_INFO_CHANNEL_TIME_RX)
  3131. NLA_PUT_U64(msg, NL80211_SURVEY_INFO_CHANNEL_TIME_RX,
  3132. survey->channel_time_rx);
  3133. if (survey->filled & SURVEY_INFO_CHANNEL_TIME_TX)
  3134. NLA_PUT_U64(msg, NL80211_SURVEY_INFO_CHANNEL_TIME_TX,
  3135. survey->channel_time_tx);
  3136. nla_nest_end(msg, infoattr);
  3137. return genlmsg_end(msg, hdr);
  3138. nla_put_failure:
  3139. genlmsg_cancel(msg, hdr);
  3140. return -EMSGSIZE;
  3141. }
  3142. static int nl80211_dump_survey(struct sk_buff *skb,
  3143. struct netlink_callback *cb)
  3144. {
  3145. struct survey_info survey;
  3146. struct cfg80211_registered_device *dev;
  3147. struct net_device *netdev;
  3148. int survey_idx = cb->args[1];
  3149. int res;
  3150. res = nl80211_prepare_netdev_dump(skb, cb, &dev, &netdev);
  3151. if (res)
  3152. return res;
  3153. if (!dev->ops->dump_survey) {
  3154. res = -EOPNOTSUPP;
  3155. goto out_err;
  3156. }
  3157. while (1) {
  3158. res = dev->ops->dump_survey(&dev->wiphy, netdev, survey_idx,
  3159. &survey);
  3160. if (res == -ENOENT)
  3161. break;
  3162. if (res)
  3163. goto out_err;
  3164. if (nl80211_send_survey(skb,
  3165. NETLINK_CB(cb->skb).pid,
  3166. cb->nlh->nlmsg_seq, NLM_F_MULTI,
  3167. netdev,
  3168. &survey) < 0)
  3169. goto out;
  3170. survey_idx++;
  3171. }
  3172. out:
  3173. cb->args[1] = survey_idx;
  3174. res = skb->len;
  3175. out_err:
  3176. nl80211_finish_netdev_dump(dev);
  3177. return res;
  3178. }
  3179. static bool nl80211_valid_auth_type(enum nl80211_auth_type auth_type)
  3180. {
  3181. return auth_type <= NL80211_AUTHTYPE_MAX;
  3182. }
  3183. static bool nl80211_valid_wpa_versions(u32 wpa_versions)
  3184. {
  3185. return !(wpa_versions & ~(NL80211_WPA_VERSION_1 |
  3186. NL80211_WPA_VERSION_2));
  3187. }
  3188. static bool nl80211_valid_akm_suite(u32 akm)
  3189. {
  3190. return akm == WLAN_AKM_SUITE_8021X ||
  3191. akm == WLAN_AKM_SUITE_PSK;
  3192. }
  3193. static bool nl80211_valid_cipher_suite(u32 cipher)
  3194. {
  3195. return cipher == WLAN_CIPHER_SUITE_WEP40 ||
  3196. cipher == WLAN_CIPHER_SUITE_WEP104 ||
  3197. cipher == WLAN_CIPHER_SUITE_TKIP ||
  3198. cipher == WLAN_CIPHER_SUITE_CCMP ||
  3199. cipher == WLAN_CIPHER_SUITE_AES_CMAC;
  3200. }
  3201. static int nl80211_authenticate(struct sk_buff *skb, struct genl_info *info)
  3202. {
  3203. struct cfg80211_registered_device *rdev = info->user_ptr[0];
  3204. struct net_device *dev = info->user_ptr[1];
  3205. struct ieee80211_channel *chan;
  3206. const u8 *bssid, *ssid, *ie = NULL;
  3207. int err, ssid_len, ie_len = 0;
  3208. enum nl80211_auth_type auth_type;
  3209. struct key_parse key;
  3210. bool local_state_change;
  3211. if (!is_valid_ie_attr(info->attrs[NL80211_ATTR_IE]))
  3212. return -EINVAL;
  3213. if (!info->attrs[NL80211_ATTR_MAC])
  3214. return -EINVAL;
  3215. if (!info->attrs[NL80211_ATTR_AUTH_TYPE])
  3216. return -EINVAL;
  3217. if (!info->attrs[NL80211_ATTR_SSID])
  3218. return -EINVAL;
  3219. if (!info->attrs[NL80211_ATTR_WIPHY_FREQ])
  3220. return -EINVAL;
  3221. err = nl80211_parse_key(info, &key);
  3222. if (err)
  3223. return err;
  3224. if (key.idx >= 0) {
  3225. if (key.type != -1 && key.type != NL80211_KEYTYPE_GROUP)
  3226. return -EINVAL;
  3227. if (!key.p.key || !key.p.key_len)
  3228. return -EINVAL;
  3229. if ((key.p.cipher != WLAN_CIPHER_SUITE_WEP40 ||
  3230. key.p.key_len != WLAN_KEY_LEN_WEP40) &&
  3231. (key.p.cipher != WLAN_CIPHER_SUITE_WEP104 ||
  3232. key.p.key_len != WLAN_KEY_LEN_WEP104))
  3233. return -EINVAL;
  3234. if (key.idx > 4)
  3235. return -EINVAL;
  3236. } else {
  3237. key.p.key_len = 0;
  3238. key.p.key = NULL;
  3239. }
  3240. if (key.idx >= 0) {
  3241. int i;
  3242. bool ok = false;
  3243. for (i = 0; i < rdev->wiphy.n_cipher_suites; i++) {
  3244. if (key.p.cipher == rdev->wiphy.cipher_suites[i]) {
  3245. ok = true;
  3246. break;
  3247. }
  3248. }
  3249. if (!ok)
  3250. return -EINVAL;
  3251. }
  3252. if (!rdev->ops->auth)
  3253. return -EOPNOTSUPP;
  3254. if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_STATION &&
  3255. dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_CLIENT)
  3256. return -EOPNOTSUPP;
  3257. bssid = nla_data(info->attrs[NL80211_ATTR_MAC]);
  3258. chan = ieee80211_get_channel(&rdev->wiphy,
  3259. nla_get_u32(info->attrs[NL80211_ATTR_WIPHY_FREQ]));
  3260. if (!chan || (chan->flags & IEEE80211_CHAN_DISABLED))
  3261. return -EINVAL;
  3262. ssid = nla_data(info->attrs[NL80211_ATTR_SSID]);
  3263. ssid_len = nla_len(info->attrs[NL80211_ATTR_SSID]);
  3264. if (info->attrs[NL80211_ATTR_IE]) {
  3265. ie = nla_data(info->attrs[NL80211_ATTR_IE]);
  3266. ie_len = nla_len(info->attrs[NL80211_ATTR_IE]);
  3267. }
  3268. auth_type = nla_get_u32(info->attrs[NL80211_ATTR_AUTH_TYPE]);
  3269. if (!nl80211_valid_auth_type(auth_type))
  3270. return -EINVAL;
  3271. local_state_change = !!info->attrs[NL80211_ATTR_LOCAL_STATE_CHANGE];
  3272. return cfg80211_mlme_auth(rdev, dev, chan, auth_type, bssid,
  3273. ssid, ssid_len, ie, ie_len,
  3274. key.p.key, key.p.key_len, key.idx,
  3275. local_state_change);
  3276. }
  3277. static int nl80211_crypto_settings(struct cfg80211_registered_device *rdev,
  3278. struct genl_info *info,
  3279. struct cfg80211_crypto_settings *settings,
  3280. int cipher_limit)
  3281. {
  3282. memset(settings, 0, sizeof(*settings));
  3283. settings->control_port = info->attrs[NL80211_ATTR_CONTROL_PORT];
  3284. if (info->attrs[NL80211_ATTR_CONTROL_PORT_ETHERTYPE]) {
  3285. u16 proto;
  3286. proto = nla_get_u16(
  3287. info->attrs[NL80211_ATTR_CONTROL_PORT_ETHERTYPE]);
  3288. settings->control_port_ethertype = cpu_to_be16(proto);
  3289. if (!(rdev->wiphy.flags & WIPHY_FLAG_CONTROL_PORT_PROTOCOL) &&
  3290. proto != ETH_P_PAE)
  3291. return -EINVAL;
  3292. if (info->attrs[NL80211_ATTR_CONTROL_PORT_NO_ENCRYPT])
  3293. settings->control_port_no_encrypt = true;
  3294. } else
  3295. settings->control_port_ethertype = cpu_to_be16(ETH_P_PAE);
  3296. if (info->attrs[NL80211_ATTR_CIPHER_SUITES_PAIRWISE]) {
  3297. void *data;
  3298. int len, i;
  3299. data = nla_data(info->attrs[NL80211_ATTR_CIPHER_SUITES_PAIRWISE]);
  3300. len = nla_len(info->attrs[NL80211_ATTR_CIPHER_SUITES_PAIRWISE]);
  3301. settings->n_ciphers_pairwise = len / sizeof(u32);
  3302. if (len % sizeof(u32))
  3303. return -EINVAL;
  3304. if (settings->n_ciphers_pairwise > cipher_limit)
  3305. return -EINVAL;
  3306. memcpy(settings->ciphers_pairwise, data, len);
  3307. for (i = 0; i < settings->n_ciphers_pairwise; i++)
  3308. if (!nl80211_valid_cipher_suite(
  3309. settings->ciphers_pairwise[i]))
  3310. return -EINVAL;
  3311. }
  3312. if (info->attrs[NL80211_ATTR_CIPHER_SUITE_GROUP]) {
  3313. settings->cipher_group =
  3314. nla_get_u32(info->attrs[NL80211_ATTR_CIPHER_SUITE_GROUP]);
  3315. if (!nl80211_valid_cipher_suite(settings->cipher_group))
  3316. return -EINVAL;
  3317. }
  3318. if (info->attrs[NL80211_ATTR_WPA_VERSIONS]) {
  3319. settings->wpa_versions =
  3320. nla_get_u32(info->attrs[NL80211_ATTR_WPA_VERSIONS]);
  3321. if (!nl80211_valid_wpa_versions(settings->wpa_versions))
  3322. return -EINVAL;
  3323. }
  3324. if (info->attrs[NL80211_ATTR_AKM_SUITES]) {
  3325. void *data;
  3326. int len, i;
  3327. data = nla_data(info->attrs[NL80211_ATTR_AKM_SUITES]);
  3328. len = nla_len(info->attrs[NL80211_ATTR_AKM_SUITES]);
  3329. settings->n_akm_suites = len / sizeof(u32);
  3330. if (len % sizeof(u32))
  3331. return -EINVAL;
  3332. if (settings->n_akm_suites > NL80211_MAX_NR_AKM_SUITES)
  3333. return -EINVAL;
  3334. memcpy(settings->akm_suites, data, len);
  3335. for (i = 0; i < settings->n_akm_suites; i++)
  3336. if (!nl80211_valid_akm_suite(settings->akm_suites[i]))
  3337. return -EINVAL;
  3338. }
  3339. return 0;
  3340. }
  3341. static int nl80211_associate(struct sk_buff *skb, struct genl_info *info)
  3342. {
  3343. struct cfg80211_registered_device *rdev = info->user_ptr[0];
  3344. struct net_device *dev = info->user_ptr[1];
  3345. struct cfg80211_crypto_settings crypto;
  3346. struct ieee80211_channel *chan;
  3347. const u8 *bssid, *ssid, *ie = NULL, *prev_bssid = NULL;
  3348. int err, ssid_len, ie_len = 0;
  3349. bool use_mfp = false;
  3350. if (!is_valid_ie_attr(info->attrs[NL80211_ATTR_IE]))
  3351. return -EINVAL;
  3352. if (!info->attrs[NL80211_ATTR_MAC] ||
  3353. !info->attrs[NL80211_ATTR_SSID] ||
  3354. !info->attrs[NL80211_ATTR_WIPHY_FREQ])
  3355. return -EINVAL;
  3356. if (!rdev->ops->assoc)
  3357. return -EOPNOTSUPP;
  3358. if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_STATION &&
  3359. dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_CLIENT)
  3360. return -EOPNOTSUPP;
  3361. bssid = nla_data(info->attrs[NL80211_ATTR_MAC]);
  3362. chan = ieee80211_get_channel(&rdev->wiphy,
  3363. nla_get_u32(info->attrs[NL80211_ATTR_WIPHY_FREQ]));
  3364. if (!chan || (chan->flags & IEEE80211_CHAN_DISABLED))
  3365. return -EINVAL;
  3366. ssid = nla_data(info->attrs[NL80211_ATTR_SSID]);
  3367. ssid_len = nla_len(info->attrs[NL80211_ATTR_SSID]);
  3368. if (info->attrs[NL80211_ATTR_IE]) {
  3369. ie = nla_data(info->attrs[NL80211_ATTR_IE]);
  3370. ie_len = nla_len(info->attrs[NL80211_ATTR_IE]);
  3371. }
  3372. if (info->attrs[NL80211_ATTR_USE_MFP]) {
  3373. enum nl80211_mfp mfp =
  3374. nla_get_u32(info->attrs[NL80211_ATTR_USE_MFP]);
  3375. if (mfp == NL80211_MFP_REQUIRED)
  3376. use_mfp = true;
  3377. else if (mfp != NL80211_MFP_NO)
  3378. return -EINVAL;
  3379. }
  3380. if (info->attrs[NL80211_ATTR_PREV_BSSID])
  3381. prev_bssid = nla_data(info->attrs[NL80211_ATTR_PREV_BSSID]);
  3382. err = nl80211_crypto_settings(rdev, info, &crypto, 1);
  3383. if (!err)
  3384. err = cfg80211_mlme_assoc(rdev, dev, chan, bssid, prev_bssid,
  3385. ssid, ssid_len, ie, ie_len, use_mfp,
  3386. &crypto);
  3387. return err;
  3388. }
  3389. static int nl80211_deauthenticate(struct sk_buff *skb, struct genl_info *info)
  3390. {
  3391. struct cfg80211_registered_device *rdev = info->user_ptr[0];
  3392. struct net_device *dev = info->user_ptr[1];
  3393. const u8 *ie = NULL, *bssid;
  3394. int ie_len = 0;
  3395. u16 reason_code;
  3396. bool local_state_change;
  3397. if (!is_valid_ie_attr(info->attrs[NL80211_ATTR_IE]))
  3398. return -EINVAL;
  3399. if (!info->attrs[NL80211_ATTR_MAC])
  3400. return -EINVAL;
  3401. if (!info->attrs[NL80211_ATTR_REASON_CODE])
  3402. return -EINVAL;
  3403. if (!rdev->ops->deauth)
  3404. return -EOPNOTSUPP;
  3405. if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_STATION &&
  3406. dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_CLIENT)
  3407. return -EOPNOTSUPP;
  3408. bssid = nla_data(info->attrs[NL80211_ATTR_MAC]);
  3409. reason_code = nla_get_u16(info->attrs[NL80211_ATTR_REASON_CODE]);
  3410. if (reason_code == 0) {
  3411. /* Reason Code 0 is reserved */
  3412. return -EINVAL;
  3413. }
  3414. if (info->attrs[NL80211_ATTR_IE]) {
  3415. ie = nla_data(info->attrs[NL80211_ATTR_IE]);
  3416. ie_len = nla_len(info->attrs[NL80211_ATTR_IE]);
  3417. }
  3418. local_state_change = !!info->attrs[NL80211_ATTR_LOCAL_STATE_CHANGE];
  3419. return cfg80211_mlme_deauth(rdev, dev, bssid, ie, ie_len, reason_code,
  3420. local_state_change);
  3421. }
  3422. static int nl80211_disassociate(struct sk_buff *skb, struct genl_info *info)
  3423. {
  3424. struct cfg80211_registered_device *rdev = info->user_ptr[0];
  3425. struct net_device *dev = info->user_ptr[1];
  3426. const u8 *ie = NULL, *bssid;
  3427. int ie_len = 0;
  3428. u16 reason_code;
  3429. bool local_state_change;
  3430. if (!is_valid_ie_attr(info->attrs[NL80211_ATTR_IE]))
  3431. return -EINVAL;
  3432. if (!info->attrs[NL80211_ATTR_MAC])
  3433. return -EINVAL;
  3434. if (!info->attrs[NL80211_ATTR_REASON_CODE])
  3435. return -EINVAL;
  3436. if (!rdev->ops->disassoc)
  3437. return -EOPNOTSUPP;
  3438. if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_STATION &&
  3439. dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_CLIENT)
  3440. return -EOPNOTSUPP;
  3441. bssid = nla_data(info->attrs[NL80211_ATTR_MAC]);
  3442. reason_code = nla_get_u16(info->attrs[NL80211_ATTR_REASON_CODE]);
  3443. if (reason_code == 0) {
  3444. /* Reason Code 0 is reserved */
  3445. return -EINVAL;
  3446. }
  3447. if (info->attrs[NL80211_ATTR_IE]) {
  3448. ie = nla_data(info->attrs[NL80211_ATTR_IE]);
  3449. ie_len = nla_len(info->attrs[NL80211_ATTR_IE]);
  3450. }
  3451. local_state_change = !!info->attrs[NL80211_ATTR_LOCAL_STATE_CHANGE];
  3452. return cfg80211_mlme_disassoc(rdev, dev, bssid, ie, ie_len, reason_code,
  3453. local_state_change);
  3454. }
  3455. static bool
  3456. nl80211_parse_mcast_rate(struct cfg80211_registered_device *rdev,
  3457. int mcast_rate[IEEE80211_NUM_BANDS],
  3458. int rateval)
  3459. {
  3460. struct wiphy *wiphy = &rdev->wiphy;
  3461. bool found = false;
  3462. int band, i;
  3463. for (band = 0; band < IEEE80211_NUM_BANDS; band++) {
  3464. struct ieee80211_supported_band *sband;
  3465. sband = wiphy->bands[band];
  3466. if (!sband)
  3467. continue;
  3468. for (i = 0; i < sband->n_bitrates; i++) {
  3469. if (sband->bitrates[i].bitrate == rateval) {
  3470. mcast_rate[band] = i + 1;
  3471. found = true;
  3472. break;
  3473. }
  3474. }
  3475. }
  3476. return found;
  3477. }
  3478. static int nl80211_join_ibss(struct sk_buff *skb, struct genl_info *info)
  3479. {
  3480. struct cfg80211_registered_device *rdev = info->user_ptr[0];
  3481. struct net_device *dev = info->user_ptr[1];
  3482. struct cfg80211_ibss_params ibss;
  3483. struct wiphy *wiphy;
  3484. struct cfg80211_cached_keys *connkeys = NULL;
  3485. int err;
  3486. memset(&ibss, 0, sizeof(ibss));
  3487. if (!is_valid_ie_attr(info->attrs[NL80211_ATTR_IE]))
  3488. return -EINVAL;
  3489. if (!info->attrs[NL80211_ATTR_WIPHY_FREQ] ||
  3490. !info->attrs[NL80211_ATTR_SSID] ||
  3491. !nla_len(info->attrs[NL80211_ATTR_SSID]))
  3492. return -EINVAL;
  3493. ibss.beacon_interval = 100;
  3494. if (info->attrs[NL80211_ATTR_BEACON_INTERVAL]) {
  3495. ibss.beacon_interval =
  3496. nla_get_u32(info->attrs[NL80211_ATTR_BEACON_INTERVAL]);
  3497. if (ibss.beacon_interval < 1 || ibss.beacon_interval > 10000)
  3498. return -EINVAL;
  3499. }
  3500. if (!rdev->ops->join_ibss)
  3501. return -EOPNOTSUPP;
  3502. if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_ADHOC)
  3503. return -EOPNOTSUPP;
  3504. wiphy = &rdev->wiphy;
  3505. if (info->attrs[NL80211_ATTR_MAC])
  3506. ibss.bssid = nla_data(info->attrs[NL80211_ATTR_MAC]);
  3507. ibss.ssid = nla_data(info->attrs[NL80211_ATTR_SSID]);
  3508. ibss.ssid_len = nla_len(info->attrs[NL80211_ATTR_SSID]);
  3509. if (info->attrs[NL80211_ATTR_IE]) {
  3510. ibss.ie = nla_data(info->attrs[NL80211_ATTR_IE]);
  3511. ibss.ie_len = nla_len(info->attrs[NL80211_ATTR_IE]);
  3512. }
  3513. ibss.channel = ieee80211_get_channel(wiphy,
  3514. nla_get_u32(info->attrs[NL80211_ATTR_WIPHY_FREQ]));
  3515. if (!ibss.channel ||
  3516. ibss.channel->flags & IEEE80211_CHAN_NO_IBSS ||
  3517. ibss.channel->flags & IEEE80211_CHAN_DISABLED)
  3518. return -EINVAL;
  3519. ibss.channel_fixed = !!info->attrs[NL80211_ATTR_FREQ_FIXED];
  3520. ibss.privacy = !!info->attrs[NL80211_ATTR_PRIVACY];
  3521. if (info->attrs[NL80211_ATTR_BSS_BASIC_RATES]) {
  3522. u8 *rates =
  3523. nla_data(info->attrs[NL80211_ATTR_BSS_BASIC_RATES]);
  3524. int n_rates =
  3525. nla_len(info->attrs[NL80211_ATTR_BSS_BASIC_RATES]);
  3526. struct ieee80211_supported_band *sband =
  3527. wiphy->bands[ibss.channel->band];
  3528. int i, j;
  3529. if (n_rates == 0)
  3530. return -EINVAL;
  3531. for (i = 0; i < n_rates; i++) {
  3532. int rate = (rates[i] & 0x7f) * 5;
  3533. bool found = false;
  3534. for (j = 0; j < sband->n_bitrates; j++) {
  3535. if (sband->bitrates[j].bitrate == rate) {
  3536. found = true;
  3537. ibss.basic_rates |= BIT(j);
  3538. break;
  3539. }
  3540. }
  3541. if (!found)
  3542. return -EINVAL;
  3543. }
  3544. }
  3545. if (info->attrs[NL80211_ATTR_MCAST_RATE] &&
  3546. !nl80211_parse_mcast_rate(rdev, ibss.mcast_rate,
  3547. nla_get_u32(info->attrs[NL80211_ATTR_MCAST_RATE])))
  3548. return -EINVAL;
  3549. if (ibss.privacy && info->attrs[NL80211_ATTR_KEYS]) {
  3550. connkeys = nl80211_parse_connkeys(rdev,
  3551. info->attrs[NL80211_ATTR_KEYS]);
  3552. if (IS_ERR(connkeys))
  3553. return PTR_ERR(connkeys);
  3554. }
  3555. err = cfg80211_join_ibss(rdev, dev, &ibss, connkeys);
  3556. if (err)
  3557. kfree(connkeys);
  3558. return err;
  3559. }
  3560. static int nl80211_leave_ibss(struct sk_buff *skb, struct genl_info *info)
  3561. {
  3562. struct cfg80211_registered_device *rdev = info->user_ptr[0];
  3563. struct net_device *dev = info->user_ptr[1];
  3564. if (!rdev->ops->leave_ibss)
  3565. return -EOPNOTSUPP;
  3566. if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_ADHOC)
  3567. return -EOPNOTSUPP;
  3568. return cfg80211_leave_ibss(rdev, dev, false);
  3569. }
  3570. #ifdef CONFIG_NL80211_TESTMODE
  3571. static struct genl_multicast_group nl80211_testmode_mcgrp = {
  3572. .name = "testmode",
  3573. };
  3574. static int nl80211_testmode_do(struct sk_buff *skb, struct genl_info *info)
  3575. {
  3576. struct cfg80211_registered_device *rdev = info->user_ptr[0];
  3577. int err;
  3578. if (!info->attrs[NL80211_ATTR_TESTDATA])
  3579. return -EINVAL;
  3580. err = -EOPNOTSUPP;
  3581. if (rdev->ops->testmode_cmd) {
  3582. rdev->testmode_info = info;
  3583. err = rdev->ops->testmode_cmd(&rdev->wiphy,
  3584. nla_data(info->attrs[NL80211_ATTR_TESTDATA]),
  3585. nla_len(info->attrs[NL80211_ATTR_TESTDATA]));
  3586. rdev->testmode_info = NULL;
  3587. }
  3588. return err;
  3589. }
  3590. static struct sk_buff *
  3591. __cfg80211_testmode_alloc_skb(struct cfg80211_registered_device *rdev,
  3592. int approxlen, u32 pid, u32 seq, gfp_t gfp)
  3593. {
  3594. struct sk_buff *skb;
  3595. void *hdr;
  3596. struct nlattr *data;
  3597. skb = nlmsg_new(approxlen + 100, gfp);
  3598. if (!skb)
  3599. return NULL;
  3600. hdr = nl80211hdr_put(skb, pid, seq, 0, NL80211_CMD_TESTMODE);
  3601. if (!hdr) {
  3602. kfree_skb(skb);
  3603. return NULL;
  3604. }
  3605. NLA_PUT_U32(skb, NL80211_ATTR_WIPHY, rdev->wiphy_idx);
  3606. data = nla_nest_start(skb, NL80211_ATTR_TESTDATA);
  3607. ((void **)skb->cb)[0] = rdev;
  3608. ((void **)skb->cb)[1] = hdr;
  3609. ((void **)skb->cb)[2] = data;
  3610. return skb;
  3611. nla_put_failure:
  3612. kfree_skb(skb);
  3613. return NULL;
  3614. }
  3615. struct sk_buff *cfg80211_testmode_alloc_reply_skb(struct wiphy *wiphy,
  3616. int approxlen)
  3617. {
  3618. struct cfg80211_registered_device *rdev = wiphy_to_dev(wiphy);
  3619. if (WARN_ON(!rdev->testmode_info))
  3620. return NULL;
  3621. return __cfg80211_testmode_alloc_skb(rdev, approxlen,
  3622. rdev->testmode_info->snd_pid,
  3623. rdev->testmode_info->snd_seq,
  3624. GFP_KERNEL);
  3625. }
  3626. EXPORT_SYMBOL(cfg80211_testmode_alloc_reply_skb);
  3627. int cfg80211_testmode_reply(struct sk_buff *skb)
  3628. {
  3629. struct cfg80211_registered_device *rdev = ((void **)skb->cb)[0];
  3630. void *hdr = ((void **)skb->cb)[1];
  3631. struct nlattr *data = ((void **)skb->cb)[2];
  3632. if (WARN_ON(!rdev->testmode_info)) {
  3633. kfree_skb(skb);
  3634. return -EINVAL;
  3635. }
  3636. nla_nest_end(skb, data);
  3637. genlmsg_end(skb, hdr);
  3638. return genlmsg_reply(skb, rdev->testmode_info);
  3639. }
  3640. EXPORT_SYMBOL(cfg80211_testmode_reply);
  3641. struct sk_buff *cfg80211_testmode_alloc_event_skb(struct wiphy *wiphy,
  3642. int approxlen, gfp_t gfp)
  3643. {
  3644. struct cfg80211_registered_device *rdev = wiphy_to_dev(wiphy);
  3645. return __cfg80211_testmode_alloc_skb(rdev, approxlen, 0, 0, gfp);
  3646. }
  3647. EXPORT_SYMBOL(cfg80211_testmode_alloc_event_skb);
  3648. void cfg80211_testmode_event(struct sk_buff *skb, gfp_t gfp)
  3649. {
  3650. void *hdr = ((void **)skb->cb)[1];
  3651. struct nlattr *data = ((void **)skb->cb)[2];
  3652. nla_nest_end(skb, data);
  3653. genlmsg_end(skb, hdr);
  3654. genlmsg_multicast(skb, 0, nl80211_testmode_mcgrp.id, gfp);
  3655. }
  3656. EXPORT_SYMBOL(cfg80211_testmode_event);
  3657. #endif
  3658. static int nl80211_connect(struct sk_buff *skb, struct genl_info *info)
  3659. {
  3660. struct cfg80211_registered_device *rdev = info->user_ptr[0];
  3661. struct net_device *dev = info->user_ptr[1];
  3662. struct cfg80211_connect_params connect;
  3663. struct wiphy *wiphy;
  3664. struct cfg80211_cached_keys *connkeys = NULL;
  3665. int err;
  3666. memset(&connect, 0, sizeof(connect));
  3667. if (!is_valid_ie_attr(info->attrs[NL80211_ATTR_IE]))
  3668. return -EINVAL;
  3669. if (!info->attrs[NL80211_ATTR_SSID] ||
  3670. !nla_len(info->attrs[NL80211_ATTR_SSID]))
  3671. return -EINVAL;
  3672. if (info->attrs[NL80211_ATTR_AUTH_TYPE]) {
  3673. connect.auth_type =
  3674. nla_get_u32(info->attrs[NL80211_ATTR_AUTH_TYPE]);
  3675. if (!nl80211_valid_auth_type(connect.auth_type))
  3676. return -EINVAL;
  3677. } else
  3678. connect.auth_type = NL80211_AUTHTYPE_AUTOMATIC;
  3679. connect.privacy = info->attrs[NL80211_ATTR_PRIVACY];
  3680. err = nl80211_crypto_settings(rdev, info, &connect.crypto,
  3681. NL80211_MAX_NR_CIPHER_SUITES);
  3682. if (err)
  3683. return err;
  3684. if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_STATION &&
  3685. dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_CLIENT)
  3686. return -EOPNOTSUPP;
  3687. wiphy = &rdev->wiphy;
  3688. if (info->attrs[NL80211_ATTR_MAC])
  3689. connect.bssid = nla_data(info->attrs[NL80211_ATTR_MAC]);
  3690. connect.ssid = nla_data(info->attrs[NL80211_ATTR_SSID]);
  3691. connect.ssid_len = nla_len(info->attrs[NL80211_ATTR_SSID]);
  3692. if (info->attrs[NL80211_ATTR_IE]) {
  3693. connect.ie = nla_data(info->attrs[NL80211_ATTR_IE]);
  3694. connect.ie_len = nla_len(info->attrs[NL80211_ATTR_IE]);
  3695. }
  3696. if (info->attrs[NL80211_ATTR_WIPHY_FREQ]) {
  3697. connect.channel =
  3698. ieee80211_get_channel(wiphy,
  3699. nla_get_u32(info->attrs[NL80211_ATTR_WIPHY_FREQ]));
  3700. if (!connect.channel ||
  3701. connect.channel->flags & IEEE80211_CHAN_DISABLED)
  3702. return -EINVAL;
  3703. }
  3704. if (connect.privacy && info->attrs[NL80211_ATTR_KEYS]) {
  3705. connkeys = nl80211_parse_connkeys(rdev,
  3706. info->attrs[NL80211_ATTR_KEYS]);
  3707. if (IS_ERR(connkeys))
  3708. return PTR_ERR(connkeys);
  3709. }
  3710. err = cfg80211_connect(rdev, dev, &connect, connkeys);
  3711. if (err)
  3712. kfree(connkeys);
  3713. return err;
  3714. }
  3715. static int nl80211_disconnect(struct sk_buff *skb, struct genl_info *info)
  3716. {
  3717. struct cfg80211_registered_device *rdev = info->user_ptr[0];
  3718. struct net_device *dev = info->user_ptr[1];
  3719. u16 reason;
  3720. if (!info->attrs[NL80211_ATTR_REASON_CODE])
  3721. reason = WLAN_REASON_DEAUTH_LEAVING;
  3722. else
  3723. reason = nla_get_u16(info->attrs[NL80211_ATTR_REASON_CODE]);
  3724. if (reason == 0)
  3725. return -EINVAL;
  3726. if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_STATION &&
  3727. dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_CLIENT)
  3728. return -EOPNOTSUPP;
  3729. return cfg80211_disconnect(rdev, dev, reason, true);
  3730. }
  3731. static int nl80211_wiphy_netns(struct sk_buff *skb, struct genl_info *info)
  3732. {
  3733. struct cfg80211_registered_device *rdev = info->user_ptr[0];
  3734. struct net *net;
  3735. int err;
  3736. u32 pid;
  3737. if (!info->attrs[NL80211_ATTR_PID])
  3738. return -EINVAL;
  3739. pid = nla_get_u32(info->attrs[NL80211_ATTR_PID]);
  3740. net = get_net_ns_by_pid(pid);
  3741. if (IS_ERR(net))
  3742. return PTR_ERR(net);
  3743. err = 0;
  3744. /* check if anything to do */
  3745. if (!net_eq(wiphy_net(&rdev->wiphy), net))
  3746. err = cfg80211_switch_netns(rdev, net);
  3747. put_net(net);
  3748. return err;
  3749. }
  3750. static int nl80211_setdel_pmksa(struct sk_buff *skb, struct genl_info *info)
  3751. {
  3752. struct cfg80211_registered_device *rdev = info->user_ptr[0];
  3753. int (*rdev_ops)(struct wiphy *wiphy, struct net_device *dev,
  3754. struct cfg80211_pmksa *pmksa) = NULL;
  3755. struct net_device *dev = info->user_ptr[1];
  3756. struct cfg80211_pmksa pmksa;
  3757. memset(&pmksa, 0, sizeof(struct cfg80211_pmksa));
  3758. if (!info->attrs[NL80211_ATTR_MAC])
  3759. return -EINVAL;
  3760. if (!info->attrs[NL80211_ATTR_PMKID])
  3761. return -EINVAL;
  3762. pmksa.pmkid = nla_data(info->attrs[NL80211_ATTR_PMKID]);
  3763. pmksa.bssid = nla_data(info->attrs[NL80211_ATTR_MAC]);
  3764. if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_STATION &&
  3765. dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_CLIENT)
  3766. return -EOPNOTSUPP;
  3767. switch (info->genlhdr->cmd) {
  3768. case NL80211_CMD_SET_PMKSA:
  3769. rdev_ops = rdev->ops->set_pmksa;
  3770. break;
  3771. case NL80211_CMD_DEL_PMKSA:
  3772. rdev_ops = rdev->ops->del_pmksa;
  3773. break;
  3774. default:
  3775. WARN_ON(1);
  3776. break;
  3777. }
  3778. if (!rdev_ops)
  3779. return -EOPNOTSUPP;
  3780. return rdev_ops(&rdev->wiphy, dev, &pmksa);
  3781. }
  3782. static int nl80211_flush_pmksa(struct sk_buff *skb, struct genl_info *info)
  3783. {
  3784. struct cfg80211_registered_device *rdev = info->user_ptr[0];
  3785. struct net_device *dev = info->user_ptr[1];
  3786. if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_STATION &&
  3787. dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_CLIENT)
  3788. return -EOPNOTSUPP;
  3789. if (!rdev->ops->flush_pmksa)
  3790. return -EOPNOTSUPP;
  3791. return rdev->ops->flush_pmksa(&rdev->wiphy, dev);
  3792. }
  3793. static int nl80211_remain_on_channel(struct sk_buff *skb,
  3794. struct genl_info *info)
  3795. {
  3796. struct cfg80211_registered_device *rdev = info->user_ptr[0];
  3797. struct net_device *dev = info->user_ptr[1];
  3798. struct ieee80211_channel *chan;
  3799. struct sk_buff *msg;
  3800. void *hdr;
  3801. u64 cookie;
  3802. enum nl80211_channel_type channel_type = NL80211_CHAN_NO_HT;
  3803. u32 freq, duration;
  3804. int err;
  3805. if (!info->attrs[NL80211_ATTR_WIPHY_FREQ] ||
  3806. !info->attrs[NL80211_ATTR_DURATION])
  3807. return -EINVAL;
  3808. duration = nla_get_u32(info->attrs[NL80211_ATTR_DURATION]);
  3809. /*
  3810. * We should be on that channel for at least one jiffie,
  3811. * and more than 5 seconds seems excessive.
  3812. */
  3813. if (!duration || !msecs_to_jiffies(duration) ||
  3814. duration > rdev->wiphy.max_remain_on_channel_duration)
  3815. return -EINVAL;
  3816. if (!rdev->ops->remain_on_channel)
  3817. return -EOPNOTSUPP;
  3818. if (info->attrs[NL80211_ATTR_WIPHY_CHANNEL_TYPE]) {
  3819. channel_type = nla_get_u32(
  3820. info->attrs[NL80211_ATTR_WIPHY_CHANNEL_TYPE]);
  3821. if (channel_type != NL80211_CHAN_NO_HT &&
  3822. channel_type != NL80211_CHAN_HT20 &&
  3823. channel_type != NL80211_CHAN_HT40PLUS &&
  3824. channel_type != NL80211_CHAN_HT40MINUS)
  3825. return -EINVAL;
  3826. }
  3827. freq = nla_get_u32(info->attrs[NL80211_ATTR_WIPHY_FREQ]);
  3828. chan = rdev_freq_to_chan(rdev, freq, channel_type);
  3829. if (chan == NULL)
  3830. return -EINVAL;
  3831. msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
  3832. if (!msg)
  3833. return -ENOMEM;
  3834. hdr = nl80211hdr_put(msg, info->snd_pid, info->snd_seq, 0,
  3835. NL80211_CMD_REMAIN_ON_CHANNEL);
  3836. if (IS_ERR(hdr)) {
  3837. err = PTR_ERR(hdr);
  3838. goto free_msg;
  3839. }
  3840. err = rdev->ops->remain_on_channel(&rdev->wiphy, dev, chan,
  3841. channel_type, duration, &cookie);
  3842. if (err)
  3843. goto free_msg;
  3844. NLA_PUT_U64(msg, NL80211_ATTR_COOKIE, cookie);
  3845. genlmsg_end(msg, hdr);
  3846. return genlmsg_reply(msg, info);
  3847. nla_put_failure:
  3848. err = -ENOBUFS;
  3849. free_msg:
  3850. nlmsg_free(msg);
  3851. return err;
  3852. }
  3853. static int nl80211_cancel_remain_on_channel(struct sk_buff *skb,
  3854. struct genl_info *info)
  3855. {
  3856. struct cfg80211_registered_device *rdev = info->user_ptr[0];
  3857. struct net_device *dev = info->user_ptr[1];
  3858. u64 cookie;
  3859. if (!info->attrs[NL80211_ATTR_COOKIE])
  3860. return -EINVAL;
  3861. if (!rdev->ops->cancel_remain_on_channel)
  3862. return -EOPNOTSUPP;
  3863. cookie = nla_get_u64(info->attrs[NL80211_ATTR_COOKIE]);
  3864. return rdev->ops->cancel_remain_on_channel(&rdev->wiphy, dev, cookie);
  3865. }
  3866. static u32 rateset_to_mask(struct ieee80211_supported_band *sband,
  3867. u8 *rates, u8 rates_len)
  3868. {
  3869. u8 i;
  3870. u32 mask = 0;
  3871. for (i = 0; i < rates_len; i++) {
  3872. int rate = (rates[i] & 0x7f) * 5;
  3873. int ridx;
  3874. for (ridx = 0; ridx < sband->n_bitrates; ridx++) {
  3875. struct ieee80211_rate *srate =
  3876. &sband->bitrates[ridx];
  3877. if (rate == srate->bitrate) {
  3878. mask |= 1 << ridx;
  3879. break;
  3880. }
  3881. }
  3882. if (ridx == sband->n_bitrates)
  3883. return 0; /* rate not found */
  3884. }
  3885. return mask;
  3886. }
  3887. static const struct nla_policy nl80211_txattr_policy[NL80211_TXRATE_MAX + 1] = {
  3888. [NL80211_TXRATE_LEGACY] = { .type = NLA_BINARY,
  3889. .len = NL80211_MAX_SUPP_RATES },
  3890. };
  3891. static int nl80211_set_tx_bitrate_mask(struct sk_buff *skb,
  3892. struct genl_info *info)
  3893. {
  3894. struct nlattr *tb[NL80211_TXRATE_MAX + 1];
  3895. struct cfg80211_registered_device *rdev = info->user_ptr[0];
  3896. struct cfg80211_bitrate_mask mask;
  3897. int rem, i;
  3898. struct net_device *dev = info->user_ptr[1];
  3899. struct nlattr *tx_rates;
  3900. struct ieee80211_supported_band *sband;
  3901. if (info->attrs[NL80211_ATTR_TX_RATES] == NULL)
  3902. return -EINVAL;
  3903. if (!rdev->ops->set_bitrate_mask)
  3904. return -EOPNOTSUPP;
  3905. memset(&mask, 0, sizeof(mask));
  3906. /* Default to all rates enabled */
  3907. for (i = 0; i < IEEE80211_NUM_BANDS; i++) {
  3908. sband = rdev->wiphy.bands[i];
  3909. mask.control[i].legacy =
  3910. sband ? (1 << sband->n_bitrates) - 1 : 0;
  3911. }
  3912. /*
  3913. * The nested attribute uses enum nl80211_band as the index. This maps
  3914. * directly to the enum ieee80211_band values used in cfg80211.
  3915. */
  3916. nla_for_each_nested(tx_rates, info->attrs[NL80211_ATTR_TX_RATES], rem)
  3917. {
  3918. enum ieee80211_band band = nla_type(tx_rates);
  3919. if (band < 0 || band >= IEEE80211_NUM_BANDS)
  3920. return -EINVAL;
  3921. sband = rdev->wiphy.bands[band];
  3922. if (sband == NULL)
  3923. return -EINVAL;
  3924. nla_parse(tb, NL80211_TXRATE_MAX, nla_data(tx_rates),
  3925. nla_len(tx_rates), nl80211_txattr_policy);
  3926. if (tb[NL80211_TXRATE_LEGACY]) {
  3927. mask.control[band].legacy = rateset_to_mask(
  3928. sband,
  3929. nla_data(tb[NL80211_TXRATE_LEGACY]),
  3930. nla_len(tb[NL80211_TXRATE_LEGACY]));
  3931. if (mask.control[band].legacy == 0)
  3932. return -EINVAL;
  3933. }
  3934. }
  3935. return rdev->ops->set_bitrate_mask(&rdev->wiphy, dev, NULL, &mask);
  3936. }
  3937. static int nl80211_register_mgmt(struct sk_buff *skb, struct genl_info *info)
  3938. {
  3939. struct cfg80211_registered_device *rdev = info->user_ptr[0];
  3940. struct net_device *dev = info->user_ptr[1];
  3941. u16 frame_type = IEEE80211_FTYPE_MGMT | IEEE80211_STYPE_ACTION;
  3942. if (!info->attrs[NL80211_ATTR_FRAME_MATCH])
  3943. return -EINVAL;
  3944. if (info->attrs[NL80211_ATTR_FRAME_TYPE])
  3945. frame_type = nla_get_u16(info->attrs[NL80211_ATTR_FRAME_TYPE]);
  3946. if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_STATION &&
  3947. dev->ieee80211_ptr->iftype != NL80211_IFTYPE_ADHOC &&
  3948. dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_CLIENT &&
  3949. dev->ieee80211_ptr->iftype != NL80211_IFTYPE_AP &&
  3950. dev->ieee80211_ptr->iftype != NL80211_IFTYPE_AP_VLAN &&
  3951. dev->ieee80211_ptr->iftype != NL80211_IFTYPE_MESH_POINT &&
  3952. dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_GO)
  3953. return -EOPNOTSUPP;
  3954. /* not much point in registering if we can't reply */
  3955. if (!rdev->ops->mgmt_tx)
  3956. return -EOPNOTSUPP;
  3957. return cfg80211_mlme_register_mgmt(dev->ieee80211_ptr, info->snd_pid,
  3958. frame_type,
  3959. nla_data(info->attrs[NL80211_ATTR_FRAME_MATCH]),
  3960. nla_len(info->attrs[NL80211_ATTR_FRAME_MATCH]));
  3961. }
  3962. static int nl80211_tx_mgmt(struct sk_buff *skb, struct genl_info *info)
  3963. {
  3964. struct cfg80211_registered_device *rdev = info->user_ptr[0];
  3965. struct net_device *dev = info->user_ptr[1];
  3966. struct ieee80211_channel *chan;
  3967. enum nl80211_channel_type channel_type = NL80211_CHAN_NO_HT;
  3968. bool channel_type_valid = false;
  3969. u32 freq;
  3970. int err;
  3971. void *hdr;
  3972. u64 cookie;
  3973. struct sk_buff *msg;
  3974. unsigned int wait = 0;
  3975. bool offchan;
  3976. if (!info->attrs[NL80211_ATTR_FRAME] ||
  3977. !info->attrs[NL80211_ATTR_WIPHY_FREQ])
  3978. return -EINVAL;
  3979. if (!rdev->ops->mgmt_tx)
  3980. return -EOPNOTSUPP;
  3981. if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_STATION &&
  3982. dev->ieee80211_ptr->iftype != NL80211_IFTYPE_ADHOC &&
  3983. dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_CLIENT &&
  3984. dev->ieee80211_ptr->iftype != NL80211_IFTYPE_AP &&
  3985. dev->ieee80211_ptr->iftype != NL80211_IFTYPE_AP_VLAN &&
  3986. dev->ieee80211_ptr->iftype != NL80211_IFTYPE_MESH_POINT &&
  3987. dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_GO)
  3988. return -EOPNOTSUPP;
  3989. if (info->attrs[NL80211_ATTR_DURATION]) {
  3990. if (!rdev->ops->mgmt_tx_cancel_wait)
  3991. return -EINVAL;
  3992. wait = nla_get_u32(info->attrs[NL80211_ATTR_DURATION]);
  3993. }
  3994. if (info->attrs[NL80211_ATTR_WIPHY_CHANNEL_TYPE]) {
  3995. channel_type = nla_get_u32(
  3996. info->attrs[NL80211_ATTR_WIPHY_CHANNEL_TYPE]);
  3997. if (channel_type != NL80211_CHAN_NO_HT &&
  3998. channel_type != NL80211_CHAN_HT20 &&
  3999. channel_type != NL80211_CHAN_HT40PLUS &&
  4000. channel_type != NL80211_CHAN_HT40MINUS)
  4001. return -EINVAL;
  4002. channel_type_valid = true;
  4003. }
  4004. offchan = info->attrs[NL80211_ATTR_OFFCHANNEL_TX_OK];
  4005. freq = nla_get_u32(info->attrs[NL80211_ATTR_WIPHY_FREQ]);
  4006. chan = rdev_freq_to_chan(rdev, freq, channel_type);
  4007. if (chan == NULL)
  4008. return -EINVAL;
  4009. msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
  4010. if (!msg)
  4011. return -ENOMEM;
  4012. hdr = nl80211hdr_put(msg, info->snd_pid, info->snd_seq, 0,
  4013. NL80211_CMD_FRAME);
  4014. if (IS_ERR(hdr)) {
  4015. err = PTR_ERR(hdr);
  4016. goto free_msg;
  4017. }
  4018. err = cfg80211_mlme_mgmt_tx(rdev, dev, chan, offchan, channel_type,
  4019. channel_type_valid, wait,
  4020. nla_data(info->attrs[NL80211_ATTR_FRAME]),
  4021. nla_len(info->attrs[NL80211_ATTR_FRAME]),
  4022. &cookie);
  4023. if (err)
  4024. goto free_msg;
  4025. NLA_PUT_U64(msg, NL80211_ATTR_COOKIE, cookie);
  4026. genlmsg_end(msg, hdr);
  4027. return genlmsg_reply(msg, info);
  4028. nla_put_failure:
  4029. err = -ENOBUFS;
  4030. free_msg:
  4031. nlmsg_free(msg);
  4032. return err;
  4033. }
  4034. static int nl80211_tx_mgmt_cancel_wait(struct sk_buff *skb, struct genl_info *info)
  4035. {
  4036. struct cfg80211_registered_device *rdev = info->user_ptr[0];
  4037. struct net_device *dev = info->user_ptr[1];
  4038. u64 cookie;
  4039. if (!info->attrs[NL80211_ATTR_COOKIE])
  4040. return -EINVAL;
  4041. if (!rdev->ops->mgmt_tx_cancel_wait)
  4042. return -EOPNOTSUPP;
  4043. if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_STATION &&
  4044. dev->ieee80211_ptr->iftype != NL80211_IFTYPE_ADHOC &&
  4045. dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_CLIENT &&
  4046. dev->ieee80211_ptr->iftype != NL80211_IFTYPE_AP &&
  4047. dev->ieee80211_ptr->iftype != NL80211_IFTYPE_AP_VLAN &&
  4048. dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_GO)
  4049. return -EOPNOTSUPP;
  4050. cookie = nla_get_u64(info->attrs[NL80211_ATTR_COOKIE]);
  4051. return rdev->ops->mgmt_tx_cancel_wait(&rdev->wiphy, dev, cookie);
  4052. }
  4053. static int nl80211_set_power_save(struct sk_buff *skb, struct genl_info *info)
  4054. {
  4055. struct cfg80211_registered_device *rdev = info->user_ptr[0];
  4056. struct wireless_dev *wdev;
  4057. struct net_device *dev = info->user_ptr[1];
  4058. u8 ps_state;
  4059. bool state;
  4060. int err;
  4061. if (!info->attrs[NL80211_ATTR_PS_STATE])
  4062. return -EINVAL;
  4063. ps_state = nla_get_u32(info->attrs[NL80211_ATTR_PS_STATE]);
  4064. if (ps_state != NL80211_PS_DISABLED && ps_state != NL80211_PS_ENABLED)
  4065. return -EINVAL;
  4066. wdev = dev->ieee80211_ptr;
  4067. if (!rdev->ops->set_power_mgmt)
  4068. return -EOPNOTSUPP;
  4069. state = (ps_state == NL80211_PS_ENABLED) ? true : false;
  4070. if (state == wdev->ps)
  4071. return 0;
  4072. err = rdev->ops->set_power_mgmt(wdev->wiphy, dev, state,
  4073. wdev->ps_timeout);
  4074. if (!err)
  4075. wdev->ps = state;
  4076. return err;
  4077. }
  4078. static int nl80211_get_power_save(struct sk_buff *skb, struct genl_info *info)
  4079. {
  4080. struct cfg80211_registered_device *rdev = info->user_ptr[0];
  4081. enum nl80211_ps_state ps_state;
  4082. struct wireless_dev *wdev;
  4083. struct net_device *dev = info->user_ptr[1];
  4084. struct sk_buff *msg;
  4085. void *hdr;
  4086. int err;
  4087. wdev = dev->ieee80211_ptr;
  4088. if (!rdev->ops->set_power_mgmt)
  4089. return -EOPNOTSUPP;
  4090. msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
  4091. if (!msg)
  4092. return -ENOMEM;
  4093. hdr = nl80211hdr_put(msg, info->snd_pid, info->snd_seq, 0,
  4094. NL80211_CMD_GET_POWER_SAVE);
  4095. if (!hdr) {
  4096. err = -ENOBUFS;
  4097. goto free_msg;
  4098. }
  4099. if (wdev->ps)
  4100. ps_state = NL80211_PS_ENABLED;
  4101. else
  4102. ps_state = NL80211_PS_DISABLED;
  4103. NLA_PUT_U32(msg, NL80211_ATTR_PS_STATE, ps_state);
  4104. genlmsg_end(msg, hdr);
  4105. return genlmsg_reply(msg, info);
  4106. nla_put_failure:
  4107. err = -ENOBUFS;
  4108. free_msg:
  4109. nlmsg_free(msg);
  4110. return err;
  4111. }
  4112. static struct nla_policy
  4113. nl80211_attr_cqm_policy[NL80211_ATTR_CQM_MAX + 1] __read_mostly = {
  4114. [NL80211_ATTR_CQM_RSSI_THOLD] = { .type = NLA_U32 },
  4115. [NL80211_ATTR_CQM_RSSI_HYST] = { .type = NLA_U32 },
  4116. [NL80211_ATTR_CQM_RSSI_THRESHOLD_EVENT] = { .type = NLA_U32 },
  4117. };
  4118. static int nl80211_set_cqm_rssi(struct genl_info *info,
  4119. s32 threshold, u32 hysteresis)
  4120. {
  4121. struct cfg80211_registered_device *rdev = info->user_ptr[0];
  4122. struct wireless_dev *wdev;
  4123. struct net_device *dev = info->user_ptr[1];
  4124. if (threshold > 0)
  4125. return -EINVAL;
  4126. wdev = dev->ieee80211_ptr;
  4127. if (!rdev->ops->set_cqm_rssi_config)
  4128. return -EOPNOTSUPP;
  4129. if (wdev->iftype != NL80211_IFTYPE_STATION &&
  4130. wdev->iftype != NL80211_IFTYPE_P2P_CLIENT)
  4131. return -EOPNOTSUPP;
  4132. return rdev->ops->set_cqm_rssi_config(wdev->wiphy, dev,
  4133. threshold, hysteresis);
  4134. }
  4135. static int nl80211_set_cqm(struct sk_buff *skb, struct genl_info *info)
  4136. {
  4137. struct nlattr *attrs[NL80211_ATTR_CQM_MAX + 1];
  4138. struct nlattr *cqm;
  4139. int err;
  4140. cqm = info->attrs[NL80211_ATTR_CQM];
  4141. if (!cqm) {
  4142. err = -EINVAL;
  4143. goto out;
  4144. }
  4145. err = nla_parse_nested(attrs, NL80211_ATTR_CQM_MAX, cqm,
  4146. nl80211_attr_cqm_policy);
  4147. if (err)
  4148. goto out;
  4149. if (attrs[NL80211_ATTR_CQM_RSSI_THOLD] &&
  4150. attrs[NL80211_ATTR_CQM_RSSI_HYST]) {
  4151. s32 threshold;
  4152. u32 hysteresis;
  4153. threshold = nla_get_u32(attrs[NL80211_ATTR_CQM_RSSI_THOLD]);
  4154. hysteresis = nla_get_u32(attrs[NL80211_ATTR_CQM_RSSI_HYST]);
  4155. err = nl80211_set_cqm_rssi(info, threshold, hysteresis);
  4156. } else
  4157. err = -EINVAL;
  4158. out:
  4159. return err;
  4160. }
  4161. static int nl80211_join_mesh(struct sk_buff *skb, struct genl_info *info)
  4162. {
  4163. struct cfg80211_registered_device *rdev = info->user_ptr[0];
  4164. struct net_device *dev = info->user_ptr[1];
  4165. struct mesh_config cfg;
  4166. struct mesh_setup setup;
  4167. int err;
  4168. /* start with default */
  4169. memcpy(&cfg, &default_mesh_config, sizeof(cfg));
  4170. memcpy(&setup, &default_mesh_setup, sizeof(setup));
  4171. if (info->attrs[NL80211_ATTR_MESH_CONFIG]) {
  4172. /* and parse parameters if given */
  4173. err = nl80211_parse_mesh_config(info, &cfg, NULL);
  4174. if (err)
  4175. return err;
  4176. }
  4177. if (!info->attrs[NL80211_ATTR_MESH_ID] ||
  4178. !nla_len(info->attrs[NL80211_ATTR_MESH_ID]))
  4179. return -EINVAL;
  4180. setup.mesh_id = nla_data(info->attrs[NL80211_ATTR_MESH_ID]);
  4181. setup.mesh_id_len = nla_len(info->attrs[NL80211_ATTR_MESH_ID]);
  4182. if (info->attrs[NL80211_ATTR_MESH_SETUP]) {
  4183. /* parse additional setup parameters if given */
  4184. err = nl80211_parse_mesh_setup(info, &setup);
  4185. if (err)
  4186. return err;
  4187. }
  4188. return cfg80211_join_mesh(rdev, dev, &setup, &cfg);
  4189. }
  4190. static int nl80211_leave_mesh(struct sk_buff *skb, struct genl_info *info)
  4191. {
  4192. struct cfg80211_registered_device *rdev = info->user_ptr[0];
  4193. struct net_device *dev = info->user_ptr[1];
  4194. return cfg80211_leave_mesh(rdev, dev);
  4195. }
  4196. static int nl80211_get_wowlan(struct sk_buff *skb, struct genl_info *info)
  4197. {
  4198. struct cfg80211_registered_device *rdev = info->user_ptr[0];
  4199. struct sk_buff *msg;
  4200. void *hdr;
  4201. if (!rdev->wiphy.wowlan.flags && !rdev->wiphy.wowlan.n_patterns)
  4202. return -EOPNOTSUPP;
  4203. msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
  4204. if (!msg)
  4205. return -ENOMEM;
  4206. hdr = nl80211hdr_put(msg, info->snd_pid, info->snd_seq, 0,
  4207. NL80211_CMD_GET_WOWLAN);
  4208. if (!hdr)
  4209. goto nla_put_failure;
  4210. if (rdev->wowlan) {
  4211. struct nlattr *nl_wowlan;
  4212. nl_wowlan = nla_nest_start(msg, NL80211_ATTR_WOWLAN_TRIGGERS);
  4213. if (!nl_wowlan)
  4214. goto nla_put_failure;
  4215. if (rdev->wowlan->any)
  4216. NLA_PUT_FLAG(msg, NL80211_WOWLAN_TRIG_ANY);
  4217. if (rdev->wowlan->disconnect)
  4218. NLA_PUT_FLAG(msg, NL80211_WOWLAN_TRIG_DISCONNECT);
  4219. if (rdev->wowlan->magic_pkt)
  4220. NLA_PUT_FLAG(msg, NL80211_WOWLAN_TRIG_MAGIC_PKT);
  4221. if (rdev->wowlan->n_patterns) {
  4222. struct nlattr *nl_pats, *nl_pat;
  4223. int i, pat_len;
  4224. nl_pats = nla_nest_start(msg,
  4225. NL80211_WOWLAN_TRIG_PKT_PATTERN);
  4226. if (!nl_pats)
  4227. goto nla_put_failure;
  4228. for (i = 0; i < rdev->wowlan->n_patterns; i++) {
  4229. nl_pat = nla_nest_start(msg, i + 1);
  4230. if (!nl_pat)
  4231. goto nla_put_failure;
  4232. pat_len = rdev->wowlan->patterns[i].pattern_len;
  4233. NLA_PUT(msg, NL80211_WOWLAN_PKTPAT_MASK,
  4234. DIV_ROUND_UP(pat_len, 8),
  4235. rdev->wowlan->patterns[i].mask);
  4236. NLA_PUT(msg, NL80211_WOWLAN_PKTPAT_PATTERN,
  4237. pat_len,
  4238. rdev->wowlan->patterns[i].pattern);
  4239. nla_nest_end(msg, nl_pat);
  4240. }
  4241. nla_nest_end(msg, nl_pats);
  4242. }
  4243. nla_nest_end(msg, nl_wowlan);
  4244. }
  4245. genlmsg_end(msg, hdr);
  4246. return genlmsg_reply(msg, info);
  4247. nla_put_failure:
  4248. nlmsg_free(msg);
  4249. return -ENOBUFS;
  4250. }
  4251. static int nl80211_set_wowlan(struct sk_buff *skb, struct genl_info *info)
  4252. {
  4253. struct cfg80211_registered_device *rdev = info->user_ptr[0];
  4254. struct nlattr *tb[NUM_NL80211_WOWLAN_TRIG];
  4255. struct cfg80211_wowlan no_triggers = {};
  4256. struct cfg80211_wowlan new_triggers = {};
  4257. struct wiphy_wowlan_support *wowlan = &rdev->wiphy.wowlan;
  4258. int err, i;
  4259. if (!rdev->wiphy.wowlan.flags && !rdev->wiphy.wowlan.n_patterns)
  4260. return -EOPNOTSUPP;
  4261. if (!info->attrs[NL80211_ATTR_WOWLAN_TRIGGERS])
  4262. goto no_triggers;
  4263. err = nla_parse(tb, MAX_NL80211_WOWLAN_TRIG,
  4264. nla_data(info->attrs[NL80211_ATTR_WOWLAN_TRIGGERS]),
  4265. nla_len(info->attrs[NL80211_ATTR_WOWLAN_TRIGGERS]),
  4266. nl80211_wowlan_policy);
  4267. if (err)
  4268. return err;
  4269. if (tb[NL80211_WOWLAN_TRIG_ANY]) {
  4270. if (!(wowlan->flags & WIPHY_WOWLAN_ANY))
  4271. return -EINVAL;
  4272. new_triggers.any = true;
  4273. }
  4274. if (tb[NL80211_WOWLAN_TRIG_DISCONNECT]) {
  4275. if (!(wowlan->flags & WIPHY_WOWLAN_DISCONNECT))
  4276. return -EINVAL;
  4277. new_triggers.disconnect = true;
  4278. }
  4279. if (tb[NL80211_WOWLAN_TRIG_MAGIC_PKT]) {
  4280. if (!(wowlan->flags & WIPHY_WOWLAN_MAGIC_PKT))
  4281. return -EINVAL;
  4282. new_triggers.magic_pkt = true;
  4283. }
  4284. if (tb[NL80211_WOWLAN_TRIG_PKT_PATTERN]) {
  4285. struct nlattr *pat;
  4286. int n_patterns = 0;
  4287. int rem, pat_len, mask_len;
  4288. struct nlattr *pat_tb[NUM_NL80211_WOWLAN_PKTPAT];
  4289. nla_for_each_nested(pat, tb[NL80211_WOWLAN_TRIG_PKT_PATTERN],
  4290. rem)
  4291. n_patterns++;
  4292. if (n_patterns > wowlan->n_patterns)
  4293. return -EINVAL;
  4294. new_triggers.patterns = kcalloc(n_patterns,
  4295. sizeof(new_triggers.patterns[0]),
  4296. GFP_KERNEL);
  4297. if (!new_triggers.patterns)
  4298. return -ENOMEM;
  4299. new_triggers.n_patterns = n_patterns;
  4300. i = 0;
  4301. nla_for_each_nested(pat, tb[NL80211_WOWLAN_TRIG_PKT_PATTERN],
  4302. rem) {
  4303. nla_parse(pat_tb, MAX_NL80211_WOWLAN_PKTPAT,
  4304. nla_data(pat), nla_len(pat), NULL);
  4305. err = -EINVAL;
  4306. if (!pat_tb[NL80211_WOWLAN_PKTPAT_MASK] ||
  4307. !pat_tb[NL80211_WOWLAN_PKTPAT_PATTERN])
  4308. goto error;
  4309. pat_len = nla_len(pat_tb[NL80211_WOWLAN_PKTPAT_PATTERN]);
  4310. mask_len = DIV_ROUND_UP(pat_len, 8);
  4311. if (nla_len(pat_tb[NL80211_WOWLAN_PKTPAT_MASK]) !=
  4312. mask_len)
  4313. goto error;
  4314. if (pat_len > wowlan->pattern_max_len ||
  4315. pat_len < wowlan->pattern_min_len)
  4316. goto error;
  4317. new_triggers.patterns[i].mask =
  4318. kmalloc(mask_len + pat_len, GFP_KERNEL);
  4319. if (!new_triggers.patterns[i].mask) {
  4320. err = -ENOMEM;
  4321. goto error;
  4322. }
  4323. new_triggers.patterns[i].pattern =
  4324. new_triggers.patterns[i].mask + mask_len;
  4325. memcpy(new_triggers.patterns[i].mask,
  4326. nla_data(pat_tb[NL80211_WOWLAN_PKTPAT_MASK]),
  4327. mask_len);
  4328. new_triggers.patterns[i].pattern_len = pat_len;
  4329. memcpy(new_triggers.patterns[i].pattern,
  4330. nla_data(pat_tb[NL80211_WOWLAN_PKTPAT_PATTERN]),
  4331. pat_len);
  4332. i++;
  4333. }
  4334. }
  4335. if (memcmp(&new_triggers, &no_triggers, sizeof(new_triggers))) {
  4336. struct cfg80211_wowlan *ntrig;
  4337. ntrig = kmemdup(&new_triggers, sizeof(new_triggers),
  4338. GFP_KERNEL);
  4339. if (!ntrig) {
  4340. err = -ENOMEM;
  4341. goto error;
  4342. }
  4343. cfg80211_rdev_free_wowlan(rdev);
  4344. rdev->wowlan = ntrig;
  4345. } else {
  4346. no_triggers:
  4347. cfg80211_rdev_free_wowlan(rdev);
  4348. rdev->wowlan = NULL;
  4349. }
  4350. return 0;
  4351. error:
  4352. for (i = 0; i < new_triggers.n_patterns; i++)
  4353. kfree(new_triggers.patterns[i].mask);
  4354. kfree(new_triggers.patterns);
  4355. return err;
  4356. }
  4357. #define NL80211_FLAG_NEED_WIPHY 0x01
  4358. #define NL80211_FLAG_NEED_NETDEV 0x02
  4359. #define NL80211_FLAG_NEED_RTNL 0x04
  4360. #define NL80211_FLAG_CHECK_NETDEV_UP 0x08
  4361. #define NL80211_FLAG_NEED_NETDEV_UP (NL80211_FLAG_NEED_NETDEV |\
  4362. NL80211_FLAG_CHECK_NETDEV_UP)
  4363. static int nl80211_pre_doit(struct genl_ops *ops, struct sk_buff *skb,
  4364. struct genl_info *info)
  4365. {
  4366. struct cfg80211_registered_device *rdev;
  4367. struct net_device *dev;
  4368. int err;
  4369. bool rtnl = ops->internal_flags & NL80211_FLAG_NEED_RTNL;
  4370. if (rtnl)
  4371. rtnl_lock();
  4372. if (ops->internal_flags & NL80211_FLAG_NEED_WIPHY) {
  4373. rdev = cfg80211_get_dev_from_info(info);
  4374. if (IS_ERR(rdev)) {
  4375. if (rtnl)
  4376. rtnl_unlock();
  4377. return PTR_ERR(rdev);
  4378. }
  4379. info->user_ptr[0] = rdev;
  4380. } else if (ops->internal_flags & NL80211_FLAG_NEED_NETDEV) {
  4381. err = get_rdev_dev_by_info_ifindex(info, &rdev, &dev);
  4382. if (err) {
  4383. if (rtnl)
  4384. rtnl_unlock();
  4385. return err;
  4386. }
  4387. if (ops->internal_flags & NL80211_FLAG_CHECK_NETDEV_UP &&
  4388. !netif_running(dev)) {
  4389. cfg80211_unlock_rdev(rdev);
  4390. dev_put(dev);
  4391. if (rtnl)
  4392. rtnl_unlock();
  4393. return -ENETDOWN;
  4394. }
  4395. info->user_ptr[0] = rdev;
  4396. info->user_ptr[1] = dev;
  4397. }
  4398. return 0;
  4399. }
  4400. static void nl80211_post_doit(struct genl_ops *ops, struct sk_buff *skb,
  4401. struct genl_info *info)
  4402. {
  4403. if (info->user_ptr[0])
  4404. cfg80211_unlock_rdev(info->user_ptr[0]);
  4405. if (info->user_ptr[1])
  4406. dev_put(info->user_ptr[1]);
  4407. if (ops->internal_flags & NL80211_FLAG_NEED_RTNL)
  4408. rtnl_unlock();
  4409. }
  4410. static struct genl_ops nl80211_ops[] = {
  4411. {
  4412. .cmd = NL80211_CMD_GET_WIPHY,
  4413. .doit = nl80211_get_wiphy,
  4414. .dumpit = nl80211_dump_wiphy,
  4415. .policy = nl80211_policy,
  4416. /* can be retrieved by unprivileged users */
  4417. .internal_flags = NL80211_FLAG_NEED_WIPHY,
  4418. },
  4419. {
  4420. .cmd = NL80211_CMD_SET_WIPHY,
  4421. .doit = nl80211_set_wiphy,
  4422. .policy = nl80211_policy,
  4423. .flags = GENL_ADMIN_PERM,
  4424. .internal_flags = NL80211_FLAG_NEED_RTNL,
  4425. },
  4426. {
  4427. .cmd = NL80211_CMD_GET_INTERFACE,
  4428. .doit = nl80211_get_interface,
  4429. .dumpit = nl80211_dump_interface,
  4430. .policy = nl80211_policy,
  4431. /* can be retrieved by unprivileged users */
  4432. .internal_flags = NL80211_FLAG_NEED_NETDEV,
  4433. },
  4434. {
  4435. .cmd = NL80211_CMD_SET_INTERFACE,
  4436. .doit = nl80211_set_interface,
  4437. .policy = nl80211_policy,
  4438. .flags = GENL_ADMIN_PERM,
  4439. .internal_flags = NL80211_FLAG_NEED_NETDEV |
  4440. NL80211_FLAG_NEED_RTNL,
  4441. },
  4442. {
  4443. .cmd = NL80211_CMD_NEW_INTERFACE,
  4444. .doit = nl80211_new_interface,
  4445. .policy = nl80211_policy,
  4446. .flags = GENL_ADMIN_PERM,
  4447. .internal_flags = NL80211_FLAG_NEED_WIPHY |
  4448. NL80211_FLAG_NEED_RTNL,
  4449. },
  4450. {
  4451. .cmd = NL80211_CMD_DEL_INTERFACE,
  4452. .doit = nl80211_del_interface,
  4453. .policy = nl80211_policy,
  4454. .flags = GENL_ADMIN_PERM,
  4455. .internal_flags = NL80211_FLAG_NEED_NETDEV |
  4456. NL80211_FLAG_NEED_RTNL,
  4457. },
  4458. {
  4459. .cmd = NL80211_CMD_GET_KEY,
  4460. .doit = nl80211_get_key,
  4461. .policy = nl80211_policy,
  4462. .flags = GENL_ADMIN_PERM,
  4463. .internal_flags = NL80211_FLAG_NEED_NETDEV |
  4464. NL80211_FLAG_NEED_RTNL,
  4465. },
  4466. {
  4467. .cmd = NL80211_CMD_SET_KEY,
  4468. .doit = nl80211_set_key,
  4469. .policy = nl80211_policy,
  4470. .flags = GENL_ADMIN_PERM,
  4471. .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
  4472. NL80211_FLAG_NEED_RTNL,
  4473. },
  4474. {
  4475. .cmd = NL80211_CMD_NEW_KEY,
  4476. .doit = nl80211_new_key,
  4477. .policy = nl80211_policy,
  4478. .flags = GENL_ADMIN_PERM,
  4479. .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
  4480. NL80211_FLAG_NEED_RTNL,
  4481. },
  4482. {
  4483. .cmd = NL80211_CMD_DEL_KEY,
  4484. .doit = nl80211_del_key,
  4485. .policy = nl80211_policy,
  4486. .flags = GENL_ADMIN_PERM,
  4487. .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
  4488. NL80211_FLAG_NEED_RTNL,
  4489. },
  4490. {
  4491. .cmd = NL80211_CMD_SET_BEACON,
  4492. .policy = nl80211_policy,
  4493. .flags = GENL_ADMIN_PERM,
  4494. .doit = nl80211_addset_beacon,
  4495. .internal_flags = NL80211_FLAG_NEED_NETDEV |
  4496. NL80211_FLAG_NEED_RTNL,
  4497. },
  4498. {
  4499. .cmd = NL80211_CMD_NEW_BEACON,
  4500. .policy = nl80211_policy,
  4501. .flags = GENL_ADMIN_PERM,
  4502. .doit = nl80211_addset_beacon,
  4503. .internal_flags = NL80211_FLAG_NEED_NETDEV |
  4504. NL80211_FLAG_NEED_RTNL,
  4505. },
  4506. {
  4507. .cmd = NL80211_CMD_DEL_BEACON,
  4508. .policy = nl80211_policy,
  4509. .flags = GENL_ADMIN_PERM,
  4510. .doit = nl80211_del_beacon,
  4511. .internal_flags = NL80211_FLAG_NEED_NETDEV |
  4512. NL80211_FLAG_NEED_RTNL,
  4513. },
  4514. {
  4515. .cmd = NL80211_CMD_GET_STATION,
  4516. .doit = nl80211_get_station,
  4517. .dumpit = nl80211_dump_station,
  4518. .policy = nl80211_policy,
  4519. .internal_flags = NL80211_FLAG_NEED_NETDEV |
  4520. NL80211_FLAG_NEED_RTNL,
  4521. },
  4522. {
  4523. .cmd = NL80211_CMD_SET_STATION,
  4524. .doit = nl80211_set_station,
  4525. .policy = nl80211_policy,
  4526. .flags = GENL_ADMIN_PERM,
  4527. .internal_flags = NL80211_FLAG_NEED_NETDEV |
  4528. NL80211_FLAG_NEED_RTNL,
  4529. },
  4530. {
  4531. .cmd = NL80211_CMD_NEW_STATION,
  4532. .doit = nl80211_new_station,
  4533. .policy = nl80211_policy,
  4534. .flags = GENL_ADMIN_PERM,
  4535. .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
  4536. NL80211_FLAG_NEED_RTNL,
  4537. },
  4538. {
  4539. .cmd = NL80211_CMD_DEL_STATION,
  4540. .doit = nl80211_del_station,
  4541. .policy = nl80211_policy,
  4542. .flags = GENL_ADMIN_PERM,
  4543. .internal_flags = NL80211_FLAG_NEED_NETDEV |
  4544. NL80211_FLAG_NEED_RTNL,
  4545. },
  4546. {
  4547. .cmd = NL80211_CMD_GET_MPATH,
  4548. .doit = nl80211_get_mpath,
  4549. .dumpit = nl80211_dump_mpath,
  4550. .policy = nl80211_policy,
  4551. .flags = GENL_ADMIN_PERM,
  4552. .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
  4553. NL80211_FLAG_NEED_RTNL,
  4554. },
  4555. {
  4556. .cmd = NL80211_CMD_SET_MPATH,
  4557. .doit = nl80211_set_mpath,
  4558. .policy = nl80211_policy,
  4559. .flags = GENL_ADMIN_PERM,
  4560. .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
  4561. NL80211_FLAG_NEED_RTNL,
  4562. },
  4563. {
  4564. .cmd = NL80211_CMD_NEW_MPATH,
  4565. .doit = nl80211_new_mpath,
  4566. .policy = nl80211_policy,
  4567. .flags = GENL_ADMIN_PERM,
  4568. .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
  4569. NL80211_FLAG_NEED_RTNL,
  4570. },
  4571. {
  4572. .cmd = NL80211_CMD_DEL_MPATH,
  4573. .doit = nl80211_del_mpath,
  4574. .policy = nl80211_policy,
  4575. .flags = GENL_ADMIN_PERM,
  4576. .internal_flags = NL80211_FLAG_NEED_NETDEV |
  4577. NL80211_FLAG_NEED_RTNL,
  4578. },
  4579. {
  4580. .cmd = NL80211_CMD_SET_BSS,
  4581. .doit = nl80211_set_bss,
  4582. .policy = nl80211_policy,
  4583. .flags = GENL_ADMIN_PERM,
  4584. .internal_flags = NL80211_FLAG_NEED_NETDEV |
  4585. NL80211_FLAG_NEED_RTNL,
  4586. },
  4587. {
  4588. .cmd = NL80211_CMD_GET_REG,
  4589. .doit = nl80211_get_reg,
  4590. .policy = nl80211_policy,
  4591. /* can be retrieved by unprivileged users */
  4592. },
  4593. {
  4594. .cmd = NL80211_CMD_SET_REG,
  4595. .doit = nl80211_set_reg,
  4596. .policy = nl80211_policy,
  4597. .flags = GENL_ADMIN_PERM,
  4598. },
  4599. {
  4600. .cmd = NL80211_CMD_REQ_SET_REG,
  4601. .doit = nl80211_req_set_reg,
  4602. .policy = nl80211_policy,
  4603. .flags = GENL_ADMIN_PERM,
  4604. },
  4605. {
  4606. .cmd = NL80211_CMD_GET_MESH_CONFIG,
  4607. .doit = nl80211_get_mesh_config,
  4608. .policy = nl80211_policy,
  4609. /* can be retrieved by unprivileged users */
  4610. .internal_flags = NL80211_FLAG_NEED_NETDEV |
  4611. NL80211_FLAG_NEED_RTNL,
  4612. },
  4613. {
  4614. .cmd = NL80211_CMD_SET_MESH_CONFIG,
  4615. .doit = nl80211_update_mesh_config,
  4616. .policy = nl80211_policy,
  4617. .flags = GENL_ADMIN_PERM,
  4618. .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
  4619. NL80211_FLAG_NEED_RTNL,
  4620. },
  4621. {
  4622. .cmd = NL80211_CMD_TRIGGER_SCAN,
  4623. .doit = nl80211_trigger_scan,
  4624. .policy = nl80211_policy,
  4625. .flags = GENL_ADMIN_PERM,
  4626. .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
  4627. NL80211_FLAG_NEED_RTNL,
  4628. },
  4629. {
  4630. .cmd = NL80211_CMD_GET_SCAN,
  4631. .policy = nl80211_policy,
  4632. .dumpit = nl80211_dump_scan,
  4633. },
  4634. {
  4635. .cmd = NL80211_CMD_START_SCHED_SCAN,
  4636. .doit = nl80211_start_sched_scan,
  4637. .policy = nl80211_policy,
  4638. .flags = GENL_ADMIN_PERM,
  4639. .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
  4640. NL80211_FLAG_NEED_RTNL,
  4641. },
  4642. {
  4643. .cmd = NL80211_CMD_STOP_SCHED_SCAN,
  4644. .doit = nl80211_stop_sched_scan,
  4645. .policy = nl80211_policy,
  4646. .flags = GENL_ADMIN_PERM,
  4647. .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
  4648. NL80211_FLAG_NEED_RTNL,
  4649. },
  4650. {
  4651. .cmd = NL80211_CMD_AUTHENTICATE,
  4652. .doit = nl80211_authenticate,
  4653. .policy = nl80211_policy,
  4654. .flags = GENL_ADMIN_PERM,
  4655. .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
  4656. NL80211_FLAG_NEED_RTNL,
  4657. },
  4658. {
  4659. .cmd = NL80211_CMD_ASSOCIATE,
  4660. .doit = nl80211_associate,
  4661. .policy = nl80211_policy,
  4662. .flags = GENL_ADMIN_PERM,
  4663. .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
  4664. NL80211_FLAG_NEED_RTNL,
  4665. },
  4666. {
  4667. .cmd = NL80211_CMD_DEAUTHENTICATE,
  4668. .doit = nl80211_deauthenticate,
  4669. .policy = nl80211_policy,
  4670. .flags = GENL_ADMIN_PERM,
  4671. .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
  4672. NL80211_FLAG_NEED_RTNL,
  4673. },
  4674. {
  4675. .cmd = NL80211_CMD_DISASSOCIATE,
  4676. .doit = nl80211_disassociate,
  4677. .policy = nl80211_policy,
  4678. .flags = GENL_ADMIN_PERM,
  4679. .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
  4680. NL80211_FLAG_NEED_RTNL,
  4681. },
  4682. {
  4683. .cmd = NL80211_CMD_JOIN_IBSS,
  4684. .doit = nl80211_join_ibss,
  4685. .policy = nl80211_policy,
  4686. .flags = GENL_ADMIN_PERM,
  4687. .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
  4688. NL80211_FLAG_NEED_RTNL,
  4689. },
  4690. {
  4691. .cmd = NL80211_CMD_LEAVE_IBSS,
  4692. .doit = nl80211_leave_ibss,
  4693. .policy = nl80211_policy,
  4694. .flags = GENL_ADMIN_PERM,
  4695. .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
  4696. NL80211_FLAG_NEED_RTNL,
  4697. },
  4698. #ifdef CONFIG_NL80211_TESTMODE
  4699. {
  4700. .cmd = NL80211_CMD_TESTMODE,
  4701. .doit = nl80211_testmode_do,
  4702. .policy = nl80211_policy,
  4703. .flags = GENL_ADMIN_PERM,
  4704. .internal_flags = NL80211_FLAG_NEED_WIPHY |
  4705. NL80211_FLAG_NEED_RTNL,
  4706. },
  4707. #endif
  4708. {
  4709. .cmd = NL80211_CMD_CONNECT,
  4710. .doit = nl80211_connect,
  4711. .policy = nl80211_policy,
  4712. .flags = GENL_ADMIN_PERM,
  4713. .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
  4714. NL80211_FLAG_NEED_RTNL,
  4715. },
  4716. {
  4717. .cmd = NL80211_CMD_DISCONNECT,
  4718. .doit = nl80211_disconnect,
  4719. .policy = nl80211_policy,
  4720. .flags = GENL_ADMIN_PERM,
  4721. .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
  4722. NL80211_FLAG_NEED_RTNL,
  4723. },
  4724. {
  4725. .cmd = NL80211_CMD_SET_WIPHY_NETNS,
  4726. .doit = nl80211_wiphy_netns,
  4727. .policy = nl80211_policy,
  4728. .flags = GENL_ADMIN_PERM,
  4729. .internal_flags = NL80211_FLAG_NEED_WIPHY |
  4730. NL80211_FLAG_NEED_RTNL,
  4731. },
  4732. {
  4733. .cmd = NL80211_CMD_GET_SURVEY,
  4734. .policy = nl80211_policy,
  4735. .dumpit = nl80211_dump_survey,
  4736. },
  4737. {
  4738. .cmd = NL80211_CMD_SET_PMKSA,
  4739. .doit = nl80211_setdel_pmksa,
  4740. .policy = nl80211_policy,
  4741. .flags = GENL_ADMIN_PERM,
  4742. .internal_flags = NL80211_FLAG_NEED_NETDEV |
  4743. NL80211_FLAG_NEED_RTNL,
  4744. },
  4745. {
  4746. .cmd = NL80211_CMD_DEL_PMKSA,
  4747. .doit = nl80211_setdel_pmksa,
  4748. .policy = nl80211_policy,
  4749. .flags = GENL_ADMIN_PERM,
  4750. .internal_flags = NL80211_FLAG_NEED_NETDEV |
  4751. NL80211_FLAG_NEED_RTNL,
  4752. },
  4753. {
  4754. .cmd = NL80211_CMD_FLUSH_PMKSA,
  4755. .doit = nl80211_flush_pmksa,
  4756. .policy = nl80211_policy,
  4757. .flags = GENL_ADMIN_PERM,
  4758. .internal_flags = NL80211_FLAG_NEED_NETDEV |
  4759. NL80211_FLAG_NEED_RTNL,
  4760. },
  4761. {
  4762. .cmd = NL80211_CMD_REMAIN_ON_CHANNEL,
  4763. .doit = nl80211_remain_on_channel,
  4764. .policy = nl80211_policy,
  4765. .flags = GENL_ADMIN_PERM,
  4766. .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
  4767. NL80211_FLAG_NEED_RTNL,
  4768. },
  4769. {
  4770. .cmd = NL80211_CMD_CANCEL_REMAIN_ON_CHANNEL,
  4771. .doit = nl80211_cancel_remain_on_channel,
  4772. .policy = nl80211_policy,
  4773. .flags = GENL_ADMIN_PERM,
  4774. .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
  4775. NL80211_FLAG_NEED_RTNL,
  4776. },
  4777. {
  4778. .cmd = NL80211_CMD_SET_TX_BITRATE_MASK,
  4779. .doit = nl80211_set_tx_bitrate_mask,
  4780. .policy = nl80211_policy,
  4781. .flags = GENL_ADMIN_PERM,
  4782. .internal_flags = NL80211_FLAG_NEED_NETDEV |
  4783. NL80211_FLAG_NEED_RTNL,
  4784. },
  4785. {
  4786. .cmd = NL80211_CMD_REGISTER_FRAME,
  4787. .doit = nl80211_register_mgmt,
  4788. .policy = nl80211_policy,
  4789. .flags = GENL_ADMIN_PERM,
  4790. .internal_flags = NL80211_FLAG_NEED_NETDEV |
  4791. NL80211_FLAG_NEED_RTNL,
  4792. },
  4793. {
  4794. .cmd = NL80211_CMD_FRAME,
  4795. .doit = nl80211_tx_mgmt,
  4796. .policy = nl80211_policy,
  4797. .flags = GENL_ADMIN_PERM,
  4798. .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
  4799. NL80211_FLAG_NEED_RTNL,
  4800. },
  4801. {
  4802. .cmd = NL80211_CMD_FRAME_WAIT_CANCEL,
  4803. .doit = nl80211_tx_mgmt_cancel_wait,
  4804. .policy = nl80211_policy,
  4805. .flags = GENL_ADMIN_PERM,
  4806. .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
  4807. NL80211_FLAG_NEED_RTNL,
  4808. },
  4809. {
  4810. .cmd = NL80211_CMD_SET_POWER_SAVE,
  4811. .doit = nl80211_set_power_save,
  4812. .policy = nl80211_policy,
  4813. .flags = GENL_ADMIN_PERM,
  4814. .internal_flags = NL80211_FLAG_NEED_NETDEV |
  4815. NL80211_FLAG_NEED_RTNL,
  4816. },
  4817. {
  4818. .cmd = NL80211_CMD_GET_POWER_SAVE,
  4819. .doit = nl80211_get_power_save,
  4820. .policy = nl80211_policy,
  4821. /* can be retrieved by unprivileged users */
  4822. .internal_flags = NL80211_FLAG_NEED_NETDEV |
  4823. NL80211_FLAG_NEED_RTNL,
  4824. },
  4825. {
  4826. .cmd = NL80211_CMD_SET_CQM,
  4827. .doit = nl80211_set_cqm,
  4828. .policy = nl80211_policy,
  4829. .flags = GENL_ADMIN_PERM,
  4830. .internal_flags = NL80211_FLAG_NEED_NETDEV |
  4831. NL80211_FLAG_NEED_RTNL,
  4832. },
  4833. {
  4834. .cmd = NL80211_CMD_SET_CHANNEL,
  4835. .doit = nl80211_set_channel,
  4836. .policy = nl80211_policy,
  4837. .flags = GENL_ADMIN_PERM,
  4838. .internal_flags = NL80211_FLAG_NEED_NETDEV |
  4839. NL80211_FLAG_NEED_RTNL,
  4840. },
  4841. {
  4842. .cmd = NL80211_CMD_SET_WDS_PEER,
  4843. .doit = nl80211_set_wds_peer,
  4844. .policy = nl80211_policy,
  4845. .flags = GENL_ADMIN_PERM,
  4846. .internal_flags = NL80211_FLAG_NEED_NETDEV |
  4847. NL80211_FLAG_NEED_RTNL,
  4848. },
  4849. {
  4850. .cmd = NL80211_CMD_JOIN_MESH,
  4851. .doit = nl80211_join_mesh,
  4852. .policy = nl80211_policy,
  4853. .flags = GENL_ADMIN_PERM,
  4854. .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
  4855. NL80211_FLAG_NEED_RTNL,
  4856. },
  4857. {
  4858. .cmd = NL80211_CMD_LEAVE_MESH,
  4859. .doit = nl80211_leave_mesh,
  4860. .policy = nl80211_policy,
  4861. .flags = GENL_ADMIN_PERM,
  4862. .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
  4863. NL80211_FLAG_NEED_RTNL,
  4864. },
  4865. {
  4866. .cmd = NL80211_CMD_GET_WOWLAN,
  4867. .doit = nl80211_get_wowlan,
  4868. .policy = nl80211_policy,
  4869. /* can be retrieved by unprivileged users */
  4870. .internal_flags = NL80211_FLAG_NEED_WIPHY |
  4871. NL80211_FLAG_NEED_RTNL,
  4872. },
  4873. {
  4874. .cmd = NL80211_CMD_SET_WOWLAN,
  4875. .doit = nl80211_set_wowlan,
  4876. .policy = nl80211_policy,
  4877. .flags = GENL_ADMIN_PERM,
  4878. .internal_flags = NL80211_FLAG_NEED_WIPHY |
  4879. NL80211_FLAG_NEED_RTNL,
  4880. },
  4881. };
  4882. static struct genl_multicast_group nl80211_mlme_mcgrp = {
  4883. .name = "mlme",
  4884. };
  4885. /* multicast groups */
  4886. static struct genl_multicast_group nl80211_config_mcgrp = {
  4887. .name = "config",
  4888. };
  4889. static struct genl_multicast_group nl80211_scan_mcgrp = {
  4890. .name = "scan",
  4891. };
  4892. static struct genl_multicast_group nl80211_regulatory_mcgrp = {
  4893. .name = "regulatory",
  4894. };
  4895. /* notification functions */
  4896. void nl80211_notify_dev_rename(struct cfg80211_registered_device *rdev)
  4897. {
  4898. struct sk_buff *msg;
  4899. msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
  4900. if (!msg)
  4901. return;
  4902. if (nl80211_send_wiphy(msg, 0, 0, 0, rdev) < 0) {
  4903. nlmsg_free(msg);
  4904. return;
  4905. }
  4906. genlmsg_multicast_netns(wiphy_net(&rdev->wiphy), msg, 0,
  4907. nl80211_config_mcgrp.id, GFP_KERNEL);
  4908. }
  4909. static int nl80211_add_scan_req(struct sk_buff *msg,
  4910. struct cfg80211_registered_device *rdev)
  4911. {
  4912. struct cfg80211_scan_request *req = rdev->scan_req;
  4913. struct nlattr *nest;
  4914. int i;
  4915. ASSERT_RDEV_LOCK(rdev);
  4916. if (WARN_ON(!req))
  4917. return 0;
  4918. nest = nla_nest_start(msg, NL80211_ATTR_SCAN_SSIDS);
  4919. if (!nest)
  4920. goto nla_put_failure;
  4921. for (i = 0; i < req->n_ssids; i++)
  4922. NLA_PUT(msg, i, req->ssids[i].ssid_len, req->ssids[i].ssid);
  4923. nla_nest_end(msg, nest);
  4924. nest = nla_nest_start(msg, NL80211_ATTR_SCAN_FREQUENCIES);
  4925. if (!nest)
  4926. goto nla_put_failure;
  4927. for (i = 0; i < req->n_channels; i++)
  4928. NLA_PUT_U32(msg, i, req->channels[i]->center_freq);
  4929. nla_nest_end(msg, nest);
  4930. if (req->ie)
  4931. NLA_PUT(msg, NL80211_ATTR_IE, req->ie_len, req->ie);
  4932. return 0;
  4933. nla_put_failure:
  4934. return -ENOBUFS;
  4935. }
  4936. static int nl80211_send_scan_msg(struct sk_buff *msg,
  4937. struct cfg80211_registered_device *rdev,
  4938. struct net_device *netdev,
  4939. u32 pid, u32 seq, int flags,
  4940. u32 cmd)
  4941. {
  4942. void *hdr;
  4943. hdr = nl80211hdr_put(msg, pid, seq, flags, cmd);
  4944. if (!hdr)
  4945. return -1;
  4946. NLA_PUT_U32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx);
  4947. NLA_PUT_U32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex);
  4948. /* ignore errors and send incomplete event anyway */
  4949. nl80211_add_scan_req(msg, rdev);
  4950. return genlmsg_end(msg, hdr);
  4951. nla_put_failure:
  4952. genlmsg_cancel(msg, hdr);
  4953. return -EMSGSIZE;
  4954. }
  4955. static int
  4956. nl80211_send_sched_scan_msg(struct sk_buff *msg,
  4957. struct cfg80211_registered_device *rdev,
  4958. struct net_device *netdev,
  4959. u32 pid, u32 seq, int flags, u32 cmd)
  4960. {
  4961. void *hdr;
  4962. hdr = nl80211hdr_put(msg, pid, seq, flags, cmd);
  4963. if (!hdr)
  4964. return -1;
  4965. NLA_PUT_U32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx);
  4966. NLA_PUT_U32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex);
  4967. return genlmsg_end(msg, hdr);
  4968. nla_put_failure:
  4969. genlmsg_cancel(msg, hdr);
  4970. return -EMSGSIZE;
  4971. }
  4972. void nl80211_send_scan_start(struct cfg80211_registered_device *rdev,
  4973. struct net_device *netdev)
  4974. {
  4975. struct sk_buff *msg;
  4976. msg = nlmsg_new(NLMSG_GOODSIZE, GFP_KERNEL);
  4977. if (!msg)
  4978. return;
  4979. if (nl80211_send_scan_msg(msg, rdev, netdev, 0, 0, 0,
  4980. NL80211_CMD_TRIGGER_SCAN) < 0) {
  4981. nlmsg_free(msg);
  4982. return;
  4983. }
  4984. genlmsg_multicast_netns(wiphy_net(&rdev->wiphy), msg, 0,
  4985. nl80211_scan_mcgrp.id, GFP_KERNEL);
  4986. }
  4987. void nl80211_send_scan_done(struct cfg80211_registered_device *rdev,
  4988. struct net_device *netdev)
  4989. {
  4990. struct sk_buff *msg;
  4991. msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
  4992. if (!msg)
  4993. return;
  4994. if (nl80211_send_scan_msg(msg, rdev, netdev, 0, 0, 0,
  4995. NL80211_CMD_NEW_SCAN_RESULTS) < 0) {
  4996. nlmsg_free(msg);
  4997. return;
  4998. }
  4999. genlmsg_multicast_netns(wiphy_net(&rdev->wiphy), msg, 0,
  5000. nl80211_scan_mcgrp.id, GFP_KERNEL);
  5001. }
  5002. void nl80211_send_scan_aborted(struct cfg80211_registered_device *rdev,
  5003. struct net_device *netdev)
  5004. {
  5005. struct sk_buff *msg;
  5006. msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
  5007. if (!msg)
  5008. return;
  5009. if (nl80211_send_scan_msg(msg, rdev, netdev, 0, 0, 0,
  5010. NL80211_CMD_SCAN_ABORTED) < 0) {
  5011. nlmsg_free(msg);
  5012. return;
  5013. }
  5014. genlmsg_multicast_netns(wiphy_net(&rdev->wiphy), msg, 0,
  5015. nl80211_scan_mcgrp.id, GFP_KERNEL);
  5016. }
  5017. void nl80211_send_sched_scan_results(struct cfg80211_registered_device *rdev,
  5018. struct net_device *netdev)
  5019. {
  5020. struct sk_buff *msg;
  5021. msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
  5022. if (!msg)
  5023. return;
  5024. if (nl80211_send_sched_scan_msg(msg, rdev, netdev, 0, 0, 0,
  5025. NL80211_CMD_SCHED_SCAN_RESULTS) < 0) {
  5026. nlmsg_free(msg);
  5027. return;
  5028. }
  5029. genlmsg_multicast_netns(wiphy_net(&rdev->wiphy), msg, 0,
  5030. nl80211_scan_mcgrp.id, GFP_KERNEL);
  5031. }
  5032. void nl80211_send_sched_scan(struct cfg80211_registered_device *rdev,
  5033. struct net_device *netdev, u32 cmd)
  5034. {
  5035. struct sk_buff *msg;
  5036. msg = nlmsg_new(NLMSG_GOODSIZE, GFP_KERNEL);
  5037. if (!msg)
  5038. return;
  5039. if (nl80211_send_sched_scan_msg(msg, rdev, netdev, 0, 0, 0, cmd) < 0) {
  5040. nlmsg_free(msg);
  5041. return;
  5042. }
  5043. genlmsg_multicast_netns(wiphy_net(&rdev->wiphy), msg, 0,
  5044. nl80211_scan_mcgrp.id, GFP_KERNEL);
  5045. }
  5046. /*
  5047. * This can happen on global regulatory changes or device specific settings
  5048. * based on custom world regulatory domains.
  5049. */
  5050. void nl80211_send_reg_change_event(struct regulatory_request *request)
  5051. {
  5052. struct sk_buff *msg;
  5053. void *hdr;
  5054. msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
  5055. if (!msg)
  5056. return;
  5057. hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_REG_CHANGE);
  5058. if (!hdr) {
  5059. nlmsg_free(msg);
  5060. return;
  5061. }
  5062. /* Userspace can always count this one always being set */
  5063. NLA_PUT_U8(msg, NL80211_ATTR_REG_INITIATOR, request->initiator);
  5064. if (request->alpha2[0] == '0' && request->alpha2[1] == '0')
  5065. NLA_PUT_U8(msg, NL80211_ATTR_REG_TYPE,
  5066. NL80211_REGDOM_TYPE_WORLD);
  5067. else if (request->alpha2[0] == '9' && request->alpha2[1] == '9')
  5068. NLA_PUT_U8(msg, NL80211_ATTR_REG_TYPE,
  5069. NL80211_REGDOM_TYPE_CUSTOM_WORLD);
  5070. else if ((request->alpha2[0] == '9' && request->alpha2[1] == '8') ||
  5071. request->intersect)
  5072. NLA_PUT_U8(msg, NL80211_ATTR_REG_TYPE,
  5073. NL80211_REGDOM_TYPE_INTERSECTION);
  5074. else {
  5075. NLA_PUT_U8(msg, NL80211_ATTR_REG_TYPE,
  5076. NL80211_REGDOM_TYPE_COUNTRY);
  5077. NLA_PUT_STRING(msg, NL80211_ATTR_REG_ALPHA2, request->alpha2);
  5078. }
  5079. if (wiphy_idx_valid(request->wiphy_idx))
  5080. NLA_PUT_U32(msg, NL80211_ATTR_WIPHY, request->wiphy_idx);
  5081. if (genlmsg_end(msg, hdr) < 0) {
  5082. nlmsg_free(msg);
  5083. return;
  5084. }
  5085. rcu_read_lock();
  5086. genlmsg_multicast_allns(msg, 0, nl80211_regulatory_mcgrp.id,
  5087. GFP_ATOMIC);
  5088. rcu_read_unlock();
  5089. return;
  5090. nla_put_failure:
  5091. genlmsg_cancel(msg, hdr);
  5092. nlmsg_free(msg);
  5093. }
  5094. static void nl80211_send_mlme_event(struct cfg80211_registered_device *rdev,
  5095. struct net_device *netdev,
  5096. const u8 *buf, size_t len,
  5097. enum nl80211_commands cmd, gfp_t gfp)
  5098. {
  5099. struct sk_buff *msg;
  5100. void *hdr;
  5101. msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp);
  5102. if (!msg)
  5103. return;
  5104. hdr = nl80211hdr_put(msg, 0, 0, 0, cmd);
  5105. if (!hdr) {
  5106. nlmsg_free(msg);
  5107. return;
  5108. }
  5109. NLA_PUT_U32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx);
  5110. NLA_PUT_U32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex);
  5111. NLA_PUT(msg, NL80211_ATTR_FRAME, len, buf);
  5112. if (genlmsg_end(msg, hdr) < 0) {
  5113. nlmsg_free(msg);
  5114. return;
  5115. }
  5116. genlmsg_multicast_netns(wiphy_net(&rdev->wiphy), msg, 0,
  5117. nl80211_mlme_mcgrp.id, gfp);
  5118. return;
  5119. nla_put_failure:
  5120. genlmsg_cancel(msg, hdr);
  5121. nlmsg_free(msg);
  5122. }
  5123. void nl80211_send_rx_auth(struct cfg80211_registered_device *rdev,
  5124. struct net_device *netdev, const u8 *buf,
  5125. size_t len, gfp_t gfp)
  5126. {
  5127. nl80211_send_mlme_event(rdev, netdev, buf, len,
  5128. NL80211_CMD_AUTHENTICATE, gfp);
  5129. }
  5130. void nl80211_send_rx_assoc(struct cfg80211_registered_device *rdev,
  5131. struct net_device *netdev, const u8 *buf,
  5132. size_t len, gfp_t gfp)
  5133. {
  5134. nl80211_send_mlme_event(rdev, netdev, buf, len,
  5135. NL80211_CMD_ASSOCIATE, gfp);
  5136. }
  5137. void nl80211_send_deauth(struct cfg80211_registered_device *rdev,
  5138. struct net_device *netdev, const u8 *buf,
  5139. size_t len, gfp_t gfp)
  5140. {
  5141. nl80211_send_mlme_event(rdev, netdev, buf, len,
  5142. NL80211_CMD_DEAUTHENTICATE, gfp);
  5143. }
  5144. void nl80211_send_disassoc(struct cfg80211_registered_device *rdev,
  5145. struct net_device *netdev, const u8 *buf,
  5146. size_t len, gfp_t gfp)
  5147. {
  5148. nl80211_send_mlme_event(rdev, netdev, buf, len,
  5149. NL80211_CMD_DISASSOCIATE, gfp);
  5150. }
  5151. void nl80211_send_unprot_deauth(struct cfg80211_registered_device *rdev,
  5152. struct net_device *netdev, const u8 *buf,
  5153. size_t len, gfp_t gfp)
  5154. {
  5155. nl80211_send_mlme_event(rdev, netdev, buf, len,
  5156. NL80211_CMD_UNPROT_DEAUTHENTICATE, gfp);
  5157. }
  5158. void nl80211_send_unprot_disassoc(struct cfg80211_registered_device *rdev,
  5159. struct net_device *netdev, const u8 *buf,
  5160. size_t len, gfp_t gfp)
  5161. {
  5162. nl80211_send_mlme_event(rdev, netdev, buf, len,
  5163. NL80211_CMD_UNPROT_DISASSOCIATE, gfp);
  5164. }
  5165. static void nl80211_send_mlme_timeout(struct cfg80211_registered_device *rdev,
  5166. struct net_device *netdev, int cmd,
  5167. const u8 *addr, gfp_t gfp)
  5168. {
  5169. struct sk_buff *msg;
  5170. void *hdr;
  5171. msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp);
  5172. if (!msg)
  5173. return;
  5174. hdr = nl80211hdr_put(msg, 0, 0, 0, cmd);
  5175. if (!hdr) {
  5176. nlmsg_free(msg);
  5177. return;
  5178. }
  5179. NLA_PUT_U32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx);
  5180. NLA_PUT_U32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex);
  5181. NLA_PUT_FLAG(msg, NL80211_ATTR_TIMED_OUT);
  5182. NLA_PUT(msg, NL80211_ATTR_MAC, ETH_ALEN, addr);
  5183. if (genlmsg_end(msg, hdr) < 0) {
  5184. nlmsg_free(msg);
  5185. return;
  5186. }
  5187. genlmsg_multicast_netns(wiphy_net(&rdev->wiphy), msg, 0,
  5188. nl80211_mlme_mcgrp.id, gfp);
  5189. return;
  5190. nla_put_failure:
  5191. genlmsg_cancel(msg, hdr);
  5192. nlmsg_free(msg);
  5193. }
  5194. void nl80211_send_auth_timeout(struct cfg80211_registered_device *rdev,
  5195. struct net_device *netdev, const u8 *addr,
  5196. gfp_t gfp)
  5197. {
  5198. nl80211_send_mlme_timeout(rdev, netdev, NL80211_CMD_AUTHENTICATE,
  5199. addr, gfp);
  5200. }
  5201. void nl80211_send_assoc_timeout(struct cfg80211_registered_device *rdev,
  5202. struct net_device *netdev, const u8 *addr,
  5203. gfp_t gfp)
  5204. {
  5205. nl80211_send_mlme_timeout(rdev, netdev, NL80211_CMD_ASSOCIATE,
  5206. addr, gfp);
  5207. }
  5208. void nl80211_send_connect_result(struct cfg80211_registered_device *rdev,
  5209. struct net_device *netdev, const u8 *bssid,
  5210. const u8 *req_ie, size_t req_ie_len,
  5211. const u8 *resp_ie, size_t resp_ie_len,
  5212. u16 status, gfp_t gfp)
  5213. {
  5214. struct sk_buff *msg;
  5215. void *hdr;
  5216. msg = nlmsg_new(NLMSG_GOODSIZE, gfp);
  5217. if (!msg)
  5218. return;
  5219. hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_CONNECT);
  5220. if (!hdr) {
  5221. nlmsg_free(msg);
  5222. return;
  5223. }
  5224. NLA_PUT_U32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx);
  5225. NLA_PUT_U32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex);
  5226. if (bssid)
  5227. NLA_PUT(msg, NL80211_ATTR_MAC, ETH_ALEN, bssid);
  5228. NLA_PUT_U16(msg, NL80211_ATTR_STATUS_CODE, status);
  5229. if (req_ie)
  5230. NLA_PUT(msg, NL80211_ATTR_REQ_IE, req_ie_len, req_ie);
  5231. if (resp_ie)
  5232. NLA_PUT(msg, NL80211_ATTR_RESP_IE, resp_ie_len, resp_ie);
  5233. if (genlmsg_end(msg, hdr) < 0) {
  5234. nlmsg_free(msg);
  5235. return;
  5236. }
  5237. genlmsg_multicast_netns(wiphy_net(&rdev->wiphy), msg, 0,
  5238. nl80211_mlme_mcgrp.id, gfp);
  5239. return;
  5240. nla_put_failure:
  5241. genlmsg_cancel(msg, hdr);
  5242. nlmsg_free(msg);
  5243. }
  5244. void nl80211_send_roamed(struct cfg80211_registered_device *rdev,
  5245. struct net_device *netdev, const u8 *bssid,
  5246. const u8 *req_ie, size_t req_ie_len,
  5247. const u8 *resp_ie, size_t resp_ie_len, gfp_t gfp)
  5248. {
  5249. struct sk_buff *msg;
  5250. void *hdr;
  5251. msg = nlmsg_new(NLMSG_GOODSIZE, gfp);
  5252. if (!msg)
  5253. return;
  5254. hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_ROAM);
  5255. if (!hdr) {
  5256. nlmsg_free(msg);
  5257. return;
  5258. }
  5259. NLA_PUT_U32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx);
  5260. NLA_PUT_U32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex);
  5261. NLA_PUT(msg, NL80211_ATTR_MAC, ETH_ALEN, bssid);
  5262. if (req_ie)
  5263. NLA_PUT(msg, NL80211_ATTR_REQ_IE, req_ie_len, req_ie);
  5264. if (resp_ie)
  5265. NLA_PUT(msg, NL80211_ATTR_RESP_IE, resp_ie_len, resp_ie);
  5266. if (genlmsg_end(msg, hdr) < 0) {
  5267. nlmsg_free(msg);
  5268. return;
  5269. }
  5270. genlmsg_multicast_netns(wiphy_net(&rdev->wiphy), msg, 0,
  5271. nl80211_mlme_mcgrp.id, gfp);
  5272. return;
  5273. nla_put_failure:
  5274. genlmsg_cancel(msg, hdr);
  5275. nlmsg_free(msg);
  5276. }
  5277. void nl80211_send_disconnected(struct cfg80211_registered_device *rdev,
  5278. struct net_device *netdev, u16 reason,
  5279. const u8 *ie, size_t ie_len, bool from_ap)
  5280. {
  5281. struct sk_buff *msg;
  5282. void *hdr;
  5283. msg = nlmsg_new(NLMSG_GOODSIZE, GFP_KERNEL);
  5284. if (!msg)
  5285. return;
  5286. hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_DISCONNECT);
  5287. if (!hdr) {
  5288. nlmsg_free(msg);
  5289. return;
  5290. }
  5291. NLA_PUT_U32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx);
  5292. NLA_PUT_U32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex);
  5293. if (from_ap && reason)
  5294. NLA_PUT_U16(msg, NL80211_ATTR_REASON_CODE, reason);
  5295. if (from_ap)
  5296. NLA_PUT_FLAG(msg, NL80211_ATTR_DISCONNECTED_BY_AP);
  5297. if (ie)
  5298. NLA_PUT(msg, NL80211_ATTR_IE, ie_len, ie);
  5299. if (genlmsg_end(msg, hdr) < 0) {
  5300. nlmsg_free(msg);
  5301. return;
  5302. }
  5303. genlmsg_multicast_netns(wiphy_net(&rdev->wiphy), msg, 0,
  5304. nl80211_mlme_mcgrp.id, GFP_KERNEL);
  5305. return;
  5306. nla_put_failure:
  5307. genlmsg_cancel(msg, hdr);
  5308. nlmsg_free(msg);
  5309. }
  5310. void nl80211_send_ibss_bssid(struct cfg80211_registered_device *rdev,
  5311. struct net_device *netdev, const u8 *bssid,
  5312. gfp_t gfp)
  5313. {
  5314. struct sk_buff *msg;
  5315. void *hdr;
  5316. msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp);
  5317. if (!msg)
  5318. return;
  5319. hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_JOIN_IBSS);
  5320. if (!hdr) {
  5321. nlmsg_free(msg);
  5322. return;
  5323. }
  5324. NLA_PUT_U32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx);
  5325. NLA_PUT_U32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex);
  5326. NLA_PUT(msg, NL80211_ATTR_MAC, ETH_ALEN, bssid);
  5327. if (genlmsg_end(msg, hdr) < 0) {
  5328. nlmsg_free(msg);
  5329. return;
  5330. }
  5331. genlmsg_multicast_netns(wiphy_net(&rdev->wiphy), msg, 0,
  5332. nl80211_mlme_mcgrp.id, gfp);
  5333. return;
  5334. nla_put_failure:
  5335. genlmsg_cancel(msg, hdr);
  5336. nlmsg_free(msg);
  5337. }
  5338. void nl80211_send_new_peer_candidate(struct cfg80211_registered_device *rdev,
  5339. struct net_device *netdev,
  5340. const u8 *macaddr, const u8* ie, u8 ie_len,
  5341. gfp_t gfp)
  5342. {
  5343. struct sk_buff *msg;
  5344. void *hdr;
  5345. msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp);
  5346. if (!msg)
  5347. return;
  5348. hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_NEW_PEER_CANDIDATE);
  5349. if (!hdr) {
  5350. nlmsg_free(msg);
  5351. return;
  5352. }
  5353. NLA_PUT_U32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx);
  5354. NLA_PUT_U32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex);
  5355. NLA_PUT(msg, NL80211_ATTR_MAC, ETH_ALEN, macaddr);
  5356. if (ie_len && ie)
  5357. NLA_PUT(msg, NL80211_ATTR_IE, ie_len , ie);
  5358. if (genlmsg_end(msg, hdr) < 0) {
  5359. nlmsg_free(msg);
  5360. return;
  5361. }
  5362. genlmsg_multicast_netns(wiphy_net(&rdev->wiphy), msg, 0,
  5363. nl80211_mlme_mcgrp.id, gfp);
  5364. return;
  5365. nla_put_failure:
  5366. genlmsg_cancel(msg, hdr);
  5367. nlmsg_free(msg);
  5368. }
  5369. void nl80211_michael_mic_failure(struct cfg80211_registered_device *rdev,
  5370. struct net_device *netdev, const u8 *addr,
  5371. enum nl80211_key_type key_type, int key_id,
  5372. const u8 *tsc, gfp_t gfp)
  5373. {
  5374. struct sk_buff *msg;
  5375. void *hdr;
  5376. msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp);
  5377. if (!msg)
  5378. return;
  5379. hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_MICHAEL_MIC_FAILURE);
  5380. if (!hdr) {
  5381. nlmsg_free(msg);
  5382. return;
  5383. }
  5384. NLA_PUT_U32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx);
  5385. NLA_PUT_U32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex);
  5386. if (addr)
  5387. NLA_PUT(msg, NL80211_ATTR_MAC, ETH_ALEN, addr);
  5388. NLA_PUT_U32(msg, NL80211_ATTR_KEY_TYPE, key_type);
  5389. if (key_id != -1)
  5390. NLA_PUT_U8(msg, NL80211_ATTR_KEY_IDX, key_id);
  5391. if (tsc)
  5392. NLA_PUT(msg, NL80211_ATTR_KEY_SEQ, 6, tsc);
  5393. if (genlmsg_end(msg, hdr) < 0) {
  5394. nlmsg_free(msg);
  5395. return;
  5396. }
  5397. genlmsg_multicast_netns(wiphy_net(&rdev->wiphy), msg, 0,
  5398. nl80211_mlme_mcgrp.id, gfp);
  5399. return;
  5400. nla_put_failure:
  5401. genlmsg_cancel(msg, hdr);
  5402. nlmsg_free(msg);
  5403. }
  5404. void nl80211_send_beacon_hint_event(struct wiphy *wiphy,
  5405. struct ieee80211_channel *channel_before,
  5406. struct ieee80211_channel *channel_after)
  5407. {
  5408. struct sk_buff *msg;
  5409. void *hdr;
  5410. struct nlattr *nl_freq;
  5411. msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_ATOMIC);
  5412. if (!msg)
  5413. return;
  5414. hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_REG_BEACON_HINT);
  5415. if (!hdr) {
  5416. nlmsg_free(msg);
  5417. return;
  5418. }
  5419. /*
  5420. * Since we are applying the beacon hint to a wiphy we know its
  5421. * wiphy_idx is valid
  5422. */
  5423. NLA_PUT_U32(msg, NL80211_ATTR_WIPHY, get_wiphy_idx(wiphy));
  5424. /* Before */
  5425. nl_freq = nla_nest_start(msg, NL80211_ATTR_FREQ_BEFORE);
  5426. if (!nl_freq)
  5427. goto nla_put_failure;
  5428. if (nl80211_msg_put_channel(msg, channel_before))
  5429. goto nla_put_failure;
  5430. nla_nest_end(msg, nl_freq);
  5431. /* After */
  5432. nl_freq = nla_nest_start(msg, NL80211_ATTR_FREQ_AFTER);
  5433. if (!nl_freq)
  5434. goto nla_put_failure;
  5435. if (nl80211_msg_put_channel(msg, channel_after))
  5436. goto nla_put_failure;
  5437. nla_nest_end(msg, nl_freq);
  5438. if (genlmsg_end(msg, hdr) < 0) {
  5439. nlmsg_free(msg);
  5440. return;
  5441. }
  5442. rcu_read_lock();
  5443. genlmsg_multicast_allns(msg, 0, nl80211_regulatory_mcgrp.id,
  5444. GFP_ATOMIC);
  5445. rcu_read_unlock();
  5446. return;
  5447. nla_put_failure:
  5448. genlmsg_cancel(msg, hdr);
  5449. nlmsg_free(msg);
  5450. }
  5451. static void nl80211_send_remain_on_chan_event(
  5452. int cmd, struct cfg80211_registered_device *rdev,
  5453. struct net_device *netdev, u64 cookie,
  5454. struct ieee80211_channel *chan,
  5455. enum nl80211_channel_type channel_type,
  5456. unsigned int duration, gfp_t gfp)
  5457. {
  5458. struct sk_buff *msg;
  5459. void *hdr;
  5460. msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp);
  5461. if (!msg)
  5462. return;
  5463. hdr = nl80211hdr_put(msg, 0, 0, 0, cmd);
  5464. if (!hdr) {
  5465. nlmsg_free(msg);
  5466. return;
  5467. }
  5468. NLA_PUT_U32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx);
  5469. NLA_PUT_U32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex);
  5470. NLA_PUT_U32(msg, NL80211_ATTR_WIPHY_FREQ, chan->center_freq);
  5471. NLA_PUT_U32(msg, NL80211_ATTR_WIPHY_CHANNEL_TYPE, channel_type);
  5472. NLA_PUT_U64(msg, NL80211_ATTR_COOKIE, cookie);
  5473. if (cmd == NL80211_CMD_REMAIN_ON_CHANNEL)
  5474. NLA_PUT_U32(msg, NL80211_ATTR_DURATION, duration);
  5475. if (genlmsg_end(msg, hdr) < 0) {
  5476. nlmsg_free(msg);
  5477. return;
  5478. }
  5479. genlmsg_multicast_netns(wiphy_net(&rdev->wiphy), msg, 0,
  5480. nl80211_mlme_mcgrp.id, gfp);
  5481. return;
  5482. nla_put_failure:
  5483. genlmsg_cancel(msg, hdr);
  5484. nlmsg_free(msg);
  5485. }
  5486. void nl80211_send_remain_on_channel(struct cfg80211_registered_device *rdev,
  5487. struct net_device *netdev, u64 cookie,
  5488. struct ieee80211_channel *chan,
  5489. enum nl80211_channel_type channel_type,
  5490. unsigned int duration, gfp_t gfp)
  5491. {
  5492. nl80211_send_remain_on_chan_event(NL80211_CMD_REMAIN_ON_CHANNEL,
  5493. rdev, netdev, cookie, chan,
  5494. channel_type, duration, gfp);
  5495. }
  5496. void nl80211_send_remain_on_channel_cancel(
  5497. struct cfg80211_registered_device *rdev, struct net_device *netdev,
  5498. u64 cookie, struct ieee80211_channel *chan,
  5499. enum nl80211_channel_type channel_type, gfp_t gfp)
  5500. {
  5501. nl80211_send_remain_on_chan_event(NL80211_CMD_CANCEL_REMAIN_ON_CHANNEL,
  5502. rdev, netdev, cookie, chan,
  5503. channel_type, 0, gfp);
  5504. }
  5505. void nl80211_send_sta_event(struct cfg80211_registered_device *rdev,
  5506. struct net_device *dev, const u8 *mac_addr,
  5507. struct station_info *sinfo, gfp_t gfp)
  5508. {
  5509. struct sk_buff *msg;
  5510. msg = nlmsg_new(NLMSG_GOODSIZE, gfp);
  5511. if (!msg)
  5512. return;
  5513. if (nl80211_send_station(msg, 0, 0, 0, dev, mac_addr, sinfo) < 0) {
  5514. nlmsg_free(msg);
  5515. return;
  5516. }
  5517. genlmsg_multicast_netns(wiphy_net(&rdev->wiphy), msg, 0,
  5518. nl80211_mlme_mcgrp.id, gfp);
  5519. }
  5520. void nl80211_send_sta_del_event(struct cfg80211_registered_device *rdev,
  5521. struct net_device *dev, const u8 *mac_addr,
  5522. gfp_t gfp)
  5523. {
  5524. struct sk_buff *msg;
  5525. void *hdr;
  5526. msg = nlmsg_new(NLMSG_GOODSIZE, gfp);
  5527. if (!msg)
  5528. return;
  5529. hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_DEL_STATION);
  5530. if (!hdr) {
  5531. nlmsg_free(msg);
  5532. return;
  5533. }
  5534. NLA_PUT_U32(msg, NL80211_ATTR_IFINDEX, dev->ifindex);
  5535. NLA_PUT(msg, NL80211_ATTR_MAC, ETH_ALEN, mac_addr);
  5536. if (genlmsg_end(msg, hdr) < 0) {
  5537. nlmsg_free(msg);
  5538. return;
  5539. }
  5540. genlmsg_multicast_netns(wiphy_net(&rdev->wiphy), msg, 0,
  5541. nl80211_mlme_mcgrp.id, gfp);
  5542. return;
  5543. nla_put_failure:
  5544. genlmsg_cancel(msg, hdr);
  5545. nlmsg_free(msg);
  5546. }
  5547. int nl80211_send_mgmt(struct cfg80211_registered_device *rdev,
  5548. struct net_device *netdev, u32 nlpid,
  5549. int freq, const u8 *buf, size_t len, gfp_t gfp)
  5550. {
  5551. struct sk_buff *msg;
  5552. void *hdr;
  5553. int err;
  5554. msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp);
  5555. if (!msg)
  5556. return -ENOMEM;
  5557. hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_FRAME);
  5558. if (!hdr) {
  5559. nlmsg_free(msg);
  5560. return -ENOMEM;
  5561. }
  5562. NLA_PUT_U32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx);
  5563. NLA_PUT_U32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex);
  5564. NLA_PUT_U32(msg, NL80211_ATTR_WIPHY_FREQ, freq);
  5565. NLA_PUT(msg, NL80211_ATTR_FRAME, len, buf);
  5566. err = genlmsg_end(msg, hdr);
  5567. if (err < 0) {
  5568. nlmsg_free(msg);
  5569. return err;
  5570. }
  5571. err = genlmsg_unicast(wiphy_net(&rdev->wiphy), msg, nlpid);
  5572. if (err < 0)
  5573. return err;
  5574. return 0;
  5575. nla_put_failure:
  5576. genlmsg_cancel(msg, hdr);
  5577. nlmsg_free(msg);
  5578. return -ENOBUFS;
  5579. }
  5580. void nl80211_send_mgmt_tx_status(struct cfg80211_registered_device *rdev,
  5581. struct net_device *netdev, u64 cookie,
  5582. const u8 *buf, size_t len, bool ack,
  5583. gfp_t gfp)
  5584. {
  5585. struct sk_buff *msg;
  5586. void *hdr;
  5587. msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp);
  5588. if (!msg)
  5589. return;
  5590. hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_FRAME_TX_STATUS);
  5591. if (!hdr) {
  5592. nlmsg_free(msg);
  5593. return;
  5594. }
  5595. NLA_PUT_U32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx);
  5596. NLA_PUT_U32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex);
  5597. NLA_PUT(msg, NL80211_ATTR_FRAME, len, buf);
  5598. NLA_PUT_U64(msg, NL80211_ATTR_COOKIE, cookie);
  5599. if (ack)
  5600. NLA_PUT_FLAG(msg, NL80211_ATTR_ACK);
  5601. if (genlmsg_end(msg, hdr) < 0) {
  5602. nlmsg_free(msg);
  5603. return;
  5604. }
  5605. genlmsg_multicast(msg, 0, nl80211_mlme_mcgrp.id, gfp);
  5606. return;
  5607. nla_put_failure:
  5608. genlmsg_cancel(msg, hdr);
  5609. nlmsg_free(msg);
  5610. }
  5611. void
  5612. nl80211_send_cqm_rssi_notify(struct cfg80211_registered_device *rdev,
  5613. struct net_device *netdev,
  5614. enum nl80211_cqm_rssi_threshold_event rssi_event,
  5615. gfp_t gfp)
  5616. {
  5617. struct sk_buff *msg;
  5618. struct nlattr *pinfoattr;
  5619. void *hdr;
  5620. msg = nlmsg_new(NLMSG_GOODSIZE, gfp);
  5621. if (!msg)
  5622. return;
  5623. hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_NOTIFY_CQM);
  5624. if (!hdr) {
  5625. nlmsg_free(msg);
  5626. return;
  5627. }
  5628. NLA_PUT_U32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx);
  5629. NLA_PUT_U32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex);
  5630. pinfoattr = nla_nest_start(msg, NL80211_ATTR_CQM);
  5631. if (!pinfoattr)
  5632. goto nla_put_failure;
  5633. NLA_PUT_U32(msg, NL80211_ATTR_CQM_RSSI_THRESHOLD_EVENT,
  5634. rssi_event);
  5635. nla_nest_end(msg, pinfoattr);
  5636. if (genlmsg_end(msg, hdr) < 0) {
  5637. nlmsg_free(msg);
  5638. return;
  5639. }
  5640. genlmsg_multicast_netns(wiphy_net(&rdev->wiphy), msg, 0,
  5641. nl80211_mlme_mcgrp.id, gfp);
  5642. return;
  5643. nla_put_failure:
  5644. genlmsg_cancel(msg, hdr);
  5645. nlmsg_free(msg);
  5646. }
  5647. void
  5648. nl80211_send_cqm_pktloss_notify(struct cfg80211_registered_device *rdev,
  5649. struct net_device *netdev, const u8 *peer,
  5650. u32 num_packets, gfp_t gfp)
  5651. {
  5652. struct sk_buff *msg;
  5653. struct nlattr *pinfoattr;
  5654. void *hdr;
  5655. msg = nlmsg_new(NLMSG_GOODSIZE, gfp);
  5656. if (!msg)
  5657. return;
  5658. hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_NOTIFY_CQM);
  5659. if (!hdr) {
  5660. nlmsg_free(msg);
  5661. return;
  5662. }
  5663. NLA_PUT_U32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx);
  5664. NLA_PUT_U32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex);
  5665. NLA_PUT(msg, NL80211_ATTR_MAC, ETH_ALEN, peer);
  5666. pinfoattr = nla_nest_start(msg, NL80211_ATTR_CQM);
  5667. if (!pinfoattr)
  5668. goto nla_put_failure;
  5669. NLA_PUT_U32(msg, NL80211_ATTR_CQM_PKT_LOSS_EVENT, num_packets);
  5670. nla_nest_end(msg, pinfoattr);
  5671. if (genlmsg_end(msg, hdr) < 0) {
  5672. nlmsg_free(msg);
  5673. return;
  5674. }
  5675. genlmsg_multicast_netns(wiphy_net(&rdev->wiphy), msg, 0,
  5676. nl80211_mlme_mcgrp.id, gfp);
  5677. return;
  5678. nla_put_failure:
  5679. genlmsg_cancel(msg, hdr);
  5680. nlmsg_free(msg);
  5681. }
  5682. static int nl80211_netlink_notify(struct notifier_block * nb,
  5683. unsigned long state,
  5684. void *_notify)
  5685. {
  5686. struct netlink_notify *notify = _notify;
  5687. struct cfg80211_registered_device *rdev;
  5688. struct wireless_dev *wdev;
  5689. if (state != NETLINK_URELEASE)
  5690. return NOTIFY_DONE;
  5691. rcu_read_lock();
  5692. list_for_each_entry_rcu(rdev, &cfg80211_rdev_list, list)
  5693. list_for_each_entry_rcu(wdev, &rdev->netdev_list, list)
  5694. cfg80211_mlme_unregister_socket(wdev, notify->pid);
  5695. rcu_read_unlock();
  5696. return NOTIFY_DONE;
  5697. }
  5698. static struct notifier_block nl80211_netlink_notifier = {
  5699. .notifier_call = nl80211_netlink_notify,
  5700. };
  5701. /* initialisation/exit functions */
  5702. int nl80211_init(void)
  5703. {
  5704. int err;
  5705. err = genl_register_family_with_ops(&nl80211_fam,
  5706. nl80211_ops, ARRAY_SIZE(nl80211_ops));
  5707. if (err)
  5708. return err;
  5709. err = genl_register_mc_group(&nl80211_fam, &nl80211_config_mcgrp);
  5710. if (err)
  5711. goto err_out;
  5712. err = genl_register_mc_group(&nl80211_fam, &nl80211_scan_mcgrp);
  5713. if (err)
  5714. goto err_out;
  5715. err = genl_register_mc_group(&nl80211_fam, &nl80211_regulatory_mcgrp);
  5716. if (err)
  5717. goto err_out;
  5718. err = genl_register_mc_group(&nl80211_fam, &nl80211_mlme_mcgrp);
  5719. if (err)
  5720. goto err_out;
  5721. #ifdef CONFIG_NL80211_TESTMODE
  5722. err = genl_register_mc_group(&nl80211_fam, &nl80211_testmode_mcgrp);
  5723. if (err)
  5724. goto err_out;
  5725. #endif
  5726. err = netlink_register_notifier(&nl80211_netlink_notifier);
  5727. if (err)
  5728. goto err_out;
  5729. return 0;
  5730. err_out:
  5731. genl_unregister_family(&nl80211_fam);
  5732. return err;
  5733. }
  5734. void nl80211_exit(void)
  5735. {
  5736. netlink_unregister_notifier(&nl80211_netlink_notifier);
  5737. genl_unregister_family(&nl80211_fam);
  5738. }