From 58d298af70cb586b005bcbcaf5a4bd6ea4439852 Mon Sep 17 00:00:00 2001 From: Robert Quattlebaum Date: Mon, 17 Jul 2017 19:34:39 -0700 Subject: Test script updates Change-Id: I2aee676ddc53be87b83e92ebdeb22033b614c766 --- tests/commandtest.sh | 23 ++++++++++++--------- tests/jointest.sh | 57 ++++++++++++++++++++++++++++++++++++++++++++++++++++ tests/prepdevice.sh | 3 +-- tests/scantest.sh | 44 ++++++++++++++++++++++++++++++++++++++++ 4 files changed, 115 insertions(+), 12 deletions(-) create mode 100755 tests/jointest.sh create mode 100755 tests/scantest.sh diff --git a/tests/commandtest.sh b/tests/commandtest.sh index fb0fa0e..89ac951 100755 --- a/tests/commandtest.sh +++ b/tests/commandtest.sh @@ -14,32 +14,35 @@ if [ -z $ANDROID_BUILD_TOP ]; then exit 1 fi -./prepdevice.sh || die "Unable to prepare device" +adb wait-for-device || die +echo "Running form command test. . ." sleep 2 -echo "Running tests. . ." - -set -x # print commands - +# Clobber any existing instance of wpantund adb shell killall wpantund 2> /dev/null +# Start wpantund +echo "+ adb shell wpantund -s 'system:ot-ncp\ 1' -o Config:Daemon:ExternalNetifManagement 1 &" adb shell wpantund -s 'system:ot-ncp\ 1' -o Config:Daemon:ExternalNetifManagement 1 & WPANTUND_PID=$! trap "kill -HUP $WPANTUND_PID 2> /dev/null" EXIT INT TERM +# Verify wpantund started properly sleep 2 - kill -0 $WPANTUND_PID || die "wpantund failed to start" - sleep 2 +echo "+ adb shell lowpanctl status" adb shell lowpanctl status || die +echo "+ adb shell lowpanctl form blahnet" adb shell lowpanctl form blahnet || die +echo "+ adb shell lowpanctl status" adb shell lowpanctl status || die +echo "+ adb shell ifconfig wpan0" adb shell ifconfig wpan0 || die +echo "+ adb shell ip rule" +adb shell ip rule || die -set +x # Turn off printing commands - -echo Finished. +echo "Finished form command test." diff --git a/tests/jointest.sh b/tests/jointest.sh new file mode 100755 index 0000000..a99bb67 --- /dev/null +++ b/tests/jointest.sh @@ -0,0 +1,57 @@ +#!/usr/bin/env bash + +cd "`dirname $0`" + +die () { + set +x # Turn off printing commands + echo "" + echo " *** fatal error: $*" + exit 1 +} + +if [ -z $ANDROID_BUILD_TOP ]; then + echo "You need to source and lunch before you can use this script" + exit 1 +fi + +adb wait-for-device || die + +echo "Running join command test. . ." +sleep 2 + +adb shell killall wpantund 2> /dev/null + +adb shell wpantund -I wpan0 -s 'system:ot-ncp\ 1' -o Config:Daemon:ExternalNetifManagement 1 & +WPANTUND_1_PID=$! +adb shell wpantund -I wpan1 -s 'system:ot-ncp\ 2' -o Config:Daemon:ExternalNetifManagement 1 & +WPANTUND_2_PID=$! +trap "kill -HUP $WPANTUND_1_PID $WPANTUND_2_PID 2> /dev/null" EXIT INT TERM + +sleep 2 + +kill -0 $WPANTUND_1_PID || die "wpantund failed to start" +kill -0 $WPANTUND_2_PID || die "wpantund failed to start" + +sleep 2 + +echo "+ adb shell lowpanctl -I wpan0 status" +adb shell lowpanctl -I wpan0 status || die +echo "+ adb shell lowpanctl -I wpan0 form blahnet --panid 1234 --xpanid 0011223344556677 --channel 11" +adb shell lowpanctl -I wpan0 form blahnet --panid 1234 --xpanid 0011223344556677 --channel 11 || die +echo "+ adb shell lowpanctl -I wpan0 status" +adb shell lowpanctl -I wpan0 status || die +echo "+ adb shell lowpanctl -I wpan0 show-credential" +adb shell lowpanctl -I wpan0 show-credential || die + +CREDENTIAL=`adb shell lowpanctl -I wpan0 show-credential -r` || die + +echo "+ adb shell lowpanctl -I wpan1 status" +adb shell lowpanctl -I wpan1 status || die +echo "+ adb shell lowpanctl -I wpan1 scan" +adb shell lowpanctl -I wpan1 scan || die +echo "+ adb shell lowpanctl -I wpan1 join blahnet --panid 1234 --xpanid 0011223344556677 --channel 11 --master-key ${CREDENTIAL}" +adb shell lowpanctl -I wpan1 join blahnet --panid 1234 --xpanid 0011223344556677 --channel 11 --master-key ${CREDENTIAL} || die +echo "+ adb shell lowpanctl -I wpan1 status" +adb shell lowpanctl -I wpan1 status || die + +echo "Finished join command test." diff --git a/tests/prepdevice.sh b/tests/prepdevice.sh index 027d64d..b930f40 100755 --- a/tests/prepdevice.sh +++ b/tests/prepdevice.sh @@ -28,8 +28,7 @@ adb root || die adb wait-for-device || die adb remount || die adb shell stop || die -adb disable-verity -adb sync || die +adb sync system || die adb shell start || die sleep 2 diff --git a/tests/scantest.sh b/tests/scantest.sh new file mode 100755 index 0000000..4945f2b --- /dev/null +++ b/tests/scantest.sh @@ -0,0 +1,44 @@ +#!/usr/bin/env bash + +cd "`dirname $0`" + +die () { + set +x # Turn off printing commands + echo "" + echo " *** fatal error: $*" + exit 1 +} + +if [ -z $ANDROID_BUILD_TOP ]; then + echo "You need to source and lunch before you can use this script" + exit 1 +fi + +adb wait-for-device || die + +echo "Running scan command test. . ." +sleep 2 + +adb shell killall wpantund 2> /dev/null + +echo "+ adb shell wpantund -I wpan0 -s 'system:ot-ncp\ 1' -o Config:Daemon:ExternalNetifManagement 1 &" +adb shell wpantund -I wpan0 -s 'system:ot-ncp\ 1' -o Config:Daemon:ExternalNetifManagement 1 & +WPANTUND_1_PID=$! +echo "+ adb shell wpantund -I wpan1 -s 'system:ot-ncp\ 2' -o Config:Daemon:ExternalNetifManagement 1 &" +adb shell wpantund -I wpan1 -s 'system:ot-ncp\ 2' -o Config:Daemon:ExternalNetifManagement 1 & +WPANTUND_2_PID=$! +trap "kill -HUP $WPANTUND_1_PID $WPANTUND_2_PID 2> /dev/null" EXIT INT TERM + +sleep 2 +kill -0 $WPANTUND_1_PID || die "wpantund failed to start" +kill -0 $WPANTUND_2_PID || die "wpantund failed to start" +sleep 2 + +echo "+ adb shell lowpanctl -I wpan0 form blahnet" +adb shell lowpanctl -I wpan0 form blahnet || die +echo "+ adb shell lowpanctl -I wpan0 status" +adb shell lowpanctl -I wpan0 status || die +echo "+ adb shell lowpanctl -I wpan1 scan" +adb shell lowpanctl -I wpan1 scan || die + +echo "Finished scan command test." -- cgit v1.2.3 From 308b2ec74b0fec1035f38a9e6764a782c6badc61 Mon Sep 17 00:00:00 2001 From: Robert Quattlebaum Date: Tue, 25 Jul 2017 12:42:50 -0700 Subject: LowpanInterfaceTracker: Cleanup/Shutdown at unregister Previously, we weren't properly cleaning ourselves up when we were unregistered. This change makes sure that we properly shut down all of the necessary bits (like IpManager) when we are unregistered. Bug: b/64031223 Test: Executed test scripts successfully. Change-Id: I8ff011fe2987549ef255c885d2ab6cb18154a16b --- .../server/lowpan/LowpanInterfaceTracker.java | 77 +++++++--------------- 1 file changed, 23 insertions(+), 54 deletions(-) diff --git a/service/java/com/android/server/lowpan/LowpanInterfaceTracker.java b/service/java/com/android/server/lowpan/LowpanInterfaceTracker.java index 89b058c..b01baab 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,21 +173,18 @@ 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"); } + // TODO: Call mLowpanInterface.setEnabled(true)? break; case CMD_STOP_NETWORK: if (DBG) { Log.i(TAG, "CMD_START_NETWORK"); } + // TODO: Call mLowpanInterface.setEnabled(false)? break; case CMD_STATE_CHANGE: @@ -225,7 +195,7 @@ class LowpanInterfaceTracker extends StateMachine { "LowpanInterface changed state from \"" + mState + "\" to \"" - + message.obj.toString() + + message.obj + "\"."); } mState = (String) message.obj; @@ -255,7 +225,6 @@ class LowpanInterfaceTracker extends StateMachine { @Override public void exit() { - mLowpanInterface.unregisterCallback(mLocalLowpanCallback); } } @@ -267,15 +236,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); } @@ -313,7 +284,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 +295,11 @@ class LowpanInterfaceTracker extends StateMachine { public void exit() { shutdownNetworkAgent(); mNetworkFactory.unregister(); + + if (mIpManager != null) { + mIpManager.shutdown(); + } + mIpManager = null; } } @@ -385,17 +361,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 +413,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 +457,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 +529,6 @@ class LowpanInterfaceTracker extends StateMachine { mNetworkCapabilities.setLinkDownstreamBandwidthKbps(100); // CHECKSTYLE:OFF IndentationCheck - addState(mInitState); addState(mDefaultState); addState(mFaultState, mDefaultState); addState(mNormalState, mDefaultState); @@ -567,7 +540,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 +555,6 @@ class LowpanInterfaceTracker extends StateMachine { } }; - mIpManager = new IpManager(mContext, mInterfaceName, mIpManagerCallback); - - start(); - if (DBG) { Log.i(TAG, "LowpanInterfaceTracker() end"); } @@ -625,13 +594,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(); } } -- cgit v1.2.3 From 67a620c6f11669ba8509eccec6ebff301f1fc985 Mon Sep 17 00:00:00 2001 From: Robert Quattlebaum Date: Tue, 25 Jul 2017 13:53:55 -0700 Subject: lowpanctl: Improve exception handling and argument help Change-Id: Ib3d4a3088280309ba1630720786a46199341ae25 --- .../com/android/commands/lowpan/LowpanCtl.java | 84 ++++++++++++++-------- 1 file changed, 55 insertions(+), 29 deletions(-) diff --git a/command/java/com/android/commands/lowpan/LowpanCtl.java b/command/java/com/android/commands/lowpan/LowpanCtl.java index 8e36841..77cc856 100644 --- a/command/java/com/android/commands/lowpan/LowpanCtl.java +++ b/command/java/com/android/commands/lowpan/LowpanCtl.java @@ -16,6 +16,7 @@ package com.android.commands.lowpan; +import android.net.LinkAddress; import android.net.lowpan.ILowpanInterface; import android.net.lowpan.LowpanBeaconInfo; import android.net.lowpan.LowpanCredential; @@ -26,7 +27,6 @@ import android.net.lowpan.LowpanInterface; import android.net.lowpan.LowpanManager; import android.net.lowpan.LowpanProvision; import android.net.lowpan.LowpanScanner; -import android.net.LinkAddress; import android.os.RemoteException; import android.os.ServiceSpecificException; import android.util.AndroidRuntimeException; @@ -85,7 +85,6 @@ public class LowpanCtl extends BaseCommand { + "subcommand-options:\n" + " -r / --raw ........................ Print only key contents\n" + "\n"); - } private class CommandErrorException extends AndroidRuntimeException { @@ -94,21 +93,43 @@ public class LowpanCtl extends BaseCommand { } } + private class ArgumentErrorException extends IllegalArgumentException { + public ArgumentErrorException(String desc) { + super(desc); + } + } + private void throwCommandError(String desc) { throw new CommandErrorException(desc); } + private void throwArgumentError(String desc) { + throw new ArgumentErrorException(desc); + } + + private LowpanManager getLowpanManager() { + if (mLowpanManager == null) { + mLowpanManager = LowpanManager.getManager(); + + if (mLowpanManager == null) { + System.err.println(NO_SYSTEM_ERROR_CODE); + throwCommandError("Can't connect to LoWPAN service; is the service running?"); + } + } + return mLowpanManager; + } + private LowpanInterface getLowpanInterface() { if (mLowpanInterface == null) { if (mLowpanInterfaceName == null) { - String interfaceArray[] = mLowpanManager.getInterfaceList(); + String interfaceArray[] = getLowpanManager().getInterfaceList(); if (interfaceArray.length != 0) { mLowpanInterfaceName = interfaceArray[0]; } else { throwCommandError("No LoWPAN interfaces are present"); } } - mLowpanInterface = mLowpanManager.getInterface(mLowpanInterfaceName); + mLowpanInterface = getLowpanManager().getInterface(mLowpanInterfaceName); if (mLowpanInterface == null) { throwCommandError("Unknown LoWPAN interface \"" + mLowpanInterfaceName + "\""); @@ -126,20 +147,16 @@ public class LowpanCtl extends BaseCommand { @Override public void onRun() throws Exception { - mLowpanManager = LowpanManager.getManager(); - - if (mLowpanManager == null) { - System.err.println(NO_SYSTEM_ERROR_CODE); - throwCommandError("Can't connect to LoWPAN service; is the service running?"); - } - try { String op; while ((op = nextArgRequired()) != null) { if (op.equals("-I") || op.equals("--interface")) { mLowpanInterfaceName = nextArgRequired(); + } else if (op.equals("-h") || op.equals("--help") || op.equals("help")) { + onShowUsage(System.out); + break; } else if (op.startsWith("-")) { - throwCommandError("Unrecognized argument \"" + op + "\""); + throwArgumentError("Unrecognized argument \"" + op + "\""); } else if (op.equals("status") || op.equals("stat")) { runStatus(); break; @@ -177,15 +194,31 @@ public class LowpanCtl extends BaseCommand { runReset(); break; } else { - showError("Error: unknown command '" + op + "'"); + throwArgumentError("Unrecognized argument \"" + op + "\""); break; } } } catch (ServiceSpecificException x) { System.out.println( "ServiceSpecificException: " + x.errorCode + ": " + x.getLocalizedMessage()); + throw x; + + } catch (ArgumentErrorException x) { + // Rethrow so we get syntax help. + throw x; + + } catch (IllegalArgumentException x) { + // This was an argument exception that wasn't an + // argument error. We dump our stack trace immediately + // because this might not be from a command line argument. + x.printStackTrace(System.err); + System.exit(1); + } catch (CommandErrorException x) { + // Command errors are normal errors that just + // get printed out without any fanfare. System.out.println("error: " + x.getLocalizedMessage()); + System.exit(1); } } @@ -225,10 +258,8 @@ public class LowpanCtl extends BaseCommand { masterKey = HexDump.hexStringToByteArray(nextArgRequired()); } else if (arg.equals("--master-key-index")) { masterKeyIndex = Integer.decode(nextArgRequired()); - } else if (arg.equals("--help")) { - throwCommandError(""); } else if (arg.startsWith("-") || hasName) { - throwCommandError("Unrecognized argument \"" + arg + "\""); + throwArgumentError("Unrecognized argument \"" + arg + "\""); } else { // This is the network name identityBuilder.setName(arg); @@ -247,7 +278,7 @@ public class LowpanCtl extends BaseCommand { if (credential != null) { builder.setLowpanCredential(credential); } else if (credentialRequired) { - throwCommandError("No credential (like a master key) was specified!"); + throwArgumentError("No credential (like a master key) was specified!"); } return builder.setLowpanIdentity(identityBuilder.build()).build(); @@ -284,9 +315,7 @@ public class LowpanCtl extends BaseCommand { if (provision.getLowpanCredential() != null) { System.out.println( - "Forming " - + provision.getLowpanIdentity() - + " with provided credential"); + "Forming " + provision.getLowpanIdentity() + " with provided credential"); } else { System.out.println("Forming " + provision.getLowpanIdentity()); } @@ -316,9 +345,7 @@ public class LowpanCtl extends BaseCommand { sb.append(" COMMISSIONED"); } - sb - .append("\n\t") - .append(getLowpanInterface().getLowpanIdentity()); + sb.append("\n\t").append(getLowpanInterface().getLowpanIdentity()); for (LinkAddress addr : iface.getLinkAddresses()) { sb.append("\n\t").append(addr); @@ -336,7 +363,7 @@ public class LowpanCtl extends BaseCommand { if (arg.equals("--raw") || arg.equals("-r")) { raw = true; } else { - throwCommandError("Unrecognized argument \"" + arg + "\""); + throwArgumentError("Unrecognized argument \"" + arg + "\""); } } @@ -344,13 +371,12 @@ public class LowpanCtl extends BaseCommand { if (raw) { System.out.println(HexDump.toHexString(credential.getMasterKey())); } else { - System.out.println( - iface.getName() + "\t" + credential.toSensitiveString()); + System.out.println(iface.getName() + "\t" + credential.toSensitiveString()); } } private void runListInterfaces() { - for (String name : mLowpanManager.getInterfaceList()) { + for (String name : getLowpanManager().getInterfaceList()) { System.out.println(name); } } @@ -363,7 +389,7 @@ public class LowpanCtl extends BaseCommand { if (arg.equals("-c") || arg.equals("--channel")) { scanner.addChannel(Integer.decode(nextArgRequired())); } else { - throwCommandError("Unrecognized argument \"" + arg + "\""); + throwArgumentError("Unrecognized argument \"" + arg + "\""); } } @@ -401,7 +427,7 @@ public class LowpanCtl extends BaseCommand { if (arg.equals("-c") || arg.equals("--channel")) { scanner.addChannel(Integer.decode(nextArgRequired())); } else { - throwCommandError("Unrecognized argument \"" + arg + "\""); + throwArgumentError("Unrecognized argument \"" + arg + "\""); } } -- cgit v1.2.3 From c90f0063b4c9959c22f6fce8006c8214e7e25c46 Mon Sep 17 00:00:00 2001 From: Robert Quattlebaum Date: Thu, 3 Aug 2017 14:44:39 -0700 Subject: Added support for Android Things permissions. Change-Id: Ib2a01c7e1a633950b6e263b4aa19afc6d367b220 --- .../android/server/lowpan/LowpanServiceImpl.java | 28 ++++++++++++++++++---- 1 file changed, 23 insertions(+), 5 deletions(-) diff --git a/service/java/com/android/server/lowpan/LowpanServiceImpl.java b/service/java/com/android/server/lowpan/LowpanServiceImpl.java index 07677e3..967dc79 100644 --- a/service/java/com/android/server/lowpan/LowpanServiceImpl.java +++ b/service/java/com/android/server/lowpan/LowpanServiceImpl.java @@ -16,6 +16,7 @@ package com.android.server.lowpan; +import android.content.pm.PackageManager; import android.content.Context; import android.net.lowpan.ILowpanInterface; import android.net.lowpan.ILowpanManager; @@ -46,9 +47,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() { @@ -74,14 +77,29 @@ public class LowpanServiceImpl extends ILowpanManager.Stub { } 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) { -- cgit v1.2.3 From 148f5a4d4bc6aebb47f04872048c3ccfabed3157 Mon Sep 17 00:00:00 2001 From: Robert Quattlebaum Date: Tue, 8 Aug 2017 11:52:29 -0700 Subject: LowpanServiceImpl: Add outstanding NetworkRequest This change adds an outstanding NetworkRequest which makes sure that we keep LoWPAN networks around instead of shutting them down as unwanted. Bug: b/64482750 Change-Id: I2310f2499f161096af5410b27160b875de520c4a --- .../server/lowpan/LowpanInterfaceTracker.java | 26 +++++++++++++++++---- .../android/server/lowpan/LowpanServiceImpl.java | 27 +++++++++++++++++++++- 2 files changed, 48 insertions(+), 5 deletions(-) diff --git a/service/java/com/android/server/lowpan/LowpanInterfaceTracker.java b/service/java/com/android/server/lowpan/LowpanInterfaceTracker.java index b01baab..83522c9 100644 --- a/service/java/com/android/server/lowpan/LowpanInterfaceTracker.java +++ b/service/java/com/android/server/lowpan/LowpanInterfaceTracker.java @@ -177,14 +177,26 @@ class LowpanInterfaceTracker extends StateMachine { if (DBG) { Log.i(TAG, "CMD_START_NETWORK"); } - // TODO: Call mLowpanInterface.setEnabled(true)? + 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; } - // TODO: Call mLowpanInterface.setEnabled(false)? break; case CMD_STATE_CHANGE: @@ -267,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(); } diff --git a/service/java/com/android/server/lowpan/LowpanServiceImpl.java b/service/java/com/android/server/lowpan/LowpanServiceImpl.java index 967dc79..9450089 100644 --- a/service/java/com/android/server/lowpan/LowpanServiceImpl.java +++ b/service/java/com/android/server/lowpan/LowpanServiceImpl.java @@ -18,9 +18,13 @@ 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; @@ -28,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 @@ -64,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)) { @@ -73,6 +96,8 @@ public class LowpanServiceImpl extends ILowpanManager.Stub { } } + createOutstandingNetworkRequest(); + // TODO: Bring up any daemons(like wpantund)? } -- cgit v1.2.3 From 0c9a220563ff3ee7181d52614be33cc475a4de7f Mon Sep 17 00:00:00 2001 From: Simran Basi Date: Thu, 31 Aug 2017 11:46:33 -0700 Subject: Fix test config for FrameworksLowpanApiNativeTests Updates the instrumentation runner to be correct. Bug: 65176822 Test: atest FrameworksLowpanApiNativeTests Change-Id: Ic970080e4536a5c4ca1e7fddd9264ac59ccc4fa1 --- libandroid_net_lowpan/tests/AndroidTest.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libandroid_net_lowpan/tests/AndroidTest.xml b/libandroid_net_lowpan/tests/AndroidTest.xml index 55e5e7f..34489fc 100644 --- a/libandroid_net_lowpan/tests/AndroidTest.xml +++ b/libandroid_net_lowpan/tests/AndroidTest.xml @@ -21,7 +21,7 @@