PageRenderTime 56ms CodeModel.GetById 16ms 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

Large files files are truncated, but you can click here to view the full file

  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. struc

Large files files are truncated, but you can click here to view the full file