driver_ralink.c 38 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498
  1. /*
  2. * WPA Supplicant - driver interaction with Ralink Wireless Client
  3. * Copyright (c) 2003-2006, Jouni Malinen <j@w1.fi>
  4. * Copyright (c) 2007, Snowpin Lee <snowpin_lee@ralinktech.com.tw>
  5. *
  6. * This program is free software; you can redistribute it and/or modify
  7. * it under the terms of the GNU General Public License version 2 as
  8. * published by the Free Software Foundation.
  9. *
  10. * Alternatively, this software may be distributed under the terms of BSD
  11. * license.
  12. *
  13. * See README and COPYING for more details.
  14. *
  15. */
  16. #include "includes.h"
  17. #include <sys/ioctl.h>
  18. #include "wireless_copy.h"
  19. #include "common.h"
  20. #include "driver.h"
  21. #include "l2_packet/l2_packet.h"
  22. #include "eloop.h"
  23. #include "common/ieee802_11_defs.h"
  24. #include "priv_netlink.h"
  25. #include "netlink.h"
  26. #include "linux_ioctl.h"
  27. #include "driver_ralink.h"
  28. static void wpa_driver_ralink_scan_timeout(void *eloop_ctx, void *timeout_ctx);
  29. #define MAX_SSID_LEN 32
  30. struct wpa_driver_ralink_data {
  31. void *ctx;
  32. int ioctl_sock;
  33. struct netlink_data *netlink;
  34. char ifname[IFNAMSIZ + 1];
  35. u8 *assoc_req_ies;
  36. size_t assoc_req_ies_len;
  37. u8 *assoc_resp_ies;
  38. size_t assoc_resp_ies_len;
  39. int no_of_pmkid;
  40. struct ndis_pmkid_entry *pmkid;
  41. int we_version_compiled;
  42. int ap_scan;
  43. int scanning_done;
  44. u8 g_driver_down;
  45. BOOLEAN bAddWepKey;
  46. };
  47. static int ralink_set_oid(struct wpa_driver_ralink_data *drv,
  48. unsigned short oid, char *data, int len)
  49. {
  50. char *buf;
  51. struct iwreq iwr;
  52. buf = os_zalloc(len);
  53. if (buf == NULL)
  54. return -1;
  55. os_memset(&iwr, 0, sizeof(iwr));
  56. os_strlcpy(iwr.ifr_name, drv->ifname, IFNAMSIZ);
  57. iwr.u.data.flags = oid;
  58. iwr.u.data.flags |= OID_GET_SET_TOGGLE;
  59. if (data)
  60. os_memcpy(buf, data, len);
  61. iwr.u.data.pointer = (caddr_t) buf;
  62. iwr.u.data.length = len;
  63. if (ioctl(drv->ioctl_sock, RT_PRIV_IOCTL, &iwr) < 0) {
  64. wpa_printf(MSG_DEBUG, "%s: oid=0x%x len (%d) failed",
  65. __func__, oid, len);
  66. os_free(buf);
  67. return -1;
  68. }
  69. os_free(buf);
  70. return 0;
  71. }
  72. static int
  73. ralink_get_new_driver_flag(struct wpa_driver_ralink_data *drv)
  74. {
  75. struct iwreq iwr;
  76. UCHAR enabled = 0;
  77. os_memset(&iwr, 0, sizeof(iwr));
  78. os_strlcpy(iwr.ifr_name, drv->ifname, IFNAMSIZ);
  79. iwr.u.data.pointer = (UCHAR*) &enabled;
  80. iwr.u.data.flags = RT_OID_NEW_DRIVER;
  81. if (ioctl(drv->ioctl_sock, RT_PRIV_IOCTL, &iwr) < 0) {
  82. wpa_printf(MSG_DEBUG, "%s: failed", __func__);
  83. return 0;
  84. }
  85. return (enabled == 1) ? 1 : 0;
  86. }
  87. static int wpa_driver_ralink_get_bssid(void *priv, u8 *bssid)
  88. {
  89. struct wpa_driver_ralink_data *drv = priv;
  90. struct iwreq iwr;
  91. int ret = 0;
  92. if (drv->g_driver_down == 1)
  93. return -1;
  94. wpa_printf(MSG_DEBUG, "%s", __FUNCTION__);
  95. os_memset(&iwr, 0, sizeof(iwr));
  96. os_strlcpy(iwr.ifr_name, drv->ifname, IFNAMSIZ);
  97. if (ioctl(drv->ioctl_sock, SIOCGIWAP, &iwr) < 0) {
  98. perror("ioctl[SIOCGIWAP]");
  99. ret = -1;
  100. }
  101. os_memcpy(bssid, iwr.u.ap_addr.sa_data, ETH_ALEN);
  102. return ret;
  103. }
  104. static int wpa_driver_ralink_get_ssid(void *priv, u8 *ssid)
  105. {
  106. struct wpa_driver_ralink_data *drv = priv;
  107. #if 0
  108. struct wpa_supplicant *wpa_s = drv->ctx;
  109. struct wpa_ssid *entry;
  110. #endif
  111. int ssid_len;
  112. u8 bssid[ETH_ALEN];
  113. u8 ssid_str[MAX_SSID_LEN];
  114. struct iwreq iwr;
  115. #if 0
  116. int result = 0;
  117. #endif
  118. int ret = 0;
  119. #if 0
  120. BOOLEAN ieee8021x_mode = FALSE;
  121. BOOLEAN ieee8021x_required_key = FALSE;
  122. #endif
  123. if (drv->g_driver_down == 1)
  124. return -1;
  125. wpa_printf(MSG_DEBUG, "%s", __FUNCTION__);
  126. os_memset(&iwr, 0, sizeof(iwr));
  127. os_strlcpy(iwr.ifr_name, drv->ifname, IFNAMSIZ);
  128. iwr.u.essid.pointer = (caddr_t) ssid;
  129. iwr.u.essid.length = 32;
  130. if (ioctl(drv->ioctl_sock, SIOCGIWESSID, &iwr) < 0) {
  131. perror("ioctl[SIOCGIWESSID]");
  132. ret = -1;
  133. } else
  134. ret = iwr.u.essid.length;
  135. if (ret <= 0)
  136. return ret;
  137. ssid_len = ret;
  138. os_memset(ssid_str, 0, MAX_SSID_LEN);
  139. os_memcpy(ssid_str, ssid, ssid_len);
  140. if (drv->ap_scan == 0) {
  141. /* Read BSSID form driver */
  142. if (wpa_driver_ralink_get_bssid(priv, bssid) < 0) {
  143. wpa_printf(MSG_WARNING, "Could not read BSSID from "
  144. "driver.");
  145. return ret;
  146. }
  147. #if 0
  148. entry = wpa_s->conf->ssid;
  149. while (entry) {
  150. if (!entry->disabled && ssid_len == entry->ssid_len &&
  151. os_memcmp(ssid_str, entry->ssid, ssid_len) == 0 &&
  152. (!entry->bssid_set ||
  153. os_memcmp(bssid, entry->bssid, ETH_ALEN) == 0)) {
  154. /* match the config of driver */
  155. result = 1;
  156. break;
  157. }
  158. entry = entry->next;
  159. }
  160. if (result) {
  161. wpa_printf(MSG_DEBUG, "Ready to set 802.1x mode and "
  162. "ieee_required_keys parameters to driver");
  163. /* set 802.1x mode and ieee_required_keys parameter */
  164. if (entry->key_mgmt == WPA_KEY_MGMT_IEEE8021X_NO_WPA) {
  165. if ((entry->eapol_flags & (EAPOL_FLAG_REQUIRE_KEY_UNICAST | EAPOL_FLAG_REQUIRE_KEY_BROADCAST)))
  166. ieee8021x_required_key = TRUE;
  167. ieee8021x_mode = TRUE;
  168. }
  169. if (ralink_set_oid(drv, OID_802_11_SET_IEEE8021X, (char *) &ieee8021x_mode, sizeof(BOOLEAN)) < 0)
  170. {
  171. wpa_printf(MSG_DEBUG, "RALINK: Failed to set OID_802_11_SET_IEEE8021X(%d)", (int) ieee8021x_mode);
  172. }
  173. else
  174. {
  175. wpa_printf(MSG_DEBUG, "ieee8021x_mode is %s", ieee8021x_mode ? "TRUE" : "FALSE");
  176. }
  177. if (ralink_set_oid(drv, OID_802_11_SET_IEEE8021X_REQUIRE_KEY, (char *) &ieee8021x_required_key, sizeof(BOOLEAN)) < 0)
  178. {
  179. wpa_printf(MSG_DEBUG, "ERROR: Failed to set OID_802_11_SET_IEEE8021X_REQUIRE_KEY(%d)", (int) ieee8021x_required_key);
  180. }
  181. else
  182. {
  183. wpa_printf(MSG_DEBUG, "ieee8021x_required_key is %s and eapol_flag(%d)", ieee8021x_required_key ? "TRUE" : "FALSE",
  184. entry->eapol_flags);
  185. }
  186. }
  187. #endif
  188. }
  189. return ret;
  190. }
  191. static int wpa_driver_ralink_set_ssid(struct wpa_driver_ralink_data *drv,
  192. const u8 *ssid, size_t ssid_len)
  193. {
  194. NDIS_802_11_SSID *buf;
  195. int ret = 0;
  196. struct iwreq iwr;
  197. wpa_printf(MSG_DEBUG, "%s", __FUNCTION__);
  198. buf = os_zalloc(sizeof(NDIS_802_11_SSID));
  199. if (buf == NULL)
  200. return -1;
  201. os_memset(buf, 0, sizeof(buf));
  202. buf->SsidLength = ssid_len;
  203. os_memcpy(buf->Ssid, ssid, ssid_len);
  204. os_memset(&iwr, 0, sizeof(iwr));
  205. os_strlcpy(iwr.ifr_name, drv->ifname, IFNAMSIZ);
  206. iwr.u.data.flags = OID_802_11_SSID;
  207. iwr.u.data.flags |= OID_GET_SET_TOGGLE;
  208. iwr.u.data.pointer = (caddr_t) buf;
  209. iwr.u.data.length = sizeof(NDIS_802_11_SSID);
  210. if (ioctl(drv->ioctl_sock, RT_PRIV_IOCTL, &iwr) < 0) {
  211. perror("ioctl[RT_PRIV_IOCTL] -- OID_802_11_SSID");
  212. ret = -1;
  213. }
  214. os_free(buf);
  215. return ret;
  216. }
  217. static void wpa_driver_ralink_event_pmkid(struct wpa_driver_ralink_data *drv,
  218. const u8 *data, size_t data_len)
  219. {
  220. NDIS_802_11_PMKID_CANDIDATE_LIST *pmkid;
  221. size_t i;
  222. union wpa_event_data event;
  223. wpa_printf(MSG_DEBUG, "%s", __FUNCTION__);
  224. if (data_len < 8) {
  225. wpa_printf(MSG_DEBUG, "RALINK: Too short PMKID Candidate List "
  226. "Event (len=%lu)", (unsigned long) data_len);
  227. return;
  228. }
  229. pmkid = (NDIS_802_11_PMKID_CANDIDATE_LIST *) data;
  230. wpa_printf(MSG_DEBUG, "RALINK: PMKID Candidate List Event - Version %d"
  231. " NumCandidates %d",
  232. (int) pmkid->Version, (int) pmkid->NumCandidates);
  233. if (pmkid->Version != 1) {
  234. wpa_printf(MSG_DEBUG, "RALINK: Unsupported PMKID Candidate "
  235. "List Version %d", (int) pmkid->Version);
  236. return;
  237. }
  238. if (data_len < 8 + pmkid->NumCandidates * sizeof(PMKID_CANDIDATE)) {
  239. wpa_printf(MSG_DEBUG, "RALINK: PMKID Candidate List "
  240. "underflow");
  241. return;
  242. }
  243. os_memset(&event, 0, sizeof(event));
  244. for (i = 0; i < pmkid->NumCandidates; i++) {
  245. PMKID_CANDIDATE *p = &pmkid->CandidateList[i];
  246. wpa_printf(MSG_DEBUG, "RALINK: %lu: " MACSTR " Flags 0x%x",
  247. (unsigned long) i, MAC2STR(p->BSSID),
  248. (int) p->Flags);
  249. os_memcpy(event.pmkid_candidate.bssid, p->BSSID, ETH_ALEN);
  250. event.pmkid_candidate.index = i;
  251. event.pmkid_candidate.preauth =
  252. p->Flags & NDIS_802_11_PMKID_CANDIDATE_PREAUTH_ENABLED;
  253. wpa_supplicant_event(drv->ctx, EVENT_PMKID_CANDIDATE,
  254. &event);
  255. }
  256. }
  257. static int wpa_driver_ralink_set_pmkid(struct wpa_driver_ralink_data *drv)
  258. {
  259. int len, count, i, ret;
  260. struct ndis_pmkid_entry *entry;
  261. NDIS_802_11_PMKID *p;
  262. wpa_printf(MSG_DEBUG, "%s", __FUNCTION__);
  263. count = 0;
  264. entry = drv->pmkid;
  265. while (entry) {
  266. count++;
  267. if (count >= drv->no_of_pmkid)
  268. break;
  269. entry = entry->next;
  270. }
  271. len = 8 + count * sizeof(BSSID_INFO);
  272. p = os_zalloc(len);
  273. if (p == NULL)
  274. return -1;
  275. p->Length = len;
  276. p->BSSIDInfoCount = count;
  277. entry = drv->pmkid;
  278. for (i = 0; i < count; i++) {
  279. os_memcpy(&p->BSSIDInfo[i].BSSID, entry->bssid, ETH_ALEN);
  280. os_memcpy(&p->BSSIDInfo[i].PMKID, entry->pmkid, 16);
  281. entry = entry->next;
  282. }
  283. wpa_hexdump(MSG_MSGDUMP, "NDIS: OID_802_11_PMKID",
  284. (const u8 *) p, len);
  285. ret = ralink_set_oid(drv, OID_802_11_PMKID, (char *) p, len);
  286. os_free(p);
  287. return ret;
  288. }
  289. static int wpa_driver_ralink_add_pmkid(void *priv, const u8 *bssid,
  290. const u8 *pmkid)
  291. {
  292. struct wpa_driver_ralink_data *drv = priv;
  293. struct ndis_pmkid_entry *entry, *prev;
  294. if (drv->g_driver_down == 1)
  295. return -1;
  296. wpa_printf(MSG_DEBUG, "%s", __FUNCTION__);
  297. if (drv->no_of_pmkid == 0)
  298. return 0;
  299. prev = NULL;
  300. entry = drv->pmkid;
  301. while (entry) {
  302. if (os_memcmp(entry->bssid, bssid, ETH_ALEN) == 0)
  303. break;
  304. prev = entry;
  305. entry = entry->next;
  306. }
  307. if (entry) {
  308. /* Replace existing entry for this BSSID and move it into the
  309. * beginning of the list. */
  310. os_memcpy(entry->pmkid, pmkid, 16);
  311. if (prev) {
  312. prev->next = entry->next;
  313. entry->next = drv->pmkid;
  314. drv->pmkid = entry;
  315. }
  316. } else {
  317. entry = os_malloc(sizeof(*entry));
  318. if (entry) {
  319. os_memcpy(entry->bssid, bssid, ETH_ALEN);
  320. os_memcpy(entry->pmkid, pmkid, 16);
  321. entry->next = drv->pmkid;
  322. drv->pmkid = entry;
  323. }
  324. }
  325. return wpa_driver_ralink_set_pmkid(drv);
  326. }
  327. static int wpa_driver_ralink_remove_pmkid(void *priv, const u8 *bssid,
  328. const u8 *pmkid)
  329. {
  330. struct wpa_driver_ralink_data *drv = priv;
  331. struct ndis_pmkid_entry *entry, *prev;
  332. if (drv->g_driver_down == 1)
  333. return -1;
  334. wpa_printf(MSG_DEBUG, "%s", __FUNCTION__);
  335. if (drv->no_of_pmkid == 0)
  336. return 0;
  337. entry = drv->pmkid;
  338. prev = NULL;
  339. drv->pmkid = NULL;
  340. while (entry) {
  341. if (os_memcmp(entry->bssid, bssid, ETH_ALEN) == 0 &&
  342. os_memcmp(entry->pmkid, pmkid, 16) == 0) {
  343. if (prev)
  344. prev->next = entry->next;
  345. else
  346. drv->pmkid = entry->next;
  347. os_free(entry);
  348. break;
  349. }
  350. prev = entry;
  351. entry = entry->next;
  352. }
  353. return wpa_driver_ralink_set_pmkid(drv);
  354. }
  355. static int wpa_driver_ralink_flush_pmkid(void *priv)
  356. {
  357. struct wpa_driver_ralink_data *drv = priv;
  358. NDIS_802_11_PMKID p;
  359. struct ndis_pmkid_entry *pmkid, *prev;
  360. if (drv->g_driver_down == 1)
  361. return -1;
  362. wpa_printf(MSG_DEBUG, "%s", __FUNCTION__);
  363. if (drv->no_of_pmkid == 0)
  364. return 0;
  365. pmkid = drv->pmkid;
  366. drv->pmkid = NULL;
  367. while (pmkid) {
  368. prev = pmkid;
  369. pmkid = pmkid->next;
  370. os_free(prev);
  371. }
  372. os_memset(&p, 0, sizeof(p));
  373. p.Length = 8;
  374. p.BSSIDInfoCount = 0;
  375. wpa_hexdump(MSG_MSGDUMP, "NDIS: OID_802_11_PMKID (flush)",
  376. (const u8 *) &p, 8);
  377. return ralink_set_oid(drv, OID_802_11_PMKID, (char *) &p, 8);
  378. }
  379. static void
  380. wpa_driver_ralink_event_wireless_custom(struct wpa_driver_ralink_data *drv,
  381. void *ctx, char *custom)
  382. {
  383. union wpa_event_data data;
  384. u8 *req_ies = NULL, *resp_ies = NULL;
  385. wpa_printf(MSG_DEBUG, "%s", __FUNCTION__);
  386. wpa_printf(MSG_DEBUG, "Custom wireless event: '%s'", custom);
  387. os_memset(&data, 0, sizeof(data));
  388. /* Host AP driver */
  389. if (os_strncmp(custom, "MLME-MICHAELMICFAILURE.indication", 33) == 0) {
  390. /* receive a MICFAILURE report */
  391. data.michael_mic_failure.unicast =
  392. os_strstr(custom, " unicast") != NULL;
  393. /* TODO: parse parameters(?) */
  394. wpa_supplicant_event(ctx, EVENT_MICHAEL_MIC_FAILURE, &data);
  395. } else if (os_strncmp(custom, "ASSOCINFO_ReqIEs=", 17) == 0) {
  396. /* receive assoc. req. IEs */
  397. char *spos;
  398. int bytes;
  399. spos = custom + 17;
  400. /*get IE's length */
  401. /*
  402. * bytes = strlen(spos); ==> bug, bytes may less than original
  403. * size by using this way to get size. snowpin 20070312
  404. * if (!bytes)
  405. * return;
  406. */
  407. bytes = drv->assoc_req_ies_len;
  408. req_ies = os_malloc(bytes);
  409. if (req_ies == NULL)
  410. return;
  411. os_memcpy(req_ies, spos, bytes);
  412. data.assoc_info.req_ies = req_ies;
  413. data.assoc_info.req_ies_len = bytes;
  414. /* skip the '\0' byte */
  415. spos += bytes + 1;
  416. data.assoc_info.resp_ies = NULL;
  417. data.assoc_info.resp_ies_len = 0;
  418. if (os_strncmp(spos, " RespIEs=", 9) == 0) {
  419. /* receive assoc. resp. IEs */
  420. spos += 9;
  421. /* get IE's length */
  422. bytes = os_strlen(spos);
  423. if (!bytes)
  424. goto done;
  425. resp_ies = os_malloc(bytes);
  426. if (resp_ies == NULL)
  427. goto done;
  428. os_memcpy(resp_ies, spos, bytes);
  429. data.assoc_info.resp_ies = resp_ies;
  430. data.assoc_info.resp_ies_len = bytes;
  431. }
  432. wpa_supplicant_event(ctx, EVENT_ASSOCINFO, &data);
  433. done:
  434. /* free allocated memory */
  435. os_free(resp_ies);
  436. os_free(req_ies);
  437. }
  438. }
  439. static void ralink_interface_up(struct wpa_driver_ralink_data *drv)
  440. {
  441. union wpa_event_data event;
  442. int enable_wpa_supplicant = 0;
  443. drv->g_driver_down = 0;
  444. os_memset(&event, 0, sizeof(event));
  445. os_snprintf(event.interface_status.ifname,
  446. sizeof(event.interface_status.ifname), "%s", drv->ifname);
  447. event.interface_status.ievent = EVENT_INTERFACE_ADDED;
  448. wpa_supplicant_event(drv->ctx, EVENT_INTERFACE_STATUS, &event);
  449. if (drv->ap_scan == 1)
  450. enable_wpa_supplicant = 1;
  451. else
  452. enable_wpa_supplicant = 2;
  453. /* trigger driver support wpa_supplicant */
  454. if (ralink_set_oid(drv, RT_OID_WPA_SUPPLICANT_SUPPORT,
  455. (PCHAR) &enable_wpa_supplicant, sizeof(UCHAR)) < 0)
  456. {
  457. wpa_printf(MSG_INFO, "RALINK: Failed to set "
  458. "RT_OID_WPA_SUPPLICANT_SUPPORT(%d)",
  459. (int) enable_wpa_supplicant);
  460. wpa_printf(MSG_ERROR, "ralink. Driver does not support "
  461. "wpa_supplicant");
  462. }
  463. }
  464. static void
  465. wpa_driver_ralink_event_wireless(struct wpa_driver_ralink_data *drv,
  466. void *ctx, char *data, int len)
  467. {
  468. struct iw_event iwe_buf, *iwe = &iwe_buf;
  469. char *pos, *end, *custom, *buf, *assoc_info_buf, *info_pos;
  470. #if 0
  471. BOOLEAN ieee8021x_required_key = FALSE;
  472. #endif
  473. wpa_printf(MSG_DEBUG, "%s", __FUNCTION__);
  474. assoc_info_buf = info_pos = NULL;
  475. pos = data;
  476. end = data + len;
  477. while (pos + IW_EV_LCP_LEN <= end) {
  478. /* Event data may be unaligned, so make a local, aligned copy
  479. * before processing. */
  480. os_memcpy(&iwe_buf, pos, IW_EV_LCP_LEN);
  481. wpa_printf(MSG_DEBUG, "Wireless event: cmd=0x%x len=%d",
  482. iwe->cmd, iwe->len);
  483. if (iwe->len <= IW_EV_LCP_LEN)
  484. return;
  485. custom = pos + IW_EV_POINT_LEN;
  486. if (drv->we_version_compiled > 18 && iwe->cmd == IWEVCUSTOM) {
  487. /* WE-19 removed the pointer from struct iw_point */
  488. char *dpos = (char *) &iwe_buf.u.data.length;
  489. int dlen = dpos - (char *) &iwe_buf;
  490. os_memcpy(dpos, pos + IW_EV_LCP_LEN,
  491. sizeof(struct iw_event) - dlen);
  492. } else {
  493. os_memcpy(&iwe_buf, pos, sizeof(struct iw_event));
  494. custom += IW_EV_POINT_OFF;
  495. }
  496. switch (iwe->cmd) {
  497. case IWEVCUSTOM:
  498. if (custom + iwe->u.data.length > end)
  499. return;
  500. buf = os_malloc(iwe->u.data.length + 1);
  501. if (buf == NULL)
  502. return;
  503. os_memcpy(buf, custom, iwe->u.data.length);
  504. buf[iwe->u.data.length] = '\0';
  505. if (drv->ap_scan == 1) {
  506. if ((iwe->u.data.flags == RT_ASSOC_EVENT_FLAG)
  507. || (iwe->u.data.flags ==
  508. RT_REQIE_EVENT_FLAG) ||
  509. (iwe->u.data.flags == RT_RESPIE_EVENT_FLAG)
  510. || (iwe->u.data.flags ==
  511. RT_ASSOCINFO_EVENT_FLAG)) {
  512. if (drv->scanning_done == 0) {
  513. os_free(buf);
  514. return;
  515. }
  516. }
  517. }
  518. if (iwe->u.data.flags == RT_ASSOC_EVENT_FLAG) {
  519. wpa_supplicant_event(ctx, EVENT_ASSOC, NULL);
  520. wpa_printf(MSG_DEBUG, "Custom wireless event: "
  521. "receive ASSOCIATED_EVENT !!!");
  522. } else if (iwe->u.data.flags == RT_REQIE_EVENT_FLAG) {
  523. wpa_printf(MSG_DEBUG, "Custom wireless event: "
  524. "receive ReqIEs !!!");
  525. drv->assoc_req_ies =
  526. os_malloc(iwe->u.data.length);
  527. if (drv->assoc_req_ies == NULL) {
  528. os_free(buf);
  529. return;
  530. }
  531. drv->assoc_req_ies_len = iwe->u.data.length;
  532. os_memcpy(drv->assoc_req_ies, custom,
  533. iwe->u.data.length);
  534. } else if (iwe->u.data.flags == RT_RESPIE_EVENT_FLAG) {
  535. wpa_printf(MSG_DEBUG, "Custom wireless event: "
  536. "receive RespIEs !!!");
  537. drv->assoc_resp_ies =
  538. os_malloc(iwe->u.data.length);
  539. if (drv->assoc_resp_ies == NULL) {
  540. os_free(drv->assoc_req_ies);
  541. drv->assoc_req_ies = NULL;
  542. os_free(buf);
  543. return;
  544. }
  545. drv->assoc_resp_ies_len = iwe->u.data.length;
  546. os_memcpy(drv->assoc_resp_ies, custom,
  547. iwe->u.data.length);
  548. } else if (iwe->u.data.flags ==
  549. RT_ASSOCINFO_EVENT_FLAG) {
  550. wpa_printf(MSG_DEBUG, "Custom wireless event: "
  551. "receive ASSOCINFO_EVENT !!!");
  552. assoc_info_buf =
  553. os_zalloc(drv->assoc_req_ies_len +
  554. drv->assoc_resp_ies_len + 1);
  555. if (assoc_info_buf == NULL) {
  556. os_free(drv->assoc_req_ies);
  557. drv->assoc_req_ies = NULL;
  558. os_free(drv->assoc_resp_ies);
  559. drv->assoc_resp_ies = NULL;
  560. os_free(buf);
  561. return;
  562. }
  563. if (drv->assoc_req_ies) {
  564. os_memcpy(assoc_info_buf,
  565. drv->assoc_req_ies,
  566. drv->assoc_req_ies_len);
  567. }
  568. info_pos = assoc_info_buf +
  569. drv->assoc_req_ies_len;
  570. if (drv->assoc_resp_ies) {
  571. os_memcpy(info_pos,
  572. drv->assoc_resp_ies,
  573. drv->assoc_resp_ies_len);
  574. }
  575. assoc_info_buf[drv->assoc_req_ies_len +
  576. drv->assoc_resp_ies_len] = '\0';
  577. wpa_driver_ralink_event_wireless_custom(
  578. drv, ctx, assoc_info_buf);
  579. os_free(drv->assoc_req_ies);
  580. drv->assoc_req_ies = NULL;
  581. os_free(drv->assoc_resp_ies);
  582. drv->assoc_resp_ies = NULL;
  583. os_free(assoc_info_buf);
  584. } else if (iwe->u.data.flags == RT_DISASSOC_EVENT_FLAG)
  585. {
  586. wpa_printf(MSG_DEBUG, "Custom wireless event: "
  587. "receive DISASSOCIATED_EVENT !!!");
  588. wpa_supplicant_event(ctx, EVENT_DISASSOC,
  589. NULL);
  590. } else if (iwe->u.data.flags == RT_PMKIDCAND_FLAG) {
  591. wpa_printf(MSG_DEBUG, "Custom wireless event: "
  592. "receive PMKIDCAND_EVENT !!!");
  593. wpa_driver_ralink_event_pmkid(
  594. drv, (const u8 *) custom,
  595. iwe->u.data.length);
  596. } else if (iwe->u.data.flags == RT_INTERFACE_DOWN) {
  597. drv->g_driver_down = 1;
  598. eloop_terminate();
  599. } else if (iwe->u.data.flags == RT_INTERFACE_UP) {
  600. ralink_interface_up(drv);
  601. } else {
  602. wpa_driver_ralink_event_wireless_custom(
  603. drv, ctx, buf);
  604. }
  605. os_free(buf);
  606. break;
  607. }
  608. pos += iwe->len;
  609. }
  610. }
  611. static void
  612. wpa_driver_ralink_event_rtm_newlink(void *ctx, struct ifinfomsg *ifi,
  613. u8 *buf, size_t len)
  614. {
  615. struct wpa_driver_ralink_data *drv = ctx;
  616. int attrlen, rta_len;
  617. struct rtattr *attr;
  618. wpa_printf(MSG_DEBUG, "%s", __FUNCTION__);
  619. wpa_hexdump(MSG_DEBUG, "ifi: ", (u8 *) ifi, sizeof(struct ifinfomsg));
  620. attrlen = len;
  621. wpa_printf(MSG_DEBUG, "attrlen=%d", attrlen);
  622. attr = (struct rtattr *) buf;
  623. wpa_hexdump(MSG_DEBUG, "attr1: ", (u8 *) attr, sizeof(struct rtattr));
  624. rta_len = RTA_ALIGN(sizeof(struct rtattr));
  625. wpa_hexdump(MSG_DEBUG, "attr2: ", (u8 *)attr,rta_len);
  626. while (RTA_OK(attr, attrlen)) {
  627. wpa_printf(MSG_DEBUG, "rta_type=%02x\n", attr->rta_type);
  628. if (attr->rta_type == IFLA_WIRELESS) {
  629. wpa_driver_ralink_event_wireless(
  630. drv, ctx,
  631. ((char *) attr) + rta_len,
  632. attr->rta_len - rta_len);
  633. }
  634. attr = RTA_NEXT(attr, attrlen);
  635. wpa_hexdump(MSG_DEBUG, "attr3: ",
  636. (u8 *) attr, sizeof(struct rtattr));
  637. }
  638. }
  639. static int
  640. ralink_get_we_version_compiled(struct wpa_driver_ralink_data *drv)
  641. {
  642. struct iwreq iwr;
  643. UINT we_version_compiled = 0;
  644. os_memset(&iwr, 0, sizeof(iwr));
  645. os_strlcpy(iwr.ifr_name, drv->ifname, IFNAMSIZ);
  646. iwr.u.data.pointer = (caddr_t) &we_version_compiled;
  647. iwr.u.data.flags = RT_OID_WE_VERSION_COMPILED;
  648. if (ioctl(drv->ioctl_sock, RT_PRIV_IOCTL, &iwr) < 0) {
  649. wpa_printf(MSG_DEBUG, "%s: failed", __func__);
  650. return -1;
  651. }
  652. drv->we_version_compiled = we_version_compiled;
  653. return 0;
  654. }
  655. static void * wpa_driver_ralink_init(void *ctx, const char *ifname)
  656. {
  657. int s;
  658. struct wpa_driver_ralink_data *drv;
  659. struct ifreq ifr;
  660. UCHAR enable_wpa_supplicant = 0;
  661. struct netlink_config *cfg;
  662. wpa_printf(MSG_DEBUG, "%s", __FUNCTION__);
  663. /* open socket to kernel */
  664. if ((s = socket(AF_INET, SOCK_DGRAM, 0)) < 0) {
  665. perror("socket");
  666. return NULL;
  667. }
  668. /* do it */
  669. os_strlcpy(ifr.ifr_name, ifname, IFNAMSIZ);
  670. if (ioctl(s, SIOCGIFINDEX, &ifr) < 0) {
  671. perror(ifr.ifr_name);
  672. return NULL;
  673. }
  674. drv = os_zalloc(sizeof(*drv));
  675. if (drv == NULL)
  676. return NULL;
  677. drv->scanning_done = 1;
  678. drv->ap_scan = 1; /* for now - let's assume ap_scan=1 is used */
  679. drv->ctx = ctx;
  680. os_strlcpy(drv->ifname, ifname, sizeof(drv->ifname));
  681. drv->ioctl_sock = s;
  682. drv->g_driver_down = 0;
  683. cfg = os_zalloc(sizeof(*cfg));
  684. if (cfg == NULL) {
  685. close(drv->ioctl_sock);
  686. os_free(drv);
  687. return NULL;
  688. }
  689. cfg->ctx = drv;
  690. cfg->newlink_cb = wpa_driver_ralink_event_rtm_newlink;
  691. drv->netlink = netlink_init(cfg);
  692. if (drv->netlink == NULL) {
  693. os_free(cfg);
  694. close(drv->ioctl_sock);
  695. os_free(drv);
  696. return NULL;
  697. }
  698. drv->no_of_pmkid = 4; /* Number of PMKID saved supported */
  699. linux_set_iface_flags(drv->ioctl_sock, drv->ifname, 1);
  700. ralink_get_we_version_compiled(drv);
  701. wpa_driver_ralink_flush_pmkid(drv);
  702. if (drv->ap_scan == 1)
  703. enable_wpa_supplicant = 1;
  704. else
  705. enable_wpa_supplicant = 2;
  706. /* trigger driver support wpa_supplicant */
  707. if (ralink_set_oid(drv, RT_OID_WPA_SUPPLICANT_SUPPORT,
  708. (PCHAR) &enable_wpa_supplicant, sizeof(UCHAR)) < 0)
  709. {
  710. wpa_printf(MSG_DEBUG, "RALINK: Failed to set "
  711. "RT_OID_WPA_SUPPLICANT_SUPPORT(%d)",
  712. (int) enable_wpa_supplicant);
  713. wpa_printf(MSG_ERROR, "RALINK: Driver does not support "
  714. "wpa_supplicant");
  715. close(s);
  716. close(drv->ioctl_sock);
  717. os_free(drv);
  718. return NULL;
  719. }
  720. if (drv->ap_scan == 1)
  721. drv->scanning_done = 0;
  722. return drv;
  723. }
  724. static void wpa_driver_ralink_deinit(void *priv)
  725. {
  726. struct wpa_driver_ralink_data *drv = priv;
  727. UCHAR enable_wpa_supplicant;
  728. wpa_printf(MSG_DEBUG, "%s", __FUNCTION__);
  729. enable_wpa_supplicant = 0;
  730. if (drv->g_driver_down == 0) {
  731. /* trigger driver disable wpa_supplicant support */
  732. if (ralink_set_oid(drv, RT_OID_WPA_SUPPLICANT_SUPPORT,
  733. (char *) &enable_wpa_supplicant,
  734. sizeof(BOOLEAN)) < 0) {
  735. wpa_printf(MSG_DEBUG, "RALINK: Failed to set "
  736. "RT_OID_WPA_SUPPLICANT_SUPPORT(%d)",
  737. (int) enable_wpa_supplicant);
  738. }
  739. wpa_driver_ralink_flush_pmkid(drv);
  740. sleep(1);
  741. /* linux_set_iface_flags(drv->ioctl_sock, drv->ifname, 0); */
  742. }
  743. eloop_cancel_timeout(wpa_driver_ralink_scan_timeout, drv, drv->ctx);
  744. netlink_deinit(drv->netlink);
  745. close(drv->ioctl_sock);
  746. os_free(drv);
  747. }
  748. static void wpa_driver_ralink_scan_timeout(void *eloop_ctx, void *timeout_ctx)
  749. {
  750. struct wpa_driver_ralink_data *drv = eloop_ctx;
  751. wpa_printf(MSG_DEBUG, "%s", __FUNCTION__);
  752. wpa_printf(MSG_DEBUG, "Scan timeout - try to get results");
  753. wpa_supplicant_event(timeout_ctx, EVENT_SCAN_RESULTS, NULL);
  754. drv->scanning_done = 1;
  755. }
  756. static int wpa_driver_ralink_scan(void *priv,
  757. struct wpa_driver_scan_params *params)
  758. {
  759. struct wpa_driver_ralink_data *drv = priv;
  760. struct iwreq iwr;
  761. int ret = 0;
  762. if (drv->g_driver_down == 1)
  763. return -1;
  764. wpa_printf(MSG_DEBUG, "%s", __FUNCTION__);
  765. #if 0
  766. if (ssid_len > IW_ESSID_MAX_SIZE) {
  767. wpa_printf(MSG_DEBUG, "%s: too long SSID (%lu)",
  768. __FUNCTION__, (unsigned long) ssid_len);
  769. return -1;
  770. }
  771. /* wpa_driver_ralink_set_ssid(drv, ssid, ssid_len); */
  772. #endif
  773. if (ralink_set_oid(drv, RT_OID_WPS_PROBE_REQ_IE,
  774. (char *) params->extra_ies, params->extra_ies_len) <
  775. 0) {
  776. wpa_printf(MSG_DEBUG, "RALINK: Failed to set "
  777. "RT_OID_WPS_PROBE_REQ_IE");
  778. }
  779. os_memset(&iwr, 0, sizeof(iwr));
  780. os_strlcpy(iwr.ifr_name, drv->ifname, IFNAMSIZ);
  781. if (ioctl(drv->ioctl_sock, SIOCSIWSCAN, &iwr) < 0) {
  782. perror("ioctl[SIOCSIWSCAN]");
  783. ret = -1;
  784. }
  785. /* Not all drivers generate "scan completed" wireless event, so try to
  786. * read results after a timeout. */
  787. eloop_cancel_timeout(wpa_driver_ralink_scan_timeout, drv, drv->ctx);
  788. eloop_register_timeout(4, 0, wpa_driver_ralink_scan_timeout, drv,
  789. drv->ctx);
  790. drv->scanning_done = 0;
  791. return ret;
  792. }
  793. static struct wpa_scan_results *
  794. wpa_driver_ralink_get_scan_results(void *priv)
  795. {
  796. struct wpa_driver_ralink_data *drv = priv;
  797. UCHAR *buf = NULL;
  798. size_t buf_len;
  799. NDIS_802_11_BSSID_LIST_EX *wsr;
  800. NDIS_WLAN_BSSID_EX *wbi;
  801. struct iwreq iwr;
  802. size_t ap_num;
  803. u8 *pos;
  804. struct wpa_scan_results *res;
  805. if (drv->g_driver_down == 1)
  806. return NULL;
  807. wpa_printf(MSG_DEBUG, "%s", __FUNCTION__);
  808. if (drv->we_version_compiled >= 17)
  809. buf_len = 8192;
  810. else
  811. buf_len = 4096;
  812. for (;;) {
  813. buf = os_zalloc(buf_len);
  814. iwr.u.data.length = buf_len;
  815. if (buf == NULL)
  816. return NULL;
  817. wsr = (NDIS_802_11_BSSID_LIST_EX *) buf;
  818. wsr->NumberOfItems = 0;
  819. os_strlcpy(iwr.ifr_name, drv->ifname, IFNAMSIZ);
  820. iwr.u.data.pointer = (void *) buf;
  821. iwr.u.data.flags = OID_802_11_BSSID_LIST;
  822. if (ioctl(drv->ioctl_sock, RT_PRIV_IOCTL, &iwr) == 0)
  823. break;
  824. if (errno == E2BIG && buf_len < 65535) {
  825. os_free(buf);
  826. buf = NULL;
  827. buf_len *= 2;
  828. if (buf_len > 65535)
  829. buf_len = 65535; /* 16-bit length field */
  830. wpa_printf(MSG_DEBUG, "Scan results did not fit - "
  831. "trying larger buffer (%lu bytes)",
  832. (unsigned long) buf_len);
  833. } else {
  834. perror("ioctl[RT_PRIV_IOCTL]");
  835. os_free(buf);
  836. return NULL;
  837. }
  838. }
  839. res = os_zalloc(sizeof(*res));
  840. if (res == NULL) {
  841. os_free(buf);
  842. return NULL;
  843. }
  844. res->res = os_zalloc(wsr->NumberOfItems *
  845. sizeof(struct wpa_scan_res *));
  846. if (res->res == NULL) {
  847. os_free(res);
  848. os_free(buf);
  849. return NULL;
  850. }
  851. for (ap_num = 0, wbi = wsr->Bssid; ap_num < wsr->NumberOfItems;
  852. ++ap_num) {
  853. struct wpa_scan_res *r = NULL;
  854. size_t extra_len = 0, var_ie_len = 0;
  855. u8 *pos2;
  856. /* SSID data element */
  857. extra_len += 2 + wbi->Ssid.SsidLength;
  858. var_ie_len = wbi->IELength - sizeof(NDIS_802_11_FIXED_IEs);
  859. r = os_zalloc(sizeof(*r) + extra_len + var_ie_len);
  860. if (r == NULL)
  861. break;
  862. res->res[res->num++] = r;
  863. wpa_printf(MSG_DEBUG, "SSID - %s", wbi->Ssid.Ssid);
  864. /* get ie's */
  865. wpa_hexdump(MSG_DEBUG, "RALINK: AP IEs",
  866. (u8 *) &wbi->IEs[0], wbi->IELength);
  867. os_memcpy(r->bssid, wbi->MacAddress, ETH_ALEN);
  868. extra_len += (2 + wbi->Ssid.SsidLength);
  869. r->ie_len = extra_len + var_ie_len;
  870. pos2 = (u8 *) (r + 1);
  871. /*
  872. * Generate a fake SSID IE since the driver did not report
  873. * a full IE list.
  874. */
  875. *pos2++ = WLAN_EID_SSID;
  876. *pos2++ = wbi->Ssid.SsidLength;
  877. os_memcpy(pos2, wbi->Ssid.Ssid, wbi->Ssid.SsidLength);
  878. pos2 += wbi->Ssid.SsidLength;
  879. r->freq = (wbi->Configuration.DSConfig / 1000);
  880. pos = (u8 *) wbi + sizeof(*wbi) - 1;
  881. pos += sizeof(NDIS_802_11_FIXED_IEs) - 2;
  882. os_memcpy(&(r->caps), pos, 2);
  883. pos += 2;
  884. if (wbi->IELength > sizeof(NDIS_802_11_FIXED_IEs))
  885. os_memcpy(pos2, pos, var_ie_len);
  886. wbi = (NDIS_WLAN_BSSID_EX *) ((u8 *) wbi + wbi->Length);
  887. }
  888. os_free(buf);
  889. return res;
  890. }
  891. static int ralink_set_auth_mode(struct wpa_driver_ralink_data *drv,
  892. NDIS_802_11_AUTHENTICATION_MODE mode)
  893. {
  894. NDIS_802_11_AUTHENTICATION_MODE auth_mode = mode;
  895. wpa_printf(MSG_DEBUG, "%s", __FUNCTION__);
  896. if (ralink_set_oid(drv, OID_802_11_AUTHENTICATION_MODE,
  897. (char *) &auth_mode, sizeof(auth_mode)) < 0) {
  898. wpa_printf(MSG_DEBUG, "RALINK: Failed to set "
  899. "OID_802_11_AUTHENTICATION_MODE (%d)",
  900. (int) auth_mode);
  901. return -1;
  902. }
  903. return 0;
  904. }
  905. static int ralink_set_encr_type(struct wpa_driver_ralink_data *drv,
  906. NDIS_802_11_WEP_STATUS encr_type)
  907. {
  908. NDIS_802_11_WEP_STATUS wep_status = encr_type;
  909. wpa_printf(MSG_DEBUG, "%s", __FUNCTION__);
  910. if (ralink_set_oid(drv, OID_802_11_WEP_STATUS,
  911. (char *) &wep_status, sizeof(wep_status)) < 0) {
  912. wpa_printf(MSG_DEBUG, "RALINK: Failed to set "
  913. "OID_802_11_WEP_STATUS (%d)",
  914. (int) wep_status);
  915. return -1;
  916. }
  917. return 0;
  918. }
  919. static int wpa_driver_ralink_remove_key(struct wpa_driver_ralink_data *drv,
  920. int key_idx, const u8 *addr,
  921. const u8 *bssid, int pairwise)
  922. {
  923. NDIS_802_11_REMOVE_KEY rkey;
  924. NDIS_802_11_KEY_INDEX _index;
  925. int res, res2;
  926. wpa_printf(MSG_DEBUG, "%s", __FUNCTION__);
  927. os_memset(&rkey, 0, sizeof(rkey));
  928. rkey.Length = sizeof(rkey);
  929. rkey.KeyIndex = key_idx;
  930. if (pairwise)
  931. rkey.KeyIndex |= 1 << 30;
  932. os_memcpy(rkey.BSSID, bssid, ETH_ALEN);
  933. res = ralink_set_oid(drv, OID_802_11_REMOVE_KEY, (char *) &rkey,
  934. sizeof(rkey));
  935. /* AlbertY@20060210 removed it */
  936. if (0 /* !pairwise */) {
  937. res2 = ralink_set_oid(drv, OID_802_11_REMOVE_WEP,
  938. (char *) &_index, sizeof(_index));
  939. } else
  940. res2 = 0;
  941. if (res < 0 && res2 < 0)
  942. return res;
  943. return 0;
  944. }
  945. static int wpa_driver_ralink_add_wep(struct wpa_driver_ralink_data *drv,
  946. int pairwise, int key_idx, int set_tx,
  947. const u8 *key, size_t key_len)
  948. {
  949. NDIS_802_11_WEP *wep;
  950. size_t len;
  951. int res;
  952. wpa_printf(MSG_DEBUG, "%s", __FUNCTION__);
  953. len = 12 + key_len;
  954. wep = os_zalloc(len);
  955. if (wep == NULL)
  956. return -1;
  957. wep->Length = len;
  958. wep->KeyIndex = key_idx;
  959. if (set_tx)
  960. wep->KeyIndex |= 0x80000000;
  961. wep->KeyLength = key_len;
  962. os_memcpy(wep->KeyMaterial, key, key_len);
  963. wpa_hexdump_key(MSG_MSGDUMP, "RALINK: OID_802_11_ADD_WEP",
  964. (const u8 *) wep, len);
  965. res = ralink_set_oid(drv, OID_802_11_ADD_WEP, (char *) wep, len);
  966. os_free(wep);
  967. return res;
  968. }
  969. static int wpa_driver_ralink_set_key(const char *ifname, void *priv,
  970. enum wpa_alg alg, const u8 *addr,
  971. int key_idx, int set_tx,
  972. const u8 *seq, size_t seq_len,
  973. const u8 *key, size_t key_len)
  974. {
  975. struct wpa_driver_ralink_data *drv = priv;
  976. size_t len, i;
  977. NDIS_802_11_KEY *nkey;
  978. int res, pairwise;
  979. u8 bssid[ETH_ALEN];
  980. if (drv->g_driver_down == 1)
  981. return -1;
  982. wpa_printf(MSG_DEBUG, "%s", __FUNCTION__);
  983. drv->bAddWepKey = FALSE;
  984. if (addr == NULL || is_broadcast_ether_addr(addr)) {
  985. /* Group Key */
  986. pairwise = 0;
  987. wpa_driver_ralink_get_bssid(drv, bssid);
  988. } else {
  989. /* Pairwise Key */
  990. pairwise = 1;
  991. os_memcpy(bssid, addr, ETH_ALEN);
  992. }
  993. if (alg == WPA_ALG_NONE || key_len == 0) {
  994. return wpa_driver_ralink_remove_key(drv, key_idx, addr, bssid,
  995. pairwise);
  996. }
  997. if (alg == WPA_ALG_WEP) {
  998. drv->bAddWepKey = TRUE;
  999. return wpa_driver_ralink_add_wep(drv, pairwise, key_idx,
  1000. set_tx, key, key_len);
  1001. }
  1002. len = 12 + 6 + 6 + 8 + key_len;
  1003. nkey = os_zalloc(len);
  1004. if (nkey == NULL)
  1005. return -1;
  1006. nkey->Length = len;
  1007. nkey->KeyIndex = key_idx;
  1008. if (set_tx)
  1009. nkey->KeyIndex |= 1 << 31;
  1010. if (pairwise)
  1011. nkey->KeyIndex |= 1 << 30;
  1012. if (seq && seq_len)
  1013. nkey->KeyIndex |= 1 << 29;
  1014. nkey->KeyLength = key_len;
  1015. os_memcpy(nkey->BSSID, bssid, ETH_ALEN);
  1016. if (seq && seq_len) {
  1017. for (i = 0; i < seq_len; i++)
  1018. nkey->KeyRSC |= seq[i] << (i * 8);
  1019. }
  1020. if (alg == WPA_ALG_TKIP && key_len == 32) {
  1021. os_memcpy(nkey->KeyMaterial, key, 16);
  1022. os_memcpy(nkey->KeyMaterial + 16, key + 24, 8);
  1023. os_memcpy(nkey->KeyMaterial + 24, key + 16, 8);
  1024. } else {
  1025. os_memcpy(nkey->KeyMaterial, key, key_len);
  1026. }
  1027. wpa_printf(MSG_DEBUG, "%s: alg=%d key_idx=%d set_tx=%d seq_len=%lu "
  1028. "key_len=%lu", __FUNCTION__, alg, key_idx, set_tx,
  1029. (unsigned long) seq_len, (unsigned long) key_len);
  1030. wpa_hexdump_key(MSG_MSGDUMP, "RALINK: OID_802_11_ADD_KEY",
  1031. (const u8 *) nkey, len);
  1032. res = ralink_set_oid(drv, OID_802_11_ADD_KEY, (char *) nkey, len);
  1033. os_free(nkey);
  1034. return res;
  1035. }
  1036. static int wpa_driver_ralink_disassociate(void *priv, const u8 *addr,
  1037. int reason_code)
  1038. {
  1039. struct wpa_driver_ralink_data *drv = priv;
  1040. if (drv->g_driver_down == 1)
  1041. return -1;
  1042. wpa_printf(MSG_DEBUG, "%s", __FUNCTION__);
  1043. if (ralink_set_oid(drv, OID_802_11_DISASSOCIATE, " ", 4) < 0) {
  1044. wpa_printf(MSG_DEBUG, "RALINK: Failed to set "
  1045. "OID_802_11_DISASSOCIATE");
  1046. }
  1047. return 0;
  1048. }
  1049. static int wpa_driver_ralink_deauthenticate(void *priv, const u8 *addr,
  1050. int reason_code)
  1051. {
  1052. struct wpa_driver_ralink_data *drv = priv;
  1053. wpa_printf(MSG_DEBUG, "g_driver_down = %d", drv->g_driver_down);
  1054. if (drv->g_driver_down == 1)
  1055. return -1;
  1056. wpa_printf(MSG_DEBUG, "%s", __FUNCTION__);
  1057. if (ralink_get_new_driver_flag(drv) == 0) {
  1058. return wpa_driver_ralink_disassociate(priv, addr, reason_code);
  1059. } else {
  1060. MLME_DEAUTH_REQ_STRUCT mlme;
  1061. os_memset(&mlme, 0, sizeof(MLME_DEAUTH_REQ_STRUCT));
  1062. mlme.Reason = reason_code;
  1063. os_memcpy(mlme.Addr, addr, MAC_ADDR_LEN);
  1064. return ralink_set_oid(drv, OID_802_11_DEAUTHENTICATION,
  1065. (char *) &mlme,
  1066. sizeof(MLME_DEAUTH_REQ_STRUCT));
  1067. }
  1068. }
  1069. static int wpa_driver_ralink_set_gen_ie(void *priv, const u8 *ie,
  1070. size_t ie_len)
  1071. {
  1072. struct wpa_driver_ralink_data *drv = priv;
  1073. struct iwreq iwr;
  1074. int ret = 0;
  1075. os_memset(&iwr, 0, sizeof(iwr));
  1076. os_strlcpy(iwr.ifr_name, drv->ifname, IFNAMSIZ);
  1077. iwr.u.data.pointer = (caddr_t) ie;
  1078. iwr.u.data.length = ie_len;
  1079. wpa_hexdump(MSG_DEBUG, "wpa_driver_ralink_set_gen_ie: ",
  1080. (u8 *) ie, ie_len);
  1081. if (ioctl(drv->ioctl_sock, SIOCSIWGENIE, &iwr) < 0) {
  1082. perror("ioctl[SIOCSIWGENIE]");
  1083. ret = -1;
  1084. }
  1085. return ret;
  1086. }
  1087. static int
  1088. wpa_driver_ralink_associate(void *priv,
  1089. struct wpa_driver_associate_params *params)
  1090. {
  1091. struct wpa_driver_ralink_data *drv = priv;
  1092. NDIS_802_11_NETWORK_INFRASTRUCTURE mode;
  1093. NDIS_802_11_AUTHENTICATION_MODE auth_mode;
  1094. NDIS_802_11_WEP_STATUS encr;
  1095. BOOLEAN ieee8021xMode;
  1096. BOOLEAN ieee8021x_required_key = TRUE;
  1097. if (drv->g_driver_down == 1)
  1098. return -1;
  1099. wpa_printf(MSG_DEBUG, "%s", __FUNCTION__);
  1100. if (params->mode == IEEE80211_MODE_IBSS)
  1101. mode = Ndis802_11IBSS;
  1102. else
  1103. mode = Ndis802_11Infrastructure;
  1104. if (ralink_set_oid(drv, OID_802_11_INFRASTRUCTURE_MODE,
  1105. (char *) &mode, sizeof(mode)) < 0) {
  1106. wpa_printf(MSG_DEBUG, "RALINK: Failed to set "
  1107. "OID_802_11_INFRASTRUCTURE_MODE (%d)",
  1108. (int) mode);
  1109. /* Try to continue anyway */
  1110. }
  1111. if (params->key_mgmt_suite == KEY_MGMT_WPS) {
  1112. UCHAR enable_wps = 0x80;
  1113. /* trigger driver support wpa_supplicant */
  1114. if (ralink_set_oid(drv, RT_OID_WPA_SUPPLICANT_SUPPORT,
  1115. (PCHAR) &enable_wps, sizeof(UCHAR)) < 0) {
  1116. wpa_printf(MSG_INFO, "RALINK: Failed to set "
  1117. "RT_OID_WPA_SUPPLICANT_SUPPORT (%d)",
  1118. (int) enable_wps);
  1119. }
  1120. wpa_driver_ralink_set_gen_ie(priv, params->wpa_ie,
  1121. params->wpa_ie_len);
  1122. ralink_set_auth_mode(drv, Ndis802_11AuthModeOpen);
  1123. ralink_set_encr_type(drv, Ndis802_11EncryptionDisabled);
  1124. } else {
  1125. #ifdef CONFIG_WPS
  1126. UCHAR enable_wpa_supplicant;
  1127. if (drv->ap_scan == 1)
  1128. enable_wpa_supplicant = 0x01;
  1129. else
  1130. enable_wpa_supplicant = 0x02;
  1131. /* trigger driver support wpa_supplicant */
  1132. if (ralink_set_oid(drv, RT_OID_WPA_SUPPLICANT_SUPPORT,
  1133. (PCHAR) &enable_wpa_supplicant,
  1134. sizeof(UCHAR)) < 0) {
  1135. wpa_printf(MSG_DEBUG, "RALINK: Failed to set "
  1136. "RT_OID_WPA_SUPPLICANT_SUPPORT (%d)",
  1137. (int) enable_wpa_supplicant);
  1138. }
  1139. wpa_driver_ralink_set_gen_ie(priv, (u8 *) "", 0);
  1140. #endif /* CONFIG_WPS */
  1141. if (params->wpa_ie == NULL || params->wpa_ie_len == 0) {
  1142. if (params->auth_alg & WPA_AUTH_ALG_SHARED) {
  1143. if (params->auth_alg & WPA_AUTH_ALG_OPEN)
  1144. auth_mode = Ndis802_11AuthModeAutoSwitch;
  1145. else
  1146. auth_mode = Ndis802_11AuthModeShared;
  1147. } else
  1148. auth_mode = Ndis802_11AuthModeOpen;
  1149. } else if (params->wpa_ie[0] == WLAN_EID_RSN) {
  1150. if (params->key_mgmt_suite == KEY_MGMT_PSK)
  1151. auth_mode = Ndis802_11AuthModeWPA2PSK;
  1152. else
  1153. auth_mode = Ndis802_11AuthModeWPA2;
  1154. } else {
  1155. if (params->key_mgmt_suite == KEY_MGMT_WPA_NONE)
  1156. auth_mode = Ndis802_11AuthModeWPANone;
  1157. else if (params->key_mgmt_suite == KEY_MGMT_PSK)
  1158. auth_mode = Ndis802_11AuthModeWPAPSK;
  1159. else
  1160. auth_mode = Ndis802_11AuthModeWPA;
  1161. }
  1162. switch (params->pairwise_suite) {
  1163. case CIPHER_CCMP:
  1164. encr = Ndis802_11Encryption3Enabled;
  1165. break;
  1166. case CIPHER_TKIP:
  1167. encr = Ndis802_11Encryption2Enabled;
  1168. break;
  1169. case CIPHER_WEP40:
  1170. case CIPHER_WEP104:
  1171. encr = Ndis802_11Encryption1Enabled;
  1172. break;
  1173. case CIPHER_NONE:
  1174. if (params->group_suite == CIPHER_CCMP)
  1175. encr = Ndis802_11Encryption3Enabled;
  1176. else if (params->group_suite == CIPHER_TKIP)
  1177. encr = Ndis802_11Encryption2Enabled;
  1178. else
  1179. encr = Ndis802_11EncryptionDisabled;
  1180. break;
  1181. default:
  1182. encr = Ndis802_11EncryptionDisabled;
  1183. break;
  1184. }
  1185. ralink_set_auth_mode(drv, auth_mode);
  1186. /* notify driver that IEEE8021x mode is enabled */
  1187. if (params->key_mgmt_suite == KEY_MGMT_802_1X_NO_WPA) {
  1188. ieee8021xMode = TRUE;
  1189. if (drv->bAddWepKey)
  1190. ieee8021x_required_key = FALSE;
  1191. } else
  1192. ieee8021xMode = FALSE;
  1193. if (ralink_set_oid(drv, OID_802_11_SET_IEEE8021X_REQUIRE_KEY,
  1194. (char *) &ieee8021x_required_key,
  1195. sizeof(BOOLEAN)) < 0) {
  1196. wpa_printf(MSG_DEBUG, "ERROR: Failed to set "
  1197. "OID_802_11_SET_IEEE8021X_REQUIRE_KEY(%d)",
  1198. (int) ieee8021x_required_key);
  1199. } else {
  1200. wpa_printf(MSG_DEBUG, "ieee8021x_required_key is %s",
  1201. ieee8021x_required_key ? "TRUE" : "FALSE");
  1202. }
  1203. if (ralink_set_oid(drv, OID_802_11_SET_IEEE8021X,
  1204. (char *) &ieee8021xMode, sizeof(BOOLEAN)) <
  1205. 0) {
  1206. wpa_printf(MSG_DEBUG, "RALINK: Failed to set "
  1207. "OID_802_11_SET_IEEE8021X(%d)",
  1208. (int) ieee8021xMode);
  1209. }
  1210. ralink_set_encr_type(drv, encr);
  1211. if ((ieee8021xMode == FALSE) &&
  1212. (encr == Ndis802_11Encryption1Enabled)) {
  1213. /* static WEP */
  1214. int enabled = 0;
  1215. if (ralink_set_oid(drv, OID_802_11_DROP_UNENCRYPTED,
  1216. (char *) &enabled, sizeof(enabled))
  1217. < 0) {
  1218. wpa_printf(MSG_DEBUG, "RALINK: Failed to set "
  1219. "OID_802_11_DROP_UNENCRYPTED(%d)",
  1220. (int) encr);
  1221. }
  1222. }
  1223. }
  1224. return wpa_driver_ralink_set_ssid(drv, params->ssid, params->ssid_len);
  1225. }
  1226. static int
  1227. wpa_driver_ralink_set_countermeasures(void *priv, int enabled)
  1228. {
  1229. struct wpa_driver_ralink_data *drv = priv;
  1230. if (drv->g_driver_down == 1)
  1231. return -1;
  1232. wpa_printf(MSG_DEBUG, "%s: enabled=%d", __FUNCTION__, enabled);
  1233. return ralink_set_oid(drv, OID_SET_COUNTERMEASURES, (char *) &enabled,
  1234. sizeof(int));
  1235. }
  1236. const struct wpa_driver_ops wpa_driver_ralink_ops = {
  1237. .name = "ralink",
  1238. .desc = "Ralink Wireless Client driver",
  1239. .get_bssid = wpa_driver_ralink_get_bssid,
  1240. .get_ssid = wpa_driver_ralink_get_ssid,
  1241. .set_key = wpa_driver_ralink_set_key,
  1242. .init = wpa_driver_ralink_init,
  1243. .deinit = wpa_driver_ralink_deinit,
  1244. .set_countermeasures = wpa_driver_ralink_set_countermeasures,
  1245. .scan2 = wpa_driver_ralink_scan,
  1246. .get_scan_results2 = wpa_driver_ralink_get_scan_results,
  1247. .deauthenticate = wpa_driver_ralink_deauthenticate,
  1248. .disassociate = wpa_driver_ralink_disassociate,
  1249. .associate = wpa_driver_ralink_associate,
  1250. .add_pmkid = wpa_driver_ralink_add_pmkid,
  1251. .remove_pmkid = wpa_driver_ralink_remove_pmkid,
  1252. .flush_pmkid = wpa_driver_ralink_flush_pmkid,
  1253. };