Remove duplicated code in NetworkStateTrackerHandler.

Also use MessageUtils to decode message names.

Change-Id: Ic2c84de73fbf3eb10cc9634a083e5d3b3ffb807a
This commit is contained in:
Lorenzo Colitti
2016-04-05 17:52:16 +09:00
parent df78e84ef7
commit b54bea91bc

View File

@@ -116,6 +116,7 @@ import com.android.internal.net.VpnInfo;
import com.android.internal.net.VpnProfile; import com.android.internal.net.VpnProfile;
import com.android.internal.util.AsyncChannel; import com.android.internal.util.AsyncChannel;
import com.android.internal.util.IndentingPrintWriter; import com.android.internal.util.IndentingPrintWriter;
import com.android.internal.util.MessageUtils;
import com.android.internal.util.XmlUtils; import com.android.internal.util.XmlUtils;
import com.android.server.am.BatteryStatsService; import com.android.server.am.BatteryStatsService;
import com.android.server.connectivity.DataConnectionStats; import com.android.server.connectivity.DataConnectionStats;
@@ -224,6 +225,9 @@ public class ConnectivityService extends IConnectivityManager.Stub
private static final int ENABLED = 1; private static final int ENABLED = 1;
private static final int DISABLED = 0; private static final int DISABLED = 0;
private static final SparseArray<String> sMagicDecoderRing = MessageUtils.findMessageNames(
new Class[] { AsyncChannel.class, ConnectivityService.class, NetworkAgent.class });
private enum ReapUnvalidatedNetworks { private enum ReapUnvalidatedNetworks {
// Tear down networks that have no chance (e.g. even if validated) of becoming // Tear down networks that have no chance (e.g. even if validated) of becoming
// the highest scoring network satisfying a NetworkRequest. This should be passed when // the highest scoring network satisfying a NetworkRequest. This should be passed when
@@ -1891,11 +1895,12 @@ public class ConnectivityService extends IConnectivityManager.Stub
} }
} }
private boolean isLiveNetworkAgent(NetworkAgentInfo nai, String msg) { private boolean isLiveNetworkAgent(NetworkAgentInfo nai, int what) {
if (nai.network == null) return false; if (nai.network == null) return false;
final NetworkAgentInfo officialNai = getNetworkAgentInfoForNetwork(nai.network); final NetworkAgentInfo officialNai = getNetworkAgentInfoForNetwork(nai.network);
if (officialNai != null && officialNai.equals(nai)) return true; if (officialNai != null && officialNai.equals(nai)) return true;
if (officialNai != null || VDBG) { if (officialNai != null || VDBG) {
final String msg = sMagicDecoderRing.get(what, Integer.toString(what));
loge(msg + " - isLiveNetworkAgent found mismatched netId: " + officialNai + loge(msg + " - isLiveNetworkAgent found mismatched netId: " + officialNai +
" - " + nai); " - " + nai);
} }
@@ -1912,10 +1917,10 @@ public class ConnectivityService extends IConnectivityManager.Stub
super(looper); super(looper);
} }
@Override private boolean maybeHandleAsyncChannelMessage(Message msg) {
public void handleMessage(Message msg) {
NetworkInfo info;
switch (msg.what) { switch (msg.what) {
default:
return false;
case AsyncChannel.CMD_CHANNEL_HALF_CONNECTED: { case AsyncChannel.CMD_CHANNEL_HALF_CONNECTED: {
handleAsyncChannelHalfConnect(msg); handleAsyncChannelHalfConnect(msg);
break; break;
@@ -1929,69 +1934,58 @@ public class ConnectivityService extends IConnectivityManager.Stub
handleAsyncChannelDisconnected(msg); handleAsyncChannelDisconnected(msg);
break; break;
} }
}
return true;
}
private void maybeHandleNetworkAgentMessage(Message msg) {
NetworkAgentInfo nai = mNetworkAgentInfos.get(msg.replyTo);
if (nai == null) {
if (VDBG) {
final String what = sMagicDecoderRing.get(msg.what, Integer.toString(msg.what));
log(String.format("%s from unknown NetworkAgent", what));
}
return;
}
switch (msg.what) {
case NetworkAgent.EVENT_NETWORK_CAPABILITIES_CHANGED: { case NetworkAgent.EVENT_NETWORK_CAPABILITIES_CHANGED: {
NetworkAgentInfo nai = mNetworkAgentInfos.get(msg.replyTo); final NetworkCapabilities networkCapabilities = (NetworkCapabilities) msg.obj;
if (nai == null) { if (networkCapabilities.hasCapability(NET_CAPABILITY_CAPTIVE_PORTAL) ||
loge("EVENT_NETWORK_CAPABILITIES_CHANGED from unknown NetworkAgent"); networkCapabilities.hasCapability(NET_CAPABILITY_VALIDATED)) {
} else { Slog.wtf(TAG, "BUG: " + nai + " has CS-managed capability.");
final NetworkCapabilities networkCapabilities =
(NetworkCapabilities)msg.obj;
if (networkCapabilities.hasCapability(NET_CAPABILITY_CAPTIVE_PORTAL) ||
networkCapabilities.hasCapability(NET_CAPABILITY_VALIDATED)) {
Slog.wtf(TAG, "BUG: " + nai + " has CS-managed capability.");
}
if (nai.created && !nai.networkCapabilities.equalImmutableCapabilities(
networkCapabilities)) {
Slog.wtf(TAG, "BUG: " + nai + " changed immutable capabilities: "
+ nai.networkCapabilities + " -> " + networkCapabilities);
}
updateCapabilities(nai, networkCapabilities);
} }
if (nai.created && !nai.networkCapabilities.equalImmutableCapabilities(
networkCapabilities)) {
Slog.wtf(TAG, "BUG: " + nai + " changed immutable capabilities: "
+ nai.networkCapabilities + " -> " + networkCapabilities);
}
updateCapabilities(nai, networkCapabilities);
break; break;
} }
case NetworkAgent.EVENT_NETWORK_PROPERTIES_CHANGED: { case NetworkAgent.EVENT_NETWORK_PROPERTIES_CHANGED: {
NetworkAgentInfo nai = mNetworkAgentInfos.get(msg.replyTo); if (VDBG) {
if (nai == null) { log("Update of LinkProperties for " + nai.name() +
loge("NetworkAgent not found for EVENT_NETWORK_PROPERTIES_CHANGED"); "; created=" + nai.created);
} else {
if (VDBG) {
log("Update of LinkProperties for " + nai.name() +
"; created=" + nai.created);
}
LinkProperties oldLp = nai.linkProperties;
synchronized (nai) {
nai.linkProperties = (LinkProperties)msg.obj;
}
if (nai.created) updateLinkProperties(nai, oldLp);
} }
LinkProperties oldLp = nai.linkProperties;
synchronized (nai) {
nai.linkProperties = (LinkProperties)msg.obj;
}
if (nai.created) updateLinkProperties(nai, oldLp);
break; break;
} }
case NetworkAgent.EVENT_NETWORK_INFO_CHANGED: { case NetworkAgent.EVENT_NETWORK_INFO_CHANGED: {
NetworkAgentInfo nai = mNetworkAgentInfos.get(msg.replyTo); NetworkInfo info = (NetworkInfo) msg.obj;
if (nai == null) {
loge("EVENT_NETWORK_INFO_CHANGED from unknown NetworkAgent");
break;
}
info = (NetworkInfo) msg.obj;
updateNetworkInfo(nai, info); updateNetworkInfo(nai, info);
break; break;
} }
case NetworkAgent.EVENT_NETWORK_SCORE_CHANGED: { case NetworkAgent.EVENT_NETWORK_SCORE_CHANGED: {
NetworkAgentInfo nai = mNetworkAgentInfos.get(msg.replyTo);
if (nai == null) {
loge("EVENT_NETWORK_SCORE_CHANGED from unknown NetworkAgent");
break;
}
Integer score = (Integer) msg.obj; Integer score = (Integer) msg.obj;
if (score != null) updateNetworkScore(nai, score.intValue()); if (score != null) updateNetworkScore(nai, score.intValue());
break; break;
} }
case NetworkAgent.EVENT_UID_RANGES_ADDED: { case NetworkAgent.EVENT_UID_RANGES_ADDED: {
NetworkAgentInfo nai = mNetworkAgentInfos.get(msg.replyTo);
if (nai == null) {
loge("EVENT_UID_RANGES_ADDED from unknown NetworkAgent");
break;
}
try { try {
mNetd.addVpnUidRanges(nai.network.netId, (UidRange[])msg.obj); mNetd.addVpnUidRanges(nai.network.netId, (UidRange[])msg.obj);
} catch (Exception e) { } catch (Exception e) {
@@ -2001,11 +1995,6 @@ public class ConnectivityService extends IConnectivityManager.Stub
break; break;
} }
case NetworkAgent.EVENT_UID_RANGES_REMOVED: { case NetworkAgent.EVENT_UID_RANGES_REMOVED: {
NetworkAgentInfo nai = mNetworkAgentInfos.get(msg.replyTo);
if (nai == null) {
loge("EVENT_UID_RANGES_REMOVED from unknown NetworkAgent");
break;
}
try { try {
mNetd.removeVpnUidRanges(nai.network.netId, (UidRange[])msg.obj); mNetd.removeVpnUidRanges(nai.network.netId, (UidRange[])msg.obj);
} catch (Exception e) { } catch (Exception e) {
@@ -2015,11 +2004,6 @@ public class ConnectivityService extends IConnectivityManager.Stub
break; break;
} }
case NetworkAgent.EVENT_SET_EXPLICITLY_SELECTED: { case NetworkAgent.EVENT_SET_EXPLICITLY_SELECTED: {
NetworkAgentInfo nai = mNetworkAgentInfos.get(msg.replyTo);
if (nai == null) {
loge("EVENT_SET_EXPLICITLY_SELECTED from unknown NetworkAgent");
break;
}
if (nai.created && !nai.networkMisc.explicitlySelected) { if (nai.created && !nai.networkMisc.explicitlySelected) {
loge("ERROR: created network explicitly selected."); loge("ERROR: created network explicitly selected.");
} }
@@ -2028,17 +2012,19 @@ public class ConnectivityService extends IConnectivityManager.Stub
break; break;
} }
case NetworkAgent.EVENT_PACKET_KEEPALIVE: { case NetworkAgent.EVENT_PACKET_KEEPALIVE: {
NetworkAgentInfo nai = mNetworkAgentInfos.get(msg.replyTo);
if (nai == null) {
loge("EVENT_PACKET_KEEPALIVE from unknown NetworkAgent");
break;
}
mKeepaliveTracker.handleEventPacketKeepalive(nai, msg); mKeepaliveTracker.handleEventPacketKeepalive(nai, msg);
break; break;
} }
}
}
private boolean maybeHandleNetworkMonitorMessage(Message msg) {
switch (msg.what) {
default:
return false;
case NetworkMonitor.EVENT_NETWORK_TESTED: { case NetworkMonitor.EVENT_NETWORK_TESTED: {
NetworkAgentInfo nai = (NetworkAgentInfo)msg.obj; NetworkAgentInfo nai = (NetworkAgentInfo)msg.obj;
if (isLiveNetworkAgent(nai, "EVENT_NETWORK_TESTED")) { if (isLiveNetworkAgent(nai, msg.what)) {
final boolean valid = final boolean valid =
(msg.arg1 == NetworkMonitor.NETWORK_TEST_RESULT_VALID); (msg.arg1 == NetworkMonitor.NETWORK_TEST_RESULT_VALID);
if (DBG) log(nai.name() + " validation " + (valid ? " passed" : "failed")); if (DBG) log(nai.name() + " validation " + (valid ? " passed" : "failed"));
@@ -2061,7 +2047,7 @@ public class ConnectivityService extends IConnectivityManager.Stub
} }
case NetworkMonitor.EVENT_NETWORK_LINGER_COMPLETE: { case NetworkMonitor.EVENT_NETWORK_LINGER_COMPLETE: {
NetworkAgentInfo nai = (NetworkAgentInfo)msg.obj; NetworkAgentInfo nai = (NetworkAgentInfo)msg.obj;
if (isLiveNetworkAgent(nai, "EVENT_NETWORK_LINGER_COMPLETE")) { if (isLiveNetworkAgent(nai, msg.what)) {
handleLingerComplete(nai); handleLingerComplete(nai);
} }
break; break;
@@ -2093,6 +2079,14 @@ public class ConnectivityService extends IConnectivityManager.Stub
break; break;
} }
} }
return true;
}
@Override
public void handleMessage(Message msg) {
if (!maybeHandleAsyncChannelMessage(msg) && !maybeHandleNetworkMonitorMessage(msg)) {
maybeHandleNetworkAgentMessage(msg);
}
} }
} }