summaryrefslogtreecommitdiff
path: root/wl1271/wpa_supplicant_lib
diff options
context:
space:
mode:
authorDmitry Shmidt <dimitrysh@google.com>2010-01-29 14:38:28 -0800
committerDmitry Shmidt <dimitrysh@google.com>2010-01-29 14:38:28 -0800
commitddac9c138c5b4b16b99fb8bc5f0f10418efa1029 (patch)
tree9ad7e34f8dcd9d63ef2faa9e865d6056a061e6c3 /wl1271/wpa_supplicant_lib
parenta615fb1650af6e111053506f1b764b28a5b4631d (diff)
downloadwlan-ddac9c138c5b4b16b99fb8bc5f0f10418efa1029.tar.gz
wl1271: Android/Sholes update
Signed-off-by: Dmitry Shmidt <dimitrysh@google.com>
Diffstat (limited to 'wl1271/wpa_supplicant_lib')
-rw-r--r--wl1271/wpa_supplicant_lib/Android.mk42
-rw-r--r--wl1271/wpa_supplicant_lib/driver_ti.c329
-rw-r--r--wl1271/wpa_supplicant_lib/driver_ti.h14
3 files changed, 297 insertions, 88 deletions
diff --git a/wl1271/wpa_supplicant_lib/Android.mk b/wl1271/wpa_supplicant_lib/Android.mk
index 5e2dd516..cd1d4c26 100644
--- a/wl1271/wpa_supplicant_lib/Android.mk
+++ b/wl1271/wpa_supplicant_lib/Android.mk
@@ -24,6 +24,25 @@ ifeq ($(TARGET_SIMULATOR),true)
$(error This makefile must not be included when building the simulator)
endif
+ifndef WPA_SUPPLICANT_VERSION
+WPA_SUPPLICANT_VERSION := VER_0_5_X
+endif
+
+ifeq ($(WPA_SUPPLICANT_VERSION),VER_0_5_X)
+WPA_SUPPL_DIR = external/wpa_supplicant
+else
+WPA_SUPPL_DIR = external/wpa_supplicant_6/wpa_supplicant
+endif
+WPA_SUPPL_DIR_INCLUDE = $(WPA_SUPPL_DIR)
+ifeq ($(WPA_SUPPLICANT_VERSION),VER_0_6_X)
+WPA_SUPPL_DIR_INCLUDE += $(WPA_SUPPL_DIR)/src \
+ $(WPA_SUPPL_DIR)/src/common \
+ $(WPA_SUPPL_DIR)/src/drivers \
+ $(WPA_SUPPL_DIR)/src/l2_packet \
+ $(WPA_SUPPL_DIR)/src/utils \
+ $(WPA_SUPPL_DIR)/src/wps
+endif
+
DK_ROOT = $(BOARD_WLAN_TI_STA_DK_ROOT)
OS_ROOT = $(DK_ROOT)/platforms
STAD = $(DK_ROOT)/stad
@@ -34,12 +53,7 @@ TXN = $(DK_ROOT)/Txn
CUDK = $(DK_ROOT)/CUDK
LIB = ../../lib
-include external/wpa_supplicant/.config
-
-# To force sizeof(enum) = 4
-ifneq ($(TARGET_SIMULATOR),true)
-L_CFLAGS += -mabi=aapcs-linux
-endif
+include $(WPA_SUPPL_DIR)/.config
INCLUDES = $(STAD)/Export_Inc \
$(STAD)/src/Application \
@@ -54,12 +68,18 @@ INCLUDES = $(STAD)/Export_Inc \
$(CUDK)/configurationutility/inc \
$(CUDK)/os/common/inc \
external/openssl/include \
- external/wpa_supplicant \
+ $(WPA_SUPPL_DIR_INCLUDE) \
$(DK_ROOT)/../lib
-L_CFLAGS += -DCONFIG_DRIVER_CUSTOM -DHOST_COMPILE -D__BYTE_ORDER_LITTLE_ENDIAN
+L_CFLAGS = -DCONFIG_DRIVER_CUSTOM -DHOST_COMPILE -D__BYTE_ORDER_LITTLE_ENDIAN
+L_CFLAGS += -DWPA_SUPPLICANT_$(WPA_SUPPLICANT_VERSION)
OBJS = driver_ti.c $(LIB)/scanmerge.c $(LIB)/shlist.c
+# To force sizeof(enum) = 4
+ifneq ($(TARGET_SIMULATOR),true)
+L_CFLAGS += -mabi=aapcs-linux
+endif
+
ifdef CONFIG_NO_STDOUT_DEBUG
L_CFLAGS += -DCONFIG_NO_STDOUT_DEBUG
endif
@@ -68,11 +88,17 @@ ifdef CONFIG_DEBUG_FILE
L_CFLAGS += -DCONFIG_DEBUG_FILE
endif
+ifdef CONFIG_ANDROID_LOG
+L_CFLAGS += -DCONFIG_ANDROID_LOG
+endif
+
ifdef CONFIG_IEEE8021X_EAPOL
L_CFLAGS += -DIEEE8021X_EAPOL
endif
+ifdef CONFIG_WPS
L_CFLAGS += -DCONFIG_WPS
+endif
########################
diff --git a/wl1271/wpa_supplicant_lib/driver_ti.c b/wl1271/wpa_supplicant_lib/driver_ti.c
index 00c0f64a..e7e2bc22 100644
--- a/wl1271/wpa_supplicant_lib/driver_ti.c
+++ b/wl1271/wpa_supplicant_lib/driver_ti.c
@@ -30,6 +30,9 @@
#endif
#include "driver_ti.h"
#include "scanmerge.h"
+#ifdef CONFIG_WPS
+#include "wps_defs.h"
+#endif
/*-------------------------------------------------------------------*/
#define TI2WPA_STATUS(s) (((s) != 0) ? -1 : 0)
@@ -50,7 +53,7 @@ static int check_and_get_build_channels( void )
#ifdef ANDROID
char prop_status[PROPERTY_VALUE_MAX];
char *prop_name = "ro.wifi.channels";
- int i, default_channels = NUMBER_SCAN_CHANNELS_ETSI;
+ int i, default_channels = NUMBER_SCAN_CHANNELS_FCC;
if( property_get(prop_name, prop_status, NULL) ) {
i = atoi(prop_status);
@@ -86,6 +89,9 @@ static int wpa_driver_tista_keymgmt2wext(int keymgmt)
switch (keymgmt) {
case KEY_MGMT_802_1X:
case KEY_MGMT_802_1X_NO_WPA:
+#ifdef CONFIG_WPS
+ case KEY_MGMT_WPS:
+#endif
return IW_AUTH_KEY_MGMT_802_1X;
case KEY_MGMT_PSK:
return IW_AUTH_KEY_MGMT_PSK;
@@ -134,12 +140,17 @@ static int wpa_driver_tista_private_send( void *priv, u32 ioctl_cmd, void *bufIn
iwr.u.data.flags = 0;
res = ioctl(drv->ioctl_sock, SIOCIWFIRSTPRIV, &iwr);
- if(res != 0)
+ if (0 != res)
{
wpa_printf(MSG_ERROR, "ERROR - wpa_driver_tista_private_send - error sending Wext private IOCTL to STA driver (ioctl_cmd = %x, res = %d, errno = %d)", ioctl_cmd, res, errno);
+ drv->errors++;
+ if (drv->errors > MAX_NUMBER_SEQUENTIAL_ERRORS) {
+ drv->errors = 0;
+ wpa_msg(drv->ctx, MSG_INFO, WPA_EVENT_DRIVER_STATE "HANGED");
+ }
return -1;
}
-
+ drv->errors = 0;
wpa_printf(MSG_DEBUG, "wpa_driver_tista_private_send ioctl_cmd = %x res = %d", ioctl_cmd, res);
return 0;
@@ -153,8 +164,10 @@ static int wpa_driver_tista_driver_start( void *priv )
res = wpa_driver_tista_private_send(priv, DRIVER_START_PARAM, &uDummyBuf, sizeof(uDummyBuf), NULL, 0);
- if(0 != res)
+ if (0 != res) {
wpa_printf(MSG_ERROR, "ERROR - Failed to start driver!");
+ wpa_msg(drv->ctx, MSG_INFO, WPA_EVENT_DRIVER_STATE "HANGED");
+ }
else {
os_sleep(0, WPA_DRIVER_WEXT_WAIT_US); /* delay 400 ms */
wpa_printf(MSG_DEBUG, "wpa_driver_tista_driver_start success");
@@ -170,8 +183,10 @@ static int wpa_driver_tista_driver_stop( void *priv )
res = wpa_driver_tista_private_send(priv, DRIVER_STOP_PARAM, &uDummyBuf, sizeof(uDummyBuf), NULL, 0);
- if(0 != res)
+ if (0 != res) {
wpa_printf(MSG_ERROR, "ERROR - Failed to stop driver!");
+ wpa_msg(drv->ctx, MSG_INFO, WPA_EVENT_DRIVER_STATE "HANGED");
+ }
else
wpa_printf(MSG_DEBUG, "wpa_driver_tista_driver_stop success");
@@ -195,12 +210,6 @@ int wpa_driver_tista_parse_custom(void *ctx, const void *custom)
/* Dm: wpa_printf(MSG_INFO,"wpa_supplicant - Link Speed = %u", pStaDrv->link_speed ); */
break;
-#ifdef CONFIG_WPS
- case IPC_EVENT_WPS_SESSION_OVERLAP:
- wpa_printf(MSG_INFO, "IPC_EVENT_WPS_SESSION_OVERLAP");
- wpa_supplicant_event(ctx, EVENT_WSC_PBC_OVERLAP, NULL);
- break;
-#endif /* CONFIG_WPS */
default:
wpa_printf(MSG_DEBUG, "Unknown event");
break;
@@ -257,7 +266,7 @@ static int wpa_driver_tista_scan( void *priv, const u8 *ssid, size_t ssid_len )
struct wpa_supplicant *wpa_s = (struct wpa_supplicant *)(drv->ctx);
struct wpa_ssid *issid;
scan_Params_t scanParams;
- int scan_type, res, scan_probe_flag = 0;
+ int scan_type, res, timeout, scan_probe_flag = 0;
wpa_printf(MSG_DEBUG, "%s", __func__);
TI_CHECK_DRIVER( drv->driver_is_loaded, -1 );
@@ -295,6 +304,12 @@ static int wpa_driver_tista_scan( void *priv, const u8 *ssid, size_t ssid_len )
else
wpa_printf(MSG_DEBUG, "wpa_driver_tista_scan success");
+ timeout = 30;
+ wpa_printf(MSG_DEBUG, "Scan requested (ret=%d) - scan timeout %d sec",
+ res, timeout);
+ eloop_cancel_timeout(wpa_driver_wext_scan_timeout, drv->wext, drv->ctx);
+ eloop_register_timeout(timeout, 0, wpa_driver_wext_scan_timeout,
+ drv->wext, drv->ctx);
return res;
#else
return wpa_driver_wext_scan(drv->wext, ssid, ssid_len);
@@ -575,7 +590,7 @@ Return Value: actual buffer length - success, -1 - failure
static int wpa_driver_tista_driver_cmd( void *priv, char *cmd, char *buf, size_t buf_len )
{
struct wpa_driver_ti_data *drv = (struct wpa_driver_ti_data *)priv;
- int ret = -1, prev_events;
+ int ret = -1, prev_events, flags;
wpa_printf(MSG_DEBUG, "%s %s", __func__, cmd);
@@ -593,12 +608,22 @@ static int wpa_driver_tista_driver_cmd( void *priv, char *cmd, char *buf, size_t
if( os_strcasecmp(cmd, "stop") == 0 ) {
wpa_printf(MSG_DEBUG,"Stop command");
+ if ((wpa_driver_wext_get_ifflags(drv->wext, &flags) == 0) &&
+ (flags & IFF_UP)) {
+ wpa_printf(MSG_ERROR, "TI: %s when iface is UP", cmd);
+ wpa_driver_wext_set_ifflags(drv->wext, flags & ~IFF_UP);
+ }
ret = wpa_driver_tista_driver_stop(priv);
if( ret == 0 ) {
drv->driver_is_loaded = FALSE;
wpa_msg(drv->ctx, MSG_INFO, WPA_EVENT_DRIVER_STATE "STOPPED");
}
}
+ if( os_strcasecmp(cmd, "reload") == 0 ) {
+ wpa_printf(MSG_DEBUG,"Reload command");
+ ret = 0;
+ wpa_msg(drv->ctx, MSG_INFO, WPA_EVENT_DRIVER_STATE "HANGED");
+ }
else if( os_strcasecmp(cmd, "macaddr") == 0 ) {
wpa_driver_tista_get_mac_addr(priv);
wpa_printf(MSG_DEBUG, "Macaddr command");
@@ -641,43 +666,50 @@ static int wpa_driver_tista_driver_cmd( void *priv, char *cmd, char *buf, size_t
wpa_printf(MSG_DEBUG, "buf %s", buf);
}
else if( os_strcasecmp(cmd, "rssi-approx") == 0 ) {
- struct wpa_scan_result *cur_res;
+ scan_result_t *cur_res;
struct wpa_supplicant *wpa_s = (struct wpa_supplicant *)(drv->ctx);
+ scan_ssid_t *p_ssid;
int rssi, len;
wpa_printf(MSG_DEBUG,"rssi-approx command");
if( !wpa_s )
return( ret );
- cur_res = scan_get_by_bssid( drv, wpa_s->bssid );
+ cur_res = scan_get_by_bssid(drv, wpa_s->bssid);
if( cur_res ) {
- len = (int)(cur_res->ssid_len);
+ p_ssid = scan_get_ssid(cur_res);
+ len = (int)(p_ssid->ssid_len);
rssi = cur_res->level;
if( (len > 0) && (len <= MAX_SSID_LEN) && (len < (int)buf_len)) {
- os_memcpy( (void *)buf, (void *)(cur_res->ssid), len );
+ os_memcpy((void *)buf, (void *)(p_ssid->ssid), len);
ret = len;
ret += snprintf(&buf[ret], buf_len-len, " rssi %d\n", rssi);
- if (ret < (int)buf_len) {
- return( ret );
- }
}
}
}
else if( os_strcasecmp(cmd, "rssi") == 0 ) {
u8 ssid[MAX_SSID_LEN];
+ scan_result_t *cur_res;
+ struct wpa_supplicant *wpa_s = (struct wpa_supplicant *)(drv->ctx);
int rssi_data, rssi_beacon, len;
wpa_printf(MSG_DEBUG,"rssi command");
ret = wpa_driver_tista_get_rssi(priv, &rssi_data, &rssi_beacon);
if( ret == 0 ) {
- len = wpa_driver_tista_get_ssid( priv, (u8 *)ssid );
+ len = wpa_driver_tista_get_ssid(priv, (u8 *)ssid);
wpa_printf(MSG_DEBUG,"rssi_data %d rssi_beacon %d", rssi_data, rssi_beacon);
if( (len > 0) && (len <= MAX_SSID_LEN) ) {
- os_memcpy( (void *)buf, (void *)ssid, len );
+ os_memcpy((void *)buf, (void *)ssid, len);
ret = len;
ret += sprintf(&buf[ret], " rssi %d\n", rssi_beacon);
wpa_printf(MSG_DEBUG, "buf %s", buf);
+ /* Update cached value */
+ if( !wpa_s )
+ return( ret );
+ cur_res = scan_get_by_bssid(drv, wpa_s->bssid);
+ if( cur_res )
+ cur_res->level = rssi_beacon;
}
else
{
@@ -794,6 +826,86 @@ static int wpa_driver_tista_driver_cmd( void *priv, char *cmd, char *buf, size_t
return ret;
}
+#ifdef WPA_SUPPLICANT_VER_0_6_X
+/*-----------------------------------------------------------------------------
+Routine Name: wpa_driver_tista_set_probe_req_ie
+Routine Description: set probe request ie for WSC mode change
+Arguments:
+ priv - pointer to private data structure
+ ies - probe_req_ie data
+ ies_len - ie data length
+Return Value: actual buffer length - success, -1 - failure
+-----------------------------------------------------------------------------*/
+static int wpa_driver_tista_set_probe_req_ie(void *priv, const u8* ies, size_t ies_len)
+{
+ struct wpa_driver_ti_data *drv = (struct wpa_driver_ti_data *)priv;
+#ifdef CONFIG_WPS
+ TWscMode WscModeStruct;
+
+ TI_CHECK_DRIVER( drv->driver_is_loaded, -1 );
+
+ if ((!ies || (0 == ies_len)) && (NULL == drv->probe_req_ie)) {
+ return 0;
+ }
+
+ if (ies && drv->probe_req_ie) {
+ size_t len = wpabuf_len(drv->probe_req_ie);
+ u8* data = (u8*)wpabuf_head(drv->probe_req_ie);
+ if ((ies_len == len) && (0 == os_memcmp(ies, data, ies_len))) {
+ return 0;
+ }
+ }
+
+ os_memset(&WscModeStruct, 0, sizeof(TWscMode));
+
+ if (!ies || (0 == ies_len)) {
+ WscModeStruct.WSCMode = TIWLN_SIMPLE_CONFIG_OFF;
+ } else {
+ const size_t head_len = 6; /* probeReqIe head: dd xx 00 50 f2 04 */
+ u8 *pos, *end;
+ u16 password_id = 0;
+ size_t min_len = 0;
+
+ pos = (u8*)ies + head_len; /* Find the WSC mode in probe_req_ie by password_id */
+ end = (u8*)ies + ies_len;
+ while (pos < end) {
+ if (ATTR_DEV_PASSWORD_ID == WPA_GET_BE16(pos)) {
+ password_id = WPA_GET_BE16(pos+4);
+ break;
+ }
+ pos += (4 + WPA_GET_BE16(pos+2));
+ }
+ WscModeStruct.WSCMode = (DEV_PW_PUSHBUTTON == password_id)?TIWLN_SIMPLE_CONFIG_PBC_METHOD:TIWLN_SIMPLE_CONFIG_PIN_METHOD;
+
+ pos = (u8*)ies + head_len;
+ min_len = ies_len - head_len;
+ if (min_len > sizeof(WscModeStruct.probeReqWSCIE)) {
+ min_len = sizeof(WscModeStruct.probeReqWSCIE);
+ }
+ os_memcpy(WscModeStruct.probeReqWSCIE, pos, min_len);
+ }
+
+ wpa_hexdump(MSG_DEBUG, "SetProbeReqIe:WscModeStruct", (u8*)&WscModeStruct, sizeof(TWscMode));
+ if(0 == wpa_driver_tista_private_send(priv, SITE_MGR_SIMPLE_CONFIG_MODE, (void*)&WscModeStruct, sizeof(TWscMode), NULL, 0)) {
+ /* Update the cached probe req ie */
+ wpabuf_free(drv->probe_req_ie);
+ drv->probe_req_ie = NULL;
+
+ if (ies && ies_len) {
+ drv->probe_req_ie = wpabuf_alloc(sizeof(WscModeStruct.probeReqWSCIE));
+ if (drv->probe_req_ie) {
+ wpabuf_put_data(drv->probe_req_ie, ies, ies_len);
+ }
+ }
+ } else {
+ wpa_printf(MSG_ERROR, "ERROR - Failed to set wsc mode!");
+ return -1;
+ }
+#endif
+ return 0;
+}
+#endif
+
/**
* wpa_driver_tista_init - Initialize WE driver interface
* @ctx: context to be used when calling wpa_supplicant functions,
@@ -840,6 +952,14 @@ void * wpa_driver_tista_init(void *ctx, const char *ifname)
/* BtCoex mode is read from tiwlan.ini file */
drv->btcoex_mode = 0; /* SG_DISABLE */
+
+#ifdef CONFIG_WPS
+ /* The latest probe_req_ie for WSC */
+ drv->probe_req_ie = NULL;
+#endif
+
+ /* Number of sequential errors */
+ drv->errors = 0;
return drv;
}
@@ -857,6 +977,10 @@ void wpa_driver_tista_deinit(void *priv)
wpa_driver_wext_deinit(drv->wext);
close(drv->ioctl_sock);
scan_exit(drv);
+#ifdef CONFIG_WPS
+ wpabuf_free(drv->probe_req_ie);
+ drv->probe_req_ie = NULL;
+#endif
os_free(drv);
}
@@ -873,7 +997,7 @@ static int wpa_driver_tista_set_auth_param(struct wpa_driver_ti_data *drv,
if (ioctl(drv->ioctl_sock, SIOCSIWAUTH, &iwr) < 0) {
perror("ioctl[SIOCSIWAUTH]");
- fprintf(stderr, "WEXT auth param %d value 0x%x - ",
+ wpa_printf(MSG_ERROR, "WEXT auth param %d value 0x%x - ",
idx, value);
ret = errno == EOPNOTSUPP ? -2 : -1;
}
@@ -1065,21 +1189,77 @@ static int wpa_driver_tista_set_key(void *priv, wpa_alg alg,
int ret;
wpa_printf(MSG_DEBUG, "%s", __func__);
- TI_CHECK_DRIVER( drv->driver_is_loaded, -1 );
+ TI_CHECK_DRIVER( drv->driver_is_loaded, -1 );
ret = wpa_driver_wext_set_key(drv->wext, alg, addr, key_idx, set_tx,
seq, seq_len, key, key_len);
return ret;
}
+static int wpa_driver_tista_set_gen_ie(void *priv, const u8 *ie, size_t ie_len)
+{
+ struct wpa_driver_ti_data *drv = priv;
+ struct iwreq iwr;
+ int ret = 0;
+
+ os_memset(&iwr, 0, sizeof(iwr));
+ os_strncpy(iwr.ifr_name, drv->ifname, IFNAMSIZ);
+ iwr.u.data.pointer = (caddr_t)ie;
+ iwr.u.data.length = ie_len;
+
+ if (ioctl(drv->ioctl_sock, SIOCSIWGENIE, &iwr) < 0) {
+ perror("ioctl[SIOCSIWGENIE]");
+ ret = -1;
+ }
+
+ return ret;
+}
+
+#ifdef WPA_SUPPLICANT_VER_0_6_X
+static struct wpa_scan_results *wpa_driver_tista_get_scan_results(void *priv)
+{
+ struct wpa_driver_ti_data *drv = priv;
+ struct wpa_scan_results *res;
+ struct wpa_scan_res **tmp;
+ unsigned ap_num;
+
+ TI_CHECK_DRIVER( drv->driver_is_loaded, NULL );
+ res = wpa_driver_wext_get_scan_results(drv->wext);
+ if (res == NULL) {
+ return NULL;
+ }
+
+ wpa_printf(MSG_DEBUG, "Actual APs number %d", res->num);
+ ap_num = (unsigned)scan_count(drv) + res->num;
+ tmp = os_realloc(res->res, ap_num * sizeof(struct wpa_scan_res *));
+ if (tmp == NULL)
+ return res;
+ res->num = scan_merge(drv, tmp, drv->force_merge_flag, res->num, ap_num);
+ wpa_printf(MSG_DEBUG, "After merge, APs number %d", res->num);
+ tmp = os_realloc(tmp, res->num * sizeof(struct wpa_scan_res *));
+ res->res = tmp;
+ return res;
+}
+
+int wpa_driver_tista_set_mode(void *priv, int mode)
+{
+ struct wpa_driver_ti_data *drv = priv;
+ int ret;
+
+ wpa_printf(MSG_DEBUG, "%s", __func__);
+ TI_CHECK_DRIVER( drv->driver_is_loaded, -1 );
+ ret = wpa_driver_wext_set_mode(drv->wext, mode);
+ return ret;
+}
+#else
/*-----------------------------------------------------------------------------
Compare function for sorting scan results. Return >0 if @b is considered better.
-----------------------------------------------------------------------------*/
static int wpa_driver_tista_scan_result_compare(const void *a, const void *b)
{
- const struct wpa_scan_result *wa = a;
- const struct wpa_scan_result *wb = b;
+ const struct wpa_scan_result *wa = a;
+ const struct wpa_scan_result *wb = b;
- return( wb->level - wa->level );
+ return( wb->level - wa->level );
}
static int wpa_driver_tista_get_scan_results(void *priv,
@@ -1089,7 +1269,7 @@ static int wpa_driver_tista_get_scan_results(void *priv,
struct wpa_driver_ti_data *drv = priv;
int ap_num = 0;
- TI_CHECK_DRIVER( drv->driver_is_loaded, -1 );
+ TI_CHECK_DRIVER( drv->driver_is_loaded, -1 );
ap_num = wpa_driver_wext_get_scan_results(drv->wext, results, max_size);
wpa_printf(MSG_DEBUG, "Actual APs number %d", ap_num);
@@ -1097,33 +1277,51 @@ static int wpa_driver_tista_get_scan_results(void *priv,
return -1;
/* Merge new results with previous */
- ap_num = scan_merge( drv, results, drv->force_merge_flag, ap_num, max_size );
+ ap_num = scan_merge(drv, results, drv->force_merge_flag, ap_num, max_size);
wpa_printf(MSG_DEBUG, "After merge, APs number %d", ap_num);
- qsort( results, ap_num, sizeof(struct wpa_scan_result),
- wpa_driver_tista_scan_result_compare );
+ qsort(results, ap_num, sizeof(struct wpa_scan_result),
+ wpa_driver_tista_scan_result_compare);
return ap_num;
}
+#endif
static int wpa_driver_tista_associate(void *priv,
struct wpa_driver_associate_params *params)
{
struct wpa_driver_ti_data *drv = priv;
int allow_unencrypted_eapol;
- int value, flags;
+ int value, flags, ret = 0;
+
+ wpa_printf(MSG_DEBUG, "%s", __FUNCTION__);
+ TI_CHECK_DRIVER( drv->driver_is_loaded, -1 );
- TI_CHECK_DRIVER( drv->driver_is_loaded, -1 );
if (wpa_driver_wext_get_ifflags(drv->wext, &flags) == 0) {
if (!(flags & IFF_UP)) {
wpa_driver_wext_set_ifflags(drv->wext, flags | IFF_UP);
}
}
+
+ if (!params->bssid)
+ wpa_driver_wext_set_bssid(drv->wext, NULL);
+
+#ifdef WPA_SUPPLICANT_VER_0_5_X
/* Set driver network mode (Adhoc/Infrastructure) according to supplied parameters */
wpa_driver_wext_set_mode(drv->wext, params->mode);
+#endif
+ wpa_driver_tista_set_gen_ie(drv, params->wpa_ie, params->wpa_ie_len);
if (params->wpa_ie == NULL || params->wpa_ie_len == 0)
value = IW_AUTH_WPA_VERSION_DISABLED;
+#ifdef WPA_SUPPLICANT_VER_0_6_X
+ else if (params->wpa_ie[0] == WLAN_EID_RSN)
+#else
else if (params->wpa_ie[0] == RSN_INFO_ELEM)
+#endif
value = IW_AUTH_WPA_VERSION_WPA2;
+#ifdef CONFIG_WPS
+ else if (params->key_mgmt_suite == KEY_MGMT_WPS)
+ value = IW_AUTH_WPA_VERSION_DISABLED;
+#endif
else
value = IW_AUTH_WPA_VERSION_WPA;
wpa_driver_tista_set_auth_param(drv, IW_AUTH_WPA_VERSION, value);
@@ -1136,7 +1334,11 @@ static int wpa_driver_tista_associate(void *priv,
value = params->key_mgmt_suite != KEY_MGMT_NONE ||
params->pairwise_suite != CIPHER_NONE ||
params->group_suite != CIPHER_NONE ||
+#ifdef WPA_SUPPLICANT_VER_0_6_X
+ (params->wpa_ie_len && (params->key_mgmt_suite != KEY_MGMT_WPS));
+#else
params->wpa_ie_len;
+#endif
wpa_driver_tista_set_auth_param(drv, IW_AUTH_PRIVACY_INVOKED, value);
/* Allow unencrypted EAPOL messages even if pairwise keys are set when
@@ -1152,16 +1354,20 @@ static int wpa_driver_tista_associate(void *priv,
IW_AUTH_RX_UNENCRYPTED_EAPOL,
allow_unencrypted_eapol);
- if( params->bssid ) {
- wpa_printf(MSG_DEBUG, "wpa_driver_tista_associate: BSSID=" MACSTR,
+ if (params->freq)
+ wpa_driver_wext_set_freq(drv->wext, params->freq);
+
+ ret = wpa_driver_wext_set_ssid(drv->wext, params->ssid, params->ssid_len);
+ if (params->bssid) {
+ wpa_printf(MSG_DEBUG, "wpa_driver_tista_associate: BSSID=" MACSTR,
MAC2STR(params->bssid));
/* if there is bssid -> set it */
- if( os_memcmp( params->bssid, "\x00\x00\x00\x00\x00\x00", ETH_ALEN ) != 0 ) {
- wpa_driver_wext_set_bssid( drv->wext, params->bssid );
+ if (os_memcmp(params->bssid, "\x00\x00\x00\x00\x00\x00", ETH_ALEN) != 0) {
+ wpa_driver_wext_set_bssid(drv->wext, params->bssid);
}
}
- return wpa_driver_wext_set_ssid(drv->wext, params->ssid, params->ssid_len);
+ return ret;
}
static int wpa_driver_tista_set_operstate(void *priv, int state)
@@ -1175,42 +1381,6 @@ static int wpa_driver_tista_set_operstate(void *priv, int state)
return wpa_driver_wext_set_operstate(drv->wext, state);
}
-#ifdef CONFIG_WPS
-static int wpa_driver_tista_set_wsc_mode(void *priv, const u32 WscMode, const void* probeReqBuf, int probeReqBufLen)
-{
- struct wpa_driver_ti_data *drv = priv;
- struct iwreq iwr;
- ti_private_cmd_t private_cmd;
- TWscMode WcsModeStruct;
- int ret = 0;
-
- WcsModeStruct.WSCMode = WscMode;
- memset(WcsModeStruct.probeReqWSCIE, 0, DOT11_WSC_PROBE_REQ_MAX_LENGTH);
- memcpy(WcsModeStruct.probeReqWSCIE, probeReqBuf, probeReqBufLen);
-
- private_cmd.cmd = SITE_MGR_SIMPLE_CONFIG_MODE;
- private_cmd.flags = PRIVATE_CMD_SET_FLAG;
- private_cmd.in_buffer = &WcsModeStruct;
- private_cmd.in_buffer_len = sizeof(TWscMode);
- private_cmd.out_buffer = NULL;
- private_cmd.out_buffer_len = 0;
-
- os_memset(&iwr, 0, sizeof(iwr));
- os_strncpy(iwr.ifr_name, drv->ifname, IFNAMSIZ);
-
- iwr.u.data.pointer = &private_cmd;
- iwr.u.data.length = sizeof(ti_private_cmd_t);
- iwr.u.data.flags = 0;
-
- if (ioctl(drv->ioctl_sock, SIOCIWFIRSTPRIV, &iwr) < 0) {
- perror("ioctl[SIOCIWFIRSTPRIV]");
- ret = -1;
- }
-
- return ret;
-}
-#endif /* CONFIG_WPS */
-
const struct wpa_driver_ops wpa_driver_custom_ops = {
.name = TIWLAN_DRV_NAME,
.desc = "TI Station Driver (1271)",
@@ -1221,7 +1391,11 @@ const struct wpa_driver_ops wpa_driver_custom_ops = {
.set_countermeasures = wpa_driver_tista_set_countermeasures,
.set_drop_unencrypted = wpa_driver_tista_set_drop_unencrypted,
.scan = wpa_driver_tista_scan,
+#ifdef WPA_SUPPLICANT_VER_0_6_X
+ .get_scan_results2 = wpa_driver_tista_get_scan_results,
+#else
.get_scan_results = wpa_driver_tista_get_scan_results,
+#endif
.deauthenticate = wpa_driver_tista_deauthenticate,
.disassociate = wpa_driver_tista_disassociate,
.associate = wpa_driver_tista_associate,
@@ -1233,8 +1407,9 @@ const struct wpa_driver_ops wpa_driver_custom_ops = {
.remove_pmkid = wpa_driver_tista_remove_pmkid,
.flush_pmkid = wpa_driver_tista_flush_pmkid,
.set_operstate = wpa_driver_tista_set_operstate,
-#ifdef CONFIG_WPS
- .set_wsc_mode = wpa_driver_tista_set_wsc_mode,
-#endif /* CONFIG_WPS */
+#ifdef WPA_SUPPLICANT_VER_0_6_X
+ .set_mode = wpa_driver_tista_set_mode,
+ .set_probe_req_ie = wpa_driver_tista_set_probe_req_ie,
+#endif
.driver_cmd = wpa_driver_tista_driver_cmd
};
diff --git a/wl1271/wpa_supplicant_lib/driver_ti.h b/wl1271/wpa_supplicant_lib/driver_ti.h
index ab36ab30..c60d43e3 100644
--- a/wl1271/wpa_supplicant_lib/driver_ti.h
+++ b/wl1271/wpa_supplicant_lib/driver_ti.h
@@ -29,14 +29,16 @@
#include "driver.h"
#include "l2_packet.h"
#include "eloop.h"
-#include "wpa_supplicant.h"
#include "priv_netlink.h"
#include "driver_wext.h"
-#include "wpa.h"
#include "wpa_ctrl.h"
#include "wpa_supplicant_i.h"
#include "config.h"
-
+#ifdef WPA_SUPPLICANT_VER_0_6_X
+#include "ieee802_11_defs.h"
+#else
+#include "wpa.h"
+#endif
#include "cu_ostypes.h"
#include "STADExternalIf.h"
#include "convert.h"
@@ -53,6 +55,8 @@
#define RX_IPV4_MULTICAST_FILTER 2
#define RX_IPV6_MULTICAST_FILTER 3
+#define MAX_NUMBER_SEQUENTIAL_ERRORS 4
+
typedef enum {
BLUETOOTH_COEXISTENCE_MODE_ENABLED = 0,
BLUETOOTH_COEXISTENCE_MODE_DISABLED,
@@ -73,5 +77,9 @@ struct wpa_driver_ti_data {
u32 btcoex_mode; /* BtCoex Mode */
int last_scan; /* Last scan type */
SHLIST scan_merge_list; /* Previous scan list */
+#ifdef CONFIG_WPS
+ struct wpabuf *probe_req_ie; /* Store the latest probe_req_ie for WSC */
+#endif
+ int errors; /* Number of sequential errors */
};
#endif