207 Commits

Author SHA1 Message Date
Erik Kline
5f4a37c9aa Handle IpReachabilityMonitor errors better. am: e452660466
am: d8a06fa28a

Change-Id: I820f887205de7565bbf70fe66de66680fa571475
2016-11-09 02:48:22 +00:00
Erik Kline
e452660466 Handle IpReachabilityMonitor errors better.
If construction of a new IpReachabilityMonitor throws an IAE then
log it and immediately call onProvisioningFailure().

Test: runtest frameworks-wifi
      passes, except for selectQualifiedNetworkDoesNotChooseDeletedEphemeral()
      which fails with an NPE for unrelated reasons.

Bug: 31038971
Bug: 31742703
Change-Id: Ie91b8bdd509d06ad54d062bf446e74c092eb096c
2016-11-08 16:02:24 +09:00
Hugo Benichi
9059566276 Merge "Add SafetyNet logging to DHCP packet parsing" 2016-10-25 02:10:28 +00:00
Hugo Benichi
a028989471 Add SafetyNet logging to DHCP packet parsing
Test: unit test passes
Bug: 31850211
Change-Id: I47f9db1f2c50ccd4fc90b80a9ffc1e9e43078f5f
2016-10-24 15:40:10 +09:00
TreeHugger Robot
5bc2953f6e Merge "Do not synchronize boolean reads/writes" 2016-10-17 11:14:17 +00:00
TreeHugger Robot
8b928c23a2 Merge "ApfFilter: use elapsedRealTime for RA lifetime" 2016-10-17 11:13:45 +00:00
Hugo Benichi
305af8e98a ApfFilter: use elapsedRealTime for RA lifetime
This patch replaces System.currentTimeMillis() with
SystemClock.elapsedRealTime() to make RA lifetime computation more
resilient to various external events inducing jumps in
currentTimeMillis().

Test: ApfTest passes.
Change-Id: I4876064638df78d72bbd9057cfdf3309f8e27f68
2016-10-17 14:23:27 +09:00
Hugo Benichi
b0f1186c03 Do not synchronize boolean reads/writes
This patch removes the synchronization around the private variable
mRunning inside of IpReachabilityMonitor and instead qualifeis the field
as volatile.

Synchronization is not needed for reads/writes on native fields or
object references because they are already guaranteed to be atomic.

Synchronization here was used for enforcing memory visibility across
concurrent threads indirectly through monitor acquire/release.
The volatile keyword achieves this in a more explicit way.

Also, this patch changes the way that probeAll() copies the
IpReachabilityMonitor's mIpWatchList by temporary holding mIpWatchList
keys into an ArrayList instead of a more expensive HashSet. Since Java
HashSet are just degenerated HashMaps, and that key iteration order is
based on key hash, the iteration order over this temporary collection
will be consistent for the same mIpWatchList.

Test: refactoring CL. Existing unit tests still pass.
Change-Id: I86ca6d54cb41ec78281e224a8d8ffd7155451132
2016-10-13 15:00:34 +09:00
Hugo Benichi
995dd94673 ApfFilter: systematically use u8, u16, u32 getters
This patch adds a getUint8 getter for ByteBuffers and changes ApfFilter
to make uses of getUint8/16/32 everywhere.

The return types of getUint16 is also changed from long to int, which
will expand gracefully to long as an unsigned int as it is guaranteed to
be positive after getUint16.

Test: ApfTest passes
Change-Id: Id3c2817b949e9817e2bb60e0ec8fe2d6fd8d787c
2016-10-13 10:16:31 +09:00
Hugo Benichi
8acea76a2b Add fuzzing tests to ApfFilter RA processing
Test: added new unit tests
Change-Id: Ie352eb1514b762e032b9140d633abc06180d0ade
2016-10-11 10:04:42 +09:00
Hugo Benichi
1ade34dd76 Reject DHCP packets with no magic cookie
am: 006e061301

Change-Id: I54a32519d13e8d5463ca86630540722d73ff75cb
2016-10-07 02:29:49 +00:00
Hugo Benichi
c4a13afe92 Catch runtime exceptions when parsing DHCP packets
am: e0ea7fecd6

Change-Id: I1e701bb19b5c062f1527dd3e5b79e2e7860ca025
2016-10-06 21:11:47 +00:00
Hugo Benichi
006e061301 Reject DHCP packets with no magic cookie
This patch adds an explicit check in the DHCP packet parser for
rejecting packets without a magic cookie, instead of relying on the
top-level try-catch-all in the parser.

This allows to add to DHCP error metrics this specific error.

It also allows to add two poor man's fuzzing tests that tries to find
additional gaps in the DHCP packet parser by
 - trying to parse all subslices of a valid offer packet.
 - trying to parse random byte arrays.

Test: covered by previously introduced malformed DHCP packet unit tests
      + additional fuzzing tests.
Bug: 31850211
Change-Id: If53c9ba9df78d7604ec018c9d67c237ae59c4833
2016-10-06 21:22:29 +09:00
Hugo Benichi
e0ea7fecd6 Catch runtime exceptions when parsing DHCP packets
This patch adds a try catch all to DHCP packet parsing so that
DhcpClient does not choke on malformed packets, brinding down with it
the whole framework.

Test: added new unit tests catching the issue fixed in this patch.
Bug: 31850211
Change-Id: I3c50a149fed6b2cbc4f40bb4f0e5bb2b56859b44
2016-10-05 21:58:26 +09:00
Lorenzo Colitti
d2ad8ece53 Ignore loss of IPv6 provisioning when not avoiding bad Wi-Fi.
am: f11ee9f592

Change-Id: I3090ac5fe7dabf2ee19120bd0ab566edaa95ddb6
2016-10-04 07:50:14 +00:00
Lorenzo Colitti
fdac9b608b Slightly simplify IpManager#compareProvisioning.
am: b77b775213

Change-Id: I31ab37d3fc39baf73fa14ef3b54b781b60347b41
2016-10-04 07:49:23 +00:00
Erik Kline
d719d95139 Conditionally accept loss of on-link IPv6 DNS servers
am: 5b437d6ff9

Change-Id: Ie32080d7918dea0ae89bd3e0987cb1c8f121e0bd
2016-10-04 07:48:46 +00:00
Erik Kline
23cdacbec6 Refactor "avoid bad wifi" logic into a utility class
am: 065ab6ee40

Change-Id: I4a6ad3791ac551b0d64b37dd4e2afef1e8e8ee10
2016-10-04 07:47:52 +00:00
Lorenzo Colitti
f11ee9f592 Ignore loss of IPv6 provisioning when not avoiding bad Wi-Fi.
Bug: 31827713
Change-Id: I81471f2f3e6c1c4d7bdfebc9dd321bb9d76ad0b6
2016-10-04 15:07:44 +09:00
Lorenzo Colitti
b77b775213 Slightly simplify IpManager#compareProvisioning.
Bug: 31827713
Change-Id: Icc1c8d98feef14c972891451fd94f855d78de43e
2016-10-04 15:07:44 +09:00
Erik Kline
5b437d6ff9 Conditionally accept loss of on-link IPv6 DNS servers
Permit this if and only if we're not "avoiding bad wifi" in general.

Bug: 31827713
Change-Id: I0874ec2d1d09e913ccdbe9f6e178090400808a04
2016-10-04 15:07:43 +09:00
Erik Kline
065ab6ee40 Refactor "avoid bad wifi" logic into a utility class
Additionally, add this utility class to IpManager for compatibility
verification.  A follow-on CL will make use of IpManager's local
AvoidBadWifiTracker.

Bug: 31827713
Change-Id: If8c56c3f8076d6a5157ea180e361bbdadc2bc1dd
2016-10-04 15:07:42 +09:00
Erik Kline
c3eec4fff9 Support triggering confirmConfiguration() via dumpsys
Tested:
  - flashed to device
  - triggered
  - monitored tcpdump for the expected traffic

Bug: 30869013
Change-Id: I6a4741bdeed2aaa483f8c2281acb74d245a323e8
2016-09-28 15:19:00 +09:00
Erik Kline
8ec1dc8117 Handle more commands in StoppingState
Also, expand the logging of states in which messages are
received and handled.

Bug: 31264287
Change-Id: If633984cb54128716fc9b3fcb27925906d0bd826
2016-09-20 17:20:57 +09:00
Hugo Benichi
7d21eaedad ApfFilter: take into account IPv4 subnet prefix
When IPv4 is provisioned on an interface with Apf capabilities,
ApfFilter will only keep track of the raw ipv4 address, with no
information about the subnet or prefix length.

