diff options
author | Roshan Pius <rpius@google.com> | 2020-07-17 08:25:28 -0700 |
---|---|---|
committer | Roshan Pius <rpius@google.com> | 2020-07-22 18:23:31 +0000 |
commit | cc841d2abc81491a4001fe1c46e9ea17fb01581e (patch) | |
tree | 6c507662df67d4ecfe80615738f9a5e80807095b | |
parent | 725979457913e7addc8c6ffbd921b82011effe1e (diff) |
SupplicantStaIfaceHal: Trigger EAP auth failure on disconnect
To fix the ordering of events issue in supplicant, trigger eap
authentication failure on disconnect event iff
i) Device is connecting to an EAP network.
ii) Device has finished association.
Bug: 159687884
Test: atest com.android.server.wifi
Test:
Manual tests (EAP):
i) Trigger connection to EAP network with wrong credentials.
ii) Ensure that we blacklist the network after a couple of failures.
Manual tests (WPA_PSK):
i) Trigger connection to PSK network with wrong password.
ii) Ensure that we blacklist the network after failure.
Change-Id: I08cf5187ee825ce9cf01686f86ff956a2956372a
Merged-In: I08cf5187ee825ce9cf01686f86ff956a2956372a
(cherry picked from commit b34cba88e54656822d3b855b82e3aa39bddd9ebc)
-rw-r--r-- | service/java/com/android/server/wifi/SupplicantStaIfaceCallbackImpl.java | 35 | ||||
-rw-r--r-- | tests/wifitests/src/com/android/server/wifi/SupplicantStaIfaceHalTest.java | 46 |
2 files changed, 66 insertions, 15 deletions
diff --git a/service/java/com/android/server/wifi/SupplicantStaIfaceCallbackImpl.java b/service/java/com/android/server/wifi/SupplicantStaIfaceCallbackImpl.java index 92ba43b4c..9d69003cf 100644 --- a/service/java/com/android/server/wifi/SupplicantStaIfaceCallbackImpl.java +++ b/service/java/com/android/server/wifi/SupplicantStaIfaceCallbackImpl.java @@ -55,7 +55,8 @@ abstract class SupplicantStaIfaceCallbackImpl extends ISupplicantStaIfaceCallbac private final String mIfaceName; private final Object mLock; private final WifiMonitor mWifiMonitor; - private boolean mStateIsFourway = false; // Used to help check for PSK password mismatch + // Used to help check for PSK password mismatch & EAP connection failure. + private int mStateBeforeDisconnect = State.INACTIVE; SupplicantStaIfaceCallbackImpl(@NonNull SupplicantStaIfaceHal staIfaceHal, @NonNull String ifaceName, @@ -151,8 +152,8 @@ abstract class SupplicantStaIfaceCallbackImpl extends ISupplicantStaIfaceCallbac public void onNetworkRemoved(int id) { synchronized (mLock) { mStaIfaceHal.logCallback("onNetworkRemoved"); - // Reset 4way handshake state since network has been removed. - mStateIsFourway = false; + // Reset state since network has been removed. + mStateBeforeDisconnect = State.INACTIVE; } } @@ -166,8 +167,12 @@ abstract class SupplicantStaIfaceCallbackImpl extends ISupplicantStaIfaceCallbac WifiSsid wifiSsid = WifiSsid.createFromByteArray(NativeUtil.byteArrayFromArrayList(ssid)); String bssidStr = NativeUtil.macAddressFromByteArray(bssid); - mStateIsFourway = (newState == ISupplicantStaIfaceCallback.State.FOURWAY_HANDSHAKE); - if (newSupplicantState == SupplicantState.COMPLETED) { + if (newState != State.DISCONNECTED) { + // onStateChanged(DISCONNECTED) may come before onDisconnected(), so add this + // cache to track the state before the disconnect. + mStateBeforeDisconnect = newState; + } + if (newState == State.COMPLETED) { mWifiMonitor.broadcastNetworkConnectionEvent( mIfaceName, mStaIfaceHal.getCurrentNetworkId(mIfaceName), bssidStr); } @@ -239,14 +244,23 @@ abstract class SupplicantStaIfaceCallbackImpl extends ISupplicantStaIfaceCallbac synchronized (mLock) { mStaIfaceHal.logCallback("onDisconnected"); if (mStaIfaceHal.isVerboseLoggingEnabled()) { - Log.e(TAG, "onDisconnected 4way=" + mStateIsFourway + Log.e(TAG, "onDisconnected state=" + mStateBeforeDisconnect + " locallyGenerated=" + locallyGenerated + " reasonCode=" + reasonCode); } - if (mStateIsFourway - && (!locallyGenerated || reasonCode != ReasonCode.IE_IN_4WAY_DIFFERS)) { - mWifiMonitor.broadcastAuthenticationFailureEvent( - mIfaceName, WifiManager.ERROR_AUTH_FAILURE_WRONG_PSWD, -1); + WifiConfiguration curConfiguration = + mStaIfaceHal.getCurrentNetworkLocalConfig(mIfaceName); + if (curConfiguration != null) { + if (mStateBeforeDisconnect == State.FOURWAY_HANDSHAKE + && WifiConfigurationUtil.isConfigForPskNetwork(curConfiguration) + && (!locallyGenerated || reasonCode != ReasonCode.IE_IN_4WAY_DIFFERS)) { + mWifiMonitor.broadcastAuthenticationFailureEvent( + mIfaceName, WifiManager.ERROR_AUTH_FAILURE_WRONG_PSWD, -1); + } else if (mStateBeforeDisconnect == State.ASSOCIATED + && WifiConfigurationUtil.isConfigForEapNetwork(curConfiguration)) { + mWifiMonitor.broadcastAuthenticationFailureEvent( + mIfaceName, WifiManager.ERROR_AUTH_FAILURE_EAP_FAILURE, -1); + } } mWifiMonitor.broadcastNetworkDisconnectionEvent( mIfaceName, locallyGenerated ? 1 : 0, reasonCode, @@ -261,7 +275,6 @@ abstract class SupplicantStaIfaceCallbackImpl extends ISupplicantStaIfaceCallbac boolean isWrongPwd = false; WifiConfiguration curConfiguration = mStaIfaceHal.getCurrentNetworkLocalConfig(mIfaceName); - if (curConfiguration != null) { if (!timedOut) { Log.d(TAG, "flush PMK cache due to association rejection for config id " diff --git a/tests/wifitests/src/com/android/server/wifi/SupplicantStaIfaceHalTest.java b/tests/wifitests/src/com/android/server/wifi/SupplicantStaIfaceHalTest.java index 95f88bbf1..762691184 100644 --- a/tests/wifitests/src/com/android/server/wifi/SupplicantStaIfaceHalTest.java +++ b/tests/wifitests/src/com/android/server/wifi/SupplicantStaIfaceHalTest.java @@ -1040,9 +1040,11 @@ public class SupplicantStaIfaceHalTest extends WifiBaseTest { * Tests the handling of incorrect network passwords. */ @Test - public void testAuthFailurePassword() throws Exception { + public void testAuthFailurePasswordOnDisconnect() throws Exception { executeAndValidateInitializationSequence(); assertNotNull(mISupplicantStaIfaceCallback); + executeAndValidateConnectSequenceWithKeyMgmt( + 0, false, WifiConfiguration.KeyMgmt.WPA_PSK, null); int reasonCode = 3; mISupplicantStaIfaceCallback.onDisconnected( @@ -1061,13 +1063,49 @@ public class SupplicantStaIfaceHalTest extends WifiBaseTest { SUPPLICANT_NETWORK_ID, NativeUtil.decodeSsid(SUPPLICANT_SSID)); mISupplicantStaIfaceCallback.onDisconnected( + NativeUtil.macAddressToByteArray(BSSID), false, reasonCode); + + verify(mWifiMonitor).broadcastAuthenticationFailureEvent( + eq(WLAN0_IFACE_NAME), eq(WifiManager.ERROR_AUTH_FAILURE_WRONG_PSWD), eq(-1)); + } + + /** + * Tests the handling of EAP failure disconnects. + */ + @Test + public void testAuthFailureEapOnDisconnect() throws Exception { + executeAndValidateInitializationSequence(); + assertNotNull(mISupplicantStaIfaceCallback); + executeAndValidateConnectSequenceWithKeyMgmt( + 0, false, WifiConfiguration.KeyMgmt.WPA_EAP, null); + + int reasonCode = 3; + mISupplicantStaIfaceCallback.onDisconnected( NativeUtil.macAddressToByteArray(BSSID), true, reasonCode); + verify(mWifiMonitor, times(0)) + .broadcastAuthenticationFailureEvent(any(), anyInt(), anyInt()); + mISupplicantStaIfaceCallback.onDisconnected( NativeUtil.macAddressToByteArray(BSSID), false, reasonCode); + verify(mWifiMonitor, times(0)) + .broadcastAuthenticationFailureEvent(any(), anyInt(), anyInt()); - verify(mWifiMonitor, times(2)) - .broadcastAuthenticationFailureEvent(eq(WLAN0_IFACE_NAME), - eq(WifiManager.ERROR_AUTH_FAILURE_WRONG_PSWD), eq(-1)); + mISupplicantStaIfaceCallback.onStateChanged( + ISupplicantStaIfaceCallback.State.ASSOCIATED, + NativeUtil.macAddressToByteArray(BSSID), + SUPPLICANT_NETWORK_ID, + NativeUtil.decodeSsid(SUPPLICANT_SSID)); + // Ensure we don't lose our prev state with this state changed event. + mISupplicantStaIfaceCallback.onStateChanged( + ISupplicantStaIfaceCallback.State.DISCONNECTED, + NativeUtil.macAddressToByteArray(BSSID), + SUPPLICANT_NETWORK_ID, + NativeUtil.decodeSsid(SUPPLICANT_SSID)); + mISupplicantStaIfaceCallback.onDisconnected( + NativeUtil.macAddressToByteArray(BSSID), false, reasonCode); + + verify(mWifiMonitor).broadcastAuthenticationFailureEvent( + eq(WLAN0_IFACE_NAME), eq(WifiManager.ERROR_AUTH_FAILURE_EAP_FAILURE), eq(-1)); } /** |