am 5f010682: wpa_supplicant: Remove unnecessary messages.
Merge commit '5f0106824621dbd0c47169af8a1f3f6fbe27a837'
* commit '5f0106824621dbd0c47169af8a1f3f6fbe27a837':
wpa_supplicant: Remove unnecessary messages.
diff --git a/Android.mk b/Android.mk
index 844897b..b1d9313 100644
--- a/Android.mk
+++ b/Android.mk
@@ -35,7 +35,7 @@
INCLUDES = external/openssl/include frameworks/base/cmds/keystore
-OBJS = config.c common.c md5.c md4.c rc4.c sha1.c des.c if_index.c
+OBJS = config.c common.c md5.c md4.c rc4.c sha1.c des.c
OBJS_p = wpa_passphrase.c sha1.c md5.c md4.c common.c des.c
OBJS_c = wpa_cli.c wpa_ctrl.c
@@ -661,7 +661,10 @@
include $(CLEAR_VARS)
LOCAL_MODULE := wpa_supplicant
ifdef CONFIG_DRIVER_CUSTOM
-LOCAL_STATIC_LIBRARIES := libCustomWifi libWifiApi
+LOCAL_STATIC_LIBRARIES := libCustomWifi
+endif
+ifneq ($(BOARD_WPA_SUPPLICANT_PRIVATE_LIB),)
+LOCAL_STATIC_LIBRARIES += $(BOARD_WPA_SUPPLICANT_PRIVATE_LIB)
endif
LOCAL_SHARED_LIBRARIES := libc libcutils libcrypto libssl
LOCAL_CFLAGS := $(L_CFLAGS)
diff --git a/ctrl_iface.c b/ctrl_iface.c
index c774c86..ef93533 100644
--- a/ctrl_iface.c
+++ b/ctrl_iface.c
@@ -642,6 +642,7 @@
ssid = ssid->next;
}
wpa_s->reassociate = 1;
+ wpa_s->prev_scan_ssid = BROADCAST_SSID_SCAN;
wpa_supplicant_req_scan(wpa_s, 0, 0);
return 0;
@@ -670,7 +671,11 @@
* Try to reassociate since there is no current configuration
* and a new network was made available. */
wpa_s->reassociate = 1;
+#ifdef ANDROID
+ wpa_supplicant_req_scan(wpa_s, 2, 0);
+#else
wpa_supplicant_req_scan(wpa_s, 0, 0);
+#endif
}
ssid->disabled = 0;
@@ -1249,8 +1254,12 @@
wpa_s->disconnected = 1;
wpa_supplicant_disassociate(wpa_s, REASON_DEAUTH_LEAVING);
} else if (os_strcmp(buf, "SCAN") == 0) {
- wpa_s->scan_req = 2;
- wpa_supplicant_req_scan(wpa_s, 0, 0);
+ if (!wpa_s->scan_ongoing) {
+ wpa_s->scan_req = 2;
+ wpa_supplicant_req_scan(wpa_s, 0, 0);
+ }
+ else
+ wpa_printf(MSG_DEBUG, "Ongoing Scan action...");
} else if (os_strcmp(buf, "SCAN_RESULTS") == 0) {
reply_len = wpa_supplicant_ctrl_iface_scan_results(
wpa_s, reply, reply_size);
diff --git a/driver_wext.c b/driver_wext.c
index a2e4578..ab17418 100644
--- a/driver_wext.c
+++ b/driver_wext.c
@@ -21,6 +21,7 @@
#include "includes.h"
#include <sys/ioctl.h>
#include <net/if_arp.h>
+#include <net/if.h>
#include "wireless_copy.h"
#include "common.h"
@@ -31,6 +32,9 @@
#include "priv_netlink.h"
#include "driver_wext.h"
#include "wpa.h"
+#include "wpa_ctrl.h"
+#include "wpa_supplicant_i.h"
+#include "config_ssid.h"
#ifdef CONFIG_CLIENT_MLME
#include <netpacket/packet.h>
@@ -401,6 +405,12 @@
}
wpa_supplicant_event(ctx, EVENT_STKSTART, &data);
#endif /* CONFIG_PEERKEY */
+#ifdef ANDROID
+ } else if (os_strncmp(custom, "STOP", 4) == 0) {
+ wpa_msg(ctx, MSG_INFO, WPA_EVENT_DRIVER_STATE "STOPPED");
+ } else if (os_strncmp(custom, "START", 5) == 0) {
+ wpa_msg(ctx, MSG_INFO, WPA_EVENT_DRIVER_STATE "STARTED");
+#endif /* ANDROID */
}
}
@@ -1001,6 +1011,13 @@
{
int flags;
+ if (wpa_driver_wext_get_ifflags(drv, &flags) != 0 ||
+ wpa_driver_wext_set_ifflags(drv, flags | IFF_UP) != 0) {
+ printf("Could not set interface '%s' UP\n", drv->ifname);
+ }
+#ifdef ANDROID
+ os_sleep(0, 200000);
+#endif
/*
* Make sure that the driver does not have any obsolete PMKID entries.
*/
@@ -1010,11 +1027,6 @@
printf("Could not configure driver to use managed mode\n");
}
- if (wpa_driver_wext_get_ifflags(drv, &flags) != 0 ||
- wpa_driver_wext_set_ifflags(drv, flags | IFF_UP) != 0) {
- printf("Could not set interface '%s' UP\n", drv->ifname);
- }
-
wpa_driver_wext_get_range(drv);
drv->ifindex = if_nametoindex(drv->ifname);
@@ -2473,6 +2485,59 @@
return drv->we_version_compiled;
}
+#ifdef ANDROID
+int wpa_driver_priv_driver_cmd( void *priv, char *cmd, char *buf, size_t buf_len )
+{
+ struct wpa_driver_wext_data *drv = priv;
+ struct wpa_supplicant *wpa_s = (struct wpa_supplicant *)(drv->ctx);
+ struct iwreq iwr;
+ int ret = 0;
+
+ wpa_printf(MSG_DEBUG, "%s %s len = %d", __func__, cmd, buf_len);
+
+ if (os_strcasecmp(cmd, "RSSI-APPROX") == 0) {
+ if (wpa_s->current_ssid) {
+ wpa_printf(MSG_DEBUG, "approx: %s\n", wpa_s->current_ssid->ssid);
+ ret = wpa_s->current_ssid->ssid_len;
+ os_memcpy(buf, wpa_s->current_ssid->ssid, ret);
+ ret += snprintf(&buf[ret], buf_len-ret, " rssi %d\n", wpa_s->rssi);
+ }
+ else
+ ret = -1;
+ return ret;
+ }
+
+ os_memset(&iwr, 0, sizeof(iwr));
+ os_strncpy(iwr.ifr_name, drv->ifname, IFNAMSIZ);
+ os_memcpy(buf, cmd, strlen(cmd) + 1);
+ iwr.u.data.pointer = buf;
+ iwr.u.data.length = buf_len;
+
+ if ((ret = ioctl(drv->ioctl_sock, SIOCSIWPRIV, &iwr)) < 0) {
+ perror("ioctl[SIOCSIWPRIV]");
+ }
+
+ if (ret < 0)
+ wpa_printf(MSG_ERROR, "%s failed", __func__);
+ else {
+ ret = 0;
+ if ((os_strcasecmp(cmd, "RSSI") == 0) ||
+ (os_strcasecmp(cmd, "LINKSPEED") == 0) ||
+ (os_strcasecmp(cmd, "MACADDR") == 0)) {
+ ret = strlen(buf);
+ }
+/* else if (os_strcasecmp(cmd, "START") == 0) {
+ os_sleep(0, 200000);
+ wpa_msg(drv->ctx, MSG_INFO, WPA_EVENT_DRIVER_STATE "STARTED");
+ }
+ else if (os_strcasecmp(cmd, "STOP") == 0) {
+ wpa_msg(drv->ctx, MSG_INFO, WPA_EVENT_DRIVER_STATE "STOPPED");
+ }*/
+ wpa_printf(MSG_DEBUG, "%s %s len = %d, %d", __func__, buf, ret, strlen(buf));
+ }
+ return ret;
+}
+#endif
const struct wpa_driver_ops wpa_driver_wext_ops = {
.name = "wext",
@@ -2506,4 +2571,7 @@
.mlme_add_sta = wpa_driver_wext_mlme_add_sta,
.mlme_remove_sta = wpa_driver_wext_mlme_remove_sta,
#endif /* CONFIG_CLIENT_MLME */
+#ifdef ANDROID
+ .driver_cmd = wpa_driver_priv_driver_cmd,
+#endif
};
diff --git a/events.c b/events.c
index 1512097..76e509d 100644
--- a/events.c
+++ b/events.c
@@ -505,6 +505,7 @@
struct wpa_ssid *ssid = NULL;
struct wpa_scan_result *results;
+ wpa_s->scan_ongoing = 0;
if (wpa_supplicant_get_scan_results(wpa_s) < 0) {
if (wpa_s->conf->ap_scan == 2)
return;
@@ -515,7 +516,7 @@
}
wpa_supplicant_dbus_notify_scan_results(wpa_s);
- wpa_msg(wpa_s, MSG_INFO, WPA_EVENT_SCAN_RESULTS " Ready"); /* Dm: */
+ wpa_msg(wpa_s, MSG_INFO, WPA_EVENT_SCAN_RESULTS " Ready");
if (wpa_s->conf->ap_scan == 2 || wpa_s->disconnected)
return;
diff --git a/if_index.c b/if_index.c
deleted file mode 100644
index 8f87d5f..0000000
--- a/if_index.c
+++ /dev/null
@@ -1,50 +0,0 @@
-/* if_index.c
-**
-** Copyright 2007, The Android Open Source Project
-**
-** Licensed under the Apache License, Version 2.0 (the "License");
-** you may not use this file except in compliance with the License.
-** You may obtain a copy of the License at
-**
-** http://www.apache.org/licenses/LICENSE-2.0
-**
-** Unless required by applicable law or agreed to in writing, software
-** distributed under the License is distributed on an "AS IS" BASIS,
-** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-** See the License for the specific language governing permissions and
-** limitations under the License.
-*/
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <unistd.h>
-#include <errno.h>
-
-#include <sys/socket.h>
-#include <sys/select.h>
-#include <sys/types.h>
-#include <netinet/in.h>
-
-#include <linux/if.h>
-#include <linux/sockios.h>
-#include <linux/route.h>
-
-unsigned int if_nametoindex( const char *ifname )
-{
-#ifndef SIOCGIFINDEX
- return 0;
-#else
- struct ifreq ifr;
- int fd = socket(AF_INET, SOCK_DGRAM, 0);
-
- if (fd < 0)
- return 0;
-
- strncpy(ifr.ifr_name, ifname, sizeof (ifr.ifr_name));
- ifr.ifr_ifindex = 0;
- if (ioctl (fd, SIOCGIFINDEX, &ifr) < 0) {
- return 0;
- }
- return ifr.ifr_ifindex;
-#endif
-}
diff --git a/os_unix.c b/os_unix.c
index 7e3ab4a..edb160a 100644
--- a/os_unix.c
+++ b/os_unix.c
@@ -16,6 +16,12 @@
#include "os.h"
+#ifdef ANDROID
+#include <linux/capability.h>
+#include <linux/prctl.h>
+#include <private/android_filesystem_config.h>
+#endif
+
void os_sleep(os_time_t sec, os_time_t usec)
{
if (sec)
@@ -171,6 +177,28 @@
int os_program_init(void)
{
+#ifdef ANDROID
+ /* We ignore errors here since errors are normal if we
+ * are already running as non-root.
+ */
+ gid_t groups[] = { AID_INET, AID_WIFI, AID_KEYSTORE };
+ setgroups(sizeof(groups)/sizeof(groups[0]), groups);
+
+ prctl(PR_SET_KEEPCAPS, 1, 0, 0, 0);
+
+ setgid(AID_WIFI);
+ setuid(AID_WIFI);
+
+ struct __user_cap_header_struct header;
+ struct __user_cap_data_struct cap;
+ header.version = _LINUX_CAPABILITY_VERSION;
+ header.pid = 0;
+ cap.effective = cap.permitted =
+ (1 << CAP_NET_ADMIN) | (1 << CAP_NET_RAW);
+ cap.inheritable = 0;
+ capset(&header, &cap);
+#endif
+
return 0;
}
diff --git a/wireless_copy.h b/wireless_copy.h
index ac81f69..d7958f9 100644
--- a/wireless_copy.h
+++ b/wireless_copy.h
@@ -1,17 +1,10 @@
-/* This is based on Linux Wireless Extensions header file from WIRELESS_EXT 18.
- * I have just removed kernel related headers and added some typedefs etc. to
- * make this easier to include into user space programs.
- * Jouni Malinen, 2005-03-12.
- */
-
-
/*
* This file define a set of standard wireless extensions
*
- * Version : 19 18.3.05
+ * Version : 22 16.3.07
*
* Authors : Jean Tourrilhes - HPL - <[email protected]>
- * Copyright (c) 1997-2005 Jean Tourrilhes, All Rights Reserved.
+ * Copyright (c) 1997-2007 Jean Tourrilhes, All Rights Reserved.
*/
#ifndef _LINUX_WIRELESS_H
@@ -76,27 +69,9 @@
/***************************** INCLUDES *****************************/
- /* jkm - replaced linux headers with C library headers, added typedefs */
-#if 0
-/* To minimise problems in user space, I might remove those headers
- * at some point. Jean II */
-#include <linux/types.h> /* for "caddr_t" et al */
+#include <linux/types.h> /* for __u* and __s* typedefs */
#include <linux/socket.h> /* for "struct sockaddr" et al */
#include <linux/if.h> /* for IFNAMSIZ and co... */
-#else
-#include <sys/types.h>
-#include <net/if.h>
-#if !defined(HAVE_ANDROID_OS)
-typedef __uint32_t __u32;
-typedef __int32_t __s32;
-typedef __uint16_t __u16;
-typedef __int16_t __s16;
-typedef __uint8_t __u8;
-#endif
-#ifndef __user
-#define __user
-#endif /* __user */
-#endif
/***************************** VERSION *****************************/
/*
@@ -105,7 +80,7 @@
* (there is some stuff that will be added in the future...)
* I just plan to increment with each new version.
*/
-#define WIRELESS_EXT 19
+#define WIRELESS_EXT 22
/*
* Changes :
@@ -229,6 +204,22 @@
* - Add IW_QUAL_ALL_UPDATED and IW_QUAL_ALL_INVALID macros
* - Add explicit flag to tell stats are in dBm : IW_QUAL_DBM
* - Add IW_IOCTL_IDX() and IW_EVENT_IDX() macros
+ *
+ * V19 to V20
+ * ----------
+ * - RtNetlink requests support (SET/GET)
+ *
+ * V20 to V21
+ * ----------
+ * - Remove (struct net_device *)->get_wireless_stats()
+ * - Change length in ESSID and NICK to strlen() instead of strlen()+1
+ * - Add IW_RETRY_SHORT/IW_RETRY_LONG retry modifiers
+ * - Power/Retry relative values no longer * 100000
+ * - Add explicit flag to tell stats are in 802.11k RCPI : IW_QUAL_RCPI
+ *
+ * V21 to V22
+ * ----------
+ * - Prevent leaking of kernel space in stream on 64 bits.
*/
/**************************** CONSTANTS ****************************/
@@ -342,7 +333,7 @@
* separate range because of collisions with other tools such as
* 'mii-tool'.
* We now have 32 commands, so a bit more space ;-).
- * Also, all 'odd' commands are only usable by root and don't return the
+ * Also, all 'even' commands are only usable by root and don't return the
* content of ifr/iwr to user (but you are not obliged to use the set/get
* convention, just use every other two command). More details in iwpriv.c.
* And I repeat : you are not forced to use them with iwpriv, but you
@@ -356,7 +347,7 @@
#define SIOCIWLAST SIOCIWLASTPRIV /* 0x8BFF */
#define IW_IOCTL_IDX(cmd) ((cmd) - SIOCIWFIRST)
-/* Even : get (world access), odd : set (root access) */
+/* Odd : get (world access), even : set (root access) */
#define IW_IS_SET(cmd) (!((cmd) & 0x1))
#define IW_IS_GET(cmd) ((cmd) & 0x1)
@@ -459,6 +450,7 @@
#define IW_MODE_REPEAT 4 /* Wireless Repeater (forwarder) */
#define IW_MODE_SECOND 5 /* Secondary master/repeater (backup) */
#define IW_MODE_MONITOR 6 /* Passive monitor (listen only) */
+#define IW_MODE_MESH 7 /* Mesh (IEEE 802.11s) network */
/* Statistics flags (bitmask in updated) */
#define IW_QUAL_QUAL_UPDATED 0x01 /* Value was updated since last read */
@@ -469,6 +461,7 @@
#define IW_QUAL_QUAL_INVALID 0x10 /* Driver doesn't provide value */
#define IW_QUAL_LEVEL_INVALID 0x20
#define IW_QUAL_NOISE_INVALID 0x40
+#define IW_QUAL_RCPI 0x80 /* Level + Noise are 802.11k RCPI */
#define IW_QUAL_ALL_INVALID 0x70
/* Frequency flags */
@@ -521,10 +514,12 @@
#define IW_RETRY_TYPE 0xF000 /* Type of parameter */
#define IW_RETRY_LIMIT 0x1000 /* Maximum number of retries*/
#define IW_RETRY_LIFETIME 0x2000 /* Maximum duration of retries in us */
-#define IW_RETRY_MODIFIER 0x000F /* Modify a parameter */
+#define IW_RETRY_MODIFIER 0x00FF /* Modify a parameter */
#define IW_RETRY_MIN 0x0001 /* Value is a minimum */
#define IW_RETRY_MAX 0x0002 /* Value is a maximum */
#define IW_RETRY_RELATIVE 0x0004 /* Value is not in seconds/ms/us */
+#define IW_RETRY_SHORT 0x0010 /* Value is for short packets */
+#define IW_RETRY_LONG 0x0020 /* Value is for long packets */
/* Scanning request flags */
#define IW_SCAN_DEFAULT 0x0000 /* Default scan of the driver */
@@ -542,6 +537,16 @@
/* Maximum size of returned data */
#define IW_SCAN_MAX_DATA 4096 /* In bytes */
+/* Scan capability flags - in (struct iw_range *)->scan_capa */
+#define IW_SCAN_CAPA_NONE 0x00
+#define IW_SCAN_CAPA_ESSID 0x01
+#define IW_SCAN_CAPA_BSSID 0x02
+#define IW_SCAN_CAPA_CHANNEL 0x04
+#define IW_SCAN_CAPA_MODE 0x08
+#define IW_SCAN_CAPA_RATE 0x10
+#define IW_SCAN_CAPA_TYPE 0x20
+#define IW_SCAN_CAPA_TIME 0x40
+
/* Max number of char in custom event - use multiple of them if needed */
#define IW_CUSTOM_MAX 256 /* In bytes */
@@ -551,6 +556,8 @@
/* MLME requests (SIOCSIWMLME / struct iw_mlme) */
#define IW_MLME_DEAUTH 0
#define IW_MLME_DISASSOC 1
+#define IW_MLME_AUTH 2
+#define IW_MLME_ASSOC 3
/* SIOCSIWAUTH/SIOCGIWAUTH struct iw_param flags */
#define IW_AUTH_INDEX 0x0FFF
@@ -604,6 +611,7 @@
#define IW_ENCODE_ALG_WEP 1
#define IW_ENCODE_ALG_TKIP 2
#define IW_ENCODE_ALG_CCMP 3
+#define IW_ENCODE_ALG_PMK 4
/* struct iw_encode_ext ->ext_flags */
#define IW_ENCODE_EXT_TX_SEQ_VALID 0x00000001
#define IW_ENCODE_EXT_RX_SEQ_VALID 0x00000002
@@ -623,6 +631,7 @@
#define IW_ENC_CAPA_WPA2 0x00000002
#define IW_ENC_CAPA_CIPHER_TKIP 0x00000004
#define IW_ENC_CAPA_CIPHER_CCMP 0x00000008
+#define IW_ENC_CAPA_4WAY_HANDSHAKE 0x00000010
/* Event capability macros - in (struct iw_range *)->event_capa
* Because we have more than 32 possible events, we use an array of
@@ -668,6 +677,19 @@
__u16 flags; /* Optional params */
};
+#ifdef __KERNEL__
+#ifdef CONFIG_COMPAT
+
+#include <linux/compat.h>
+
+struct compat_iw_point {
+ compat_caddr_t pointer;
+ __u16 length;
+ __u16 flags;
+};
+#endif
+#endif
+
/*
* A frequency
* For numbers lower than 10^9, we encode the number in 'm' and
@@ -962,6 +984,9 @@
__u16 old_num_channels;
__u8 old_num_frequency;
+ /* Scan capabilities */
+ __u8 scan_capa; /* IW_SCAN_CAPA_* bit field */
+
/* Wireless event capability bitmasks */
__u32 event_capa[6];
@@ -1038,7 +1063,7 @@
/* Note : this frequency list doesn't need to fit channel numbers,
* because each entry contain its channel index */
- __u32 enc_capa; /* IW_ENC_CAPA_* bit field */
+ __u32 enc_capa; /* IW_ENC_CAPA_* bit field */
};
/*
@@ -1065,7 +1090,7 @@
*/
struct iw_event
{
- __u16 len; /* Real lenght of this stuff */
+ __u16 len; /* Real length of this stuff */
__u16 cmd; /* Wireless IOCTL */
union iwreq_data u; /* IOCTL fixed payload */
};
@@ -1088,4 +1113,30 @@
#define IW_EV_POINT_LEN (IW_EV_LCP_LEN + sizeof(struct iw_point) - \
IW_EV_POINT_OFF)
+#ifdef __KERNEL__
+#ifdef CONFIG_COMPAT
+struct __compat_iw_event {
+ __u16 len; /* Real length of this stuff */
+ __u16 cmd; /* Wireless IOCTL */
+ compat_caddr_t pointer;
+};
+#define IW_EV_COMPAT_LCP_LEN offsetof(struct __compat_iw_event, pointer)
+#define IW_EV_COMPAT_POINT_OFF offsetof(struct compat_iw_point, length)
+#define IW_EV_COMPAT_POINT_LEN \
+ (IW_EV_COMPAT_LCP_LEN + sizeof(struct compat_iw_point) - \
+ IW_EV_COMPAT_POINT_OFF)
+#endif
+#endif
+
+/* Size of the Event prefix when packed in stream */
+#define IW_EV_LCP_PK_LEN (4)
+/* Size of the various events when packed in stream */
+#define IW_EV_CHAR_PK_LEN (IW_EV_LCP_PK_LEN + IFNAMSIZ)
+#define IW_EV_UINT_PK_LEN (IW_EV_LCP_PK_LEN + sizeof(__u32))
+#define IW_EV_FREQ_PK_LEN (IW_EV_LCP_PK_LEN + sizeof(struct iw_freq))
+#define IW_EV_PARAM_PK_LEN (IW_EV_LCP_PK_LEN + sizeof(struct iw_param))
+#define IW_EV_ADDR_PK_LEN (IW_EV_LCP_PK_LEN + sizeof(struct sockaddr))
+#define IW_EV_QUAL_PK_LEN (IW_EV_LCP_PK_LEN + sizeof(struct iw_quality))
+#define IW_EV_POINT_PK_LEN (IW_EV_LCP_LEN + 4)
+
#endif /* _LINUX_WIRELESS_H */
diff --git a/wpa_ctrl.c b/wpa_ctrl.c
index 0d5dd28..d232949 100644
--- a/wpa_ctrl.c
+++ b/wpa_ctrl.c
@@ -153,7 +153,7 @@
* event of crashes that prevented them from being removed as part
* of the normal orderly shutdown.
*/
-void wpa_ctrl_cleanup()
+void wpa_ctrl_cleanup(void)
{
DIR *dir;
struct dirent entry;
diff --git a/wpa_ctrl.h b/wpa_ctrl.h
index a81dec9..1171712 100644
--- a/wpa_ctrl.h
+++ b/wpa_ctrl.h
@@ -187,7 +187,7 @@
* event of crashes that prevented them from being removed as part
* of the normal orderly shutdown.
*/
-void wpa_ctrl_cleanup();
+void wpa_ctrl_cleanup(void);
#endif /* ANDROID */
#ifdef CONFIG_CTRL_IFACE_UDP
diff --git a/wpa_supplicant.c b/wpa_supplicant.c
index 706a010..c654fa7 100644
--- a/wpa_supplicant.c
+++ b/wpa_supplicant.c
@@ -954,7 +954,11 @@
wpa_supplicant_clear_status(wpa_s);
wpa_s->reassociate = 1;
+#ifdef ANDROID
+ wpa_supplicant_req_scan(wpa_s, 2, 0);
+#else
wpa_supplicant_req_scan(wpa_s, 0, 0);
+#endif
wpa_msg(wpa_s, MSG_DEBUG, "Reconfiguration completed");
return 0;
}
@@ -1105,6 +1109,8 @@
wpa_printf(MSG_WARNING, "Failed to initiate AP scan.");
wpa_supplicant_req_scan(wpa_s, 10, 0);
}
+ else
+ wpa_s->scan_ongoing = 1;
}
@@ -1385,6 +1391,8 @@
wpa_ssid_txt(bss->ssid, bss->ssid_len), bss->freq);
os_memset(wpa_s->bssid, 0, ETH_ALEN);
os_memcpy(wpa_s->pending_bssid, bss->bssid, ETH_ALEN);
+ wpa_s->link_speed = bss->maxrate;
+ wpa_s->rssi = bss->level;
} else {
wpa_msg(wpa_s, MSG_INFO, "Trying to associate with SSID '%s'",
wpa_ssid_txt(ssid->ssid, ssid->ssid_len));
diff --git a/wpa_supplicant_i.h b/wpa_supplicant_i.h
index 775462e..9989fe7 100644
--- a/wpa_supplicant_i.h
+++ b/wpa_supplicant_i.h
@@ -342,6 +342,9 @@
struct wpa_client_mlme mlme;
int use_client_mlme;
+ int scan_ongoing; /* scan ongoing or not */
+ int link_speed; /* current link speed */
+ int rssi; /* current signal level */
#ifdef ANDROID
int scan_interval; /* time between scans when no APs available */
#endif