Skip to content

Commit dea6cb7

Browse files
isheriffAndroid (Google) Code Review
authored andcommitted
Merge "CTS test for WiFi watchdog - framework support." into jb-mr1-dev
2 parents 32e7bd9 + f630782 commit dea6cb7

File tree

5 files changed

+156
-45
lines changed

5 files changed

+156
-45
lines changed

services/java/com/android/server/WifiService.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -303,6 +303,10 @@ public void handleMessage(Message msg) {
303303
mWifiStateMachine.sendMessage(Message.obtain(msg));
304304
break;
305305
}
306+
case WifiManager.RSSI_PKTCNT_FETCH: {
307+
mWifiStateMachine.sendMessage(Message.obtain(msg));
308+
break;
309+
}
306310
default: {
307311
Slog.d(TAG, "WifiServicehandler.handleMessage ignoring msg=" + msg);
308312
break;
Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
/*
2+
* Copyright (C) 2012 The Android Open Source Project
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License");
5+
* you may not use this file except in compliance with the License.
6+
* You may obtain a copy of the License at
7+
*
8+
* http://www.apache.org/licenses/LICENSE-2.0
9+
*
10+
* Unless required by applicable law or agreed to in writing, software
11+
* distributed under the License is distributed on an "AS IS" BASIS,
12+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
* See the License for the specific language governing permissions and
14+
* limitations under the License.
15+
*/
16+
17+
package android.net.wifi;
18+
19+
import android.os.Parcel;
20+
import android.os.Parcelable;
21+
22+
/**
23+
* Bundle of RSSI and packet count information, for WiFi watchdog
24+
*
25+
* @see WifiWatchdogStateMachine
26+
*
27+
* @hide
28+
*/
29+
public class RssiPacketCountInfo implements Parcelable {
30+
31+
public int rssi;
32+
33+
public int txgood;
34+
35+
public int txbad;
36+
37+
public RssiPacketCountInfo() {
38+
rssi = txgood = txbad = 0;
39+
}
40+
41+
private RssiPacketCountInfo(Parcel in) {
42+
rssi = in.readInt();
43+
txgood = in.readInt();
44+
txbad = in.readInt();
45+
}
46+
47+
@Override
48+
public void writeToParcel(Parcel out, int flags) {
49+
out.writeInt(rssi);
50+
out.writeInt(txgood);
51+
out.writeInt(txbad);
52+
}
53+
54+
@Override
55+
public int describeContents() {
56+
return 0;
57+
}
58+
59+
public static final Parcelable.Creator<RssiPacketCountInfo> CREATOR =
60+
new Parcelable.Creator<RssiPacketCountInfo>() {
61+
@Override
62+
public RssiPacketCountInfo createFromParcel(Parcel in) {
63+
return new RssiPacketCountInfo(in);
64+
}
65+
66+
@Override
67+
public RssiPacketCountInfo[] newArray(int size) {
68+
return new RssiPacketCountInfo[size];
69+
}
70+
};
71+
}

wifi/java/android/net/wifi/WifiManager.java

Lines changed: 49 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -905,6 +905,17 @@ public boolean isWifiEnabled() {
905905
return getWifiState() == WIFI_STATE_ENABLED;
906906
}
907907

908+
/**
909+
* Return TX packet counter, for CTS test of WiFi watchdog.
910+
* @param listener is the interface to receive result
911+
*
912+
* @hide for CTS test only
913+
*/
914+
public void getTxPacketCount(TxPacketCountListener listener) {
915+
validateChannel();
916+
mAsyncChannel.sendMessage(RSSI_PKTCNT_FETCH, 0, putListener(listener));
917+
}
918+
908919
/**
909920
* Calculates the level of the signal. This should be used any time a signal
910921
* is being shown.
@@ -1143,11 +1154,18 @@ public boolean clearBlacklist() {
11431154
/** @hide */
11441155
public static final int DISABLE_NETWORK_SUCCEEDED = BASE + 19;
11451156

1157+
/** @hide */
1158+
public static final int RSSI_PKTCNT_FETCH = BASE + 20;
1159+
/** @hide */
1160+
public static final int RSSI_PKTCNT_FETCH_SUCCEEDED = BASE + 21;
1161+
/** @hide */
1162+
public static final int RSSI_PKTCNT_FETCH_FAILED = BASE + 22;
1163+
11461164
/* For system use only */
11471165
/** @hide */
1148-
public static final int ENABLE_TRAFFIC_STATS_POLL = BASE + 21;
1166+
public static final int ENABLE_TRAFFIC_STATS_POLL = BASE + 31;
11491167
/** @hide */
1150-
public static final int TRAFFIC_STATS_POLL = BASE + 22;
1168+
public static final int TRAFFIC_STATS_POLL = BASE + 32;
11511169

11521170

11531171
/**
@@ -1212,6 +1230,21 @@ public interface WpsListener {
12121230
public void onFailure(int reason);
12131231
}
12141232

1233+
/** Interface for callback invocation on a TX packet count poll action {@hide} */
1234+
public interface TxPacketCountListener {
1235+
/**
1236+
* The operation succeeded
1237+
* @param count TX packet counter
1238+
*/
1239+
public void onSuccess(int count);
1240+
/**
1241+
* The operation failed
1242+
* @param reason The reason for failure could be one of
1243+
* {@link #ERROR}, {@link #IN_PROGRESS} or {@link #BUSY}
1244+
*/
1245+
public void onFailure(int reason);
1246+
}
1247+
12151248
private class ServiceHandler extends Handler {
12161249
ServiceHandler(Looper looper) {
12171250
super(looper);
@@ -1281,6 +1314,20 @@ public void handleMessage(Message message) {
12811314
((WpsListener) listener).onFailure(message.arg1);
12821315
}
12831316
break;
1317+
case WifiManager.RSSI_PKTCNT_FETCH_SUCCEEDED:
1318+
if (listener != null) {
1319+
RssiPacketCountInfo info = (RssiPacketCountInfo) message.obj;
1320+
if (info != null)
1321+
((TxPacketCountListener) listener).onSuccess(info.txgood + info.txbad);
1322+
else
1323+
((TxPacketCountListener) listener).onFailure(ERROR);
1324+
}
1325+
break;
1326+
case WifiManager.RSSI_PKTCNT_FETCH_FAILED:
1327+
if (listener != null) {
1328+
((TxPacketCountListener) listener).onFailure(message.arg1);
1329+
}
1330+
break;
12841331
default:
12851332
//ignore
12861333
break;

wifi/java/android/net/wifi/WifiStateMachine.java

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@
5252
import android.net.NetworkInfo;
5353
import android.net.NetworkInfo.DetailedState;
5454
import android.net.NetworkUtils;
55-
import android.net.wifi.WifiWatchdogStateMachine.RssiPktcntStat;
55+
import android.net.wifi.RssiPacketCountInfo;
5656
import android.net.wifi.WpsResult.Status;
5757
import android.net.wifi.p2p.WifiP2pManager;
5858
import android.net.wifi.p2p.WifiP2pService;
@@ -1189,7 +1189,7 @@ protected boolean recordLogRec(Message msg) {
11891189
case CMD_RSSI_POLL:
11901190
case CMD_DELAYED_STOP_DRIVER:
11911191
case WifiMonitor.SCAN_RESULTS_EVENT:
1192-
case WifiWatchdogStateMachine.RSSI_PKTCNT_FETCH:
1192+
case WifiManager.RSSI_PKTCNT_FETCH:
11931193
return false;
11941194
default:
11951195
return true;
@@ -1543,7 +1543,7 @@ private void fetchRssiAndLinkSpeedNative() {
15431543
/*
15441544
* Fetch TX packet counters on current connection
15451545
*/
1546-
private void fetchPktcntNative(RssiPktcntStat stat) {
1546+
private void fetchPktcntNative(RssiPacketCountInfo info) {
15471547
String pktcntPoll = mWifiNative.pktcntPoll();
15481548

15491549
if (pktcntPoll != null) {
@@ -1553,9 +1553,9 @@ private void fetchPktcntNative(RssiPktcntStat stat) {
15531553
if (prop.length < 2) continue;
15541554
try {
15551555
if (prop[0].equals("TXGOOD")) {
1556-
stat.txgood = Integer.parseInt(prop[1]);
1556+
info.txgood = Integer.parseInt(prop[1]);
15571557
} else if (prop[0].equals("TXBAD")) {
1558-
stat.txbad = Integer.parseInt(prop[1]);
1558+
info.txbad = Integer.parseInt(prop[1]);
15591559
}
15601560
} catch (NumberFormatException e) {
15611561
//Ignore
@@ -1972,8 +1972,9 @@ public boolean processMessage(Message message) {
19721972
replyToMessage(message, WifiManager.DISABLE_NETWORK_FAILED,
19731973
WifiManager.BUSY);
19741974
break;
1975-
case WifiWatchdogStateMachine.RSSI_PKTCNT_FETCH:
1976-
replyToMessage(message, WifiWatchdogStateMachine.RSSI_PKTCNT_FETCH_FAILED);
1975+
case WifiManager.RSSI_PKTCNT_FETCH:
1976+
replyToMessage(message, WifiManager.RSSI_PKTCNT_FETCH_FAILED,
1977+
WifiManager.BUSY);
19771978
break;
19781979
default:
19791980
loge("Error! unhandled message" + message);
@@ -3176,13 +3177,12 @@ public boolean processMessage(Message message) {
31763177
mRssiPollToken, 0), POLL_RSSI_INTERVAL_MSECS);
31773178
}
31783179
break;
3179-
case WifiWatchdogStateMachine.RSSI_PKTCNT_FETCH:
3180-
RssiPktcntStat stat = (RssiPktcntStat) message.obj;
3180+
case WifiManager.RSSI_PKTCNT_FETCH:
3181+
RssiPacketCountInfo info = new RssiPacketCountInfo();
31813182
fetchRssiAndLinkSpeedNative();
3182-
stat.rssi = mWifiInfo.getRssi();
3183-
fetchPktcntNative(stat);
3184-
replyToMessage(message, WifiWatchdogStateMachine.RSSI_PKTCNT_FETCH_SUCCEEDED,
3185-
stat);
3183+
info.rssi = mWifiInfo.getRssi();
3184+
fetchPktcntNative(info);
3185+
replyToMessage(message, WifiManager.RSSI_PKTCNT_FETCH_SUCCEEDED, info);
31863186
break;
31873187
default:
31883188
return NOT_HANDLED;

wifi/java/android/net/wifi/WifiWatchdogStateMachine.java

Lines changed: 19 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@
3030
import android.net.LinkProperties;
3131
import android.net.NetworkInfo;
3232
import android.net.Uri;
33+
import android.net.wifi.RssiPacketCountInfo;
3334
import android.os.Message;
3435
import android.os.SystemClock;
3536
import android.provider.Settings;
@@ -105,9 +106,6 @@ public class WifiWatchdogStateMachine extends StateMachine {
105106
/* Notifications from/to WifiStateMachine */
106107
static final int POOR_LINK_DETECTED = BASE + 21;
107108
static final int GOOD_LINK_DETECTED = BASE + 22;
108-
static final int RSSI_PKTCNT_FETCH = BASE + 23;
109-
static final int RSSI_PKTCNT_FETCH_SUCCEEDED = BASE + 24;
110-
static final int RSSI_PKTCNT_FETCH_FAILED = BASE + 25;
111109

112110
/*
113111
* RSSI levels as used by notification icon
@@ -123,7 +121,7 @@ public class WifiWatchdogStateMachine extends StateMachine {
123121
* <p>
124122
* Larger threshold is more adaptive but increases sampling cost.
125123
*/
126-
private static final int LINK_MONITOR_LEVEL_THRESHOLD = 4;
124+
private static final int LINK_MONITOR_LEVEL_THRESHOLD = WifiManager.RSSI_LEVELS - 1;
127125

128126
/**
129127
* Remember packet loss statistics of how many BSSIDs.
@@ -228,8 +226,8 @@ public class WifiWatchdogStateMachine extends StateMachine {
228226
* Adaptive good link target to avoid flapping.
229227
* When a poor link is detected, a good link target is calculated as follows:
230228
* <p>
231-
* targetRSSI = min{ rssi | loss(rssi) < GOOD_LINK_LOSS_THRESHOLD } + rssi_adj[i],
232-
* where rssi is in the above GOOD_LINK_RSSI_RANGE.
229+
* targetRSSI = min { rssi | loss(rssi) < GOOD_LINK_LOSS_THRESHOLD } + rssi_adj[i],
230+
* where rssi is within the above GOOD_LINK_RSSI_RANGE.
233231
* targetCount = sample_count[i] .
234232
* <p>
235233
* While WiFi is being avoided, we keep monitoring its signal strength.
@@ -241,7 +239,7 @@ public class WifiWatchdogStateMachine extends StateMachine {
241239
* <p>
242240
* Intuitively, larger index i makes it more difficult to get back to WiFi, avoiding flapping.
243241
* In experiments, (+9 dB / 30 counts) makes it quite difficult to achieve.
244-
* Avoid using it unless flapping is really bad (say, last poor link is only 1min ago).
242+
* Avoid using it unless flapping is really bad (say, last poor link is < 1 min ago).
245243
*/
246244
private static final GoodLinkTarget[] GOOD_LINK_TARGET = {
247245
/* rssi_adj, sample_count, reduce_time */
@@ -591,8 +589,8 @@ public boolean processMessage(Message msg) {
591589
case EVENT_BSSID_CHANGE:
592590
case CMD_DELAYED_WALLED_GARDEN_CHECK:
593591
case CMD_RSSI_FETCH:
594-
case RSSI_PKTCNT_FETCH_SUCCEEDED:
595-
case RSSI_PKTCNT_FETCH_FAILED:
592+
case WifiManager.RSSI_PKTCNT_FETCH_SUCCEEDED:
593+
case WifiManager.RSSI_PKTCNT_FETCH_FAILED:
596594
// ignore
597595
break;
598596
case EVENT_SCREEN_ON:
@@ -764,15 +762,15 @@ public boolean processMessage(Message msg) {
764762

765763
case CMD_RSSI_FETCH:
766764
if (msg.arg1 == mRssiFetchToken) {
767-
mWsmChannel.sendMessage(RSSI_PKTCNT_FETCH, new RssiPktcntStat());
765+
mWsmChannel.sendMessage(WifiManager.RSSI_PKTCNT_FETCH);
768766
sendMessageDelayed(obtainMessage(CMD_RSSI_FETCH, ++mRssiFetchToken, 0),
769767
LINK_SAMPLING_INTERVAL_MS);
770768
}
771769
break;
772770

773-
case RSSI_PKTCNT_FETCH_SUCCEEDED:
774-
RssiPktcntStat stat = (RssiPktcntStat) msg.obj;
775-
int rssi = stat.rssi;
771+
case WifiManager.RSSI_PKTCNT_FETCH_SUCCEEDED:
772+
RssiPacketCountInfo info = (RssiPacketCountInfo) msg.obj;
773+
int rssi = info.rssi;
776774
if (DBG) logd("Fetch RSSI succeed, rssi=" + rssi);
777775

778776
long time = mCurrentBssid.mBssidAvoidTimeMax - SystemClock.elapsedRealtime();
@@ -795,7 +793,7 @@ public boolean processMessage(Message msg) {
795793
}
796794
break;
797795

798-
case RSSI_PKTCNT_FETCH_FAILED:
796+
case WifiManager.RSSI_PKTCNT_FETCH_FAILED:
799797
if (DBG) logd("RSSI_FETCH_FAILED");
800798
break;
801799

@@ -944,18 +942,18 @@ public boolean processMessage(Message msg) {
944942
if (!mIsScreenOn) {
945943
transitionTo(mOnlineState);
946944
} else if (msg.arg1 == mRssiFetchToken) {
947-
mWsmChannel.sendMessage(RSSI_PKTCNT_FETCH, new RssiPktcntStat());
945+
mWsmChannel.sendMessage(WifiManager.RSSI_PKTCNT_FETCH);
948946
sendMessageDelayed(obtainMessage(CMD_RSSI_FETCH, ++mRssiFetchToken, 0),
949947
LINK_SAMPLING_INTERVAL_MS);
950948
}
951949
break;
952950

953-
case RSSI_PKTCNT_FETCH_SUCCEEDED:
954-
RssiPktcntStat stat = (RssiPktcntStat) msg.obj;
955-
int rssi = stat.rssi;
951+
case WifiManager.RSSI_PKTCNT_FETCH_SUCCEEDED:
952+
RssiPacketCountInfo info = (RssiPacketCountInfo) msg.obj;
953+
int rssi = info.rssi;
956954
int mrssi = (mLastRssi + rssi) / 2;
957-
int txbad = stat.txbad;
958-
int txgood = stat.txgood;
955+
int txbad = info.txbad;
956+
int txgood = info.txgood;
959957
if (DBG) logd("Fetch RSSI succeed, rssi=" + rssi + " mrssi=" + mrssi + " txbad="
960958
+ txbad + " txgood=" + txgood);
961959

@@ -1003,7 +1001,7 @@ public boolean processMessage(Message msg) {
10031001
mLastRssi = rssi;
10041002
break;
10051003

1006-
case RSSI_PKTCNT_FETCH_FAILED:
1004+
case WifiManager.RSSI_PKTCNT_FETCH_FAILED:
10071005
// can happen if we are waiting to get a disconnect notification
10081006
if (DBG) logd("RSSI_FETCH_FAILED");
10091007
break;
@@ -1158,15 +1156,6 @@ private static void loge(String s) {
11581156
Log.e(TAG, s);
11591157
}
11601158

1161-
/**
1162-
* Bundle of RSSI and packet count information
1163-
*/
1164-
public class RssiPktcntStat {
1165-
public int rssi;
1166-
public int txgood;
1167-
public int txbad;
1168-
}
1169-
11701159
/**
11711160
* Bundle of good link count parameters
11721161
*/

0 commit comments

Comments
 (0)