PageRenderTime 72ms CodeModel.GetById 26ms RepoModel.GetById 0ms app.codeStats 2ms

/mac80211/compat_wl12xx/net/wireless/nl80211.c

https://github.com/MiniCMX/android_hardware_ti_wlan
C | 8134 lines | 6576 code | 1379 blank | 179 comment | 1255 complexity | 3d2b0a81fded167e59a18d8b01610835 MD5 | raw file
Possible License(s): GPL-2.0, BSD-3-Clause

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

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