diff options
Diffstat (limited to 'services/core/java/com/android/server/NetPluginDelegate.java')
-rw-r--r-- | services/core/java/com/android/server/NetPluginDelegate.java | 113 |
1 files changed, 113 insertions, 0 deletions
diff --git a/services/core/java/com/android/server/NetPluginDelegate.java b/services/core/java/com/android/server/NetPluginDelegate.java new file mode 100644 index 0000000..18365f1 --- /dev/null +++ b/services/core/java/com/android/server/NetPluginDelegate.java @@ -0,0 +1,113 @@ +/* + *Copyright (c) 2015, The Linux Foundation. All rights reserved. + * + *Redistribution and use in source and binary forms, with or without + *modification, are permitted provided that the following conditions are + *met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following + * disclaimer in the documentation and/or other materials provided + * with the distribution. + * * Neither the name of The Linux Foundation nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + *THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED + *WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + *MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT + *ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS + *BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + *CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + *SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR + *BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + *WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE + *OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + *IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +package com.android.server; + +import dalvik.system.PathClassLoader; + +import android.util.Slog; +import android.net.Network; +import android.net.NetworkStats; +import android.util.Log; + +public class NetPluginDelegate { + + private static final String TAG = "ConnectivityExtension"; + private static final boolean LOGV = false; + + private static Class tetherExtensionClass = null; + private static Object tetherExtensionObj = null; + + private static boolean extensionFailed; + + public static void getTetherStats(NetworkStats uidStats, NetworkStats devStats, + NetworkStats xtStats) { + if (!loadTetherExtJar()) { + return; + } + try { + tetherExtensionClass.getMethod("getTetherStats", NetworkStats.class, + NetworkStats.class, NetworkStats.class).invoke(tetherExtensionObj, uidStats, + devStats, xtStats); + } catch (Exception e) { + e.printStackTrace(); + Log.w(TAG, "error in invoke method"); + } + if (LOGV) Slog.v(TAG, "getTetherStats() X"); + } + + public static void setQuota(String iface, long quota) { + if (!loadTetherExtJar()) { + return; + } + try { + tetherExtensionClass.getMethod("setQuota", String.class, long.class).invoke( + tetherExtensionObj, iface, quota); + } catch (Exception ex) { + Log.w(TAG, "Error calling setQuota Method on extension jar"); + } + if (LOGV) Slog.v(TAG, "setQuota(" + iface + ", " + quota + ") X"); + } + + public static void setUpstream(Network net) { + if (LOGV) Slog.v(TAG, "setUpstream(" + net + ") E"); + loadTetherExtJar(); + try { + tetherExtensionClass.getMethod("setUpstream", Network.class).invoke( + tetherExtensionObj, net); + } catch (Exception ex) { + Log.w(TAG, "Error calling setUpstream Method on extension jar"); + } + if (LOGV) Slog.v(TAG, "setUpstream(" + net + ") E"); + } + + + private static boolean loadTetherExtJar() { + final String realProvider = "com.qualcomm.qti.tetherstatsextension.TetherStatsReporting"; + final String realProviderPath = "/system/framework/ConnectivityExt.jar"; + if (!extensionFailed && tetherExtensionClass == null && tetherExtensionObj == null) { + if (LOGV) Slog.v(TAG, "loading ConnectivityExt jar"); + try { + + PathClassLoader classLoader = new PathClassLoader(realProviderPath, + ClassLoader.getSystemClassLoader()); + + tetherExtensionClass = classLoader.loadClass(realProvider); + tetherExtensionObj = tetherExtensionClass.newInstance(); + if (LOGV) + Slog.v(TAG, "ConnectivityExt jar loaded"); + extensionFailed = false; + } catch (Exception e) { + Log.w(TAG, "Connectivity extension is not available"); + extensionFailed = true; + } + } + return !extensionFailed; + } +} |