From e2ec94fbab91e5da515617adb2d0532f7b52727f Mon Sep 17 00:00:00 2001 From: Rebecca Silberstein Date: Thu, 24 Mar 2016 13:29:00 -0700 Subject: [PATCH] Add error logging for softap commands Log response code and message for softap commands to netd in failure cases. This CL adds a general function that logs an error if the executed command does not return the expected response code or response message. This function is general and can be used for commands other than softap. BUG: 27834948 Change-Id: I88a5f78ccd5fc8d15af9726f2f59df0c27d49a4f --- .../server/NetworkManagementService.java | 81 +++++++++++++++---- 1 file changed, 67 insertions(+), 14 deletions(-) diff --git a/services/core/java/com/android/server/NetworkManagementService.java b/services/core/java/com/android/server/NetworkManagementService.java index bf4df94e92e23..fffd850ac1cba 100644 --- a/services/core/java/com/android/server/NetworkManagementService.java +++ b/services/core/java/com/android/server/NetworkManagementService.java @@ -174,6 +174,16 @@ public class NetworkManagementService extends INetworkManagementService.Stub public static final int StrictCleartext = 617; } + /** + * String indicating a softap command. + */ + static final String SOFT_AP_COMMAND = "softap"; + + /** + * String passed back to netd connector indicating softap command success. + */ + static final String SOFT_AP_COMMAND_SUCCESS = "Ok"; + static final int DAEMON_MSG_MOBILE_CONN_REAL_TIME_INFO = 1; /** @@ -1426,20 +1436,48 @@ public class NetworkManagementService extends INetworkManagementService.Stub } } + /** + * Private method used to call execute for a command given the provided arguments. + * + * This function checks the returned NativeDaemonEvent for the provided expected response code + * and message. If either of these is not correct, an error is logged. + * + * @param String command The command to execute. + * @param Object[] args If needed, arguments for the command to execute. + * @param int expectedResponseCode The code expected to be returned in the corresponding event. + * @param String expectedResponseMessage The message expected in the returned event. + * @param String logMsg The message to log as an error (TAG will be applied). + */ + private void executeOrLogWithMessage(String command, Object[] args, + int expectedResponseCode, String expectedResponseMessage, String logMsg) + throws NativeDaemonConnectorException { + NativeDaemonEvent event = mConnector.execute(command, args); + if (event.getCode() != expectedResponseCode + || !event.getMessage().equals(expectedResponseMessage)) { + Log.e(TAG, logMsg + ": event = " + event); + } + } + @Override - public void startAccessPoint( - WifiConfiguration wifiConfig, String wlanIface) { + public void startAccessPoint(WifiConfiguration wifiConfig, String wlanIface) { mContext.enforceCallingOrSelfPermission(CONNECTIVITY_INTERNAL, TAG); + Object[] args; + String logMsg = "startAccessPoint Error setting up softap"; try { if (wifiConfig == null) { - mConnector.execute("softap", "set", wlanIface); + args = new Object[] {"set", wlanIface}; } else { - mConnector.execute("softap", "set", wlanIface, wifiConfig.SSID, - "broadcast", Integer.toString(wifiConfig.apChannel), - getSecurityType(wifiConfig), - new SensitiveArg(wifiConfig.preSharedKey)); + args = new Object[] {"set", wlanIface, wifiConfig.SSID, + "broadcast", Integer.toString(wifiConfig.apChannel), + getSecurityType(wifiConfig), new SensitiveArg(wifiConfig.preSharedKey)}; } - mConnector.execute("softap", "startap"); + executeOrLogWithMessage(SOFT_AP_COMMAND, args, NetdResponseCode.SoftapStatusResult, + SOFT_AP_COMMAND_SUCCESS, logMsg); + + logMsg = "startAccessPoint Error starting softap"; + args = new Object[] {"startap"}; + executeOrLogWithMessage(SOFT_AP_COMMAND, args, NetdResponseCode.SoftapStatusResult, + SOFT_AP_COMMAND_SUCCESS, logMsg); } catch (NativeDaemonConnectorException e) { throw e.rethrowAsParcelableException(); } @@ -1460,8 +1498,12 @@ public class NetworkManagementService extends INetworkManagementService.Stub @Override public void wifiFirmwareReload(String wlanIface, String mode) { mContext.enforceCallingOrSelfPermission(CONNECTIVITY_INTERNAL, TAG); + Object[] args = {"fwreload", wlanIface, mode}; + String logMsg = "wifiFirmwareReload Error reloading " + + wlanIface + " fw in " + mode + " mode"; try { - mConnector.execute("softap", "fwreload", wlanIface, mode); + executeOrLogWithMessage(SOFT_AP_COMMAND, args, NetdResponseCode.SoftapStatusResult, + SOFT_AP_COMMAND_SUCCESS, logMsg); } catch (NativeDaemonConnectorException e) { throw e.rethrowAsParcelableException(); } @@ -1470,8 +1512,12 @@ public class NetworkManagementService extends INetworkManagementService.Stub @Override public void stopAccessPoint(String wlanIface) { mContext.enforceCallingOrSelfPermission(CONNECTIVITY_INTERNAL, TAG); + Object[] args = {"stopap"}; + String logMsg = "stopAccessPoint Error stopping softap"; + try { - mConnector.execute("softap", "stopap"); + executeOrLogWithMessage(SOFT_AP_COMMAND, args, NetdResponseCode.SoftapStatusResult, + SOFT_AP_COMMAND_SUCCESS, logMsg); wifiFirmwareReload(wlanIface, "STA"); } catch (NativeDaemonConnectorException e) { throw e.rethrowAsParcelableException(); @@ -1481,14 +1527,21 @@ public class NetworkManagementService extends INetworkManagementService.Stub @Override public void setAccessPoint(WifiConfiguration wifiConfig, String wlanIface) { mContext.enforceCallingOrSelfPermission(CONNECTIVITY_INTERNAL, TAG); + Object[] args; + String logMsg = "startAccessPoint Error setting up softap"; try { if (wifiConfig == null) { - mConnector.execute("softap", "set", wlanIface); + args = new Object[] {"set", wlanIface}; } else { - mConnector.execute("softap", "set", wlanIface, wifiConfig.SSID, - "broadcast", "6", getSecurityType(wifiConfig), - new SensitiveArg(wifiConfig.preSharedKey)); + // TODO: understand why this is set to "6" instead of + // Integer.toString(wifiConfig.apChannel) as in startAccessPoint + // TODO: should startAccessPoint call this instead of repeating code? + args = new Object[] {"set", wlanIface, wifiConfig.SSID, + "broadcast", "6", + getSecurityType(wifiConfig), new SensitiveArg(wifiConfig.preSharedKey)}; } + executeOrLogWithMessage(SOFT_AP_COMMAND, args, NetdResponseCode.SoftapStatusResult, + SOFT_AP_COMMAND_SUCCESS, logMsg); } catch (NativeDaemonConnectorException e) { throw e.rethrowAsParcelableException(); }