35 Commits

Author SHA1 Message Date
Lorenzo Colitti
31e19f34f5 Don't attempt to stop the receive thread if we never started it.
If socket initialization fails, DhcpState#exit will call
mReceiveThread#stop and crash the system with an NPE. Make sure
we don't do that if mReceiveThread is null, and properly null it
out when exiting.

Bug: 23088314
Change-Id: I4378d8280f9d8588f5eaa8bd7ade61beab1c3ce2
2015-08-11 15:42:59 +09:00
Lorenzo Colitti
b0b3d0bcfb Fix two parsing bugs in new DHCP client.
1. We don't parse PAD options properly, leading in failure to
   parse packets sent by DHCP servers that put the end of options
   marker after pad options and at an odd offset.
2. We get the DhcpResults vendorInfo from the wrong option type
   (60 instead of 43).

Fix these and add unit tests for the offer packets sent by a few
different DHCP servers.

Bug: 21955617
Bug: 22281295
Change-Id: I5d13f1a6a3ff0b53112f18f3db8792fa32ad2da3
2015-07-06 13:50:53 +09:00
Lorenzo Colitti
5bc64b847a Correctly time out CMD_START_DHCP.
WifiStateMachine expects CMD_START_DHCP to time out after 30-40
seconds. Currently, DhcpClient imposes timeouts on DhcpInitState
and on DhcpRequestState, but not on the time it takes to get to
from CMD_START_DHCP to DhcpBoundState. So in theory the client
could oscillate between DhcpInitState and DhcpRequestState and
never time out.

Fix this by introducing a new oneshot timer that is set when DHCP
starts and is cancelled when it succeeds. CMD_RENEW_DHCP does not
need this because it's implemented using only one state, so the
oneshot timeout can be implemented using the state timeout.

Bug: 19704592
Change-Id: I6a5847a3dee23a2692237b8f3b3b0f8049da5140
2015-06-08 19:57:14 +09:00
Lorenzo Colitti
be843e8394 Actually close sockets when stopping the receive thread.
Contrary to the expectations of the code, IoUtils.closeQuietly()
does not unblock system calls. So mReceiveThread.halt() was not
actually stopping the receive thread.

This wasn't actually a problem, because after "stopping" the
receive thread, either the interface would go down (interrupting
the previous receive thread with ENETDOWN), or a packet would
arrive to both the old and new receive threads, stopping the
old one. But the lack of a "stopping receive thread" message at
the expected time was confusing.

While I'm at it, also add the string for CMD_TIMEOUT.

Bug: 19704592
Change-Id: I74732429118af780453028898148519b294fa9d3
2015-06-04 20:07:14 +09:00
Lorenzo Colitti
f68edb1611 Actually fall back from yiaddr to ciaddr.
The initial implementation of toDhcpResults attempted to get the
leased IP address from ciaddr if yiaddr was 0.0.0.0, but it never
actually did so because a) it used == instead of equals(), and b)
the parsing code never populated mClientIp for a DhcpOfferPacket
or DhcpAckPacket.

Fix this and add a test for it.. Technically DHCP does not use
ciaddr (only bootp uses it), but in 5.0 we would use ciaddr if
yiaddr was 0.0.0.0 and a bit more compatibility shouldn't hurt.

Bug: 19704592
Change-Id: I1f58555f0c10b9c576995a6edb759a83d8938ea0
2015-06-04 14:57:11 +09:00
Lorenzo Colitti
3a40b0deab Make RenewingState time out as well.
Bug: 19704592
Change-Id: I0759a98911a8c0059936916db8db459b7d66bc00
2015-06-03 17:23:30 +09:00
Lorenzo Colitti
48f9c731ff Remove the IPv4 address from the interface when DHCP fails.
Bug: 19704592
Change-Id: I9b96cdcfc7c9442b3f8d6797aca63559ed4bdb9b
2015-06-03 12:09:14 +09:00
Lorenzo Colitti
8f602cdd38 Merge "Fix DHCP lease time parsing." into mnc-dev 2015-06-02 07:47:48 +00:00
Erik Kline
d59aa84fda pass a defensive copy of DhcpResults
Also: correct state transition handling in DhcpBoundState#enter().

Bug: 20451261
Change-Id: I3be50f6b1b3fae179d6fff7ca8ae1d687caa3221
2015-06-02 16:22:57 +09:00
Lorenzo Colitti
d973537ee1 Fix DHCP lease time parsing.
Currently we treat a lease time larger than 2**31-1 as a negative
value, which causes DhcpClient to attempt to renew its IP address
constantly. Fix this by properly handling large and infinite
lifetimes, and while we're at it, impose a minimum lease time of
60 seconds.

