summaryrefslogtreecommitdiffstats
path: root/services/net
diff options
context:
space:
mode:
authorLorenzo Colitti <lorenzo@google.com>2015-04-22 15:38:01 +0900
committerLorenzo Colitti <lorenzo@google.com>2015-04-22 16:44:10 +0900
commitf443bfc25e80ef46aedd616d4ecb4c95abd7be7a (patch)
tree4ce42645d6ceb91f065067402c06d4bdd334a2d5 /services/net
parent7428de195086d95ddc850f387442c8c0f21e7b0f (diff)
downloadframeworks_base-f443bfc25e80ef46aedd616d4ecb4c95abd7be7a.zip
frameworks_base-f443bfc25e80ef46aedd616d4ecb4c95abd7be7a.tar.gz
frameworks_base-f443bfc25e80ef46aedd616d4ecb4c95abd7be7a.tar.bz2
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
Diffstat (limited to 'services/net')
-rw-r--r--services/net/java/android/net/dhcp/DhcpDeclinePacket.java5
-rw-r--r--services/net/java/android/net/dhcp/DhcpDiscoverPacket.java1
-rw-r--r--services/net/java/android/net/dhcp/DhcpInformPacket.java9
-rw-r--r--services/net/java/android/net/dhcp/DhcpPacket.java10
-rw-r--r--services/net/java/android/net/dhcp/DhcpRequestPacket.java8
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 9d985ac..4a22b65 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 a031080..ed0fdc6 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 8bc7cdd..2434fc9 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 d41629d..a64ee6f 100644
--- a/services/net/java/android/net/dhcp/DhcpPacket.java
+++ b/services/net/java/android/net/dhcp/DhcpPacket.java
@@ -285,6 +285,16 @@ abstract class DhcpPacket {
}
/**
+ * 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
* finishPacket() to insert the per-packet contents.
diff --git a/services/net/java/android/net/dhcp/DhcpRequestPacket.java b/services/net/java/android/net/dhcp/DhcpRequestPacket.java
index 42b7b0c..5d378b8 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);