This patch adds the missing prefix length information to ApfFilter. This
allows to calculate the subnet broadcast ipv4 address for more
precise ipv4 broadcast filtering when the multicast lock is not held.

Bug: 30231088

Change-Id: Iebaec040703647c4ced30bb585be173e97a1fae5
2016-09-13 10:54:47 +09:00
Hugo Benichi
0dc1d31470 ApfFilter: more precise IPv4 broadcast filter
This patch refines the Apf IPv4 filter for interfaces with Apf
capabilities to drop packets when:
  - the multicast lock is not held
  - the packet is an IPv4 packet
  - the packet is not a DHCP packet addressed to us
  - the packet is L2 broadcast, or IPv4 multicast, or IPv4 broadcast
      - caveat: subnet broadcast address is not checked.

This allows to drop IPv4 broadcast packets whose MAC destination
address is not the L2 broadcast address but the current address of the
interface. Such packets can be received on network that rewrite L2
addresses and can put significant pressure on battery by waking up the
phone unnecessarily.

Bug: 30231088

Change-Id: I8b1785fc5ceadaa1f2881765983e502135dcbc46
2016-09-13 10:54:42 +09:00
Hugo Benichi
961ca49fd6 Better IPv4 multicast coverage in ApfTest
This patch improves the test coverage of ApfFilter for IPv4 broadcast and
multicast traffic.

Bug: 30231088
Change-Id: I2e1d5d5a7cbae17f3d5978a4cf5f10666b5c6104
2016-09-08 14:03:46 +09:00
Erik Kline
ee5de9d245 Remove INetd AIDL reference
Change-Id: I29dfee480a4706213b36766724b6211dbc74dbac
2016-08-30 11:40:20 +09:00
Erik Kline
c1bc0be161 Add simple NetdService util class
Hopefully we can avoid a small amount of repeated wrapper code.

Bug: 21859053
Bug: 28135208
Change-Id: I00f404f19c14a1726071e62e558f551dccf8b915
2016-08-25 16:25:39 +09:00
Erik Kline
e845cf22c1 Merge "Ensure known good state when starting." into nyc-mr1-dev 2016-08-22 02:55:41 +00:00
Erik Kline
d1dcbefe06 Fix up some comments in IPv6 tethering code.
Bug: 30298058
Change-Id: Icc99e772898b8303d8f2f8521784e2cb5c2afacc
2016-08-10 10:00:32 +09:00
Erik Kline
fa37b2f613 Handle setting and deprecating local DNS IPv6 addresses
[ IPv6TetheringCoordinator ]

  - Send CMD_IPV6_TETHER_UPDATE to all TetherInterfaceStateMachines.

This results in some spurious noop messages, but currently
the coordinator does not maintain state about which downstream interaces
are serving IPv6 and which are not.  Until it does maintain such state
it does not know to notify only the affected interfaces about a loss of
IPv6 upstream

[ IPv6TetheringInterfaceServices ]

    - De-dup incoming IPv6-only LinkProperties to avoid spurious updates
      to the RA daemon.
    - Keep track of new prefixes/dns and newly deprecated prefixes/dns
      on each update.
        - Set and remove local_network routes based on new and newly
          deprecated prefixes.
        - Set and remove local DNS server IP addresses based on new
          and newly deprecated DNS servers. Update dnsmasq via netd
          accordingly.
    - Pass newly deprecated and new information to the RA daemon.

[ RouterAdvertisementDaemon ]

    - Receive newly deprecated prefixes/DNS and update local tracking
      data structures accordingly.
    - Properly send urgent final deprecation RAs, and then cease all
      transmissions.

Bug: 30298058
Change-Id: Idc821603fa93bff1a821d1180d4135bc70e4a08d
2016-08-09 19:19:43 +09:00
Erik Kline
703b0974e0 Ensure known good state when starting.
Split StartedState into StartedState and RunningState, and ensure
known good state before proceeding from the former to the latter.