Bug: 21352084
Change-Id: If62c9efeffad6222e2fe0c110f77d0e4c70de96d
2015-06-02 16:21:17 +09:00
Lorenzo Colitti
82babcd83a Specify more information in DhcpClient PendingIntents.
- Specify the package name. This provides a bit of security, but
  not much since the package is "android".
- Specify the interface name so we can run more than one client
  at a time.

Bug: 21395858
Bug: 19704592
Change-Id: I91c9ea15285b36628b6aef0b975c16a0b08d061e
2015-05-26 12:40:12 +00:00
Etan Cohen
644f41368f Merge commit '4cb5d80' into merge2 2015-04-24 14:03:28 -07:00
Lorenzo Colitti
f443bfc25e 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
2015-04-22 16:44:10 +09:00
Lorenzo Colitti
a94929ba9d Log DHCP replies that we can't parse.
Bug: 19704592
Bug: 20335221
Change-Id: I73def02a08345bd96f45cb970f9f251e6d5df2db
2015-04-22 04:09:55 +00:00
Lorenzo Colitti
3e979321a5 Set the secs field in the BOOTP header.
We mostly follow RFC 2131, which says that secs is the number of
seconds "since client began address acquisition or renewal
process", and thus set secs to zero on renew. This is different
from our current behaviour, which keeps on counting without
resetting secs to zero on renew.

Bug: 19704592
Change-Id: Ifbb7644094c579be626ffb698eee87047425dbf0
2015-04-21 16:21:21 +09:00
Prerepa Viswanadham
220951a6d0 Merge commit 'b2ff415' into merge_work
Change-Id: I4f9c662112fc49e4f94315d3c69860607be3bc1e
2015-04-10 15:54:48 -07:00
Lorenzo Colitti
a12bde3567 Deal with null characters in string options.
This currently truncates all strings at the first NULL character,
except for vendorInfo, which is an opaque string.

Bug: 19985674
Change-Id: Ie53b2c55eb8a5204d7b2c7e2d8587743d923647a
2015-04-01 17:53:14 +09:00
Lorenzo Colitti
c2abb2bf5e Deal with null characters in string options.
This currently truncates all strings at the first NULL character,
except for vendorInfo, which is an opaque string.

Bug: 19985674
Change-Id: Ie53b2c55eb8a5204d7b2c7e2d8587743d923647a
2015-04-01 13:55:34 +09:00
Lorenzo Colitti
f5c17221d4 Don't log errors if the receive thread is stopped.
Change-Id: I75ddc9b68f0a61a9a7a78026ed97a8a7c5109cc3
2015-03-31 07:07:03 +09:00
Lorenzo Colitti
06ac4b8dd1 DHCP: Don't write options longer than 255 bytes.
Change-Id: Iddc971c7ac97253af3063850cde3dee10c3829ff
2015-03-20 16:32:44 +09:00
Lorenzo Colitti
b05c9234e6 DHCP: parsing robustness fixes.
1. Check the length of the fixed-length portions of the packet.
2. Catch BufferUnderflowException while parsing options.

Change-Id: If907f49f02a04a4a3360f46a3192e94ab099af0e
2015-03-20 16:32:43 +09:00
Lorenzo Colitti
e7d4243be9 DHCP: Add a Java DHCP client.
The behaviour of the client is intended to mirror the behaviour
of the current DhcpStateMachine + dhcpcd combination, except it
does not store leases across network changes.

Bug: 19704592
Change-Id: I110b58003da2d8293059d48a0181e16f7f7f145c
2015-03-20 16:32:41 +09:00
Lorenzo Colitti
fe5ffce09c DHCP: protocol changes.
1. Define and add parsing code for MTU, max message size, T1, T2.
2. Add common TLVs (message size, hostname, vendor ID) to all
   packets sent by the client.
3. Don't include requested IP and server ID in renew messages,
   since the RFC says MUST NOT.
4. Don't hardcode the broadcast flag to true in DISCOVER packets,
   use what the caller passed in.
5. Make some methods static.

Bug: 19704592
Change-Id: I42a0997e468b12e19cad9b403b98fe266e6cea73
2015-03-20 16:32:39 +09:00
Lorenzo Colitti
86bff86778 DHCP: glue code.
1. Add a method to make a DhcpResults object from a DHCP packet.
2. Add a method to fetch the client MAC from the packet. This is
   needed to check that the message is for us (lots of DHCP
   messages are broadcast).
3. Add a length argument to the method that parses DHCP packets,
   so the caller can use the same MTU-sized array all the time
   instead of having to pass in a new array for every packet.

