Merge pull request #230 from openweave/feature/nrf5-sdk-3.0-support

Update to version 3.0 of the Nordic nRF5 SDK
diff --git a/.travis/prepare_nrf52840.sh b/.travis/prepare_nrf52840.sh
index 15b986a..4f639d0 100755
--- a/.travis/prepare_nrf52840.sh
+++ b/.travis/prepare_nrf52840.sh
@@ -25,7 +25,7 @@
 
 # Set tools download links
 #
-NORDIC_SDK_FOR_THREAD_URL=https://www.nordicsemi.com/-/media/Software-and-other-downloads/SDKs/nRF5-SDK-for-Thread/nRF5-SDK-for-Thread-and-Zigbee/nRF5SDKforThreadandZigbee20029775ac.zip
+NORDIC_SDK_FOR_THREAD_URL=https://www.nordicsemi.com/-/media/Software-and-other-downloads/SDKs/nRF5-SDK-for-Thread/nRF5-SDK-for-Thread-and-Zigbee/nRF5SDKforThreadandZigbeev300d310e71.zip
 NORDIC_COMMAND_LINE_TOOLS_URL=https://www.nordicsemi.com/-/media/Software-and-other-downloads/Desktop-software/nRF5-command-line-tools/sw/nRF-Command-Line-Tools_9_8_1_Linux-x86_64.tar
 ARM_GCC_TOOLCHAIN_URL=https://developer.arm.com/-/media/Files/downloads/gnu-rm/7-2018q2/gcc-arm-none-eabi-7-2018-q2-update-linux.tar.bz2
 
diff --git a/build/nrf5/nrf5-app.mk b/build/nrf5/nrf5-app.mk
index 3331877..e16a203 100644
--- a/build/nrf5/nrf5-app.mk
+++ b/build/nrf5/nrf5-app.mk
@@ -147,9 +147,9 @@
     NRF52840_XXAA \
     BOARD_PCA10056
 
-STD_COMPILE_PREREQUISITES =
+STD_COMPILE_PREREQUISITES = nrf5-sdk-check
 
-STD_LINK_PREREQUISITES =
+STD_LINK_PREREQUISITES = nrf5-sdk-check
 
 DEFINE_FLAGS = $(foreach def,$(STD_DEFINES) $(DEFINES),-D$(def))
 
@@ -159,6 +159,14 @@
 
 LINKER_SCRIPT_INC_DIRS = $(NRF5_SDK_ROOT)/modules/nrfx/mdk
 
+NRF5_SDK_VERSION_FILE = $(NRF5_SDK_ROOT)/documentation/release_notes.txt
+
+NRF5_SDK_TITLE = nRF5 SDK for Thread and Zigbee
+
+NRF5_SDK_VERSION_SED_EXP = /^${NRF5_SDK_TITLE} v[0-9.]+.*$$/ { s/.*v([0-9.]+).*/\1/; s/[.]/ /g; p; q }
+
+NRF5_SDK_MIN_VERSION = 3.0.0
+
 
 # ==================================================
 # Toolchain and external utilities / files
@@ -187,7 +195,9 @@
 
 NRFJPROG = $(NRF5_TOOLS_ROOT)/nrfjprog/nrfjprog
 
-SOFTDEVICE_IMAGE = $(NRF5_SDK_ROOT)/components/softdevice/s140/hex/s140_nrf52_6.1.0_softdevice.hex
+SOFTDEVICE_IMAGE_DIR = $(NRF5_SDK_ROOT)/components/softdevice/s140/hex
+
+SOFTDEVICE_IMAGE = $(wildcard $(SOFTDEVICE_IMAGE_DIR)/s140_nrf52_*_softdevice.hex)
 
 
 # ==================================================
@@ -250,7 +260,7 @@
 # General build rules
 # ==================================================
 
-.PHONY : $(APP) flash flash-app flash_app flash-softdevice flash_softdevice erase clean help
+.PHONY : $(APP) flash flash-app flash_app flash-softdevice flash_softdevice erase clean help nrf5-sdk-check
 
 # Convert executable to Intel hex format
 %.hex : %.out
@@ -258,6 +268,7 @@
 
 # Flash the SoftDevice
 flash-softdevice flash_softdevice :
+	@if test -z "$(SOFTDEVICE_IMAGE)"; then echo "SoftDevice image not found in $(SOFTDEVICE_IMAGE_DIR)"; false; fi
 	@echo "FLASH $(SOFTDEVICE_IMAGE)"
 	$(NO_ECHO)$(NRFJPROG) -f nrf52 --program $(SOFTDEVICE_IMAGE) --sectorerase
 	@echo "RESET DEVICE"
@@ -278,6 +289,28 @@
 help :
 	@echo "$${HelpText}"
 
