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(&param, 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, &param, 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(&param, 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, &param, 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