diff options
| author | fredc <fredc@broadcom.com> | 2012-04-12 00:02:00 -0700 |
|---|---|---|
| committer | Android (Google) Code Review <android-gerrit@google.com> | 2012-07-16 21:20:54 -0700 |
| commit | 3c7196448a62414bf1bfcc94947bfcfa2d60278a (patch) | |
| tree | 8c6be2ed45eeadc53202eb7956519f9b96808b6b /framework/java/android/bluetooth/BluetoothTetheringDataTracker.java | |
| parent | a5d5a9c3c2dd28a5bd5a719af0a52f5e5a03f6e1 (diff) | |
Non persistent adapter service
Change-Id: Ib13d5c77416e58161df0e04d7a15ec0dddbde8b5
Conflicts:
core/java/android/bluetooth/BluetoothInputDevice.java
Conflicts:
core/java/com/android/internal/app/ShutdownThread.java
services/java/com/android/server/SystemServer.java
Conflicts:
services/java/com/android/server/SystemServer.java
services/java/com/android/server/pm/ShutdownThread.java
Diffstat (limited to 'framework/java/android/bluetooth/BluetoothTetheringDataTracker.java')
| -rw-r--r-- | framework/java/android/bluetooth/BluetoothTetheringDataTracker.java | 100 |
1 files changed, 79 insertions, 21 deletions
diff --git a/framework/java/android/bluetooth/BluetoothTetheringDataTracker.java b/framework/java/android/bluetooth/BluetoothTetheringDataTracker.java index 83d1bda821..593b699937 100644 --- a/framework/java/android/bluetooth/BluetoothTetheringDataTracker.java +++ b/framework/java/android/bluetooth/BluetoothTetheringDataTracker.java @@ -16,6 +16,9 @@ package android.bluetooth; +import android.os.IBinder; +import android.os.ServiceManager; +import android.os.INetworkManagementService; import android.content.Context; import android.net.ConnectivityManager; import android.net.DhcpInfoInternal; @@ -28,6 +31,11 @@ import android.net.NetworkUtils; import android.os.Handler; import android.os.Message; import android.util.Log; +import java.net.InterfaceAddress; +import android.net.LinkAddress; +import android.net.RouteInfo; +import java.net.Inet4Address; +import android.os.SystemProperties; import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicInteger; @@ -54,7 +62,6 @@ public class BluetoothTetheringDataTracker implements NetworkStateTracker { private NetworkInfo mNetworkInfo; private BluetoothPan mBluetoothPan; - private BluetoothDevice mDevice; private static String mIface; /* For sending events to connectivity service handler */ @@ -92,8 +99,10 @@ public class BluetoothTetheringDataTracker implements NetworkStateTracker { * Begin monitoring connectivity */ public void startMonitoring(Context context, Handler target) { + Log.d(TAG, "startMonitoring: target: " + target); mContext = context; mCsHandler = target; + Log.d(TAG, "startMonitoring: mCsHandler: " + mCsHandler); BluetoothAdapter adapter = BluetoothAdapter.getDefaultAdapter(); if (adapter != null) { adapter.getProfileProxy(mContext, mProfileServiceListener, BluetoothProfile.PAN); @@ -259,38 +268,87 @@ public class BluetoothTetheringDataTracker implements NetworkStateTracker { return "net.tcp.buffersize.wifi"; } + private static short countPrefixLength(byte [] mask) { + short count = 0; + for (byte b : mask) { + for (int i = 0; i < 8; ++i) { + if ((b & (1 << i)) != 0) { + ++count; + } + } + } + return count; + } + - public synchronized void startReverseTether(String iface, BluetoothDevice device) { + private boolean readLinkProperty(String iface) { + String DhcpPrefix = "dhcp." + iface + "."; + String ip = SystemProperties.get(DhcpPrefix + "ipaddress"); + String dns1 = SystemProperties.get(DhcpPrefix + "dns1"); + String dns2 = SystemProperties.get(DhcpPrefix + "dns2"); + String gateway = SystemProperties.get(DhcpPrefix + "gateway"); + String mask = SystemProperties.get(DhcpPrefix + "mask"); + if(ip.isEmpty() || gateway.isEmpty()) { + Log.e(TAG, "readLinkProperty, ip: " + ip + ", gateway: " + gateway + ", can not be empty"); + return false; + } + int PrefixLen = countPrefixLength(NetworkUtils.numericToInetAddress(mask).getAddress()); + mLinkProperties.addLinkAddress(new LinkAddress(NetworkUtils.numericToInetAddress(ip), PrefixLen)); + RouteInfo ri = new RouteInfo(NetworkUtils.numericToInetAddress(gateway)); + mLinkProperties.addRoute(ri); + if(!dns1.isEmpty()) + mLinkProperties.addDns(NetworkUtils.numericToInetAddress(dns1)); + if(!dns2.isEmpty()) + mLinkProperties.addDns(NetworkUtils.numericToInetAddress(dns2)); + mLinkProperties.setInterfaceName(iface); + return true; + } + public synchronized void startReverseTether(String iface) { mIface = iface; - mDevice = device; + Log.d(TAG, "startReverseTether mCsHandler: " + mCsHandler); Thread dhcpThread = new Thread(new Runnable() { public void run() { //TODO(): Add callbacks for failure and success case. //Currently this thread runs independently. - DhcpInfoInternal dhcpInfoInternal = new DhcpInfoInternal(); - if (!NetworkUtils.runDhcp(mIface, dhcpInfoInternal)) { - Log.e(TAG, "DHCP request error:" + NetworkUtils.getDhcpError()); - return; + Log.d(TAG, "startReverseTether mCsHandler: " + mCsHandler); + String DhcpResultName = "dhcp." + mIface + ".result";; + String result = ""; + Log.d(TAG, "waiting for change of sys prop dhcp result: " + DhcpResultName); + for(int i = 0; i < 30*5; i++) { + try { Thread.sleep(200); } catch (InterruptedException ie) { } + result = SystemProperties.get(DhcpResultName); + Log.d(TAG, "read " + DhcpResultName + ": " + result); + if(result.equals("failed")) { + Log.e(TAG, "startReverseTether, failed to start dhcp service"); + return; + } + if(result.equals("ok")) { + Log.d(TAG, "startReverseTether, dhcp resut: " + result); + if(readLinkProperty(mIface)) { + + mNetworkInfo.setIsAvailable(true); + mNetworkInfo.setDetailedState(DetailedState.CONNECTED, null, null); + + Log.d(TAG, "startReverseTether mCsHandler: " + mCsHandler); + if(mCsHandler != null) { + Message msg = mCsHandler.obtainMessage(EVENT_CONFIGURATION_CHANGED, mNetworkInfo); + msg.sendToTarget(); + + msg = mCsHandler.obtainMessage(EVENT_STATE_CHANGED, mNetworkInfo); + msg.sendToTarget(); + } + } + return; + } } - mLinkProperties = dhcpInfoInternal.makeLinkProperties(); - mLinkProperties.setInterfaceName(mIface); - - mNetworkInfo.setIsAvailable(true); - mNetworkInfo.setDetailedState(DetailedState.CONNECTED, null, null); - - Message msg = mCsHandler.obtainMessage(EVENT_CONFIGURATION_CHANGED, mNetworkInfo); - msg.sendToTarget(); - - msg = mCsHandler.obtainMessage(EVENT_STATE_CHANGED, mNetworkInfo); - msg.sendToTarget(); + Log.d(TAG, "startReverseTether, dhcp failed, resut: " + result); } }); dhcpThread.start(); } - public synchronized void stopReverseTether(String iface) { - NetworkUtils.stopDhcp(iface); - + public synchronized void stopReverseTether() { + //NetworkUtils.stopDhcp(iface); mLinkProperties.clear(); mNetworkInfo.setIsAvailable(false); mNetworkInfo.setDetailedState(DetailedState.DISCONNECTED, null, null); |
