60 lines
3 KiB
HTML
60 lines
3 KiB
HTML
<html devsite>
|
||
<head>
|
||
<title>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>The per-application/delegated data usage monitoring and tracking
|
||
functionality relies on the xt_qtaguid module in the android-3.0 Linux
|
||
kernel (<code>kernel/net/netfilter/xt_qtaguid</code>). The socket tagging
|
||
functionality in the framework (<code>system/core/libcutils/qtaguid.c</code>)
|
||
relies mainly on the existence of <code>/proc/net/xt_qtaguid/ctrl</code>
|
||
interface exported by the <code>xt_qtaguid</code> kernel module.</p>
|
||
<p>The <code>quota2</code> netfilter module (originally part of <code>xtables-addons</code>)
|
||
allows the functionality to set named quota limits and was extended to
|
||
support notifying userspace when certain limits are reached. Once the
|
||
quota limit is reached, the <code>quota2</code> module discards all subsequent
|
||
network traffic. The framework can also specify additional rules to
|
||
restrict background data traffic for an application (refer to
|
||
<code>com.android.server.NetworkManagementSocketTagger.setKernelCounterSet</code>
|
||
and
|
||
<code>android.net.NetworkPolicyManager.POLICY_REJECT_METERED_BACKGROUND</code>).</p>
|
||
<h1 id="how-does-it-work">How does it work?</h1>
|
||
<p>The <code>qtaguid</code> netfilter module tracks the network traffic on a
|
||
per-socket basis for every application using the unique UID of the
|
||
owning application. There are two tag components associated with any
|
||
socket in the system. The first is the UID which uniquely identifies
|
||
the application which is responsible for the data transfer (Linux
|
||
allows the ability to ascribe the ownership of each network socket to
|
||
the UID of the calling application). The second tag component is used
|
||
to support additional characterization of the traffic into application
|
||
developer specified categories. Using these application level tags, an
|
||
application can profile the traffic into several sub-categories.</p>
|
||
<p>In the case of applications that provide network data transfer as a
|
||
service, such as the download manager, media streaming service, etc,
|
||
it is possible to attribute the ownership of the network data transfer
|
||
to the UID of the requesting application using the
|
||
<code>TrafficStats.setThreadStatsUid()</code> function call. The caller must hold
|
||
the “<code>android.permission.MODIFY_NETWORK_ACCOUNTING</code>” permission to
|
||
re-assign the ownership of the network traffic.</p>
|
||
|
||
</body>
|
||
</html>
|