+# Verify the nRF5 SDK is found and meets the required minimum version
+nrf5-sdk-check :
+	@test -d $(NRF5_SDK_ROOT) || { \
+	    echo "ENVIRONMENT ERROR: ${NRF5_SDK_TITLE} not found at $(NRF5_SDK_ROOT)"; \
+	    exit 1; \
+	}; \
+	test -f $(NRF5_SDK_VERSION_FILE) || { \
+	    echo "ENVIRONMENT ERROR: Version file for $(NRF5_SDK_TITLE) not found at $(NRF5_SDK_VERSION_FILE)"; \
+	    exit 1; \
+	}; \
+	SDK_VERSION=`sed -nE '$(NRF5_SDK_VERSION_SED_EXP)' $(NRF5_SDK_VERSION_FILE)`; \
+	test "$${SDK_VERSION}x" != "x" || { \
+	    echo "ENVIRONMENT ERROR: Unable to determine version of $(NRF5_SDK_TITLE) from $(NRF5_SDK_VERSION_FILE)"; \
+	    exit 1; \
+	}; \
+	MIN_VERSION=`echo $(NRF5_SDK_MIN_VERSION) | sed -E 's/\./ /g'`; \
+	HIGHEST_VERSION=`(echo $${SDK_VERSION}; echo $${MIN_VERSION}) | sort -r -n -k1 -k2 -k3 | head -1`; \
+	test "$${HIGHEST_VERSION}" = "$${SDK_VERSION}" || { \
+	    echo "ENVIRONMENT ERROR: Unsupported version of $(NRF5_SDK_TITLE); Please use $(NRF5_SDK_MIN_VERSION) or greater"; \
+	    exit 1; \
+	}	
+
 
 # ==================================================
 # Late-bound rules for building the application
diff --git a/build/nrf5/nrf5-openthread.mk b/build/nrf5/nrf5-openthread.mk
index 213b6f1..390c6b9 100644
--- a/build/nrf5/nrf5-openthread.mk
+++ b/build/nrf5/nrf5-openthread.mk
@@ -188,8 +188,8 @@
     -lopenthread-ftd \
     -lopenthread-platform-utils \
     -lopenthread-nrf52840-softdevice-sdk \
-    -lmbedcrypto \
-    -lnrf_cc310_0.9.10
+    -lnordicsemi-nrf52840-radio-driver-softdevice \
+    -lmbedcrypto
     
 # Add the appropriate OpenThread target as a prerequisite to all application
 # compilation targets to ensure that OpenThread gets built and its header
@@ -202,7 +202,8 @@
     $(OPENTHREAD_LIB_DIR)/libopenthread-ftd.a \
     $(OPENTHREAD_LIB_DIR)/libopenthread-platform-utils.a \
     $(OPENTHREAD_LIB_DIR)/libmbedcrypto.a \
-    $(OPENTHREAD_LIB_DIR)/libopenthread-nrf52840-softdevice-sdk.a
+    $(OPENTHREAD_LIB_DIR)/libopenthread-nrf52840-softdevice-sdk.a \
+    $(OPENTHREAD_LIB_DIR)/libnordicsemi-nrf52840-radio-driver-softdevice.a
 
 
 # ==================================================
diff --git a/src/adaptations/device-layer/include/Weave/DeviceLayer/OpenThread/GenericThreadStackManagerImpl_OpenThread_LwIP.ipp b/src/adaptations/device-layer/include/Weave/DeviceLayer/OpenThread/GenericThreadStackManagerImpl_OpenThread_LwIP.ipp
index bd7294d..082c1e8 100644
--- a/src/adaptations/device-layer/include/Weave/DeviceLayer/OpenThread/GenericThreadStackManagerImpl_OpenThread_LwIP.ipp
+++ b/src/adaptations/device-layer/include/Weave/DeviceLayer/OpenThread/GenericThreadStackManagerImpl_OpenThread_LwIP.ipp
@@ -315,6 +315,7 @@
     err_t lwipErr = ERR_OK;
     otError otErr;
     otMessage * pktMsg = NULL;
+    const otMessageSettings msgSettings = { true, OT_MESSAGE_PRIORITY_NORMAL };
     uint16_t remainingLen;
 
     // Lock the OpenThread stack.
@@ -322,7 +323,7 @@
     ThreadStackMgrImpl().LockThreadStack();
 
     // Allocate an OpenThread message
-    pktMsg = otIp6NewMessage(ThreadStackMgrImpl().OTInstance(), true);
+    pktMsg = otIp6NewMessage(ThreadStackMgrImpl().OTInstance(), &msgSettings);
     VerifyOrExit(pktMsg != NULL, lwipErr = ERR_MEM);
 
     // Copy data from LwIP's packet buffer chain into the OpenThread message.