summaryrefslogtreecommitdiff
path: root/service/java/com
diff options
context:
space:
mode:
Diffstat (limited to 'service/java/com')
-rw-r--r--service/java/com/android/server/lowpan/LowpanInterfaceTracker.java101
-rw-r--r--service/java/com/android/server/lowpan/LowpanServiceImpl.java55
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) {