56 lines
2.8 KiB
HTML
56 lines
2.8 KiB
HTML
<html devsite>
|
||
<head>
|
||
<title>Network Interface Statistics Overview</title>
|
||
<meta name="project_path" value="/_project.yaml" />
|
||
<meta name="book_path" value="/_book.yaml" />
|
||
</head>
|
||
<body>
|
||
<!--
|
||
Copyright 2017 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.
|
||
-->
|
||
|
||
|
||
<p>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.</p>
|
||
<p>Each network device driver (Wi-Fi included) must follow the standard
|
||
kernel device lifecycle, and return correct statistics through
|
||
<code>dev_get_stats()</code>. In particular, statistics returned must remain
|
||
strictly monotonic while the interface is active. Drivers may reset
|
||
statistics only after successfully completing an <code>unregister_netdev()</code>
|
||
or the equivalent that generates a <code>NETDEV_UNREGISTER</code> event for
|
||
callbacks registered with <code>register_netdevice_notifier()</code> /
|
||
<code>register_inetaddr_notifier()</code> / <code>register_inet6addr_notifier()</code>.</p>
|
||
<p>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 <code>rx_bytes</code> and <code>tx_bytes</code>
|
||
values returned by <code>dev_get_stats()</code> return exactly the Internet layer
|
||
(<code>IP</code>) 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
|
||
<code>dev_get_stats()</code> 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.</p>
|
||
<p>The Android framework only collects statistics from network interfaces
|
||
associated with a <code>NetworkStateTracker</code> in <code>ConnectivityService</code>. This
|
||
enables the framework to concretely identify each network interface,
|
||
including its type (such as <code>TYPE_MOBILE</code> or <code>TYPE_WIFI</code>) and
|
||
subscriber identity (such as IMSI). All network interfaces used to
|
||
route data should be represented by a <code>NetworkStateTracker</code> so that
|
||
statistics can be accounted correctly.</p>
|
||
|
||
</body>
|
||
</html>
|