Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 02fb46a2 authored by Irfan Sheriff's avatar Irfan Sheriff
Browse files

WPS fixes and refactor

- Allow IP and proxy set up for WPS
- Use string for WPS pin to avoid losing leading zeros
- Add a seperate WPS state machine and WpsConfiguration class

Change-Id: I87f43fff8bba0ae8ff02e5fc495a8bc628a8c8cf
parent ffdd591a
Loading
Loading
Loading
Loading
+10 −7
Original line number Diff line number Diff line
@@ -173,14 +173,17 @@ static jboolean android_net_wifi_wpsPbcCommand(JNIEnv* env, jobject clazz, jstri
    return doBooleanCommand(cmdstr, "OK");
}

static jboolean android_net_wifi_wpsPinFromAccessPointCommand(JNIEnv* env, jobject clazz, jstring bssid, int apPin)
static jboolean android_net_wifi_wpsPinFromAccessPointCommand(JNIEnv* env, jobject clazz,
        jstring bssid, jstring apPin)
{
    char cmdstr[BUF_SIZE];
    jboolean isCopy;

    const char *bssidStr = env->GetStringUTFChars(bssid, &isCopy);
    int numWritten = snprintf(cmdstr, sizeof(cmdstr), "WPS_REG %s %d", bssidStr, apPin);
    const char *apPinStr = env->GetStringUTFChars(apPin, &isCopy);
    int numWritten = snprintf(cmdstr, sizeof(cmdstr), "WPS_REG %s %s", bssidStr, apPinStr);
    env->ReleaseStringUTFChars(bssid, bssidStr);
    env->ReleaseStringUTFChars(apPin, apPinStr);

    if ((numWritten == -1) || (numWritten >= (int)sizeof(cmdstr))) {
        return false;
@@ -188,7 +191,7 @@ static jboolean android_net_wifi_wpsPinFromAccessPointCommand(JNIEnv* env, jobje
    return doBooleanCommand(cmdstr, "OK");
}

static jint android_net_wifi_wpsPinFromDeviceCommand(JNIEnv* env, jobject clazz, jstring bssid)
static jstring android_net_wifi_wpsPinFromDeviceCommand(JNIEnv* env, jobject clazz, jstring bssid)
{
    char cmdstr[BUF_SIZE];
    jboolean isCopy;
@@ -198,9 +201,9 @@ static jint android_net_wifi_wpsPinFromDeviceCommand(JNIEnv* env, jobject clazz,
    env->ReleaseStringUTFChars(bssid, bssidStr);

    if ((numWritten == -1) || (numWritten >= (int)sizeof(cmdstr))) {
        return -1;
        return NULL;
    }
    return doIntCommand(cmdstr);
    return doStringCommand(env, cmdstr);
}

static jboolean android_net_wifi_setCountryCodeCommand(JNIEnv* env, jobject clazz, jstring country)
@@ -648,9 +651,9 @@ static JNINativeMethod gWifiMethods[] = {
    { "addToBlacklistCommand", "(Ljava/lang/String;)Z", (void*) android_net_wifi_addToBlacklistCommand },
    { "clearBlacklistCommand", "()Z", (void*) android_net_wifi_clearBlacklistCommand },
    { "startWpsPbcCommand", "(Ljava/lang/String;)Z", (void*) android_net_wifi_wpsPbcCommand },
    { "startWpsWithPinFromAccessPointCommand", "(Ljava/lang/String;I)Z",
    { "startWpsWithPinFromAccessPointCommand", "(Ljava/lang/String;Ljava/lang/String;)Z",
        (void*) android_net_wifi_wpsPinFromAccessPointCommand },
    { "startWpsWithPinFromDeviceCommand", "(Ljava/lang/String;)I",
    { "startWpsWithPinFromDeviceCommand", "(Ljava/lang/String;)Ljava/lang/String;",
        (void*) android_net_wifi_wpsPinFromDeviceCommand },
    { "setSuspendOptimizationsCommand", "(Z)Z",
        (void*) android_net_wifi_setSuspendOptimizationsCommand},
+4 −13
Original line number Diff line number Diff line
@@ -39,6 +39,7 @@ import android.net.wifi.ScanResult;
import android.net.wifi.WifiConfiguration;
import android.net.wifi.SupplicantState;
import android.net.wifi.WifiConfiguration.KeyMgmt;
import android.net.wifi.WpsConfiguration;
import android.net.ConnectivityManager;
import android.net.InterfaceConfiguration;
import android.net.DhcpInfo;
@@ -843,23 +844,13 @@ public class WifiService extends IWifiManager.Stub {
        mWifiStateMachine.forgetNetwork(netId);
    }

    public void startWpsPbc(String bssid) {
        enforceChangePermission();
        mWifiStateMachine.startWpsPbc(bssid);
    }

    public void startWpsWithPinFromAccessPoint(String bssid, int apPin) {
        enforceChangePermission();
        mWifiStateMachine.startWpsWithPinFromAccessPoint(bssid, apPin);
    }

    public int startWpsWithPinFromDevice(String bssid) {
    public String startWps(WpsConfiguration config) {
        enforceChangePermission();
        if (mChannel != null) {
            return mWifiStateMachine.syncStartWpsWithPinFromDevice(mChannel, bssid);
            return mWifiStateMachine.startWps(mChannel, config);
        } else {
            Slog.e(TAG, "mChannel is not initialized");
            return -1;
            return "";
        }
    }

+2 −5
Original line number Diff line number Diff line
@@ -18,6 +18,7 @@ package android.net.wifi;

import android.net.wifi.WifiInfo;
import android.net.wifi.WifiConfiguration;
import android.net.wifi.WpsConfiguration;
import android.net.wifi.ScanResult;
import android.net.DhcpInfo;

@@ -108,10 +109,6 @@ interface IWifiManager

    void forgetNetwork(int networkId);

    void startWpsPbc(String bssid);

    void startWpsWithPinFromAccessPoint(String bssid, int apPin);

    int startWpsWithPinFromDevice(String bssid);
    String startWps(in WpsConfiguration config);
}
+0 −23
Original line number Diff line number Diff line
@@ -32,7 +32,6 @@ import android.util.Log;
 * that is based on these state changes:
 * - detect a failed WPA handshake that loops indefinitely
 * - password failure handling
 * - Enable networks after a WPS success/failure
 */
class SupplicantStateTracker extends HierarchicalStateMachine {

@@ -49,10 +48,6 @@ class SupplicantStateTracker extends HierarchicalStateMachine {
    /* Maximum retries on a password failure notification */
    private static final int MAX_RETRIES_ON_PASSWORD_FAILURE = 2;

    /* Track if WPS was started since we need to re-enable networks
     * and load configuration afterwards */
    private boolean mWpsStarted = false;

    private Context mContext;

    private HierarchicalState mUninitializedState = new UninitializedState();
@@ -156,11 +151,6 @@ class SupplicantStateTracker extends HierarchicalStateMachine {
                    mPasswordFailuresCount++;
                    mAuthFailureInSupplicantBroadcast = true;
                    break;
                case WifiStateMachine.CMD_START_WPS_PBC:
                case WifiStateMachine.CMD_START_WPS_PIN_FROM_AP:
                case WifiStateMachine.CMD_START_WPS_PIN_FROM_DEVICE:
                    mWpsStarted = true;
                    break;
                case WifiStateMachine.SUPPLICANT_STATE_CHANGE_EVENT:
                    StateChangeResult stateChangeResult = (StateChangeResult) message.obj;
                    sendSupplicantStateChangedBroadcast(stateChangeResult,
@@ -192,12 +182,6 @@ class SupplicantStateTracker extends HierarchicalStateMachine {
        @Override
         public void enter() {
             if (DBG) Log.d(TAG, getName() + "\n");
             /* A failed WPS connection */
             if (mWpsStarted) {
                 Log.e(TAG, "WPS set up failed, enabling other networks");
                 WifiConfigStore.enableAllNetworks();
                 mWpsStarted = false;
             }
             mWifiStateMachine.setNetworkAvailable(false);
         }
        @Override
@@ -289,13 +273,6 @@ class SupplicantStateTracker extends HierarchicalStateMachine {
             if (DBG) Log.d(TAG, getName() + "\n");
             /* Reset password failure count */
             mPasswordFailuresCount = 0;

             /* A successful WPS connection */
             if (mWpsStarted) {
                 WifiConfigStore.enableAllNetworks();
                 WifiConfigStore.loadConfiguredNetworks();
                 mWpsStarted = false;
             }
         }
        @Override
        public boolean processMessage(Message message) {
+21 −7
Original line number Diff line number Diff line
@@ -366,8 +366,8 @@ class WifiConfigStore {
     * Start WPS pin method configuration with pin obtained
     * from the access point
     */
    static boolean startWpsWithPinFromAccessPoint(String bssid, int apPin) {
        if (WifiNative.startWpsWithPinFromAccessPointCommand(bssid, apPin)) {
    static boolean startWpsWithPinFromAccessPoint(WpsConfiguration config) {
        if (WifiNative.startWpsWithPinFromAccessPointCommand(config.BSSID, config.pin)) {
            /* WPS leaves all networks disabled */
            markAllNetworksDisabled();
            return true;
@@ -379,14 +379,16 @@ class WifiConfigStore {
    /**
     * Start WPS pin method configuration with pin obtained
     * from the device
     * @return empty string on failure. null is never returned.
     */
    static int startWpsWithPinFromDevice(String bssid) {
        int pin = WifiNative.startWpsWithPinFromDeviceCommand(bssid);
    static String startWpsWithPinFromDevice(WpsConfiguration config) {
        String pin = WifiNative.startWpsWithPinFromDeviceCommand(config.BSSID);
        /* WPS leaves all networks disabled */
        if (pin != -1) {
        if (!TextUtils.isEmpty(pin)) {
            markAllNetworksDisabled();
        } else {
            Log.e(TAG, "Failed to start WPS pin method configuration");
            pin = "";
        }
        return pin;
    }
@@ -394,8 +396,8 @@ class WifiConfigStore {
    /**
     * Start WPS push button configuration
     */
    static boolean startWpsPbc(String bssid) {
        if (WifiNative.startWpsPbcCommand(bssid)) {
    static boolean startWpsPbc(WpsConfiguration config) {
        if (WifiNative.startWpsPbcCommand(config.BSSID)) {
            /* WPS leaves all networks disabled */
            markAllNetworksDisabled();
            return true;
@@ -527,6 +529,18 @@ class WifiConfigStore {
        sendConfiguredNetworksChangedBroadcast();
    }

    static void updateIpAndProxyFromWpsConfig(int netId, WpsConfiguration wpsConfig) {
        synchronized (sConfiguredNetworks) {
            WifiConfiguration config = sConfiguredNetworks.get(netId);
            if (config != null) {
                config.ipAssignment = wpsConfig.ipAssignment;
                config.proxySettings = wpsConfig.proxySettings;
                config.linkProperties = wpsConfig.linkProperties;
                writeIpAndProxyConfigurations();
            }
        }
    }

    /* Mark all networks except specified netId as disabled */
    private static void markAllNetworksDisabledExcept(int netId) {
        synchronized (sConfiguredNetworks) {
Loading