diff options
| -rw-r--r-- | core/java/android/net/metrics/DhcpClientEvent.java | 4 | ||||
| -rw-r--r-- | core/java/android/net/metrics/DhcpErrorEvent.java | 20 | ||||
| -rw-r--r-- | services/net/java/android/net/dhcp/DhcpClient.java | 13 | ||||
| -rw-r--r-- | services/net/java/android/net/dhcp/DhcpPacket.java | 63 |
4 files changed, 54 insertions, 46 deletions
diff --git a/core/java/android/net/metrics/DhcpClientEvent.java b/core/java/android/net/metrics/DhcpClientEvent.java index 7b4466439e68..9213744940a1 100644 --- a/core/java/android/net/metrics/DhcpClientEvent.java +++ b/core/java/android/net/metrics/DhcpClientEvent.java @@ -54,7 +54,7 @@ public class DhcpClientEvent extends IpConnectivityEvent implements Parcelable { } }; - public static void logEvent(int eventType, String ifName, String msg) { - IpConnectivityEvent.logEvent(eventType, new DhcpClientEvent(ifName, msg)); + public static void logStateEvent(String ifName, String state) { + logEvent(IpConnectivityEvent.IPCE_DHCP_STATE_CHANGE, new DhcpClientEvent(ifName, state)); } }; diff --git a/core/java/android/net/metrics/DhcpErrorEvent.java b/core/java/android/net/metrics/DhcpErrorEvent.java index 386982375087..f6f98495d77c 100644 --- a/core/java/android/net/metrics/DhcpErrorEvent.java +++ b/core/java/android/net/metrics/DhcpErrorEvent.java @@ -48,7 +48,9 @@ public class DhcpErrorEvent extends IpConnectivityEvent implements Parcelable { public static final int DHCP_UNKNOWN_MSG_TYPE = makeErrorCode(DHCP_ERROR, 5); public static final int BUFFER_UNDERFLOW = makeErrorCode(MISC_ERROR, 1); + public static final int RECEIVE_ERROR = makeErrorCode(MISC_ERROR, 2); + public final String ifName; // error code byte format (MSB to LSB): // byte 0: error type // byte 1: error subtype @@ -56,15 +58,18 @@ public class DhcpErrorEvent extends IpConnectivityEvent implements Parcelable { // byte 3: optional code public final int errorCode; - private DhcpErrorEvent(int errorCode) { + private DhcpErrorEvent(String ifName, int errorCode) { + this.ifName = ifName; this.errorCode = errorCode; } private DhcpErrorEvent(Parcel in) { + this.ifName = in.readString(); this.errorCode = in.readInt(); } public void writeToParcel(Parcel out, int flags) { + out.writeString(ifName); out.writeInt(errorCode); } @@ -79,12 +84,17 @@ public class DhcpErrorEvent extends IpConnectivityEvent implements Parcelable { } }; - public static void logEvent(int errorCode) { - IpConnectivityEvent.logEvent(IPCE_DHCP_PARSE_ERROR, new DhcpErrorEvent(errorCode)); + public static void logParseError(String ifName, int errorCode) { + IpConnectivityEvent.logEvent(IPCE_DHCP_PARSE_ERROR, new DhcpErrorEvent(ifName, errorCode)); } - public static void logEvent(int errorCode, int option) { - logEvent((0xFFFF0000 & errorCode) | (0xFF & option)); + public static void logReceiveError(String ifName) { + IpConnectivityEvent.logEvent(IPCE_DHCP_RECV_ERROR, + new DhcpErrorEvent(ifName, RECEIVE_ERROR)); + } + + public static int errorCodeWithOption(int errorCode, int option) { + return (0xFFFF0000 & errorCode) | (0xFF & option); } private static int makeErrorCode(int type, int subtype) { diff --git a/services/net/java/android/net/dhcp/DhcpClient.java b/services/net/java/android/net/dhcp/DhcpClient.java index 804fa0347bff..52701d532e1a 100644 --- a/services/net/java/android/net/dhcp/DhcpClient.java +++ b/services/net/java/android/net/dhcp/DhcpClient.java @@ -30,8 +30,8 @@ import android.net.DhcpResults; import android.net.InterfaceConfiguration; import android.net.LinkAddress; import android.net.NetworkUtils; -import android.net.metrics.IpConnectivityEvent; import android.net.metrics.DhcpClientEvent; +import android.net.metrics.DhcpErrorEvent; import android.os.IBinder; import android.os.INetworkManagementService; import android.os.Message; @@ -358,15 +358,13 @@ public class DhcpClient extends StateMachine { if (!mStopped) { Log.e(TAG, "Read error", e); } - DhcpClientEvent.logEvent(IpConnectivityEvent.IPCE_DHCP_RECV_ERROR, - mIfaceName, e.getMessage()); + DhcpErrorEvent.logReceiveError(mIfaceName); } catch (DhcpPacket.ParseException e) { Log.e(TAG, "Can't parse packet: " + e.getMessage()); if (PACKET_DBG) { Log.d(TAG, HexDump.dumpHexString(mPacket, 0, length)); } - DhcpClientEvent.logEvent(IpConnectivityEvent.IPCE_DHCP_PARSE_ERROR, mIfaceName, - e.getMessage()); + DhcpErrorEvent.logParseError(mIfaceName, e.errorCode); } } if (DBG) Log.d(TAG, "Receive thread stopped"); @@ -463,9 +461,8 @@ public class DhcpClient extends StateMachine { abstract class LoggingState extends State { public void enter() { - String msg = "Entering state " + getName(); - if (STATE_DBG) Log.d(TAG, msg); - DhcpClientEvent.logEvent(IpConnectivityEvent.IPCE_DHCP_STATE_CHANGE, mIfaceName, msg); + if (STATE_DBG) Log.d(TAG, "Entering state " + getName()); + DhcpClientEvent.logStateEvent(mIfaceName, getName()); } private String messageName(int what) { diff --git a/services/net/java/android/net/dhcp/DhcpPacket.java b/services/net/java/android/net/dhcp/DhcpPacket.java index b184fe51c7d1..9aa66fe0ffa8 100644 --- a/services/net/java/android/net/dhcp/DhcpPacket.java +++ b/services/net/java/android/net/dhcp/DhcpPacket.java @@ -709,8 +709,10 @@ abstract class DhcpPacket { } public static class ParseException extends Exception { - public ParseException(String msg, Object... args) { + public final int errorCode; + public ParseException(int errorCode, String msg, Object... args) { super(String.format(msg, args)); + this.errorCode = errorCode; } } @@ -766,9 +768,8 @@ abstract class DhcpPacket { // check to see if we need to parse L2, IP, and UDP encaps if (pktType == ENCAP_L2) { if (packet.remaining() < MIN_PACKET_LENGTH_L2) { - DhcpErrorEvent.logEvent(DhcpErrorEvent.L2_TOO_SHORT); - throw new ParseException("L2 packet too short, %d < %d", - packet.remaining(), MIN_PACKET_LENGTH_L2); + throw new ParseException(DhcpErrorEvent.L2_TOO_SHORT, + "L2 packet too short, %d < %d", packet.remaining(), MIN_PACKET_LENGTH_L2); } byte[] l2dst = new byte[6]; @@ -780,24 +781,22 @@ abstract class DhcpPacket { short l2type = packet.getShort(); if (l2type != OsConstants.ETH_P_IP) { - DhcpErrorEvent.logEvent(DhcpErrorEvent.L2_WRONG_ETH_TYPE); - throw new ParseException("Unexpected L2 type 0x%04x, expected 0x%04x", - l2type, OsConstants.ETH_P_IP); + throw new ParseException(DhcpErrorEvent.L2_WRONG_ETH_TYPE, + "Unexpected L2 type 0x%04x, expected 0x%04x", l2type, OsConstants.ETH_P_IP); } } if (pktType <= ENCAP_L3) { if (packet.remaining() < MIN_PACKET_LENGTH_L3) { - DhcpErrorEvent.logEvent(DhcpErrorEvent.L3_TOO_SHORT); - throw new ParseException("L3 packet too short, %d < %d", - packet.remaining(), MIN_PACKET_LENGTH_L3); + throw new ParseException(DhcpErrorEvent.L3_TOO_SHORT, + "L3 packet too short, %d < %d", packet.remaining(), MIN_PACKET_LENGTH_L3); } byte ipTypeAndLength = packet.get(); int ipVersion = (ipTypeAndLength & 0xf0) >> 4; if (ipVersion != 4) { - DhcpErrorEvent.logEvent(DhcpErrorEvent.L3_NOT_IPV4); - throw new ParseException("Invalid IP version %d", ipVersion); + throw new ParseException( + DhcpErrorEvent.L3_NOT_IPV4, "Invalid IP version %d", ipVersion); } // System.out.println("ipType is " + ipType); @@ -814,8 +813,8 @@ abstract class DhcpPacket { ipDst = readIpAddress(packet); if (ipProto != IP_TYPE_UDP) { - DhcpErrorEvent.logEvent(DhcpErrorEvent.L4_NOT_UDP); - throw new ParseException("Protocol not UDP: %d", ipProto); + throw new ParseException( + DhcpErrorEvent.L4_NOT_UDP, "Protocol not UDP: %d", ipProto); } // Skip options. This cannot cause us to read beyond the end of the buffer because the @@ -841,15 +840,15 @@ abstract class DhcpPacket { // socket to drop packets that don't have the right source ports. However, it's // possible that a packet arrives between when the socket is bound and when the // filter is set. http://b/26696823 . - DhcpErrorEvent.logEvent(DhcpErrorEvent.L4_WRONG_PORT); - throw new ParseException("Unexpected UDP ports %d->%d", udpSrcPort, udpDstPort); + throw new ParseException(DhcpErrorEvent.L4_WRONG_PORT, + "Unexpected UDP ports %d->%d", udpSrcPort, udpDstPort); } } // We need to check the length even for ENCAP_L3 because the IPv4 header is variable-length. if (pktType > ENCAP_BOOTP || packet.remaining() < MIN_PACKET_LENGTH_BOOTP) { - DhcpErrorEvent.logEvent(DhcpErrorEvent.BOOTP_TOO_SHORT); - throw new ParseException("Invalid type or BOOTP packet too short, %d < %d", + throw new ParseException(DhcpErrorEvent.BOOTP_TOO_SHORT, + "Invalid type or BOOTP packet too short, %d < %d", packet.remaining(), MIN_PACKET_LENGTH_BOOTP); } @@ -873,8 +872,8 @@ abstract class DhcpPacket { packet.get(ipv4addr); relayIp = (Inet4Address) Inet4Address.getByAddress(ipv4addr); } catch (UnknownHostException ex) { - DhcpErrorEvent.logEvent(DhcpErrorEvent.L3_INVALID_IP); - throw new ParseException("Invalid IPv4 address: %s", Arrays.toString(ipv4addr)); + throw new ParseException(DhcpErrorEvent.L3_INVALID_IP, + "Invalid IPv4 address: %s", Arrays.toString(ipv4addr)); } // Some DHCP servers have been known to announce invalid client hardware address values such @@ -898,9 +897,9 @@ abstract class DhcpPacket { int dhcpMagicCookie = packet.getInt(); if (dhcpMagicCookie != DHCP_MAGIC_COOKIE) { - DhcpErrorEvent.logEvent(DhcpErrorEvent.DHCP_BAD_MAGIC_COOKIE); - throw new ParseException("Bad magic cookie 0x%08x, should be 0x%08x", dhcpMagicCookie, - DHCP_MAGIC_COOKIE); + throw new ParseException(DhcpErrorEvent.DHCP_BAD_MAGIC_COOKIE, + "Bad magic cookie 0x%08x, should be 0x%08x", + dhcpMagicCookie, DHCP_MAGIC_COOKIE); } // parse options @@ -1009,15 +1008,17 @@ abstract class DhcpPacket { } if (expectedLen != optionLen) { - DhcpErrorEvent.logEvent( + final int errorCode = DhcpErrorEvent.errorCodeWithOption( DhcpErrorEvent.DHCP_INVALID_OPTION_LENGTH, optionType); - throw new ParseException("Invalid length %d for option %d, expected %d", + throw new ParseException(errorCode, + "Invalid length %d for option %d, expected %d", optionLen, optionType, expectedLen); } } } catch (BufferUnderflowException e) { - DhcpErrorEvent.logEvent(DhcpErrorEvent.BUFFER_UNDERFLOW, optionType); - throw new ParseException("BufferUnderflowException"); + final int errorCode = DhcpErrorEvent.errorCodeWithOption( + DhcpErrorEvent.BUFFER_UNDERFLOW, optionType); + throw new ParseException(errorCode, "BufferUnderflowException"); } } @@ -1025,8 +1026,8 @@ abstract class DhcpPacket { switch(dhcpType) { case (byte) 0xFF: - DhcpErrorEvent.logEvent(DhcpErrorEvent.DHCP_NO_MSG_TYPE); - throw new ParseException("No DHCP message type option"); + throw new ParseException(DhcpErrorEvent.DHCP_NO_MSG_TYPE, + "No DHCP message type option"); case DHCP_MESSAGE_TYPE_DISCOVER: newPacket = new DhcpDiscoverPacket( transactionId, secs, clientMac, broadcast); @@ -1059,8 +1060,8 @@ abstract class DhcpPacket { clientMac); break; default: - DhcpErrorEvent.logEvent(DhcpErrorEvent.DHCP_UNKNOWN_MSG_TYPE); - throw new ParseException("Unimplemented DHCP type %d", dhcpType); + throw new ParseException(DhcpErrorEvent.DHCP_UNKNOWN_MSG_TYPE, + "Unimplemented DHCP type %d", dhcpType); } newPacket.mBroadcastAddress = bcAddr; |