summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--core/java/android/os/INetworkManagementService.aidl15
-rw-r--r--services/java/com/android/server/NetworkManagementService.java47
-rw-r--r--services/java/com/android/server/connectivity/Tethering.java100
3 files changed, 57 insertions, 105 deletions
diff --git a/core/java/android/os/INetworkManagementService.aidl b/core/java/android/os/INetworkManagementService.aidl
index b97ec19..5e99463 100644
--- a/core/java/android/os/INetworkManagementService.aidl
+++ b/core/java/android/os/INetworkManagementService.aidl
@@ -173,21 +173,6 @@ interface INetworkManagementService
void detachPppd(String tty);
/**
- * Turn on USB RNDIS support - this will turn off thinks like adb/mass-storage
- */
- void startUsbRNDIS();
-
- /**
- * Turn off USB RNDIS support
- */
- void stopUsbRNDIS();
-
- /**
- * Check the status of USB RNDIS support
- */
- boolean isUsbRNDISStarted();
-
- /**
* Start Wifi Access Point
*/
void startAccessPoint(in WifiConfiguration wifiConfig, String wlanIface, String softapIface);
diff --git a/services/java/com/android/server/NetworkManagementService.java b/services/java/com/android/server/NetworkManagementService.java
index d5bdd21..9c73a5d 100644
--- a/services/java/com/android/server/NetworkManagementService.java
+++ b/services/java/com/android/server/NetworkManagementService.java
@@ -78,7 +78,6 @@ class NetworkManagementService extends INetworkManagementService.Stub {
public static final int IpFwdStatusResult = 211;
public static final int InterfaceGetCfgResult = 213;
public static final int SoftapStatusResult = 214;
- public static final int UsbRNDISStatusResult = 215;
public static final int InterfaceRxCounterResult = 216;
public static final int InterfaceTxCounterResult = 217;
public static final int InterfaceRxThrottleResult = 218;
@@ -718,52 +717,6 @@ class NetworkManagementService extends INetworkManagementService.Stub {
}
}
- public void startUsbRNDIS() throws IllegalStateException {
- mContext.enforceCallingOrSelfPermission(
- android.Manifest.permission.CHANGE_NETWORK_STATE, "NetworkManagementService");
- try {
- mConnector.doCommand("usb startrndis");
- } catch (NativeDaemonConnectorException e) {
- throw new IllegalStateException(
- "Error communicating to native daemon for starting RNDIS", e);
- }
- }
-
- public void stopUsbRNDIS() throws IllegalStateException {
- mContext.enforceCallingOrSelfPermission(
- android.Manifest.permission.CHANGE_NETWORK_STATE, "NetworkManagementService");
- try {
- mConnector.doCommand("usb stoprndis");
- } catch (NativeDaemonConnectorException e) {
- throw new IllegalStateException("Error communicating to native daemon", e);
- }
- }
-
- public boolean isUsbRNDISStarted() throws IllegalStateException {
- mContext.enforceCallingOrSelfPermission(
- android.Manifest.permission.ACCESS_NETWORK_STATE, "NetworkManagementService");
- ArrayList<String> rsp;
- try {
- rsp = mConnector.doCommand("usb rndisstatus");
- } catch (NativeDaemonConnectorException e) {
- throw new IllegalStateException(
- "Error communicating to native daemon to check RNDIS status", e);
- }
-
- for (String line : rsp) {
- String []tok = line.split(" ");
- int code = Integer.parseInt(tok[0]);
- if (code == NetdResponseCode.UsbRNDISStatusResult) {
- if (tok[3].equals("started"))
- return true;
- return false;
- } else {
- throw new IllegalStateException(String.format("Unexpected response code %d", code));
- }
- }
- throw new IllegalStateException("Got an empty response");
- }
-
public void startAccessPoint(WifiConfiguration wifiConfig, String wlanIface, String softapIface)
throws IllegalStateException {
mContext.enforceCallingOrSelfPermission(
diff --git a/services/java/com/android/server/connectivity/Tethering.java b/services/java/com/android/server/connectivity/Tethering.java
index 5fa26ef..15e67d0 100644
--- a/services/java/com/android/server/connectivity/Tethering.java
+++ b/services/java/com/android/server/connectivity/Tethering.java
@@ -471,11 +471,20 @@ public class Tethering extends INetworkManagementEventObserver.Stub {
// used on cable insert/remove
private void enableUsbIfaces(boolean enable) {
+ // add/remove USB interfaces when USB is connected/disconnected
+ for (String intf : mTetherableUsbRegexs) {
+ if (enable) {
+ interfaceAdded(intf);
+ } else {
+ interfaceRemoved(intf);
+ }
+ }
+
String[] ifaces = new String[0];
try {
ifaces = mNMService.listInterfaces();
} catch (Exception e) {
- Log.e(TAG, "Error listing Interfaces :" + e);
+ Log.e(TAG, "Error listing Interfaces", e);
return;
}
for (String iface : ifaces) {
@@ -493,20 +502,19 @@ public class Tethering extends INetworkManagementEventObserver.Stub {
private boolean enableUsbRndis(boolean enabled) {
if (DEBUG) Log.d(TAG, "enableUsbRndis(" + enabled + ")");
+ UsbManager usbManager = (UsbManager)mContext.getSystemService(Context.USB_SERVICE);
+ if (usbManager == null) {
+ Log.d(TAG, "could not get UsbManager");
+ return false;
+ }
try {
if (enabled) {
- synchronized (this) {
- if (!mNMService.isUsbRNDISStarted()) {
- mNMService.startUsbRNDIS();
- }
- }
+ usbManager.setPrimaryFunction(UsbManager.USB_FUNCTION_RNDIS);
} else {
- if (mNMService.isUsbRNDISStarted()) {
- mNMService.stopUsbRNDIS();
- }
+ usbManager.setPrimaryFunction(null);
}
} catch (Exception e) {
- Log.e(TAG, "Error toggling usb RNDIS :" + e);
+ Log.e(TAG, "Error toggling usb RNDIS", e);
return false;
}
return true;
@@ -516,35 +524,46 @@ public class Tethering extends INetworkManagementEventObserver.Stub {
private boolean configureUsbIface(boolean enabled) {
if (DEBUG) Log.d(TAG, "configureUsbIface(" + enabled + ")");
- // bring toggle the interfaces
- String[] ifaces = new String[0];
- try {
- ifaces = mNMService.listInterfaces();
- } catch (Exception e) {
- Log.e(TAG, "Error listing Interfaces :" + e);
- return false;
+ if (enabled) {
+ // must enable RNDIS first to create the interface
+ enableUsbRndis(enabled);
}
- for (String iface : ifaces) {
- if (isUsb(iface)) {
- InterfaceConfiguration ifcg = null;
- try {
- ifcg = mNMService.getInterfaceConfig(iface);
- if (ifcg != null) {
- InetAddress addr = NetworkUtils.numericToInetAddress(USB_NEAR_IFACE_ADDR);
- ifcg.addr = new LinkAddress(addr, USB_PREFIX_LENGTH);
- if (enabled) {
- ifcg.interfaceFlags = ifcg.interfaceFlags.replace("down", "up");
- } else {
- ifcg.interfaceFlags = ifcg.interfaceFlags.replace("up", "down");
+
+ try {
+ // bring toggle the interfaces
+ String[] ifaces = new String[0];
+ try {
+ ifaces = mNMService.listInterfaces();
+ } catch (Exception e) {
+ Log.e(TAG, "Error listing Interfaces", e);
+ return false;
+ }
+ for (String iface : ifaces) {
+ if (isUsb(iface)) {
+ InterfaceConfiguration ifcg = null;
+ try {
+ ifcg = mNMService.getInterfaceConfig(iface);
+ if (ifcg != null) {
+ InetAddress addr = NetworkUtils.numericToInetAddress(USB_NEAR_IFACE_ADDR);
+ ifcg.addr = new LinkAddress(addr, USB_PREFIX_LENGTH);
+ if (enabled) {
+ ifcg.interfaceFlags = ifcg.interfaceFlags.replace("down", "up");
+ } else {
+ ifcg.interfaceFlags = ifcg.interfaceFlags.replace("up", "down");
+ }
+ ifcg.interfaceFlags = ifcg.interfaceFlags.replace("running", "");
+ ifcg.interfaceFlags = ifcg.interfaceFlags.replace(" "," ");
+ mNMService.setInterfaceConfig(iface, ifcg);
}
- ifcg.interfaceFlags = ifcg.interfaceFlags.replace("running", "");
- ifcg.interfaceFlags = ifcg.interfaceFlags.replace(" "," ");
- mNMService.setInterfaceConfig(iface, ifcg);
+ } catch (Exception e) {
+ Log.e(TAG, "Error configuring interface " + iface, e);
+ return false;
}
- } catch (Exception e) {
- Log.e(TAG, "Error configuring interface " + iface + ", :" + e);
- return false;
}
+ }
+ } finally {
+ if (!enabled) {
+ enableUsbRndis(false);
}
}
@@ -853,17 +872,12 @@ public class Tethering extends INetworkManagementEventObserver.Stub {
transitionTo(mInitialState);
return;
}
- if (mUsb) Tethering.this.enableUsbRndis(true);
if (DEBUG) Log.d(TAG, "Tethered " + mIfaceName);
setAvailable(false);
setTethered(true);
sendTetherStateChangedBroadcast();
}
@Override
- public void exit() {
- if (mUsb) Tethering.this.enableUsbRndis(false);
- }
- @Override
public boolean processMessage(Message message) {
if (DEBUG) Log.d(TAG, "TetheredState.processMessage what=" + message.what);
boolean retValue = true;
@@ -1201,7 +1215,7 @@ public class Tethering extends INetworkManagementEventObserver.Stub {
try {
ifaces = mNMService.listInterfaces();
} catch (Exception e) {
- Log.e(TAG, "Error listing Interfaces :" + e);
+ Log.e(TAG, "Error listing Interfaces", e);
return null;
}
@@ -1216,7 +1230,7 @@ public class Tethering extends INetworkManagementEventObserver.Stub {
return iface;
}
} catch (Exception e) {
- Log.e(TAG, "Error getting iface config :" + e);
+ Log.e(TAG, "Error getting iface config", e);
// ignore - try next
continue;
}
@@ -1267,7 +1281,7 @@ public class Tethering extends INetworkManagementEventObserver.Stub {
}
}
} catch (RemoteException e) {
- Log.e(TAG, "RemoteException calling ConnectivityManager " + e);
+ Log.e(TAG, "RemoteException calling ConnectivityManager", e);
iface = null;
}
}