/* This is called at wpa_supplicant daemon init time */ static int wpa_driver_prism54_set_wpa(void *priv, int enabled) { struct wpa_driver_prism54_data *drv = priv; struct prism2_hostapd_param *param; int res; size_t blen = PRISM2_HOSTAPD_GENERIC_ELEMENT_HDR_LEN; if (blen < sizeof(*param)) blen = sizeof(*param); param = os_zalloc(blen); if (param == NULL) return -1; param->cmd = PRISM54_SET_WPA; param->u.generic_elem.len = 0; res = hostapd_ioctl_prism54(drv, param, blen, 1); os_free(param); return res; }
static int wpa_driver_prism54_set_wpa_ie(struct wpa_driver_prism54_data *drv, const u8 *wpa_ie, size_t wpa_ie_len) { struct prism2_hostapd_param *param; int res; size_t blen = PRISM2_HOSTAPD_GENERIC_ELEMENT_HDR_LEN + wpa_ie_len; if (blen < sizeof(*param)) blen = sizeof(*param); param = os_zalloc(blen); if (param == NULL) return -1; param->cmd = PRISM2_HOSTAPD_SET_GENERIC_ELEMENT; param->u.generic_elem.len = wpa_ie_len; os_memcpy(param->u.generic_elem.data, wpa_ie, wpa_ie_len); res = hostapd_ioctl_prism54(drv, param, blen, 1); os_free(param); return res; }
static int wpa_driver_prism54_set_drop_unencrypted(void *priv, int enabled) { struct wpa_driver_prism54_data *drv = priv; struct prism2_hostapd_param *param; int res; size_t blen = PRISM2_HOSTAPD_GENERIC_ELEMENT_HDR_LEN; if (blen < sizeof(*param)) blen = sizeof(*param); param = (struct prism2_hostapd_param *) malloc(blen); if (param == NULL) return -1; memset(param, 0, blen); param->cmd = PRISM54_DROP_UNENCRYPTED; param->u.generic_elem.len = 0; res = hostapd_ioctl_prism54(drv, param, blen, 1); free(param); return res; }
static int wpa_driver_prism54_set_key(void *priv, wpa_alg alg, const u8 *addr, int key_idx, int set_tx, const u8 *seq, size_t seq_len, const u8 *key, size_t key_len) { struct wpa_driver_prism54_data *drv = priv; struct prism2_hostapd_param *param; u8 *buf; size_t blen; int ret = 0; char *alg_name; switch (alg) { case WPA_ALG_NONE: alg_name = "none"; return -1; break; case WPA_ALG_WEP: alg_name = "WEP"; return -1; break; case WPA_ALG_TKIP: alg_name = "TKIP"; break; case WPA_ALG_CCMP: alg_name = "CCMP"; return -1; break; default: return -1; } wpa_printf(MSG_DEBUG, "%s: alg=%s key_idx=%d set_tx=%d seq_len=%lu " "key_len=%lu", __FUNCTION__, alg_name, key_idx, set_tx, (unsigned long) seq_len, (unsigned long) key_len); if (seq_len > 8) return -2; blen = sizeof(*param) + key_len; buf = os_zalloc(blen); if (buf == NULL) return -1; param = (struct prism2_hostapd_param *) buf; param->cmd = PRISM2_SET_ENCRYPTION; /* TODO: In theory, STA in client mode can use five keys; four default * keys for receiving (with keyidx 0..3) and one individual key for * both transmitting and receiving (keyidx 0) _unicast_ packets. Now, * keyidx 0 is reserved for this unicast use and default keys can only * use keyidx 1..3 (i.e., default key with keyidx 0 is not supported). * This should be fine for more or less all cases, but for completeness * sake, the driver could be enhanced to support the missing key. */ #if 0 if (addr == NULL) os_memset(param->sta_addr, 0xff, ETH_ALEN); else os_memcpy(param->sta_addr, addr, ETH_ALEN); #else os_memset(param->sta_addr, 0xff, ETH_ALEN); #endif os_strncpy((char *) param->u.crypt.alg, alg_name, HOSTAP_CRYPT_ALG_NAME_LEN); param->u.crypt.flags = set_tx ? HOSTAP_CRYPT_FLAG_SET_TX_KEY : 0; param->u.crypt.idx = key_idx; os_memcpy(param->u.crypt.seq, seq, seq_len); param->u.crypt.key_len = key_len; os_memcpy((u8 *) (param + 1), key, key_len); if (hostapd_ioctl_prism54(drv, param, blen, 1)) { wpa_printf(MSG_WARNING, "Failed to set encryption."); show_set_key_error(param); ret = -1; } os_free(buf); return ret; }