static int wpa_driver_atmel_set_suites(const char *ifname, u8 pairwise_suite, u8 group_suite, u8 key_mgmt_suite) { struct atmel_param param; int ret; memset(¶m, 0, sizeof(param)); param.cmd = SET_CIPHER_SUITES; param.pairwise_suite = pairwise_suite; param.group_suite = group_suite; param.key_mgmt_suite = key_mgmt_suite; ret = atmel_ioctl(ifname, ¶m, sizeof(param), 1); return ret; }
static int wpa_driver_atmel_mlme(const char *ifname, u8 *addr, int cmd, int reason_code) { struct atmel_param param; int ret; int mgmt_error = 0xaa; memset(¶m, 0, sizeof(param)); memcpy(param.sta_addr, addr, ETH_ALEN); param.cmd = cmd; param.mlme.reason_code = reason_code; param.mlme.state = mgmt_error; ret = atmel_ioctl(ifname, ¶m, sizeof(param), 1); return ret; }
static int wpa_driver_atmel_mlme(void *priv, const u8 *addr, int cmd, int reason_code) { struct wpa_driver_atmel_data *drv = priv; struct atmel_param param; int ret; int mgmt_error = 0xaa; os_memset(¶m, 0, sizeof(param)); os_memcpy(param.sta_addr, addr, ETH_ALEN); param.cmd = cmd; param.mlme.reason_code = reason_code; param.mlme.state = mgmt_error; ret = atmel_ioctl(drv, ¶m, sizeof(param), 1); return ret; }
static int wpa_driver_atmel_set_wpa_ie(struct wpa_driver_atmel_data *drv, const char *wpa_ie, size_t wpa_ie_len) { struct atmel_param *param; int res; size_t blen = ATMEL_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 = ATMEL_SET_GENERIC_ELEMENT; param->u.generic_elem.len = wpa_ie_len; os_memcpy(param->u.generic_elem.data, wpa_ie, wpa_ie_len); res = atmel_ioctl(drv, param, blen, 1); os_free(param); return res; }
static int wpa_driver_atmel_set_key(const char *ifname, wpa_alg alg, unsigned char *addr, int key_idx, int set_tx, u8 *seq, size_t seq_len, u8 *key, size_t key_len) { int ret = 0; struct atmel_param *param; u8 *buf; u8 alg_type; size_t blen; char *alg_name; switch (alg) { case WPA_ALG_NONE: alg_name = "none"; alg_type = 0; break; case WPA_ALG_WEP: alg_name = "WEP"; alg_type = 1; break; case WPA_ALG_TKIP: alg_name = "TKIP"; alg_type = 2; break; case WPA_ALG_CCMP: alg_name = "CCMP"; alg_type = 3; break; default: return -1; } wpa_printf(MSG_DEBUG, "%s: alg=%s key_idx=%d set_tx=%d seq_len=%d " "key_len=%d", __FUNCTION__, alg_name, key_idx, set_tx, seq_len, key_len); if (seq_len > 8) return -2; blen = sizeof(*param) + key_len; buf = malloc(blen); if (buf == NULL) return -1; memset(buf, 0, blen); param = (struct atmel_param *) buf; param->cmd = SET_WPA_ENCRYPTION; if (addr == NULL) memset(param->sta_addr, 0xff, ETH_ALEN); else memcpy(param->sta_addr, addr, ETH_ALEN); param->alg = alg_type; param->key_idx = key_idx; param->set_tx = set_tx; memcpy(param->seq, seq, seq_len); param->seq_len = seq_len; param->key_len = key_len; memcpy((u8 *)param->key, key, key_len); if (atmel_ioctl(ifname, param, blen, 1)) { wpa_printf(MSG_WARNING, "Failed to set encryption."); /* TODO: show key error*/ ret = -1; } free(buf); return ret; }
int wpa_driver_atmel_set_key(const char *ifname, wpa_alg alg, unsigned char *addr, int key_idx, int set_tx, u8 *seq, size_t seq_len, u8 *key, size_t key_len) { int ret = 0; struct atmel_param *param; u8 *buf; u8 alg_type; size_t blen; char *alg_name; switch (alg) { case WPA_ALG_NONE: alg_name = "none"; alg_type = 0; break; case WPA_ALG_WEP: alg_name = "WEP"; alg_type = 1; break; case WPA_ALG_TKIP: alg_name = "TKIP"; alg_type = 2; break; case WPA_ALG_CCMP: alg_name = "CCMP"; alg_type = 3; break; default: return -1; } if (seq_len > 8) return -2; blen = sizeof(*param) + key_len; buf = malloc(blen); if (buf == NULL) return -1; memset(buf, 0, blen); param = (struct atmel_param *) buf; param->cmd = SET_WPA_ENCRYPTION; if (addr == NULL) memset(param->sta_addr, 0xff, ETH_ALEN); else memcpy(param->sta_addr, addr, ETH_ALEN); param->alg = alg_type; param->key_idx = key_idx; param->set_tx = set_tx; memcpy(param->seq, seq, seq_len); param->seq_len = seq_len; param->key_len = key_len; memcpy((u8 *)param->key, key, key_len); if (atmel_ioctl(ifname, param, blen)) { ret = -1; } free(buf); return ret; }