Skip to content
Snippets Groups Projects
Commit 1d3a1ccf authored by Avinankumar Vellore Suriyakumar's avatar Avinankumar Vellore Suriyakumar
Browse files

Add wifi association heuristic

Change-Id: I38176d1aa568e0583eda7b2a0fbe4393d32725f8
parent b9b98773
No related branches found
No related tags found
No related merge requests found
...@@ -27,9 +27,11 @@ public class DumpsysWifiStatsItem extends GenericItem { ...@@ -27,9 +27,11 @@ public class DumpsysWifiStatsItem extends GenericItem {
public static final String WIFI_DISCONNECT = "WIFI_DISCONNECT"; public static final String WIFI_DISCONNECT = "WIFI_DISCONNECT";
/** Constant for JSON output */ /** Constant for JSON output */
public static final String WIFI_SCAN = "WIFI_SCAN"; public static final String WIFI_SCAN = "WIFI_SCAN";
/** Constant for JSON output */
public static final String WIFI_ASSOCIATION = "WIFI_ASSOCIATION";
private static final Set<String> ATTRIBUTES = new HashSet<String>(Arrays.asList( private static final Set<String> ATTRIBUTES = new HashSet<String>(Arrays.asList(
WIFI_DISCONNECT, WIFI_SCAN)); WIFI_DISCONNECT, WIFI_SCAN, WIFI_ASSOCIATION));
/** /**
* The constructor for {@link DumpsysWifiStatsItem}. * The constructor for {@link DumpsysWifiStatsItem}.
...@@ -52,6 +54,13 @@ public class DumpsysWifiStatsItem extends GenericItem { ...@@ -52,6 +54,13 @@ public class DumpsysWifiStatsItem extends GenericItem {
setAttribute(WIFI_SCAN, numWifiScans); setAttribute(WIFI_SCAN, numWifiScans);
} }
/**
* Set number of times of wifi associations
*/
public void setNumWifiAssociation(int numWifiAssociations) {
setAttribute(WIFI_ASSOCIATION, numWifiAssociations);
}
/** /**
* Get the number of times wifi disconnected * Get the number of times wifi disconnected
*/ */
...@@ -65,4 +74,11 @@ public class DumpsysWifiStatsItem extends GenericItem { ...@@ -65,4 +74,11 @@ public class DumpsysWifiStatsItem extends GenericItem {
public int getNumWifiScans() { public int getNumWifiScans() {
return (int) getAttribute(WIFI_SCAN); return (int) getAttribute(WIFI_SCAN);
} }
/**
* Get the number of times wifi association event triggered
*/
public int getNumWifiAssociations() {
return (int) getAttribute(WIFI_ASSOCIATION);
}
} }
...@@ -40,6 +40,13 @@ public class DumpsysWifiStatsParser implements IParser { ...@@ -40,6 +40,13 @@ public class DumpsysWifiStatsParser implements IParser {
"^\\d+-\\d+ \\d+:\\d+:\\d+\\.\\d+ - Event \\[IFNAME=wlan0 CTRL-EVENT-DISCONNECTED " "^\\d+-\\d+ \\d+:\\d+:\\d+\\.\\d+ - Event \\[IFNAME=wlan0 CTRL-EVENT-DISCONNECTED "
+ "bssid=\\w+:\\w+:\\w+:\\w+:\\w+:\\w+ reason=\\d+(\\s*locally_generated=\\d+)?\\]"); + "bssid=\\w+:\\w+:\\w+:\\w+:\\w+:\\w+ reason=\\d+(\\s*locally_generated=\\d+)?\\]");
/**
* Matches: 01-21 18:17:23.15 - Event [IFNAME=wlan0 Trying to associate with SSID 'WL-power-2']
*/
private static final Pattern WIFI_ASSOCIATION = Pattern.compile(
"^\\d+-\\d+ \\d+:\\d+:\\d+\\.\\d+ - Event \\[IFNAME=wlan0 Trying to associate with "
+ "SSID \\'.*\\'\\]");
/** /**
* {@inheritDoc} * {@inheritDoc}
* *
...@@ -50,6 +57,7 @@ public class DumpsysWifiStatsParser implements IParser { ...@@ -50,6 +57,7 @@ public class DumpsysWifiStatsParser implements IParser {
DumpsysWifiStatsItem item = new DumpsysWifiStatsItem(); DumpsysWifiStatsItem item = new DumpsysWifiStatsItem();
int numWifiScans = 0; int numWifiScans = 0;
int numWifiDisconnects = 0; int numWifiDisconnects = 0;
int numWifiAssociations = 0;
for (String line : lines) { for (String line : lines) {
Matcher m = WIFI_SCAN.matcher(line); Matcher m = WIFI_SCAN.matcher(line);
if(m.matches()) { if(m.matches()) {
...@@ -59,10 +67,16 @@ public class DumpsysWifiStatsParser implements IParser { ...@@ -59,10 +67,16 @@ public class DumpsysWifiStatsParser implements IParser {
m = WIFI_DISCONNECT.matcher(line); m = WIFI_DISCONNECT.matcher(line);
if (m.matches()) { if (m.matches()) {
numWifiDisconnects++; numWifiDisconnects++;
continue;
}
m = WIFI_ASSOCIATION.matcher(line);
if (m.matches()) {
numWifiAssociations++;
} }
} }
item.setNumWifiScan(numWifiScans); item.setNumWifiScan(numWifiScans);
item.setNumWifiDisconnect(numWifiDisconnects); item.setNumWifiDisconnect(numWifiDisconnects);
item.setNumWifiAssociation(numWifiAssociations);
return item; return item;
} }
......
...@@ -31,11 +31,13 @@ public class WifiStatsRule extends AbstractPowerRule { ...@@ -31,11 +31,13 @@ public class WifiStatsRule extends AbstractPowerRule {
private static final String WIFI_STATS = "WIFI_STATS"; private static final String WIFI_STATS = "WIFI_STATS";
private static final int WIFI_DISCONNECT_THRESHOLD = 1; // wifi disconnect should never happen private static final int WIFI_DISCONNECT_THRESHOLD = 1; // wifi disconnect should never happen
private static final int WIFI_ASSOCIATION_THRESHOLD = 1;
// Wifi scans are scheduled by GSA every 285 seconds, anything more frequent is an issue // Wifi scans are scheduled by GSA every 285 seconds, anything more frequent is an issue
private static final long WIFI_SCAN_INTERVAL_THRESHOLD_MS = 285000; private static final long WIFI_SCAN_INTERVAL_THRESHOLD_MS = 285000;
private long mFrequentWifiScansIntervalSecs = 0; private long mFrequentWifiScansIntervalSecs = 0;
private int mNumFrequentWifiDisconnects = 0; private int mNumFrequentWifiDisconnects = 0;
private int mNumFrequentWifiAssociations = 0;
private BugreportItem mBugreportItem = null; private BugreportItem mBugreportItem = null;
...@@ -65,6 +67,9 @@ public class WifiStatsRule extends AbstractPowerRule { ...@@ -65,6 +67,9 @@ public class WifiStatsRule extends AbstractPowerRule {
if (dumpsysWifiStatsItem.getNumWifiDisconnects() >= WIFI_DISCONNECT_THRESHOLD) { if (dumpsysWifiStatsItem.getNumWifiDisconnects() >= WIFI_DISCONNECT_THRESHOLD) {
mNumFrequentWifiDisconnects = dumpsysWifiStatsItem.getNumWifiDisconnects(); mNumFrequentWifiDisconnects = dumpsysWifiStatsItem.getNumWifiDisconnects();
} }
if (dumpsysWifiStatsItem.getNumWifiAssociations() > WIFI_ASSOCIATION_THRESHOLD) {
mNumFrequentWifiAssociations = dumpsysWifiStatsItem.getNumWifiAssociations();
}
} }
@Override @Override
...@@ -83,6 +88,12 @@ public class WifiStatsRule extends AbstractPowerRule { ...@@ -83,6 +88,12 @@ public class WifiStatsRule extends AbstractPowerRule {
analysis.append(String.format("Wifi got disconnected %d times. ", analysis.append(String.format("Wifi got disconnected %d times. ",
mNumFrequentWifiDisconnects)); mNumFrequentWifiDisconnects));
} }
if (mNumFrequentWifiAssociations == 0) {
analysis.append("No frequent wifi associations were observed. ");
} else {
analysis.append(String.format("Wifi got associated with AP %d times. ",
mNumFrequentWifiAssociations));
}
try { try {
wifiStatsAnalysis.put(WIFI_STATS, analysis.toString().trim()); wifiStatsAnalysis.put(WIFI_STATS, analysis.toString().trim());
} catch (JSONException e) { } catch (JSONException e) {
......
...@@ -56,11 +56,15 @@ public class DumpsysWifiStatsParserTest extends TestCase { ...@@ -56,11 +56,15 @@ public class DumpsysWifiStatsParserTest extends TestCase {
"10-08 13:06:25.363 - Event [IFNAME=wlan0 CTRL-EVENT-SCAN-STARTED ]", "10-08 13:06:25.363 - Event [IFNAME=wlan0 CTRL-EVENT-SCAN-STARTED ]",
"10-08 13:08:15.018 - Event [IFNAME=wlan0 CTRL-EVENT-DISCONNECTED " "10-08 13:08:15.018 - Event [IFNAME=wlan0 CTRL-EVENT-DISCONNECTED "
+ "bssid=9c:1c:12:e8:72:d2 reason=3 locally_generated=1]", + "bssid=9c:1c:12:e8:72:d2 reason=3 locally_generated=1]",
"10-08 13:08:15.324 - wlan0: 442:IFNAME=wlan0 ENABLE_NETWORK 0 -> true"); "10-08 13:08:15.324 - wlan0: 442:IFNAME=wlan0 ENABLE_NETWORK 0 -> true",
"01-21 13:17:23.1 - Event [IFNAME=wlan0 Trying to associate with SSID 'WL-power']",
"01-21 13:18:23.1 - Event [IFNAME=wlan0 Trying to associate with SSID 'WL-power']",
"01-21 13:18:23.1 - Event [IFNAME=wlan0 Trying to associate with SSID 'WL-power']");
DumpsysWifiStatsItem wifiStats = new DumpsysWifiStatsParser().parse(inputBlock); DumpsysWifiStatsItem wifiStats = new DumpsysWifiStatsParser().parse(inputBlock);
assertEquals(2, wifiStats.getNumWifiDisconnects()); assertEquals(2, wifiStats.getNumWifiDisconnects());
assertEquals(3, wifiStats.getNumWifiScans()); assertEquals(3, wifiStats.getNumWifiScans());
assertEquals(3, wifiStats.getNumWifiAssociations());
} }
/** /**
...@@ -93,6 +97,7 @@ public class DumpsysWifiStatsParserTest extends TestCase { ...@@ -93,6 +97,7 @@ public class DumpsysWifiStatsParserTest extends TestCase {
DumpsysWifiStatsItem wifiStats = new DumpsysWifiStatsParser().parse(inputBlock); DumpsysWifiStatsItem wifiStats = new DumpsysWifiStatsParser().parse(inputBlock);
assertEquals(0, wifiStats.getNumWifiDisconnects()); assertEquals(0, wifiStats.getNumWifiDisconnects());
assertEquals(0, wifiStats.getNumWifiScans()); assertEquals(0, wifiStats.getNumWifiScans());
assertEquals(0, wifiStats.getNumWifiAssociations());
} }
} }
...@@ -20,10 +20,6 @@ import com.android.loganalysis.item.BugreportItem; ...@@ -20,10 +20,6 @@ import com.android.loganalysis.item.BugreportItem;
import com.android.loganalysis.item.DumpsysBatteryStatsItem; import com.android.loganalysis.item.DumpsysBatteryStatsItem;
import com.android.loganalysis.item.DumpsysItem; import com.android.loganalysis.item.DumpsysItem;
import com.android.loganalysis.item.DumpsysWifiStatsItem; import com.android.loganalysis.item.DumpsysWifiStatsItem;
import com.android.loganalysis.parser.BugreportParser;
import java.util.Arrays;
import java.util.List;
import junit.framework.TestCase; import junit.framework.TestCase;
...@@ -58,6 +54,7 @@ public class WifiStatsRuleTest extends TestCase { ...@@ -58,6 +54,7 @@ public class WifiStatsRuleTest extends TestCase {
DumpsysWifiStatsItem wifiStats = new DumpsysWifiStatsItem(); DumpsysWifiStatsItem wifiStats = new DumpsysWifiStatsItem();
wifiStats.setNumWifiDisconnect(1); wifiStats.setNumWifiDisconnect(1);
wifiStats.setNumWifiScan(0); wifiStats.setNumWifiScan(0);
wifiStats.setNumWifiAssociation(0);
mDumpsys.setWifiStats(wifiStats); mDumpsys.setWifiStats(wifiStats);
WifiStatsRule wifiStatsRule = new WifiStatsRule(mBugreport); WifiStatsRule wifiStatsRule = new WifiStatsRule(mBugreport);
...@@ -66,13 +63,32 @@ public class WifiStatsRuleTest extends TestCase { ...@@ -66,13 +63,32 @@ public class WifiStatsRuleTest extends TestCase {
assertNotNull(analysis); assertNotNull(analysis);
assertTrue(analysis.has("WIFI_STATS")); assertTrue(analysis.has("WIFI_STATS"));
assertEquals(analysis.getString("WIFI_STATS"), assertEquals(analysis.getString("WIFI_STATS"),
"No apps requested for frequent wifi scans. Wifi got disconnected 1 times."); "No apps requested for frequent wifi scans. Wifi got disconnected 1 times. "
+ "No frequent wifi associations were observed.");
} }
public void testWifiScanAnalysis() throws Exception { public void testWifiScanAnalysis() throws Exception {
DumpsysWifiStatsItem wifiStats = new DumpsysWifiStatsItem(); DumpsysWifiStatsItem wifiStats = new DumpsysWifiStatsItem();
wifiStats.setNumWifiDisconnect(0); wifiStats.setNumWifiDisconnect(0);
wifiStats.setNumWifiScan(3); wifiStats.setNumWifiScan(3);
wifiStats.setNumWifiAssociation(0);
mDumpsys.setWifiStats(wifiStats);
WifiStatsRule wifiStatsRule = new WifiStatsRule(mBugreport);
wifiStatsRule.applyRule();
JSONObject analysis = wifiStatsRule.getAnalysis();
assertNotNull(analysis);
assertTrue(analysis.has("WIFI_STATS"));
assertEquals(analysis.getString("WIFI_STATS"),
"Wifi scans happened every 100 seconds. No frequent wifi disconnects were "
+ "observed. No frequent wifi associations were observed.");
}
public void testWifiAssociationAnalysis() throws Exception {
DumpsysWifiStatsItem wifiStats = new DumpsysWifiStatsItem();
wifiStats.setNumWifiDisconnect(0);
wifiStats.setNumWifiScan(0);
wifiStats.setNumWifiAssociation(3);
mDumpsys.setWifiStats(wifiStats); mDumpsys.setWifiStats(wifiStats);
WifiStatsRule wifiStatsRule = new WifiStatsRule(mBugreport); WifiStatsRule wifiStatsRule = new WifiStatsRule(mBugreport);
...@@ -81,7 +97,7 @@ public class WifiStatsRuleTest extends TestCase { ...@@ -81,7 +97,7 @@ public class WifiStatsRuleTest extends TestCase {
assertNotNull(analysis); assertNotNull(analysis);
assertTrue(analysis.has("WIFI_STATS")); assertTrue(analysis.has("WIFI_STATS"));
assertEquals(analysis.getString("WIFI_STATS"), assertEquals(analysis.getString("WIFI_STATS"),
"Wifi scans happened every 100 seconds. No frequent wifi disconnects were observed." "No apps requested for frequent wifi scans. No frequent wifi disconnects were "
); + "observed. Wifi got associated with AP 3 times.");
} }
} }
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment