1873f2145941cc28f6931dc18b5e9987bd22e2e19San Mehat/* 2873f2145941cc28f6931dc18b5e9987bd22e2e19San Mehat * Copyright (C) 2007 The Android Open Source Project 3873f2145941cc28f6931dc18b5e9987bd22e2e19San Mehat * 4873f2145941cc28f6931dc18b5e9987bd22e2e19San Mehat * Licensed under the Apache License, Version 2.0 (the "License"); 5873f2145941cc28f6931dc18b5e9987bd22e2e19San Mehat * you may not use this file except in compliance with the License. 6873f2145941cc28f6931dc18b5e9987bd22e2e19San Mehat * You may obtain a copy of the License at 7873f2145941cc28f6931dc18b5e9987bd22e2e19San Mehat * 8873f2145941cc28f6931dc18b5e9987bd22e2e19San Mehat * http://www.apache.org/licenses/LICENSE-2.0 9873f2145941cc28f6931dc18b5e9987bd22e2e19San Mehat * 10873f2145941cc28f6931dc18b5e9987bd22e2e19San Mehat * Unless required by applicable law or agreed to in writing, software 11873f2145941cc28f6931dc18b5e9987bd22e2e19San Mehat * distributed under the License is distributed on an "AS IS" BASIS, 12873f2145941cc28f6931dc18b5e9987bd22e2e19San Mehat * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13873f2145941cc28f6931dc18b5e9987bd22e2e19San Mehat * See the License for the specific language governing permissions and 14873f2145941cc28f6931dc18b5e9987bd22e2e19San Mehat * limitations under the License. 15873f2145941cc28f6931dc18b5e9987bd22e2e19San Mehat */ 16873f2145941cc28f6931dc18b5e9987bd22e2e19San Mehat 17873f2145941cc28f6931dc18b5e9987bd22e2e19San Mehatpackage com.android.server; 18873f2145941cc28f6931dc18b5e9987bd22e2e19San Mehat 194529bb66c47fd02b990ecb0810031157b4f36c2fJeff Sharkeyimport static android.Manifest.permission.CONNECTIVITY_INTERNAL; 2047eb102b40cd1324d89816a7fb0fecd14fd7a408Jeff Sharkeyimport static android.Manifest.permission.DUMP; 21af75c33e8d7f1a27c6c0d71820730ea8525019a3Jeff Sharkeyimport static android.Manifest.permission.SHUTDOWN; 22b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkeyimport static android.net.NetworkStats.SET_DEFAULT; 231b5a2a96f793211bfbd39aa29cc41031dfa23950Jeff Sharkeyimport static android.net.NetworkStats.TAG_NONE; 241b5a2a96f793211bfbd39aa29cc41031dfa23950Jeff Sharkeyimport static android.net.NetworkStats.UID_ALL; 25ae2c1810839430c84e4a1172580d9c4b18f568caJeff Sharkeyimport static android.net.TrafficStats.UID_TETHERING; 26ba2896e939f359e5857149f1a27212db71be012bJeff Sharkeyimport static com.android.server.NetworkManagementService.NetdResponseCode.InterfaceGetCfgResult; 27ba2896e939f359e5857149f1a27212db71be012bJeff Sharkeyimport static com.android.server.NetworkManagementService.NetdResponseCode.InterfaceListResult; 28ba2896e939f359e5857149f1a27212db71be012bJeff Sharkeyimport static com.android.server.NetworkManagementService.NetdResponseCode.InterfaceRxThrottleResult; 29ba2896e939f359e5857149f1a27212db71be012bJeff Sharkeyimport static com.android.server.NetworkManagementService.NetdResponseCode.InterfaceTxThrottleResult; 30ba2896e939f359e5857149f1a27212db71be012bJeff Sharkeyimport static com.android.server.NetworkManagementService.NetdResponseCode.IpFwdStatusResult; 31ba2896e939f359e5857149f1a27212db71be012bJeff Sharkeyimport static com.android.server.NetworkManagementService.NetdResponseCode.TetherDnsFwdTgtListResult; 32ba2896e939f359e5857149f1a27212db71be012bJeff Sharkeyimport static com.android.server.NetworkManagementService.NetdResponseCode.TetherInterfaceListResult; 33ba2896e939f359e5857149f1a27212db71be012bJeff Sharkeyimport static com.android.server.NetworkManagementService.NetdResponseCode.TetherStatusResult; 34ba2896e939f359e5857149f1a27212db71be012bJeff Sharkeyimport static com.android.server.NetworkManagementService.NetdResponseCode.TetheringStatsResult; 35ba2896e939f359e5857149f1a27212db71be012bJeff Sharkeyimport static com.android.server.NetworkManagementService.NetdResponseCode.TtyListResult; 36a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkeyimport static com.android.server.NetworkManagementSocketTagger.PROP_QTAGUID_ENABLED; 371b5a2a96f793211bfbd39aa29cc41031dfa23950Jeff Sharkey 38c268f0b19efd0b6c6c89c21be0893787f3cc9cf7Jeff Sharkeyimport android.bluetooth.BluetoothTetheringDataTracker; 39873f2145941cc28f6931dc18b5e9987bd22e2e19San Mehatimport android.content.Context; 404d02d001ef6e06583e858e63e48d1aebf54ba28dSan Mehatimport android.net.INetworkManagementEventObserver; 41eedcb9525ba5befee2ba6ebb7a9ee3f13395c2a3Jeff Sharkeyimport android.net.InterfaceConfiguration; 42ed1264093234b1f1354cd5f669eb82a50bb56869Robert Greenwaltimport android.net.LinkAddress; 43eedcb9525ba5befee2ba6ebb7a9ee3f13395c2a3Jeff Sharkeyimport android.net.NetworkStats; 44ed1264093234b1f1354cd5f669eb82a50bb56869Robert Greenwaltimport android.net.NetworkUtils; 4559b1a4ede7032c1b4d897e13dd4ede09b5e14743Robert Greenwaltimport android.net.RouteInfo; 469ab518ad793385f8405edf19363fe825fb64f5f8Irfan Sheriffimport android.net.wifi.WifiConfiguration; 479ab518ad793385f8405edf19363fe825fb64f5f8Irfan Sheriffimport android.net.wifi.WifiConfiguration.KeyMgmt; 48f56e2435b64f9638e029777fa9492d42f157033eJeff Sharkeyimport android.os.Binder; 49b24a78589b2bee4a86d5c864dd69169e134a339bJeff Sharkeyimport android.os.Handler; 50873f2145941cc28f6931dc18b5e9987bd22e2e19San Mehatimport android.os.INetworkManagementService; 51f56e2435b64f9638e029777fa9492d42f157033eJeff Sharkeyimport android.os.Process; 523df273e45864ba595b4d870fa3f6c81a770078e2Jeff Sharkeyimport android.os.RemoteCallbackList; 533df273e45864ba595b4d870fa3f6c81a770078e2Jeff Sharkeyimport android.os.RemoteException; 549a13f36cddaad01350bdb5f000167811a1d753c9Jeff Sharkeyimport android.os.SystemClock; 5562dbb22bd4878369975492c8a1c234840e418a4fMarco Nelissenimport android.os.SystemProperties; 569ab518ad793385f8405edf19363fe825fb64f5f8Irfan Sheriffimport android.util.Log; 578a9b22056b13477f59df934928c00c58b5871c95Joe Onoratoimport android.util.Slog; 58b3f19ca36c8c1301893c621d8f2150e06210722cJeff Sharkeyimport android.util.SparseBooleanArray; 59873f2145941cc28f6931dc18b5e9987bd22e2e19San Mehat 601059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkeyimport com.android.internal.net.NetworkStatsFactory; 61c268f0b19efd0b6c6c89c21be0893787f3cc9cf7Jeff Sharkeyimport com.android.internal.util.Preconditions; 62ba2896e939f359e5857149f1a27212db71be012bJeff Sharkeyimport com.android.server.NativeDaemonConnector.Command; 6369ddab4575ff684c533c995e07ca15fe18543fc0Jeff Sharkeyimport com.android.server.net.LockdownVpnTracker; 64b24a78589b2bee4a86d5c864dd69169e134a339bJeff Sharkeyimport com.google.android.collect.Maps; 654414cea13908b8230640f84ef39603d68ff9c377Jeff Sharkey 6659b1a4ede7032c1b4d897e13dd4ede09b5e14743Robert Greenwaltimport java.io.BufferedReader; 6759b1a4ede7032c1b4d897e13dd4ede09b5e14743Robert Greenwaltimport java.io.DataInputStream; 68873f2145941cc28f6931dc18b5e9987bd22e2e19San Mehatimport java.io.File; 6947eb102b40cd1324d89816a7fb0fecd14fd7a408Jeff Sharkeyimport java.io.FileDescriptor; 709a13f36cddaad01350bdb5f000167811a1d753c9Jeff Sharkeyimport java.io.FileInputStream; 719a13f36cddaad01350bdb5f000167811a1d753c9Jeff Sharkeyimport java.io.IOException; 729a13f36cddaad01350bdb5f000167811a1d753c9Jeff Sharkeyimport java.io.InputStreamReader; 7347eb102b40cd1324d89816a7fb0fecd14fd7a408Jeff Sharkeyimport java.io.PrintWriter; 7459b1a4ede7032c1b4d897e13dd4ede09b5e14743Robert Greenwaltimport java.net.Inet4Address; 75eedcb9525ba5befee2ba6ebb7a9ee3f13395c2a3Jeff Sharkeyimport java.net.InetAddress; 763b28e9a3daede9eac44faeb736ab4c8386ddd089Robert Greenwaltimport java.net.InterfaceAddress; 773b28e9a3daede9eac44faeb736ab4c8386ddd089Robert Greenwaltimport java.net.NetworkInterface; 783b28e9a3daede9eac44faeb736ab4c8386ddd089Robert Greenwaltimport java.net.SocketException; 79eedcb9525ba5befee2ba6ebb7a9ee3f13395c2a3Jeff Sharkeyimport java.util.ArrayList; 803b28e9a3daede9eac44faeb736ab4c8386ddd089Robert Greenwaltimport java.util.Collection; 81b24a78589b2bee4a86d5c864dd69169e134a339bJeff Sharkeyimport java.util.HashMap; 82b24a78589b2bee4a86d5c864dd69169e134a339bJeff Sharkeyimport java.util.Map; 83eedcb9525ba5befee2ba6ebb7a9ee3f13395c2a3Jeff Sharkeyimport java.util.NoSuchElementException; 84eedcb9525ba5befee2ba6ebb7a9ee3f13395c2a3Jeff Sharkeyimport java.util.StringTokenizer; 85e5c3afb29241fd3faae309f973645d7f6a7ed111Robert Greenwaltimport java.util.concurrent.CountDownLatch; 86873f2145941cc28f6931dc18b5e9987bd22e2e19San Mehat 87873f2145941cc28f6931dc18b5e9987bd22e2e19San Mehat/** 88873f2145941cc28f6931dc18b5e9987bd22e2e19San Mehat * @hide 89873f2145941cc28f6931dc18b5e9987bd22e2e19San Mehat */ 908e9992ae5053a3ac52d28a5a892aed0a0798c7abJeff Sharkeypublic class NetworkManagementService extends INetworkManagementService.Stub 918e9992ae5053a3ac52d28a5a892aed0a0798c7abJeff Sharkey implements Watchdog.Monitor { 92eedcb9525ba5befee2ba6ebb7a9ee3f13395c2a3Jeff Sharkey private static final String TAG = "NetworkManagementService"; 93cef65eeb0315c3118bf8860d6f723cb49ff6bc52Dianne Hackborn private static final boolean DBG = false; 94305bcbf0c961840c4505770d084a1caacc074dbbKenny Root private static final String NETD_TAG = "NetdConnector"; 95305bcbf0c961840c4505770d084a1caacc074dbbKenny Root 96ba2896e939f359e5857149f1a27212db71be012bJeff Sharkey private static final String ADD = "add"; 97ba2896e939f359e5857149f1a27212db71be012bJeff Sharkey private static final String REMOVE = "remove"; 9859b1a4ede7032c1b4d897e13dd4ede09b5e14743Robert Greenwalt 99c268f0b19efd0b6c6c89c21be0893787f3cc9cf7Jeff Sharkey private static final String ALLOW = "allow"; 100c268f0b19efd0b6c6c89c21be0893787f3cc9cf7Jeff Sharkey private static final String DENY = "deny"; 101c268f0b19efd0b6c6c89c21be0893787f3cc9cf7Jeff Sharkey 1023b28e9a3daede9eac44faeb736ab4c8386ddd089Robert Greenwalt private static final String DEFAULT = "default"; 1033b28e9a3daede9eac44faeb736ab4c8386ddd089Robert Greenwalt private static final String SECONDARY = "secondary"; 1043b28e9a3daede9eac44faeb736ab4c8386ddd089Robert Greenwalt 1058e9992ae5053a3ac52d28a5a892aed0a0798c7abJeff Sharkey /** 1068e9992ae5053a3ac52d28a5a892aed0a0798c7abJeff Sharkey * Name representing {@link #setGlobalAlert(long)} limit when delivered to 1078e9992ae5053a3ac52d28a5a892aed0a0798c7abJeff Sharkey * {@link INetworkManagementEventObserver#limitReached(String, String)}. 1088e9992ae5053a3ac52d28a5a892aed0a0798c7abJeff Sharkey */ 1098e9992ae5053a3ac52d28a5a892aed0a0798c7abJeff Sharkey public static final String LIMIT_GLOBAL_ALERT = "globalAlert"; 1108e9992ae5053a3ac52d28a5a892aed0a0798c7abJeff Sharkey 111873f2145941cc28f6931dc18b5e9987bd22e2e19San Mehat class NetdResponseCode { 11212b933d0d9252decaae9fee2456bb1e1cd94c085JP Abgrall /* Keep in sync with system/netd/ResponseCode.h */ 113873f2145941cc28f6931dc18b5e9987bd22e2e19San Mehat public static final int InterfaceListResult = 110; 114873f2145941cc28f6931dc18b5e9987bd22e2e19San Mehat public static final int TetherInterfaceListResult = 111; 115873f2145941cc28f6931dc18b5e9987bd22e2e19San Mehat public static final int TetherDnsFwdTgtListResult = 112; 11672759df749bb8557269db86c2e3b2a8a0343cc26San Mehat public static final int TtyListResult = 113; 117873f2145941cc28f6931dc18b5e9987bd22e2e19San Mehat 118873f2145941cc28f6931dc18b5e9987bd22e2e19San Mehat public static final int TetherStatusResult = 210; 119873f2145941cc28f6931dc18b5e9987bd22e2e19San Mehat public static final int IpFwdStatusResult = 211; 120ed4fc8acc52d89f1d4dec853a29288c6d06717c3San Mehat public static final int InterfaceGetCfgResult = 213; 121e325392c257a5460de6327420c81729f4e687881Robert Greenwalt public static final int SoftapStatusResult = 214; 12291cac64cd010e6b4006fdd14b39dbc75778f20cbSan Mehat public static final int InterfaceRxCounterResult = 216; 12391cac64cd010e6b4006fdd14b39dbc75778f20cbSan Mehat public static final int InterfaceTxCounterResult = 217; 12491cac64cd010e6b4006fdd14b39dbc75778f20cbSan Mehat public static final int InterfaceRxThrottleResult = 218; 12591cac64cd010e6b4006fdd14b39dbc75778f20cbSan Mehat public static final int InterfaceTxThrottleResult = 219; 126cdd02c5d76d3dd4e21b5bb922d7fcfb86efec85fJeff Sharkey public static final int QuotaCounterResult = 220; 127cdd02c5d76d3dd4e21b5bb922d7fcfb86efec85fJeff Sharkey public static final int TetheringStatsResult = 221; 12884c00c67d70af4797c098f20124b9f8882980649Selim Gurun public static final int DnsProxyQueryResult = 222; 129e325392c257a5460de6327420c81729f4e687881Robert Greenwalt 130e325392c257a5460de6327420c81729f4e687881Robert Greenwalt public static final int InterfaceChange = 600; 13112b933d0d9252decaae9fee2456bb1e1cd94c085JP Abgrall public static final int BandwidthControl = 601; 1326b7358d9511df7e519bb417fbed6017c06a33d45Haoyu Bai public static final int InterfaceClassActivity = 613; 133873f2145941cc28f6931dc18b5e9987bd22e2e19San Mehat } 134873f2145941cc28f6931dc18b5e9987bd22e2e19San Mehat 135873f2145941cc28f6931dc18b5e9987bd22e2e19San Mehat /** 136873f2145941cc28f6931dc18b5e9987bd22e2e19San Mehat * Binder context for this service 137873f2145941cc28f6931dc18b5e9987bd22e2e19San Mehat */ 138873f2145941cc28f6931dc18b5e9987bd22e2e19San Mehat private Context mContext; 139873f2145941cc28f6931dc18b5e9987bd22e2e19San Mehat 140873f2145941cc28f6931dc18b5e9987bd22e2e19San Mehat /** 141873f2145941cc28f6931dc18b5e9987bd22e2e19San Mehat * connector object for communicating with netd 142873f2145941cc28f6931dc18b5e9987bd22e2e19San Mehat */ 143873f2145941cc28f6931dc18b5e9987bd22e2e19San Mehat private NativeDaemonConnector mConnector; 144873f2145941cc28f6931dc18b5e9987bd22e2e19San Mehat 145b24a78589b2bee4a86d5c864dd69169e134a339bJeff Sharkey private final Handler mMainHandler = new Handler(); 146b24a78589b2bee4a86d5c864dd69169e134a339bJeff Sharkey 147e5c3afb29241fd3faae309f973645d7f6a7ed111Robert Greenwalt private Thread mThread; 148b24a78589b2bee4a86d5c864dd69169e134a339bJeff Sharkey private CountDownLatch mConnectedSignal = new CountDownLatch(1); 149e5c3afb29241fd3faae309f973645d7f6a7ed111Robert Greenwalt 1503df273e45864ba595b4d870fa3f6c81a770078e2Jeff Sharkey private final RemoteCallbackList<INetworkManagementEventObserver> mObservers = 1513df273e45864ba595b4d870fa3f6c81a770078e2Jeff Sharkey new RemoteCallbackList<INetworkManagementEventObserver>(); 1524d02d001ef6e06583e858e63e48d1aebf54ba28dSan Mehat 1531059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey private final NetworkStatsFactory mStatsFactory = new NetworkStatsFactory(); 1541059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey 15541ff7ec82422a5b6d00892afdb3232bc0e53d851Jeff Sharkey private Object mQuotaLock = new Object(); 156b3f19ca36c8c1301893c621d8f2150e06210722cJeff Sharkey /** Set of interfaces with active quotas. */ 157b24a78589b2bee4a86d5c864dd69169e134a339bJeff Sharkey private HashMap<String, Long> mActiveQuotas = Maps.newHashMap(); 15841ff7ec82422a5b6d00892afdb3232bc0e53d851Jeff Sharkey /** Set of interfaces with active alerts. */ 159b24a78589b2bee4a86d5c864dd69169e134a339bJeff Sharkey private HashMap<String, Long> mActiveAlerts = Maps.newHashMap(); 160b3f19ca36c8c1301893c621d8f2150e06210722cJeff Sharkey /** Set of UIDs with active reject rules. */ 161b3f19ca36c8c1301893c621d8f2150e06210722cJeff Sharkey private SparseBooleanArray mUidRejectOnQuota = new SparseBooleanArray(); 162b3f19ca36c8c1301893c621d8f2150e06210722cJeff Sharkey 1630412423f06ec633203b96f68b51f0720c33a2473Haoyu Bai private Object mIdleTimerLock = new Object(); 1640412423f06ec633203b96f68b51f0720c33a2473Haoyu Bai /** Set of interfaces with active idle timers. */ 1650412423f06ec633203b96f68b51f0720c33a2473Haoyu Bai private static class IdleTimerParams { 1660412423f06ec633203b96f68b51f0720c33a2473Haoyu Bai public final int timeout; 1670412423f06ec633203b96f68b51f0720c33a2473Haoyu Bai public final String label; 1680412423f06ec633203b96f68b51f0720c33a2473Haoyu Bai public int networkCount; 1690412423f06ec633203b96f68b51f0720c33a2473Haoyu Bai 1700412423f06ec633203b96f68b51f0720c33a2473Haoyu Bai IdleTimerParams(int timeout, String label) { 1710412423f06ec633203b96f68b51f0720c33a2473Haoyu Bai this.timeout = timeout; 1720412423f06ec633203b96f68b51f0720c33a2473Haoyu Bai this.label = label; 1730412423f06ec633203b96f68b51f0720c33a2473Haoyu Bai this.networkCount = 1; 1740412423f06ec633203b96f68b51f0720c33a2473Haoyu Bai } 1750412423f06ec633203b96f68b51f0720c33a2473Haoyu Bai } 1760412423f06ec633203b96f68b51f0720c33a2473Haoyu Bai private HashMap<String, IdleTimerParams> mActiveIdleTimers = Maps.newHashMap(); 1770412423f06ec633203b96f68b51f0720c33a2473Haoyu Bai 178fa23c5ae226c1a1d39f89c5c87d4f340e91d90e0Jeff Sharkey private volatile boolean mBandwidthControlEnabled; 179c268f0b19efd0b6c6c89c21be0893787f3cc9cf7Jeff Sharkey private volatile boolean mFirewallEnabled; 180350083e36b9db6062e165954403ef921ff3dfdadJeff Sharkey 181873f2145941cc28f6931dc18b5e9987bd22e2e19San Mehat /** 182873f2145941cc28f6931dc18b5e9987bd22e2e19San Mehat * Constructs a new NetworkManagementService instance 183873f2145941cc28f6931dc18b5e9987bd22e2e19San Mehat * 184873f2145941cc28f6931dc18b5e9987bd22e2e19San Mehat * @param context Binder context for this service 185873f2145941cc28f6931dc18b5e9987bd22e2e19San Mehat */ 1861059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey private NetworkManagementService(Context context) { 187873f2145941cc28f6931dc18b5e9987bd22e2e19San Mehat mContext = context; 1884d02d001ef6e06583e858e63e48d1aebf54ba28dSan Mehat 18962dbb22bd4878369975492c8a1c234840e418a4fMarco Nelissen if ("simulator".equals(SystemProperties.get("ro.product.device"))) { 19062dbb22bd4878369975492c8a1c234840e418a4fMarco Nelissen return; 19162dbb22bd4878369975492c8a1c234840e418a4fMarco Nelissen } 19262dbb22bd4878369975492c8a1c234840e418a4fMarco Nelissen 193873f2145941cc28f6931dc18b5e9987bd22e2e19San Mehat mConnector = new NativeDaemonConnector( 1945a0c320a820a0ccaafaa87ad858a29bf5d88a8b9Robert Greenwalt new NetdCallbackReceiver(), "netd", 10, NETD_TAG, 160); 195e5c3afb29241fd3faae309f973645d7f6a7ed111Robert Greenwalt mThread = new Thread(mConnector, NETD_TAG); 196fa23c5ae226c1a1d39f89c5c87d4f340e91d90e0Jeff Sharkey 197fa23c5ae226c1a1d39f89c5c87d4f340e91d90e0Jeff Sharkey // Add ourself to the Watchdog monitors. 198fa23c5ae226c1a1d39f89c5c87d4f340e91d90e0Jeff Sharkey Watchdog.getInstance().addMonitor(this); 199e5c3afb29241fd3faae309f973645d7f6a7ed111Robert Greenwalt } 200e5c3afb29241fd3faae309f973645d7f6a7ed111Robert Greenwalt 201e5c3afb29241fd3faae309f973645d7f6a7ed111Robert Greenwalt public static NetworkManagementService create(Context context) throws InterruptedException { 202b24a78589b2bee4a86d5c864dd69169e134a339bJeff Sharkey final NetworkManagementService service = new NetworkManagementService(context); 203b24a78589b2bee4a86d5c864dd69169e134a339bJeff Sharkey final CountDownLatch connectedSignal = service.mConnectedSignal; 204e5c3afb29241fd3faae309f973645d7f6a7ed111Robert Greenwalt if (DBG) Slog.d(TAG, "Creating NetworkManagementService"); 205e5c3afb29241fd3faae309f973645d7f6a7ed111Robert Greenwalt service.mThread.start(); 206e5c3afb29241fd3faae309f973645d7f6a7ed111Robert Greenwalt if (DBG) Slog.d(TAG, "Awaiting socket connection"); 207b24a78589b2bee4a86d5c864dd69169e134a339bJeff Sharkey connectedSignal.await(); 208e5c3afb29241fd3faae309f973645d7f6a7ed111Robert Greenwalt if (DBG) Slog.d(TAG, "Connected"); 209e5c3afb29241fd3faae309f973645d7f6a7ed111Robert Greenwalt return service; 210873f2145941cc28f6931dc18b5e9987bd22e2e19San Mehat } 211873f2145941cc28f6931dc18b5e9987bd22e2e19San Mehat 212350083e36b9db6062e165954403ef921ff3dfdadJeff Sharkey public void systemReady() { 213b24a78589b2bee4a86d5c864dd69169e134a339bJeff Sharkey prepareNativeDaemon(); 214b24a78589b2bee4a86d5c864dd69169e134a339bJeff Sharkey if (DBG) Slog.d(TAG, "Prepared"); 215350083e36b9db6062e165954403ef921ff3dfdadJeff Sharkey } 216350083e36b9db6062e165954403ef921ff3dfdadJeff Sharkey 217af75c33e8d7f1a27c6c0d71820730ea8525019a3Jeff Sharkey @Override 2183df273e45864ba595b4d870fa3f6c81a770078e2Jeff Sharkey public void registerObserver(INetworkManagementEventObserver observer) { 2194529bb66c47fd02b990ecb0810031157b4f36c2fJeff Sharkey mContext.enforceCallingOrSelfPermission(CONNECTIVITY_INTERNAL, TAG); 2203df273e45864ba595b4d870fa3f6c81a770078e2Jeff Sharkey mObservers.register(observer); 2214d02d001ef6e06583e858e63e48d1aebf54ba28dSan Mehat } 2224d02d001ef6e06583e858e63e48d1aebf54ba28dSan Mehat 223af75c33e8d7f1a27c6c0d71820730ea8525019a3Jeff Sharkey @Override 2243df273e45864ba595b4d870fa3f6c81a770078e2Jeff Sharkey public void unregisterObserver(INetworkManagementEventObserver observer) { 2254529bb66c47fd02b990ecb0810031157b4f36c2fJeff Sharkey mContext.enforceCallingOrSelfPermission(CONNECTIVITY_INTERNAL, TAG); 2263df273e45864ba595b4d870fa3f6c81a770078e2Jeff Sharkey mObservers.unregister(observer); 2274d02d001ef6e06583e858e63e48d1aebf54ba28dSan Mehat } 2284d02d001ef6e06583e858e63e48d1aebf54ba28dSan Mehat 2294d02d001ef6e06583e858e63e48d1aebf54ba28dSan Mehat /** 2306143f5f7392fb0d3e5702a46a2415bd0ecb6efb4Mike J. Chen * Notify our observers of an interface status change 2314d02d001ef6e06583e858e63e48d1aebf54ba28dSan Mehat */ 2326143f5f7392fb0d3e5702a46a2415bd0ecb6efb4Mike J. Chen private void notifyInterfaceStatusChanged(String iface, boolean up) { 2333df273e45864ba595b4d870fa3f6c81a770078e2Jeff Sharkey final int length = mObservers.beginBroadcast(); 2343df273e45864ba595b4d870fa3f6c81a770078e2Jeff Sharkey for (int i = 0; i < length; i++) { 2354d02d001ef6e06583e858e63e48d1aebf54ba28dSan Mehat try { 2363df273e45864ba595b4d870fa3f6c81a770078e2Jeff Sharkey mObservers.getBroadcastItem(i).interfaceStatusChanged(iface, up); 2373df273e45864ba595b4d870fa3f6c81a770078e2Jeff Sharkey } catch (RemoteException e) { 2386143f5f7392fb0d3e5702a46a2415bd0ecb6efb4Mike J. Chen } 2396143f5f7392fb0d3e5702a46a2415bd0ecb6efb4Mike J. Chen } 2403df273e45864ba595b4d870fa3f6c81a770078e2Jeff Sharkey mObservers.finishBroadcast(); 2416143f5f7392fb0d3e5702a46a2415bd0ecb6efb4Mike J. Chen } 2426143f5f7392fb0d3e5702a46a2415bd0ecb6efb4Mike J. Chen 2436143f5f7392fb0d3e5702a46a2415bd0ecb6efb4Mike J. Chen /** 244f59c7d0f2ac8d489b6d8118543a57ea4a603eacfMike J. Chen * Notify our observers of an interface link state change 2456143f5f7392fb0d3e5702a46a2415bd0ecb6efb4Mike J. Chen * (typically, an Ethernet cable has been plugged-in or unplugged). 2466143f5f7392fb0d3e5702a46a2415bd0ecb6efb4Mike J. Chen */ 2476143f5f7392fb0d3e5702a46a2415bd0ecb6efb4Mike J. Chen private void notifyInterfaceLinkStateChanged(String iface, boolean up) { 2483df273e45864ba595b4d870fa3f6c81a770078e2Jeff Sharkey final int length = mObservers.beginBroadcast(); 2493df273e45864ba595b4d870fa3f6c81a770078e2Jeff Sharkey for (int i = 0; i < length; i++) { 2506143f5f7392fb0d3e5702a46a2415bd0ecb6efb4Mike J. Chen try { 2513df273e45864ba595b4d870fa3f6c81a770078e2Jeff Sharkey mObservers.getBroadcastItem(i).interfaceLinkStateChanged(iface, up); 2523df273e45864ba595b4d870fa3f6c81a770078e2Jeff Sharkey } catch (RemoteException e) { 2534d02d001ef6e06583e858e63e48d1aebf54ba28dSan Mehat } 2544d02d001ef6e06583e858e63e48d1aebf54ba28dSan Mehat } 2553df273e45864ba595b4d870fa3f6c81a770078e2Jeff Sharkey mObservers.finishBroadcast(); 2564d02d001ef6e06583e858e63e48d1aebf54ba28dSan Mehat } 2574d02d001ef6e06583e858e63e48d1aebf54ba28dSan Mehat 2584d02d001ef6e06583e858e63e48d1aebf54ba28dSan Mehat /** 2594d02d001ef6e06583e858e63e48d1aebf54ba28dSan Mehat * Notify our observers of an interface addition. 2604d02d001ef6e06583e858e63e48d1aebf54ba28dSan Mehat */ 2614d02d001ef6e06583e858e63e48d1aebf54ba28dSan Mehat private void notifyInterfaceAdded(String iface) { 2623df273e45864ba595b4d870fa3f6c81a770078e2Jeff Sharkey final int length = mObservers.beginBroadcast(); 2633df273e45864ba595b4d870fa3f6c81a770078e2Jeff Sharkey for (int i = 0; i < length; i++) { 2644d02d001ef6e06583e858e63e48d1aebf54ba28dSan Mehat try { 2653df273e45864ba595b4d870fa3f6c81a770078e2Jeff Sharkey mObservers.getBroadcastItem(i).interfaceAdded(iface); 2663df273e45864ba595b4d870fa3f6c81a770078e2Jeff Sharkey } catch (RemoteException e) { 2674d02d001ef6e06583e858e63e48d1aebf54ba28dSan Mehat } 2684d02d001ef6e06583e858e63e48d1aebf54ba28dSan Mehat } 2693df273e45864ba595b4d870fa3f6c81a770078e2Jeff Sharkey mObservers.finishBroadcast(); 2704d02d001ef6e06583e858e63e48d1aebf54ba28dSan Mehat } 2714d02d001ef6e06583e858e63e48d1aebf54ba28dSan Mehat 2724d02d001ef6e06583e858e63e48d1aebf54ba28dSan Mehat /** 2734d02d001ef6e06583e858e63e48d1aebf54ba28dSan Mehat * Notify our observers of an interface removal. 2744d02d001ef6e06583e858e63e48d1aebf54ba28dSan Mehat */ 2754d02d001ef6e06583e858e63e48d1aebf54ba28dSan Mehat private void notifyInterfaceRemoved(String iface) { 27689b8a2161ab6ad0211df305da1eebd6227a217e6Jeff Sharkey // netd already clears out quota and alerts for removed ifaces; update 27789b8a2161ab6ad0211df305da1eebd6227a217e6Jeff Sharkey // our sanity-checking state. 278b24a78589b2bee4a86d5c864dd69169e134a339bJeff Sharkey mActiveAlerts.remove(iface); 279b24a78589b2bee4a86d5c864dd69169e134a339bJeff Sharkey mActiveQuotas.remove(iface); 28089b8a2161ab6ad0211df305da1eebd6227a217e6Jeff Sharkey 2813df273e45864ba595b4d870fa3f6c81a770078e2Jeff Sharkey final int length = mObservers.beginBroadcast(); 2823df273e45864ba595b4d870fa3f6c81a770078e2Jeff Sharkey for (int i = 0; i < length; i++) { 2834d02d001ef6e06583e858e63e48d1aebf54ba28dSan Mehat try { 2843df273e45864ba595b4d870fa3f6c81a770078e2Jeff Sharkey mObservers.getBroadcastItem(i).interfaceRemoved(iface); 2853df273e45864ba595b4d870fa3f6c81a770078e2Jeff Sharkey } catch (RemoteException e) { 2864d02d001ef6e06583e858e63e48d1aebf54ba28dSan Mehat } 2874d02d001ef6e06583e858e63e48d1aebf54ba28dSan Mehat } 2883df273e45864ba595b4d870fa3f6c81a770078e2Jeff Sharkey mObservers.finishBroadcast(); 2894d02d001ef6e06583e858e63e48d1aebf54ba28dSan Mehat } 2904d02d001ef6e06583e858e63e48d1aebf54ba28dSan Mehat 291e5c3afb29241fd3faae309f973645d7f6a7ed111Robert Greenwalt /** 29212b933d0d9252decaae9fee2456bb1e1cd94c085JP Abgrall * Notify our observers of a limit reached. 29312b933d0d9252decaae9fee2456bb1e1cd94c085JP Abgrall */ 29412b933d0d9252decaae9fee2456bb1e1cd94c085JP Abgrall private void notifyLimitReached(String limitName, String iface) { 2953df273e45864ba595b4d870fa3f6c81a770078e2Jeff Sharkey final int length = mObservers.beginBroadcast(); 2963df273e45864ba595b4d870fa3f6c81a770078e2Jeff Sharkey for (int i = 0; i < length; i++) { 29712b933d0d9252decaae9fee2456bb1e1cd94c085JP Abgrall try { 2983df273e45864ba595b4d870fa3f6c81a770078e2Jeff Sharkey mObservers.getBroadcastItem(i).limitReached(limitName, iface); 2993df273e45864ba595b4d870fa3f6c81a770078e2Jeff Sharkey } catch (RemoteException e) { 30012b933d0d9252decaae9fee2456bb1e1cd94c085JP Abgrall } 30112b933d0d9252decaae9fee2456bb1e1cd94c085JP Abgrall } 3023df273e45864ba595b4d870fa3f6c81a770078e2Jeff Sharkey mObservers.finishBroadcast(); 30312b933d0d9252decaae9fee2456bb1e1cd94c085JP Abgrall } 30412b933d0d9252decaae9fee2456bb1e1cd94c085JP Abgrall 30512b933d0d9252decaae9fee2456bb1e1cd94c085JP Abgrall /** 306db3c8678e5cbdfec011afaf25bde2091152c30adHaoyu Bai * Notify our observers of a change in the data activity state of the interface 307db3c8678e5cbdfec011afaf25bde2091152c30adHaoyu Bai */ 308db3c8678e5cbdfec011afaf25bde2091152c30adHaoyu Bai private void notifyInterfaceClassActivity(String label, boolean active) { 309db3c8678e5cbdfec011afaf25bde2091152c30adHaoyu Bai final int length = mObservers.beginBroadcast(); 310db3c8678e5cbdfec011afaf25bde2091152c30adHaoyu Bai for (int i = 0; i < length; i++) { 311db3c8678e5cbdfec011afaf25bde2091152c30adHaoyu Bai try { 312db3c8678e5cbdfec011afaf25bde2091152c30adHaoyu Bai mObservers.getBroadcastItem(i).interfaceClassDataActivityChanged(label, active); 313db3c8678e5cbdfec011afaf25bde2091152c30adHaoyu Bai } catch (RemoteException e) { 314db3c8678e5cbdfec011afaf25bde2091152c30adHaoyu Bai } 315db3c8678e5cbdfec011afaf25bde2091152c30adHaoyu Bai } 316db3c8678e5cbdfec011afaf25bde2091152c30adHaoyu Bai mObservers.finishBroadcast(); 317db3c8678e5cbdfec011afaf25bde2091152c30adHaoyu Bai } 318db3c8678e5cbdfec011afaf25bde2091152c30adHaoyu Bai 319db3c8678e5cbdfec011afaf25bde2091152c30adHaoyu Bai /** 320b24a78589b2bee4a86d5c864dd69169e134a339bJeff Sharkey * Prepare native daemon once connected, enabling modules and pushing any 321b24a78589b2bee4a86d5c864dd69169e134a339bJeff Sharkey * existing in-memory rules. 322e5c3afb29241fd3faae309f973645d7f6a7ed111Robert Greenwalt */ 323b24a78589b2bee4a86d5c864dd69169e134a339bJeff Sharkey private void prepareNativeDaemon() { 324b24a78589b2bee4a86d5c864dd69169e134a339bJeff Sharkey mBandwidthControlEnabled = false; 325b24a78589b2bee4a86d5c864dd69169e134a339bJeff Sharkey 326b24a78589b2bee4a86d5c864dd69169e134a339bJeff Sharkey // only enable bandwidth control when support exists 327b24a78589b2bee4a86d5c864dd69169e134a339bJeff Sharkey final boolean hasKernelSupport = new File("/proc/net/xt_qtaguid/ctrl").exists(); 328b24a78589b2bee4a86d5c864dd69169e134a339bJeff Sharkey if (hasKernelSupport) { 329b24a78589b2bee4a86d5c864dd69169e134a339bJeff Sharkey Slog.d(TAG, "enabling bandwidth control"); 330b24a78589b2bee4a86d5c864dd69169e134a339bJeff Sharkey try { 331b24a78589b2bee4a86d5c864dd69169e134a339bJeff Sharkey mConnector.execute("bandwidth", "enable"); 332b24a78589b2bee4a86d5c864dd69169e134a339bJeff Sharkey mBandwidthControlEnabled = true; 333b24a78589b2bee4a86d5c864dd69169e134a339bJeff Sharkey } catch (NativeDaemonConnectorException e) { 334b24a78589b2bee4a86d5c864dd69169e134a339bJeff Sharkey Log.wtf(TAG, "problem enabling bandwidth controls", e); 335b24a78589b2bee4a86d5c864dd69169e134a339bJeff Sharkey } 336b24a78589b2bee4a86d5c864dd69169e134a339bJeff Sharkey } else { 337b24a78589b2bee4a86d5c864dd69169e134a339bJeff Sharkey Slog.d(TAG, "not enabling bandwidth control"); 338b24a78589b2bee4a86d5c864dd69169e134a339bJeff Sharkey } 339b24a78589b2bee4a86d5c864dd69169e134a339bJeff Sharkey 340b24a78589b2bee4a86d5c864dd69169e134a339bJeff Sharkey SystemProperties.set(PROP_QTAGUID_ENABLED, mBandwidthControlEnabled ? "1" : "0"); 341e5c3afb29241fd3faae309f973645d7f6a7ed111Robert Greenwalt 342b24a78589b2bee4a86d5c864dd69169e134a339bJeff Sharkey // push any existing quota or UID rules 343b24a78589b2bee4a86d5c864dd69169e134a339bJeff Sharkey synchronized (mQuotaLock) { 344b24a78589b2bee4a86d5c864dd69169e134a339bJeff Sharkey int size = mActiveQuotas.size(); 345b24a78589b2bee4a86d5c864dd69169e134a339bJeff Sharkey if (size > 0) { 346b24a78589b2bee4a86d5c864dd69169e134a339bJeff Sharkey Slog.d(TAG, "pushing " + size + " active quota rules"); 347b24a78589b2bee4a86d5c864dd69169e134a339bJeff Sharkey final HashMap<String, Long> activeQuotas = mActiveQuotas; 348b24a78589b2bee4a86d5c864dd69169e134a339bJeff Sharkey mActiveQuotas = Maps.newHashMap(); 349b24a78589b2bee4a86d5c864dd69169e134a339bJeff Sharkey for (Map.Entry<String, Long> entry : activeQuotas.entrySet()) { 350b24a78589b2bee4a86d5c864dd69169e134a339bJeff Sharkey setInterfaceQuota(entry.getKey(), entry.getValue()); 351b24a78589b2bee4a86d5c864dd69169e134a339bJeff Sharkey } 352b24a78589b2bee4a86d5c864dd69169e134a339bJeff Sharkey } 353b24a78589b2bee4a86d5c864dd69169e134a339bJeff Sharkey 354b24a78589b2bee4a86d5c864dd69169e134a339bJeff Sharkey size = mActiveAlerts.size(); 355b24a78589b2bee4a86d5c864dd69169e134a339bJeff Sharkey if (size > 0) { 356b24a78589b2bee4a86d5c864dd69169e134a339bJeff Sharkey Slog.d(TAG, "pushing " + size + " active alert rules"); 357b24a78589b2bee4a86d5c864dd69169e134a339bJeff Sharkey final HashMap<String, Long> activeAlerts = mActiveAlerts; 358b24a78589b2bee4a86d5c864dd69169e134a339bJeff Sharkey mActiveAlerts = Maps.newHashMap(); 359b24a78589b2bee4a86d5c864dd69169e134a339bJeff Sharkey for (Map.Entry<String, Long> entry : activeAlerts.entrySet()) { 360b24a78589b2bee4a86d5c864dd69169e134a339bJeff Sharkey setInterfaceAlert(entry.getKey(), entry.getValue()); 361b24a78589b2bee4a86d5c864dd69169e134a339bJeff Sharkey } 362b24a78589b2bee4a86d5c864dd69169e134a339bJeff Sharkey } 363b24a78589b2bee4a86d5c864dd69169e134a339bJeff Sharkey 364b24a78589b2bee4a86d5c864dd69169e134a339bJeff Sharkey size = mUidRejectOnQuota.size(); 365b24a78589b2bee4a86d5c864dd69169e134a339bJeff Sharkey if (size > 0) { 366b24a78589b2bee4a86d5c864dd69169e134a339bJeff Sharkey Slog.d(TAG, "pushing " + size + " active uid rules"); 367b24a78589b2bee4a86d5c864dd69169e134a339bJeff Sharkey final SparseBooleanArray uidRejectOnQuota = mUidRejectOnQuota; 368b24a78589b2bee4a86d5c864dd69169e134a339bJeff Sharkey mUidRejectOnQuota = new SparseBooleanArray(); 369b24a78589b2bee4a86d5c864dd69169e134a339bJeff Sharkey for (int i = 0; i < uidRejectOnQuota.size(); i++) { 370b24a78589b2bee4a86d5c864dd69169e134a339bJeff Sharkey setUidNetworkRules(uidRejectOnQuota.keyAt(i), uidRejectOnQuota.valueAt(i)); 371b24a78589b2bee4a86d5c864dd69169e134a339bJeff Sharkey } 372b24a78589b2bee4a86d5c864dd69169e134a339bJeff Sharkey } 373b24a78589b2bee4a86d5c864dd69169e134a339bJeff Sharkey } 374c268f0b19efd0b6c6c89c21be0893787f3cc9cf7Jeff Sharkey 375c268f0b19efd0b6c6c89c21be0893787f3cc9cf7Jeff Sharkey // TODO: Push any existing firewall state 37669ddab4575ff684c533c995e07ca15fe18543fc0Jeff Sharkey setFirewallEnabled(mFirewallEnabled || LockdownVpnTracker.isEnabled()); 377b24a78589b2bee4a86d5c864dd69169e134a339bJeff Sharkey } 3784d02d001ef6e06583e858e63e48d1aebf54ba28dSan Mehat 379873f2145941cc28f6931dc18b5e9987bd22e2e19San Mehat // 380873f2145941cc28f6931dc18b5e9987bd22e2e19San Mehat // Netd Callback handling 381873f2145941cc28f6931dc18b5e9987bd22e2e19San Mehat // 382873f2145941cc28f6931dc18b5e9987bd22e2e19San Mehat 383b24a78589b2bee4a86d5c864dd69169e134a339bJeff Sharkey private class NetdCallbackReceiver implements INativeDaemonConnectorCallbacks { 384b24a78589b2bee4a86d5c864dd69169e134a339bJeff Sharkey @Override 385873f2145941cc28f6931dc18b5e9987bd22e2e19San Mehat public void onDaemonConnected() { 386b24a78589b2bee4a86d5c864dd69169e134a339bJeff Sharkey // event is dispatched from internal NDC thread, so we prepare the 387b24a78589b2bee4a86d5c864dd69169e134a339bJeff Sharkey // daemon back on main thread. 388b24a78589b2bee4a86d5c864dd69169e134a339bJeff Sharkey if (mConnectedSignal != null) { 389b24a78589b2bee4a86d5c864dd69169e134a339bJeff Sharkey mConnectedSignal.countDown(); 390b24a78589b2bee4a86d5c864dd69169e134a339bJeff Sharkey mConnectedSignal = null; 391b24a78589b2bee4a86d5c864dd69169e134a339bJeff Sharkey } else { 392b24a78589b2bee4a86d5c864dd69169e134a339bJeff Sharkey mMainHandler.post(new Runnable() { 393b24a78589b2bee4a86d5c864dd69169e134a339bJeff Sharkey @Override 394b24a78589b2bee4a86d5c864dd69169e134a339bJeff Sharkey public void run() { 395b24a78589b2bee4a86d5c864dd69169e134a339bJeff Sharkey prepareNativeDaemon(); 396b24a78589b2bee4a86d5c864dd69169e134a339bJeff Sharkey } 397b24a78589b2bee4a86d5c864dd69169e134a339bJeff Sharkey }); 398b24a78589b2bee4a86d5c864dd69169e134a339bJeff Sharkey } 399873f2145941cc28f6931dc18b5e9987bd22e2e19San Mehat } 400fa23c5ae226c1a1d39f89c5c87d4f340e91d90e0Jeff Sharkey 401b24a78589b2bee4a86d5c864dd69169e134a339bJeff Sharkey @Override 402873f2145941cc28f6931dc18b5e9987bd22e2e19San Mehat public boolean onEvent(int code, String raw, String[] cooked) { 40312b933d0d9252decaae9fee2456bb1e1cd94c085JP Abgrall switch (code) { 40412b933d0d9252decaae9fee2456bb1e1cd94c085JP Abgrall case NetdResponseCode.InterfaceChange: 40512b933d0d9252decaae9fee2456bb1e1cd94c085JP Abgrall /* 40612b933d0d9252decaae9fee2456bb1e1cd94c085JP Abgrall * a network interface change occured 40712b933d0d9252decaae9fee2456bb1e1cd94c085JP Abgrall * Format: "NNN Iface added <name>" 40812b933d0d9252decaae9fee2456bb1e1cd94c085JP Abgrall * "NNN Iface removed <name>" 40912b933d0d9252decaae9fee2456bb1e1cd94c085JP Abgrall * "NNN Iface changed <name> <up/down>" 41012b933d0d9252decaae9fee2456bb1e1cd94c085JP Abgrall * "NNN Iface linkstatus <name> <up/down>" 41112b933d0d9252decaae9fee2456bb1e1cd94c085JP Abgrall */ 41212b933d0d9252decaae9fee2456bb1e1cd94c085JP Abgrall if (cooked.length < 4 || !cooked[1].equals("Iface")) { 41312b933d0d9252decaae9fee2456bb1e1cd94c085JP Abgrall throw new IllegalStateException( 41412b933d0d9252decaae9fee2456bb1e1cd94c085JP Abgrall String.format("Invalid event from daemon (%s)", raw)); 41512b933d0d9252decaae9fee2456bb1e1cd94c085JP Abgrall } 41612b933d0d9252decaae9fee2456bb1e1cd94c085JP Abgrall if (cooked[2].equals("added")) { 41712b933d0d9252decaae9fee2456bb1e1cd94c085JP Abgrall notifyInterfaceAdded(cooked[3]); 41812b933d0d9252decaae9fee2456bb1e1cd94c085JP Abgrall return true; 41912b933d0d9252decaae9fee2456bb1e1cd94c085JP Abgrall } else if (cooked[2].equals("removed")) { 42012b933d0d9252decaae9fee2456bb1e1cd94c085JP Abgrall notifyInterfaceRemoved(cooked[3]); 42112b933d0d9252decaae9fee2456bb1e1cd94c085JP Abgrall return true; 42212b933d0d9252decaae9fee2456bb1e1cd94c085JP Abgrall } else if (cooked[2].equals("changed") && cooked.length == 5) { 42312b933d0d9252decaae9fee2456bb1e1cd94c085JP Abgrall notifyInterfaceStatusChanged(cooked[3], cooked[4].equals("up")); 42412b933d0d9252decaae9fee2456bb1e1cd94c085JP Abgrall return true; 42512b933d0d9252decaae9fee2456bb1e1cd94c085JP Abgrall } else if (cooked[2].equals("linkstate") && cooked.length == 5) { 42612b933d0d9252decaae9fee2456bb1e1cd94c085JP Abgrall notifyInterfaceLinkStateChanged(cooked[3], cooked[4].equals("up")); 42712b933d0d9252decaae9fee2456bb1e1cd94c085JP Abgrall return true; 42812b933d0d9252decaae9fee2456bb1e1cd94c085JP Abgrall } 429e325392c257a5460de6327420c81729f4e687881Robert Greenwalt throw new IllegalStateException( 430e325392c257a5460de6327420c81729f4e687881Robert Greenwalt String.format("Invalid event from daemon (%s)", raw)); 43112b933d0d9252decaae9fee2456bb1e1cd94c085JP Abgrall // break; 43212b933d0d9252decaae9fee2456bb1e1cd94c085JP Abgrall case NetdResponseCode.BandwidthControl: 43312b933d0d9252decaae9fee2456bb1e1cd94c085JP Abgrall /* 43412b933d0d9252decaae9fee2456bb1e1cd94c085JP Abgrall * Bandwidth control needs some attention 43512b933d0d9252decaae9fee2456bb1e1cd94c085JP Abgrall * Format: "NNN limit alert <alertName> <ifaceName>" 43612b933d0d9252decaae9fee2456bb1e1cd94c085JP Abgrall */ 43712b933d0d9252decaae9fee2456bb1e1cd94c085JP Abgrall if (cooked.length < 5 || !cooked[1].equals("limit")) { 43812b933d0d9252decaae9fee2456bb1e1cd94c085JP Abgrall throw new IllegalStateException( 43912b933d0d9252decaae9fee2456bb1e1cd94c085JP Abgrall String.format("Invalid event from daemon (%s)", raw)); 44012b933d0d9252decaae9fee2456bb1e1cd94c085JP Abgrall } 44112b933d0d9252decaae9fee2456bb1e1cd94c085JP Abgrall if (cooked[2].equals("alert")) { 44212b933d0d9252decaae9fee2456bb1e1cd94c085JP Abgrall notifyLimitReached(cooked[3], cooked[4]); 44312b933d0d9252decaae9fee2456bb1e1cd94c085JP Abgrall return true; 44412b933d0d9252decaae9fee2456bb1e1cd94c085JP Abgrall } 44512b933d0d9252decaae9fee2456bb1e1cd94c085JP Abgrall throw new IllegalStateException( 44612b933d0d9252decaae9fee2456bb1e1cd94c085JP Abgrall String.format("Invalid event from daemon (%s)", raw)); 44712b933d0d9252decaae9fee2456bb1e1cd94c085JP Abgrall // break; 448db3c8678e5cbdfec011afaf25bde2091152c30adHaoyu Bai case NetdResponseCode.InterfaceClassActivity: 449db3c8678e5cbdfec011afaf25bde2091152c30adHaoyu Bai /* 450db3c8678e5cbdfec011afaf25bde2091152c30adHaoyu Bai * An network interface class state changed (active/idle) 451db3c8678e5cbdfec011afaf25bde2091152c30adHaoyu Bai * Format: "NNN IfaceClass <active/idle> <label>" 452db3c8678e5cbdfec011afaf25bde2091152c30adHaoyu Bai */ 453db3c8678e5cbdfec011afaf25bde2091152c30adHaoyu Bai if (cooked.length < 4 || !cooked[1].equals("IfaceClass")) { 454db3c8678e5cbdfec011afaf25bde2091152c30adHaoyu Bai throw new IllegalStateException( 455db3c8678e5cbdfec011afaf25bde2091152c30adHaoyu Bai String.format("Invalid event from daemon (%s)", raw)); 456db3c8678e5cbdfec011afaf25bde2091152c30adHaoyu Bai } 457db3c8678e5cbdfec011afaf25bde2091152c30adHaoyu Bai boolean isActive = cooked[2].equals("active"); 458db3c8678e5cbdfec011afaf25bde2091152c30adHaoyu Bai notifyInterfaceClassActivity(cooked[3], isActive); 459db3c8678e5cbdfec011afaf25bde2091152c30adHaoyu Bai return true; 460db3c8678e5cbdfec011afaf25bde2091152c30adHaoyu Bai // break; 46112b933d0d9252decaae9fee2456bb1e1cd94c085JP Abgrall default: break; 462e325392c257a5460de6327420c81729f4e687881Robert Greenwalt } 463e325392c257a5460de6327420c81729f4e687881Robert Greenwalt return false; 464873f2145941cc28f6931dc18b5e9987bd22e2e19San Mehat } 465873f2145941cc28f6931dc18b5e9987bd22e2e19San Mehat } 466873f2145941cc28f6931dc18b5e9987bd22e2e19San Mehat 467ed4fc8acc52d89f1d4dec853a29288c6d06717c3San Mehat 468873f2145941cc28f6931dc18b5e9987bd22e2e19San Mehat // 469873f2145941cc28f6931dc18b5e9987bd22e2e19San Mehat // INetworkManagementService members 470873f2145941cc28f6931dc18b5e9987bd22e2e19San Mehat // 471873f2145941cc28f6931dc18b5e9987bd22e2e19San Mehat 472af75c33e8d7f1a27c6c0d71820730ea8525019a3Jeff Sharkey @Override 473af75c33e8d7f1a27c6c0d71820730ea8525019a3Jeff Sharkey public String[] listInterfaces() { 4744529bb66c47fd02b990ecb0810031157b4f36c2fJeff Sharkey mContext.enforceCallingOrSelfPermission(CONNECTIVITY_INTERNAL, TAG); 475a80ce06d4c54e43243073f8ceff024f9dda7140eKenny Root try { 476ba2896e939f359e5857149f1a27212db71be012bJeff Sharkey return NativeDaemonEvent.filterMessageList( 477ba2896e939f359e5857149f1a27212db71be012bJeff Sharkey mConnector.executeForList("interface", "list"), InterfaceListResult); 478a80ce06d4c54e43243073f8ceff024f9dda7140eKenny Root } catch (NativeDaemonConnectorException e) { 479276642baf11e05700ef24447dc4271f16ce69b50Jeff Sharkey throw e.rethrowAsParcelableException(); 480a80ce06d4c54e43243073f8ceff024f9dda7140eKenny Root } 481ed4fc8acc52d89f1d4dec853a29288c6d06717c3San Mehat } 482ed4fc8acc52d89f1d4dec853a29288c6d06717c3San Mehat 483af75c33e8d7f1a27c6c0d71820730ea8525019a3Jeff Sharkey @Override 484af75c33e8d7f1a27c6c0d71820730ea8525019a3Jeff Sharkey public InterfaceConfiguration getInterfaceConfig(String iface) { 4854529bb66c47fd02b990ecb0810031157b4f36c2fJeff Sharkey mContext.enforceCallingOrSelfPermission(CONNECTIVITY_INTERNAL, TAG); 486ba2896e939f359e5857149f1a27212db71be012bJeff Sharkey 487ba2896e939f359e5857149f1a27212db71be012bJeff Sharkey final NativeDaemonEvent event; 488a80ce06d4c54e43243073f8ceff024f9dda7140eKenny Root try { 489ba2896e939f359e5857149f1a27212db71be012bJeff Sharkey event = mConnector.execute("interface", "getcfg", iface); 490a80ce06d4c54e43243073f8ceff024f9dda7140eKenny Root } catch (NativeDaemonConnectorException e) { 491276642baf11e05700ef24447dc4271f16ce69b50Jeff Sharkey throw e.rethrowAsParcelableException(); 492a80ce06d4c54e43243073f8ceff024f9dda7140eKenny Root } 493ed4fc8acc52d89f1d4dec853a29288c6d06717c3San Mehat 494ba2896e939f359e5857149f1a27212db71be012bJeff Sharkey event.checkCode(InterfaceGetCfgResult); 495ba2896e939f359e5857149f1a27212db71be012bJeff Sharkey 496ba2896e939f359e5857149f1a27212db71be012bJeff Sharkey // Rsp: 213 xx:xx:xx:xx:xx:xx yyy.yyy.yyy.yyy zzz flag1 flag2 flag3 497ba2896e939f359e5857149f1a27212db71be012bJeff Sharkey final StringTokenizer st = new StringTokenizer(event.getMessage()); 498ed4fc8acc52d89f1d4dec853a29288c6d06717c3San Mehat 499a80ce06d4c54e43243073f8ceff024f9dda7140eKenny Root InterfaceConfiguration cfg; 500ed4fc8acc52d89f1d4dec853a29288c6d06717c3San Mehat try { 501a80ce06d4c54e43243073f8ceff024f9dda7140eKenny Root cfg = new InterfaceConfiguration(); 502ddba10622dfd3122cf99c795706754e0d41858c3Jeff Sharkey cfg.setHardwareAddress(st.nextToken(" ")); 503ed1264093234b1f1354cd5f669eb82a50bb56869Robert Greenwalt InetAddress addr = null; 5042d2afd13af94c2669eb464101dee3b17c8448110Robert Greenwalt int prefixLength = 0; 505a80ce06d4c54e43243073f8ceff024f9dda7140eKenny Root try { 506ba2896e939f359e5857149f1a27212db71be012bJeff Sharkey addr = NetworkUtils.numericToInetAddress(st.nextToken()); 507e590373ea71251cfffc8f22f011e2e6335dce716Robert Greenwalt } catch (IllegalArgumentException iae) { 508e590373ea71251cfffc8f22f011e2e6335dce716Robert Greenwalt Slog.e(TAG, "Failed to parse ipaddr", iae); 509a80ce06d4c54e43243073f8ceff024f9dda7140eKenny Root } 510ed4fc8acc52d89f1d4dec853a29288c6d06717c3San Mehat 511a80ce06d4c54e43243073f8ceff024f9dda7140eKenny Root try { 512ba2896e939f359e5857149f1a27212db71be012bJeff Sharkey prefixLength = Integer.parseInt(st.nextToken()); 5132d2afd13af94c2669eb464101dee3b17c8448110Robert Greenwalt } catch (NumberFormatException nfe) { 5142d2afd13af94c2669eb464101dee3b17c8448110Robert Greenwalt Slog.e(TAG, "Failed to parse prefixLength", nfe); 515a80ce06d4c54e43243073f8ceff024f9dda7140eKenny Root } 51604808c294027f8bc318643a94c85a999257d7f52Robert Greenwalt 517ddba10622dfd3122cf99c795706754e0d41858c3Jeff Sharkey cfg.setLinkAddress(new LinkAddress(addr, prefixLength)); 518ddba10622dfd3122cf99c795706754e0d41858c3Jeff Sharkey while (st.hasMoreTokens()) { 519ddba10622dfd3122cf99c795706754e0d41858c3Jeff Sharkey cfg.setFlag(st.nextToken()); 520ddba10622dfd3122cf99c795706754e0d41858c3Jeff Sharkey } 521a80ce06d4c54e43243073f8ceff024f9dda7140eKenny Root } catch (NoSuchElementException nsee) { 522ba2896e939f359e5857149f1a27212db71be012bJeff Sharkey throw new IllegalStateException("Invalid response from daemon: " + event); 523ed4fc8acc52d89f1d4dec853a29288c6d06717c3San Mehat } 524ed4fc8acc52d89f1d4dec853a29288c6d06717c3San Mehat return cfg; 525ed4fc8acc52d89f1d4dec853a29288c6d06717c3San Mehat } 526ed4fc8acc52d89f1d4dec853a29288c6d06717c3San Mehat 527af75c33e8d7f1a27c6c0d71820730ea8525019a3Jeff Sharkey @Override 528af75c33e8d7f1a27c6c0d71820730ea8525019a3Jeff Sharkey public void setInterfaceConfig(String iface, InterfaceConfiguration cfg) { 5294529bb66c47fd02b990ecb0810031157b4f36c2fJeff Sharkey mContext.enforceCallingOrSelfPermission(CONNECTIVITY_INTERNAL, TAG); 530ddba10622dfd3122cf99c795706754e0d41858c3Jeff Sharkey LinkAddress linkAddr = cfg.getLinkAddress(); 5312d2afd13af94c2669eb464101dee3b17c8448110Robert Greenwalt if (linkAddr == null || linkAddr.getAddress() == null) { 5322d2afd13af94c2669eb464101dee3b17c8448110Robert Greenwalt throw new IllegalStateException("Null LinkAddress given"); 533ed1264093234b1f1354cd5f669eb82a50bb56869Robert Greenwalt } 534ba2896e939f359e5857149f1a27212db71be012bJeff Sharkey 535ba2896e939f359e5857149f1a27212db71be012bJeff Sharkey final Command cmd = new Command("interface", "setcfg", iface, 5362d2afd13af94c2669eb464101dee3b17c8448110Robert Greenwalt linkAddr.getAddress().getHostAddress(), 537ba2896e939f359e5857149f1a27212db71be012bJeff Sharkey linkAddr.getNetworkPrefixLength()); 538ba2896e939f359e5857149f1a27212db71be012bJeff Sharkey for (String flag : cfg.getFlags()) { 539ba2896e939f359e5857149f1a27212db71be012bJeff Sharkey cmd.appendArg(flag); 540ba2896e939f359e5857149f1a27212db71be012bJeff Sharkey } 541ba2896e939f359e5857149f1a27212db71be012bJeff Sharkey 542a80ce06d4c54e43243073f8ceff024f9dda7140eKenny Root try { 543ba2896e939f359e5857149f1a27212db71be012bJeff Sharkey mConnector.execute(cmd); 544a80ce06d4c54e43243073f8ceff024f9dda7140eKenny Root } catch (NativeDaemonConnectorException e) { 545276642baf11e05700ef24447dc4271f16ce69b50Jeff Sharkey throw e.rethrowAsParcelableException(); 546a80ce06d4c54e43243073f8ceff024f9dda7140eKenny Root } 547873f2145941cc28f6931dc18b5e9987bd22e2e19San Mehat } 548873f2145941cc28f6931dc18b5e9987bd22e2e19San Mehat 549af75c33e8d7f1a27c6c0d71820730ea8525019a3Jeff Sharkey @Override 550af75c33e8d7f1a27c6c0d71820730ea8525019a3Jeff Sharkey public void setInterfaceDown(String iface) { 5514529bb66c47fd02b990ecb0810031157b4f36c2fJeff Sharkey mContext.enforceCallingOrSelfPermission(CONNECTIVITY_INTERNAL, TAG); 55231c6e4817f6c967fc4f61c4f1d9f25743958f7deJeff Sharkey final InterfaceConfiguration ifcg = getInterfaceConfig(iface); 553ddba10622dfd3122cf99c795706754e0d41858c3Jeff Sharkey ifcg.setInterfaceDown(); 55431c6e4817f6c967fc4f61c4f1d9f25743958f7deJeff Sharkey setInterfaceConfig(iface, ifcg); 5557244c977ecbc1f73e4cfd9d824fc2b68aa886139Irfan Sheriff } 5567244c977ecbc1f73e4cfd9d824fc2b68aa886139Irfan Sheriff 557af75c33e8d7f1a27c6c0d71820730ea8525019a3Jeff Sharkey @Override 558af75c33e8d7f1a27c6c0d71820730ea8525019a3Jeff Sharkey public void setInterfaceUp(String iface) { 5594529bb66c47fd02b990ecb0810031157b4f36c2fJeff Sharkey mContext.enforceCallingOrSelfPermission(CONNECTIVITY_INTERNAL, TAG); 56031c6e4817f6c967fc4f61c4f1d9f25743958f7deJeff Sharkey final InterfaceConfiguration ifcg = getInterfaceConfig(iface); 561ddba10622dfd3122cf99c795706754e0d41858c3Jeff Sharkey ifcg.setInterfaceUp(); 56231c6e4817f6c967fc4f61c4f1d9f25743958f7deJeff Sharkey setInterfaceConfig(iface, ifcg); 5637244c977ecbc1f73e4cfd9d824fc2b68aa886139Irfan Sheriff } 5647244c977ecbc1f73e4cfd9d824fc2b68aa886139Irfan Sheriff 565af75c33e8d7f1a27c6c0d71820730ea8525019a3Jeff Sharkey @Override 566af75c33e8d7f1a27c6c0d71820730ea8525019a3Jeff Sharkey public void setInterfaceIpv6PrivacyExtensions(String iface, boolean enable) { 5674529bb66c47fd02b990ecb0810031157b4f36c2fJeff Sharkey mContext.enforceCallingOrSelfPermission(CONNECTIVITY_INTERNAL, TAG); 5687329361cdce711775542b112663bf71a6e0d5cefIrfan Sheriff try { 569ba2896e939f359e5857149f1a27212db71be012bJeff Sharkey mConnector.execute( 570ba2896e939f359e5857149f1a27212db71be012bJeff Sharkey "interface", "ipv6privacyextensions", iface, enable ? "enable" : "disable"); 5717329361cdce711775542b112663bf71a6e0d5cefIrfan Sheriff } catch (NativeDaemonConnectorException e) { 572276642baf11e05700ef24447dc4271f16ce69b50Jeff Sharkey throw e.rethrowAsParcelableException(); 5737329361cdce711775542b112663bf71a6e0d5cefIrfan Sheriff } 5747329361cdce711775542b112663bf71a6e0d5cefIrfan Sheriff } 5757329361cdce711775542b112663bf71a6e0d5cefIrfan Sheriff 576f5600618df153d9c51388562ebf3524e3bdc8b7dIrfan Sheriff /* TODO: This is right now a IPv4 only function. Works for wifi which loses its 577f5600618df153d9c51388562ebf3524e3bdc8b7dIrfan Sheriff IPv6 addresses on interface down, but we need to do full clean up here */ 578af75c33e8d7f1a27c6c0d71820730ea8525019a3Jeff Sharkey @Override 579af75c33e8d7f1a27c6c0d71820730ea8525019a3Jeff Sharkey public void clearInterfaceAddresses(String iface) { 5804529bb66c47fd02b990ecb0810031157b4f36c2fJeff Sharkey mContext.enforceCallingOrSelfPermission(CONNECTIVITY_INTERNAL, TAG); 581f5600618df153d9c51388562ebf3524e3bdc8b7dIrfan Sheriff try { 582ba2896e939f359e5857149f1a27212db71be012bJeff Sharkey mConnector.execute("interface", "clearaddrs", iface); 583f5600618df153d9c51388562ebf3524e3bdc8b7dIrfan Sheriff } catch (NativeDaemonConnectorException e) { 584276642baf11e05700ef24447dc4271f16ce69b50Jeff Sharkey throw e.rethrowAsParcelableException(); 585f5600618df153d9c51388562ebf3524e3bdc8b7dIrfan Sheriff } 586f5600618df153d9c51388562ebf3524e3bdc8b7dIrfan Sheriff } 587f5600618df153d9c51388562ebf3524e3bdc8b7dIrfan Sheriff 588af75c33e8d7f1a27c6c0d71820730ea8525019a3Jeff Sharkey @Override 589af75c33e8d7f1a27c6c0d71820730ea8525019a3Jeff Sharkey public void enableIpv6(String iface) { 5904529bb66c47fd02b990ecb0810031157b4f36c2fJeff Sharkey mContext.enforceCallingOrSelfPermission(CONNECTIVITY_INTERNAL, TAG); 5917960d9f888e31602e17b8856c77a3826bf8c841erepo sync try { 592ba2896e939f359e5857149f1a27212db71be012bJeff Sharkey mConnector.execute("interface", "ipv6", iface, "enable"); 5937960d9f888e31602e17b8856c77a3826bf8c841erepo sync } catch (NativeDaemonConnectorException e) { 594276642baf11e05700ef24447dc4271f16ce69b50Jeff Sharkey throw e.rethrowAsParcelableException(); 5957960d9f888e31602e17b8856c77a3826bf8c841erepo sync } 5967960d9f888e31602e17b8856c77a3826bf8c841erepo sync } 5977960d9f888e31602e17b8856c77a3826bf8c841erepo sync 598af75c33e8d7f1a27c6c0d71820730ea8525019a3Jeff Sharkey @Override 599af75c33e8d7f1a27c6c0d71820730ea8525019a3Jeff Sharkey public void disableIpv6(String iface) { 6004529bb66c47fd02b990ecb0810031157b4f36c2fJeff Sharkey mContext.enforceCallingOrSelfPermission(CONNECTIVITY_INTERNAL, TAG); 6017960d9f888e31602e17b8856c77a3826bf8c841erepo sync try { 602ba2896e939f359e5857149f1a27212db71be012bJeff Sharkey mConnector.execute("interface", "ipv6", iface, "disable"); 6037960d9f888e31602e17b8856c77a3826bf8c841erepo sync } catch (NativeDaemonConnectorException e) { 604276642baf11e05700ef24447dc4271f16ce69b50Jeff Sharkey throw e.rethrowAsParcelableException(); 6057960d9f888e31602e17b8856c77a3826bf8c841erepo sync } 6067960d9f888e31602e17b8856c77a3826bf8c841erepo sync } 6077960d9f888e31602e17b8856c77a3826bf8c841erepo sync 608af75c33e8d7f1a27c6c0d71820730ea8525019a3Jeff Sharkey @Override 60959b1a4ede7032c1b4d897e13dd4ede09b5e14743Robert Greenwalt public void addRoute(String interfaceName, RouteInfo route) { 6104529bb66c47fd02b990ecb0810031157b4f36c2fJeff Sharkey mContext.enforceCallingOrSelfPermission(CONNECTIVITY_INTERNAL, TAG); 6113b28e9a3daede9eac44faeb736ab4c8386ddd089Robert Greenwalt modifyRoute(interfaceName, ADD, route, DEFAULT); 61259b1a4ede7032c1b4d897e13dd4ede09b5e14743Robert Greenwalt } 61359b1a4ede7032c1b4d897e13dd4ede09b5e14743Robert Greenwalt 614af75c33e8d7f1a27c6c0d71820730ea8525019a3Jeff Sharkey @Override 61559b1a4ede7032c1b4d897e13dd4ede09b5e14743Robert Greenwalt public void removeRoute(String interfaceName, RouteInfo route) { 6164529bb66c47fd02b990ecb0810031157b4f36c2fJeff Sharkey mContext.enforceCallingOrSelfPermission(CONNECTIVITY_INTERNAL, TAG); 6173b28e9a3daede9eac44faeb736ab4c8386ddd089Robert Greenwalt modifyRoute(interfaceName, REMOVE, route, DEFAULT); 6183b28e9a3daede9eac44faeb736ab4c8386ddd089Robert Greenwalt } 6193b28e9a3daede9eac44faeb736ab4c8386ddd089Robert Greenwalt 620af75c33e8d7f1a27c6c0d71820730ea8525019a3Jeff Sharkey @Override 6213b28e9a3daede9eac44faeb736ab4c8386ddd089Robert Greenwalt public void addSecondaryRoute(String interfaceName, RouteInfo route) { 6224529bb66c47fd02b990ecb0810031157b4f36c2fJeff Sharkey mContext.enforceCallingOrSelfPermission(CONNECTIVITY_INTERNAL, TAG); 6233b28e9a3daede9eac44faeb736ab4c8386ddd089Robert Greenwalt modifyRoute(interfaceName, ADD, route, SECONDARY); 6243b28e9a3daede9eac44faeb736ab4c8386ddd089Robert Greenwalt } 6253b28e9a3daede9eac44faeb736ab4c8386ddd089Robert Greenwalt 626af75c33e8d7f1a27c6c0d71820730ea8525019a3Jeff Sharkey @Override 6273b28e9a3daede9eac44faeb736ab4c8386ddd089Robert Greenwalt public void removeSecondaryRoute(String interfaceName, RouteInfo route) { 6284529bb66c47fd02b990ecb0810031157b4f36c2fJeff Sharkey mContext.enforceCallingOrSelfPermission(CONNECTIVITY_INTERNAL, TAG); 6293b28e9a3daede9eac44faeb736ab4c8386ddd089Robert Greenwalt modifyRoute(interfaceName, REMOVE, route, SECONDARY); 63059b1a4ede7032c1b4d897e13dd4ede09b5e14743Robert Greenwalt } 63159b1a4ede7032c1b4d897e13dd4ede09b5e14743Robert Greenwalt 632ba2896e939f359e5857149f1a27212db71be012bJeff Sharkey private void modifyRoute(String interfaceName, String action, RouteInfo route, String type) { 633ba2896e939f359e5857149f1a27212db71be012bJeff Sharkey final Command cmd = new Command("interface", "route", action, interfaceName, type); 63459b1a4ede7032c1b4d897e13dd4ede09b5e14743Robert Greenwalt 63559b1a4ede7032c1b4d897e13dd4ede09b5e14743Robert Greenwalt // create triplet: dest-ip-addr prefixlength gateway-ip-addr 636ba2896e939f359e5857149f1a27212db71be012bJeff Sharkey final LinkAddress la = route.getDestination(); 637ba2896e939f359e5857149f1a27212db71be012bJeff Sharkey cmd.appendArg(la.getAddress().getHostAddress()); 638ba2896e939f359e5857149f1a27212db71be012bJeff Sharkey cmd.appendArg(la.getNetworkPrefixLength()); 639ba2896e939f359e5857149f1a27212db71be012bJeff Sharkey 64059b1a4ede7032c1b4d897e13dd4ede09b5e14743Robert Greenwalt if (route.getGateway() == null) { 64159b1a4ede7032c1b4d897e13dd4ede09b5e14743Robert Greenwalt if (la.getAddress() instanceof Inet4Address) { 642ba2896e939f359e5857149f1a27212db71be012bJeff Sharkey cmd.appendArg("0.0.0.0"); 64359b1a4ede7032c1b4d897e13dd4ede09b5e14743Robert Greenwalt } else { 644ba2896e939f359e5857149f1a27212db71be012bJeff Sharkey cmd.appendArg("::0"); 64559b1a4ede7032c1b4d897e13dd4ede09b5e14743Robert Greenwalt } 64659b1a4ede7032c1b4d897e13dd4ede09b5e14743Robert Greenwalt } else { 647ba2896e939f359e5857149f1a27212db71be012bJeff Sharkey cmd.appendArg(route.getGateway().getHostAddress()); 64859b1a4ede7032c1b4d897e13dd4ede09b5e14743Robert Greenwalt } 649ba2896e939f359e5857149f1a27212db71be012bJeff Sharkey 65059b1a4ede7032c1b4d897e13dd4ede09b5e14743Robert Greenwalt try { 651ba2896e939f359e5857149f1a27212db71be012bJeff Sharkey mConnector.execute(cmd); 65259b1a4ede7032c1b4d897e13dd4ede09b5e14743Robert Greenwalt } catch (NativeDaemonConnectorException e) { 653276642baf11e05700ef24447dc4271f16ce69b50Jeff Sharkey throw e.rethrowAsParcelableException(); 65459b1a4ede7032c1b4d897e13dd4ede09b5e14743Robert Greenwalt } 65559b1a4ede7032c1b4d897e13dd4ede09b5e14743Robert Greenwalt } 65659b1a4ede7032c1b4d897e13dd4ede09b5e14743Robert Greenwalt 65759b1a4ede7032c1b4d897e13dd4ede09b5e14743Robert Greenwalt private ArrayList<String> readRouteList(String filename) { 65859b1a4ede7032c1b4d897e13dd4ede09b5e14743Robert Greenwalt FileInputStream fstream = null; 65959b1a4ede7032c1b4d897e13dd4ede09b5e14743Robert Greenwalt ArrayList<String> list = new ArrayList<String>(); 66059b1a4ede7032c1b4d897e13dd4ede09b5e14743Robert Greenwalt 66159b1a4ede7032c1b4d897e13dd4ede09b5e14743Robert Greenwalt try { 66259b1a4ede7032c1b4d897e13dd4ede09b5e14743Robert Greenwalt fstream = new FileInputStream(filename); 66359b1a4ede7032c1b4d897e13dd4ede09b5e14743Robert Greenwalt DataInputStream in = new DataInputStream(fstream); 66459b1a4ede7032c1b4d897e13dd4ede09b5e14743Robert Greenwalt BufferedReader br = new BufferedReader(new InputStreamReader(in)); 66559b1a4ede7032c1b4d897e13dd4ede09b5e14743Robert Greenwalt String s; 66659b1a4ede7032c1b4d897e13dd4ede09b5e14743Robert Greenwalt 66759b1a4ede7032c1b4d897e13dd4ede09b5e14743Robert Greenwalt // throw away the title line 66859b1a4ede7032c1b4d897e13dd4ede09b5e14743Robert Greenwalt 66959b1a4ede7032c1b4d897e13dd4ede09b5e14743Robert Greenwalt while (((s = br.readLine()) != null) && (s.length() != 0)) { 67059b1a4ede7032c1b4d897e13dd4ede09b5e14743Robert Greenwalt list.add(s); 67159b1a4ede7032c1b4d897e13dd4ede09b5e14743Robert Greenwalt } 67259b1a4ede7032c1b4d897e13dd4ede09b5e14743Robert Greenwalt } catch (IOException ex) { 67359b1a4ede7032c1b4d897e13dd4ede09b5e14743Robert Greenwalt // return current list, possibly empty 67459b1a4ede7032c1b4d897e13dd4ede09b5e14743Robert Greenwalt } finally { 67559b1a4ede7032c1b4d897e13dd4ede09b5e14743Robert Greenwalt if (fstream != null) { 67659b1a4ede7032c1b4d897e13dd4ede09b5e14743Robert Greenwalt try { 67759b1a4ede7032c1b4d897e13dd4ede09b5e14743Robert Greenwalt fstream.close(); 67859b1a4ede7032c1b4d897e13dd4ede09b5e14743Robert Greenwalt } catch (IOException ex) {} 67959b1a4ede7032c1b4d897e13dd4ede09b5e14743Robert Greenwalt } 68059b1a4ede7032c1b4d897e13dd4ede09b5e14743Robert Greenwalt } 68159b1a4ede7032c1b4d897e13dd4ede09b5e14743Robert Greenwalt 68259b1a4ede7032c1b4d897e13dd4ede09b5e14743Robert Greenwalt return list; 68359b1a4ede7032c1b4d897e13dd4ede09b5e14743Robert Greenwalt } 68459b1a4ede7032c1b4d897e13dd4ede09b5e14743Robert Greenwalt 685af75c33e8d7f1a27c6c0d71820730ea8525019a3Jeff Sharkey @Override 68659b1a4ede7032c1b4d897e13dd4ede09b5e14743Robert Greenwalt public RouteInfo[] getRoutes(String interfaceName) { 6874529bb66c47fd02b990ecb0810031157b4f36c2fJeff Sharkey mContext.enforceCallingOrSelfPermission(CONNECTIVITY_INTERNAL, TAG); 68859b1a4ede7032c1b4d897e13dd4ede09b5e14743Robert Greenwalt ArrayList<RouteInfo> routes = new ArrayList<RouteInfo>(); 68959b1a4ede7032c1b4d897e13dd4ede09b5e14743Robert Greenwalt 69059b1a4ede7032c1b4d897e13dd4ede09b5e14743Robert Greenwalt // v4 routes listed as: 69159b1a4ede7032c1b4d897e13dd4ede09b5e14743Robert Greenwalt // iface dest-addr gateway-addr flags refcnt use metric netmask mtu window IRTT 69259b1a4ede7032c1b4d897e13dd4ede09b5e14743Robert Greenwalt for (String s : readRouteList("/proc/net/route")) { 69359b1a4ede7032c1b4d897e13dd4ede09b5e14743Robert Greenwalt String[] fields = s.split("\t"); 69459b1a4ede7032c1b4d897e13dd4ede09b5e14743Robert Greenwalt 69559b1a4ede7032c1b4d897e13dd4ede09b5e14743Robert Greenwalt if (fields.length > 7) { 69659b1a4ede7032c1b4d897e13dd4ede09b5e14743Robert Greenwalt String iface = fields[0]; 69759b1a4ede7032c1b4d897e13dd4ede09b5e14743Robert Greenwalt 69859b1a4ede7032c1b4d897e13dd4ede09b5e14743Robert Greenwalt if (interfaceName.equals(iface)) { 69959b1a4ede7032c1b4d897e13dd4ede09b5e14743Robert Greenwalt String dest = fields[1]; 70059b1a4ede7032c1b4d897e13dd4ede09b5e14743Robert Greenwalt String gate = fields[2]; 70159b1a4ede7032c1b4d897e13dd4ede09b5e14743Robert Greenwalt String flags = fields[3]; // future use? 70259b1a4ede7032c1b4d897e13dd4ede09b5e14743Robert Greenwalt String mask = fields[7]; 70359b1a4ede7032c1b4d897e13dd4ede09b5e14743Robert Greenwalt try { 70459b1a4ede7032c1b4d897e13dd4ede09b5e14743Robert Greenwalt // address stored as a hex string, ex: 0014A8C0 70559b1a4ede7032c1b4d897e13dd4ede09b5e14743Robert Greenwalt InetAddress destAddr = 70659b1a4ede7032c1b4d897e13dd4ede09b5e14743Robert Greenwalt NetworkUtils.intToInetAddress((int)Long.parseLong(dest, 16)); 70759b1a4ede7032c1b4d897e13dd4ede09b5e14743Robert Greenwalt int prefixLength = 70859b1a4ede7032c1b4d897e13dd4ede09b5e14743Robert Greenwalt NetworkUtils.netmaskIntToPrefixLength( 70959b1a4ede7032c1b4d897e13dd4ede09b5e14743Robert Greenwalt (int)Long.parseLong(mask, 16)); 71059b1a4ede7032c1b4d897e13dd4ede09b5e14743Robert Greenwalt LinkAddress linkAddress = new LinkAddress(destAddr, prefixLength); 71159b1a4ede7032c1b4d897e13dd4ede09b5e14743Robert Greenwalt 71259b1a4ede7032c1b4d897e13dd4ede09b5e14743Robert Greenwalt // address stored as a hex string, ex 0014A8C0 71359b1a4ede7032c1b4d897e13dd4ede09b5e14743Robert Greenwalt InetAddress gatewayAddr = 71459b1a4ede7032c1b4d897e13dd4ede09b5e14743Robert Greenwalt NetworkUtils.intToInetAddress((int)Long.parseLong(gate, 16)); 71559b1a4ede7032c1b4d897e13dd4ede09b5e14743Robert Greenwalt 71659b1a4ede7032c1b4d897e13dd4ede09b5e14743Robert Greenwalt RouteInfo route = new RouteInfo(linkAddress, gatewayAddr); 71759b1a4ede7032c1b4d897e13dd4ede09b5e14743Robert Greenwalt routes.add(route); 71859b1a4ede7032c1b4d897e13dd4ede09b5e14743Robert Greenwalt } catch (Exception e) { 71959b1a4ede7032c1b4d897e13dd4ede09b5e14743Robert Greenwalt Log.e(TAG, "Error parsing route " + s + " : " + e); 72059b1a4ede7032c1b4d897e13dd4ede09b5e14743Robert Greenwalt continue; 72159b1a4ede7032c1b4d897e13dd4ede09b5e14743Robert Greenwalt } 72259b1a4ede7032c1b4d897e13dd4ede09b5e14743Robert Greenwalt } 72359b1a4ede7032c1b4d897e13dd4ede09b5e14743Robert Greenwalt } 72459b1a4ede7032c1b4d897e13dd4ede09b5e14743Robert Greenwalt } 72559b1a4ede7032c1b4d897e13dd4ede09b5e14743Robert Greenwalt 72659b1a4ede7032c1b4d897e13dd4ede09b5e14743Robert Greenwalt // v6 routes listed as: 72759b1a4ede7032c1b4d897e13dd4ede09b5e14743Robert Greenwalt // dest-addr prefixlength ?? ?? gateway-addr ?? ?? ?? ?? iface 72859b1a4ede7032c1b4d897e13dd4ede09b5e14743Robert Greenwalt for (String s : readRouteList("/proc/net/ipv6_route")) { 72959b1a4ede7032c1b4d897e13dd4ede09b5e14743Robert Greenwalt String[]fields = s.split("\\s+"); 73059b1a4ede7032c1b4d897e13dd4ede09b5e14743Robert Greenwalt if (fields.length > 9) { 73159b1a4ede7032c1b4d897e13dd4ede09b5e14743Robert Greenwalt String iface = fields[9].trim(); 73259b1a4ede7032c1b4d897e13dd4ede09b5e14743Robert Greenwalt if (interfaceName.equals(iface)) { 73359b1a4ede7032c1b4d897e13dd4ede09b5e14743Robert Greenwalt String dest = fields[0]; 73459b1a4ede7032c1b4d897e13dd4ede09b5e14743Robert Greenwalt String prefix = fields[1]; 73559b1a4ede7032c1b4d897e13dd4ede09b5e14743Robert Greenwalt String gate = fields[4]; 73659b1a4ede7032c1b4d897e13dd4ede09b5e14743Robert Greenwalt 73759b1a4ede7032c1b4d897e13dd4ede09b5e14743Robert Greenwalt try { 73859b1a4ede7032c1b4d897e13dd4ede09b5e14743Robert Greenwalt // prefix length stored as a hex string, ex 40 73959b1a4ede7032c1b4d897e13dd4ede09b5e14743Robert Greenwalt int prefixLength = Integer.parseInt(prefix, 16); 74059b1a4ede7032c1b4d897e13dd4ede09b5e14743Robert Greenwalt 74159b1a4ede7032c1b4d897e13dd4ede09b5e14743Robert Greenwalt // address stored as a 32 char hex string 74259b1a4ede7032c1b4d897e13dd4ede09b5e14743Robert Greenwalt // ex fe800000000000000000000000000000 74359b1a4ede7032c1b4d897e13dd4ede09b5e14743Robert Greenwalt InetAddress destAddr = NetworkUtils.hexToInet6Address(dest); 74459b1a4ede7032c1b4d897e13dd4ede09b5e14743Robert Greenwalt LinkAddress linkAddress = new LinkAddress(destAddr, prefixLength); 74559b1a4ede7032c1b4d897e13dd4ede09b5e14743Robert Greenwalt 74659b1a4ede7032c1b4d897e13dd4ede09b5e14743Robert Greenwalt InetAddress gateAddr = NetworkUtils.hexToInet6Address(gate); 74759b1a4ede7032c1b4d897e13dd4ede09b5e14743Robert Greenwalt 74859b1a4ede7032c1b4d897e13dd4ede09b5e14743Robert Greenwalt RouteInfo route = new RouteInfo(linkAddress, gateAddr); 74959b1a4ede7032c1b4d897e13dd4ede09b5e14743Robert Greenwalt routes.add(route); 75059b1a4ede7032c1b4d897e13dd4ede09b5e14743Robert Greenwalt } catch (Exception e) { 75159b1a4ede7032c1b4d897e13dd4ede09b5e14743Robert Greenwalt Log.e(TAG, "Error parsing route " + s + " : " + e); 75259b1a4ede7032c1b4d897e13dd4ede09b5e14743Robert Greenwalt continue; 75359b1a4ede7032c1b4d897e13dd4ede09b5e14743Robert Greenwalt } 75459b1a4ede7032c1b4d897e13dd4ede09b5e14743Robert Greenwalt } 75559b1a4ede7032c1b4d897e13dd4ede09b5e14743Robert Greenwalt } 75659b1a4ede7032c1b4d897e13dd4ede09b5e14743Robert Greenwalt } 757ba2896e939f359e5857149f1a27212db71be012bJeff Sharkey return routes.toArray(new RouteInfo[routes.size()]); 75859b1a4ede7032c1b4d897e13dd4ede09b5e14743Robert Greenwalt } 75959b1a4ede7032c1b4d897e13dd4ede09b5e14743Robert Greenwalt 760af75c33e8d7f1a27c6c0d71820730ea8525019a3Jeff Sharkey @Override 761873f2145941cc28f6931dc18b5e9987bd22e2e19San Mehat public void shutdown() { 762af75c33e8d7f1a27c6c0d71820730ea8525019a3Jeff Sharkey // TODO: remove from aidl if nobody calls externally 763af75c33e8d7f1a27c6c0d71820730ea8525019a3Jeff Sharkey mContext.enforceCallingOrSelfPermission(SHUTDOWN, TAG); 764873f2145941cc28f6931dc18b5e9987bd22e2e19San Mehat 7658a9b22056b13477f59df934928c00c58b5871c95Joe Onorato Slog.d(TAG, "Shutting down"); 766873f2145941cc28f6931dc18b5e9987bd22e2e19San Mehat } 767873f2145941cc28f6931dc18b5e9987bd22e2e19San Mehat 768af75c33e8d7f1a27c6c0d71820730ea8525019a3Jeff Sharkey @Override 769873f2145941cc28f6931dc18b5e9987bd22e2e19San Mehat public boolean getIpForwardingEnabled() throws IllegalStateException{ 7704529bb66c47fd02b990ecb0810031157b4f36c2fJeff Sharkey mContext.enforceCallingOrSelfPermission(CONNECTIVITY_INTERNAL, TAG); 771873f2145941cc28f6931dc18b5e9987bd22e2e19San Mehat 772ba2896e939f359e5857149f1a27212db71be012bJeff Sharkey final NativeDaemonEvent event; 773a80ce06d4c54e43243073f8ceff024f9dda7140eKenny Root try { 774ba2896e939f359e5857149f1a27212db71be012bJeff Sharkey event = mConnector.execute("ipfwd", "status"); 775a80ce06d4c54e43243073f8ceff024f9dda7140eKenny Root } catch (NativeDaemonConnectorException e) { 776276642baf11e05700ef24447dc4271f16ce69b50Jeff Sharkey throw e.rethrowAsParcelableException(); 777a80ce06d4c54e43243073f8ceff024f9dda7140eKenny Root } 778873f2145941cc28f6931dc18b5e9987bd22e2e19San Mehat 779ba2896e939f359e5857149f1a27212db71be012bJeff Sharkey // 211 Forwarding enabled 780ba2896e939f359e5857149f1a27212db71be012bJeff Sharkey event.checkCode(IpFwdStatusResult); 781ba2896e939f359e5857149f1a27212db71be012bJeff Sharkey return event.getMessage().endsWith("enabled"); 782873f2145941cc28f6931dc18b5e9987bd22e2e19San Mehat } 783873f2145941cc28f6931dc18b5e9987bd22e2e19San Mehat 784af75c33e8d7f1a27c6c0d71820730ea8525019a3Jeff Sharkey @Override 785af75c33e8d7f1a27c6c0d71820730ea8525019a3Jeff Sharkey public void setIpForwardingEnabled(boolean enable) { 7864529bb66c47fd02b990ecb0810031157b4f36c2fJeff Sharkey mContext.enforceCallingOrSelfPermission(CONNECTIVITY_INTERNAL, TAG); 78731c6e4817f6c967fc4f61c4f1d9f25743958f7deJeff Sharkey try { 788ba2896e939f359e5857149f1a27212db71be012bJeff Sharkey mConnector.execute("ipfwd", enable ? "enable" : "disable"); 78931c6e4817f6c967fc4f61c4f1d9f25743958f7deJeff Sharkey } catch (NativeDaemonConnectorException e) { 790276642baf11e05700ef24447dc4271f16ce69b50Jeff Sharkey throw e.rethrowAsParcelableException(); 79131c6e4817f6c967fc4f61c4f1d9f25743958f7deJeff Sharkey } 792873f2145941cc28f6931dc18b5e9987bd22e2e19San Mehat } 793873f2145941cc28f6931dc18b5e9987bd22e2e19San Mehat 794af75c33e8d7f1a27c6c0d71820730ea8525019a3Jeff Sharkey @Override 795af75c33e8d7f1a27c6c0d71820730ea8525019a3Jeff Sharkey public void startTethering(String[] dhcpRange) { 7964529bb66c47fd02b990ecb0810031157b4f36c2fJeff Sharkey mContext.enforceCallingOrSelfPermission(CONNECTIVITY_INTERNAL, TAG); 797bfb7bfa53847832db2a3eb05e5eff7cb974c3c7aRobert Greenwalt // cmd is "tether start first_start first_stop second_start second_stop ..." 798bfb7bfa53847832db2a3eb05e5eff7cb974c3c7aRobert Greenwalt // an odd number of addrs will fail 799ba2896e939f359e5857149f1a27212db71be012bJeff Sharkey 800ba2896e939f359e5857149f1a27212db71be012bJeff Sharkey final Command cmd = new Command("tether", "start"); 801bfb7bfa53847832db2a3eb05e5eff7cb974c3c7aRobert Greenwalt for (String d : dhcpRange) { 802ba2896e939f359e5857149f1a27212db71be012bJeff Sharkey cmd.appendArg(d); 803bfb7bfa53847832db2a3eb05e5eff7cb974c3c7aRobert Greenwalt } 804a80ce06d4c54e43243073f8ceff024f9dda7140eKenny Root 805a80ce06d4c54e43243073f8ceff024f9dda7140eKenny Root try { 806ba2896e939f359e5857149f1a27212db71be012bJeff Sharkey mConnector.execute(cmd); 807a80ce06d4c54e43243073f8ceff024f9dda7140eKenny Root } catch (NativeDaemonConnectorException e) { 808276642baf11e05700ef24447dc4271f16ce69b50Jeff Sharkey throw e.rethrowAsParcelableException(); 809a80ce06d4c54e43243073f8ceff024f9dda7140eKenny Root } 810873f2145941cc28f6931dc18b5e9987bd22e2e19San Mehat } 811873f2145941cc28f6931dc18b5e9987bd22e2e19San Mehat 812af75c33e8d7f1a27c6c0d71820730ea8525019a3Jeff Sharkey @Override 813af75c33e8d7f1a27c6c0d71820730ea8525019a3Jeff Sharkey public void stopTethering() { 8144529bb66c47fd02b990ecb0810031157b4f36c2fJeff Sharkey mContext.enforceCallingOrSelfPermission(CONNECTIVITY_INTERNAL, TAG); 815a80ce06d4c54e43243073f8ceff024f9dda7140eKenny Root try { 816ba2896e939f359e5857149f1a27212db71be012bJeff Sharkey mConnector.execute("tether", "stop"); 817a80ce06d4c54e43243073f8ceff024f9dda7140eKenny Root } catch (NativeDaemonConnectorException e) { 818276642baf11e05700ef24447dc4271f16ce69b50Jeff Sharkey throw e.rethrowAsParcelableException(); 819a80ce06d4c54e43243073f8ceff024f9dda7140eKenny Root } 820873f2145941cc28f6931dc18b5e9987bd22e2e19San Mehat } 821873f2145941cc28f6931dc18b5e9987bd22e2e19San Mehat 822af75c33e8d7f1a27c6c0d71820730ea8525019a3Jeff Sharkey @Override 823af75c33e8d7f1a27c6c0d71820730ea8525019a3Jeff Sharkey public boolean isTetheringStarted() { 8244529bb66c47fd02b990ecb0810031157b4f36c2fJeff Sharkey mContext.enforceCallingOrSelfPermission(CONNECTIVITY_INTERNAL, TAG); 825873f2145941cc28f6931dc18b5e9987bd22e2e19San Mehat 826ba2896e939f359e5857149f1a27212db71be012bJeff Sharkey final NativeDaemonEvent event; 827a80ce06d4c54e43243073f8ceff024f9dda7140eKenny Root try { 828ba2896e939f359e5857149f1a27212db71be012bJeff Sharkey event = mConnector.execute("tether", "status"); 829a80ce06d4c54e43243073f8ceff024f9dda7140eKenny Root } catch (NativeDaemonConnectorException e) { 830276642baf11e05700ef24447dc4271f16ce69b50Jeff Sharkey throw e.rethrowAsParcelableException(); 831a80ce06d4c54e43243073f8ceff024f9dda7140eKenny Root } 832873f2145941cc28f6931dc18b5e9987bd22e2e19San Mehat 833ba2896e939f359e5857149f1a27212db71be012bJeff Sharkey // 210 Tethering services started 834ba2896e939f359e5857149f1a27212db71be012bJeff Sharkey event.checkCode(TetherStatusResult); 835ba2896e939f359e5857149f1a27212db71be012bJeff Sharkey return event.getMessage().endsWith("started"); 836873f2145941cc28f6931dc18b5e9987bd22e2e19San Mehat } 837fe19f1234e460a22e43a53665db1c48613844fa6Matthew Xie 838fe19f1234e460a22e43a53665db1c48613844fa6Matthew Xie // TODO(BT) Remove 8390f42037eb7b5118015c2caca635538324ccf0ccffredc public void startReverseTethering(String iface) 8400f42037eb7b5118015c2caca635538324ccf0ccffredc throws IllegalStateException { 8410f42037eb7b5118015c2caca635538324ccf0ccffredc if (DBG) Slog.d(TAG, "startReverseTethering in"); 842fe19f1234e460a22e43a53665db1c48613844fa6Matthew Xie mContext.enforceCallingOrSelfPermission(CONNECTIVITY_INTERNAL, TAG); 8430f42037eb7b5118015c2caca635538324ccf0ccffredc // cmd is "tether start first_start first_stop second_start second_stop ..." 8440f42037eb7b5118015c2caca635538324ccf0ccffredc // an odd number of addrs will fail 8450f42037eb7b5118015c2caca635538324ccf0ccffredc String cmd = "tether start-reverse"; 8460f42037eb7b5118015c2caca635538324ccf0ccffredc cmd += " " + iface; 8470f42037eb7b5118015c2caca635538324ccf0ccffredc if (DBG) Slog.d(TAG, "startReverseTethering cmd: " + cmd); 8480f42037eb7b5118015c2caca635538324ccf0ccffredc try { 8490f42037eb7b5118015c2caca635538324ccf0ccffredc mConnector.doCommand(cmd); 8500f42037eb7b5118015c2caca635538324ccf0ccffredc } catch (NativeDaemonConnectorException e) { 8510f42037eb7b5118015c2caca635538324ccf0ccffredc throw new IllegalStateException("Unable to communicate to native daemon"); 8520f42037eb7b5118015c2caca635538324ccf0ccffredc } 8530f42037eb7b5118015c2caca635538324ccf0ccffredc BluetoothTetheringDataTracker.getInstance().startReverseTether(iface); 8540f42037eb7b5118015c2caca635538324ccf0ccffredc 8550f42037eb7b5118015c2caca635538324ccf0ccffredc } 856fe19f1234e460a22e43a53665db1c48613844fa6Matthew Xie 857fe19f1234e460a22e43a53665db1c48613844fa6Matthew Xie // TODO(BT) Remove 8580f42037eb7b5118015c2caca635538324ccf0ccffredc public void stopReverseTethering() throws IllegalStateException { 859fe19f1234e460a22e43a53665db1c48613844fa6Matthew Xie mContext.enforceCallingOrSelfPermission(CONNECTIVITY_INTERNAL, TAG); 8600f42037eb7b5118015c2caca635538324ccf0ccffredc try { 8610f42037eb7b5118015c2caca635538324ccf0ccffredc mConnector.doCommand("tether stop-reverse"); 8620f42037eb7b5118015c2caca635538324ccf0ccffredc } catch (NativeDaemonConnectorException e) { 8630f42037eb7b5118015c2caca635538324ccf0ccffredc throw new IllegalStateException("Unable to communicate to native daemon to stop tether"); 8640f42037eb7b5118015c2caca635538324ccf0ccffredc } 8650f42037eb7b5118015c2caca635538324ccf0ccffredc BluetoothTetheringDataTracker.getInstance().stopReverseTether(); 8660f42037eb7b5118015c2caca635538324ccf0ccffredc } 867873f2145941cc28f6931dc18b5e9987bd22e2e19San Mehat 868af75c33e8d7f1a27c6c0d71820730ea8525019a3Jeff Sharkey @Override 869af75c33e8d7f1a27c6c0d71820730ea8525019a3Jeff Sharkey public void tetherInterface(String iface) { 8704529bb66c47fd02b990ecb0810031157b4f36c2fJeff Sharkey mContext.enforceCallingOrSelfPermission(CONNECTIVITY_INTERNAL, TAG); 871a80ce06d4c54e43243073f8ceff024f9dda7140eKenny Root try { 872ba2896e939f359e5857149f1a27212db71be012bJeff Sharkey mConnector.execute("tether", "interface", "add", iface); 873a80ce06d4c54e43243073f8ceff024f9dda7140eKenny Root } catch (NativeDaemonConnectorException e) { 874276642baf11e05700ef24447dc4271f16ce69b50Jeff Sharkey throw e.rethrowAsParcelableException(); 875a80ce06d4c54e43243073f8ceff024f9dda7140eKenny Root } 876873f2145941cc28f6931dc18b5e9987bd22e2e19San Mehat } 877873f2145941cc28f6931dc18b5e9987bd22e2e19San Mehat 878af75c33e8d7f1a27c6c0d71820730ea8525019a3Jeff Sharkey @Override 879873f2145941cc28f6931dc18b5e9987bd22e2e19San Mehat public void untetherInterface(String iface) { 8804529bb66c47fd02b990ecb0810031157b4f36c2fJeff Sharkey mContext.enforceCallingOrSelfPermission(CONNECTIVITY_INTERNAL, TAG); 881a80ce06d4c54e43243073f8ceff024f9dda7140eKenny Root try { 882ba2896e939f359e5857149f1a27212db71be012bJeff Sharkey mConnector.execute("tether", "interface", "remove", iface); 883a80ce06d4c54e43243073f8ceff024f9dda7140eKenny Root } catch (NativeDaemonConnectorException e) { 884276642baf11e05700ef24447dc4271f16ce69b50Jeff Sharkey throw e.rethrowAsParcelableException(); 885a80ce06d4c54e43243073f8ceff024f9dda7140eKenny Root } 886873f2145941cc28f6931dc18b5e9987bd22e2e19San Mehat } 887873f2145941cc28f6931dc18b5e9987bd22e2e19San Mehat 888af75c33e8d7f1a27c6c0d71820730ea8525019a3Jeff Sharkey @Override 889af75c33e8d7f1a27c6c0d71820730ea8525019a3Jeff Sharkey public String[] listTetheredInterfaces() { 8904529bb66c47fd02b990ecb0810031157b4f36c2fJeff Sharkey mContext.enforceCallingOrSelfPermission(CONNECTIVITY_INTERNAL, TAG); 891a80ce06d4c54e43243073f8ceff024f9dda7140eKenny Root try { 892ba2896e939f359e5857149f1a27212db71be012bJeff Sharkey return NativeDaemonEvent.filterMessageList( 893ba2896e939f359e5857149f1a27212db71be012bJeff Sharkey mConnector.executeForList("tether", "interface", "list"), 894ba2896e939f359e5857149f1a27212db71be012bJeff Sharkey TetherInterfaceListResult); 895a80ce06d4c54e43243073f8ceff024f9dda7140eKenny Root } catch (NativeDaemonConnectorException e) { 896276642baf11e05700ef24447dc4271f16ce69b50Jeff Sharkey throw e.rethrowAsParcelableException(); 897a80ce06d4c54e43243073f8ceff024f9dda7140eKenny Root } 898873f2145941cc28f6931dc18b5e9987bd22e2e19San Mehat } 899873f2145941cc28f6931dc18b5e9987bd22e2e19San Mehat 900af75c33e8d7f1a27c6c0d71820730ea8525019a3Jeff Sharkey @Override 901af75c33e8d7f1a27c6c0d71820730ea8525019a3Jeff Sharkey public void setDnsForwarders(String[] dns) { 9024529bb66c47fd02b990ecb0810031157b4f36c2fJeff Sharkey mContext.enforceCallingOrSelfPermission(CONNECTIVITY_INTERNAL, TAG); 903ba2896e939f359e5857149f1a27212db71be012bJeff Sharkey 904ba2896e939f359e5857149f1a27212db71be012bJeff Sharkey final Command cmd = new Command("tether", "dns", "set"); 905ba2896e939f359e5857149f1a27212db71be012bJeff Sharkey for (String s : dns) { 906ba2896e939f359e5857149f1a27212db71be012bJeff Sharkey cmd.appendArg(NetworkUtils.numericToInetAddress(s).getHostAddress()); 907ba2896e939f359e5857149f1a27212db71be012bJeff Sharkey } 908ba2896e939f359e5857149f1a27212db71be012bJeff Sharkey 909873f2145941cc28f6931dc18b5e9987bd22e2e19San Mehat try { 910ba2896e939f359e5857149f1a27212db71be012bJeff Sharkey mConnector.execute(cmd); 911ba2896e939f359e5857149f1a27212db71be012bJeff Sharkey } catch (NativeDaemonConnectorException e) { 912ba2896e939f359e5857149f1a27212db71be012bJeff Sharkey throw e.rethrowAsParcelableException(); 913873f2145941cc28f6931dc18b5e9987bd22e2e19San Mehat } 914873f2145941cc28f6931dc18b5e9987bd22e2e19San Mehat } 915873f2145941cc28f6931dc18b5e9987bd22e2e19San Mehat 916af75c33e8d7f1a27c6c0d71820730ea8525019a3Jeff Sharkey @Override 917af75c33e8d7f1a27c6c0d71820730ea8525019a3Jeff Sharkey public String[] getDnsForwarders() { 9184529bb66c47fd02b990ecb0810031157b4f36c2fJeff Sharkey mContext.enforceCallingOrSelfPermission(CONNECTIVITY_INTERNAL, TAG); 919a80ce06d4c54e43243073f8ceff024f9dda7140eKenny Root try { 920ba2896e939f359e5857149f1a27212db71be012bJeff Sharkey return NativeDaemonEvent.filterMessageList( 921ba2896e939f359e5857149f1a27212db71be012bJeff Sharkey mConnector.executeForList("tether", "dns", "list"), TetherDnsFwdTgtListResult); 922a80ce06d4c54e43243073f8ceff024f9dda7140eKenny Root } catch (NativeDaemonConnectorException e) { 923276642baf11e05700ef24447dc4271f16ce69b50Jeff Sharkey throw e.rethrowAsParcelableException(); 924a80ce06d4c54e43243073f8ceff024f9dda7140eKenny Root } 925873f2145941cc28f6931dc18b5e9987bd22e2e19San Mehat } 926873f2145941cc28f6931dc18b5e9987bd22e2e19San Mehat 927ba2896e939f359e5857149f1a27212db71be012bJeff Sharkey private void modifyNat(String action, String internalInterface, String externalInterface) 9283b28e9a3daede9eac44faeb736ab4c8386ddd089Robert Greenwalt throws SocketException { 929ba2896e939f359e5857149f1a27212db71be012bJeff Sharkey final Command cmd = new Command("nat", action, internalInterface, externalInterface); 9303b28e9a3daede9eac44faeb736ab4c8386ddd089Robert Greenwalt 931ba2896e939f359e5857149f1a27212db71be012bJeff Sharkey final NetworkInterface internalNetworkInterface = NetworkInterface.getByName( 932ba2896e939f359e5857149f1a27212db71be012bJeff Sharkey internalInterface); 933e83d181606981bcacd78e55b293fe9fa95b2551dRobert Greenwalt if (internalNetworkInterface == null) { 934ba2896e939f359e5857149f1a27212db71be012bJeff Sharkey cmd.appendArg("0"); 935e83d181606981bcacd78e55b293fe9fa95b2551dRobert Greenwalt } else { 936ba2896e939f359e5857149f1a27212db71be012bJeff Sharkey Collection<InterfaceAddress> interfaceAddresses = internalNetworkInterface 937ba2896e939f359e5857149f1a27212db71be012bJeff Sharkey .getInterfaceAddresses(); 938ba2896e939f359e5857149f1a27212db71be012bJeff Sharkey cmd.appendArg(interfaceAddresses.size()); 939e83d181606981bcacd78e55b293fe9fa95b2551dRobert Greenwalt for (InterfaceAddress ia : interfaceAddresses) { 940ba2896e939f359e5857149f1a27212db71be012bJeff Sharkey InetAddress addr = NetworkUtils.getNetworkPart( 941ba2896e939f359e5857149f1a27212db71be012bJeff Sharkey ia.getAddress(), ia.getNetworkPrefixLength()); 942ba2896e939f359e5857149f1a27212db71be012bJeff Sharkey cmd.appendArg(addr.getHostAddress() + "/" + ia.getNetworkPrefixLength()); 943e83d181606981bcacd78e55b293fe9fa95b2551dRobert Greenwalt } 9443b28e9a3daede9eac44faeb736ab4c8386ddd089Robert Greenwalt } 9453b28e9a3daede9eac44faeb736ab4c8386ddd089Robert Greenwalt 94631c6e4817f6c967fc4f61c4f1d9f25743958f7deJeff Sharkey try { 947ba2896e939f359e5857149f1a27212db71be012bJeff Sharkey mConnector.execute(cmd); 94831c6e4817f6c967fc4f61c4f1d9f25743958f7deJeff Sharkey } catch (NativeDaemonConnectorException e) { 949276642baf11e05700ef24447dc4271f16ce69b50Jeff Sharkey throw e.rethrowAsParcelableException(); 95031c6e4817f6c967fc4f61c4f1d9f25743958f7deJeff Sharkey } 9513b28e9a3daede9eac44faeb736ab4c8386ddd089Robert Greenwalt } 9523b28e9a3daede9eac44faeb736ab4c8386ddd089Robert Greenwalt 953af75c33e8d7f1a27c6c0d71820730ea8525019a3Jeff Sharkey @Override 954af75c33e8d7f1a27c6c0d71820730ea8525019a3Jeff Sharkey public void enableNat(String internalInterface, String externalInterface) { 9554529bb66c47fd02b990ecb0810031157b4f36c2fJeff Sharkey mContext.enforceCallingOrSelfPermission(CONNECTIVITY_INTERNAL, TAG); 956a80ce06d4c54e43243073f8ceff024f9dda7140eKenny Root try { 9573b28e9a3daede9eac44faeb736ab4c8386ddd089Robert Greenwalt modifyNat("enable", internalInterface, externalInterface); 958ba2896e939f359e5857149f1a27212db71be012bJeff Sharkey } catch (SocketException e) { 959ba2896e939f359e5857149f1a27212db71be012bJeff Sharkey throw new IllegalStateException(e); 960a80ce06d4c54e43243073f8ceff024f9dda7140eKenny Root } 961873f2145941cc28f6931dc18b5e9987bd22e2e19San Mehat } 962873f2145941cc28f6931dc18b5e9987bd22e2e19San Mehat 963af75c33e8d7f1a27c6c0d71820730ea8525019a3Jeff Sharkey @Override 964af75c33e8d7f1a27c6c0d71820730ea8525019a3Jeff Sharkey public void disableNat(String internalInterface, String externalInterface) { 9654529bb66c47fd02b990ecb0810031157b4f36c2fJeff Sharkey mContext.enforceCallingOrSelfPermission(CONNECTIVITY_INTERNAL, TAG); 966a80ce06d4c54e43243073f8ceff024f9dda7140eKenny Root try { 9673b28e9a3daede9eac44faeb736ab4c8386ddd089Robert Greenwalt modifyNat("disable", internalInterface, externalInterface); 968ba2896e939f359e5857149f1a27212db71be012bJeff Sharkey } catch (SocketException e) { 969ba2896e939f359e5857149f1a27212db71be012bJeff Sharkey throw new IllegalStateException(e); 970a80ce06d4c54e43243073f8ceff024f9dda7140eKenny Root } 971873f2145941cc28f6931dc18b5e9987bd22e2e19San Mehat } 97272759df749bb8557269db86c2e3b2a8a0343cc26San Mehat 973af75c33e8d7f1a27c6c0d71820730ea8525019a3Jeff Sharkey @Override 974af75c33e8d7f1a27c6c0d71820730ea8525019a3Jeff Sharkey public String[] listTtys() { 9754529bb66c47fd02b990ecb0810031157b4f36c2fJeff Sharkey mContext.enforceCallingOrSelfPermission(CONNECTIVITY_INTERNAL, TAG); 976a80ce06d4c54e43243073f8ceff024f9dda7140eKenny Root try { 977ba2896e939f359e5857149f1a27212db71be012bJeff Sharkey return NativeDaemonEvent.filterMessageList( 978ba2896e939f359e5857149f1a27212db71be012bJeff Sharkey mConnector.executeForList("list_ttys"), TtyListResult); 979a80ce06d4c54e43243073f8ceff024f9dda7140eKenny Root } catch (NativeDaemonConnectorException e) { 980276642baf11e05700ef24447dc4271f16ce69b50Jeff Sharkey throw e.rethrowAsParcelableException(); 981a80ce06d4c54e43243073f8ceff024f9dda7140eKenny Root } 98272759df749bb8557269db86c2e3b2a8a0343cc26San Mehat } 98372759df749bb8557269db86c2e3b2a8a0343cc26San Mehat 984af75c33e8d7f1a27c6c0d71820730ea8525019a3Jeff Sharkey @Override 985af75c33e8d7f1a27c6c0d71820730ea8525019a3Jeff Sharkey public void attachPppd( 986af75c33e8d7f1a27c6c0d71820730ea8525019a3Jeff Sharkey String tty, String localAddr, String remoteAddr, String dns1Addr, String dns2Addr) { 9874529bb66c47fd02b990ecb0810031157b4f36c2fJeff Sharkey mContext.enforceCallingOrSelfPermission(CONNECTIVITY_INTERNAL, TAG); 98872759df749bb8557269db86c2e3b2a8a0343cc26San Mehat try { 989ba2896e939f359e5857149f1a27212db71be012bJeff Sharkey mConnector.execute("pppd", "attach", tty, 990e590373ea71251cfffc8f22f011e2e6335dce716Robert Greenwalt NetworkUtils.numericToInetAddress(localAddr).getHostAddress(), 991e590373ea71251cfffc8f22f011e2e6335dce716Robert Greenwalt NetworkUtils.numericToInetAddress(remoteAddr).getHostAddress(), 992e590373ea71251cfffc8f22f011e2e6335dce716Robert Greenwalt NetworkUtils.numericToInetAddress(dns1Addr).getHostAddress(), 993ba2896e939f359e5857149f1a27212db71be012bJeff Sharkey NetworkUtils.numericToInetAddress(dns2Addr).getHostAddress()); 994a80ce06d4c54e43243073f8ceff024f9dda7140eKenny Root } catch (NativeDaemonConnectorException e) { 995276642baf11e05700ef24447dc4271f16ce69b50Jeff Sharkey throw e.rethrowAsParcelableException(); 99672759df749bb8557269db86c2e3b2a8a0343cc26San Mehat } 99772759df749bb8557269db86c2e3b2a8a0343cc26San Mehat } 99872759df749bb8557269db86c2e3b2a8a0343cc26San Mehat 999af75c33e8d7f1a27c6c0d71820730ea8525019a3Jeff Sharkey @Override 1000af75c33e8d7f1a27c6c0d71820730ea8525019a3Jeff Sharkey public void detachPppd(String tty) { 10014529bb66c47fd02b990ecb0810031157b4f36c2fJeff Sharkey mContext.enforceCallingOrSelfPermission(CONNECTIVITY_INTERNAL, TAG); 1002a80ce06d4c54e43243073f8ceff024f9dda7140eKenny Root try { 1003ba2896e939f359e5857149f1a27212db71be012bJeff Sharkey mConnector.execute("pppd", "detach", tty); 1004a80ce06d4c54e43243073f8ceff024f9dda7140eKenny Root } catch (NativeDaemonConnectorException e) { 1005276642baf11e05700ef24447dc4271f16ce69b50Jeff Sharkey throw e.rethrowAsParcelableException(); 1006a80ce06d4c54e43243073f8ceff024f9dda7140eKenny Root } 100772759df749bb8557269db86c2e3b2a8a0343cc26San Mehat } 1008ce1200d42c46ae5d3ec637587b07dfdc02ad21c0Robert Greenwalt 1009af75c33e8d7f1a27c6c0d71820730ea8525019a3Jeff Sharkey @Override 1010af75c33e8d7f1a27c6c0d71820730ea8525019a3Jeff Sharkey public void startAccessPoint( 101190542758d4fef2e5ff8badaf3b40c2a227fbfc47Irfan Sheriff WifiConfiguration wifiConfig, String wlanIface) { 10124529bb66c47fd02b990ecb0810031157b4f36c2fJeff Sharkey mContext.enforceCallingOrSelfPermission(CONNECTIVITY_INTERNAL, TAG); 1013a80ce06d4c54e43243073f8ceff024f9dda7140eKenny Root try { 1014cb30b22ff507a5a9a5d9c584f8b082f5e96c4d02Irfan Sheriff wifiFirmwareReload(wlanIface, "AP"); 1015a80ce06d4c54e43243073f8ceff024f9dda7140eKenny Root if (wifiConfig == null) { 101690542758d4fef2e5ff8badaf3b40c2a227fbfc47Irfan Sheriff mConnector.execute("softap", "set", wlanIface); 1017a80ce06d4c54e43243073f8ceff024f9dda7140eKenny Root } else { 101890542758d4fef2e5ff8badaf3b40c2a227fbfc47Irfan Sheriff mConnector.execute("softap", "set", wlanIface, wifiConfig.SSID, 1019ba2896e939f359e5857149f1a27212db71be012bJeff Sharkey getSecurityType(wifiConfig), wifiConfig.preSharedKey); 1020a80ce06d4c54e43243073f8ceff024f9dda7140eKenny Root } 1021ba2896e939f359e5857149f1a27212db71be012bJeff Sharkey mConnector.execute("softap", "startap"); 1022a80ce06d4c54e43243073f8ceff024f9dda7140eKenny Root } catch (NativeDaemonConnectorException e) { 1023276642baf11e05700ef24447dc4271f16ce69b50Jeff Sharkey throw e.rethrowAsParcelableException(); 1024a80ce06d4c54e43243073f8ceff024f9dda7140eKenny Root } 10255321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff } 10265321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff 1027ba2896e939f359e5857149f1a27212db71be012bJeff Sharkey private static String getSecurityType(WifiConfiguration wifiConfig) { 1028ec8d23af7372204f068aebaa1bfae87dc9260e23Irfan Sheriff switch (wifiConfig.getAuthType()) { 1029ec8d23af7372204f068aebaa1bfae87dc9260e23Irfan Sheriff case KeyMgmt.WPA_PSK: 1030ec8d23af7372204f068aebaa1bfae87dc9260e23Irfan Sheriff return "wpa-psk"; 1031ec8d23af7372204f068aebaa1bfae87dc9260e23Irfan Sheriff case KeyMgmt.WPA2_PSK: 1032ec8d23af7372204f068aebaa1bfae87dc9260e23Irfan Sheriff return "wpa2-psk"; 1033ec8d23af7372204f068aebaa1bfae87dc9260e23Irfan Sheriff default: 1034ec8d23af7372204f068aebaa1bfae87dc9260e23Irfan Sheriff return "open"; 1035ec8d23af7372204f068aebaa1bfae87dc9260e23Irfan Sheriff } 1036ec8d23af7372204f068aebaa1bfae87dc9260e23Irfan Sheriff } 1037ec8d23af7372204f068aebaa1bfae87dc9260e23Irfan Sheriff 1038cb30b22ff507a5a9a5d9c584f8b082f5e96c4d02Irfan Sheriff /* @param mode can be "AP", "STA" or "P2P" */ 1039af75c33e8d7f1a27c6c0d71820730ea8525019a3Jeff Sharkey @Override 1040af75c33e8d7f1a27c6c0d71820730ea8525019a3Jeff Sharkey public void wifiFirmwareReload(String wlanIface, String mode) { 10414529bb66c47fd02b990ecb0810031157b4f36c2fJeff Sharkey mContext.enforceCallingOrSelfPermission(CONNECTIVITY_INTERNAL, TAG); 1042cb30b22ff507a5a9a5d9c584f8b082f5e96c4d02Irfan Sheriff try { 1043ba2896e939f359e5857149f1a27212db71be012bJeff Sharkey mConnector.execute("softap", "fwreload", wlanIface, mode); 1044cb30b22ff507a5a9a5d9c584f8b082f5e96c4d02Irfan Sheriff } catch (NativeDaemonConnectorException e) { 1045276642baf11e05700ef24447dc4271f16ce69b50Jeff Sharkey throw e.rethrowAsParcelableException(); 1046cb30b22ff507a5a9a5d9c584f8b082f5e96c4d02Irfan Sheriff } 1047cb30b22ff507a5a9a5d9c584f8b082f5e96c4d02Irfan Sheriff } 1048cb30b22ff507a5a9a5d9c584f8b082f5e96c4d02Irfan Sheriff 1049af75c33e8d7f1a27c6c0d71820730ea8525019a3Jeff Sharkey @Override 1050af75c33e8d7f1a27c6c0d71820730ea8525019a3Jeff Sharkey public void stopAccessPoint(String wlanIface) { 10514529bb66c47fd02b990ecb0810031157b4f36c2fJeff Sharkey mContext.enforceCallingOrSelfPermission(CONNECTIVITY_INTERNAL, TAG); 1052a80ce06d4c54e43243073f8ceff024f9dda7140eKenny Root try { 1053ba2896e939f359e5857149f1a27212db71be012bJeff Sharkey mConnector.execute("softap", "stopap"); 1054cb30b22ff507a5a9a5d9c584f8b082f5e96c4d02Irfan Sheriff wifiFirmwareReload(wlanIface, "STA"); 1055a80ce06d4c54e43243073f8ceff024f9dda7140eKenny Root } catch (NativeDaemonConnectorException e) { 1056276642baf11e05700ef24447dc4271f16ce69b50Jeff Sharkey throw e.rethrowAsParcelableException(); 1057a80ce06d4c54e43243073f8ceff024f9dda7140eKenny Root } 10585321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff } 10595321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff 1060af75c33e8d7f1a27c6c0d71820730ea8525019a3Jeff Sharkey @Override 106190542758d4fef2e5ff8badaf3b40c2a227fbfc47Irfan Sheriff public void setAccessPoint(WifiConfiguration wifiConfig, String wlanIface) { 10624529bb66c47fd02b990ecb0810031157b4f36c2fJeff Sharkey mContext.enforceCallingOrSelfPermission(CONNECTIVITY_INTERNAL, TAG); 1063a80ce06d4c54e43243073f8ceff024f9dda7140eKenny Root try { 1064a80ce06d4c54e43243073f8ceff024f9dda7140eKenny Root if (wifiConfig == null) { 106590542758d4fef2e5ff8badaf3b40c2a227fbfc47Irfan Sheriff mConnector.execute("softap", "set", wlanIface); 1066a80ce06d4c54e43243073f8ceff024f9dda7140eKenny Root } else { 106790542758d4fef2e5ff8badaf3b40c2a227fbfc47Irfan Sheriff mConnector.execute("softap", "set", wlanIface, wifiConfig.SSID, 1068ba2896e939f359e5857149f1a27212db71be012bJeff Sharkey getSecurityType(wifiConfig), wifiConfig.preSharedKey); 1069a80ce06d4c54e43243073f8ceff024f9dda7140eKenny Root } 1070a80ce06d4c54e43243073f8ceff024f9dda7140eKenny Root } catch (NativeDaemonConnectorException e) { 1071276642baf11e05700ef24447dc4271f16ce69b50Jeff Sharkey throw e.rethrowAsParcelableException(); 1072c2f54c267b896cd1799d82be81e904a2b56c2f26Irfan Sheriff } 1073c2f54c267b896cd1799d82be81e904a2b56c2f26Irfan Sheriff } 107491cac64cd010e6b4006fdd14b39dbc75778f20cbSan Mehat 1075eedcb9525ba5befee2ba6ebb7a9ee3f13395c2a3Jeff Sharkey @Override 10760412423f06ec633203b96f68b51f0720c33a2473Haoyu Bai public void addIdleTimer(String iface, int timeout, String label) { 10770412423f06ec633203b96f68b51f0720c33a2473Haoyu Bai mContext.enforceCallingOrSelfPermission(CONNECTIVITY_INTERNAL, TAG); 10780412423f06ec633203b96f68b51f0720c33a2473Haoyu Bai 10790412423f06ec633203b96f68b51f0720c33a2473Haoyu Bai if (DBG) Slog.d(TAG, "Adding idletimer"); 10800412423f06ec633203b96f68b51f0720c33a2473Haoyu Bai 10810412423f06ec633203b96f68b51f0720c33a2473Haoyu Bai synchronized (mIdleTimerLock) { 10820412423f06ec633203b96f68b51f0720c33a2473Haoyu Bai IdleTimerParams params = mActiveIdleTimers.get(iface); 10830412423f06ec633203b96f68b51f0720c33a2473Haoyu Bai if (params != null) { 10840412423f06ec633203b96f68b51f0720c33a2473Haoyu Bai // the interface already has idletimer, update network count 10850412423f06ec633203b96f68b51f0720c33a2473Haoyu Bai params.networkCount++; 10860412423f06ec633203b96f68b51f0720c33a2473Haoyu Bai return; 10870412423f06ec633203b96f68b51f0720c33a2473Haoyu Bai } 10880412423f06ec633203b96f68b51f0720c33a2473Haoyu Bai 10890412423f06ec633203b96f68b51f0720c33a2473Haoyu Bai try { 10900412423f06ec633203b96f68b51f0720c33a2473Haoyu Bai mConnector.execute("idletimer", "add", iface, Integer.toString(timeout), label); 10910412423f06ec633203b96f68b51f0720c33a2473Haoyu Bai } catch (NativeDaemonConnectorException e) { 10920412423f06ec633203b96f68b51f0720c33a2473Haoyu Bai throw e.rethrowAsParcelableException(); 10930412423f06ec633203b96f68b51f0720c33a2473Haoyu Bai } 10940412423f06ec633203b96f68b51f0720c33a2473Haoyu Bai mActiveIdleTimers.put(iface, new IdleTimerParams(timeout, label)); 10950412423f06ec633203b96f68b51f0720c33a2473Haoyu Bai } 10960412423f06ec633203b96f68b51f0720c33a2473Haoyu Bai } 10970412423f06ec633203b96f68b51f0720c33a2473Haoyu Bai 10980412423f06ec633203b96f68b51f0720c33a2473Haoyu Bai @Override 10990412423f06ec633203b96f68b51f0720c33a2473Haoyu Bai public void removeIdleTimer(String iface) { 11000412423f06ec633203b96f68b51f0720c33a2473Haoyu Bai mContext.enforceCallingOrSelfPermission(CONNECTIVITY_INTERNAL, TAG); 11010412423f06ec633203b96f68b51f0720c33a2473Haoyu Bai 11020412423f06ec633203b96f68b51f0720c33a2473Haoyu Bai if (DBG) Slog.d(TAG, "Removing idletimer"); 11030412423f06ec633203b96f68b51f0720c33a2473Haoyu Bai 11040412423f06ec633203b96f68b51f0720c33a2473Haoyu Bai synchronized (mIdleTimerLock) { 11050412423f06ec633203b96f68b51f0720c33a2473Haoyu Bai IdleTimerParams params = mActiveIdleTimers.get(iface); 11060412423f06ec633203b96f68b51f0720c33a2473Haoyu Bai if (params == null || --(params.networkCount) > 0) { 11070412423f06ec633203b96f68b51f0720c33a2473Haoyu Bai return; 11080412423f06ec633203b96f68b51f0720c33a2473Haoyu Bai } 11090412423f06ec633203b96f68b51f0720c33a2473Haoyu Bai 11100412423f06ec633203b96f68b51f0720c33a2473Haoyu Bai try { 11110412423f06ec633203b96f68b51f0720c33a2473Haoyu Bai mConnector.execute("idletimer", "remove", iface, 11120412423f06ec633203b96f68b51f0720c33a2473Haoyu Bai Integer.toString(params.timeout), params.label); 11130412423f06ec633203b96f68b51f0720c33a2473Haoyu Bai } catch (NativeDaemonConnectorException e) { 11140412423f06ec633203b96f68b51f0720c33a2473Haoyu Bai throw e.rethrowAsParcelableException(); 11150412423f06ec633203b96f68b51f0720c33a2473Haoyu Bai } 11160412423f06ec633203b96f68b51f0720c33a2473Haoyu Bai mActiveIdleTimers.remove(iface); 11170412423f06ec633203b96f68b51f0720c33a2473Haoyu Bai } 11180412423f06ec633203b96f68b51f0720c33a2473Haoyu Bai } 11190412423f06ec633203b96f68b51f0720c33a2473Haoyu Bai 11200412423f06ec633203b96f68b51f0720c33a2473Haoyu Bai @Override 1121e8914c36276710de50b347c1e6aecfa45d6a56cdJeff Sharkey public NetworkStats getNetworkStatsSummaryDev() { 11224529bb66c47fd02b990ecb0810031157b4f36c2fJeff Sharkey mContext.enforceCallingOrSelfPermission(CONNECTIVITY_INTERNAL, TAG); 1123e8914c36276710de50b347c1e6aecfa45d6a56cdJeff Sharkey return mStatsFactory.readNetworkStatsSummaryDev(); 1124e8914c36276710de50b347c1e6aecfa45d6a56cdJeff Sharkey } 1125e8914c36276710de50b347c1e6aecfa45d6a56cdJeff Sharkey 1126e8914c36276710de50b347c1e6aecfa45d6a56cdJeff Sharkey @Override 1127e8914c36276710de50b347c1e6aecfa45d6a56cdJeff Sharkey public NetworkStats getNetworkStatsSummaryXt() { 1128e8914c36276710de50b347c1e6aecfa45d6a56cdJeff Sharkey mContext.enforceCallingOrSelfPermission(CONNECTIVITY_INTERNAL, TAG); 1129e8914c36276710de50b347c1e6aecfa45d6a56cdJeff Sharkey return mStatsFactory.readNetworkStatsSummaryXt(); 113091cac64cd010e6b4006fdd14b39dbc75778f20cbSan Mehat } 113191cac64cd010e6b4006fdd14b39dbc75778f20cbSan Mehat 1132eedcb9525ba5befee2ba6ebb7a9ee3f13395c2a3Jeff Sharkey @Override 11339a13f36cddaad01350bdb5f000167811a1d753c9Jeff Sharkey public NetworkStats getNetworkStatsDetail() { 11344529bb66c47fd02b990ecb0810031157b4f36c2fJeff Sharkey mContext.enforceCallingOrSelfPermission(CONNECTIVITY_INTERNAL, TAG); 11351059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey return mStatsFactory.readNetworkStatsDetail(UID_ALL); 113691cac64cd010e6b4006fdd14b39dbc75778f20cbSan Mehat } 113791cac64cd010e6b4006fdd14b39dbc75778f20cbSan Mehat 1138eedcb9525ba5befee2ba6ebb7a9ee3f13395c2a3Jeff Sharkey @Override 113941ff7ec82422a5b6d00892afdb3232bc0e53d851Jeff Sharkey public void setInterfaceQuota(String iface, long quotaBytes) { 11404529bb66c47fd02b990ecb0810031157b4f36c2fJeff Sharkey mContext.enforceCallingOrSelfPermission(CONNECTIVITY_INTERNAL, TAG); 1141b3f19ca36c8c1301893c621d8f2150e06210722cJeff Sharkey 1142350083e36b9db6062e165954403ef921ff3dfdadJeff Sharkey // silently discard when control disabled 1143350083e36b9db6062e165954403ef921ff3dfdadJeff Sharkey // TODO: eventually migrate to be always enabled 1144350083e36b9db6062e165954403ef921ff3dfdadJeff Sharkey if (!mBandwidthControlEnabled) return; 1145350083e36b9db6062e165954403ef921ff3dfdadJeff Sharkey 114641ff7ec82422a5b6d00892afdb3232bc0e53d851Jeff Sharkey synchronized (mQuotaLock) { 1147b24a78589b2bee4a86d5c864dd69169e134a339bJeff Sharkey if (mActiveQuotas.containsKey(iface)) { 114841ff7ec82422a5b6d00892afdb3232bc0e53d851Jeff Sharkey throw new IllegalStateException("iface " + iface + " already has quota"); 1149b3f19ca36c8c1301893c621d8f2150e06210722cJeff Sharkey } 1150b3f19ca36c8c1301893c621d8f2150e06210722cJeff Sharkey 1151b3f19ca36c8c1301893c621d8f2150e06210722cJeff Sharkey try { 115241ff7ec82422a5b6d00892afdb3232bc0e53d851Jeff Sharkey // TODO: support quota shared across interfaces 1153ba2896e939f359e5857149f1a27212db71be012bJeff Sharkey mConnector.execute("bandwidth", "setiquota", iface, quotaBytes); 1154b24a78589b2bee4a86d5c864dd69169e134a339bJeff Sharkey mActiveQuotas.put(iface, quotaBytes); 1155b3f19ca36c8c1301893c621d8f2150e06210722cJeff Sharkey } catch (NativeDaemonConnectorException e) { 1156276642baf11e05700ef24447dc4271f16ce69b50Jeff Sharkey throw e.rethrowAsParcelableException(); 1157b3f19ca36c8c1301893c621d8f2150e06210722cJeff Sharkey } 115850fd36d7c38c40b087c8f3e3172478abe0c051d9Ashish Sharma } 115950fd36d7c38c40b087c8f3e3172478abe0c051d9Ashish Sharma } 116050fd36d7c38c40b087c8f3e3172478abe0c051d9Ashish Sharma 116150fd36d7c38c40b087c8f3e3172478abe0c051d9Ashish Sharma @Override 1162b3f19ca36c8c1301893c621d8f2150e06210722cJeff Sharkey public void removeInterfaceQuota(String iface) { 11634529bb66c47fd02b990ecb0810031157b4f36c2fJeff Sharkey mContext.enforceCallingOrSelfPermission(CONNECTIVITY_INTERNAL, TAG); 1164b3f19ca36c8c1301893c621d8f2150e06210722cJeff Sharkey 1165350083e36b9db6062e165954403ef921ff3dfdadJeff Sharkey // silently discard when control disabled 1166350083e36b9db6062e165954403ef921ff3dfdadJeff Sharkey // TODO: eventually migrate to be always enabled 1167350083e36b9db6062e165954403ef921ff3dfdadJeff Sharkey if (!mBandwidthControlEnabled) return; 1168350083e36b9db6062e165954403ef921ff3dfdadJeff Sharkey 116941ff7ec82422a5b6d00892afdb3232bc0e53d851Jeff Sharkey synchronized (mQuotaLock) { 1170b24a78589b2bee4a86d5c864dd69169e134a339bJeff Sharkey if (!mActiveQuotas.containsKey(iface)) { 1171b3f19ca36c8c1301893c621d8f2150e06210722cJeff Sharkey // TODO: eventually consider throwing 1172b3f19ca36c8c1301893c621d8f2150e06210722cJeff Sharkey return; 1173b3f19ca36c8c1301893c621d8f2150e06210722cJeff Sharkey } 1174b3f19ca36c8c1301893c621d8f2150e06210722cJeff Sharkey 1175b24a78589b2bee4a86d5c864dd69169e134a339bJeff Sharkey mActiveQuotas.remove(iface); 1176b24a78589b2bee4a86d5c864dd69169e134a339bJeff Sharkey mActiveAlerts.remove(iface); 117738ddeaa67e52810da5db42895edb74b79111ec53Jeff Sharkey 1178b3f19ca36c8c1301893c621d8f2150e06210722cJeff Sharkey try { 117941ff7ec82422a5b6d00892afdb3232bc0e53d851Jeff Sharkey // TODO: support quota shared across interfaces 1180ba2896e939f359e5857149f1a27212db71be012bJeff Sharkey mConnector.execute("bandwidth", "removeiquota", iface); 1181b3f19ca36c8c1301893c621d8f2150e06210722cJeff Sharkey } catch (NativeDaemonConnectorException e) { 1182276642baf11e05700ef24447dc4271f16ce69b50Jeff Sharkey throw e.rethrowAsParcelableException(); 1183b3f19ca36c8c1301893c621d8f2150e06210722cJeff Sharkey } 1184b3f19ca36c8c1301893c621d8f2150e06210722cJeff Sharkey } 1185b3f19ca36c8c1301893c621d8f2150e06210722cJeff Sharkey } 1186b3f19ca36c8c1301893c621d8f2150e06210722cJeff Sharkey 1187b3f19ca36c8c1301893c621d8f2150e06210722cJeff Sharkey @Override 118841ff7ec82422a5b6d00892afdb3232bc0e53d851Jeff Sharkey public void setInterfaceAlert(String iface, long alertBytes) { 11894529bb66c47fd02b990ecb0810031157b4f36c2fJeff Sharkey mContext.enforceCallingOrSelfPermission(CONNECTIVITY_INTERNAL, TAG); 119041ff7ec82422a5b6d00892afdb3232bc0e53d851Jeff Sharkey 119141ff7ec82422a5b6d00892afdb3232bc0e53d851Jeff Sharkey // silently discard when control disabled 119241ff7ec82422a5b6d00892afdb3232bc0e53d851Jeff Sharkey // TODO: eventually migrate to be always enabled 119341ff7ec82422a5b6d00892afdb3232bc0e53d851Jeff Sharkey if (!mBandwidthControlEnabled) return; 119441ff7ec82422a5b6d00892afdb3232bc0e53d851Jeff Sharkey 119541ff7ec82422a5b6d00892afdb3232bc0e53d851Jeff Sharkey // quick sanity check 1196b24a78589b2bee4a86d5c864dd69169e134a339bJeff Sharkey if (!mActiveQuotas.containsKey(iface)) { 119741ff7ec82422a5b6d00892afdb3232bc0e53d851Jeff Sharkey throw new IllegalStateException("setting alert requires existing quota on iface"); 119841ff7ec82422a5b6d00892afdb3232bc0e53d851Jeff Sharkey } 119941ff7ec82422a5b6d00892afdb3232bc0e53d851Jeff Sharkey 120041ff7ec82422a5b6d00892afdb3232bc0e53d851Jeff Sharkey synchronized (mQuotaLock) { 1201b24a78589b2bee4a86d5c864dd69169e134a339bJeff Sharkey if (mActiveAlerts.containsKey(iface)) { 120241ff7ec82422a5b6d00892afdb3232bc0e53d851Jeff Sharkey throw new IllegalStateException("iface " + iface + " already has alert"); 120341ff7ec82422a5b6d00892afdb3232bc0e53d851Jeff Sharkey } 120441ff7ec82422a5b6d00892afdb3232bc0e53d851Jeff Sharkey 120541ff7ec82422a5b6d00892afdb3232bc0e53d851Jeff Sharkey try { 120641ff7ec82422a5b6d00892afdb3232bc0e53d851Jeff Sharkey // TODO: support alert shared across interfaces 1207ba2896e939f359e5857149f1a27212db71be012bJeff Sharkey mConnector.execute("bandwidth", "setinterfacealert", iface, alertBytes); 1208b24a78589b2bee4a86d5c864dd69169e134a339bJeff Sharkey mActiveAlerts.put(iface, alertBytes); 120941ff7ec82422a5b6d00892afdb3232bc0e53d851Jeff Sharkey } catch (NativeDaemonConnectorException e) { 1210276642baf11e05700ef24447dc4271f16ce69b50Jeff Sharkey throw e.rethrowAsParcelableException(); 121141ff7ec82422a5b6d00892afdb3232bc0e53d851Jeff Sharkey } 121241ff7ec82422a5b6d00892afdb3232bc0e53d851Jeff Sharkey } 121341ff7ec82422a5b6d00892afdb3232bc0e53d851Jeff Sharkey } 121441ff7ec82422a5b6d00892afdb3232bc0e53d851Jeff Sharkey 121541ff7ec82422a5b6d00892afdb3232bc0e53d851Jeff Sharkey @Override 121641ff7ec82422a5b6d00892afdb3232bc0e53d851Jeff Sharkey public void removeInterfaceAlert(String iface) { 12174529bb66c47fd02b990ecb0810031157b4f36c2fJeff Sharkey mContext.enforceCallingOrSelfPermission(CONNECTIVITY_INTERNAL, TAG); 121841ff7ec82422a5b6d00892afdb3232bc0e53d851Jeff Sharkey 121941ff7ec82422a5b6d00892afdb3232bc0e53d851Jeff Sharkey // silently discard when control disabled 122041ff7ec82422a5b6d00892afdb3232bc0e53d851Jeff Sharkey // TODO: eventually migrate to be always enabled 122141ff7ec82422a5b6d00892afdb3232bc0e53d851Jeff Sharkey if (!mBandwidthControlEnabled) return; 122241ff7ec82422a5b6d00892afdb3232bc0e53d851Jeff Sharkey 122341ff7ec82422a5b6d00892afdb3232bc0e53d851Jeff Sharkey synchronized (mQuotaLock) { 1224b24a78589b2bee4a86d5c864dd69169e134a339bJeff Sharkey if (!mActiveAlerts.containsKey(iface)) { 122541ff7ec82422a5b6d00892afdb3232bc0e53d851Jeff Sharkey // TODO: eventually consider throwing 122641ff7ec82422a5b6d00892afdb3232bc0e53d851Jeff Sharkey return; 122741ff7ec82422a5b6d00892afdb3232bc0e53d851Jeff Sharkey } 122841ff7ec82422a5b6d00892afdb3232bc0e53d851Jeff Sharkey 122941ff7ec82422a5b6d00892afdb3232bc0e53d851Jeff Sharkey try { 123041ff7ec82422a5b6d00892afdb3232bc0e53d851Jeff Sharkey // TODO: support alert shared across interfaces 1231ba2896e939f359e5857149f1a27212db71be012bJeff Sharkey mConnector.execute("bandwidth", "removeinterfacealert", iface); 1232b24a78589b2bee4a86d5c864dd69169e134a339bJeff Sharkey mActiveAlerts.remove(iface); 123341ff7ec82422a5b6d00892afdb3232bc0e53d851Jeff Sharkey } catch (NativeDaemonConnectorException e) { 1234276642baf11e05700ef24447dc4271f16ce69b50Jeff Sharkey throw e.rethrowAsParcelableException(); 123541ff7ec82422a5b6d00892afdb3232bc0e53d851Jeff Sharkey } 123641ff7ec82422a5b6d00892afdb3232bc0e53d851Jeff Sharkey } 123741ff7ec82422a5b6d00892afdb3232bc0e53d851Jeff Sharkey } 123841ff7ec82422a5b6d00892afdb3232bc0e53d851Jeff Sharkey 123941ff7ec82422a5b6d00892afdb3232bc0e53d851Jeff Sharkey @Override 124041ff7ec82422a5b6d00892afdb3232bc0e53d851Jeff Sharkey public void setGlobalAlert(long alertBytes) { 12414529bb66c47fd02b990ecb0810031157b4f36c2fJeff Sharkey mContext.enforceCallingOrSelfPermission(CONNECTIVITY_INTERNAL, TAG); 124241ff7ec82422a5b6d00892afdb3232bc0e53d851Jeff Sharkey 124341ff7ec82422a5b6d00892afdb3232bc0e53d851Jeff Sharkey // silently discard when control disabled 124441ff7ec82422a5b6d00892afdb3232bc0e53d851Jeff Sharkey // TODO: eventually migrate to be always enabled 124541ff7ec82422a5b6d00892afdb3232bc0e53d851Jeff Sharkey if (!mBandwidthControlEnabled) return; 124641ff7ec82422a5b6d00892afdb3232bc0e53d851Jeff Sharkey 124741ff7ec82422a5b6d00892afdb3232bc0e53d851Jeff Sharkey try { 1248ba2896e939f359e5857149f1a27212db71be012bJeff Sharkey mConnector.execute("bandwidth", "setglobalalert", alertBytes); 124941ff7ec82422a5b6d00892afdb3232bc0e53d851Jeff Sharkey } catch (NativeDaemonConnectorException e) { 1250276642baf11e05700ef24447dc4271f16ce69b50Jeff Sharkey throw e.rethrowAsParcelableException(); 125141ff7ec82422a5b6d00892afdb3232bc0e53d851Jeff Sharkey } 125241ff7ec82422a5b6d00892afdb3232bc0e53d851Jeff Sharkey } 125341ff7ec82422a5b6d00892afdb3232bc0e53d851Jeff Sharkey 125441ff7ec82422a5b6d00892afdb3232bc0e53d851Jeff Sharkey @Override 1255b3f19ca36c8c1301893c621d8f2150e06210722cJeff Sharkey public void setUidNetworkRules(int uid, boolean rejectOnQuotaInterfaces) { 12564529bb66c47fd02b990ecb0810031157b4f36c2fJeff Sharkey mContext.enforceCallingOrSelfPermission(CONNECTIVITY_INTERNAL, TAG); 1257b3f19ca36c8c1301893c621d8f2150e06210722cJeff Sharkey 1258350083e36b9db6062e165954403ef921ff3dfdadJeff Sharkey // silently discard when control disabled 1259350083e36b9db6062e165954403ef921ff3dfdadJeff Sharkey // TODO: eventually migrate to be always enabled 1260350083e36b9db6062e165954403ef921ff3dfdadJeff Sharkey if (!mBandwidthControlEnabled) return; 1261350083e36b9db6062e165954403ef921ff3dfdadJeff Sharkey 1262b24a78589b2bee4a86d5c864dd69169e134a339bJeff Sharkey synchronized (mQuotaLock) { 1263b3f19ca36c8c1301893c621d8f2150e06210722cJeff Sharkey final boolean oldRejectOnQuota = mUidRejectOnQuota.get(uid, false); 1264b3f19ca36c8c1301893c621d8f2150e06210722cJeff Sharkey if (oldRejectOnQuota == rejectOnQuotaInterfaces) { 1265b3f19ca36c8c1301893c621d8f2150e06210722cJeff Sharkey // TODO: eventually consider throwing 1266b3f19ca36c8c1301893c621d8f2150e06210722cJeff Sharkey return; 1267b3f19ca36c8c1301893c621d8f2150e06210722cJeff Sharkey } 1268b3f19ca36c8c1301893c621d8f2150e06210722cJeff Sharkey 1269b3f19ca36c8c1301893c621d8f2150e06210722cJeff Sharkey try { 1270ba2896e939f359e5857149f1a27212db71be012bJeff Sharkey mConnector.execute("bandwidth", 1271ba2896e939f359e5857149f1a27212db71be012bJeff Sharkey rejectOnQuotaInterfaces ? "addnaughtyapps" : "removenaughtyapps", uid); 1272b3f19ca36c8c1301893c621d8f2150e06210722cJeff Sharkey if (rejectOnQuotaInterfaces) { 1273b3f19ca36c8c1301893c621d8f2150e06210722cJeff Sharkey mUidRejectOnQuota.put(uid, true); 1274b3f19ca36c8c1301893c621d8f2150e06210722cJeff Sharkey } else { 1275b3f19ca36c8c1301893c621d8f2150e06210722cJeff Sharkey mUidRejectOnQuota.delete(uid); 1276b3f19ca36c8c1301893c621d8f2150e06210722cJeff Sharkey } 1277b3f19ca36c8c1301893c621d8f2150e06210722cJeff Sharkey } catch (NativeDaemonConnectorException e) { 1278276642baf11e05700ef24447dc4271f16ce69b50Jeff Sharkey throw e.rethrowAsParcelableException(); 1279b3f19ca36c8c1301893c621d8f2150e06210722cJeff Sharkey } 128050fd36d7c38c40b087c8f3e3172478abe0c051d9Ashish Sharma } 128150fd36d7c38c40b087c8f3e3172478abe0c051d9Ashish Sharma } 128250fd36d7c38c40b087c8f3e3172478abe0c051d9Ashish Sharma 128363d27a9233fed934340231f438493746084a681dJeff Sharkey @Override 128463d27a9233fed934340231f438493746084a681dJeff Sharkey public boolean isBandwidthControlEnabled() { 12854529bb66c47fd02b990ecb0810031157b4f36c2fJeff Sharkey mContext.enforceCallingOrSelfPermission(CONNECTIVITY_INTERNAL, TAG); 128663d27a9233fed934340231f438493746084a681dJeff Sharkey return mBandwidthControlEnabled; 128763d27a9233fed934340231f438493746084a681dJeff Sharkey } 128863d27a9233fed934340231f438493746084a681dJeff Sharkey 128963d27a9233fed934340231f438493746084a681dJeff Sharkey @Override 1290eedcb9525ba5befee2ba6ebb7a9ee3f13395c2a3Jeff Sharkey public NetworkStats getNetworkStatsUidDetail(int uid) { 12914529bb66c47fd02b990ecb0810031157b4f36c2fJeff Sharkey mContext.enforceCallingOrSelfPermission(CONNECTIVITY_INTERNAL, TAG); 12921059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey return mStatsFactory.readNetworkStatsDetail(uid); 1293eedcb9525ba5befee2ba6ebb7a9ee3f13395c2a3Jeff Sharkey } 1294eedcb9525ba5befee2ba6ebb7a9ee3f13395c2a3Jeff Sharkey 1295cdd02c5d76d3dd4e21b5bb922d7fcfb86efec85fJeff Sharkey @Override 1296cdd02c5d76d3dd4e21b5bb922d7fcfb86efec85fJeff Sharkey public NetworkStats getNetworkStatsTethering(String[] ifacePairs) { 12974529bb66c47fd02b990ecb0810031157b4f36c2fJeff Sharkey mContext.enforceCallingOrSelfPermission(CONNECTIVITY_INTERNAL, TAG); 1298cdd02c5d76d3dd4e21b5bb922d7fcfb86efec85fJeff Sharkey 1299cdd02c5d76d3dd4e21b5bb922d7fcfb86efec85fJeff Sharkey if (ifacePairs.length % 2 != 0) { 1300cdd02c5d76d3dd4e21b5bb922d7fcfb86efec85fJeff Sharkey throw new IllegalArgumentException( 1301cdd02c5d76d3dd4e21b5bb922d7fcfb86efec85fJeff Sharkey "unexpected ifacePairs; length=" + ifacePairs.length); 1302cdd02c5d76d3dd4e21b5bb922d7fcfb86efec85fJeff Sharkey } 1303cdd02c5d76d3dd4e21b5bb922d7fcfb86efec85fJeff Sharkey 1304cdd02c5d76d3dd4e21b5bb922d7fcfb86efec85fJeff Sharkey final NetworkStats stats = new NetworkStats(SystemClock.elapsedRealtime(), 1); 1305cdd02c5d76d3dd4e21b5bb922d7fcfb86efec85fJeff Sharkey for (int i = 0; i < ifacePairs.length; i += 2) { 1306cdd02c5d76d3dd4e21b5bb922d7fcfb86efec85fJeff Sharkey final String ifaceIn = ifacePairs[i]; 1307cdd02c5d76d3dd4e21b5bb922d7fcfb86efec85fJeff Sharkey final String ifaceOut = ifacePairs[i + 1]; 1308cdd02c5d76d3dd4e21b5bb922d7fcfb86efec85fJeff Sharkey if (ifaceIn != null && ifaceOut != null) { 1309cdd02c5d76d3dd4e21b5bb922d7fcfb86efec85fJeff Sharkey stats.combineValues(getNetworkStatsTethering(ifaceIn, ifaceOut)); 1310cdd02c5d76d3dd4e21b5bb922d7fcfb86efec85fJeff Sharkey } 1311cdd02c5d76d3dd4e21b5bb922d7fcfb86efec85fJeff Sharkey } 1312cdd02c5d76d3dd4e21b5bb922d7fcfb86efec85fJeff Sharkey return stats; 1313cdd02c5d76d3dd4e21b5bb922d7fcfb86efec85fJeff Sharkey } 1314cdd02c5d76d3dd4e21b5bb922d7fcfb86efec85fJeff Sharkey 1315cdd02c5d76d3dd4e21b5bb922d7fcfb86efec85fJeff Sharkey private NetworkStats.Entry getNetworkStatsTethering(String ifaceIn, String ifaceOut) { 1316ba2896e939f359e5857149f1a27212db71be012bJeff Sharkey final NativeDaemonEvent event; 1317cdd02c5d76d3dd4e21b5bb922d7fcfb86efec85fJeff Sharkey try { 1318ba2896e939f359e5857149f1a27212db71be012bJeff Sharkey event = mConnector.execute("bandwidth", "gettetherstats", ifaceIn, ifaceOut); 1319cdd02c5d76d3dd4e21b5bb922d7fcfb86efec85fJeff Sharkey } catch (NativeDaemonConnectorException e) { 1320276642baf11e05700ef24447dc4271f16ce69b50Jeff Sharkey throw e.rethrowAsParcelableException(); 1321cdd02c5d76d3dd4e21b5bb922d7fcfb86efec85fJeff Sharkey } 1322cdd02c5d76d3dd4e21b5bb922d7fcfb86efec85fJeff Sharkey 1323ba2896e939f359e5857149f1a27212db71be012bJeff Sharkey event.checkCode(TetheringStatsResult); 1324cdd02c5d76d3dd4e21b5bb922d7fcfb86efec85fJeff Sharkey 1325ba2896e939f359e5857149f1a27212db71be012bJeff Sharkey // 221 ifaceIn ifaceOut rx_bytes rx_packets tx_bytes tx_packets 1326ba2896e939f359e5857149f1a27212db71be012bJeff Sharkey final StringTokenizer tok = new StringTokenizer(event.getMessage()); 1327ba2896e939f359e5857149f1a27212db71be012bJeff Sharkey tok.nextToken(); 1328ba2896e939f359e5857149f1a27212db71be012bJeff Sharkey tok.nextToken(); 1329cdd02c5d76d3dd4e21b5bb922d7fcfb86efec85fJeff Sharkey 1330cdd02c5d76d3dd4e21b5bb922d7fcfb86efec85fJeff Sharkey try { 1331cdd02c5d76d3dd4e21b5bb922d7fcfb86efec85fJeff Sharkey final NetworkStats.Entry entry = new NetworkStats.Entry(); 1332cdd02c5d76d3dd4e21b5bb922d7fcfb86efec85fJeff Sharkey entry.iface = ifaceIn; 1333905b5891d2aa802f447ac2ce5d77b6c5ba06277aJeff Sharkey entry.uid = UID_TETHERING; 1334cdd02c5d76d3dd4e21b5bb922d7fcfb86efec85fJeff Sharkey entry.set = SET_DEFAULT; 1335cdd02c5d76d3dd4e21b5bb922d7fcfb86efec85fJeff Sharkey entry.tag = TAG_NONE; 1336ba2896e939f359e5857149f1a27212db71be012bJeff Sharkey entry.rxBytes = Long.parseLong(tok.nextToken()); 1337ba2896e939f359e5857149f1a27212db71be012bJeff Sharkey entry.rxPackets = Long.parseLong(tok.nextToken()); 1338ba2896e939f359e5857149f1a27212db71be012bJeff Sharkey entry.txBytes = Long.parseLong(tok.nextToken()); 1339ba2896e939f359e5857149f1a27212db71be012bJeff Sharkey entry.txPackets = Long.parseLong(tok.nextToken()); 1340cdd02c5d76d3dd4e21b5bb922d7fcfb86efec85fJeff Sharkey return entry; 1341cdd02c5d76d3dd4e21b5bb922d7fcfb86efec85fJeff Sharkey } catch (NumberFormatException e) { 1342cdd02c5d76d3dd4e21b5bb922d7fcfb86efec85fJeff Sharkey throw new IllegalStateException( 1343cdd02c5d76d3dd4e21b5bb922d7fcfb86efec85fJeff Sharkey "problem parsing tethering stats for " + ifaceIn + " " + ifaceOut + ": " + e); 1344cdd02c5d76d3dd4e21b5bb922d7fcfb86efec85fJeff Sharkey } 1345cdd02c5d76d3dd4e21b5bb922d7fcfb86efec85fJeff Sharkey } 1346cdd02c5d76d3dd4e21b5bb922d7fcfb86efec85fJeff Sharkey 1347af75c33e8d7f1a27c6c0d71820730ea8525019a3Jeff Sharkey @Override 1348f0db6e1853e929ae3b65501c31ee57c4dfbc767cSan Mehat public void setInterfaceThrottle(String iface, int rxKbps, int txKbps) { 13494529bb66c47fd02b990ecb0810031157b4f36c2fJeff Sharkey mContext.enforceCallingOrSelfPermission(CONNECTIVITY_INTERNAL, TAG); 1350a80ce06d4c54e43243073f8ceff024f9dda7140eKenny Root try { 1351ba2896e939f359e5857149f1a27212db71be012bJeff Sharkey mConnector.execute("interface", "setthrottle", iface, rxKbps, txKbps); 1352a80ce06d4c54e43243073f8ceff024f9dda7140eKenny Root } catch (NativeDaemonConnectorException e) { 1353276642baf11e05700ef24447dc4271f16ce69b50Jeff Sharkey throw e.rethrowAsParcelableException(); 1354a80ce06d4c54e43243073f8ceff024f9dda7140eKenny Root } 135591cac64cd010e6b4006fdd14b39dbc75778f20cbSan Mehat } 135691cac64cd010e6b4006fdd14b39dbc75778f20cbSan Mehat 135791cac64cd010e6b4006fdd14b39dbc75778f20cbSan Mehat private int getInterfaceThrottle(String iface, boolean rx) { 1358ba2896e939f359e5857149f1a27212db71be012bJeff Sharkey final NativeDaemonEvent event; 135991cac64cd010e6b4006fdd14b39dbc75778f20cbSan Mehat try { 1360ba2896e939f359e5857149f1a27212db71be012bJeff Sharkey event = mConnector.execute("interface", "getthrottle", iface, rx ? "rx" : "tx"); 1361ba2896e939f359e5857149f1a27212db71be012bJeff Sharkey } catch (NativeDaemonConnectorException e) { 1362ba2896e939f359e5857149f1a27212db71be012bJeff Sharkey throw e.rethrowAsParcelableException(); 1363ba2896e939f359e5857149f1a27212db71be012bJeff Sharkey } 1364a80ce06d4c54e43243073f8ceff024f9dda7140eKenny Root 1365ba2896e939f359e5857149f1a27212db71be012bJeff Sharkey if (rx) { 1366ba2896e939f359e5857149f1a27212db71be012bJeff Sharkey event.checkCode(InterfaceRxThrottleResult); 1367ba2896e939f359e5857149f1a27212db71be012bJeff Sharkey } else { 1368ba2896e939f359e5857149f1a27212db71be012bJeff Sharkey event.checkCode(InterfaceTxThrottleResult); 1369ba2896e939f359e5857149f1a27212db71be012bJeff Sharkey } 1370a80ce06d4c54e43243073f8ceff024f9dda7140eKenny Root 1371ba2896e939f359e5857149f1a27212db71be012bJeff Sharkey try { 1372ba2896e939f359e5857149f1a27212db71be012bJeff Sharkey return Integer.parseInt(event.getMessage()); 1373ba2896e939f359e5857149f1a27212db71be012bJeff Sharkey } catch (NumberFormatException e) { 1374ba2896e939f359e5857149f1a27212db71be012bJeff Sharkey throw new IllegalStateException("unexpected response:" + event); 137591cac64cd010e6b4006fdd14b39dbc75778f20cbSan Mehat } 137691cac64cd010e6b4006fdd14b39dbc75778f20cbSan Mehat } 137791cac64cd010e6b4006fdd14b39dbc75778f20cbSan Mehat 1378af75c33e8d7f1a27c6c0d71820730ea8525019a3Jeff Sharkey @Override 137991cac64cd010e6b4006fdd14b39dbc75778f20cbSan Mehat public int getInterfaceRxThrottle(String iface) { 13804529bb66c47fd02b990ecb0810031157b4f36c2fJeff Sharkey mContext.enforceCallingOrSelfPermission(CONNECTIVITY_INTERNAL, TAG); 138191cac64cd010e6b4006fdd14b39dbc75778f20cbSan Mehat return getInterfaceThrottle(iface, true); 138291cac64cd010e6b4006fdd14b39dbc75778f20cbSan Mehat } 138391cac64cd010e6b4006fdd14b39dbc75778f20cbSan Mehat 1384af75c33e8d7f1a27c6c0d71820730ea8525019a3Jeff Sharkey @Override 138591cac64cd010e6b4006fdd14b39dbc75778f20cbSan Mehat public int getInterfaceTxThrottle(String iface) { 13864529bb66c47fd02b990ecb0810031157b4f36c2fJeff Sharkey mContext.enforceCallingOrSelfPermission(CONNECTIVITY_INTERNAL, TAG); 138791cac64cd010e6b4006fdd14b39dbc75778f20cbSan Mehat return getInterfaceThrottle(iface, false); 138891cac64cd010e6b4006fdd14b39dbc75778f20cbSan Mehat } 13899a13f36cddaad01350bdb5f000167811a1d753c9Jeff Sharkey 1390af75c33e8d7f1a27c6c0d71820730ea8525019a3Jeff Sharkey @Override 1391af75c33e8d7f1a27c6c0d71820730ea8525019a3Jeff Sharkey public void setDefaultInterfaceForDns(String iface) { 13924529bb66c47fd02b990ecb0810031157b4f36c2fJeff Sharkey mContext.enforceCallingOrSelfPermission(CONNECTIVITY_INTERNAL, TAG); 13937475c0cea622f126af966c3b5b9741f547e83450Mattias Falk try { 1394ba2896e939f359e5857149f1a27212db71be012bJeff Sharkey mConnector.execute("resolver", "setdefaultif", iface); 13957475c0cea622f126af966c3b5b9741f547e83450Mattias Falk } catch (NativeDaemonConnectorException e) { 1396276642baf11e05700ef24447dc4271f16ce69b50Jeff Sharkey throw e.rethrowAsParcelableException(); 13977475c0cea622f126af966c3b5b9741f547e83450Mattias Falk } 13987475c0cea622f126af966c3b5b9741f547e83450Mattias Falk } 13997475c0cea622f126af966c3b5b9741f547e83450Mattias Falk 1400af75c33e8d7f1a27c6c0d71820730ea8525019a3Jeff Sharkey @Override 1401af75c33e8d7f1a27c6c0d71820730ea8525019a3Jeff Sharkey public void setDnsServersForInterface(String iface, String[] servers) { 14024529bb66c47fd02b990ecb0810031157b4f36c2fJeff Sharkey mContext.enforceCallingOrSelfPermission(CONNECTIVITY_INTERNAL, TAG); 1403ba2896e939f359e5857149f1a27212db71be012bJeff Sharkey 1404ba2896e939f359e5857149f1a27212db71be012bJeff Sharkey final Command cmd = new Command("resolver", "setifdns", iface); 1405ba2896e939f359e5857149f1a27212db71be012bJeff Sharkey for (String s : servers) { 1406ba2896e939f359e5857149f1a27212db71be012bJeff Sharkey InetAddress a = NetworkUtils.numericToInetAddress(s); 1407ba2896e939f359e5857149f1a27212db71be012bJeff Sharkey if (a.isAnyLocalAddress() == false) { 1408ba2896e939f359e5857149f1a27212db71be012bJeff Sharkey cmd.appendArg(a.getHostAddress()); 14097475c0cea622f126af966c3b5b9741f547e83450Mattias Falk } 1410ba2896e939f359e5857149f1a27212db71be012bJeff Sharkey } 1411ba2896e939f359e5857149f1a27212db71be012bJeff Sharkey 1412ba2896e939f359e5857149f1a27212db71be012bJeff Sharkey try { 1413ba2896e939f359e5857149f1a27212db71be012bJeff Sharkey mConnector.execute(cmd); 14147475c0cea622f126af966c3b5b9741f547e83450Mattias Falk } catch (NativeDaemonConnectorException e) { 1415276642baf11e05700ef24447dc4271f16ce69b50Jeff Sharkey throw e.rethrowAsParcelableException(); 14167475c0cea622f126af966c3b5b9741f547e83450Mattias Falk } 14177475c0cea622f126af966c3b5b9741f547e83450Mattias Falk } 14187475c0cea622f126af966c3b5b9741f547e83450Mattias Falk 1419af75c33e8d7f1a27c6c0d71820730ea8525019a3Jeff Sharkey @Override 1420af75c33e8d7f1a27c6c0d71820730ea8525019a3Jeff Sharkey public void flushDefaultDnsCache() { 14214529bb66c47fd02b990ecb0810031157b4f36c2fJeff Sharkey mContext.enforceCallingOrSelfPermission(CONNECTIVITY_INTERNAL, TAG); 14227475c0cea622f126af966c3b5b9741f547e83450Mattias Falk try { 1423ba2896e939f359e5857149f1a27212db71be012bJeff Sharkey mConnector.execute("resolver", "flushdefaultif"); 14247475c0cea622f126af966c3b5b9741f547e83450Mattias Falk } catch (NativeDaemonConnectorException e) { 1425276642baf11e05700ef24447dc4271f16ce69b50Jeff Sharkey throw e.rethrowAsParcelableException(); 14267475c0cea622f126af966c3b5b9741f547e83450Mattias Falk } 14277475c0cea622f126af966c3b5b9741f547e83450Mattias Falk } 14287475c0cea622f126af966c3b5b9741f547e83450Mattias Falk 1429af75c33e8d7f1a27c6c0d71820730ea8525019a3Jeff Sharkey @Override 1430af75c33e8d7f1a27c6c0d71820730ea8525019a3Jeff Sharkey public void flushInterfaceDnsCache(String iface) { 14314529bb66c47fd02b990ecb0810031157b4f36c2fJeff Sharkey mContext.enforceCallingOrSelfPermission(CONNECTIVITY_INTERNAL, TAG); 14327475c0cea622f126af966c3b5b9741f547e83450Mattias Falk try { 1433ba2896e939f359e5857149f1a27212db71be012bJeff Sharkey mConnector.execute("resolver", "flushif", iface); 14347475c0cea622f126af966c3b5b9741f547e83450Mattias Falk } catch (NativeDaemonConnectorException e) { 1435276642baf11e05700ef24447dc4271f16ce69b50Jeff Sharkey throw e.rethrowAsParcelableException(); 14367475c0cea622f126af966c3b5b9741f547e83450Mattias Falk } 14377475c0cea622f126af966c3b5b9741f547e83450Mattias Falk } 1438fa23c5ae226c1a1d39f89c5c87d4f340e91d90e0Jeff Sharkey 1439c268f0b19efd0b6c6c89c21be0893787f3cc9cf7Jeff Sharkey @Override 1440c268f0b19efd0b6c6c89c21be0893787f3cc9cf7Jeff Sharkey public void setFirewallEnabled(boolean enabled) { 1441f56e2435b64f9638e029777fa9492d42f157033eJeff Sharkey enforceSystemUid(); 1442c268f0b19efd0b6c6c89c21be0893787f3cc9cf7Jeff Sharkey try { 1443c268f0b19efd0b6c6c89c21be0893787f3cc9cf7Jeff Sharkey mConnector.execute("firewall", enabled ? "enable" : "disable"); 1444c268f0b19efd0b6c6c89c21be0893787f3cc9cf7Jeff Sharkey mFirewallEnabled = enabled; 1445c268f0b19efd0b6c6c89c21be0893787f3cc9cf7Jeff Sharkey } catch (NativeDaemonConnectorException e) { 1446c268f0b19efd0b6c6c89c21be0893787f3cc9cf7Jeff Sharkey throw e.rethrowAsParcelableException(); 1447c268f0b19efd0b6c6c89c21be0893787f3cc9cf7Jeff Sharkey } 1448c268f0b19efd0b6c6c89c21be0893787f3cc9cf7Jeff Sharkey } 1449c268f0b19efd0b6c6c89c21be0893787f3cc9cf7Jeff Sharkey 1450c268f0b19efd0b6c6c89c21be0893787f3cc9cf7Jeff Sharkey @Override 1451c268f0b19efd0b6c6c89c21be0893787f3cc9cf7Jeff Sharkey public boolean isFirewallEnabled() { 1452f56e2435b64f9638e029777fa9492d42f157033eJeff Sharkey enforceSystemUid(); 1453c268f0b19efd0b6c6c89c21be0893787f3cc9cf7Jeff Sharkey return mFirewallEnabled; 1454c268f0b19efd0b6c6c89c21be0893787f3cc9cf7Jeff Sharkey } 1455c268f0b19efd0b6c6c89c21be0893787f3cc9cf7Jeff Sharkey 1456c268f0b19efd0b6c6c89c21be0893787f3cc9cf7Jeff Sharkey @Override 14572c0929850ae495d54efb91a68e4bbd29a2e0ec95Jeff Sharkey public void setFirewallInterfaceRule(String iface, boolean allow) { 1458f56e2435b64f9638e029777fa9492d42f157033eJeff Sharkey enforceSystemUid(); 1459c268f0b19efd0b6c6c89c21be0893787f3cc9cf7Jeff Sharkey Preconditions.checkState(mFirewallEnabled); 1460c268f0b19efd0b6c6c89c21be0893787f3cc9cf7Jeff Sharkey final String rule = allow ? ALLOW : DENY; 1461c268f0b19efd0b6c6c89c21be0893787f3cc9cf7Jeff Sharkey try { 1462c268f0b19efd0b6c6c89c21be0893787f3cc9cf7Jeff Sharkey mConnector.execute("firewall", "set_interface_rule", iface, rule); 1463c268f0b19efd0b6c6c89c21be0893787f3cc9cf7Jeff Sharkey } catch (NativeDaemonConnectorException e) { 1464c268f0b19efd0b6c6c89c21be0893787f3cc9cf7Jeff Sharkey throw e.rethrowAsParcelableException(); 1465c268f0b19efd0b6c6c89c21be0893787f3cc9cf7Jeff Sharkey } 1466c268f0b19efd0b6c6c89c21be0893787f3cc9cf7Jeff Sharkey } 1467c268f0b19efd0b6c6c89c21be0893787f3cc9cf7Jeff Sharkey 1468c268f0b19efd0b6c6c89c21be0893787f3cc9cf7Jeff Sharkey @Override 14692c0929850ae495d54efb91a68e4bbd29a2e0ec95Jeff Sharkey public void setFirewallEgressSourceRule(String addr, boolean allow) { 1470f56e2435b64f9638e029777fa9492d42f157033eJeff Sharkey enforceSystemUid(); 1471c268f0b19efd0b6c6c89c21be0893787f3cc9cf7Jeff Sharkey Preconditions.checkState(mFirewallEnabled); 1472c268f0b19efd0b6c6c89c21be0893787f3cc9cf7Jeff Sharkey final String rule = allow ? ALLOW : DENY; 1473c268f0b19efd0b6c6c89c21be0893787f3cc9cf7Jeff Sharkey try { 1474c268f0b19efd0b6c6c89c21be0893787f3cc9cf7Jeff Sharkey mConnector.execute("firewall", "set_egress_source_rule", addr, rule); 1475c268f0b19efd0b6c6c89c21be0893787f3cc9cf7Jeff Sharkey } catch (NativeDaemonConnectorException e) { 1476c268f0b19efd0b6c6c89c21be0893787f3cc9cf7Jeff Sharkey throw e.rethrowAsParcelableException(); 1477c268f0b19efd0b6c6c89c21be0893787f3cc9cf7Jeff Sharkey } 1478c268f0b19efd0b6c6c89c21be0893787f3cc9cf7Jeff Sharkey } 1479c268f0b19efd0b6c6c89c21be0893787f3cc9cf7Jeff Sharkey 1480c268f0b19efd0b6c6c89c21be0893787f3cc9cf7Jeff Sharkey @Override 14812c0929850ae495d54efb91a68e4bbd29a2e0ec95Jeff Sharkey public void setFirewallEgressDestRule(String addr, int port, boolean allow) { 1482f56e2435b64f9638e029777fa9492d42f157033eJeff Sharkey enforceSystemUid(); 1483c268f0b19efd0b6c6c89c21be0893787f3cc9cf7Jeff Sharkey Preconditions.checkState(mFirewallEnabled); 1484c268f0b19efd0b6c6c89c21be0893787f3cc9cf7Jeff Sharkey final String rule = allow ? ALLOW : DENY; 1485c268f0b19efd0b6c6c89c21be0893787f3cc9cf7Jeff Sharkey try { 1486c268f0b19efd0b6c6c89c21be0893787f3cc9cf7Jeff Sharkey mConnector.execute("firewall", "set_egress_dest_rule", addr, port, rule); 1487c268f0b19efd0b6c6c89c21be0893787f3cc9cf7Jeff Sharkey } catch (NativeDaemonConnectorException e) { 1488c268f0b19efd0b6c6c89c21be0893787f3cc9cf7Jeff Sharkey throw e.rethrowAsParcelableException(); 1489c268f0b19efd0b6c6c89c21be0893787f3cc9cf7Jeff Sharkey } 1490c268f0b19efd0b6c6c89c21be0893787f3cc9cf7Jeff Sharkey } 1491c268f0b19efd0b6c6c89c21be0893787f3cc9cf7Jeff Sharkey 1492c268f0b19efd0b6c6c89c21be0893787f3cc9cf7Jeff Sharkey @Override 14932c0929850ae495d54efb91a68e4bbd29a2e0ec95Jeff Sharkey public void setFirewallUidRule(int uid, boolean allow) { 1494f56e2435b64f9638e029777fa9492d42f157033eJeff Sharkey enforceSystemUid(); 1495c268f0b19efd0b6c6c89c21be0893787f3cc9cf7Jeff Sharkey Preconditions.checkState(mFirewallEnabled); 1496c268f0b19efd0b6c6c89c21be0893787f3cc9cf7Jeff Sharkey final String rule = allow ? ALLOW : DENY; 1497c268f0b19efd0b6c6c89c21be0893787f3cc9cf7Jeff Sharkey try { 1498c268f0b19efd0b6c6c89c21be0893787f3cc9cf7Jeff Sharkey mConnector.execute("firewall", "set_uid_rule", uid, rule); 1499c268f0b19efd0b6c6c89c21be0893787f3cc9cf7Jeff Sharkey } catch (NativeDaemonConnectorException e) { 1500c268f0b19efd0b6c6c89c21be0893787f3cc9cf7Jeff Sharkey throw e.rethrowAsParcelableException(); 1501c268f0b19efd0b6c6c89c21be0893787f3cc9cf7Jeff Sharkey } 1502c268f0b19efd0b6c6c89c21be0893787f3cc9cf7Jeff Sharkey } 1503c268f0b19efd0b6c6c89c21be0893787f3cc9cf7Jeff Sharkey 1504f56e2435b64f9638e029777fa9492d42f157033eJeff Sharkey private static void enforceSystemUid() { 1505f56e2435b64f9638e029777fa9492d42f157033eJeff Sharkey final int uid = Binder.getCallingUid(); 1506f56e2435b64f9638e029777fa9492d42f157033eJeff Sharkey if (uid != Process.SYSTEM_UID) { 1507f56e2435b64f9638e029777fa9492d42f157033eJeff Sharkey throw new SecurityException("Only available to AID_SYSTEM"); 1508f56e2435b64f9638e029777fa9492d42f157033eJeff Sharkey } 1509f56e2435b64f9638e029777fa9492d42f157033eJeff Sharkey } 1510f56e2435b64f9638e029777fa9492d42f157033eJeff Sharkey 1511c268f0b19efd0b6c6c89c21be0893787f3cc9cf7Jeff Sharkey @Override 1512fa23c5ae226c1a1d39f89c5c87d4f340e91d90e0Jeff Sharkey public void monitor() { 1513fa23c5ae226c1a1d39f89c5c87d4f340e91d90e0Jeff Sharkey if (mConnector != null) { 1514fa23c5ae226c1a1d39f89c5c87d4f340e91d90e0Jeff Sharkey mConnector.monitor(); 1515fa23c5ae226c1a1d39f89c5c87d4f340e91d90e0Jeff Sharkey } 1516fa23c5ae226c1a1d39f89c5c87d4f340e91d90e0Jeff Sharkey } 151747eb102b40cd1324d89816a7fb0fecd14fd7a408Jeff Sharkey 151847eb102b40cd1324d89816a7fb0fecd14fd7a408Jeff Sharkey @Override 151947eb102b40cd1324d89816a7fb0fecd14fd7a408Jeff Sharkey protected void dump(FileDescriptor fd, PrintWriter pw, String[] args) { 152047eb102b40cd1324d89816a7fb0fecd14fd7a408Jeff Sharkey mContext.enforceCallingOrSelfPermission(DUMP, TAG); 152147eb102b40cd1324d89816a7fb0fecd14fd7a408Jeff Sharkey 1522470fd72a06390d7a6b854583afd0ed76ce0a03eeRobert Greenwalt pw.println("NetworkManagementService NativeDaemonConnector Log:"); 1523470fd72a06390d7a6b854583afd0ed76ce0a03eeRobert Greenwalt mConnector.dump(fd, pw, args); 1524470fd72a06390d7a6b854583afd0ed76ce0a03eeRobert Greenwalt pw.println(); 1525470fd72a06390d7a6b854583afd0ed76ce0a03eeRobert Greenwalt 152647eb102b40cd1324d89816a7fb0fecd14fd7a408Jeff Sharkey pw.print("Bandwidth control enabled: "); pw.println(mBandwidthControlEnabled); 152747eb102b40cd1324d89816a7fb0fecd14fd7a408Jeff Sharkey 152847eb102b40cd1324d89816a7fb0fecd14fd7a408Jeff Sharkey synchronized (mQuotaLock) { 1529b24a78589b2bee4a86d5c864dd69169e134a339bJeff Sharkey pw.print("Active quota ifaces: "); pw.println(mActiveQuotas.toString()); 1530b24a78589b2bee4a86d5c864dd69169e134a339bJeff Sharkey pw.print("Active alert ifaces: "); pw.println(mActiveAlerts.toString()); 153147eb102b40cd1324d89816a7fb0fecd14fd7a408Jeff Sharkey } 153247eb102b40cd1324d89816a7fb0fecd14fd7a408Jeff Sharkey 153347eb102b40cd1324d89816a7fb0fecd14fd7a408Jeff Sharkey synchronized (mUidRejectOnQuota) { 153447eb102b40cd1324d89816a7fb0fecd14fd7a408Jeff Sharkey pw.print("UID reject on quota ifaces: ["); 153547eb102b40cd1324d89816a7fb0fecd14fd7a408Jeff Sharkey final int size = mUidRejectOnQuota.size(); 153647eb102b40cd1324d89816a7fb0fecd14fd7a408Jeff Sharkey for (int i = 0; i < size; i++) { 153747eb102b40cd1324d89816a7fb0fecd14fd7a408Jeff Sharkey pw.print(mUidRejectOnQuota.keyAt(i)); 153847eb102b40cd1324d89816a7fb0fecd14fd7a408Jeff Sharkey if (i < size - 1) pw.print(","); 153947eb102b40cd1324d89816a7fb0fecd14fd7a408Jeff Sharkey } 154047eb102b40cd1324d89816a7fb0fecd14fd7a408Jeff Sharkey pw.println("]"); 154147eb102b40cd1324d89816a7fb0fecd14fd7a408Jeff Sharkey } 1542c268f0b19efd0b6c6c89c21be0893787f3cc9cf7Jeff Sharkey 1543c268f0b19efd0b6c6c89c21be0893787f3cc9cf7Jeff Sharkey pw.print("Firewall enabled: "); pw.println(mFirewallEnabled); 154447eb102b40cd1324d89816a7fb0fecd14fd7a408Jeff Sharkey } 1545873f2145941cc28f6931dc18b5e9987bd22e2e19San Mehat} 1546