Loading services/core/java/com/android/server/connectivity/Tethering.java +14 −4 Original line number Original line Diff line number Diff line Loading @@ -52,6 +52,7 @@ import android.net.util.SharedLog; import android.net.wifi.WifiManager; import android.net.wifi.WifiManager; import android.os.Binder; import android.os.Binder; import android.os.Bundle; import android.os.Bundle; import android.os.Handler; import android.os.INetworkManagementService; import android.os.INetworkManagementService; import android.os.Looper; import android.os.Looper; import android.os.Message; import android.os.Message; Loading Loading @@ -195,8 +196,10 @@ public class Tethering extends BaseNetworkObserver implements IControlsTethering mTetherMasterSM = new TetherMasterSM("TetherMaster", mLooper); mTetherMasterSM = new TetherMasterSM("TetherMaster", mLooper); mTetherMasterSM.start(); mTetherMasterSM.start(); mOffloadController = new OffloadController(mTetherMasterSM.getHandler(), final Handler smHandler = mTetherMasterSM.getHandler(); deps.getOffloadHardwareInterface(), mLog); mOffloadController = new OffloadController(smHandler, deps.getOffloadHardwareInterface(smHandler, mLog), mLog); mUpstreamNetworkMonitor = new UpstreamNetworkMonitor( mUpstreamNetworkMonitor = new UpstreamNetworkMonitor( mContext, mTetherMasterSM, TetherMasterSM.EVENT_UPSTREAM_CALLBACK, mLog); mContext, mTetherMasterSM, TetherMasterSM.EVENT_UPSTREAM_CALLBACK, mLog); mForwardedDownstreams = new HashSet<>(); mForwardedDownstreams = new HashSet<>(); Loading Loading @@ -1083,7 +1086,6 @@ public class Tethering extends BaseNetworkObserver implements IControlsTethering TetherMasterSM(String name, Looper looper) { TetherMasterSM(String name, Looper looper) { super(name, looper); super(name, looper); //Add states mInitialState = new InitialState(); mInitialState = new InitialState(); mTetherModeAliveState = new TetherModeAliveState(); mTetherModeAliveState = new TetherModeAliveState(); mSetIpForwardingEnabledErrorState = new SetIpForwardingEnabledErrorState(); mSetIpForwardingEnabledErrorState = new SetIpForwardingEnabledErrorState(); Loading Loading @@ -1397,10 +1399,11 @@ public class Tethering extends BaseNetworkObserver implements IControlsTethering mSimChange.startListening(); mSimChange.startListening(); mUpstreamNetworkMonitor.start(); mUpstreamNetworkMonitor.start(); mOffloadController.start(); // TODO: De-duplicate with updateUpstreamWanted() below. if (upstreamWanted()) { if (upstreamWanted()) { mUpstreamWanted = true; mUpstreamWanted = true; mOffloadController.start(); chooseUpstreamType(true); chooseUpstreamType(true); mTryCell = false; mTryCell = false; } } Loading @@ -1419,6 +1422,13 @@ public class Tethering extends BaseNetworkObserver implements IControlsTethering private boolean updateUpstreamWanted() { private boolean updateUpstreamWanted() { final boolean previousUpstreamWanted = mUpstreamWanted; final boolean previousUpstreamWanted = mUpstreamWanted; mUpstreamWanted = upstreamWanted(); mUpstreamWanted = upstreamWanted(); if (mUpstreamWanted != previousUpstreamWanted) { if (mUpstreamWanted) { mOffloadController.start(); } else { mOffloadController.stop(); } } return previousUpstreamWanted; return previousUpstreamWanted; } } Loading services/core/java/com/android/server/connectivity/tethering/OffloadController.java +20 −2 Original line number Original line Diff line number Diff line Loading @@ -49,12 +49,30 @@ public class OffloadController { mConfigInitialized = mHwInterface.initOffloadConfig(); mConfigInitialized = mHwInterface.initOffloadConfig(); if (!mConfigInitialized) { if (!mConfigInitialized) { mLog.i("tethering offload config not supported"); mLog.i("tethering offload config not supported"); stop(); return; return; } } } } // TODO: Create and register ITetheringOffloadCallback. mControlInitialized = mHwInterface.initOffloadControl( mControlInitialized = mHwInterface.initOffloadControl(); new OffloadHardwareInterface.ControlCallback() { @Override public void onOffloadEvent(int event) { mLog.log("got offload event: " + event); } @Override public void onNatTimeoutUpdate(int proto, String srcAddr, int srcPort, String dstAddr, int dstPort) { mLog.log(String.format("NAT timeout update: %s (%s,%s) -> (%s,%s)", proto, srcAddr, srcPort, dstAddr, dstPort)); } }); if (!mControlInitialized) { mLog.i("tethering offload control not supported"); stop(); } } } public void stop() { public void stop() { Loading services/core/java/com/android/server/connectivity/tethering/OffloadHardwareInterface.java +80 −22 Original line number Original line Diff line number Diff line Loading @@ -17,9 +17,11 @@ package com.android.server.connectivity.tethering; package com.android.server.connectivity.tethering; import android.hardware.tetheroffload.control.V1_0.IOffloadControl; import android.hardware.tetheroffload.control.V1_0.IOffloadControl; import android.hardware.tetheroffload.control.V1_0.IOffloadControl.stopOffloadCallback; import android.hardware.tetheroffload.control.V1_0.ITetheringOffloadCallback; import android.hardware.tetheroffload.control.V1_0.NatTimeoutUpdate; import android.os.Handler; import android.os.RemoteException; import android.os.RemoteException; import android.util.Log; import android.net.util.SharedLog; /** /** Loading @@ -32,46 +34,102 @@ public class OffloadHardwareInterface { private static native boolean configOffload(); private static native boolean configOffload(); private final Handler mHandler; private final SharedLog mLog; private IOffloadControl mOffloadControl; private IOffloadControl mOffloadControl; private TetheringOffloadCallback mTetheringOffloadCallback; private ControlCallback mControlCallback; public OffloadHardwareInterface() {} public static class ControlCallback { public void onOffloadEvent(int event) {} public void onNatTimeoutUpdate(int proto, String srcAddr, int srcPort, String dstAddr, int dstPort) {} } public OffloadHardwareInterface(Handler h, SharedLog log) { mHandler = h; mLog = log.forSubComponent(TAG); } public boolean initOffloadConfig() { public boolean initOffloadConfig() { return configOffload(); return configOffload(); } } // TODO: Extend this to take a TetheringControlCallback for registration. public boolean initOffloadControl(ControlCallback controlCb) { public boolean initOffloadControl() { mControlCallback = controlCb; if (mOffloadControl == null) { if (mOffloadControl == null) { try { try { mOffloadControl = IOffloadControl.getService(); mOffloadControl = IOffloadControl.getService(); } catch (RemoteException e) { } catch (RemoteException e) { Log.d(TAG, "tethering offload control not supported: " + e); mLog.e("tethering offload control not supported: " + e); return false; return false; } } } } // TODO: call mOffloadControl.initOffload(...callback...); mTetheringOffloadCallback = new TetheringOffloadCallback(mHandler, mControlCallback); final CbResults results = new CbResults(); try { mOffloadControl.initOffload( mTetheringOffloadCallback, (boolean success, String errMsg) -> { results.success = success; results.errMsg = errMsg; }); } catch (RemoteException e) { mLog.e("failed to initOffload: " + e); return false; } return true; if (!results.success) mLog.e("initOffload failed: " + results.errMsg); return results.success; } } public void stopOffloadControl() { public void stopOffloadControl() { if (mOffloadControl == null) return; if (mOffloadControl != null) { try { try { final stopOffloadCallback cb = new stopOffloadCallback() { mOffloadControl.stopOffload( (boolean success, String errMsg) -> { if (!success) mLog.e("stopOffload failed: " + errMsg); }); } catch (RemoteException e) { mLog.e("failed to stopOffload: " + e); } } mOffloadControl = null; mTetheringOffloadCallback = null; mControlCallback = null; } private static class TetheringOffloadCallback extends ITetheringOffloadCallback.Stub { public final Handler handler; public final ControlCallback controlCb; public TetheringOffloadCallback(Handler h, ControlCallback cb) { handler = h; controlCb = cb; } @Override @Override public void onValues(boolean success, String errMsg) { public void onEvent(int event) { if (success) return; handler.post(() -> { controlCb.onOffloadEvent(event); }); } Log.e(TAG, "stopOffload failed: " + errMsg); @Override public void updateTimeout(NatTimeoutUpdate params) { handler.post(() -> { controlCb.onNatTimeoutUpdate( params.proto, params.src.addr, params.src.port, params.dst.addr, params.dst.port); }); } } }; mOffloadControl.stopOffload(cb); } catch (RemoteException e) { Log.d(TAG, "failed to stopOffload: " + e); } } mOffloadControl = null; private static class CbResults { boolean success; String errMsg; } } } } services/core/java/com/android/server/connectivity/tethering/TetheringDependencies.java +5 −2 Original line number Original line Diff line number Diff line Loading @@ -16,6 +16,9 @@ package com.android.server.connectivity.tethering; package com.android.server.connectivity.tethering; import android.os.Handler; import android.net.util.SharedLog; /** /** * Capture tethering dependencies, for injection. * Capture tethering dependencies, for injection. Loading @@ -23,7 +26,7 @@ package com.android.server.connectivity.tethering; * @hide * @hide */ */ public class TetheringDependencies { public class TetheringDependencies { public OffloadHardwareInterface getOffloadHardwareInterface() { public OffloadHardwareInterface getOffloadHardwareInterface(Handler h, SharedLog log) { return new OffloadHardwareInterface(); return new OffloadHardwareInterface(h, log); } } } } tests/net/java/com/android/server/connectivity/TetheringTest.java +3 −2 Original line number Original line Diff line number Diff line Loading @@ -43,6 +43,7 @@ import android.net.INetworkPolicyManager; import android.net.INetworkStatsService; import android.net.INetworkStatsService; import android.net.InterfaceConfiguration; import android.net.InterfaceConfiguration; import android.net.NetworkRequest; import android.net.NetworkRequest; import android.net.util.SharedLog; import android.net.wifi.WifiConfiguration; import android.net.wifi.WifiConfiguration; import android.net.wifi.WifiManager; import android.net.wifi.WifiManager; import android.os.Handler; import android.os.Handler; Loading Loading @@ -142,8 +143,8 @@ public class TetheringTest { }; }; mServiceContext.registerReceiver(mBroadcastReceiver, mServiceContext.registerReceiver(mBroadcastReceiver, new IntentFilter(ConnectivityManager.ACTION_TETHER_STATE_CHANGED)); new IntentFilter(ConnectivityManager.ACTION_TETHER_STATE_CHANGED)); when(mTetheringDependencies.getOffloadHardwareInterface()) when(mTetheringDependencies.getOffloadHardwareInterface( .thenReturn(mOffloadHardwareInterface); any(Handler.class), any(SharedLog.class))).thenReturn(mOffloadHardwareInterface); mTethering = new Tethering(mServiceContext, mNMService, mStatsService, mPolicyManager, mTethering = new Tethering(mServiceContext, mNMService, mStatsService, mPolicyManager, mLooper.getLooper(), mSystemProperties, mLooper.getLooper(), mSystemProperties, mTetheringDependencies); mTetheringDependencies); Loading Loading
services/core/java/com/android/server/connectivity/Tethering.java +14 −4 Original line number Original line Diff line number Diff line Loading @@ -52,6 +52,7 @@ import android.net.util.SharedLog; import android.net.wifi.WifiManager; import android.net.wifi.WifiManager; import android.os.Binder; import android.os.Binder; import android.os.Bundle; import android.os.Bundle; import android.os.Handler; import android.os.INetworkManagementService; import android.os.INetworkManagementService; import android.os.Looper; import android.os.Looper; import android.os.Message; import android.os.Message; Loading Loading @@ -195,8 +196,10 @@ public class Tethering extends BaseNetworkObserver implements IControlsTethering mTetherMasterSM = new TetherMasterSM("TetherMaster", mLooper); mTetherMasterSM = new TetherMasterSM("TetherMaster", mLooper); mTetherMasterSM.start(); mTetherMasterSM.start(); mOffloadController = new OffloadController(mTetherMasterSM.getHandler(), final Handler smHandler = mTetherMasterSM.getHandler(); deps.getOffloadHardwareInterface(), mLog); mOffloadController = new OffloadController(smHandler, deps.getOffloadHardwareInterface(smHandler, mLog), mLog); mUpstreamNetworkMonitor = new UpstreamNetworkMonitor( mUpstreamNetworkMonitor = new UpstreamNetworkMonitor( mContext, mTetherMasterSM, TetherMasterSM.EVENT_UPSTREAM_CALLBACK, mLog); mContext, mTetherMasterSM, TetherMasterSM.EVENT_UPSTREAM_CALLBACK, mLog); mForwardedDownstreams = new HashSet<>(); mForwardedDownstreams = new HashSet<>(); Loading Loading @@ -1083,7 +1086,6 @@ public class Tethering extends BaseNetworkObserver implements IControlsTethering TetherMasterSM(String name, Looper looper) { TetherMasterSM(String name, Looper looper) { super(name, looper); super(name, looper); //Add states mInitialState = new InitialState(); mInitialState = new InitialState(); mTetherModeAliveState = new TetherModeAliveState(); mTetherModeAliveState = new TetherModeAliveState(); mSetIpForwardingEnabledErrorState = new SetIpForwardingEnabledErrorState(); mSetIpForwardingEnabledErrorState = new SetIpForwardingEnabledErrorState(); Loading Loading @@ -1397,10 +1399,11 @@ public class Tethering extends BaseNetworkObserver implements IControlsTethering mSimChange.startListening(); mSimChange.startListening(); mUpstreamNetworkMonitor.start(); mUpstreamNetworkMonitor.start(); mOffloadController.start(); // TODO: De-duplicate with updateUpstreamWanted() below. if (upstreamWanted()) { if (upstreamWanted()) { mUpstreamWanted = true; mUpstreamWanted = true; mOffloadController.start(); chooseUpstreamType(true); chooseUpstreamType(true); mTryCell = false; mTryCell = false; } } Loading @@ -1419,6 +1422,13 @@ public class Tethering extends BaseNetworkObserver implements IControlsTethering private boolean updateUpstreamWanted() { private boolean updateUpstreamWanted() { final boolean previousUpstreamWanted = mUpstreamWanted; final boolean previousUpstreamWanted = mUpstreamWanted; mUpstreamWanted = upstreamWanted(); mUpstreamWanted = upstreamWanted(); if (mUpstreamWanted != previousUpstreamWanted) { if (mUpstreamWanted) { mOffloadController.start(); } else { mOffloadController.stop(); } } return previousUpstreamWanted; return previousUpstreamWanted; } } Loading
services/core/java/com/android/server/connectivity/tethering/OffloadController.java +20 −2 Original line number Original line Diff line number Diff line Loading @@ -49,12 +49,30 @@ public class OffloadController { mConfigInitialized = mHwInterface.initOffloadConfig(); mConfigInitialized = mHwInterface.initOffloadConfig(); if (!mConfigInitialized) { if (!mConfigInitialized) { mLog.i("tethering offload config not supported"); mLog.i("tethering offload config not supported"); stop(); return; return; } } } } // TODO: Create and register ITetheringOffloadCallback. mControlInitialized = mHwInterface.initOffloadControl( mControlInitialized = mHwInterface.initOffloadControl(); new OffloadHardwareInterface.ControlCallback() { @Override public void onOffloadEvent(int event) { mLog.log("got offload event: " + event); } @Override public void onNatTimeoutUpdate(int proto, String srcAddr, int srcPort, String dstAddr, int dstPort) { mLog.log(String.format("NAT timeout update: %s (%s,%s) -> (%s,%s)", proto, srcAddr, srcPort, dstAddr, dstPort)); } }); if (!mControlInitialized) { mLog.i("tethering offload control not supported"); stop(); } } } public void stop() { public void stop() { Loading
services/core/java/com/android/server/connectivity/tethering/OffloadHardwareInterface.java +80 −22 Original line number Original line Diff line number Diff line Loading @@ -17,9 +17,11 @@ package com.android.server.connectivity.tethering; package com.android.server.connectivity.tethering; import android.hardware.tetheroffload.control.V1_0.IOffloadControl; import android.hardware.tetheroffload.control.V1_0.IOffloadControl; import android.hardware.tetheroffload.control.V1_0.IOffloadControl.stopOffloadCallback; import android.hardware.tetheroffload.control.V1_0.ITetheringOffloadCallback; import android.hardware.tetheroffload.control.V1_0.NatTimeoutUpdate; import android.os.Handler; import android.os.RemoteException; import android.os.RemoteException; import android.util.Log; import android.net.util.SharedLog; /** /** Loading @@ -32,46 +34,102 @@ public class OffloadHardwareInterface { private static native boolean configOffload(); private static native boolean configOffload(); private final Handler mHandler; private final SharedLog mLog; private IOffloadControl mOffloadControl; private IOffloadControl mOffloadControl; private TetheringOffloadCallback mTetheringOffloadCallback; private ControlCallback mControlCallback; public OffloadHardwareInterface() {} public static class ControlCallback { public void onOffloadEvent(int event) {} public void onNatTimeoutUpdate(int proto, String srcAddr, int srcPort, String dstAddr, int dstPort) {} } public OffloadHardwareInterface(Handler h, SharedLog log) { mHandler = h; mLog = log.forSubComponent(TAG); } public boolean initOffloadConfig() { public boolean initOffloadConfig() { return configOffload(); return configOffload(); } } // TODO: Extend this to take a TetheringControlCallback for registration. public boolean initOffloadControl(ControlCallback controlCb) { public boolean initOffloadControl() { mControlCallback = controlCb; if (mOffloadControl == null) { if (mOffloadControl == null) { try { try { mOffloadControl = IOffloadControl.getService(); mOffloadControl = IOffloadControl.getService(); } catch (RemoteException e) { } catch (RemoteException e) { Log.d(TAG, "tethering offload control not supported: " + e); mLog.e("tethering offload control not supported: " + e); return false; return false; } } } } // TODO: call mOffloadControl.initOffload(...callback...); mTetheringOffloadCallback = new TetheringOffloadCallback(mHandler, mControlCallback); final CbResults results = new CbResults(); try { mOffloadControl.initOffload( mTetheringOffloadCallback, (boolean success, String errMsg) -> { results.success = success; results.errMsg = errMsg; }); } catch (RemoteException e) { mLog.e("failed to initOffload: " + e); return false; } return true; if (!results.success) mLog.e("initOffload failed: " + results.errMsg); return results.success; } } public void stopOffloadControl() { public void stopOffloadControl() { if (mOffloadControl == null) return; if (mOffloadControl != null) { try { try { final stopOffloadCallback cb = new stopOffloadCallback() { mOffloadControl.stopOffload( (boolean success, String errMsg) -> { if (!success) mLog.e("stopOffload failed: " + errMsg); }); } catch (RemoteException e) { mLog.e("failed to stopOffload: " + e); } } mOffloadControl = null; mTetheringOffloadCallback = null; mControlCallback = null; } private static class TetheringOffloadCallback extends ITetheringOffloadCallback.Stub { public final Handler handler; public final ControlCallback controlCb; public TetheringOffloadCallback(Handler h, ControlCallback cb) { handler = h; controlCb = cb; } @Override @Override public void onValues(boolean success, String errMsg) { public void onEvent(int event) { if (success) return; handler.post(() -> { controlCb.onOffloadEvent(event); }); } Log.e(TAG, "stopOffload failed: " + errMsg); @Override public void updateTimeout(NatTimeoutUpdate params) { handler.post(() -> { controlCb.onNatTimeoutUpdate( params.proto, params.src.addr, params.src.port, params.dst.addr, params.dst.port); }); } } }; mOffloadControl.stopOffload(cb); } catch (RemoteException e) { Log.d(TAG, "failed to stopOffload: " + e); } } mOffloadControl = null; private static class CbResults { boolean success; String errMsg; } } } }
services/core/java/com/android/server/connectivity/tethering/TetheringDependencies.java +5 −2 Original line number Original line Diff line number Diff line Loading @@ -16,6 +16,9 @@ package com.android.server.connectivity.tethering; package com.android.server.connectivity.tethering; import android.os.Handler; import android.net.util.SharedLog; /** /** * Capture tethering dependencies, for injection. * Capture tethering dependencies, for injection. Loading @@ -23,7 +26,7 @@ package com.android.server.connectivity.tethering; * @hide * @hide */ */ public class TetheringDependencies { public class TetheringDependencies { public OffloadHardwareInterface getOffloadHardwareInterface() { public OffloadHardwareInterface getOffloadHardwareInterface(Handler h, SharedLog log) { return new OffloadHardwareInterface(); return new OffloadHardwareInterface(h, log); } } } }
tests/net/java/com/android/server/connectivity/TetheringTest.java +3 −2 Original line number Original line Diff line number Diff line Loading @@ -43,6 +43,7 @@ import android.net.INetworkPolicyManager; import android.net.INetworkStatsService; import android.net.INetworkStatsService; import android.net.InterfaceConfiguration; import android.net.InterfaceConfiguration; import android.net.NetworkRequest; import android.net.NetworkRequest; import android.net.util.SharedLog; import android.net.wifi.WifiConfiguration; import android.net.wifi.WifiConfiguration; import android.net.wifi.WifiManager; import android.net.wifi.WifiManager; import android.os.Handler; import android.os.Handler; Loading Loading @@ -142,8 +143,8 @@ public class TetheringTest { }; }; mServiceContext.registerReceiver(mBroadcastReceiver, mServiceContext.registerReceiver(mBroadcastReceiver, new IntentFilter(ConnectivityManager.ACTION_TETHER_STATE_CHANGED)); new IntentFilter(ConnectivityManager.ACTION_TETHER_STATE_CHANGED)); when(mTetheringDependencies.getOffloadHardwareInterface()) when(mTetheringDependencies.getOffloadHardwareInterface( .thenReturn(mOffloadHardwareInterface); any(Handler.class), any(SharedLog.class))).thenReturn(mOffloadHardwareInterface); mTethering = new Tethering(mServiceContext, mNMService, mStatsService, mPolicyManager, mTethering = new Tethering(mServiceContext, mNMService, mStatsService, mPolicyManager, mLooper.getLooper(), mSystemProperties, mLooper.getLooper(), mSystemProperties, mTetheringDependencies); mTetheringDependencies); Loading