From 2625befbb182bbadb3b71f77e3b83e6c105576ae Mon Sep 17 00:00:00 2001 From: Erik Kline Date: Tue, 21 Apr 2015 15:20:58 +0900 Subject: [PATCH 1/3] Final removal of CONNECTIVITY_ACTION_IMMEDIATE. Since the demise of the connectivity change delay, CONNECTIVITY_ACTION_IMMEDIATE has been sent out back to back with CONNECTIVITY_ACTION. Interested parties should watch for CONNECTIVITY_ACTION. Bug: 20013379 Change-Id: I072dddf95adb3bbd17fa1f7159d4ea848ade8f19 --- core/java/android/net/ConnectivityManager.java | 10 ---------- core/res/AndroidManifest.xml | 1 + .../java/com/android/server/ConnectivityService.java | 5 ----- 3 files changed, 1 insertion(+), 15 deletions(-) diff --git a/core/java/android/net/ConnectivityManager.java b/core/java/android/net/ConnectivityManager.java index 7b758bb80ff85..6359f084ebaeb 100644 --- a/core/java/android/net/ConnectivityManager.java +++ b/core/java/android/net/ConnectivityManager.java @@ -99,16 +99,6 @@ public class ConnectivityManager { @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION) public static final String CONNECTIVITY_ACTION = "android.net.conn.CONNECTIVITY_CHANGE"; - /** - * Identical to {@link #CONNECTIVITY_ACTION} broadcast, but sent without any - * historic {@link Settings.Global#CONNECTIVITY_CHANGE_DELAY}. - * - * @hide - */ - @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION) - public static final String CONNECTIVITY_ACTION_IMMEDIATE = - "android.net.conn.CONNECTIVITY_CHANGE_IMMEDIATE"; - /** * The device has connected to a network that has presented a captive * portal, which is blocking Internet connectivity. The user was presented diff --git a/core/res/AndroidManifest.xml b/core/res/AndroidManifest.xml index ed21e80fb18d7..6c1c3522f0475 100644 --- a/core/res/AndroidManifest.xml +++ b/core/res/AndroidManifest.xml @@ -210,6 +210,7 @@ + diff --git a/services/core/java/com/android/server/ConnectivityService.java b/services/core/java/com/android/server/ConnectivityService.java index ffda5a740384a..64a924a8a0fd1 100644 --- a/services/core/java/com/android/server/ConnectivityService.java +++ b/services/core/java/com/android/server/ConnectivityService.java @@ -19,7 +19,6 @@ package com.android.server; import static android.Manifest.permission.MANAGE_NETWORK_POLICY; import static android.Manifest.permission.RECEIVE_DATA_ACTIVITY_CHANGE; import static android.net.ConnectivityManager.CONNECTIVITY_ACTION; -import static android.net.ConnectivityManager.CONNECTIVITY_ACTION_IMMEDIATE; import static android.net.ConnectivityManager.NETID_UNSET; import static android.net.ConnectivityManager.TYPE_NONE; import static android.net.ConnectivityManager.TYPE_VPN; @@ -1368,7 +1367,6 @@ public class ConnectivityService extends IConnectivityManager.Stub public void sendConnectedBroadcast(NetworkInfo info) { enforceConnectivityInternalPermission(); - sendGeneralBroadcast(info, CONNECTIVITY_ACTION_IMMEDIATE); sendGeneralBroadcast(info, CONNECTIVITY_ACTION); } @@ -4203,9 +4201,6 @@ public class ConnectivityService extends IConnectivityManager.Stub } intent.putExtra(ConnectivityManager.EXTRA_INET_CONDITION, mDefaultInetConditionPublished); - final Intent immediateIntent = new Intent(intent); - immediateIntent.setAction(CONNECTIVITY_ACTION_IMMEDIATE); - sendStickyBroadcast(immediateIntent); sendStickyBroadcast(intent); if (newDefaultAgent != null) { sendConnectedBroadcast(newDefaultAgent.networkInfo); From f0e3a7044ba8970906b3611a13d14dfd8d0e8a0e Mon Sep 17 00:00:00 2001 From: Lorenzo Colitti Date: Wed, 22 Apr 2015 10:50:08 +0900 Subject: [PATCH 2/3] Log DHCP replies that we can't parse. Bug: 19704592 Bug: 20335221 Change-Id: I73def02a08345bd96f45cb970f9f251e6d5df2db --- services/net/java/android/net/dhcp/DhcpClient.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/services/net/java/android/net/dhcp/DhcpClient.java b/services/net/java/android/net/dhcp/DhcpClient.java index 372a377d5ee43..e1d17879748b0 100644 --- a/services/net/java/android/net/dhcp/DhcpClient.java +++ b/services/net/java/android/net/dhcp/DhcpClient.java @@ -92,6 +92,7 @@ public class DhcpClient extends BaseDhcpStateMachine { private static final boolean DBG = true; private static final boolean STATE_DBG = false; private static final boolean MSG_DBG = false; + private static final boolean PACKET_DBG = true; // Timers and timeouts. private static final int SECONDS = 1000; @@ -331,6 +332,9 @@ public class DhcpClient extends BaseDhcpStateMachine { if (packet != null) { maybeLog("Received packet: " + packet); sendMessage(CMD_RECEIVED_PACKET, packet); + } else if (PACKET_DBG) { + Log.d(TAG, + "Can't parse packet" + HexDump.dumpHexString(mPacket, 0, length)); } } catch (IOException|ErrnoException e) { if (!stopped) { From 052a0da4f748eff9392a0dbd41fc5948f7da4cb1 Mon Sep 17 00:00:00 2001 From: Lorenzo Colitti Date: Wed, 22 Apr 2015 15:38:01 +0900 Subject: [PATCH 3/3] Always send the DHCP client identifier. Currently we send it only in request packets, but not in discover packets. This might confuse servers because they might think that the discover and the request come from different clients. Also reorder the options in the request packet to match the order used by the legacy DHCP client. While I'm at it, fix the generation code for inform and decline packets, which we do not use. Bug: 19704592 Bug: 20335221 Change-Id: I1d45306e76dbd5da9cc4611e6df84a9f67346b2c --- .../net/java/android/net/dhcp/DhcpDeclinePacket.java | 5 ++++- .../net/java/android/net/dhcp/DhcpDiscoverPacket.java | 1 + .../net/java/android/net/dhcp/DhcpInformPacket.java | 9 +++------ services/net/java/android/net/dhcp/DhcpPacket.java | 10 ++++++++++ .../net/java/android/net/dhcp/DhcpRequestPacket.java | 8 +------- 5 files changed, 19 insertions(+), 14 deletions(-) diff --git a/services/net/java/android/net/dhcp/DhcpDeclinePacket.java b/services/net/java/android/net/dhcp/DhcpDeclinePacket.java index d0a3d34f4a93a..7ecdea7b89da2 100644 --- a/services/net/java/android/net/dhcp/DhcpDeclinePacket.java +++ b/services/net/java/android/net/dhcp/DhcpDeclinePacket.java @@ -53,6 +53,9 @@ class DhcpDeclinePacket extends DhcpPacket { * Adds optional parameters to the DECLINE packet. */ void finishPacket(ByteBuffer buffer) { - // None needed + addTlv(buffer, DHCP_MESSAGE_TYPE, DHCP_MESSAGE_TYPE_DECLINE); + addTlv(buffer, DHCP_CLIENT_IDENTIFIER, getClientId()); + // RFC 2131 says we MUST NOT include our common client TLVs or the parameter request list. + addTlvEnd(buffer); } } diff --git a/services/net/java/android/net/dhcp/DhcpDiscoverPacket.java b/services/net/java/android/net/dhcp/DhcpDiscoverPacket.java index 4676d44f713e5..91e6bd6469d80 100644 --- a/services/net/java/android/net/dhcp/DhcpDiscoverPacket.java +++ b/services/net/java/android/net/dhcp/DhcpDiscoverPacket.java @@ -52,6 +52,7 @@ class DhcpDiscoverPacket extends DhcpPacket { */ void finishPacket(ByteBuffer buffer) { addTlv(buffer, DHCP_MESSAGE_TYPE, DHCP_MESSAGE_TYPE_DISCOVER); + addTlv(buffer, DHCP_CLIENT_IDENTIFIER, getClientId()); addCommonClientTlvs(buffer); addTlv(buffer, DHCP_PARAMETER_LIST, mRequestedParams); addTlvEnd(buffer); diff --git a/services/net/java/android/net/dhcp/DhcpInformPacket.java b/services/net/java/android/net/dhcp/DhcpInformPacket.java index 6d8d09c6c564b..7a83466c6e054 100644 --- a/services/net/java/android/net/dhcp/DhcpInformPacket.java +++ b/services/net/java/android/net/dhcp/DhcpInformPacket.java @@ -53,12 +53,9 @@ class DhcpInformPacket extends DhcpPacket { * Adds additional parameters to the INFORM packet. */ void finishPacket(ByteBuffer buffer) { - byte[] clientId = new byte[7]; - - clientId[0] = CLIENT_ID_ETHER; - System.arraycopy(mClientMac, 0, clientId, 1, 6); - - addTlv(buffer, DHCP_MESSAGE_TYPE, DHCP_MESSAGE_TYPE_REQUEST); + addTlv(buffer, DHCP_MESSAGE_TYPE, DHCP_MESSAGE_TYPE_INFORM); + addTlv(buffer, DHCP_CLIENT_IDENTIFIER, getClientId()); + addCommonClientTlvs(buffer); addTlv(buffer, DHCP_PARAMETER_LIST, mRequestedParams); addTlvEnd(buffer); } diff --git a/services/net/java/android/net/dhcp/DhcpPacket.java b/services/net/java/android/net/dhcp/DhcpPacket.java index 0c51ef8ecaed5..b923b1bf25fb6 100644 --- a/services/net/java/android/net/dhcp/DhcpPacket.java +++ b/services/net/java/android/net/dhcp/DhcpPacket.java @@ -290,6 +290,16 @@ abstract class DhcpPacket { return mClientMac; } + /** + * Returns the client ID. This follows RFC 2132 and is based on the hardware address. + */ + public byte[] getClientId() { + byte[] clientId = new byte[mClientMac.length + 1]; + clientId[0] = CLIENT_ID_ETHER; + System.arraycopy(mClientMac, 0, clientId, 1, mClientMac.length); + return clientId; + } + /** * Creates a new L3 packet (including IP header) containing the * DHCP udp packet. This method relies upon the delegated method diff --git a/services/net/java/android/net/dhcp/DhcpRequestPacket.java b/services/net/java/android/net/dhcp/DhcpRequestPacket.java index 5611476d4a25f..4f9aa01151ca2 100644 --- a/services/net/java/android/net/dhcp/DhcpRequestPacket.java +++ b/services/net/java/android/net/dhcp/DhcpRequestPacket.java @@ -56,20 +56,14 @@ class DhcpRequestPacket extends DhcpPacket { * Adds the optional parameters to the client-generated REQUEST packet. */ void finishPacket(ByteBuffer buffer) { - byte[] clientId = new byte[7]; - - // assemble client identifier - clientId[0] = CLIENT_ID_ETHER; - System.arraycopy(mClientMac, 0, clientId, 1, 6); - addTlv(buffer, DHCP_MESSAGE_TYPE, DHCP_MESSAGE_TYPE_REQUEST); + addTlv(buffer, DHCP_CLIENT_IDENTIFIER, getClientId()); if (!INADDR_ANY.equals(mRequestedIp)) { addTlv(buffer, DHCP_REQUESTED_IP, mRequestedIp); } if (!INADDR_ANY.equals(mServerIdentifier)) { addTlv(buffer, DHCP_SERVER_IDENTIFIER, mServerIdentifier); } - addTlv(buffer, DHCP_CLIENT_IDENTIFIER, clientId); addCommonClientTlvs(buffer); addTlv(buffer, DHCP_PARAMETER_LIST, mRequestedParams); addTlvEnd(buffer);