| <!-- |
| Copyright 2012 The Android Open Source Project |
| |
| Licensed under the Apache License, Version 2.0 (the "License"); |
| you may not use this file except in compliance with the License. |
| You may obtain a copy of the License at |
| |
| http://www.apache.org/licenses/LICENSE-2.0 |
| |
| Unless required by applicable law or agreed to in writing, software |
| distributed under the License is distributed on an "AS IS" BASIS, |
| WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| See the License for the specific language governing permissions and |
| limitations under the License. |
| --> |
| |
| |
| In Android 4.0, statistics reported by Linux network interfaces are |
| recorded over time, and are used to enforce network quota limits, |
| render user-visible charts, and more. |
| |
| Each network device driver (Wi-Fi included) must follow the standard |
| kernel device lifecycle, and return correct statistics through |
| `dev_get_stats()`. In particular, statistics returned must remain |
| strictly monotonic while the interface is active. Drivers may reset |
| statistics only after successfully completing an `unregister_netdev()` |
| or the equivalent that generates a `NETDEV_UNREGISTER` event for |
| callbacks registered with `register_netdevice_notifier()` / |
| `register_inetaddr_notifier()` / `register_inet6addr_notifier()`. |
| |
| Mobile operators typically measure data usage at the Internet layer |
| (IP). To match this approach in Android 4.0, we rely on the fact that |
| for the kernel devices we care about the `rx_bytes` and `tx_bytes` |
| values returned by `dev_get_stats()` return exactly the Internet layer |
| (`IP`) bytes transferred. But we understand that for other devices it |
| might not be the case. For now, the feature relies on this |
| peculiarity. New drivers should have that property also, and the |
| `dev_get_stats()` values must not include any encapsulation overhead |
| of lower network layers (such as Ethernet headers), and should |
| preferably not include other traffic (such as ARP) unless it is |
| negligible. |
| |
| The Android framework only collects statistics from network interfaces |
| associated with a `NetworkStateTracker` in `ConnectivityService`. This |
| enables the framework to concretely identify each network interface, |
| including its type (such as `TYPE_MOBILE` or `TYPE_WIFI`) and |
| subscriber identity (such as IMSI). All network interfaces used to |
| route data should be represented by a `NetworkStateTracker` so that |
| statistics can be accounted correctly. |