1526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt/* 2526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * WPA Supplicant - Driver interaction with Atmel Wireless LAN drivers 3526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * Copyright (c) 2000-2005, ATMEL Corporation 4526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * Copyright (c) 2004-2007, Jouni Malinen <j@w1.fi> 5526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * 6526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * This program is free software; you can redistribute it and/or modify 7526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * it under the terms of the GNU General Public License version 2 as 8526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * published by the Free Software Foundation. 9526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * 10526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * Alternatively, this software may be distributed under the terms of BSD 11526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * license. 12526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * 13526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * See README and COPYING for more details. 14526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt */ 15526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 16526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt/****************************************************************************** 17526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt Copyright 2000-2001 ATMEL Corporation. 18526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 19526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt WPA Supplicant - driver interaction with Atmel Wireless lan drivers. 20526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 21526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt This is free software; you can redistribute it and/or modify 22526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt it under the terms of the GNU General Public License as published by 23526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt the Free Software Foundation; either version 2 of the License, or 24526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt (at your option) any later version. 25526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 26526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt This program is distributed in the hope that it will be useful, 27526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt but WITHOUT ANY WARRANTY; without even the implied warranty of 28526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 29526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt GNU General Public License for more details. 30526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 31526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt You should have received a copy of the GNU General Public License 32526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt along with Atmel wireless lan drivers; if not, write to the Free Software 33526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA 34526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 35526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt******************************************************************************/ 36526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 37526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt/* 38526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * Alternatively, this software may be distributed under the terms of BSD 39526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * license. 40526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt */ 41526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 42526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt#include "includes.h" 43526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt#include <sys/ioctl.h> 44526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 45526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt#include "wireless_copy.h" 46526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt#include "common.h" 47526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt#include "driver.h" 48526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt#include "driver_wext.h" 49526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 50526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidtstruct wpa_driver_atmel_data { 51526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt void *wext; /* private data for driver_wext */ 52526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt void *ctx; 53526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt char ifname[IFNAMSIZ + 1]; 54526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt int sock; 55526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt}; 56526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 57526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 58526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt#define ATMEL_WPA_IOCTL (SIOCIWFIRSTPRIV + 2) 59526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt#define ATMEL_WPA_IOCTL_PARAM (SIOCIWFIRSTPRIV + 3) 60526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt#define ATMEL_WPA_IOCTL_GET_PARAM (SIOCIWFIRSTPRIV + 4) 61526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 62526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 63526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt/* ATMEL_WPA_IOCTL ioctl() cmd: */ 64526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidtenum { 65526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt SET_WPA_ENCRYPTION = 1, 66526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt SET_CIPHER_SUITES = 2, 67526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt MLME_STA_DEAUTH = 3, 68526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt MLME_STA_DISASSOC = 4 69526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt}; 70526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 71526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt/* ATMEL_WPA_IOCTL_PARAM ioctl() cmd: */ 72526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidtenum { 73526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt ATMEL_PARAM_WPA = 1, 74526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt ATMEL_PARAM_PRIVACY_INVOKED = 2, 75526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt ATMEL_PARAM_WPA_TYPE = 3 76526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt}; 77526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 78526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt#define MAX_KEY_LENGTH 40 79526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 80526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidtstruct atmel_param{ 81526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt unsigned char sta_addr[6]; 82526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt int cmd; 83526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt u8 alg; 84526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt u8 key_idx; 85526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt u8 set_tx; 86526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt u8 seq[8]; 87526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt u8 seq_len; 88526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt u16 key_len; 89526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt u8 key[MAX_KEY_LENGTH]; 90526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt struct{ 91526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt int reason_code; 92526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt u8 state; 93526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt }mlme; 94526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt u8 pairwise_suite; 95526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt u8 group_suite; 96526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt u8 key_mgmt_suite; 97526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt}; 98526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 99526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 100526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 101526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidtstatic int atmel_ioctl(struct wpa_driver_atmel_data *drv, 102526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt struct atmel_param *param, 103526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt int len, int show_err) 104526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt{ 105526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt struct iwreq iwr; 106526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 107526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt os_memset(&iwr, 0, sizeof(iwr)); 108526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt os_strlcpy(iwr.ifr_name, drv->ifname, IFNAMSIZ); 109526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt iwr.u.data.pointer = (caddr_t) param; 110526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt iwr.u.data.length = len; 111526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 112526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (ioctl(drv->sock, ATMEL_WPA_IOCTL, &iwr) < 0) { 113526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt int ret; 114526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt ret = errno; 115526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (show_err) 116526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt perror("ioctl[ATMEL_WPA_IOCTL]"); 117526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt return ret; 118526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt } 119526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 120526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt return 0; 121526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt} 122526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 123526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 124526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidtstatic int atmel2param(struct wpa_driver_atmel_data *drv, int param, int value) 125526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt{ 126526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt struct iwreq iwr; 127526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt int *i, ret = 0; 128526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 129526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt os_memset(&iwr, 0, sizeof(iwr)); 130526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt os_strlcpy(iwr.ifr_name, drv->ifname, IFNAMSIZ); 131526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt i = (int *) iwr.u.name; 132526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt *i++ = param; 133526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt *i++ = value; 134526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 135526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (ioctl(drv->sock, ATMEL_WPA_IOCTL_PARAM, &iwr) < 0) { 136526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt perror("ioctl[ATMEL_WPA_IOCTL_PARAM]"); 137526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt ret = -1; 138526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt } 139526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt return ret; 140526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt} 141526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 142526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 143526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt#if 0 144526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidtstatic int wpa_driver_atmel_set_wpa_ie(struct wpa_driver_atmel_data *drv, 145526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt const char *wpa_ie, size_t wpa_ie_len) 146526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt{ 147526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt struct atmel_param *param; 148526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt int res; 149526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt size_t blen = ATMEL_GENERIC_ELEMENT_HDR_LEN + wpa_ie_len; 150526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (blen < sizeof(*param)) 151526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt blen = sizeof(*param); 152526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 153526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt param = os_zalloc(blen); 154526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (param == NULL) 155526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt return -1; 156526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 157526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt param->cmd = ATMEL_SET_GENERIC_ELEMENT; 158526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt param->u.generic_elem.len = wpa_ie_len; 159526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt os_memcpy(param->u.generic_elem.data, wpa_ie, wpa_ie_len); 160526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt res = atmel_ioctl(drv, param, blen, 1); 161526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 162526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt os_free(param); 163526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 164526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt return res; 165526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt} 166526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt#endif 167526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 168526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 169526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidtstatic int wpa_driver_atmel_set_wpa(void *priv, int enabled) 170526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt{ 171526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt struct wpa_driver_atmel_data *drv = priv; 172526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt int ret = 0; 173526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 174526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt printf("wpa_driver_atmel_set_wpa %s\n", drv->ifname); 175526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 176526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt wpa_printf(MSG_DEBUG, "%s: enabled=%d", __FUNCTION__, enabled); 177526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 178526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt#if 0 179526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (!enabled && wpa_driver_atmel_set_wpa_ie(drv, NULL, 0) < 0) 180526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt ret = -1; 181526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt#endif 182526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (atmel2param(drv, ATMEL_PARAM_PRIVACY_INVOKED, enabled) < 0) 183526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt ret = -1; 184526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (atmel2param(drv, ATMEL_PARAM_WPA, enabled) < 0) 185526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt ret = -1; 186526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 187526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt return ret; 188526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt} 189526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 190526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 191526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidtstatic int wpa_driver_atmel_set_key(void *priv, wpa_alg alg, 192526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt const u8 *addr, int key_idx, 193526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt int set_tx, const u8 *seq, size_t seq_len, 194526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt const u8 *key, size_t key_len) 195526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt{ 196526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt struct wpa_driver_atmel_data *drv = priv; 197526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt int ret = 0; 198526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt struct atmel_param *param; 199526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt u8 *buf; 200526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt u8 alg_type; 201526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 202526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt size_t blen; 203526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt char *alg_name; 204526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 205526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt switch (alg) { 206526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt case WPA_ALG_NONE: 207526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt alg_name = "none"; 208526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt alg_type = 0; 209526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt break; 210526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt case WPA_ALG_WEP: 211526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt alg_name = "WEP"; 212526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt alg_type = 1; 213526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt break; 214526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt case WPA_ALG_TKIP: 215526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt alg_name = "TKIP"; 216526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt alg_type = 2; 217526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt break; 218526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt case WPA_ALG_CCMP: 219526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt alg_name = "CCMP"; 220526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt alg_type = 3; 221526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt break; 222526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt default: 223526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt return -1; 224526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt } 225526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 226526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt wpa_printf(MSG_DEBUG, "%s: alg=%s key_idx=%d set_tx=%d seq_len=%lu " 227526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt "key_len=%lu", __FUNCTION__, alg_name, key_idx, set_tx, 228526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt (unsigned long) seq_len, (unsigned long) key_len); 229526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 230526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (seq_len > 8) 231526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt return -2; 232526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 233526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt blen = sizeof(*param) + key_len; 234526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt buf = os_zalloc(blen); 235526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (buf == NULL) 236526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt return -1; 237526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 238526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt param = (struct atmel_param *) buf; 239526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 240526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt param->cmd = SET_WPA_ENCRYPTION; 241526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 242526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (addr == NULL) 243526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt os_memset(param->sta_addr, 0xff, ETH_ALEN); 244526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt else 245526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt os_memcpy(param->sta_addr, addr, ETH_ALEN); 246526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 247526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt param->alg = alg_type; 248526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt param->key_idx = key_idx; 249526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt param->set_tx = set_tx; 250526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt os_memcpy(param->seq, seq, seq_len); 251526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt param->seq_len = seq_len; 252526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt param->key_len = key_len; 253526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt os_memcpy((u8 *)param->key, key, key_len); 254526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 255526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (atmel_ioctl(drv, param, blen, 1)) { 256526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt wpa_printf(MSG_WARNING, "Failed to set encryption."); 257526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt /* TODO: show key error*/ 258526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt ret = -1; 259526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt } 260526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt os_free(buf); 261526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 262526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt return ret; 263526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt} 264526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 265526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 266526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidtstatic int wpa_driver_atmel_set_countermeasures(void *priv, 267526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt int enabled) 268526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt{ 269526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt /* FIX */ 270526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt printf("wpa_driver_atmel_set_countermeasures - not yet " 271526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt "implemented\n"); 272526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt return 0; 273526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt} 274526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 275526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 276526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidtstatic int wpa_driver_atmel_set_drop_unencrypted(void *priv, 277526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt int enabled) 278526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt{ 279526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt /* FIX */ 280526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt printf("wpa_driver_atmel_set_drop_unencrypted - not yet " 281526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt "implemented\n"); 282526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt return 0; 283526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt} 284526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 285526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 286526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidtstatic int wpa_driver_atmel_mlme(void *priv, const u8 *addr, int cmd, 287526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt int reason_code) 288526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt{ 289526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt struct wpa_driver_atmel_data *drv = priv; 290526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt struct atmel_param param; 291526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt int ret; 292526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt int mgmt_error = 0xaa; 293526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 294526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt os_memset(¶m, 0, sizeof(param)); 295526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt os_memcpy(param.sta_addr, addr, ETH_ALEN); 296526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt param.cmd = cmd; 297526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt param.mlme.reason_code = reason_code; 298526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt param.mlme.state = mgmt_error; 299526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt ret = atmel_ioctl(drv, ¶m, sizeof(param), 1); 300526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt return ret; 301526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt} 302526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 303526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 304526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt#if 0 305526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidtstatic int wpa_driver_atmel_set_suites(struct wpa_driver_atmel_data *drv, 306526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt u8 pairwise_suite, u8 group_suite, 307526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt u8 key_mgmt_suite) 308526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt{ 309526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt struct atmel_param param; 310526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt int ret; 311526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 312526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt os_memset(¶m, 0, sizeof(param)); 313526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt param.cmd = SET_CIPHER_SUITES; 314526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt param.pairwise_suite = pairwise_suite; 315526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt param.group_suite = group_suite; 316526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt param.key_mgmt_suite = key_mgmt_suite; 317526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 318526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt ret = atmel_ioctl(drv, ¶m, sizeof(param), 1); 319526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt return ret; 320526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt} 321526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt#endif 322526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 323526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 324526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidtstatic int wpa_driver_atmel_deauthenticate(void *priv, const u8 *addr, 325526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt int reason_code) 326526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt{ 327526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt struct wpa_driver_atmel_data *drv = priv; 328526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt printf("wpa_driver_atmel_deauthenticate\n"); 329526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt wpa_printf(MSG_DEBUG, "%s", __FUNCTION__); 330526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt return wpa_driver_atmel_mlme(drv, addr, MLME_STA_DEAUTH, 331526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt reason_code); 332526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 333526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt} 334526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 335526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 336526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidtstatic int wpa_driver_atmel_disassociate(void *priv, const u8 *addr, 337526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt int reason_code) 338526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt{ 339526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt struct wpa_driver_atmel_data *drv = priv; 340526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt printf("wpa_driver_atmel_disassociate\n"); 341526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt wpa_printf(MSG_DEBUG, "%s", __FUNCTION__); 342526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt return wpa_driver_atmel_mlme(drv, addr, MLME_STA_DISASSOC, 343526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt reason_code); 344526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 345526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt} 346526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 347526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 348526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt#if 0 349526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt/* Atmel driver uses specific values for each cipher suite */ 350526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidtstatic int convertSuiteToDriver(wpa_cipher suite) 351526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt{ 352526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt u8 suite_type; 353526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 354526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt switch(suite) { 355526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt case CIPHER_NONE: 356526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt suite_type = 0; 357526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt break; 358526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt case CIPHER_WEP40: 359526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt suite_type = 1; 360526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt break; 361526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt case CIPHER_TKIP: 362526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt suite_type = 2; 363526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt break; 364526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt case CIPHER_WEP104: 365526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt suite_type = 5; 366526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt break; 367526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt case CIPHER_CCMP: 368526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt suite_type = 3; 369526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt break; 370526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt default: 371526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt suite_type = 2; 372526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt } 373526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 374526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt return suite_type; 375526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 376526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt} 377526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt#endif 378526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 379526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidtstatic int 380526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidtwpa_driver_atmel_associate(void *priv, 381526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt struct wpa_driver_associate_params *params) 382526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt{ 383526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt struct wpa_driver_atmel_data *drv = priv; 384526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt int ret = 0; 385526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt#if 0 386526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt u8 pairwise_suite_driver; 387526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt u8 group_suite_driver; 388526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt u8 key_mgmt_suite_driver; 389526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 390526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt pairwise_suite_driver = convertSuiteToDriver(params->pairwise_suite); 391526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt group_suite_driver = convertSuiteToDriver(params->group_suite); 392526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt key_mgmt_suite_driver = convertSuiteToDriver(params->key_mgmt_suite); 393526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 394526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (wpa_driver_atmel_set_suites(drv, pairwise_suite_driver, 395526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt group_suite_driver, 396526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt key_mgmt_suite_driver) < 0){ 397526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt printf("wpa_driver_atmel_set_suites.\n"); 398526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt ret = -1; 399526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt } 400526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (wpa_driver_wext_set_freq(drv->wext, params->freq) < 0) { 401526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt printf("wpa_driver_atmel_set_freq.\n"); 402526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt ret = -1; 403526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt } 404526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt#endif 405526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (wpa_driver_wext_set_ssid(drv->wext, params->ssid, params->ssid_len) 406526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt < 0) { 407526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt printf("FAILED : wpa_driver_atmel_set_ssid.\n"); 408526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt ret = -1; 409526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt } 410526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (wpa_driver_wext_set_bssid(drv->wext, params->bssid) < 0) { 411526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt printf("FAILED : wpa_driver_atmel_set_bssid.\n"); 412526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt ret = -1; 413526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt } 414526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 415526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt return ret; 416526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt} 417526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 418526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 419526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidtstatic int wpa_driver_atmel_get_bssid(void *priv, u8 *bssid) 420526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt{ 421526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt struct wpa_driver_atmel_data *drv = priv; 422526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt return wpa_driver_wext_get_bssid(drv->wext, bssid); 423526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt} 424526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 425526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 426526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidtstatic int wpa_driver_atmel_get_ssid(void *priv, u8 *ssid) 427526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt{ 428526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt struct wpa_driver_atmel_data *drv = priv; 429526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt return wpa_driver_wext_get_ssid(drv->wext, ssid); 430526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt} 431526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 432526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 433526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidtstatic int wpa_driver_atmel_scan(void *priv, const u8 *ssid, size_t ssid_len) 434526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt{ 435526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt struct wpa_driver_atmel_data *drv = priv; 436526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt return wpa_driver_wext_scan(drv->wext, ssid, ssid_len); 437526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt} 438526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 439526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 440526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidtstatic struct wpa_scan_results * wpa_driver_atmel_get_scan_results(void *priv) 441526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt{ 442526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt struct wpa_driver_atmel_data *drv = priv; 443526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt return wpa_driver_wext_get_scan_results(drv->wext); 444526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt} 445526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 446526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 447526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidtstatic int wpa_driver_atmel_set_operstate(void *priv, int state) 448526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt{ 449526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt struct wpa_driver_atmel_data *drv = priv; 450526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt return wpa_driver_wext_set_operstate(drv->wext, state); 451526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt} 452526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 453526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 454526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidtstatic void * wpa_driver_atmel_init(void *ctx, const char *ifname) 455526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt{ 456526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt struct wpa_driver_atmel_data *drv; 457526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 458526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt drv = os_zalloc(sizeof(*drv)); 459526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (drv == NULL) 460526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt return NULL; 461526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt drv->wext = wpa_driver_wext_init(ctx, ifname); 462526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (drv->wext == NULL) { 463526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt os_free(drv); 464526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt return NULL; 465526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt } 466526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 467526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt drv->ctx = ctx; 468526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt os_strlcpy(drv->ifname, ifname, sizeof(drv->ifname)); 469526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt drv->sock = socket(PF_INET, SOCK_DGRAM, 0); 470526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (drv->sock < 0) { 471526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt wpa_driver_wext_deinit(drv->wext); 472526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt os_free(drv); 473526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt return NULL; 474526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt } 475526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 476526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt return drv; 477526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt} 478526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 479526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 480526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidtstatic void wpa_driver_atmel_deinit(void *priv) 481526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt{ 482526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt struct wpa_driver_atmel_data *drv = priv; 483526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt wpa_driver_wext_deinit(drv->wext); 484526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt close(drv->sock); 485526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt os_free(drv); 486526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt} 487526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 488526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 489526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidtconst struct wpa_driver_ops wpa_driver_atmel_ops = { 490526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt .name = "atmel", 491526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt .desc = "ATMEL AT76C5XXx (USB, PCMCIA)", 492526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt .get_bssid = wpa_driver_atmel_get_bssid, 493526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt .get_ssid = wpa_driver_atmel_get_ssid, 494526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt .set_wpa = wpa_driver_atmel_set_wpa, 495526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt .set_key = wpa_driver_atmel_set_key, 496526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt .init = wpa_driver_atmel_init, 497526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt .deinit = wpa_driver_atmel_deinit, 498526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt .set_countermeasures = wpa_driver_atmel_set_countermeasures, 499526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt .set_drop_unencrypted = wpa_driver_atmel_set_drop_unencrypted, 500526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt .scan = wpa_driver_atmel_scan, 501526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt .get_scan_results2 = wpa_driver_atmel_get_scan_results, 502526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt .deauthenticate = wpa_driver_atmel_deauthenticate, 503526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt .disassociate = wpa_driver_atmel_disassociate, 504526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt .associate = wpa_driver_atmel_associate, 505526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt .set_operstate = wpa_driver_atmel_set_operstate, 506526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt}; 507