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

Commit 8650c035 authored by vandwalle's avatar vandwalle
Browse files

aggressively blacklist WifiConfiguration for the purpose of switching network

    In cases where networks are not properly configured, WiFi might tries to repeatdly switch from one network to a bad network, or might try to roam and renew DHCP which can fail. In KK, WiFi autojoin would try other networks (by cycling to network it sees) and end up associated to a "good" network. In L release even thought WiFi might pick a good network it will still repeatedly try to switch to what it thinks is a better network and fail, thus annoying the user whose connection becomes unstable. This CL tries to remember networks that have seen multiple DHCP or auth failure in the past and for those networks it disable roaming temporarily. That is, if wifi is not associated to any network, it will tries to join a network aggressively, however if wifi is currently associated to a network, it will not try to switch to a new network if that new network has seen multiple failure in the past. The maximum blacklist time is set to 2 days for now.
    An example of such situation is:
    - user has multiple SSID at home, one of which is incorrectly configured with a wrong password
    - broken DHCP situation (potentially: multiple servers on home network, broken implementation incorrecting NAK'ing DHCP requests but properly serving DHCP offer...)
Bug:18792931

Change-Id: I332a9cebdc19be2e00b455205d386fcffcb70b29
parent c309688b
Loading
Loading
Loading
Loading
+4 −0
Original line number Diff line number Diff line
@@ -424,6 +424,10 @@
    <!-- Integer indicating wpa_supplicant scan interval in milliseconds -->
    <integer translatable="false" name="config_wifi_supplicant_scan_interval">15000</integer>

    <!-- Integer indicating amount of time failed networks areblacklisted for the purpose
         of network switching in milliseconds -->
    <integer translatable="false" name="config_wifi_network_switching_blacklist_time">172800000</integer>

    <!-- Integer indicating wpa_supplicant scan interval when p2p is connected in milliseconds -->
    <integer translatable="false" name="config_wifi_scan_interval_p2p_connected">60000</integer>

+1 −0
Original line number Diff line number Diff line
@@ -327,6 +327,7 @@
  <java-symbol type="integer" name="config_wifi_framework_scan_result_rssi_level_patchup_value" />
  <java-symbol type="integer" name="config_wifi_framework_current_network_boost" />
  <java-symbol type="string"  name="config_wifi_random_mac_oui" />
  <java-symbol type="integer"  name="config_wifi_network_switching_blacklist_time" />

  <java-symbol type="bool" name="editable_voicemailnumber" />

+46 −0
Original line number Diff line number Diff line
@@ -686,6 +686,31 @@ public class WifiConfiguration implements Parcelable {
     */
    public long lastConnectionFailure;

    /**
     * @hide
     * Last time the system tried to roam and failed because of authentication failure or DHCP
     * RENEW failure.
     */
    public long lastRoamingFailure;

    /** @hide */
    public static int ROAMING_FAILURE_IP_CONFIG = 1;
    /** @hide */
    public static int ROAMING_FAILURE_AUTH_FAILURE = 2;

    /**
     * @hide
     * Initial amount of time this Wifi configuration gets blacklisted for network switching
     * because of roaming failure
     */
    public long roamingFailureBlackListTimeMilli = 1000;

    /**
     * @hide
     * Last roaming failure reason code
     */
    public int lastRoamingFailureReason;

    /**
     * @hide
     * Last time the system was disconnected to this configuration.
@@ -1148,6 +1173,18 @@ public class WifiConfiguration implements Parcelable {
                sbuf.append( "sec");
            }
        }
        if (this.lastRoamingFailure != 0) {
            sbuf.append('\n');
            long diff = now_ms - this.lastRoamingFailure;
            if (diff <= 0) {
                sbuf.append("lastRoamingFailure since <incorrect>");
            } else {
                sbuf.append("lastRoamingFailure: ").append(Long.toString(diff/1000));
                sbuf.append( "sec");
            }
        }
        sbuf.append("roamingFailureBlackListTimeMilli: ").
                append(Long.toString(this.roamingFailureBlackListTimeMilli));
        sbuf.append('\n');
        if (this.linkedConfigurations != null) {
            for(String key : this.linkedConfigurations.keySet()) {
@@ -1518,6 +1555,9 @@ public class WifiConfiguration implements Parcelable {
            lastConnected = source.lastConnected;
            lastDisconnected = source.lastDisconnected;
            lastConnectionFailure = source.lastConnectionFailure;
            lastRoamingFailure = source.lastRoamingFailure;
            lastRoamingFailureReason = source.lastRoamingFailureReason;
            roamingFailureBlackListTimeMilli = source.roamingFailureBlackListTimeMilli;
            numConnectionFailures = source.numConnectionFailures;
            numIpConfigFailures = source.numIpConfigFailures;
            numAuthFailures = source.numAuthFailures;
@@ -1587,6 +1627,9 @@ public class WifiConfiguration implements Parcelable {
        dest.writeInt(lastUpdateUid);
        dest.writeLong(blackListTimestamp);
        dest.writeLong(lastConnectionFailure);
        dest.writeLong(lastRoamingFailure);
        dest.writeInt(lastRoamingFailureReason);
        dest.writeLong(roamingFailureBlackListTimeMilli);
        dest.writeInt(numConnectionFailures);
        dest.writeInt(numIpConfigFailures);
        dest.writeInt(numAuthFailures);
@@ -1649,6 +1692,9 @@ public class WifiConfiguration implements Parcelable {
                config.lastUpdateUid = in.readInt();
                config.blackListTimestamp = in.readLong();
                config.lastConnectionFailure = in.readLong();
                config.lastRoamingFailure = in.readLong();
                config.lastRoamingFailureReason = in.readInt();
                config.roamingFailureBlackListTimeMilli = in.readLong();
                config.numConnectionFailures = in.readInt();
                config.numIpConfigFailures = in.readInt();
                config.numAuthFailures = in.readInt();