diff options
Diffstat (limited to 'service/java/com')
-rw-r--r-- | service/java/com/android/server/lowpan/LowpanInterfaceTracker.java | 101 | ||||
-rw-r--r-- | service/java/com/android/server/lowpan/LowpanServiceImpl.java | 55 |
2 files changed, 94 insertions, 62 deletions
diff --git a/service/java/com/android/server/lowpan/LowpanInterfaceTracker.java b/service/java/com/android/server/lowpan/LowpanInterfaceTracker.java index 89b058c..69842c2 100644 --- a/service/java/com/android/server/lowpan/LowpanInterfaceTracker.java +++ b/service/java/com/android/server/lowpan/LowpanInterfaceTracker.java @@ -73,8 +73,6 @@ class LowpanInterfaceTracker extends StateMachine { /** The base for LoWPAN message codes */ static final int BASE = Protocol.BASE_LOWPAN; - static final int CMD_REGISTER = BASE + 1; - static final int CMD_UNREGISTER = BASE + 2; static final int CMD_START_NETWORK = BASE + 3; static final int CMD_STOP_NETWORK = BASE + 4; static final int CMD_STATE_CHANGE = BASE + 5; @@ -89,7 +87,7 @@ class LowpanInterfaceTracker extends StateMachine { private LowpanInterface mLowpanInterface; private NetworkAgent mNetworkAgent; private NetworkFactory mNetworkFactory; - private final IpManager mIpManager; + private IpManager mIpManager; private final IpManager.Callback mIpManagerCallback = new IpManagerCallback(); // Instance Variables @@ -106,7 +104,6 @@ class LowpanInterfaceTracker extends StateMachine { final DefaultState mDefaultState = new DefaultState(); final NormalState mNormalState = new NormalState(); - final InitState mInitState = new InitState(); final OfflineState mOfflineState = new OfflineState(); final CommissioningState mCommissioningState = new CommissioningState(); final AttachingState mAttachingState = new AttachingState(); @@ -154,30 +151,6 @@ class LowpanInterfaceTracker extends StateMachine { // State Definitions - class InitState extends State { - @Override - public void enter() {} - - @Override - public boolean processMessage(Message message) { - switch (message.what) { - case CMD_REGISTER: - if (DBG) { - Log.i(TAG, "CMD_REGISTER"); - } - transitionTo(mDefaultState); - break; - - default: - return NOT_HANDLED; - } - return HANDLED; - } - - @Override - public void exit() {} - } - class DefaultState extends State { @Override public void enter() { @@ -200,20 +173,29 @@ class LowpanInterfaceTracker extends StateMachine { boolean retValue = NOT_HANDLED; switch (message.what) { - case CMD_UNREGISTER: - transitionTo(mInitState); - retValue = HANDLED; - break; - case CMD_START_NETWORK: if (DBG) { Log.i(TAG, "CMD_START_NETWORK"); } + try { + mLowpanInterface.setEnabled(true); + } catch (LowpanException | LowpanRuntimeException x) { + Log.e(TAG, "Exception while enabling: " + x); + transitionTo(mFaultState); + return HANDLED; + } break; case CMD_STOP_NETWORK: if (DBG) { - Log.i(TAG, "CMD_START_NETWORK"); + Log.i(TAG, "CMD_STOP_NETWORK"); + } + try { + mLowpanInterface.setEnabled(false); + } catch (LowpanException | LowpanRuntimeException x) { + Log.e(TAG, "Exception while disabling: " + x); + transitionTo(mFaultState); + return HANDLED; } break; @@ -225,7 +207,7 @@ class LowpanInterfaceTracker extends StateMachine { "LowpanInterface changed state from \"" + mState + "\" to \"" - + message.obj.toString() + + message.obj + "\"."); } mState = (String) message.obj; @@ -255,7 +237,6 @@ class LowpanInterfaceTracker extends StateMachine { @Override public void exit() { - mLowpanInterface.unregisterCallback(mLocalLowpanCallback); } } @@ -267,15 +248,17 @@ class LowpanInterfaceTracker extends StateMachine { Log.i(TAG, "NormalState.enter()"); } + mIpManager = new IpManager(mContext, mInterfaceName, mIpManagerCallback); + if (mHwAddr == null) { byte[] hwAddr = null; try { hwAddr = mLowpanInterface.getService().getMacAddress(); } catch (RemoteException | ServiceSpecificException x) { - // Don't let misbehavior of an interface service + // Don't let misbehavior of the interface service // crash the system service. - Log.e(TAG, x.toString()); + Log.e(TAG, "Call to getMacAddress() failed: " + x); transitionTo(mFaultState); } @@ -296,7 +279,13 @@ class LowpanInterfaceTracker extends StateMachine { Log.i(TAG, "UNWANTED."); } - // TODO: Figure out how to properly handle this. + try { + mLowpanInterface.setEnabled(false); + } catch (LowpanException | LowpanRuntimeException x) { + Log.e(TAG, "Exception while disabling: " + x); + transitionTo(mFaultState); + return HANDLED; + } shutdownNetworkAgent(); } @@ -313,7 +302,7 @@ class LowpanInterfaceTracker extends StateMachine { break; case CMD_PROVISIONING_FAILURE: - Log.i(TAG, "Provisioning Failure: " + message.obj.toString()); + Log.i(TAG, "Provisioning Failure: " + message.obj); break; } @@ -324,6 +313,11 @@ class LowpanInterfaceTracker extends StateMachine { public void exit() { shutdownNetworkAgent(); mNetworkFactory.unregister(); + + if (mIpManager != null) { + mIpManager.shutdown(); + } + mIpManager = null; } } @@ -332,6 +326,8 @@ class LowpanInterfaceTracker extends StateMachine { public void enter() { shutdownNetworkAgent(); mNetworkInfo.setIsAvailable(true); + + mIpManager.stop(); } @Override @@ -385,17 +381,15 @@ class LowpanInterfaceTracker extends StateMachine { public boolean processMessage(Message message) { switch (message.what) { case CMD_STATE_CHANGE: - if (!mState.equals(message.obj)) { - if (!LowpanInterface.STATE_ATTACHED.equals(message.obj)) { - return NOT_HANDLED; - } + if (!mState.equals(message.obj) + && !LowpanInterface.STATE_ATTACHED.equals(message.obj)) { + return NOT_HANDLED; } - break; + return HANDLED; default: return NOT_HANDLED; } - return HANDLED; } @Override @@ -439,7 +433,7 @@ class LowpanInterfaceTracker extends StateMachine { if (x.getCause() instanceof RemoteException) { // Don't let misbehavior of an interface service // crash the system service. - Log.e(TAG, x.toString()); + Log.e(TAG, "RuntimeException while populating InitialConfiguration: " + x); transitionTo(mFaultState); } else { @@ -483,7 +477,7 @@ class LowpanInterfaceTracker extends StateMachine { switch (message.what) { case CMD_PROVISIONING_SUCCESS: - Log.i(TAG, "Provisioning Success: " + message.obj.toString()); + Log.i(TAG, "Provisioning Success: " + message.obj); transitionTo(mConnectedState); return HANDLED; } @@ -555,7 +549,6 @@ class LowpanInterfaceTracker extends StateMachine { mNetworkCapabilities.setLinkDownstreamBandwidthKbps(100); // CHECKSTYLE:OFF IndentationCheck - addState(mInitState); addState(mDefaultState); addState(mFaultState, mDefaultState); addState(mNormalState, mDefaultState); @@ -567,7 +560,7 @@ class LowpanInterfaceTracker extends StateMachine { addState(mConnectedState, mAttachedState); // CHECKSTYLE:ON IndentationCheck - setInitialState(mInitState); + setInitialState(mDefaultState); mNetworkFactory = new NetworkFactory(looper, context, NETWORK_TYPE, mNetworkCapabilities) { @@ -582,10 +575,6 @@ class LowpanInterfaceTracker extends StateMachine { } }; - mIpManager = new IpManager(mContext, mInterfaceName, mIpManagerCallback); - - start(); - if (DBG) { Log.i(TAG, "LowpanInterfaceTracker() end"); } @@ -625,13 +614,13 @@ class LowpanInterfaceTracker extends StateMachine { if (DBG) { Log.i(TAG, "register()"); } - sendMessage(CMD_REGISTER); + start(); } public void unregister() { if (DBG) { Log.i(TAG, "unregister()"); } - sendMessage(CMD_UNREGISTER); + quit(); } } diff --git a/service/java/com/android/server/lowpan/LowpanServiceImpl.java b/service/java/com/android/server/lowpan/LowpanServiceImpl.java index 07677e3..9450089 100644 --- a/service/java/com/android/server/lowpan/LowpanServiceImpl.java +++ b/service/java/com/android/server/lowpan/LowpanServiceImpl.java @@ -16,10 +16,15 @@ package com.android.server.lowpan; +import android.content.pm.PackageManager; import android.content.Context; +import android.net.ConnectivityManager; +import android.net.ConnectivityManager.NetworkCallback; import android.net.lowpan.ILowpanInterface; import android.net.lowpan.ILowpanManager; import android.net.lowpan.ILowpanManagerListener; +import android.net.NetworkCapabilities; +import android.net.NetworkRequest; import android.os.Binder; import android.os.HandlerThread; import android.os.IBinder; @@ -27,11 +32,11 @@ import android.os.Looper; import android.os.RemoteException; import android.os.ServiceSpecificException; import android.util.Log; +import java.util.concurrent.atomic.AtomicBoolean; import java.util.HashMap; import java.util.HashSet; import java.util.Map; import java.util.Set; -import java.util.concurrent.atomic.AtomicBoolean; /** * LowpanService handles remote LoWPAN operation requests by implementing the ILowpanManager @@ -46,9 +51,11 @@ public class LowpanServiceImpl extends ILowpanManager.Stub { private final Context mContext; private final HandlerThread mHandlerThread = new HandlerThread("LowpanServiceThread"); private final AtomicBoolean mStarted = new AtomicBoolean(false); + private final boolean mIsAndroidThings; public LowpanServiceImpl(Context context) { mContext = context; + mIsAndroidThings = context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_EMBEDDED); } public Looper getLooper() { @@ -61,6 +68,25 @@ public class LowpanServiceImpl extends ILowpanManager.Stub { return looper; } + public void createOutstandingNetworkRequest() { + final ConnectivityManager cm = + (ConnectivityManager) mContext.getSystemService(Context.CONNECTIVITY_SERVICE); + + if (cm == null) { + throw new IllegalStateException("Bad luck, ConnectivityService not started."); + } + + NetworkRequest request = new NetworkRequest.Builder() + .clearCapabilities() + .addTransportType(NetworkCapabilities.TRANSPORT_LOWPAN) + .build(); + + // Note that this method only ever gets called once, + // so we don't need to bother with worrying about unregistering. + + cm.requestNetwork(request, new NetworkCallback()); + } + public void checkAndStartLowpan() { synchronized (mInterfaceMap) { if (mStarted.compareAndSet(false, true)) { @@ -70,18 +96,35 @@ public class LowpanServiceImpl extends ILowpanManager.Stub { } } + createOutstandingNetworkRequest(); + // TODO: Bring up any daemons(like wpantund)? } private void enforceAccessPermission() { - mContext.enforceCallingOrSelfPermission( - android.Manifest.permission.ACCESS_LOWPAN_STATE, "LowpanService"); + try { + mContext.enforceCallingOrSelfPermission( + android.Manifest.permission.ACCESS_LOWPAN_STATE, "LowpanService"); + } catch (SecurityException x) { + if (!mIsAndroidThings) { + throw x; + } + mContext.enforceCallingOrSelfPermission( + "com.google.android.things.permission.ACCESS_LOWPAN_STATE", "LowpanService"); + } } private void enforceManagePermission() { - // TODO: Change to android.Manifest.permission.MANAGE_lowpanInterfaceS - mContext.enforceCallingOrSelfPermission( - android.Manifest.permission.CHANGE_LOWPAN_STATE, "LowpanService"); + try { + mContext.enforceCallingOrSelfPermission( + android.Manifest.permission.MANAGE_LOWPAN_INTERFACES, "LowpanService"); + } catch (SecurityException x) { + if (!mIsAndroidThings) { + throw x; + } + mContext.enforceCallingOrSelfPermission( + "com.google.android.things.permission.MANAGE_LOWPAN_INTERFACES", "LowpanService"); + } } public ILowpanInterface getInterface(String name) { |