PageRenderTime 32ms CodeModel.GetById 13ms RepoModel.GetById 1ms app.codeStats 0ms

/net/wireless/nl80211.c

https://github.com/mstsirkin/kvm
C | 1853 lines | 1482 code | 318 blank | 53 comment | 304 complexity | 6237254259571924a419773758a5545f MD5 | raw 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] = { .type = NLA_BINARY, .len = ETH_ALEN },
  76. [NL80211_ATTR_PREV_BSSID] = { .type = NLA_BINARY, .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] = { .type = NLA_BINARY,
  113. .len = NL80211_HT_CAPABILITY_LEN },
  114. [NL80211_ATTR_MGMT_SUBTYPE] = { .type = NLA_U8 },
  115. [NL80211_ATTR_IE] = { .type = NLA_BINARY,
  116. .len = IEEE80211_MAX_DATA_LEN },
  117. [NL80211_ATTR_SCAN_FREQUENCIES] = { .type = NLA_NESTED },
  118. [NL80211_ATTR_SCAN_SSIDS] = { .type = NLA_NESTED },
  119. [NL80211_ATTR_SSID] = { .type = NLA_BINARY,
  120. .len = IEEE80211_MAX_SSID_LEN },
  121. [NL80211_ATTR_AUTH_TYPE] = { .type = NLA_U32 },
  122. [NL80211_ATTR_REASON_CODE] = { .type = NLA_U16 },
  123. [NL80211_ATTR_FREQ_FIXED] = { .type = NLA_FLAG },
  124. [NL80211_ATTR_TIMED_OUT] = { .type = NLA_FLAG },
  125. [NL80211_ATTR_USE_MFP] = { .type = NLA_U32 },
  126. [NL80211_ATTR_STA_FLAGS2] = {
  127. .len = sizeof(struct nl80211_sta_flag_update),
  128. },
  129. [NL80211_ATTR_CONTROL_PORT] = { .type = NLA_FLAG },
  130. [NL80211_ATTR_CONTROL_PORT_ETHERTYPE] = { .type = NLA_U16 },
  131. [NL80211_ATTR_CONTROL_PORT_NO_ENCRYPT] = { .type = NLA_FLAG },
  132. [NL80211_ATTR_PRIVACY] = { .type = NLA_FLAG },
  133. [NL80211_ATTR_CIPHER_SUITE_GROUP] = { .type = NLA_U32 },
  134. [NL80211_ATTR_WPA_VERSIONS] = { .type = NLA_U32 },
  135. [NL80211_ATTR_PID] = { .type = NLA_U32 },
  136. [NL80211_ATTR_4ADDR] = { .type = NLA_U8 },
  137. [NL80211_ATTR_PMKID] = { .type = NLA_BINARY,
  138. .len = WLAN_PMKID_LEN },
  139. [NL80211_ATTR_DURATION] = { .type = NLA_U32 },
  140. [NL80211_ATTR_COOKIE] = { .type = NLA_U64 },
  141. [NL80211_ATTR_TX_RATES] = { .type = NLA_NESTED },
  142. [NL80211_ATTR_FRAME] = { .type = NLA_BINARY,
  143. .len = IEEE80211_MAX_DATA_LEN },
  144. [NL80211_ATTR_FRAME_MATCH] = { .type = NLA_BINARY, },
  145. [NL80211_ATTR_PS_STATE] = { .type = NLA_U32 },
  146. [NL80211_ATTR_CQM] = { .type = NLA_NESTED, },
  147. [NL80211_ATTR_LOCAL_STATE_CHANGE] = { .type = NLA_FLAG },
  148. [NL80211_ATTR_AP_ISOLATE] = { .type = NLA_U8 },
  149. [NL80211_ATTR_WIPHY_TX_POWER_SETTING] = { .type = NLA_U32 },
  150. [NL80211_ATTR_WIPHY_TX_POWER_LEVEL] = { .type = NLA_U32 },
  151. [NL80211_ATTR_FRAME_TYPE] = { .type = NLA_U16 },
  152. [NL80211_ATTR_WIPHY_ANTENNA_TX] = { .type = NLA_U32 },
  153. [NL80211_ATTR_WIPHY_ANTENNA_RX] = { .type = NLA_U32 },
  154. [NL80211_ATTR_MCAST_RATE] = { .type = NLA_U32 },
  155. [NL80211_ATTR_OFFCHANNEL_TX_OK] = { .type = NLA_FLAG },
  156. [NL80211_ATTR_KEY_DEFAULT_TYPES] = { .type = NLA_NESTED },
  157. [NL80211_ATTR_WOWLAN_TRIGGERS] = { .type = NLA_NESTED },
  158. [NL80211_ATTR_STA_PLINK_STATE] = { .type = NLA_U8 },
  159. [NL80211_ATTR_SCHED_SCAN_INTERVAL] = { .type = NLA_U32 },
  160. [NL80211_ATTR_REKEY_DATA] = { .type = NLA_NESTED },
  161. [NL80211_ATTR_SCAN_SUPP_RATES] = { .type = NLA_NESTED },
  162. };
  163. /* policy for the key attributes */
  164. static const struct nla_policy nl80211_key_policy[NL80211_KEY_MAX + 1] = {
  165. [NL80211_KEY_DATA] = { .type = NLA_BINARY, .len = WLAN_MAX_KEY_LEN },
  166. [NL80211_KEY_IDX] = { .type = NLA_U8 },
  167. [NL80211_KEY_CIPHER] = { .type = NLA_U32 },
  168. [NL80211_KEY_SEQ] = { .type = NLA_BINARY, .len = 8 },
  169. [NL80211_KEY_DEFAULT] = { .type = NLA_FLAG },
  170. [NL80211_KEY_DEFAULT_MGMT] = { .type = NLA_FLAG },
  171. [NL80211_KEY_TYPE] = { .type = NLA_U32 },
  172. [NL80211_KEY_DEFAULT_TYPES] = { .type = NLA_NESTED },
  173. };
  174. /* policy for the key default flags */
  175. static const struct nla_policy
  176. nl80211_key_default_policy[NUM_NL80211_KEY_DEFAULT_TYPES] = {
  177. [NL80211_KEY_DEFAULT_TYPE_UNICAST] = { .type = NLA_FLAG },
  178. [NL80211_KEY_DEFAULT_TYPE_MULTICAST] = { .type = NLA_FLAG },
  179. };
  180. /* policy for WoWLAN attributes */
  181. static const struct nla_policy
  182. nl80211_wowlan_policy[NUM_NL80211_WOWLAN_TRIG] = {
  183. [NL80211_WOWLAN_TRIG_ANY] = { .type = NLA_FLAG },
  184. [NL80211_WOWLAN_TRIG_DISCONNECT] = { .type = NLA_FLAG },
  185. [NL80211_WOWLAN_TRIG_MAGIC_PKT] = { .type = NLA_FLAG },
  186. [NL80211_WOWLAN_TRIG_PKT_PATTERN] = { .type = NLA_NESTED },
  187. [NL80211_WOWLAN_TRIG_GTK_REKEY_FAILURE] = { .type = NLA_FLAG },
  188. [NL80211_WOWLAN_TRIG_EAP_IDENT_REQUEST] = { .type = NLA_FLAG },
  189. [NL80211_WOWLAN_TRIG_4WAY_HANDSHAKE] = { .type = NLA_FLAG },
  190. [NL80211_WOWLAN_TRIG_RFKILL_RELEASE] = { .type = NLA_FLAG },
  191. };
  192. /* policy for GTK rekey offload attributes */
  193. static const struct nla_policy
  194. nl80211_rekey_policy[NUM_NL80211_REKEY_DATA] = {
  195. [NL80211_REKEY_DATA_KEK] = { .len = NL80211_KEK_LEN },
  196. [NL80211_REKEY_DATA_KCK] = { .len = NL80211_KCK_LEN },
  197. [NL80211_REKEY_DATA_REPLAY_CTR] = { .len = NL80211_REPLAY_CTR_LEN },
  198. };
  199. /* ifidx get helper */
  200. static int nl80211_get_ifidx(struct netlink_callback *cb)
  201. {
  202. int res;
  203. res = nlmsg_parse(cb->nlh, GENL_HDRLEN + nl80211_fam.hdrsize,
  204. nl80211_fam.attrbuf, nl80211_fam.maxattr,
  205. nl80211_policy);
  206. if (res)
  207. return res;
  208. if (!nl80211_fam.attrbuf[NL80211_ATTR_IFINDEX])
  209. return -EINVAL;
  210. res = nla_get_u32(nl80211_fam.attrbuf[NL80211_ATTR_IFINDEX]);
  211. if (!res)
  212. return -EINVAL;
  213. return res;
  214. }
  215. static int nl80211_prepare_netdev_dump(struct sk_buff *skb,
  216. struct netlink_callback *cb,
  217. struct cfg80211_registered_device **rdev,
  218. struct net_device **dev)
  219. {
  220. int ifidx = cb->args[0];
  221. int err;
  222. if (!ifidx)
  223. ifidx = nl80211_get_ifidx(cb);
  224. if (ifidx < 0)
  225. return ifidx;
  226. cb->args[0] = ifidx;
  227. rtnl_lock();
  228. *dev = __dev_get_by_index(sock_net(skb->sk), ifidx);
  229. if (!*dev) {
  230. err = -ENODEV;
  231. goto out_rtnl;
  232. }
  233. *rdev = cfg80211_get_dev_from_ifindex(sock_net(skb->sk), ifidx);
  234. if (IS_ERR(*rdev)) {
  235. err = PTR_ERR(*rdev);
  236. goto out_rtnl;
  237. }
  238. return 0;
  239. out_rtnl:
  240. rtnl_unlock();
  241. return err;
  242. }
  243. static void nl80211_finish_netdev_dump(struct cfg80211_registered_device *rdev)
  244. {
  245. cfg80211_unlock_rdev(rdev);
  246. rtnl_unlock();
  247. }
  248. /* IE validation */
  249. static bool is_valid_ie_attr(const struct nlattr *attr)
  250. {
  251. const u8 *pos;
  252. int len;
  253. if (!attr)
  254. return true;
  255. pos = nla_data(attr);
  256. len = nla_len(attr);
  257. while (len) {
  258. u8 elemlen;
  259. if (len < 2)
  260. return false;
  261. len -= 2;
  262. elemlen = pos[1];
  263. if (elemlen > len)
  264. return false;
  265. len -= elemlen;
  266. pos += 2 + elemlen;
  267. }
  268. return true;
  269. }
  270. /* message building helper */
  271. static inline void *nl80211hdr_put(struct sk_buff *skb, u32 pid, u32 seq,
  272. int flags, u8 cmd)
  273. {
  274. /* since there is no private header just add the generic one */
  275. return genlmsg_put(skb, pid, seq, &nl80211_fam, flags, cmd);
  276. }
  277. static int nl80211_msg_put_channel(struct sk_buff *msg,
  278. struct ieee80211_channel *chan)
  279. {
  280. NLA_PUT_U32(msg, NL80211_FREQUENCY_ATTR_FREQ,
  281. chan->center_freq);
  282. if (chan->flags & IEEE80211_CHAN_DISABLED)
  283. NLA_PUT_FLAG(msg, NL80211_FREQUENCY_ATTR_DISABLED);
  284. if (chan->flags & IEEE80211_CHAN_PASSIVE_SCAN)
  285. NLA_PUT_FLAG(msg, NL80211_FREQUENCY_ATTR_PASSIVE_SCAN);
  286. if (chan->flags & IEEE80211_CHAN_NO_IBSS)
  287. NLA_PUT_FLAG(msg, NL80211_FREQUENCY_ATTR_NO_IBSS);
  288. if (chan->flags & IEEE80211_CHAN_RADAR)
  289. NLA_PUT_FLAG(msg, NL80211_FREQUENCY_ATTR_RADAR);
  290. NLA_PUT_U32(msg, NL80211_FREQUENCY_ATTR_MAX_TX_POWER,
  291. DBM_TO_MBM(chan->max_power));
  292. return 0;
  293. nla_put_failure:
  294. return -ENOBUFS;
  295. }
  296. /* netlink command implementations */
  297. struct key_parse {
  298. struct key_params p;
  299. int idx;
  300. int type;
  301. bool def, defmgmt;
  302. bool def_uni, def_multi;
  303. };
  304. static int nl80211_parse_key_new(struct nlattr *key, struct key_parse *k)
  305. {
  306. struct nlattr *tb[NL80211_KEY_MAX + 1];
  307. int err = nla_parse_nested(tb, NL80211_KEY_MAX, key,
  308. nl80211_key_policy);
  309. if (err)
  310. return err;
  311. k->def = !!tb[NL80211_KEY_DEFAULT];
  312. k->defmgmt = !!tb[NL80211_KEY_DEFAULT_MGMT];
  313. if (k->def) {
  314. k->def_uni = true;
  315. k->def_multi = true;
  316. }
  317. if (k->defmgmt)
  318. k->def_multi = true;
  319. if (tb[NL80211_KEY_IDX])
  320. k->idx = nla_get_u8(tb[NL80211_KEY_IDX]);
  321. if (tb[NL80211_KEY_DATA]) {
  322. k->p.key = nla_data(tb[NL80211_KEY_DATA]);
  323. k->p.key_len = nla_len(tb[NL80211_KEY_DATA]);
  324. }
  325. if (tb[NL80211_KEY_SEQ]) {
  326. k->p.seq = nla_data(tb[NL80211_KEY_SEQ]);
  327. k->p.seq_len = nla_len(tb[NL80211_KEY_SEQ]);
  328. }
  329. if (tb[NL80211_KEY_CIPHER])
  330. k->p.cipher = nla_get_u32(tb[NL80211_KEY_CIPHER]);
  331. if (tb[NL80211_KEY_TYPE]) {
  332. k->type = nla_get_u32(tb[NL80211_KEY_TYPE]);
  333. if (k->type < 0 || k->type >= NUM_NL80211_KEYTYPES)
  334. return -EINVAL;
  335. }
  336. if (tb[NL80211_KEY_DEFAULT_TYPES]) {
  337. struct nlattr *kdt[NUM_NL80211_KEY_DEFAULT_TYPES];
  338. int err = nla_parse_nested(kdt,
  339. NUM_NL80211_KEY_DEFAULT_TYPES - 1,
  340. tb[NL80211_KEY_DEFAULT_TYPES],
  341. nl80211_key_default_policy);
  342. if (err)
  343. return err;
  344. k->def_uni = kdt[NL80211_KEY_DEFAULT_TYPE_UNICAST];
  345. k->def_multi = kdt[NL80211_KEY_DEFAULT_TYPE_MULTICAST];
  346. }
  347. return 0;
  348. }
  349. static int nl80211_parse_key_old(struct genl_info *info, struct key_parse *k)
  350. {
  351. if (info->attrs[NL80211_ATTR_KEY_DATA]) {
  352. k->p.key = nla_data(info->attrs[NL80211_ATTR_KEY_DATA]);
  353. k->p.key_len = nla_len(info->attrs[NL80211_ATTR_KEY_DATA]);
  354. }
  355. if (info->attrs[NL80211_ATTR_KEY_SEQ]) {
  356. k->p.seq = nla_data(info->attrs[NL80211_ATTR_KEY_SEQ]);
  357. k->p.seq_len = nla_len(info->attrs[NL80211_ATTR_KEY_SEQ]);
  358. }
  359. if (info->attrs[NL80211_ATTR_KEY_IDX])
  360. k->idx = nla_get_u8(info->attrs[NL80211_ATTR_KEY_IDX]);
  361. if (info->attrs[NL80211_ATTR_KEY_CIPHER])
  362. k->p.cipher = nla_get_u32(info->attrs[NL80211_ATTR_KEY_CIPHER]);
  363. k->def = !!info->attrs[NL80211_ATTR_KEY_DEFAULT];
  364. k->defmgmt = !!info->attrs[NL80211_ATTR_KEY_DEFAULT_MGMT];
  365. if (k->def) {
  366. k->def_uni = true;
  367. k->def_multi = true;
  368. }
  369. if (k->defmgmt)
  370. k->def_multi = true;
  371. if (info->attrs[NL80211_ATTR_KEY_TYPE]) {
  372. k->type = nla_get_u32(info->attrs[NL80211_ATTR_KEY_TYPE]);
  373. if (k->type < 0 || k->type >= NUM_NL80211_KEYTYPES)
  374. return -EINVAL;
  375. }
  376. if (info->attrs[NL80211_ATTR_KEY_DEFAULT_TYPES]) {
  377. struct nlattr *kdt[NUM_NL80211_KEY_DEFAULT_TYPES];
  378. int err = nla_parse_nested(
  379. kdt, NUM_NL80211_KEY_DEFAULT_TYPES - 1,
  380. info->attrs[NL80211_ATTR_KEY_DEFAULT_TYPES],
  381. nl80211_key_default_policy);
  382. if (err)
  383. return err;
  384. k->def_uni = kdt[NL80211_KEY_DEFAULT_TYPE_UNICAST];
  385. k->def_multi = kdt[NL80211_KEY_DEFAULT_TYPE_MULTICAST];
  386. }
  387. return 0;
  388. }
  389. static int nl80211_parse_key(struct genl_info *info, struct key_parse *k)
  390. {
  391. int err;
  392. memset(k, 0, sizeof(*k));
  393. k->idx = -1;
  394. k->type = -1;
  395. if (info->attrs[NL80211_ATTR_KEY])
  396. err = nl80211_parse_key_new(info->attrs[NL80211_ATTR_KEY], k);
  397. else
  398. err = nl80211_parse_key_old(info, k);
  399. if (err)
  400. return err;
  401. if (k->def && k->defmgmt)
  402. return -EINVAL;
  403. if (k->defmgmt) {
  404. if (k->def_uni || !k->def_multi)
  405. return -EINVAL;
  406. }
  407. if (k->idx != -1) {
  408. if (k->defmgmt) {
  409. if (k->idx < 4 || k->idx > 5)
  410. return -EINVAL;
  411. } else if (k->def) {
  412. if (k->idx < 0 || k->idx > 3)
  413. return -EINVAL;
  414. } else {
  415. if (k->idx < 0 || k->idx > 5)
  416. return -EINVAL;
  417. }
  418. }
  419. return 0;
  420. }
  421. static struct cfg80211_cached_keys *
  422. nl80211_parse_connkeys(struct cfg80211_registered_device *rdev,
  423. struct nlattr *keys)
  424. {
  425. struct key_parse parse;
  426. struct nlattr *key;
  427. struct cfg80211_cached_keys *result;
  428. int rem, err, def = 0;
  429. result = kzalloc(sizeof(*result), GFP_KERNEL);
  430. if (!result)
  431. return ERR_PTR(-ENOMEM);
  432. result->def = -1;
  433. result->defmgmt = -1;
  434. nla_for_each_nested(key, keys, rem) {
  435. memset(&parse, 0, sizeof(parse));
  436. parse.idx = -1;
  437. err = nl80211_parse_key_new(key, &parse);
  438. if (err)
  439. goto error;
  440. err = -EINVAL;
  441. if (!parse.p.key)
  442. goto error;
  443. if (parse.idx < 0 || parse.idx > 4)
  444. goto error;
  445. if (parse.def) {
  446. if (def)
  447. goto error;
  448. def = 1;
  449. result->def = parse.idx;
  450. if (!parse.def_uni || !parse.def_multi)
  451. goto error;
  452. } else if (parse.defmgmt)
  453. goto error;
  454. err = cfg80211_validate_key_settings(rdev, &parse.p,
  455. parse.idx, false, NULL);
  456. if (err)
  457. goto error;
  458. result->params[parse.idx].cipher = parse.p.cipher;
  459. result->params[parse.idx].key_len = parse.p.key_len;
  460. result->params[parse.idx].key = result->data[parse.idx];
  461. memcpy(result->data[parse.idx], parse.p.key, parse.p.key_len);
  462. }
  463. return result;
  464. error:
  465. kfree(result);
  466. return ERR_PTR(err);
  467. }
  468. static int nl80211_key_allowed(struct wireless_dev *wdev)
  469. {
  470. ASSERT_WDEV_LOCK(wdev);
  471. switch (wdev->iftype) {
  472. case NL80211_IFTYPE_AP:
  473. case NL80211_IFTYPE_AP_VLAN:
  474. case NL80211_IFTYPE_P2P_GO:
  475. case NL80211_IFTYPE_MESH_POINT:
  476. break;
  477. case NL80211_IFTYPE_ADHOC:
  478. if (!wdev->current_bss)
  479. return -ENOLINK;
  480. break;
  481. case NL80211_IFTYPE_STATION:
  482. case NL80211_IFTYPE_P2P_CLIENT:
  483. if (wdev->sme_state != CFG80211_SME_CONNECTED)
  484. return -ENOLINK;
  485. break;
  486. default:
  487. return -EINVAL;
  488. }
  489. return 0;
  490. }
  491. static int nl80211_put_iftypes(struct sk_buff *msg, u32 attr, u16 ifmodes)
  492. {
  493. struct nlattr *nl_modes = nla_nest_start(msg, attr);
  494. int i;
  495. if (!nl_modes)
  496. goto nla_put_failure;
  497. i = 0;
  498. while (ifmodes) {
  499. if (ifmodes & 1)
  500. NLA_PUT_FLAG(msg, i);
  501. ifmodes >>= 1;
  502. i++;
  503. }
  504. nla_nest_end(msg, nl_modes);
  505. return 0;
  506. nla_put_failure:
  507. return -ENOBUFS;
  508. }
  509. static int nl80211_put_iface_combinations(struct wiphy *wiphy,
  510. struct sk_buff *msg)
  511. {
  512. struct nlattr *nl_combis;
  513. int i, j;
  514. nl_combis = nla_nest_start(msg,
  515. NL80211_ATTR_INTERFACE_COMBINATIONS);
  516. if (!nl_combis)
  517. goto nla_put_failure;
  518. for (i = 0; i < wiphy->n_iface_combinations; i++) {
  519. const struct ieee80211_iface_combination *c;
  520. struct nlattr *nl_combi, *nl_limits;
  521. c = &wiphy->iface_combinations[i];
  522. nl_combi = nla_nest_start(msg, i + 1);
  523. if (!nl_combi)
  524. goto nla_put_failure;
  525. nl_limits = nla_nest_start(msg, NL80211_IFACE_COMB_LIMITS);
  526. if (!nl_limits)
  527. goto nla_put_failure;
  528. for (j = 0; j < c->n_limits; j++) {
  529. struct nlattr *nl_limit;
  530. nl_limit = nla_nest_start(msg, j + 1);
  531. if (!nl_limit)
  532. goto nla_put_failure;
  533. NLA_PUT_U32(msg, NL80211_IFACE_LIMIT_MAX,
  534. c->limits[j].max);
  535. if (nl80211_put_iftypes(msg, NL80211_IFACE_LIMIT_TYPES,
  536. c->limits[j].types))
  537. goto nla_put_failure;
  538. nla_nest_end(msg, nl_limit);
  539. }
  540. nla_nest_end(msg, nl_limits);
  541. if (c->beacon_int_infra_match)
  542. NLA_PUT_FLAG(msg,
  543. NL80211_IFACE_COMB_STA_AP_BI_MATCH);
  544. NLA_PUT_U32(msg, NL80211_IFACE_COMB_NUM_CHANNELS,
  545. c->num_different_channels);
  546. NLA_PUT_U32(msg, NL80211_IFACE_COMB_MAXNUM,
  547. c->max_interfaces);
  548. nla_nest_end(msg, nl_combi);
  549. }
  550. nla_nest_end(msg, nl_combis);
  551. return 0;
  552. nla_put_failure:
  553. return -ENOBUFS;
  554. }
  555. static int nl80211_send_wiphy(struct sk_buff *msg, u32 pid, u32 seq, int flags,
  556. struct cfg80211_registered_device *dev)
  557. {
  558. void *hdr;
  559. struct nlattr *nl_bands, *nl_band;
  560. struct nlattr *nl_freqs, *nl_freq;
  561. struct nlattr *nl_rates, *nl_rate;
  562. struct nlattr *nl_cmds;
  563. enum ieee80211_band band;
  564. struct ieee80211_channel *chan;
  565. struct ieee80211_rate *rate;
  566. int i;
  567. const struct ieee80211_txrx_stypes *mgmt_stypes =
  568. dev->wiphy.mgmt_stypes;
  569. hdr = nl80211hdr_put(msg, pid, seq, flags, NL80211_CMD_NEW_WIPHY);
  570. if (!hdr)
  571. return -1;
  572. NLA_PUT_U32(msg, NL80211_ATTR_WIPHY, dev->wiphy_idx);
  573. NLA_PUT_STRING(msg, NL80211_ATTR_WIPHY_NAME, wiphy_name(&dev->wiphy));
  574. NLA_PUT_U32(msg, NL80211_ATTR_GENERATION,
  575. cfg80211_rdev_list_generation);
  576. NLA_PUT_U8(msg, NL80211_ATTR_WIPHY_RETRY_SHORT,
  577. dev->wiphy.retry_short);
  578. NLA_PUT_U8(msg, NL80211_ATTR_WIPHY_RETRY_LONG,
  579. dev->wiphy.retry_long);
  580. NLA_PUT_U32(msg, NL80211_ATTR_WIPHY_FRAG_THRESHOLD,
  581. dev->wiphy.frag_threshold);
  582. NLA_PUT_U32(msg, NL80211_ATTR_WIPHY_RTS_THRESHOLD,
  583. dev->wiphy.rts_threshold);
  584. NLA_PUT_U8(msg, NL80211_ATTR_WIPHY_COVERAGE_CLASS,
  585. dev->wiphy.coverage_class);
  586. NLA_PUT_U8(msg, NL80211_ATTR_MAX_NUM_SCAN_SSIDS,
  587. dev->wiphy.max_scan_ssids);
  588. NLA_PUT_U8(msg, NL80211_ATTR_MAX_NUM_SCHED_SCAN_SSIDS,
  589. dev->wiphy.max_sched_scan_ssids);
  590. NLA_PUT_U16(msg, NL80211_ATTR_MAX_SCAN_IE_LEN,
  591. dev->wiphy.max_scan_ie_len);
  592. NLA_PUT_U16(msg, NL80211_ATTR_MAX_SCHED_SCAN_IE_LEN,
  593. dev->wiphy.max_sched_scan_ie_len);
  594. if (dev->wiphy.flags & WIPHY_FLAG_IBSS_RSN)
  595. NLA_PUT_FLAG(msg, NL80211_ATTR_SUPPORT_IBSS_RSN);
  596. if (dev->wiphy.flags & WIPHY_FLAG_MESH_AUTH)
  597. NLA_PUT_FLAG(msg, NL80211_ATTR_SUPPORT_MESH_AUTH);
  598. NLA_PUT(msg, NL80211_ATTR_CIPHER_SUITES,
  599. sizeof(u32) * dev->wiphy.n_cipher_suites,
  600. dev->wiphy.cipher_suites);
  601. NLA_PUT_U8(msg, NL80211_ATTR_MAX_NUM_PMKIDS,
  602. dev->wiphy.max_num_pmkids);
  603. if (dev->wiphy.flags & WIPHY_FLAG_CONTROL_PORT_PROTOCOL)
  604. NLA_PUT_FLAG(msg, NL80211_ATTR_CONTROL_PORT_ETHERTYPE);
  605. NLA_PUT_U32(msg, NL80211_ATTR_WIPHY_ANTENNA_AVAIL_TX,
  606. dev->wiphy.available_antennas_tx);
  607. NLA_PUT_U32(msg, NL80211_ATTR_WIPHY_ANTENNA_AVAIL_RX,
  608. dev->wiphy.available_antennas_rx);
  609. if ((dev->wiphy.available_antennas_tx ||
  610. dev->wiphy.available_antennas_rx) && dev->ops->get_antenna) {
  611. u32 tx_ant = 0, rx_ant = 0;
  612. int res;
  613. res = dev->ops->get_antenna(&dev->wiphy, &tx_ant, &rx_ant);
  614. if (!res) {
  615. NLA_PUT_U32(msg, NL80211_ATTR_WIPHY_ANTENNA_TX, tx_ant);
  616. NLA_PUT_U32(msg, NL80211_ATTR_WIPHY_ANTENNA_RX, rx_ant);
  617. }
  618. }
  619. if (nl80211_put_iftypes(msg, NL80211_ATTR_SUPPORTED_IFTYPES,
  620. dev->wiphy.interface_modes))
  621. goto nla_put_failure;
  622. nl_bands = nla_nest_start(msg, NL80211_ATTR_WIPHY_BANDS);
  623. if (!nl_bands)
  624. goto nla_put_failure;
  625. for (band = 0; band < IEEE80211_NUM_BANDS; band++) {
  626. if (!dev->wiphy.bands[band])
  627. continue;
  628. nl_band = nla_nest_start(msg, band);
  629. if (!nl_band)
  630. goto nla_put_failure;
  631. /* add HT info */
  632. if (dev->wiphy.bands[band]->ht_cap.ht_supported) {
  633. NLA_PUT(msg, NL80211_BAND_ATTR_HT_MCS_SET,
  634. sizeof(dev->wiphy.bands[band]->ht_cap.mcs),
  635. &dev->wiphy.bands[band]->ht_cap.mcs);
  636. NLA_PUT_U16(msg, NL80211_BAND_ATTR_HT_CAPA,
  637. dev->wiphy.bands[band]->ht_cap.cap);
  638. NLA_PUT_U8(msg, NL80211_BAND_ATTR_HT_AMPDU_FACTOR,
  639. dev->wiphy.bands[band]->ht_cap.ampdu_factor);
  640. NLA_PUT_U8(msg, NL80211_BAND_ATTR_HT_AMPDU_DENSITY,
  641. dev->wiphy.bands[band]->ht_cap.ampdu_density);
  642. }
  643. /* add frequencies */
  644. nl_freqs = nla_nest_start(msg, NL80211_BAND_ATTR_FREQS);
  645. if (!nl_freqs)
  646. goto nla_put_failure;
  647. for (i = 0; i < dev->wiphy.bands[band]->n_channels; i++) {
  648. nl_freq = nla_nest_start(msg, i);
  649. if (!nl_freq)
  650. goto nla_put_failure;
  651. chan = &dev->wiphy.bands[band]->channels[i];
  652. if (nl80211_msg_put_channel(msg, chan))
  653. goto nla_put_failure;
  654. nla_nest_end(msg, nl_freq);
  655. }
  656. nla_nest_end(msg, nl_freqs);
  657. /* add bitrates */
  658. nl_rates = nla_nest_start(msg, NL80211_BAND_ATTR_RATES);
  659. if (!nl_rates)
  660. goto nla_put_failure;
  661. for (i = 0; i < dev->wiphy.bands[band]->n_bitrates; i++) {
  662. nl_rate = nla_nest_start(msg, i);
  663. if (!nl_rate)
  664. goto nla_put_failure;
  665. rate = &dev->wiphy.bands[band]->bitrates[i];
  666. NLA_PUT_U32(msg, NL80211_BITRATE_ATTR_RATE,
  667. rate->bitrate);
  668. if (rate->flags & IEEE80211_RATE_SHORT_PREAMBLE)
  669. NLA_PUT_FLAG(msg,
  670. NL80211_BITRATE_ATTR_2GHZ_SHORTPREAMBLE);
  671. nla_nest_end(msg, nl_rate);
  672. }
  673. nla_nest_end(msg, nl_rates);
  674. nla_nest_end(msg, nl_band);
  675. }
  676. nla_nest_end(msg, nl_bands);
  677. nl_cmds = nla_nest_start(msg, NL80211_ATTR_SUPPORTED_COMMANDS);
  678. if (!nl_cmds)
  679. goto nla_put_failure;
  680. i = 0;
  681. #define CMD(op, n) \
  682. do { \
  683. if (dev->ops->op) { \
  684. i++; \
  685. NLA_PUT_U32(msg, i, NL80211_CMD_ ## n); \
  686. } \
  687. } while (0)
  688. CMD(add_virtual_intf, NEW_INTERFACE);
  689. CMD(change_virtual_intf, SET_INTERFACE);
  690. CMD(add_key, NEW_KEY);
  691. CMD(add_beacon, NEW_BEACON);
  692. CMD(add_station, NEW_STATION);
  693. CMD(add_mpath, NEW_MPATH);
  694. CMD(update_mesh_config, SET_MESH_CONFIG);
  695. CMD(change_bss, SET_BSS);
  696. CMD(auth, AUTHENTICATE);
  697. CMD(assoc, ASSOCIATE);
  698. CMD(deauth, DEAUTHENTICATE);
  699. CMD(disassoc, DISASSOCIATE);
  700. CMD(join_ibss, JOIN_IBSS);
  701. CMD(join_mesh, JOIN_MESH);
  702. CMD(set_pmksa, SET_PMKSA);
  703. CMD(del_pmksa, DEL_PMKSA);
  704. CMD(flush_pmksa, FLUSH_PMKSA);
  705. CMD(remain_on_channel, REMAIN_ON_CHANNEL);
  706. CMD(set_bitrate_mask, SET_TX_BITRATE_MASK);
  707. CMD(mgmt_tx, FRAME);
  708. CMD(mgmt_tx_cancel_wait, FRAME_WAIT_CANCEL);
  709. if (dev->wiphy.flags & WIPHY_FLAG_NETNS_OK) {
  710. i++;
  711. NLA_PUT_U32(msg, i, NL80211_CMD_SET_WIPHY_NETNS);
  712. }
  713. CMD(set_channel, SET_CHANNEL);
  714. CMD(set_wds_peer, SET_WDS_PEER);
  715. if (dev->wiphy.flags & WIPHY_FLAG_SUPPORTS_SCHED_SCAN)
  716. CMD(sched_scan_start, START_SCHED_SCAN);
  717. #undef CMD
  718. if (dev->ops->connect || dev->ops->auth) {
  719. i++;
  720. NLA_PUT_U32(msg, i, NL80211_CMD_CONNECT);
  721. }
  722. if (dev->ops->disconnect || dev->ops->deauth) {
  723. i++;
  724. NLA_PUT_U32(msg, i, NL80211_CMD_DISCONNECT);
  725. }
  726. nla_nest_end(msg, nl_cmds);
  727. if (dev->ops->remain_on_channel)
  728. NLA_PUT_U32(msg, NL80211_ATTR_MAX_REMAIN_ON_CHANNEL_DURATION,
  729. dev->wiphy.max_remain_on_channel_duration);
  730. /* for now at least assume all drivers have it */
  731. if (dev->ops->mgmt_tx)
  732. NLA_PUT_FLAG(msg, NL80211_ATTR_OFFCHANNEL_TX_OK);
  733. if (mgmt_stypes) {
  734. u16 stypes;
  735. struct nlattr *nl_ftypes, *nl_ifs;
  736. enum nl80211_iftype ift;
  737. nl_ifs = nla_nest_start(msg, NL80211_ATTR_TX_FRAME_TYPES);
  738. if (!nl_ifs)
  739. goto nla_put_failure;
  740. for (ift = 0; ift < NUM_NL80211_IFTYPES; ift++) {
  741. nl_ftypes = nla_nest_start(msg, ift);
  742. if (!nl_ftypes)
  743. goto nla_put_failure;
  744. i = 0;
  745. stypes = mgmt_stypes[ift].tx;
  746. while (stypes) {
  747. if (stypes & 1)
  748. NLA_PUT_U16(msg, NL80211_ATTR_FRAME_TYPE,
  749. (i << 4) | IEEE80211_FTYPE_MGMT);
  750. stypes >>= 1;
  751. i++;
  752. }
  753. nla_nest_end(msg, nl_ftypes);
  754. }
  755. nla_nest_end(msg, nl_ifs);
  756. nl_ifs = nla_nest_start(msg, NL80211_ATTR_RX_FRAME_TYPES);
  757. if (!nl_ifs)
  758. goto nla_put_failure;
  759. for (ift = 0; ift < NUM_NL80211_IFTYPES; ift++) {
  760. nl_ftypes = nla_nest_start(msg, ift);
  761. if (!nl_ftypes)
  762. goto nla_put_failure;
  763. i = 0;
  764. stypes = mgmt_stypes[ift].rx;
  765. while (stypes) {
  766. if (stypes & 1)
  767. NLA_PUT_U16(msg, NL80211_ATTR_FRAME_TYPE,
  768. (i << 4) | IEEE80211_FTYPE_MGMT);
  769. stypes >>= 1;
  770. i++;
  771. }
  772. nla_nest_end(msg, nl_ftypes);
  773. }
  774. nla_nest_end(msg, nl_ifs);
  775. }
  776. if (dev->wiphy.wowlan.flags || dev->wiphy.wowlan.n_patterns) {
  777. struct nlattr *nl_wowlan;
  778. nl_wowlan = nla_nest_start(msg,
  779. NL80211_ATTR_WOWLAN_TRIGGERS_SUPPORTED);
  780. if (!nl_wowlan)
  781. goto nla_put_failure;
  782. if (dev->wiphy.wowlan.flags & WIPHY_WOWLAN_ANY)
  783. NLA_PUT_FLAG(msg, NL80211_WOWLAN_TRIG_ANY);
  784. if (dev->wiphy.wowlan.flags & WIPHY_WOWLAN_DISCONNECT)
  785. NLA_PUT_FLAG(msg, NL80211_WOWLAN_TRIG_DISCONNECT);
  786. if (dev->wiphy.wowlan.flags & WIPHY_WOWLAN_MAGIC_PKT)
  787. NLA_PUT_FLAG(msg, NL80211_WOWLAN_TRIG_MAGIC_PKT);
  788. if (dev->wiphy.wowlan.flags & WIPHY_WOWLAN_SUPPORTS_GTK_REKEY)
  789. NLA_PUT_FLAG(msg, NL80211_WOWLAN_TRIG_GTK_REKEY_SUPPORTED);
  790. if (dev->wiphy.wowlan.flags & WIPHY_WOWLAN_GTK_REKEY_FAILURE)
  791. NLA_PUT_FLAG(msg, NL80211_WOWLAN_TRIG_GTK_REKEY_FAILURE);
  792. if (dev->wiphy.wowlan.flags & WIPHY_WOWLAN_EAP_IDENTITY_REQ)
  793. NLA_PUT_FLAG(msg, NL80211_WOWLAN_TRIG_EAP_IDENT_REQUEST);
  794. if (dev->wiphy.wowlan.flags & WIPHY_WOWLAN_4WAY_HANDSHAKE)
  795. NLA_PUT_FLAG(msg, NL80211_WOWLAN_TRIG_4WAY_HANDSHAKE);
  796. if (dev->wiphy.wowlan.flags & WIPHY_WOWLAN_RFKILL_RELEASE)
  797. NLA_PUT_FLAG(msg, NL80211_WOWLAN_TRIG_RFKILL_RELEASE);
  798. if (dev->wiphy.wowlan.n_patterns) {
  799. struct nl80211_wowlan_pattern_support pat = {
  800. .max_patterns = dev->wiphy.wowlan.n_patterns,
  801. .min_pattern_len =
  802. dev->wiphy.wowlan.pattern_min_len,
  803. .max_pattern_len =
  804. dev->wiphy.wowlan.pattern_max_len,
  805. };
  806. NLA_PUT(msg, NL80211_WOWLAN_TRIG_PKT_PATTERN,
  807. sizeof(pat), &pat);
  808. }
  809. nla_nest_end(msg, nl_wowlan);
  810. }
  811. if (nl80211_put_iftypes(msg, NL80211_ATTR_SOFTWARE_IFTYPES,
  812. dev->wiphy.software_iftypes))
  813. goto nla_put_failure;
  814. if (nl80211_put_iface_combinations(&dev->wiphy, msg))
  815. goto nla_put_failure;
  816. return genlmsg_end(msg, hdr);
  817. nla_put_failure:
  818. genlmsg_cancel(msg, hdr);
  819. return -EMSGSIZE;
  820. }
  821. static int nl80211_dump_wiphy(struct sk_buff *skb, struct netlink_callback *cb)
  822. {
  823. int idx = 0;
  824. int start = cb->args[0];
  825. struct cfg80211_registered_device *dev;
  826. mutex_lock(&cfg80211_mutex);
  827. list_for_each_entry(dev, &cfg80211_rdev_list, list) {
  828. if (!net_eq(wiphy_net(&dev->wiphy), sock_net(skb->sk)))
  829. continue;
  830. if (++idx <= start)
  831. continue;
  832. if (nl80211_send_wiphy(skb, NETLINK_CB(cb->skb).pid,
  833. cb->nlh->nlmsg_seq, NLM_F_MULTI,
  834. dev) < 0) {
  835. idx--;
  836. break;
  837. }
  838. }
  839. mutex_unlock(&cfg80211_mutex);
  840. cb->args[0] = idx;
  841. return skb->len;
  842. }
  843. static int nl80211_get_wiphy(struct sk_buff *skb, struct genl_info *info)
  844. {
  845. struct sk_buff *msg;
  846. struct cfg80211_registered_device *dev = info->user_ptr[0];
  847. msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
  848. if (!msg)
  849. return -ENOMEM;
  850. if (nl80211_send_wiphy(msg, info->snd_pid, info->snd_seq, 0, dev) < 0) {
  851. nlmsg_free(msg);
  852. return -ENOBUFS;
  853. }
  854. return genlmsg_reply(msg, info);
  855. }
  856. static const struct nla_policy txq_params_policy[NL80211_TXQ_ATTR_MAX + 1] = {
  857. [NL80211_TXQ_ATTR_QUEUE] = { .type = NLA_U8 },
  858. [NL80211_TXQ_ATTR_TXOP] = { .type = NLA_U16 },
  859. [NL80211_TXQ_ATTR_CWMIN] = { .type = NLA_U16 },
  860. [NL80211_TXQ_ATTR_CWMAX] = { .type = NLA_U16 },
  861. [NL80211_TXQ_ATTR_AIFS] = { .type = NLA_U8 },
  862. };
  863. static int parse_txq_params(struct nlattr *tb[],
  864. struct ieee80211_txq_params *txq_params)
  865. {
  866. if (!tb[NL80211_TXQ_ATTR_QUEUE] || !tb[NL80211_TXQ_ATTR_TXOP] ||
  867. !tb[NL80211_TXQ_ATTR_CWMIN] || !tb[NL80211_TXQ_ATTR_CWMAX] ||
  868. !tb[NL80211_TXQ_ATTR_AIFS])
  869. return -EINVAL;
  870. txq_params->queue = nla_get_u8(tb[NL80211_TXQ_ATTR_QUEUE]);
  871. txq_params->txop = nla_get_u16(tb[NL80211_TXQ_ATTR_TXOP]);
  872. txq_params->cwmin = nla_get_u16(tb[NL80211_TXQ_ATTR_CWMIN]);
  873. txq_params->cwmax = nla_get_u16(tb[NL80211_TXQ_ATTR_CWMAX]);
  874. txq_params->aifs = nla_get_u8(tb[NL80211_TXQ_ATTR_AIFS]);
  875. return 0;
  876. }
  877. static bool nl80211_can_set_dev_channel(struct wireless_dev *wdev)
  878. {
  879. /*
  880. * You can only set the channel explicitly for AP, mesh
  881. * and WDS type interfaces; all others have their channel
  882. * managed via their respective "establish a connection"
  883. * command (connect, join, ...)
  884. *
  885. * Monitors are special as they are normally slaved to
  886. * whatever else is going on, so they behave as though
  887. * you tried setting the wiphy channel itself.
  888. */
  889. return !wdev ||
  890. wdev->iftype == NL80211_IFTYPE_AP ||
  891. wdev->iftype == NL80211_IFTYPE_WDS ||
  892. wdev->iftype == NL80211_IFTYPE_MESH_POINT ||
  893. wdev->iftype == NL80211_IFTYPE_MONITOR ||
  894. wdev->iftype == NL80211_IFTYPE_P2P_GO;
  895. }
  896. static int __nl80211_set_channel(struct cfg80211_registered_device *rdev,
  897. struct wireless_dev *wdev,
  898. struct genl_info *info)
  899. {
  900. enum nl80211_channel_type channel_type = NL80211_CHAN_NO_HT;
  901. u32 freq;
  902. int result;
  903. if (!info->attrs[NL80211_ATTR_WIPHY_FREQ])
  904. return -EINVAL;
  905. if (!nl80211_can_set_dev_channel(wdev))
  906. return -EOPNOTSUPP;
  907. if (info->attrs[NL80211_ATTR_WIPHY_CHANNEL_TYPE]) {
  908. channel_type = nla_get_u32(info->attrs[
  909. NL80211_ATTR_WIPHY_CHANNEL_TYPE]);
  910. if (channel_type != NL80211_CHAN_NO_HT &&
  911. channel_type != NL80211_CHAN_HT20 &&
  912. channel_type != NL80211_CHAN_HT40PLUS &&
  913. channel_type != NL80211_CHAN_HT40MINUS)
  914. return -EINVAL;
  915. }
  916. freq = nla_get_u32(info->attrs[NL80211_ATTR_WIPHY_FREQ]);
  917. mutex_lock(&rdev->devlist_mtx);
  918. if (wdev) {
  919. wdev_lock(wdev);
  920. result = cfg80211_set_freq(rdev, wdev, freq, channel_type);
  921. wdev_unlock(wdev);
  922. } else {
  923. result = cfg80211_set_freq(rdev, NULL, freq, channel_type);
  924. }
  925. mutex_unlock(&rdev->devlist_mtx);
  926. return result;
  927. }
  928. static int nl80211_set_channel(struct sk_buff *skb, struct genl_info *info)
  929. {
  930. struct cfg80211_registered_device *rdev = info->user_ptr[0];
  931. struct net_device *netdev = info->user_ptr[1];
  932. return __nl80211_set_channel(rdev, netdev->ieee80211_ptr, info);
  933. }
  934. static int nl80211_set_wds_peer(struct sk_buff *skb, struct genl_info *info)
  935. {
  936. struct cfg80211_registered_device *rdev = info->user_ptr[0];
  937. struct net_device *dev = info->user_ptr[1];
  938. struct wireless_dev *wdev = dev->ieee80211_ptr;
  939. const u8 *bssid;
  940. if (!info->attrs[NL80211_ATTR_MAC])
  941. return -EINVAL;
  942. if (netif_running(dev))
  943. return -EBUSY;
  944. if (!rdev->ops->set_wds_peer)
  945. return -EOPNOTSUPP;
  946. if (wdev->iftype != NL80211_IFTYPE_WDS)
  947. return -EOPNOTSUPP;
  948. bssid = nla_data(info->attrs[NL80211_ATTR_MAC]);
  949. return rdev->ops->set_wds_peer(wdev->wiphy, dev, bssid);
  950. }
  951. static int nl80211_set_wiphy(struct sk_buff *skb, struct genl_info *info)
  952. {
  953. struct cfg80211_registered_device *rdev;
  954. struct net_device *netdev = NULL;
  955. struct wireless_dev *wdev;
  956. int result = 0, rem_txq_params = 0;
  957. struct nlattr *nl_txq_params;
  958. u32 changed;
  959. u8 retry_short = 0, retry_long = 0;
  960. u32 frag_threshold = 0, rts_threshold = 0;
  961. u8 coverage_class = 0;
  962. /*
  963. * Try to find the wiphy and netdev. Normally this
  964. * function shouldn't need the netdev, but this is
  965. * done for backward compatibility -- previously
  966. * setting the channel was done per wiphy, but now
  967. * it is per netdev. Previous userland like hostapd
  968. * also passed a netdev to set_wiphy, so that it is
  969. * possible to let that go to the right netdev!
  970. */
  971. mutex_lock(&cfg80211_mutex);
  972. if (info->attrs[NL80211_ATTR_IFINDEX]) {
  973. int ifindex = nla_get_u32(info->attrs[NL80211_ATTR_IFINDEX]);
  974. netdev = dev_get_by_index(genl_info_net(info), ifindex);
  975. if (netdev && netdev->ieee80211_ptr) {
  976. rdev = wiphy_to_dev(netdev->ieee80211_ptr->wiphy);
  977. mutex_lock(&rdev->mtx);
  978. } else
  979. netdev = NULL;
  980. }
  981. if (!netdev) {
  982. rdev = __cfg80211_rdev_from_info(info);
  983. if (IS_ERR(rdev)) {
  984. mutex_unlock(&cfg80211_mutex);
  985. return PTR_ERR(rdev);
  986. }
  987. wdev = NULL;
  988. netdev = NULL;
  989. result = 0;
  990. mutex_lock(&rdev->mtx);
  991. } else if (netif_running(netdev) &&
  992. nl80211_can_set_dev_channel(netdev->ieee80211_ptr))
  993. wdev = netdev->ieee80211_ptr;
  994. else
  995. wdev = NULL;
  996. /*
  997. * end workaround code, by now the rdev is available
  998. * and locked, and wdev may or may not be NULL.
  999. */
  1000. if (info->attrs[NL80211_ATTR_WIPHY_NAME])
  1001. result = cfg80211_dev_rename(
  1002. rdev, nla_data(info->attrs[NL80211_ATTR_WIPHY_NAME]));
  1003. mutex_unlock(&cfg80211_mutex);
  1004. if (result)
  1005. goto bad_res;
  1006. if (info->attrs[NL80211_ATTR_WIPHY_TXQ_PARAMS]) {
  1007. struct ieee80211_txq_params txq_params;
  1008. struct nlattr *tb[NL80211_TXQ_ATTR_MAX + 1];
  1009. if (!rdev->ops->set_txq_params) {
  1010. result = -EOPNOTSUPP;
  1011. goto bad_res;
  1012. }
  1013. nla_for_each_nested(nl_txq_params,
  1014. info->attrs[NL80211_ATTR_WIPHY_TXQ_PARAMS],
  1015. rem_txq_params) {
  1016. nla_parse(tb, NL80211_TXQ_ATTR_MAX,
  1017. nla_data(nl_txq_params),
  1018. nla_len(nl_txq_params),
  1019. txq_params_policy);
  1020. result = parse_txq_params(tb, &txq_params);
  1021. if (result)
  1022. goto bad_res;
  1023. result = rdev->ops->set_txq_params(&rdev->wiphy,
  1024. &txq_params);
  1025. if (result)
  1026. goto bad_res;
  1027. }
  1028. }
  1029. if (info->attrs[NL80211_ATTR_WIPHY_FREQ]) {
  1030. result = __nl80211_set_channel(rdev, wdev, info);
  1031. if (result)
  1032. goto bad_res;
  1033. }
  1034. if (info->attrs[NL80211_ATTR_WIPHY_TX_POWER_SETTING]) {
  1035. enum nl80211_tx_power_setting type;
  1036. int idx, mbm = 0;
  1037. if (!rdev->ops->set_tx_power) {
  1038. result = -EOPNOTSUPP;
  1039. goto bad_res;
  1040. }
  1041. idx = NL80211_ATTR_WIPHY_TX_POWER_SETTING;
  1042. type = nla_get_u32(info->attrs[idx]);
  1043. if (!info->attrs[NL80211_ATTR_WIPHY_TX_POWER_LEVEL] &&
  1044. (type != NL80211_TX_POWER_AUTOMATIC)) {
  1045. result = -EINVAL;
  1046. goto bad_res;
  1047. }
  1048. if (type != NL80211_TX_POWER_AUTOMATIC) {
  1049. idx = NL80211_ATTR_WIPHY_TX_POWER_LEVEL;
  1050. mbm = nla_get_u32(info->attrs[idx]);
  1051. }
  1052. result = rdev->ops->set_tx_power(&rdev->wiphy, type, mbm);
  1053. if (result)
  1054. goto bad_res;
  1055. }
  1056. if (info->attrs[NL80211_ATTR_WIPHY_ANTENNA_TX] &&
  1057. info->attrs[NL80211_ATTR_WIPHY_ANTENNA_RX]) {
  1058. u32 tx_ant, rx_ant;
  1059. if ((!rdev->wiphy.available_antennas_tx &&
  1060. !rdev->wiphy.available_antennas_rx) ||
  1061. !rdev->ops->set_antenna) {
  1062. result = -EOPNOTSUPP;
  1063. goto bad_res;
  1064. }
  1065. tx_ant = nla_get_u32(info->attrs[NL80211_ATTR_WIPHY_ANTENNA_TX]);
  1066. rx_ant = nla_get_u32(info->attrs[NL80211_ATTR_WIPHY_ANTENNA_RX]);
  1067. /* reject antenna configurations which don't match the
  1068. * available antenna masks, except for the "all" mask */
  1069. if ((~tx_ant && (tx_ant & ~rdev->wiphy.available_antennas_tx)) ||
  1070. (~rx_ant && (rx_ant & ~rdev->wiphy.available_antennas_rx))) {
  1071. result = -EINVAL;
  1072. goto bad_res;
  1073. }
  1074. tx_ant = tx_ant & rdev->wiphy.available_antennas_tx;
  1075. rx_ant = rx_ant & rdev->wiphy.available_antennas_rx;
  1076. result = rdev->ops->set_antenna(&rdev->wiphy, tx_ant, rx_ant);
  1077. if (result)
  1078. goto bad_res;
  1079. }
  1080. changed = 0;
  1081. if (info->attrs[NL80211_ATTR_WIPHY_RETRY_SHORT]) {
  1082. retry_short = nla_get_u8(
  1083. info->attrs[NL80211_ATTR_WIPHY_RETRY_SHORT]);
  1084. if (retry_short == 0) {
  1085. result = -EINVAL;
  1086. goto bad_res;
  1087. }
  1088. changed |= WIPHY_PARAM_RETRY_SHORT;
  1089. }
  1090. if (info->attrs[NL80211_ATTR_WIPHY_RETRY_LONG]) {
  1091. retry_long = nla_get_u8(
  1092. info->attrs[NL80211_ATTR_WIPHY_RETRY_LONG]);
  1093. if (retry_long == 0) {
  1094. result = -EINVAL;
  1095. goto bad_res;
  1096. }
  1097. changed |= WIPHY_PARAM_RETRY_LONG;
  1098. }
  1099. if (info->attrs[NL80211_ATTR_WIPHY_FRAG_THRESHOLD]) {
  1100. frag_threshold = nla_get_u32(
  1101. info->attrs[NL80211_ATTR_WIPHY_FRAG_THRESHOLD]);
  1102. if (frag_threshold < 256) {
  1103. result = -EINVAL;
  1104. goto bad_res;
  1105. }
  1106. if (frag_threshold != (u32) -1) {
  1107. /*
  1108. * Fragments (apart from the last one) are required to
  1109. * have even length. Make the fragmentation code
  1110. * simpler by stripping LSB should someone try to use
  1111. * odd threshold value.
  1112. */
  1113. frag_threshold &= ~0x1;
  1114. }
  1115. changed |= WIPHY_PARAM_FRAG_THRESHOLD;
  1116. }
  1117. if (info->attrs[NL80211_ATTR_WIPHY_RTS_THRESHOLD]) {
  1118. rts_threshold = nla_get_u32(
  1119. info->attrs[NL80211_ATTR_WIPHY_RTS_THRESHOLD]);
  1120. changed |= WIPHY_PARAM_RTS_THRESHOLD;
  1121. }
  1122. if (info->attrs[NL80211_ATTR_WIPHY_COVERAGE_CLASS]) {
  1123. coverage_class = nla_get_u8(
  1124. info->attrs[NL80211_ATTR_WIPHY_COVERAGE_CLASS]);
  1125. changed |= WIPHY_PARAM_COVERAGE_CLASS;
  1126. }
  1127. if (changed) {
  1128. u8 old_retry_short, old_retry_long;
  1129. u32 old_frag_threshold, old_rts_threshold;
  1130. u8 old_coverage_class;
  1131. if (!rdev->ops->set_wiphy_params) {
  1132. result = -EOPNOTSUPP;
  1133. goto bad_res;
  1134. }
  1135. old_retry_short = rdev->wiphy.retry_short;
  1136. old_retry_long = rdev->wiphy.retry_long;
  1137. old_frag_threshold = rdev->wiphy.frag_threshold;
  1138. old_rts_threshold = rdev->wiphy.rts_threshold;
  1139. old_coverage_class = rdev->wiphy.coverage_class;
  1140. if (changed & WIPHY_PARAM_RETRY_SHORT)
  1141. rdev->wiphy.retry_short = retry_short;
  1142. if (changed & WIPHY_PARAM_RETRY_LONG)
  1143. rdev->wiphy.retry_long = retry_long;
  1144. if (changed & WIPHY_PARAM_FRAG_THRESHOLD)
  1145. rdev->wiphy.frag_threshold = frag_threshold;
  1146. if (changed & WIPHY_PARAM_RTS_THRESHOLD)
  1147. rdev->wiphy.rts_threshold = rts_threshold;
  1148. if (changed & WIPHY_PARAM_COVERAGE_CLASS)
  1149. rdev->wiphy.coverage_class = coverage_class;
  1150. result = rdev->ops->set_wiphy_params(&rdev->wiphy, changed);
  1151. if (result) {
  1152. rdev->wiphy.retry_short = old_retry_short;
  1153. rdev->wiphy.retry_long = old_retry_long;
  1154. rdev->wiphy.frag_threshold = old_frag_threshold;
  1155. rdev->wiphy.rts_threshold = old_rts_threshold;
  1156. rdev->wiphy.coverage_class = old_coverage_class;
  1157. }
  1158. }
  1159. bad_res:
  1160. mutex_unlock(&rdev->mtx);
  1161. if (netdev)
  1162. dev_put(netdev);
  1163. return result;
  1164. }
  1165. static int nl80211_send_iface(struct sk_buff *msg, u32 pid, u32 seq, int flags,
  1166. struct cfg80211_registered_device *rdev,
  1167. struct net_device *dev)
  1168. {
  1169. void *hdr;
  1170. hdr = nl80211hdr_put(msg, pid, seq, flags, NL80211_CMD_NEW_INTERFACE);
  1171. if (!hdr)
  1172. return -1;
  1173. NLA_PUT_U32(msg, NL80211_ATTR_IFINDEX, dev->ifindex);
  1174. NLA_PUT_U32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx);
  1175. NLA_PUT_STRING(msg, NL80211_ATTR_IFNAME, dev->name);
  1176. NLA_PUT_U32(msg, NL80211_ATTR_IFTYPE, dev->ieee80211_ptr->iftype);
  1177. NLA_PUT_U32(msg, NL80211_ATTR_GENERATION,
  1178. rdev->devlist_generation ^
  1179. (cfg80211_rdev_list_generation << 2));
  1180. return genlmsg_end(msg, hdr);
  1181. nla_put_failure:
  1182. genlmsg_cancel(msg, hdr);
  1183. return -EMSGSIZE;
  1184. }
  1185. static int nl80211_dump_interface(struct sk_buff *skb, struct netlink_callback *cb)
  1186. {
  1187. int wp_idx = 0;
  1188. int if_idx = 0;
  1189. int wp_start = cb->args[0];
  1190. int if_start = cb->args[1];
  1191. struct cfg80211_registered_device *rdev;
  1192. struct wireless_dev *wdev;
  1193. mutex_lock(&cfg80211_mutex);
  1194. list_for_each_entry(rdev, &cfg80211_rdev_list, list) {
  1195. if (!net_eq(wiphy_net(&rdev->wiphy), sock_net(skb->sk)))
  1196. continue;
  1197. if (wp_idx < wp_start) {
  1198. wp_idx++;
  1199. continue;
  1200. }
  1201. if_idx = 0;
  1202. mutex_lock(&rdev->devlist_mtx);
  1203. list_for_each_entry(wdev, &rdev->netdev_list, list) {
  1204. if (if_idx < if_start) {
  1205. if_idx++;
  1206. continue;
  1207. }
  1208. if (nl80211_send_iface(skb, NETLINK_CB(cb->skb).pid,
  1209. cb->nlh->nlmsg_seq, NLM_F_MULTI,
  1210. rdev, wdev->netdev) < 0) {
  1211. mutex_unlock(&rdev->devlist_mtx);
  1212. goto out;
  1213. }
  1214. if_idx++;
  1215. }
  1216. mutex_unlock(&rdev->devlist_mtx);
  1217. wp_idx++;
  1218. }
  1219. out:
  1220. mutex_unlock(&cfg80211_mutex);
  1221. cb->args[0] = wp_idx;
  1222. cb->args[1] = if_idx;
  1223. return skb->len;
  1224. }
  1225. static int nl80211_get_interface(struct sk_buff *skb, struct genl_info *info)
  1226. {
  1227. struct sk_buff *msg;
  1228. struct cfg80211_registered_device *dev = info->user_ptr[0];
  1229. struct net_device *netdev = info->user_ptr[1];
  1230. msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
  1231. if (!msg)
  1232. return -ENOMEM;
  1233. if (nl80211_send_iface(msg, info->snd_pid, info->snd_seq, 0,
  1234. dev, netdev) < 0) {
  1235. nlmsg_free(msg);
  1236. return -ENOBUFS;
  1237. }
  1238. return genlmsg_reply(msg, info);
  1239. }
  1240. static const struct nla_policy mntr_flags_policy[NL80211_MNTR_FLAG_MAX + 1] = {
  1241. [NL80211_MNTR_FLAG_FCSFAIL] = { .type = NLA_FLAG },
  1242. [NL80211_MNTR_FLAG_PLCPFAIL] = { .type = NLA_FLAG },
  1243. [NL80211_MNTR_FLAG_CONTROL] = { .type = NLA_FLAG },
  1244. [NL80211_MNTR_FLAG_OTHER_BSS] = { .type = NLA_FLAG },
  1245. [NL80211_MNTR_FLAG_COOK_FRAMES] = { .type = NLA_FLAG },
  1246. };
  1247. static int parse_monitor_flags(struct nlattr *nla, u32 *mntrflags)
  1248. {
  1249. struct nlattr *flags[NL80211_MNTR_FLAG_MAX + 1];
  1250. int flag;
  1251. *mntrflags = 0;
  1252. if (!nla)
  1253. return -EINVAL;
  1254. if (nla_parse_nested(flags, NL80211_MNTR_FLAG_MAX,
  1255. nla, mntr_flags_policy))
  1256. return -EINVAL;
  1257. for (flag = 1; flag <= NL80211_MNTR_FLAG_MAX; flag++)
  1258. if (flags[flag])
  1259. *mntrflags |= (1<<flag);
  1260. return 0;
  1261. }
  1262. static int nl80211_valid_4addr(struct cfg80211_registered_device *rdev,
  1263. struct net_device *netdev, u8 use_4addr,
  1264. enum nl80211_iftype iftype)
  1265. {
  1266. if (!use_4addr) {
  1267. if (netdev && (netdev->priv_flags & IFF_BRIDGE_PORT))
  1268. return -EBUSY;
  1269. return 0;
  1270. }
  1271. switch (iftype) {
  1272. case NL80211_IFTYPE_AP_VLAN:
  1273. if (rdev->wiphy.flags & WIPHY_FLAG_4ADDR_AP)
  1274. return 0;
  1275. break;
  1276. case NL80211_IFTYPE_STATION:
  1277. if (rdev->wiphy.flags & WIPHY_FLAG_4ADDR_STATION)
  1278. return 0;
  1279. break;
  1280. default:
  1281. break;
  1282. }
  1283. return -EOPNOTSUPP;
  1284. }
  1285. static int nl80211_set_interface(struct sk_buff *skb, struct genl_info *info)
  1286. {
  1287. struct cfg80211_registered_device *rdev = info->user_ptr[0];
  1288. struct vif_params params;
  1289. int err;
  1290. enum nl80211_iftype otype, ntype;
  1291. struct net_device *dev = info->user_ptr[1];
  1292. u32 _flags, *flags = NULL;
  1293. bool change = false;
  1294. memset(&params, 0, sizeof(params));
  1295. otype = ntype = dev->ieee80211_ptr->iftype;
  1296. if (info->attrs[NL80211_ATTR_IFTYPE]) {
  1297. ntype = nla_get_u32(info->attrs[NL80211_ATTR_IFTYPE]);
  1298. if (otype != ntype)
  1299. change = true;
  1300. if (ntype > NL80211_IFTYPE_MAX)
  1301. return -EINVAL;
  1302. }
  1303. if (info->attrs[NL80211_ATTR_MESH_ID]) {
  1304. struct wireless_dev *wdev = dev->ieee80211_ptr;
  1305. if (ntype != NL80211_IFTYPE_MESH_POINT)
  1306. return -EINVAL;
  1307. if (netif_running(dev))
  1308. return -EBUSY;
  1309. wdev_lock(wdev);
  1310. BUILD_BUG_ON(IEEE80211_MAX_SSID_LEN !=
  1311. IEEE80211_MAX_MESH_ID_LEN);
  1312. wdev->mesh_id_up_len =
  1313. nla_len(info->attrs[NL80211_ATTR_MESH_ID]);
  1314. memcpy(wdev->ssid, nla_data(info->attrs[NL80211_ATTR_MESH_ID]),
  1315. wdev->mesh_id_up_len);
  1316. wdev_unlock(wdev);
  1317. }
  1318. if (info->attrs[NL80211_ATTR_4ADDR]) {
  1319. params.use_4addr = !!nla_get_u8(info->attrs[NL80211_ATTR_4ADDR]);
  1320. change = true;
  1321. err = nl80211_valid_4addr(rdev, dev, params.use_4addr, ntype);
  1322. if (err)
  1323. return err;
  1324. } else {
  1325. params.use_4addr = -1;
  1326. }
  1327. if (info->attrs[NL80211_ATTR_MNTR_FLAGS]) {
  1328. if (ntype != NL80211_IFTYPE_MONITOR)
  1329. return -EINVAL;
  1330. err = parse_monitor_flags(info->attrs[NL80211_ATTR_MNTR_FLAGS],
  1331. &_flags);
  1332. if (err)
  1333. return err;
  1334. flags = &_flags;
  1335. change = true;
  1336. }
  1337. if (change)
  1338. err = cfg80211_change_iface(rdev, dev, ntype, flags, &params);
  1339. else
  1340. err = 0;
  1341. if (!err && params.use_4addr != -1)
  1342. dev->ieee80211_ptr->use_4addr = params.use_4addr;
  1343. return err;
  1344. }
  1345. static int nl80211_new_interface(struct sk_buff *skb, struct genl_info *info)
  1346. {
  1347. struct cfg80211_registered_device *rdev = info->user_ptr[0];
  1348. struct vif_params params;
  1349. struct net_device *dev;
  1350. int err;
  1351. enum nl80211_iftype type = NL80211_IFTYPE_UNSPECIFIED;
  1352. u32 flags;
  1353. memset(&params, 0, sizeof(params));
  1354. if (!info->attrs[NL80211_ATTR_IFNAME])
  1355. return -EINVAL;
  1356. if (info->attrs[NL80211_ATTR_IFTYPE]) {
  1357. type = nla_get_u32(info->attrs[NL80211_ATTR_IFTYPE]);
  1358. if (type > NL80211_IFTYPE_MAX)
  1359. return -EINVAL;
  1360. }
  1361. if (!rdev->ops->add_virtual_intf ||
  1362. !(rdev->wiphy.interface_modes & (1 << type)))
  1363. return -EOPNOTSUPP;
  1364. if (info->attrs[NL80211_ATTR_4ADDR]) {
  1365. params.use_4addr = !!nla_get_u8(info->attrs[NL80211_ATTR_4ADDR]);
  1366. err = nl80211_valid_4addr(rdev, NULL, params.use_4addr, type);
  1367. if (err)
  1368. return err;
  1369. }
  1370. err = parse_monitor_flags(type == NL80211_IFTYPE_MONITOR ?
  1371. info->attrs[NL80211_ATTR_MNTR_FLAGS] : NULL,
  1372. &flags);
  1373. dev = rdev->ops->add_virtual_intf(&rdev->wiphy,
  1374. nla_data(info->attrs[NL80211_ATTR_IFNAME]),
  1375. type, err ? NULL : &flags, &params);
  1376. if (IS_ERR(dev))
  1377. return PTR_ERR(dev);
  1378. if (type == NL80211_IFTYPE_MESH_POINT &&
  1379. info->attrs[NL80211_ATTR_MESH_ID]) {
  1380. struct wireless_dev *wdev = dev->ieee80211_ptr;
  1381. wdev_lock(wdev);
  1382. BUILD_BUG_ON(IEEE80211_MAX_SSID_LEN !=
  1383. IEEE80211_MAX_MESH_ID_LEN);
  1384. wdev->mesh_id_up_len =
  1385. nla_len(info->attrs[NL80211_ATTR_MESH_ID]);
  1386. memcpy(wdev->ssid, nla_data(info->attrs[NL80211_ATTR_MESH_ID]),
  1387. wdev->mesh_id_up_len);
  1388. wdev_unlock(wdev);
  1389. }
  1390. return 0;
  1391. }
  1392. static int nl80211_del_interface(struct sk_buff *skb, struct genl_info *info)
  1393. {
  1394. struct cfg80211_registered_device *rdev = info->user_ptr[0];
  1395. struct net_device *dev = info->user_ptr[1];
  1396. if (!rdev->ops->del_virtual_intf)
  1397. return -EOPNOTSUPP;
  1398. return rdev->ops->del_virtual_intf(&rdev->wiphy, dev);
  1399. }
  1400. struct get_key_cookie {
  1401. struct sk_buff *msg;
  1402. int error;
  1403. int idx;
  1404. };
  1405. static void get_key_callback(void *c, struct key_params *params)
  1406. {
  1407. struct nlattr *key;
  1408. struct get_key_cookie *cookie = c;
  1409. if (params->key)
  1410. NLA_PUT(cookie->msg, NL80211_ATTR_KEY_DATA,
  1411. params->key_len, params->key);
  1412. if (params->seq)
  1413. NLA_PUT(cookie->msg, NL80211_ATTR_KEY_SEQ,
  1414. params->seq_len, params->seq);
  1415. if (params->cipher)
  1416. NLA_PUT_U32(cookie->msg, NL80211_ATTR_KEY_CIPHER,
  1417. params->cipher);
  1418. key = nla_nest_start(cookie->msg, NL80211_ATTR_KEY);
  1419. if (!key)
  1420. goto nla_put_failure;
  1421. if (params->key)
  1422. NLA_PUT(cookie->msg, NL80211_KEY_DATA,
  1423. params->key_len, params->key);
  1424. if (params->seq)
  1425. NLA_PUT(cookie->msg, NL80211_KEY_SEQ,
  1426. params->seq_len, params->seq);
  1427. if (params->cipher)
  1428. NLA_PUT_U32(cookie->msg, NL80211_KEY_CIPHER,
  1429. params->cipher);
  1430. NLA_PUT_U8(cookie->msg, NL80211_ATTR_KEY_IDX, cookie->idx);
  1431. nla_nest_end(cookie->msg, key);
  1432. return;
  1433. nla_put_failure:
  1434. cookie->error = 1;
  1435. }
  1436. static int nl80211_get_key(struct sk_buff *skb, struct genl_info *info)
  1437. {
  1438. struct cfg80211_registered_device *rdev = info->user_ptr[0];
  1439. int err;
  1440. struct net_device *dev = info->user_ptr[1];
  1441. u8 key_idx = 0;
  1442. const u8 *mac_addr = NULL;
  1443. bool pairwise;
  1444. struct get_key_cookie cookie = {
  1445. .error = 0,
  1446. };
  1447. void *hdr;
  1448. struct sk_buff *msg;
  1449. if (info->attrs[NL80211_ATTR_KEY_IDX])
  1450. key_idx = nla_get_u8(info->attrs[NL80211_ATTR_KEY_IDX]);
  1451. if (key_idx > 5)
  1452. return -EINVAL;
  1453. if (info->attrs[NL80211_ATTR_MAC])
  1454. mac_addr = nla_data(info->attrs[NL80211_ATTR_MAC]);
  1455. pairwise = !!mac_addr;
  1456. if (info->attrs[NL80211_ATTR_KEY_TYPE]) {
  1457. u32 kt = nla_get_u32(info->attrs[NL80211_ATTR_KEY_TYPE]);
  1458. if (kt >= NUM_NL80211_KEYTYPES)
  1459. return -EINVAL;
  1460. if (kt != NL80211_KEYTYPE_GROUP &&
  1461. kt != NL80211_KEYTYPE_PAIRWISE)
  1462. return -EINVAL;
  1463. pairwise = kt == NL80211_KEYTYPE_PAIRWISE;
  1464. }
  1465. if (!rdev->ops->get_key)
  1466. return -EOPNOTSUPP;
  1467. msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
  1468. if (!msg)
  1469. return -ENOMEM;
  1470. hdr = nl80211hdr_put(msg, info->snd_pid, info->snd_seq, 0,
  1471. NL80211_CMD_NEW_KEY);
  1472. if (IS_ERR(hdr))
  1473. return PTR_ERR(hdr);
  1474. cookie.msg = msg;
  1475. cookie.idx = key_idx;
  1476. NLA_PUT_U32(msg, NL80211_ATTR_IFINDEX, dev->ifindex);
  1477. NLA_PUT_U8(msg, NL80211_ATTR_KEY_IDX, key_idx);
  1478. if (mac_addr)
  1479. NLA_PUT(msg, NL80211_ATTR_MAC, ETH_ALEN, mac_addr);
  1480. if (pairwise && mac_addr &&
  1481. !(rdev->wiphy.flags & WIPHY_FLAG_IBSS_RSN))
  1482. return -ENOENT;
  1483. err = rdev->ops->get_key(&rdev->wiphy, dev, key_idx, pairwise,
  1484. mac_addr, &cookie, get_key_callback);
  1485. if (err)
  1486. goto free_msg;
  1487. if (cookie.error)
  1488. goto nla_put_failure;
  1489. genlmsg_end(msg, hdr);
  1490. return genlmsg_reply(msg, info);
  1491. nla_put_failure:
  1492. err = -ENOBUFS;
  1493. free_msg:
  1494. nlmsg_free(msg);
  1495. return err;
  1496. }
  1497. static int nl80211_set_key(struct sk_buff *skb, struct genl_info *info)
  1498. {
  1499. struct cfg80211_registered_device *rdev = info->user_ptr[0];
  1500. struct key_parse key;
  1501. int err;
  1502. struct net_device *dev = info->user_ptr[1];
  1503. err = nl80211_parse_key(info, &key);
  1504. if (err)
  1505. return err;
  1506. if (key.idx < 0)
  1507. return -EINVAL;
  1508. /* only support setting default key */
  1509. if (!key.def && !key.defmgmt)
  1510. return -EINVAL;
  1511. wdev_lock(dev->ieee80211_ptr);
  1512. if (key.def) {
  1513. if (!rdev->ops->set_default_key) {
  1514. err = -EOPNOTSUPP;
  1515. goto out;
  1516. }
  1517. err = nl80211_key_allowed(dev->ieee80211_ptr);
  1518. if (err)
  1519. goto out;
  1520. err = rdev->ops->set_default_key(&rdev->wiphy, dev, key.idx,
  1521. key.def_uni, key.def_multi);
  1522. if (err)
  1523. goto out;
  1524. #ifdef CONFIG_CFG80211_WEXT
  1525. dev->ieee80211_ptr->wext.default_key = key.idx;
  1526. #endif
  1527. } else {
  1528. if (key.def_uni || !key.def_multi) {
  1529. err = -EINVAL;
  1530. goto out;
  1531. }
  1532. if (!rdev->ops->set_default_mgmt_key) {
  1533. err = -EOPNOTSUPP;
  1534. goto out;
  1535. }