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