Bug: 30290336
Change-Id: I0a93f8fe53c65a0b90c28c3cf708792146a92aab
2016-08-08 15:31:08 +09:00
Erik Kline
354607f2ac Deprecate IPv6 prefixes no longer in use.
Bug: 30298058
Change-Id: I0fa9ece9b2fb07214971a91b77f5b07972d83bb6
2016-08-02 12:51:24 +09:00
Paul Jensen
4e40413c50 Merge "Sanity check ICMP6 router advertisement packets" into nyc-mr1-dev 2016-07-26 14:30:00 +00:00
Paul Jensen
4b545b04f6 Sanity check ICMP6 router advertisement packets
There is a chance a packet can slip by before we install the filter
on our socket listening for RAs, so add some basic sanity checking
to make sure we've recieved an RA.

Change-Id: I14cf84a0814896a41e00f50af376dfc4988d36cb
Fixes: 29586253
2016-07-20 15:01:17 -04:00
Erik Kline
e33daf1295 More correctly close RA daemon socket.
Bug: 9580643
Bug: 30190913
Change-Id: I34e34624da09957d96fee38c3f2005e23eb1bee5
2016-07-19 22:44:21 +09:00
Hugo Benichi
38db976514 APF: filter unwanted ARP replies
This patch adds APF filtering of ARP replies for interfaces with APF.

- when the interface has no IPv4 address, broadcast ARP replies with a
  0.0.0.0 target ip are dropped (GARP), ARP requests with a 0.0.0.0
  target ip are dropped.

- when the interface has an IPv4 address, broadcast ARP replies to a
  different ip are dropped (including GARPs to 0.0.0.0), ARP requests to
  a different ip are dropped.

Bug: 29404209
Bug: 30080487
Change-Id: I82613eb865c7f38b6260997fe2caf2aff382ad78
2016-07-14 23:36:53 +09:00
Erik Kline
a3ca6bd3e0 Basic IPv6 Router Advertisement daemon
Bug: 9580643
Change-Id: Iebd4d1f694699ffd4daf7d71e9b9d8f49e9b632f
2016-07-11 18:37:25 +09:00
Hugo Benichi
42e608527a Merge "IpConn metrics: distinguish NUD_FAILED answers" into nyc-mr1-dev 2016-07-07 13:02:31 +00:00
Hugo Benichi
7643423521 IpConn metrics: add times to DHCP bound state
This patch adds DhcpClientEvent logging for:
 - time from init state to bound state
 - time from bound state to bound state when renewing

Example:
ConnectivityMetricsEvent(12:04:33.353, 0, 0): DhcpClientEvent(wlan0, WaitBeforeStartState, 94ms)
ConnectivityMetricsEvent(12:04:35.772, 0, 0): DhcpClientEvent(wlan0, DhcpInitState, 2417ms)
ConnectivityMetricsEvent(12:04:35.787, 0, 0): DhcpClientEvent(wlan0, DhcpRequestingState, 15ms)
ConnectivityMetricsEvent(12:04:35.793, 0, 0): DhcpClientEvent(wlan0, ConfiguringInterfaceState, 6ms)
ConnectivityMetricsEvent(12:04:35.811, 0, 0): DhcpClientEvent(wlan0, InitialBoundState, 2457ms)
ConnectivityMetricsEvent(12:05:35.791, 0, 0): DhcpClientEvent(wlan0, DhcpBoundState, 59998ms)
ConnectivityMetricsEvent(12:05:35.988, 0, 0): DhcpClientEvent(wlan0, WaitBeforeRenewalState, 196ms)
ConnectivityMetricsEvent(12:05:36.003, 0, 0): DhcpClientEvent(wlan0, DhcpRenewingState, 15ms)
ConnectivityMetricsEvent(12:05:36.010, 0, 0): DhcpClientEvent(wlan0, RenewingBoundState, 219ms)

Change-Id: I2540dd102a6509dff55936e38015265659b20760
2016-07-07 16:10:20 +09:00
Hugo Benichi
0d1c65b221 IpConn metrics: distinguish NUD_FAILED answers
This patch adds in IpReachabilityMonitor a timestamp variable set
everytime that probeAll() send NUD probe requests to RTNETLINK.
This allows to distinguish between:
  1) NUD_FAILED events resulting from such a forced NUD probe
  2) "organic" NUD_FAILED notifications from the kernel

This distinction is added to IpReachabilityEvent as a one-bit flag.

