am dea6cb78: Merge "CTS test for WiFi watchdog - framework support." into jb-mr1-dev

* commit 'dea6cb78216e5394129a322bac9bd77459233107':
  CTS test for WiFi watchdog - framework support.
This commit is contained in:
Irfan Sheriff
2012-08-15 16:31:09 -07:00
committed by Android Git Automerger
5 changed files with 156 additions and 45 deletions

View File

@@ -303,6 +303,10 @@ public class WifiService extends IWifiManager.Stub {
mWifiStateMachine.sendMessage(Message.obtain(msg)); mWifiStateMachine.sendMessage(Message.obtain(msg));
break; break;
} }
case WifiManager.RSSI_PKTCNT_FETCH: {
mWifiStateMachine.sendMessage(Message.obtain(msg));
break;
}
default: { default: {
Slog.d(TAG, "WifiServicehandler.handleMessage ignoring msg=" + msg); Slog.d(TAG, "WifiServicehandler.handleMessage ignoring msg=" + msg);
break; break;

View File

@@ -0,0 +1,71 @@
/*
* Copyright (C) 2012 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.
*/
package android.net.wifi;
import android.os.Parcel;
import android.os.Parcelable;
/**
* Bundle of RSSI and packet count information, for WiFi watchdog
*
* @see WifiWatchdogStateMachine
*
* @hide
*/
public class RssiPacketCountInfo implements Parcelable {
public int rssi;
public int txgood;
public int txbad;
public RssiPacketCountInfo() {
rssi = txgood = txbad = 0;
}
private RssiPacketCountInfo(Parcel in) {
rssi = in.readInt();
txgood = in.readInt();
txbad = in.readInt();
}
@Override
public void writeToParcel(Parcel out, int flags) {
out.writeInt(rssi);
out.writeInt(txgood);
out.writeInt(txbad);
}
@Override
public int describeContents() {
return 0;
}
public static final Parcelable.Creator<RssiPacketCountInfo> CREATOR =
new Parcelable.Creator<RssiPacketCountInfo>() {
@Override
public RssiPacketCountInfo createFromParcel(Parcel in) {
return new RssiPacketCountInfo(in);
}
@Override
public RssiPacketCountInfo[] newArray(int size) {
return new RssiPacketCountInfo[size];
}
};
}

View File

@@ -905,6 +905,17 @@ public class WifiManager {
return getWifiState() == WIFI_STATE_ENABLED; return getWifiState() == WIFI_STATE_ENABLED;
} }
/**
* Return TX packet counter, for CTS test of WiFi watchdog.
* @param listener is the interface to receive result
*
* @hide for CTS test only
*/
public void getTxPacketCount(TxPacketCountListener listener) {
validateChannel();
mAsyncChannel.sendMessage(RSSI_PKTCNT_FETCH, 0, putListener(listener));
}
/** /**
* Calculates the level of the signal. This should be used any time a signal * Calculates the level of the signal. This should be used any time a signal
* is being shown. * is being shown.
@@ -1143,11 +1154,18 @@ public class WifiManager {
/** @hide */ /** @hide */
public static final int DISABLE_NETWORK_SUCCEEDED = BASE + 19; public static final int DISABLE_NETWORK_SUCCEEDED = BASE + 19;
/** @hide */
public static final int RSSI_PKTCNT_FETCH = BASE + 20;
/** @hide */
public static final int RSSI_PKTCNT_FETCH_SUCCEEDED = BASE + 21;
/** @hide */
public static final int RSSI_PKTCNT_FETCH_FAILED = BASE + 22;
/* For system use only */ /* For system use only */
/** @hide */ /** @hide */
public static final int ENABLE_TRAFFIC_STATS_POLL = BASE + 21; public static final int ENABLE_TRAFFIC_STATS_POLL = BASE + 31;
/** @hide */ /** @hide */
public static final int TRAFFIC_STATS_POLL = BASE + 22; public static final int TRAFFIC_STATS_POLL = BASE + 32;
/** /**
@@ -1212,6 +1230,21 @@ public class WifiManager {
public void onFailure(int reason); public void onFailure(int reason);
} }
/** Interface for callback invocation on a TX packet count poll action {@hide} */
public interface TxPacketCountListener {
/**
* The operation succeeded
* @param count TX packet counter
*/
public void onSuccess(int count);
/**
* The operation failed
* @param reason The reason for failure could be one of
* {@link #ERROR}, {@link #IN_PROGRESS} or {@link #BUSY}
*/
public void onFailure(int reason);
}
private class ServiceHandler extends Handler { private class ServiceHandler extends Handler {
ServiceHandler(Looper looper) { ServiceHandler(Looper looper) {
super(looper); super(looper);
@@ -1281,6 +1314,20 @@ public class WifiManager {
((WpsListener) listener).onFailure(message.arg1); ((WpsListener) listener).onFailure(message.arg1);
} }
break; break;
case WifiManager.RSSI_PKTCNT_FETCH_SUCCEEDED:
if (listener != null) {
RssiPacketCountInfo info = (RssiPacketCountInfo) message.obj;
if (info != null)
((TxPacketCountListener) listener).onSuccess(info.txgood + info.txbad);
else
((TxPacketCountListener) listener).onFailure(ERROR);
}
break;
case WifiManager.RSSI_PKTCNT_FETCH_FAILED:
if (listener != null) {
((TxPacketCountListener) listener).onFailure(message.arg1);
}
break;
default: default:
//ignore //ignore
break; break;

View File

@@ -52,7 +52,7 @@ import android.net.LinkProperties;
import android.net.NetworkInfo; import android.net.NetworkInfo;
import android.net.NetworkInfo.DetailedState; import android.net.NetworkInfo.DetailedState;
import android.net.NetworkUtils; import android.net.NetworkUtils;
import android.net.wifi.WifiWatchdogStateMachine.RssiPktcntStat; import android.net.wifi.RssiPacketCountInfo;
import android.net.wifi.WpsResult.Status; import android.net.wifi.WpsResult.Status;
import android.net.wifi.p2p.WifiP2pManager; import android.net.wifi.p2p.WifiP2pManager;
import android.net.wifi.p2p.WifiP2pService; import android.net.wifi.p2p.WifiP2pService;
@@ -1189,7 +1189,7 @@ public class WifiStateMachine extends StateMachine {
case CMD_RSSI_POLL: case CMD_RSSI_POLL:
case CMD_DELAYED_STOP_DRIVER: case CMD_DELAYED_STOP_DRIVER:
case WifiMonitor.SCAN_RESULTS_EVENT: case WifiMonitor.SCAN_RESULTS_EVENT:
case WifiWatchdogStateMachine.RSSI_PKTCNT_FETCH: case WifiManager.RSSI_PKTCNT_FETCH:
return false; return false;
default: default:
return true; return true;
@@ -1543,7 +1543,7 @@ public class WifiStateMachine extends StateMachine {
/* /*
* Fetch TX packet counters on current connection * Fetch TX packet counters on current connection
*/ */
private void fetchPktcntNative(RssiPktcntStat stat) { private void fetchPktcntNative(RssiPacketCountInfo info) {
String pktcntPoll = mWifiNative.pktcntPoll(); String pktcntPoll = mWifiNative.pktcntPoll();
if (pktcntPoll != null) { if (pktcntPoll != null) {
@@ -1553,9 +1553,9 @@ public class WifiStateMachine extends StateMachine {
if (prop.length < 2) continue; if (prop.length < 2) continue;
try { try {
if (prop[0].equals("TXGOOD")) { if (prop[0].equals("TXGOOD")) {
stat.txgood = Integer.parseInt(prop[1]); info.txgood = Integer.parseInt(prop[1]);
} else if (prop[0].equals("TXBAD")) { } else if (prop[0].equals("TXBAD")) {
stat.txbad = Integer.parseInt(prop[1]); info.txbad = Integer.parseInt(prop[1]);
} }
} catch (NumberFormatException e) { } catch (NumberFormatException e) {
//Ignore //Ignore
@@ -1972,8 +1972,9 @@ public class WifiStateMachine extends StateMachine {
replyToMessage(message, WifiManager.DISABLE_NETWORK_FAILED, replyToMessage(message, WifiManager.DISABLE_NETWORK_FAILED,
WifiManager.BUSY); WifiManager.BUSY);
break; break;
case WifiWatchdogStateMachine.RSSI_PKTCNT_FETCH: case WifiManager.RSSI_PKTCNT_FETCH:
replyToMessage(message, WifiWatchdogStateMachine.RSSI_PKTCNT_FETCH_FAILED); replyToMessage(message, WifiManager.RSSI_PKTCNT_FETCH_FAILED,
WifiManager.BUSY);
break; break;
default: default:
loge("Error! unhandled message" + message); loge("Error! unhandled message" + message);
@@ -3176,13 +3177,12 @@ public class WifiStateMachine extends StateMachine {
mRssiPollToken, 0), POLL_RSSI_INTERVAL_MSECS); mRssiPollToken, 0), POLL_RSSI_INTERVAL_MSECS);
} }
break; break;
case WifiWatchdogStateMachine.RSSI_PKTCNT_FETCH: case WifiManager.RSSI_PKTCNT_FETCH:
RssiPktcntStat stat = (RssiPktcntStat) message.obj; RssiPacketCountInfo info = new RssiPacketCountInfo();
fetchRssiAndLinkSpeedNative(); fetchRssiAndLinkSpeedNative();
stat.rssi = mWifiInfo.getRssi(); info.rssi = mWifiInfo.getRssi();
fetchPktcntNative(stat); fetchPktcntNative(info);
replyToMessage(message, WifiWatchdogStateMachine.RSSI_PKTCNT_FETCH_SUCCEEDED, replyToMessage(message, WifiManager.RSSI_PKTCNT_FETCH_SUCCEEDED, info);
stat);
break; break;
default: default:
return NOT_HANDLED; return NOT_HANDLED;

View File

@@ -30,6 +30,7 @@ import android.net.ConnectivityManager;
import android.net.LinkProperties; import android.net.LinkProperties;
import android.net.NetworkInfo; import android.net.NetworkInfo;
import android.net.Uri; import android.net.Uri;
import android.net.wifi.RssiPacketCountInfo;
import android.os.Message; import android.os.Message;
import android.os.SystemClock; import android.os.SystemClock;
import android.provider.Settings; import android.provider.Settings;
@@ -105,9 +106,6 @@ public class WifiWatchdogStateMachine extends StateMachine {
/* Notifications from/to WifiStateMachine */ /* Notifications from/to WifiStateMachine */
static final int POOR_LINK_DETECTED = BASE + 21; static final int POOR_LINK_DETECTED = BASE + 21;
static final int GOOD_LINK_DETECTED = BASE + 22; static final int GOOD_LINK_DETECTED = BASE + 22;
static final int RSSI_PKTCNT_FETCH = BASE + 23;
static final int RSSI_PKTCNT_FETCH_SUCCEEDED = BASE + 24;
static final int RSSI_PKTCNT_FETCH_FAILED = BASE + 25;
/* /*
* RSSI levels as used by notification icon * RSSI levels as used by notification icon
@@ -123,7 +121,7 @@ public class WifiWatchdogStateMachine extends StateMachine {
* <p> * <p>
* Larger threshold is more adaptive but increases sampling cost. * Larger threshold is more adaptive but increases sampling cost.
*/ */
private static final int LINK_MONITOR_LEVEL_THRESHOLD = 4; private static final int LINK_MONITOR_LEVEL_THRESHOLD = WifiManager.RSSI_LEVELS - 1;
/** /**
* Remember packet loss statistics of how many BSSIDs. * Remember packet loss statistics of how many BSSIDs.
@@ -228,8 +226,8 @@ public class WifiWatchdogStateMachine extends StateMachine {
* Adaptive good link target to avoid flapping. * Adaptive good link target to avoid flapping.
* When a poor link is detected, a good link target is calculated as follows: * When a poor link is detected, a good link target is calculated as follows:
* <p> * <p>
* targetRSSI = min{ rssi | loss(rssi) < GOOD_LINK_LOSS_THRESHOLD } + rssi_adj[i], * targetRSSI = min { rssi | loss(rssi) < GOOD_LINK_LOSS_THRESHOLD } + rssi_adj[i],
* where rssi is in the above GOOD_LINK_RSSI_RANGE. * where rssi is within the above GOOD_LINK_RSSI_RANGE.
* targetCount = sample_count[i] . * targetCount = sample_count[i] .
* <p> * <p>
* While WiFi is being avoided, we keep monitoring its signal strength. * While WiFi is being avoided, we keep monitoring its signal strength.
@@ -241,7 +239,7 @@ public class WifiWatchdogStateMachine extends StateMachine {
* <p> * <p>
* Intuitively, larger index i makes it more difficult to get back to WiFi, avoiding flapping. * Intuitively, larger index i makes it more difficult to get back to WiFi, avoiding flapping.
* In experiments, (+9 dB / 30 counts) makes it quite difficult to achieve. * In experiments, (+9 dB / 30 counts) makes it quite difficult to achieve.
* Avoid using it unless flapping is really bad (say, last poor link is only 1min ago). * Avoid using it unless flapping is really bad (say, last poor link is < 1 min ago).
*/ */
private static final GoodLinkTarget[] GOOD_LINK_TARGET = { private static final GoodLinkTarget[] GOOD_LINK_TARGET = {
/* rssi_adj, sample_count, reduce_time */ /* rssi_adj, sample_count, reduce_time */
@@ -591,8 +589,8 @@ public class WifiWatchdogStateMachine extends StateMachine {
case EVENT_BSSID_CHANGE: case EVENT_BSSID_CHANGE:
case CMD_DELAYED_WALLED_GARDEN_CHECK: case CMD_DELAYED_WALLED_GARDEN_CHECK:
case CMD_RSSI_FETCH: case CMD_RSSI_FETCH:
case RSSI_PKTCNT_FETCH_SUCCEEDED: case WifiManager.RSSI_PKTCNT_FETCH_SUCCEEDED:
case RSSI_PKTCNT_FETCH_FAILED: case WifiManager.RSSI_PKTCNT_FETCH_FAILED:
// ignore // ignore
break; break;
case EVENT_SCREEN_ON: case EVENT_SCREEN_ON:
@@ -764,15 +762,15 @@ public class WifiWatchdogStateMachine extends StateMachine {
case CMD_RSSI_FETCH: case CMD_RSSI_FETCH:
if (msg.arg1 == mRssiFetchToken) { if (msg.arg1 == mRssiFetchToken) {
mWsmChannel.sendMessage(RSSI_PKTCNT_FETCH, new RssiPktcntStat()); mWsmChannel.sendMessage(WifiManager.RSSI_PKTCNT_FETCH);
sendMessageDelayed(obtainMessage(CMD_RSSI_FETCH, ++mRssiFetchToken, 0), sendMessageDelayed(obtainMessage(CMD_RSSI_FETCH, ++mRssiFetchToken, 0),
LINK_SAMPLING_INTERVAL_MS); LINK_SAMPLING_INTERVAL_MS);
} }
break; break;
case RSSI_PKTCNT_FETCH_SUCCEEDED: case WifiManager.RSSI_PKTCNT_FETCH_SUCCEEDED:
RssiPktcntStat stat = (RssiPktcntStat) msg.obj; RssiPacketCountInfo info = (RssiPacketCountInfo) msg.obj;
int rssi = stat.rssi; int rssi = info.rssi;
if (DBG) logd("Fetch RSSI succeed, rssi=" + rssi); if (DBG) logd("Fetch RSSI succeed, rssi=" + rssi);
long time = mCurrentBssid.mBssidAvoidTimeMax - SystemClock.elapsedRealtime(); long time = mCurrentBssid.mBssidAvoidTimeMax - SystemClock.elapsedRealtime();
@@ -795,7 +793,7 @@ public class WifiWatchdogStateMachine extends StateMachine {
} }
break; break;
case RSSI_PKTCNT_FETCH_FAILED: case WifiManager.RSSI_PKTCNT_FETCH_FAILED:
if (DBG) logd("RSSI_FETCH_FAILED"); if (DBG) logd("RSSI_FETCH_FAILED");
break; break;
@@ -944,18 +942,18 @@ public class WifiWatchdogStateMachine extends StateMachine {
if (!mIsScreenOn) { if (!mIsScreenOn) {
transitionTo(mOnlineState); transitionTo(mOnlineState);
} else if (msg.arg1 == mRssiFetchToken) { } else if (msg.arg1 == mRssiFetchToken) {
mWsmChannel.sendMessage(RSSI_PKTCNT_FETCH, new RssiPktcntStat()); mWsmChannel.sendMessage(WifiManager.RSSI_PKTCNT_FETCH);
sendMessageDelayed(obtainMessage(CMD_RSSI_FETCH, ++mRssiFetchToken, 0), sendMessageDelayed(obtainMessage(CMD_RSSI_FETCH, ++mRssiFetchToken, 0),
LINK_SAMPLING_INTERVAL_MS); LINK_SAMPLING_INTERVAL_MS);
} }
break; break;
case RSSI_PKTCNT_FETCH_SUCCEEDED: case WifiManager.RSSI_PKTCNT_FETCH_SUCCEEDED:
RssiPktcntStat stat = (RssiPktcntStat) msg.obj; RssiPacketCountInfo info = (RssiPacketCountInfo) msg.obj;
int rssi = stat.rssi; int rssi = info.rssi;
int mrssi = (mLastRssi + rssi) / 2; int mrssi = (mLastRssi + rssi) / 2;
int txbad = stat.txbad; int txbad = info.txbad;
int txgood = stat.txgood; int txgood = info.txgood;
if (DBG) logd("Fetch RSSI succeed, rssi=" + rssi + " mrssi=" + mrssi + " txbad=" if (DBG) logd("Fetch RSSI succeed, rssi=" + rssi + " mrssi=" + mrssi + " txbad="
+ txbad + " txgood=" + txgood); + txbad + " txgood=" + txgood);
@@ -1003,7 +1001,7 @@ public class WifiWatchdogStateMachine extends StateMachine {
mLastRssi = rssi; mLastRssi = rssi;
break; break;
case RSSI_PKTCNT_FETCH_FAILED: case WifiManager.RSSI_PKTCNT_FETCH_FAILED:
// can happen if we are waiting to get a disconnect notification // can happen if we are waiting to get a disconnect notification
if (DBG) logd("RSSI_FETCH_FAILED"); if (DBG) logd("RSSI_FETCH_FAILED");
break; break;
@@ -1158,15 +1156,6 @@ public class WifiWatchdogStateMachine extends StateMachine {
Log.e(TAG, s); Log.e(TAG, s);
} }
/**
* Bundle of RSSI and packet count information
*/
public class RssiPktcntStat {
public int rssi;
public int txgood;
public int txbad;
}
/** /**
* Bundle of good link count parameters * Bundle of good link count parameters
*/ */