diff options
| -rw-r--r-- | api/current.xml | 132 | ||||
| -rw-r--r-- | core/java/android/net/TrafficStats.java | 135 | ||||
| -rw-r--r-- | core/jni/android_net_TrafficStats.cpp | 157 |
3 files changed, 417 insertions, 7 deletions
diff --git a/api/current.xml b/api/current.xml index 931ab1c34e70..6c44a32cdd6d 100644 --- a/api/current.xml +++ b/api/current.xml @@ -113730,6 +113730,71 @@ <parameter name="uid" type="int"> </parameter> </method> +<method name="getUidRxPackets" + return="long" + abstract="false" + native="true" + synchronized="false" + static="true" + final="false" + deprecated="not deprecated" + visibility="public" +> +<parameter name="uid" type="int"> +</parameter> +</method> +<method name="getUidTcpRxBytes" + return="long" + abstract="false" + native="true" + synchronized="false" + static="true" + final="false" + deprecated="not deprecated" + visibility="public" +> +<parameter name="uid" type="int"> +</parameter> +</method> +<method name="getUidTcpRxSegments" + return="long" + abstract="false" + native="true" + synchronized="false" + static="true" + final="false" + deprecated="not deprecated" + visibility="public" +> +<parameter name="uid" type="int"> +</parameter> +</method> +<method name="getUidTcpTxBytes" + return="long" + abstract="false" + native="true" + synchronized="false" + static="true" + final="false" + deprecated="not deprecated" + visibility="public" +> +<parameter name="uid" type="int"> +</parameter> +</method> +<method name="getUidTcpTxSegments" + return="long" + abstract="false" + native="true" + synchronized="false" + static="true" + final="false" + deprecated="not deprecated" + visibility="public" +> +<parameter name="uid" type="int"> +</parameter> +</method> <method name="getUidTxBytes" return="long" abstract="false" @@ -113743,6 +113808,71 @@ <parameter name="uid" type="int"> </parameter> </method> +<method name="getUidTxPackets" + return="long" + abstract="false" + native="true" + synchronized="false" + static="true" + final="false" + deprecated="not deprecated" + visibility="public" +> +<parameter name="uid" type="int"> +</parameter> +</method> +<method name="getUidUdpRxBytes" + return="long" + abstract="false" + native="true" + synchronized="false" + static="true" + final="false" + deprecated="not deprecated" + visibility="public" +> +<parameter name="uid" type="int"> +</parameter> +</method> +<method name="getUidUdpRxPackets" + return="long" + abstract="false" + native="true" + synchronized="false" + static="true" + final="false" + deprecated="not deprecated" + visibility="public" +> +<parameter name="uid" type="int"> +</parameter> +</method> +<method name="getUidUdpTxBytes" + return="long" + abstract="false" + native="true" + synchronized="false" + static="true" + final="false" + deprecated="not deprecated" + visibility="public" +> +<parameter name="uid" type="int"> +</parameter> +</method> +<method name="getUidUdpTxPackets" + return="long" + abstract="false" + native="true" + synchronized="false" + static="true" + final="false" + deprecated="not deprecated" + visibility="public" +> +<parameter name="uid" type="int"> +</parameter> +</method> <field name="UNSUPPORTED" type="int" transient="false" @@ -263474,7 +263604,7 @@ deprecated="not deprecated" visibility="public" > -<parameter name="t" type="T"> +<parameter name="arg0" type="T"> </parameter> </method> </interface> diff --git a/core/java/android/net/TrafficStats.java b/core/java/android/net/TrafficStats.java index 0d64dab179e9..0492fcec856b 100644 --- a/core/java/android/net/TrafficStats.java +++ b/core/java/android/net/TrafficStats.java @@ -122,4 +122,139 @@ public class TrafficStats { * @return number of bytes */ public static native long getUidRxBytes(int uid); + + /** + * Get the number of packets (TCP segments + UDP) sent through + * the network for this UID. + * The statistics are across all interfaces. + * + * {@see android.os.Process#myUid()}. + * + * @param uid The UID of the process to examine. + * @return number of packets. + * If the statistics are not supported by this device, + * {@link #UNSUPPORTED} will be returned. + */ + public static native long getUidTxPackets(int uid); + + /** + * Get the number of packets (TCP segments + UDP) received through + * the network for this UID. + * The statistics are across all interfaces. + * + * {@see android.os.Process#myUid()}. + * + * @param uid The UID of the process to examine. + * @return number of packets + */ + public static native long getUidRxPackets(int uid); + + /** + * Get the number of TCP payload bytes sent for this UID. + * This total does not include protocol and control overheads at + * the transport and the lower layers of the networking stack. + * The statistics are across all interfaces. + * + * {@see android.os.Process#myUid()}. + * + * @param uid The UID of the process to examine. + * @return number of bytes. If the statistics are not supported by this device, + * {@link #UNSUPPORTED} will be returned. + */ + public static native long getUidTcpTxBytes(int uid); + + /** + * Get the number of TCP payload bytes received for this UID. + * This total does not include protocol and control overheads at + * the transport and the lower layers of the networking stack. + * The statistics are across all interfaces. + * + * {@see android.os.Process#myUid()}. + * + * @param uid The UID of the process to examine. + * @return number of bytes. If the statistics are not supported by this device, + * {@link #UNSUPPORTED} will be returned. + */ + public static native long getUidTcpRxBytes(int uid); + + /** + * Get the number of UDP payload bytes sent for this UID. + * This total does not include protocol and control overheads at + * the transport and the lower layers of the networking stack. + * The statistics are across all interfaces. + * + * {@see android.os.Process#myUid()}. + * + * @param uid The UID of the process to examine. + * @return number of bytes. If the statistics are not supported by this device, + * {@link #UNSUPPORTED} will be returned. + */ + public static native long getUidUdpTxBytes(int uid); + + /** + * Get the number of UDP payload bytes received for this UID. + * This total does not include protocol and control overheads at + * the transport and the lower layers of the networking stack. + * The statistics are across all interfaces. + * + * {@see android.os.Process#myUid()}. + * + * @param uid The UID of the process to examine. + * @return number of bytes. If the statistics are not supported by this device, + * {@link #UNSUPPORTED} will be returned. + */ + public static native long getUidUdpRxBytes(int uid); + + /** + * Get the number of TCP segments sent for this UID. + * Does not include TCP control packets (SYN/ACKs/FIN/..). + * The statistics are across all interfaces. + * + * {@see android.os.Process#myUid()}. + * + * @param uid The UID of the process to examine. + * @return number of TCP segments. If the statistics are not supported by this device, + * {@link #UNSUPPORTED} will be returned. + */ + public static native long getUidTcpTxSegments(int uid); + + /** + * Get the number of TCP payload bytes received for this UID. + * Does not include TCP control packets (SYN/ACKs/FIN/..). + * The statistics are across all interfaces. + * + * {@see android.os.Process#myUid()}. + * + * @param uid The UID of the process to examine. + * @return number of TCP segments. If the statistics are not supported by this device, + * {@link #UNSUPPORTED} will be returned. + */ + public static native long getUidTcpRxSegments(int uid); + + + /** + * Get the number of UDP packets sent for this UID. + * Includes DNS requests. + * The statistics are across all interfaces. + * + * {@see android.os.Process#myUid()}. + * + * @param uid The UID of the process to examine. + * @return number of packets. If the statistics are not supported by this device, + * {@link #UNSUPPORTED} will be returned. + */ + public static native long getUidUdpTxPackets(int uid); + + /** + * Get the number of UDP packets received for this UID. + * Includes DNS responses. + * The statistics are across all interfaces. + * + * {@see android.os.Process#myUid()}. + * + * @param uid The UID of the process to examine. + * @return number of packets. If the statistics are not supported by this device, + * {@link #UNSUPPORTED} will be returned. + */ + public static native long getUidUdpRxPackets(int uid); } diff --git a/core/jni/android_net_TrafficStats.cpp b/core/jni/android_net_TrafficStats.cpp index ff46bdd2ba39..dfa36cee8176 100644 --- a/core/jni/android_net_TrafficStats.cpp +++ b/core/jni/android_net_TrafficStats.cpp @@ -30,6 +30,17 @@ namespace android { +enum Tx_Rx { + TX, + RX +}; + +enum Tcp_Udp { + TCP, + UDP, + TCP_AND_UDP +}; + // Returns an ASCII decimal number read from the specified file, -1 on error. static jlong readNumber(char const* filename) { #ifdef HAVE_ANDROID_OS @@ -140,16 +151,136 @@ static jlong getTotalRxBytes(JNIEnv* env, jobject clazz) { // Per-UID stats require reading from a constructed filename. +static jlong getUidBytes(JNIEnv* env, jobject clazz, jint uid, + enum Tx_Rx tx_or_rx, enum Tcp_Udp tcp_or_udp) { + char tcp_filename[80], udp_filename[80]; + jlong tcp_bytes = -1, udp_bytes = -1, total_bytes = -1; + + switch (tx_or_rx) { + case TX: + sprintf(tcp_filename, "/proc/uid_stat/%d/tcp_snd", uid); + sprintf(udp_filename, "/proc/uid_stat/%d/udp_snd", uid); + break; + case RX: + sprintf(tcp_filename, "/proc/uid_stat/%d/tcp_rcv", uid); + sprintf(udp_filename, "/proc/uid_stat/%d/udp_rcv", uid); + break; + default: + return -1; + } + + switch (tcp_or_udp) { + case TCP: + tcp_bytes = readNumber(tcp_filename); + total_bytes = (tcp_bytes >= 0) ? tcp_bytes : -1; + break; + case UDP: + udp_bytes = readNumber(udp_filename); + total_bytes = (udp_bytes >= 0) ? udp_bytes : -1; + break; + case TCP_AND_UDP: + tcp_bytes = readNumber(tcp_filename); + total_bytes += (tcp_bytes >= 0 ? tcp_bytes : 0); + + udp_bytes = readNumber(udp_filename); + total_bytes += (udp_bytes >= 0 ? udp_bytes : 0); + break; + default: + return -1; + } + + return total_bytes; +} + +static jlong getUidPkts(JNIEnv* env, jobject clazz, jint uid, + enum Tx_Rx tx_or_rx, enum Tcp_Udp tcp_or_udp) { + char tcp_filename[80], udp_filename[80]; + jlong tcp_pkts = -1, udp_pkts = -1, total_pkts = -1; + + switch (tx_or_rx) { + case TX: + sprintf(tcp_filename, "/proc/uid_stat/%d/tcp_snd_pkt", uid); + sprintf(udp_filename, "/proc/uid_stat/%d/udp_snd_pkt", uid); + break; + case RX: + sprintf(tcp_filename, "/proc/uid_stat/%d/tcp_rcv_pkt", uid); + sprintf(udp_filename, "/proc/uid_stat/%d/udp_rcv_pkt", uid); + break; + default: + return -1; + } + + switch (tcp_or_udp) { + case TCP: + tcp_pkts = readNumber(tcp_filename); + total_pkts = (tcp_pkts >= 0) ? tcp_pkts : -1; + break; + case UDP: + udp_pkts = readNumber(udp_filename); + total_pkts = (udp_pkts >= 0) ? udp_pkts : -1; + break; + case TCP_AND_UDP: + tcp_pkts = readNumber(tcp_filename); + total_pkts += (tcp_pkts >= 0 ? tcp_pkts : 0); + + udp_pkts = readNumber(udp_filename); + total_pkts += (udp_pkts >= 0 ? udp_pkts : 0); + break; + default: + return -1; + } + + return total_pkts; +} + static jlong getUidRxBytes(JNIEnv* env, jobject clazz, jint uid) { - char filename[80]; - sprintf(filename, "/proc/uid_stat/%d/tcp_rcv", uid); - return readNumber(filename); + return getUidBytes(env, clazz, uid, RX, TCP_AND_UDP); } static jlong getUidTxBytes(JNIEnv* env, jobject clazz, jint uid) { - char filename[80]; - sprintf(filename, "/proc/uid_stat/%d/tcp_snd", uid); - return readNumber(filename); + return getUidBytes(env, clazz, uid, TX, TCP_AND_UDP); +} + +/* TCP Segments + UDP Packets */ +static jlong getUidTxPackets(JNIEnv* env, jobject clazz, jint uid) { + return getUidPkts(env, clazz, uid, TX, TCP_AND_UDP); +} + +/* TCP Segments + UDP Packets */ +static jlong getUidRxPackets(JNIEnv* env, jobject clazz, jint uid) { + return getUidPkts(env, clazz, uid, RX, TCP_AND_UDP); +} + +static jlong getUidTcpTxBytes(JNIEnv* env, jobject clazz, jint uid) { + return getUidBytes(env, clazz, uid, TX, TCP); +} + +static jlong getUidTcpRxBytes(JNIEnv* env, jobject clazz, jint uid) { + return getUidBytes(env, clazz, uid, RX, TCP); +} + +static jlong getUidUdpTxBytes(JNIEnv* env, jobject clazz, jint uid) { + return getUidBytes(env, clazz, uid, TX, UDP); +} + +static jlong getUidUdpRxBytes(JNIEnv* env, jobject clazz, jint uid) { + return getUidBytes(env, clazz, uid, RX, UDP); +} + +static jlong getUidTcpTxSegments(JNIEnv* env, jobject clazz, jint uid) { + return getUidPkts(env, clazz, uid, TX, TCP); +} + +static jlong getUidTcpRxSegments(JNIEnv* env, jobject clazz, jint uid) { + return getUidPkts(env, clazz, uid, RX, TCP); +} + +static jlong getUidUdpTxPackets(JNIEnv* env, jobject clazz, jint uid) { + return getUidPkts(env, clazz, uid, TX, UDP); +} + +static jlong getUidUdpRxPackets(JNIEnv* env, jobject clazz, jint uid) { + return getUidPkts(env, clazz, uid, RX, UDP); } static JNINativeMethod gMethods[] = { @@ -161,8 +292,22 @@ static JNINativeMethod gMethods[] = { {"getTotalRxPackets", "()J", (void*) getTotalRxPackets}, {"getTotalTxBytes", "()J", (void*) getTotalTxBytes}, {"getTotalRxBytes", "()J", (void*) getTotalRxBytes}, + + /* Per-UID Stats */ {"getUidTxBytes", "(I)J", (void*) getUidTxBytes}, {"getUidRxBytes", "(I)J", (void*) getUidRxBytes}, + {"getUidTxPackets", "(I)J", (void*) getUidTxPackets}, + {"getUidRxPackets", "(I)J", (void*) getUidRxPackets}, + + {"getUidTcpTxBytes", "(I)J", (void*) getUidTcpTxBytes}, + {"getUidTcpRxBytes", "(I)J", (void*) getUidTcpRxBytes}, + {"getUidUdpTxBytes", "(I)J", (void*) getUidUdpTxBytes}, + {"getUidUdpRxBytes", "(I)J", (void*) getUidUdpRxBytes}, + + {"getUidTcpTxSegments", "(I)J", (void*) getUidTcpTxSegments}, + {"getUidTcpRxSegments", "(I)J", (void*) getUidTcpRxSegments}, + {"getUidUdpTxPackets", "(I)J", (void*) getUidUdpTxPackets}, + {"getUidUdpRxPackets", "(I)J", (void*) getUidUdpRxPackets}, }; int register_android_net_TrafficStats(JNIEnv* env) { |