Bug: 19704592
Change-Id: I58223f5ec90fb5c762bc2934649e02f9122018b2
2015-03-20 16:32:39 +09:00
Lorenzo Colitti
7f7cc61159 DHCP: Ethernet/IP packet header changes.
1. Support L2_ENCAP when building packets as well as when parsing.
2. Skip IP options when parsing DHCP packets.

Bug: 19704592
Change-Id: Ic27a45790ed1cf7cf5b82d63b6c0b64c909a570f
2015-03-20 16:32:38 +09:00
Lorenzo Colitti
51697effe9 DHCP: Minor cleanups to the packet code.
1. Delete the DhcpStateMachine, since we don't plan to use it.
2. Make all InetAddresses Inet4Addresses, since that's what they
   are.  In order to do this, define INADDR_ANY and
   INADDR_BROADCAST, constants, since Inet4Address.{ANY,ALL} are
   not Inet4Addresses but InetAddresses.

Bug: 19704592
Change-Id: I5a0499be889076992a60aaad0bd8be5ea66bd560
2015-03-20 16:32:37 +09:00
Lorenzo Colitti
eca9b9bd8b DHCP: Move the packet code to frameworks/base/services.
There's no need for it to be in frameworks/base/core, since it
will only be used by services.

Bug: 19704592
Change-Id: I2f5277eca848b7000ca46db575e8602eacb5c8bd
2015-03-20 16:32:36 +09:00
Lorenzo Colitti
3698af5f64 DHCP: Don't write options longer than 255 bytes.
Change-Id: Iddc971c7ac97253af3063850cde3dee10c3829ff
2015-03-17 19:56:34 +09:00
Lorenzo Colitti
2ed489f410 DHCP: parsing robustness fixes.
1. Check the length of the fixed-length portions of the packet.
2. Catch BufferUnderflowException while parsing options.

Change-Id: If907f49f02a04a4a3360f46a3192e94ab099af0e
2015-03-17 19:46:14 +09:00
Lorenzo Colitti
a071edce46 DHCP: Add a Java DHCP client.
The behaviour of the client is intended to mirror the behaviour
of the current DhcpStateMachine + dhcpcd combination, except it
does not store leases across network changes.

Bug: 19704592
Change-Id: I110b58003da2d8293059d48a0181e16f7f7f145c
2015-03-17 19:46:13 +09:00
Lorenzo Colitti
04b8d3aab6 DHCP: protocol changes.
1. Define and add parsing code for MTU, max message size, T1, T2.
2. Add common TLVs (message size, hostname, vendor ID) to all
   packets sent by the client.
3. Don't include requested IP and server ID in renew messages,
   since the RFC says MUST NOT.
4. Don't hardcode the broadcast flag to true in DISCOVER packets,
   use what the caller passed in.
5. Make some methods static.

Bug: 19704592
Change-Id: I42a0997e468b12e19cad9b403b98fe266e6cea73
2015-03-17 13:21:21 +09:00
Lorenzo Colitti
29cb944bef DHCP: glue code.
1. Add a method to make a DhcpResults object from a DHCP packet.
2. Add a method to fetch the client MAC from the packet. This is
   needed to check that the message is for us (lots of DHCP
   messages are broadcast).
3. Add a length argument to the method that parses DHCP packets,
   so the caller can use the same MTU-sized array all the time
   instead of having to pass in a new array for every packet.

Bug: 19704592
Change-Id: I58223f5ec90fb5c762bc2934649e02f9122018b2
2015-03-16 22:35:19 +09:00
Lorenzo Colitti
15204d50b4 DHCP: Ethernet/IP packet header changes.
1. Support L2_ENCAP when building packets as well as when parsing.
2. Skip IP options when parsing DHCP packets.

Bug: 19704592
Change-Id: Ic27a45790ed1cf7cf5b82d63b6c0b64c909a570f
2015-03-16 21:57:00 +09:00
Lorenzo Colitti
c8a0f49fee DHCP: Minor cleanups to the packet code.
1. Delete the DhcpStateMachine, since we don't plan to use it.
2. Make all InetAddresses Inet4Addresses, since that's what they
   are.  In order to do this, define INADDR_ANY and
   INADDR_BROADCAST, constants, since Inet4Address.{ANY,ALL} are
   not Inet4Addresses but InetAddresses.

Bug: 19704592
Change-Id: I5a0499be889076992a60aaad0bd8be5ea66bd560
2015-03-16 20:08:47 +09:00
Lorenzo Colitti
c95a87f30d DHCP: Move the packet code to frameworks/base/services.
There's no need for it to be in frameworks/base/core, since it
will only be used by services.

Bug: 19704592
Change-Id: I2f5277eca848b7000ca46db575e8602eacb5c8bd
2015-03-16 20:08:46 +09:00