115c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh/* 215c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh * Copyright (C) 2010 The Android Open Source Project 315c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh * 415c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh * Licensed under the Apache License, Version 2.0 (the "License"); 515c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh * you may not use this file except in compliance with the License. 615c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh * You may obtain a copy of the License at 715c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh * 815c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh * http://www.apache.org/licenses/LICENSE-2.0 915c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh * 1015c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh * Unless required by applicable law or agreed to in writing, software 1115c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh * distributed under the License is distributed on an "AS IS" BASIS, 1215c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1315c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh * See the License for the specific language governing permissions and 1415c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh * limitations under the License. 1515c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh */ 1615c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh 1715c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganeshpackage android.bluetooth; 1815c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh 1915c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganeshimport android.content.Context; 2015c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganeshimport android.net.ConnectivityManager; 210216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwaltimport android.net.DhcpInfoInternal; 2215c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganeshimport android.net.LinkCapabilities; 2315c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganeshimport android.net.LinkProperties; 2415c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganeshimport android.net.NetworkInfo; 2515c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganeshimport android.net.NetworkInfo.DetailedState; 2615c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganeshimport android.net.NetworkStateTracker; 2715c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganeshimport android.net.NetworkUtils; 2815c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganeshimport android.os.Handler; 2915c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganeshimport android.os.Message; 3015c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganeshimport android.util.Log; 3115c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh 3215c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganeshimport java.util.concurrent.atomic.AtomicBoolean; 3315c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganeshimport java.util.concurrent.atomic.AtomicInteger; 3415c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh 3515c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh/** 3615c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh * This class tracks the data connection associated with Bluetooth 3715c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh * reverse tethering. This is a singleton class and an instance will be 3815c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh * created by ConnectivityService. BluetoothService will call into this 3915c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh * when a reverse tethered connection needs to be activated. 4015c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh * 4115c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh * @hide 4215c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh */ 4315c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganeshpublic class BluetoothTetheringDataTracker implements NetworkStateTracker { 4415c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh private static final String NETWORKTYPE = "BLUETOOTH_TETHER"; 4515c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh private static final String TAG = "BluetoothTethering"; 4615c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh 4715c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh private AtomicBoolean mTeardownRequested = new AtomicBoolean(false); 4815c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh private AtomicBoolean mPrivateDnsRouteSet = new AtomicBoolean(false); 4915c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh private AtomicInteger mDefaultGatewayAddr = new AtomicInteger(0); 5015c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh private AtomicBoolean mDefaultRouteSet = new AtomicBoolean(false); 5115c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh 5215c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh private LinkProperties mLinkProperties; 5315c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh private LinkCapabilities mLinkCapabilities; 5415c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh private NetworkInfo mNetworkInfo; 5515c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh 5615c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh private BluetoothPan mBluetoothPan; 5715c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh private BluetoothDevice mDevice; 5815c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh private static String mIface; 5915c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh 6015c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh /* For sending events to connectivity service handler */ 6115c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh private Handler mCsHandler; 6215c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh private Context mContext; 6315c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh public static BluetoothTetheringDataTracker sInstance; 6415c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh 6515c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh private BluetoothTetheringDataTracker() { 6615c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh mNetworkInfo = new NetworkInfo(ConnectivityManager.TYPE_BLUETOOTH, 0, NETWORKTYPE, ""); 6715c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh mLinkProperties = new LinkProperties(); 6815c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh mLinkCapabilities = new LinkCapabilities(); 6915c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh 7015c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh mNetworkInfo.setIsAvailable(false); 7115c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh setTeardownRequested(false); 7215c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh } 7315c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh 7415c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh public static synchronized BluetoothTetheringDataTracker getInstance() { 7515c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh if (sInstance == null) sInstance = new BluetoothTetheringDataTracker(); 7615c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh return sInstance; 7715c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh } 7815c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh 7915c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh public Object Clone() throws CloneNotSupportedException { 8015c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh throw new CloneNotSupportedException(); 8115c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh } 8215c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh 8315c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh public void setTeardownRequested(boolean isRequested) { 8415c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh mTeardownRequested.set(isRequested); 8515c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh } 8615c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh 8715c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh public boolean isTeardownRequested() { 8815c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh return mTeardownRequested.get(); 8915c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh } 9015c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh 9115c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh /** 9215c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh * Begin monitoring connectivity 9315c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh */ 9415c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh public void startMonitoring(Context context, Handler target) { 9515c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh mContext = context; 9615c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh mCsHandler = target; 9774ef1199459629c5dd9f272f8cd706d82cdfeeb1Jaikumar Ganesh BluetoothAdapter adapter = BluetoothAdapter.getDefaultAdapter(); 9874ef1199459629c5dd9f272f8cd706d82cdfeeb1Jaikumar Ganesh if (adapter != null) { 9974ef1199459629c5dd9f272f8cd706d82cdfeeb1Jaikumar Ganesh adapter.getProfileProxy(mContext, mProfileServiceListener, BluetoothProfile.PAN); 10074ef1199459629c5dd9f272f8cd706d82cdfeeb1Jaikumar Ganesh } 10115c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh } 10215c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh 10374ef1199459629c5dd9f272f8cd706d82cdfeeb1Jaikumar Ganesh private BluetoothProfile.ServiceListener mProfileServiceListener = 10474ef1199459629c5dd9f272f8cd706d82cdfeeb1Jaikumar Ganesh new BluetoothProfile.ServiceListener() { 10574ef1199459629c5dd9f272f8cd706d82cdfeeb1Jaikumar Ganesh public void onServiceConnected(int profile, BluetoothProfile proxy) { 10674ef1199459629c5dd9f272f8cd706d82cdfeeb1Jaikumar Ganesh mBluetoothPan = (BluetoothPan) proxy; 10774ef1199459629c5dd9f272f8cd706d82cdfeeb1Jaikumar Ganesh } 10874ef1199459629c5dd9f272f8cd706d82cdfeeb1Jaikumar Ganesh public void onServiceDisconnected(int profile) { 10974ef1199459629c5dd9f272f8cd706d82cdfeeb1Jaikumar Ganesh mBluetoothPan = null; 11074ef1199459629c5dd9f272f8cd706d82cdfeeb1Jaikumar Ganesh } 11174ef1199459629c5dd9f272f8cd706d82cdfeeb1Jaikumar Ganesh }; 11274ef1199459629c5dd9f272f8cd706d82cdfeeb1Jaikumar Ganesh 11315c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh /** 11415c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh * Disable connectivity to a network 11515c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh * TODO: do away with return value after making MobileDataStateTracker async 11615c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh */ 11715c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh public boolean teardown() { 11815c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh mTeardownRequested.set(true); 11974ef1199459629c5dd9f272f8cd706d82cdfeeb1Jaikumar Ganesh if (mBluetoothPan != null) { 12074ef1199459629c5dd9f272f8cd706d82cdfeeb1Jaikumar Ganesh for (BluetoothDevice device: mBluetoothPan.getConnectedDevices()) { 12174ef1199459629c5dd9f272f8cd706d82cdfeeb1Jaikumar Ganesh mBluetoothPan.disconnect(device); 12274ef1199459629c5dd9f272f8cd706d82cdfeeb1Jaikumar Ganesh } 12315c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh } 12415c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh return true; 12515c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh } 12615c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh 12715c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh /** 12815c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh * Re-enable connectivity to a network after a {@link #teardown()}. 12915c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh */ 13015c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh public boolean reconnect() { 13115c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh mTeardownRequested.set(false); 13215c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh //Ignore 13315c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh return true; 13415c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh } 13515c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh 13615c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh /** 13715c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh * Turn the wireless radio off for a network. 13815c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh * @param turnOn {@code true} to turn the radio on, {@code false} 13915c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh */ 14015c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh public boolean setRadio(boolean turnOn) { 14115c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh return true; 14215c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh } 14315c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh 14415c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh /** 14515c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh * @return true - If are we currently tethered with another device. 14615c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh */ 14715c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh public synchronized boolean isAvailable() { 14815c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh return mNetworkInfo.isAvailable(); 14915c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh } 15015c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh 15115c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh /** 15215c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh * Tells the underlying networking system that the caller wants to 15315c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh * begin using the named feature. The interpretation of {@code feature} 15415c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh * is completely up to each networking implementation. 15515c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh * @param feature the name of the feature to be used 15615c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh * @param callingPid the process ID of the process that is issuing this request 15715c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh * @param callingUid the user ID of the process that is issuing this request 15815c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh * @return an integer value representing the outcome of the request. 15915c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh * The interpretation of this value is specific to each networking 16015c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh * implementation+feature combination, except that the value {@code -1} 16115c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh * always indicates failure. 16215c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh * TODO: needs to go away 16315c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh */ 16415c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh public int startUsingNetworkFeature(String feature, int callingPid, int callingUid) { 16515c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh return -1; 16615c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh } 16715c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh 16815c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh /** 16915c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh * Tells the underlying networking system that the caller is finished 17015c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh * using the named feature. The interpretation of {@code feature} 17115c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh * is completely up to each networking implementation. 17215c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh * @param feature the name of the feature that is no longer needed. 17315c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh * @param callingPid the process ID of the process that is issuing this request 17415c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh * @param callingUid the user ID of the process that is issuing this request 17515c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh * @return an integer value representing the outcome of the request. 17615c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh * The interpretation of this value is specific to each networking 17715c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh * implementation+feature combination, except that the value {@code -1} 17815c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh * always indicates failure. 17915c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh * TODO: needs to go away 18015c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh */ 18115c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh public int stopUsingNetworkFeature(String feature, int callingPid, int callingUid) { 18215c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh return -1; 18315c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh } 18415c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh 1858e28b7d78232f6cf08739ca0d129cc7f9e650801Jeff Sharkey @Override 1868e28b7d78232f6cf08739ca0d129cc7f9e650801Jeff Sharkey public void setUserDataEnable(boolean enabled) { 1878e28b7d78232f6cf08739ca0d129cc7f9e650801Jeff Sharkey Log.w(TAG, "ignoring setUserDataEnable(" + enabled + ")"); 1888e28b7d78232f6cf08739ca0d129cc7f9e650801Jeff Sharkey } 1898e28b7d78232f6cf08739ca0d129cc7f9e650801Jeff Sharkey 1908e28b7d78232f6cf08739ca0d129cc7f9e650801Jeff Sharkey @Override 1918e28b7d78232f6cf08739ca0d129cc7f9e650801Jeff Sharkey public void setPolicyDataEnable(boolean enabled) { 1928e28b7d78232f6cf08739ca0d129cc7f9e650801Jeff Sharkey Log.w(TAG, "ignoring setPolicyDataEnable(" + enabled + ")"); 19315c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh } 19415c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh 19515c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh /** 19615c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh * Check if private DNS route is set for the network 19715c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh */ 19815c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh public boolean isPrivateDnsRouteSet() { 19915c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh return mPrivateDnsRouteSet.get(); 20015c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh } 20115c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh 20215c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh /** 20315c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh * Set a flag indicating private DNS route is set 20415c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh */ 20515c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh public void privateDnsRouteSet(boolean enabled) { 20615c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh mPrivateDnsRouteSet.set(enabled); 20715c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh } 20815c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh 20915c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh /** 21015c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh * Fetch NetworkInfo for the network 21115c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh */ 21215c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh public synchronized NetworkInfo getNetworkInfo() { 21315c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh return mNetworkInfo; 21415c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh } 21515c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh 21615c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh /** 21715c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh * Fetch LinkProperties for the network 21815c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh */ 21915c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh public synchronized LinkProperties getLinkProperties() { 22015c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh return new LinkProperties(mLinkProperties); 22115c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh } 22215c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh 22315c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh /** 22415c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh * A capability is an Integer/String pair, the capabilities 22515c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh * are defined in the class LinkSocket#Key. 22615c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh * 22715c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh * @return a copy of this connections capabilities, may be empty but never null. 22815c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh */ 22915c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh public LinkCapabilities getLinkCapabilities() { 23015c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh return new LinkCapabilities(mLinkCapabilities); 23115c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh } 23215c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh 23315c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh /** 23415c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh * Fetch default gateway address for the network 23515c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh */ 23615c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh public int getDefaultGatewayAddr() { 23715c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh return mDefaultGatewayAddr.get(); 23815c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh } 23915c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh 24015c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh /** 24115c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh * Check if default route is set 24215c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh */ 24315c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh public boolean isDefaultRouteSet() { 24415c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh return mDefaultRouteSet.get(); 24515c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh } 24615c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh 24715c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh /** 24815c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh * Set a flag indicating default route is set for the network 24915c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh */ 25015c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh public void defaultRouteSet(boolean enabled) { 25115c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh mDefaultRouteSet.set(enabled); 25215c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh } 25315c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh 25415c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh /** 25515c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh * Return the system properties name associated with the tcp buffer sizes 25615c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh * for this network. 25715c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh */ 25815c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh public String getTcpBufferSizesPropName() { 25915c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh return "net.tcp.buffersize.wifi"; 26015c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh } 26115c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh 26215c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh 26315c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh public synchronized void startReverseTether(String iface, BluetoothDevice device) { 26415c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh mIface = iface; 26515c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh mDevice = device; 26615c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh Thread dhcpThread = new Thread(new Runnable() { 26715c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh public void run() { 26815c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh //TODO(): Add callbacks for failure and success case. 26915c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh //Currently this thread runs independently. 2700216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwalt DhcpInfoInternal dhcpInfoInternal = new DhcpInfoInternal(); 2710216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwalt if (!NetworkUtils.runDhcp(mIface, dhcpInfoInternal)) { 27215c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh Log.e(TAG, "DHCP request error:" + NetworkUtils.getDhcpError()); 27315c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh return; 27415c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh } 2750216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwalt mLinkProperties = dhcpInfoInternal.makeLinkProperties(); 27615c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh mLinkProperties.setInterfaceName(mIface); 27715c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh 27815c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh mNetworkInfo.setIsAvailable(true); 27915c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh mNetworkInfo.setDetailedState(DetailedState.CONNECTED, null, null); 28015c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh 28115c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh Message msg = mCsHandler.obtainMessage(EVENT_CONFIGURATION_CHANGED, mNetworkInfo); 28215c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh msg.sendToTarget(); 28315c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh 28415c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh msg = mCsHandler.obtainMessage(EVENT_STATE_CHANGED, mNetworkInfo); 28515c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh msg.sendToTarget(); 28615c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh } 28715c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh }); 28815c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh dhcpThread.start(); 28915c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh } 29015c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh 29115c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh public synchronized void stopReverseTether(String iface) { 29215c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh NetworkUtils.stopDhcp(iface); 29315c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh 29415c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh mLinkProperties.clear(); 29515c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh mNetworkInfo.setIsAvailable(false); 29615c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh mNetworkInfo.setDetailedState(DetailedState.DISCONNECTED, null, null); 29715c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh 29815c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh Message msg = mCsHandler.obtainMessage(EVENT_CONFIGURATION_CHANGED, mNetworkInfo); 29915c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh msg.sendToTarget(); 30015c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh 30115c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh msg = mCsHandler.obtainMessage(EVENT_STATE_CHANGED, mNetworkInfo); 30215c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh msg.sendToTarget(); 30315c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh } 304d55a6b498d66d8fc415908ecf63e50f46cce67e8Robert Greenwalt 305d55a6b498d66d8fc415908ecf63e50f46cce67e8Robert Greenwalt public void setDependencyMet(boolean met) { 306d55a6b498d66d8fc415908ecf63e50f46cce67e8Robert Greenwalt // not supported on this network 307d55a6b498d66d8fc415908ecf63e50f46cce67e8Robert Greenwalt } 30815c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh} 309