This patch also changes the formatting of ApfProgramEvent flags to use
'|' as a joining character, similarly to other flags formatting.

Bug: 21859053
Change-Id: I24c64a3f17fa283eace5bd0a05c21a90a2305359
2016-07-07 15:58:28 +09:00
Hugo Benichi
54756fdfd9 Merge "IpConn metrics: correctly read RA lifetimes" into nyc-mr1-dev 2016-07-05 12:25:55 +00:00
Hugo Benichi
176ed01a1f IpConn metrics: add dhcp transition times
This patch adds lifetime durations of DhcpClient states to
DhcpClientEvents.

To record the duration of a state, the event is now recorded when the
DhcpClient state machine exits that state.

In addition this patch removes event logging of StoppedState,
DhcpState and DhcpHaveLeaseState.

Change-Id: Ibd37b5e3070f35113b6b45942b1e1ff19c27a90b
2016-07-05 17:32:56 +09:00
Hugo Benichi
6ccd51a338 IpConn metrics: correctly read RA lifetimes
This patch
  - adds a Builder class for RaEvent.
  - uses this Builder class for correctly recording the minimum
    lifetime seen for every ICMP6 options tracked, instead of
    recording the last lifetime seen.
  - adds unit test coverage for RaEvent logging.

Change-Id: I6443932f5cf7a613a5c695c65a60eab01e60602a
2016-07-05 13:52:24 +09:00
TreeHugger Robot
f5e3481951 Merge changes Ia28652e0,Id2eaafdc,I9c4c8286 into nyc-mr1-dev
* changes:
  Record events for RA option lifetimes
  Log RA listening statistics
  Log events at APF program generation
2016-06-30 14:03:22 +00:00
Hugo Benichi
cfbf7414a1 Record events for RA option lifetimes
This patch defines a new android.net.metrics.RaEvent class carrying
lifetime values contained in RA packets. RaEvent are recorded when
ApfFilter processes a new RA for which there is no match.

Example:
ConnectivityMetricsEvent(15:39:39.808, 0, 0): RaEvent(lifetimes: router=3600s, prefix_valid=2592000s, prefix_preferred=604800s, route_info=-1s, dnssl=-1s, rdnss=3600s)

Change-Id: Ia28652e03ed442d5f2a686ef5b3fafbcb77c503a
2016-06-30 18:26:39 +09:00
Hugo Benichi
647c86d70a Log RA listening statistics
This patch adds a new ApfStats event class that counts RA packet
reception statistics on the RA listener thread of ApfFilter and reports
the maximum program size advertised by hardware.

Statistics are gathered for the lifetime of a network with APF
capabilities and uploaded at network teardown when the listener thread
exits.

Example event:
ConnectivityMetricsEvent(15:44:23.741, 0, 0): ApfStats(284945ms 2048B RA: 2 received, 0 matching, 0 ignored, 0 expired, 0 parse errors, 2 program updates)

Bug: 28204408
Change-Id: Id2eaafdca97f61152a4b66d06061c971bc0aba4c
2016-06-30 18:26:33 +09:00
Hugo Benichi
4fc3ee5be2 Log events at APF program generation
Example:
ConnectivityMetricsEvent(15:24:52.018, 0, 0): ApfProgramEvent(0/0 RAs 121B forever FLAG_MULTICAST_FILTER_ON)
ConnectivityMetricsEvent(15:24:53.036, 0, 0): ApfProgramEvent(1/1 RAs 334B 600s)
ConnectivityMetricsEvent(15:24:53.590, 0, 0): ApfProgramEvent(1/1 RAs 360B 600s FLAG_MULTICAST_FILTER_ON, FLAG_HAS_IPV4_ADDRESS)
ConnectivityMetricsEvent(15:24:58.157, 0, 0): ApfProgramEvent(1/1 RAs 294B 599s FLAG_HAS_IPV4_ADDRESS)

Bug: 28204408
Change-Id: I9c4c82861cf42eb2c7e7bf5471f05e8ff2fc560c
2016-06-30 18:21:09 +09:00
Erik Kline
feadfda8a0 Make provisioning timeout apply to both IPv4 and IPv6
Bug: 29449295
Change-Id: I743533ca61914c11163ba5c5767a365def3a5461
2016-06-30 13:00:01 +09:00