diff --git a/ci-scripts/cls_module_ue.py b/ci-scripts/cls_module_ue.py
index e006eb6aae0b2e8593ee8ca2d27a42b2a2c1e40f..cabd0a045de63385c7a0cc159b2e536fe06f0855 100644
--- a/ci-scripts/cls_module_ue.py
+++ b/ci-scripts/cls_module_ue.py
@@ -76,7 +76,7 @@ class Module_UE:
 			logging.debug('Starting ' + self.Process['Name'])
 			mySSH = sshconnection.SSHConnection()
 			mySSH.open(self.HostIPAddress, self.HostUsername, self.HostPassword)
-			mySSH.command('echo $USER; echo ' + self.HostPassword + ' | nohup sudo -S ' + self.Process['Cmd'] + ' ' +  self.Process['Apn'][CNType]  + ' &','\$',5)
+			mySSH.command('echo $USER; echo ' + self.HostPassword + ' | nohup sudo -S ' + self.Process['Cmd'] + ' ' +  self.Process['Apn'][CNType]  + ' > /dev/null 2>&1 &','\$',5)
 			mySSH.close()
 			#checking the process
 			time.sleep(5)
@@ -165,7 +165,7 @@ class Module_UE:
 			#delete old artifacts
 			mySSH.command('echo ' + self.HostPassword + ' | sudo -S rm -rf ci_qlog','\$',5)
 			#start Trace, artifact is created in home dir
-			mySSH.command('echo $USER; nohup sudo -E QLog/QLog -s ci_qlog -f NR5G.cfg &','\$', 5)
+			mySSH.command('echo $USER; nohup sudo -E QLog/QLog -s ci_qlog -f NR5G.cfg > /dev/null 2>&1 &','\$', 5)
 			mySSH.close()
 
 	def DisableTrace(self):
@@ -192,7 +192,7 @@ class Module_UE:
 			source='ci_qlog'
 			destination= self.LogStore + '/ci_qlog_'+now_string+'.zip'
 			#qlog artifact is zipped into the target folder
-			mySSH.command('echo $USER; echo ' + self.HostPassword + ' | nohup sudo -S zip -r '+destination+' '+source+' &','\$', 10)
+			mySSH.command('echo $USER; echo ' + self.HostPassword + ' | nohup sudo -S zip -r '+destination+' '+source+' > /dev/null 2>&1 &','\$', 10)
 			mySSH.close()
 			#post action : log cleaning to make sure enough space is reserved for the next run
 			Log_Mgt=cls_log_mgt.Log_Mgt(self.HostUsername,self.HostIPAddress, self.HostPassword, self.LogStore)
diff --git a/ci-scripts/cls_physim1.py b/ci-scripts/cls_physim1.py
index 2052d98c2c89e483254a1a36bc0683183ba693e9..b7a730e91c483110ad78df5ce6d34646a2321b42 100644
--- a/ci-scripts/cls_physim1.py
+++ b/ci-scripts/cls_physim1.py
@@ -37,6 +37,7 @@ import html
 import os
 import re
 import time
+import subprocess
 import sys
 import constants as CONST
 import helpreadme as HELP
@@ -115,7 +116,7 @@ class PhySim:
 		else:
 			imageTag = "develop"
 		# Check if image is exist on the Red Hat server, before pushing it to OC cluster
-		mySSH.command("sudo podman image inspect --format='Size = {{.Size}} bytes' oai-physim:" + imageTag, '\$', 60)
+		mySSH.command('sudo podman image inspect --format="Size = {{.Size}} bytes" oai-physim:' + imageTag, '\$', 60)
 		if mySSH.getBefore().count('no such image') != 0:
 			logging.error('\u001B[1m No such image oai-physim\u001B[0m')
 			mySSH.close()
@@ -264,6 +265,23 @@ class PhySim:
 		for podName in podNames:
 			mySSH.command(f'oc logs {podName} >> cmake_targets/log/physim_test.txt 2>&1', '\$', 15, resync=True)
 		time.sleep(30)
+		mySSH.copyin(lIpAddr, lUserName, lPassWord, lSourcePath + '/cmake_targets/log/physim_test.txt', '.')
+		try:
+			listLogFiles =  subprocess.check_output('egrep --colour=never "Execution Log file|Linux oai-" physim_test.txt', shell=True, universal_newlines=True)
+			for line in listLogFiles.split('\n'):
+				res1 = re.search('Linux (?P<pod>oai-[a-zA-Z0-9\-]+) ', str(line))
+				res2 = re.search('Execution Log file = (?P<name>[a-zA-Z0-9\-\/\.\_]+)', str(line))
+				if res1 is not None:
+					podName = res1.group('pod')
+				if res2 is not None:
+					logFileInPod = res2.group('name')
+					folderName = re.sub('/opt/oai-physim/cmake_targets/autotests/log/', '', logFileInPod)
+					folderName = re.sub('/test.*', '', folderName)
+					fileName = re.sub('/opt/oai-physim/cmake_targets/autotests/log/' + folderName + '/', '', logFileInPod)
+					mySSH.command('mkdir -p cmake_targets/log/' + folderName, '\$', 5, silent=True)
+					mySSH.command('oc cp ' + podName + ':' + logFileInPod + ' cmake_targets/log/' + folderName + '/' + fileName, '\$', 20, silent=True)
+		except Exception as e:
+			pass
 
 		# UnDeploy the physical simulator pods
 		mySSH.command('helm uninstall physim | tee -a cmake_targets/log/physim_helm_summary.txt 2>&1', '\$', 6)
@@ -305,6 +323,7 @@ class PhySim:
 		mySSH.command('cd ' + lSourcePath + '/cmake_targets', '\$', 5)
 		mySSH.command('mkdir -p physim_test_log_' + self.testCase_id, '\$', 5)
 		mySSH.command('cp log/physim_* ' + 'physim_test_log_' + self.testCase_id, '\$', 5)
+		mySSH.command('tar cvf physim_test_log_' + self.testCase_id + '/physim_log.tar log/015*', '\$', 180)
 		if not os.path.exists(f'./physim_test_logs_{self.testCase_id}'):
 			os.mkdir(f'./physim_test_logs_{self.testCase_id}')
 		mySSH.copyin(lIpAddr, lUserName, lPassWord, lSourcePath + '/cmake_targets/physim_test_log_' + self.testCase_id + '/*', './physim_test_logs_' + self.testCase_id)
diff --git a/ci-scripts/epc.py b/ci-scripts/epc.py
index fdf77ba0070a479a57e8ec8b404b3a9180a7e397..0ae636e4f8766e4264459ec20cb612635617ce25 100644
--- a/ci-scripts/epc.py
+++ b/ci-scripts/epc.py
@@ -108,6 +108,14 @@ class EPCManagement():
 			logging.debug('Using the ltebox simulated HSS')
 			mySSH.command('if [ -d ' + self.SourceCodePath + '/scripts ]; then echo ' + self.Password + ' | sudo -S rm -Rf ' + self.SourceCodePath + '/scripts ; fi', '\$', 5)
 			mySSH.command('mkdir -p ' + self.SourceCodePath + '/scripts', '\$', 5)
+			result = re.search('hss_sim s6as diam_hss', mySSH.getBefore())
+			if result is not None:
+				mySSH.command('echo ' + self.Password + ' | sudo -S killall hss_sim', '\$', 5)
+			mySSH.command('ps aux | grep --colour=never xGw | grep -v grep', '\$', 5, silent=True)
+			result = re.search('root.*xGw', mySSH.getBefore())
+			if result is not None:
+				mySSH.command('cd /opt/ltebox/tools', '\$', 5)
+				mySSH.command('echo ' + self.Password + ' | sudo -S ./stop_ltebox', '\$', 5)
 			mySSH.command('cd /opt/hss_sim0609', '\$', 5)
 			mySSH.command('echo ' + self.Password + ' | sudo -S rm -f hss.log', '\$', 5)
 			mySSH.command('echo ' + self.Password + ' | sudo -S echo "Starting sudo session" && sudo su -c "screen -dm -S simulated_hss ./starthss"', '\$', 5)
@@ -420,6 +428,11 @@ class EPCManagement():
 			mySSH.command('cd scripts', '\$', 5)
 			time.sleep(1)
 			mySSH.command('echo ' + self.Password + ' | sudo -S screen -S simulated_hss -X quit', '\$', 5)
+			time.sleep(5)
+			mySSH.command('ps aux | grep --colour=never hss_sim | grep -v grep', '\$', 5, silent=True)
+			result = re.search('hss_sim s6as diam_hss', mySSH.getBefore())
+			if result is not None:
+				mySSH.command('echo ' + self.Password + ' | sudo -S killall hss_sim', '\$', 5)
 		else:
 			logging.error('This should not happen!')
 		mySSH.close()
@@ -446,6 +459,7 @@ class EPCManagement():
 		elif re.match('ltebox', self.Type, re.IGNORECASE):
 			mySSH.command('cd /opt/ltebox/tools', '\$', 5)
 			mySSH.command('echo ' + self.Password + ' | sudo -S ./stop_mme', '\$', 5)
+			time.sleep(5)
 		else:
 			logging.error('This should not happen!')
 		mySSH.close()
diff --git a/ci-scripts/ran.py b/ci-scripts/ran.py
index 27fc2726871b5cd483af8e8df2d9e160478e114c..90fece4381310445a5e0ec314a96e0ade6dbc35e 100644
--- a/ci-scripts/ran.py
+++ b/ci-scripts/ran.py
@@ -374,7 +374,7 @@ class RANManagement():
 				logging.debug('\u001B[1m Launching tshark on interface ' + eth_interface + '\u001B[0m')
 				pcapfile = pcapfile_prefix + self.testCase_id + '_log.pcap'
 				mySSH.command('echo ' + lPassWord + ' | sudo -S rm -f /tmp/' + pcapfile , '\$', 5)
-				mySSH.command('echo $USER; nohup sudo -E tshark  -i ' + eth_interface + ' -w /tmp/' + pcapfile + ' 2>&1 &','\$', 5)
+				mySSH.command('echo $USER; nohup sudo -E tshark  -i ' + eth_interface + ' -w /tmp/' + pcapfile + ' > /dev/null 2>&1 &','\$', 5)
 			mySSH.close()
 			
 
diff --git a/ci-scripts/xml_files/fr1_nsa_quectel.xml b/ci-scripts/xml_files/fr1_nsa_quectel.xml
index 2d0ff53525dcbe313e9b49296fdac105878f164d..ba1e478efcf795dd231c64317ece6d30fd59af11 100644
--- a/ci-scripts/xml_files/fr1_nsa_quectel.xml
+++ b/ci-scripts/xml_files/fr1_nsa_quectel.xml
@@ -73,7 +73,7 @@
 	<testCase id="040000">
 		<class>Initialize_eNB</class>
 		<desc>Initialize gNB</desc>
-		<Initialize_eNB_args>-O ci-scripts/conf_files/gnb.band78.tm1.fr1.106PRB.usrpb210.conf -E -q</Initialize_eNB_args>
+		<Initialize_eNB_args>-O ci-scripts/conf_files/gnb.band78.tm1.fr1.106PRB.usrpb210.conf -E -q --usrp-args "serial=30C51D4"</Initialize_eNB_args>
 		<eNB_instance>1</eNB_instance>
 		<eNB_serverId>1</eNB_serverId>
 		<air_interface>nr</air_interface>
diff --git a/ci-scripts/yaml_files/nsa_b200_gnb/docker-compose.yml b/ci-scripts/yaml_files/nsa_b200_gnb/docker-compose.yml
index 692f830e5dd649a28f75d0b1648a983ca891b452..c00cf0d2c224ca5455e1d000b7c874a0854c10ee 100644
--- a/ci-scripts/yaml_files/nsa_b200_gnb/docker-compose.yml
+++ b/ci-scripts/yaml_files/nsa_b200_gnb/docker-compose.yml
@@ -26,7 +26,7 @@ services:
             FLEXRAN_INTERFACE_NAME: eth0
             FLEXRAN_IPV4_ADDRESS: 192.168.18.210
             THREAD_PARALLEL_CONFIG: PARALLEL_RU_L1_TRX_SPLIT
-            USE_ADDITIONAL_OPTIONS: '-E -q'
+            USE_ADDITIONAL_OPTIONS: '-E -q --usrp-args "serial=30C51D4"'
         volumes:
             - /dev:/dev
         networks:
diff --git a/cmake_targets/CMakeLists.txt b/cmake_targets/CMakeLists.txt
index 67f65b6848f2a039887de36bcf5a59e79be8d95b..6e960cce232153f1c3209c366bd2794302894ae8 100644
--- a/cmake_targets/CMakeLists.txt
+++ b/cmake_targets/CMakeLists.txt
@@ -60,6 +60,13 @@ elseif (${RF_BOARD} STREQUAL "OAI_IRIS")
     LINK_DIRECTORIES("/usr/local/lib")
     set(option_HW_lib "-lSoapySDR -rdynamic -ldl")
 
+elseif (${RF_BOARD} STREQUAL "OAI_AW2SORI")
+    include_directories("${OPENAIR_TARGETS}/ARCH/AW2SORI")
+    set(HW_SOURCE ${HW_SOURCE}
+	    ${OPENAIR_TARGETS}/ARCH/AW2SORI/ARCH/AW2SORI/oaiori.c)
+    LINK_DIRECTORIES("/usr/local/lib")
+    set(openair_HW_lib "-shared -fPIC -msse4 -g -ggdb -lori")
+
 endif (${RF_BOARD} STREQUAL "OAI_USRP")
 
 message("RU=${RU}")
@@ -894,6 +901,7 @@ add_library(oai_lmssdrdevif MODULE ${HWLIB_LMSSDR_SOURCE} )
 target_include_directories(oai_lmssdrdevif PRIVATE /usr/local/include/lime)
 target_link_libraries(oai_lmssdrdevif LimeSuite )
 
+
 include_directories("${OPENAIR_TARGETS}/ARCH/ETHERNET/USERSPACE/LIB/")
 set(TPLIB_ETHERNET_SOURCE
   ${OPENAIR_TARGETS}/ARCH/ETHERNET/USERSPACE/LIB/ethernet_lib.c
@@ -902,6 +910,15 @@ set(TPLIB_ETHERNET_SOURCE
   )
 add_library(oai_eth_transpro MODULE ${TPLIB_ETHERNET_SOURCE} )
 
+include_directories("${OPENAIR_TARGETS}/ARCH/AW2SORI/")
+link_directories("/usr/local/lib")
+set(HWLIB_AW2SORI_SOURCE
+  ${OPENAIR_TARGETS}/ARCH/AW2SORI/oaiori.c
+  )
+add_library(aw2sori_transpro MODULE ${HWLIB_AW2SORI_SOURCE})
+target_compile_options(aw2sori_transpro PRIVATE -shared -fPIC -msse4 -g -ggdb -DLITE_COMPILATION)
+target_link_libraries(aw2sori_transpro libori.so)
+
 include_directories("${OPENAIR_TARGETS}/ARCH/IRIS/USERSPACE/LIB/")
 set(option_HWIRISLIB_lib "-l SoapySDR")
 set(HWLIB_IRIS_SOURCE
diff --git a/cmake_targets/build_oai b/cmake_targets/build_oai
index c68ca8a553f2ad94987c28f969159dd639f44eae..5c833c502a9c03e4a2dd2ccd09e4f45f06982e0d 100755
--- a/cmake_targets/build_oai
+++ b/cmake_targets/build_oai
@@ -118,7 +118,7 @@ Options
 -a | --agent
    Enables agent for software-defined control of the eNB
 -w | --hardware
-   EXMIMO, USRP, BLADERF, LMSSDR, IRIS, ADRV9371_ZC706, SIMU, None (Default)
+   EXMIMO, USRP, BLADERF, LMSSDR, IRIS, ADRV9371_ZC706, SIMU, AW2SORI, None (Default)
    Adds this RF board support (in external packages installation and in compilation)
 -P | --phy_simulators
    Makes the unitary tests Layer 1 simulators
@@ -293,7 +293,7 @@ function main() {
                 "EXMIMO")
                     HW="EXMIMO"
                     ;;
-                "USRP" | "BLADERF" | "LMSSDR" | "IRIS" | "ADRV9371_ZC706" | "SIMU")
+                "USRP" | "BLADERF" | "LMSSDR" | "IRIS" | "ADRV9371_ZC706" | "SIMU" | "AW2SORI")
                     HW="OAI_"$2
                     ;;
                 "None")
@@ -931,6 +931,14 @@ function main() {
                   echo_error "== FAILED == Unexpected Kernel $SYRIQ_KMAJ.$SYRIQ_KMIN"
               fi
               echo_info "liboai_device.so is linked to ADRV9371_ZC706 device library for Kernel $SYRIQ_KMAJ.$SYRIQ_KMIN"
+          elif [ "$HW" == "OAI_AW2SORI" ] ; then
+	      compilations \
+		  $build_dir aw2sori_transpro \
+                  libaw2sori_transpro.so $dbin/libaw2sori_transpro.so.$REL 
+
+              ln -sf libaw2sori_transpro.so libthirdparty_transpro.so
+              ln -sf $dbin/libaw2sori_transpro.so.$REL $dbin/libaw2sori_transpro.so
+              echo_info "build libthirdparty_transpro.so for AW2SORI fronthaul"
           else
               echo_info "liboai_device.so is not linked to any device library"
           fi
diff --git a/nfapi/open-nFAPI/common/src/debug.c b/nfapi/open-nFAPI/common/src/debug.c
index a45d41d7d7218f806869f6fda7dd9c628b893d9a..5d4ad8a19499ed32ccdffb223a28f5f22dc741ac 100644
--- a/nfapi/open-nFAPI/common/src/debug.c
+++ b/nfapi/open-nFAPI/common/src/debug.c
@@ -1,76 +1,75 @@
-/*
- * Copyright 2017 Cisco Systems, Inc.
- * 
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- * 
- * http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-
-#include <stdio.h>
-#include <stdarg.h>
-#include <stdint.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-#include <errno.h>
-#include <sys/time.h>
-#include <sys/types.h>
-#include <pthread.h>
-#include <syslog.h>
-
-#include <debug.h>
-
-#define MAX_MSG_LENGTH 			2096
-#define TRACE_HEADER_LENGTH		44
-
-void nfapi_trace_dbg(nfapi_trace_level_t level, const char *format, ...);
-
-// initialize the trace function to 0
-void (*nfapi_trace_g)(nfapi_trace_level_t level, const char* format, ...) = &nfapi_trace_dbg;
-
-nfapi_trace_level_t nfapi_trace_level_g = NFAPI_TRACE_INFO;
-//nfapi_trace_level_t nfapi_trace_level_g = NFAPI_TRACE_WARN;
-
-void nfapi_set_trace_level(nfapi_trace_level_t new_level)
-{
-	nfapi_trace_level_g = new_level;
-}
-
-void nfapi_trace_dbg(nfapi_trace_level_t level, const char *format, ...)
-{
-	char trace_buff[MAX_MSG_LENGTH + TRACE_HEADER_LENGTH];
-	uint32_t num_chars;
-	va_list p_args;
-	struct timeval tv;
-	pthread_t tid = pthread_self();
-
-	(void)gettimeofday(&tv, NULL);
-
-	num_chars = (uint32_t)snprintf(trace_buff, TRACE_HEADER_LENGTH, "%04u.%06u: 0x%02x: %10u: ", ((uint32_t)tv.tv_sec) & 0x1FFF, (uint32_t)tv.tv_usec, (uint32_t)level, (uint32_t)tid);
-
-	if (num_chars > TRACE_HEADER_LENGTH)
-	{
-		printf("trace_dbg: Error, num_chars is too large: %d", num_chars);
-		return;
-	}
-
-	va_start(p_args, format);
-	if ((num_chars = (uint32_t)vsnprintf(&trace_buff[num_chars], MAX_MSG_LENGTH, format, p_args)))
-	{
-		if (level <= NFAPI_TRACE_WARN)
-		{
-			printf("%s", trace_buff);
-		}
-		printf("%s", trace_buff);
-	}
-	va_end(p_args);
-}
+/*
+ * Copyright 2017 Cisco Systems, Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <stdio.h>
+#include <stdarg.h>
+#include <stdint.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+#include <errno.h>
+#include <sys/time.h>
+#include <sys/types.h>
+#include <pthread.h>
+#include <syslog.h>
+
+#include <debug.h>
+
+#define MAX_MSG_LENGTH 			2096
+#define TRACE_HEADER_LENGTH		44
+
+void nfapi_trace_dbg(nfapi_trace_level_t level, const char *format, ...);
+
+// initialize the trace function to 0
+void (*nfapi_trace_g)(nfapi_trace_level_t level, const char* format, ...) = &nfapi_trace_dbg;
+
+nfapi_trace_level_t nfapi_trace_level_g = NFAPI_TRACE_INFO;
+//nfapi_trace_level_t nfapi_trace_level_g = NFAPI_TRACE_WARN;
+
+void nfapi_set_trace_level(nfapi_trace_level_t new_level)
+{
+	nfapi_trace_level_g = new_level;
+}
+
+void nfapi_trace_dbg(nfapi_trace_level_t level, const char *format, ...)
+{
+	char trace_buff[MAX_MSG_LENGTH + TRACE_HEADER_LENGTH];
+	uint32_t num_chars;
+	va_list p_args;
+	struct timeval tv;
+	pthread_t tid = pthread_self();
+
+	(void)gettimeofday(&tv, NULL);
+
+	num_chars = (uint32_t)snprintf(trace_buff, TRACE_HEADER_LENGTH, "%04u.%06u: 0x%02x: %10u: ", ((uint32_t)tv.tv_sec) & 0x1FFF, (uint32_t)tv.tv_usec, (uint32_t)level, (uint32_t)tid);
+
+	if (num_chars > TRACE_HEADER_LENGTH)
+	{
+		printf("trace_dbg: Error, num_chars is too large: %d", num_chars);
+		return;
+	}
+
+	va_start(p_args, format);
+	if ((num_chars = (uint32_t)vsnprintf(&trace_buff[num_chars], MAX_MSG_LENGTH, format, p_args)))
+	{
+		if (level <= NFAPI_TRACE_WARN)
+		{
+			printf("%s", trace_buff);
+		}
+		printf("%s", trace_buff);
+	}
+	va_end(p_args);
+}
diff --git a/nfapi/open-nFAPI/nfapi/src/nfapi_p5.c b/nfapi/open-nFAPI/nfapi/src/nfapi_p5.c
index 23d19482ea6bd45a8048a684b24c310e031a22ff..3a6d807bdd08c06c1fe707f092df8a40b2d3a907 100644
--- a/nfapi/open-nFAPI/nfapi/src/nfapi_p5.c
+++ b/nfapi/open-nFAPI/nfapi/src/nfapi_p5.c
@@ -1,2389 +1,2388 @@
-/*
- * Copyright 2017 Cisco Systems, Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-
-#include <signal.h>
-#include <sys/time.h>
-#include <sys/socket.h>
-#include <sys/types.h>
-#include <netinet/in.h>
-#include <arpa/inet.h>
-#include <sched.h>
-#include <time.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-#include <errno.h>
-#include <pthread.h>
-#include <stdint.h>
-
-#include <nfapi_interface.h>
-#include <nfapi.h>
-#include "nfapi_nr_interface.h"
-#include "nfapi_nr_interface_scf.h"
-#include <debug.h>
-
-
-// Pack routines
-//TODO: Add pacl/unpack fns for uint32 and uint64
-static uint8_t pack_nr_pnf_param_request(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p4_p5_codec_config_t *config) {
-  nfapi_nr_pnf_param_request_t *request = (nfapi_nr_pnf_param_request_t *)msg;
-  return pack_vendor_extension_tlv(request->vendor_extension, ppWritePackedMsg, end, config);
-}
-
-static uint8_t pack_pnf_param_request(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p4_p5_codec_config_t *config) {
-  nfapi_pnf_param_request_t *request = (nfapi_pnf_param_request_t *)msg;
-  return pack_vendor_extension_tlv(request->vendor_extension, ppWritePackedMsg, end, config);
-}
-
-static uint8_t pack_pnf_param_general_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
-  nfapi_pnf_param_general_t *value = (nfapi_pnf_param_general_t *)tlv;
-  return ( push8(value->nfapi_sync_mode, ppWritePackedMsg, end) &&
-           push8(value->location_mode, ppWritePackedMsg, end) &&
-           push16(value->location_coordinates_length, ppWritePackedMsg, end) &&
-           pusharray8(value->location_coordinates, NFAPI_PNF_PARAM_GENERAL_LOCATION_LENGTH, value->location_coordinates_length, ppWritePackedMsg, end) &&
-           push32(value->dl_config_timing, ppWritePackedMsg, end) &&
-           push32(value->tx_timing, ppWritePackedMsg, end) &&
-           push32(value->ul_config_timing, ppWritePackedMsg, end) &&
-           push32(value->hi_dci0_timing, ppWritePackedMsg, end) &&
-           push16(value->maximum_number_phys, ppWritePackedMsg, end) &&
-           push16(value->maximum_total_bandwidth, ppWritePackedMsg, end) &&
-           push8(value->maximum_total_number_dl_layers, ppWritePackedMsg, end) &&
-           push8(value->maximum_total_number_ul_layers, ppWritePackedMsg, end) &&
-           push8(value->shared_bands, ppWritePackedMsg, end) &&
-           push8(value->shared_pa, ppWritePackedMsg, end) &&
-           pushs16(value->maximum_total_power, ppWritePackedMsg, end) &&
-           pusharray8(value->oui, NFAPI_PNF_PARAM_GENERAL_OUI_LENGTH, NFAPI_PNF_PARAM_GENERAL_OUI_LENGTH, ppWritePackedMsg, end));
-}
-
-static uint8_t pack_rf_config_info(void *elem, uint8_t **ppWritePackedMsg, uint8_t *end) {
-  nfapi_rf_config_info_t *rf = (nfapi_rf_config_info_t *)elem;
-  return (push16(rf->rf_config_index, ppWritePackedMsg, end));
-}
-
-
-static uint8_t pack_pnf_phy_info(void *elem, uint8_t **ppWritePackedMsg, uint8_t *end) {
-  nfapi_pnf_phy_info_t *phy = (nfapi_pnf_phy_info_t *)elem;
-  return (  push16(phy->phy_config_index, ppWritePackedMsg, end) &&
-            push16(phy->number_of_rfs, ppWritePackedMsg, end) &&
-            packarray(phy->rf_config, sizeof(nfapi_rf_config_info_t), NFAPI_MAX_PNF_PHY_RF_CONFIG, phy->number_of_rfs, ppWritePackedMsg, end, &pack_rf_config_info) &&
-            push16(phy->number_of_rf_exclusions, ppWritePackedMsg, end) &&
-            packarray(phy->excluded_rf_config, sizeof(nfapi_rf_config_info_t), NFAPI_MAX_PNF_PHY_RF_CONFIG, phy->number_of_rf_exclusions, ppWritePackedMsg, end, &pack_rf_config_info) &&
-            push16(phy->downlink_channel_bandwidth_supported, ppWritePackedMsg, end) &&
-            push16(phy->uplink_channel_bandwidth_supported, ppWritePackedMsg, end) &&
-            push8(phy->number_of_dl_layers_supported, ppWritePackedMsg, end) &&
-            push8(phy->number_of_ul_layers_supported, ppWritePackedMsg, end) &&
-            push16(phy->maximum_3gpp_release_supported, ppWritePackedMsg, end) &&
-            push8(phy->nmm_modes_supported, ppWritePackedMsg, end));
-}
-
-static uint8_t pack_pnf_phy_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
-  nfapi_pnf_phy_t *value = (nfapi_pnf_phy_t *)tlv;
-  return ( push16(value->number_of_phys, ppWritePackedMsg, end) &&
-           packarray(value->phy, sizeof(nfapi_pnf_phy_info_t), NFAPI_MAX_PNF_PHY, value->number_of_phys, ppWritePackedMsg, end, &pack_pnf_phy_info));
-}
-
-static uint8_t pack_pnf_rf_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
-  nfapi_pnf_rf_t *value = (nfapi_pnf_rf_t *)tlv;
-  uint16_t rf_index = 0;
-
-  if(push16(value->number_of_rfs, ppWritePackedMsg, end) == 0)
-    return 0;
-
-  for(; rf_index < value->number_of_rfs; ++rf_index) {
-    if( !(push16(value->rf[rf_index].rf_config_index, ppWritePackedMsg, end) &&
-          push16(value->rf[rf_index].band, ppWritePackedMsg, end) &&
-          pushs16(value->rf[rf_index].maximum_transmit_power, ppWritePackedMsg, end) &&
-          pushs16(value->rf[rf_index].minimum_transmit_power, ppWritePackedMsg, end) &&
-          push8(value->rf[rf_index].number_of_antennas_suppported, ppWritePackedMsg, end) &&
-          push32(value->rf[rf_index].minimum_downlink_frequency, ppWritePackedMsg, end) &&
-          push32(value->rf[rf_index].maximum_downlink_frequency, ppWritePackedMsg, end) &&
-          push32(value->rf[rf_index].minimum_uplink_frequency, ppWritePackedMsg, end) &&
-          push32(value->rf[rf_index].maximum_uplink_frequency, ppWritePackedMsg, end)))
-      return 0;
-  }
-
-  return 1;
-}
-static uint8_t pack_pnf_phy_rel10_info(void *elem, uint8_t **ppWritePackedMsg, uint8_t *end) {
-  nfapi_pnf_phy_rel10_info_t *phy = (nfapi_pnf_phy_rel10_info_t *)elem;
-  return(push16(phy->phy_config_index, ppWritePackedMsg, end) &&
-         push16(phy->transmission_mode_7_supported, ppWritePackedMsg, end) &&
-         push16(phy->transmission_mode_8_supported, ppWritePackedMsg, end) &&
-         push16(phy->two_antenna_ports_for_pucch, ppWritePackedMsg, end) &&
-         push16(phy->transmission_mode_9_supported, ppWritePackedMsg, end) &&
-         push16(phy->simultaneous_pucch_pusch, ppWritePackedMsg, end) &&
-         push16(phy->four_layer_tx_with_tm3_and_tm4, ppWritePackedMsg, end));
-}
-
-static uint8_t pack_pnf_phy_rel10_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
-  nfapi_pnf_phy_rel10_t *value = (nfapi_pnf_phy_rel10_t *)tlv;
-  return (push16(value->number_of_phys, ppWritePackedMsg, end) &&
-          packarray(value->phy, sizeof(nfapi_pnf_phy_rel10_info_t), NFAPI_MAX_PNF_PHY, value->number_of_phys, ppWritePackedMsg, end, &pack_pnf_phy_rel10_info));
-}
-
-static uint8_t pack_pnf_phy_rel11_info(void *elem, uint8_t **ppWritePackedMsg, uint8_t *end) {
-  nfapi_pnf_phy_rel11_info_t *phy = (nfapi_pnf_phy_rel11_info_t *)elem;
-  return (push16(phy->phy_config_index, ppWritePackedMsg, end) &&
-          push16(phy->edpcch_supported, ppWritePackedMsg, end) &&
-          push16(phy->multi_ack_csi_reporting, ppWritePackedMsg, end) &&
-          push16(phy->pucch_tx_diversity, ppWritePackedMsg, end) &&
-          push16(phy->ul_comp_supported, ppWritePackedMsg, end) &&
-          push16(phy->transmission_mode_5_supported, ppWritePackedMsg, end ));
-}
-static uint8_t pack_pnf_phy_rel11_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
-  nfapi_pnf_phy_rel11_t *value = (nfapi_pnf_phy_rel11_t *)tlv;
-  return (push16(value->number_of_phys, ppWritePackedMsg, end) &&
-          packarray(value->phy, sizeof(nfapi_pnf_phy_rel11_info_t), NFAPI_MAX_PNF_PHY, value->number_of_phys, ppWritePackedMsg, end, &pack_pnf_phy_rel11_info));
-}
-static uint8_t pack_pnf_phy_rel12_info(void *elem, uint8_t **ppWritePackedMsg, uint8_t *end) {
-  nfapi_pnf_phy_rel12_info_t *phy = (nfapi_pnf_phy_rel12_info_t *)elem;
-  return( push16(phy->phy_config_index, ppWritePackedMsg, end) &&
-          push16(phy->csi_subframe_set, ppWritePackedMsg, end) &&
-          push16(phy->enhanced_4tx_codebook, ppWritePackedMsg, end) &&
-          push16(phy->drs_supported, ppWritePackedMsg, end) &&
-          push16(phy->ul_64qam_supported, ppWritePackedMsg, end) &&
-          push16(phy->transmission_mode_10_supported, ppWritePackedMsg, end) &&
-          push16(phy->alternative_bts_indices, ppWritePackedMsg, end));
-}
-static uint8_t pack_pnf_phy_rel12_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
-  nfapi_pnf_phy_rel12_t *value = (nfapi_pnf_phy_rel12_t *)tlv;
-  return (push16(value->number_of_phys, ppWritePackedMsg, end) &&
-          packarray(value->phy, sizeof(nfapi_pnf_phy_rel12_info_t), NFAPI_MAX_PNF_PHY, value->number_of_phys, ppWritePackedMsg, end, &pack_pnf_phy_rel12_info));
-}
-
-static uint8_t pack_pnf_phy_rel13_info(void *elem, uint8_t **ppWritePackedMsg, uint8_t *end) {
-  nfapi_pnf_phy_rel13_info_t *phy = (nfapi_pnf_phy_rel13_info_t *)elem;
-  return( push16(phy->phy_config_index, ppWritePackedMsg, end) &&
-          push16(phy->pucch_format4_supported, ppWritePackedMsg, end) &&
-          push16(phy->pucch_format5_supported, ppWritePackedMsg, end) &&
-          push16(phy->more_than_5_ca_support, ppWritePackedMsg, end) &&
-          push16(phy->laa_supported, ppWritePackedMsg, end) &&
-          push16(phy->laa_ending_in_dwpts_supported, ppWritePackedMsg, end) &&
-          push16(phy->laa_starting_in_second_slot_supported, ppWritePackedMsg, end) &&
-          push16(phy->beamforming_supported, ppWritePackedMsg, end) &&
-          push16(phy->csi_rs_enhancement_supported, ppWritePackedMsg, end) &&
-          push16(phy->drms_enhancement_supported, ppWritePackedMsg, end) &&
-          push16(phy->srs_enhancement_supported, ppWritePackedMsg, end) );
-}
-
-static uint8_t pack_pnf_phy_rel13_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
-  nfapi_pnf_phy_rel13_t *value = (nfapi_pnf_phy_rel13_t *)tlv;
-  return (push16(value->number_of_phys, ppWritePackedMsg, end) &&
-          packarray(value->phy, sizeof(nfapi_pnf_phy_rel13_info_t), NFAPI_MAX_PNF_PHY, value->number_of_phys, ppWritePackedMsg, end, &pack_pnf_phy_rel13_info));
-}
-
-static uint8_t pack_pnf_phy_rel13_nb_iot_info(void *elem, uint8_t **ppWritePackedMsg, uint8_t *end) {
-  nfapi_pnf_phy_rel13_nb_iot_info_t *phy = (nfapi_pnf_phy_rel13_nb_iot_info_t *)elem;
-  return( push16(phy->phy_config_index, ppWritePackedMsg, end) &&
-          push16(phy->number_of_rfs, ppWritePackedMsg, end) &&
-          packarray(phy->rf_config, sizeof(nfapi_rf_config_info_t), NFAPI_MAX_PNF_PHY_RF_CONFIG, phy->number_of_rfs, ppWritePackedMsg, end, &pack_rf_config_info) &&
-          push16(phy->number_of_rf_exclusions, ppWritePackedMsg, end) &&
-          packarray(phy->excluded_rf_config, sizeof(nfapi_rf_config_info_t), NFAPI_MAX_PNF_PHY_RF_CONFIG, phy->number_of_rf_exclusions, ppWritePackedMsg, end, &pack_rf_config_info) &&
-          push8(phy->number_of_dl_layers_supported, ppWritePackedMsg, end) &&
-          push8(phy->number_of_ul_layers_supported, ppWritePackedMsg, end) &&
-          push16(phy->maximum_3gpp_release_supported, ppWritePackedMsg, end) &&
-          push8(phy->nmm_modes_supported, ppWritePackedMsg, end));
-}
-
-static uint8_t pack_pnf_phy_rel13_nb_iot_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
-  nfapi_pnf_phy_rel13_nb_iot_t *value = (nfapi_pnf_phy_rel13_nb_iot_t *)tlv;
-  return (push16(value->number_of_phys, ppWritePackedMsg, end) &&
-          packarray(value->phy, sizeof(nfapi_pnf_phy_rel13_nb_iot_info_t), NFAPI_MAX_PNF_PHY, value->number_of_phys, ppWritePackedMsg, end, &pack_pnf_phy_rel13_nb_iot_info));
-}
-/*
-static uint8_t pack_nr_pnf_param_response(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p4_p5_codec_config_t* config)
-{
-  nfapi_nr_pnf_param_response_t *pNfapiMsg = (nfapi_nr_pnf_param_response_t*)msg;
-
-  return (push32(pNfapiMsg->error_code, ppWritePackedMsg, end) &&
-      pack_tlv(NFAPI_PNF_PARAM_GENERAL_TAG, &pNfapiMsg->pnf_param_general, ppWritePackedMsg, end, &pack_pnf_param_general_value) &&
-      pack_tlv(NFAPI_PNF_PHY_TAG, &pNfapiMsg->pnf_phy, ppWritePackedMsg, end, &pack_pnf_phy_value) &&
-      pack_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config));
-}
-*/
-static uint8_t pack_nr_pnf_param_response(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p4_p5_codec_config_t *config) {
-  nfapi_nr_pnf_param_response_t *pNfapiMsg = (nfapi_nr_pnf_param_response_t *)msg;
-  return (push32(pNfapiMsg->error_code, ppWritePackedMsg, end) &&
-          pack_tlv(NFAPI_PNF_PARAM_GENERAL_TAG, &pNfapiMsg->pnf_param_general, ppWritePackedMsg, end, &pack_pnf_param_general_value) &&
-          pack_tlv(NFAPI_PNF_PHY_TAG, &pNfapiMsg->pnf_phy, ppWritePackedMsg, end, &pack_pnf_phy_value) &&
-          pack_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config));
-}
-
-
-static uint8_t pack_pnf_param_response(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p4_p5_codec_config_t *config) {
-  nfapi_pnf_param_response_t *pNfapiMsg = (nfapi_pnf_param_response_t *)msg;
-  return (push32(pNfapiMsg->error_code, ppWritePackedMsg, end) &&
-          pack_tlv(NFAPI_PNF_PARAM_GENERAL_TAG, &pNfapiMsg->pnf_param_general, ppWritePackedMsg, end, &pack_pnf_param_general_value) &&
-          pack_tlv(NFAPI_PNF_PHY_TAG, &pNfapiMsg->pnf_phy, ppWritePackedMsg, end, &pack_pnf_phy_value) &&
-          pack_tlv(NFAPI_PNF_RF_TAG, &pNfapiMsg->pnf_rf, ppWritePackedMsg, end, &pack_pnf_rf_value) &&
-          pack_tlv(NFAPI_PNF_PHY_REL10_TAG, &pNfapiMsg->pnf_phy_rel10, ppWritePackedMsg, end, &pack_pnf_phy_rel10_value) &&
-          pack_tlv(NFAPI_PNF_PHY_REL11_TAG, &pNfapiMsg->pnf_phy_rel11, ppWritePackedMsg, end, &pack_pnf_phy_rel11_value) &&
-          pack_tlv(NFAPI_PNF_PHY_REL12_TAG, &pNfapiMsg->pnf_phy_rel12, ppWritePackedMsg, end, &pack_pnf_phy_rel12_value) &&
-          pack_tlv(NFAPI_PNF_PHY_REL13_TAG, &pNfapiMsg->pnf_phy_rel13, ppWritePackedMsg, end, &pack_pnf_phy_rel13_value) &&
-          pack_tlv(NFAPI_PNF_PHY_REL13_NB_IOT_TAG, &pNfapiMsg->pnf_phy_rel13_nb_iot, ppWritePackedMsg, end, &pack_pnf_phy_rel13_nb_iot_value) &&
-          pack_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config));
-}
-
-
-static uint8_t pack_phy_rf_config_info(void *elem, uint8_t **ppWritePackedMsg, uint8_t *end) {
-  nfapi_phy_rf_config_info_t *rf = (nfapi_phy_rf_config_info_t *)elem;
-  return (push16(rf->phy_id, ppWritePackedMsg, end) &&
-          push16(rf->phy_config_index, ppWritePackedMsg, end) &&
-          push16(rf->rf_config_index, ppWritePackedMsg, end));
-}
-
-
-static uint8_t pack_pnf_phy_rf_config_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
-  nfapi_pnf_phy_rf_config_t *value = (nfapi_pnf_phy_rf_config_t *)tlv;
-  return(push16(value->number_phy_rf_config_info, ppWritePackedMsg, end) &&
-         packarray(value->phy_rf_config, sizeof(nfapi_phy_rf_config_info_t), NFAPI_MAX_PHY_RF_INSTANCES, value->number_phy_rf_config_info, ppWritePackedMsg, end, &pack_phy_rf_config_info));
-}
-
-static uint8_t pack_nr_pnf_config_request(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p4_p5_codec_config_t *config) {
-  nfapi_nr_pnf_config_request_t *pNfapiMsg = (nfapi_nr_pnf_config_request_t *)msg;
-  return (pack_tlv(NFAPI_PNF_PHY_RF_TAG, &pNfapiMsg->pnf_phy_rf_config, ppWritePackedMsg, end, &pack_pnf_phy_rf_config_value) &&
-          //push8(pNfapiMsg->num_tlvs,ppWritePackedMsg,end) &&
-          pack_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config));
-}
-
-static uint8_t pack_pnf_config_request(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p4_p5_codec_config_t *config) {
-  nfapi_pnf_config_request_t *pNfapiMsg = (nfapi_pnf_config_request_t *)msg;
-  return (pack_tlv(NFAPI_PNF_PHY_RF_TAG, &pNfapiMsg->pnf_phy_rf_config, ppWritePackedMsg, end, &pack_pnf_phy_rf_config_value) &&
-          push8(pNfapiMsg->num_tlvs,ppWritePackedMsg,end) &&
-          pack_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config));
-}
-
-
-static uint8_t pack_nr_pnf_config_response(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p4_p5_codec_config_t *config) {
-  nfapi_nr_pnf_config_response_t *pNfapiMsg = (nfapi_nr_pnf_config_response_t *)msg;
-  return ( push32(pNfapiMsg->error_code, ppWritePackedMsg, end) &&
-           pack_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config));
-}
-
-
-static uint8_t pack_pnf_config_response(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p4_p5_codec_config_t *config) {
-  nfapi_pnf_config_response_t *pNfapiMsg = (nfapi_pnf_config_response_t *)msg;
-  return ( push32(pNfapiMsg->error_code, ppWritePackedMsg, end) &&
-           pack_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config));
-}
-
-static uint8_t pack_nr_pnf_start_request(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p4_p5_codec_config_t *config) {
-  nfapi_nr_pnf_start_request_t *pNfapiMsg = (nfapi_nr_pnf_start_request_t *)msg;
-  return ( pack_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config));
-}
-
-static uint8_t pack_pnf_start_request(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p4_p5_codec_config_t *config) {
-  nfapi_pnf_start_request_t *pNfapiMsg = (nfapi_pnf_start_request_t *)msg;
-  return ( pack_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config));
-}
-
-
-static uint8_t pack_nr_pnf_start_response(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p4_p5_codec_config_t *config) {
-  nfapi_nr_pnf_start_response_t *pNfapiMsg = (nfapi_nr_pnf_start_response_t *)msg;
-  return( push32(pNfapiMsg->error_code, ppWritePackedMsg, end) &&
-          pack_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config));
-}
-
-
-static uint8_t pack_pnf_start_response(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p4_p5_codec_config_t *config) {
-  nfapi_pnf_start_response_t *pNfapiMsg = (nfapi_pnf_start_response_t *)msg;
-  return( push32(pNfapiMsg->error_code, ppWritePackedMsg, end) &&
-          pack_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config));
-}
-
-
-static uint8_t pack_nr_pnf_stop_request(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p4_p5_codec_config_t *config) {
-  nfapi_nr_pnf_stop_request_t *pNfapiMsg = (nfapi_nr_pnf_stop_request_t *)msg;
-  return ( pack_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config) );
-}
-
-
-
-static uint8_t pack_pnf_stop_request(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p4_p5_codec_config_t *config) {
-  nfapi_pnf_stop_request_t *pNfapiMsg = (nfapi_pnf_stop_request_t *)msg;
-  return ( pack_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config) );
-}
-
-
-static uint8_t pack_nr_pnf_stop_response(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p4_p5_codec_config_t *config) {
-  nfapi_nr_pnf_stop_response_t *pNfapiMsg = (nfapi_nr_pnf_stop_response_t *)msg;
-  return ( push32(pNfapiMsg->error_code, ppWritePackedMsg, end) &&
-           pack_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config));
-}
-
-
-static uint8_t pack_pnf_stop_response(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p4_p5_codec_config_t *config) {
-  nfapi_pnf_stop_response_t *pNfapiMsg = (nfapi_pnf_stop_response_t *)msg;
-  return ( push32(pNfapiMsg->error_code, ppWritePackedMsg, end) &&
-           pack_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config));
-}
-
-static uint8_t pack_nr_param_request(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p4_p5_codec_config_t *config) {
-  nfapi_nr_param_request_scf_t *pNfapiMsg = (nfapi_nr_param_request_scf_t *)msg;
-  return (pack_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config));
-}
-
-static uint8_t pack_param_request(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p4_p5_codec_config_t *config) {
-  nfapi_param_request_t *pNfapiMsg = (nfapi_param_request_t *)msg;
-  return (pack_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config));
-}
-
-static uint8_t pack_uint32_tlv_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
-  nfapi_uint32_tlv_t *value = (nfapi_uint32_tlv_t *)tlv;
-  return push32(value->value, ppWritePackedMsg, end);
-}
-
-static uint8_t unpack_uint32_tlv_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
-  nfapi_uint32_tlv_t *value = (nfapi_uint32_tlv_t *)tlv;
-  return pull32(ppReadPackedMsg, &value->value, end);
-}
-
-
-static uint8_t pack_uint16_tlv_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
-  nfapi_uint16_tlv_t *value = (nfapi_uint16_tlv_t *)tlv;
-  return push16(value->value, ppWritePackedMsg, end);
-}
-
-static uint8_t unpack_uint16_tlv_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
-  nfapi_uint16_tlv_t *value = (nfapi_uint16_tlv_t *)tlv;
-  return pull16(ppReadPackedMsg, &value->value, end);
-}
-
-static uint8_t pack_int16_tlv_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
-  nfapi_int16_tlv_t *value = (nfapi_int16_tlv_t *)tlv;
-  return pushs16(value->value, ppWritePackedMsg, end);
-}
-
-static uint8_t unpack_int16_tlv_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
-  nfapi_int16_tlv_t *value = (nfapi_int16_tlv_t *)tlv;
-  return pulls16(ppReadPackedMsg, &value->value, end);
-}
-
-static uint8_t pack_uint8_tlv_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
-  nfapi_uint8_tlv_t *value = (nfapi_uint8_tlv_t *)tlv;
-  return push8(value->value, ppWritePackedMsg, end);
-}
-static uint8_t unpack_uint8_tlv_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
-  nfapi_uint8_tlv_t *value = (nfapi_uint8_tlv_t *)tlv;
-  return pull8(ppReadPackedMsg, &value->value, end);
-}
-
-static uint8_t pack_ipv4_address_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
-  nfapi_ipv4_address_t *value = (nfapi_ipv4_address_t *)tlv;
-  return pusharray8(value->address, NFAPI_IPV4_ADDRESS_LENGTH, NFAPI_IPV4_ADDRESS_LENGTH, ppWritePackedMsg, end);
-}
-static uint8_t unpack_ipv4_address_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
-  nfapi_ipv4_address_t *value = (nfapi_ipv4_address_t *)tlv;
-  return pullarray8(ppReadPackedMsg, value->address, NFAPI_IPV4_ADDRESS_LENGTH, NFAPI_IPV4_ADDRESS_LENGTH, end);
-}
-static uint8_t pack_ipv6_address_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
-  nfapi_ipv6_address_t *value = (nfapi_ipv6_address_t *)tlv;
-  return pusharray8(value->address, NFAPI_IPV6_ADDRESS_LENGTH, NFAPI_IPV6_ADDRESS_LENGTH, ppWritePackedMsg, end);
-}
-static uint8_t unpack_ipv6_address_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
-  nfapi_ipv4_address_t *value = (nfapi_ipv4_address_t *)tlv;
-  return pullarray8(ppReadPackedMsg, value->address, NFAPI_IPV6_ADDRESS_LENGTH, NFAPI_IPV6_ADDRESS_LENGTH, end);
-}
-
-static uint8_t pack_rf_bands_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
-  nfapi_rf_bands_t *value = (nfapi_rf_bands_t *)tlv;
-  return ( push16(value->number_rf_bands, ppWritePackedMsg, end) &&
-           pusharray16(value->rf_band, NFAPI_MAX_NUM_RF_BANDS, value->number_rf_bands, ppWritePackedMsg, end));
-}
-static uint8_t unpack_rf_bands_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
-  nfapi_rf_bands_t *value = (nfapi_rf_bands_t *)tlv;
-  return ( pull16(ppReadPackedMsg, &value->number_rf_bands, end) &&
-           pullarray16(ppReadPackedMsg, value->rf_band, NFAPI_MAX_NUM_RF_BANDS, value->number_rf_bands, end));
-}
-
-static uint8_t pack_nmm_frequency_bands_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
-  nfapi_nmm_frequency_bands_t *value = (nfapi_nmm_frequency_bands_t *)tlv;
-  return( push16(value->number_of_rf_bands, ppWritePackedMsg, end) &&
-          pusharray16(value->bands, NFAPI_MAX_NMM_FREQUENCY_BANDS, value->number_of_rf_bands, ppWritePackedMsg, end));
-}
-static uint8_t unpack_nmm_frequency_bands_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
-  nfapi_nmm_frequency_bands_t *value = (nfapi_nmm_frequency_bands_t *)tlv;
-  return ( pull16(ppReadPackedMsg, &value->number_of_rf_bands, end) &&
-           pullarray16(ppReadPackedMsg, value->bands, NFAPI_MAX_NMM_FREQUENCY_BANDS, value->number_of_rf_bands, end));
-}
-static uint8_t pack_embms_mbsfn_config_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
-  nfapi_embms_mbsfn_config_t *value = (nfapi_embms_mbsfn_config_t *)tlv;
-  return ( push16(value->num_mbsfn_config, ppWritePackedMsg, end) &&
-           pusharray16(value->radioframe_allocation_period, 8,value->num_mbsfn_config,ppWritePackedMsg, end) &&
-           pusharray16(value->radioframe_allocation_offset, 8,value->num_mbsfn_config,ppWritePackedMsg, end) &&
-           pusharray8(value->fourframes_flag, 8,value->num_mbsfn_config,ppWritePackedMsg, end) &&
-           pusharrays32(value->mbsfn_subframeconfig, 8, value->num_mbsfn_config, ppWritePackedMsg, end));
-}
-// static uint8_t unpack_embms_mbsfn_config_value(void* tlv, uint8_t **ppReadPackedMsg, uint8_t* end)
-// {
-//     nfapi_embms_mbsfn_config_t* value = (nfapi_embms_mbsfn_config_t*)tlv;
-
-//     return ( pull16(ppReadPackedMsg, &value->num_mbsfn_config, end) &&
-//              pull16(ppReadPackedMsg, &value->radioframe_allocation_period, end) &&
-//              pull16(ppReadPackedMsg, &value->radioframe_allocation_offset, end) &&
-//              pull8(ppReadPackedMsg, &value->fourframes_flag, end) &&
-//                      pullarrays32(ppReadPackedMsg, value->mbsfn_subframeconfig, 8, value->num_mbsfn_config, end));
-// }
-
-static uint8_t pack_param_response(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p4_p5_codec_config_t *config) {
-  nfapi_param_response_t *pNfapiMsg = (nfapi_param_response_t *)msg;
-  return( push8(pNfapiMsg->error_code, ppWritePackedMsg, end) &&
-          push8(pNfapiMsg->num_tlv, ppWritePackedMsg, end) &&
-          pack_tlv(NFAPI_L1_STATUS_PHY_STATE_TAG,  &pNfapiMsg->l1_status.phy_state, ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-          // Do we check the phy state and then just fill those sepecified, however
-          // we do not know the duplex mode, so just attempt to pack all and assumme
-          // that the callee has set the right tlvs
-          pack_tlv(NFAPI_PHY_CAPABILITIES_DL_BANDWIDTH_SUPPORT_TAG, &(pNfapiMsg->phy_capabilities.dl_bandwidth_support), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-          pack_tlv(NFAPI_PHY_CAPABILITIES_UL_BANDWIDTH_SUPPORT_TAG, &(pNfapiMsg->phy_capabilities.ul_bandwidth_support), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-          pack_tlv(NFAPI_PHY_CAPABILITIES_DL_MODULATION_SUPPORT_TAG, &(pNfapiMsg->phy_capabilities.dl_modulation_support), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-          pack_tlv(NFAPI_PHY_CAPABILITIES_UL_MODULATION_SUPPORT_TAG, &(pNfapiMsg->phy_capabilities.ul_modulation_support), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-          pack_tlv(NFAPI_PHY_CAPABILITIES_PHY_ANTENNA_CAPABILITY_TAG, &(pNfapiMsg->phy_capabilities.phy_antenna_capability), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-          pack_tlv(NFAPI_PHY_CAPABILITIES_RELEASE_CAPABILITY_TAG, &(pNfapiMsg->phy_capabilities.release_capability), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-          pack_tlv(NFAPI_PHY_CAPABILITIES_MBSFN_CAPABILITY_TAG, &(pNfapiMsg->phy_capabilities.mbsfn_capability), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-          // laa capability
-          pack_tlv(NFAPI_SUBFRAME_CONFIG_DUPLEX_MODE_TAG, &(pNfapiMsg->subframe_config.duplex_mode), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-          pack_tlv(NFAPI_SUBFRAME_CONFIG_PCFICH_POWER_OFFSET_TAG, &(pNfapiMsg->subframe_config.pcfich_power_offset), ppWritePackedMsg, end, &pack_uint16_tlv_value)&&
-          pack_tlv(NFAPI_SUBFRAME_CONFIG_PB_TAG, &(pNfapiMsg->subframe_config.pb), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-          pack_tlv(NFAPI_SUBFRAME_CONFIG_DL_CYCLIC_PREFIX_TYPE_TAG, &(pNfapiMsg->subframe_config.dl_cyclic_prefix_type), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-          pack_tlv(NFAPI_SUBFRAME_CONFIG_UL_CYCLIC_PREFIX_TYPE_TAG, &(pNfapiMsg->subframe_config.ul_cyclic_prefix_type), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-          pack_tlv(NFAPI_RF_CONFIG_DL_CHANNEL_BANDWIDTH_TAG, &(pNfapiMsg->rf_config.dl_channel_bandwidth), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-          pack_tlv(NFAPI_RF_CONFIG_UL_CHANNEL_BANDWIDTH_TAG, &(pNfapiMsg->rf_config.ul_channel_bandwidth), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-          pack_tlv(NFAPI_RF_CONFIG_REFERENCE_SIGNAL_POWER_TAG, &(pNfapiMsg->rf_config.reference_signal_power), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-          pack_tlv(NFAPI_RF_CONFIG_TX_ANTENNA_PORTS_TAG, &(pNfapiMsg->rf_config.tx_antenna_ports), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-          pack_tlv(NFAPI_RF_CONFIG_RX_ANTENNA_PORTS_TAG, &(pNfapiMsg->rf_config.rx_antenna_ports), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-          pack_tlv(NFAPI_PHICH_CONFIG_PHICH_RESOURCE_TAG, &(pNfapiMsg->phich_config.phich_resource), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-          pack_tlv(NFAPI_PHICH_CONFIG_PHICH_DURATION_TAG, &(pNfapiMsg->phich_config.phich_duration), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-          pack_tlv(NFAPI_PHICH_CONFIG_PHICH_POWER_OFFSET_TAG, &(pNfapiMsg->phich_config.phich_power_offset), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-          pack_tlv(NFAPI_SCH_CONFIG_PRIMARY_SYNCHRONIZATION_SIGNAL_EPRE_EPRERS_TAG, &(pNfapiMsg->sch_config.primary_synchronization_signal_epre_eprers), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-          pack_tlv(NFAPI_SCH_CONFIG_SECONDARY_SYNCHRONIZATION_SIGNAL_EPRE_EPRERS_TAG, &(pNfapiMsg->sch_config.secondary_synchronization_signal_epre_eprers), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-          pack_tlv(NFAPI_SCH_CONFIG_PHYSICAL_CELL_ID_TAG, &(pNfapiMsg->sch_config.physical_cell_id), ppWritePackedMsg, end,&pack_uint16_tlv_value) &&
-          pack_tlv(NFAPI_PRACH_CONFIG_CONFIGURATION_INDEX_TAG, &(pNfapiMsg->prach_config.configuration_index), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-          pack_tlv(NFAPI_PRACH_CONFIG_ROOT_SEQUENCE_INDEX_TAG, &(pNfapiMsg->prach_config.root_sequence_index), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-          pack_tlv(NFAPI_PRACH_CONFIG_ZERO_CORRELATION_ZONE_CONFIGURATION_TAG, &(pNfapiMsg->prach_config.zero_correlation_zone_configuration), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-          pack_tlv(NFAPI_PRACH_CONFIG_HIGH_SPEED_FLAG_TAG, &(pNfapiMsg->prach_config.high_speed_flag), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-          pack_tlv(NFAPI_PRACH_CONFIG_FREQUENCY_OFFSET_TAG, &(pNfapiMsg->prach_config.frequency_offset), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-          pack_tlv(NFAPI_PUSCH_CONFIG_HOPPING_MODE_TAG, &(pNfapiMsg->pusch_config.hopping_mode), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-          pack_tlv(NFAPI_PUSCH_CONFIG_HOPPING_OFFSET_TAG, &(pNfapiMsg->pusch_config.hopping_offset), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-          pack_tlv(NFAPI_PUSCH_CONFIG_NUMBER_OF_SUBBANDS_TAG, &(pNfapiMsg->pusch_config.number_of_subbands), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-          pack_tlv(NFAPI_PUCCH_CONFIG_DELTA_PUCCH_SHIFT_TAG, &(pNfapiMsg->pucch_config.delta_pucch_shift), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-          pack_tlv(NFAPI_PUCCH_CONFIG_N_CQI_RB_TAG, &(pNfapiMsg->pucch_config.n_cqi_rb), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-          pack_tlv(NFAPI_PUCCH_CONFIG_N_AN_CS_TAG, &(pNfapiMsg->pucch_config.n_an_cs), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-          pack_tlv(NFAPI_PUCCH_CONFIG_N1_PUCCH_AN_TAG, &(pNfapiMsg->pucch_config.n1_pucch_an), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-          pack_tlv(NFAPI_EMBMS_MBSFN_CONFIG_AREA_IDX_TAG, &(pNfapiMsg->embms_sib13_config.mbsfn_area_idx), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
-          pack_tlv(NFAPI_EMBMS_MBSFN_CONFIG_AREA_IDR9_TAG, &(pNfapiMsg->embms_sib13_config.mbsfn_area_id_r9), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-          pack_tlv(NFAPI_EMBMS_MBSFN_CONFIG_TAG, &(pNfapiMsg->embms_mbsfn_config), ppWritePackedMsg, end, &pack_embms_mbsfn_config_value) &&
-          pack_tlv(NFAPI_FEMBMS_CONFIG_RADIOFRAME_ALLOCATION_PERIOD_TAG, &(pNfapiMsg->fembms_config.radioframe_allocation_period), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
-          pack_tlv(NFAPI_FEMBMS_CONFIG_RADIOFRAME_ALLOCATION_OFFSET_TAG, &(pNfapiMsg->fembms_config.radioframe_allocation_offset), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
-          pack_tlv(NFAPI_FEMBMS_CONFIG_NON_MBSFN_FLAG_TAG, &(pNfapiMsg->fembms_config.non_mbsfn_config_flag), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
-          pack_tlv(NFAPI_FEMBMS_CONFIG_NON_MBSFN_SUBFRAMECONFIG_TAG, &(pNfapiMsg->fembms_config.non_mbsfn_subframeconfig), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-          pack_tlv(NFAPI_SRS_CONFIG_BANDWIDTH_CONFIGURATION_TAG, &(pNfapiMsg->srs_config.bandwidth_configuration), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-          pack_tlv(NFAPI_SRS_CONFIG_MAX_UP_PTS_TAG, &(pNfapiMsg->srs_config.max_up_pts), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-          pack_tlv(NFAPI_SRS_CONFIG_SRS_SUBFRAME_CONFIGURATION_TAG, &(pNfapiMsg->srs_config.srs_subframe_configuration), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-          pack_tlv(NFAPI_SRS_CONFIG_SRS_ACKNACK_SRS_SIMULTANEOUS_TRANSMISSION_TAG, &(pNfapiMsg->srs_config.srs_acknack_srs_simultaneous_transmission), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-          pack_tlv(NFAPI_UPLINK_REFERENCE_SIGNAL_CONFIG_UPLINK_RS_HOPPING_TAG, &(pNfapiMsg->uplink_reference_signal_config.uplink_rs_hopping), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-          pack_tlv(NFAPI_UPLINK_REFERENCE_SIGNAL_CONFIG_GROUP_ASSIGNMENT_TAG, &(pNfapiMsg->uplink_reference_signal_config.group_assignment), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-          pack_tlv(NFAPI_UPLINK_REFERENCE_SIGNAL_CONFIG_CYCLIC_SHIFT_1_FOR_DRMS_TAG, &(pNfapiMsg->uplink_reference_signal_config.cyclic_shift_1_for_drms), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-          pack_tlv(NFAPI_TDD_FRAME_STRUCTURE_SUBFRAME_ASSIGNMENT_TAG, &(pNfapiMsg->tdd_frame_structure_config.subframe_assignment), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-          pack_tlv(NFAPI_TDD_FRAME_STRUCTURE_SPECIAL_SUBFRAME_PATTERNS_TAG, &(pNfapiMsg->tdd_frame_structure_config.special_subframe_patterns), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-          pack_tlv(NFAPI_L23_CONFIG_DATA_REPORT_MODE_TAG, &(pNfapiMsg->l23_config.data_report_mode), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-          pack_tlv(NFAPI_L23_CONFIG_SFNSF_TAG, &(pNfapiMsg->l23_config.sfnsf), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-          pack_tlv(NFAPI_NFAPI_P7_VNF_ADDRESS_IPV4_TAG, &(pNfapiMsg->nfapi_config.p7_vnf_address_ipv4), ppWritePackedMsg, end, &pack_ipv4_address_value) &&
-          pack_tlv(NFAPI_NFAPI_P7_VNF_ADDRESS_IPV6_TAG, &(pNfapiMsg->nfapi_config.p7_vnf_address_ipv6), ppWritePackedMsg, end, &pack_ipv6_address_value) &&
-          pack_tlv(NFAPI_NFAPI_P7_VNF_PORT_TAG, &(pNfapiMsg->nfapi_config.p7_vnf_port), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-          pack_tlv(NFAPI_NFAPI_P7_PNF_ADDRESS_IPV4_TAG, &(pNfapiMsg->nfapi_config.p7_pnf_address_ipv4), ppWritePackedMsg, end, &pack_ipv4_address_value) &&
-          pack_tlv(NFAPI_NFAPI_P7_PNF_ADDRESS_IPV6_TAG, &(pNfapiMsg->nfapi_config.p7_pnf_address_ipv6), ppWritePackedMsg, end, &pack_ipv6_address_value) &&
-          pack_tlv(NFAPI_NFAPI_P7_PNF_PORT_TAG, &(pNfapiMsg->nfapi_config.p7_pnf_port), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-          pack_tlv(NFAPI_NFAPI_DOWNLINK_UES_PER_SUBFRAME_TAG, &(pNfapiMsg->nfapi_config.dl_ue_per_sf), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
-          pack_tlv(NFAPI_NFAPI_UPLINK_UES_PER_SUBFRAME_TAG, &(pNfapiMsg->nfapi_config.ul_ue_per_sf), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
-          pack_tlv(NFAPI_NFAPI_RF_BANDS_TAG, &(pNfapiMsg->nfapi_config.rf_bands), ppWritePackedMsg, end, &pack_rf_bands_value) &&
-          pack_tlv(NFAPI_NFAPI_TIMING_WINDOW_TAG, &(pNfapiMsg->nfapi_config.timing_window), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
-          pack_tlv(NFAPI_NFAPI_TIMING_INFO_MODE_TAG, &(pNfapiMsg->nfapi_config.timing_info_mode), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
-          pack_tlv(NFAPI_NFAPI_TIMING_INFO_PERIOD_TAG, &(pNfapiMsg->nfapi_config.timing_info_period), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
-          pack_tlv(NFAPI_NFAPI_MAXIMUM_TRANSMIT_POWER_TAG, &(pNfapiMsg->nfapi_config.max_transmit_power), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-          pack_tlv(NFAPI_NFAPI_EARFCN_TAG, &(pNfapiMsg->nfapi_config.earfcn), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-          pack_tlv(NFAPI_NFAPI_NMM_GSM_FREQUENCY_BANDS_TAG, &(pNfapiMsg->nfapi_config.nmm_gsm_frequency_bands), ppWritePackedMsg, end, &pack_nmm_frequency_bands_value) &&
-          pack_tlv(NFAPI_NFAPI_NMM_UMTS_FREQUENCY_BANDS_TAG, &(pNfapiMsg->nfapi_config.nmm_umts_frequency_bands), ppWritePackedMsg, end, &pack_nmm_frequency_bands_value) &&
-          pack_tlv(NFAPI_NFAPI_NMM_LTE_FREQUENCY_BANDS_TAG, &(pNfapiMsg->nfapi_config.nmm_lte_frequency_bands), ppWritePackedMsg, end, &pack_nmm_frequency_bands_value) &&
-          pack_tlv(NFAPI_NFAPI_NMM_UPLINK_RSSI_SUPPORTED_TAG, &(pNfapiMsg->nfapi_config.nmm_uplink_rssi_supported), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
-          pack_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config) );
-}
-
-static uint8_t pack_nr_param_response(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p4_p5_codec_config_t *config) {
-  printf("\nRUNNING pack_param_response\n");
-  nfapi_nr_param_response_scf_t *pNfapiMsg = (nfapi_nr_param_response_scf_t *)msg;
-  return (push8(pNfapiMsg->error_code, ppWritePackedMsg, end) &&
-          push8(pNfapiMsg->num_tlv, ppWritePackedMsg, end) &&
-          pack_tlv(NFAPI_NR_PARAM_TLV_RELEASE_CAPABILITY_TAG, &(pNfapiMsg->cell_param.release_capability), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-          pack_tlv(NFAPI_NR_PARAM_TLV_PHY_STATE_TAG, &(pNfapiMsg->cell_param.phy_state), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-          pack_tlv(NFAPI_NR_PARAM_TLV_SKIP_BLANK_DL_CONFIG_TAG, &(pNfapiMsg->cell_param.skip_blank_dl_config), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
-          pack_tlv(NFAPI_NR_PARAM_TLV_SKIP_BLANK_UL_CONFIG_TAG, &(pNfapiMsg->cell_param.skip_blank_ul_config), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
-          pack_tlv(NFAPI_NR_PARAM_TLV_NUM_CONFIG_TLVS_TO_REPORT_TAG, &(pNfapiMsg->cell_param.num_config_tlvs_to_report ), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-          pack_tlv(NFAPI_NR_PARAM_TLV_CYCLIC_PREFIX_TAG, &(pNfapiMsg->carrier_param.cyclic_prefix), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
-          pack_tlv(NFAPI_NR_PARAM_TLV_SUPPORTED_SUBCARRIER_SPACINGS_DL_TAG, &(pNfapiMsg->carrier_param.supported_subcarrier_spacings_dl), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-          pack_tlv(NFAPI_NR_PARAM_TLV_SUPPORTED_BANDWIDTH_DL_TAG, &(pNfapiMsg->carrier_param.supported_bandwidth_dl), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-          pack_tlv(NFAPI_NR_PARAM_TLV_SUPPORTED_SUBCARRIER_SPACINGS_UL_TAG, &(pNfapiMsg->carrier_param.supported_subcarrier_spacings_ul), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
-          pack_tlv(NFAPI_NR_PARAM_TLV_SUPPORTED_BANDWIDTH_UL_TAG, &(pNfapiMsg->carrier_param.supported_bandwidth_ul), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-          pack_tlv(NFAPI_NR_PARAM_TLV_CCE_MAPPING_TYPE_TAG, &(pNfapiMsg->pdcch_param.cce_mapping_type), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
-          pack_tlv(NFAPI_NR_PARAM_TLV_CORESET_OUTSIDE_FIRST_3_OFDM_SYMS_OF_SLOT_TAG, &(pNfapiMsg->pdcch_param.coreset_outside_first_3_of_ofdm_syms_of_slot), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
-          pack_tlv(NFAPI_NR_PARAM_TLV_PRECODER_GRANULARITY_CORESET_TAG, &(pNfapiMsg->pdcch_param.coreset_precoder_granularity_coreset), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
-          pack_tlv(NFAPI_NR_PARAM_TLV_PDCCH_MU_MIMO_TAG, &(pNfapiMsg->pdcch_param.pdcch_mu_mimo), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
-          pack_tlv(NFAPI_NR_PARAM_TLV_PDCCH_PRECODER_CYCLING_TAG, &(pNfapiMsg->pdcch_param.pdcch_precoder_cycling), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
-          pack_tlv(NFAPI_NR_PARAM_TLV_MAX_PDCCHS_PER_SLOT_TAG, &(pNfapiMsg->pdcch_param.max_pdcch_per_slot), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
-          pack_tlv(NFAPI_NR_PARAM_TLV_PUCCH_FORMATS_TAG, &(pNfapiMsg->pucch_param.pucch_formats), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
-          pack_tlv(NFAPI_NR_PARAM_TLV_MAX_PUCCHS_PER_SLOT_TAG, &(pNfapiMsg->pucch_param.max_pucchs_per_slot), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
-          pack_tlv(NFAPI_NR_PARAM_TLV_PDSCH_MAPPING_TYPE_TAG, &(pNfapiMsg->pdsch_param.pdsch_mapping_type), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
-          pack_tlv(NFAPI_NR_PARAM_TLV_PDSCH_ALLOCATION_TYPES_TAG, &(pNfapiMsg->pdsch_param.pdsch_allocation_types), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
-          pack_tlv(NFAPI_NR_PARAM_TLV_PDSCH_VRB_TO_PRB_MAPPING_TAG, &(pNfapiMsg->pdsch_param.pdsch_vrb_to_prb_mapping), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
-          pack_tlv(NFAPI_NR_PARAM_TLV_PDSCH_CBG_TAG, &(pNfapiMsg->pdsch_param.pdsch_cbg), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
-          pack_tlv(NFAPI_NR_PARAM_TLV_PDSCH_DMRS_CONFIG_TYPES_TAG, &(pNfapiMsg->pdsch_param.pdsch_dmrs_config_types), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
-          pack_tlv(NFAPI_NR_PARAM_TLV_PDSCH_DMRS_MAX_LENGTH_TAG, &(pNfapiMsg->pdsch_param.pdsch_dmrs_max_length), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
-          pack_tlv(NFAPI_NR_PARAM_TLV_PDSCH_DMRS_ADDITIONAL_POS_TAG, &(pNfapiMsg->pdsch_param.pdsch_dmrs_additional_pos), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
-          pack_tlv(NFAPI_NR_PARAM_TLV_MAX_PDSCH_S_YBS_PER_SLOT_TAG, &(pNfapiMsg->pdsch_param.max_pdsch_tbs_per_slot), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
-          pack_tlv(NFAPI_NR_PARAM_TLV_MAX_NUMBER_MIMO_LAYERS_PDSCH_TAG, &(pNfapiMsg->pdsch_param.max_number_mimo_layers_pdsch), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
-          pack_tlv(NFAPI_NR_PARAM_TLV_MAX_MU_MIMO_USERS_DL_TAG, &(pNfapiMsg->pdsch_param.max_mu_mimo_users_dl), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
-          pack_tlv(NFAPI_NR_PARAM_TLV_PDSCH_DATA_IN_DMRS_SYMBOLS_TAG, &(pNfapiMsg->pdsch_param.pdsch_data_in_dmrs_symbols), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
-          pack_tlv(NFAPI_NR_PARAM_TLV_PREMPTION_SUPPORT_TAG, &(pNfapiMsg->pdsch_param.premption_support), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
-          pack_tlv(NFAPI_NR_PARAM_TLV_PDSCH_NON_SLOT_SUPPORT_TAG, &(pNfapiMsg->pdsch_param.pdsch_non_slot_support), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
-          pack_tlv(NFAPI_NR_PARAM_TLV_UCI_MUX_ULSCH_IN_PUSCH_TAG, &(pNfapiMsg->pusch_param.uci_mux_ulsch_in_pusch), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
-          pack_tlv(NFAPI_NR_PARAM_TLV_UCI_ONLY_PUSCH_TAG, &(pNfapiMsg->pusch_param.uci_only_pusch), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
-          pack_tlv(NFAPI_NR_PARAM_TLV_PUSCH_FREQUENCY_HOPPING_TAG, &(pNfapiMsg->pusch_param.pusch_frequency_hopping), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
-          pack_tlv(NFAPI_NR_PARAM_TLV_PUSCH_DMRS_CONFIG_TYPES_TAG, &(pNfapiMsg->pusch_param.pusch_dmrs_config_types), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
-          pack_tlv(NFAPI_NR_PARAM_TLV_PUSCH_DMRS_MAX_LEN_TAG, &(pNfapiMsg->pusch_param.pusch_dmrs_max_len), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
-          pack_tlv(NFAPI_NR_PARAM_TLV_PUSCH_DMRS_ADDITIONAL_POS_TAG, &(pNfapiMsg->pusch_param.pusch_dmrs_additional_pos), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
-          pack_tlv(NFAPI_NR_PARAM_TLV_PUSCH_CBG_TAG, &(pNfapiMsg->pusch_param.pusch_cbg), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
-          pack_tlv(NFAPI_NR_PARAM_TLV_PUSCH_MAPPING_TYPE_TAG, &(pNfapiMsg->pusch_param.pusch_mapping_type), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
-          pack_tlv(NFAPI_NR_PARAM_TLV_PUSCH_ALLOCATION_TYPES_TAG, &(pNfapiMsg->pusch_param.pusch_allocation_types), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
-          pack_tlv(NFAPI_NR_PARAM_TLV_PUSCH_VRB_TO_PRB_MAPPING_TAG, &(pNfapiMsg->pusch_param.pusch_vrb_to_prb_mapping), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
-          pack_tlv(NFAPI_NR_PARAM_TLV_PUSCH_MAX_PTRS_PORTS_TAG, &(pNfapiMsg->pusch_param.pusch_max_ptrs_ports), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
-          pack_tlv(NFAPI_NR_PARAM_TLV_MAX_PDUSCHS_TBS_PER_SLOT_TAG, &(pNfapiMsg->pusch_param.max_pduschs_tbs_per_slot), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
-          pack_tlv(NFAPI_NR_PARAM_TLV_MAX_NUMBER_MIMO_LAYERS_NON_CB_PUSCH_TAG, &(pNfapiMsg->pusch_param.max_number_mimo_layers_non_cb_pusch), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
-          pack_tlv(NFAPI_NR_PARAM_TLV_SUPPORTED_MODULATION_ORDER_UL_TAG, &(pNfapiMsg->pusch_param.supported_modulation_order_ul), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
-          pack_tlv(NFAPI_NR_PARAM_TLV_MAX_MU_MIMO_USERS_UL_TAG, &(pNfapiMsg->pusch_param.max_mu_mimo_users_ul), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
-          pack_tlv(NFAPI_NR_PARAM_TLV_DFTS_OFDM_SUPPORT_TAG, &(pNfapiMsg->pusch_param.dfts_ofdm_support), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
-          pack_tlv(NFAPI_NR_PARAM_TLV_PUSCH_AGGREGATION_FACTOR_TAG, &(pNfapiMsg->pusch_param.pusch_aggregation_factor), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
-          pack_tlv(NFAPI_NR_PARAM_TLV_PRACH_LONG_FORMATS_TAG, &(pNfapiMsg->prach_param.prach_long_formats), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
-          pack_tlv(NFAPI_NR_PARAM_TLV_PRACH_SHORT_FORMATS_TAG, &(pNfapiMsg->prach_param.prach_short_formats), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
-          pack_tlv(NFAPI_NR_PARAM_TLV_PRACH_RESTRICTED_SETS_TAG, &(pNfapiMsg->prach_param.prach_restricted_sets), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
-          pack_tlv(NFAPI_NR_PARAM_TLV_MAX_PRACH_FD_OCCASIONS_IN_A_SLOT_TAG, &(pNfapiMsg->prach_param.max_prach_fd_occasions_in_a_slot), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
-          pack_tlv(NFAPI_NR_PARAM_TLV_RSSI_MEASUREMENT_SUPPORT_TAG, &(pNfapiMsg->measurement_param.rssi_measurement_support), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
-          // config:
-          pack_tlv(NFAPI_NR_NFAPI_P7_VNF_ADDRESS_IPV4_TAG, &(pNfapiMsg->nfapi_config.p7_vnf_address_ipv4), ppWritePackedMsg, end, &pack_ipv4_address_value) &&
-          pack_tlv(NFAPI_NR_NFAPI_P7_VNF_ADDRESS_IPV6_TAG, &(pNfapiMsg->nfapi_config.p7_vnf_address_ipv6), ppWritePackedMsg, end, &pack_ipv6_address_value) &&
-          pack_tlv(NFAPI_NR_NFAPI_P7_VNF_PORT_TAG, &(pNfapiMsg->nfapi_config.p7_vnf_port), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-          pack_tlv(NFAPI_NR_NFAPI_P7_PNF_ADDRESS_IPV4_TAG, &(pNfapiMsg->nfapi_config.p7_pnf_address_ipv4), ppWritePackedMsg, end, &pack_ipv4_address_value) &&
-          pack_tlv(NFAPI_NR_NFAPI_P7_PNF_ADDRESS_IPV6_TAG, &(pNfapiMsg->nfapi_config.p7_pnf_address_ipv6), ppWritePackedMsg, end, &pack_ipv6_address_value) &&
-          pack_tlv(NFAPI_NR_NFAPI_P7_PNF_PORT_TAG, &(pNfapiMsg->nfapi_config.p7_pnf_port), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-          pack_tlv(NFAPI_NR_NFAPI_TIMING_WINDOW_TAG, &(pNfapiMsg->nfapi_config.timing_window), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
-          pack_tlv(NFAPI_NR_NFAPI_TIMING_INFO_MODE_TAG, &(pNfapiMsg->nfapi_config.timing_info_mode), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
-          pack_tlv(NFAPI_NR_NFAPI_TIMING_INFO_PERIOD_TAG, &(pNfapiMsg->nfapi_config.timing_info_period), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
-          pack_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config));
-}
-
-static uint8_t pack_config_request(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p4_p5_codec_config_t *config) {
-  nfapi_config_request_t *pNfapiMsg = (nfapi_config_request_t *)msg;
-  return ( push8(pNfapiMsg->num_tlv, ppWritePackedMsg, end) &&
-           // Do we check the phy state and then just fill those sepecified, however
-           // we do not know the duplex mode, so just attempt to pack all and assumme
-           // that the callee has set the right tlvs
-           pack_tlv(NFAPI_SUBFRAME_CONFIG_DUPLEX_MODE_TAG, &(pNfapiMsg->subframe_config.duplex_mode), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-           pack_tlv(NFAPI_SUBFRAME_CONFIG_PCFICH_POWER_OFFSET_TAG, &(pNfapiMsg->subframe_config.pcfich_power_offset), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-           pack_tlv(NFAPI_SUBFRAME_CONFIG_PB_TAG, &(pNfapiMsg->subframe_config.pb), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-           pack_tlv(NFAPI_SUBFRAME_CONFIG_DL_CYCLIC_PREFIX_TYPE_TAG, &(pNfapiMsg->subframe_config.dl_cyclic_prefix_type), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-           pack_tlv(NFAPI_SUBFRAME_CONFIG_UL_CYCLIC_PREFIX_TYPE_TAG, &(pNfapiMsg->subframe_config.ul_cyclic_prefix_type), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-           pack_tlv(NFAPI_RF_CONFIG_DL_CHANNEL_BANDWIDTH_TAG, &(pNfapiMsg->rf_config.dl_channel_bandwidth), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-           pack_tlv(NFAPI_RF_CONFIG_UL_CHANNEL_BANDWIDTH_TAG, &(pNfapiMsg->rf_config.ul_channel_bandwidth), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-           pack_tlv(NFAPI_RF_CONFIG_REFERENCE_SIGNAL_POWER_TAG, &(pNfapiMsg->rf_config.reference_signal_power), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-           pack_tlv(NFAPI_RF_CONFIG_TX_ANTENNA_PORTS_TAG, &(pNfapiMsg->rf_config.tx_antenna_ports), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-           pack_tlv(NFAPI_RF_CONFIG_RX_ANTENNA_PORTS_TAG, &(pNfapiMsg->rf_config.rx_antenna_ports), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-           pack_tlv(NFAPI_PHICH_CONFIG_PHICH_RESOURCE_TAG, &(pNfapiMsg->phich_config.phich_resource), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-           pack_tlv(NFAPI_PHICH_CONFIG_PHICH_DURATION_TAG, &(pNfapiMsg->phich_config.phich_duration), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-           pack_tlv(NFAPI_PHICH_CONFIG_PHICH_POWER_OFFSET_TAG, &(pNfapiMsg->phich_config.phich_power_offset), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-           pack_tlv(NFAPI_SCH_CONFIG_PRIMARY_SYNCHRONIZATION_SIGNAL_EPRE_EPRERS_TAG, &(pNfapiMsg->sch_config.primary_synchronization_signal_epre_eprers), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-           pack_tlv(NFAPI_SCH_CONFIG_SECONDARY_SYNCHRONIZATION_SIGNAL_EPRE_EPRERS_TAG, &(pNfapiMsg->sch_config.secondary_synchronization_signal_epre_eprers), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-           pack_tlv(NFAPI_SCH_CONFIG_PHYSICAL_CELL_ID_TAG, &(pNfapiMsg->sch_config.physical_cell_id), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-           pack_tlv(NFAPI_PRACH_CONFIG_CONFIGURATION_INDEX_TAG, &(pNfapiMsg->prach_config.configuration_index), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-           pack_tlv(NFAPI_PRACH_CONFIG_ROOT_SEQUENCE_INDEX_TAG, &(pNfapiMsg->prach_config.root_sequence_index), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-           pack_tlv(NFAPI_PRACH_CONFIG_ZERO_CORRELATION_ZONE_CONFIGURATION_TAG, &(pNfapiMsg->prach_config.zero_correlation_zone_configuration), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-           pack_tlv(NFAPI_PRACH_CONFIG_HIGH_SPEED_FLAG_TAG, &(pNfapiMsg->prach_config.high_speed_flag), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-           pack_tlv(NFAPI_PRACH_CONFIG_FREQUENCY_OFFSET_TAG, &(pNfapiMsg->prach_config.frequency_offset), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-           pack_tlv(NFAPI_PUSCH_CONFIG_HOPPING_MODE_TAG, &(pNfapiMsg->pusch_config.hopping_mode), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-           pack_tlv(NFAPI_PUSCH_CONFIG_HOPPING_OFFSET_TAG, &(pNfapiMsg->pusch_config.hopping_offset), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-           pack_tlv(NFAPI_PUSCH_CONFIG_NUMBER_OF_SUBBANDS_TAG, &(pNfapiMsg->pusch_config.number_of_subbands), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-           pack_tlv(NFAPI_PUCCH_CONFIG_DELTA_PUCCH_SHIFT_TAG, &(pNfapiMsg->pucch_config.delta_pucch_shift), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-           pack_tlv(NFAPI_PUCCH_CONFIG_N_CQI_RB_TAG, &(pNfapiMsg->pucch_config.n_cqi_rb), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-           pack_tlv(NFAPI_PUCCH_CONFIG_N_AN_CS_TAG, &(pNfapiMsg->pucch_config.n_an_cs), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-           pack_tlv(NFAPI_PUCCH_CONFIG_N1_PUCCH_AN_TAG, &(pNfapiMsg->pucch_config.n1_pucch_an), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-           pack_tlv(NFAPI_SRS_CONFIG_BANDWIDTH_CONFIGURATION_TAG, &(pNfapiMsg->srs_config.bandwidth_configuration), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-           pack_tlv(NFAPI_SRS_CONFIG_MAX_UP_PTS_TAG, &(pNfapiMsg->srs_config.max_up_pts), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-           pack_tlv(NFAPI_SRS_CONFIG_SRS_SUBFRAME_CONFIGURATION_TAG, &(pNfapiMsg->srs_config.srs_subframe_configuration), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-           pack_tlv(NFAPI_SRS_CONFIG_SRS_ACKNACK_SRS_SIMULTANEOUS_TRANSMISSION_TAG, &(pNfapiMsg->srs_config.srs_acknack_srs_simultaneous_transmission), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-           pack_tlv(NFAPI_UPLINK_REFERENCE_SIGNAL_CONFIG_UPLINK_RS_HOPPING_TAG, &(pNfapiMsg->uplink_reference_signal_config.uplink_rs_hopping), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-           pack_tlv(NFAPI_UPLINK_REFERENCE_SIGNAL_CONFIG_GROUP_ASSIGNMENT_TAG, &(pNfapiMsg->uplink_reference_signal_config.group_assignment), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-           pack_tlv(NFAPI_UPLINK_REFERENCE_SIGNAL_CONFIG_CYCLIC_SHIFT_1_FOR_DRMS_TAG, &(pNfapiMsg->uplink_reference_signal_config.cyclic_shift_1_for_drms), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-           pack_tlv(NFAPI_LAA_CONFIG_ED_THRESHOLD_FOR_LBT_FOR_PDSCH_TAG, &(pNfapiMsg->laa_config.ed_threshold_lbt_pdsch), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-           pack_tlv(NFAPI_LAA_CONFIG_ED_THRESHOLD_FOR_LBT_FOR_DRS_TAG, &(pNfapiMsg->laa_config.ed_threshold_lbt_drs), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-           pack_tlv(NFAPI_LAA_CONFIG_PD_THRESHOLD_TAG, &(pNfapiMsg->laa_config.pd_threshold), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-           pack_tlv(NFAPI_LAA_CONFIG_MULTI_CARRIER_TYPE_TAG, &(pNfapiMsg->laa_config.multi_carrier_type), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-           pack_tlv(NFAPI_LAA_CONFIG_MULTI_CARRIER_TX_TAG, &(pNfapiMsg->laa_config.multi_carrier_tx), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-           pack_tlv(NFAPI_LAA_CONFIG_MULTI_CARRIER_FREEZE_TAG, &(pNfapiMsg->laa_config.multi_carrier_freeze), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-           pack_tlv(NFAPI_LAA_CONFIG_TX_ANTENNA_PORTS_FOR_DRS_TAG, &(pNfapiMsg->laa_config.tx_antenna_ports_drs), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-           pack_tlv(NFAPI_LAA_CONFIG_TRANSMISSION_POWER_FOR_DRS_TAG, &(pNfapiMsg->laa_config.tx_power_drs), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-           pack_tlv(NFAPI_EMTC_CONFIG_PBCH_REPETITIONS_ENABLE_R13_TAG, &(pNfapiMsg->emtc_config.pbch_repetitions_enable_r13), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-           pack_tlv(NFAPI_EMTC_CONFIG_PRACH_CATM_ROOT_SEQUENCE_INDEX_TAG, &(pNfapiMsg->emtc_config.prach_catm_root_sequence_index), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-           pack_tlv(NFAPI_EMTC_CONFIG_PRACH_CATM_ZERO_CORRELATION_ZONE_CONFIGURATION_TAG, &(pNfapiMsg->emtc_config.prach_catm_zero_correlation_zone_configuration), ppWritePackedMsg, end,
-                    &pack_uint16_tlv_value) &&
-           pack_tlv(NFAPI_EMTC_CONFIG_PRACH_CATM_HIGH_SPEED_FLAG, &(pNfapiMsg->emtc_config.prach_catm_high_speed_flag), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-           pack_tlv(NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_0_ENABLE_TAG, &(pNfapiMsg->emtc_config.prach_ce_level_0_enable), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-           pack_tlv(NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_0_CONFIGURATION_INDEX_TAG, &(pNfapiMsg->emtc_config.prach_ce_level_0_configuration_index), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-           pack_tlv(NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_0_FREQUENCY_OFFSET_TAG, &(pNfapiMsg->emtc_config.prach_ce_level_0_frequency_offset), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-           pack_tlv(NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_0_NUMBER_OF_REPETITIONS_PER_ATTEMPT_TAG, &(pNfapiMsg->emtc_config.prach_ce_level_0_number_of_repetitions_per_attempt), ppWritePackedMsg, end,
-                    &pack_uint16_tlv_value) &&
-           pack_tlv(NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_0_STARTING_SUBFRAME_PERIODICITY_TAG, &(pNfapiMsg->emtc_config.prach_ce_level_0_starting_subframe_periodicity), ppWritePackedMsg, end,
-                    &pack_uint16_tlv_value) &&
-           pack_tlv(NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_0_HOPPING_ENABLE_TAG, &(pNfapiMsg->emtc_config.prach_ce_level_0_hopping_enable), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-           pack_tlv(NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_0_HOPPING_OFFSET_TAG, &(pNfapiMsg->emtc_config.prach_ce_level_0_hopping_offset), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-           pack_tlv(NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_1_ENABLE_TAG, &(pNfapiMsg->emtc_config.prach_ce_level_1_enable), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-           pack_tlv(NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_1_CONFIGURATION_INDEX_TAG, &(pNfapiMsg->emtc_config.prach_ce_level_1_configuration_index), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-           pack_tlv(NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_1_FREQUENCY_OFFSET_TAG, &(pNfapiMsg->emtc_config.prach_ce_level_1_frequency_offset), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-           pack_tlv(NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_1_NUMBER_OF_REPETITIONS_PER_ATTEMPT_TAG, &(pNfapiMsg->emtc_config.prach_ce_level_1_number_of_repetitions_per_attempt), ppWritePackedMsg, end,
-                    &pack_uint16_tlv_value) &&
-           pack_tlv(NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_1_STARTING_SUBFRAME_PERIODICITY_TAG, &(pNfapiMsg->emtc_config.prach_ce_level_1_starting_subframe_periodicity), ppWritePackedMsg, end,
-                    &pack_uint16_tlv_value) &&
-           pack_tlv(NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_1_HOPPING_ENABLE_TAG, &(pNfapiMsg->emtc_config.prach_ce_level_1_hopping_enable), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-           pack_tlv(NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_1_HOPPING_OFFSET_TAG, &(pNfapiMsg->emtc_config.prach_ce_level_1_hopping_offset), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-           pack_tlv(NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_2_ENABLE_TAG, &(pNfapiMsg->emtc_config.prach_ce_level_2_enable), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-           pack_tlv(NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_2_CONFIGURATION_INDEX_TAG, &(pNfapiMsg->emtc_config.prach_ce_level_2_configuration_index), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-           pack_tlv(NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_2_FREQUENCY_OFFSET_TAG, &(pNfapiMsg->emtc_config.prach_ce_level_2_frequency_offset), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-           pack_tlv(NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_2_NUMBER_OF_REPETITIONS_PER_ATTEMPT_TAG, &(pNfapiMsg->emtc_config.prach_ce_level_2_number_of_repetitions_per_attempt), ppWritePackedMsg, end,
-                    &pack_uint16_tlv_value) &&
-           pack_tlv(NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_2_STARTING_SUBFRAME_PERIODICITY_TAG, &(pNfapiMsg->emtc_config.prach_ce_level_2_starting_subframe_periodicity), ppWritePackedMsg, end,
-                    &pack_uint16_tlv_value) &&
-           pack_tlv(NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_2_HOPPING_ENABLE_TAG, &(pNfapiMsg->emtc_config.prach_ce_level_2_hopping_enable), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-           pack_tlv(NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_2_HOPPING_OFFSET_TAG, &(pNfapiMsg->emtc_config.prach_ce_level_2_hopping_offset), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-           pack_tlv(NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_3_ENABLE_TAG, &(pNfapiMsg->emtc_config.prach_ce_level_3_enable), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-           pack_tlv(NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_3_CONFIGURATION_INDEX_TAG, &(pNfapiMsg->emtc_config.prach_ce_level_3_configuration_index), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-           pack_tlv(NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_3_FREQUENCY_OFFSET_TAG, &(pNfapiMsg->emtc_config.prach_ce_level_3_frequency_offset), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-           pack_tlv(NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_3_NUMBER_OF_REPETITIONS_PER_ATTEMPT_TAG, &(pNfapiMsg->emtc_config.prach_ce_level_3_number_of_repetitions_per_attempt), ppWritePackedMsg, end,
-                    &pack_uint16_tlv_value) &&
-           pack_tlv(NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_3_STARTING_SUBFRAME_PERIODICITY_TAG, &(pNfapiMsg->emtc_config.prach_ce_level_3_starting_subframe_periodicity), ppWritePackedMsg, end,
-                    &pack_uint16_tlv_value) &&
-           pack_tlv(NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_3_HOPPING_ENABLE_TAG, &(pNfapiMsg->emtc_config.prach_ce_level_3_hopping_enable), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-           pack_tlv(NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_3_HOPPING_OFFSET_TAG, &(pNfapiMsg->emtc_config.prach_ce_level_3_hopping_offset), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-           pack_tlv(NFAPI_EMTC_CONFIG_PUCCH_INTERVAL_ULHOPPINGCONFIGCOMMONMODEA_TAG, &(pNfapiMsg->emtc_config.pucch_interval_ulhoppingconfigcommonmodea), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-           pack_tlv(NFAPI_EMTC_CONFIG_PUCCH_INTERVAL_ULHOPPINGCONFIGCOMMONMODEB_TAG, &(pNfapiMsg->emtc_config.pucch_interval_ulhoppingconfigcommonmodeb), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-           pack_tlv(NFAPI_TDD_FRAME_STRUCTURE_SUBFRAME_ASSIGNMENT_TAG, &(pNfapiMsg->tdd_frame_structure_config.subframe_assignment), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-           pack_tlv(NFAPI_TDD_FRAME_STRUCTURE_SPECIAL_SUBFRAME_PATTERNS_TAG, &(pNfapiMsg->tdd_frame_structure_config.special_subframe_patterns), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-           pack_tlv(NFAPI_L23_CONFIG_DATA_REPORT_MODE_TAG, &(pNfapiMsg->l23_config.data_report_mode), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-           pack_tlv(NFAPI_L23_CONFIG_SFNSF_TAG, &(pNfapiMsg->l23_config.sfnsf), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-           pack_tlv(NFAPI_NFAPI_P7_VNF_ADDRESS_IPV4_TAG, &(pNfapiMsg->nfapi_config.p7_vnf_address_ipv4), ppWritePackedMsg, end, &pack_ipv4_address_value) &&
-           pack_tlv(NFAPI_NFAPI_P7_VNF_ADDRESS_IPV6_TAG, &(pNfapiMsg->nfapi_config.p7_vnf_address_ipv6), ppWritePackedMsg, end, &pack_ipv6_address_value) &&
-           pack_tlv(NFAPI_NFAPI_P7_VNF_PORT_TAG, &(pNfapiMsg->nfapi_config.p7_vnf_port), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-           pack_tlv(NFAPI_NFAPI_P7_PNF_ADDRESS_IPV4_TAG, &(pNfapiMsg->nfapi_config.p7_pnf_address_ipv4), ppWritePackedMsg, end, &pack_ipv4_address_value) &&
-           pack_tlv(NFAPI_NFAPI_P7_PNF_ADDRESS_IPV6_TAG, &(pNfapiMsg->nfapi_config.p7_pnf_address_ipv6), ppWritePackedMsg, end, &pack_ipv6_address_value) &&
-           pack_tlv(NFAPI_NFAPI_P7_PNF_PORT_TAG, &(pNfapiMsg->nfapi_config.p7_pnf_port), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-           pack_tlv(NFAPI_NFAPI_DOWNLINK_UES_PER_SUBFRAME_TAG, &(pNfapiMsg->nfapi_config.dl_ue_per_sf), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
-           pack_tlv(NFAPI_NFAPI_UPLINK_UES_PER_SUBFRAME_TAG, &(pNfapiMsg->nfapi_config.ul_ue_per_sf), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
-           pack_tlv(NFAPI_PHY_RF_BANDS_TAG, &(pNfapiMsg->nfapi_config.rf_bands), ppWritePackedMsg, end, &pack_rf_bands_value) &&
-           pack_tlv(NFAPI_NFAPI_TIMING_WINDOW_TAG, &(pNfapiMsg->nfapi_config.timing_window), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
-           pack_tlv(NFAPI_NFAPI_TIMING_INFO_MODE_TAG, &(pNfapiMsg->nfapi_config.timing_info_mode), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
-           pack_tlv(NFAPI_NFAPI_TIMING_INFO_PERIOD_TAG, &(pNfapiMsg->nfapi_config.timing_info_period), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
-           pack_tlv(NFAPI_NFAPI_MAXIMUM_TRANSMIT_POWER_TAG, &(pNfapiMsg->nfapi_config.max_transmit_power), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-           pack_tlv(NFAPI_NFAPI_EARFCN_TAG, &(pNfapiMsg->nfapi_config.earfcn), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-           pack_tlv(NFAPI_NFAPI_NMM_GSM_FREQUENCY_BANDS_TAG, &(pNfapiMsg->nfapi_config.nmm_gsm_frequency_bands), ppWritePackedMsg, end, &pack_nmm_frequency_bands_value) &&
-           pack_tlv(NFAPI_NFAPI_NMM_UMTS_FREQUENCY_BANDS_TAG, &(pNfapiMsg->nfapi_config.nmm_umts_frequency_bands), ppWritePackedMsg, end, &pack_nmm_frequency_bands_value) &&
-           pack_tlv(NFAPI_NFAPI_NMM_LTE_FREQUENCY_BANDS_TAG, &(pNfapiMsg->nfapi_config.nmm_lte_frequency_bands), ppWritePackedMsg, end, &pack_nmm_frequency_bands_value) &&
-           pack_tlv(NFAPI_NFAPI_NMM_UPLINK_RSSI_SUPPORTED_TAG, &(pNfapiMsg->nfapi_config.nmm_uplink_rssi_supported), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
-           pack_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config) );
-}
-
-
-static uint8_t pack_nr_config_request(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p4_p5_codec_config_t* config)
-{
-
-	nfapi_nr_config_request_scf_t *pNfapiMsg = (nfapi_nr_config_request_scf_t*)msg;
-
-	for(int i = 0; i<40; i++){ //packing tdd slot config
-		for(int symbol = 0; symbol<14;symbol++){
-			push8(pNfapiMsg->tdd_table.max_tdd_periodicity_list[i].max_num_of_symbol_per_slot_list[symbol].slot_config.value, ppWritePackedMsg,end);
-		}
-	}
-
-	return (push8(pNfapiMsg->num_tlv, ppWritePackedMsg, end) &&
-		    pack_tlv(NFAPI_NR_CONFIG_DL_BANDWIDTH_TAG, &(pNfapiMsg->carrier_config.dl_bandwidth), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-			pack_tlv(NFAPI_NR_CONFIG_DL_FREQUENCY_TAG, &(pNfapiMsg->carrier_config.dl_frequency), ppWritePackedMsg, end, &pack_uint32_tlv_value) &&
-			pack_tlv(NFAPI_NR_CONFIG_DL_GRID_SIZE_TAG, &(pNfapiMsg->carrier_config.dl_grid_size[1]), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-			pack_tlv(NFAPI_NR_CONFIG_DL_K0_TAG, &(pNfapiMsg->carrier_config.dl_k0[1]), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-			pack_tlv(NFAPI_NR_CONFIG_NUM_RX_ANT_TAG, &(pNfapiMsg->carrier_config.num_rx_ant), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-			pack_tlv(NFAPI_NR_CONFIG_NUM_TX_ANT_TAG, &(pNfapiMsg->carrier_config.num_tx_ant), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-			pack_tlv(NFAPI_NR_CONFIG_UL_GRID_SIZE_TAG, &(pNfapiMsg->carrier_config.ul_grid_size[1]), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-			pack_tlv(NFAPI_NR_CONFIG_UL_K0_TAG, &(pNfapiMsg->carrier_config.ul_k0[1]), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-			pack_tlv(NFAPI_NR_CONFIG_UPLINK_BANDWIDTH_TAG, &(pNfapiMsg->carrier_config.uplink_bandwidth), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-			pack_tlv(NFAPI_NR_CONFIG_UPLINK_FREQUENCY_TAG, &(pNfapiMsg->carrier_config.uplink_frequency), ppWritePackedMsg, end, &pack_uint32_tlv_value) &&
-			
-			pack_tlv(NFAPI_NR_CONFIG_FRAME_DUPLEX_TYPE_TAG, &(pNfapiMsg->cell_config.frame_duplex_type), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
-			pack_tlv(NFAPI_NR_CONFIG_PHY_CELL_ID_TAG, &(pNfapiMsg->cell_config.phy_cell_id), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
-			
-			pack_tlv(NFAPI_NR_CONFIG_NUM_PRACH_FD_OCCASIONS_TAG, &(pNfapiMsg->prach_config.num_prach_fd_occasions), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
-			pack_tlv(NFAPI_NR_CONFIG_PRACH_SEQUENCE_LENGTH_TAG, &(pNfapiMsg->prach_config.prach_sequence_length), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
-			pack_tlv(NFAPI_NR_CONFIG_RESTRICTED_SET_CONFIG_TAG, &(pNfapiMsg->prach_config.restricted_set_config), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
-			pack_tlv(NFAPI_NR_CONFIG_SSB_PER_RACH_TAG, &(pNfapiMsg->prach_config.ssb_per_rach), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
-            pack_tlv(NFAPI_NR_CONFIG_PRACH_SUB_C_SPACING_TAG, &(pNfapiMsg->prach_config.prach_sub_c_spacing), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
-            pack_tlv(NFAPI_NR_CONFIG_PRACH_ROOT_SEQUENCE_INDEX_TAG, &(pNfapiMsg->prach_config.num_prach_fd_occasions_list[0].prach_root_sequence_index), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-            pack_tlv(NFAPI_NR_CONFIG_K1_TAG, &(pNfapiMsg->prach_config.num_prach_fd_occasions_list[0].k1), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-            pack_tlv(NFAPI_NR_CONFIG_PRACH_ZERO_CORR_CONF_TAG, &(pNfapiMsg->prach_config.num_prach_fd_occasions_list[0].prach_zero_corr_conf), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
-			pack_tlv(NFAPI_NR_CONFIG_NUM_ROOT_SEQUENCES_TAG, &(pNfapiMsg->prach_config.num_prach_fd_occasions_list[0].num_root_sequences), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
-
-
-			pack_tlv(NFAPI_NR_CONFIG_SCS_COMMON_TAG, &(pNfapiMsg->ssb_config.scs_common), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
-			pack_tlv(NFAPI_NR_CONFIG_SS_PBCH_POWER_TAG, &(pNfapiMsg->ssb_config.ss_pbch_power), ppWritePackedMsg, end, &pack_uint32_tlv_value) &&
-
-			pack_tlv(NFAPI_NR_CONFIG_BETA_PSS_TAG, &(pNfapiMsg->ssb_table.beta_pss), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
-			pack_tlv(NFAPI_NR_CONFIG_MIB_TAG, &(pNfapiMsg->ssb_table.MIB), ppWritePackedMsg, end, &pack_uint32_tlv_value) &&
-			pack_tlv(NFAPI_NR_CONFIG_SSB_MASK_TAG, &(pNfapiMsg->ssb_table.ssb_mask_list[0].ssb_mask), ppWritePackedMsg, end, &pack_uint32_tlv_value) &&
-			pack_tlv(NFAPI_NR_CONFIG_SSB_MASK_TAG, &(pNfapiMsg->ssb_table.ssb_mask_list[1].ssb_mask), ppWritePackedMsg, end, &pack_uint32_tlv_value) &&
-
-			pack_tlv(NFAPI_NR_CONFIG_SSB_OFFSET_POINT_A_TAG, &(pNfapiMsg->ssb_table.ssb_offset_point_a), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-			pack_tlv(NFAPI_NR_CONFIG_SSB_PERIOD_TAG, &(pNfapiMsg->ssb_table.ssb_period), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
-			pack_tlv(NFAPI_NR_CONFIG_SSB_SUBCARRIER_OFFSET_TAG, &(pNfapiMsg->ssb_table.ssb_subcarrier_offset), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
-
-			pack_tlv(NFAPI_NR_CONFIG_TDD_PERIOD_TAG, &(pNfapiMsg->tdd_table.tdd_period), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
-			pack_tlv(NFAPI_NR_NFAPI_P7_PNF_ADDRESS_IPV4_TAG, &(pNfapiMsg->nfapi_config.p7_pnf_address_ipv4), ppWritePackedMsg, end, &pack_ipv4_address_value) &&
-			pack_tlv(NFAPI_NR_NFAPI_P7_PNF_ADDRESS_IPV6_TAG, &(pNfapiMsg->nfapi_config.p7_pnf_address_ipv6), ppWritePackedMsg, end, &pack_ipv6_address_value) &&
-			pack_tlv(NFAPI_NR_NFAPI_P7_PNF_PORT_TAG, &(pNfapiMsg->nfapi_config.p7_pnf_port), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-			pack_tlv(NFAPI_NR_NFAPI_P7_VNF_ADDRESS_IPV4_TAG, &(pNfapiMsg->nfapi_config.p7_vnf_address_ipv4), ppWritePackedMsg, end, &pack_ipv4_address_value) &&
-			pack_tlv(NFAPI_NR_NFAPI_P7_VNF_ADDRESS_IPV6_TAG, &(pNfapiMsg->nfapi_config.p7_vnf_address_ipv6), ppWritePackedMsg, end, &pack_ipv6_address_value) &&
-			pack_tlv(NFAPI_NR_NFAPI_P7_VNF_PORT_TAG, &(pNfapiMsg->nfapi_config.p7_vnf_port), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-			//pack_tlv(NFAPI_NR_NFAPI_RF_BANDS_TAG, &(pNfapiMsg->nfapi_config.rf_bands), ppWritePackedMsg, end, &pack_rf_bands_value) &&
-			pack_tlv(NFAPI_NR_NFAPI_TIMING_INFO_MODE_TAG, &(pNfapiMsg->nfapi_config.timing_info_mode), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
-			pack_tlv(NFAPI_NR_NFAPI_TIMING_INFO_PERIOD_TAG, &(pNfapiMsg->nfapi_config.timing_info_period), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
-			pack_tlv(NFAPI_NR_NFAPI_TIMING_WINDOW_TAG, &(pNfapiMsg->nfapi_config.timing_window), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
-			//pack_tlv(NFAPI_NR_NFAPI_UPLINK_UES_PER_SUBFRAME_TAG, &(pNfapiMsg->nfapi_config.ul_ue_per_sf), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
-
-			pack_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config) );
-}
-
-static uint8_t pack_nr_config_response(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p4_p5_codec_config_t *config) {
-  nfapi_nr_config_response_scf_t *pNfapiMsg = (nfapi_nr_config_response_scf_t *)msg;
-  return ( push8(pNfapiMsg->error_code, ppWritePackedMsg, end) &&
-           pack_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config) );
-}
-
-static uint8_t pack_config_response(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p4_p5_codec_config_t *config) {
-  nfapi_config_response_t *pNfapiMsg = (nfapi_config_response_t *)msg;
-  return ( push8(pNfapiMsg->error_code, ppWritePackedMsg, end) &&
-           pack_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config) );
-}
-
-static uint8_t pack_nr_start_request(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p4_p5_codec_config_t *config) {
-  nfapi_nr_start_request_scf_t *pNfapiMsg = (nfapi_nr_start_request_scf_t *)msg;
-  return pack_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config);
-}
-
-static uint8_t pack_start_request(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p4_p5_codec_config_t *config) {
-  nfapi_start_request_t *pNfapiMsg = (nfapi_start_request_t *)msg;
-  return pack_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config);
-}
-
-static uint8_t pack_nr_start_response(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p4_p5_codec_config_t *config) {
-  nfapi_nr_start_response_scf_t *pNfapiMsg = (nfapi_nr_start_response_scf_t *)msg;
-  return ( push32(pNfapiMsg->error_code, ppWritePackedMsg, end ) &&
-           pack_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config) );
-}
-
-static uint8_t pack_start_response(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p4_p5_codec_config_t *config) {
-  nfapi_start_response_t *pNfapiMsg = (nfapi_start_response_t *)msg;
-  return ( push32(pNfapiMsg->error_code, ppWritePackedMsg, end ) &&
-           pack_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config) );
-}
-
-
-static uint8_t pack_stop_request(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p4_p5_codec_config_t *config) {
-  nfapi_stop_request_t *pNfapiMsg = (nfapi_stop_request_t *)msg;
-  return pack_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config);
-}
-
-static uint8_t pack_stop_response(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p4_p5_codec_config_t *config) {
-  nfapi_stop_response_t *pNfapiMsg = (nfapi_stop_response_t *)msg;
-  return ( push32(pNfapiMsg->error_code, ppWritePackedMsg, end) &&
-           pack_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config) );
-}
-
-static uint8_t pack_measurement_request(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p4_p5_codec_config_t *config) {
-  nfapi_measurement_request_t *pNfapiMsg = (nfapi_measurement_request_t *)msg;
-  return( pack_tlv(NFAPI_MEASUREMENT_REQUEST_DL_RS_XTX_POWER_TAG, &(pNfapiMsg->dl_rs_tx_power), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-          pack_tlv(NFAPI_MEASUREMENT_REQUEST_RECEIVED_INTERFERENCE_POWER_TAG, &(pNfapiMsg->received_interference_power), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-          pack_tlv(NFAPI_MEASUREMENT_REQUEST_THERMAL_NOISE_POWER_TAG, &(pNfapiMsg->thermal_noise_power), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-          pack_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config));
-}
-
-static uint8_t pack_recevied_interference_power_measurement_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
-  nfapi_received_interference_power_measurement_t *value = (nfapi_received_interference_power_measurement_t *)tlv;
-  return  ( push16(value->number_of_resource_blocks, ppWritePackedMsg, end) &&
-            pusharrays16(value->received_interference_power, NFAPI_MAX_RECEIVED_INTERFERENCE_POWER_RESULTS, value->number_of_resource_blocks, ppWritePackedMsg, end));
-}
-
-static uint8_t pack_measurement_response(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p4_p5_codec_config_t *config) {
-  nfapi_measurement_response_t *pNfapiMsg = (nfapi_measurement_response_t *)msg;
-  return( push32(pNfapiMsg->error_code, ppWritePackedMsg, end) &&
-          pack_tlv(NFAPI_MEASUREMENT_RESPONSE_DL_RS_POWER_MEASUREMENT_TAG, &(pNfapiMsg->dl_rs_tx_power_measurement), ppWritePackedMsg, end, &pack_int16_tlv_value) &&
-          pack_tlv(NFAPI_MEASUREMENT_RESPONSE_RECEIVED_INTERFERENCE_POWER_MEASUREMENT_TAG, &(pNfapiMsg->received_interference_power_measurement), ppWritePackedMsg, end,
-                   &pack_recevied_interference_power_measurement_value) &&
-          pack_tlv(NFAPI_MEASUREMENT_RESPONSE_THERMAL_NOISE_MEASUREMENT_TAG, &(pNfapiMsg->thermal_noise_power_measurement), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-          pack_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config));
-}
-
-static uint8_t pack_nr_p5_message_body(nfapi_p4_p5_message_header_t *header, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p4_p5_codec_config_t *config) {
-  uint8_t result = 0;
-
-  // look for the specific message
-  switch (header->message_id) {
-    case NFAPI_NR_PHY_MSG_TYPE_PNF_PARAM_REQUEST:
-      result = pack_nr_pnf_param_request(header, ppWritePackedMsg, end, config);
-      break;
-
-    case NFAPI_PNF_PARAM_RESPONSE:
-      result = pack_nr_pnf_param_response(header, ppWritePackedMsg, end, config);
-      break;
-
-    case NFAPI_NR_PHY_MSG_TYPE_PNF_CONFIG_REQUEST:
-      result = pack_nr_pnf_config_request(header, ppWritePackedMsg, end, config);
-      break;
-
-    case NFAPI_NR_PHY_MSG_TYPE_PNF_CONFIG_RESPONSE:
-      result = pack_nr_pnf_config_response(header, ppWritePackedMsg, end, config);
-      break;
-
-    case NFAPI_NR_PHY_MSG_TYPE_PNF_START_REQUEST:
-      result = pack_nr_pnf_start_request(header, ppWritePackedMsg, end, config);
-      break;
-
-    case NFAPI_NR_PHY_MSG_TYPE_PNF_START_RESPONSE:
-      result = pack_nr_pnf_start_response(header, ppWritePackedMsg, end, config);
-      break;
-
-    case NFAPI_NR_PHY_MSG_TYPE_PNF_STOP_REQUEST:
-      result = pack_nr_pnf_stop_request(header, ppWritePackedMsg, end, config);
-      break;
-
-    case NFAPI_PNF_STOP_RESPONSE:
-      result = pack_nr_pnf_stop_response(header, ppWritePackedMsg, end, config);
-      break;
-
-    case NFAPI_NR_PHY_MSG_TYPE_PARAM_REQUEST:
-      result = pack_nr_param_request(header, ppWritePackedMsg, end, config);
-      break;
-
-    case NFAPI_NR_PHY_MSG_TYPE_PARAM_RESPONSE:
-      result = pack_nr_param_response(header, ppWritePackedMsg, end, config);
-      break;
-
-    case NFAPI_NR_PHY_MSG_TYPE_CONFIG_REQUEST:
-      result = pack_nr_config_request(header, ppWritePackedMsg, end, config);
-      break;
-
-    case NFAPI_NR_PHY_MSG_TYPE_CONFIG_RESPONSE:
-      result = pack_nr_config_response(header, ppWritePackedMsg, end, config);
-      break;
-
-    case NFAPI_NR_PHY_MSG_TYPE_START_REQUEST:
-      result = pack_nr_start_request(header, ppWritePackedMsg, end, config);
-      break;
-
-    case NFAPI_NR_PHY_MSG_TYPE_START_RESPONSE:
-      result = pack_nr_start_response(header, ppWritePackedMsg, end, config);
-      break;
-
-    case NFAPI_NR_PHY_MSG_TYPE_STOP_REQUEST:
-      result = pack_stop_request(header, ppWritePackedMsg, end, config);
-      break;
-
-    case NFAPI_NR_PHY_MSG_TYPE_STOP_RESPONSE:
-      result = pack_stop_response(header, ppWritePackedMsg, end, config);
-      break;
-
-    default: {
-      if(header->message_id >= NFAPI_VENDOR_EXT_MSG_MIN &&
-          header->message_id <= NFAPI_VENDOR_EXT_MSG_MAX) {
-        if(config && config->pack_p4_p5_vendor_extension) {
-          result = (config->pack_p4_p5_vendor_extension)(header, ppWritePackedMsg, end, config);
-        } else {
-          NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s VE NFAPI message ID %d. No ve ecoder provided\n", __FUNCTION__, header->message_id);
-        }
-      } else {
-        NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s NFAPI Unknown message ID %d\n", __FUNCTION__, header->message_id);
-      }
-    }
-    break;
-  }
-
-  return result;
-}
-
-
-static uint8_t pack_p5_message_body(nfapi_p4_p5_message_header_t *header, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p4_p5_codec_config_t *config) {
-  uint8_t result = 0;
-
-  // look for the specific message
-  switch (header->message_id) {
-    case NFAPI_PNF_PARAM_REQUEST:
-      result = pack_pnf_param_request(header, ppWritePackedMsg, end, config);
-      break;
-
-    case NFAPI_PNF_PARAM_RESPONSE:
-      result = pack_pnf_param_response(header, ppWritePackedMsg, end, config);
-      break;
-
-    case NFAPI_PNF_CONFIG_REQUEST:
-      result = pack_pnf_config_request(header, ppWritePackedMsg, end, config);
-      break;
-
-    case NFAPI_PNF_CONFIG_RESPONSE:
-      result = pack_pnf_config_response(header, ppWritePackedMsg, end, config);
-      break;
-
-    case NFAPI_PNF_START_REQUEST:
-      result = pack_pnf_start_request(header, ppWritePackedMsg, end, config);
-      break;
-
-    case NFAPI_PNF_START_RESPONSE:
-      result = pack_pnf_start_response(header, ppWritePackedMsg, end, config);
-      break;
-
-    case NFAPI_PNF_STOP_REQUEST:
-      result = pack_pnf_stop_request(header, ppWritePackedMsg, end, config);
-      break;
-
-    case NFAPI_PNF_STOP_RESPONSE:
-      result = pack_pnf_stop_response(header, ppWritePackedMsg, end, config);
-      break;
-
-    case NFAPI_PARAM_REQUEST:
-      result = pack_param_request(header, ppWritePackedMsg, end, config);
-      break;
-
-    case NFAPI_PARAM_RESPONSE:
-      result = pack_param_response(header, ppWritePackedMsg, end, config);
-      break;
-
-    case NFAPI_CONFIG_REQUEST:
-      result = pack_config_request(header, ppWritePackedMsg, end, config);
-      break;
-
-    case NFAPI_CONFIG_RESPONSE:
-      result = pack_config_response(header, ppWritePackedMsg, end, config);
-      break;
-
-    case NFAPI_START_REQUEST:
-      result = pack_start_request(header, ppWritePackedMsg, end, config);
-      break;
-
-    case NFAPI_START_RESPONSE:
-      result = pack_start_response(header, ppWritePackedMsg, end, config);
-      break;
-
-    case NFAPI_STOP_REQUEST:
-      result = pack_stop_request(header, ppWritePackedMsg, end, config);
-      break;
-
-    case NFAPI_STOP_RESPONSE:
-      result = pack_stop_response(header, ppWritePackedMsg, end, config);
-      break;
-
-    case NFAPI_MEASUREMENT_REQUEST:
-      result = pack_measurement_request(header, ppWritePackedMsg, end, config);
-      break;
-
-    case NFAPI_MEASUREMENT_RESPONSE:
-      result = pack_measurement_response(header, ppWritePackedMsg, end, config);
-      break;
-
-    default: {
-      if(header->message_id >= NFAPI_VENDOR_EXT_MSG_MIN &&
-          header->message_id <= NFAPI_VENDOR_EXT_MSG_MAX) {
-        if(config && config->pack_p4_p5_vendor_extension) {
-          result = (config->pack_p4_p5_vendor_extension)(header, ppWritePackedMsg, end, config);
-        } else {
-          NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s VE NFAPI message ID %d. No ve ecoder provided\n", __FUNCTION__, header->message_id);
-        }
-      } else {
-        NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s NFAPI Unknown message ID %d\n", __FUNCTION__, header->message_id);
-      }
-    }
-    break;
-  }
-
-  return result;
-}
-
-
-// helper function for message length calculation -
-// takes the pointers to the start of message to end of message
-
-static uint32_t get_packed_msg_len(uintptr_t msgHead, uintptr_t msgEnd) {
-  if (msgEnd < msgHead) {
-    NFAPI_TRACE(NFAPI_TRACE_ERROR, "get_packed_msg_len: Error in pointers supplied %d, %d\n", msgHead, msgEnd);
-    return 0;
-  }
-
-  return (msgEnd - msgHead);
-}
-
-// Main pack function - public
-int nfapi_nr_p5_message_pack(void *pMessageBuf, uint32_t messageBufLen, void *pPackedBuf, uint32_t packedBufLen, nfapi_p4_p5_codec_config_t *config) {
-  nfapi_p4_p5_message_header_t *pMessageHeader = pMessageBuf;
-  uint8_t *pWritePackedMessage = pPackedBuf;
-  uint8_t *pPackMessageEnd = pPackedBuf + packedBufLen;
-  uint8_t *pPackedLengthField = &pWritePackedMessage[4];
-  uint32_t packedMsgLen;
-  uint16_t packedMsgLen16;
-
-  if (pMessageBuf == NULL || pPackedBuf == NULL) {
-    NFAPI_TRACE(NFAPI_TRACE_ERROR, "P5 Pack supplied pointers are null\n");
-    return -1;
-  }
-
-  // pack the message
-  if(push16(pMessageHeader->phy_id, &pWritePackedMessage, pPackMessageEnd) &&
-      push16(pMessageHeader->message_id, &pWritePackedMessage, pPackMessageEnd) &&
-      push16(0, &pWritePackedMessage, pPackMessageEnd) &&
-      push16(pMessageHeader->spare, &pWritePackedMessage, pPackMessageEnd) &&
-      pack_nr_p5_message_body(pMessageHeader, &pWritePackedMessage, pPackMessageEnd, config)) {
-    // check for a valid message length
-    packedMsgLen = get_packed_msg_len((uintptr_t)pPackedBuf, (uintptr_t)pWritePackedMessage);
-
-    if (packedMsgLen > 0xFFFF || packedMsgLen > packedBufLen) {
-      NFAPI_TRACE(NFAPI_TRACE_ERROR, "Packed message length error %d, buffer supplied %d\n", packedMsgLen, packedBufLen);
-      return -1;
-    } else {
-      packedMsgLen16 = (uint16_t)packedMsgLen;
-    }
-
-    // Update the message length in the header
-    if(!push16(packedMsgLen16, &pPackedLengthField, pPackMessageEnd))
-      return -1;
-
-    // return the packed length
-    return (packedMsgLen);
-  } else {
-    // Failed to pack the meassage
-    NFAPI_TRACE(NFAPI_TRACE_ERROR, "P5 Failed to pack message\n");
-    return -1;
-  }
-}
-
-int nfapi_p5_message_pack(void *pMessageBuf, uint32_t messageBufLen, void *pPackedBuf, uint32_t packedBufLen, nfapi_p4_p5_codec_config_t *config) {
-  nfapi_p4_p5_message_header_t *pMessageHeader = pMessageBuf;
-  uint8_t *pWritePackedMessage = pPackedBuf;
-  uint8_t *pPackMessageEnd = pPackedBuf + packedBufLen;
-  uint8_t *pPackedLengthField = &pWritePackedMessage[4];
-  uint32_t packedMsgLen;
-  uint16_t packedMsgLen16;
-
-  if (pMessageBuf == NULL || pPackedBuf == NULL) {
-    NFAPI_TRACE(NFAPI_TRACE_ERROR, "P5 Pack supplied pointers are null\n");
-    return -1;
-  }
-
-  // pack the message
-  if(push16(pMessageHeader->phy_id, &pWritePackedMessage, pPackMessageEnd) &&
-      push16(pMessageHeader->message_id, &pWritePackedMessage, pPackMessageEnd) &&
-      push16(0/*pMessageHeader->message_length*/, &pWritePackedMessage, pPackMessageEnd) &&
-      push16(pMessageHeader->spare, &pWritePackedMessage, pPackMessageEnd) &&
-      pack_p5_message_body(pMessageHeader, &pWritePackedMessage, pPackMessageEnd, config)) {
-    // check for a valid message length
-    packedMsgLen = get_packed_msg_len((uintptr_t)pPackedBuf, (uintptr_t)pWritePackedMessage);
-
-    if (packedMsgLen > 0xFFFF || packedMsgLen > packedBufLen) {
-      NFAPI_TRACE(NFAPI_TRACE_ERROR, "Packed message length error %d, buffer supplied %d\n", packedMsgLen, packedBufLen);
-      return -1;
-    } else {
-      packedMsgLen16 = (uint16_t)packedMsgLen;
-    }
-
-    // Update the message length in the header
-    if(!push16(packedMsgLen16, &pPackedLengthField, pPackMessageEnd))
-      return -1;
-
-    // return the packed length
-    return (packedMsgLen);
-  } else {
-    // Failed to pack the meassage
-    NFAPI_TRACE(NFAPI_TRACE_ERROR, "P5 Failed to pack message\n");
-    return -1;
-  }
-}
-
-
-
-// Unpack routines
-
-
-static uint8_t  unpack_nr_pnf_param_request(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p4_p5_codec_config_t *config) {
-  nfapi_nr_pnf_param_request_t *pNfapiMsg = (nfapi_nr_pnf_param_request_t *)msg;
-  return unpack_tlv_list(NULL, 0, ppReadPackedMsg, end, config, &(pNfapiMsg->vendor_extension));
-}
-
-
-static uint8_t  unpack_pnf_param_request(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p4_p5_codec_config_t *config) {
-  nfapi_pnf_param_request_t *pNfapiMsg = (nfapi_pnf_param_request_t *)msg;
-  return unpack_tlv_list(NULL, 0, ppReadPackedMsg, end, config, &(pNfapiMsg->vendor_extension));
-}
-
-static uint8_t unpack_pnf_param_general_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
-  nfapi_pnf_param_general_t *value = (nfapi_pnf_param_general_t *)tlv;
-  return( pull8(ppReadPackedMsg, &value->nfapi_sync_mode, end) &&
-          pull8(ppReadPackedMsg, &value->location_mode, end) &&
-          pull16(ppReadPackedMsg, &value->location_coordinates_length, end) &&
-          pullarray8(ppReadPackedMsg, value->location_coordinates, NFAPI_PNF_PARAM_GENERAL_LOCATION_LENGTH, value->location_coordinates_length, end) &&
-          pull32(ppReadPackedMsg, &value->dl_config_timing, end) &&
-          pull32(ppReadPackedMsg, &value->tx_timing, end) &&
-          pull32(ppReadPackedMsg, &value->ul_config_timing, end) &&
-          pull32(ppReadPackedMsg, &value->hi_dci0_timing, end) &&
-          pull16(ppReadPackedMsg, &value->maximum_number_phys, end) &&
-          pull16(ppReadPackedMsg, &value->maximum_total_bandwidth, end) &&
-          pull8(ppReadPackedMsg, &value->maximum_total_number_dl_layers, end) &&
-          pull8(ppReadPackedMsg, &value->maximum_total_number_ul_layers, end) &&
-          pull8(ppReadPackedMsg, &value->shared_bands, end) &&
-          pull8(ppReadPackedMsg, &value->shared_pa, end) &&
-          pulls16(ppReadPackedMsg, &value->maximum_total_power, end) &&
-          pullarray8(ppReadPackedMsg, value->oui, NFAPI_PNF_PARAM_GENERAL_OUI_LENGTH, NFAPI_PNF_PARAM_GENERAL_OUI_LENGTH, end));
-}
-
-static uint8_t unpack_rf_config_info(void *elem, uint8_t **ppReadPackedMsg, uint8_t *end) {
-  nfapi_rf_config_info_t *info = (nfapi_rf_config_info_t *)elem;
-  return pull16(ppReadPackedMsg, &info->rf_config_index, end);
-}
-
-static uint8_t unpack_pnf_phy_info(void *elem, uint8_t **ppReadPackedMsg, uint8_t *end) {
-  nfapi_pnf_phy_info_t *phy = (nfapi_pnf_phy_info_t *)elem;
-  return ( pull16(ppReadPackedMsg, &phy->phy_config_index, end) &&
-           pull16(ppReadPackedMsg, &phy->number_of_rfs, end) &&
-           unpackarray(ppReadPackedMsg, phy->rf_config, sizeof(nfapi_rf_config_info_t), NFAPI_MAX_PNF_PHY_RF_CONFIG, phy->number_of_rfs, end, &unpack_rf_config_info) &&
-           pull16(ppReadPackedMsg, &phy->number_of_rf_exclusions, end) &&
-           unpackarray(ppReadPackedMsg, phy->excluded_rf_config, sizeof(nfapi_rf_config_info_t), NFAPI_MAX_PNF_PHY_RF_CONFIG, phy->number_of_rf_exclusions, end, &unpack_rf_config_info) &&
-           pull16(ppReadPackedMsg, &phy->downlink_channel_bandwidth_supported, end) &&
-           pull16(ppReadPackedMsg, &phy->uplink_channel_bandwidth_supported, end) &&
-           pull8(ppReadPackedMsg, &phy->number_of_dl_layers_supported, end) &&
-           pull8(ppReadPackedMsg, &phy->number_of_ul_layers_supported, end) &&
-           pull16(ppReadPackedMsg, &phy->maximum_3gpp_release_supported, end) &&
-           pull8(ppReadPackedMsg, &phy->nmm_modes_supported, end));
-}
-
-
-static uint8_t unpack_pnf_phy_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
-  nfapi_pnf_phy_t *value = (nfapi_pnf_phy_t *)tlv;
-  return ( pull16(ppReadPackedMsg, &value->number_of_phys, end) &&
-           unpackarray(ppReadPackedMsg, value->phy, sizeof(nfapi_pnf_phy_info_t), NFAPI_MAX_PNF_PHY, value->number_of_phys, end, &unpack_pnf_phy_info));
-}
-
-static uint8_t unpack_pnf_rf_info(void *elem, uint8_t **ppReadPackedMsg, uint8_t *end) {
-  nfapi_pnf_rf_info_t *rf = (nfapi_pnf_rf_info_t *)elem;
-  return( pull16(ppReadPackedMsg, &rf->rf_config_index, end) &&
-          pull16(ppReadPackedMsg, &rf->band, end) &&
-          pulls16(ppReadPackedMsg, &rf->maximum_transmit_power, end) &&
-          pulls16(ppReadPackedMsg, &rf->minimum_transmit_power, end) &&
-          pull8(ppReadPackedMsg, &rf->number_of_antennas_suppported, end) &&
-          pull32(ppReadPackedMsg, &rf->minimum_downlink_frequency, end) &&
-          pull32(ppReadPackedMsg, &rf->maximum_downlink_frequency, end) &&
-          pull32(ppReadPackedMsg, &rf->minimum_uplink_frequency, end) &&
-          pull32(ppReadPackedMsg, &rf->maximum_uplink_frequency, end));
-}
-static uint8_t unpack_pnf_rf_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
-  nfapi_pnf_rf_t *value = (nfapi_pnf_rf_t *)tlv;
-  return ( pull16(ppReadPackedMsg, &value->number_of_rfs, end) &&
-           unpackarray(ppReadPackedMsg, value->rf, sizeof(nfapi_pnf_rf_info_t), NFAPI_MAX_PNF_RF, value->number_of_rfs, end, &unpack_pnf_rf_info));
-}
-
-static uint8_t unpack_pnf_phy_rel10_info(void *elem, uint8_t **ppReadPackedMsg, uint8_t *end) {
-  nfapi_pnf_phy_rel10_info_t *phy = (nfapi_pnf_phy_rel10_info_t *)elem;
-  return( pull16(ppReadPackedMsg, &phy->phy_config_index, end) &&
-          pull16(ppReadPackedMsg, &phy->transmission_mode_7_supported, end) &&
-          pull16(ppReadPackedMsg, &phy->transmission_mode_8_supported, end) &&
-          pull16(ppReadPackedMsg, &phy->two_antenna_ports_for_pucch, end) &&
-          pull16(ppReadPackedMsg, &phy->transmission_mode_9_supported, end) &&
-          pull16(ppReadPackedMsg, &phy->simultaneous_pucch_pusch, end) &&
-          pull16(ppReadPackedMsg, &phy->four_layer_tx_with_tm3_and_tm4, end));
-}
-static uint8_t unpack_pnf_phy_rel10_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
-  nfapi_pnf_phy_rel10_t *value = (nfapi_pnf_phy_rel10_t *)tlv;
-  return ( pull16(ppReadPackedMsg, &value->number_of_phys, end) &&
-           unpackarray(ppReadPackedMsg, value->phy, sizeof(nfapi_pnf_phy_rel10_info_t), NFAPI_MAX_PNF_PHY, value->number_of_phys, end, &unpack_pnf_phy_rel10_info));
-}
-
-
-static uint8_t unpack_pnf_phy_rel11_info(void *elem, uint8_t **ppReadPackedMsg, uint8_t *end) {
-  nfapi_pnf_phy_rel11_info_t *phy = (nfapi_pnf_phy_rel11_info_t *)elem;
-  return( pull16(ppReadPackedMsg, &phy->phy_config_index, end) &&
-          pull16(ppReadPackedMsg, &phy->edpcch_supported, end) &&
-          pull16(ppReadPackedMsg, &phy->multi_ack_csi_reporting, end ) &&
-          pull16(ppReadPackedMsg, &phy->pucch_tx_diversity, end) &&
-          pull16(ppReadPackedMsg, &phy->ul_comp_supported, end) &&
-          pull16(ppReadPackedMsg, &phy->transmission_mode_5_supported, end));
-}
-
-static uint8_t unpack_pnf_phy_rel11_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
-  nfapi_pnf_phy_rel11_t *value = (nfapi_pnf_phy_rel11_t *)tlv;
-  return ( pull16(ppReadPackedMsg, &value->number_of_phys, end) &&
-           unpackarray(ppReadPackedMsg, value->phy, sizeof(nfapi_pnf_phy_rel11_info_t), NFAPI_MAX_PNF_PHY, value->number_of_phys, end, &unpack_pnf_phy_rel11_info));
-}
-
-static uint8_t unpack_phy_phy_rel12_info(void *elem, uint8_t **ppReadPackedMsg, uint8_t *end) {
-  nfapi_pnf_phy_rel12_info_t *phy = (nfapi_pnf_phy_rel12_info_t *)elem;
-  return( pull16(ppReadPackedMsg, &phy->phy_config_index, end) &&
-          pull16(ppReadPackedMsg, &phy->csi_subframe_set, end) &&
-          pull16(ppReadPackedMsg, &phy->enhanced_4tx_codebook, end) &&
-          pull16(ppReadPackedMsg, &phy->drs_supported, end) &&
-          pull16(ppReadPackedMsg, &phy->ul_64qam_supported, end) &&
-          pull16(ppReadPackedMsg, &phy->transmission_mode_10_supported, end) &&
-          pull16(ppReadPackedMsg, &phy->alternative_bts_indices, end));
-}
-
-static uint8_t unpack_pnf_phy_rel12_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
-  nfapi_pnf_phy_rel12_t *value = (nfapi_pnf_phy_rel12_t *)tlv;
-  return (pull16(ppReadPackedMsg, &value->number_of_phys, end) &&
-          unpackarray(ppReadPackedMsg, value->phy, sizeof(nfapi_pnf_phy_rel12_t), NFAPI_MAX_PNF_PHY, value->number_of_phys, end, &unpack_phy_phy_rel12_info));
-}
-
-static uint8_t unpack_pnf_phy_rel13_info(void *elem, uint8_t **ppReadPackedMsg, uint8_t *end) {
-  nfapi_pnf_phy_rel13_info_t *phy = (nfapi_pnf_phy_rel13_info_t *)elem;
-  return( pull16(ppReadPackedMsg, &phy->phy_config_index, end) &&
-          pull16(ppReadPackedMsg, &phy->pucch_format4_supported, end) &&
-          pull16(ppReadPackedMsg, &phy->pucch_format5_supported, end) &&
-          pull16(ppReadPackedMsg, &phy->more_than_5_ca_support, end) &&
-          pull16(ppReadPackedMsg, &phy->laa_supported, end) &&
-          pull16(ppReadPackedMsg, &phy->laa_ending_in_dwpts_supported, end) &&
-          pull16(ppReadPackedMsg, &phy->laa_starting_in_second_slot_supported, end) &&
-          pull16(ppReadPackedMsg, &phy->beamforming_supported, end) &&
-          pull16(ppReadPackedMsg, &phy->csi_rs_enhancement_supported, end) &&
-          pull16(ppReadPackedMsg, &phy->drms_enhancement_supported, end) &&
-          pull16(ppReadPackedMsg, &phy->srs_enhancement_supported, end));
-}
-
-static uint8_t unpack_pnf_phy_rel13_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
-  nfapi_pnf_phy_rel13_t *value = (nfapi_pnf_phy_rel13_t *)tlv;
-  return ( pull16(ppReadPackedMsg, &value->number_of_phys, end) &&
-           unpackarray(ppReadPackedMsg, value->phy, sizeof(nfapi_pnf_phy_rel13_info_t), NFAPI_MAX_PNF_PHY, value->number_of_phys, end, &unpack_pnf_phy_rel13_info));
-}
-
-static uint8_t unpack_pnf_phy_rel13_nb_info_info(void *elem, uint8_t **ppReadPackedMsg, uint8_t *end) {
-  nfapi_pnf_phy_rel13_nb_iot_info_t *phy = (nfapi_pnf_phy_rel13_nb_iot_info_t *)elem;
-  return( pull16(ppReadPackedMsg, &phy->phy_config_index, end) &&
-          pull16(ppReadPackedMsg, &phy->number_of_rfs, end) &&
-          unpackarray(ppReadPackedMsg, phy->rf_config, sizeof(nfapi_rf_config_info_t), NFAPI_MAX_PNF_PHY_RF_CONFIG, phy->number_of_rfs, end, &unpack_rf_config_info) &&
-          pull16(ppReadPackedMsg, &phy->number_of_rf_exclusions, end) &&
-          unpackarray(ppReadPackedMsg, phy->excluded_rf_config, sizeof(nfapi_rf_config_info_t), NFAPI_MAX_PNF_PHY_RF_CONFIG, phy->number_of_rf_exclusions, end, &unpack_rf_config_info) &&
-          pull8(ppReadPackedMsg, &phy->number_of_dl_layers_supported, end) &&
-          pull8(ppReadPackedMsg, &phy->number_of_ul_layers_supported, end) &&
-          pull16(ppReadPackedMsg, &phy->maximum_3gpp_release_supported, end) &&
-          pull8(ppReadPackedMsg, &phy->nmm_modes_supported, end));
-}
-
-static uint8_t unpack_pnf_phy_rel13_nb_iot_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
-  nfapi_pnf_phy_rel13_nb_iot_t *value = (nfapi_pnf_phy_rel13_nb_iot_t *)tlv;
-  return ( pull16(ppReadPackedMsg, &value->number_of_phys, end) &&
-           unpackarray(ppReadPackedMsg, value->phy, sizeof(nfapi_pnf_phy_rel13_nb_iot_info_t), NFAPI_MAX_PNF_PHY, value->number_of_phys, end, &unpack_pnf_phy_rel13_nb_info_info));
-}
-
-static uint8_t unpack_nr_pnf_param_response(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p4_p5_codec_config_t *config) {
-  nfapi_nr_pnf_param_response_t *pNfapiMsg = (nfapi_nr_pnf_param_response_t *)msg;
-  unpack_tlv_t unpack_fns[] = {
-    { NFAPI_PNF_PARAM_GENERAL_TAG, &pNfapiMsg->pnf_param_general, &unpack_pnf_param_general_value},
-    { NFAPI_PNF_PHY_TAG, &pNfapiMsg->pnf_phy, &unpack_pnf_phy_value},
-  };
-  return ( pull32(ppReadPackedMsg, &pNfapiMsg->error_code, end) &&
-           unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, end, config, &pNfapiMsg->vendor_extension));
-}
-
-
-
-static uint8_t unpack_pnf_param_response(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p4_p5_codec_config_t *config) {
-  nfapi_pnf_param_response_t *pNfapiMsg = (nfapi_pnf_param_response_t *)msg;
-  unpack_tlv_t unpack_fns[] = {
-    { NFAPI_PNF_PARAM_GENERAL_TAG, &pNfapiMsg->pnf_param_general, &unpack_pnf_param_general_value},
-    { NFAPI_PNF_PHY_TAG, &pNfapiMsg->pnf_phy, &unpack_pnf_phy_value},
-    { NFAPI_PNF_RF_TAG, &pNfapiMsg->pnf_rf, &unpack_pnf_rf_value},
-    { NFAPI_PNF_PHY_REL10_TAG, &pNfapiMsg->pnf_phy_rel10, &unpack_pnf_phy_rel10_value},
-    { NFAPI_PNF_PHY_REL11_TAG, &pNfapiMsg->pnf_phy_rel11, &unpack_pnf_phy_rel11_value},
-    { NFAPI_PNF_PHY_REL12_TAG, &pNfapiMsg->pnf_phy_rel12, &unpack_pnf_phy_rel12_value},
-    { NFAPI_PNF_PHY_REL13_TAG, &pNfapiMsg->pnf_phy_rel13, &unpack_pnf_phy_rel13_value},
-    { NFAPI_PNF_PHY_REL13_NB_IOT_TAG, &pNfapiMsg->pnf_phy_rel13_nb_iot, &unpack_pnf_phy_rel13_nb_iot_value},
-
-  };
-  return ( pull32(ppReadPackedMsg, &pNfapiMsg->error_code, end) &&
-           unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, end, config, &pNfapiMsg->vendor_extension));
-}
-
-
-static uint8_t unpack_phy_rf_config_info(void *elem, uint8_t **ppReadPackedMsg, uint8_t *end) {
-  nfapi_phy_rf_config_info_t *rf = (nfapi_phy_rf_config_info_t *)elem;
-  return( pull16(ppReadPackedMsg, &rf->phy_id, end) &&
-          pull16(ppReadPackedMsg, &rf->phy_config_index, end) &&
-          pull16(ppReadPackedMsg, &rf->rf_config_index, end));
-}
-
-static uint8_t unpack_pnf_phy_rf_config_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
-  nfapi_pnf_phy_rf_config_t *value = (nfapi_pnf_phy_rf_config_t *)tlv;
-  return ( pull16(ppReadPackedMsg, &value->number_phy_rf_config_info, end) &&
-           unpackarray(ppReadPackedMsg, value->phy_rf_config, sizeof(nfapi_phy_rf_config_info_t), NFAPI_MAX_PHY_RF_INSTANCES, value->number_phy_rf_config_info, end, &unpack_phy_rf_config_info));
-}
-
-static uint8_t unpack_nr_pnf_config_request(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p4_p5_codec_config_t *config) {
-  nfapi_nr_pnf_config_request_t *pNfapiMsg = (nfapi_nr_pnf_config_request_t *)msg;
-  unpack_tlv_t unpack_fns[] = {
-    { NFAPI_PNF_PHY_RF_TAG, &pNfapiMsg->pnf_phy_rf_config, &unpack_pnf_phy_rf_config_value},
-  };
-  return unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, end, config, &pNfapiMsg->vendor_extension);
-}
-
-
-
-static uint8_t unpack_pnf_config_request(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p4_p5_codec_config_t *config) {
-  nfapi_pnf_config_request_t *pNfapiMsg = (nfapi_pnf_config_request_t *)msg;
-  unpack_tlv_t unpack_fns[] = {
-    { NFAPI_PNF_PHY_RF_TAG, &pNfapiMsg->pnf_phy_rf_config, &unpack_pnf_phy_rf_config_value},
-  };
-  return unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, end, config, &pNfapiMsg->vendor_extension);
-}
-
-
-static uint8_t unpack_nr_pnf_config_response(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p4_p5_codec_config_t *config) {
-  nfapi_nr_pnf_config_response_t *pNfapiMsg = (nfapi_nr_pnf_config_response_t *)msg;
-  return ( pull32(ppReadPackedMsg, &pNfapiMsg->error_code, end) &&
-           unpack_tlv_list(NULL, 0, ppReadPackedMsg, end, config, &(pNfapiMsg->vendor_extension)));
-}
-
-static uint8_t unpack_pnf_config_response(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p4_p5_codec_config_t *config) {
-  nfapi_pnf_config_response_t *pNfapiMsg = (nfapi_pnf_config_response_t *)msg;
-  return ( pull32(ppReadPackedMsg, &pNfapiMsg->error_code, end) &&
-           unpack_tlv_list(NULL, 0, ppReadPackedMsg, end, config, &(pNfapiMsg->vendor_extension)));
-}
-
-static uint8_t unpack_nr_pnf_start_request(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p4_p5_codec_config_t *config) {
-  nfapi_nr_pnf_start_request_t *pNfapiMsg = (nfapi_nr_pnf_start_request_t *)msg;
-  return unpack_tlv_list(NULL, 0, ppReadPackedMsg, end, config, &(pNfapiMsg->vendor_extension));
-}
-
-
-static uint8_t unpack_pnf_start_request(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p4_p5_codec_config_t *config) {
-  nfapi_pnf_start_request_t *pNfapiMsg = (nfapi_pnf_start_request_t *)msg;
-  return unpack_tlv_list(NULL, 0, ppReadPackedMsg, end, config, &(pNfapiMsg->vendor_extension));
-}
-
-
-static uint8_t unpack_pnf_start_response(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p4_p5_codec_config_t *config) {
-  nfapi_pnf_start_response_t *pNfapiMsg = (nfapi_pnf_start_response_t *)msg;
-  return ( pull32(ppReadPackedMsg, &pNfapiMsg->error_code, end ) &&
-           unpack_tlv_list(NULL, 0, ppReadPackedMsg, end, config, &(pNfapiMsg->vendor_extension)));
-}
-
-static uint8_t unpack_nr_pnf_start_response(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p4_p5_codec_config_t *config) {
-  nfapi_nr_pnf_start_response_t *pNfapiMsg = (nfapi_nr_pnf_start_response_t *)msg;
-  return ( pull32(ppReadPackedMsg, &pNfapiMsg->error_code, end ) &&
-           unpack_tlv_list(NULL, 0, ppReadPackedMsg, end, config, &(pNfapiMsg->vendor_extension)));
-}
-
-
-static uint8_t unpack_pnf_stop_request(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p4_p5_codec_config_t *config) {
-  nfapi_pnf_stop_request_t *pNfapiMsg = (nfapi_pnf_stop_request_t *)msg;
-  return unpack_tlv_list(NULL, 0, ppReadPackedMsg, end, config, &(pNfapiMsg->vendor_extension));
-}
-
-static uint8_t unpack_pnf_stop_response(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p4_p5_codec_config_t *config) {
-  nfapi_pnf_stop_response_t *pNfapiMsg = (nfapi_pnf_stop_response_t *)msg;
-  return ( pull32(ppReadPackedMsg, &pNfapiMsg->error_code, end) &&
-           unpack_tlv_list(NULL, 0, ppReadPackedMsg, end, config, &(pNfapiMsg->vendor_extension)));
-}
-
-static uint8_t unpack_param_request(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p4_p5_codec_config_t *config) {
-  nfapi_param_request_t *pNfapiMsg = (nfapi_param_request_t *)msg;
-  return unpack_tlv_list(NULL, 0, ppReadPackedMsg, end, config, &(pNfapiMsg->vendor_extension));
-}
-
-static uint8_t unpack_nr_param_request(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p4_p5_codec_config_t *config) {
-  nfapi_nr_param_request_scf_t *pNfapiMsg = (nfapi_nr_param_request_scf_t *)msg;
-  return unpack_tlv_list(NULL, 0, ppReadPackedMsg, end, config, &(pNfapiMsg->vendor_extension));
-}
-
-static uint8_t unpack_param_response(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p4_p5_codec_config_t *config) {
-  nfapi_param_response_t *pNfapiMsg = (nfapi_param_response_t *)msg;
-  unpack_tlv_t unpack_fns[] = {
-    { NFAPI_L1_STATUS_PHY_STATE_TAG, &pNfapiMsg->l1_status.phy_state, &unpack_uint16_tlv_value},
-
-    { NFAPI_PHY_CAPABILITIES_DL_BANDWIDTH_SUPPORT_TAG, &pNfapiMsg->phy_capabilities.dl_bandwidth_support, &unpack_uint16_tlv_value},
-    { NFAPI_PHY_CAPABILITIES_UL_BANDWIDTH_SUPPORT_TAG, &pNfapiMsg->phy_capabilities.ul_bandwidth_support, &unpack_uint16_tlv_value},
-    { NFAPI_PHY_CAPABILITIES_DL_MODULATION_SUPPORT_TAG, &pNfapiMsg->phy_capabilities.dl_modulation_support, &unpack_uint16_tlv_value},
-    { NFAPI_PHY_CAPABILITIES_UL_MODULATION_SUPPORT_TAG, &pNfapiMsg->phy_capabilities.ul_modulation_support, &unpack_uint16_tlv_value},
-    { NFAPI_PHY_CAPABILITIES_PHY_ANTENNA_CAPABILITY_TAG, &pNfapiMsg->phy_capabilities.phy_antenna_capability, &unpack_uint16_tlv_value},
-    { NFAPI_PHY_CAPABILITIES_RELEASE_CAPABILITY_TAG, &pNfapiMsg->phy_capabilities.release_capability, &unpack_uint16_tlv_value},
-    { NFAPI_PHY_CAPABILITIES_MBSFN_CAPABILITY_TAG, &pNfapiMsg->phy_capabilities.mbsfn_capability, &unpack_uint16_tlv_value},
-
-    { NFAPI_LAA_CAPABILITY_LAA_SUPPORT_TAG, &pNfapiMsg->laa_capability.laa_support, &unpack_uint16_tlv_value},
-    { NFAPI_LAA_CAPABILITY_PD_SENSING_LBT_SUPPORT_TAG, &pNfapiMsg->laa_capability.pd_sensing_lbt_support, &unpack_uint16_tlv_value},
-    { NFAPI_LAA_CAPABILITY_MULTI_CARRIER_LBT_SUPPORT_TAG, &pNfapiMsg->laa_capability.multi_carrier_lbt_support, &unpack_uint16_tlv_value},
-    { NFAPI_LAA_CAPABILITY_PARTIAL_SF_SUPPORT_TAG, &pNfapiMsg->laa_capability.partial_sf_support, &unpack_uint16_tlv_value},
-
-    { NFAPI_SUBFRAME_CONFIG_DUPLEX_MODE_TAG, &pNfapiMsg->subframe_config.duplex_mode, &unpack_uint16_tlv_value},
-    { NFAPI_SUBFRAME_CONFIG_PCFICH_POWER_OFFSET_TAG, &pNfapiMsg->subframe_config.pcfich_power_offset, &unpack_uint16_tlv_value},
-    { NFAPI_SUBFRAME_CONFIG_PB_TAG, &pNfapiMsg->subframe_config.pb, &unpack_uint16_tlv_value},
-    { NFAPI_SUBFRAME_CONFIG_DL_CYCLIC_PREFIX_TYPE_TAG, &pNfapiMsg->subframe_config.dl_cyclic_prefix_type, &unpack_uint16_tlv_value},
-    { NFAPI_SUBFRAME_CONFIG_UL_CYCLIC_PREFIX_TYPE_TAG, &pNfapiMsg->subframe_config.ul_cyclic_prefix_type, &unpack_uint16_tlv_value},
-
-    { NFAPI_RF_CONFIG_DL_CHANNEL_BANDWIDTH_TAG, &pNfapiMsg->rf_config.dl_channel_bandwidth, &unpack_uint16_tlv_value},
-    { NFAPI_RF_CONFIG_UL_CHANNEL_BANDWIDTH_TAG, &pNfapiMsg->rf_config.ul_channel_bandwidth, &unpack_uint16_tlv_value},
-    { NFAPI_RF_CONFIG_REFERENCE_SIGNAL_POWER_TAG, &pNfapiMsg->rf_config.reference_signal_power, &unpack_uint16_tlv_value},
-    { NFAPI_RF_CONFIG_TX_ANTENNA_PORTS_TAG, &pNfapiMsg->rf_config.tx_antenna_ports, &unpack_uint16_tlv_value},
-    { NFAPI_RF_CONFIG_RX_ANTENNA_PORTS_TAG, &pNfapiMsg->rf_config.rx_antenna_ports, &unpack_uint16_tlv_value},
-
-    { NFAPI_PHICH_CONFIG_PHICH_RESOURCE_TAG, &pNfapiMsg->phich_config.phich_resource, &unpack_uint16_tlv_value},
-    { NFAPI_PHICH_CONFIG_PHICH_DURATION_TAG, &pNfapiMsg->phich_config.phich_duration, &unpack_uint16_tlv_value},
-    { NFAPI_PHICH_CONFIG_PHICH_POWER_OFFSET_TAG, &pNfapiMsg->phich_config.phich_power_offset, &unpack_uint16_tlv_value},
-
-    { NFAPI_SCH_CONFIG_PRIMARY_SYNCHRONIZATION_SIGNAL_EPRE_EPRERS_TAG, &pNfapiMsg->sch_config.primary_synchronization_signal_epre_eprers, &unpack_uint16_tlv_value},
-    { NFAPI_SCH_CONFIG_SECONDARY_SYNCHRONIZATION_SIGNAL_EPRE_EPRERS_TAG, &pNfapiMsg->sch_config.secondary_synchronization_signal_epre_eprers, &unpack_uint16_tlv_value},
-    { NFAPI_SCH_CONFIG_PHYSICAL_CELL_ID_TAG, &pNfapiMsg->sch_config.physical_cell_id, &unpack_uint16_tlv_value},
-
-    { NFAPI_PRACH_CONFIG_CONFIGURATION_INDEX_TAG, &pNfapiMsg->prach_config.configuration_index, &unpack_uint16_tlv_value},
-    { NFAPI_PRACH_CONFIG_ROOT_SEQUENCE_INDEX_TAG, &pNfapiMsg->prach_config.root_sequence_index, &unpack_uint16_tlv_value},
-    { NFAPI_PRACH_CONFIG_ZERO_CORRELATION_ZONE_CONFIGURATION_TAG, &pNfapiMsg->prach_config.zero_correlation_zone_configuration, &unpack_uint16_tlv_value},
-    { NFAPI_PRACH_CONFIG_HIGH_SPEED_FLAG_TAG, &pNfapiMsg->prach_config.high_speed_flag, &unpack_uint16_tlv_value},
-    { NFAPI_PRACH_CONFIG_FREQUENCY_OFFSET_TAG, &pNfapiMsg->prach_config.frequency_offset, &unpack_uint16_tlv_value},
-
-    { NFAPI_PUSCH_CONFIG_HOPPING_MODE_TAG, &pNfapiMsg->pusch_config.hopping_mode, &unpack_uint16_tlv_value},
-    { NFAPI_PUSCH_CONFIG_HOPPING_OFFSET_TAG, &pNfapiMsg->pusch_config.hopping_offset, &unpack_uint16_tlv_value},
-    { NFAPI_PUSCH_CONFIG_NUMBER_OF_SUBBANDS_TAG, &pNfapiMsg->pusch_config.number_of_subbands, &unpack_uint16_tlv_value},
-
-    { NFAPI_PUCCH_CONFIG_DELTA_PUCCH_SHIFT_TAG, &pNfapiMsg->pucch_config.delta_pucch_shift, &unpack_uint16_tlv_value},
-    { NFAPI_PUCCH_CONFIG_N_CQI_RB_TAG, &pNfapiMsg->pucch_config.n_cqi_rb, &unpack_uint16_tlv_value},
-    { NFAPI_PUCCH_CONFIG_N_AN_CS_TAG, &pNfapiMsg->pucch_config.n_an_cs, &unpack_uint16_tlv_value},
-    { NFAPI_PUCCH_CONFIG_N1_PUCCH_AN_TAG, &pNfapiMsg->pucch_config.n1_pucch_an, &unpack_uint16_tlv_value},
-
-    { NFAPI_SRS_CONFIG_BANDWIDTH_CONFIGURATION_TAG, &pNfapiMsg->srs_config.bandwidth_configuration, &unpack_uint16_tlv_value},
-    { NFAPI_SRS_CONFIG_MAX_UP_PTS_TAG, &pNfapiMsg->srs_config.max_up_pts, &unpack_uint16_tlv_value},
-    { NFAPI_SRS_CONFIG_SRS_SUBFRAME_CONFIGURATION_TAG, &pNfapiMsg->srs_config.srs_subframe_configuration, &unpack_uint16_tlv_value},
-    { NFAPI_SRS_CONFIG_SRS_ACKNACK_SRS_SIMULTANEOUS_TRANSMISSION_TAG, &pNfapiMsg->srs_config.srs_acknack_srs_simultaneous_transmission, &unpack_uint16_tlv_value},
-
-    { NFAPI_UPLINK_REFERENCE_SIGNAL_CONFIG_UPLINK_RS_HOPPING_TAG, &pNfapiMsg->uplink_reference_signal_config.uplink_rs_hopping, &unpack_uint16_tlv_value},
-    { NFAPI_UPLINK_REFERENCE_SIGNAL_CONFIG_GROUP_ASSIGNMENT_TAG, &pNfapiMsg->uplink_reference_signal_config.group_assignment, &unpack_uint16_tlv_value},
-    { NFAPI_UPLINK_REFERENCE_SIGNAL_CONFIG_CYCLIC_SHIFT_1_FOR_DRMS_TAG, &pNfapiMsg->uplink_reference_signal_config.cyclic_shift_1_for_drms, &unpack_uint16_tlv_value},
-
-    { NFAPI_TDD_FRAME_STRUCTURE_SUBFRAME_ASSIGNMENT_TAG, &pNfapiMsg->tdd_frame_structure_config.subframe_assignment, &unpack_uint16_tlv_value},
-    { NFAPI_TDD_FRAME_STRUCTURE_SPECIAL_SUBFRAME_PATTERNS_TAG, &pNfapiMsg->tdd_frame_structure_config.special_subframe_patterns, &unpack_uint16_tlv_value},
-
-    { NFAPI_L23_CONFIG_DATA_REPORT_MODE_TAG, &pNfapiMsg->l23_config.data_report_mode, &unpack_uint16_tlv_value},
-    { NFAPI_L23_CONFIG_SFNSF_TAG, &pNfapiMsg->l23_config.sfnsf, &unpack_uint16_tlv_value},
-
-    { NFAPI_NFAPI_P7_VNF_ADDRESS_IPV4_TAG, &pNfapiMsg->nfapi_config.p7_vnf_address_ipv4, &unpack_ipv4_address_value},
-    { NFAPI_NFAPI_P7_VNF_ADDRESS_IPV6_TAG, &pNfapiMsg->nfapi_config.p7_vnf_address_ipv6, &unpack_ipv6_address_value},
-    { NFAPI_NFAPI_P7_VNF_PORT_TAG, &pNfapiMsg->nfapi_config.p7_vnf_port, &unpack_uint16_tlv_value},
-    { NFAPI_NFAPI_P7_PNF_ADDRESS_IPV4_TAG, &pNfapiMsg->nfapi_config.p7_pnf_address_ipv4, &unpack_ipv4_address_value},
-    { NFAPI_NFAPI_P7_PNF_ADDRESS_IPV6_TAG, &pNfapiMsg->nfapi_config.p7_pnf_address_ipv6, &unpack_ipv6_address_value},
-    { NFAPI_NFAPI_P7_PNF_PORT_TAG, &pNfapiMsg->nfapi_config.p7_pnf_port, &unpack_uint16_tlv_value},
-    { NFAPI_NFAPI_DOWNLINK_UES_PER_SUBFRAME_TAG, &pNfapiMsg->nfapi_config.dl_ue_per_sf, &unpack_uint8_tlv_value},
-    { NFAPI_NFAPI_UPLINK_UES_PER_SUBFRAME_TAG, &pNfapiMsg->nfapi_config.ul_ue_per_sf, &unpack_uint8_tlv_value},
-    { NFAPI_NFAPI_RF_BANDS_TAG, &pNfapiMsg->nfapi_config.rf_bands, &unpack_rf_bands_value},
-    { NFAPI_NFAPI_TIMING_WINDOW_TAG, &pNfapiMsg->nfapi_config.timing_window, &unpack_uint8_tlv_value},
-    { NFAPI_NFAPI_TIMING_INFO_MODE_TAG, &pNfapiMsg->nfapi_config.timing_info_mode, &unpack_uint8_tlv_value},
-    { NFAPI_NFAPI_TIMING_INFO_PERIOD_TAG, &pNfapiMsg->nfapi_config.timing_info_period, &unpack_uint8_tlv_value},
-    { NFAPI_NFAPI_MAXIMUM_TRANSMIT_POWER_TAG, &pNfapiMsg->nfapi_config.max_transmit_power, &unpack_uint16_tlv_value},
-    { NFAPI_NFAPI_EARFCN_TAG, &pNfapiMsg->nfapi_config.earfcn, &unpack_uint16_tlv_value},
-    { NFAPI_NFAPI_NMM_GSM_FREQUENCY_BANDS_TAG, &pNfapiMsg->nfapi_config.nmm_gsm_frequency_bands, &unpack_nmm_frequency_bands_value},
-    { NFAPI_NFAPI_NMM_UMTS_FREQUENCY_BANDS_TAG, &pNfapiMsg->nfapi_config.nmm_umts_frequency_bands, &unpack_nmm_frequency_bands_value},
-    { NFAPI_NFAPI_NMM_LTE_FREQUENCY_BANDS_TAG, &pNfapiMsg->nfapi_config.nmm_lte_frequency_bands, &unpack_nmm_frequency_bands_value},
-    { NFAPI_NFAPI_NMM_UPLINK_RSSI_SUPPORTED_TAG, &pNfapiMsg->nfapi_config.nmm_uplink_rssi_supported, &unpack_uint8_tlv_value},
-
-  };
-  return ( pull8(ppReadPackedMsg, &pNfapiMsg->error_code, end) &&
-           pull8(ppReadPackedMsg, &pNfapiMsg->num_tlv, end) &&
-           unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, end, config, &pNfapiMsg->vendor_extension));
-}
-
-static uint8_t unpack_nr_param_response(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p4_p5_codec_config_t *config) {
-  nfapi_nr_param_response_scf_t *pNfapiMsg = (nfapi_nr_param_response_scf_t *)msg;
-  unpack_tlv_t unpack_fns[] = {
-    { NFAPI_NR_PARAM_TLV_RELEASE_CAPABILITY_TAG, &(pNfapiMsg->cell_param.release_capability), &unpack_uint16_tlv_value},
-    { NFAPI_NR_PARAM_TLV_PHY_STATE_TAG, &(pNfapiMsg->cell_param.phy_state),&unpack_uint16_tlv_value},
-    { NFAPI_NR_PARAM_TLV_SKIP_BLANK_DL_CONFIG_TAG, &(pNfapiMsg->cell_param.skip_blank_dl_config), &unpack_uint8_tlv_value},
-    { NFAPI_NR_PARAM_TLV_SKIP_BLANK_UL_CONFIG_TAG, &(pNfapiMsg->cell_param.skip_blank_ul_config), &unpack_uint8_tlv_value},
-    { NFAPI_NR_PARAM_TLV_NUM_CONFIG_TLVS_TO_REPORT_TAG, &(pNfapiMsg->cell_param.num_config_tlvs_to_report ), &unpack_uint16_tlv_value},
-
-    { NFAPI_NR_PARAM_TLV_CYCLIC_PREFIX_TAG, &(pNfapiMsg->carrier_param.cyclic_prefix), &unpack_uint8_tlv_value},
-    { NFAPI_NR_PARAM_TLV_SUPPORTED_SUBCARRIER_SPACINGS_DL_TAG, &(pNfapiMsg->carrier_param.supported_subcarrier_spacings_dl), &unpack_uint16_tlv_value},
-    { NFAPI_NR_PARAM_TLV_SUPPORTED_BANDWIDTH_DL_TAG, &(pNfapiMsg->carrier_param.supported_bandwidth_dl), &unpack_uint16_tlv_value},
-    { NFAPI_NR_PARAM_TLV_SUPPORTED_SUBCARRIER_SPACINGS_UL_TAG, &(pNfapiMsg->carrier_param.supported_subcarrier_spacings_ul), &unpack_uint8_tlv_value},
-    { NFAPI_NR_PARAM_TLV_SUPPORTED_BANDWIDTH_UL_TAG, &(pNfapiMsg->carrier_param.supported_bandwidth_ul), &unpack_uint16_tlv_value},
-
-
-    { NFAPI_NR_PARAM_TLV_CCE_MAPPING_TYPE_TAG, &(pNfapiMsg->pdcch_param.cce_mapping_type), &unpack_uint8_tlv_value},
-    { NFAPI_NR_PARAM_TLV_CORESET_OUTSIDE_FIRST_3_OFDM_SYMS_OF_SLOT_TAG, &(pNfapiMsg->pdcch_param.coreset_outside_first_3_of_ofdm_syms_of_slot), &unpack_uint8_tlv_value},
-    { NFAPI_NR_PARAM_TLV_PRECODER_GRANULARITY_CORESET_TAG, &(pNfapiMsg->pdcch_param.coreset_precoder_granularity_coreset), &unpack_uint8_tlv_value},
-    { NFAPI_NR_PARAM_TLV_PDCCH_MU_MIMO_TAG, &(pNfapiMsg->pdcch_param.pdcch_mu_mimo), &unpack_uint8_tlv_value},
-    { NFAPI_NR_PARAM_TLV_PDCCH_PRECODER_CYCLING_TAG, &(pNfapiMsg->pdcch_param.pdcch_precoder_cycling), &unpack_uint8_tlv_value},
-    { NFAPI_NR_PARAM_TLV_MAX_PDCCHS_PER_SLOT_TAG, &(pNfapiMsg->pdcch_param.max_pdcch_per_slot), &unpack_uint8_tlv_value},
-
-    { NFAPI_NR_PARAM_TLV_PUCCH_FORMATS_TAG, &(pNfapiMsg->pucch_param.pucch_formats), &unpack_uint8_tlv_value},
-    { NFAPI_NR_PARAM_TLV_MAX_PUCCHS_PER_SLOT_TAG, &(pNfapiMsg->pucch_param.max_pucchs_per_slot), &unpack_uint8_tlv_value},
-
-    { NFAPI_NR_PARAM_TLV_PDSCH_MAPPING_TYPE_TAG, &(pNfapiMsg->pdsch_param.pdsch_mapping_type), &unpack_uint8_tlv_value},
-    { NFAPI_NR_PARAM_TLV_PDSCH_ALLOCATION_TYPES_TAG, &(pNfapiMsg->pdsch_param.pdsch_allocation_types), &unpack_uint8_tlv_value},
-    { NFAPI_NR_PARAM_TLV_PDSCH_VRB_TO_PRB_MAPPING_TAG, &(pNfapiMsg->pdsch_param.pdsch_vrb_to_prb_mapping), &unpack_uint8_tlv_value},
-    { NFAPI_NR_PARAM_TLV_PDSCH_CBG_TAG, &(pNfapiMsg->pdsch_param.pdsch_cbg), &unpack_uint8_tlv_value},
-    { NFAPI_NR_PARAM_TLV_PDSCH_DMRS_CONFIG_TYPES_TAG, &(pNfapiMsg->pdsch_param.pdsch_dmrs_config_types), &unpack_uint8_tlv_value},
-    { NFAPI_NR_PARAM_TLV_PDSCH_DMRS_MAX_LENGTH_TAG, &(pNfapiMsg->pdsch_param.pdsch_dmrs_max_length), &unpack_uint8_tlv_value},
-    { NFAPI_NR_PARAM_TLV_PDSCH_DMRS_ADDITIONAL_POS_TAG, &(pNfapiMsg->pdsch_param.pdsch_dmrs_additional_pos), &unpack_uint8_tlv_value},
-    { NFAPI_NR_PARAM_TLV_MAX_PDSCH_S_YBS_PER_SLOT_TAG, &(pNfapiMsg->pdsch_param.max_pdsch_tbs_per_slot), &unpack_uint8_tlv_value},
-    { NFAPI_NR_PARAM_TLV_MAX_NUMBER_MIMO_LAYERS_PDSCH_TAG, &(pNfapiMsg->pdsch_param.max_number_mimo_layers_pdsch), &unpack_uint8_tlv_value},
-    { NFAPI_NR_PARAM_TLV_MAX_MU_MIMO_USERS_DL_TAG, &(pNfapiMsg->pdsch_param.max_mu_mimo_users_dl), &unpack_uint8_tlv_value},
-    { NFAPI_NR_PARAM_TLV_PDSCH_DATA_IN_DMRS_SYMBOLS_TAG, &(pNfapiMsg->pdsch_param.pdsch_data_in_dmrs_symbols), &unpack_uint8_tlv_value},
-    { NFAPI_NR_PARAM_TLV_PREMPTION_SUPPORT_TAG, &(pNfapiMsg->pdsch_param.premption_support), &unpack_uint8_tlv_value},
-    { NFAPI_NR_PARAM_TLV_PDSCH_NON_SLOT_SUPPORT_TAG, &(pNfapiMsg->pdsch_param.pdsch_non_slot_support), &unpack_uint8_tlv_value},
-
-    { NFAPI_NR_PARAM_TLV_UCI_MUX_ULSCH_IN_PUSCH_TAG,  &(pNfapiMsg->pusch_param.uci_mux_ulsch_in_pusch),  &unpack_uint8_tlv_value},
-    { NFAPI_NR_PARAM_TLV_UCI_ONLY_PUSCH_TAG,  &(pNfapiMsg->pusch_param.uci_only_pusch),  &unpack_uint8_tlv_value},
-    { NFAPI_NR_PARAM_TLV_PUSCH_FREQUENCY_HOPPING_TAG,  &(pNfapiMsg->pusch_param.pusch_frequency_hopping),  &unpack_uint8_tlv_value},
-    { NFAPI_NR_PARAM_TLV_PUSCH_DMRS_CONFIG_TYPES_TAG,  &(pNfapiMsg->pusch_param.pusch_dmrs_config_types),  &unpack_uint8_tlv_value},
-    { NFAPI_NR_PARAM_TLV_PUSCH_DMRS_MAX_LEN_TAG,  &(pNfapiMsg->pusch_param.pusch_dmrs_max_len),  &unpack_uint8_tlv_value},
-    { NFAPI_NR_PARAM_TLV_PUSCH_DMRS_ADDITIONAL_POS_TAG,  &(pNfapiMsg->pusch_param.pusch_dmrs_additional_pos),  &unpack_uint8_tlv_value},
-    { NFAPI_NR_PARAM_TLV_PUSCH_CBG_TAG,  &(pNfapiMsg->pusch_param.pusch_cbg),  &unpack_uint8_tlv_value},
-    { NFAPI_NR_PARAM_TLV_PUSCH_MAPPING_TYPE_TAG,  &(pNfapiMsg->pusch_param.pusch_mapping_type),  &unpack_uint8_tlv_value},
-    { NFAPI_NR_PARAM_TLV_PUSCH_ALLOCATION_TYPES_TAG,  &(pNfapiMsg->pusch_param.pusch_allocation_types),  &unpack_uint8_tlv_value},
-    { NFAPI_NR_PARAM_TLV_PUSCH_VRB_TO_PRB_MAPPING_TAG,  &(pNfapiMsg->pusch_param.pusch_vrb_to_prb_mapping),  &unpack_uint8_tlv_value},
-    { NFAPI_NR_PARAM_TLV_PUSCH_MAX_PTRS_PORTS_TAG,  &(pNfapiMsg->pusch_param.pusch_max_ptrs_ports),  &unpack_uint8_tlv_value},
-    { NFAPI_NR_PARAM_TLV_MAX_PDUSCHS_TBS_PER_SLOT_TAG,  &(pNfapiMsg->pusch_param.max_pduschs_tbs_per_slot),  &unpack_uint8_tlv_value},
-    { NFAPI_NR_PARAM_TLV_MAX_NUMBER_MIMO_LAYERS_NON_CB_PUSCH_TAG,  &(pNfapiMsg->pusch_param.max_number_mimo_layers_non_cb_pusch),  &unpack_uint8_tlv_value},
-    { NFAPI_NR_PARAM_TLV_SUPPORTED_MODULATION_ORDER_UL_TAG,  &(pNfapiMsg->pusch_param.supported_modulation_order_ul),  &unpack_uint8_tlv_value},
-    { NFAPI_NR_PARAM_TLV_MAX_MU_MIMO_USERS_UL_TAG,  &(pNfapiMsg->pusch_param.max_mu_mimo_users_ul),  &unpack_uint8_tlv_value},
-    { NFAPI_NR_PARAM_TLV_DFTS_OFDM_SUPPORT_TAG,  &(pNfapiMsg->pusch_param.dfts_ofdm_support),  &unpack_uint8_tlv_value},
-    { NFAPI_NR_PARAM_TLV_PUSCH_AGGREGATION_FACTOR_TAG,  &(pNfapiMsg->pusch_param.pusch_aggregation_factor),  &unpack_uint8_tlv_value},
-
-    { NFAPI_NR_PARAM_TLV_PRACH_LONG_FORMATS_TAG,  &(pNfapiMsg->prach_param.prach_long_formats),  &unpack_uint8_tlv_value},
-    { NFAPI_NR_PARAM_TLV_PRACH_SHORT_FORMATS_TAG,  &(pNfapiMsg->prach_param.prach_short_formats),  &unpack_uint8_tlv_value},
-    { NFAPI_NR_PARAM_TLV_PRACH_RESTRICTED_SETS_TAG,  &(pNfapiMsg->prach_param.prach_restricted_sets),  &unpack_uint8_tlv_value},
-    { NFAPI_NR_PARAM_TLV_MAX_PRACH_FD_OCCASIONS_IN_A_SLOT_TAG,  &(pNfapiMsg->prach_param.max_prach_fd_occasions_in_a_slot),  &unpack_uint8_tlv_value},
-
-    { NFAPI_NR_PARAM_TLV_RSSI_MEASUREMENT_SUPPORT_TAG,  &(pNfapiMsg->measurement_param.rssi_measurement_support),  &unpack_uint8_tlv_value},
-    //config
-    { NFAPI_NR_NFAPI_P7_VNF_ADDRESS_IPV4_TAG, &pNfapiMsg->nfapi_config.p7_vnf_address_ipv4, &unpack_ipv4_address_value},
-    { NFAPI_NR_NFAPI_P7_VNF_ADDRESS_IPV6_TAG, &pNfapiMsg->nfapi_config.p7_vnf_address_ipv6, &unpack_ipv6_address_value},
-    { NFAPI_NR_NFAPI_P7_VNF_PORT_TAG, &pNfapiMsg->nfapi_config.p7_vnf_port, &unpack_uint16_tlv_value},
-    { NFAPI_NR_NFAPI_P7_PNF_ADDRESS_IPV4_TAG, &pNfapiMsg->nfapi_config.p7_pnf_address_ipv4, &unpack_ipv4_address_value},
-    { NFAPI_NR_NFAPI_P7_PNF_ADDRESS_IPV6_TAG, &pNfapiMsg->nfapi_config.p7_pnf_address_ipv6, &unpack_ipv6_address_value},
-    { NFAPI_NR_NFAPI_P7_PNF_PORT_TAG, &pNfapiMsg->nfapi_config.p7_pnf_port, &unpack_uint16_tlv_value},
-    { NFAPI_NR_NFAPI_TIMING_WINDOW_TAG, &pNfapiMsg->nfapi_config.timing_window, &unpack_uint8_tlv_value},
-    { NFAPI_NR_NFAPI_TIMING_INFO_MODE_TAG, &pNfapiMsg->nfapi_config.timing_info_mode, &unpack_uint8_tlv_value},
-    { NFAPI_NR_NFAPI_TIMING_INFO_PERIOD_TAG, &pNfapiMsg->nfapi_config.timing_info_period, &unpack_uint8_tlv_value},
-  };
-  // print ppReadPackedMsg
-  uint8_t *ptr = *ppReadPackedMsg;
-  printf("\n Read message unpack_param_response: ");
-
-  while(ptr < end) {
-    printf(" %d ", *ptr);
-    ptr++;
-  }
-
-  printf("\n");
-  return ( pull8(ppReadPackedMsg, &pNfapiMsg->error_code, end) &&
-           pull8(ppReadPackedMsg, &pNfapiMsg->num_tlv, end) &&
-           unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, end, config, &pNfapiMsg->vendor_extension));
-}
-
-static uint8_t unpack_config_request(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p4_p5_codec_config_t *config) {
-  nfapi_config_request_t *pNfapiMsg = (nfapi_config_request_t *)msg;
-  unpack_tlv_t unpack_fns[] = {
-    { NFAPI_SUBFRAME_CONFIG_DUPLEX_MODE_TAG, &pNfapiMsg->subframe_config.duplex_mode, &unpack_uint16_tlv_value},
-    { NFAPI_SUBFRAME_CONFIG_PCFICH_POWER_OFFSET_TAG, &pNfapiMsg->subframe_config.pcfich_power_offset, &unpack_uint16_tlv_value},
-    { NFAPI_SUBFRAME_CONFIG_PB_TAG, &pNfapiMsg->subframe_config.pb, &unpack_uint16_tlv_value},
-    { NFAPI_SUBFRAME_CONFIG_DL_CYCLIC_PREFIX_TYPE_TAG, &pNfapiMsg->subframe_config.dl_cyclic_prefix_type, &unpack_uint16_tlv_value},
-    { NFAPI_SUBFRAME_CONFIG_UL_CYCLIC_PREFIX_TYPE_TAG, &pNfapiMsg->subframe_config.ul_cyclic_prefix_type, &unpack_uint16_tlv_value},
-
-    { NFAPI_RF_CONFIG_DL_CHANNEL_BANDWIDTH_TAG, &pNfapiMsg->rf_config.dl_channel_bandwidth, &unpack_uint16_tlv_value},
-    { NFAPI_RF_CONFIG_UL_CHANNEL_BANDWIDTH_TAG, &pNfapiMsg->rf_config.ul_channel_bandwidth, &unpack_uint16_tlv_value},
-    { NFAPI_RF_CONFIG_REFERENCE_SIGNAL_POWER_TAG, &pNfapiMsg->rf_config.reference_signal_power, &unpack_uint16_tlv_value},
-    { NFAPI_RF_CONFIG_TX_ANTENNA_PORTS_TAG, &pNfapiMsg->rf_config.tx_antenna_ports, &unpack_uint16_tlv_value},
-    { NFAPI_RF_CONFIG_RX_ANTENNA_PORTS_TAG, &pNfapiMsg->rf_config.rx_antenna_ports, &unpack_uint16_tlv_value},
-
-    { NFAPI_PHICH_CONFIG_PHICH_RESOURCE_TAG, &pNfapiMsg->phich_config.phich_resource, &unpack_uint16_tlv_value},
-    { NFAPI_PHICH_CONFIG_PHICH_DURATION_TAG, &pNfapiMsg->phich_config.phich_duration, &unpack_uint16_tlv_value},
-    { NFAPI_PHICH_CONFIG_PHICH_POWER_OFFSET_TAG, &pNfapiMsg->phich_config.phich_power_offset, &unpack_uint16_tlv_value},
-
-    { NFAPI_SCH_CONFIG_PRIMARY_SYNCHRONIZATION_SIGNAL_EPRE_EPRERS_TAG, &pNfapiMsg->sch_config.primary_synchronization_signal_epre_eprers, &unpack_uint16_tlv_value},
-    { NFAPI_SCH_CONFIG_SECONDARY_SYNCHRONIZATION_SIGNAL_EPRE_EPRERS_TAG, &pNfapiMsg->sch_config.secondary_synchronization_signal_epre_eprers, &unpack_uint16_tlv_value},
-    { NFAPI_SCH_CONFIG_PHYSICAL_CELL_ID_TAG, &pNfapiMsg->sch_config.physical_cell_id, &unpack_uint16_tlv_value},
-
-    { NFAPI_PRACH_CONFIG_CONFIGURATION_INDEX_TAG, &pNfapiMsg->prach_config.configuration_index, &unpack_uint16_tlv_value},
-    { NFAPI_PRACH_CONFIG_ROOT_SEQUENCE_INDEX_TAG, &pNfapiMsg->prach_config.root_sequence_index, &unpack_uint16_tlv_value},
-    { NFAPI_PRACH_CONFIG_ZERO_CORRELATION_ZONE_CONFIGURATION_TAG, &pNfapiMsg->prach_config.zero_correlation_zone_configuration, &unpack_uint16_tlv_value},
-    { NFAPI_PRACH_CONFIG_HIGH_SPEED_FLAG_TAG, &pNfapiMsg->prach_config.high_speed_flag, &unpack_uint16_tlv_value},
-    { NFAPI_PRACH_CONFIG_FREQUENCY_OFFSET_TAG, &pNfapiMsg->prach_config.frequency_offset, &unpack_uint16_tlv_value},
-
-    { NFAPI_PUSCH_CONFIG_HOPPING_MODE_TAG, &pNfapiMsg->pusch_config.hopping_mode, &unpack_uint16_tlv_value},
-    { NFAPI_PUSCH_CONFIG_HOPPING_OFFSET_TAG, &pNfapiMsg->pusch_config.hopping_offset, &unpack_uint16_tlv_value},
-    { NFAPI_PUSCH_CONFIG_NUMBER_OF_SUBBANDS_TAG, &pNfapiMsg->pusch_config.number_of_subbands, &unpack_uint16_tlv_value},
-
-    { NFAPI_PUCCH_CONFIG_DELTA_PUCCH_SHIFT_TAG, &pNfapiMsg->pucch_config.delta_pucch_shift, &unpack_uint16_tlv_value},
-    { NFAPI_PUCCH_CONFIG_N_CQI_RB_TAG, &pNfapiMsg->pucch_config.n_cqi_rb, &unpack_uint16_tlv_value},
-    { NFAPI_PUCCH_CONFIG_N_AN_CS_TAG, &pNfapiMsg->pucch_config.n_an_cs, &unpack_uint16_tlv_value},
-    { NFAPI_PUCCH_CONFIG_N1_PUCCH_AN_TAG, &pNfapiMsg->pucch_config.n1_pucch_an, &unpack_uint16_tlv_value},
-
-    { NFAPI_SRS_CONFIG_BANDWIDTH_CONFIGURATION_TAG, &pNfapiMsg->srs_config.bandwidth_configuration, &unpack_uint16_tlv_value},
-    { NFAPI_SRS_CONFIG_MAX_UP_PTS_TAG, &pNfapiMsg->srs_config.max_up_pts, &unpack_uint16_tlv_value},
-    { NFAPI_SRS_CONFIG_SRS_SUBFRAME_CONFIGURATION_TAG, &pNfapiMsg->srs_config.srs_subframe_configuration, &unpack_uint16_tlv_value},
-    { NFAPI_SRS_CONFIG_SRS_ACKNACK_SRS_SIMULTANEOUS_TRANSMISSION_TAG, &pNfapiMsg->srs_config.srs_acknack_srs_simultaneous_transmission, &unpack_uint16_tlv_value},
-
-    { NFAPI_UPLINK_REFERENCE_SIGNAL_CONFIG_UPLINK_RS_HOPPING_TAG, &pNfapiMsg->uplink_reference_signal_config.uplink_rs_hopping, &unpack_uint16_tlv_value},
-    { NFAPI_UPLINK_REFERENCE_SIGNAL_CONFIG_GROUP_ASSIGNMENT_TAG, &pNfapiMsg->uplink_reference_signal_config.group_assignment, &unpack_uint16_tlv_value},
-    { NFAPI_UPLINK_REFERENCE_SIGNAL_CONFIG_CYCLIC_SHIFT_1_FOR_DRMS_TAG, &pNfapiMsg->uplink_reference_signal_config.cyclic_shift_1_for_drms, &unpack_uint16_tlv_value},
-
-
-    { NFAPI_LAA_CONFIG_ED_THRESHOLD_FOR_LBT_FOR_PDSCH_TAG, &pNfapiMsg->laa_config.ed_threshold_lbt_pdsch, &unpack_uint16_tlv_value},
-    { NFAPI_LAA_CONFIG_ED_THRESHOLD_FOR_LBT_FOR_DRS_TAG, &pNfapiMsg->laa_config.ed_threshold_lbt_drs, &unpack_uint16_tlv_value},
-    { NFAPI_LAA_CONFIG_PD_THRESHOLD_TAG, &pNfapiMsg->laa_config.pd_threshold, &unpack_uint16_tlv_value},
-    { NFAPI_LAA_CONFIG_MULTI_CARRIER_TYPE_TAG, &pNfapiMsg->laa_config.multi_carrier_type, &unpack_uint16_tlv_value},
-    { NFAPI_LAA_CONFIG_MULTI_CARRIER_TX_TAG, &pNfapiMsg->laa_config.multi_carrier_tx, &unpack_uint16_tlv_value},
-    { NFAPI_LAA_CONFIG_MULTI_CARRIER_FREEZE_TAG, &pNfapiMsg->laa_config.multi_carrier_freeze, &unpack_uint16_tlv_value},
-    { NFAPI_LAA_CONFIG_TX_ANTENNA_PORTS_FOR_DRS_TAG, &pNfapiMsg->laa_config.tx_antenna_ports_drs, &unpack_uint16_tlv_value},
-    { NFAPI_LAA_CONFIG_TRANSMISSION_POWER_FOR_DRS_TAG, &pNfapiMsg->laa_config.tx_power_drs, &unpack_uint16_tlv_value},
-
-    { NFAPI_EMTC_CONFIG_PBCH_REPETITIONS_ENABLE_R13_TAG, &pNfapiMsg->emtc_config.pbch_repetitions_enable_r13, &unpack_uint16_tlv_value},
-    { NFAPI_EMTC_CONFIG_PRACH_CATM_ROOT_SEQUENCE_INDEX_TAG, &pNfapiMsg->emtc_config.prach_catm_root_sequence_index, &unpack_uint16_tlv_value},
-    { NFAPI_EMTC_CONFIG_PRACH_CATM_ZERO_CORRELATION_ZONE_CONFIGURATION_TAG, &pNfapiMsg->emtc_config.prach_catm_zero_correlation_zone_configuration, &unpack_uint16_tlv_value},
-    { NFAPI_EMTC_CONFIG_PRACH_CATM_HIGH_SPEED_FLAG, &pNfapiMsg->emtc_config.prach_catm_high_speed_flag, &unpack_uint16_tlv_value},
-    { NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_0_ENABLE_TAG, &pNfapiMsg->emtc_config.prach_ce_level_0_enable, &unpack_uint16_tlv_value},
-    { NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_0_CONFIGURATION_INDEX_TAG, &pNfapiMsg->emtc_config.prach_ce_level_0_configuration_index, &unpack_uint16_tlv_value},
-    { NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_0_FREQUENCY_OFFSET_TAG, &pNfapiMsg->emtc_config.prach_ce_level_0_frequency_offset, &unpack_uint16_tlv_value},
-    { NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_0_NUMBER_OF_REPETITIONS_PER_ATTEMPT_TAG, &pNfapiMsg->emtc_config.prach_ce_level_0_number_of_repetitions_per_attempt, &unpack_uint16_tlv_value},
-    { NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_0_STARTING_SUBFRAME_PERIODICITY_TAG, &pNfapiMsg->emtc_config.prach_ce_level_0_starting_subframe_periodicity, &unpack_uint16_tlv_value},
-    { NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_0_HOPPING_ENABLE_TAG, &pNfapiMsg->emtc_config.prach_ce_level_0_hopping_enable, &unpack_uint16_tlv_value},
-    { NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_0_HOPPING_OFFSET_TAG, &pNfapiMsg->emtc_config.prach_ce_level_0_hopping_offset, &unpack_uint16_tlv_value},
-    { NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_1_ENABLE_TAG, &pNfapiMsg->emtc_config.prach_ce_level_1_enable, &unpack_uint16_tlv_value},
-    { NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_1_CONFIGURATION_INDEX_TAG, &pNfapiMsg->emtc_config.prach_ce_level_1_configuration_index, &unpack_uint16_tlv_value},
-    { NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_1_FREQUENCY_OFFSET_TAG, &pNfapiMsg->emtc_config.prach_ce_level_1_frequency_offset, &unpack_uint16_tlv_value},
-    { NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_1_NUMBER_OF_REPETITIONS_PER_ATTEMPT_TAG, &pNfapiMsg->emtc_config.prach_ce_level_1_number_of_repetitions_per_attempt, &unpack_uint16_tlv_value},
-    { NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_1_STARTING_SUBFRAME_PERIODICITY_TAG, &pNfapiMsg->emtc_config.prach_ce_level_1_starting_subframe_periodicity, &unpack_uint16_tlv_value},
-    { NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_1_HOPPING_ENABLE_TAG, &pNfapiMsg->emtc_config.prach_ce_level_1_hopping_enable, &unpack_uint16_tlv_value},
-    { NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_1_HOPPING_OFFSET_TAG, &pNfapiMsg->emtc_config.prach_ce_level_1_hopping_offset, &unpack_uint16_tlv_value},
-    { NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_2_ENABLE_TAG, &pNfapiMsg->emtc_config.prach_ce_level_2_enable, &unpack_uint16_tlv_value},
-    { NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_2_CONFIGURATION_INDEX_TAG, &pNfapiMsg->emtc_config.prach_ce_level_2_configuration_index, &unpack_uint16_tlv_value},
-    { NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_2_FREQUENCY_OFFSET_TAG, &pNfapiMsg->emtc_config.prach_ce_level_2_frequency_offset, &unpack_uint16_tlv_value},
-    { NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_2_NUMBER_OF_REPETITIONS_PER_ATTEMPT_TAG, &pNfapiMsg->emtc_config.prach_ce_level_2_number_of_repetitions_per_attempt, &unpack_uint16_tlv_value},
-    { NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_2_STARTING_SUBFRAME_PERIODICITY_TAG, &pNfapiMsg->emtc_config.prach_ce_level_2_starting_subframe_periodicity, &unpack_uint16_tlv_value},
-    { NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_2_HOPPING_ENABLE_TAG, &pNfapiMsg->emtc_config.prach_ce_level_2_hopping_enable, &unpack_uint16_tlv_value},
-    { NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_2_HOPPING_OFFSET_TAG, &pNfapiMsg->emtc_config.prach_ce_level_2_hopping_offset, &unpack_uint16_tlv_value},
-    { NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_3_ENABLE_TAG, &pNfapiMsg->emtc_config.prach_ce_level_3_enable, &unpack_uint16_tlv_value},
-    { NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_3_CONFIGURATION_INDEX_TAG, &pNfapiMsg->emtc_config.prach_ce_level_3_configuration_index, &unpack_uint16_tlv_value},
-    { NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_3_FREQUENCY_OFFSET_TAG, &pNfapiMsg->emtc_config.prach_ce_level_3_frequency_offset, &unpack_uint16_tlv_value},
-    { NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_3_NUMBER_OF_REPETITIONS_PER_ATTEMPT_TAG, &pNfapiMsg->emtc_config.prach_ce_level_3_number_of_repetitions_per_attempt, &unpack_uint16_tlv_value},
-    { NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_3_STARTING_SUBFRAME_PERIODICITY_TAG, &pNfapiMsg->emtc_config.prach_ce_level_3_starting_subframe_periodicity, &unpack_uint16_tlv_value},
-    { NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_3_HOPPING_ENABLE_TAG, &pNfapiMsg->emtc_config.prach_ce_level_3_hopping_enable, &unpack_uint16_tlv_value},
-    { NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_3_HOPPING_OFFSET_TAG, &pNfapiMsg->emtc_config.prach_ce_level_3_hopping_offset, &unpack_uint16_tlv_value},
-    { NFAPI_EMTC_CONFIG_PUCCH_INTERVAL_ULHOPPINGCONFIGCOMMONMODEA_TAG, &pNfapiMsg->emtc_config.pucch_interval_ulhoppingconfigcommonmodea, &unpack_uint16_tlv_value},
-    { NFAPI_EMTC_CONFIG_PUCCH_INTERVAL_ULHOPPINGCONFIGCOMMONMODEB_TAG, &pNfapiMsg->emtc_config.pucch_interval_ulhoppingconfigcommonmodeb, &unpack_uint16_tlv_value},
-
-    { NFAPI_TDD_FRAME_STRUCTURE_SUBFRAME_ASSIGNMENT_TAG, &pNfapiMsg->tdd_frame_structure_config.subframe_assignment, &unpack_uint16_tlv_value},
-    { NFAPI_TDD_FRAME_STRUCTURE_SPECIAL_SUBFRAME_PATTERNS_TAG, &pNfapiMsg->tdd_frame_structure_config.special_subframe_patterns, &unpack_uint16_tlv_value},
-
-    { NFAPI_L23_CONFIG_DATA_REPORT_MODE_TAG, &pNfapiMsg->l23_config.data_report_mode, &unpack_uint16_tlv_value},
-    { NFAPI_L23_CONFIG_SFNSF_TAG, &pNfapiMsg->l23_config.sfnsf, &unpack_uint16_tlv_value},
-
-    { NFAPI_NFAPI_P7_VNF_ADDRESS_IPV4_TAG, &pNfapiMsg->nfapi_config.p7_vnf_address_ipv4, &unpack_ipv4_address_value},
-    { NFAPI_NFAPI_P7_VNF_ADDRESS_IPV6_TAG, &pNfapiMsg->nfapi_config.p7_vnf_address_ipv6, &unpack_ipv6_address_value},
-    { NFAPI_NFAPI_P7_VNF_PORT_TAG, &pNfapiMsg->nfapi_config.p7_vnf_port, &unpack_uint16_tlv_value},
-    { NFAPI_NFAPI_P7_PNF_ADDRESS_IPV4_TAG, &pNfapiMsg->nfapi_config.p7_pnf_address_ipv4, &unpack_ipv4_address_value},
-    { NFAPI_NFAPI_P7_PNF_ADDRESS_IPV6_TAG, &pNfapiMsg->nfapi_config.p7_pnf_address_ipv6, &unpack_ipv6_address_value},
-    { NFAPI_NFAPI_P7_PNF_PORT_TAG, &pNfapiMsg->nfapi_config.p7_pnf_port, &unpack_uint16_tlv_value},
-    { NFAPI_NFAPI_DOWNLINK_UES_PER_SUBFRAME_TAG, &pNfapiMsg->nfapi_config.dl_ue_per_sf, &unpack_uint8_tlv_value},
-    { NFAPI_NFAPI_UPLINK_UES_PER_SUBFRAME_TAG, &pNfapiMsg->nfapi_config.ul_ue_per_sf, &unpack_uint8_tlv_value},
-    { NFAPI_NFAPI_RF_BANDS_TAG, &pNfapiMsg->nfapi_config.rf_bands, &unpack_rf_bands_value},
-    { NFAPI_NFAPI_TIMING_WINDOW_TAG, &pNfapiMsg->nfapi_config.timing_window, &unpack_uint8_tlv_value},
-    { NFAPI_NFAPI_TIMING_INFO_MODE_TAG, &pNfapiMsg->nfapi_config.timing_info_mode, &unpack_uint8_tlv_value},
-    { NFAPI_NFAPI_TIMING_INFO_PERIOD_TAG, &pNfapiMsg->nfapi_config.timing_info_period, &unpack_uint8_tlv_value},
-    { NFAPI_NFAPI_MAXIMUM_TRANSMIT_POWER_TAG, &pNfapiMsg->nfapi_config.max_transmit_power, &unpack_uint16_tlv_value},
-    { NFAPI_NFAPI_EARFCN_TAG, &pNfapiMsg->nfapi_config.earfcn, &unpack_uint16_tlv_value},
-    { NFAPI_NFAPI_NMM_GSM_FREQUENCY_BANDS_TAG, &pNfapiMsg->nfapi_config.nmm_gsm_frequency_bands, &unpack_nmm_frequency_bands_value},
-    { NFAPI_NFAPI_NMM_UMTS_FREQUENCY_BANDS_TAG, &pNfapiMsg->nfapi_config.nmm_umts_frequency_bands, &unpack_nmm_frequency_bands_value},
-    { NFAPI_NFAPI_NMM_LTE_FREQUENCY_BANDS_TAG, &pNfapiMsg->nfapi_config.nmm_lte_frequency_bands, &unpack_nmm_frequency_bands_value},
-    { NFAPI_NFAPI_NMM_UPLINK_RSSI_SUPPORTED_TAG, &pNfapiMsg->nfapi_config.nmm_uplink_rssi_supported, &unpack_uint8_tlv_value},
-
-  };
-  return ( pull8(ppReadPackedMsg, &pNfapiMsg->num_tlv, end) &&
-           unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, end, config, &pNfapiMsg->vendor_extension));
-}
-static uint8_t unpack_nr_config_request(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p4_p5_codec_config_t* config)
-{
-	nfapi_nr_config_request_scf_t *pNfapiMsg = (nfapi_nr_config_request_scf_t*)msg;
-
-	pNfapiMsg->tdd_table.max_tdd_periodicity_list = (nfapi_nr_max_tdd_periodicity_t*) malloc(40*sizeof(nfapi_nr_max_tdd_periodicity_t));
-
-	for(int i=0;i<40;i++)
-		pNfapiMsg->tdd_table.max_tdd_periodicity_list[i].max_num_of_symbol_per_slot_list = (nfapi_nr_max_num_of_symbol_per_slot_t*) malloc(14*sizeof(nfapi_nr_max_num_of_symbol_per_slot_t));
-
-    pNfapiMsg->prach_config.num_prach_fd_occasions_list=(nfapi_nr_num_prach_fd_occasions_t *) malloc(sizeof(nfapi_nr_num_prach_fd_occasions_t));
-
-	for(int i = 0; i < 40; i++){ //unpacking tdd slot config
-		for(int symbol = 0; symbol<14;symbol++){
-			pull8(ppReadPackedMsg,&pNfapiMsg->tdd_table.max_tdd_periodicity_list[i].max_num_of_symbol_per_slot_list[symbol].slot_config.value, end);
-		}
-	}
-	unpack_tlv_t unpack_fns[] =
-	{
-		{ NFAPI_NR_CONFIG_DL_BANDWIDTH_TAG,  &(pNfapiMsg->carrier_config.dl_bandwidth),  &unpack_uint16_tlv_value},
-		{ NFAPI_NR_CONFIG_DL_FREQUENCY_TAG,  &(pNfapiMsg->carrier_config.dl_frequency),  &unpack_uint32_tlv_value},
-		{ NFAPI_NR_CONFIG_DL_GRID_SIZE_TAG,  &(pNfapiMsg->carrier_config.dl_grid_size[1]),  &unpack_uint16_tlv_value},
-		{ NFAPI_NR_CONFIG_DL_K0_TAG,  &(pNfapiMsg->carrier_config.dl_k0[1]),  &unpack_uint16_tlv_value},
-		{ NFAPI_NR_CONFIG_NUM_RX_ANT_TAG,  &(pNfapiMsg->carrier_config.num_rx_ant),  &unpack_uint16_tlv_value},
-		{ NFAPI_NR_CONFIG_NUM_TX_ANT_TAG,  &(pNfapiMsg->carrier_config.num_tx_ant),  &unpack_uint16_tlv_value},
-		{ NFAPI_NR_CONFIG_UL_GRID_SIZE_TAG,  &(pNfapiMsg->carrier_config.ul_grid_size[1]),  &unpack_uint16_tlv_value},
-		{ NFAPI_NR_CONFIG_UL_K0_TAG,  &(pNfapiMsg->carrier_config.ul_k0[1]),  &unpack_uint16_tlv_value},
-		{ NFAPI_NR_CONFIG_UPLINK_BANDWIDTH_TAG,  &(pNfapiMsg->carrier_config.uplink_bandwidth),  &unpack_uint16_tlv_value},
-		{ NFAPI_NR_CONFIG_UPLINK_FREQUENCY_TAG,  &(pNfapiMsg->carrier_config.uplink_frequency),  &unpack_uint32_tlv_value},
-		{ NFAPI_NR_CONFIG_FRAME_DUPLEX_TYPE_TAG,  &(pNfapiMsg->cell_config.frame_duplex_type),  &unpack_uint8_tlv_value},
-		{ NFAPI_NR_CONFIG_PHY_CELL_ID_TAG,  &(pNfapiMsg->cell_config.phy_cell_id),  &unpack_uint8_tlv_value},
-		{ NFAPI_NR_CONFIG_NUM_PRACH_FD_OCCASIONS_TAG,  &(pNfapiMsg->prach_config.num_prach_fd_occasions),  &unpack_uint8_tlv_value},
-		{ NFAPI_NR_CONFIG_PRACH_SEQUENCE_LENGTH_TAG,  &(pNfapiMsg->prach_config.prach_sequence_length),  &unpack_uint8_tlv_value},
-		{ NFAPI_NR_CONFIG_RESTRICTED_SET_CONFIG_TAG,  &(pNfapiMsg->prach_config.restricted_set_config),  &unpack_uint8_tlv_value},
-		{ NFAPI_NR_CONFIG_SSB_PER_RACH_TAG,  &(pNfapiMsg->prach_config.ssb_per_rach),  &unpack_uint8_tlv_value},
-		{ NFAPI_NR_CONFIG_PRACH_SUB_C_SPACING_TAG,  &(pNfapiMsg->prach_config.prach_sub_c_spacing),  &unpack_uint8_tlv_value},
-		{ NFAPI_NR_CONFIG_PRACH_ROOT_SEQUENCE_INDEX_TAG,  &(pNfapiMsg->prach_config.num_prach_fd_occasions_list[0].prach_root_sequence_index),  &unpack_uint16_tlv_value},
-		{ NFAPI_NR_CONFIG_K1_TAG,  &(pNfapiMsg->prach_config.num_prach_fd_occasions_list[0].k1),  &unpack_uint16_tlv_value},
-		{ NFAPI_NR_CONFIG_PRACH_ZERO_CORR_CONF_TAG,  &(pNfapiMsg->prach_config.num_prach_fd_occasions_list[0].prach_zero_corr_conf),  &unpack_uint8_tlv_value},
-		{ NFAPI_NR_CONFIG_NUM_ROOT_SEQUENCES_TAG,  &(pNfapiMsg->prach_config.num_prach_fd_occasions_list[0].num_root_sequences),  &unpack_uint8_tlv_value},
-
-		{ NFAPI_NR_CONFIG_SCS_COMMON_TAG,  &(pNfapiMsg->ssb_config.scs_common),  &unpack_uint8_tlv_value},
-		{ NFAPI_NR_CONFIG_SS_PBCH_POWER_TAG,  &(pNfapiMsg->ssb_config.ss_pbch_power),  &unpack_uint32_tlv_value},
-		{ NFAPI_NR_CONFIG_BETA_PSS_TAG,  &(pNfapiMsg->ssb_table.beta_pss),  &unpack_uint8_tlv_value},
-		{ NFAPI_NR_CONFIG_MIB_TAG,  &(pNfapiMsg->ssb_table.MIB),  &unpack_uint32_tlv_value},
-		{ NFAPI_NR_CONFIG_SSB_MASK_TAG,  &(pNfapiMsg->ssb_table.ssb_mask_list[0].ssb_mask),  &unpack_uint32_tlv_value},
-		{ NFAPI_NR_CONFIG_SSB_MASK_TAG,  &(pNfapiMsg->ssb_table.ssb_mask_list[1].ssb_mask),  &unpack_uint32_tlv_value},
-
-		{ NFAPI_NR_CONFIG_SSB_OFFSET_POINT_A_TAG,  &(pNfapiMsg->ssb_table.ssb_offset_point_a),  &unpack_uint16_tlv_value},
-		{ NFAPI_NR_CONFIG_SSB_PERIOD_TAG,  &(pNfapiMsg->ssb_table.ssb_period),  &unpack_uint8_tlv_value},
-		{ NFAPI_NR_CONFIG_SSB_SUBCARRIER_OFFSET_TAG,  &(pNfapiMsg->ssb_table.ssb_subcarrier_offset),  &unpack_uint8_tlv_value},
-		{ NFAPI_NR_CONFIG_TDD_PERIOD_TAG,  &(pNfapiMsg->tdd_table.tdd_period),  &unpack_uint8_tlv_value},
-		{ NFAPI_NR_NFAPI_P7_PNF_ADDRESS_IPV6_TAG,  &(pNfapiMsg->nfapi_config.p7_pnf_address_ipv6),  &unpack_ipv6_address_value},
-		{ NFAPI_NR_NFAPI_P7_PNF_PORT_TAG,  &(pNfapiMsg->nfapi_config.p7_pnf_port),  &unpack_uint16_tlv_value},
-		{ NFAPI_NR_NFAPI_P7_VNF_ADDRESS_IPV4_TAG,  &(pNfapiMsg->nfapi_config.p7_vnf_address_ipv4),  &unpack_ipv4_address_value},
-		{ NFAPI_NR_NFAPI_P7_VNF_ADDRESS_IPV6_TAG,  &(pNfapiMsg->nfapi_config.p7_vnf_address_ipv6),  &unpack_ipv6_address_value},
-		{ NFAPI_NR_NFAPI_P7_VNF_PORT_TAG,  &(pNfapiMsg->nfapi_config.p7_vnf_port),  &unpack_uint16_tlv_value},
-		{ NFAPI_NR_NFAPI_TIMING_INFO_MODE_TAG,  &(pNfapiMsg->nfapi_config.timing_info_mode),  &unpack_uint8_tlv_value},
-		{ NFAPI_NR_NFAPI_TIMING_INFO_PERIOD_TAG,  &(pNfapiMsg->nfapi_config.timing_info_period),  &unpack_uint8_tlv_value},
-		{ NFAPI_NR_NFAPI_TIMING_WINDOW_TAG,  &(pNfapiMsg->nfapi_config.timing_window),  &unpack_uint8_tlv_value},
-	};
-
-	return ( pull8(ppReadPackedMsg, &pNfapiMsg->num_tlv, end) &&
-			 unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, end, config, &pNfapiMsg->vendor_extension));
-		
-}
-
-static uint8_t unpack_config_response(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p4_p5_codec_config_t *config) {
-  nfapi_config_response_t *pNfapiMsg = (nfapi_config_response_t *)msg;
-  return ( pull32(ppReadPackedMsg, &pNfapiMsg->error_code, end) &&
-           unpack_tlv_list(NULL, 0, ppReadPackedMsg, end, config, &(pNfapiMsg->vendor_extension)));
-}
-
-static uint8_t unpack_nr_config_response(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p4_p5_codec_config_t *config) {
-  nfapi_nr_config_response_scf_t *pNfapiMsg = (nfapi_nr_config_response_scf_t *)msg;
-  return ( pull8(ppReadPackedMsg, &pNfapiMsg->error_code, end) &&
-           unpack_tlv_list(NULL, 0, ppReadPackedMsg, end, config, &(pNfapiMsg->vendor_extension)));
-}
-
-static uint8_t unpack_nr_start_request(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p4_p5_codec_config_t *config) {
-  nfapi_nr_start_request_scf_t *pNfapiMsg = ( nfapi_nr_start_request_scf_t *)msg;
-  return unpack_tlv_list(NULL, 0, ppReadPackedMsg, end, config, &(pNfapiMsg->vendor_extension));
-}
-
-static uint8_t unpack_start_request(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p4_p5_codec_config_t *config) {
-  nfapi_start_request_t *pNfapiMsg = ( nfapi_start_request_t *)msg;
-  return unpack_tlv_list(NULL, 0, ppReadPackedMsg, end, config, &(pNfapiMsg->vendor_extension));
-}
-
-static uint8_t unpack_start_response(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p4_p5_codec_config_t *config) {
-  nfapi_start_response_t *pNfapiMsg = (nfapi_start_response_t *)msg;
-  return ( pull32(ppReadPackedMsg, &pNfapiMsg->error_code, end) &&
-           unpack_tlv_list(NULL, 0, ppReadPackedMsg, end, config, &(pNfapiMsg->vendor_extension)));
-}
-
-static uint8_t unpack_nr_start_response(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p4_p5_codec_config_t *config) {
-  nfapi_nr_start_response_scf_t *pNfapiMsg = (nfapi_nr_start_response_scf_t *)msg;
-  return ( pull32(ppReadPackedMsg, &pNfapiMsg->error_code, end) &&
-           unpack_tlv_list(NULL, 0, ppReadPackedMsg, end, config, &(pNfapiMsg->vendor_extension)));
-}
-
-static uint8_t unpack_stop_request(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p4_p5_codec_config_t *config) {
-  nfapi_stop_request_t *pNfapiMsg = (nfapi_stop_request_t *)msg;
-  return unpack_tlv_list(NULL, 0, ppReadPackedMsg, end, config, &(pNfapiMsg->vendor_extension));
-}
-
-static uint8_t unpack_stop_response(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p4_p5_codec_config_t *config) {
-  nfapi_stop_response_t *pNfapiMsg = (nfapi_stop_response_t *)msg;
-  return ( pull32(ppReadPackedMsg, &pNfapiMsg->error_code, end) &&
-           unpack_tlv_list(NULL, 0, ppReadPackedMsg, end, config, &(pNfapiMsg->vendor_extension)));
-}
-static uint8_t unpack_measurement_request(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p4_p5_codec_config_t *config) {
-  nfapi_measurement_request_t *pNfapiMsg = (nfapi_measurement_request_t *)msg;
-  unpack_tlv_t unpack_fns[] = {
-    { NFAPI_MEASUREMENT_REQUEST_DL_RS_XTX_POWER_TAG, &pNfapiMsg->dl_rs_tx_power, &unpack_uint16_tlv_value},
-    { NFAPI_MEASUREMENT_REQUEST_RECEIVED_INTERFERENCE_POWER_TAG, &pNfapiMsg->received_interference_power, &unpack_uint16_tlv_value},
-    { NFAPI_MEASUREMENT_REQUEST_THERMAL_NOISE_POWER_TAG, &pNfapiMsg->thermal_noise_power, &unpack_uint16_tlv_value},
-  };
-  return unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, end, config, &(pNfapiMsg->vendor_extension));
-}
-
-static uint8_t unpack_received_interference_power_measurement_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
-  nfapi_received_interference_power_measurement_t *value = (nfapi_received_interference_power_measurement_t *)tlv;
-  return ( pull16(ppReadPackedMsg, &value->number_of_resource_blocks, end) &&
-           pullarrays16(ppReadPackedMsg, value->received_interference_power,  NFAPI_MAX_RECEIVED_INTERFERENCE_POWER_RESULTS, value->number_of_resource_blocks, end));
-}
-
-
-static uint8_t unpack_measurement_response(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p4_p5_codec_config_t *config) {
-  nfapi_measurement_response_t *pNfapiMsg = (nfapi_measurement_response_t *)msg;
-  unpack_tlv_t unpack_fns[] = {
-    { NFAPI_MEASUREMENT_RESPONSE_DL_RS_POWER_MEASUREMENT_TAG, &pNfapiMsg->dl_rs_tx_power_measurement, &unpack_int16_tlv_value},
-    { NFAPI_MEASUREMENT_RESPONSE_RECEIVED_INTERFERENCE_POWER_MEASUREMENT_TAG, &pNfapiMsg->received_interference_power_measurement, &unpack_received_interference_power_measurement_value},
-    { NFAPI_MEASUREMENT_RESPONSE_THERMAL_NOISE_MEASUREMENT_TAG, &pNfapiMsg->thermal_noise_power_measurement, &unpack_int16_tlv_value},
-  };
-  return ( pull32(ppReadPackedMsg, &pNfapiMsg->error_code, end) &&
-           unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, end, config, &pNfapiMsg->vendor_extension));
-}
-
-// unpack length check
-
-static int check_nr_unpack_length(nfapi_nr_phy_msg_type_e msgId, uint32_t unpackedBufLen) {
-  int retLen = 0;
-
-  switch (msgId) {
-    case NFAPI_NR_PHY_MSG_TYPE_PNF_PARAM_REQUEST:
-      if (unpackedBufLen >= sizeof(nfapi_pnf_param_request_t))
-        retLen = sizeof(nfapi_pnf_param_request_t);
-
-      break;
-
-    case NFAPI_NR_PHY_MSG_TYPE_PNF_PARAM_RESPONSE:
-      if (unpackedBufLen >= sizeof(nfapi_nr_pnf_param_response_t))
-        retLen = sizeof(nfapi_nr_pnf_param_response_t);
-
-      break;
-
-    case NFAPI_NR_PHY_MSG_TYPE_PNF_CONFIG_REQUEST:
-      if (unpackedBufLen >= sizeof(nfapi_nr_pnf_config_request_t))
-        retLen = sizeof(nfapi_nr_pnf_config_request_t);
-
-      break;
-
-    case NFAPI_NR_PHY_MSG_TYPE_PNF_CONFIG_RESPONSE:
-      if (unpackedBufLen >= sizeof(nfapi_nr_pnf_config_response_t))
-        retLen = sizeof(nfapi_nr_pnf_config_response_t);
-
-      break;
-
-    case NFAPI_NR_PHY_MSG_TYPE_PNF_START_REQUEST:
-      if (unpackedBufLen >= sizeof(nfapi_nr_pnf_start_request_t))
-        retLen = sizeof(nfapi_nr_pnf_start_request_t);
-
-      break;
-
-    case NFAPI_NR_PHY_MSG_TYPE_PNF_START_RESPONSE:
-      if (unpackedBufLen >= sizeof(nfapi_nr_pnf_start_response_t))
-        retLen = sizeof(nfapi_nr_pnf_start_response_t);
-
-      break;
-
-    case NFAPI_NR_PHY_MSG_TYPE_PNF_STOP_REQUEST:
-      if (unpackedBufLen >= sizeof(nfapi_nr_pnf_stop_request_t))
-        retLen = sizeof(nfapi_nr_pnf_stop_request_t);
-
-      break;
-
-    case NFAPI_NR_PHY_MSG_TYPE_PNF_STOP_RESPONSE:
-      if (unpackedBufLen >= sizeof(nfapi_nr_pnf_stop_response_t))
-        retLen = sizeof(nfapi_nr_pnf_stop_response_t);
-
-      break;
-
-    case NFAPI_NR_PHY_MSG_TYPE_PARAM_REQUEST:
-      if (unpackedBufLen >= sizeof(nfapi_nr_param_request_scf_t))
-        retLen = sizeof(nfapi_nr_param_request_scf_t);
-
-      break;
-
-    case NFAPI_NR_PHY_MSG_TYPE_PARAM_RESPONSE:
-      if (unpackedBufLen >= sizeof(nfapi_nr_param_response_scf_t))
-        retLen = sizeof(nfapi_nr_param_response_scf_t);
-
-      break;
-
-    case NFAPI_NR_PHY_MSG_TYPE_CONFIG_REQUEST:
-      if (unpackedBufLen >= sizeof(nfapi_nr_config_request_scf_t))
-        retLen = sizeof(nfapi_nr_config_request_scf_t);
-
-      break;
-
-    case NFAPI_NR_PHY_MSG_TYPE_CONFIG_RESPONSE:
-      if (unpackedBufLen >= sizeof(nfapi_nr_config_response_scf_t))
-        retLen = sizeof(nfapi_nr_config_response_scf_t);
-
-      break;
-
-    case NFAPI_NR_PHY_MSG_TYPE_START_REQUEST:
-      if (unpackedBufLen >= sizeof( nfapi_nr_start_request_scf_t))
-        retLen = sizeof( nfapi_nr_start_request_scf_t);
-
-      break;
-
-    case NFAPI_NR_PHY_MSG_TYPE_START_RESPONSE:
-      if (unpackedBufLen >= sizeof(nfapi_nr_start_response_scf_t))
-        retLen = sizeof(nfapi_nr_start_response_scf_t);
-
-      break;
-
-    case NFAPI_NR_PHY_MSG_TYPE_STOP_REQUEST:
-      if (unpackedBufLen >= sizeof(nfapi_stop_request_t))
-        retLen = sizeof(nfapi_stop_request_t);
-
-      break;
-
-    case NFAPI_NR_PHY_MSG_TYPE_STOP_RESPONSE:
-      if (unpackedBufLen >= sizeof(nfapi_stop_response_t))
-        retLen = sizeof(nfapi_stop_response_t);
-
-      break;
-
-    default:
-      NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s Unknown message ID %d\n", __FUNCTION__, msgId);
-      break;
-  }
-
-  return retLen;
-}
-
-
-static int check_unpack_length(nfapi_message_id_e msgId, uint32_t unpackedBufLen) {
-  int retLen = 0;
-
-  switch (msgId) {
-    case NFAPI_PNF_PARAM_REQUEST:
-      if (unpackedBufLen >= sizeof(nfapi_pnf_param_request_t))
-        retLen = sizeof(nfapi_pnf_param_request_t);
-
-      break;
-
-    case NFAPI_PNF_PARAM_RESPONSE:
-      if (unpackedBufLen >= sizeof(nfapi_pnf_param_response_t))
-        retLen = sizeof(nfapi_pnf_param_response_t);
-
-      break;
-
-    case NFAPI_PNF_CONFIG_REQUEST:
-      if (unpackedBufLen >= sizeof(nfapi_pnf_config_request_t))
-        retLen = sizeof(nfapi_pnf_config_request_t);
-
-      break;
-
-    case NFAPI_PNF_CONFIG_RESPONSE:
-      if (unpackedBufLen >= sizeof(nfapi_pnf_config_response_t))
-        retLen = sizeof(nfapi_pnf_config_response_t);
-
-      break;
-
-    case NFAPI_PNF_START_REQUEST:
-      if (unpackedBufLen >= sizeof(nfapi_pnf_start_request_t))
-        retLen = sizeof(nfapi_pnf_start_request_t);
-
-      break;
-
-    case NFAPI_PNF_START_RESPONSE:
-      if (unpackedBufLen >= sizeof(nfapi_pnf_start_response_t))
-        retLen = sizeof(nfapi_pnf_start_response_t);
-
-      break;
-
-    case NFAPI_PNF_STOP_REQUEST:
-      if (unpackedBufLen >= sizeof(nfapi_pnf_stop_request_t))
-        retLen = sizeof(nfapi_pnf_stop_request_t);
-
-      break;
-
-    case NFAPI_PNF_STOP_RESPONSE:
-      if (unpackedBufLen >= sizeof(nfapi_pnf_stop_response_t))
-        retLen = sizeof(nfapi_pnf_stop_response_t);
-
-      break;
-
-    case NFAPI_PARAM_REQUEST:
-      if (unpackedBufLen >= sizeof(nfapi_param_request_t))
-        retLen = sizeof(nfapi_param_request_t);
-
-      break;
-
-    case NFAPI_PARAM_RESPONSE:
-      if (unpackedBufLen >= sizeof(nfapi_param_response_t))
-        retLen = sizeof(nfapi_param_response_t);
-
-      break;
-
-    case NFAPI_CONFIG_REQUEST:
-      if (unpackedBufLen >= sizeof(nfapi_config_request_t))
-        retLen = sizeof(nfapi_config_request_t);
-
-      break;
-
-    case NFAPI_CONFIG_RESPONSE:
-      if (unpackedBufLen >= sizeof(nfapi_config_response_t))
-        retLen = sizeof(nfapi_config_response_t);
-
-      break;
-
-    case NFAPI_START_REQUEST:
-      if (unpackedBufLen >= sizeof( nfapi_start_request_t))
-        retLen = sizeof( nfapi_start_request_t);
-
-      break;
-
-    case NFAPI_START_RESPONSE:
-      if (unpackedBufLen >= sizeof(nfapi_start_response_t))
-        retLen = sizeof(nfapi_start_response_t);
-
-      break;
-
-    case NFAPI_STOP_REQUEST:
-      if (unpackedBufLen >= sizeof(nfapi_stop_request_t))
-        retLen = sizeof(nfapi_stop_request_t);
-
-      break;
-
-    case NFAPI_STOP_RESPONSE:
-      if (unpackedBufLen >= sizeof(nfapi_stop_response_t))
-        retLen = sizeof(nfapi_stop_response_t);
-
-      break;
-
-    case NFAPI_MEASUREMENT_REQUEST:
-      if (unpackedBufLen >= sizeof(nfapi_measurement_request_t))
-        retLen = sizeof(nfapi_measurement_request_t);
-
-      break;
-
-    case NFAPI_MEASUREMENT_RESPONSE:
-      if (unpackedBufLen >= sizeof(nfapi_measurement_response_t))
-        retLen = sizeof(nfapi_measurement_response_t);
-
-      break;
-
-    default:
-      NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s Unknown message ID %d\n", __FUNCTION__, msgId);
-      break;
-  }
-
-  return retLen;
-}
-
-
-// Main unpack functions - public
-
-int nfapi_p5_message_header_unpack(void *pMessageBuf, uint32_t messageBufLen, void *pUnpackedBuf, uint32_t unpackedBufLen, nfapi_p4_p5_codec_config_t *config) {
-  nfapi_p4_p5_message_header_t *pMessageHeader = pUnpackedBuf;
-  uint8_t *pReadPackedMessage = pMessageBuf;
-  uint8_t *end = pMessageBuf + messageBufLen;
-
-  if (pMessageBuf == NULL || pUnpackedBuf == NULL) {
-    NFAPI_TRACE(NFAPI_TRACE_ERROR, "P5 header unpack supplied pointers are null\n");
-    return -1;
-  }
-
-  if (messageBufLen < NFAPI_HEADER_LENGTH || unpackedBufLen < sizeof(nfapi_p4_p5_message_header_t)) {
-    NFAPI_TRACE(NFAPI_TRACE_ERROR, "P5 header unpack supplied message buffer is too small %d, %d\n", messageBufLen, unpackedBufLen);
-    return -1;
-  }
-
-  // process the header
-  return ( pull16(&pReadPackedMessage, &pMessageHeader->phy_id, end) &&
-           pull16(&pReadPackedMessage, &pMessageHeader->message_id, end) &&
-           pull16(&pReadPackedMessage, &pMessageHeader->message_length, end) &&
-           pull16(&pReadPackedMessage, &pMessageHeader->spare, end) );
-}
-
-int nfapi_nr_p5_message_unpack(void *pMessageBuf, uint32_t messageBufLen, void *pUnpackedBuf, uint32_t unpackedBufLen, nfapi_p4_p5_codec_config_t *config) {
-  nfapi_p4_p5_message_header_t *pMessageHeader = pUnpackedBuf;
-  uint8_t *pReadPackedMessage = pMessageBuf;
-  uint8_t *end = pMessageBuf + messageBufLen;
-
-  if (pMessageBuf == NULL || pUnpackedBuf == NULL) {
-    NFAPI_TRACE(NFAPI_TRACE_ERROR, "P5 unpack supplied pointers are null\n");
-    return -1;
-  }
-
-  if (messageBufLen < NFAPI_HEADER_LENGTH || unpackedBufLen < sizeof(nfapi_p4_p5_message_header_t)) {
-    NFAPI_TRACE(NFAPI_TRACE_ERROR, "P5 unpack supplied message buffer is too small %d, %d\n", messageBufLen, unpackedBufLen);
-    return -1;
-  }
-
-  uint8_t *ptr = pReadPackedMessage;
-  printf("\n Read message unpack: ");
-
-  while(ptr < end) {
-    printf(" %d ", *ptr);
-    ptr++;
-  }
-
-  printf("\n");
-  // clean the supplied buffer for - tag value blanking
-  (void)memset(pUnpackedBuf, 0, unpackedBufLen);
-
-  // process the header
-  if( !(pull16(&pReadPackedMessage, &pMessageHeader->phy_id, end ) &&
-        pull16(&pReadPackedMessage, &pMessageHeader->message_id, end) &&
-        pull16(&pReadPackedMessage, &pMessageHeader->message_length, end) &&
-        pull16(&pReadPackedMessage, &pMessageHeader->spare, end))) {
-    // failed to read the header
-    return -1;
-  }
-
-  int result = -1;
-
-  if(check_nr_unpack_length(pMessageHeader->message_id, unpackedBufLen) == 0) {
-    // the unpack buffer is not big enough for the struct
-    return -1;
-  }
-
-  // look for the specific message
-  switch (pMessageHeader->message_id) {
-    case NFAPI_NR_PHY_MSG_TYPE_PNF_PARAM_REQUEST:
-      result = unpack_nr_pnf_param_request(&pReadPackedMessage, end, pMessageHeader, config);
-      break;
-
-    case NFAPI_NR_PHY_MSG_TYPE_PNF_PARAM_RESPONSE:
-      result = unpack_nr_pnf_param_response(&pReadPackedMessage, end, pMessageHeader, config);
-      break;
-
-    case NFAPI_NR_PHY_MSG_TYPE_PNF_CONFIG_REQUEST:
-      result = unpack_nr_pnf_config_request(&pReadPackedMessage, end, pMessageHeader, config);
-      break;
-
-    case NFAPI_NR_PHY_MSG_TYPE_PNF_CONFIG_RESPONSE:
-      result = unpack_nr_pnf_config_response(&pReadPackedMessage, end, pMessageHeader, config);
-      break;
-
-    case NFAPI_NR_PHY_MSG_TYPE_PNF_START_REQUEST:
-      result = unpack_nr_pnf_start_request(&pReadPackedMessage, end, pMessageHeader, config);
-      break;
-
-    case NFAPI_NR_PHY_MSG_TYPE_PNF_START_RESPONSE:
-      result = unpack_nr_pnf_start_response(&pReadPackedMessage, end, pMessageHeader, config);
-      break;
-
-    case NFAPI_NR_PHY_MSG_TYPE_PNF_STOP_REQUEST:
-      result = unpack_pnf_stop_request(&pReadPackedMessage, end, pMessageHeader, config);
-      break;
-
-    case NFAPI_NR_PHY_MSG_TYPE_PNF_STOP_RESPONSE:
-      result = unpack_pnf_stop_response(&pReadPackedMessage, end, pMessageHeader, config);
-      break;
-
-    case NFAPI_NR_PHY_MSG_TYPE_PARAM_REQUEST:
-      result = unpack_nr_param_request(&pReadPackedMessage, end, pMessageHeader, config);
-      break;
-
-    case NFAPI_NR_PHY_MSG_TYPE_PARAM_RESPONSE:
-      result = unpack_nr_param_response(&pReadPackedMessage, end, pMessageHeader, config);
-      break;
-
-    case NFAPI_NR_PHY_MSG_TYPE_CONFIG_REQUEST:
-      result = unpack_nr_config_request(&pReadPackedMessage, end, pMessageHeader, config);
-      break;
-
-    case NFAPI_NR_PHY_MSG_TYPE_CONFIG_RESPONSE:
-      result = unpack_nr_config_response(&pReadPackedMessage, end, pMessageHeader, config);
-      break;
-
-    case NFAPI_NR_PHY_MSG_TYPE_START_REQUEST:
-      result = unpack_nr_start_request(&pReadPackedMessage, end, pMessageHeader, config);
-      break;
-
-    case NFAPI_NR_PHY_MSG_TYPE_START_RESPONSE:
-      result = unpack_nr_start_response(&pReadPackedMessage, end, pMessageHeader, config);
-      break;
-
-    case NFAPI_NR_PHY_MSG_TYPE_STOP_REQUEST:
-      result = unpack_stop_request(&pReadPackedMessage, end, pMessageHeader, config);
-      break;
-
-    case NFAPI_NR_PHY_MSG_TYPE_STOP_RESPONSE:
-      result = unpack_stop_response(&pReadPackedMessage, end, pMessageHeader, config);
-      break;
-
-    case NFAPI_MEASUREMENT_REQUEST:
-      result = unpack_measurement_request(&pReadPackedMessage, end, pMessageHeader, config);
-      break;
-
-    case NFAPI_MEASUREMENT_RESPONSE:
-      result = unpack_measurement_response(&pReadPackedMessage, end, pMessageHeader, config);
-      break;
-
-    default:
-      if(pMessageHeader->message_id >= NFAPI_VENDOR_EXT_MSG_MIN &&
-          pMessageHeader->message_id <= NFAPI_VENDOR_EXT_MSG_MAX) {
-        if(config && config->unpack_p4_p5_vendor_extension) {
-          result = (config->unpack_p4_p5_vendor_extension)(pMessageHeader, &pReadPackedMessage, end, config);
-        } else {
-          NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s VE NFAPI message ID %d. No ve decoder provided\n", __FUNCTION__, pMessageHeader->message_id);
-        }
-      } else {
-        NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s NFAPI Unknown P5 message ID %d\n", __FUNCTION__, pMessageHeader->message_id);
-      }
-
-      break;
-  }
-
-  return result;
-}
-
-int nfapi_p5_message_unpack(void *pMessageBuf, uint32_t messageBufLen, void *pUnpackedBuf, uint32_t unpackedBufLen, nfapi_p4_p5_codec_config_t *config) {
-  nfapi_p4_p5_message_header_t *pMessageHeader = pUnpackedBuf;
-  uint8_t *pReadPackedMessage = pMessageBuf;
-  uint8_t *end = pMessageBuf + messageBufLen;
-
-  if (pMessageBuf == NULL || pUnpackedBuf == NULL) {
-    NFAPI_TRACE(NFAPI_TRACE_ERROR, "P5 unpack supplied pointers are null\n");
-    return -1;
-  }
-
-  if (messageBufLen < NFAPI_HEADER_LENGTH || unpackedBufLen < sizeof(nfapi_p4_p5_message_header_t)) {
-    NFAPI_TRACE(NFAPI_TRACE_ERROR, "P5 unpack supplied message buffer is too small %d, %d\n", messageBufLen, unpackedBufLen);
-    return -1;
-  }
-
-  uint8_t *ptr = pReadPackedMessage;
-  printf("\n Read message unpack: ");
-
-  while(ptr < end) {
-    printf(" %d ", *ptr);
-    ptr++;
-  }
-
-  printf("\n");
-  // clean the supplied buffer for - tag value blanking
-  (void)memset(pUnpackedBuf, 0, unpackedBufLen);
-
-  // process the header
-  if( !(pull16(&pReadPackedMessage, &pMessageHeader->phy_id, end ) &&
-        pull16(&pReadPackedMessage, &pMessageHeader->message_id, end) &&
-        pull16(&pReadPackedMessage, &pMessageHeader->message_length, end) &&
-        pull16(&pReadPackedMessage, &pMessageHeader->spare, end))) {
-    // failed to read the header
-    return -1;
-  }
-
-  int result = -1;
-
-  if(check_unpack_length(pMessageHeader->message_id, unpackedBufLen) == 0) {
-    // the unpack buffer is not big enough for the struct
-    return -1;
-  }
-
-  // look for the specific message
-  switch (pMessageHeader->message_id) {
-    case NFAPI_PNF_PARAM_REQUEST:
-      result = unpack_pnf_param_request(&pReadPackedMessage, end, pMessageHeader, config);
-      break;
-
-    case NFAPI_PNF_PARAM_RESPONSE:
-      result = unpack_pnf_param_response(&pReadPackedMessage, end, pMessageHeader, config);
-      break;
-
-    case NFAPI_PNF_CONFIG_REQUEST:
-      result = unpack_pnf_config_request(&pReadPackedMessage, end, pMessageHeader, config);
-      break;
-
-    case NFAPI_PNF_CONFIG_RESPONSE:
-      result = unpack_pnf_config_response(&pReadPackedMessage, end, pMessageHeader, config);
-      break;
-
-    case NFAPI_PNF_START_REQUEST:
-      result = unpack_pnf_start_request(&pReadPackedMessage, end, pMessageHeader, config);
-      break;
-
-    case NFAPI_PNF_START_RESPONSE:
-      result = unpack_pnf_start_response(&pReadPackedMessage, end, pMessageHeader, config);
-      break;
-
-    case NFAPI_PNF_STOP_REQUEST:
-      result = unpack_pnf_stop_request(&pReadPackedMessage, end, pMessageHeader, config);
-      break;
-
-    case NFAPI_PNF_STOP_RESPONSE:
-      result = unpack_pnf_stop_response(&pReadPackedMessage, end, pMessageHeader, config);
-      break;
-
-    case NFAPI_PARAM_REQUEST:
-      result = unpack_param_request(&pReadPackedMessage, end, pMessageHeader, config);
-      break;
-
-    case NFAPI_PARAM_RESPONSE:
-      result = unpack_param_response(&pReadPackedMessage, end, pMessageHeader, config);
-      break;
-
-    case NFAPI_CONFIG_REQUEST:
-      result = unpack_config_request(&pReadPackedMessage, end, pMessageHeader, config);
-      break;
-
-    case NFAPI_CONFIG_RESPONSE:
-      result = unpack_config_response(&pReadPackedMessage, end, pMessageHeader, config);
-      break;
-
-    case NFAPI_START_REQUEST:
-      result = unpack_start_request(&pReadPackedMessage, end, pMessageHeader, config);
-      break;
-
-    case NFAPI_START_RESPONSE:
-      result = unpack_start_response(&pReadPackedMessage, end, pMessageHeader, config);
-      break;
-
-    case NFAPI_STOP_REQUEST:
-      result = unpack_stop_request(&pReadPackedMessage, end, pMessageHeader, config);
-      break;
-
-    case NFAPI_STOP_RESPONSE:
-      result = unpack_stop_response(&pReadPackedMessage, end, pMessageHeader, config);
-      break;
-
-    case NFAPI_MEASUREMENT_REQUEST:
-      result = unpack_measurement_request(&pReadPackedMessage, end, pMessageHeader, config);
-      break;
-
-    case NFAPI_MEASUREMENT_RESPONSE:
-      result = unpack_measurement_response(&pReadPackedMessage, end, pMessageHeader, config);
-      break;
-
-    default:
-      if(pMessageHeader->message_id >= NFAPI_VENDOR_EXT_MSG_MIN &&
-          pMessageHeader->message_id <= NFAPI_VENDOR_EXT_MSG_MAX) {
-        if(config && config->unpack_p4_p5_vendor_extension) {
-          result = (config->unpack_p4_p5_vendor_extension)(pMessageHeader, &pReadPackedMessage, end, config);
-        } else {
-          NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s VE NFAPI message ID %d. No ve decoder provided\n", __FUNCTION__, pMessageHeader->message_id);
-        }
-      } else {
-        NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s NFAPI Unknown P5 message ID %d\n", __FUNCTION__, pMessageHeader->message_id);
-      }
-
-      break;
-  }
-
-  return result;
-}
-
+/*
+ * Copyright 2017 Cisco Systems, Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+
+#include <signal.h>
+#include <sys/time.h>
+#include <sys/socket.h>
+#include <sys/types.h>
+#include <netinet/in.h>
+#include <arpa/inet.h>
+#include <sched.h>
+#include <time.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+#include <errno.h>
+#include <pthread.h>
+#include <stdint.h>
+
+#include <nfapi_interface.h>
+#include <nfapi.h>
+#include "nfapi_nr_interface.h"
+#include "nfapi_nr_interface_scf.h"
+#include <debug.h>
+
+
+// Pack routines
+//TODO: Add pacl/unpack fns for uint32 and uint64
+static uint8_t pack_nr_pnf_param_request(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p4_p5_codec_config_t *config) {
+  nfapi_nr_pnf_param_request_t *request = (nfapi_nr_pnf_param_request_t *)msg;
+  return pack_vendor_extension_tlv(request->vendor_extension, ppWritePackedMsg, end, config);
+}
+
+static uint8_t pack_pnf_param_request(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p4_p5_codec_config_t *config) {
+  nfapi_pnf_param_request_t *request = (nfapi_pnf_param_request_t *)msg;
+  return pack_vendor_extension_tlv(request->vendor_extension, ppWritePackedMsg, end, config);
+}
+
+static uint8_t pack_pnf_param_general_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_pnf_param_general_t *value = (nfapi_pnf_param_general_t *)tlv;
+  return ( push8(value->nfapi_sync_mode, ppWritePackedMsg, end) &&
+           push8(value->location_mode, ppWritePackedMsg, end) &&
+           push16(value->location_coordinates_length, ppWritePackedMsg, end) &&
+           pusharray8(value->location_coordinates, NFAPI_PNF_PARAM_GENERAL_LOCATION_LENGTH, value->location_coordinates_length, ppWritePackedMsg, end) &&
+           push32(value->dl_config_timing, ppWritePackedMsg, end) &&
+           push32(value->tx_timing, ppWritePackedMsg, end) &&
+           push32(value->ul_config_timing, ppWritePackedMsg, end) &&
+           push32(value->hi_dci0_timing, ppWritePackedMsg, end) &&
+           push16(value->maximum_number_phys, ppWritePackedMsg, end) &&
+           push16(value->maximum_total_bandwidth, ppWritePackedMsg, end) &&
+           push8(value->maximum_total_number_dl_layers, ppWritePackedMsg, end) &&
+           push8(value->maximum_total_number_ul_layers, ppWritePackedMsg, end) &&
+           push8(value->shared_bands, ppWritePackedMsg, end) &&
+           push8(value->shared_pa, ppWritePackedMsg, end) &&
+           pushs16(value->maximum_total_power, ppWritePackedMsg, end) &&
+           pusharray8(value->oui, NFAPI_PNF_PARAM_GENERAL_OUI_LENGTH, NFAPI_PNF_PARAM_GENERAL_OUI_LENGTH, ppWritePackedMsg, end));
+}
+
+static uint8_t pack_rf_config_info(void *elem, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_rf_config_info_t *rf = (nfapi_rf_config_info_t *)elem;
+  return (push16(rf->rf_config_index, ppWritePackedMsg, end));
+}
+
+
+static uint8_t pack_pnf_phy_info(void *elem, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_pnf_phy_info_t *phy = (nfapi_pnf_phy_info_t *)elem;
+  return (  push16(phy->phy_config_index, ppWritePackedMsg, end) &&
+            push16(phy->number_of_rfs, ppWritePackedMsg, end) &&
+            packarray(phy->rf_config, sizeof(nfapi_rf_config_info_t), NFAPI_MAX_PNF_PHY_RF_CONFIG, phy->number_of_rfs, ppWritePackedMsg, end, &pack_rf_config_info) &&
+            push16(phy->number_of_rf_exclusions, ppWritePackedMsg, end) &&
+            packarray(phy->excluded_rf_config, sizeof(nfapi_rf_config_info_t), NFAPI_MAX_PNF_PHY_RF_CONFIG, phy->number_of_rf_exclusions, ppWritePackedMsg, end, &pack_rf_config_info) &&
+            push16(phy->downlink_channel_bandwidth_supported, ppWritePackedMsg, end) &&
+            push16(phy->uplink_channel_bandwidth_supported, ppWritePackedMsg, end) &&
+            push8(phy->number_of_dl_layers_supported, ppWritePackedMsg, end) &&
+            push8(phy->number_of_ul_layers_supported, ppWritePackedMsg, end) &&
+            push16(phy->maximum_3gpp_release_supported, ppWritePackedMsg, end) &&
+            push8(phy->nmm_modes_supported, ppWritePackedMsg, end));
+}
+
+static uint8_t pack_pnf_phy_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_pnf_phy_t *value = (nfapi_pnf_phy_t *)tlv;
+  return ( push16(value->number_of_phys, ppWritePackedMsg, end) &&
+           packarray(value->phy, sizeof(nfapi_pnf_phy_info_t), NFAPI_MAX_PNF_PHY, value->number_of_phys, ppWritePackedMsg, end, &pack_pnf_phy_info));
+}
+
+static uint8_t pack_pnf_rf_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_pnf_rf_t *value = (nfapi_pnf_rf_t *)tlv;
+  uint16_t rf_index = 0;
+
+  if(push16(value->number_of_rfs, ppWritePackedMsg, end) == 0)
+    return 0;
+
+  for(; rf_index < value->number_of_rfs; ++rf_index) {
+    if( !(push16(value->rf[rf_index].rf_config_index, ppWritePackedMsg, end) &&
+          push16(value->rf[rf_index].band, ppWritePackedMsg, end) &&
+          pushs16(value->rf[rf_index].maximum_transmit_power, ppWritePackedMsg, end) &&
+          pushs16(value->rf[rf_index].minimum_transmit_power, ppWritePackedMsg, end) &&
+          push8(value->rf[rf_index].number_of_antennas_suppported, ppWritePackedMsg, end) &&
+          push32(value->rf[rf_index].minimum_downlink_frequency, ppWritePackedMsg, end) &&
+          push32(value->rf[rf_index].maximum_downlink_frequency, ppWritePackedMsg, end) &&
+          push32(value->rf[rf_index].minimum_uplink_frequency, ppWritePackedMsg, end) &&
+          push32(value->rf[rf_index].maximum_uplink_frequency, ppWritePackedMsg, end)))
+      return 0;
+  }
+
+  return 1;
+}
+static uint8_t pack_pnf_phy_rel10_info(void *elem, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_pnf_phy_rel10_info_t *phy = (nfapi_pnf_phy_rel10_info_t *)elem;
+  return(push16(phy->phy_config_index, ppWritePackedMsg, end) &&
+         push16(phy->transmission_mode_7_supported, ppWritePackedMsg, end) &&
+         push16(phy->transmission_mode_8_supported, ppWritePackedMsg, end) &&
+         push16(phy->two_antenna_ports_for_pucch, ppWritePackedMsg, end) &&
+         push16(phy->transmission_mode_9_supported, ppWritePackedMsg, end) &&
+         push16(phy->simultaneous_pucch_pusch, ppWritePackedMsg, end) &&
+         push16(phy->four_layer_tx_with_tm3_and_tm4, ppWritePackedMsg, end));
+}
+
+static uint8_t pack_pnf_phy_rel10_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_pnf_phy_rel10_t *value = (nfapi_pnf_phy_rel10_t *)tlv;
+  return (push16(value->number_of_phys, ppWritePackedMsg, end) &&
+          packarray(value->phy, sizeof(nfapi_pnf_phy_rel10_info_t), NFAPI_MAX_PNF_PHY, value->number_of_phys, ppWritePackedMsg, end, &pack_pnf_phy_rel10_info));
+}
+
+static uint8_t pack_pnf_phy_rel11_info(void *elem, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_pnf_phy_rel11_info_t *phy = (nfapi_pnf_phy_rel11_info_t *)elem;
+  return (push16(phy->phy_config_index, ppWritePackedMsg, end) &&
+          push16(phy->edpcch_supported, ppWritePackedMsg, end) &&
+          push16(phy->multi_ack_csi_reporting, ppWritePackedMsg, end) &&
+          push16(phy->pucch_tx_diversity, ppWritePackedMsg, end) &&
+          push16(phy->ul_comp_supported, ppWritePackedMsg, end) &&
+          push16(phy->transmission_mode_5_supported, ppWritePackedMsg, end ));
+}
+static uint8_t pack_pnf_phy_rel11_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_pnf_phy_rel11_t *value = (nfapi_pnf_phy_rel11_t *)tlv;
+  return (push16(value->number_of_phys, ppWritePackedMsg, end) &&
+          packarray(value->phy, sizeof(nfapi_pnf_phy_rel11_info_t), NFAPI_MAX_PNF_PHY, value->number_of_phys, ppWritePackedMsg, end, &pack_pnf_phy_rel11_info));
+}
+static uint8_t pack_pnf_phy_rel12_info(void *elem, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_pnf_phy_rel12_info_t *phy = (nfapi_pnf_phy_rel12_info_t *)elem;
+  return( push16(phy->phy_config_index, ppWritePackedMsg, end) &&
+          push16(phy->csi_subframe_set, ppWritePackedMsg, end) &&
+          push16(phy->enhanced_4tx_codebook, ppWritePackedMsg, end) &&
+          push16(phy->drs_supported, ppWritePackedMsg, end) &&
+          push16(phy->ul_64qam_supported, ppWritePackedMsg, end) &&
+          push16(phy->transmission_mode_10_supported, ppWritePackedMsg, end) &&
+          push16(phy->alternative_bts_indices, ppWritePackedMsg, end));
+}
+static uint8_t pack_pnf_phy_rel12_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_pnf_phy_rel12_t *value = (nfapi_pnf_phy_rel12_t *)tlv;
+  return (push16(value->number_of_phys, ppWritePackedMsg, end) &&
+          packarray(value->phy, sizeof(nfapi_pnf_phy_rel12_info_t), NFAPI_MAX_PNF_PHY, value->number_of_phys, ppWritePackedMsg, end, &pack_pnf_phy_rel12_info));
+}
+
+static uint8_t pack_pnf_phy_rel13_info(void *elem, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_pnf_phy_rel13_info_t *phy = (nfapi_pnf_phy_rel13_info_t *)elem;
+  return( push16(phy->phy_config_index, ppWritePackedMsg, end) &&
+          push16(phy->pucch_format4_supported, ppWritePackedMsg, end) &&
+          push16(phy->pucch_format5_supported, ppWritePackedMsg, end) &&
+          push16(phy->more_than_5_ca_support, ppWritePackedMsg, end) &&
+          push16(phy->laa_supported, ppWritePackedMsg, end) &&
+          push16(phy->laa_ending_in_dwpts_supported, ppWritePackedMsg, end) &&
+          push16(phy->laa_starting_in_second_slot_supported, ppWritePackedMsg, end) &&
+          push16(phy->beamforming_supported, ppWritePackedMsg, end) &&
+          push16(phy->csi_rs_enhancement_supported, ppWritePackedMsg, end) &&
+          push16(phy->drms_enhancement_supported, ppWritePackedMsg, end) &&
+          push16(phy->srs_enhancement_supported, ppWritePackedMsg, end) );
+}
+
+static uint8_t pack_pnf_phy_rel13_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_pnf_phy_rel13_t *value = (nfapi_pnf_phy_rel13_t *)tlv;
+  return (push16(value->number_of_phys, ppWritePackedMsg, end) &&
+          packarray(value->phy, sizeof(nfapi_pnf_phy_rel13_info_t), NFAPI_MAX_PNF_PHY, value->number_of_phys, ppWritePackedMsg, end, &pack_pnf_phy_rel13_info));
+}
+
+static uint8_t pack_pnf_phy_rel13_nb_iot_info(void *elem, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_pnf_phy_rel13_nb_iot_info_t *phy = (nfapi_pnf_phy_rel13_nb_iot_info_t *)elem;
+  return( push16(phy->phy_config_index, ppWritePackedMsg, end) &&
+          push16(phy->number_of_rfs, ppWritePackedMsg, end) &&
+          packarray(phy->rf_config, sizeof(nfapi_rf_config_info_t), NFAPI_MAX_PNF_PHY_RF_CONFIG, phy->number_of_rfs, ppWritePackedMsg, end, &pack_rf_config_info) &&
+          push16(phy->number_of_rf_exclusions, ppWritePackedMsg, end) &&
+          packarray(phy->excluded_rf_config, sizeof(nfapi_rf_config_info_t), NFAPI_MAX_PNF_PHY_RF_CONFIG, phy->number_of_rf_exclusions, ppWritePackedMsg, end, &pack_rf_config_info) &&
+          push8(phy->number_of_dl_layers_supported, ppWritePackedMsg, end) &&
+          push8(phy->number_of_ul_layers_supported, ppWritePackedMsg, end) &&
+          push16(phy->maximum_3gpp_release_supported, ppWritePackedMsg, end) &&
+          push8(phy->nmm_modes_supported, ppWritePackedMsg, end));
+}
+
+static uint8_t pack_pnf_phy_rel13_nb_iot_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_pnf_phy_rel13_nb_iot_t *value = (nfapi_pnf_phy_rel13_nb_iot_t *)tlv;
+  return (push16(value->number_of_phys, ppWritePackedMsg, end) &&
+          packarray(value->phy, sizeof(nfapi_pnf_phy_rel13_nb_iot_info_t), NFAPI_MAX_PNF_PHY, value->number_of_phys, ppWritePackedMsg, end, &pack_pnf_phy_rel13_nb_iot_info));
+}
+/*
+static uint8_t pack_nr_pnf_param_response(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p4_p5_codec_config_t* config)
+{
+  nfapi_nr_pnf_param_response_t *pNfapiMsg = (nfapi_nr_pnf_param_response_t*)msg;
+
+  return (push32(pNfapiMsg->error_code, ppWritePackedMsg, end) &&
+      pack_tlv(NFAPI_PNF_PARAM_GENERAL_TAG, &pNfapiMsg->pnf_param_general, ppWritePackedMsg, end, &pack_pnf_param_general_value) &&
+      pack_tlv(NFAPI_PNF_PHY_TAG, &pNfapiMsg->pnf_phy, ppWritePackedMsg, end, &pack_pnf_phy_value) &&
+      pack_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config));
+}
+*/
+static uint8_t pack_nr_pnf_param_response(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p4_p5_codec_config_t *config) {
+  nfapi_nr_pnf_param_response_t *pNfapiMsg = (nfapi_nr_pnf_param_response_t *)msg;
+  return (push32(pNfapiMsg->error_code, ppWritePackedMsg, end) &&
+          pack_tlv(NFAPI_PNF_PARAM_GENERAL_TAG, &pNfapiMsg->pnf_param_general, ppWritePackedMsg, end, &pack_pnf_param_general_value) &&
+          pack_tlv(NFAPI_PNF_PHY_TAG, &pNfapiMsg->pnf_phy, ppWritePackedMsg, end, &pack_pnf_phy_value) &&
+          pack_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config));
+}
+
+
+static uint8_t pack_pnf_param_response(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p4_p5_codec_config_t *config) {
+  nfapi_pnf_param_response_t *pNfapiMsg = (nfapi_pnf_param_response_t *)msg;
+  return (push32(pNfapiMsg->error_code, ppWritePackedMsg, end) &&
+          pack_tlv(NFAPI_PNF_PARAM_GENERAL_TAG, &pNfapiMsg->pnf_param_general, ppWritePackedMsg, end, &pack_pnf_param_general_value) &&
+          pack_tlv(NFAPI_PNF_PHY_TAG, &pNfapiMsg->pnf_phy, ppWritePackedMsg, end, &pack_pnf_phy_value) &&
+          pack_tlv(NFAPI_PNF_RF_TAG, &pNfapiMsg->pnf_rf, ppWritePackedMsg, end, &pack_pnf_rf_value) &&
+          pack_tlv(NFAPI_PNF_PHY_REL10_TAG, &pNfapiMsg->pnf_phy_rel10, ppWritePackedMsg, end, &pack_pnf_phy_rel10_value) &&
+          pack_tlv(NFAPI_PNF_PHY_REL11_TAG, &pNfapiMsg->pnf_phy_rel11, ppWritePackedMsg, end, &pack_pnf_phy_rel11_value) &&
+          pack_tlv(NFAPI_PNF_PHY_REL12_TAG, &pNfapiMsg->pnf_phy_rel12, ppWritePackedMsg, end, &pack_pnf_phy_rel12_value) &&
+          pack_tlv(NFAPI_PNF_PHY_REL13_TAG, &pNfapiMsg->pnf_phy_rel13, ppWritePackedMsg, end, &pack_pnf_phy_rel13_value) &&
+          pack_tlv(NFAPI_PNF_PHY_REL13_NB_IOT_TAG, &pNfapiMsg->pnf_phy_rel13_nb_iot, ppWritePackedMsg, end, &pack_pnf_phy_rel13_nb_iot_value) &&
+          pack_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config));
+}
+
+
+static uint8_t pack_phy_rf_config_info(void *elem, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_phy_rf_config_info_t *rf = (nfapi_phy_rf_config_info_t *)elem;
+  return (push16(rf->phy_id, ppWritePackedMsg, end) &&
+          push16(rf->phy_config_index, ppWritePackedMsg, end) &&
+          push16(rf->rf_config_index, ppWritePackedMsg, end));
+}
+
+
+static uint8_t pack_pnf_phy_rf_config_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_pnf_phy_rf_config_t *value = (nfapi_pnf_phy_rf_config_t *)tlv;
+  return(push16(value->number_phy_rf_config_info, ppWritePackedMsg, end) &&
+         packarray(value->phy_rf_config, sizeof(nfapi_phy_rf_config_info_t), NFAPI_MAX_PHY_RF_INSTANCES, value->number_phy_rf_config_info, ppWritePackedMsg, end, &pack_phy_rf_config_info));
+}
+
+static uint8_t pack_nr_pnf_config_request(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p4_p5_codec_config_t *config) {
+  nfapi_nr_pnf_config_request_t *pNfapiMsg = (nfapi_nr_pnf_config_request_t *)msg;
+  return (pack_tlv(NFAPI_PNF_PHY_RF_TAG, &pNfapiMsg->pnf_phy_rf_config, ppWritePackedMsg, end, &pack_pnf_phy_rf_config_value) &&
+          //push8(pNfapiMsg->num_tlvs,ppWritePackedMsg,end) &&
+          pack_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config));
+}
+
+static uint8_t pack_pnf_config_request(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p4_p5_codec_config_t *config) {
+  nfapi_pnf_config_request_t *pNfapiMsg = (nfapi_pnf_config_request_t *)msg;
+  return (pack_tlv(NFAPI_PNF_PHY_RF_TAG, &pNfapiMsg->pnf_phy_rf_config, ppWritePackedMsg, end, &pack_pnf_phy_rf_config_value) &&
+          push8(pNfapiMsg->num_tlvs,ppWritePackedMsg,end) &&
+          pack_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config));
+}
+
+
+static uint8_t pack_nr_pnf_config_response(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p4_p5_codec_config_t *config) {
+  nfapi_nr_pnf_config_response_t *pNfapiMsg = (nfapi_nr_pnf_config_response_t *)msg;
+  return ( push32(pNfapiMsg->error_code, ppWritePackedMsg, end) &&
+           pack_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config));
+}
+
+
+static uint8_t pack_pnf_config_response(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p4_p5_codec_config_t *config) {
+  nfapi_pnf_config_response_t *pNfapiMsg = (nfapi_pnf_config_response_t *)msg;
+  return ( push32(pNfapiMsg->error_code, ppWritePackedMsg, end) &&
+           pack_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config));
+}
+
+static uint8_t pack_nr_pnf_start_request(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p4_p5_codec_config_t *config) {
+  nfapi_nr_pnf_start_request_t *pNfapiMsg = (nfapi_nr_pnf_start_request_t *)msg;
+  return ( pack_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config));
+}
+
+static uint8_t pack_pnf_start_request(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p4_p5_codec_config_t *config) {
+  nfapi_pnf_start_request_t *pNfapiMsg = (nfapi_pnf_start_request_t *)msg;
+  return ( pack_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config));
+}
+
+
+static uint8_t pack_nr_pnf_start_response(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p4_p5_codec_config_t *config) {
+  nfapi_nr_pnf_start_response_t *pNfapiMsg = (nfapi_nr_pnf_start_response_t *)msg;
+  return( push32(pNfapiMsg->error_code, ppWritePackedMsg, end) &&
+          pack_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config));
+}
+
+
+static uint8_t pack_pnf_start_response(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p4_p5_codec_config_t *config) {
+  nfapi_pnf_start_response_t *pNfapiMsg = (nfapi_pnf_start_response_t *)msg;
+  return( push32(pNfapiMsg->error_code, ppWritePackedMsg, end) &&
+          pack_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config));
+}
+
+
+static uint8_t pack_nr_pnf_stop_request(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p4_p5_codec_config_t *config) {
+  nfapi_nr_pnf_stop_request_t *pNfapiMsg = (nfapi_nr_pnf_stop_request_t *)msg;
+  return ( pack_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config) );
+}
+
+
+
+static uint8_t pack_pnf_stop_request(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p4_p5_codec_config_t *config) {
+  nfapi_pnf_stop_request_t *pNfapiMsg = (nfapi_pnf_stop_request_t *)msg;
+  return ( pack_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config) );
+}
+
+
+static uint8_t pack_nr_pnf_stop_response(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p4_p5_codec_config_t *config) {
+  nfapi_nr_pnf_stop_response_t *pNfapiMsg = (nfapi_nr_pnf_stop_response_t *)msg;
+  return ( push32(pNfapiMsg->error_code, ppWritePackedMsg, end) &&
+           pack_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config));
+}
+
+
+static uint8_t pack_pnf_stop_response(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p4_p5_codec_config_t *config) {
+  nfapi_pnf_stop_response_t *pNfapiMsg = (nfapi_pnf_stop_response_t *)msg;
+  return ( push32(pNfapiMsg->error_code, ppWritePackedMsg, end) &&
+           pack_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config));
+}
+
+static uint8_t pack_nr_param_request(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p4_p5_codec_config_t *config) {
+  nfapi_nr_param_request_scf_t *pNfapiMsg = (nfapi_nr_param_request_scf_t *)msg;
+  return (pack_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config));
+}
+
+static uint8_t pack_param_request(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p4_p5_codec_config_t *config) {
+  nfapi_param_request_t *pNfapiMsg = (nfapi_param_request_t *)msg;
+  return (pack_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config));
+}
+
+static uint8_t pack_uint32_tlv_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_uint32_tlv_t *value = (nfapi_uint32_tlv_t *)tlv;
+  return push32(value->value, ppWritePackedMsg, end);
+}
+
+static uint8_t unpack_uint32_tlv_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_uint32_tlv_t *value = (nfapi_uint32_tlv_t *)tlv;
+  return pull32(ppReadPackedMsg, &value->value, end);
+}
+
+
+static uint8_t pack_uint16_tlv_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_uint16_tlv_t *value = (nfapi_uint16_tlv_t *)tlv;
+  return push16(value->value, ppWritePackedMsg, end);
+}
+
+static uint8_t unpack_uint16_tlv_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_uint16_tlv_t *value = (nfapi_uint16_tlv_t *)tlv;
+  return pull16(ppReadPackedMsg, &value->value, end);
+}
+
+static uint8_t pack_int16_tlv_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_int16_tlv_t *value = (nfapi_int16_tlv_t *)tlv;
+  return pushs16(value->value, ppWritePackedMsg, end);
+}
+
+static uint8_t unpack_int16_tlv_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_int16_tlv_t *value = (nfapi_int16_tlv_t *)tlv;
+  return pulls16(ppReadPackedMsg, &value->value, end);
+}
+
+static uint8_t pack_uint8_tlv_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_uint8_tlv_t *value = (nfapi_uint8_tlv_t *)tlv;
+  return push8(value->value, ppWritePackedMsg, end);
+}
+static uint8_t unpack_uint8_tlv_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_uint8_tlv_t *value = (nfapi_uint8_tlv_t *)tlv;
+  return pull8(ppReadPackedMsg, &value->value, end);
+}
+
+static uint8_t pack_ipv4_address_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_ipv4_address_t *value = (nfapi_ipv4_address_t *)tlv;
+  return pusharray8(value->address, NFAPI_IPV4_ADDRESS_LENGTH, NFAPI_IPV4_ADDRESS_LENGTH, ppWritePackedMsg, end);
+}
+static uint8_t unpack_ipv4_address_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_ipv4_address_t *value = (nfapi_ipv4_address_t *)tlv;
+  return pullarray8(ppReadPackedMsg, value->address, NFAPI_IPV4_ADDRESS_LENGTH, NFAPI_IPV4_ADDRESS_LENGTH, end);
+}
+static uint8_t pack_ipv6_address_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_ipv6_address_t *value = (nfapi_ipv6_address_t *)tlv;
+  return pusharray8(value->address, NFAPI_IPV6_ADDRESS_LENGTH, NFAPI_IPV6_ADDRESS_LENGTH, ppWritePackedMsg, end);
+}
+static uint8_t unpack_ipv6_address_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_ipv4_address_t *value = (nfapi_ipv4_address_t *)tlv;
+  return pullarray8(ppReadPackedMsg, value->address, NFAPI_IPV6_ADDRESS_LENGTH, NFAPI_IPV6_ADDRESS_LENGTH, end);
+}
+
+static uint8_t pack_rf_bands_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_rf_bands_t *value = (nfapi_rf_bands_t *)tlv;
+  return ( push16(value->number_rf_bands, ppWritePackedMsg, end) &&
+           pusharray16(value->rf_band, NFAPI_MAX_NUM_RF_BANDS, value->number_rf_bands, ppWritePackedMsg, end));
+}
+static uint8_t unpack_rf_bands_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_rf_bands_t *value = (nfapi_rf_bands_t *)tlv;
+  return ( pull16(ppReadPackedMsg, &value->number_rf_bands, end) &&
+           pullarray16(ppReadPackedMsg, value->rf_band, NFAPI_MAX_NUM_RF_BANDS, value->number_rf_bands, end));
+}
+
+static uint8_t pack_nmm_frequency_bands_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_nmm_frequency_bands_t *value = (nfapi_nmm_frequency_bands_t *)tlv;
+  return( push16(value->number_of_rf_bands, ppWritePackedMsg, end) &&
+          pusharray16(value->bands, NFAPI_MAX_NMM_FREQUENCY_BANDS, value->number_of_rf_bands, ppWritePackedMsg, end));
+}
+static uint8_t unpack_nmm_frequency_bands_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_nmm_frequency_bands_t *value = (nfapi_nmm_frequency_bands_t *)tlv;
+  return ( pull16(ppReadPackedMsg, &value->number_of_rf_bands, end) &&
+           pullarray16(ppReadPackedMsg, value->bands, NFAPI_MAX_NMM_FREQUENCY_BANDS, value->number_of_rf_bands, end));
+}
+static uint8_t pack_embms_mbsfn_config_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_embms_mbsfn_config_t *value = (nfapi_embms_mbsfn_config_t *)tlv;
+  return ( push16(value->num_mbsfn_config, ppWritePackedMsg, end) &&
+           pusharray16(value->radioframe_allocation_period, 8,value->num_mbsfn_config,ppWritePackedMsg, end) &&
+           pusharray16(value->radioframe_allocation_offset, 8,value->num_mbsfn_config,ppWritePackedMsg, end) &&
+           pusharray8(value->fourframes_flag, 8,value->num_mbsfn_config,ppWritePackedMsg, end) &&
+           pusharrays32(value->mbsfn_subframeconfig, 8, value->num_mbsfn_config, ppWritePackedMsg, end));
+}
+// static uint8_t unpack_embms_mbsfn_config_value(void* tlv, uint8_t **ppReadPackedMsg, uint8_t* end)
+// {
+//     nfapi_embms_mbsfn_config_t* value = (nfapi_embms_mbsfn_config_t*)tlv;
+
+//     return ( pull16(ppReadPackedMsg, &value->num_mbsfn_config, end) &&
+//              pull16(ppReadPackedMsg, &value->radioframe_allocation_period, end) &&
+//              pull16(ppReadPackedMsg, &value->radioframe_allocation_offset, end) &&
+//              pull8(ppReadPackedMsg, &value->fourframes_flag, end) &&
+//                      pullarrays32(ppReadPackedMsg, value->mbsfn_subframeconfig, 8, value->num_mbsfn_config, end));
+// }
+
+static uint8_t pack_param_response(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p4_p5_codec_config_t *config) {
+  nfapi_param_response_t *pNfapiMsg = (nfapi_param_response_t *)msg;
+  return( push8(pNfapiMsg->error_code, ppWritePackedMsg, end) &&
+          push8(pNfapiMsg->num_tlv, ppWritePackedMsg, end) &&
+          pack_tlv(NFAPI_L1_STATUS_PHY_STATE_TAG,  &pNfapiMsg->l1_status.phy_state, ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+          // Do we check the phy state and then just fill those sepecified, however
+          // we do not know the duplex mode, so just attempt to pack all and assumme
+          // that the callee has set the right tlvs
+          pack_tlv(NFAPI_PHY_CAPABILITIES_DL_BANDWIDTH_SUPPORT_TAG, &(pNfapiMsg->phy_capabilities.dl_bandwidth_support), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+          pack_tlv(NFAPI_PHY_CAPABILITIES_UL_BANDWIDTH_SUPPORT_TAG, &(pNfapiMsg->phy_capabilities.ul_bandwidth_support), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+          pack_tlv(NFAPI_PHY_CAPABILITIES_DL_MODULATION_SUPPORT_TAG, &(pNfapiMsg->phy_capabilities.dl_modulation_support), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+          pack_tlv(NFAPI_PHY_CAPABILITIES_UL_MODULATION_SUPPORT_TAG, &(pNfapiMsg->phy_capabilities.ul_modulation_support), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+          pack_tlv(NFAPI_PHY_CAPABILITIES_PHY_ANTENNA_CAPABILITY_TAG, &(pNfapiMsg->phy_capabilities.phy_antenna_capability), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+          pack_tlv(NFAPI_PHY_CAPABILITIES_RELEASE_CAPABILITY_TAG, &(pNfapiMsg->phy_capabilities.release_capability), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+          pack_tlv(NFAPI_PHY_CAPABILITIES_MBSFN_CAPABILITY_TAG, &(pNfapiMsg->phy_capabilities.mbsfn_capability), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+          // laa capability
+          pack_tlv(NFAPI_SUBFRAME_CONFIG_DUPLEX_MODE_TAG, &(pNfapiMsg->subframe_config.duplex_mode), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+          pack_tlv(NFAPI_SUBFRAME_CONFIG_PCFICH_POWER_OFFSET_TAG, &(pNfapiMsg->subframe_config.pcfich_power_offset), ppWritePackedMsg, end, &pack_uint16_tlv_value)&&
+          pack_tlv(NFAPI_SUBFRAME_CONFIG_PB_TAG, &(pNfapiMsg->subframe_config.pb), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+          pack_tlv(NFAPI_SUBFRAME_CONFIG_DL_CYCLIC_PREFIX_TYPE_TAG, &(pNfapiMsg->subframe_config.dl_cyclic_prefix_type), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+          pack_tlv(NFAPI_SUBFRAME_CONFIG_UL_CYCLIC_PREFIX_TYPE_TAG, &(pNfapiMsg->subframe_config.ul_cyclic_prefix_type), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+          pack_tlv(NFAPI_RF_CONFIG_DL_CHANNEL_BANDWIDTH_TAG, &(pNfapiMsg->rf_config.dl_channel_bandwidth), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+          pack_tlv(NFAPI_RF_CONFIG_UL_CHANNEL_BANDWIDTH_TAG, &(pNfapiMsg->rf_config.ul_channel_bandwidth), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+          pack_tlv(NFAPI_RF_CONFIG_REFERENCE_SIGNAL_POWER_TAG, &(pNfapiMsg->rf_config.reference_signal_power), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+          pack_tlv(NFAPI_RF_CONFIG_TX_ANTENNA_PORTS_TAG, &(pNfapiMsg->rf_config.tx_antenna_ports), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+          pack_tlv(NFAPI_RF_CONFIG_RX_ANTENNA_PORTS_TAG, &(pNfapiMsg->rf_config.rx_antenna_ports), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+          pack_tlv(NFAPI_PHICH_CONFIG_PHICH_RESOURCE_TAG, &(pNfapiMsg->phich_config.phich_resource), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+          pack_tlv(NFAPI_PHICH_CONFIG_PHICH_DURATION_TAG, &(pNfapiMsg->phich_config.phich_duration), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+          pack_tlv(NFAPI_PHICH_CONFIG_PHICH_POWER_OFFSET_TAG, &(pNfapiMsg->phich_config.phich_power_offset), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+          pack_tlv(NFAPI_SCH_CONFIG_PRIMARY_SYNCHRONIZATION_SIGNAL_EPRE_EPRERS_TAG, &(pNfapiMsg->sch_config.primary_synchronization_signal_epre_eprers), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+          pack_tlv(NFAPI_SCH_CONFIG_SECONDARY_SYNCHRONIZATION_SIGNAL_EPRE_EPRERS_TAG, &(pNfapiMsg->sch_config.secondary_synchronization_signal_epre_eprers), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+          pack_tlv(NFAPI_SCH_CONFIG_PHYSICAL_CELL_ID_TAG, &(pNfapiMsg->sch_config.physical_cell_id), ppWritePackedMsg, end,&pack_uint16_tlv_value) &&
+          pack_tlv(NFAPI_PRACH_CONFIG_CONFIGURATION_INDEX_TAG, &(pNfapiMsg->prach_config.configuration_index), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+          pack_tlv(NFAPI_PRACH_CONFIG_ROOT_SEQUENCE_INDEX_TAG, &(pNfapiMsg->prach_config.root_sequence_index), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+          pack_tlv(NFAPI_PRACH_CONFIG_ZERO_CORRELATION_ZONE_CONFIGURATION_TAG, &(pNfapiMsg->prach_config.zero_correlation_zone_configuration), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+          pack_tlv(NFAPI_PRACH_CONFIG_HIGH_SPEED_FLAG_TAG, &(pNfapiMsg->prach_config.high_speed_flag), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+          pack_tlv(NFAPI_PRACH_CONFIG_FREQUENCY_OFFSET_TAG, &(pNfapiMsg->prach_config.frequency_offset), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+          pack_tlv(NFAPI_PUSCH_CONFIG_HOPPING_MODE_TAG, &(pNfapiMsg->pusch_config.hopping_mode), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+          pack_tlv(NFAPI_PUSCH_CONFIG_HOPPING_OFFSET_TAG, &(pNfapiMsg->pusch_config.hopping_offset), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+          pack_tlv(NFAPI_PUSCH_CONFIG_NUMBER_OF_SUBBANDS_TAG, &(pNfapiMsg->pusch_config.number_of_subbands), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+          pack_tlv(NFAPI_PUCCH_CONFIG_DELTA_PUCCH_SHIFT_TAG, &(pNfapiMsg->pucch_config.delta_pucch_shift), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+          pack_tlv(NFAPI_PUCCH_CONFIG_N_CQI_RB_TAG, &(pNfapiMsg->pucch_config.n_cqi_rb), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+          pack_tlv(NFAPI_PUCCH_CONFIG_N_AN_CS_TAG, &(pNfapiMsg->pucch_config.n_an_cs), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+          pack_tlv(NFAPI_PUCCH_CONFIG_N1_PUCCH_AN_TAG, &(pNfapiMsg->pucch_config.n1_pucch_an), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+          pack_tlv(NFAPI_EMBMS_MBSFN_CONFIG_AREA_IDX_TAG, &(pNfapiMsg->embms_sib13_config.mbsfn_area_idx), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
+          pack_tlv(NFAPI_EMBMS_MBSFN_CONFIG_AREA_IDR9_TAG, &(pNfapiMsg->embms_sib13_config.mbsfn_area_id_r9), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+          pack_tlv(NFAPI_EMBMS_MBSFN_CONFIG_TAG, &(pNfapiMsg->embms_mbsfn_config), ppWritePackedMsg, end, &pack_embms_mbsfn_config_value) &&
+          pack_tlv(NFAPI_FEMBMS_CONFIG_RADIOFRAME_ALLOCATION_PERIOD_TAG, &(pNfapiMsg->fembms_config.radioframe_allocation_period), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
+          pack_tlv(NFAPI_FEMBMS_CONFIG_RADIOFRAME_ALLOCATION_OFFSET_TAG, &(pNfapiMsg->fembms_config.radioframe_allocation_offset), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
+          pack_tlv(NFAPI_FEMBMS_CONFIG_NON_MBSFN_FLAG_TAG, &(pNfapiMsg->fembms_config.non_mbsfn_config_flag), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
+          pack_tlv(NFAPI_FEMBMS_CONFIG_NON_MBSFN_SUBFRAMECONFIG_TAG, &(pNfapiMsg->fembms_config.non_mbsfn_subframeconfig), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+          pack_tlv(NFAPI_SRS_CONFIG_BANDWIDTH_CONFIGURATION_TAG, &(pNfapiMsg->srs_config.bandwidth_configuration), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+          pack_tlv(NFAPI_SRS_CONFIG_MAX_UP_PTS_TAG, &(pNfapiMsg->srs_config.max_up_pts), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+          pack_tlv(NFAPI_SRS_CONFIG_SRS_SUBFRAME_CONFIGURATION_TAG, &(pNfapiMsg->srs_config.srs_subframe_configuration), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+          pack_tlv(NFAPI_SRS_CONFIG_SRS_ACKNACK_SRS_SIMULTANEOUS_TRANSMISSION_TAG, &(pNfapiMsg->srs_config.srs_acknack_srs_simultaneous_transmission), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+          pack_tlv(NFAPI_UPLINK_REFERENCE_SIGNAL_CONFIG_UPLINK_RS_HOPPING_TAG, &(pNfapiMsg->uplink_reference_signal_config.uplink_rs_hopping), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+          pack_tlv(NFAPI_UPLINK_REFERENCE_SIGNAL_CONFIG_GROUP_ASSIGNMENT_TAG, &(pNfapiMsg->uplink_reference_signal_config.group_assignment), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+          pack_tlv(NFAPI_UPLINK_REFERENCE_SIGNAL_CONFIG_CYCLIC_SHIFT_1_FOR_DRMS_TAG, &(pNfapiMsg->uplink_reference_signal_config.cyclic_shift_1_for_drms), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+          pack_tlv(NFAPI_TDD_FRAME_STRUCTURE_SUBFRAME_ASSIGNMENT_TAG, &(pNfapiMsg->tdd_frame_structure_config.subframe_assignment), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+          pack_tlv(NFAPI_TDD_FRAME_STRUCTURE_SPECIAL_SUBFRAME_PATTERNS_TAG, &(pNfapiMsg->tdd_frame_structure_config.special_subframe_patterns), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+          pack_tlv(NFAPI_L23_CONFIG_DATA_REPORT_MODE_TAG, &(pNfapiMsg->l23_config.data_report_mode), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+          pack_tlv(NFAPI_L23_CONFIG_SFNSF_TAG, &(pNfapiMsg->l23_config.sfnsf), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+          pack_tlv(NFAPI_NFAPI_P7_VNF_ADDRESS_IPV4_TAG, &(pNfapiMsg->nfapi_config.p7_vnf_address_ipv4), ppWritePackedMsg, end, &pack_ipv4_address_value) &&
+          pack_tlv(NFAPI_NFAPI_P7_VNF_ADDRESS_IPV6_TAG, &(pNfapiMsg->nfapi_config.p7_vnf_address_ipv6), ppWritePackedMsg, end, &pack_ipv6_address_value) &&
+          pack_tlv(NFAPI_NFAPI_P7_VNF_PORT_TAG, &(pNfapiMsg->nfapi_config.p7_vnf_port), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+          pack_tlv(NFAPI_NFAPI_P7_PNF_ADDRESS_IPV4_TAG, &(pNfapiMsg->nfapi_config.p7_pnf_address_ipv4), ppWritePackedMsg, end, &pack_ipv4_address_value) &&
+          pack_tlv(NFAPI_NFAPI_P7_PNF_ADDRESS_IPV6_TAG, &(pNfapiMsg->nfapi_config.p7_pnf_address_ipv6), ppWritePackedMsg, end, &pack_ipv6_address_value) &&
+          pack_tlv(NFAPI_NFAPI_P7_PNF_PORT_TAG, &(pNfapiMsg->nfapi_config.p7_pnf_port), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+          pack_tlv(NFAPI_NFAPI_DOWNLINK_UES_PER_SUBFRAME_TAG, &(pNfapiMsg->nfapi_config.dl_ue_per_sf), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
+          pack_tlv(NFAPI_NFAPI_UPLINK_UES_PER_SUBFRAME_TAG, &(pNfapiMsg->nfapi_config.ul_ue_per_sf), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
+          pack_tlv(NFAPI_NFAPI_RF_BANDS_TAG, &(pNfapiMsg->nfapi_config.rf_bands), ppWritePackedMsg, end, &pack_rf_bands_value) &&
+          pack_tlv(NFAPI_NFAPI_TIMING_WINDOW_TAG, &(pNfapiMsg->nfapi_config.timing_window), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
+          pack_tlv(NFAPI_NFAPI_TIMING_INFO_MODE_TAG, &(pNfapiMsg->nfapi_config.timing_info_mode), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
+          pack_tlv(NFAPI_NFAPI_TIMING_INFO_PERIOD_TAG, &(pNfapiMsg->nfapi_config.timing_info_period), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
+          pack_tlv(NFAPI_NFAPI_MAXIMUM_TRANSMIT_POWER_TAG, &(pNfapiMsg->nfapi_config.max_transmit_power), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+          pack_tlv(NFAPI_NFAPI_EARFCN_TAG, &(pNfapiMsg->nfapi_config.earfcn), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+          pack_tlv(NFAPI_NFAPI_NMM_GSM_FREQUENCY_BANDS_TAG, &(pNfapiMsg->nfapi_config.nmm_gsm_frequency_bands), ppWritePackedMsg, end, &pack_nmm_frequency_bands_value) &&
+          pack_tlv(NFAPI_NFAPI_NMM_UMTS_FREQUENCY_BANDS_TAG, &(pNfapiMsg->nfapi_config.nmm_umts_frequency_bands), ppWritePackedMsg, end, &pack_nmm_frequency_bands_value) &&
+          pack_tlv(NFAPI_NFAPI_NMM_LTE_FREQUENCY_BANDS_TAG, &(pNfapiMsg->nfapi_config.nmm_lte_frequency_bands), ppWritePackedMsg, end, &pack_nmm_frequency_bands_value) &&
+          pack_tlv(NFAPI_NFAPI_NMM_UPLINK_RSSI_SUPPORTED_TAG, &(pNfapiMsg->nfapi_config.nmm_uplink_rssi_supported), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
+          pack_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config) );
+}
+
+static uint8_t pack_nr_param_response(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p4_p5_codec_config_t *config) {
+  printf("\nRUNNING pack_param_response\n");
+  nfapi_nr_param_response_scf_t *pNfapiMsg = (nfapi_nr_param_response_scf_t *)msg;
+  return (push8(pNfapiMsg->error_code, ppWritePackedMsg, end) &&
+          push8(pNfapiMsg->num_tlv, ppWritePackedMsg, end) &&
+          pack_tlv(NFAPI_NR_PARAM_TLV_RELEASE_CAPABILITY_TAG, &(pNfapiMsg->cell_param.release_capability), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+          pack_tlv(NFAPI_NR_PARAM_TLV_PHY_STATE_TAG, &(pNfapiMsg->cell_param.phy_state), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+          pack_tlv(NFAPI_NR_PARAM_TLV_SKIP_BLANK_DL_CONFIG_TAG, &(pNfapiMsg->cell_param.skip_blank_dl_config), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
+          pack_tlv(NFAPI_NR_PARAM_TLV_SKIP_BLANK_UL_CONFIG_TAG, &(pNfapiMsg->cell_param.skip_blank_ul_config), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
+          pack_tlv(NFAPI_NR_PARAM_TLV_NUM_CONFIG_TLVS_TO_REPORT_TAG, &(pNfapiMsg->cell_param.num_config_tlvs_to_report ), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+          pack_tlv(NFAPI_NR_PARAM_TLV_CYCLIC_PREFIX_TAG, &(pNfapiMsg->carrier_param.cyclic_prefix), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
+          pack_tlv(NFAPI_NR_PARAM_TLV_SUPPORTED_SUBCARRIER_SPACINGS_DL_TAG, &(pNfapiMsg->carrier_param.supported_subcarrier_spacings_dl), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+          pack_tlv(NFAPI_NR_PARAM_TLV_SUPPORTED_BANDWIDTH_DL_TAG, &(pNfapiMsg->carrier_param.supported_bandwidth_dl), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+          pack_tlv(NFAPI_NR_PARAM_TLV_SUPPORTED_SUBCARRIER_SPACINGS_UL_TAG, &(pNfapiMsg->carrier_param.supported_subcarrier_spacings_ul), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
+          pack_tlv(NFAPI_NR_PARAM_TLV_SUPPORTED_BANDWIDTH_UL_TAG, &(pNfapiMsg->carrier_param.supported_bandwidth_ul), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+          pack_tlv(NFAPI_NR_PARAM_TLV_CCE_MAPPING_TYPE_TAG, &(pNfapiMsg->pdcch_param.cce_mapping_type), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
+          pack_tlv(NFAPI_NR_PARAM_TLV_CORESET_OUTSIDE_FIRST_3_OFDM_SYMS_OF_SLOT_TAG, &(pNfapiMsg->pdcch_param.coreset_outside_first_3_of_ofdm_syms_of_slot), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
+          pack_tlv(NFAPI_NR_PARAM_TLV_PRECODER_GRANULARITY_CORESET_TAG, &(pNfapiMsg->pdcch_param.coreset_precoder_granularity_coreset), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
+          pack_tlv(NFAPI_NR_PARAM_TLV_PDCCH_MU_MIMO_TAG, &(pNfapiMsg->pdcch_param.pdcch_mu_mimo), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
+          pack_tlv(NFAPI_NR_PARAM_TLV_PDCCH_PRECODER_CYCLING_TAG, &(pNfapiMsg->pdcch_param.pdcch_precoder_cycling), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
+          pack_tlv(NFAPI_NR_PARAM_TLV_MAX_PDCCHS_PER_SLOT_TAG, &(pNfapiMsg->pdcch_param.max_pdcch_per_slot), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
+          pack_tlv(NFAPI_NR_PARAM_TLV_PUCCH_FORMATS_TAG, &(pNfapiMsg->pucch_param.pucch_formats), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
+          pack_tlv(NFAPI_NR_PARAM_TLV_MAX_PUCCHS_PER_SLOT_TAG, &(pNfapiMsg->pucch_param.max_pucchs_per_slot), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
+          pack_tlv(NFAPI_NR_PARAM_TLV_PDSCH_MAPPING_TYPE_TAG, &(pNfapiMsg->pdsch_param.pdsch_mapping_type), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
+          pack_tlv(NFAPI_NR_PARAM_TLV_PDSCH_ALLOCATION_TYPES_TAG, &(pNfapiMsg->pdsch_param.pdsch_allocation_types), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
+          pack_tlv(NFAPI_NR_PARAM_TLV_PDSCH_VRB_TO_PRB_MAPPING_TAG, &(pNfapiMsg->pdsch_param.pdsch_vrb_to_prb_mapping), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
+          pack_tlv(NFAPI_NR_PARAM_TLV_PDSCH_CBG_TAG, &(pNfapiMsg->pdsch_param.pdsch_cbg), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
+          pack_tlv(NFAPI_NR_PARAM_TLV_PDSCH_DMRS_CONFIG_TYPES_TAG, &(pNfapiMsg->pdsch_param.pdsch_dmrs_config_types), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
+          pack_tlv(NFAPI_NR_PARAM_TLV_PDSCH_DMRS_MAX_LENGTH_TAG, &(pNfapiMsg->pdsch_param.pdsch_dmrs_max_length), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
+          pack_tlv(NFAPI_NR_PARAM_TLV_PDSCH_DMRS_ADDITIONAL_POS_TAG, &(pNfapiMsg->pdsch_param.pdsch_dmrs_additional_pos), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
+          pack_tlv(NFAPI_NR_PARAM_TLV_MAX_PDSCH_S_YBS_PER_SLOT_TAG, &(pNfapiMsg->pdsch_param.max_pdsch_tbs_per_slot), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
+          pack_tlv(NFAPI_NR_PARAM_TLV_MAX_NUMBER_MIMO_LAYERS_PDSCH_TAG, &(pNfapiMsg->pdsch_param.max_number_mimo_layers_pdsch), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
+          pack_tlv(NFAPI_NR_PARAM_TLV_MAX_MU_MIMO_USERS_DL_TAG, &(pNfapiMsg->pdsch_param.max_mu_mimo_users_dl), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
+          pack_tlv(NFAPI_NR_PARAM_TLV_PDSCH_DATA_IN_DMRS_SYMBOLS_TAG, &(pNfapiMsg->pdsch_param.pdsch_data_in_dmrs_symbols), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
+          pack_tlv(NFAPI_NR_PARAM_TLV_PREMPTION_SUPPORT_TAG, &(pNfapiMsg->pdsch_param.premption_support), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
+          pack_tlv(NFAPI_NR_PARAM_TLV_PDSCH_NON_SLOT_SUPPORT_TAG, &(pNfapiMsg->pdsch_param.pdsch_non_slot_support), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
+          pack_tlv(NFAPI_NR_PARAM_TLV_UCI_MUX_ULSCH_IN_PUSCH_TAG, &(pNfapiMsg->pusch_param.uci_mux_ulsch_in_pusch), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
+          pack_tlv(NFAPI_NR_PARAM_TLV_UCI_ONLY_PUSCH_TAG, &(pNfapiMsg->pusch_param.uci_only_pusch), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
+          pack_tlv(NFAPI_NR_PARAM_TLV_PUSCH_FREQUENCY_HOPPING_TAG, &(pNfapiMsg->pusch_param.pusch_frequency_hopping), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
+          pack_tlv(NFAPI_NR_PARAM_TLV_PUSCH_DMRS_CONFIG_TYPES_TAG, &(pNfapiMsg->pusch_param.pusch_dmrs_config_types), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
+          pack_tlv(NFAPI_NR_PARAM_TLV_PUSCH_DMRS_MAX_LEN_TAG, &(pNfapiMsg->pusch_param.pusch_dmrs_max_len), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
+          pack_tlv(NFAPI_NR_PARAM_TLV_PUSCH_DMRS_ADDITIONAL_POS_TAG, &(pNfapiMsg->pusch_param.pusch_dmrs_additional_pos), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
+          pack_tlv(NFAPI_NR_PARAM_TLV_PUSCH_CBG_TAG, &(pNfapiMsg->pusch_param.pusch_cbg), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
+          pack_tlv(NFAPI_NR_PARAM_TLV_PUSCH_MAPPING_TYPE_TAG, &(pNfapiMsg->pusch_param.pusch_mapping_type), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
+          pack_tlv(NFAPI_NR_PARAM_TLV_PUSCH_ALLOCATION_TYPES_TAG, &(pNfapiMsg->pusch_param.pusch_allocation_types), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
+          pack_tlv(NFAPI_NR_PARAM_TLV_PUSCH_VRB_TO_PRB_MAPPING_TAG, &(pNfapiMsg->pusch_param.pusch_vrb_to_prb_mapping), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
+          pack_tlv(NFAPI_NR_PARAM_TLV_PUSCH_MAX_PTRS_PORTS_TAG, &(pNfapiMsg->pusch_param.pusch_max_ptrs_ports), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
+          pack_tlv(NFAPI_NR_PARAM_TLV_MAX_PDUSCHS_TBS_PER_SLOT_TAG, &(pNfapiMsg->pusch_param.max_pduschs_tbs_per_slot), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
+          pack_tlv(NFAPI_NR_PARAM_TLV_MAX_NUMBER_MIMO_LAYERS_NON_CB_PUSCH_TAG, &(pNfapiMsg->pusch_param.max_number_mimo_layers_non_cb_pusch), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
+          pack_tlv(NFAPI_NR_PARAM_TLV_SUPPORTED_MODULATION_ORDER_UL_TAG, &(pNfapiMsg->pusch_param.supported_modulation_order_ul), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
+          pack_tlv(NFAPI_NR_PARAM_TLV_MAX_MU_MIMO_USERS_UL_TAG, &(pNfapiMsg->pusch_param.max_mu_mimo_users_ul), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
+          pack_tlv(NFAPI_NR_PARAM_TLV_DFTS_OFDM_SUPPORT_TAG, &(pNfapiMsg->pusch_param.dfts_ofdm_support), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
+          pack_tlv(NFAPI_NR_PARAM_TLV_PUSCH_AGGREGATION_FACTOR_TAG, &(pNfapiMsg->pusch_param.pusch_aggregation_factor), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
+          pack_tlv(NFAPI_NR_PARAM_TLV_PRACH_LONG_FORMATS_TAG, &(pNfapiMsg->prach_param.prach_long_formats), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
+          pack_tlv(NFAPI_NR_PARAM_TLV_PRACH_SHORT_FORMATS_TAG, &(pNfapiMsg->prach_param.prach_short_formats), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
+          pack_tlv(NFAPI_NR_PARAM_TLV_PRACH_RESTRICTED_SETS_TAG, &(pNfapiMsg->prach_param.prach_restricted_sets), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
+          pack_tlv(NFAPI_NR_PARAM_TLV_MAX_PRACH_FD_OCCASIONS_IN_A_SLOT_TAG, &(pNfapiMsg->prach_param.max_prach_fd_occasions_in_a_slot), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
+          pack_tlv(NFAPI_NR_PARAM_TLV_RSSI_MEASUREMENT_SUPPORT_TAG, &(pNfapiMsg->measurement_param.rssi_measurement_support), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
+          // config:
+          pack_tlv(NFAPI_NR_NFAPI_P7_VNF_ADDRESS_IPV4_TAG, &(pNfapiMsg->nfapi_config.p7_vnf_address_ipv4), ppWritePackedMsg, end, &pack_ipv4_address_value) &&
+          pack_tlv(NFAPI_NR_NFAPI_P7_VNF_ADDRESS_IPV6_TAG, &(pNfapiMsg->nfapi_config.p7_vnf_address_ipv6), ppWritePackedMsg, end, &pack_ipv6_address_value) &&
+          pack_tlv(NFAPI_NR_NFAPI_P7_VNF_PORT_TAG, &(pNfapiMsg->nfapi_config.p7_vnf_port), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+          pack_tlv(NFAPI_NR_NFAPI_P7_PNF_ADDRESS_IPV4_TAG, &(pNfapiMsg->nfapi_config.p7_pnf_address_ipv4), ppWritePackedMsg, end, &pack_ipv4_address_value) &&
+          pack_tlv(NFAPI_NR_NFAPI_P7_PNF_ADDRESS_IPV6_TAG, &(pNfapiMsg->nfapi_config.p7_pnf_address_ipv6), ppWritePackedMsg, end, &pack_ipv6_address_value) &&
+          pack_tlv(NFAPI_NR_NFAPI_P7_PNF_PORT_TAG, &(pNfapiMsg->nfapi_config.p7_pnf_port), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+          pack_tlv(NFAPI_NR_NFAPI_TIMING_WINDOW_TAG, &(pNfapiMsg->nfapi_config.timing_window), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
+          pack_tlv(NFAPI_NR_NFAPI_TIMING_INFO_MODE_TAG, &(pNfapiMsg->nfapi_config.timing_info_mode), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
+          pack_tlv(NFAPI_NR_NFAPI_TIMING_INFO_PERIOD_TAG, &(pNfapiMsg->nfapi_config.timing_info_period), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
+          pack_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config));
+}
+
+static uint8_t pack_config_request(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p4_p5_codec_config_t *config) {
+  nfapi_config_request_t *pNfapiMsg = (nfapi_config_request_t *)msg;
+  return ( push8(pNfapiMsg->num_tlv, ppWritePackedMsg, end) &&
+           // Do we check the phy state and then just fill those sepecified, however
+           // we do not know the duplex mode, so just attempt to pack all and assumme
+           // that the callee has set the right tlvs
+           pack_tlv(NFAPI_SUBFRAME_CONFIG_DUPLEX_MODE_TAG, &(pNfapiMsg->subframe_config.duplex_mode), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+           pack_tlv(NFAPI_SUBFRAME_CONFIG_PCFICH_POWER_OFFSET_TAG, &(pNfapiMsg->subframe_config.pcfich_power_offset), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+           pack_tlv(NFAPI_SUBFRAME_CONFIG_PB_TAG, &(pNfapiMsg->subframe_config.pb), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+           pack_tlv(NFAPI_SUBFRAME_CONFIG_DL_CYCLIC_PREFIX_TYPE_TAG, &(pNfapiMsg->subframe_config.dl_cyclic_prefix_type), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+           pack_tlv(NFAPI_SUBFRAME_CONFIG_UL_CYCLIC_PREFIX_TYPE_TAG, &(pNfapiMsg->subframe_config.ul_cyclic_prefix_type), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+           pack_tlv(NFAPI_RF_CONFIG_DL_CHANNEL_BANDWIDTH_TAG, &(pNfapiMsg->rf_config.dl_channel_bandwidth), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+           pack_tlv(NFAPI_RF_CONFIG_UL_CHANNEL_BANDWIDTH_TAG, &(pNfapiMsg->rf_config.ul_channel_bandwidth), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+           pack_tlv(NFAPI_RF_CONFIG_REFERENCE_SIGNAL_POWER_TAG, &(pNfapiMsg->rf_config.reference_signal_power), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+           pack_tlv(NFAPI_RF_CONFIG_TX_ANTENNA_PORTS_TAG, &(pNfapiMsg->rf_config.tx_antenna_ports), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+           pack_tlv(NFAPI_RF_CONFIG_RX_ANTENNA_PORTS_TAG, &(pNfapiMsg->rf_config.rx_antenna_ports), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+           pack_tlv(NFAPI_PHICH_CONFIG_PHICH_RESOURCE_TAG, &(pNfapiMsg->phich_config.phich_resource), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+           pack_tlv(NFAPI_PHICH_CONFIG_PHICH_DURATION_TAG, &(pNfapiMsg->phich_config.phich_duration), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+           pack_tlv(NFAPI_PHICH_CONFIG_PHICH_POWER_OFFSET_TAG, &(pNfapiMsg->phich_config.phich_power_offset), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+           pack_tlv(NFAPI_SCH_CONFIG_PRIMARY_SYNCHRONIZATION_SIGNAL_EPRE_EPRERS_TAG, &(pNfapiMsg->sch_config.primary_synchronization_signal_epre_eprers), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+           pack_tlv(NFAPI_SCH_CONFIG_SECONDARY_SYNCHRONIZATION_SIGNAL_EPRE_EPRERS_TAG, &(pNfapiMsg->sch_config.secondary_synchronization_signal_epre_eprers), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+           pack_tlv(NFAPI_SCH_CONFIG_PHYSICAL_CELL_ID_TAG, &(pNfapiMsg->sch_config.physical_cell_id), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+           pack_tlv(NFAPI_PRACH_CONFIG_CONFIGURATION_INDEX_TAG, &(pNfapiMsg->prach_config.configuration_index), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+           pack_tlv(NFAPI_PRACH_CONFIG_ROOT_SEQUENCE_INDEX_TAG, &(pNfapiMsg->prach_config.root_sequence_index), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+           pack_tlv(NFAPI_PRACH_CONFIG_ZERO_CORRELATION_ZONE_CONFIGURATION_TAG, &(pNfapiMsg->prach_config.zero_correlation_zone_configuration), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+           pack_tlv(NFAPI_PRACH_CONFIG_HIGH_SPEED_FLAG_TAG, &(pNfapiMsg->prach_config.high_speed_flag), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+           pack_tlv(NFAPI_PRACH_CONFIG_FREQUENCY_OFFSET_TAG, &(pNfapiMsg->prach_config.frequency_offset), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+           pack_tlv(NFAPI_PUSCH_CONFIG_HOPPING_MODE_TAG, &(pNfapiMsg->pusch_config.hopping_mode), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+           pack_tlv(NFAPI_PUSCH_CONFIG_HOPPING_OFFSET_TAG, &(pNfapiMsg->pusch_config.hopping_offset), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+           pack_tlv(NFAPI_PUSCH_CONFIG_NUMBER_OF_SUBBANDS_TAG, &(pNfapiMsg->pusch_config.number_of_subbands), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+           pack_tlv(NFAPI_PUCCH_CONFIG_DELTA_PUCCH_SHIFT_TAG, &(pNfapiMsg->pucch_config.delta_pucch_shift), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+           pack_tlv(NFAPI_PUCCH_CONFIG_N_CQI_RB_TAG, &(pNfapiMsg->pucch_config.n_cqi_rb), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+           pack_tlv(NFAPI_PUCCH_CONFIG_N_AN_CS_TAG, &(pNfapiMsg->pucch_config.n_an_cs), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+           pack_tlv(NFAPI_PUCCH_CONFIG_N1_PUCCH_AN_TAG, &(pNfapiMsg->pucch_config.n1_pucch_an), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+           pack_tlv(NFAPI_SRS_CONFIG_BANDWIDTH_CONFIGURATION_TAG, &(pNfapiMsg->srs_config.bandwidth_configuration), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+           pack_tlv(NFAPI_SRS_CONFIG_MAX_UP_PTS_TAG, &(pNfapiMsg->srs_config.max_up_pts), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+           pack_tlv(NFAPI_SRS_CONFIG_SRS_SUBFRAME_CONFIGURATION_TAG, &(pNfapiMsg->srs_config.srs_subframe_configuration), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+           pack_tlv(NFAPI_SRS_CONFIG_SRS_ACKNACK_SRS_SIMULTANEOUS_TRANSMISSION_TAG, &(pNfapiMsg->srs_config.srs_acknack_srs_simultaneous_transmission), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+           pack_tlv(NFAPI_UPLINK_REFERENCE_SIGNAL_CONFIG_UPLINK_RS_HOPPING_TAG, &(pNfapiMsg->uplink_reference_signal_config.uplink_rs_hopping), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+           pack_tlv(NFAPI_UPLINK_REFERENCE_SIGNAL_CONFIG_GROUP_ASSIGNMENT_TAG, &(pNfapiMsg->uplink_reference_signal_config.group_assignment), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+           pack_tlv(NFAPI_UPLINK_REFERENCE_SIGNAL_CONFIG_CYCLIC_SHIFT_1_FOR_DRMS_TAG, &(pNfapiMsg->uplink_reference_signal_config.cyclic_shift_1_for_drms), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+           pack_tlv(NFAPI_LAA_CONFIG_ED_THRESHOLD_FOR_LBT_FOR_PDSCH_TAG, &(pNfapiMsg->laa_config.ed_threshold_lbt_pdsch), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+           pack_tlv(NFAPI_LAA_CONFIG_ED_THRESHOLD_FOR_LBT_FOR_DRS_TAG, &(pNfapiMsg->laa_config.ed_threshold_lbt_drs), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+           pack_tlv(NFAPI_LAA_CONFIG_PD_THRESHOLD_TAG, &(pNfapiMsg->laa_config.pd_threshold), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+           pack_tlv(NFAPI_LAA_CONFIG_MULTI_CARRIER_TYPE_TAG, &(pNfapiMsg->laa_config.multi_carrier_type), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+           pack_tlv(NFAPI_LAA_CONFIG_MULTI_CARRIER_TX_TAG, &(pNfapiMsg->laa_config.multi_carrier_tx), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+           pack_tlv(NFAPI_LAA_CONFIG_MULTI_CARRIER_FREEZE_TAG, &(pNfapiMsg->laa_config.multi_carrier_freeze), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+           pack_tlv(NFAPI_LAA_CONFIG_TX_ANTENNA_PORTS_FOR_DRS_TAG, &(pNfapiMsg->laa_config.tx_antenna_ports_drs), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+           pack_tlv(NFAPI_LAA_CONFIG_TRANSMISSION_POWER_FOR_DRS_TAG, &(pNfapiMsg->laa_config.tx_power_drs), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+           pack_tlv(NFAPI_EMTC_CONFIG_PBCH_REPETITIONS_ENABLE_R13_TAG, &(pNfapiMsg->emtc_config.pbch_repetitions_enable_r13), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+           pack_tlv(NFAPI_EMTC_CONFIG_PRACH_CATM_ROOT_SEQUENCE_INDEX_TAG, &(pNfapiMsg->emtc_config.prach_catm_root_sequence_index), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+           pack_tlv(NFAPI_EMTC_CONFIG_PRACH_CATM_ZERO_CORRELATION_ZONE_CONFIGURATION_TAG, &(pNfapiMsg->emtc_config.prach_catm_zero_correlation_zone_configuration), ppWritePackedMsg, end,
+                    &pack_uint16_tlv_value) &&
+           pack_tlv(NFAPI_EMTC_CONFIG_PRACH_CATM_HIGH_SPEED_FLAG, &(pNfapiMsg->emtc_config.prach_catm_high_speed_flag), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+           pack_tlv(NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_0_ENABLE_TAG, &(pNfapiMsg->emtc_config.prach_ce_level_0_enable), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+           pack_tlv(NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_0_CONFIGURATION_INDEX_TAG, &(pNfapiMsg->emtc_config.prach_ce_level_0_configuration_index), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+           pack_tlv(NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_0_FREQUENCY_OFFSET_TAG, &(pNfapiMsg->emtc_config.prach_ce_level_0_frequency_offset), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+           pack_tlv(NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_0_NUMBER_OF_REPETITIONS_PER_ATTEMPT_TAG, &(pNfapiMsg->emtc_config.prach_ce_level_0_number_of_repetitions_per_attempt), ppWritePackedMsg, end,
+                    &pack_uint16_tlv_value) &&
+           pack_tlv(NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_0_STARTING_SUBFRAME_PERIODICITY_TAG, &(pNfapiMsg->emtc_config.prach_ce_level_0_starting_subframe_periodicity), ppWritePackedMsg, end,
+                    &pack_uint16_tlv_value) &&
+           pack_tlv(NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_0_HOPPING_ENABLE_TAG, &(pNfapiMsg->emtc_config.prach_ce_level_0_hopping_enable), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+           pack_tlv(NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_0_HOPPING_OFFSET_TAG, &(pNfapiMsg->emtc_config.prach_ce_level_0_hopping_offset), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+           pack_tlv(NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_1_ENABLE_TAG, &(pNfapiMsg->emtc_config.prach_ce_level_1_enable), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+           pack_tlv(NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_1_CONFIGURATION_INDEX_TAG, &(pNfapiMsg->emtc_config.prach_ce_level_1_configuration_index), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+           pack_tlv(NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_1_FREQUENCY_OFFSET_TAG, &(pNfapiMsg->emtc_config.prach_ce_level_1_frequency_offset), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+           pack_tlv(NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_1_NUMBER_OF_REPETITIONS_PER_ATTEMPT_TAG, &(pNfapiMsg->emtc_config.prach_ce_level_1_number_of_repetitions_per_attempt), ppWritePackedMsg, end,
+                    &pack_uint16_tlv_value) &&
+           pack_tlv(NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_1_STARTING_SUBFRAME_PERIODICITY_TAG, &(pNfapiMsg->emtc_config.prach_ce_level_1_starting_subframe_periodicity), ppWritePackedMsg, end,
+                    &pack_uint16_tlv_value) &&
+           pack_tlv(NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_1_HOPPING_ENABLE_TAG, &(pNfapiMsg->emtc_config.prach_ce_level_1_hopping_enable), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+           pack_tlv(NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_1_HOPPING_OFFSET_TAG, &(pNfapiMsg->emtc_config.prach_ce_level_1_hopping_offset), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+           pack_tlv(NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_2_ENABLE_TAG, &(pNfapiMsg->emtc_config.prach_ce_level_2_enable), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+           pack_tlv(NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_2_CONFIGURATION_INDEX_TAG, &(pNfapiMsg->emtc_config.prach_ce_level_2_configuration_index), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+           pack_tlv(NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_2_FREQUENCY_OFFSET_TAG, &(pNfapiMsg->emtc_config.prach_ce_level_2_frequency_offset), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+           pack_tlv(NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_2_NUMBER_OF_REPETITIONS_PER_ATTEMPT_TAG, &(pNfapiMsg->emtc_config.prach_ce_level_2_number_of_repetitions_per_attempt), ppWritePackedMsg, end,
+                    &pack_uint16_tlv_value) &&
+           pack_tlv(NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_2_STARTING_SUBFRAME_PERIODICITY_TAG, &(pNfapiMsg->emtc_config.prach_ce_level_2_starting_subframe_periodicity), ppWritePackedMsg, end,
+                    &pack_uint16_tlv_value) &&
+           pack_tlv(NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_2_HOPPING_ENABLE_TAG, &(pNfapiMsg->emtc_config.prach_ce_level_2_hopping_enable), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+           pack_tlv(NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_2_HOPPING_OFFSET_TAG, &(pNfapiMsg->emtc_config.prach_ce_level_2_hopping_offset), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+           pack_tlv(NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_3_ENABLE_TAG, &(pNfapiMsg->emtc_config.prach_ce_level_3_enable), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+           pack_tlv(NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_3_CONFIGURATION_INDEX_TAG, &(pNfapiMsg->emtc_config.prach_ce_level_3_configuration_index), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+           pack_tlv(NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_3_FREQUENCY_OFFSET_TAG, &(pNfapiMsg->emtc_config.prach_ce_level_3_frequency_offset), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+           pack_tlv(NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_3_NUMBER_OF_REPETITIONS_PER_ATTEMPT_TAG, &(pNfapiMsg->emtc_config.prach_ce_level_3_number_of_repetitions_per_attempt), ppWritePackedMsg, end,
+                    &pack_uint16_tlv_value) &&
+           pack_tlv(NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_3_STARTING_SUBFRAME_PERIODICITY_TAG, &(pNfapiMsg->emtc_config.prach_ce_level_3_starting_subframe_periodicity), ppWritePackedMsg, end,
+                    &pack_uint16_tlv_value) &&
+           pack_tlv(NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_3_HOPPING_ENABLE_TAG, &(pNfapiMsg->emtc_config.prach_ce_level_3_hopping_enable), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+           pack_tlv(NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_3_HOPPING_OFFSET_TAG, &(pNfapiMsg->emtc_config.prach_ce_level_3_hopping_offset), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+           pack_tlv(NFAPI_EMTC_CONFIG_PUCCH_INTERVAL_ULHOPPINGCONFIGCOMMONMODEA_TAG, &(pNfapiMsg->emtc_config.pucch_interval_ulhoppingconfigcommonmodea), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+           pack_tlv(NFAPI_EMTC_CONFIG_PUCCH_INTERVAL_ULHOPPINGCONFIGCOMMONMODEB_TAG, &(pNfapiMsg->emtc_config.pucch_interval_ulhoppingconfigcommonmodeb), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+           pack_tlv(NFAPI_TDD_FRAME_STRUCTURE_SUBFRAME_ASSIGNMENT_TAG, &(pNfapiMsg->tdd_frame_structure_config.subframe_assignment), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+           pack_tlv(NFAPI_TDD_FRAME_STRUCTURE_SPECIAL_SUBFRAME_PATTERNS_TAG, &(pNfapiMsg->tdd_frame_structure_config.special_subframe_patterns), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+           pack_tlv(NFAPI_L23_CONFIG_DATA_REPORT_MODE_TAG, &(pNfapiMsg->l23_config.data_report_mode), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+           pack_tlv(NFAPI_L23_CONFIG_SFNSF_TAG, &(pNfapiMsg->l23_config.sfnsf), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+           pack_tlv(NFAPI_NFAPI_P7_VNF_ADDRESS_IPV4_TAG, &(pNfapiMsg->nfapi_config.p7_vnf_address_ipv4), ppWritePackedMsg, end, &pack_ipv4_address_value) &&
+           pack_tlv(NFAPI_NFAPI_P7_VNF_ADDRESS_IPV6_TAG, &(pNfapiMsg->nfapi_config.p7_vnf_address_ipv6), ppWritePackedMsg, end, &pack_ipv6_address_value) &&
+           pack_tlv(NFAPI_NFAPI_P7_VNF_PORT_TAG, &(pNfapiMsg->nfapi_config.p7_vnf_port), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+           pack_tlv(NFAPI_NFAPI_P7_PNF_ADDRESS_IPV4_TAG, &(pNfapiMsg->nfapi_config.p7_pnf_address_ipv4), ppWritePackedMsg, end, &pack_ipv4_address_value) &&
+           pack_tlv(NFAPI_NFAPI_P7_PNF_ADDRESS_IPV6_TAG, &(pNfapiMsg->nfapi_config.p7_pnf_address_ipv6), ppWritePackedMsg, end, &pack_ipv6_address_value) &&
+           pack_tlv(NFAPI_NFAPI_P7_PNF_PORT_TAG, &(pNfapiMsg->nfapi_config.p7_pnf_port), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+           pack_tlv(NFAPI_NFAPI_DOWNLINK_UES_PER_SUBFRAME_TAG, &(pNfapiMsg->nfapi_config.dl_ue_per_sf), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
+           pack_tlv(NFAPI_NFAPI_UPLINK_UES_PER_SUBFRAME_TAG, &(pNfapiMsg->nfapi_config.ul_ue_per_sf), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
+           pack_tlv(NFAPI_PHY_RF_BANDS_TAG, &(pNfapiMsg->nfapi_config.rf_bands), ppWritePackedMsg, end, &pack_rf_bands_value) &&
+           pack_tlv(NFAPI_NFAPI_TIMING_WINDOW_TAG, &(pNfapiMsg->nfapi_config.timing_window), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
+           pack_tlv(NFAPI_NFAPI_TIMING_INFO_MODE_TAG, &(pNfapiMsg->nfapi_config.timing_info_mode), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
+           pack_tlv(NFAPI_NFAPI_TIMING_INFO_PERIOD_TAG, &(pNfapiMsg->nfapi_config.timing_info_period), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
+           pack_tlv(NFAPI_NFAPI_MAXIMUM_TRANSMIT_POWER_TAG, &(pNfapiMsg->nfapi_config.max_transmit_power), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+           pack_tlv(NFAPI_NFAPI_EARFCN_TAG, &(pNfapiMsg->nfapi_config.earfcn), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+           pack_tlv(NFAPI_NFAPI_NMM_GSM_FREQUENCY_BANDS_TAG, &(pNfapiMsg->nfapi_config.nmm_gsm_frequency_bands), ppWritePackedMsg, end, &pack_nmm_frequency_bands_value) &&
+           pack_tlv(NFAPI_NFAPI_NMM_UMTS_FREQUENCY_BANDS_TAG, &(pNfapiMsg->nfapi_config.nmm_umts_frequency_bands), ppWritePackedMsg, end, &pack_nmm_frequency_bands_value) &&
+           pack_tlv(NFAPI_NFAPI_NMM_LTE_FREQUENCY_BANDS_TAG, &(pNfapiMsg->nfapi_config.nmm_lte_frequency_bands), ppWritePackedMsg, end, &pack_nmm_frequency_bands_value) &&
+           pack_tlv(NFAPI_NFAPI_NMM_UPLINK_RSSI_SUPPORTED_TAG, &(pNfapiMsg->nfapi_config.nmm_uplink_rssi_supported), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
+           pack_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config) );
+}
+
+
+static uint8_t pack_nr_config_request(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p4_p5_codec_config_t* config)
+{
+
+	nfapi_nr_config_request_scf_t *pNfapiMsg = (nfapi_nr_config_request_scf_t*)msg;
+
+	for(int i = 0; i<40; i++){ //packing tdd slot config
+		for(int symbol = 0; symbol<14;symbol++){
+			push8(pNfapiMsg->tdd_table.max_tdd_periodicity_list[i].max_num_of_symbol_per_slot_list[symbol].slot_config.value, ppWritePackedMsg,end);
+		}
+	}
+
+	return (push8(pNfapiMsg->num_tlv, ppWritePackedMsg, end) &&
+		    pack_tlv(NFAPI_NR_CONFIG_DL_BANDWIDTH_TAG, &(pNfapiMsg->carrier_config.dl_bandwidth), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+			pack_tlv(NFAPI_NR_CONFIG_DL_FREQUENCY_TAG, &(pNfapiMsg->carrier_config.dl_frequency), ppWritePackedMsg, end, &pack_uint32_tlv_value) &&
+			pack_tlv(NFAPI_NR_CONFIG_DL_GRID_SIZE_TAG, &(pNfapiMsg->carrier_config.dl_grid_size[1]), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+			pack_tlv(NFAPI_NR_CONFIG_DL_K0_TAG, &(pNfapiMsg->carrier_config.dl_k0[1]), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+			pack_tlv(NFAPI_NR_CONFIG_NUM_RX_ANT_TAG, &(pNfapiMsg->carrier_config.num_rx_ant), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+			pack_tlv(NFAPI_NR_CONFIG_NUM_TX_ANT_TAG, &(pNfapiMsg->carrier_config.num_tx_ant), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+			pack_tlv(NFAPI_NR_CONFIG_UL_GRID_SIZE_TAG, &(pNfapiMsg->carrier_config.ul_grid_size[1]), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+			pack_tlv(NFAPI_NR_CONFIG_UL_K0_TAG, &(pNfapiMsg->carrier_config.ul_k0[1]), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+			pack_tlv(NFAPI_NR_CONFIG_UPLINK_BANDWIDTH_TAG, &(pNfapiMsg->carrier_config.uplink_bandwidth), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+			pack_tlv(NFAPI_NR_CONFIG_UPLINK_FREQUENCY_TAG, &(pNfapiMsg->carrier_config.uplink_frequency), ppWritePackedMsg, end, &pack_uint32_tlv_value) &&
+
+			pack_tlv(NFAPI_NR_CONFIG_FRAME_DUPLEX_TYPE_TAG, &(pNfapiMsg->cell_config.frame_duplex_type), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
+			pack_tlv(NFAPI_NR_CONFIG_PHY_CELL_ID_TAG, &(pNfapiMsg->cell_config.phy_cell_id), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
+
+			pack_tlv(NFAPI_NR_CONFIG_NUM_PRACH_FD_OCCASIONS_TAG, &(pNfapiMsg->prach_config.num_prach_fd_occasions), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
+			pack_tlv(NFAPI_NR_CONFIG_PRACH_SEQUENCE_LENGTH_TAG, &(pNfapiMsg->prach_config.prach_sequence_length), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
+			pack_tlv(NFAPI_NR_CONFIG_RESTRICTED_SET_CONFIG_TAG, &(pNfapiMsg->prach_config.restricted_set_config), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
+			pack_tlv(NFAPI_NR_CONFIG_SSB_PER_RACH_TAG, &(pNfapiMsg->prach_config.ssb_per_rach), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
+            pack_tlv(NFAPI_NR_CONFIG_PRACH_SUB_C_SPACING_TAG, &(pNfapiMsg->prach_config.prach_sub_c_spacing), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
+            pack_tlv(NFAPI_NR_CONFIG_PRACH_ROOT_SEQUENCE_INDEX_TAG, &(pNfapiMsg->prach_config.num_prach_fd_occasions_list[0].prach_root_sequence_index), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+            pack_tlv(NFAPI_NR_CONFIG_K1_TAG, &(pNfapiMsg->prach_config.num_prach_fd_occasions_list[0].k1), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+            pack_tlv(NFAPI_NR_CONFIG_PRACH_ZERO_CORR_CONF_TAG, &(pNfapiMsg->prach_config.num_prach_fd_occasions_list[0].prach_zero_corr_conf), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
+			pack_tlv(NFAPI_NR_CONFIG_NUM_ROOT_SEQUENCES_TAG, &(pNfapiMsg->prach_config.num_prach_fd_occasions_list[0].num_root_sequences), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
+
+
+			pack_tlv(NFAPI_NR_CONFIG_SCS_COMMON_TAG, &(pNfapiMsg->ssb_config.scs_common), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
+			pack_tlv(NFAPI_NR_CONFIG_SS_PBCH_POWER_TAG, &(pNfapiMsg->ssb_config.ss_pbch_power), ppWritePackedMsg, end, &pack_uint32_tlv_value) &&
+
+			pack_tlv(NFAPI_NR_CONFIG_BETA_PSS_TAG, &(pNfapiMsg->ssb_table.beta_pss), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
+			pack_tlv(NFAPI_NR_CONFIG_MIB_TAG, &(pNfapiMsg->ssb_table.MIB), ppWritePackedMsg, end, &pack_uint32_tlv_value) &&
+			pack_tlv(NFAPI_NR_CONFIG_SSB_MASK_TAG, &(pNfapiMsg->ssb_table.ssb_mask_list[0].ssb_mask), ppWritePackedMsg, end, &pack_uint32_tlv_value) &&
+			pack_tlv(NFAPI_NR_CONFIG_SSB_MASK_TAG, &(pNfapiMsg->ssb_table.ssb_mask_list[1].ssb_mask), ppWritePackedMsg, end, &pack_uint32_tlv_value) &&
+
+			pack_tlv(NFAPI_NR_CONFIG_SSB_OFFSET_POINT_A_TAG, &(pNfapiMsg->ssb_table.ssb_offset_point_a), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+			pack_tlv(NFAPI_NR_CONFIG_SSB_PERIOD_TAG, &(pNfapiMsg->ssb_table.ssb_period), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
+			pack_tlv(NFAPI_NR_CONFIG_SSB_SUBCARRIER_OFFSET_TAG, &(pNfapiMsg->ssb_table.ssb_subcarrier_offset), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
+
+			pack_tlv(NFAPI_NR_CONFIG_TDD_PERIOD_TAG, &(pNfapiMsg->tdd_table.tdd_period), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
+			pack_tlv(NFAPI_NR_NFAPI_P7_PNF_ADDRESS_IPV4_TAG, &(pNfapiMsg->nfapi_config.p7_pnf_address_ipv4), ppWritePackedMsg, end, &pack_ipv4_address_value) &&
+			pack_tlv(NFAPI_NR_NFAPI_P7_PNF_ADDRESS_IPV6_TAG, &(pNfapiMsg->nfapi_config.p7_pnf_address_ipv6), ppWritePackedMsg, end, &pack_ipv6_address_value) &&
+			pack_tlv(NFAPI_NR_NFAPI_P7_PNF_PORT_TAG, &(pNfapiMsg->nfapi_config.p7_pnf_port), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+			pack_tlv(NFAPI_NR_NFAPI_P7_VNF_ADDRESS_IPV4_TAG, &(pNfapiMsg->nfapi_config.p7_vnf_address_ipv4), ppWritePackedMsg, end, &pack_ipv4_address_value) &&
+			pack_tlv(NFAPI_NR_NFAPI_P7_VNF_ADDRESS_IPV6_TAG, &(pNfapiMsg->nfapi_config.p7_vnf_address_ipv6), ppWritePackedMsg, end, &pack_ipv6_address_value) &&
+			pack_tlv(NFAPI_NR_NFAPI_P7_VNF_PORT_TAG, &(pNfapiMsg->nfapi_config.p7_vnf_port), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+			//pack_tlv(NFAPI_NR_NFAPI_RF_BANDS_TAG, &(pNfapiMsg->nfapi_config.rf_bands), ppWritePackedMsg, end, &pack_rf_bands_value) &&
+			pack_tlv(NFAPI_NR_NFAPI_TIMING_INFO_MODE_TAG, &(pNfapiMsg->nfapi_config.timing_info_mode), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
+			pack_tlv(NFAPI_NR_NFAPI_TIMING_INFO_PERIOD_TAG, &(pNfapiMsg->nfapi_config.timing_info_period), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
+			pack_tlv(NFAPI_NR_NFAPI_TIMING_WINDOW_TAG, &(pNfapiMsg->nfapi_config.timing_window), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
+			//pack_tlv(NFAPI_NR_NFAPI_UPLINK_UES_PER_SUBFRAME_TAG, &(pNfapiMsg->nfapi_config.ul_ue_per_sf), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
+
+			pack_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config) );
+}
+
+static uint8_t pack_nr_config_response(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p4_p5_codec_config_t *config) {
+  nfapi_nr_config_response_scf_t *pNfapiMsg = (nfapi_nr_config_response_scf_t *)msg;
+  return ( push8(pNfapiMsg->error_code, ppWritePackedMsg, end) &&
+           pack_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config) );
+}
+
+static uint8_t pack_config_response(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p4_p5_codec_config_t *config) {
+  nfapi_config_response_t *pNfapiMsg = (nfapi_config_response_t *)msg;
+  return ( push8(pNfapiMsg->error_code, ppWritePackedMsg, end) &&
+           pack_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config) );
+}
+
+static uint8_t pack_nr_start_request(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p4_p5_codec_config_t *config) {
+  nfapi_nr_start_request_scf_t *pNfapiMsg = (nfapi_nr_start_request_scf_t *)msg;
+  return pack_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config);
+}
+
+static uint8_t pack_start_request(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p4_p5_codec_config_t *config) {
+  nfapi_start_request_t *pNfapiMsg = (nfapi_start_request_t *)msg;
+  return pack_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config);
+}
+
+static uint8_t pack_nr_start_response(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p4_p5_codec_config_t *config) {
+  nfapi_nr_start_response_scf_t *pNfapiMsg = (nfapi_nr_start_response_scf_t *)msg;
+  return ( push32(pNfapiMsg->error_code, ppWritePackedMsg, end ) &&
+           pack_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config) );
+}
+
+static uint8_t pack_start_response(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p4_p5_codec_config_t *config) {
+  nfapi_start_response_t *pNfapiMsg = (nfapi_start_response_t *)msg;
+  return ( push32(pNfapiMsg->error_code, ppWritePackedMsg, end ) &&
+           pack_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config) );
+}
+
+
+static uint8_t pack_stop_request(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p4_p5_codec_config_t *config) {
+  nfapi_stop_request_t *pNfapiMsg = (nfapi_stop_request_t *)msg;
+  return pack_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config);
+}
+
+static uint8_t pack_stop_response(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p4_p5_codec_config_t *config) {
+  nfapi_stop_response_t *pNfapiMsg = (nfapi_stop_response_t *)msg;
+  return ( push32(pNfapiMsg->error_code, ppWritePackedMsg, end) &&
+           pack_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config) );
+}
+
+static uint8_t pack_measurement_request(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p4_p5_codec_config_t *config) {
+  nfapi_measurement_request_t *pNfapiMsg = (nfapi_measurement_request_t *)msg;
+  return( pack_tlv(NFAPI_MEASUREMENT_REQUEST_DL_RS_XTX_POWER_TAG, &(pNfapiMsg->dl_rs_tx_power), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+          pack_tlv(NFAPI_MEASUREMENT_REQUEST_RECEIVED_INTERFERENCE_POWER_TAG, &(pNfapiMsg->received_interference_power), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+          pack_tlv(NFAPI_MEASUREMENT_REQUEST_THERMAL_NOISE_POWER_TAG, &(pNfapiMsg->thermal_noise_power), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+          pack_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config));
+}
+
+static uint8_t pack_recevied_interference_power_measurement_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_received_interference_power_measurement_t *value = (nfapi_received_interference_power_measurement_t *)tlv;
+  return  ( push16(value->number_of_resource_blocks, ppWritePackedMsg, end) &&
+            pusharrays16(value->received_interference_power, NFAPI_MAX_RECEIVED_INTERFERENCE_POWER_RESULTS, value->number_of_resource_blocks, ppWritePackedMsg, end));
+}
+
+static uint8_t pack_measurement_response(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p4_p5_codec_config_t *config) {
+  nfapi_measurement_response_t *pNfapiMsg = (nfapi_measurement_response_t *)msg;
+  return( push32(pNfapiMsg->error_code, ppWritePackedMsg, end) &&
+          pack_tlv(NFAPI_MEASUREMENT_RESPONSE_DL_RS_POWER_MEASUREMENT_TAG, &(pNfapiMsg->dl_rs_tx_power_measurement), ppWritePackedMsg, end, &pack_int16_tlv_value) &&
+          pack_tlv(NFAPI_MEASUREMENT_RESPONSE_RECEIVED_INTERFERENCE_POWER_MEASUREMENT_TAG, &(pNfapiMsg->received_interference_power_measurement), ppWritePackedMsg, end,
+                   &pack_recevied_interference_power_measurement_value) &&
+          pack_tlv(NFAPI_MEASUREMENT_RESPONSE_THERMAL_NOISE_MEASUREMENT_TAG, &(pNfapiMsg->thermal_noise_power_measurement), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+          pack_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config));
+}
+
+static uint8_t pack_nr_p5_message_body(nfapi_p4_p5_message_header_t *header, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p4_p5_codec_config_t *config) {
+  uint8_t result = 0;
+
+  // look for the specific message
+  switch (header->message_id) {
+    case NFAPI_NR_PHY_MSG_TYPE_PNF_PARAM_REQUEST:
+      result = pack_nr_pnf_param_request(header, ppWritePackedMsg, end, config);
+      break;
+
+    case NFAPI_PNF_PARAM_RESPONSE:
+      result = pack_nr_pnf_param_response(header, ppWritePackedMsg, end, config);
+      break;
+
+    case NFAPI_NR_PHY_MSG_TYPE_PNF_CONFIG_REQUEST:
+      result = pack_nr_pnf_config_request(header, ppWritePackedMsg, end, config);
+      break;
+
+    case NFAPI_NR_PHY_MSG_TYPE_PNF_CONFIG_RESPONSE:
+      result = pack_nr_pnf_config_response(header, ppWritePackedMsg, end, config);
+      break;
+
+    case NFAPI_NR_PHY_MSG_TYPE_PNF_START_REQUEST:
+      result = pack_nr_pnf_start_request(header, ppWritePackedMsg, end, config);
+      break;
+
+    case NFAPI_NR_PHY_MSG_TYPE_PNF_START_RESPONSE:
+      result = pack_nr_pnf_start_response(header, ppWritePackedMsg, end, config);
+      break;
+
+    case NFAPI_NR_PHY_MSG_TYPE_PNF_STOP_REQUEST:
+      result = pack_nr_pnf_stop_request(header, ppWritePackedMsg, end, config);
+      break;
+
+    case NFAPI_PNF_STOP_RESPONSE:
+      result = pack_nr_pnf_stop_response(header, ppWritePackedMsg, end, config);
+      break;
+
+    case NFAPI_NR_PHY_MSG_TYPE_PARAM_REQUEST:
+      result = pack_nr_param_request(header, ppWritePackedMsg, end, config);
+      break;
+
+    case NFAPI_NR_PHY_MSG_TYPE_PARAM_RESPONSE:
+      result = pack_nr_param_response(header, ppWritePackedMsg, end, config);
+      break;
+
+    case NFAPI_NR_PHY_MSG_TYPE_CONFIG_REQUEST:
+      result = pack_nr_config_request(header, ppWritePackedMsg, end, config);
+      break;
+
+    case NFAPI_NR_PHY_MSG_TYPE_CONFIG_RESPONSE:
+      result = pack_nr_config_response(header, ppWritePackedMsg, end, config);
+      break;
+
+    case NFAPI_NR_PHY_MSG_TYPE_START_REQUEST:
+      result = pack_nr_start_request(header, ppWritePackedMsg, end, config);
+      break;
+
+    case NFAPI_NR_PHY_MSG_TYPE_START_RESPONSE:
+      result = pack_nr_start_response(header, ppWritePackedMsg, end, config);
+      break;
+
+    case NFAPI_NR_PHY_MSG_TYPE_STOP_REQUEST:
+      result = pack_stop_request(header, ppWritePackedMsg, end, config);
+      break;
+
+    case NFAPI_NR_PHY_MSG_TYPE_STOP_RESPONSE:
+      result = pack_stop_response(header, ppWritePackedMsg, end, config);
+      break;
+
+    default: {
+      if(header->message_id >= NFAPI_VENDOR_EXT_MSG_MIN &&
+          header->message_id <= NFAPI_VENDOR_EXT_MSG_MAX) {
+        if(config && config->pack_p4_p5_vendor_extension) {
+          result = (config->pack_p4_p5_vendor_extension)(header, ppWritePackedMsg, end, config);
+        } else {
+          NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s VE NFAPI message ID %d. No ve ecoder provided\n", __FUNCTION__, header->message_id);
+        }
+      } else {
+        NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s NFAPI Unknown message ID %d\n", __FUNCTION__, header->message_id);
+      }
+    }
+    break;
+  }
+
+  return result;
+}
+
+
+static uint8_t pack_p5_message_body(nfapi_p4_p5_message_header_t *header, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p4_p5_codec_config_t *config) {
+  uint8_t result = 0;
+
+  // look for the specific message
+  switch (header->message_id) {
+    case NFAPI_PNF_PARAM_REQUEST:
+      result = pack_pnf_param_request(header, ppWritePackedMsg, end, config);
+      break;
+
+    case NFAPI_PNF_PARAM_RESPONSE:
+      result = pack_pnf_param_response(header, ppWritePackedMsg, end, config);
+      break;
+
+    case NFAPI_PNF_CONFIG_REQUEST:
+      result = pack_pnf_config_request(header, ppWritePackedMsg, end, config);
+      break;
+
+    case NFAPI_PNF_CONFIG_RESPONSE:
+      result = pack_pnf_config_response(header, ppWritePackedMsg, end, config);
+      break;
+
+    case NFAPI_PNF_START_REQUEST:
+      result = pack_pnf_start_request(header, ppWritePackedMsg, end, config);
+      break;
+
+    case NFAPI_PNF_START_RESPONSE:
+      result = pack_pnf_start_response(header, ppWritePackedMsg, end, config);
+      break;
+
+    case NFAPI_PNF_STOP_REQUEST:
+      result = pack_pnf_stop_request(header, ppWritePackedMsg, end, config);
+      break;
+
+    case NFAPI_PNF_STOP_RESPONSE:
+      result = pack_pnf_stop_response(header, ppWritePackedMsg, end, config);
+      break;
+
+    case NFAPI_PARAM_REQUEST:
+      result = pack_param_request(header, ppWritePackedMsg, end, config);
+      break;
+
+    case NFAPI_PARAM_RESPONSE:
+      result = pack_param_response(header, ppWritePackedMsg, end, config);
+      break;
+
+    case NFAPI_CONFIG_REQUEST:
+      result = pack_config_request(header, ppWritePackedMsg, end, config);
+      break;
+
+    case NFAPI_CONFIG_RESPONSE:
+      result = pack_config_response(header, ppWritePackedMsg, end, config);
+      break;
+
+    case NFAPI_START_REQUEST:
+      result = pack_start_request(header, ppWritePackedMsg, end, config);
+      break;
+
+    case NFAPI_START_RESPONSE:
+      result = pack_start_response(header, ppWritePackedMsg, end, config);
+      break;
+
+    case NFAPI_STOP_REQUEST:
+      result = pack_stop_request(header, ppWritePackedMsg, end, config);
+      break;
+
+    case NFAPI_STOP_RESPONSE:
+      result = pack_stop_response(header, ppWritePackedMsg, end, config);
+      break;
+
+    case NFAPI_MEASUREMENT_REQUEST:
+      result = pack_measurement_request(header, ppWritePackedMsg, end, config);
+      break;
+
+    case NFAPI_MEASUREMENT_RESPONSE:
+      result = pack_measurement_response(header, ppWritePackedMsg, end, config);
+      break;
+
+    default: {
+      if(header->message_id >= NFAPI_VENDOR_EXT_MSG_MIN &&
+          header->message_id <= NFAPI_VENDOR_EXT_MSG_MAX) {
+        if(config && config->pack_p4_p5_vendor_extension) {
+          result = (config->pack_p4_p5_vendor_extension)(header, ppWritePackedMsg, end, config);
+        } else {
+          NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s VE NFAPI message ID %d. No ve ecoder provided\n", __FUNCTION__, header->message_id);
+        }
+      } else {
+        NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s NFAPI Unknown message ID %d\n", __FUNCTION__, header->message_id);
+      }
+    }
+    break;
+  }
+
+  return result;
+}
+
+
+// helper function for message length calculation -
+// takes the pointers to the start of message to end of message
+
+static uint32_t get_packed_msg_len(uintptr_t msgHead, uintptr_t msgEnd) {
+  if (msgEnd < msgHead) {
+    NFAPI_TRACE(NFAPI_TRACE_ERROR, "get_packed_msg_len: Error in pointers supplied %d, %d\n", msgHead, msgEnd);
+    return 0;
+  }
+
+  return (msgEnd - msgHead);
+}
+
+// Main pack function - public
+int nfapi_nr_p5_message_pack(void *pMessageBuf, uint32_t messageBufLen, void *pPackedBuf, uint32_t packedBufLen, nfapi_p4_p5_codec_config_t *config) {
+  nfapi_p4_p5_message_header_t *pMessageHeader = pMessageBuf;
+  uint8_t *pWritePackedMessage = pPackedBuf;
+  uint8_t *pPackMessageEnd = pPackedBuf + packedBufLen;
+  uint8_t *pPackedLengthField = &pWritePackedMessage[4];
+  uint32_t packedMsgLen;
+  uint16_t packedMsgLen16;
+
+  if (pMessageBuf == NULL || pPackedBuf == NULL) {
+    NFAPI_TRACE(NFAPI_TRACE_ERROR, "P5 Pack supplied pointers are null\n");
+    return -1;
+  }
+
+  // pack the message
+  if(push16(pMessageHeader->phy_id, &pWritePackedMessage, pPackMessageEnd) &&
+      push16(pMessageHeader->message_id, &pWritePackedMessage, pPackMessageEnd) &&
+      push16(0, &pWritePackedMessage, pPackMessageEnd) &&
+      push16(pMessageHeader->spare, &pWritePackedMessage, pPackMessageEnd) &&
+      pack_nr_p5_message_body(pMessageHeader, &pWritePackedMessage, pPackMessageEnd, config)) {
+    // check for a valid message length
+    packedMsgLen = get_packed_msg_len((uintptr_t)pPackedBuf, (uintptr_t)pWritePackedMessage);
+
+    if (packedMsgLen > 0xFFFF || packedMsgLen > packedBufLen) {
+      NFAPI_TRACE(NFAPI_TRACE_ERROR, "Packed message length error %d, buffer supplied %d\n", packedMsgLen, packedBufLen);
+      return -1;
+    } else {
+      packedMsgLen16 = (uint16_t)packedMsgLen;
+    }
+
+    // Update the message length in the header
+    if(!push16(packedMsgLen16, &pPackedLengthField, pPackMessageEnd))
+      return -1;
+
+    // return the packed length
+    return (packedMsgLen);
+  } else {
+    // Failed to pack the meassage
+    NFAPI_TRACE(NFAPI_TRACE_ERROR, "P5 Failed to pack message\n");
+    return -1;
+  }
+}
+
+int nfapi_p5_message_pack(void *pMessageBuf, uint32_t messageBufLen, void *pPackedBuf, uint32_t packedBufLen, nfapi_p4_p5_codec_config_t *config) {
+  nfapi_p4_p5_message_header_t *pMessageHeader = pMessageBuf;
+  uint8_t *pWritePackedMessage = pPackedBuf;
+  uint8_t *pPackMessageEnd = pPackedBuf + packedBufLen;
+  uint8_t *pPackedLengthField = &pWritePackedMessage[4];
+  uint32_t packedMsgLen;
+  uint16_t packedMsgLen16;
+
+  if (pMessageBuf == NULL || pPackedBuf == NULL) {
+    NFAPI_TRACE(NFAPI_TRACE_ERROR, "P5 Pack supplied pointers are null\n");
+    return -1;
+  }
+
+  // pack the message
+  if(push16(pMessageHeader->phy_id, &pWritePackedMessage, pPackMessageEnd) &&
+      push16(pMessageHeader->message_id, &pWritePackedMessage, pPackMessageEnd) &&
+      push16(0/*pMessageHeader->message_length*/, &pWritePackedMessage, pPackMessageEnd) &&
+      push16(pMessageHeader->spare, &pWritePackedMessage, pPackMessageEnd) &&
+      pack_p5_message_body(pMessageHeader, &pWritePackedMessage, pPackMessageEnd, config)) {
+    // check for a valid message length
+    packedMsgLen = get_packed_msg_len((uintptr_t)pPackedBuf, (uintptr_t)pWritePackedMessage);
+
+    if (packedMsgLen > 0xFFFF || packedMsgLen > packedBufLen) {
+      NFAPI_TRACE(NFAPI_TRACE_ERROR, "Packed message length error %d, buffer supplied %d\n", packedMsgLen, packedBufLen);
+      return -1;
+    } else {
+      packedMsgLen16 = (uint16_t)packedMsgLen;
+    }
+
+    // Update the message length in the header
+    if(!push16(packedMsgLen16, &pPackedLengthField, pPackMessageEnd))
+      return -1;
+
+    // return the packed length
+    return (packedMsgLen);
+  } else {
+    // Failed to pack the meassage
+    NFAPI_TRACE(NFAPI_TRACE_ERROR, "P5 Failed to pack message\n");
+    return -1;
+  }
+}
+
+
+
+// Unpack routines
+
+
+static uint8_t  unpack_nr_pnf_param_request(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p4_p5_codec_config_t *config) {
+  nfapi_nr_pnf_param_request_t *pNfapiMsg = (nfapi_nr_pnf_param_request_t *)msg;
+  return unpack_tlv_list(NULL, 0, ppReadPackedMsg, end, config, &(pNfapiMsg->vendor_extension));
+}
+
+
+static uint8_t  unpack_pnf_param_request(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p4_p5_codec_config_t *config) {
+  nfapi_pnf_param_request_t *pNfapiMsg = (nfapi_pnf_param_request_t *)msg;
+  return unpack_tlv_list(NULL, 0, ppReadPackedMsg, end, config, &(pNfapiMsg->vendor_extension));
+}
+
+static uint8_t unpack_pnf_param_general_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_pnf_param_general_t *value = (nfapi_pnf_param_general_t *)tlv;
+  return( pull8(ppReadPackedMsg, &value->nfapi_sync_mode, end) &&
+          pull8(ppReadPackedMsg, &value->location_mode, end) &&
+          pull16(ppReadPackedMsg, &value->location_coordinates_length, end) &&
+          pullarray8(ppReadPackedMsg, value->location_coordinates, NFAPI_PNF_PARAM_GENERAL_LOCATION_LENGTH, value->location_coordinates_length, end) &&
+          pull32(ppReadPackedMsg, &value->dl_config_timing, end) &&
+          pull32(ppReadPackedMsg, &value->tx_timing, end) &&
+          pull32(ppReadPackedMsg, &value->ul_config_timing, end) &&
+          pull32(ppReadPackedMsg, &value->hi_dci0_timing, end) &&
+          pull16(ppReadPackedMsg, &value->maximum_number_phys, end) &&
+          pull16(ppReadPackedMsg, &value->maximum_total_bandwidth, end) &&
+          pull8(ppReadPackedMsg, &value->maximum_total_number_dl_layers, end) &&
+          pull8(ppReadPackedMsg, &value->maximum_total_number_ul_layers, end) &&
+          pull8(ppReadPackedMsg, &value->shared_bands, end) &&
+          pull8(ppReadPackedMsg, &value->shared_pa, end) &&
+          pulls16(ppReadPackedMsg, &value->maximum_total_power, end) &&
+          pullarray8(ppReadPackedMsg, value->oui, NFAPI_PNF_PARAM_GENERAL_OUI_LENGTH, NFAPI_PNF_PARAM_GENERAL_OUI_LENGTH, end));
+}
+
+static uint8_t unpack_rf_config_info(void *elem, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_rf_config_info_t *info = (nfapi_rf_config_info_t *)elem;
+  return pull16(ppReadPackedMsg, &info->rf_config_index, end);
+}
+
+static uint8_t unpack_pnf_phy_info(void *elem, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_pnf_phy_info_t *phy = (nfapi_pnf_phy_info_t *)elem;
+  return ( pull16(ppReadPackedMsg, &phy->phy_config_index, end) &&
+           pull16(ppReadPackedMsg, &phy->number_of_rfs, end) &&
+           unpackarray(ppReadPackedMsg, phy->rf_config, sizeof(nfapi_rf_config_info_t), NFAPI_MAX_PNF_PHY_RF_CONFIG, phy->number_of_rfs, end, &unpack_rf_config_info) &&
+           pull16(ppReadPackedMsg, &phy->number_of_rf_exclusions, end) &&
+           unpackarray(ppReadPackedMsg, phy->excluded_rf_config, sizeof(nfapi_rf_config_info_t), NFAPI_MAX_PNF_PHY_RF_CONFIG, phy->number_of_rf_exclusions, end, &unpack_rf_config_info) &&
+           pull16(ppReadPackedMsg, &phy->downlink_channel_bandwidth_supported, end) &&
+           pull16(ppReadPackedMsg, &phy->uplink_channel_bandwidth_supported, end) &&
+           pull8(ppReadPackedMsg, &phy->number_of_dl_layers_supported, end) &&
+           pull8(ppReadPackedMsg, &phy->number_of_ul_layers_supported, end) &&
+           pull16(ppReadPackedMsg, &phy->maximum_3gpp_release_supported, end) &&
+           pull8(ppReadPackedMsg, &phy->nmm_modes_supported, end));
+}
+
+
+static uint8_t unpack_pnf_phy_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_pnf_phy_t *value = (nfapi_pnf_phy_t *)tlv;
+  return ( pull16(ppReadPackedMsg, &value->number_of_phys, end) &&
+           unpackarray(ppReadPackedMsg, value->phy, sizeof(nfapi_pnf_phy_info_t), NFAPI_MAX_PNF_PHY, value->number_of_phys, end, &unpack_pnf_phy_info));
+}
+
+static uint8_t unpack_pnf_rf_info(void *elem, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_pnf_rf_info_t *rf = (nfapi_pnf_rf_info_t *)elem;
+  return( pull16(ppReadPackedMsg, &rf->rf_config_index, end) &&
+          pull16(ppReadPackedMsg, &rf->band, end) &&
+          pulls16(ppReadPackedMsg, &rf->maximum_transmit_power, end) &&
+          pulls16(ppReadPackedMsg, &rf->minimum_transmit_power, end) &&
+          pull8(ppReadPackedMsg, &rf->number_of_antennas_suppported, end) &&
+          pull32(ppReadPackedMsg, &rf->minimum_downlink_frequency, end) &&
+          pull32(ppReadPackedMsg, &rf->maximum_downlink_frequency, end) &&
+          pull32(ppReadPackedMsg, &rf->minimum_uplink_frequency, end) &&
+          pull32(ppReadPackedMsg, &rf->maximum_uplink_frequency, end));
+}
+static uint8_t unpack_pnf_rf_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_pnf_rf_t *value = (nfapi_pnf_rf_t *)tlv;
+  return ( pull16(ppReadPackedMsg, &value->number_of_rfs, end) &&
+           unpackarray(ppReadPackedMsg, value->rf, sizeof(nfapi_pnf_rf_info_t), NFAPI_MAX_PNF_RF, value->number_of_rfs, end, &unpack_pnf_rf_info));
+}
+
+static uint8_t unpack_pnf_phy_rel10_info(void *elem, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_pnf_phy_rel10_info_t *phy = (nfapi_pnf_phy_rel10_info_t *)elem;
+  return( pull16(ppReadPackedMsg, &phy->phy_config_index, end) &&
+          pull16(ppReadPackedMsg, &phy->transmission_mode_7_supported, end) &&
+          pull16(ppReadPackedMsg, &phy->transmission_mode_8_supported, end) &&
+          pull16(ppReadPackedMsg, &phy->two_antenna_ports_for_pucch, end) &&
+          pull16(ppReadPackedMsg, &phy->transmission_mode_9_supported, end) &&
+          pull16(ppReadPackedMsg, &phy->simultaneous_pucch_pusch, end) &&
+          pull16(ppReadPackedMsg, &phy->four_layer_tx_with_tm3_and_tm4, end));
+}
+static uint8_t unpack_pnf_phy_rel10_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_pnf_phy_rel10_t *value = (nfapi_pnf_phy_rel10_t *)tlv;
+  return ( pull16(ppReadPackedMsg, &value->number_of_phys, end) &&
+           unpackarray(ppReadPackedMsg, value->phy, sizeof(nfapi_pnf_phy_rel10_info_t), NFAPI_MAX_PNF_PHY, value->number_of_phys, end, &unpack_pnf_phy_rel10_info));
+}
+
+
+static uint8_t unpack_pnf_phy_rel11_info(void *elem, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_pnf_phy_rel11_info_t *phy = (nfapi_pnf_phy_rel11_info_t *)elem;
+  return( pull16(ppReadPackedMsg, &phy->phy_config_index, end) &&
+          pull16(ppReadPackedMsg, &phy->edpcch_supported, end) &&
+          pull16(ppReadPackedMsg, &phy->multi_ack_csi_reporting, end ) &&
+          pull16(ppReadPackedMsg, &phy->pucch_tx_diversity, end) &&
+          pull16(ppReadPackedMsg, &phy->ul_comp_supported, end) &&
+          pull16(ppReadPackedMsg, &phy->transmission_mode_5_supported, end));
+}
+
+static uint8_t unpack_pnf_phy_rel11_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_pnf_phy_rel11_t *value = (nfapi_pnf_phy_rel11_t *)tlv;
+  return ( pull16(ppReadPackedMsg, &value->number_of_phys, end) &&
+           unpackarray(ppReadPackedMsg, value->phy, sizeof(nfapi_pnf_phy_rel11_info_t), NFAPI_MAX_PNF_PHY, value->number_of_phys, end, &unpack_pnf_phy_rel11_info));
+}
+
+static uint8_t unpack_phy_phy_rel12_info(void *elem, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_pnf_phy_rel12_info_t *phy = (nfapi_pnf_phy_rel12_info_t *)elem;
+  return( pull16(ppReadPackedMsg, &phy->phy_config_index, end) &&
+          pull16(ppReadPackedMsg, &phy->csi_subframe_set, end) &&
+          pull16(ppReadPackedMsg, &phy->enhanced_4tx_codebook, end) &&
+          pull16(ppReadPackedMsg, &phy->drs_supported, end) &&
+          pull16(ppReadPackedMsg, &phy->ul_64qam_supported, end) &&
+          pull16(ppReadPackedMsg, &phy->transmission_mode_10_supported, end) &&
+          pull16(ppReadPackedMsg, &phy->alternative_bts_indices, end));
+}
+
+static uint8_t unpack_pnf_phy_rel12_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_pnf_phy_rel12_t *value = (nfapi_pnf_phy_rel12_t *)tlv;
+  return (pull16(ppReadPackedMsg, &value->number_of_phys, end) &&
+          unpackarray(ppReadPackedMsg, value->phy, sizeof(nfapi_pnf_phy_rel12_t), NFAPI_MAX_PNF_PHY, value->number_of_phys, end, &unpack_phy_phy_rel12_info));
+}
+
+static uint8_t unpack_pnf_phy_rel13_info(void *elem, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_pnf_phy_rel13_info_t *phy = (nfapi_pnf_phy_rel13_info_t *)elem;
+  return( pull16(ppReadPackedMsg, &phy->phy_config_index, end) &&
+          pull16(ppReadPackedMsg, &phy->pucch_format4_supported, end) &&
+          pull16(ppReadPackedMsg, &phy->pucch_format5_supported, end) &&
+          pull16(ppReadPackedMsg, &phy->more_than_5_ca_support, end) &&
+          pull16(ppReadPackedMsg, &phy->laa_supported, end) &&
+          pull16(ppReadPackedMsg, &phy->laa_ending_in_dwpts_supported, end) &&
+          pull16(ppReadPackedMsg, &phy->laa_starting_in_second_slot_supported, end) &&
+          pull16(ppReadPackedMsg, &phy->beamforming_supported, end) &&
+          pull16(ppReadPackedMsg, &phy->csi_rs_enhancement_supported, end) &&
+          pull16(ppReadPackedMsg, &phy->drms_enhancement_supported, end) &&
+          pull16(ppReadPackedMsg, &phy->srs_enhancement_supported, end));
+}
+
+static uint8_t unpack_pnf_phy_rel13_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_pnf_phy_rel13_t *value = (nfapi_pnf_phy_rel13_t *)tlv;
+  return ( pull16(ppReadPackedMsg, &value->number_of_phys, end) &&
+           unpackarray(ppReadPackedMsg, value->phy, sizeof(nfapi_pnf_phy_rel13_info_t), NFAPI_MAX_PNF_PHY, value->number_of_phys, end, &unpack_pnf_phy_rel13_info));
+}
+
+static uint8_t unpack_pnf_phy_rel13_nb_info_info(void *elem, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_pnf_phy_rel13_nb_iot_info_t *phy = (nfapi_pnf_phy_rel13_nb_iot_info_t *)elem;
+  return( pull16(ppReadPackedMsg, &phy->phy_config_index, end) &&
+          pull16(ppReadPackedMsg, &phy->number_of_rfs, end) &&
+          unpackarray(ppReadPackedMsg, phy->rf_config, sizeof(nfapi_rf_config_info_t), NFAPI_MAX_PNF_PHY_RF_CONFIG, phy->number_of_rfs, end, &unpack_rf_config_info) &&
+          pull16(ppReadPackedMsg, &phy->number_of_rf_exclusions, end) &&
+          unpackarray(ppReadPackedMsg, phy->excluded_rf_config, sizeof(nfapi_rf_config_info_t), NFAPI_MAX_PNF_PHY_RF_CONFIG, phy->number_of_rf_exclusions, end, &unpack_rf_config_info) &&
+          pull8(ppReadPackedMsg, &phy->number_of_dl_layers_supported, end) &&
+          pull8(ppReadPackedMsg, &phy->number_of_ul_layers_supported, end) &&
+          pull16(ppReadPackedMsg, &phy->maximum_3gpp_release_supported, end) &&
+          pull8(ppReadPackedMsg, &phy->nmm_modes_supported, end));
+}
+
+static uint8_t unpack_pnf_phy_rel13_nb_iot_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_pnf_phy_rel13_nb_iot_t *value = (nfapi_pnf_phy_rel13_nb_iot_t *)tlv;
+  return ( pull16(ppReadPackedMsg, &value->number_of_phys, end) &&
+           unpackarray(ppReadPackedMsg, value->phy, sizeof(nfapi_pnf_phy_rel13_nb_iot_info_t), NFAPI_MAX_PNF_PHY, value->number_of_phys, end, &unpack_pnf_phy_rel13_nb_info_info));
+}
+
+static uint8_t unpack_nr_pnf_param_response(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p4_p5_codec_config_t *config) {
+  nfapi_nr_pnf_param_response_t *pNfapiMsg = (nfapi_nr_pnf_param_response_t *)msg;
+  unpack_tlv_t unpack_fns[] = {
+    { NFAPI_PNF_PARAM_GENERAL_TAG, &pNfapiMsg->pnf_param_general, &unpack_pnf_param_general_value},
+    { NFAPI_PNF_PHY_TAG, &pNfapiMsg->pnf_phy, &unpack_pnf_phy_value},
+  };
+  return ( pull32(ppReadPackedMsg, &pNfapiMsg->error_code, end) &&
+           unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, end, config, &pNfapiMsg->vendor_extension));
+}
+
+
+
+static uint8_t unpack_pnf_param_response(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p4_p5_codec_config_t *config) {
+  nfapi_pnf_param_response_t *pNfapiMsg = (nfapi_pnf_param_response_t *)msg;
+  unpack_tlv_t unpack_fns[] = {
+    { NFAPI_PNF_PARAM_GENERAL_TAG, &pNfapiMsg->pnf_param_general, &unpack_pnf_param_general_value},
+    { NFAPI_PNF_PHY_TAG, &pNfapiMsg->pnf_phy, &unpack_pnf_phy_value},
+    { NFAPI_PNF_RF_TAG, &pNfapiMsg->pnf_rf, &unpack_pnf_rf_value},
+    { NFAPI_PNF_PHY_REL10_TAG, &pNfapiMsg->pnf_phy_rel10, &unpack_pnf_phy_rel10_value},
+    { NFAPI_PNF_PHY_REL11_TAG, &pNfapiMsg->pnf_phy_rel11, &unpack_pnf_phy_rel11_value},
+    { NFAPI_PNF_PHY_REL12_TAG, &pNfapiMsg->pnf_phy_rel12, &unpack_pnf_phy_rel12_value},
+    { NFAPI_PNF_PHY_REL13_TAG, &pNfapiMsg->pnf_phy_rel13, &unpack_pnf_phy_rel13_value},
+    { NFAPI_PNF_PHY_REL13_NB_IOT_TAG, &pNfapiMsg->pnf_phy_rel13_nb_iot, &unpack_pnf_phy_rel13_nb_iot_value},
+
+  };
+  return ( pull32(ppReadPackedMsg, &pNfapiMsg->error_code, end) &&
+           unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, end, config, &pNfapiMsg->vendor_extension));
+}
+
+
+static uint8_t unpack_phy_rf_config_info(void *elem, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_phy_rf_config_info_t *rf = (nfapi_phy_rf_config_info_t *)elem;
+  return( pull16(ppReadPackedMsg, &rf->phy_id, end) &&
+          pull16(ppReadPackedMsg, &rf->phy_config_index, end) &&
+          pull16(ppReadPackedMsg, &rf->rf_config_index, end));
+}
+
+static uint8_t unpack_pnf_phy_rf_config_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_pnf_phy_rf_config_t *value = (nfapi_pnf_phy_rf_config_t *)tlv;
+  return ( pull16(ppReadPackedMsg, &value->number_phy_rf_config_info, end) &&
+           unpackarray(ppReadPackedMsg, value->phy_rf_config, sizeof(nfapi_phy_rf_config_info_t), NFAPI_MAX_PHY_RF_INSTANCES, value->number_phy_rf_config_info, end, &unpack_phy_rf_config_info));
+}
+
+static uint8_t unpack_nr_pnf_config_request(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p4_p5_codec_config_t *config) {
+  nfapi_nr_pnf_config_request_t *pNfapiMsg = (nfapi_nr_pnf_config_request_t *)msg;
+  unpack_tlv_t unpack_fns[] = {
+    { NFAPI_PNF_PHY_RF_TAG, &pNfapiMsg->pnf_phy_rf_config, &unpack_pnf_phy_rf_config_value},
+  };
+  return unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, end, config, &pNfapiMsg->vendor_extension);
+}
+
+
+
+static uint8_t unpack_pnf_config_request(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p4_p5_codec_config_t *config) {
+  nfapi_pnf_config_request_t *pNfapiMsg = (nfapi_pnf_config_request_t *)msg;
+  unpack_tlv_t unpack_fns[] = {
+    { NFAPI_PNF_PHY_RF_TAG, &pNfapiMsg->pnf_phy_rf_config, &unpack_pnf_phy_rf_config_value},
+  };
+  return unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, end, config, &pNfapiMsg->vendor_extension);
+}
+
+
+static uint8_t unpack_nr_pnf_config_response(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p4_p5_codec_config_t *config) {
+  nfapi_nr_pnf_config_response_t *pNfapiMsg = (nfapi_nr_pnf_config_response_t *)msg;
+  return ( pull32(ppReadPackedMsg, &pNfapiMsg->error_code, end) &&
+           unpack_tlv_list(NULL, 0, ppReadPackedMsg, end, config, &(pNfapiMsg->vendor_extension)));
+}
+
+static uint8_t unpack_pnf_config_response(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p4_p5_codec_config_t *config) {
+  nfapi_pnf_config_response_t *pNfapiMsg = (nfapi_pnf_config_response_t *)msg;
+  return ( pull32(ppReadPackedMsg, &pNfapiMsg->error_code, end) &&
+           unpack_tlv_list(NULL, 0, ppReadPackedMsg, end, config, &(pNfapiMsg->vendor_extension)));
+}
+
+static uint8_t unpack_nr_pnf_start_request(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p4_p5_codec_config_t *config) {
+  nfapi_nr_pnf_start_request_t *pNfapiMsg = (nfapi_nr_pnf_start_request_t *)msg;
+  return unpack_tlv_list(NULL, 0, ppReadPackedMsg, end, config, &(pNfapiMsg->vendor_extension));
+}
+
+
+static uint8_t unpack_pnf_start_request(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p4_p5_codec_config_t *config) {
+  nfapi_pnf_start_request_t *pNfapiMsg = (nfapi_pnf_start_request_t *)msg;
+  return unpack_tlv_list(NULL, 0, ppReadPackedMsg, end, config, &(pNfapiMsg->vendor_extension));
+}
+
+
+static uint8_t unpack_pnf_start_response(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p4_p5_codec_config_t *config) {
+  nfapi_pnf_start_response_t *pNfapiMsg = (nfapi_pnf_start_response_t *)msg;
+  return ( pull32(ppReadPackedMsg, &pNfapiMsg->error_code, end ) &&
+           unpack_tlv_list(NULL, 0, ppReadPackedMsg, end, config, &(pNfapiMsg->vendor_extension)));
+}
+
+static uint8_t unpack_nr_pnf_start_response(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p4_p5_codec_config_t *config) {
+  nfapi_nr_pnf_start_response_t *pNfapiMsg = (nfapi_nr_pnf_start_response_t *)msg;
+  return ( pull32(ppReadPackedMsg, &pNfapiMsg->error_code, end ) &&
+           unpack_tlv_list(NULL, 0, ppReadPackedMsg, end, config, &(pNfapiMsg->vendor_extension)));
+}
+
+
+static uint8_t unpack_pnf_stop_request(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p4_p5_codec_config_t *config) {
+  nfapi_pnf_stop_request_t *pNfapiMsg = (nfapi_pnf_stop_request_t *)msg;
+  return unpack_tlv_list(NULL, 0, ppReadPackedMsg, end, config, &(pNfapiMsg->vendor_extension));
+}
+
+static uint8_t unpack_pnf_stop_response(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p4_p5_codec_config_t *config) {
+  nfapi_pnf_stop_response_t *pNfapiMsg = (nfapi_pnf_stop_response_t *)msg;
+  return ( pull32(ppReadPackedMsg, &pNfapiMsg->error_code, end) &&
+           unpack_tlv_list(NULL, 0, ppReadPackedMsg, end, config, &(pNfapiMsg->vendor_extension)));
+}
+
+static uint8_t unpack_param_request(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p4_p5_codec_config_t *config) {
+  nfapi_param_request_t *pNfapiMsg = (nfapi_param_request_t *)msg;
+  return unpack_tlv_list(NULL, 0, ppReadPackedMsg, end, config, &(pNfapiMsg->vendor_extension));
+}
+
+static uint8_t unpack_nr_param_request(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p4_p5_codec_config_t *config) {
+  nfapi_nr_param_request_scf_t *pNfapiMsg = (nfapi_nr_param_request_scf_t *)msg;
+  return unpack_tlv_list(NULL, 0, ppReadPackedMsg, end, config, &(pNfapiMsg->vendor_extension));
+}
+
+static uint8_t unpack_param_response(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p4_p5_codec_config_t *config) {
+  nfapi_param_response_t *pNfapiMsg = (nfapi_param_response_t *)msg;
+  unpack_tlv_t unpack_fns[] = {
+    { NFAPI_L1_STATUS_PHY_STATE_TAG, &pNfapiMsg->l1_status.phy_state, &unpack_uint16_tlv_value},
+
+    { NFAPI_PHY_CAPABILITIES_DL_BANDWIDTH_SUPPORT_TAG, &pNfapiMsg->phy_capabilities.dl_bandwidth_support, &unpack_uint16_tlv_value},
+    { NFAPI_PHY_CAPABILITIES_UL_BANDWIDTH_SUPPORT_TAG, &pNfapiMsg->phy_capabilities.ul_bandwidth_support, &unpack_uint16_tlv_value},
+    { NFAPI_PHY_CAPABILITIES_DL_MODULATION_SUPPORT_TAG, &pNfapiMsg->phy_capabilities.dl_modulation_support, &unpack_uint16_tlv_value},
+    { NFAPI_PHY_CAPABILITIES_UL_MODULATION_SUPPORT_TAG, &pNfapiMsg->phy_capabilities.ul_modulation_support, &unpack_uint16_tlv_value},
+    { NFAPI_PHY_CAPABILITIES_PHY_ANTENNA_CAPABILITY_TAG, &pNfapiMsg->phy_capabilities.phy_antenna_capability, &unpack_uint16_tlv_value},
+    { NFAPI_PHY_CAPABILITIES_RELEASE_CAPABILITY_TAG, &pNfapiMsg->phy_capabilities.release_capability, &unpack_uint16_tlv_value},
+    { NFAPI_PHY_CAPABILITIES_MBSFN_CAPABILITY_TAG, &pNfapiMsg->phy_capabilities.mbsfn_capability, &unpack_uint16_tlv_value},
+
+    { NFAPI_LAA_CAPABILITY_LAA_SUPPORT_TAG, &pNfapiMsg->laa_capability.laa_support, &unpack_uint16_tlv_value},
+    { NFAPI_LAA_CAPABILITY_PD_SENSING_LBT_SUPPORT_TAG, &pNfapiMsg->laa_capability.pd_sensing_lbt_support, &unpack_uint16_tlv_value},
+    { NFAPI_LAA_CAPABILITY_MULTI_CARRIER_LBT_SUPPORT_TAG, &pNfapiMsg->laa_capability.multi_carrier_lbt_support, &unpack_uint16_tlv_value},
+    { NFAPI_LAA_CAPABILITY_PARTIAL_SF_SUPPORT_TAG, &pNfapiMsg->laa_capability.partial_sf_support, &unpack_uint16_tlv_value},
+
+    { NFAPI_SUBFRAME_CONFIG_DUPLEX_MODE_TAG, &pNfapiMsg->subframe_config.duplex_mode, &unpack_uint16_tlv_value},
+    { NFAPI_SUBFRAME_CONFIG_PCFICH_POWER_OFFSET_TAG, &pNfapiMsg->subframe_config.pcfich_power_offset, &unpack_uint16_tlv_value},
+    { NFAPI_SUBFRAME_CONFIG_PB_TAG, &pNfapiMsg->subframe_config.pb, &unpack_uint16_tlv_value},
+    { NFAPI_SUBFRAME_CONFIG_DL_CYCLIC_PREFIX_TYPE_TAG, &pNfapiMsg->subframe_config.dl_cyclic_prefix_type, &unpack_uint16_tlv_value},
+    { NFAPI_SUBFRAME_CONFIG_UL_CYCLIC_PREFIX_TYPE_TAG, &pNfapiMsg->subframe_config.ul_cyclic_prefix_type, &unpack_uint16_tlv_value},
+
+    { NFAPI_RF_CONFIG_DL_CHANNEL_BANDWIDTH_TAG, &pNfapiMsg->rf_config.dl_channel_bandwidth, &unpack_uint16_tlv_value},
+    { NFAPI_RF_CONFIG_UL_CHANNEL_BANDWIDTH_TAG, &pNfapiMsg->rf_config.ul_channel_bandwidth, &unpack_uint16_tlv_value},
+    { NFAPI_RF_CONFIG_REFERENCE_SIGNAL_POWER_TAG, &pNfapiMsg->rf_config.reference_signal_power, &unpack_uint16_tlv_value},
+    { NFAPI_RF_CONFIG_TX_ANTENNA_PORTS_TAG, &pNfapiMsg->rf_config.tx_antenna_ports, &unpack_uint16_tlv_value},
+    { NFAPI_RF_CONFIG_RX_ANTENNA_PORTS_TAG, &pNfapiMsg->rf_config.rx_antenna_ports, &unpack_uint16_tlv_value},
+
+    { NFAPI_PHICH_CONFIG_PHICH_RESOURCE_TAG, &pNfapiMsg->phich_config.phich_resource, &unpack_uint16_tlv_value},
+    { NFAPI_PHICH_CONFIG_PHICH_DURATION_TAG, &pNfapiMsg->phich_config.phich_duration, &unpack_uint16_tlv_value},
+    { NFAPI_PHICH_CONFIG_PHICH_POWER_OFFSET_TAG, &pNfapiMsg->phich_config.phich_power_offset, &unpack_uint16_tlv_value},
+
+    { NFAPI_SCH_CONFIG_PRIMARY_SYNCHRONIZATION_SIGNAL_EPRE_EPRERS_TAG, &pNfapiMsg->sch_config.primary_synchronization_signal_epre_eprers, &unpack_uint16_tlv_value},
+    { NFAPI_SCH_CONFIG_SECONDARY_SYNCHRONIZATION_SIGNAL_EPRE_EPRERS_TAG, &pNfapiMsg->sch_config.secondary_synchronization_signal_epre_eprers, &unpack_uint16_tlv_value},
+    { NFAPI_SCH_CONFIG_PHYSICAL_CELL_ID_TAG, &pNfapiMsg->sch_config.physical_cell_id, &unpack_uint16_tlv_value},
+
+    { NFAPI_PRACH_CONFIG_CONFIGURATION_INDEX_TAG, &pNfapiMsg->prach_config.configuration_index, &unpack_uint16_tlv_value},
+    { NFAPI_PRACH_CONFIG_ROOT_SEQUENCE_INDEX_TAG, &pNfapiMsg->prach_config.root_sequence_index, &unpack_uint16_tlv_value},
+    { NFAPI_PRACH_CONFIG_ZERO_CORRELATION_ZONE_CONFIGURATION_TAG, &pNfapiMsg->prach_config.zero_correlation_zone_configuration, &unpack_uint16_tlv_value},
+    { NFAPI_PRACH_CONFIG_HIGH_SPEED_FLAG_TAG, &pNfapiMsg->prach_config.high_speed_flag, &unpack_uint16_tlv_value},
+    { NFAPI_PRACH_CONFIG_FREQUENCY_OFFSET_TAG, &pNfapiMsg->prach_config.frequency_offset, &unpack_uint16_tlv_value},
+
+    { NFAPI_PUSCH_CONFIG_HOPPING_MODE_TAG, &pNfapiMsg->pusch_config.hopping_mode, &unpack_uint16_tlv_value},
+    { NFAPI_PUSCH_CONFIG_HOPPING_OFFSET_TAG, &pNfapiMsg->pusch_config.hopping_offset, &unpack_uint16_tlv_value},
+    { NFAPI_PUSCH_CONFIG_NUMBER_OF_SUBBANDS_TAG, &pNfapiMsg->pusch_config.number_of_subbands, &unpack_uint16_tlv_value},
+
+    { NFAPI_PUCCH_CONFIG_DELTA_PUCCH_SHIFT_TAG, &pNfapiMsg->pucch_config.delta_pucch_shift, &unpack_uint16_tlv_value},
+    { NFAPI_PUCCH_CONFIG_N_CQI_RB_TAG, &pNfapiMsg->pucch_config.n_cqi_rb, &unpack_uint16_tlv_value},
+    { NFAPI_PUCCH_CONFIG_N_AN_CS_TAG, &pNfapiMsg->pucch_config.n_an_cs, &unpack_uint16_tlv_value},
+    { NFAPI_PUCCH_CONFIG_N1_PUCCH_AN_TAG, &pNfapiMsg->pucch_config.n1_pucch_an, &unpack_uint16_tlv_value},
+
+    { NFAPI_SRS_CONFIG_BANDWIDTH_CONFIGURATION_TAG, &pNfapiMsg->srs_config.bandwidth_configuration, &unpack_uint16_tlv_value},
+    { NFAPI_SRS_CONFIG_MAX_UP_PTS_TAG, &pNfapiMsg->srs_config.max_up_pts, &unpack_uint16_tlv_value},
+    { NFAPI_SRS_CONFIG_SRS_SUBFRAME_CONFIGURATION_TAG, &pNfapiMsg->srs_config.srs_subframe_configuration, &unpack_uint16_tlv_value},
+    { NFAPI_SRS_CONFIG_SRS_ACKNACK_SRS_SIMULTANEOUS_TRANSMISSION_TAG, &pNfapiMsg->srs_config.srs_acknack_srs_simultaneous_transmission, &unpack_uint16_tlv_value},
+
+    { NFAPI_UPLINK_REFERENCE_SIGNAL_CONFIG_UPLINK_RS_HOPPING_TAG, &pNfapiMsg->uplink_reference_signal_config.uplink_rs_hopping, &unpack_uint16_tlv_value},
+    { NFAPI_UPLINK_REFERENCE_SIGNAL_CONFIG_GROUP_ASSIGNMENT_TAG, &pNfapiMsg->uplink_reference_signal_config.group_assignment, &unpack_uint16_tlv_value},
+    { NFAPI_UPLINK_REFERENCE_SIGNAL_CONFIG_CYCLIC_SHIFT_1_FOR_DRMS_TAG, &pNfapiMsg->uplink_reference_signal_config.cyclic_shift_1_for_drms, &unpack_uint16_tlv_value},
+
+    { NFAPI_TDD_FRAME_STRUCTURE_SUBFRAME_ASSIGNMENT_TAG, &pNfapiMsg->tdd_frame_structure_config.subframe_assignment, &unpack_uint16_tlv_value},
+    { NFAPI_TDD_FRAME_STRUCTURE_SPECIAL_SUBFRAME_PATTERNS_TAG, &pNfapiMsg->tdd_frame_structure_config.special_subframe_patterns, &unpack_uint16_tlv_value},
+
+    { NFAPI_L23_CONFIG_DATA_REPORT_MODE_TAG, &pNfapiMsg->l23_config.data_report_mode, &unpack_uint16_tlv_value},
+    { NFAPI_L23_CONFIG_SFNSF_TAG, &pNfapiMsg->l23_config.sfnsf, &unpack_uint16_tlv_value},
+
+    { NFAPI_NFAPI_P7_VNF_ADDRESS_IPV4_TAG, &pNfapiMsg->nfapi_config.p7_vnf_address_ipv4, &unpack_ipv4_address_value},
+    { NFAPI_NFAPI_P7_VNF_ADDRESS_IPV6_TAG, &pNfapiMsg->nfapi_config.p7_vnf_address_ipv6, &unpack_ipv6_address_value},
+    { NFAPI_NFAPI_P7_VNF_PORT_TAG, &pNfapiMsg->nfapi_config.p7_vnf_port, &unpack_uint16_tlv_value},
+    { NFAPI_NFAPI_P7_PNF_ADDRESS_IPV4_TAG, &pNfapiMsg->nfapi_config.p7_pnf_address_ipv4, &unpack_ipv4_address_value},
+    { NFAPI_NFAPI_P7_PNF_ADDRESS_IPV6_TAG, &pNfapiMsg->nfapi_config.p7_pnf_address_ipv6, &unpack_ipv6_address_value},
+    { NFAPI_NFAPI_P7_PNF_PORT_TAG, &pNfapiMsg->nfapi_config.p7_pnf_port, &unpack_uint16_tlv_value},
+    { NFAPI_NFAPI_DOWNLINK_UES_PER_SUBFRAME_TAG, &pNfapiMsg->nfapi_config.dl_ue_per_sf, &unpack_uint8_tlv_value},
+    { NFAPI_NFAPI_UPLINK_UES_PER_SUBFRAME_TAG, &pNfapiMsg->nfapi_config.ul_ue_per_sf, &unpack_uint8_tlv_value},
+    { NFAPI_NFAPI_RF_BANDS_TAG, &pNfapiMsg->nfapi_config.rf_bands, &unpack_rf_bands_value},
+    { NFAPI_NFAPI_TIMING_WINDOW_TAG, &pNfapiMsg->nfapi_config.timing_window, &unpack_uint8_tlv_value},
+    { NFAPI_NFAPI_TIMING_INFO_MODE_TAG, &pNfapiMsg->nfapi_config.timing_info_mode, &unpack_uint8_tlv_value},
+    { NFAPI_NFAPI_TIMING_INFO_PERIOD_TAG, &pNfapiMsg->nfapi_config.timing_info_period, &unpack_uint8_tlv_value},
+    { NFAPI_NFAPI_MAXIMUM_TRANSMIT_POWER_TAG, &pNfapiMsg->nfapi_config.max_transmit_power, &unpack_uint16_tlv_value},
+    { NFAPI_NFAPI_EARFCN_TAG, &pNfapiMsg->nfapi_config.earfcn, &unpack_uint16_tlv_value},
+    { NFAPI_NFAPI_NMM_GSM_FREQUENCY_BANDS_TAG, &pNfapiMsg->nfapi_config.nmm_gsm_frequency_bands, &unpack_nmm_frequency_bands_value},
+    { NFAPI_NFAPI_NMM_UMTS_FREQUENCY_BANDS_TAG, &pNfapiMsg->nfapi_config.nmm_umts_frequency_bands, &unpack_nmm_frequency_bands_value},
+    { NFAPI_NFAPI_NMM_LTE_FREQUENCY_BANDS_TAG, &pNfapiMsg->nfapi_config.nmm_lte_frequency_bands, &unpack_nmm_frequency_bands_value},
+    { NFAPI_NFAPI_NMM_UPLINK_RSSI_SUPPORTED_TAG, &pNfapiMsg->nfapi_config.nmm_uplink_rssi_supported, &unpack_uint8_tlv_value},
+
+  };
+  return ( pull8(ppReadPackedMsg, &pNfapiMsg->error_code, end) &&
+           pull8(ppReadPackedMsg, &pNfapiMsg->num_tlv, end) &&
+           unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, end, config, &pNfapiMsg->vendor_extension));
+}
+
+static uint8_t unpack_nr_param_response(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p4_p5_codec_config_t *config) {
+  nfapi_nr_param_response_scf_t *pNfapiMsg = (nfapi_nr_param_response_scf_t *)msg;
+  unpack_tlv_t unpack_fns[] = {
+    { NFAPI_NR_PARAM_TLV_RELEASE_CAPABILITY_TAG, &(pNfapiMsg->cell_param.release_capability), &unpack_uint16_tlv_value},
+    { NFAPI_NR_PARAM_TLV_PHY_STATE_TAG, &(pNfapiMsg->cell_param.phy_state),&unpack_uint16_tlv_value},
+    { NFAPI_NR_PARAM_TLV_SKIP_BLANK_DL_CONFIG_TAG, &(pNfapiMsg->cell_param.skip_blank_dl_config), &unpack_uint8_tlv_value},
+    { NFAPI_NR_PARAM_TLV_SKIP_BLANK_UL_CONFIG_TAG, &(pNfapiMsg->cell_param.skip_blank_ul_config), &unpack_uint8_tlv_value},
+    { NFAPI_NR_PARAM_TLV_NUM_CONFIG_TLVS_TO_REPORT_TAG, &(pNfapiMsg->cell_param.num_config_tlvs_to_report ), &unpack_uint16_tlv_value},
+
+    { NFAPI_NR_PARAM_TLV_CYCLIC_PREFIX_TAG, &(pNfapiMsg->carrier_param.cyclic_prefix), &unpack_uint8_tlv_value},
+    { NFAPI_NR_PARAM_TLV_SUPPORTED_SUBCARRIER_SPACINGS_DL_TAG, &(pNfapiMsg->carrier_param.supported_subcarrier_spacings_dl), &unpack_uint16_tlv_value},
+    { NFAPI_NR_PARAM_TLV_SUPPORTED_BANDWIDTH_DL_TAG, &(pNfapiMsg->carrier_param.supported_bandwidth_dl), &unpack_uint16_tlv_value},
+    { NFAPI_NR_PARAM_TLV_SUPPORTED_SUBCARRIER_SPACINGS_UL_TAG, &(pNfapiMsg->carrier_param.supported_subcarrier_spacings_ul), &unpack_uint8_tlv_value},
+    { NFAPI_NR_PARAM_TLV_SUPPORTED_BANDWIDTH_UL_TAG, &(pNfapiMsg->carrier_param.supported_bandwidth_ul), &unpack_uint16_tlv_value},
+
+
+    { NFAPI_NR_PARAM_TLV_CCE_MAPPING_TYPE_TAG, &(pNfapiMsg->pdcch_param.cce_mapping_type), &unpack_uint8_tlv_value},
+    { NFAPI_NR_PARAM_TLV_CORESET_OUTSIDE_FIRST_3_OFDM_SYMS_OF_SLOT_TAG, &(pNfapiMsg->pdcch_param.coreset_outside_first_3_of_ofdm_syms_of_slot), &unpack_uint8_tlv_value},
+    { NFAPI_NR_PARAM_TLV_PRECODER_GRANULARITY_CORESET_TAG, &(pNfapiMsg->pdcch_param.coreset_precoder_granularity_coreset), &unpack_uint8_tlv_value},
+    { NFAPI_NR_PARAM_TLV_PDCCH_MU_MIMO_TAG, &(pNfapiMsg->pdcch_param.pdcch_mu_mimo), &unpack_uint8_tlv_value},
+    { NFAPI_NR_PARAM_TLV_PDCCH_PRECODER_CYCLING_TAG, &(pNfapiMsg->pdcch_param.pdcch_precoder_cycling), &unpack_uint8_tlv_value},
+    { NFAPI_NR_PARAM_TLV_MAX_PDCCHS_PER_SLOT_TAG, &(pNfapiMsg->pdcch_param.max_pdcch_per_slot), &unpack_uint8_tlv_value},
+
+    { NFAPI_NR_PARAM_TLV_PUCCH_FORMATS_TAG, &(pNfapiMsg->pucch_param.pucch_formats), &unpack_uint8_tlv_value},
+    { NFAPI_NR_PARAM_TLV_MAX_PUCCHS_PER_SLOT_TAG, &(pNfapiMsg->pucch_param.max_pucchs_per_slot), &unpack_uint8_tlv_value},
+
+    { NFAPI_NR_PARAM_TLV_PDSCH_MAPPING_TYPE_TAG, &(pNfapiMsg->pdsch_param.pdsch_mapping_type), &unpack_uint8_tlv_value},
+    { NFAPI_NR_PARAM_TLV_PDSCH_ALLOCATION_TYPES_TAG, &(pNfapiMsg->pdsch_param.pdsch_allocation_types), &unpack_uint8_tlv_value},
+    { NFAPI_NR_PARAM_TLV_PDSCH_VRB_TO_PRB_MAPPING_TAG, &(pNfapiMsg->pdsch_param.pdsch_vrb_to_prb_mapping), &unpack_uint8_tlv_value},
+    { NFAPI_NR_PARAM_TLV_PDSCH_CBG_TAG, &(pNfapiMsg->pdsch_param.pdsch_cbg), &unpack_uint8_tlv_value},
+    { NFAPI_NR_PARAM_TLV_PDSCH_DMRS_CONFIG_TYPES_TAG, &(pNfapiMsg->pdsch_param.pdsch_dmrs_config_types), &unpack_uint8_tlv_value},
+    { NFAPI_NR_PARAM_TLV_PDSCH_DMRS_MAX_LENGTH_TAG, &(pNfapiMsg->pdsch_param.pdsch_dmrs_max_length), &unpack_uint8_tlv_value},
+    { NFAPI_NR_PARAM_TLV_PDSCH_DMRS_ADDITIONAL_POS_TAG, &(pNfapiMsg->pdsch_param.pdsch_dmrs_additional_pos), &unpack_uint8_tlv_value},
+    { NFAPI_NR_PARAM_TLV_MAX_PDSCH_S_YBS_PER_SLOT_TAG, &(pNfapiMsg->pdsch_param.max_pdsch_tbs_per_slot), &unpack_uint8_tlv_value},
+    { NFAPI_NR_PARAM_TLV_MAX_NUMBER_MIMO_LAYERS_PDSCH_TAG, &(pNfapiMsg->pdsch_param.max_number_mimo_layers_pdsch), &unpack_uint8_tlv_value},
+    { NFAPI_NR_PARAM_TLV_MAX_MU_MIMO_USERS_DL_TAG, &(pNfapiMsg->pdsch_param.max_mu_mimo_users_dl), &unpack_uint8_tlv_value},
+    { NFAPI_NR_PARAM_TLV_PDSCH_DATA_IN_DMRS_SYMBOLS_TAG, &(pNfapiMsg->pdsch_param.pdsch_data_in_dmrs_symbols), &unpack_uint8_tlv_value},
+    { NFAPI_NR_PARAM_TLV_PREMPTION_SUPPORT_TAG, &(pNfapiMsg->pdsch_param.premption_support), &unpack_uint8_tlv_value},
+    { NFAPI_NR_PARAM_TLV_PDSCH_NON_SLOT_SUPPORT_TAG, &(pNfapiMsg->pdsch_param.pdsch_non_slot_support), &unpack_uint8_tlv_value},
+
+    { NFAPI_NR_PARAM_TLV_UCI_MUX_ULSCH_IN_PUSCH_TAG,  &(pNfapiMsg->pusch_param.uci_mux_ulsch_in_pusch),  &unpack_uint8_tlv_value},
+    { NFAPI_NR_PARAM_TLV_UCI_ONLY_PUSCH_TAG,  &(pNfapiMsg->pusch_param.uci_only_pusch),  &unpack_uint8_tlv_value},
+    { NFAPI_NR_PARAM_TLV_PUSCH_FREQUENCY_HOPPING_TAG,  &(pNfapiMsg->pusch_param.pusch_frequency_hopping),  &unpack_uint8_tlv_value},
+    { NFAPI_NR_PARAM_TLV_PUSCH_DMRS_CONFIG_TYPES_TAG,  &(pNfapiMsg->pusch_param.pusch_dmrs_config_types),  &unpack_uint8_tlv_value},
+    { NFAPI_NR_PARAM_TLV_PUSCH_DMRS_MAX_LEN_TAG,  &(pNfapiMsg->pusch_param.pusch_dmrs_max_len),  &unpack_uint8_tlv_value},
+    { NFAPI_NR_PARAM_TLV_PUSCH_DMRS_ADDITIONAL_POS_TAG,  &(pNfapiMsg->pusch_param.pusch_dmrs_additional_pos),  &unpack_uint8_tlv_value},
+    { NFAPI_NR_PARAM_TLV_PUSCH_CBG_TAG,  &(pNfapiMsg->pusch_param.pusch_cbg),  &unpack_uint8_tlv_value},
+    { NFAPI_NR_PARAM_TLV_PUSCH_MAPPING_TYPE_TAG,  &(pNfapiMsg->pusch_param.pusch_mapping_type),  &unpack_uint8_tlv_value},
+    { NFAPI_NR_PARAM_TLV_PUSCH_ALLOCATION_TYPES_TAG,  &(pNfapiMsg->pusch_param.pusch_allocation_types),  &unpack_uint8_tlv_value},
+    { NFAPI_NR_PARAM_TLV_PUSCH_VRB_TO_PRB_MAPPING_TAG,  &(pNfapiMsg->pusch_param.pusch_vrb_to_prb_mapping),  &unpack_uint8_tlv_value},
+    { NFAPI_NR_PARAM_TLV_PUSCH_MAX_PTRS_PORTS_TAG,  &(pNfapiMsg->pusch_param.pusch_max_ptrs_ports),  &unpack_uint8_tlv_value},
+    { NFAPI_NR_PARAM_TLV_MAX_PDUSCHS_TBS_PER_SLOT_TAG,  &(pNfapiMsg->pusch_param.max_pduschs_tbs_per_slot),  &unpack_uint8_tlv_value},
+    { NFAPI_NR_PARAM_TLV_MAX_NUMBER_MIMO_LAYERS_NON_CB_PUSCH_TAG,  &(pNfapiMsg->pusch_param.max_number_mimo_layers_non_cb_pusch),  &unpack_uint8_tlv_value},
+    { NFAPI_NR_PARAM_TLV_SUPPORTED_MODULATION_ORDER_UL_TAG,  &(pNfapiMsg->pusch_param.supported_modulation_order_ul),  &unpack_uint8_tlv_value},
+    { NFAPI_NR_PARAM_TLV_MAX_MU_MIMO_USERS_UL_TAG,  &(pNfapiMsg->pusch_param.max_mu_mimo_users_ul),  &unpack_uint8_tlv_value},
+    { NFAPI_NR_PARAM_TLV_DFTS_OFDM_SUPPORT_TAG,  &(pNfapiMsg->pusch_param.dfts_ofdm_support),  &unpack_uint8_tlv_value},
+    { NFAPI_NR_PARAM_TLV_PUSCH_AGGREGATION_FACTOR_TAG,  &(pNfapiMsg->pusch_param.pusch_aggregation_factor),  &unpack_uint8_tlv_value},
+
+    { NFAPI_NR_PARAM_TLV_PRACH_LONG_FORMATS_TAG,  &(pNfapiMsg->prach_param.prach_long_formats),  &unpack_uint8_tlv_value},
+    { NFAPI_NR_PARAM_TLV_PRACH_SHORT_FORMATS_TAG,  &(pNfapiMsg->prach_param.prach_short_formats),  &unpack_uint8_tlv_value},
+    { NFAPI_NR_PARAM_TLV_PRACH_RESTRICTED_SETS_TAG,  &(pNfapiMsg->prach_param.prach_restricted_sets),  &unpack_uint8_tlv_value},
+    { NFAPI_NR_PARAM_TLV_MAX_PRACH_FD_OCCASIONS_IN_A_SLOT_TAG,  &(pNfapiMsg->prach_param.max_prach_fd_occasions_in_a_slot),  &unpack_uint8_tlv_value},
+
+    { NFAPI_NR_PARAM_TLV_RSSI_MEASUREMENT_SUPPORT_TAG,  &(pNfapiMsg->measurement_param.rssi_measurement_support),  &unpack_uint8_tlv_value},
+    //config
+    { NFAPI_NR_NFAPI_P7_VNF_ADDRESS_IPV4_TAG, &pNfapiMsg->nfapi_config.p7_vnf_address_ipv4, &unpack_ipv4_address_value},
+    { NFAPI_NR_NFAPI_P7_VNF_ADDRESS_IPV6_TAG, &pNfapiMsg->nfapi_config.p7_vnf_address_ipv6, &unpack_ipv6_address_value},
+    { NFAPI_NR_NFAPI_P7_VNF_PORT_TAG, &pNfapiMsg->nfapi_config.p7_vnf_port, &unpack_uint16_tlv_value},
+    { NFAPI_NR_NFAPI_P7_PNF_ADDRESS_IPV4_TAG, &pNfapiMsg->nfapi_config.p7_pnf_address_ipv4, &unpack_ipv4_address_value},
+    { NFAPI_NR_NFAPI_P7_PNF_ADDRESS_IPV6_TAG, &pNfapiMsg->nfapi_config.p7_pnf_address_ipv6, &unpack_ipv6_address_value},
+    { NFAPI_NR_NFAPI_P7_PNF_PORT_TAG, &pNfapiMsg->nfapi_config.p7_pnf_port, &unpack_uint16_tlv_value},
+    { NFAPI_NR_NFAPI_TIMING_WINDOW_TAG, &pNfapiMsg->nfapi_config.timing_window, &unpack_uint8_tlv_value},
+    { NFAPI_NR_NFAPI_TIMING_INFO_MODE_TAG, &pNfapiMsg->nfapi_config.timing_info_mode, &unpack_uint8_tlv_value},
+    { NFAPI_NR_NFAPI_TIMING_INFO_PERIOD_TAG, &pNfapiMsg->nfapi_config.timing_info_period, &unpack_uint8_tlv_value},
+  };
+  // print ppReadPackedMsg
+  uint8_t *ptr = *ppReadPackedMsg;
+  printf("\n Read message unpack_param_response: ");
+
+  while(ptr < end) {
+    printf(" %d ", *ptr);
+    ptr++;
+  }
+
+  printf("\n");
+  return ( pull8(ppReadPackedMsg, &pNfapiMsg->error_code, end) &&
+           pull8(ppReadPackedMsg, &pNfapiMsg->num_tlv, end) &&
+           unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, end, config, &pNfapiMsg->vendor_extension));
+}
+
+static uint8_t unpack_config_request(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p4_p5_codec_config_t *config) {
+  nfapi_config_request_t *pNfapiMsg = (nfapi_config_request_t *)msg;
+  unpack_tlv_t unpack_fns[] = {
+    { NFAPI_SUBFRAME_CONFIG_DUPLEX_MODE_TAG, &pNfapiMsg->subframe_config.duplex_mode, &unpack_uint16_tlv_value},
+    { NFAPI_SUBFRAME_CONFIG_PCFICH_POWER_OFFSET_TAG, &pNfapiMsg->subframe_config.pcfich_power_offset, &unpack_uint16_tlv_value},
+    { NFAPI_SUBFRAME_CONFIG_PB_TAG, &pNfapiMsg->subframe_config.pb, &unpack_uint16_tlv_value},
+    { NFAPI_SUBFRAME_CONFIG_DL_CYCLIC_PREFIX_TYPE_TAG, &pNfapiMsg->subframe_config.dl_cyclic_prefix_type, &unpack_uint16_tlv_value},
+    { NFAPI_SUBFRAME_CONFIG_UL_CYCLIC_PREFIX_TYPE_TAG, &pNfapiMsg->subframe_config.ul_cyclic_prefix_type, &unpack_uint16_tlv_value},
+
+    { NFAPI_RF_CONFIG_DL_CHANNEL_BANDWIDTH_TAG, &pNfapiMsg->rf_config.dl_channel_bandwidth, &unpack_uint16_tlv_value},
+    { NFAPI_RF_CONFIG_UL_CHANNEL_BANDWIDTH_TAG, &pNfapiMsg->rf_config.ul_channel_bandwidth, &unpack_uint16_tlv_value},
+    { NFAPI_RF_CONFIG_REFERENCE_SIGNAL_POWER_TAG, &pNfapiMsg->rf_config.reference_signal_power, &unpack_uint16_tlv_value},
+    { NFAPI_RF_CONFIG_TX_ANTENNA_PORTS_TAG, &pNfapiMsg->rf_config.tx_antenna_ports, &unpack_uint16_tlv_value},
+    { NFAPI_RF_CONFIG_RX_ANTENNA_PORTS_TAG, &pNfapiMsg->rf_config.rx_antenna_ports, &unpack_uint16_tlv_value},
+
+    { NFAPI_PHICH_CONFIG_PHICH_RESOURCE_TAG, &pNfapiMsg->phich_config.phich_resource, &unpack_uint16_tlv_value},
+    { NFAPI_PHICH_CONFIG_PHICH_DURATION_TAG, &pNfapiMsg->phich_config.phich_duration, &unpack_uint16_tlv_value},
+    { NFAPI_PHICH_CONFIG_PHICH_POWER_OFFSET_TAG, &pNfapiMsg->phich_config.phich_power_offset, &unpack_uint16_tlv_value},
+
+    { NFAPI_SCH_CONFIG_PRIMARY_SYNCHRONIZATION_SIGNAL_EPRE_EPRERS_TAG, &pNfapiMsg->sch_config.primary_synchronization_signal_epre_eprers, &unpack_uint16_tlv_value},
+    { NFAPI_SCH_CONFIG_SECONDARY_SYNCHRONIZATION_SIGNAL_EPRE_EPRERS_TAG, &pNfapiMsg->sch_config.secondary_synchronization_signal_epre_eprers, &unpack_uint16_tlv_value},
+    { NFAPI_SCH_CONFIG_PHYSICAL_CELL_ID_TAG, &pNfapiMsg->sch_config.physical_cell_id, &unpack_uint16_tlv_value},
+
+    { NFAPI_PRACH_CONFIG_CONFIGURATION_INDEX_TAG, &pNfapiMsg->prach_config.configuration_index, &unpack_uint16_tlv_value},
+    { NFAPI_PRACH_CONFIG_ROOT_SEQUENCE_INDEX_TAG, &pNfapiMsg->prach_config.root_sequence_index, &unpack_uint16_tlv_value},
+    { NFAPI_PRACH_CONFIG_ZERO_CORRELATION_ZONE_CONFIGURATION_TAG, &pNfapiMsg->prach_config.zero_correlation_zone_configuration, &unpack_uint16_tlv_value},
+    { NFAPI_PRACH_CONFIG_HIGH_SPEED_FLAG_TAG, &pNfapiMsg->prach_config.high_speed_flag, &unpack_uint16_tlv_value},
+    { NFAPI_PRACH_CONFIG_FREQUENCY_OFFSET_TAG, &pNfapiMsg->prach_config.frequency_offset, &unpack_uint16_tlv_value},
+
+    { NFAPI_PUSCH_CONFIG_HOPPING_MODE_TAG, &pNfapiMsg->pusch_config.hopping_mode, &unpack_uint16_tlv_value},
+    { NFAPI_PUSCH_CONFIG_HOPPING_OFFSET_TAG, &pNfapiMsg->pusch_config.hopping_offset, &unpack_uint16_tlv_value},
+    { NFAPI_PUSCH_CONFIG_NUMBER_OF_SUBBANDS_TAG, &pNfapiMsg->pusch_config.number_of_subbands, &unpack_uint16_tlv_value},
+
+    { NFAPI_PUCCH_CONFIG_DELTA_PUCCH_SHIFT_TAG, &pNfapiMsg->pucch_config.delta_pucch_shift, &unpack_uint16_tlv_value},
+    { NFAPI_PUCCH_CONFIG_N_CQI_RB_TAG, &pNfapiMsg->pucch_config.n_cqi_rb, &unpack_uint16_tlv_value},
+    { NFAPI_PUCCH_CONFIG_N_AN_CS_TAG, &pNfapiMsg->pucch_config.n_an_cs, &unpack_uint16_tlv_value},
+    { NFAPI_PUCCH_CONFIG_N1_PUCCH_AN_TAG, &pNfapiMsg->pucch_config.n1_pucch_an, &unpack_uint16_tlv_value},
+
+    { NFAPI_SRS_CONFIG_BANDWIDTH_CONFIGURATION_TAG, &pNfapiMsg->srs_config.bandwidth_configuration, &unpack_uint16_tlv_value},
+    { NFAPI_SRS_CONFIG_MAX_UP_PTS_TAG, &pNfapiMsg->srs_config.max_up_pts, &unpack_uint16_tlv_value},
+    { NFAPI_SRS_CONFIG_SRS_SUBFRAME_CONFIGURATION_TAG, &pNfapiMsg->srs_config.srs_subframe_configuration, &unpack_uint16_tlv_value},
+    { NFAPI_SRS_CONFIG_SRS_ACKNACK_SRS_SIMULTANEOUS_TRANSMISSION_TAG, &pNfapiMsg->srs_config.srs_acknack_srs_simultaneous_transmission, &unpack_uint16_tlv_value},
+
+    { NFAPI_UPLINK_REFERENCE_SIGNAL_CONFIG_UPLINK_RS_HOPPING_TAG, &pNfapiMsg->uplink_reference_signal_config.uplink_rs_hopping, &unpack_uint16_tlv_value},
+    { NFAPI_UPLINK_REFERENCE_SIGNAL_CONFIG_GROUP_ASSIGNMENT_TAG, &pNfapiMsg->uplink_reference_signal_config.group_assignment, &unpack_uint16_tlv_value},
+    { NFAPI_UPLINK_REFERENCE_SIGNAL_CONFIG_CYCLIC_SHIFT_1_FOR_DRMS_TAG, &pNfapiMsg->uplink_reference_signal_config.cyclic_shift_1_for_drms, &unpack_uint16_tlv_value},
+
+
+    { NFAPI_LAA_CONFIG_ED_THRESHOLD_FOR_LBT_FOR_PDSCH_TAG, &pNfapiMsg->laa_config.ed_threshold_lbt_pdsch, &unpack_uint16_tlv_value},
+    { NFAPI_LAA_CONFIG_ED_THRESHOLD_FOR_LBT_FOR_DRS_TAG, &pNfapiMsg->laa_config.ed_threshold_lbt_drs, &unpack_uint16_tlv_value},
+    { NFAPI_LAA_CONFIG_PD_THRESHOLD_TAG, &pNfapiMsg->laa_config.pd_threshold, &unpack_uint16_tlv_value},
+    { NFAPI_LAA_CONFIG_MULTI_CARRIER_TYPE_TAG, &pNfapiMsg->laa_config.multi_carrier_type, &unpack_uint16_tlv_value},
+    { NFAPI_LAA_CONFIG_MULTI_CARRIER_TX_TAG, &pNfapiMsg->laa_config.multi_carrier_tx, &unpack_uint16_tlv_value},
+    { NFAPI_LAA_CONFIG_MULTI_CARRIER_FREEZE_TAG, &pNfapiMsg->laa_config.multi_carrier_freeze, &unpack_uint16_tlv_value},
+    { NFAPI_LAA_CONFIG_TX_ANTENNA_PORTS_FOR_DRS_TAG, &pNfapiMsg->laa_config.tx_antenna_ports_drs, &unpack_uint16_tlv_value},
+    { NFAPI_LAA_CONFIG_TRANSMISSION_POWER_FOR_DRS_TAG, &pNfapiMsg->laa_config.tx_power_drs, &unpack_uint16_tlv_value},
+
+    { NFAPI_EMTC_CONFIG_PBCH_REPETITIONS_ENABLE_R13_TAG, &pNfapiMsg->emtc_config.pbch_repetitions_enable_r13, &unpack_uint16_tlv_value},
+    { NFAPI_EMTC_CONFIG_PRACH_CATM_ROOT_SEQUENCE_INDEX_TAG, &pNfapiMsg->emtc_config.prach_catm_root_sequence_index, &unpack_uint16_tlv_value},
+    { NFAPI_EMTC_CONFIG_PRACH_CATM_ZERO_CORRELATION_ZONE_CONFIGURATION_TAG, &pNfapiMsg->emtc_config.prach_catm_zero_correlation_zone_configuration, &unpack_uint16_tlv_value},
+    { NFAPI_EMTC_CONFIG_PRACH_CATM_HIGH_SPEED_FLAG, &pNfapiMsg->emtc_config.prach_catm_high_speed_flag, &unpack_uint16_tlv_value},
+    { NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_0_ENABLE_TAG, &pNfapiMsg->emtc_config.prach_ce_level_0_enable, &unpack_uint16_tlv_value},
+    { NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_0_CONFIGURATION_INDEX_TAG, &pNfapiMsg->emtc_config.prach_ce_level_0_configuration_index, &unpack_uint16_tlv_value},
+    { NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_0_FREQUENCY_OFFSET_TAG, &pNfapiMsg->emtc_config.prach_ce_level_0_frequency_offset, &unpack_uint16_tlv_value},
+    { NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_0_NUMBER_OF_REPETITIONS_PER_ATTEMPT_TAG, &pNfapiMsg->emtc_config.prach_ce_level_0_number_of_repetitions_per_attempt, &unpack_uint16_tlv_value},
+    { NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_0_STARTING_SUBFRAME_PERIODICITY_TAG, &pNfapiMsg->emtc_config.prach_ce_level_0_starting_subframe_periodicity, &unpack_uint16_tlv_value},
+    { NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_0_HOPPING_ENABLE_TAG, &pNfapiMsg->emtc_config.prach_ce_level_0_hopping_enable, &unpack_uint16_tlv_value},
+    { NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_0_HOPPING_OFFSET_TAG, &pNfapiMsg->emtc_config.prach_ce_level_0_hopping_offset, &unpack_uint16_tlv_value},
+    { NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_1_ENABLE_TAG, &pNfapiMsg->emtc_config.prach_ce_level_1_enable, &unpack_uint16_tlv_value},
+    { NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_1_CONFIGURATION_INDEX_TAG, &pNfapiMsg->emtc_config.prach_ce_level_1_configuration_index, &unpack_uint16_tlv_value},
+    { NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_1_FREQUENCY_OFFSET_TAG, &pNfapiMsg->emtc_config.prach_ce_level_1_frequency_offset, &unpack_uint16_tlv_value},
+    { NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_1_NUMBER_OF_REPETITIONS_PER_ATTEMPT_TAG, &pNfapiMsg->emtc_config.prach_ce_level_1_number_of_repetitions_per_attempt, &unpack_uint16_tlv_value},
+    { NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_1_STARTING_SUBFRAME_PERIODICITY_TAG, &pNfapiMsg->emtc_config.prach_ce_level_1_starting_subframe_periodicity, &unpack_uint16_tlv_value},
+    { NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_1_HOPPING_ENABLE_TAG, &pNfapiMsg->emtc_config.prach_ce_level_1_hopping_enable, &unpack_uint16_tlv_value},
+    { NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_1_HOPPING_OFFSET_TAG, &pNfapiMsg->emtc_config.prach_ce_level_1_hopping_offset, &unpack_uint16_tlv_value},
+    { NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_2_ENABLE_TAG, &pNfapiMsg->emtc_config.prach_ce_level_2_enable, &unpack_uint16_tlv_value},
+    { NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_2_CONFIGURATION_INDEX_TAG, &pNfapiMsg->emtc_config.prach_ce_level_2_configuration_index, &unpack_uint16_tlv_value},
+    { NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_2_FREQUENCY_OFFSET_TAG, &pNfapiMsg->emtc_config.prach_ce_level_2_frequency_offset, &unpack_uint16_tlv_value},
+    { NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_2_NUMBER_OF_REPETITIONS_PER_ATTEMPT_TAG, &pNfapiMsg->emtc_config.prach_ce_level_2_number_of_repetitions_per_attempt, &unpack_uint16_tlv_value},
+    { NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_2_STARTING_SUBFRAME_PERIODICITY_TAG, &pNfapiMsg->emtc_config.prach_ce_level_2_starting_subframe_periodicity, &unpack_uint16_tlv_value},
+    { NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_2_HOPPING_ENABLE_TAG, &pNfapiMsg->emtc_config.prach_ce_level_2_hopping_enable, &unpack_uint16_tlv_value},
+    { NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_2_HOPPING_OFFSET_TAG, &pNfapiMsg->emtc_config.prach_ce_level_2_hopping_offset, &unpack_uint16_tlv_value},
+    { NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_3_ENABLE_TAG, &pNfapiMsg->emtc_config.prach_ce_level_3_enable, &unpack_uint16_tlv_value},
+    { NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_3_CONFIGURATION_INDEX_TAG, &pNfapiMsg->emtc_config.prach_ce_level_3_configuration_index, &unpack_uint16_tlv_value},
+    { NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_3_FREQUENCY_OFFSET_TAG, &pNfapiMsg->emtc_config.prach_ce_level_3_frequency_offset, &unpack_uint16_tlv_value},
+    { NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_3_NUMBER_OF_REPETITIONS_PER_ATTEMPT_TAG, &pNfapiMsg->emtc_config.prach_ce_level_3_number_of_repetitions_per_attempt, &unpack_uint16_tlv_value},
+    { NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_3_STARTING_SUBFRAME_PERIODICITY_TAG, &pNfapiMsg->emtc_config.prach_ce_level_3_starting_subframe_periodicity, &unpack_uint16_tlv_value},
+    { NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_3_HOPPING_ENABLE_TAG, &pNfapiMsg->emtc_config.prach_ce_level_3_hopping_enable, &unpack_uint16_tlv_value},
+    { NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_3_HOPPING_OFFSET_TAG, &pNfapiMsg->emtc_config.prach_ce_level_3_hopping_offset, &unpack_uint16_tlv_value},
+    { NFAPI_EMTC_CONFIG_PUCCH_INTERVAL_ULHOPPINGCONFIGCOMMONMODEA_TAG, &pNfapiMsg->emtc_config.pucch_interval_ulhoppingconfigcommonmodea, &unpack_uint16_tlv_value},
+    { NFAPI_EMTC_CONFIG_PUCCH_INTERVAL_ULHOPPINGCONFIGCOMMONMODEB_TAG, &pNfapiMsg->emtc_config.pucch_interval_ulhoppingconfigcommonmodeb, &unpack_uint16_tlv_value},
+
+    { NFAPI_TDD_FRAME_STRUCTURE_SUBFRAME_ASSIGNMENT_TAG, &pNfapiMsg->tdd_frame_structure_config.subframe_assignment, &unpack_uint16_tlv_value},
+    { NFAPI_TDD_FRAME_STRUCTURE_SPECIAL_SUBFRAME_PATTERNS_TAG, &pNfapiMsg->tdd_frame_structure_config.special_subframe_patterns, &unpack_uint16_tlv_value},
+
+    { NFAPI_L23_CONFIG_DATA_REPORT_MODE_TAG, &pNfapiMsg->l23_config.data_report_mode, &unpack_uint16_tlv_value},
+    { NFAPI_L23_CONFIG_SFNSF_TAG, &pNfapiMsg->l23_config.sfnsf, &unpack_uint16_tlv_value},
+
+    { NFAPI_NFAPI_P7_VNF_ADDRESS_IPV4_TAG, &pNfapiMsg->nfapi_config.p7_vnf_address_ipv4, &unpack_ipv4_address_value},
+    { NFAPI_NFAPI_P7_VNF_ADDRESS_IPV6_TAG, &pNfapiMsg->nfapi_config.p7_vnf_address_ipv6, &unpack_ipv6_address_value},
+    { NFAPI_NFAPI_P7_VNF_PORT_TAG, &pNfapiMsg->nfapi_config.p7_vnf_port, &unpack_uint16_tlv_value},
+    { NFAPI_NFAPI_P7_PNF_ADDRESS_IPV4_TAG, &pNfapiMsg->nfapi_config.p7_pnf_address_ipv4, &unpack_ipv4_address_value},
+    { NFAPI_NFAPI_P7_PNF_ADDRESS_IPV6_TAG, &pNfapiMsg->nfapi_config.p7_pnf_address_ipv6, &unpack_ipv6_address_value},
+    { NFAPI_NFAPI_P7_PNF_PORT_TAG, &pNfapiMsg->nfapi_config.p7_pnf_port, &unpack_uint16_tlv_value},
+    { NFAPI_NFAPI_DOWNLINK_UES_PER_SUBFRAME_TAG, &pNfapiMsg->nfapi_config.dl_ue_per_sf, &unpack_uint8_tlv_value},
+    { NFAPI_NFAPI_UPLINK_UES_PER_SUBFRAME_TAG, &pNfapiMsg->nfapi_config.ul_ue_per_sf, &unpack_uint8_tlv_value},
+    { NFAPI_NFAPI_RF_BANDS_TAG, &pNfapiMsg->nfapi_config.rf_bands, &unpack_rf_bands_value},
+    { NFAPI_NFAPI_TIMING_WINDOW_TAG, &pNfapiMsg->nfapi_config.timing_window, &unpack_uint8_tlv_value},
+    { NFAPI_NFAPI_TIMING_INFO_MODE_TAG, &pNfapiMsg->nfapi_config.timing_info_mode, &unpack_uint8_tlv_value},
+    { NFAPI_NFAPI_TIMING_INFO_PERIOD_TAG, &pNfapiMsg->nfapi_config.timing_info_period, &unpack_uint8_tlv_value},
+    { NFAPI_NFAPI_MAXIMUM_TRANSMIT_POWER_TAG, &pNfapiMsg->nfapi_config.max_transmit_power, &unpack_uint16_tlv_value},
+    { NFAPI_NFAPI_EARFCN_TAG, &pNfapiMsg->nfapi_config.earfcn, &unpack_uint16_tlv_value},
+    { NFAPI_NFAPI_NMM_GSM_FREQUENCY_BANDS_TAG, &pNfapiMsg->nfapi_config.nmm_gsm_frequency_bands, &unpack_nmm_frequency_bands_value},
+    { NFAPI_NFAPI_NMM_UMTS_FREQUENCY_BANDS_TAG, &pNfapiMsg->nfapi_config.nmm_umts_frequency_bands, &unpack_nmm_frequency_bands_value},
+    { NFAPI_NFAPI_NMM_LTE_FREQUENCY_BANDS_TAG, &pNfapiMsg->nfapi_config.nmm_lte_frequency_bands, &unpack_nmm_frequency_bands_value},
+    { NFAPI_NFAPI_NMM_UPLINK_RSSI_SUPPORTED_TAG, &pNfapiMsg->nfapi_config.nmm_uplink_rssi_supported, &unpack_uint8_tlv_value},
+
+  };
+  return ( pull8(ppReadPackedMsg, &pNfapiMsg->num_tlv, end) &&
+           unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, end, config, &pNfapiMsg->vendor_extension));
+}
+static uint8_t unpack_nr_config_request(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p4_p5_codec_config_t* config)
+{
+	nfapi_nr_config_request_scf_t *pNfapiMsg = (nfapi_nr_config_request_scf_t*)msg;
+
+	pNfapiMsg->tdd_table.max_tdd_periodicity_list = (nfapi_nr_max_tdd_periodicity_t*) malloc(40*sizeof(nfapi_nr_max_tdd_periodicity_t));
+
+	for(int i=0;i<40;i++)
+		pNfapiMsg->tdd_table.max_tdd_periodicity_list[i].max_num_of_symbol_per_slot_list = (nfapi_nr_max_num_of_symbol_per_slot_t*) malloc(14*sizeof(nfapi_nr_max_num_of_symbol_per_slot_t));
+
+    pNfapiMsg->prach_config.num_prach_fd_occasions_list=(nfapi_nr_num_prach_fd_occasions_t *) malloc(sizeof(nfapi_nr_num_prach_fd_occasions_t));
+
+	for(int i = 0; i < 40; i++){ //unpacking tdd slot config
+		for(int symbol = 0; symbol<14;symbol++){
+			pull8(ppReadPackedMsg,&pNfapiMsg->tdd_table.max_tdd_periodicity_list[i].max_num_of_symbol_per_slot_list[symbol].slot_config.value, end);
+		}
+	}
+	unpack_tlv_t unpack_fns[] =
+	{
+		{ NFAPI_NR_CONFIG_DL_BANDWIDTH_TAG,  &(pNfapiMsg->carrier_config.dl_bandwidth),  &unpack_uint16_tlv_value},
+		{ NFAPI_NR_CONFIG_DL_FREQUENCY_TAG,  &(pNfapiMsg->carrier_config.dl_frequency),  &unpack_uint32_tlv_value},
+		{ NFAPI_NR_CONFIG_DL_GRID_SIZE_TAG,  &(pNfapiMsg->carrier_config.dl_grid_size[1]),  &unpack_uint16_tlv_value},
+		{ NFAPI_NR_CONFIG_DL_K0_TAG,  &(pNfapiMsg->carrier_config.dl_k0[1]),  &unpack_uint16_tlv_value},
+		{ NFAPI_NR_CONFIG_NUM_RX_ANT_TAG,  &(pNfapiMsg->carrier_config.num_rx_ant),  &unpack_uint16_tlv_value},
+		{ NFAPI_NR_CONFIG_NUM_TX_ANT_TAG,  &(pNfapiMsg->carrier_config.num_tx_ant),  &unpack_uint16_tlv_value},
+		{ NFAPI_NR_CONFIG_UL_GRID_SIZE_TAG,  &(pNfapiMsg->carrier_config.ul_grid_size[1]),  &unpack_uint16_tlv_value},
+		{ NFAPI_NR_CONFIG_UL_K0_TAG,  &(pNfapiMsg->carrier_config.ul_k0[1]),  &unpack_uint16_tlv_value},
+		{ NFAPI_NR_CONFIG_UPLINK_BANDWIDTH_TAG,  &(pNfapiMsg->carrier_config.uplink_bandwidth),  &unpack_uint16_tlv_value},
+		{ NFAPI_NR_CONFIG_UPLINK_FREQUENCY_TAG,  &(pNfapiMsg->carrier_config.uplink_frequency),  &unpack_uint32_tlv_value},
+		{ NFAPI_NR_CONFIG_FRAME_DUPLEX_TYPE_TAG,  &(pNfapiMsg->cell_config.frame_duplex_type),  &unpack_uint8_tlv_value},
+		{ NFAPI_NR_CONFIG_PHY_CELL_ID_TAG,  &(pNfapiMsg->cell_config.phy_cell_id),  &unpack_uint8_tlv_value},
+		{ NFAPI_NR_CONFIG_NUM_PRACH_FD_OCCASIONS_TAG,  &(pNfapiMsg->prach_config.num_prach_fd_occasions),  &unpack_uint8_tlv_value},
+		{ NFAPI_NR_CONFIG_PRACH_SEQUENCE_LENGTH_TAG,  &(pNfapiMsg->prach_config.prach_sequence_length),  &unpack_uint8_tlv_value},
+		{ NFAPI_NR_CONFIG_RESTRICTED_SET_CONFIG_TAG,  &(pNfapiMsg->prach_config.restricted_set_config),  &unpack_uint8_tlv_value},
+		{ NFAPI_NR_CONFIG_SSB_PER_RACH_TAG,  &(pNfapiMsg->prach_config.ssb_per_rach),  &unpack_uint8_tlv_value},
+		{ NFAPI_NR_CONFIG_PRACH_SUB_C_SPACING_TAG,  &(pNfapiMsg->prach_config.prach_sub_c_spacing),  &unpack_uint8_tlv_value},
+		{ NFAPI_NR_CONFIG_PRACH_ROOT_SEQUENCE_INDEX_TAG,  &(pNfapiMsg->prach_config.num_prach_fd_occasions_list[0].prach_root_sequence_index),  &unpack_uint16_tlv_value},
+		{ NFAPI_NR_CONFIG_K1_TAG,  &(pNfapiMsg->prach_config.num_prach_fd_occasions_list[0].k1),  &unpack_uint16_tlv_value},
+		{ NFAPI_NR_CONFIG_PRACH_ZERO_CORR_CONF_TAG,  &(pNfapiMsg->prach_config.num_prach_fd_occasions_list[0].prach_zero_corr_conf),  &unpack_uint8_tlv_value},
+		{ NFAPI_NR_CONFIG_NUM_ROOT_SEQUENCES_TAG,  &(pNfapiMsg->prach_config.num_prach_fd_occasions_list[0].num_root_sequences),  &unpack_uint8_tlv_value},
+
+		{ NFAPI_NR_CONFIG_SCS_COMMON_TAG,  &(pNfapiMsg->ssb_config.scs_common),  &unpack_uint8_tlv_value},
+		{ NFAPI_NR_CONFIG_SS_PBCH_POWER_TAG,  &(pNfapiMsg->ssb_config.ss_pbch_power),  &unpack_uint32_tlv_value},
+		{ NFAPI_NR_CONFIG_BETA_PSS_TAG,  &(pNfapiMsg->ssb_table.beta_pss),  &unpack_uint8_tlv_value},
+		{ NFAPI_NR_CONFIG_MIB_TAG,  &(pNfapiMsg->ssb_table.MIB),  &unpack_uint32_tlv_value},
+		{ NFAPI_NR_CONFIG_SSB_MASK_TAG,  &(pNfapiMsg->ssb_table.ssb_mask_list[0].ssb_mask),  &unpack_uint32_tlv_value},
+		{ NFAPI_NR_CONFIG_SSB_MASK_TAG,  &(pNfapiMsg->ssb_table.ssb_mask_list[1].ssb_mask),  &unpack_uint32_tlv_value},
+
+		{ NFAPI_NR_CONFIG_SSB_OFFSET_POINT_A_TAG,  &(pNfapiMsg->ssb_table.ssb_offset_point_a),  &unpack_uint16_tlv_value},
+		{ NFAPI_NR_CONFIG_SSB_PERIOD_TAG,  &(pNfapiMsg->ssb_table.ssb_period),  &unpack_uint8_tlv_value},
+		{ NFAPI_NR_CONFIG_SSB_SUBCARRIER_OFFSET_TAG,  &(pNfapiMsg->ssb_table.ssb_subcarrier_offset),  &unpack_uint8_tlv_value},
+		{ NFAPI_NR_CONFIG_TDD_PERIOD_TAG,  &(pNfapiMsg->tdd_table.tdd_period),  &unpack_uint8_tlv_value},
+		{ NFAPI_NR_NFAPI_P7_PNF_ADDRESS_IPV6_TAG,  &(pNfapiMsg->nfapi_config.p7_pnf_address_ipv6),  &unpack_ipv6_address_value},
+		{ NFAPI_NR_NFAPI_P7_PNF_PORT_TAG,  &(pNfapiMsg->nfapi_config.p7_pnf_port),  &unpack_uint16_tlv_value},
+		{ NFAPI_NR_NFAPI_P7_VNF_ADDRESS_IPV4_TAG,  &(pNfapiMsg->nfapi_config.p7_vnf_address_ipv4),  &unpack_ipv4_address_value},
+		{ NFAPI_NR_NFAPI_P7_VNF_ADDRESS_IPV6_TAG,  &(pNfapiMsg->nfapi_config.p7_vnf_address_ipv6),  &unpack_ipv6_address_value},
+		{ NFAPI_NR_NFAPI_P7_VNF_PORT_TAG,  &(pNfapiMsg->nfapi_config.p7_vnf_port),  &unpack_uint16_tlv_value},
+		{ NFAPI_NR_NFAPI_TIMING_INFO_MODE_TAG,  &(pNfapiMsg->nfapi_config.timing_info_mode),  &unpack_uint8_tlv_value},
+		{ NFAPI_NR_NFAPI_TIMING_INFO_PERIOD_TAG,  &(pNfapiMsg->nfapi_config.timing_info_period),  &unpack_uint8_tlv_value},
+		{ NFAPI_NR_NFAPI_TIMING_WINDOW_TAG,  &(pNfapiMsg->nfapi_config.timing_window),  &unpack_uint8_tlv_value},
+	};
+
+	return ( pull8(ppReadPackedMsg, &pNfapiMsg->num_tlv, end) &&
+			 unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, end, config, &pNfapiMsg->vendor_extension));
+
+}
+
+static uint8_t unpack_config_response(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p4_p5_codec_config_t *config) {
+  nfapi_config_response_t *pNfapiMsg = (nfapi_config_response_t *)msg;
+  return ( pull32(ppReadPackedMsg, &pNfapiMsg->error_code, end) &&
+           unpack_tlv_list(NULL, 0, ppReadPackedMsg, end, config, &(pNfapiMsg->vendor_extension)));
+}
+
+static uint8_t unpack_nr_config_response(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p4_p5_codec_config_t *config) {
+  nfapi_nr_config_response_scf_t *pNfapiMsg = (nfapi_nr_config_response_scf_t *)msg;
+  return ( pull8(ppReadPackedMsg, &pNfapiMsg->error_code, end) &&
+           unpack_tlv_list(NULL, 0, ppReadPackedMsg, end, config, &(pNfapiMsg->vendor_extension)));
+}
+
+static uint8_t unpack_nr_start_request(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p4_p5_codec_config_t *config) {
+  nfapi_nr_start_request_scf_t *pNfapiMsg = ( nfapi_nr_start_request_scf_t *)msg;
+  return unpack_tlv_list(NULL, 0, ppReadPackedMsg, end, config, &(pNfapiMsg->vendor_extension));
+}
+
+static uint8_t unpack_start_request(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p4_p5_codec_config_t *config) {
+  nfapi_start_request_t *pNfapiMsg = ( nfapi_start_request_t *)msg;
+  return unpack_tlv_list(NULL, 0, ppReadPackedMsg, end, config, &(pNfapiMsg->vendor_extension));
+}
+
+static uint8_t unpack_start_response(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p4_p5_codec_config_t *config) {
+  nfapi_start_response_t *pNfapiMsg = (nfapi_start_response_t *)msg;
+  return ( pull32(ppReadPackedMsg, &pNfapiMsg->error_code, end) &&
+           unpack_tlv_list(NULL, 0, ppReadPackedMsg, end, config, &(pNfapiMsg->vendor_extension)));
+}
+
+static uint8_t unpack_nr_start_response(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p4_p5_codec_config_t *config) {
+  nfapi_nr_start_response_scf_t *pNfapiMsg = (nfapi_nr_start_response_scf_t *)msg;
+  return ( pull32(ppReadPackedMsg, &pNfapiMsg->error_code, end) &&
+           unpack_tlv_list(NULL, 0, ppReadPackedMsg, end, config, &(pNfapiMsg->vendor_extension)));
+}
+
+static uint8_t unpack_stop_request(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p4_p5_codec_config_t *config) {
+  nfapi_stop_request_t *pNfapiMsg = (nfapi_stop_request_t *)msg;
+  return unpack_tlv_list(NULL, 0, ppReadPackedMsg, end, config, &(pNfapiMsg->vendor_extension));
+}
+
+static uint8_t unpack_stop_response(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p4_p5_codec_config_t *config) {
+  nfapi_stop_response_t *pNfapiMsg = (nfapi_stop_response_t *)msg;
+  return ( pull32(ppReadPackedMsg, &pNfapiMsg->error_code, end) &&
+           unpack_tlv_list(NULL, 0, ppReadPackedMsg, end, config, &(pNfapiMsg->vendor_extension)));
+}
+static uint8_t unpack_measurement_request(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p4_p5_codec_config_t *config) {
+  nfapi_measurement_request_t *pNfapiMsg = (nfapi_measurement_request_t *)msg;
+  unpack_tlv_t unpack_fns[] = {
+    { NFAPI_MEASUREMENT_REQUEST_DL_RS_XTX_POWER_TAG, &pNfapiMsg->dl_rs_tx_power, &unpack_uint16_tlv_value},
+    { NFAPI_MEASUREMENT_REQUEST_RECEIVED_INTERFERENCE_POWER_TAG, &pNfapiMsg->received_interference_power, &unpack_uint16_tlv_value},
+    { NFAPI_MEASUREMENT_REQUEST_THERMAL_NOISE_POWER_TAG, &pNfapiMsg->thermal_noise_power, &unpack_uint16_tlv_value},
+  };
+  return unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, end, config, &(pNfapiMsg->vendor_extension));
+}
+
+static uint8_t unpack_received_interference_power_measurement_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_received_interference_power_measurement_t *value = (nfapi_received_interference_power_measurement_t *)tlv;
+  return ( pull16(ppReadPackedMsg, &value->number_of_resource_blocks, end) &&
+           pullarrays16(ppReadPackedMsg, value->received_interference_power,  NFAPI_MAX_RECEIVED_INTERFERENCE_POWER_RESULTS, value->number_of_resource_blocks, end));
+}
+
+
+static uint8_t unpack_measurement_response(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p4_p5_codec_config_t *config) {
+  nfapi_measurement_response_t *pNfapiMsg = (nfapi_measurement_response_t *)msg;
+  unpack_tlv_t unpack_fns[] = {
+    { NFAPI_MEASUREMENT_RESPONSE_DL_RS_POWER_MEASUREMENT_TAG, &pNfapiMsg->dl_rs_tx_power_measurement, &unpack_int16_tlv_value},
+    { NFAPI_MEASUREMENT_RESPONSE_RECEIVED_INTERFERENCE_POWER_MEASUREMENT_TAG, &pNfapiMsg->received_interference_power_measurement, &unpack_received_interference_power_measurement_value},
+    { NFAPI_MEASUREMENT_RESPONSE_THERMAL_NOISE_MEASUREMENT_TAG, &pNfapiMsg->thermal_noise_power_measurement, &unpack_int16_tlv_value},
+  };
+  return ( pull32(ppReadPackedMsg, &pNfapiMsg->error_code, end) &&
+           unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, end, config, &pNfapiMsg->vendor_extension));
+}
+
+// unpack length check
+
+static int check_nr_unpack_length(nfapi_nr_phy_msg_type_e msgId, uint32_t unpackedBufLen) {
+  int retLen = 0;
+
+  switch (msgId) {
+    case NFAPI_NR_PHY_MSG_TYPE_PNF_PARAM_REQUEST:
+      if (unpackedBufLen >= sizeof(nfapi_pnf_param_request_t))
+        retLen = sizeof(nfapi_pnf_param_request_t);
+
+      break;
+
+    case NFAPI_NR_PHY_MSG_TYPE_PNF_PARAM_RESPONSE:
+      if (unpackedBufLen >= sizeof(nfapi_nr_pnf_param_response_t))
+        retLen = sizeof(nfapi_nr_pnf_param_response_t);
+
+      break;
+
+    case NFAPI_NR_PHY_MSG_TYPE_PNF_CONFIG_REQUEST:
+      if (unpackedBufLen >= sizeof(nfapi_nr_pnf_config_request_t))
+        retLen = sizeof(nfapi_nr_pnf_config_request_t);
+
+      break;
+
+    case NFAPI_NR_PHY_MSG_TYPE_PNF_CONFIG_RESPONSE:
+      if (unpackedBufLen >= sizeof(nfapi_nr_pnf_config_response_t))
+        retLen = sizeof(nfapi_nr_pnf_config_response_t);
+
+      break;
+
+    case NFAPI_NR_PHY_MSG_TYPE_PNF_START_REQUEST:
+      if (unpackedBufLen >= sizeof(nfapi_nr_pnf_start_request_t))
+        retLen = sizeof(nfapi_nr_pnf_start_request_t);
+
+      break;
+
+    case NFAPI_NR_PHY_MSG_TYPE_PNF_START_RESPONSE:
+      if (unpackedBufLen >= sizeof(nfapi_nr_pnf_start_response_t))
+        retLen = sizeof(nfapi_nr_pnf_start_response_t);
+
+      break;
+
+    case NFAPI_NR_PHY_MSG_TYPE_PNF_STOP_REQUEST:
+      if (unpackedBufLen >= sizeof(nfapi_nr_pnf_stop_request_t))
+        retLen = sizeof(nfapi_nr_pnf_stop_request_t);
+
+      break;
+
+    case NFAPI_NR_PHY_MSG_TYPE_PNF_STOP_RESPONSE:
+      if (unpackedBufLen >= sizeof(nfapi_nr_pnf_stop_response_t))
+        retLen = sizeof(nfapi_nr_pnf_stop_response_t);
+
+      break;
+
+    case NFAPI_NR_PHY_MSG_TYPE_PARAM_REQUEST:
+      if (unpackedBufLen >= sizeof(nfapi_nr_param_request_scf_t))
+        retLen = sizeof(nfapi_nr_param_request_scf_t);
+
+      break;
+
+    case NFAPI_NR_PHY_MSG_TYPE_PARAM_RESPONSE:
+      if (unpackedBufLen >= sizeof(nfapi_nr_param_response_scf_t))
+        retLen = sizeof(nfapi_nr_param_response_scf_t);
+
+      break;
+
+    case NFAPI_NR_PHY_MSG_TYPE_CONFIG_REQUEST:
+      if (unpackedBufLen >= sizeof(nfapi_nr_config_request_scf_t))
+        retLen = sizeof(nfapi_nr_config_request_scf_t);
+
+      break;
+
+    case NFAPI_NR_PHY_MSG_TYPE_CONFIG_RESPONSE:
+      if (unpackedBufLen >= sizeof(nfapi_nr_config_response_scf_t))
+        retLen = sizeof(nfapi_nr_config_response_scf_t);
+
+      break;
+
+    case NFAPI_NR_PHY_MSG_TYPE_START_REQUEST:
+      if (unpackedBufLen >= sizeof( nfapi_nr_start_request_scf_t))
+        retLen = sizeof( nfapi_nr_start_request_scf_t);
+
+      break;
+
+    case NFAPI_NR_PHY_MSG_TYPE_START_RESPONSE:
+      if (unpackedBufLen >= sizeof(nfapi_nr_start_response_scf_t))
+        retLen = sizeof(nfapi_nr_start_response_scf_t);
+
+      break;
+
+    case NFAPI_NR_PHY_MSG_TYPE_STOP_REQUEST:
+      if (unpackedBufLen >= sizeof(nfapi_stop_request_t))
+        retLen = sizeof(nfapi_stop_request_t);
+
+      break;
+
+    case NFAPI_NR_PHY_MSG_TYPE_STOP_RESPONSE:
+      if (unpackedBufLen >= sizeof(nfapi_stop_response_t))
+        retLen = sizeof(nfapi_stop_response_t);
+
+      break;
+
+    default:
+      NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s Unknown message ID %d\n", __FUNCTION__, msgId);
+      break;
+  }
+
+  return retLen;
+}
+
+
+static int check_unpack_length(nfapi_message_id_e msgId, uint32_t unpackedBufLen) {
+  int retLen = 0;
+
+  switch (msgId) {
+    case NFAPI_PNF_PARAM_REQUEST:
+      if (unpackedBufLen >= sizeof(nfapi_pnf_param_request_t))
+        retLen = sizeof(nfapi_pnf_param_request_t);
+
+      break;
+
+    case NFAPI_PNF_PARAM_RESPONSE:
+      if (unpackedBufLen >= sizeof(nfapi_pnf_param_response_t))
+        retLen = sizeof(nfapi_pnf_param_response_t);
+
+      break;
+
+    case NFAPI_PNF_CONFIG_REQUEST:
+      if (unpackedBufLen >= sizeof(nfapi_pnf_config_request_t))
+        retLen = sizeof(nfapi_pnf_config_request_t);
+
+      break;
+
+    case NFAPI_PNF_CONFIG_RESPONSE:
+      if (unpackedBufLen >= sizeof(nfapi_pnf_config_response_t))
+        retLen = sizeof(nfapi_pnf_config_response_t);
+
+      break;
+
+    case NFAPI_PNF_START_REQUEST:
+      if (unpackedBufLen >= sizeof(nfapi_pnf_start_request_t))
+        retLen = sizeof(nfapi_pnf_start_request_t);
+
+      break;
+
+    case NFAPI_PNF_START_RESPONSE:
+      if (unpackedBufLen >= sizeof(nfapi_pnf_start_response_t))
+        retLen = sizeof(nfapi_pnf_start_response_t);
+
+      break;
+
+    case NFAPI_PNF_STOP_REQUEST:
+      if (unpackedBufLen >= sizeof(nfapi_pnf_stop_request_t))
+        retLen = sizeof(nfapi_pnf_stop_request_t);
+
+      break;
+
+    case NFAPI_PNF_STOP_RESPONSE:
+      if (unpackedBufLen >= sizeof(nfapi_pnf_stop_response_t))
+        retLen = sizeof(nfapi_pnf_stop_response_t);
+
+      break;
+
+    case NFAPI_PARAM_REQUEST:
+      if (unpackedBufLen >= sizeof(nfapi_param_request_t))
+        retLen = sizeof(nfapi_param_request_t);
+
+      break;
+
+    case NFAPI_PARAM_RESPONSE:
+      if (unpackedBufLen >= sizeof(nfapi_param_response_t))
+        retLen = sizeof(nfapi_param_response_t);
+
+      break;
+
+    case NFAPI_CONFIG_REQUEST:
+      if (unpackedBufLen >= sizeof(nfapi_config_request_t))
+        retLen = sizeof(nfapi_config_request_t);
+
+      break;
+
+    case NFAPI_CONFIG_RESPONSE:
+      if (unpackedBufLen >= sizeof(nfapi_config_response_t))
+        retLen = sizeof(nfapi_config_response_t);
+
+      break;
+
+    case NFAPI_START_REQUEST:
+      if (unpackedBufLen >= sizeof( nfapi_start_request_t))
+        retLen = sizeof( nfapi_start_request_t);
+
+      break;
+
+    case NFAPI_START_RESPONSE:
+      if (unpackedBufLen >= sizeof(nfapi_start_response_t))
+        retLen = sizeof(nfapi_start_response_t);
+
+      break;
+
+    case NFAPI_STOP_REQUEST:
+      if (unpackedBufLen >= sizeof(nfapi_stop_request_t))
+        retLen = sizeof(nfapi_stop_request_t);
+
+      break;
+
+    case NFAPI_STOP_RESPONSE:
+      if (unpackedBufLen >= sizeof(nfapi_stop_response_t))
+        retLen = sizeof(nfapi_stop_response_t);
+
+      break;
+
+    case NFAPI_MEASUREMENT_REQUEST:
+      if (unpackedBufLen >= sizeof(nfapi_measurement_request_t))
+        retLen = sizeof(nfapi_measurement_request_t);
+
+      break;
+
+    case NFAPI_MEASUREMENT_RESPONSE:
+      if (unpackedBufLen >= sizeof(nfapi_measurement_response_t))
+        retLen = sizeof(nfapi_measurement_response_t);
+
+      break;
+
+    default:
+      NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s Unknown message ID %d\n", __FUNCTION__, msgId);
+      break;
+  }
+
+  return retLen;
+}
+
+
+// Main unpack functions - public
+
+int nfapi_p5_message_header_unpack(void *pMessageBuf, uint32_t messageBufLen, void *pUnpackedBuf, uint32_t unpackedBufLen, nfapi_p4_p5_codec_config_t *config) {
+  nfapi_p4_p5_message_header_t *pMessageHeader = pUnpackedBuf;
+  uint8_t *pReadPackedMessage = pMessageBuf;
+  uint8_t *end = pMessageBuf + messageBufLen;
+
+  if (pMessageBuf == NULL || pUnpackedBuf == NULL) {
+    NFAPI_TRACE(NFAPI_TRACE_ERROR, "P5 header unpack supplied pointers are null\n");
+    return -1;
+  }
+
+  if (messageBufLen < NFAPI_HEADER_LENGTH || unpackedBufLen < sizeof(nfapi_p4_p5_message_header_t)) {
+    NFAPI_TRACE(NFAPI_TRACE_ERROR, "P5 header unpack supplied message buffer is too small %d, %d\n", messageBufLen, unpackedBufLen);
+    return -1;
+  }
+
+  // process the header
+  return ( pull16(&pReadPackedMessage, &pMessageHeader->phy_id, end) &&
+           pull16(&pReadPackedMessage, &pMessageHeader->message_id, end) &&
+           pull16(&pReadPackedMessage, &pMessageHeader->message_length, end) &&
+           pull16(&pReadPackedMessage, &pMessageHeader->spare, end) );
+}
+
+int nfapi_nr_p5_message_unpack(void *pMessageBuf, uint32_t messageBufLen, void *pUnpackedBuf, uint32_t unpackedBufLen, nfapi_p4_p5_codec_config_t *config) {
+  nfapi_p4_p5_message_header_t *pMessageHeader = pUnpackedBuf;
+  uint8_t *pReadPackedMessage = pMessageBuf;
+  uint8_t *end = pMessageBuf + messageBufLen;
+
+  if (pMessageBuf == NULL || pUnpackedBuf == NULL) {
+    NFAPI_TRACE(NFAPI_TRACE_ERROR, "P5 unpack supplied pointers are null\n");
+    return -1;
+  }
+
+  if (messageBufLen < NFAPI_HEADER_LENGTH || unpackedBufLen < sizeof(nfapi_p4_p5_message_header_t)) {
+    NFAPI_TRACE(NFAPI_TRACE_ERROR, "P5 unpack supplied message buffer is too small %d, %d\n", messageBufLen, unpackedBufLen);
+    return -1;
+  }
+
+  uint8_t *ptr = pReadPackedMessage;
+  printf("\n Read message unpack: ");
+
+  while(ptr < end) {
+    printf(" %d ", *ptr);
+    ptr++;
+  }
+
+  printf("\n");
+  // clean the supplied buffer for - tag value blanking
+  (void)memset(pUnpackedBuf, 0, unpackedBufLen);
+
+  // process the header
+  if( !(pull16(&pReadPackedMessage, &pMessageHeader->phy_id, end ) &&
+        pull16(&pReadPackedMessage, &pMessageHeader->message_id, end) &&
+        pull16(&pReadPackedMessage, &pMessageHeader->message_length, end) &&
+        pull16(&pReadPackedMessage, &pMessageHeader->spare, end))) {
+    // failed to read the header
+    return -1;
+  }
+
+  int result = -1;
+
+  if(check_nr_unpack_length(pMessageHeader->message_id, unpackedBufLen) == 0) {
+    // the unpack buffer is not big enough for the struct
+    return -1;
+  }
+
+  // look for the specific message
+  switch (pMessageHeader->message_id) {
+    case NFAPI_NR_PHY_MSG_TYPE_PNF_PARAM_REQUEST:
+      result = unpack_nr_pnf_param_request(&pReadPackedMessage, end, pMessageHeader, config);
+      break;
+
+    case NFAPI_NR_PHY_MSG_TYPE_PNF_PARAM_RESPONSE:
+      result = unpack_nr_pnf_param_response(&pReadPackedMessage, end, pMessageHeader, config);
+      break;
+
+    case NFAPI_NR_PHY_MSG_TYPE_PNF_CONFIG_REQUEST:
+      result = unpack_nr_pnf_config_request(&pReadPackedMessage, end, pMessageHeader, config);
+      break;
+
+    case NFAPI_NR_PHY_MSG_TYPE_PNF_CONFIG_RESPONSE:
+      result = unpack_nr_pnf_config_response(&pReadPackedMessage, end, pMessageHeader, config);
+      break;
+
+    case NFAPI_NR_PHY_MSG_TYPE_PNF_START_REQUEST:
+      result = unpack_nr_pnf_start_request(&pReadPackedMessage, end, pMessageHeader, config);
+      break;
+
+    case NFAPI_NR_PHY_MSG_TYPE_PNF_START_RESPONSE:
+      result = unpack_nr_pnf_start_response(&pReadPackedMessage, end, pMessageHeader, config);
+      break;
+
+    case NFAPI_NR_PHY_MSG_TYPE_PNF_STOP_REQUEST:
+      result = unpack_pnf_stop_request(&pReadPackedMessage, end, pMessageHeader, config);
+      break;
+
+    case NFAPI_NR_PHY_MSG_TYPE_PNF_STOP_RESPONSE:
+      result = unpack_pnf_stop_response(&pReadPackedMessage, end, pMessageHeader, config);
+      break;
+
+    case NFAPI_NR_PHY_MSG_TYPE_PARAM_REQUEST:
+      result = unpack_nr_param_request(&pReadPackedMessage, end, pMessageHeader, config);
+      break;
+
+    case NFAPI_NR_PHY_MSG_TYPE_PARAM_RESPONSE:
+      result = unpack_nr_param_response(&pReadPackedMessage, end, pMessageHeader, config);
+      break;
+
+    case NFAPI_NR_PHY_MSG_TYPE_CONFIG_REQUEST:
+      result = unpack_nr_config_request(&pReadPackedMessage, end, pMessageHeader, config);
+      break;
+
+    case NFAPI_NR_PHY_MSG_TYPE_CONFIG_RESPONSE:
+      result = unpack_nr_config_response(&pReadPackedMessage, end, pMessageHeader, config);
+      break;
+
+    case NFAPI_NR_PHY_MSG_TYPE_START_REQUEST:
+      result = unpack_nr_start_request(&pReadPackedMessage, end, pMessageHeader, config);
+      break;
+
+    case NFAPI_NR_PHY_MSG_TYPE_START_RESPONSE:
+      result = unpack_nr_start_response(&pReadPackedMessage, end, pMessageHeader, config);
+      break;
+
+    case NFAPI_NR_PHY_MSG_TYPE_STOP_REQUEST:
+      result = unpack_stop_request(&pReadPackedMessage, end, pMessageHeader, config);
+      break;
+
+    case NFAPI_NR_PHY_MSG_TYPE_STOP_RESPONSE:
+      result = unpack_stop_response(&pReadPackedMessage, end, pMessageHeader, config);
+      break;
+
+    case NFAPI_MEASUREMENT_REQUEST:
+      result = unpack_measurement_request(&pReadPackedMessage, end, pMessageHeader, config);
+      break;
+
+    case NFAPI_MEASUREMENT_RESPONSE:
+      result = unpack_measurement_response(&pReadPackedMessage, end, pMessageHeader, config);
+      break;
+
+    default:
+      if(pMessageHeader->message_id >= NFAPI_VENDOR_EXT_MSG_MIN &&
+          pMessageHeader->message_id <= NFAPI_VENDOR_EXT_MSG_MAX) {
+        if(config && config->unpack_p4_p5_vendor_extension) {
+          result = (config->unpack_p4_p5_vendor_extension)(pMessageHeader, &pReadPackedMessage, end, config);
+        } else {
+          NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s VE NFAPI message ID %d. No ve decoder provided\n", __FUNCTION__, pMessageHeader->message_id);
+        }
+      } else {
+        NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s NFAPI Unknown P5 message ID %d\n", __FUNCTION__, pMessageHeader->message_id);
+      }
+
+      break;
+  }
+
+  return result;
+}
+
+int nfapi_p5_message_unpack(void *pMessageBuf, uint32_t messageBufLen, void *pUnpackedBuf, uint32_t unpackedBufLen, nfapi_p4_p5_codec_config_t *config) {
+  nfapi_p4_p5_message_header_t *pMessageHeader = pUnpackedBuf;
+  uint8_t *pReadPackedMessage = pMessageBuf;
+  uint8_t *end = pMessageBuf + messageBufLen;
+
+  if (pMessageBuf == NULL || pUnpackedBuf == NULL) {
+    NFAPI_TRACE(NFAPI_TRACE_ERROR, "P5 unpack supplied pointers are null\n");
+    return -1;
+  }
+
+  if (messageBufLen < NFAPI_HEADER_LENGTH || unpackedBufLen < sizeof(nfapi_p4_p5_message_header_t)) {
+    NFAPI_TRACE(NFAPI_TRACE_ERROR, "P5 unpack supplied message buffer is too small %d, %d\n", messageBufLen, unpackedBufLen);
+    return -1;
+  }
+
+  uint8_t *ptr = pReadPackedMessage;
+  printf("\n Read message unpack: ");
+
+  while(ptr < end) {
+    printf(" %d ", *ptr);
+    ptr++;
+  }
+
+  printf("\n");
+  // clean the supplied buffer for - tag value blanking
+  (void)memset(pUnpackedBuf, 0, unpackedBufLen);
+
+  // process the header
+  if( !(pull16(&pReadPackedMessage, &pMessageHeader->phy_id, end ) &&
+        pull16(&pReadPackedMessage, &pMessageHeader->message_id, end) &&
+        pull16(&pReadPackedMessage, &pMessageHeader->message_length, end) &&
+        pull16(&pReadPackedMessage, &pMessageHeader->spare, end))) {
+    // failed to read the header
+    return -1;
+  }
+
+  int result = -1;
+
+  if(check_unpack_length(pMessageHeader->message_id, unpackedBufLen) == 0) {
+    // the unpack buffer is not big enough for the struct
+    return -1;
+  }
+
+  // look for the specific message
+  switch (pMessageHeader->message_id) {
+    case NFAPI_PNF_PARAM_REQUEST:
+      result = unpack_pnf_param_request(&pReadPackedMessage, end, pMessageHeader, config);
+      break;
+
+    case NFAPI_PNF_PARAM_RESPONSE:
+      result = unpack_pnf_param_response(&pReadPackedMessage, end, pMessageHeader, config);
+      break;
+
+    case NFAPI_PNF_CONFIG_REQUEST:
+      result = unpack_pnf_config_request(&pReadPackedMessage, end, pMessageHeader, config);
+      break;
+
+    case NFAPI_PNF_CONFIG_RESPONSE:
+      result = unpack_pnf_config_response(&pReadPackedMessage, end, pMessageHeader, config);
+      break;
+
+    case NFAPI_PNF_START_REQUEST:
+      result = unpack_pnf_start_request(&pReadPackedMessage, end, pMessageHeader, config);
+      break;
+
+    case NFAPI_PNF_START_RESPONSE:
+      result = unpack_pnf_start_response(&pReadPackedMessage, end, pMessageHeader, config);
+      break;
+
+    case NFAPI_PNF_STOP_REQUEST:
+      result = unpack_pnf_stop_request(&pReadPackedMessage, end, pMessageHeader, config);
+      break;
+
+    case NFAPI_PNF_STOP_RESPONSE:
+      result = unpack_pnf_stop_response(&pReadPackedMessage, end, pMessageHeader, config);
+      break;
+
+    case NFAPI_PARAM_REQUEST:
+      result = unpack_param_request(&pReadPackedMessage, end, pMessageHeader, config);
+      break;
+
+    case NFAPI_PARAM_RESPONSE:
+      result = unpack_param_response(&pReadPackedMessage, end, pMessageHeader, config);
+      break;
+
+    case NFAPI_CONFIG_REQUEST:
+      result = unpack_config_request(&pReadPackedMessage, end, pMessageHeader, config);
+      break;
+
+    case NFAPI_CONFIG_RESPONSE:
+      result = unpack_config_response(&pReadPackedMessage, end, pMessageHeader, config);
+      break;
+
+    case NFAPI_START_REQUEST:
+      result = unpack_start_request(&pReadPackedMessage, end, pMessageHeader, config);
+      break;
+
+    case NFAPI_START_RESPONSE:
+      result = unpack_start_response(&pReadPackedMessage, end, pMessageHeader, config);
+      break;
+
+    case NFAPI_STOP_REQUEST:
+      result = unpack_stop_request(&pReadPackedMessage, end, pMessageHeader, config);
+      break;
+
+    case NFAPI_STOP_RESPONSE:
+      result = unpack_stop_response(&pReadPackedMessage, end, pMessageHeader, config);
+      break;
+
+    case NFAPI_MEASUREMENT_REQUEST:
+      result = unpack_measurement_request(&pReadPackedMessage, end, pMessageHeader, config);
+      break;
+
+    case NFAPI_MEASUREMENT_RESPONSE:
+      result = unpack_measurement_response(&pReadPackedMessage, end, pMessageHeader, config);
+      break;
+
+    default:
+      if(pMessageHeader->message_id >= NFAPI_VENDOR_EXT_MSG_MIN &&
+          pMessageHeader->message_id <= NFAPI_VENDOR_EXT_MSG_MAX) {
+        if(config && config->unpack_p4_p5_vendor_extension) {
+          result = (config->unpack_p4_p5_vendor_extension)(pMessageHeader, &pReadPackedMessage, end, config);
+        } else {
+          NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s VE NFAPI message ID %d. No ve decoder provided\n", __FUNCTION__, pMessageHeader->message_id);
+        }
+      } else {
+        NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s NFAPI Unknown P5 message ID %d\n", __FUNCTION__, pMessageHeader->message_id);
+      }
+
+      break;
+  }
+
+  return result;
+}
diff --git a/nfapi/open-nFAPI/nfapi/src/nfapi_p7.c b/nfapi/open-nFAPI/nfapi/src/nfapi_p7.c
index ecd8e3dbfe6b7fee43ee0b64ccf2dae949ee2678..7cb74f8562c34ac307659fad66bab82dddad5eee 100644
--- a/nfapi/open-nFAPI/nfapi/src/nfapi_p7.c
+++ b/nfapi/open-nFAPI/nfapi/src/nfapi_p7.c
@@ -1,7948 +1,7946 @@
-/*
- * Copyright 2017 Cisco Systems, Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-
-#include <assert.h>
-#include <signal.h>
-#include <sys/time.h>
-#include <sys/socket.h>
-#include <sys/types.h>
-#include <netinet/in.h>
-#include <arpa/inet.h>
-#include <zlib.h>
-#include <sched.h>
-#include <time.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-#include <errno.h>
-#include <pthread.h>
-#include <stdint.h>
-
-#include <nfapi_interface.h>
-#include <nfapi.h>
-#include <debug.h>
-#include "nfapi_nr_interface_scf.h"
-
-extern int nfapi_unpack_p7_vendor_extension(nfapi_p7_message_header_t *header, uint8_t **ppReadPackedMsg, void *user_data);
-extern int nfapi_pack_p7_vendor_extension(nfapi_p7_message_header_t *header, uint8_t **ppWritePackedMsg, void *user_data);
-
-uint32_t nfapi_calculate_checksum(uint8_t *buffer, uint16_t len) {
-  uint32_t chksum = 0;
-  // calcaulte upto the checksum
-  chksum = crc32(chksum, buffer, 8);
-  // skip the checksum
-  uint8_t zeros[4] = {0, 0, 0, 0};
-  chksum = crc32(chksum, zeros, 4);
-  // continu with the rest of the mesage
-  chksum = crc32(chksum, &buffer[NFAPI_P7_HEADER_LENGTH], len - NFAPI_P7_HEADER_LENGTH);
-  // return the inverse
-  return ~(chksum);
-}
-
-int nfapi_p7_update_checksum(uint8_t *buffer, uint32_t len) {
-  uint32_t checksum = nfapi_calculate_checksum(buffer, len);
-  uint8_t *p_write = &buffer[8];
-  return (push32(checksum, &p_write, buffer + len) > 0 ? 0 : -1);
-}
-
-int nfapi_p7_update_transmit_timestamp(uint8_t *buffer, uint32_t timestamp) {
-  uint8_t *p_write = &buffer[12];
-  return (push32(timestamp, &p_write, buffer + 16) > 0 ? 0 : -1);
-}
-
-uint32_t nfapi_p7_calculate_checksum(uint8_t *buffer, uint32_t len) {
-  return nfapi_calculate_checksum(buffer, len);
-}
-
-void *nfapi_p7_allocate(size_t size, nfapi_p7_codec_config_t *config) {
-  if(size == 0)
-    return 0;
-
-  void *buffer_p = NULL;
-
-  if(config && config->allocate) {
-    buffer_p = (config->allocate)(size);
-
-    if(buffer_p != NULL) {
-      memset(buffer_p,0,size);
-    }
-
-    return buffer_p;
-  } else {
-    buffer_p = calloc(1, size);
-    return buffer_p;
-  }
-}
-
-void nfapi_p7_deallocate(void *ptr, nfapi_p7_codec_config_t *config) {
-  if(ptr == NULL)
-    return;
-
-  if(config && config->deallocate) {
-    return (config->deallocate)(ptr);
-  } else {
-    return free(ptr);
-  }
-}
-// Pack routines
-
-
-static uint8_t pack_dl_config_dci_dl_pdu_rel8_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
-  nfapi_dl_config_dci_dl_pdu_rel8_t *value = (nfapi_dl_config_dci_dl_pdu_rel8_t *)tlv;
-  //NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s() dci_format:%u\n", __FUNCTION__, value->dci_format);
-  return ( push8(value->dci_format, ppWritePackedMsg, end) &&
-           push8(value->cce_idx, ppWritePackedMsg, end) &&
-           push8(value->aggregation_level, ppWritePackedMsg, end) &&
-           push16(value->rnti, ppWritePackedMsg, end) &&
-           push8(value->resource_allocation_type, ppWritePackedMsg, end) &&
-           push8(value->virtual_resource_block_assignment_flag, ppWritePackedMsg, end) &&
-           push32(value->resource_block_coding, ppWritePackedMsg, end) &&
-           push8(value->mcs_1, ppWritePackedMsg, end) &&
-           push8(value->redundancy_version_1, ppWritePackedMsg, end) &&
-           push8(value->new_data_indicator_1, ppWritePackedMsg, end) &&
-           push8(value->transport_block_to_codeword_swap_flag, ppWritePackedMsg, end) &&
-           push8(value->mcs_2, ppWritePackedMsg, end) &&
-           push8(value->redundancy_version_2, ppWritePackedMsg, end) &&
-           push8(value->new_data_indicator_2, ppWritePackedMsg, end) &&
-           push8(value->harq_process, ppWritePackedMsg, end) &&
-           push8(value->tpmi, ppWritePackedMsg, end) &&
-           push8(value->pmi, ppWritePackedMsg, end) &&
-           push8(value->precoding_information, ppWritePackedMsg, end) &&
-           push8(value->tpc, ppWritePackedMsg, end) &&
-           push8(value->downlink_assignment_index, ppWritePackedMsg, end) &&
-           push8(value->ngap, ppWritePackedMsg, end) &&
-           push8(value->transport_block_size_index, ppWritePackedMsg, end) &&
-           push8(value->downlink_power_offset, ppWritePackedMsg, end) &&
-           push8(value->allocate_prach_flag, ppWritePackedMsg, end) &&
-           push8(value->preamble_index, ppWritePackedMsg, end) &&
-           push8(value->prach_mask_index, ppWritePackedMsg, end) &&
-           push8(value->rnti_type, ppWritePackedMsg, end) &&
-           push16(value->transmission_power, ppWritePackedMsg, end));
-}
-
-static uint8_t pack_dl_config_dci_dl_pdu_rel9_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
-  nfapi_dl_config_dci_dl_pdu_rel9_t *value = (nfapi_dl_config_dci_dl_pdu_rel9_t *)tlv;
-  return( push8(value->mcch_flag, ppWritePackedMsg, end) &&
-          push8(value->mcch_change_notification, ppWritePackedMsg, end) &&
-          push8(value->scrambling_identity, ppWritePackedMsg, end));
-}
-
-static uint8_t pack_dl_config_dci_dl_pdu_rel10_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
-  nfapi_dl_config_dci_dl_pdu_rel10_t *value = (nfapi_dl_config_dci_dl_pdu_rel10_t *)tlv;
-  return ( push8(value->cross_carrier_scheduling_flag, ppWritePackedMsg, end) &&
-           push8(value->carrier_indicator, ppWritePackedMsg, end) &&
-           push8(value->srs_flag, ppWritePackedMsg, end) &&
-           push8(value->srs_request, ppWritePackedMsg, end) &&
-           push8(value->antenna_ports_scrambling_and_layers, ppWritePackedMsg, end) &&
-           push8(value->total_dci_length_including_padding, ppWritePackedMsg, end) &&
-           push8(value->n_dl_rb, ppWritePackedMsg, end));
-}
-
-static uint8_t pack_dl_config_dci_dl_pdu_rel11_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
-  nfapi_dl_config_dci_dl_pdu_rel11_t *value = (nfapi_dl_config_dci_dl_pdu_rel11_t *)tlv;
-  return ( push8(value->harq_ack_resource_offset, ppWritePackedMsg, end) &&
-           push8(value->pdsch_re_mapping_quasi_co_location_indicator, ppWritePackedMsg, end));
-}
-
-static uint8_t pack_dl_config_dci_dl_pdu_rel12_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
-  nfapi_dl_config_dci_dl_pdu_rel12_t *value = (nfapi_dl_config_dci_dl_pdu_rel12_t *)tlv;
-  return ( push8(value->primary_cell_type, ppWritePackedMsg, end) &&
-           push8(value->ul_dl_configuration_flag, ppWritePackedMsg, end) &&
-           push8(value->number_ul_dl_configurations, ppWritePackedMsg, end) &&
-           pusharray8(value->ul_dl_configuration_indication, NFAPI_MAX_UL_DL_CONFIGURATIONS, value->number_ul_dl_configurations, ppWritePackedMsg, end));
-}
-
-static uint8_t pack_tpm_value(nfapi_dl_config_dci_dl_tpm_t *value, uint8_t **ppWritePackedMsg, uint8_t *end) {
-  if (!( push8(value->num_prb_per_subband, ppWritePackedMsg, end) &&
-         push8(value->number_of_subbands, ppWritePackedMsg, end) &&
-         push8(value->num_antennas, ppWritePackedMsg, end)))
-    return 0;
-
-  uint8_t idx = 0;
-
-  for(idx = 0; idx < value->number_of_subbands; ++idx) {
-    nfapi_dl_config_dci_dl_tpm_subband_info_t *subband_info = &(value->subband_info[idx]);
-
-    if(!(push8(subband_info->subband_index, ppWritePackedMsg, end) &&
-         push8(subband_info->scheduled_ues, ppWritePackedMsg, end)))
-      return 0;
-
-    uint8_t antenna_idx = 0;
-    uint8_t scheduled_ue_idx = 0;
-
-    for(antenna_idx = 0; antenna_idx < value->num_antennas; ++antenna_idx) {
-      for(scheduled_ue_idx = 0; scheduled_ue_idx < subband_info->scheduled_ues; ++scheduled_ue_idx) {
-        if(!push16(subband_info->precoding_value[antenna_idx][scheduled_ue_idx], ppWritePackedMsg, end))
-          return 0;
-      }
-    }
-  }
-
-  return 1;
-}
-
-
-static uint8_t pack_dl_tti_csi_rs_pdu_rel15_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
-  nfapi_nr_dl_tti_csi_rs_pdu_rel15_t *value = (nfapi_nr_dl_tti_csi_rs_pdu_rel15_t *)tlv;
-  return(
-          push16(value->bwp_size, ppWritePackedMsg, end) &&
-          push16(value->bwp_start, ppWritePackedMsg, end) &&
-          push8(value->subcarrier_spacing, ppWritePackedMsg, end) &&
-          push8(value->cyclic_prefix, ppWritePackedMsg, end) &&
-          push16(value->start_rb, ppWritePackedMsg, end) &&
-          push16(value->nr_of_rbs, ppWritePackedMsg, end) &&
-          push8(value->csi_type, ppWritePackedMsg, end) &&
-          push8(value->row, ppWritePackedMsg, end) &&
-          push16(value->freq_domain, ppWritePackedMsg, end) &&
-          push8(value->symb_l0, ppWritePackedMsg, end) &&
-          push8(value->symb_l1, ppWritePackedMsg, end) &&
-          push8(value->cdm_type, ppWritePackedMsg, end) &&
-          push8(value->freq_density, ppWritePackedMsg, end) &&
-          push16(value->scramb_id, ppWritePackedMsg, end) &&
-          push8(value->power_control_offset, ppWritePackedMsg, end) &&
-          push8(value->power_control_offset_ss, ppWritePackedMsg, end)
-        );
-}
-
-
-static uint8_t pack_dl_tti_pdcch_pdu_rel15_value(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
-
-	nfapi_nr_dl_tti_pdcch_pdu_rel15_t* value = (nfapi_nr_dl_tti_pdcch_pdu_rel15_t*)tlv;
-	
-	for(uint8_t i = 0; i < MAX_DCI_CORESET; ++i)
-	{
-		if(!(push16(value->dci_pdu[i].RNTI, ppWritePackedMsg, end) &&
-		push16(value->dci_pdu[i].ScramblingId, ppWritePackedMsg, end) &&
-		push16(value->dci_pdu[i].ScramblingRNTI, ppWritePackedMsg, end) &&
-		push8(value->dci_pdu[i].CceIndex, ppWritePackedMsg, end) &&
-		push8(value->dci_pdu[i].AggregationLevel, ppWritePackedMsg, end) &&
-		push8(value->dci_pdu[i].beta_PDCCH_1_0, ppWritePackedMsg, end) &&
-		push8(value->dci_pdu[i].powerControlOffsetSS, ppWritePackedMsg, end) &&
-		push16(value->dci_pdu[i].PayloadSizeBits, ppWritePackedMsg, end) &&
-		pusharray8(value->dci_pdu[i].Payload, value->dci_pdu[i].PayloadSizeBits, value->dci_pdu[i].PayloadSizeBits, ppWritePackedMsg, end)))
-		return 0;
-		
-	}
-	// TODO: resolve the packaging of array (currently sending a single element)
-	return(
-		push16(value->BWPSize, ppWritePackedMsg, end) &&
-		push16(value->BWPStart, ppWritePackedMsg, end) &&
-		push8(value->SubcarrierSpacing, ppWritePackedMsg, end) &&
-		push8(value->CyclicPrefix, ppWritePackedMsg, end) &&
-		push8(value->StartSymbolIndex, ppWritePackedMsg, end) &&
-		push8(value->DurationSymbols, ppWritePackedMsg, end) &&
-		pusharray8(value->FreqDomainResource, 6, 6, ppWritePackedMsg, end) &&
-		push8(value->CceRegMappingType, ppWritePackedMsg, end) &&
-		push8(value->RegBundleSize, ppWritePackedMsg, end) &&
-		push8(value->InterleaverSize, ppWritePackedMsg, end) &&
-		push8(value->CoreSetType, ppWritePackedMsg, end) &&
-		push16(value->ShiftIndex, ppWritePackedMsg, end) &&
-		push8(value->precoderGranularity, ppWritePackedMsg, end) &&
-		push16(value->numDlDci, ppWritePackedMsg, end));
-}
-
-
-static uint8_t pack_dl_tti_pdsch_pdu_rel15_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
-  nfapi_nr_dl_tti_pdsch_pdu_rel15_t *value = (nfapi_nr_dl_tti_pdsch_pdu_rel15_t *)tlv;
-  // TODO: resolve the packaging of array (currently sending a single element)
-  return(
-          push16(value->pduBitmap, ppWritePackedMsg, end) &&
-          push16(value->rnti, ppWritePackedMsg, end) &&
-          push16(value->pduIndex, ppWritePackedMsg, end) &&
-          push16(value->BWPSize, ppWritePackedMsg, end) &&
-          push16(value->BWPStart, ppWritePackedMsg, end) &&
-          push8(value->SubcarrierSpacing, ppWritePackedMsg, end) &&
-          push8(value->CyclicPrefix, ppWritePackedMsg, end) &&
-          push8(value->NrOfCodewords, ppWritePackedMsg, end) &&
-          pusharray16(value->targetCodeRate, 2, 1, ppWritePackedMsg, end) &&
-          pusharray8(value->qamModOrder, 2, 1, ppWritePackedMsg, end) &&
-          pusharray8(value->mcsIndex, 2, 1, ppWritePackedMsg, end) &&
-          pusharray8(value->mcsTable, 2, 1, ppWritePackedMsg, end) &&
-          pusharray8(value->rvIndex, 2, 1, ppWritePackedMsg, end) &&
-          pusharray32(value->TBSize, 2, 1, ppWritePackedMsg, end) &&
-          push16(value->dataScramblingId, ppWritePackedMsg, end) &&
-          push8(value->nrOfLayers, ppWritePackedMsg, end) &&
-          push8(value->transmissionScheme, ppWritePackedMsg, end) &&
-          push8(value->refPoint, ppWritePackedMsg, end) &&
-          push16(value->dlDmrsSymbPos, ppWritePackedMsg, end) &&
-          push8(value->dmrsConfigType, ppWritePackedMsg, end) &&
-          push16(value->dlDmrsScramblingId, ppWritePackedMsg, end) &&
-          push8(value->SCID, ppWritePackedMsg, end) &&
-          push8(value->numDmrsCdmGrpsNoData, ppWritePackedMsg, end) &&
-          push16(value->dmrsPorts, ppWritePackedMsg, end) &&
-          push8(value->resourceAlloc, ppWritePackedMsg, end) &&
-          push16(value->rbStart, ppWritePackedMsg, end) &&
-          push16(value->rbSize, ppWritePackedMsg, end) &&
-          push8(value->VRBtoPRBMapping, ppWritePackedMsg, end) &&
-          push8(value->StartSymbolIndex, ppWritePackedMsg, end) &&
-          push8(value->NrOfSymbols, ppWritePackedMsg, end) &&
-          push8(value->PTRSPortIndex, ppWritePackedMsg, end) &&
-          push8(value->PTRSTimeDensity, ppWritePackedMsg, end) &&
-          push8(value->PTRSFreqDensity, ppWritePackedMsg, end) &&
-          push8(value->PTRSReOffset, ppWritePackedMsg, end)
-        );
-}
-
-
-static uint8_t pack_dl_tti_ssb_pdu_rel15_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
-  nfapi_nr_dl_tti_ssb_pdu_rel15_t *value = (nfapi_nr_dl_tti_ssb_pdu_rel15_t *)tlv;
-  return(
-          push16(value->PhysCellId, ppWritePackedMsg, end) &&
-          push8(value->BetaPss, ppWritePackedMsg, end) &&
-          push8(value->SsbBlockIndex, ppWritePackedMsg, end) &&
-          push8(value->SsbSubcarrierOffset, ppWritePackedMsg, end) &&
-          push16(value->ssbOffsetPointA, ppWritePackedMsg, end) &&
-          push8(value->bchPayloadFlag, ppWritePackedMsg, end) &&
-          push32(value->bchPayload, ppWritePackedMsg, end)
-          // TODO: pack precoding_and_beamforming too
-        );
-}
-
-
-static uint8_t pack_dl_config_dci_dl_pdu_rel13_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
-  nfapi_dl_config_dci_dl_pdu_rel13_t *value = (nfapi_dl_config_dci_dl_pdu_rel13_t *)tlv;
-  return( push8(value->laa_end_partial_sf_flag, ppWritePackedMsg, end) &&
-          push8(value->laa_end_partial_sf_configuration, ppWritePackedMsg, end) &&
-          push8(value->initial_lbt_sf, ppWritePackedMsg, end) &&
-          push8(value->codebook_size_determination, ppWritePackedMsg, end) &&
-          push8(value->drms_table_flag, ppWritePackedMsg, end) &&
-          push8(value->tpm_struct_flag, ppWritePackedMsg, end) &&
-          (value->tpm_struct_flag == 1 ? pack_tpm_value(&(value->tpm), ppWritePackedMsg, end) : 1));
-}
-
-static uint8_t pack_dl_config_bch_pdu_rel8_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
-  nfapi_dl_config_bch_pdu_rel8_t *value = (nfapi_dl_config_bch_pdu_rel8_t *)tlv;
-  //NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s()\n", __FUNCTION__);
-  return( push16(value->length, ppWritePackedMsg, end) &&
-          push16(value->pdu_index, ppWritePackedMsg, end) &&
-          push16(value->transmission_power, ppWritePackedMsg, end));
-}
-static uint8_t pack_dl_config_mch_pdu_rel8_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
-  nfapi_dl_config_mch_pdu_rel8_t *value = (nfapi_dl_config_mch_pdu_rel8_t *)tlv;
-  return ( push16(value->length, ppWritePackedMsg, end) &&
-           push16(value->pdu_index, ppWritePackedMsg, end) &&
-           push16(value->rnti, ppWritePackedMsg, end) &&
-           push8(value->resource_allocation_type, ppWritePackedMsg, end) &&
-           push32(value->resource_block_coding, ppWritePackedMsg, end) &&
-           push8(value->modulation, ppWritePackedMsg, end) &&
-           push16(value->transmission_power, ppWritePackedMsg, end) &&
-           push16(value->mbsfn_area_id, ppWritePackedMsg, end));
-}
-
-static uint8_t pack_bf_vector_info(void *elem, uint8_t **ppWritePackedMsg, uint8_t *end) {
-  nfapi_bf_vector_t *bf = (nfapi_bf_vector_t *)elem;
-  return ( push8(bf->subband_index, ppWritePackedMsg, end) &&
-           push8(bf->num_antennas, ppWritePackedMsg, end) &&
-           pusharray16(bf->bf_value, NFAPI_MAX_NUM_ANTENNAS, bf->num_antennas, ppWritePackedMsg, end));
-}
-static uint8_t pack_dl_config_dlsch_pdu_rel8_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
-  nfapi_dl_config_dlsch_pdu_rel8_t *value = (nfapi_dl_config_dlsch_pdu_rel8_t *)tlv;
-  return ( push16(value->length, ppWritePackedMsg, end) &&
-           push16(value->pdu_index, ppWritePackedMsg, end) &&
-           push16(value->rnti, ppWritePackedMsg, end) &&
-           push8(value->resource_allocation_type, ppWritePackedMsg, end) &&
-           push8(value->virtual_resource_block_assignment_flag, ppWritePackedMsg, end) &&
-           push32(value->resource_block_coding, ppWritePackedMsg, end) &&
-           push8(value->modulation, ppWritePackedMsg, end) &&
-           push8(value->redundancy_version, ppWritePackedMsg, end) &&
-           push8(value->transport_blocks, ppWritePackedMsg, end) &&
-           push8(value->transport_block_to_codeword_swap_flag, ppWritePackedMsg, end) &&
-           push8(value->transmission_scheme, ppWritePackedMsg, end) &&
-           push8(value->number_of_layers, ppWritePackedMsg, end) &&
-           push8(value->number_of_subbands, ppWritePackedMsg, end) &&
-           pusharray8(value->codebook_index, NFAPI_MAX_NUM_SUBBANDS, value->number_of_subbands, ppWritePackedMsg, end) &&
-           push8(value->ue_category_capacity, ppWritePackedMsg, end) &&
-           push8(value->pa, ppWritePackedMsg, end) &&
-           push8(value->delta_power_offset_index, ppWritePackedMsg, end) &&
-           push8(value->ngap, ppWritePackedMsg, end) &&
-           push8(value->nprb, ppWritePackedMsg, end) &&
-           push8(value->transmission_mode, ppWritePackedMsg, end) &&
-           push8(value->num_bf_prb_per_subband, ppWritePackedMsg, end) &&
-           push8(value->num_bf_vector, ppWritePackedMsg, end) &&
-           packarray(value->bf_vector, sizeof(nfapi_bf_vector_t), NFAPI_MAX_BF_VECTORS, value->num_bf_vector, ppWritePackedMsg, end, &pack_bf_vector_info));
-}
-static uint8_t pack_dl_config_dlsch_pdu_rel9_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
-  nfapi_dl_config_dlsch_pdu_rel9_t *value = (nfapi_dl_config_dlsch_pdu_rel9_t *)tlv;
-  return ( push8(value->nscid, ppWritePackedMsg, end) );
-}
-static uint8_t pack_dl_config_dlsch_pdu_rel10_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
-  nfapi_dl_config_dlsch_pdu_rel10_t *value = (nfapi_dl_config_dlsch_pdu_rel10_t *)tlv;
-  return ( push8(value->csi_rs_flag, ppWritePackedMsg, end) &&
-           push8(value->csi_rs_resource_config_r10, ppWritePackedMsg, end) &&
-           push16(value->csi_rs_zero_tx_power_resource_config_bitmap_r10, ppWritePackedMsg, end) &&
-           push8(value->csi_rs_number_nzp_configuration, ppWritePackedMsg, end) &&
-           pusharray8(value->csi_rs_resource_config, NFAPI_MAX_CSI_RS_RESOURCE_CONFIG, value->csi_rs_number_nzp_configuration, ppWritePackedMsg, end) &&
-           push8(value->pdsch_start, ppWritePackedMsg, end));
-}
-static uint8_t pack_dl_config_dlsch_pdu_rel11_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
-  nfapi_dl_config_dlsch_pdu_rel11_t *value = (nfapi_dl_config_dlsch_pdu_rel11_t *)tlv;
-  return( push8(value->drms_config_flag, ppWritePackedMsg, end) &&
-          push16(value->drms_scrambling, ppWritePackedMsg, end) &&
-          push8(value->csi_config_flag, ppWritePackedMsg, end) &&
-          push16(value->csi_scrambling, ppWritePackedMsg, end) &&
-          push8(value->pdsch_re_mapping_flag, ppWritePackedMsg, end) &&
-          push8(value->pdsch_re_mapping_atenna_ports, ppWritePackedMsg, end) &&
-          push8(value->pdsch_re_mapping_freq_shift, ppWritePackedMsg, end));
-}
-static uint8_t pack_dl_config_dlsch_pdu_rel12_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
-  nfapi_dl_config_dlsch_pdu_rel12_t *value = (nfapi_dl_config_dlsch_pdu_rel12_t *)tlv;
-  return( push8(value->altcqi_table_r12, ppWritePackedMsg, end) &&
-          push8(value->maxlayers, ppWritePackedMsg, end) &&
-          push8(value->n_dl_harq, ppWritePackedMsg, end));
-}
-static uint8_t pack_dl_config_dlsch_pdu_rel13_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
-  nfapi_dl_config_dlsch_pdu_rel13_t *value = (nfapi_dl_config_dlsch_pdu_rel13_t *)tlv;
-  return( push8(value->dwpts_symbols, ppWritePackedMsg, end) &&
-          push8(value->initial_lbt_sf, ppWritePackedMsg, end) &&
-          push8(value->ue_type, ppWritePackedMsg, end) &&
-          push8(value->pdsch_payload_type, ppWritePackedMsg, end) &&
-          push16(value->initial_transmission_sf_io, ppWritePackedMsg, end) &&
-          push8(value->drms_table_flag, ppWritePackedMsg, end));
-}
-static uint8_t pack_dl_config_pch_pdu_rel8_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
-  nfapi_dl_config_pch_pdu_rel8_t *value = (nfapi_dl_config_pch_pdu_rel8_t *)tlv;
-  return( push16(value->length, ppWritePackedMsg, end) &&
-          push16(value->pdu_index, ppWritePackedMsg, end) &&
-          push16(value->p_rnti, ppWritePackedMsg, end) &&
-          push8(value->resource_allocation_type, ppWritePackedMsg, end) &&
-          push8(value->virtual_resource_block_assignment_flag, ppWritePackedMsg, end) &&
-          push32(value->resource_block_coding, ppWritePackedMsg, end) &&
-          push8(value->mcs, ppWritePackedMsg, end) &&
-          push8(value->redundancy_version, ppWritePackedMsg, end) &&
-          push8(value->number_of_transport_blocks, ppWritePackedMsg, end) &&
-          push8(value->transport_block_to_codeword_swap_flag, ppWritePackedMsg, end) &&
-          push8(value->transmission_scheme, ppWritePackedMsg, end) &&
-          push8(value->number_of_layers, ppWritePackedMsg, end) &&
-          push8(value->codebook_index, ppWritePackedMsg, end) &&
-          push8(value->ue_category_capacity, ppWritePackedMsg, end) &&
-          push8(value->pa, ppWritePackedMsg, end) &&
-          push16(value->transmission_power, ppWritePackedMsg, end) &&
-          push8(value->nprb, ppWritePackedMsg, end) &&
-          push8(value->ngap, ppWritePackedMsg, end));
-}
-static uint8_t pack_dl_config_pch_pdu_rel13_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
-  nfapi_dl_config_pch_pdu_rel13_t *value = (nfapi_dl_config_pch_pdu_rel13_t *)tlv;
-  return ( push8(value->ue_mode, ppWritePackedMsg, end) &&
-           push16(value->initial_transmission_sf_io, ppWritePackedMsg, end));
-}
-static uint8_t pack_dl_config_prs_pdu_rel9_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
-  nfapi_dl_config_prs_pdu_rel9_t *value = (nfapi_dl_config_prs_pdu_rel9_t *)tlv;
-  return( push16(value->transmission_power, ppWritePackedMsg, end) &&
-          push8(value->prs_bandwidth, ppWritePackedMsg, end) &&
-          push8(value->prs_cyclic_prefix_type, ppWritePackedMsg, end) &&
-          push8(value->prs_muting, ppWritePackedMsg, end));
-}
-static uint8_t pack_dl_config_csi_rs_pdu_rel10_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
-  nfapi_dl_config_csi_rs_pdu_rel10_t *value = (nfapi_dl_config_csi_rs_pdu_rel10_t *)tlv;
-  return( push8(value->csi_rs_antenna_port_count_r10, ppWritePackedMsg, end) &&
-          push8(value->csi_rs_resource_config_r10, ppWritePackedMsg, end) &&
-          push16(value->transmission_power, ppWritePackedMsg, end) &&
-          push16(value->csi_rs_zero_tx_power_resource_config_bitmap_r10, ppWritePackedMsg, end) &&
-          push8(value->csi_rs_number_of_nzp_configuration, ppWritePackedMsg, end) &&
-          pusharray8(value->csi_rs_resource_config, NFAPI_MAX_CSI_RS_RESOURCE_CONFIG, value->csi_rs_number_of_nzp_configuration, ppWritePackedMsg, end));
-}
-static uint8_t pack_dl_config_csi_rs_pdu_rel13_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
-  nfapi_dl_config_csi_rs_pdu_rel13_t *value = (nfapi_dl_config_csi_rs_pdu_rel13_t *)tlv;
-
-  if(!(push8(value->csi_rs_class, ppWritePackedMsg, end) &&
-       push8(value->cdm_type, ppWritePackedMsg, end) &&
-       push8(value->num_bf_vector, ppWritePackedMsg, end))) {
-    return 0;
-  }
-
-  uint16_t i;
-
-  for(i = 0; i < value->num_bf_vector; ++i) {
-    if(!(push8(value->bf_vector[i].csi_rs_resource_index, ppWritePackedMsg, end) &&
-         pusharray16(value->bf_vector[i].bf_value, NFAPI_MAX_ANTENNA_PORT_COUNT, NFAPI_MAX_ANTENNA_PORT_COUNT, ppWritePackedMsg, end)))
-      return 0;
-  }
-
-  return 1;
-}
-static uint8_t pack_bf_vector(nfapi_bf_vector_t *vector, uint8_t **ppWritePackedMsg, uint8_t *end) {
-  return ( push8(vector->subband_index, ppWritePackedMsg, end) &&
-           push8(vector->num_antennas, ppWritePackedMsg, end) &&
-           pusharray16(vector->bf_value, NFAPI_MAX_NUM_ANTENNAS, vector->num_antennas, ppWritePackedMsg, end));
-}
-
-static uint8_t pack_dl_config_epdcch_parameters_rel11_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
-  nfapi_dl_config_epdcch_parameters_rel11_t *value = (nfapi_dl_config_epdcch_parameters_rel11_t *)tlv;
-  return ( push8(value->epdcch_resource_assignment_flag, ppWritePackedMsg, end) &&
-           push16(value->epdcch_id, ppWritePackedMsg, end) &&
-           push8(value->epdcch_start_symbol, ppWritePackedMsg, end) &&
-           push8(value->epdcch_num_prb, ppWritePackedMsg, end) &&
-           pusharray8(value->epdcch_prb_index, NFAPI_MAX_EPDCCH_PRB, value->epdcch_num_prb, ppWritePackedMsg, end) &&
-           pack_bf_vector(&value->bf_vector, ppWritePackedMsg, end));
-}
-static uint8_t pack_dl_config_epdcch_parameters_rel13_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
-  nfapi_dl_config_epdcch_parameters_rel13_t *value = (nfapi_dl_config_epdcch_parameters_rel13_t *)tlv;
-  return (push8(value->dwpts_symbols, ppWritePackedMsg, end) &&
-          push8(value->initial_lbt_sf, ppWritePackedMsg, end));
-}
-static uint8_t pack_dl_config_mpdcch_pdu_rel13_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
-  nfapi_dl_config_mpdcch_pdu_rel13_t *value = (nfapi_dl_config_mpdcch_pdu_rel13_t *)tlv;
-  return ( push8(value->mpdcch_narrow_band, ppWritePackedMsg, end) &&
-           push8(value->number_of_prb_pairs, ppWritePackedMsg, end) &&
-           push8(value->resource_block_assignment, ppWritePackedMsg, end) &&
-           push8(value->mpdcch_tansmission_type, ppWritePackedMsg, end) &&
-           push8(value->start_symbol, ppWritePackedMsg, end) &&
-           push8(value->ecce_index, ppWritePackedMsg, end) &&
-           push8(value->aggregation_level, ppWritePackedMsg, end) &&
-           push8(value->rnti_type, ppWritePackedMsg, end) &&
-           push16(value->rnti, ppWritePackedMsg, end) &&
-           push8(value->ce_mode, ppWritePackedMsg, end) &&
-           push16(value->drms_scrambling_init, ppWritePackedMsg, end) &&
-           push16(value->initial_transmission_sf_io, ppWritePackedMsg, end) &&
-           push16(value->transmission_power, ppWritePackedMsg, end) &&
-           push8(value->dci_format, ppWritePackedMsg, end) &&
-           push16(value->resource_block_coding, ppWritePackedMsg, end) &&
-           push8(value->mcs, ppWritePackedMsg, end) &&
-           push8(value->pdsch_reptition_levels, ppWritePackedMsg, end) &&
-           push8(value->redundancy_version, ppWritePackedMsg, end) &&
-           push8(value->new_data_indicator, ppWritePackedMsg, end) &&
-           push8(value->harq_process, ppWritePackedMsg, end) &&
-           push8(value->tpmi_length, ppWritePackedMsg, end) &&
-           push8(value->tpmi, ppWritePackedMsg, end) &&
-           push8(value->pmi_flag, ppWritePackedMsg, end) &&
-           push8(value->pmi, ppWritePackedMsg, end) &&
-           push8(value->harq_resource_offset, ppWritePackedMsg, end) &&
-           push8(value->dci_subframe_repetition_number, ppWritePackedMsg, end) &&
-           push8(value->tpc, ppWritePackedMsg, end) &&
-           push8(value->downlink_assignment_index_length, ppWritePackedMsg, end) &&
-           push8(value->downlink_assignment_index, ppWritePackedMsg, end) &&
-           push8(value->allocate_prach_flag, ppWritePackedMsg, end) &&
-           push8(value->preamble_index, ppWritePackedMsg, end) &&
-           push8(value->prach_mask_index, ppWritePackedMsg, end) &&
-           push8(value->starting_ce_level, ppWritePackedMsg, end) &&
-           push8(value->srs_request, ppWritePackedMsg, end) &&
-           push8(value->antenna_ports_and_scrambling_identity_flag, ppWritePackedMsg, end) &&
-           push8(value->antenna_ports_and_scrambling_identity, ppWritePackedMsg, end) &&
-           push8(value->frequency_hopping_enabled_flag, ppWritePackedMsg, end) &&
-           push8(value->paging_direct_indication_differentiation_flag, ppWritePackedMsg, end) &&
-           push8(value->direct_indication, ppWritePackedMsg, end) &&
-           push8(value->total_dci_length_including_padding, ppWritePackedMsg, end) &&
-           push8(value->number_of_tx_antenna_ports, ppWritePackedMsg, end) &&
-           pusharray16(value->precoding_value, NFAPI_MAX_TX_PHYSICAL_ANTENNA_PORTS, value->number_of_tx_antenna_ports, ppWritePackedMsg, end));
-}
-
-
-static uint8_t pack_dl_config_nbch_pdu_rel13_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
-  nfapi_dl_config_nbch_pdu_rel13_t *value = (nfapi_dl_config_nbch_pdu_rel13_t *)tlv;
-  return (push16(value->length, ppWritePackedMsg, end) &&
-          push16(value->pdu_index, ppWritePackedMsg, end) &&
-          push16(value->transmission_power, ppWritePackedMsg, end) &&
-          push16(value->hyper_sfn_2_lsbs, ppWritePackedMsg, end));
-}
-
-
-static uint8_t pack_dl_config_npdcch_pdu_rel13_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
-  nfapi_dl_config_npdcch_pdu_rel13_t *value = (nfapi_dl_config_npdcch_pdu_rel13_t *)tlv;
-  return (push16(value->length, ppWritePackedMsg, end) &&
-          push16(value->pdu_index, ppWritePackedMsg, end) &&
-          push8(value->ncce_index, ppWritePackedMsg, end) &&
-          push8(value->aggregation_level, ppWritePackedMsg, end) &&
-          push8(value->start_symbol, ppWritePackedMsg, end) &&
-          push8(value->rnti_type, ppWritePackedMsg, end) &&
-          push16(value->rnti, ppWritePackedMsg, end) &&
-          push8(value->scrambling_reinitialization_batch_index, ppWritePackedMsg, end) &&
-          push8(value->nrs_antenna_ports_assumed_by_the_ue, ppWritePackedMsg, end) &&
-          push8(value->dci_format, ppWritePackedMsg, end) &&
-          push8(value->scheduling_delay, ppWritePackedMsg, end) &&
-          push8(value->resource_assignment, ppWritePackedMsg, end) &&
-          push8(value->repetition_number, ppWritePackedMsg, end) &&
-          push8(value->mcs, ppWritePackedMsg, end) &&
-          push8(value->new_data_indicator, ppWritePackedMsg, end) &&
-          push8(value->harq_ack_resource, ppWritePackedMsg, end) &&
-          push8(value->npdcch_order_indication, ppWritePackedMsg, end) &&
-          push8(value->starting_number_of_nprach_repetitions, ppWritePackedMsg, end) &&
-          push8(value->subcarrier_indication_of_nprach, ppWritePackedMsg, end) &&
-          push8(value->paging_direct_indication_differentation_flag, ppWritePackedMsg, end) &&
-          push8(value->direct_indication, ppWritePackedMsg, end) &&
-          push8(value->dci_subframe_repetition_number, ppWritePackedMsg, end) &&
-          push8(value->total_dci_length_including_padding, ppWritePackedMsg, end));
-}
-
-static uint8_t pack_dl_config_ndlsch_pdu_rel13_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
-  nfapi_dl_config_ndlsch_pdu_rel13_t *value = (nfapi_dl_config_ndlsch_pdu_rel13_t *)tlv;
-  return (push16(value->length, ppWritePackedMsg, end) &&
-          push16(value->pdu_index, ppWritePackedMsg, end) &&
-          push8(value->start_symbol, ppWritePackedMsg, end) &&
-          push8(value->rnti_type, ppWritePackedMsg, end) &&
-          push16(value->rnti, ppWritePackedMsg, end) &&
-          push16(value->resource_assignment, ppWritePackedMsg, end) &&
-          push16(value->repetition_number, ppWritePackedMsg, end) &&
-          push8(value->modulation, ppWritePackedMsg, end) &&
-          push8(value->number_of_subframes_for_resource_assignment, ppWritePackedMsg, end) &&
-          push8(value->scrambling_sequence_initialization_cinit, ppWritePackedMsg, end) &&
-          push16(value->sf_idx, ppWritePackedMsg, end) &&
-          push8(value->nrs_antenna_ports_assumed_by_the_ue, ppWritePackedMsg, end));
-}
-
-
-static uint8_t pack_dl_tti_request_body_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
-  nfapi_nr_dl_tti_request_pdu_t *value = (nfapi_nr_dl_tti_request_pdu_t *)tlv;
-
-  if(!(push32(value->PDUSize, ppWritePackedMsg, end) &&
-       push16(value->PDUType, ppWritePackedMsg, end) ))
-    return 0;
-
-  // first match the pdu type, then call the respective function
-  switch(value->PDUType) {
-    case NFAPI_NR_DL_TTI_CSI_RS_PDU_TYPE: {
-      if(!(pack_dl_tti_csi_rs_pdu_rel15_value(&value->csi_rs_pdu.csi_rs_pdu_rel15,ppWritePackedMsg,end)))
-        return 0;
-    }
-    break;
-
-    case NFAPI_NR_DL_TTI_PDCCH_PDU_TYPE: {
-      if(!(pack_dl_tti_pdcch_pdu_rel15_value(&value->pdcch_pdu.pdcch_pdu_rel15,ppWritePackedMsg,end)))
-        return 0;
-    }
-    break;
-
-    case NFAPI_NR_DL_TTI_PDSCH_PDU_TYPE: {
-      if(!(pack_dl_tti_pdsch_pdu_rel15_value(&value->pdsch_pdu.pdsch_pdu_rel15,ppWritePackedMsg,end)))
-        return 0;
-    }
-    break;
-
-    case NFAPI_NR_DL_TTI_SSB_PDU_TYPE: {
-      if(!(pack_dl_tti_ssb_pdu_rel15_value(&value->ssb_pdu.ssb_pdu_rel15,ppWritePackedMsg,end)))
-        return 0;
-    }
-    break;
-
-    default: {
-      NFAPI_TRACE(NFAPI_TRACE_ERROR, "FIXME : Invalid DL_TTI pdu type %d \n", value->PDUType );
-    }
-    break;
-  }
-
-  return 1;
-}
-
-static uint8_t pack_dl_config_request_body_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
-  nfapi_dl_config_request_body_t *value = (nfapi_dl_config_request_body_t *)tlv;
-
-  //NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s() dci:%u pdu:%u pdsch:%u rnti:%u pcfich:%u\n", __FUNCTION__, value->number_dci, value->number_pdu, value->number_pdsch_rnti, value->transmission_power_pcfich);
-
-  if(!(push8(value->number_pdcch_ofdm_symbols, ppWritePackedMsg, end) &&
-       push8(value->number_dci, ppWritePackedMsg, end) &&
-       push16(value->number_pdu, ppWritePackedMsg, end) &&
-       push8(value->number_pdsch_rnti, ppWritePackedMsg, end) &&
-       push16(value->transmission_power_pcfich, ppWritePackedMsg, end))) {
-    return 0;
-  }
-
-  uint16_t i = 0;
-  uint16_t total_number_of_pdus = value->number_pdu;
-
-  for(; i < total_number_of_pdus; ++i) {
-    nfapi_dl_config_request_pdu_t *pdu = &(value->dl_config_pdu_list[i]);
-
-    if(push8(pdu->pdu_type, ppWritePackedMsg, end) == 0)
-      return 0;
-
-    // Put a 0 size in and then determine the size after the pdu
-    // has been writen and write the calculated size
-    uint8_t *pWritePackedMsgPduSize = *ppWritePackedMsg;
-    pdu->pdu_size = 0;
-
-    if(push8(pdu->pdu_size, ppWritePackedMsg, end) == 0)
-      return 0;
-
-    switch(pdu->pdu_type) {
-      case NFAPI_DL_CONFIG_DCI_DL_PDU_TYPE: {
-        //NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s() NFAPI_DL_CONFIG_DCI_DL_PDU_TYPE\n", __FUNCTION__);
-        if(!(pack_tlv(NFAPI_DL_CONFIG_REQUEST_DCI_DL_PDU_REL8_TAG, &pdu->dci_dl_pdu.dci_dl_pdu_rel8, ppWritePackedMsg, end, &pack_dl_config_dci_dl_pdu_rel8_value) &&
-             pack_tlv(NFAPI_DL_CONFIG_REQUEST_DCI_DL_PDU_REL9_TAG, &pdu->dci_dl_pdu.dci_dl_pdu_rel9, ppWritePackedMsg, end, &pack_dl_config_dci_dl_pdu_rel9_value) &&
-             pack_tlv(NFAPI_DL_CONFIG_REQUEST_DCI_DL_PDU_REL10_TAG, &pdu->dci_dl_pdu.dci_dl_pdu_rel10, ppWritePackedMsg, end, &pack_dl_config_dci_dl_pdu_rel10_value) &&
-             pack_tlv(NFAPI_DL_CONFIG_REQUEST_DCI_DL_PDU_REL11_TAG, &pdu->dci_dl_pdu.dci_dl_pdu_rel11, ppWritePackedMsg, end, &pack_dl_config_dci_dl_pdu_rel11_value) &&
-             pack_tlv(NFAPI_DL_CONFIG_REQUEST_DCI_DL_PDU_REL12_TAG, &pdu->dci_dl_pdu.dci_dl_pdu_rel12, ppWritePackedMsg, end, &pack_dl_config_dci_dl_pdu_rel12_value) &&
-             pack_tlv(NFAPI_DL_CONFIG_REQUEST_DCI_DL_PDU_REL13_TAG, &pdu->dci_dl_pdu.dci_dl_pdu_rel13, ppWritePackedMsg, end, &pack_dl_config_dci_dl_pdu_rel13_value))) {
-          return 0;
-        }
-      }
-      break;
-
-      case NFAPI_DL_CONFIG_BCH_PDU_TYPE: {
-        //NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s() NFAPI_DL_CONFIG_BCH_PDU_TYPE\n", __FUNCTION__);
-        if(!(pack_tlv(NFAPI_DL_CONFIG_REQUEST_BCH_PDU_REL8_TAG, &pdu->bch_pdu.bch_pdu_rel8, ppWritePackedMsg, end, &pack_dl_config_bch_pdu_rel8_value)))
-          return 0;
-      }
-      break;
-
-      case NFAPI_DL_CONFIG_MCH_PDU_TYPE: {
-        if(!(pack_tlv(NFAPI_DL_CONFIG_REQUEST_MCH_PDU_REL8_TAG, &pdu->mch_pdu.mch_pdu_rel8, ppWritePackedMsg, end, &pack_dl_config_mch_pdu_rel8_value)))
-          return 0;
-      }
-      break;
-
-      case NFAPI_DL_CONFIG_DLSCH_PDU_TYPE: {
-        if(!(pack_tlv(NFAPI_DL_CONFIG_REQUEST_DLSCH_PDU_REL8_TAG, &pdu->dlsch_pdu.dlsch_pdu_rel8, ppWritePackedMsg, end, &pack_dl_config_dlsch_pdu_rel8_value) &&
-             pack_tlv(NFAPI_DL_CONFIG_REQUEST_DLSCH_PDU_REL9_TAG, &pdu->dlsch_pdu.dlsch_pdu_rel9, ppWritePackedMsg, end, &pack_dl_config_dlsch_pdu_rel9_value) &&
-             pack_tlv(NFAPI_DL_CONFIG_REQUEST_DLSCH_PDU_REL10_TAG, &pdu->dlsch_pdu.dlsch_pdu_rel10, ppWritePackedMsg, end, &pack_dl_config_dlsch_pdu_rel10_value) &&
-             pack_tlv(NFAPI_DL_CONFIG_REQUEST_DLSCH_PDU_REL11_TAG, &pdu->dlsch_pdu.dlsch_pdu_rel11, ppWritePackedMsg, end, &pack_dl_config_dlsch_pdu_rel11_value) &&
-             pack_tlv(NFAPI_DL_CONFIG_REQUEST_DLSCH_PDU_REL12_TAG, &pdu->dlsch_pdu.dlsch_pdu_rel12, ppWritePackedMsg, end, &pack_dl_config_dlsch_pdu_rel12_value) &&
-             pack_tlv(NFAPI_DL_CONFIG_REQUEST_DLSCH_PDU_REL13_TAG, &pdu->dlsch_pdu.dlsch_pdu_rel13, ppWritePackedMsg, end, &pack_dl_config_dlsch_pdu_rel13_value)))
-          return 0;
-      }
-      break;
-
-      case NFAPI_DL_CONFIG_PCH_PDU_TYPE: {
-        if(!(pack_tlv(NFAPI_DL_CONFIG_REQUEST_PCH_PDU_REL8_TAG, &pdu->pch_pdu.pch_pdu_rel8, ppWritePackedMsg, end, &pack_dl_config_pch_pdu_rel8_value) &&
-             pack_tlv(NFAPI_DL_CONFIG_REQUEST_PCH_PDU_REL13_TAG, &pdu->pch_pdu.pch_pdu_rel13, ppWritePackedMsg, end, &pack_dl_config_pch_pdu_rel13_value)))
-          return 0;
-      }
-      break;
-
-      case NFAPI_DL_CONFIG_PRS_PDU_TYPE: {
-        if(!(pack_tlv(NFAPI_DL_CONFIG_REQUEST_PRS_PDU_REL9_TAG, &pdu->prs_pdu.prs_pdu_rel9, ppWritePackedMsg, end, &pack_dl_config_prs_pdu_rel9_value)))
-          return 0;
-      }
-      break;
-
-      case NFAPI_DL_CONFIG_CSI_RS_PDU_TYPE: {
-        if(!(pack_tlv(NFAPI_DL_CONFIG_REQUEST_CSI_RS_PDU_REL10_TAG, &pdu->csi_rs_pdu.csi_rs_pdu_rel10, ppWritePackedMsg, end,  &pack_dl_config_csi_rs_pdu_rel10_value) &&
-             pack_tlv(NFAPI_DL_CONFIG_REQUEST_CSI_RS_PDU_REL13_TAG, &pdu->csi_rs_pdu.csi_rs_pdu_rel13, ppWritePackedMsg, end,  &pack_dl_config_csi_rs_pdu_rel13_value)))
-          return 0;
-      }
-      break;
-
-      case NFAPI_DL_CONFIG_EPDCCH_DL_PDU_TYPE: {
-        if(!(pack_tlv(NFAPI_DL_CONFIG_REQUEST_EPDCCH_PDU_REL8_TAG, &pdu->epdcch_pdu.epdcch_pdu_rel8, ppWritePackedMsg, end, &pack_dl_config_dci_dl_pdu_rel8_value) &&
-             pack_tlv(NFAPI_DL_CONFIG_REQUEST_EPDCCH_PDU_REL9_TAG, &pdu->epdcch_pdu.epdcch_pdu_rel9, ppWritePackedMsg, end, &pack_dl_config_dci_dl_pdu_rel9_value) &&
-             pack_tlv(NFAPI_DL_CONFIG_REQUEST_EPDCCH_PDU_REL10_TAG, &pdu->epdcch_pdu.epdcch_pdu_rel10, ppWritePackedMsg, end, &pack_dl_config_dci_dl_pdu_rel10_value) &&
-             pack_tlv(NFAPI_DL_CONFIG_REQUEST_EPDCCH_PDU_REL11_TAG, &pdu->epdcch_pdu.epdcch_pdu_rel11, ppWritePackedMsg, end, &pack_dl_config_dci_dl_pdu_rel11_value) &&
-             pack_tlv(NFAPI_DL_CONFIG_REQUEST_EPDCCH_PDU_REL12_TAG, &pdu->epdcch_pdu.epdcch_pdu_rel12, ppWritePackedMsg, end, &pack_dl_config_dci_dl_pdu_rel12_value) &&
-             pack_tlv(NFAPI_DL_CONFIG_REQUEST_EPDCCH_PDU_REL13_TAG, &pdu->epdcch_pdu.epdcch_pdu_rel13, ppWritePackedMsg, end, &pack_dl_config_dci_dl_pdu_rel13_value) &&
-             pack_tlv(NFAPI_DL_CONFIG_REQUEST_EPDCCH_PARAM_REL11_TAG, &pdu->epdcch_pdu.epdcch_params_rel11, ppWritePackedMsg, end, &pack_dl_config_epdcch_parameters_rel11_value) &
-             pack_tlv(NFAPI_DL_CONFIG_REQUEST_EPDCCH_PARAM_REL13_TAG, &pdu->epdcch_pdu.epdcch_params_rel13, ppWritePackedMsg, end, &pack_dl_config_epdcch_parameters_rel13_value)))
-          return 0;
-      }
-      break;
-
-      case NFAPI_DL_CONFIG_MPDCCH_PDU_TYPE: {
-        if(!(pack_tlv(NFAPI_DL_CONFIG_REQUEST_MPDCCH_PDU_REL13_TAG, &pdu->mpdcch_pdu.mpdcch_pdu_rel13, ppWritePackedMsg, end, &pack_dl_config_mpdcch_pdu_rel13_value)))
-          return 0;
-      }
-      break;
-
-      case NFAPI_DL_CONFIG_NBCH_PDU_TYPE: {
-        if(!(pack_tlv(NFAPI_DL_CONFIG_REQUEST_NBCH_PDU_REL13_TAG, &pdu->nbch_pdu.nbch_pdu_rel13, ppWritePackedMsg, end, &pack_dl_config_nbch_pdu_rel13_value)))
-          return 0;
-      }
-      break;
-
-      case NFAPI_DL_CONFIG_NPDCCH_PDU_TYPE: {
-        if(!(pack_tlv(NFAPI_DL_CONFIG_REQUEST_NPDCCH_PDU_REL13_TAG, &pdu->npdcch_pdu.npdcch_pdu_rel13, ppWritePackedMsg, end, &pack_dl_config_npdcch_pdu_rel13_value)))
-          return 0;
-      }
-      break;
-
-      case NFAPI_DL_CONFIG_NDLSCH_PDU_TYPE: {
-        if(!(pack_tlv(NFAPI_DL_CONFIG_REQUEST_NDLSCH_PDU_REL13_TAG, &pdu->ndlsch_pdu.ndlsch_pdu_rel13, ppWritePackedMsg, end, &pack_dl_config_ndlsch_pdu_rel13_value)))
-          return 0;
-      }
-      break;
-
-      default: {
-        NFAPI_TRACE(NFAPI_TRACE_ERROR, "FIXME : Invalid pdu type %d \n", pdu->pdu_type );
-      }
-      break;
-    };
-
-    // add 1 for the pdu_type. The delta will include the pdu_size
-    pdu->pdu_size = 1 + (*ppWritePackedMsg - pWritePackedMsgPduSize);
-
-    push8(pdu->pdu_size, &pWritePackedMsgPduSize, end);
-  }
-
-  return 1;
-}
-
-
-static uint8_t pack_dl_tti_request(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p7_codec_config_t *config) {
-  nfapi_nr_dl_tti_request_t *pNfapiMsg = (nfapi_nr_dl_tti_request_t *)msg;
-
-  if (!(push16(pNfapiMsg->SFN, ppWritePackedMsg, end) &&
-        push16(pNfapiMsg->Slot, ppWritePackedMsg, end) &&
-        push8(pNfapiMsg->dl_tti_request_body.nGroup, ppWritePackedMsg, end) &&
-        push8(pNfapiMsg->dl_tti_request_body.nPDUs, ppWritePackedMsg, end) &&
-        pusharray8(pNfapiMsg->dl_tti_request_body.nUe,256,pNfapiMsg->dl_tti_request_body.nGroup, ppWritePackedMsg, end)
-        //pusharray8(pNfapiMsg->PduIdx[0] ,256,256, ppWritePackedMsg, end)
-       ))
-    return 0;
-
-  int arr[12];
-
-  for(int i=0; i<pNfapiMsg->dl_tti_request_body.nGroup; i++) {
-    for(int j=0; j<pNfapiMsg->dl_tti_request_body.nUe[i]; j++) {
-      arr[j] = pNfapiMsg->dl_tti_request_body.PduIdx[i][j];
-    }
-
-    if(!(pusharrays32(arr,12,pNfapiMsg->dl_tti_request_body.nUe[i],ppWritePackedMsg, end)))
-      return 0;
-  }
-
-  for(int i=0; i<pNfapiMsg->dl_tti_request_body.nPDUs; i++) {
-    if(!pack_dl_tti_request_body_value(&pNfapiMsg->dl_tti_request_body.dl_tti_pdu_list[i],ppWritePackedMsg,end))
-      return 0;
-  }
-
-  return 1;
-}
-
-
-static uint8_t pack_dl_config_request(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p7_codec_config_t *config) {
-  nfapi_dl_config_request_t *pNfapiMsg = (nfapi_dl_config_request_t *)msg;
-  //return ( push16(pNfapiMsg->sfn_sf, ppWritePackedMsg, end) &&
-  //pack_tlv(NFAPI_DL_CONFIG_REQUEST_BODY_TAG, &pNfapiMsg->dl_config_request_body, ppWritePackedMsg, end, &pack_dl_config_request_body_value) &&
-  //pack_p7_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config));
-  {
-    uint8_t x = push16(pNfapiMsg->sfn_sf, ppWritePackedMsg, end);
-    uint8_t y = pack_tlv(NFAPI_DL_CONFIG_REQUEST_BODY_TAG, &pNfapiMsg->dl_config_request_body, ppWritePackedMsg, end, &pack_dl_config_request_body_value);
-    uint8_t z = pack_p7_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config);
-
-    if (!x || !y || !z) {
-      NFAPI_TRACE(NFAPI_TRACE_INFO, "%s() NFAPI_DL_CONFIG_REQUEST x:%u y:%u z:%u \n", __FUNCTION__,x,y,z);
-    }
-
-    return x && y && z;
-  }
-}
-
-
-
-
-static uint8_t pack_ul_config_request_ulsch_rel8_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
-  nfapi_ul_config_ulsch_pdu_rel8_t *ulsch_pdu_rel8 = (nfapi_ul_config_ulsch_pdu_rel8_t *)tlv;
-  return( push32(ulsch_pdu_rel8->handle, ppWritePackedMsg, end) &&
-          push16(ulsch_pdu_rel8->size, ppWritePackedMsg, end) &&
-          push16(ulsch_pdu_rel8->rnti, ppWritePackedMsg, end) &&
-          push8(ulsch_pdu_rel8->resource_block_start, ppWritePackedMsg, end) &&
-          push8(ulsch_pdu_rel8->number_of_resource_blocks, ppWritePackedMsg, end) &&
-          push8(ulsch_pdu_rel8->modulation_type, ppWritePackedMsg, end) &&
-          push8(ulsch_pdu_rel8->cyclic_shift_2_for_drms, ppWritePackedMsg, end) &&
-          push8(ulsch_pdu_rel8->frequency_hopping_enabled_flag, ppWritePackedMsg, end) &&
-          push8(ulsch_pdu_rel8->frequency_hopping_bits, ppWritePackedMsg, end) &&
-          push8(ulsch_pdu_rel8->new_data_indication, ppWritePackedMsg, end) &&
-          push8(ulsch_pdu_rel8->redundancy_version, ppWritePackedMsg, end) &&
-          push8(ulsch_pdu_rel8->harq_process_number, ppWritePackedMsg, end) &&
-          push8(ulsch_pdu_rel8->ul_tx_mode, ppWritePackedMsg, end) &&
-          push8(ulsch_pdu_rel8->current_tx_nb, ppWritePackedMsg, end) &&
-          push8(ulsch_pdu_rel8->n_srs, ppWritePackedMsg, end));
-}
-static uint8_t pack_ul_config_request_ulsch_rel10_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
-  nfapi_ul_config_ulsch_pdu_rel10_t *ulsch_pdu_rel10 = (nfapi_ul_config_ulsch_pdu_rel10_t *)tlv;
-  return (push8(ulsch_pdu_rel10->resource_allocation_type, ppWritePackedMsg, end) &&
-          push32(ulsch_pdu_rel10->resource_block_coding, ppWritePackedMsg, end) &&
-          push8(ulsch_pdu_rel10->transport_blocks, ppWritePackedMsg, end) &&
-          push8(ulsch_pdu_rel10->transmission_scheme, ppWritePackedMsg, end) &&
-          push8(ulsch_pdu_rel10->number_of_layers, ppWritePackedMsg, end) &&
-          push8(ulsch_pdu_rel10->codebook_index, ppWritePackedMsg, end) &&
-          push8(ulsch_pdu_rel10->disable_sequence_hopping_flag, ppWritePackedMsg, end));
-}
-
-static uint8_t pack_ul_config_request_ulsch_rel11_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
-  nfapi_ul_config_ulsch_pdu_rel11_t *ulsch_pdu_rel11 = (nfapi_ul_config_ulsch_pdu_rel11_t *)tlv;
-  return (push8(ulsch_pdu_rel11->virtual_cell_id_enabled_flag, ppWritePackedMsg, end) &&
-          push16(ulsch_pdu_rel11->npusch_identity, ppWritePackedMsg, end) &&
-          push8(ulsch_pdu_rel11->dmrs_config_flag, ppWritePackedMsg, end) &&
-          push16(ulsch_pdu_rel11->ndmrs_csh_identity, ppWritePackedMsg, end));
-}
-
-static uint8_t pack_ul_config_request_ulsch_rel13_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
-  nfapi_ul_config_ulsch_pdu_rel13_t *ulsch_pdu_rel13 = (nfapi_ul_config_ulsch_pdu_rel13_t *)tlv;
-  return (push8(ulsch_pdu_rel13->ue_type, ppWritePackedMsg, end) &&
-          push16(ulsch_pdu_rel13->total_number_of_repetitions, ppWritePackedMsg, end) &&
-          push16(ulsch_pdu_rel13->repetition_number, ppWritePackedMsg, end) &&
-          push16(ulsch_pdu_rel13->initial_transmission_sf_io, ppWritePackedMsg, end) &&
-          push8(ulsch_pdu_rel13->empty_symbols_due_to_re_tunning, ppWritePackedMsg, end));
-}
-
-//Pack fns for ul_tti PDUS
-
-
-static uint8_t pack_ul_tti_request_prach_pdu(nfapi_nr_prach_pdu_t *prach_pdu, uint8_t **ppWritePackedMsg, uint8_t *end) {
-  return(
-          push16(prach_pdu->phys_cell_id, ppWritePackedMsg, end) &&
-          push8(prach_pdu->num_prach_ocas, ppWritePackedMsg, end) &&
-          push8(prach_pdu->prach_format, ppWritePackedMsg, end) &&
-          push8(prach_pdu->num_ra, ppWritePackedMsg, end) &&
-          push8(prach_pdu->prach_start_symbol, ppWritePackedMsg, end) &&
-          push16(prach_pdu->num_cs, ppWritePackedMsg, end)
-          // TODO: ignoring beamforming tlv for now
-        );
-}
-
-static uint8_t pack_ul_tti_request_pucch_pdu(nfapi_nr_pucch_pdu_t *pucch_pdu, uint8_t **ppWritePackedMsg, uint8_t *end) {
-  return(
-          push16(pucch_pdu->rnti, ppWritePackedMsg, end) &&
-          push32(pucch_pdu->handle, ppWritePackedMsg, end) &&
-          push16(pucch_pdu->bwp_size, ppWritePackedMsg, end) &&
-          push16(pucch_pdu->bwp_start, ppWritePackedMsg, end) &&
-          push8(pucch_pdu->subcarrier_spacing, ppWritePackedMsg, end) &&
-          push8(pucch_pdu->cyclic_prefix, ppWritePackedMsg, end) &&
-          push8(pucch_pdu->format_type, ppWritePackedMsg, end) &&
-          push8(pucch_pdu->multi_slot_tx_indicator, ppWritePackedMsg, end) &&
-          push16(pucch_pdu->prb_start, ppWritePackedMsg, end) &&
-          push16(pucch_pdu->prb_size, ppWritePackedMsg, end) &&
-          push8(pucch_pdu->start_symbol_index, ppWritePackedMsg, end) &&
-          push8(pucch_pdu->nr_of_symbols, ppWritePackedMsg, end) &&
-          push8(pucch_pdu->freq_hop_flag, ppWritePackedMsg, end) &&
-          push16(pucch_pdu->second_hop_prb, ppWritePackedMsg, end) &&
-          push8(pucch_pdu->group_hop_flag, ppWritePackedMsg, end) &&
-          push8(pucch_pdu->sequence_hop_flag, ppWritePackedMsg, end) &&
-          push16(pucch_pdu->hopping_id, ppWritePackedMsg, end) &&
-          push16(pucch_pdu->initial_cyclic_shift, ppWritePackedMsg, end) &&
-          push16(pucch_pdu->data_scrambling_id, ppWritePackedMsg, end) &&
-          push8(pucch_pdu->time_domain_occ_idx, ppWritePackedMsg, end) &&
-          push8(pucch_pdu->pre_dft_occ_idx, ppWritePackedMsg, end) &&
-          push8(pucch_pdu->pre_dft_occ_len, ppWritePackedMsg, end) &&
-          push8(pucch_pdu->add_dmrs_flag, ppWritePackedMsg, end) &&
-          push16(pucch_pdu->dmrs_scrambling_id, ppWritePackedMsg, end) &&
-          push8(pucch_pdu->dmrs_cyclic_shift, ppWritePackedMsg, end) &&
-          push8(pucch_pdu->sr_flag, ppWritePackedMsg, end) &&
-          push8(pucch_pdu->bit_len_harq, ppWritePackedMsg, end) &&
-          push16(pucch_pdu->bit_len_csi_part1, ppWritePackedMsg, end) &&
-          push16(pucch_pdu->bit_len_csi_part2, ppWritePackedMsg, end)
-          // TODO: ignoring beamforming tlv for now
-        );
-}
-
-
-static uint8_t pack_ul_tti_request_pusch_pdu(nfapi_nr_pusch_pdu_t *pusch_pdu, uint8_t **ppWritePackedMsg, uint8_t *end) {
-  if (!(
-        push16(pusch_pdu->pdu_bit_map, ppWritePackedMsg, end) &&
-        push16(pusch_pdu->rnti, ppWritePackedMsg, end) &&
-        push32(pusch_pdu->handle, ppWritePackedMsg, end) &&
-        push16(pusch_pdu->bwp_size, ppWritePackedMsg, end) &&
-        push16(pusch_pdu->bwp_start, ppWritePackedMsg, end) &&
-        push8(pusch_pdu->subcarrier_spacing, ppWritePackedMsg, end) &&
-        push8(pusch_pdu->cyclic_prefix, ppWritePackedMsg, end) &&
-        push16(pusch_pdu->target_code_rate, ppWritePackedMsg, end) &&
-        push8(pusch_pdu->qam_mod_order, ppWritePackedMsg, end) &&
-        push8(pusch_pdu->mcs_index, ppWritePackedMsg, end) &&
-        push8(pusch_pdu->mcs_table, ppWritePackedMsg, end) &&
-        push8(pusch_pdu->transform_precoding, ppWritePackedMsg, end) &&
-        push16(pusch_pdu->data_scrambling_id, ppWritePackedMsg, end) &&
-        push8(pusch_pdu->nrOfLayers, ppWritePackedMsg, end) &&
-        push16(pusch_pdu->ul_dmrs_symb_pos, ppWritePackedMsg, end) &&
-        push8(pusch_pdu->dmrs_config_type, ppWritePackedMsg, end) &&
-        push16(pusch_pdu->ul_dmrs_scrambling_id, ppWritePackedMsg, end) &&
-        push8(pusch_pdu->scid, ppWritePackedMsg, end) &&
-        push8(pusch_pdu->num_dmrs_cdm_grps_no_data, ppWritePackedMsg, end) &&
-        push16(pusch_pdu->dmrs_ports, ppWritePackedMsg, end) &&
-        push8(pusch_pdu->resource_alloc, ppWritePackedMsg, end) &&
-        push8(pusch_pdu->resource_alloc,ppWritePackedMsg, end) &&
-        push16(pusch_pdu->dmrs_ports, ppWritePackedMsg, end) &&
-        push16(pusch_pdu->rb_start, ppWritePackedMsg, end) &&
-        push16(pusch_pdu->rb_size, ppWritePackedMsg, end) &&
-        push8(pusch_pdu->vrb_to_prb_mapping, ppWritePackedMsg, end) &&
-        push8(pusch_pdu->frequency_hopping, ppWritePackedMsg, end) &&
-        push16(pusch_pdu->tx_direct_current_location, ppWritePackedMsg, end) &&
-        push8(pusch_pdu->uplink_frequency_shift_7p5khz, ppWritePackedMsg, end) &&
-        push8(pusch_pdu->start_symbol_index, ppWritePackedMsg, end) &&
-        push8(pusch_pdu->nr_of_symbols, ppWritePackedMsg, end)
-        // TODO: ignoring beamforming tlv for now
-      ))
-    return 0;
-
-  //Pack Optional Data only included if indicated in pduBitmap
-  switch(pusch_pdu->pdu_bit_map) {
-    case PUSCH_PDU_BITMAP_PUSCH_DATA: {
-      // pack optional TLVs
-      return(
-              push8(pusch_pdu->pusch_data.rv_index, ppWritePackedMsg, end) &&
-              push8(pusch_pdu->pusch_data.harq_process_id, ppWritePackedMsg, end) &&
-              push32(pusch_pdu->pusch_data.tb_size, ppWritePackedMsg, end) &&
-              push16(pusch_pdu->pusch_data.num_cb, ppWritePackedMsg, end) &&
-              pusharray8(pusch_pdu->pusch_data.cb_present_and_position,1,1,ppWritePackedMsg, end)
-            );
-    }
-    break;
-
-    case PUSCH_PDU_BITMAP_PUSCH_UCI: {
-      return(
-              push16(pusch_pdu->pusch_uci.harq_ack_bit_length, ppWritePackedMsg, end) &&
-              push16(pusch_pdu->pusch_uci.csi_part1_bit_length, ppWritePackedMsg, end) &&
-              push16(pusch_pdu->pusch_uci.csi_part2_bit_length, ppWritePackedMsg, end) &&
-              push8(pusch_pdu->pusch_uci.alpha_scaling, ppWritePackedMsg, end) &&
-              push8(pusch_pdu->pusch_uci.beta_offset_harq_ack, ppWritePackedMsg, end) &&
-              push8(pusch_pdu->pusch_uci.beta_offset_csi1, ppWritePackedMsg, end) &&
-              push8(pusch_pdu->pusch_uci.beta_offset_csi2, ppWritePackedMsg, end)
-            );
-    }
-    break;
-
-    case PUSCH_PDU_BITMAP_PUSCH_PTRS: {
-      return(
-              push8(pusch_pdu->pusch_ptrs.num_ptrs_ports, ppWritePackedMsg, end) &&
-              push8(pusch_pdu->pusch_ptrs.ptrs_ports_list->ptrs_dmrs_port, ppWritePackedMsg, end) &&
-              push16(pusch_pdu->pusch_ptrs.ptrs_ports_list->ptrs_port_index, ppWritePackedMsg, end) &&
-              push8(pusch_pdu->pusch_ptrs.ptrs_ports_list->ptrs_re_offset, ppWritePackedMsg, end) &&
-              push8(pusch_pdu->pusch_ptrs.ptrs_time_density, ppWritePackedMsg, end) &&
-              push8(pusch_pdu->pusch_ptrs.ptrs_freq_density, ppWritePackedMsg, end) &&
-              push8(pusch_pdu->pusch_ptrs.ul_ptrs_power, ppWritePackedMsg, end)
-            );
-    }
-    break;
-
-    case PUSCH_PDU_BITMAP_DFTS_OFDM: {
-      return(
-              push8(pusch_pdu->dfts_ofdm.low_papr_group_number, ppWritePackedMsg, end) &&
-              push16(pusch_pdu->dfts_ofdm.low_papr_sequence_number, ppWritePackedMsg, end) &&
-              push8(pusch_pdu->dfts_ofdm.ul_ptrs_sample_density, ppWritePackedMsg, end) &&
-              push8(pusch_pdu->dfts_ofdm.ul_ptrs_time_density_transform_precoding, ppWritePackedMsg, end)
-            );
-    }
-    break;
-
-    default: {
-      NFAPI_TRACE(NFAPI_TRACE_INFO, "Invalid pdu bitmap %d \n", pusch_pdu->pdu_bit_map );
-    }
-  }
-
-  return 1;
-}
-
-static uint8_t pack_ul_tti_request_srs_pdu(nfapi_nr_srs_pdu_t *srs_pdu, uint8_t **ppWritePackedMsg, uint8_t *end) {
-  return(
-          push16(srs_pdu->rnti, ppWritePackedMsg, end) &&
-          push32(srs_pdu->handle, ppWritePackedMsg, end) &&
-          push16(srs_pdu->bwp_size, ppWritePackedMsg, end) &&
-          push16(srs_pdu->bwp_start, ppWritePackedMsg, end) &&
-          push8(srs_pdu->subcarrier_spacing, ppWritePackedMsg, end) &&
-          push8(srs_pdu->cyclic_prefix, ppWritePackedMsg, end) &&
-          push8(srs_pdu->num_ant_ports, ppWritePackedMsg, end) &&
-          push8(srs_pdu->num_symbols, ppWritePackedMsg, end) &&
-          push8(srs_pdu->num_repetitions, ppWritePackedMsg, end) &&
-          push8(srs_pdu->time_start_position, ppWritePackedMsg, end) &&
-          push8(srs_pdu->config_index, ppWritePackedMsg, end) &&
-          push16(srs_pdu->sequence_id, ppWritePackedMsg, end) &&
-          push8(srs_pdu->bandwidth_index, ppWritePackedMsg, end) &&
-          push8(srs_pdu->comb_size, ppWritePackedMsg, end) &&
-          push8(srs_pdu->comb_offset, ppWritePackedMsg, end) &&
-          push8(srs_pdu->cyclic_shift, ppWritePackedMsg, end) &&
-          push8(srs_pdu->frequency_position, ppWritePackedMsg, end) &&
-          push8(srs_pdu->frequency_shift, ppWritePackedMsg, end) &&
-          push8(srs_pdu->frequency_hopping, ppWritePackedMsg, end) &&
-          push8(srs_pdu->group_or_sequence_hopping, ppWritePackedMsg, end) &&
-          push8(srs_pdu->resource_type, ppWritePackedMsg, end) &&
-          push16(srs_pdu->t_srs, ppWritePackedMsg, end) &&
-          push16(srs_pdu->t_offset, ppWritePackedMsg, end)
-          // TODO: ignoring beamforming tlv for now
-        );
-}
-
-static uint8_t pack_ul_config_request_ulsch_pdu(nfapi_ul_config_ulsch_pdu *ulsch_pdu, uint8_t **ppWritePackedMsg, uint8_t *end) {
-  return ( pack_tlv(NFAPI_UL_CONFIG_REQUEST_ULSCH_PDU_REL8_TAG, &ulsch_pdu->ulsch_pdu_rel8, ppWritePackedMsg, end, &pack_ul_config_request_ulsch_rel8_value) &&
-           pack_tlv(NFAPI_UL_CONFIG_REQUEST_ULSCH_PDU_REL10_TAG, &ulsch_pdu->ulsch_pdu_rel10, ppWritePackedMsg, end, &pack_ul_config_request_ulsch_rel10_value) &&
-           pack_tlv(NFAPI_UL_CONFIG_REQUEST_ULSCH_PDU_REL11_TAG, &ulsch_pdu->ulsch_pdu_rel11, ppWritePackedMsg, end, &pack_ul_config_request_ulsch_rel11_value) &&
-           pack_tlv(NFAPI_UL_CONFIG_REQUEST_ULSCH_PDU_REL13_TAG, &ulsch_pdu->ulsch_pdu_rel13, ppWritePackedMsg, end, &pack_ul_config_request_ulsch_rel13_value));
-}
-
-static uint8_t pack_ul_config_request_cqi_ri_rel8_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
-  nfapi_ul_config_cqi_ri_information_rel8_t *cqi_ri_info_rel8 = (nfapi_ul_config_cqi_ri_information_rel8_t *)tlv;
-  return ( push8(cqi_ri_info_rel8->dl_cqi_pmi_size_rank_1, ppWritePackedMsg, end) &&
-           push8(cqi_ri_info_rel8->dl_cqi_pmi_size_rank_greater_1, ppWritePackedMsg, end) &&
-           push8(cqi_ri_info_rel8->ri_size, ppWritePackedMsg, end) &&
-           push8(cqi_ri_info_rel8->delta_offset_cqi, ppWritePackedMsg, end) &&
-           push8(cqi_ri_info_rel8->delta_offset_ri, ppWritePackedMsg, end));
-}
-
-static uint8_t pack_ul_config_request_cqi_ri_rel9_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
-  nfapi_ul_config_cqi_ri_information_rel9_t *cqi_ri_info_rel9 = (nfapi_ul_config_cqi_ri_information_rel9_t *)tlv;
-
-  if(!(push8(cqi_ri_info_rel9->report_type, ppWritePackedMsg, end) &&
-       push8(cqi_ri_info_rel9->delta_offset_cqi, ppWritePackedMsg, end) &&
-       push8(cqi_ri_info_rel9->delta_offset_ri, ppWritePackedMsg, end))) {
-    return 0;
-  }
-
-  switch(cqi_ri_info_rel9->report_type) {
-    case NFAPI_CSI_REPORT_TYPE_PERIODIC: {
-      if(!(push8(cqi_ri_info_rel9->periodic_cqi_pmi_ri_report.dl_cqi_pmi_ri_size, ppWritePackedMsg, end) &&
-           push8(cqi_ri_info_rel9->periodic_cqi_pmi_ri_report.control_type, ppWritePackedMsg, end))) {
-        return 0;
-      }
-    }
-    break;
-
-    case NFAPI_CSI_REPORT_TYPE_APERIODIC: {
-      if(push8(cqi_ri_info_rel9->aperiodic_cqi_pmi_ri_report.number_of_cc, ppWritePackedMsg, end) == 0)
-        return 0;
-
-      uint8_t i;
-
-      for(i = 0; i < cqi_ri_info_rel9->aperiodic_cqi_pmi_ri_report.number_of_cc; ++i) {
-        if(push8(cqi_ri_info_rel9->aperiodic_cqi_pmi_ri_report.cc[i].ri_size, ppWritePackedMsg, end) == 0)
-          return 0;
-
-        uint8_t j;
-
-        for(j = 0; j < 8; ++j) {
-          if(push8(cqi_ri_info_rel9->aperiodic_cqi_pmi_ri_report.cc[i].dl_cqi_pmi_size[j], ppWritePackedMsg, end) == 0)
-            return 0;
-        }
-      }
-    }
-    break;
-
-    default: {
-      NFAPI_TRACE(NFAPI_TRACE_ERROR, "FIXME : Invalid report type %d \n", cqi_ri_info_rel9->report_type );
-    }
-    break;
-  };
-
-  return 1;
-}
-
-static uint8_t pack_ul_config_request_cqi_ri_rel13_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
-  nfapi_ul_config_cqi_ri_information_rel13_t *cqi_ri_info_rel13 = (nfapi_ul_config_cqi_ri_information_rel13_t *)tlv;
-
-  switch(cqi_ri_info_rel13->report_type) {
-    case NFAPI_CSI_REPORT_TYPE_PERIODIC: {
-      if(push16(cqi_ri_info_rel13->periodic_cqi_pmi_ri_report.dl_cqi_pmi_ri_size_2, ppWritePackedMsg, end) == 0)
-        return 0;
-    }
-    break;
-
-    case NFAPI_CSI_REPORT_TYPE_APERIODIC: {
-      // No parameters
-    }
-    break;
-
-    default: {
-      NFAPI_TRACE(NFAPI_TRACE_ERROR, "FIXME : Invalid report type %d \n", cqi_ri_info_rel13->report_type );
-    }
-    break;
-  };
-
-  return 1;
-}
-
-static uint8_t pack_ul_config_request_cqi_ri_information(nfapi_ul_config_cqi_ri_information *cqi_ri_info, uint8_t **ppWritePackedMsg, uint8_t *end) {
-  return (pack_tlv(NFAPI_UL_CONFIG_REQUEST_CQI_RI_INFORMATION_REL8_TAG, &cqi_ri_info->cqi_ri_information_rel8, ppWritePackedMsg, end, &pack_ul_config_request_cqi_ri_rel8_value) &&
-          pack_tlv(NFAPI_UL_CONFIG_REQUEST_CQI_RI_INFORMATION_REL9_TAG, &cqi_ri_info->cqi_ri_information_rel9, ppWritePackedMsg, end, &pack_ul_config_request_cqi_ri_rel9_value) &&
-          pack_tlv(NFAPI_UL_CONFIG_REQUEST_CQI_RI_INFORMATION_REL13_TAG, &cqi_ri_info->cqi_ri_information_rel13, ppWritePackedMsg, end, &pack_ul_config_request_cqi_ri_rel13_value));
-}
-
-static uint8_t pack_ul_config_request_init_tx_params_rel8_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
-  nfapi_ul_config_initial_transmission_parameters_rel8_t *init_tx_params_rel8 = (nfapi_ul_config_initial_transmission_parameters_rel8_t *)tlv;
-  return (push8(init_tx_params_rel8->n_srs_initial, ppWritePackedMsg, end) &&
-          push8(init_tx_params_rel8->initial_number_of_resource_blocks, ppWritePackedMsg, end));
-}
-
-static uint8_t pack_ul_config_request_initial_transmission_parameters(nfapi_ul_config_initial_transmission_parameters *init_tx_params, uint8_t **ppWritePackedMsg, uint8_t *end) {
-  return pack_tlv(NFAPI_UL_CONFIG_REQUEST_INITIAL_TRANSMISSION_PARAMETERS_REL8_TAG, &init_tx_params->initial_transmission_parameters_rel8, ppWritePackedMsg, end,
-                  &pack_ul_config_request_init_tx_params_rel8_value);
-}
-
-static uint8_t pack_ul_config_request_ulsch_harq_info_rel10_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
-  nfapi_ul_config_ulsch_harq_information_rel10_t *harq_info_rel10 = (nfapi_ul_config_ulsch_harq_information_rel10_t *)tlv;
-  return (push8(harq_info_rel10->harq_size, ppWritePackedMsg, end) &&
-          push8(harq_info_rel10->delta_offset_harq, ppWritePackedMsg, end) &&
-          push8(harq_info_rel10->ack_nack_mode, ppWritePackedMsg, end));
-}
-static uint8_t pack_ul_config_request_ulsch_harq_info_rel13_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
-  nfapi_ul_config_ulsch_harq_information_rel13_t *harq_info_rel13 = (nfapi_ul_config_ulsch_harq_information_rel13_t *)tlv;
-  return (push16(harq_info_rel13->harq_size_2, ppWritePackedMsg, end) &&
-          push8(harq_info_rel13->delta_offset_harq_2, ppWritePackedMsg, end));
-}
-
-static uint8_t pack_ul_config_request_ulsch_harq_information(nfapi_ul_config_ulsch_harq_information *harq_info, uint8_t **ppWritePackedMsg, uint8_t *end) {
-  return ( pack_tlv(NFAPI_UL_CONFIG_REQUEST_ULSCH_HARQ_INFORMATION_REL10_TAG, &harq_info->harq_information_rel10, ppWritePackedMsg, end, &pack_ul_config_request_ulsch_harq_info_rel10_value) &&
-           pack_tlv(NFAPI_UL_CONFIG_REQUEST_ULSCH_HARQ_INFORMATION_REL13_TAG, &harq_info->harq_information_rel13, ppWritePackedMsg, end, &pack_ul_config_request_ulsch_harq_info_rel13_value));
-}
-
-static uint8_t pack_ul_config_request_ue_info_rel8_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
-  nfapi_ul_config_ue_information_rel8_t *ue_info_rel8 = (nfapi_ul_config_ue_information_rel8_t *)tlv;
-  return ( push32(ue_info_rel8->handle, ppWritePackedMsg, end) &&
-           push16(ue_info_rel8->rnti, ppWritePackedMsg, end));
-}
-static uint8_t pack_ul_config_request_ue_info_rel11_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
-  nfapi_ul_config_ue_information_rel11_t *ue_info_rel11 = (nfapi_ul_config_ue_information_rel11_t *)tlv;
-  return ( push8(ue_info_rel11->virtual_cell_id_enabled_flag, ppWritePackedMsg, end) &&
-           push16(ue_info_rel11->npusch_identity, ppWritePackedMsg, end));
-}
-static uint8_t pack_ul_config_request_ue_info_rel13_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
-  nfapi_ul_config_ue_information_rel13_t *ue_info_rel13 = (nfapi_ul_config_ue_information_rel13_t *)tlv;
-  return ( push8(ue_info_rel13->ue_type, ppWritePackedMsg, end) &&
-           push8(ue_info_rel13->empty_symbols, ppWritePackedMsg, end) &&
-           push16(ue_info_rel13->total_number_of_repetitions, ppWritePackedMsg, end) &&
-           push16(ue_info_rel13->repetition_number, ppWritePackedMsg, end));
-}
-
-static uint8_t pack_ul_config_request_ue_information(nfapi_ul_config_ue_information *ue_info, uint8_t **ppWritePackedMsg, uint8_t *end) {
-  return ( pack_tlv(NFAPI_UL_CONFIG_REQUEST_UE_INFORMATION_REL8_TAG, &ue_info->ue_information_rel8, ppWritePackedMsg, end, &pack_ul_config_request_ue_info_rel8_value) &&
-           pack_tlv(NFAPI_UL_CONFIG_REQUEST_UE_INFORMATION_REL11_TAG, &ue_info->ue_information_rel11, ppWritePackedMsg, end, &pack_ul_config_request_ue_info_rel11_value) &&
-           pack_tlv(NFAPI_UL_CONFIG_REQUEST_UE_INFORMATION_REL13_TAG, &ue_info->ue_information_rel13, ppWritePackedMsg, end, &pack_ul_config_request_ue_info_rel13_value));
-}
-
-static uint8_t pack_ul_config_request_harq_info_rel10_tdd_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
-  nfapi_ul_config_harq_information_rel10_tdd_t *harq_info_rel10_tdd = (nfapi_ul_config_harq_information_rel10_tdd_t *)tlv;
-  return ( push8(harq_info_rel10_tdd->harq_size, ppWritePackedMsg, end) &&
-           push8(harq_info_rel10_tdd->ack_nack_mode, ppWritePackedMsg, end) &&
-           push8(harq_info_rel10_tdd->number_of_pucch_resources, ppWritePackedMsg, end) &&
-           push16(harq_info_rel10_tdd->n_pucch_1_0, ppWritePackedMsg, end) &&
-           push16(harq_info_rel10_tdd->n_pucch_1_1, ppWritePackedMsg, end) &&
-           push16(harq_info_rel10_tdd->n_pucch_1_2, ppWritePackedMsg, end) &&
-           push16(harq_info_rel10_tdd->n_pucch_1_3, ppWritePackedMsg, end));
-}
-static uint8_t pack_ul_config_request_harq_info_rel8_fdd_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
-  nfapi_ul_config_harq_information_rel8_fdd_t *harq_info_rel8_fdd = (nfapi_ul_config_harq_information_rel8_fdd_t *)tlv;
-  return ( push16(harq_info_rel8_fdd->n_pucch_1_0, ppWritePackedMsg, end) &&
-           push8(harq_info_rel8_fdd->harq_size, ppWritePackedMsg, end));
-}
-static uint8_t pack_ul_config_request_harq_info_rel9_fdd_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
-  nfapi_ul_config_harq_information_rel9_fdd_t *harq_info_rel9_fdd = (nfapi_ul_config_harq_information_rel9_fdd_t *)tlv;
-  return ( push8(harq_info_rel9_fdd->harq_size, ppWritePackedMsg, end) &&
-           push8(harq_info_rel9_fdd->ack_nack_mode, ppWritePackedMsg, end) &&
-           push8(harq_info_rel9_fdd->number_of_pucch_resources, ppWritePackedMsg, end) &&
-           push16(harq_info_rel9_fdd->n_pucch_1_0, ppWritePackedMsg, end) &&
-           push16(harq_info_rel9_fdd->n_pucch_1_1, ppWritePackedMsg, end) &&
-           push16(harq_info_rel9_fdd->n_pucch_1_2, ppWritePackedMsg, end) &&
-           push16(harq_info_rel9_fdd->n_pucch_1_3, ppWritePackedMsg, end));
-}
-static uint8_t pack_ul_config_request_harq_info_rel11_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
-  nfapi_ul_config_harq_information_rel11_t *harq_info_rel11 = (nfapi_ul_config_harq_information_rel11_t *)tlv;
-  return ( push8(harq_info_rel11->num_ant_ports, ppWritePackedMsg, end) &&
-           push16(harq_info_rel11->n_pucch_2_0, ppWritePackedMsg, end) &&
-           push16(harq_info_rel11->n_pucch_2_1, ppWritePackedMsg, end) &&
-           push16(harq_info_rel11->n_pucch_2_2, ppWritePackedMsg, end) &&
-           push16(harq_info_rel11->n_pucch_2_3, ppWritePackedMsg, end));
-}
-static uint8_t pack_ul_config_request_harq_info_rel13_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
-  nfapi_ul_config_harq_information_rel13_t *harq_info_rel13 = (nfapi_ul_config_harq_information_rel13_t *)tlv;
-  return ( push16(harq_info_rel13->harq_size_2, ppWritePackedMsg, end) &&
-           push8(harq_info_rel13->starting_prb, ppWritePackedMsg, end) &&
-           push8(harq_info_rel13->n_prb, ppWritePackedMsg, end) &&
-           push8(harq_info_rel13->cdm_index, ppWritePackedMsg, end) &&
-           push8(harq_info_rel13->n_srs, ppWritePackedMsg, end));
-}
-
-static uint8_t pack_ul_config_request_harq_information(nfapi_ul_config_harq_information *harq_info, uint8_t **ppWritePackedMsg, uint8_t *end) {
-  return ( pack_tlv(NFAPI_UL_CONFIG_REQUEST_HARQ_INFORMATION_REL10_TDD_TAG, &harq_info->harq_information_rel10_tdd, ppWritePackedMsg, end, &pack_ul_config_request_harq_info_rel10_tdd_value) &&
-           pack_tlv(NFAPI_UL_CONFIG_REQUEST_HARQ_INFORMATION_REL8_FDD_TAG, &harq_info->harq_information_rel8_fdd, ppWritePackedMsg, end, &pack_ul_config_request_harq_info_rel8_fdd_value) &&
-           pack_tlv(NFAPI_UL_CONFIG_REQUEST_HARQ_INFORMATION_REL9_FDD_TAG, &harq_info->harq_information_rel9_fdd, ppWritePackedMsg, end, &pack_ul_config_request_harq_info_rel9_fdd_value) &&
-           pack_tlv(NFAPI_UL_CONFIG_REQUEST_HARQ_INFORMATION_REL11_TAG, &harq_info->harq_information_rel11, ppWritePackedMsg, end, &pack_ul_config_request_harq_info_rel11_value) &&
-           pack_tlv(NFAPI_UL_CONFIG_REQUEST_HARQ_INFORMATION_REL13_TAG, &harq_info->harq_information_rel13, ppWritePackedMsg, end, &pack_ul_config_request_harq_info_rel13_value));
-}
-
-static uint8_t pack_ul_config_request_cqi_info_rel8_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
-  nfapi_ul_config_cqi_information_rel8_t *cqi_info_rel8 = (nfapi_ul_config_cqi_information_rel8_t *)tlv;
-  return ( push16(cqi_info_rel8->pucch_index, ppWritePackedMsg, end) &&
-           push8(cqi_info_rel8->dl_cqi_pmi_size, ppWritePackedMsg, end));
-}
-static uint8_t pack_ul_config_request_cqi_info_rel10_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
-  nfapi_ul_config_cqi_information_rel10_t *cqi_info_rel10 = (nfapi_ul_config_cqi_information_rel10_t *)tlv;
-  return ( push8(cqi_info_rel10->number_of_pucch_resource, ppWritePackedMsg, end) &&
-           push16(cqi_info_rel10->pucch_index_p1, ppWritePackedMsg, end));
-}
-static uint8_t pack_ul_config_request_cqi_info_rel13_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
-  nfapi_ul_config_cqi_information_rel13_t *cqi_info_rel13 = (nfapi_ul_config_cqi_information_rel13_t *)tlv;
-  return ( push8(cqi_info_rel13->csi_mode, ppWritePackedMsg, end) &&
-           push16(cqi_info_rel13->dl_cqi_pmi_size_2, ppWritePackedMsg, end) &&
-           push8(cqi_info_rel13->starting_prb, ppWritePackedMsg, end) &&
-           push8(cqi_info_rel13->n_prb, ppWritePackedMsg, end) &&
-           push8(cqi_info_rel13->cdm_index, ppWritePackedMsg, end) &&
-           push8(cqi_info_rel13->n_srs, ppWritePackedMsg, end));
-}
-
-static uint8_t pack_ul_config_request_cqi_information(nfapi_ul_config_cqi_information *cqi_info, uint8_t **ppWritePackedMsg, uint8_t *end) {
-  return ( pack_tlv(NFAPI_UL_CONFIG_REQUEST_CQI_INFORMATION_REL8_TAG, &cqi_info->cqi_information_rel8, ppWritePackedMsg, end, &pack_ul_config_request_cqi_info_rel8_value) &&
-           pack_tlv(NFAPI_UL_CONFIG_REQUEST_CQI_INFORMATION_REL10_TAG, &cqi_info->cqi_information_rel10, ppWritePackedMsg, end, &pack_ul_config_request_cqi_info_rel10_value) &&
-           pack_tlv(NFAPI_UL_CONFIG_REQUEST_CQI_INFORMATION_REL13_TAG, &cqi_info->cqi_information_rel13, ppWritePackedMsg, end, &pack_ul_config_request_cqi_info_rel13_value));
-}
-
-static uint8_t pack_ul_config_request_sr_info_rel8_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
-  nfapi_ul_config_sr_information_rel8_t *sr_info_rel8 = (nfapi_ul_config_sr_information_rel8_t *)tlv;
-  return push16(sr_info_rel8->pucch_index, ppWritePackedMsg, end);
-}
-static uint8_t pack_ul_config_request_sr_info_rel10_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
-  nfapi_ul_config_sr_information_rel10_t *sr_info_rel10 = (nfapi_ul_config_sr_information_rel10_t *)tlv;
-  return ( push8(sr_info_rel10->number_of_pucch_resources, ppWritePackedMsg, end) &&
-           push16(sr_info_rel10->pucch_index_p1, ppWritePackedMsg, end));
-}
-
-static uint8_t pack_ul_config_request_sr_information(nfapi_ul_config_sr_information *sr_info, uint8_t **ppWritePackedMsg, uint8_t *end) {
-  return ( pack_tlv(NFAPI_UL_CONFIG_REQUEST_SR_INFORMATION_REL8_TAG, &sr_info->sr_information_rel8, ppWritePackedMsg, end, &pack_ul_config_request_sr_info_rel8_value) &&
-           pack_tlv(NFAPI_UL_CONFIG_REQUEST_SR_INFORMATION_REL10_TAG, &sr_info->sr_information_rel10, ppWritePackedMsg, end, &pack_ul_config_request_sr_info_rel10_value));
-}
-
-static uint8_t pack_ul_config_request_srs_pdu_rel8_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
-  nfapi_ul_config_srs_pdu_rel8_t *srs_pdu_rel8 = (nfapi_ul_config_srs_pdu_rel8_t *)tlv;
-  return (push32(srs_pdu_rel8->handle, ppWritePackedMsg, end) &&
-          push16(srs_pdu_rel8->size, ppWritePackedMsg, end) &&
-          push16(srs_pdu_rel8->rnti, ppWritePackedMsg, end) &&
-          push8(srs_pdu_rel8->srs_bandwidth, ppWritePackedMsg, end) &&
-          push8(srs_pdu_rel8->frequency_domain_position, ppWritePackedMsg, end) &&
-          push8(srs_pdu_rel8->srs_hopping_bandwidth, ppWritePackedMsg, end) &&
-          push8(srs_pdu_rel8->transmission_comb, ppWritePackedMsg, end) &&
-          push16(srs_pdu_rel8->i_srs, ppWritePackedMsg, end) &&
-          push8(srs_pdu_rel8->sounding_reference_cyclic_shift, ppWritePackedMsg, end));
-}
-
-static uint8_t pack_ul_config_request_srs_pdu_rel10_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
-  nfapi_ul_config_srs_pdu_rel10_t *srs_pdu_rel10 = (nfapi_ul_config_srs_pdu_rel10_t *)tlv;
-  return push8(srs_pdu_rel10->antenna_port, ppWritePackedMsg, end);
-}
-
-static uint8_t pack_ul_config_request_srs_pdu_rel13_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
-  nfapi_ul_config_srs_pdu_rel13_t *srs_pdu_rel13 = (nfapi_ul_config_srs_pdu_rel13_t *)tlv;
-  return ( push8(srs_pdu_rel13->number_of_combs, ppWritePackedMsg, end));
-}
-
-static uint8_t pack_ul_config_request_nb_harq_rel13_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
-  nfapi_ul_config_nb_harq_information_rel13_fdd_t *nb_harq_pdu_rel13 = (nfapi_ul_config_nb_harq_information_rel13_fdd_t *)tlv;
-  return ( push8(nb_harq_pdu_rel13->harq_ack_resource, ppWritePackedMsg, end));
-}
-
-static uint8_t pack_ul_config_request_nulsch_pdu_rel13_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
-  nfapi_ul_config_nulsch_pdu_rel13_t *nulsch_pdu_rel13 = (nfapi_ul_config_nulsch_pdu_rel13_t *)tlv;
-  return (push8(nulsch_pdu_rel13->nulsch_format, ppWritePackedMsg, end) &&
-          push32(nulsch_pdu_rel13->handle, ppWritePackedMsg, end) &&
-          push16(nulsch_pdu_rel13->size, ppWritePackedMsg, end) &&
-          push16(nulsch_pdu_rel13->rnti, ppWritePackedMsg, end) &&
-          push8(nulsch_pdu_rel13->subcarrier_indication, ppWritePackedMsg, end) &&
-          push8(nulsch_pdu_rel13->resource_assignment, ppWritePackedMsg, end) &&
-          push8(nulsch_pdu_rel13->mcs, ppWritePackedMsg, end) &&
-          push8(nulsch_pdu_rel13->redudancy_version, ppWritePackedMsg, end) &&
-          push8(nulsch_pdu_rel13->repetition_number, ppWritePackedMsg, end) &&
-          push8(nulsch_pdu_rel13->new_data_indication, ppWritePackedMsg, end) &&
-          push8(nulsch_pdu_rel13->n_srs, ppWritePackedMsg, end) &&
-          push16(nulsch_pdu_rel13->scrambling_sequence_initialization_cinit, ppWritePackedMsg, end) &&
-          push16(nulsch_pdu_rel13->sf_idx, ppWritePackedMsg, end) &&
-          pack_ul_config_request_ue_information(&(nulsch_pdu_rel13->ue_information), ppWritePackedMsg, end) &&
-          pack_tlv(NFAPI_UL_CONFIG_REQUEST_NB_HARQ_INFORMATION_REL13_FDD_TAG, &nulsch_pdu_rel13->nb_harq_information.nb_harq_information_rel13_fdd, ppWritePackedMsg, end,
-                   &pack_ul_config_request_nb_harq_rel13_value));
-}
-static uint8_t pack_ul_config_request_nrach_pdu_rel13_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
-  nfapi_ul_config_nrach_pdu_rel13_t *nrach_pdu_rel13 = (nfapi_ul_config_nrach_pdu_rel13_t *)tlv;
-  return ( push8(nrach_pdu_rel13->nprach_config_0, ppWritePackedMsg, end) &&
-           push8(nrach_pdu_rel13->nprach_config_1, ppWritePackedMsg, end) &&
-           push8(nrach_pdu_rel13->nprach_config_2, ppWritePackedMsg, end));
-}
-
-
-
-static uint8_t pack_ul_tti_pdu_list_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
-  nfapi_nr_ul_tti_request_number_of_pdus_t *value = (nfapi_nr_ul_tti_request_number_of_pdus_t *)tlv;
-
-  if(!(push16(value->pdu_size, ppWritePackedMsg, end) &&
-       push16(value->pdu_type, ppWritePackedMsg, end) ))
-    return 0;
-
-  // first match the pdu type, then call the respective function
-  switch(value->pdu_type) {
-    case NFAPI_NR_UL_CONFIG_PRACH_PDU_TYPE: {
-      if(!pack_ul_tti_request_prach_pdu(&value->prach_pdu, ppWritePackedMsg, end))
-        return 0;
-    }
-    break;
-
-    case NFAPI_NR_UL_CONFIG_PUCCH_PDU_TYPE: {
-      if(!pack_ul_tti_request_pucch_pdu(&value->pucch_pdu, ppWritePackedMsg, end))
-        return 0;
-    }
-    break;
-
-    case NFAPI_NR_UL_CONFIG_PUSCH_PDU_TYPE: {
-      if(!pack_ul_tti_request_pusch_pdu(&value->pusch_pdu, ppWritePackedMsg, end))
-        return 0;
-    }
-    break;
-
-    case NFAPI_NR_UL_CONFIG_SRS_PDU_TYPE: {
-      if(!pack_ul_tti_request_srs_pdu(&value->srs_pdu, ppWritePackedMsg, end))
-        return 0;
-    }
-    break;
-
-    default: {
-      NFAPI_TRACE(NFAPI_TRACE_ERROR, "FIXME : Invalid UL_TTI pdu type %d \n", value->pdu_type );
-    }
-    break;
-  }
-
-  return 1;
-}
-
-static uint8_t pack_ul_tti_groups_list_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
-  nfapi_nr_ul_tti_request_number_of_groups_t *value = (nfapi_nr_ul_tti_request_number_of_groups_t *)tlv;
-
-  if(!push8(value->n_ue, ppWritePackedMsg, end))
-    return 0;
-
-  for(int i=0; i<value->n_ue; i++) {
-    if(!push8(value->ue_list[i].pdu_idx, ppWritePackedMsg, end))
-      return 0;
-  }
-
-  return 1;
-}
-
-static uint8_t pack_ul_config_request_body_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
-  nfapi_ul_config_request_body_t *value = (nfapi_ul_config_request_body_t *)tlv;
-
-  if(!(push8(value->number_of_pdus, ppWritePackedMsg, end) &&
-       push8(value->rach_prach_frequency_resources, ppWritePackedMsg, end) &&
-       push8(value->srs_present, ppWritePackedMsg, end)))
-    return 0;
-
-  uint16_t i = 0;
-
-  for(i = 0; i < value->number_of_pdus; ++i) {
-    nfapi_ul_config_request_pdu_t *pdu = &(value->ul_config_pdu_list[i]);
-
-    if(push8(pdu->pdu_type, ppWritePackedMsg, end) == 0)
-      return 0;
-
-    // Put a 0 size in and then determine the size after the pdu
-    // has been writen and write the calculated size
-    uint8_t *pWritePackedMsgPduSize = *ppWritePackedMsg;
-    pdu->pdu_size = 0;
-
-    if(push8(pdu->pdu_size, ppWritePackedMsg, end) == 0)
-      return 0;
-
-    switch(pdu->pdu_type) {
-      case NFAPI_UL_CONFIG_ULSCH_PDU_TYPE: {
-        if(!pack_ul_config_request_ulsch_pdu(&(pdu->ulsch_pdu), ppWritePackedMsg, end))
-          return 0;
-      }
-      break;
-
-      case NFAPI_UL_CONFIG_ULSCH_CQI_RI_PDU_TYPE: {
-        if(!(pack_ul_config_request_ulsch_pdu(&(pdu->ulsch_cqi_ri_pdu.ulsch_pdu), ppWritePackedMsg, end) &&
-             pack_ul_config_request_cqi_ri_information(&(pdu->ulsch_cqi_ri_pdu.cqi_ri_information), ppWritePackedMsg, end) &&
-             pack_ul_config_request_initial_transmission_parameters(&(pdu->ulsch_cqi_ri_pdu.initial_transmission_parameters), ppWritePackedMsg, end)))
-          return 0;
-      }
-      break;
-
-      case NFAPI_UL_CONFIG_ULSCH_HARQ_PDU_TYPE: {
-        if(!(pack_ul_config_request_ulsch_pdu(&(pdu->ulsch_harq_pdu.ulsch_pdu), ppWritePackedMsg, end) &&
-             pack_ul_config_request_ulsch_harq_information(&(pdu->ulsch_harq_pdu.harq_information), ppWritePackedMsg, end) &&
-             pack_ul_config_request_initial_transmission_parameters(&(pdu->ulsch_harq_pdu.initial_transmission_parameters), ppWritePackedMsg, end)))
-          return 0;
-      }
-      break;
-
-      case NFAPI_UL_CONFIG_ULSCH_CQI_HARQ_RI_PDU_TYPE: {
-        if(!(pack_ul_config_request_ulsch_pdu(&(pdu->ulsch_cqi_harq_ri_pdu.ulsch_pdu), ppWritePackedMsg, end) &&
-             pack_ul_config_request_cqi_ri_information(&(pdu->ulsch_cqi_harq_ri_pdu.cqi_ri_information), ppWritePackedMsg, end) &&
-             pack_ul_config_request_ulsch_harq_information(&(pdu->ulsch_cqi_harq_ri_pdu.harq_information), ppWritePackedMsg, end) &&
-             pack_ul_config_request_initial_transmission_parameters(&(pdu->ulsch_cqi_harq_ri_pdu.initial_transmission_parameters), ppWritePackedMsg, end)))
-          return 0;
-      }
-      break;
-
-      case NFAPI_UL_CONFIG_UCI_CQI_PDU_TYPE: {
-        if(!(pack_ul_config_request_ue_information(&(pdu->uci_cqi_pdu.ue_information), ppWritePackedMsg, end) &&
-             pack_ul_config_request_cqi_information(&(pdu->uci_cqi_pdu.cqi_information), ppWritePackedMsg, end)))
-          return 0;
-      }
-      break;
-
-      case NFAPI_UL_CONFIG_UCI_SR_PDU_TYPE: {
-        if(!(pack_ul_config_request_ue_information(&(pdu->uci_sr_pdu.ue_information), ppWritePackedMsg, end) &&
-             pack_ul_config_request_sr_information(&(pdu->uci_sr_pdu.sr_information), ppWritePackedMsg, end)))
-          return 0;
-      }
-      break;
-
-      case NFAPI_UL_CONFIG_UCI_HARQ_PDU_TYPE: {
-        if(!(pack_ul_config_request_ue_information(&(pdu->uci_harq_pdu.ue_information), ppWritePackedMsg, end) &&
-             pack_ul_config_request_harq_information(&(pdu->uci_harq_pdu.harq_information), ppWritePackedMsg, end)))
-          return 0;
-      }
-      break;
-
-      case NFAPI_UL_CONFIG_UCI_SR_HARQ_PDU_TYPE: {
-        if(!(pack_ul_config_request_ue_information(&(pdu->uci_sr_harq_pdu.ue_information), ppWritePackedMsg, end) &&
-             pack_ul_config_request_sr_information(&(pdu->uci_sr_harq_pdu.sr_information), ppWritePackedMsg, end) &&
-             pack_ul_config_request_harq_information(&(pdu->uci_sr_harq_pdu.harq_information), ppWritePackedMsg, end)))
-          return 0;
-      }
-      break;
-
-      case NFAPI_UL_CONFIG_UCI_CQI_HARQ_PDU_TYPE: {
-        if(!(pack_ul_config_request_ue_information(&(pdu->uci_cqi_harq_pdu.ue_information), ppWritePackedMsg, end) &&
-             pack_ul_config_request_cqi_information(&(pdu->uci_cqi_harq_pdu.cqi_information), ppWritePackedMsg, end) &&
-             pack_ul_config_request_harq_information(&(pdu->uci_cqi_harq_pdu.harq_information), ppWritePackedMsg, end)))
-          return 0;
-      }
-      break;
-
-      case NFAPI_UL_CONFIG_UCI_CQI_SR_PDU_TYPE: {
-        if(!(pack_ul_config_request_ue_information(&(pdu->uci_cqi_sr_pdu.ue_information), ppWritePackedMsg, end) &&
-             pack_ul_config_request_cqi_information(&(pdu->uci_cqi_sr_pdu.cqi_information), ppWritePackedMsg, end) &&
-             pack_ul_config_request_sr_information(&(pdu->uci_cqi_sr_pdu.sr_information), ppWritePackedMsg, end)))
-          return 0;
-      }
-      break;
-
-      case NFAPI_UL_CONFIG_UCI_CQI_SR_HARQ_PDU_TYPE: {
-        if(!(pack_ul_config_request_ue_information(&(pdu->uci_cqi_sr_harq_pdu.ue_information), ppWritePackedMsg, end) &&
-             pack_ul_config_request_cqi_information(&(pdu->uci_cqi_sr_harq_pdu.cqi_information), ppWritePackedMsg, end) &&
-             pack_ul_config_request_sr_information(&(pdu->uci_cqi_sr_harq_pdu.sr_information), ppWritePackedMsg, end) &&
-             pack_ul_config_request_harq_information(&(pdu->uci_cqi_sr_harq_pdu.harq_information), ppWritePackedMsg, end)))
-          return 0;
-      }
-      break;
-
-      case NFAPI_UL_CONFIG_SRS_PDU_TYPE: {
-        if(!(pack_tlv(NFAPI_UL_CONFIG_REQUEST_SRS_PDU_REL8_TAG, &pdu->srs_pdu.srs_pdu_rel8, ppWritePackedMsg, end, &pack_ul_config_request_srs_pdu_rel8_value) &&
-             pack_tlv(NFAPI_UL_CONFIG_REQUEST_SRS_PDU_REL10_TAG, &pdu->srs_pdu.srs_pdu_rel10, ppWritePackedMsg, end, &pack_ul_config_request_srs_pdu_rel10_value) &&
-             pack_tlv(NFAPI_UL_CONFIG_REQUEST_SRS_PDU_REL13_TAG, &pdu->srs_pdu.srs_pdu_rel13, ppWritePackedMsg, end, &pack_ul_config_request_srs_pdu_rel13_value)))
-          return 0;
-      }
-      break;
-
-      case NFAPI_UL_CONFIG_HARQ_BUFFER_PDU_TYPE: {
-        if(!(pack_ul_config_request_ue_information(&(pdu->harq_buffer_pdu.ue_information), ppWritePackedMsg, end)))
-          return 0;
-      }
-      break;
-
-      case NFAPI_UL_CONFIG_ULSCH_UCI_CSI_PDU_TYPE: {
-        if(!(pack_ul_config_request_ulsch_pdu(&(pdu->ulsch_uci_csi_pdu.ulsch_pdu), ppWritePackedMsg, end) &&
-             pack_ul_config_request_cqi_information(&(pdu->ulsch_uci_csi_pdu.csi_information), ppWritePackedMsg, end)))
-          return 0;
-      }
-      break;
-
-      case NFAPI_UL_CONFIG_ULSCH_UCI_HARQ_PDU_TYPE: {
-        if(!(pack_ul_config_request_ulsch_pdu(&(pdu->ulsch_uci_harq_pdu.ulsch_pdu), ppWritePackedMsg, end) &&
-             pack_ul_config_request_harq_information(&(pdu->ulsch_uci_harq_pdu.harq_information), ppWritePackedMsg, end)))
-          return 0;
-      }
-      break;
-
-      case NFAPI_UL_CONFIG_ULSCH_CSI_UCI_HARQ_PDU_TYPE: {
-        if(!(pack_ul_config_request_ulsch_pdu(&(pdu->ulsch_csi_uci_harq_pdu.ulsch_pdu), ppWritePackedMsg, end) &&
-             pack_ul_config_request_cqi_information(&(pdu->ulsch_csi_uci_harq_pdu.csi_information), ppWritePackedMsg, end) &&
-             pack_ul_config_request_harq_information(&(pdu->ulsch_csi_uci_harq_pdu.harq_information), ppWritePackedMsg, end)))
-          return 0;
-      }
-      break;
-
-      case NFAPI_UL_CONFIG_NULSCH_PDU_TYPE: {
-        if(!(pack_tlv(NFAPI_UL_CONFIG_REQUEST_NULSCH_PDU_REL13_TAG, &pdu->nulsch_pdu.nulsch_pdu_rel13, ppWritePackedMsg, end, &pack_ul_config_request_nulsch_pdu_rel13_value)))
-          return 0;
-      }
-      break;
-
-      case NFAPI_UL_CONFIG_NRACH_PDU_TYPE: {
-        if(!(pack_tlv(NFAPI_UL_CONFIG_REQUEST_NRACH_PDU_REL13_TAG, &pdu->nrach_pdu.nrach_pdu_rel13, ppWritePackedMsg, end, &pack_ul_config_request_nrach_pdu_rel13_value)))
-          return 0;
-      }
-      break;
-
-      default: {
-        NFAPI_TRACE(NFAPI_TRACE_ERROR, "FIXME : Invalid pdu type %d \n", pdu->pdu_type );
-      }
-      break;
-    };
-
-    // add 1 for the pdu_type. The delta will include the pdu_size
-    pdu->pdu_size = 1 + (*ppWritePackedMsg - pWritePackedMsgPduSize);
-
-    push8(pdu->pdu_size, &pWritePackedMsgPduSize, end);
-  }
-
-  return 1;
-}
-
-
-static uint8_t pack_ul_tti_request(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p7_codec_config_t *config) {
-  nfapi_nr_ul_tti_request_t *pNfapiMsg = (nfapi_nr_ul_tti_request_t *)msg;
-
-  if (!(push16(pNfapiMsg->SFN, ppWritePackedMsg, end) &&
-        push16(pNfapiMsg->Slot, ppWritePackedMsg, end) &&
-        push8(pNfapiMsg->n_pdus, ppWritePackedMsg, end) &&
-        push8(pNfapiMsg->rach_present, ppWritePackedMsg, end) &&
-        push8(pNfapiMsg->n_ulsch, ppWritePackedMsg, end) &&
-        push8(pNfapiMsg->n_ulcch, ppWritePackedMsg, end) &&
-        push8(pNfapiMsg->n_group, ppWritePackedMsg, end) ))
-    return 0;
-
-  for(int i=0; i<pNfapiMsg->n_pdus; i++) {
-    if(!pack_ul_tti_pdu_list_value(&pNfapiMsg->pdus_list[i], ppWritePackedMsg, end))
-      return 0;
-  }
-
-  for(int i=0; i<pNfapiMsg->n_group; i++) {
-    if(!pack_ul_tti_groups_list_value(&pNfapiMsg->groups_list[i], ppWritePackedMsg, end))
-      return 0;
-  }
-
-  return 1;
-}
-
-
-static uint8_t pack_ul_config_request(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p7_codec_config_t *config) {
-  nfapi_ul_config_request_t *pNfapiMsg = (nfapi_ul_config_request_t *)msg;
-  return ( push16(pNfapiMsg->sfn_sf, ppWritePackedMsg, end) &&
-           pack_tlv(NFAPI_UL_CONFIG_REQUEST_BODY_TAG, &pNfapiMsg->ul_config_request_body, ppWritePackedMsg, end, &pack_ul_config_request_body_value) &&
-           pack_p7_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config)) ;
-}
-
-static uint8_t pack_hi_dci0_hi_rel8_pdu_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
-  nfapi_hi_dci0_hi_pdu_rel8_t *hi_pdu_rel8 = (nfapi_hi_dci0_hi_pdu_rel8_t *)tlv;
-  return ( push8(hi_pdu_rel8->resource_block_start, ppWritePackedMsg, end) &&
-           push8(hi_pdu_rel8->cyclic_shift_2_for_drms, ppWritePackedMsg, end) &&
-           push8(hi_pdu_rel8->hi_value, ppWritePackedMsg, end) &&
-           push8(hi_pdu_rel8->i_phich, ppWritePackedMsg, end) &&
-           push16(hi_pdu_rel8->transmission_power, ppWritePackedMsg, end));
-}
-
-static uint8_t pack_hi_dci0_hi_rel10_pdu_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
-  nfapi_hi_dci0_hi_pdu_rel10_t *hi_pdu_rel10 = (nfapi_hi_dci0_hi_pdu_rel10_t *)tlv;
-  return ( push8(hi_pdu_rel10->flag_tb2, ppWritePackedMsg, end) &&
-           push8(hi_pdu_rel10->hi_value_2, ppWritePackedMsg, end));
-}
-
-static uint8_t pack_hi_dci0_dci_rel8_pdu_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
-  nfapi_hi_dci0_dci_pdu_rel8_t *dci_pdu_rel8 = (nfapi_hi_dci0_dci_pdu_rel8_t *)tlv;
-  return ( push8(dci_pdu_rel8->dci_format, ppWritePackedMsg, end) &&
-           push8(dci_pdu_rel8->cce_index, ppWritePackedMsg, end) &&
-           push8(dci_pdu_rel8->aggregation_level, ppWritePackedMsg, end) &&
-           push16(dci_pdu_rel8->rnti, ppWritePackedMsg, end) &&
-           push8(dci_pdu_rel8->resource_block_start, ppWritePackedMsg, end) &&
-           push8(dci_pdu_rel8->number_of_resource_block, ppWritePackedMsg, end) &&
-           push8(dci_pdu_rel8->mcs_1, ppWritePackedMsg, end) &&
-           push8(dci_pdu_rel8->cyclic_shift_2_for_drms, ppWritePackedMsg, end) &&
-           push8(dci_pdu_rel8->frequency_hopping_enabled_flag, ppWritePackedMsg, end) &&
-           push8(dci_pdu_rel8->frequency_hopping_bits, ppWritePackedMsg, end) &&
-           push8(dci_pdu_rel8->new_data_indication_1, ppWritePackedMsg, end) &&
-           push8(dci_pdu_rel8->ue_tx_antenna_seleciton, ppWritePackedMsg, end) &&
-           push8(dci_pdu_rel8->tpc, ppWritePackedMsg, end) &&
-           push8(dci_pdu_rel8->cqi_csi_request, ppWritePackedMsg, end) &&
-           push8(dci_pdu_rel8->ul_index, ppWritePackedMsg, end) &&
-           push8(dci_pdu_rel8->dl_assignment_index, ppWritePackedMsg, end) &&
-           push32(dci_pdu_rel8->tpc_bitmap, ppWritePackedMsg, end) &&
-           push16(dci_pdu_rel8->transmission_power, ppWritePackedMsg, end));
-}
-
-static uint8_t pack_hi_dci0_dci_rel10_pdu_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
-  nfapi_hi_dci0_dci_pdu_rel10_t *dci_pdu_rel10 = (nfapi_hi_dci0_dci_pdu_rel10_t *)tlv;
-  return ( push8(dci_pdu_rel10->cross_carrier_scheduling_flag, ppWritePackedMsg, end) &&
-           push8(dci_pdu_rel10->carrier_indicator, ppWritePackedMsg, end) &&
-           push8(dci_pdu_rel10->size_of_cqi_csi_feild, ppWritePackedMsg, end) &&
-           push8(dci_pdu_rel10->srs_flag, ppWritePackedMsg, end) &&
-           push8(dci_pdu_rel10->srs_request, ppWritePackedMsg, end) &&
-           push8(dci_pdu_rel10->resource_allocation_flag, ppWritePackedMsg, end) &&
-           push8(dci_pdu_rel10->resource_allocation_type, ppWritePackedMsg, end) &&
-           push32(dci_pdu_rel10->resource_block_coding, ppWritePackedMsg, end) &&
-           push8(dci_pdu_rel10->mcs_2, ppWritePackedMsg, end) &&
-           push8(dci_pdu_rel10->new_data_indication_2, ppWritePackedMsg, end) &&
-           push8(dci_pdu_rel10->number_of_antenna_ports, ppWritePackedMsg, end) &&
-           push8(dci_pdu_rel10->tpmi, ppWritePackedMsg, end) &&
-           push8(dci_pdu_rel10->total_dci_length_including_padding, ppWritePackedMsg, end) &&
-           push8(dci_pdu_rel10->n_ul_rb, ppWritePackedMsg, end));
-}
-
-static uint8_t pack_hi_dci0_dci_rel12_pdu_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
-  nfapi_hi_dci0_dci_pdu_rel12_t *dci_pdu_rel12 = (nfapi_hi_dci0_dci_pdu_rel12_t *)tlv;
-  return ( push8(dci_pdu_rel12->pscch_resource, ppWritePackedMsg, end) &&
-           push8(dci_pdu_rel12->time_resource_pattern, ppWritePackedMsg, end));
-}
-
-static uint8_t pack_hi_dci0_mpdcch_dci_rel13_pdu_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
-  nfapi_hi_dci0_mpdcch_dci_pdu_rel13_t *mpdcch_dci_pdu_rel13 = (nfapi_hi_dci0_mpdcch_dci_pdu_rel13_t *)tlv;
-  return ( push8(mpdcch_dci_pdu_rel13->mpdcch_narrowband, ppWritePackedMsg, end) &&
-           push8(mpdcch_dci_pdu_rel13->number_of_prb_pairs, ppWritePackedMsg, end) &&
-           push8(mpdcch_dci_pdu_rel13->resource_block_assignment, ppWritePackedMsg, end) &&
-           push8(mpdcch_dci_pdu_rel13->mpdcch_transmission_type, ppWritePackedMsg, end) &&
-           push8(mpdcch_dci_pdu_rel13->start_symbol, ppWritePackedMsg, end) &&
-           push8(mpdcch_dci_pdu_rel13->ecce_index, ppWritePackedMsg, end) &&
-           push8(mpdcch_dci_pdu_rel13->aggreagation_level, ppWritePackedMsg, end) &&
-           push8(mpdcch_dci_pdu_rel13->rnti_type, ppWritePackedMsg, end) &&
-           push16(mpdcch_dci_pdu_rel13->rnti, ppWritePackedMsg, end) &&
-           push8(mpdcch_dci_pdu_rel13->ce_mode, ppWritePackedMsg, end) &&
-           push16(mpdcch_dci_pdu_rel13->drms_scrambling_init, ppWritePackedMsg, end) &&
-           push16(mpdcch_dci_pdu_rel13->initial_transmission_sf_io, ppWritePackedMsg, end) &&
-           push16(mpdcch_dci_pdu_rel13->transmission_power, ppWritePackedMsg, end) &&
-           push8(mpdcch_dci_pdu_rel13->dci_format, ppWritePackedMsg, end) &&
-           push8(mpdcch_dci_pdu_rel13->resource_block_start, ppWritePackedMsg, end) &&
-           push8(mpdcch_dci_pdu_rel13->number_of_resource_blocks, ppWritePackedMsg, end) &&
-           push8(mpdcch_dci_pdu_rel13->mcs, ppWritePackedMsg, end) &&
-           push8(mpdcch_dci_pdu_rel13->pusch_repetition_levels, ppWritePackedMsg, end) &&
-           push8(mpdcch_dci_pdu_rel13->frequency_hopping_flag, ppWritePackedMsg, end) &&
-           push8(mpdcch_dci_pdu_rel13->new_data_indication, ppWritePackedMsg, end) &&
-           push8(mpdcch_dci_pdu_rel13->harq_process, ppWritePackedMsg, end) &&
-           push8(mpdcch_dci_pdu_rel13->redudency_version, ppWritePackedMsg, end) &&
-           push8(mpdcch_dci_pdu_rel13->tpc, ppWritePackedMsg, end) &&
-           push8(mpdcch_dci_pdu_rel13->csi_request, ppWritePackedMsg, end) &&
-           push8(mpdcch_dci_pdu_rel13->ul_inex, ppWritePackedMsg, end) &&
-           push8(mpdcch_dci_pdu_rel13->dai_presence_flag, ppWritePackedMsg, end) &&
-           push8(mpdcch_dci_pdu_rel13->dl_assignment_index, ppWritePackedMsg, end) &&
-           push8(mpdcch_dci_pdu_rel13->srs_request, ppWritePackedMsg, end) &&
-           push8(mpdcch_dci_pdu_rel13->dci_subframe_repetition_number, ppWritePackedMsg, end) &&
-           push32(mpdcch_dci_pdu_rel13->tcp_bitmap, ppWritePackedMsg, end) &&
-           push8(mpdcch_dci_pdu_rel13->total_dci_length_include_padding, ppWritePackedMsg, end) &&
-           push8(mpdcch_dci_pdu_rel13->number_of_tx_antenna_ports, ppWritePackedMsg, end) &&
-           pusharray16(mpdcch_dci_pdu_rel13->precoding_value, NFAPI_MAX_TX_PHYSICAL_ANTENNA_PORTS, mpdcch_dci_pdu_rel13->number_of_tx_antenna_ports, ppWritePackedMsg, end));
-}
-
-static uint8_t pack_hi_dci0_npdcch_dci_rel13_pdu_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
-  nfapi_hi_dci0_npdcch_dci_pdu_rel13_t *npdcch_dci_pdu_rel13 = (nfapi_hi_dci0_npdcch_dci_pdu_rel13_t *)tlv;
-  return ( push8(npdcch_dci_pdu_rel13->ncce_index, ppWritePackedMsg, end) &&
-           push8(npdcch_dci_pdu_rel13->aggregation_level, ppWritePackedMsg, end) &&
-           push8(npdcch_dci_pdu_rel13->start_symbol, ppWritePackedMsg, end) &&
-           push16(npdcch_dci_pdu_rel13->rnti, ppWritePackedMsg, end) &&
-           push8(npdcch_dci_pdu_rel13->scrambling_reinitialization_batch_index, ppWritePackedMsg, end) &&
-           push8(npdcch_dci_pdu_rel13->nrs_antenna_ports_assumed_by_the_ue, ppWritePackedMsg, end) &&
-           push8(npdcch_dci_pdu_rel13->subcarrier_indication, ppWritePackedMsg, end) &&
-           push8(npdcch_dci_pdu_rel13->resource_assignment, ppWritePackedMsg, end) &&
-           push8(npdcch_dci_pdu_rel13->scheduling_delay, ppWritePackedMsg, end) &&
-           push8(npdcch_dci_pdu_rel13->mcs, ppWritePackedMsg, end) &&
-           push8(npdcch_dci_pdu_rel13->redudancy_version, ppWritePackedMsg, end) &&
-           push8(npdcch_dci_pdu_rel13->repetition_number, ppWritePackedMsg, end) &&
-           push8(npdcch_dci_pdu_rel13->new_data_indicator, ppWritePackedMsg, end) &&
-           push8(npdcch_dci_pdu_rel13->dci_subframe_repetition_number, ppWritePackedMsg, end));
-}
-
-
-static uint8_t pack_hi_dci0_request_body_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
-  nfapi_hi_dci0_request_body_t *value = (nfapi_hi_dci0_request_body_t *)tlv;
-
-  if(!(push16(value->sfnsf, ppWritePackedMsg, end) &&
-       push8(value->number_of_dci, ppWritePackedMsg, end) &&
-       push8(value->number_of_hi, ppWritePackedMsg, end)))
-    return 0;
-
-  uint16_t i = 0;
-  uint16_t total_number_of_pdus = value->number_of_dci + value->number_of_hi;
-
-  for(i = 0; i < total_number_of_pdus; ++i) {
-    nfapi_hi_dci0_request_pdu_t *pdu = &(value->hi_dci0_pdu_list[i]);
-
-    if(push8(pdu->pdu_type, ppWritePackedMsg, end) == 0)
-      return 0;
-
-    // Put a 0 size in and then determine the size after the pdu
-    // has been writen and write the calculated size
-    uint8_t *pWritePackedMsgPduSize = *ppWritePackedMsg;
-    pdu->pdu_size = 0;
-
-    if(push8(pdu->pdu_size, ppWritePackedMsg, end) == 0)
-      return 0;
-
-    switch(pdu->pdu_type) {
-      case NFAPI_HI_DCI0_HI_PDU_TYPE: {
-        if(!(pack_tlv(NFAPI_HI_DCI0_REQUEST_HI_PDU_REL8_TAG, &pdu->hi_pdu.hi_pdu_rel8, ppWritePackedMsg, end, pack_hi_dci0_hi_rel8_pdu_value) &&
-             pack_tlv(NFAPI_HI_DCI0_REQUEST_HI_PDU_REL10_TAG, &pdu->hi_pdu.hi_pdu_rel10, ppWritePackedMsg, end, pack_hi_dci0_hi_rel10_pdu_value)))
-          return 0;
-      }
-      break;
-
-      case NFAPI_HI_DCI0_DCI_PDU_TYPE: {
-        if(!(pack_tlv(NFAPI_HI_DCI0_REQUEST_DCI_PDU_REL8_TAG, &pdu->dci_pdu.dci_pdu_rel8, ppWritePackedMsg, end, pack_hi_dci0_dci_rel8_pdu_value) &&
-             pack_tlv(NFAPI_HI_DCI0_REQUEST_DCI_PDU_REL10_TAG, &pdu->dci_pdu.dci_pdu_rel10, ppWritePackedMsg, end, pack_hi_dci0_dci_rel10_pdu_value) &&
-             pack_tlv(NFAPI_HI_DCI0_REQUEST_DCI_PDU_REL12_TAG, &pdu->dci_pdu.dci_pdu_rel12, ppWritePackedMsg, end, pack_hi_dci0_dci_rel12_pdu_value)))
-          return 0;
-      }
-      break;
-
-      case NFAPI_HI_DCI0_EPDCCH_DCI_PDU_TYPE: {
-        if(!(pack_tlv(NFAPI_HI_DCI0_REQUEST_EPDCCH_DCI_PDU_REL8_TAG, &pdu->epdcch_dci_pdu.epdcch_dci_pdu_rel8, ppWritePackedMsg, end, pack_hi_dci0_dci_rel8_pdu_value) &&
-             pack_tlv(NFAPI_HI_DCI0_REQUEST_EPDCCH_DCI_PDU_REL10_TAG, &pdu->epdcch_dci_pdu.epdcch_dci_pdu_rel10, ppWritePackedMsg, end, pack_hi_dci0_dci_rel10_pdu_value) &&
-             pack_tlv(NFAPI_HI_DCI0_REQUEST_EPDCCH_PARAMETERS_REL11_TAG, &pdu->epdcch_dci_pdu.epdcch_parameters_rel11, ppWritePackedMsg, end, pack_dl_config_epdcch_parameters_rel11_value)))
-          return 0;
-      }
-      break;
-
-      case NFAPI_HI_DCI0_MPDCCH_DCI_PDU_TYPE: {
-        if(!(pack_tlv(NFAPI_HI_DCI0_REQUEST_MPDCCH_DCI_PDU_REL13_TAG, &pdu->mpdcch_dci_pdu.mpdcch_dci_pdu_rel13, ppWritePackedMsg, end, pack_hi_dci0_mpdcch_dci_rel13_pdu_value)))
-          return 0;
-      }
-      break;
-
-      case NFAPI_HI_DCI0_NPDCCH_DCI_PDU_TYPE: {
-        if(!(pack_tlv(NFAPI_HI_DCI0_REQUEST_NPDCCH_DCI_PDU_REL13_TAG, &pdu->npdcch_dci_pdu.npdcch_dci_pdu_rel13, ppWritePackedMsg, end, pack_hi_dci0_npdcch_dci_rel13_pdu_value)))
-          return 0;
-      }
-      break;
-
-      default: {
-        NFAPI_TRACE(NFAPI_TRACE_ERROR, "FIXME : Invalid pdu type %d \n", pdu->pdu_type );
-      }
-      break;
-    };
-
-    // add 1 for the pdu_type. The delta will include the pdu_size
-    pdu->pdu_size = 1 + (*ppWritePackedMsg - pWritePackedMsgPduSize);
-
-    push8(pdu->pdu_size, &pWritePackedMsgPduSize, end);
-  }
-
-  return 1;
-}
-
-static uint8_t pack_ul_dci_pdu_list_value(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
-{
-	nfapi_nr_ul_dci_request_pdus_t* value = (nfapi_nr_ul_dci_request_pdus_t*)tlv;
-	
-	for(uint8_t i = 0; i < MAX_DCI_CORESET; ++i)
-	{
-		if(!(push16(value->pdcch_pdu.pdcch_pdu_rel15.dci_pdu[i].RNTI, ppWritePackedMsg, end) &&
-		push16(value->pdcch_pdu.pdcch_pdu_rel15.dci_pdu[i].ScramblingId, ppWritePackedMsg, end) &&
-
-		push16(value->pdcch_pdu.pdcch_pdu_rel15.dci_pdu[i].ScramblingRNTI, ppWritePackedMsg, end) &&
-		push8(value->pdcch_pdu.pdcch_pdu_rel15.dci_pdu[i].CceIndex, ppWritePackedMsg, end) &&
-		push8(value->pdcch_pdu.pdcch_pdu_rel15.dci_pdu[i].AggregationLevel, ppWritePackedMsg, end) &&
-		push8(value->pdcch_pdu.pdcch_pdu_rel15.dci_pdu[i].beta_PDCCH_1_0, ppWritePackedMsg, end) &&
-
-		push8(value->pdcch_pdu.pdcch_pdu_rel15.dci_pdu[i].powerControlOffsetSS, ppWritePackedMsg, end) &&
-		push16(value->pdcch_pdu.pdcch_pdu_rel15.dci_pdu[i].PayloadSizeBits, ppWritePackedMsg, end) &&
-		
-		pusharray8(value->pdcch_pdu.pdcch_pdu_rel15.dci_pdu[i].Payload, value->pdcch_pdu.pdcch_pdu_rel15.dci_pdu[i].PayloadSizeBits, value->pdcch_pdu.pdcch_pdu_rel15.dci_pdu[i].PayloadSizeBits, ppWritePackedMsg, end)))
-
-		return 0;
-	}
-
-	return (push16(value->PDUType, ppWritePackedMsg, end) &&
-	   	    push16(value->PDUSize, ppWritePackedMsg, end) &&
-			    push16(value->pdcch_pdu.pdcch_pdu_rel15.BWPSize, ppWritePackedMsg, end) &&
-			    push16(value->pdcch_pdu.pdcch_pdu_rel15.BWPStart, ppWritePackedMsg, end) &&
-			    push8(value->pdcch_pdu.pdcch_pdu_rel15.SubcarrierSpacing, ppWritePackedMsg, end) &&
-			    push8(value->pdcch_pdu.pdcch_pdu_rel15.CyclicPrefix, ppWritePackedMsg, end) &&
-
-			    push8(value->pdcch_pdu.pdcch_pdu_rel15.StartSymbolIndex, ppWritePackedMsg, end) &&
-			    push8(value->pdcch_pdu.pdcch_pdu_rel15.DurationSymbols, ppWritePackedMsg, end) &&
-			    pusharray8(value->pdcch_pdu.pdcch_pdu_rel15.FreqDomainResource, 6, 6, ppWritePackedMsg, end) &&
-			    push8(value->pdcch_pdu.pdcch_pdu_rel15.CceRegMappingType, ppWritePackedMsg, end) &&
-
-			    push8(value->pdcch_pdu.pdcch_pdu_rel15.RegBundleSize, ppWritePackedMsg, end) &&
-			    push8(value->pdcch_pdu.pdcch_pdu_rel15.InterleaverSize, ppWritePackedMsg, end) &&
-			    push8(value->pdcch_pdu.pdcch_pdu_rel15.CoreSetType, ppWritePackedMsg, end) &&
-			    push16(value->pdcch_pdu.pdcch_pdu_rel15.ShiftIndex, ppWritePackedMsg, end) &&
-			    push8(value->pdcch_pdu.pdcch_pdu_rel15.precoderGranularity, ppWritePackedMsg, end) &&
-			    push16(value->pdcch_pdu.pdcch_pdu_rel15.numDlDci, ppWritePackedMsg, end));
-
-}
-
-static uint8_t pack_ul_dci_request(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p7_codec_config_t *config) {
-  nfapi_nr_ul_dci_request_t *pNfapiMsg = (nfapi_nr_ul_dci_request_t *)msg;
-
-  if (!(push16(pNfapiMsg->SFN, ppWritePackedMsg, end) &&
-        push16(pNfapiMsg->Slot, ppWritePackedMsg, end) &&
-        push8(pNfapiMsg->numPdus, ppWritePackedMsg, end)
-       ))
-    return 0;
-
-  for(int i=0; i<pNfapiMsg->numPdus; i++) {
-    if(!pack_ul_dci_pdu_list_value(&pNfapiMsg->ul_dci_pdu_list[i], ppWritePackedMsg, end))
-      return 0;
-  }
-
-  return 1;
-}
-
-
-
-static uint8_t pack_hi_dci0_request(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p7_codec_config_t *config) {
-  nfapi_hi_dci0_request_t *pNfapiMsg = (nfapi_hi_dci0_request_t *)msg;
-  return ( push16(pNfapiMsg->sfn_sf, ppWritePackedMsg, end) &&
-           pack_tlv(NFAPI_HI_DCI0_REQUEST_BODY_TAG, &pNfapiMsg->hi_dci0_request_body, ppWritePackedMsg, end, &pack_hi_dci0_request_body_value) &&
-           pack_p7_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config));
-}
-
-//pack_tx_data_pdu_list_value
-static uint8_t pack_tx_data_pdu_list_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
-  nfapi_nr_pdu_t *value = (nfapi_nr_pdu_t *)tlv;
-
-  if(!(push32(value->num_TLV, ppWritePackedMsg, end) &&
-       push16(value->PDU_index, ppWritePackedMsg, end) &&
-       push16(value->PDU_length, ppWritePackedMsg, end)
-      ))
-    return 0;
-
-  uint16_t i = 0;
-  uint16_t total_number_of_tlvs = value->num_TLV;
-
-  for(; i < total_number_of_tlvs; ++i) {
-    if (!(push16(value->TLVs[i].length, ppWritePackedMsg, end) &&
-          push16(value->TLVs[i].tag, ppWritePackedMsg, end)))
-      return 0;
-
-    switch(value->TLVs[i].tag) {
-      case 0: {
-        if(!pusharray32(value->TLVs[i].value.direct, 16384, value->TLVs[i].length, ppWritePackedMsg, end))
-          return 0;
-
-        break;
-      }
-
-      case 1: {
-        if(!pusharray32(value->TLVs[i].value.ptr, value->TLVs[i].length, value->TLVs[i].length, ppWritePackedMsg, end))
-          return 0;
-
-        break;
-      }
-
-      default: {
-        NFAPI_TRACE(NFAPI_TRACE_ERROR, "FIXME : Invalid tag value %d \n", value->TLVs[i].tag );
-        break;
-      }
-    }
-  }
-
-  return 1;
-}
-
-static uint8_t pack_tx_request_body_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
-  nfapi_tx_request_body_t *value = (nfapi_tx_request_body_t *)tlv;
-
-  if(push16(value->number_of_pdus, ppWritePackedMsg, end) == 0)
-    return 0;
-
-  uint16_t i = 0;
-  uint16_t total_number_of_pdus = value->number_of_pdus;
-
-  for(; i < total_number_of_pdus; ++i) {
-    nfapi_tx_request_pdu_t *pdu = &(value->tx_pdu_list[i]);
-
-    if(!(push16(pdu->pdu_length, ppWritePackedMsg, end) &&
-         push16(pdu->pdu_index, ppWritePackedMsg, end)))
-      return 0;
-
-    uint8_t j;
-
-    for(j = 0; j < pdu->num_segments; ++j) {
-      // Use -1 as it is unbounded
-      // DJP - does not handle -1
-      // DJP - if(pusharray8(pdu->segments[j].segment_data, (uint32_t)(-1), pdu->segments[j].segment_length, ppWritePackedMsg, end) == 0)
-      int push_ret = pusharray8(pdu->segments[j].segment_data, 65535, pdu->segments[j].segment_length, ppWritePackedMsg, end);
-
-      if (pdu->segments[j].segment_length == 3) {
-        NFAPI_TRACE(NFAPI_TRACE_INFO, "%s() BCH? segment_data:%x %x %x\n", __FUNCTION__,
-                    pdu->segments[j].segment_data[0],
-                    pdu->segments[j].segment_data[1],
-                    pdu->segments[j].segment_data[2]
-                   );
-      }
-
-      //NFAPI_TRACE(NFAPI_TRACE_INFO, "%s() segment_data:%p segment_length:%u pusharray8()=%d\n", __FUNCTION__, pdu->segments[j].segment_data, pdu->segments[j].segment_length, push_ret);
-
-      if (push_ret == 0) {
-        return 0;
-      }
-    }
-  }
-
-  return 1;
-}
-
-static uint8_t pack_tx_data_request(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p7_codec_config_t *config) {
-  nfapi_nr_tx_data_request_t *pNfapiMsg = (nfapi_nr_tx_data_request_t *)msg;
-
-  if (!(
-        push16(pNfapiMsg->SFN, ppWritePackedMsg, end) &&
-        push16(pNfapiMsg->Slot, ppWritePackedMsg, end) &&
-        push16(pNfapiMsg->Number_of_PDUs, ppWritePackedMsg, end)
-      ))
-    return 0;
-
-  for(int i=0; i<pNfapiMsg->Number_of_PDUs; i++) {
-    if(!pack_tx_data_pdu_list_value(&pNfapiMsg->pdu_list[i], ppWritePackedMsg, end))
-      return 0;
-  }
-
-  return 1;
-}
-
-static uint8_t pack_tx_request(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p7_codec_config_t *config) {
-  nfapi_tx_request_t *pNfapiMsg = (nfapi_tx_request_t *)msg;
-  int x = push16(pNfapiMsg->sfn_sf, ppWritePackedMsg, end);
-  int y = pack_tlv(NFAPI_TX_REQUEST_BODY_TAG, &pNfapiMsg->tx_request_body, ppWritePackedMsg, end, &pack_tx_request_body_value);
-  int z = pack_p7_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config);
-  //NFAPI_TRACE(NFAPI_TRACE_INFO, "%s() x:%d y:%d z:%d\n", __FUNCTION__, x, y, z);
-  return x && y && z;
-}
-
-static uint8_t pack_release_request_body_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
-  nfapi_ue_release_request_body_t *value = (nfapi_ue_release_request_body_t *)tlv;
-
-  if(push16(value->number_of_TLVs, ppWritePackedMsg, end) == 0) {
-    return 0;
-  }
-
-  uint8_t j;
-  uint16_t num = value->number_of_TLVs;
-
-  for(j = 0; j < num; ++j) {
-    if(push16(value->ue_release_request_TLVs_list[j].rnti, ppWritePackedMsg, end) == 0) {
-      return 0;
-    }
-  }
-
-  return 1;
-}
-
-static uint8_t pack_ue_release_request(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p7_codec_config_t *config) {
-  nfapi_ue_release_request_t *pNfapiMsg = (nfapi_ue_release_request_t *)msg;
-  int x = push16(pNfapiMsg->sfn_sf, ppWritePackedMsg, end);
-  int y = pack_tlv(NFAPI_UE_RELEASE_BODY_TAG, &pNfapiMsg->ue_release_request_body, ppWritePackedMsg, end, &pack_release_request_body_value);
-  int z = pack_p7_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config);
-  return x && y && z;
-}
-
-static uint8_t pack_ue_release_response(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p7_codec_config_t *config) {
-  nfapi_ue_release_response_t *pNfapiMsg = (nfapi_ue_release_response_t *)msg;
-  int x = push32(pNfapiMsg->error_code, ppWritePackedMsg, end);
-  int z = pack_p7_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config);
-  return x && z;
-}
-
-static uint8_t pack_rx_ue_information_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
-  nfapi_rx_ue_information *value = (nfapi_rx_ue_information *)tlv;
-  return ( push32(value->handle, ppWritePackedMsg, end) &&
-           push16(value->rnti, ppWritePackedMsg, end) );
-}
-
-static uint8_t unpack_rx_ue_information_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
-  nfapi_rx_ue_information *value = (nfapi_rx_ue_information *)tlv;
-  return ( pull32(ppReadPackedMsg, &value->handle, end) &&
-           pull16(ppReadPackedMsg, &value->rnti, end));
-}
-
-static uint8_t pack_harq_indication_tdd_harq_data_bundling(nfapi_harq_indication_tdd_harq_data_bundling_t *data, uint8_t **ppWritePackedMsg, uint8_t *end) {
-  return ( push8(data->value_0, ppWritePackedMsg, end) &&
-           push8(data->value_1, ppWritePackedMsg, end));
-}
-
-static uint8_t pack_harq_indication_tdd_harq_data_multiplexing(nfapi_harq_indication_tdd_harq_data_multiplexing_t *data, uint8_t **ppWritePackedMsg, uint8_t *end) {
-  return ( push8(data->value_0, ppWritePackedMsg, end) &&
-           push8(data->value_1, ppWritePackedMsg, end) &&
-           push8(data->value_2, ppWritePackedMsg, end) &&
-           push8(data->value_3, ppWritePackedMsg, end));
-}
-
-static uint8_t pack_harq_indication_tdd_harq_data_special_bundling(nfapi_harq_indication_tdd_harq_data_special_bundling_t *data, uint8_t **ppWritePackedMsg, uint8_t *end) {
-  return ( push8(data->value_0, ppWritePackedMsg, end) );
-}
-
-static uint8_t pack_harq_indication_tdd_harq_data(nfapi_harq_indication_tdd_harq_data_t *data, uint8_t **ppWritePackedMsg, uint8_t *end) {
-  return ( push8(data->value_0, ppWritePackedMsg, end) );
-}
-
-static uint8_t pack_harq_indication_tdd_rel8_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
-  nfapi_harq_indication_tdd_rel8_t *harq_indication_tdd_rel8 = (nfapi_harq_indication_tdd_rel8_t *)tlv;
-
-  if(!(push8(harq_indication_tdd_rel8->mode, ppWritePackedMsg, end) &&
-       push8(harq_indication_tdd_rel8->number_of_ack_nack, ppWritePackedMsg, end)))
-    return 0;
-
-  uint8_t result = 0;
-
-  switch(harq_indication_tdd_rel8->mode) {
-    case NFAPI_HARQ_INDICATION_TDD_HARQ_ACK_NACK_FORMAT_BUNDLING:
-      result = pack_harq_indication_tdd_harq_data_bundling(&harq_indication_tdd_rel8->harq_data.bundling, ppWritePackedMsg, end);
-      break;
-
-    case NFAPI_HARQ_INDICATION_TDD_HARQ_ACK_NACK_FORMAT_MULIPLEXING:
-      result = pack_harq_indication_tdd_harq_data_multiplexing(&harq_indication_tdd_rel8->harq_data.multiplex, ppWritePackedMsg, end);
-      break;
-
-    case NFAPI_HARQ_INDICATION_TDD_HARQ_ACK_NACK_FORMAT_SPECIAL_BUNDLING:
-      result = pack_harq_indication_tdd_harq_data_special_bundling(&harq_indication_tdd_rel8->harq_data.special_bundling, ppWritePackedMsg, end);
-      break;
-
-    case NFAPI_HARQ_INDICATION_TDD_HARQ_ACK_NACK_FORMAT_CHANNEL_SELECTION:
-    case NFAPI_HARQ_INDICATION_TDD_HARQ_ACK_NACK_FORMAT_FORMAT_3:
-      result = 1;
-      break;
-
-    default:
-      // err....
-      break;
-  }
-
-  return result;
-}
-
-static uint8_t pack_harq_indication_tdd_rel9_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
-  nfapi_harq_indication_tdd_rel9_t *harq_indication_tdd_rel9 = (nfapi_harq_indication_tdd_rel9_t *)tlv;
-
-  if(!(push8(harq_indication_tdd_rel9->mode, ppWritePackedMsg, end) &&
-       push8(harq_indication_tdd_rel9->number_of_ack_nack, ppWritePackedMsg, end)))
-    return 0;
-
-  uint8_t idx;
-
-  for(idx = 0; idx < harq_indication_tdd_rel9->number_of_ack_nack; ++idx) {
-    uint8_t result = 0;
-
-    switch(harq_indication_tdd_rel9->mode) {
-      case NFAPI_HARQ_INDICATION_TDD_HARQ_ACK_NACK_FORMAT_BUNDLING:
-        result = pack_harq_indication_tdd_harq_data(&(harq_indication_tdd_rel9->harq_data[idx].bundling), ppWritePackedMsg, end);
-        break;
-
-      case NFAPI_HARQ_INDICATION_TDD_HARQ_ACK_NACK_FORMAT_MULIPLEXING:
-        result = pack_harq_indication_tdd_harq_data(&harq_indication_tdd_rel9->harq_data[idx].multiplex, ppWritePackedMsg, end);
-        break;
-
-      case NFAPI_HARQ_INDICATION_TDD_HARQ_ACK_NACK_FORMAT_SPECIAL_BUNDLING:
-        result = pack_harq_indication_tdd_harq_data_special_bundling(&harq_indication_tdd_rel9->harq_data[idx].special_bundling, ppWritePackedMsg, end);
-        break;
-
-      case NFAPI_HARQ_INDICATION_TDD_HARQ_ACK_NACK_FORMAT_CHANNEL_SELECTION:
-        result = pack_harq_indication_tdd_harq_data(&harq_indication_tdd_rel9->harq_data[idx].channel_selection, ppWritePackedMsg, end);
-        break;
-
-      case NFAPI_HARQ_INDICATION_TDD_HARQ_ACK_NACK_FORMAT_FORMAT_3:
-        result = pack_harq_indication_tdd_harq_data(&harq_indication_tdd_rel9->harq_data[idx].format_3, ppWritePackedMsg, end);
-        break;
-
-      default:
-        // err....
-        break;
-    }
-
-    if(result == 0)
-      return 0;
-  }
-
-  return 1;
-}
-
-static uint8_t pack_harq_indication_tdd_rel13_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
-  nfapi_harq_indication_tdd_rel13_t *harq_indication_tdd_rel13 = (nfapi_harq_indication_tdd_rel13_t *)tlv;
-
-  if(!(push8(harq_indication_tdd_rel13->mode, ppWritePackedMsg, end) &&
-       push16(harq_indication_tdd_rel13->number_of_ack_nack, ppWritePackedMsg, end)))
-    return 0;
-
-  uint8_t idx;
-
-  for(idx = 0; idx < harq_indication_tdd_rel13->number_of_ack_nack; ++idx) {
-    uint8_t result = 0;
-
-    switch(harq_indication_tdd_rel13->mode) {
-      case NFAPI_HARQ_INDICATION_TDD_HARQ_ACK_NACK_FORMAT_BUNDLING:
-        result = pack_harq_indication_tdd_harq_data(&harq_indication_tdd_rel13->harq_data[idx].bundling, ppWritePackedMsg, end);
-        break;
-
-      case NFAPI_HARQ_INDICATION_TDD_HARQ_ACK_NACK_FORMAT_MULIPLEXING:
-        result = pack_harq_indication_tdd_harq_data(&harq_indication_tdd_rel13->harq_data[idx].multiplex, ppWritePackedMsg, end);
-        break;
-
-      case NFAPI_HARQ_INDICATION_TDD_HARQ_ACK_NACK_FORMAT_SPECIAL_BUNDLING:
-        result = pack_harq_indication_tdd_harq_data_special_bundling(&harq_indication_tdd_rel13->harq_data[idx].special_bundling, ppWritePackedMsg, end);
-        break;
-
-      case NFAPI_HARQ_INDICATION_TDD_HARQ_ACK_NACK_FORMAT_CHANNEL_SELECTION:
-        result = pack_harq_indication_tdd_harq_data(&harq_indication_tdd_rel13->harq_data[idx].channel_selection, ppWritePackedMsg, end);
-        break;
-
-      case NFAPI_HARQ_INDICATION_TDD_HARQ_ACK_NACK_FORMAT_FORMAT_3:
-        result = pack_harq_indication_tdd_harq_data(&harq_indication_tdd_rel13->harq_data[idx].format_3, ppWritePackedMsg, end);
-        break;
-
-      case NFAPI_HARQ_INDICATION_TDD_HARQ_ACK_NACK_FORMAT_FORMAT_4:
-        result = pack_harq_indication_tdd_harq_data(&harq_indication_tdd_rel13->harq_data[idx].format_4, ppWritePackedMsg, end);
-        break;
-
-      case NFAPI_HARQ_INDICATION_TDD_HARQ_ACK_NACK_FORMAT_FORMAT_5:
-        result = pack_harq_indication_tdd_harq_data(&harq_indication_tdd_rel13->harq_data[idx].format_5, ppWritePackedMsg, end);
-        break;
-
-      default:
-        // err....
-        break;
-    }
-
-    if(result == 0)
-      return 0;
-  }
-
-  return 1;
-}
-
-static uint8_t pack_harq_indication_fdd_rel8_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
-  nfapi_harq_indication_fdd_rel8_t *harq_indication_fdd_rel8 = (nfapi_harq_indication_fdd_rel8_t *)tlv;
-  return ( push8(harq_indication_fdd_rel8->harq_tb1, ppWritePackedMsg, end) &&
-           push8(harq_indication_fdd_rel8->harq_tb2, ppWritePackedMsg, end));
-}
-
-static uint8_t pack_harq_indication_fdd_rel9_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
-  nfapi_harq_indication_fdd_rel9_t *harq_indication_fdd_rel9 = (nfapi_harq_indication_fdd_rel9_t *)tlv;
-  return ( push8(harq_indication_fdd_rel9->mode, ppWritePackedMsg, end) &&
-           push8(harq_indication_fdd_rel9->number_of_ack_nack, ppWritePackedMsg, end) &&
-           pusharray8(harq_indication_fdd_rel9->harq_tb_n, NFAPI_HARQ_ACK_NACK_REL9_MAX, harq_indication_fdd_rel9->number_of_ack_nack, ppWritePackedMsg, end));
-}
-
-static uint8_t pack_harq_indication_fdd_rel13_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
-  nfapi_harq_indication_fdd_rel13_t *harq_indication_fdd_rel13 = (nfapi_harq_indication_fdd_rel13_t *)tlv;
-  return ( push8(harq_indication_fdd_rel13->mode, ppWritePackedMsg, end) &&
-           push16(harq_indication_fdd_rel13->number_of_ack_nack, ppWritePackedMsg, end) &&
-           pusharray8(harq_indication_fdd_rel13->harq_tb_n, NFAPI_HARQ_ACK_NACK_REL13_MAX, harq_indication_fdd_rel13->number_of_ack_nack, ppWritePackedMsg, end));
-}
-
-static uint8_t pack_ul_cqi_information_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
-  nfapi_ul_cqi_information_t *value = (nfapi_ul_cqi_information_t *)tlv;
-  return ( push8(value->ul_cqi, ppWritePackedMsg, end) &&
-           push8(value->channel, ppWritePackedMsg, end));
-}
-
-static uint8_t pack_harq_indication_body_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
-  nfapi_harq_indication_body_t *value = (nfapi_harq_indication_body_t *)tlv;
-
-  if(push16(value->number_of_harqs, ppWritePackedMsg, end) == 0)
-    return 0;
-
-  uint16_t i = 0;
-  uint16_t total_number_of_pdus = value->number_of_harqs;
-
-  for(; i < total_number_of_pdus; ++i) {
-    nfapi_harq_indication_pdu_t *pdu = &(value->harq_pdu_list[i]);
-    uint8_t *instance_length_p = *ppWritePackedMsg;
-
-    if(!push16(pdu->instance_length, ppWritePackedMsg, end))
-      return 0;
-
-    if(!(pack_tlv(NFAPI_RX_UE_INFORMATION_TAG, &pdu->rx_ue_information, ppWritePackedMsg, end, pack_rx_ue_information_value) &&
-         pack_tlv(NFAPI_HARQ_INDICATION_TDD_REL8_TAG, &pdu->harq_indication_tdd_rel8, ppWritePackedMsg, end, pack_harq_indication_tdd_rel8_value) &&
-         pack_tlv(NFAPI_HARQ_INDICATION_TDD_REL9_TAG, &pdu->harq_indication_tdd_rel9, ppWritePackedMsg, end, pack_harq_indication_tdd_rel9_value) &&
-         pack_tlv(NFAPI_HARQ_INDICATION_TDD_REL13_TAG, &pdu->harq_indication_tdd_rel13, ppWritePackedMsg, end, pack_harq_indication_tdd_rel13_value) &&
-         pack_tlv(NFAPI_HARQ_INDICATION_FDD_REL8_TAG, &pdu->harq_indication_fdd_rel8, ppWritePackedMsg, end, pack_harq_indication_fdd_rel8_value) &&
-         pack_tlv(NFAPI_HARQ_INDICATION_FDD_REL9_TAG, &pdu->harq_indication_fdd_rel9, ppWritePackedMsg, end, pack_harq_indication_fdd_rel9_value) &&
-         pack_tlv(NFAPI_HARQ_INDICATION_FDD_REL13_TAG, &pdu->harq_indication_fdd_rel13, ppWritePackedMsg, end, pack_harq_indication_fdd_rel13_value) &&
-         pack_tlv(NFAPI_UL_CQI_INFORMATION_TAG, &pdu->ul_cqi_information, ppWritePackedMsg, end, pack_ul_cqi_information_value)))
-      return 0;
-
-    // calculate the instance length subtracting the size of the instance
-    // length feild
-    uint16_t instance_length = *ppWritePackedMsg - instance_length_p - 2;
-    push16(instance_length, &instance_length_p, end);
-  }
-
-  return 1;
-}
-
-static uint8_t pack_harq_indication(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p7_codec_config_t *config) {
-  nfapi_harq_indication_t *pNfapiMsg = (nfapi_harq_indication_t *)msg;
-  return ( push16(pNfapiMsg->sfn_sf, ppWritePackedMsg, end) &&
-           pack_tlv(NFAPI_HARQ_INDICATION_BODY_TAG, &pNfapiMsg->harq_indication_body, ppWritePackedMsg, end, pack_harq_indication_body_value) &&
-           pack_p7_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config));
-}
-
-static uint8_t pack_crc_indication_rel8_body(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
-  nfapi_crc_indication_rel8_t *crc_indication_rel8 = (nfapi_crc_indication_rel8_t *)tlv;
-  return ( push8(crc_indication_rel8->crc_flag, ppWritePackedMsg, end) );
-}
-
-static uint8_t pack_crc_indication_body_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
-  nfapi_crc_indication_body_t *value = (nfapi_crc_indication_body_t *)tlv;
-
-  if(push16(value->number_of_crcs, ppWritePackedMsg, end) == 0)
-    return 0;
-
-  uint16_t i = 0;
-  uint16_t total_number_of_pdus = value->number_of_crcs;
-
-  for(; i < total_number_of_pdus; ++i) {
-    nfapi_crc_indication_pdu_t *pdu = &(value->crc_pdu_list[i]);
-    uint8_t *instance_length_p = *ppWritePackedMsg;
-
-    if(!push16(pdu->instance_length, ppWritePackedMsg, end))
-      return 0;
-
-    if(!(pack_tlv(NFAPI_RX_UE_INFORMATION_TAG, &pdu->rx_ue_information, ppWritePackedMsg, end, pack_rx_ue_information_value) &&
-         pack_tlv(NFAPI_CRC_INDICATION_REL8_TAG, &pdu->crc_indication_rel8, ppWritePackedMsg, end, pack_crc_indication_rel8_body)))
-      return 0;
-
-    // calculate the instance length subtracting the size of the instance
-    // length feild
-    uint16_t instance_length = *ppWritePackedMsg - instance_length_p - 2;
-    push16(instance_length, &instance_length_p, end);
-  }
-
-  return 1;
-}
-
-static uint8_t pack_crc_indication(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p7_codec_config_t *config) {
-  nfapi_crc_indication_t *pNfapiMsg = (nfapi_crc_indication_t *)msg;
-  return ( push16(pNfapiMsg->sfn_sf, ppWritePackedMsg, end) &&
-           pack_tlv(NFAPI_CRC_INDICATION_BODY_TAG, &pNfapiMsg->crc_indication_body, ppWritePackedMsg, end, &pack_crc_indication_body_value) &&
-           pack_p7_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config));
-}
-static uint8_t pack_rx_indication_rel8_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
-  nfapi_rx_indication_rel8_t *value = (nfapi_rx_indication_rel8_t *)tlv;
-  return ( push16(value->length, ppWritePackedMsg, end) &&
-           push16(value->offset, ppWritePackedMsg, end) &&
-           push8(value->ul_cqi, ppWritePackedMsg, end) &&
-           push16(value->timing_advance, ppWritePackedMsg, end));
-}
-static uint8_t pack_rx_indication_rel9_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
-  nfapi_rx_indication_rel9_t *value = (nfapi_rx_indication_rel9_t *)tlv;
-  return ( push16(value->timing_advance_r9, ppWritePackedMsg, end));
-}
-
-static uint8_t pack_rx_ulsch_indication_body_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
-  nfapi_rx_indication_body_t *value = (nfapi_rx_indication_body_t *)tlv;
-
-  //printf("RX ULSCH BODY\n");
-
-  if( push16(value->number_of_pdus, ppWritePackedMsg, end) == 0)
-    return 0;
-
-  // need to calculate the data offset's.
-  uint16_t i = 0;
-  uint16_t offset = 2; // taking into account the number_of_pdus
-  uint16_t total_number_of_pdus = value->number_of_pdus;
-  //printf("ULSCH:pdus:%d\n", total_number_of_pdus);
-
-  for(i = 0; i < total_number_of_pdus; ++i) {
-    nfapi_rx_indication_pdu_t *pdu = &(value->rx_pdu_list[i]);
-
-    if(pdu->rx_ue_information.tl.tag == NFAPI_RX_UE_INFORMATION_TAG) {
-      //printf("NFAPI_RX_UE_INFORMATION_TAG\n");
-      offset += 4 + 6;
-    }
-
-    if(pdu->rx_indication_rel8.tl.tag == NFAPI_RX_INDICATION_REL8_TAG) {
-      //printf("NFAPI_RX_INDICATION_REL8_TAG\n");
-      offset += 4 + 7;
-    }
-
-    if(pdu->rx_indication_rel9.tl.tag == NFAPI_RX_INDICATION_REL9_TAG) {
-      //printf("NFAPI_RX_INDICATION_REL9_TAG\n");
-      offset += 4 + 2;
-    }
-  }
-
-  // Now update the structure to include the offset
-  for(i =0; i < total_number_of_pdus; ++i) {
-    nfapi_rx_indication_pdu_t *pdu = &(value->rx_pdu_list[i]);
-
-    if(pdu->rx_indication_rel8.tl.tag == NFAPI_RX_INDICATION_REL8_TAG) {
-      if(pdu->rx_indication_rel8.offset == 1) {
-        pdu->rx_indication_rel8.offset = offset;
-        offset += pdu->rx_indication_rel8.length;
-      }
-    }
-  }
-
-  // Write out the pdu
-  for(i = 0; i < total_number_of_pdus; ++i) {
-    nfapi_rx_indication_pdu_t *pdu = &(value->rx_pdu_list[i]);
-
-    if(!(pack_tlv(NFAPI_RX_UE_INFORMATION_TAG, &pdu->rx_ue_information, ppWritePackedMsg, end, pack_rx_ue_information_value) &&
-         pack_tlv(NFAPI_RX_INDICATION_REL8_TAG, &pdu->rx_indication_rel8, ppWritePackedMsg, end, pack_rx_indication_rel8_value) &&
-         pack_tlv(NFAPI_RX_INDICATION_REL9_TAG, &pdu->rx_indication_rel9, ppWritePackedMsg, end, pack_rx_indication_rel9_value)))
-      return 0;
-  }
-
-  // Write out the pdu data
-  for(i = 0; i < total_number_of_pdus; ++i) {
-    uint16_t length = 0;
-    nfapi_rx_indication_pdu_t *pdu = &(value->rx_pdu_list[i]);
-
-    if(pdu->rx_indication_rel8.tl.tag == NFAPI_RX_INDICATION_REL8_TAG) {
-      length = pdu->rx_indication_rel8.length;
-    }
-
-    if( pusharray8(value->rx_pdu_list[i].data, length, length, ppWritePackedMsg, end) == 0)
-      return 0;
-  }
-
-  return 1;
-}
-
-
-static uint8_t pack_rx_ulsch_indication(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p7_codec_config_t *config) {
-  nfapi_rx_indication_t *pNfapiMsg = (nfapi_rx_indication_t *)msg;
-  return ( push16(pNfapiMsg->sfn_sf, ppWritePackedMsg, end) &&
-           pack_tlv(NFAPI_RX_INDICATION_BODY_TAG, &pNfapiMsg->rx_indication_body, ppWritePackedMsg, end, pack_rx_ulsch_indication_body_value) &&
-           pack_p7_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config));
-}
-
-static uint8_t pack_preamble_pdu_rel8_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
-  nfapi_preamble_pdu_rel8_t *preamble_rel8 = (nfapi_preamble_pdu_rel8_t *)tlv;
-  return ( push16(preamble_rel8->rnti, ppWritePackedMsg, end) &&
-           push8(preamble_rel8->preamble, ppWritePackedMsg, end) &&
-           push16(preamble_rel8->timing_advance, ppWritePackedMsg, end));
-}
-static uint8_t pack_preamble_pdu_rel9_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
-  nfapi_preamble_pdu_rel9_t *preamble_rel9 = (nfapi_preamble_pdu_rel9_t *)tlv;
-  return ( push16(preamble_rel9->timing_advance_r9, ppWritePackedMsg, end) );
-}
-static uint8_t pack_preamble_pdu_rel13_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
-  nfapi_preamble_pdu_rel13_t *preamble_rel13 = (nfapi_preamble_pdu_rel13_t *)tlv;
-  return ( push8(preamble_rel13->rach_resource_type, ppWritePackedMsg, end) );
-}
-
-static uint8_t pack_rach_indication_body_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
-  nfapi_rach_indication_body_t *value = (nfapi_rach_indication_body_t *)tlv;
-
-  if( push16(value->number_of_preambles, ppWritePackedMsg, end) == 0)
-    return 0;
-
-  uint16_t i = 0;
-  uint16_t total_number_of_pdus = value->number_of_preambles;
-
-  for(; i < total_number_of_pdus; ++i) {
-    nfapi_preamble_pdu_t *pdu = &(value->preamble_list[i]);
-    uint8_t *instance_length_p = *ppWritePackedMsg;
-
-    if(!push16(pdu->instance_length, ppWritePackedMsg, end))
-      return 0;
-
-    if(!(pack_tlv(NFAPI_PREAMBLE_REL8_TAG, &pdu->preamble_rel8, ppWritePackedMsg, end, pack_preamble_pdu_rel8_value) &&
-         pack_tlv(NFAPI_PREAMBLE_REL9_TAG, &pdu->preamble_rel9, ppWritePackedMsg, end, pack_preamble_pdu_rel9_value) &&
-         pack_tlv(NFAPI_PREAMBLE_REL13_TAG, &pdu->preamble_rel13, ppWritePackedMsg, end, pack_preamble_pdu_rel13_value)))
-      return 0;
-
-    // calculate the instance length subtracting the size of the instance
-    // length feild
-    uint16_t instance_length = *ppWritePackedMsg - instance_length_p - 2;
-    push16(instance_length, &instance_length_p, end);
-  }
-
-  return 1;
-}
-
-static uint8_t pack_rach_indication(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p7_codec_config_t *config) {
-  nfapi_rach_indication_t *pNfapiMsg = (nfapi_rach_indication_t *)msg;
-  return ( push16(pNfapiMsg->sfn_sf, ppWritePackedMsg, end) &&
-           pack_tlv(NFAPI_RACH_INDICATION_BODY_TAG, &pNfapiMsg->rach_indication_body, ppWritePackedMsg, end, pack_rach_indication_body_value) &&
-           pack_p7_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config));
-}
-
-static uint8_t pack_srs_indication_fdd_rel8_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
-  nfapi_srs_indication_fdd_rel8_t *srs_pdu_rel8 = (nfapi_srs_indication_fdd_rel8_t *)tlv;
-  return ( push16(srs_pdu_rel8->doppler_estimation, ppWritePackedMsg, end) &&
-           push16(srs_pdu_rel8->timing_advance, ppWritePackedMsg, end) &&
-           push8(srs_pdu_rel8->number_of_resource_blocks, ppWritePackedMsg, end) &&
-           push8(srs_pdu_rel8->rb_start, ppWritePackedMsg, end) &&
-           pusharray8(srs_pdu_rel8->snr, NFAPI_NUM_RB_MAX, srs_pdu_rel8->number_of_resource_blocks, ppWritePackedMsg, end));
-}
-
-static uint8_t pack_srs_indication_fdd_rel9_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
-  nfapi_srs_indication_fdd_rel9_t *srs_pdu_rel9 = (nfapi_srs_indication_fdd_rel9_t *)tlv;
-  return ( push16(srs_pdu_rel9->timing_advance_r9, ppWritePackedMsg, end) );
-}
-
-static uint8_t pack_srs_indication_tdd_rel10_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
-  nfapi_srs_indication_ttd_rel10_t *srs_pdu_rel10 = (nfapi_srs_indication_ttd_rel10_t *)tlv;
-  return ( push8(srs_pdu_rel10->uppts_symbol, ppWritePackedMsg, end) );
-}
-
-static uint8_t pack_srs_indication_fdd_rel11_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
-  nfapi_srs_indication_fdd_rel11_t *srs_pdu_rel11 = (nfapi_srs_indication_fdd_rel11_t *)tlv;
-  return ( push16(srs_pdu_rel11->ul_rtoa, ppWritePackedMsg, end) ) ;
-}
-
-static uint8_t pack_tdd_channel_measurement_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
-  nfapi_tdd_channel_measurement_t *value = (nfapi_tdd_channel_measurement_t *)tlv;
-
-  if(!(push8(value->num_prb_per_subband, ppWritePackedMsg, end) &&
-       push8(value->number_of_subbands, ppWritePackedMsg, end) &&
-       push8(value->num_atennas, ppWritePackedMsg, end)))
-    return 0;
-
-  uint8_t idx = 0;
-
-  for(idx = 0; idx < value->number_of_subbands; ++idx) {
-    if(!(push8(value->subands[idx].subband_index, ppWritePackedMsg, end) &&
-         pusharray16(value->subands[idx].channel, NFAPI_MAX_NUM_PHYSICAL_ANTENNAS, value->num_atennas, ppWritePackedMsg, end)))
-      return 0;
-  }
-
-  return 1;
-}
-
-static uint8_t pack_srs_indication_body_value(void *tlv, uint8_t **ppWritePackedMsg,  uint8_t *end) {
-  nfapi_srs_indication_body_t *value = (nfapi_srs_indication_body_t *)tlv;
-
-  if( push8(value->number_of_ues, ppWritePackedMsg, end) == 0)
-    return 0;
-
-  uint16_t i = 0;
-  uint16_t total_number_of_pdus = value->number_of_ues;
-
-  for(; i < total_number_of_pdus; ++i) {
-    nfapi_srs_indication_pdu_t *pdu = &(value->srs_pdu_list[i]);
-    uint8_t *instance_length_p = *ppWritePackedMsg;
-
-    if(!push16(pdu->instance_length, ppWritePackedMsg, end))
-      return 0;
-
-    if(!(pack_tlv(NFAPI_RX_UE_INFORMATION_TAG, &pdu->rx_ue_information, ppWritePackedMsg, end, &pack_rx_ue_information_value) &&
-         pack_tlv(NFAPI_SRS_INDICATION_FDD_REL8_TAG, &pdu->srs_indication_fdd_rel8, ppWritePackedMsg, end, &pack_srs_indication_fdd_rel8_value) &&
-         pack_tlv(NFAPI_SRS_INDICATION_FDD_REL9_TAG, &pdu->srs_indication_fdd_rel9, ppWritePackedMsg, end, &pack_srs_indication_fdd_rel9_value) &&
-         pack_tlv(NFAPI_SRS_INDICATION_TDD_REL10_TAG, &pdu->srs_indication_tdd_rel10, ppWritePackedMsg, end, &pack_srs_indication_tdd_rel10_value) &&
-         pack_tlv(NFAPI_SRS_INDICATION_FDD_REL11_TAG, &pdu->srs_indication_fdd_rel11, ppWritePackedMsg, end, &pack_srs_indication_fdd_rel11_value) &&
-         pack_tlv(NFAPI_TDD_CHANNEL_MEASUREMENT_TAG, &pdu->tdd_channel_measurement, ppWritePackedMsg, end, &pack_tdd_channel_measurement_value)))
-      return 0;
-
-    // calculate the instance length subtracting the size of the instance
-    // length feild
-    uint16_t instance_length = *ppWritePackedMsg - instance_length_p - 2;
-    push16(instance_length, &instance_length_p, end);
-  }
-
-  return 1;
-}
-
-static uint8_t pack_srs_indication(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p7_codec_config_t *config) {
-  nfapi_srs_indication_t *pNfapiMsg = (nfapi_srs_indication_t *)msg;
-  return ( push16(pNfapiMsg->sfn_sf, ppWritePackedMsg, end) &&
-           pack_tlv(NFAPI_SRS_INDICATION_BODY_TAG, &pNfapiMsg->srs_indication_body, ppWritePackedMsg, end, &pack_srs_indication_body_value) &&
-           pack_p7_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config));
-}
-
-static uint8_t pack_sr_indication_body_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
-  nfapi_sr_indication_body_t *value = (nfapi_sr_indication_body_t *)tlv;
-
-  if(push16(value->number_of_srs, ppWritePackedMsg, end) == 0)
-    return 0;
-
-  uint16_t i = 0;
-  uint16_t total_number_of_pdus = value->number_of_srs;
-
-  for(; i < total_number_of_pdus; ++i) {
-    nfapi_sr_indication_pdu_t *pdu = &(value->sr_pdu_list[i]);
-    uint8_t *instance_length_p = *ppWritePackedMsg;
-
-    if(!push16(pdu->instance_length, ppWritePackedMsg, end))
-      return 0;
-
-    if(!(pack_tlv(NFAPI_RX_UE_INFORMATION_TAG, &pdu->rx_ue_information, ppWritePackedMsg, end, pack_rx_ue_information_value) &&
-         pack_tlv(NFAPI_UL_CQI_INFORMATION_TAG, &pdu->ul_cqi_information, ppWritePackedMsg, end, pack_ul_cqi_information_value)))
-      return 0;
-
-    // calculate the instance length subtracting the size of the instance
-    // length feild
-    uint16_t instance_length = *ppWritePackedMsg - instance_length_p - 2;
-    push16(instance_length, &instance_length_p, end);
-  }
-
-  return 1;
-}
-
-static uint8_t pack_sr_indication(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p7_codec_config_t *config) {
-  nfapi_sr_indication_t *pNfapiMsg = (nfapi_sr_indication_t *)msg;
-  return ( push16(pNfapiMsg->sfn_sf, ppWritePackedMsg, end) &&
-           pack_tlv(NFAPI_SR_INDICATION_BODY_TAG, &pNfapiMsg->sr_indication_body, ppWritePackedMsg, end, &pack_sr_indication_body_value) &&
-           pack_p7_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config));
-}
-
-static uint8_t pack_cqi_indication_rel8_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
-  nfapi_cqi_indication_rel8_t *cqi_pdu_rel8 = (nfapi_cqi_indication_rel8_t *)tlv;
-  return ( push16(cqi_pdu_rel8->length, ppWritePackedMsg, end) &&
-           push16(cqi_pdu_rel8->data_offset, ppWritePackedMsg, end) &&
-           push8(cqi_pdu_rel8->ul_cqi, ppWritePackedMsg, end) &&
-           push8(cqi_pdu_rel8->ri, ppWritePackedMsg, end) &&
-           push16(cqi_pdu_rel8->timing_advance, ppWritePackedMsg, end));
-}
-
-static uint8_t pack_cqi_indication_rel9_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
-  nfapi_cqi_indication_rel9_t *cqi_pdu_rel9 = (nfapi_cqi_indication_rel9_t *)tlv;
-  return  ( push16(cqi_pdu_rel9->length, ppWritePackedMsg, end) &&
-            push16(cqi_pdu_rel9->data_offset, ppWritePackedMsg, end) &&
-            push8(cqi_pdu_rel9->ul_cqi, ppWritePackedMsg, end) &&
-            push8(cqi_pdu_rel9->number_of_cc_reported, ppWritePackedMsg, end) &&
-            pusharray8(cqi_pdu_rel9->ri, NFAPI_CC_MAX, cqi_pdu_rel9->number_of_cc_reported, ppWritePackedMsg, end) &&
-            push16(cqi_pdu_rel9->timing_advance, ppWritePackedMsg, end) &&
-            push16(cqi_pdu_rel9->timing_advance_r9, ppWritePackedMsg, end));
-}
-
-static uint8_t pack_cqi_indication_body_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
-  nfapi_cqi_indication_body_t *value = (nfapi_cqi_indication_body_t *)tlv;
-
-  if( push16(value->number_of_cqis, ppWritePackedMsg, end) == 0)
-    return 0;
-
-  // need to calculate the data offset's. This very bittle due the hardcoding
-  // of the sizes. can not use the sizeof as we have an array for the Rel9
-  // info
-  uint16_t i = 0;
-  uint16_t offset = 2; // taking into account the number_of_cqis
-  uint16_t total_number_of_pdus = value->number_of_cqis;
-
-  for(i = 0; i < total_number_of_pdus; ++i) {
-    nfapi_cqi_indication_pdu_t *pdu = &(value->cqi_pdu_list[i]);
-    offset += 2; // for the instance length
-
-    if(pdu->rx_ue_information.tl.tag == NFAPI_RX_UE_INFORMATION_TAG) {
-      offset += 4 + 6; // sizeof(nfapi_rx_ue_information) - sizeof(nfapi_tl_t)
-    }
-
-    if(pdu->cqi_indication_rel8.tl.tag == NFAPI_CQI_INDICATION_REL8_TAG) {
-      offset += 4 + 8;
-    }
-
-    if(pdu->cqi_indication_rel9.tl.tag == NFAPI_CQI_INDICATION_REL9_TAG) {
-      offset += 4 + 10 + pdu->cqi_indication_rel9.number_of_cc_reported;
-    }
-
-    if(pdu->ul_cqi_information.tl.tag == NFAPI_UL_CQI_INFORMATION_TAG) {
-      offset += 4 + 2;
-    }
-  }
-
-  // Now update the structure to include the offset
-  for(i =0; i < total_number_of_pdus; ++i) {
-    nfapi_cqi_indication_pdu_t *pdu = &(value->cqi_pdu_list[i]);
-
-    if(pdu->cqi_indication_rel8.tl.tag == NFAPI_CQI_INDICATION_REL8_TAG) {
-      if(pdu->cqi_indication_rel8.data_offset == 1) {
-        pdu->cqi_indication_rel8.data_offset = offset;
-        offset += pdu->cqi_indication_rel8.length;
-      }
-    }
-
-    if(pdu->cqi_indication_rel9.tl.tag == NFAPI_CQI_INDICATION_REL9_TAG) {
-      if(pdu->cqi_indication_rel9.data_offset == 1) {
-        pdu->cqi_indication_rel9.data_offset = offset;
-        offset += pdu->cqi_indication_rel9.length;
-      }
-    }
-  }
-
-  // Write out the cqi information
-  for(i = 0; i < total_number_of_pdus; ++i) {
-    nfapi_cqi_indication_pdu_t *pdu = &(value->cqi_pdu_list[i]);
-    uint8_t *instance_length_p = *ppWritePackedMsg;
-
-    if(!push16(pdu->instance_length, ppWritePackedMsg, end))
-      return 0;
-
-    if(!(pack_tlv(NFAPI_RX_UE_INFORMATION_TAG, &pdu->rx_ue_information, ppWritePackedMsg, end,pack_rx_ue_information_value) &&
-         pack_tlv(NFAPI_CQI_INDICATION_REL8_TAG, &pdu->cqi_indication_rel8, ppWritePackedMsg, end, pack_cqi_indication_rel8_value) &&
-         pack_tlv(NFAPI_CQI_INDICATION_REL9_TAG, &pdu->cqi_indication_rel9, ppWritePackedMsg, end, pack_cqi_indication_rel9_value) &&
-         pack_tlv(NFAPI_UL_CQI_INFORMATION_TAG, &pdu->ul_cqi_information, ppWritePackedMsg, end, pack_ul_cqi_information_value)))
-      return 0;
-
-    // calculate the instance length subtracting the size of the instance
-    // length feild
-    uint16_t instance_length = *ppWritePackedMsg - instance_length_p - 2;
-    push16(instance_length, &instance_length_p, end);
-  }
-
-  // Write out the cqi raw data
-  for(i = 0; i < total_number_of_pdus; ++i) {
-    uint16_t length = 0;
-    nfapi_cqi_indication_pdu_t *pdu = &(value->cqi_pdu_list[i]);
-
-    if(pdu->cqi_indication_rel8.tl.tag == NFAPI_CQI_INDICATION_REL8_TAG) {
-      length = pdu->cqi_indication_rel8.length;
-    }
-
-    if(pdu->cqi_indication_rel9.tl.tag == NFAPI_CQI_INDICATION_REL9_TAG) {
-      length = pdu->cqi_indication_rel9.length;
-    }
-
-    if( pusharray8(value->cqi_raw_pdu_list[i].pdu, NFAPI_CQI_RAW_MAX_LEN, length, ppWritePackedMsg, end) == 0)
-      return 0;
-  }
-
-  return 1;
-}
-
-static uint8_t pack_cqi_indication(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p7_codec_config_t *config) {
-  nfapi_cqi_indication_t *pNfapiMsg = (nfapi_cqi_indication_t *)msg;
-  //Fixme: allocate some mem to fix pure bug, need to find out proper size
-  pNfapiMsg->vendor_extension=NULL;//(nfapi_vendor_extension_tlv_t)malloc( sizeof(* pNfapiMsg->vendor_extension));
-  return ( push16(pNfapiMsg->sfn_sf, ppWritePackedMsg, end) &&
-           pack_tlv(NFAPI_CQI_INDICATION_BODY_TAG, &pNfapiMsg->cqi_indication_body, ppWritePackedMsg, end, pack_cqi_indication_body_value) &&
-           pack_p7_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config));
-}
-
-static uint8_t pack_lbt_pdsch_req_pdu_rel13_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
-  nfapi_lbt_pdsch_req_pdu_rel13_t *value = (nfapi_lbt_pdsch_req_pdu_rel13_t *)tlv;
-  return ( push32(value->handle, ppWritePackedMsg, end) &&
-           push32(value->mp_cca, ppWritePackedMsg, end) &&
-           push32(value->n_cca, ppWritePackedMsg, end) &&
-           push32(value->offset, ppWritePackedMsg, end) &&
-           push32(value->lte_txop_sf, ppWritePackedMsg, end) &&
-           push16(value->txop_sfn_sf_end, ppWritePackedMsg, end) &&
-           push32(value->lbt_mode, ppWritePackedMsg, end));
-}
-
-static uint8_t pack_lbt_drs_req_pdu_rel13_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
-  nfapi_lbt_drs_req_pdu_rel13_t *value = (nfapi_lbt_drs_req_pdu_rel13_t *)tlv;
-  return ( push32(value->handle, ppWritePackedMsg, end) &&
-           push32(value->offset, ppWritePackedMsg, end) &&
-           push16(value->sfn_sf_end, ppWritePackedMsg, end) &&
-           push32(value->lbt_mode, ppWritePackedMsg, end));
-}
-
-static uint8_t pack_lbt_dl_config_request_body_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
-  nfapi_lbt_dl_config_request_body_t *value = (nfapi_lbt_dl_config_request_body_t *)tlv;
-
-  if( push16(value->number_of_pdus, ppWritePackedMsg, end) == 0)
-    return 0;
-
-  uint16_t i = 0;
-  uint16_t total_number_of_pdus = value->number_of_pdus;
-
-  for(; i < total_number_of_pdus; ++i) {
-    nfapi_lbt_dl_config_request_pdu_t *pdu = &(value->lbt_dl_config_req_pdu_list[i]);
-
-    if( push8(pdu->pdu_type, ppWritePackedMsg, end) == 0)
-      return 0;
-
-    // Put a 0 size in and then determine the size after the pdu
-    // has been writen and write the calculated size
-    uint8_t *pWritePackedMsgPduSize = *ppWritePackedMsg;
-    pdu->pdu_size = 0;
-
-    if( push8(pdu->pdu_size, ppWritePackedMsg, end) == 0)
-      return 0;
-
-    switch(pdu->pdu_type) {
-      case NFAPI_LBT_DL_CONFIG_REQUEST_PDSCH_PDU_TYPE: {
-        if( pack_tlv(NFAPI_LBT_PDSCH_REQ_PDU_REL13_TAG, &pdu->lbt_pdsch_req_pdu.lbt_pdsch_req_pdu_rel13, ppWritePackedMsg, end, pack_lbt_pdsch_req_pdu_rel13_value) == 0)
-          return 0;
-      }
-      break;
-
-      case NFAPI_LBT_DL_CONFIG_REQUEST_DRS_PDU_TYPE: {
-        if(pack_tlv(NFAPI_LBT_DRS_REQ_PDU_REL13_TAG, &pdu->lbt_drs_req_pdu.lbt_drs_req_pdu_rel13, ppWritePackedMsg, end, pack_lbt_drs_req_pdu_rel13_value) == 0)
-          return 0;
-      }
-      break;
-
-      default: {
-        NFAPI_TRACE(NFAPI_TRACE_ERROR, "LBT_DL_CONFIG.request invalid pdu type %d \n", pdu->pdu_type );
-      }
-      break;
-    };
-
-    // add 1 for the pdu_type. The delta will include the pdu_size
-    pdu->pdu_size = 1 + (*ppWritePackedMsg - pWritePackedMsgPduSize);
-
-    push8(pdu->pdu_size, &pWritePackedMsgPduSize, end);
-  }
-
-  return 1;
-}
-
-static uint8_t pack_lbt_pdsch_rsp_pdu_rel13_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
-  nfapi_lbt_pdsch_rsp_pdu_rel13_t *value = (nfapi_lbt_pdsch_rsp_pdu_rel13_t *)tlv;
-  return ( push32(value->handle, ppWritePackedMsg, end) &&
-           push32(value->result, ppWritePackedMsg, end) &&
-           push32(value->lte_txop_symbols, ppWritePackedMsg, end) &&
-           push32(value->initial_partial_sf, ppWritePackedMsg, end));
-}
-
-static uint8_t pack_lbt_drs_rsp_pdu_rel13_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
-  nfapi_lbt_drs_rsp_pdu_rel13_t *value = (nfapi_lbt_drs_rsp_pdu_rel13_t *)tlv;
-  return ( push32(value->handle, ppWritePackedMsg, end) &&
-           push32(value->result, ppWritePackedMsg, end));
-}
-
-static uint8_t pack_lbt_dl_config_request(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p7_codec_config_t *config) {
-  nfapi_lbt_dl_config_request_t *pNfapiMsg = (nfapi_lbt_dl_config_request_t *)msg;
-  return ( push16(pNfapiMsg->sfn_sf, ppWritePackedMsg, end) &&
-           pack_tlv(NFAPI_LBT_DL_CONFIG_REQUEST_BODY_TAG, &pNfapiMsg->lbt_dl_config_request_body, ppWritePackedMsg, end, &pack_lbt_dl_config_request_body_value) &&
-           pack_p7_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config));
-}
-
-static uint8_t pack_lbt_dl_config_indication_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
-  nfapi_lbt_dl_indication_body_t *value = (nfapi_lbt_dl_indication_body_t *)tlv;
-
-  if( push16(value->number_of_pdus, ppWritePackedMsg, end) == 0)
-    return 0;
-
-  uint16_t i = 0;
-  uint16_t total_number_of_pdus = value->number_of_pdus;
-
-  for(; i < total_number_of_pdus; ++i) {
-    nfapi_lbt_dl_indication_pdu_t *pdu = &(value->lbt_indication_pdu_list[i]);
-
-    if( push8(pdu->pdu_type, ppWritePackedMsg, end) == 0)
-      return 0;
-
-    // Put a 0 size in and then determine the size after the pdu
-    // has been writen and write the calculated size
-    uint8_t *pWritePackedMsgPduSize = *ppWritePackedMsg;
-    pdu->pdu_size = 0;
-
-    if(push8(pdu->pdu_size, ppWritePackedMsg, end) == 0)
-      return 0;
-
-    switch(pdu->pdu_type) {
-      case NFAPI_LBT_DL_RSP_PDSCH_PDU_TYPE: {
-        if( pack_tlv(NFAPI_LBT_PDSCH_RSP_PDU_REL13_TAG, &pdu->lbt_pdsch_rsp_pdu.lbt_pdsch_rsp_pdu_rel13, ppWritePackedMsg, end, pack_lbt_pdsch_rsp_pdu_rel13_value) == 0)
-          return 0;
-      }
-      break;
-
-      case NFAPI_LBT_DL_RSP_DRS_PDU_TYPE: {
-        if( pack_tlv(NFAPI_LBT_DRS_RSP_PDU_REL13_TAG, &pdu->lbt_drs_rsp_pdu.lbt_drs_rsp_pdu_rel13, ppWritePackedMsg, end, pack_lbt_drs_rsp_pdu_rel13_value) == 0)
-          return 0;
-      }
-      break;
-
-      default: {
-        NFAPI_TRACE(NFAPI_TRACE_ERROR, "LBT_DL.indication body invalid pdu type %d \n", pdu->pdu_type );
-      }
-      break;
-    };
-
-    // add 1 for the pdu_type. The delta will include the pdu_size
-    pdu->pdu_size = 1 + (*ppWritePackedMsg - pWritePackedMsgPduSize);
-
-    push8(pdu->pdu_size, &pWritePackedMsgPduSize, end);
-  }
-
-  return 1;
-}
-
-static uint8_t pack_lbt_dl_indication(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p7_codec_config_t *config) {
-  nfapi_lbt_dl_indication_t *pNfapiMsg = (nfapi_lbt_dl_indication_t *)msg;
-  return ( push16(pNfapiMsg->sfn_sf, ppWritePackedMsg, end) &&
-           pack_tlv(NFAPI_LBT_DL_INDICATION_BODY_TAG, &pNfapiMsg->lbt_dl_indication_body, ppWritePackedMsg, end, &pack_lbt_dl_config_indication_value) &&
-           pack_p7_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config));
-}
-
-static uint8_t pack_nb_harq_indication_fdd_rel13_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
-  nfapi_nb_harq_indication_fdd_rel13_t *nb_harq_indication_fdd_rel13 = (nfapi_nb_harq_indication_fdd_rel13_t *)tlv;
-  return ( push8(nb_harq_indication_fdd_rel13->harq_tb1, ppWritePackedMsg, end) );
-}
-
-static uint8_t pack_nb_harq_indication_body_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
-  nfapi_nb_harq_indication_body_t *value = (nfapi_nb_harq_indication_body_t *)tlv;
-
-  if( push16(value->number_of_harqs, ppWritePackedMsg, end) == 0)
-    return 0;
-
-  uint16_t i = 0;
-  uint16_t total_number_of_harqs = value->number_of_harqs;
-
-  for(; i < total_number_of_harqs; ++i) {
-    nfapi_nb_harq_indication_pdu_t *pdu = &(value->nb_harq_pdu_list[i]);
-    uint8_t *instance_length_p = *ppWritePackedMsg;
-
-    if(!push16(pdu->instance_length, ppWritePackedMsg, end))
-      return 0;
-
-    if(!(pack_tlv(NFAPI_RX_UE_INFORMATION_TAG, &pdu->rx_ue_information, ppWritePackedMsg, end, pack_rx_ue_information_value) &&
-         pack_tlv(NFAPI_NB_HARQ_INDICATION_FDD_REL13_TAG, &pdu->nb_harq_indication_fdd_rel13, ppWritePackedMsg, end, pack_nb_harq_indication_fdd_rel13_value) &&
-         pack_tlv(NFAPI_UL_CQI_INFORMATION_TAG, &pdu->ul_cqi_information, ppWritePackedMsg, end, pack_ul_cqi_information_value)))
-      return 0;
-
-    // calculate the instance length subtracting the size of the instance
-    // length feild
-    uint16_t instance_length = *ppWritePackedMsg - instance_length_p - 2;
-    push16(instance_length, &instance_length_p, end);
-  }
-
-  return 1;
-}
-
-
-static uint8_t pack_nb_harq_indication(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p7_codec_config_t *config) {
-  nfapi_nb_harq_indication_t *pNfapiMsg = (nfapi_nb_harq_indication_t *)msg;
-  return ( push16(pNfapiMsg->sfn_sf, ppWritePackedMsg, end) &&
-           pack_tlv(NFAPI_NB_HARQ_INDICATION_BODY_TAG, &pNfapiMsg->nb_harq_indication_body, ppWritePackedMsg, end, &pack_nb_harq_indication_body_value) &&
-           pack_p7_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config));
-}
-
-static uint8_t pack_nrach_indication_rel13_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
-  nfapi_nrach_indication_pdu_rel13_t *nrach_indication_fdd_rel13 = (nfapi_nrach_indication_pdu_rel13_t *)tlv;
-  return ( push16(nrach_indication_fdd_rel13->rnti, ppWritePackedMsg, end) &&
-           push8(nrach_indication_fdd_rel13->initial_sc, ppWritePackedMsg, end) &&
-           push16(nrach_indication_fdd_rel13->timing_advance, ppWritePackedMsg, end) &&
-           push8(nrach_indication_fdd_rel13->nrach_ce_level, ppWritePackedMsg, end));
-}
-
-
-static uint8_t pack_nrach_indication_body_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
-  nfapi_nrach_indication_body_t *value = (nfapi_nrach_indication_body_t *)tlv;
-
-  if( push8(value->number_of_initial_scs_detected, ppWritePackedMsg, end) == 0)
-    return 0;
-
-  uint16_t i = 0;
-  uint16_t total_number_of_initial_scs_detected = value->number_of_initial_scs_detected;
-
-  for(; i < total_number_of_initial_scs_detected; ++i) {
-    nfapi_nrach_indication_pdu_t *pdu = &(value->nrach_pdu_list[i]);
-
-    //uint8_t* instance_length_p = *ppWritePackedMsg;
-    //if(!push16(pdu->instance_length, ppWritePackedMsg, end))
-    //  return 0;
-
-    if(!(pack_tlv(NFAPI_NRACH_INDICATION_REL13_TAG, &pdu->nrach_indication_rel13, ppWritePackedMsg, end, pack_nrach_indication_rel13_value)))
-      return 0;
-
-    // calculate the instance length subtracting the size of the instance
-    // length feild
-    //uint16_t instance_length = *ppWritePackedMsg - instance_length_p - 2;
-    //push16(instance_length, &instance_length_p, end);
-  }
-
-  return 1;
-}
-
-static uint8_t pack_nrach_indication(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p7_codec_config_t *config) {
-  nfapi_nrach_indication_t *pNfapiMsg = (nfapi_nrach_indication_t *)msg;
-  return ( push16(pNfapiMsg->sfn_sf, ppWritePackedMsg, end) &&
-           pack_tlv(NFAPI_NRACH_INDICATION_BODY_TAG, &pNfapiMsg->nrach_indication_body, ppWritePackedMsg, end, &pack_nrach_indication_body_value) &&
-           pack_p7_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config));
-}
-
-static uint8_t pack_nr_dl_node_sync(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p7_codec_config_t *config) {
-  nfapi_nr_dl_node_sync_t *pNfapiMsg = (nfapi_nr_dl_node_sync_t *)msg;
-  return ( push32(pNfapiMsg->t1, ppWritePackedMsg, end) &&
-           pushs32(pNfapiMsg->delta_sfn_slot, ppWritePackedMsg, end) &&
-           pack_p7_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config));
-}
-
-static uint8_t pack_dl_node_sync(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p7_codec_config_t *config) {
-  nfapi_dl_node_sync_t *pNfapiMsg = (nfapi_dl_node_sync_t *)msg;
-  return ( push32(pNfapiMsg->t1, ppWritePackedMsg, end) &&
-           pushs32(pNfapiMsg->delta_sfn_sf, ppWritePackedMsg, end) &&
-           pack_p7_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config));
-}
-
-static uint8_t pack_nr_ul_node_sync(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p7_codec_config_t *config) {
-  nfapi_nr_ul_node_sync_t *pNfapiMsg = (nfapi_nr_ul_node_sync_t *)msg;
-  return (push32(pNfapiMsg->t1, ppWritePackedMsg, end) &&
-          push32(pNfapiMsg->t2, ppWritePackedMsg, end) &&
-          push32(pNfapiMsg->t3, ppWritePackedMsg, end) &&
-          pack_p7_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config));
-}
-
-static uint8_t pack_ul_node_sync(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p7_codec_config_t *config) {
-  nfapi_ul_node_sync_t *pNfapiMsg = (nfapi_ul_node_sync_t *)msg;
-  return (push32(pNfapiMsg->t1, ppWritePackedMsg, end) &&
-          push32(pNfapiMsg->t2, ppWritePackedMsg, end) &&
-          push32(pNfapiMsg->t3, ppWritePackedMsg, end) &&
-          pack_p7_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config));
-}
-
-static uint8_t pack_timing_info(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p7_codec_config_t *config) {
-  nfapi_timing_info_t *pNfapiMsg = (nfapi_timing_info_t *)msg;
-  return (push32(pNfapiMsg->last_sfn_sf, ppWritePackedMsg, end) &&
-          push32(pNfapiMsg->time_since_last_timing_info, ppWritePackedMsg, end) &&
-          push32(pNfapiMsg->dl_config_jitter, ppWritePackedMsg, end) &&
-          push32(pNfapiMsg->tx_request_jitter, ppWritePackedMsg, end) &&
-          push32(pNfapiMsg->ul_config_jitter, ppWritePackedMsg, end) &&
-          push32(pNfapiMsg->hi_dci0_jitter, ppWritePackedMsg, end) &&
-          pushs32(pNfapiMsg->dl_config_latest_delay, ppWritePackedMsg, end) &&
-          pushs32(pNfapiMsg->tx_request_latest_delay, ppWritePackedMsg, end) &&
-          pushs32(pNfapiMsg->ul_config_latest_delay, ppWritePackedMsg, end) &&
-          pushs32(pNfapiMsg->hi_dci0_latest_delay, ppWritePackedMsg, end) &&
-          pushs32(pNfapiMsg->dl_config_earliest_arrival, ppWritePackedMsg, end) &&
-          pushs32(pNfapiMsg->tx_request_earliest_arrival, ppWritePackedMsg, end) &&
-          pushs32(pNfapiMsg->ul_config_earliest_arrival, ppWritePackedMsg, end) &&
-          pushs32(pNfapiMsg->hi_dci0_earliest_arrival, ppWritePackedMsg, end) &&
-          pack_p7_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config));
-}
-
-static uint8_t pack_nr_timing_info(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p7_codec_config_t *config) {
-  nfapi_nr_timing_info_t *pNfapiMsg = (nfapi_nr_timing_info_t *)msg;
-  return (push32(pNfapiMsg->last_sfn, ppWritePackedMsg, end) &&
-          push32(pNfapiMsg->last_slot, ppWritePackedMsg, end) &&
-          push32(pNfapiMsg->time_since_last_timing_info, ppWritePackedMsg, end) &&
-          push32(pNfapiMsg->dl_tti_jitter, ppWritePackedMsg, end) &&
-          push32(pNfapiMsg->tx_data_request_jitter, ppWritePackedMsg, end) &&
-          push32(pNfapiMsg->ul_tti_jitter, ppWritePackedMsg, end) &&
-          push32(pNfapiMsg->ul_dci_jitter, ppWritePackedMsg, end) &&
-          pushs32(pNfapiMsg->dl_tti_latest_delay, ppWritePackedMsg, end) &&
-          pushs32(pNfapiMsg->tx_data_request_latest_delay, ppWritePackedMsg, end) &&
-          pushs32(pNfapiMsg->ul_tti_latest_delay, ppWritePackedMsg, end) &&
-          pushs32(pNfapiMsg->ul_dci_latest_delay, ppWritePackedMsg, end) &&
-          pushs32(pNfapiMsg->dl_tti_earliest_arrival, ppWritePackedMsg, end) &&
-          pushs32(pNfapiMsg->tx_data_request_earliest_arrival, ppWritePackedMsg, end) &&
-          pushs32(pNfapiMsg->ul_tti_earliest_arrival, ppWritePackedMsg, end) &&
-          pushs32(pNfapiMsg->ul_dci_earliest_arrival, ppWritePackedMsg, end) &&
-          pack_p7_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config));
-}
-
-//NR UPLINK indication function packing
-
-//SLOT INDICATION
-
-static uint8_t pack_nr_slot_indication(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p7_codec_config_t* config)
-{
-	nfapi_nr_slot_indication_scf_t *pNfapiMsg = (nfapi_nr_slot_indication_scf_t*)msg;
-
-	if (!(push16((uint16_t)pNfapiMsg->sfn , ppWritePackedMsg, end) &&
-		push16((uint16_t)pNfapiMsg->slot , ppWritePackedMsg, end)
-		))
-			return 0;
-
-return 1;
-}
-
-//RX DATA INDICATION 
-
-static uint8_t pack_nr_rx_data_indication_body(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
-{
-	nfapi_nr_rx_data_pdu_t* value = (nfapi_nr_rx_data_pdu_t*)tlv;
-
-	if(!(push32(value->handle, ppWritePackedMsg, end) &&
-	 	 push16(value->rnti, ppWritePackedMsg, end) &&
-		 push8(value->harq_id, ppWritePackedMsg, end) &&
-		 push16(value->pdu_length, ppWritePackedMsg, end) &&
-		 push8(value->ul_cqi, ppWritePackedMsg, end) &&
-		 push16(value->timing_advance, ppWritePackedMsg, end) && 
-		 push16(value->rssi, ppWritePackedMsg, end) 
-		 ))
-		  return 0;
-
-	return 1;
-}
-
-
-static uint8_t pack_nr_rx_data_indication(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p7_codec_config_t* config)
-{
-	nfapi_nr_rx_data_indication_t *pNfapiMsg = (nfapi_nr_rx_data_indication_t*)msg;
-
-	if (!(push16(pNfapiMsg->sfn , ppWritePackedMsg, end) &&
-		push16(pNfapiMsg->slot , ppWritePackedMsg, end) &&
-		push16(pNfapiMsg->number_of_pdus, ppWritePackedMsg, end)
-		))
-			return 0;
-
-	for(int i=0; i<pNfapiMsg->number_of_pdus;i++)	
-	{
-		if(!pack_nr_rx_data_indication_body(pNfapiMsg->pdu_list,ppWritePackedMsg,end))
-		return 0;
-	}
-
-return 1;
-}
-
-//NR CRC INDICATION
-
-static uint8_t pack_nr_crc_indication_body(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
-{
-	nfapi_nr_crc_t* value = (nfapi_nr_crc_t*)tlv;
-
-	if(!(push32(value->handle, ppWritePackedMsg, end) &&
-	 	 push16(value->rnti, ppWritePackedMsg, end) &&
-		 push8(value->harq_id, ppWritePackedMsg, end) &&
-		 push8(value->tb_crc_status, ppWritePackedMsg, end) &&
-		 push16(value->num_cb, ppWritePackedMsg, end) &&
-		 //pusharray8(value->cb_crc_status, (int)(value->num_cb / 8) + 1, (int)(value->num_cb / 8) + 1, ppWritePackedMsg, end) && //length is ceil(NumCb/8)
-		 push8(value->ul_cqi, ppWritePackedMsg, end) && 
-		 push16(value->timing_advance, ppWritePackedMsg, end) &&
-		 push16(value->rssi, ppWritePackedMsg, end)
-		 ))
-		  return 0;
-
-	return 1;
-}
-
-static uint8_t pack_nr_crc_indication(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p7_codec_config_t* config)
-{
-	nfapi_nr_crc_indication_t *pNfapiMsg = (nfapi_nr_crc_indication_t*)msg;
-
-	if (!(push16(pNfapiMsg->sfn , ppWritePackedMsg, end) &&
-		push16(pNfapiMsg->slot , ppWritePackedMsg, end) &&
-		push16(pNfapiMsg->number_crcs, ppWritePackedMsg, end)
-		))
-			return 0;
-
-	for(int i=0; i<pNfapiMsg->number_crcs;i++)	
-	{
-		if(!pack_nr_crc_indication_body(pNfapiMsg->crc_list,ppWritePackedMsg,end))
-		return 0;
-	}
-
-return 1;
-}
-
-//SRS INDICATION
-
-static uint8_t pack_nr_srs_indication_body(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
-{
-	nfapi_nr_srs_indication_pdu_t* value = (nfapi_nr_srs_indication_pdu_t*)tlv;
-
-	if(!(push32(value->handle, ppWritePackedMsg, end) &&
-	 	 push16(value->rnti, ppWritePackedMsg, end) &&
-		 push16(value->timing_advance, ppWritePackedMsg, end) &&
-		 push8(value->num_symbols, ppWritePackedMsg, end) &&
-		 push8(value->wide_band_snr, ppWritePackedMsg, end) &&
-		 push8(value->num_reported_symbols, ppWritePackedMsg, end) && 
-		 push8(value->reported_symbol_list->num_rbs, ppWritePackedMsg, end)
-		 ))
-		  return 0;
-	for(int i = 0; i < value->reported_symbol_list->num_rbs; i++)
-	{
-		if(!(push8(value->reported_symbol_list->rb_list->rb_snr, ppWritePackedMsg, end)
-			))
-			return 0;
-	}
-	return 1;
-}
-
-static uint8_t pack_nr_srs_indication(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p7_codec_config_t* config)
-{
-	nfapi_nr_srs_indication_t *pNfapiMsg = (nfapi_nr_srs_indication_t*)msg;
-
-	if (!(push16(pNfapiMsg->sfn , ppWritePackedMsg, end) &&
-		push16(pNfapiMsg->slot , ppWritePackedMsg, end) &&
-		push16(pNfapiMsg->number_of_pdus, ppWritePackedMsg, end)
-		))
-			return 0;
-
-	for(int i=0; i<pNfapiMsg->number_of_pdus;i++)	
-	{
-		if(!pack_nr_srs_indication_body(&(pNfapiMsg->pdu_list[i]),ppWritePackedMsg,end))
-		return 0;
-	}
-
-return 1;
-}
-
-//RACH INDICATION
-
-static uint8_t pack_nr_rach_indication_body(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
-{
-	nfapi_nr_prach_indication_pdu_t* value = (nfapi_nr_prach_indication_pdu_t*)tlv;
-
-	if(!(push16(value->phy_cell_id, ppWritePackedMsg, end) &&
-	 	 push8(value->symbol_index, ppWritePackedMsg, end) &&
-		 push8(value->slot_index, ppWritePackedMsg, end) &&
-		 push8(value->freq_index, ppWritePackedMsg, end) &&
-		 push8(value->avg_rssi, ppWritePackedMsg, end) &&
-		 push8(value->avg_snr, ppWritePackedMsg, end) && 
-		 push8(value->num_preamble, ppWritePackedMsg, end)
-		 ))
-		  return 0;
-	for(int i = 0; i < value->num_preamble; i++)
-	{
-		if(!(push8(value->preamble_list->preamble_index, ppWritePackedMsg, end) &&
-			push16(value->preamble_list->timing_advance, ppWritePackedMsg, end) &&
-			push32(value->preamble_list->preamble_pwr, ppWritePackedMsg, end)
-			))
-			return 0;
-	}
-	return 1;
-}
-
-static uint8_t pack_nr_rach_indication(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p7_codec_config_t* config)
-{
-	nfapi_nr_rach_indication_t *pNfapiMsg = (nfapi_nr_rach_indication_t*)msg;
-
-	if (!(push16(pNfapiMsg->sfn , ppWritePackedMsg, end) &&
-		push16(pNfapiMsg->slot , ppWritePackedMsg, end) &&
-		push8(pNfapiMsg->number_of_pdus, ppWritePackedMsg, end)
-		))
-			return 0;
-
-	for(int i=0; i<pNfapiMsg->number_of_pdus;i++)	
-	{
-		if(!pack_nr_rach_indication_body(&(pNfapiMsg->pdu_list[i]),ppWritePackedMsg,end))
-		return 0;
-	}
-
-return 1;
-}
-
-
-//UCI INDICATION
-
-static uint8_t pack_nr_uci_pucch_0_1(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
-	nfapi_nr_uci_pucch_pdu_format_0_1_t* value = (nfapi_nr_uci_pucch_pdu_format_0_1_t*)tlv;
-
-	if(!(push8(value->pduBitmap, ppWritePackedMsg, end) &&
-	 	 push32(value->handle, ppWritePackedMsg, end) &&
-		 push16(value->rnti, ppWritePackedMsg, end) &&
-		 push8(value->pucch_format, ppWritePackedMsg, end) &&
-		 push8(value->ul_cqi, ppWritePackedMsg, end) &&
-		 push16(value->timing_advance, ppWritePackedMsg, end) && 
-		 push16(value->rssi, ppWritePackedMsg, end)
-		 ))
-		  return 0;
-	if (value->pduBitmap & 0x01) { //SR
-		if(!(push8(value->sr->sr_indication, ppWritePackedMsg, end) &&
-	 	 push8(value->sr->sr_confidence_level, ppWritePackedMsg, end) 
-		 ))
-		  return 0;
-	}
-
-	if (((value->pduBitmap >> 1) & 0x01)) { //HARQ
-		if(!(push8(value->harq->num_harq, ppWritePackedMsg, end) &&
-	 	 push8(value->harq->harq_confidence_level, ppWritePackedMsg, end) 
-		 ))
-			return 0;
-
-		for(int i=0; i<value->harq->num_harq;i++)	
-		{
-			if(!(push8(value->harq->harq_list[i].harq_value, ppWritePackedMsg, end)
-			))
-			return 0;
-		}
-	}
-
-	return 1;
-}
-
-static uint8_t pack_nr_uci_pucch_2_3_4(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
-	nfapi_nr_uci_pucch_pdu_format_2_3_4_t* value = (nfapi_nr_uci_pucch_pdu_format_2_3_4_t*) tlv;
-
-	if(!(push8(value->pduBitmap, ppWritePackedMsg, end) &&
-	 	 push32(value->handle, ppWritePackedMsg, end) &&
-		 push16(value->rnti, ppWritePackedMsg, end) &&
-		 push8(value->pucch_format, ppWritePackedMsg, end) &&
-		 push8(value->ul_cqi, ppWritePackedMsg, end) &&
-		 push16(value->timing_advance, ppWritePackedMsg, end) && 
-		 push16(value->rssi, ppWritePackedMsg, end)
-		 ))
-		  return 0;
-
-	if (value->pduBitmap & 0x01) { //SR
-		if(!(push8(value->sr.sr_bit_len, ppWritePackedMsg, end) &&
-	 	 pusharray8(value->sr.sr_payload, (int)(value->sr.sr_bit_len / 8) + 1, (int)(value->sr.sr_bit_len / 8) + 1, ppWritePackedMsg, end) 
-		 ))
-		  return 0;
-	}
-
-	if (((value->pduBitmap >> 1) & 0x01)) { //HARQ
-		if(!(push8(value->harq.harq_crc, ppWritePackedMsg, end) &&
-			push8(value->harq.harq_bit_len, ppWritePackedMsg, end) &&
-	 	 	pusharray8(value->harq.harq_payload, (int)(value->harq.harq_bit_len / 8) + 1, (int)(value->harq.harq_bit_len / 8) + 1, ppWritePackedMsg, end) 
-			))
-			return 0;
-	}
-
-	if (((value->pduBitmap >> 2) & 0x01)) { //CSI-1
-		if(!(push8(value->csi_part1.csi_part1_crc, ppWritePackedMsg, end) &&
-			push8(value->csi_part1.csi_part1_bit_len, ppWritePackedMsg, end) &&
-	 	 	pusharray8(value->csi_part1.csi_part1_payload, (int)(value->csi_part1.csi_part1_bit_len / 8) + 1, (int)(value->csi_part1.csi_part1_bit_len / 8) + 1, ppWritePackedMsg, end) 
-			))
-			return 0;
-	}
-
-	if (((value->pduBitmap >> 3) & 0x01)) { //CSI-2
-		if(!(push8(value->csi_part2.csi_part2_crc, ppWritePackedMsg, end) &&
-			push8(value->csi_part2.csi_part2_bit_len, ppWritePackedMsg, end) &&
-	 	 	pusharray8(value->csi_part2.csi_part2_payload, (int)(value->csi_part2.csi_part2_bit_len / 8) + 1, (int)(value->csi_part2.csi_part2_bit_len / 8) + 1, ppWritePackedMsg, end) 
-			))
-			return 0;
-	}
-
-	return 1;
-}
-
-static uint8_t pack_nr_uci_indication_body(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
-{
-	nfapi_nr_uci_t* value = (nfapi_nr_uci_t*)tlv;
-
-	if(!(push16(value->pdu_type, ppWritePackedMsg, end) &&
-		push16(value->pdu_size, ppWritePackedMsg, end)
-		))
-		return 0;
-	
-	switch (value->pdu_type) {
-      case NFAPI_NR_UCI_PUSCH_PDU_TYPE:
-        printf("Unhandled NFAPI_NR_UCI_PUSCH_PDU_TYPE \n");
-        break;
-
-      case NFAPI_NR_UCI_FORMAT_0_1_PDU_TYPE: 
-        pack_nr_uci_pucch_0_1(&value->pucch_pdu_format_0_1, ppWritePackedMsg, end);
-        break;
-      
-      case NFAPI_NR_UCI_FORMAT_2_3_4_PDU_TYPE: 
-        pack_nr_uci_pucch_2_3_4(&value->pucch_pdu_format_2_3_4, ppWritePackedMsg, end);
-        break;
-	}
-
-	return 1;
-}
-
-static uint8_t pack_nr_uci_indication(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p7_codec_config_t* config)
-{
-	nfapi_nr_uci_indication_t *pNfapiMsg = (nfapi_nr_uci_indication_t*)msg;
-
-	if (!(push16(pNfapiMsg->sfn , ppWritePackedMsg, end) &&
-		push16(pNfapiMsg->slot , ppWritePackedMsg, end) &&
-		push16(pNfapiMsg->num_ucis, ppWritePackedMsg, end)
-		))
-			return 0;
-
-	for(int i=0; i<pNfapiMsg->num_ucis;i++)	
-	{
-		if(!pack_nr_uci_indication_body(pNfapiMsg->uci_list,ppWritePackedMsg,end))
-		return 0;
-	}
-
-return 1;
-}
-
-
-// Main pack function - public
-
-int nfapi_nr_p7_message_pack(void *pMessageBuf, void *pPackedBuf, uint32_t packedBufLen, nfapi_p7_codec_config_t* config)
-{
-	nfapi_p7_message_header_t *pMessageHeader = pMessageBuf;
-	uint8_t *pWritePackedMessage = pPackedBuf;
-	uint8_t *pPackedLengthField = &pWritePackedMessage[4];
-	uint8_t *end = pPackedBuf + packedBufLen;
-
-	if (pMessageBuf == NULL || pPackedBuf == NULL)
-	{
-		NFAPI_TRACE(NFAPI_TRACE_ERROR, "P7 Pack supplied pointers are null\n");
-		return -1;
-	}
-	/*
-	printf("\n P7 MESSAGE SENT: \n");
-	for(int i=0; i< packedBufLen; i++){
-		printf("%d", *(uint8_t *)(pMessageBuf + i));
-	}
-	printf("\n");
-	*/
-	// process the header
-	if(!(push16(pMessageHeader->phy_id, &pWritePackedMessage, end) &&
-		 push16(pMessageHeader->message_id, &pWritePackedMessage, end) &&
-		 push16(0/*pMessageHeader->message_length*/, &pWritePackedMessage, end) &&
-		 push16(pMessageHeader->m_segment_sequence, &pWritePackedMessage, end) &&
-		 push32(0/*pMessageHeader->checksum*/, &pWritePackedMessage, end) &&
-		 push32(pMessageHeader->transmit_timestamp, &pWritePackedMessage, end)))
-	{
-		NFAPI_TRACE(NFAPI_TRACE_ERROR, "P7 Pack header failed\n");
-		return -1;
-	}
-
-        if (pMessageHeader->message_id != NFAPI_TIMING_INFO)
-        {
-          //NFAPI_TRACE(NFAPI_TRACE_INFO, "%s() message_id:0x%04x phy_id:%u m_segment_sequence:%u timestamp:%u\n", __FUNCTION__, pMessageHeader->message_id, pMessageHeader->phy_id, pMessageHeader->m_segment_sequence, pMessageHeader->transmit_timestamp);
-        }
-	// look for the specific message
-	uint8_t result = 0;
-	switch (pMessageHeader->message_id)
-	{	
-		case NFAPI_NR_PHY_MSG_TYPE_DL_TTI_REQUEST:
-			result = pack_dl_tti_request(pMessageHeader, &pWritePackedMessage, end, config);
-			break;
-
-		case NFAPI_NR_PHY_MSG_TYPE_UL_TTI_REQUEST:
-			result = pack_ul_tti_request(pMessageHeader, &pWritePackedMessage, end, config);
-			break;
-
-		case NFAPI_NR_PHY_MSG_TYPE_TX_DATA_REQUEST:
-			result = pack_tx_data_request(pMessageHeader, &pWritePackedMessage, end, config);
-			break;
-
-		case NFAPI_NR_PHY_MSG_TYPE_UL_DCI_REQUEST:
-			result = pack_ul_dci_request(pMessageHeader, &pWritePackedMessage, end, config);
-			break;
-		
-		case NFAPI_UE_RELEASE_REQUEST:
-			result =pack_ue_release_request(pMessageHeader, &pWritePackedMessage, end, config);
-			break;
-
-		case NFAPI_UE_RELEASE_RESPONSE:
-			result =pack_ue_release_response(pMessageHeader, &pWritePackedMessage, end, config);
-			break;
-
-		case NFAPI_NR_PHY_MSG_TYPE_SLOT_INDICATION:
-			result = pack_nr_slot_indication(pMessageHeader, &pWritePackedMessage, end, config);
-
-		case NFAPI_NR_PHY_MSG_TYPE_RX_DATA_INDICATION:
-			result = pack_nr_rx_data_indication(pMessageHeader, &pWritePackedMessage, end, config);
-			break;
-
-		case NFAPI_NR_PHY_MSG_TYPE_CRC_INDICATION:
-			result = pack_nr_crc_indication(pMessageHeader, &pWritePackedMessage, end, config);
-			break;
-
-		case NFAPI_NR_PHY_MSG_TYPE_UCI_INDICATION:
-			result = pack_nr_uci_indication(pMessageHeader, &pWritePackedMessage, end, config);
-			break;
-
-		case NFAPI_NR_PHY_MSG_TYPE_SRS_INDICATION:
-			result = pack_nr_srs_indication(pMessageHeader, &pWritePackedMessage, end, config);
-			break;
-
-		case NFAPI_NR_PHY_MSG_TYPE_RACH_INDICATION:
-			result = pack_nr_rach_indication(pMessageHeader, &pWritePackedMessage, end, config);
-			break;
-
-		case NFAPI_NR_PHY_MSG_TYPE_DL_NODE_SYNC:
-			result = pack_nr_dl_node_sync(pMessageHeader, &pWritePackedMessage, end, config);
-			break;
-
-		case NFAPI_NR_PHY_MSG_TYPE_UL_NODE_SYNC:
-			result = pack_nr_ul_node_sync(pMessageHeader, &pWritePackedMessage, end, config);
-			break;
-
-		case NFAPI_TIMING_INFO:
-			result = pack_nr_timing_info(pMessageHeader, &pWritePackedMessage, end, config);
-			break;
-
-		default:
-			{
-				if(pMessageHeader->message_id >= NFAPI_VENDOR_EXT_MSG_MIN &&
-				   pMessageHeader->message_id <= NFAPI_VENDOR_EXT_MSG_MAX)
-				{
-					if(config && config->pack_p7_vendor_extension)
-					{
-						result = (config->pack_p7_vendor_extension)(pMessageHeader, &pWritePackedMessage, end, config);
-					}
-					else
-					{
-						NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s VE NFAPI message ID %d. No ve ecoder provided\n", __FUNCTION__, pMessageHeader->message_id);
-					}
-				}
-				else
-				{
-					NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s NFAPI Unknown message ID %d\n", __FUNCTION__, pMessageHeader->message_id);
-				}
-			}
-			break;
-	}
-
-	if(result == 0)
-	{
-		NFAPI_TRACE(NFAPI_TRACE_ERROR, "P7 Pack failed to pack message\n");
-		return -1;
-	}
-
-	// check for a valid message length
-	uintptr_t msgHead = (uintptr_t)pPackedBuf;
-	uintptr_t msgEnd = (uintptr_t)pWritePackedMessage;
-	uint32_t packedMsgLen = msgEnd - msgHead;
-	uint16_t packedMsgLen16;
-	if (packedMsgLen > 0xFFFF || packedMsgLen > packedBufLen)
-	{
-		NFAPI_TRACE(NFAPI_TRACE_ERROR, "Packed message length error %d, buffer supplied %d\n", packedMsgLen, packedBufLen);
-		return -1;
-	}
-	else
-	{
-		packedMsgLen16 = (uint16_t)packedMsgLen;
-	}
-
-	// Update the message length in the header
-	pMessageHeader->message_length = packedMsgLen16;
-
-	if(!push16(packedMsgLen16, &pPackedLengthField, end))
-		return -1;
-
-	if(1)
-	{
-		//quick test
-		if(pMessageHeader->message_length != packedMsgLen)
-		{
-			NFAPI_TRACE(NFAPI_TRACE_ERROR, "nfapi packedMsgLen(%d) != message_length(%d) id %d\n", packedMsgLen, pMessageHeader->message_length, pMessageHeader->message_id);
-		}
-	}
-
-	return (packedMsgLen);
-}
-
-int nfapi_p7_message_pack(void *pMessageBuf, void *pPackedBuf, uint32_t packedBufLen, nfapi_p7_codec_config_t *config) {
-  nfapi_p7_message_header_t *pMessageHeader = pMessageBuf;
-  uint8_t *pWritePackedMessage = pPackedBuf;
-  uint8_t *pPackedLengthField = &pWritePackedMessage[4];
-  uint8_t *end = pPackedBuf + packedBufLen;
-
-  if (pMessageBuf == NULL || pPackedBuf == NULL) {
-    NFAPI_TRACE(NFAPI_TRACE_ERROR, "P7 Pack supplied pointers are null\n");
-    return -1;
-  }
-
-  /*
-  printf("\n P7 MESSAGE SENT: \n");
-  for(int i=0; i< packedBufLen; i++){
-    printf("%d", *(uint8_t *)(pMessageBuf + i));
-  }
-  printf("\n");
-  */
-  // process the header
-  if(!(push16(pMessageHeader->phy_id, &pWritePackedMessage, end) &&
-       push16(pMessageHeader->message_id, &pWritePackedMessage, end) &&
-       push16(0/*pMessageHeader->message_length*/, &pWritePackedMessage, end) &&
-       push16(pMessageHeader->m_segment_sequence, &pWritePackedMessage, end) &&
-       push32(0/*pMessageHeader->checksum*/, &pWritePackedMessage, end) &&
-       push32(pMessageHeader->transmit_timestamp, &pWritePackedMessage, end))) {
-    NFAPI_TRACE(NFAPI_TRACE_ERROR, "P7 Pack header failed\n");
-    return -1;
-  }
-
-  if (pMessageHeader->message_id != NFAPI_TIMING_INFO) {
-    //NFAPI_TRACE(NFAPI_TRACE_INFO, "%s() message_id:0x%04x phy_id:%u m_segment_sequence:%u timestamp:%u\n", __FUNCTION__, pMessageHeader->message_id, pMessageHeader->phy_id, pMessageHeader->m_segment_sequence, pMessageHeader->transmit_timestamp);
-  }
-
-  // look for the specific message
-  uint8_t result = 0;
-
-  switch (pMessageHeader->message_id) {
-    case NFAPI_DL_CONFIG_REQUEST:
-      //NFAPI_TRACE(NFAPI_TRACE_INFO, "%s() NFAPI_DL_CONFIG_REQUEST\n", __FUNCTION__);
-      result = pack_dl_config_request(pMessageHeader, &pWritePackedMessage, end, config);
-      break;
-
-    case NFAPI_UL_CONFIG_REQUEST:
-      result = pack_ul_config_request(pMessageHeader, &pWritePackedMessage, end, config);
-      break;
-
-    case NFAPI_TX_REQUEST:
-      //NFAPI_TRACE(NFAPI_TRACE_INFO, "%s() NFAPI_TX_REQUEST\n", __FUNCTION__);
-      result = pack_tx_request(pMessageHeader, &pWritePackedMessage, end, config);
-      break;
-
-    case NFAPI_HI_DCI0_REQUEST:
-      result = pack_hi_dci0_request(pMessageHeader, &pWritePackedMessage, end, config);
-      break;
-
-    case NFAPI_UE_RELEASE_REQUEST:
-      result =pack_ue_release_request(pMessageHeader, &pWritePackedMessage, end, config);
-      break;
-
-    case NFAPI_UE_RELEASE_RESPONSE:
-      result =pack_ue_release_response(pMessageHeader, &pWritePackedMessage, end, config);
-      break;
-
-    case NFAPI_HARQ_INDICATION:
-      result = pack_harq_indication(pMessageHeader, &pWritePackedMessage, end, config);
-      break;
-
-    case NFAPI_CRC_INDICATION:
-      result = pack_crc_indication(pMessageHeader, &pWritePackedMessage, end, config);
-      break;
-
-    case NFAPI_RX_ULSCH_INDICATION:
-      //printf("RX ULSCH\n");
-      result = pack_rx_ulsch_indication(pMessageHeader, &pWritePackedMessage, end, config);
-      break;
-
-    case NFAPI_RACH_INDICATION:
-      result = pack_rach_indication(pMessageHeader, &pWritePackedMessage, end, config);
-      break;
-
-    case NFAPI_SRS_INDICATION:
-      result = pack_srs_indication(pMessageHeader, &pWritePackedMessage, end, config);
-      break;
-
-    case NFAPI_RX_SR_INDICATION:
-      result = pack_sr_indication(pMessageHeader, &pWritePackedMessage, end, config);
-      break;
-
-    case NFAPI_RX_CQI_INDICATION:
-      result = pack_cqi_indication(pMessageHeader, &pWritePackedMessage, end, config);
-      break;
-
-    case NFAPI_LBT_DL_CONFIG_REQUEST:
-      result = pack_lbt_dl_config_request(pMessageHeader, &pWritePackedMessage, end, config);
-      break;
-
-    case NFAPI_LBT_DL_INDICATION:
-      result = pack_lbt_dl_indication(pMessageHeader, &pWritePackedMessage, end, config);
-      break;
-
-    case NFAPI_NB_HARQ_INDICATION:
-      result = pack_nb_harq_indication(pMessageHeader, &pWritePackedMessage, end, config);
-      break;
-
-    case NFAPI_NRACH_INDICATION:
-      result = pack_nrach_indication(pMessageHeader, &pWritePackedMessage, end, config);
-      break;
-
-    case NFAPI_DL_NODE_SYNC:
-      result = pack_dl_node_sync(pMessageHeader, &pWritePackedMessage, end, config);
-      break;
-
-    case NFAPI_UL_NODE_SYNC:
-      result = pack_ul_node_sync(pMessageHeader, &pWritePackedMessage, end, config);
-      break;
-
-    case NFAPI_TIMING_INFO:
-      result = pack_timing_info(pMessageHeader, &pWritePackedMessage, end, config);
-      break;
-
-    default: {
-      if(pMessageHeader->message_id >= NFAPI_VENDOR_EXT_MSG_MIN &&
-          pMessageHeader->message_id <= NFAPI_VENDOR_EXT_MSG_MAX) {
-        if(config && config->pack_p7_vendor_extension) {
-          result = (config->pack_p7_vendor_extension)(pMessageHeader, &pWritePackedMessage, end, config);
-        } else {
-          NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s VE NFAPI message ID %d. No ve ecoder provided\n", __FUNCTION__, pMessageHeader->message_id);
-        }
-      } else {
-        NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s NFAPI Unknown message ID %d\n", __FUNCTION__, pMessageHeader->message_id);
-      }
-    }
-    break;
-  }
-
-  if(result == 0) {
-    NFAPI_TRACE(NFAPI_TRACE_ERROR, "P7 Pack failed to pack message\n");
-    return -1;
-  }
-
-  // check for a valid message length
-  uintptr_t msgHead = (uintptr_t)pPackedBuf;
-  uintptr_t msgEnd = (uintptr_t)pWritePackedMessage;
-  uint32_t packedMsgLen = msgEnd - msgHead;
-  uint16_t packedMsgLen16;
-
-  if (packedMsgLen > 0xFFFF || packedMsgLen > packedBufLen) {
-    NFAPI_TRACE(NFAPI_TRACE_ERROR, "Packed message length error %d, buffer supplied %d\n", packedMsgLen, packedBufLen);
-    return -1;
-  } else {
-    packedMsgLen16 = (uint16_t)packedMsgLen;
-  }
-
-  // Update the message length in the header
-  pMessageHeader->message_length = packedMsgLen16;
-
-  if(!push16(packedMsgLen16, &pPackedLengthField, end))
-    return -1;
-
-  if(1) {
-    //quick test
-    if(pMessageHeader->message_length != packedMsgLen) {
-      NFAPI_TRACE(NFAPI_TRACE_ERROR, "nfapi packedMsgLen(%d) != message_length(%d) id %d\n", packedMsgLen, pMessageHeader->message_length, pMessageHeader->message_id);
-    }
-  }
-
-  return (packedMsgLen);
-}
-
-// Unpack routines
-// NR:
-static uint8_t unpack_dl_tti_csi_rs_pdu_rel15_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
-  nfapi_nr_dl_tti_csi_rs_pdu_rel15_t *value = (nfapi_nr_dl_tti_csi_rs_pdu_rel15_t *)tlv;
-  return(
-          pull16(ppReadPackedMsg, &value->bwp_size, end) &&
-          pull16(ppReadPackedMsg, &value->bwp_start, end) &&
-          pull8(ppReadPackedMsg, &value->subcarrier_spacing, end) &&
-          pull8(ppReadPackedMsg, &value->cyclic_prefix, end) &&
-          pull16(ppReadPackedMsg, &value->start_rb, end) &&
-          pull16(ppReadPackedMsg, &value->nr_of_rbs, end) &&
-          pull8(ppReadPackedMsg, &value->csi_type, end) &&
-          pull8(ppReadPackedMsg, &value->row, end) &&
-          pull16(ppReadPackedMsg, &value->freq_domain, end) &&
-          pull8(ppReadPackedMsg, &value->symb_l0, end) &&
-          pull8(ppReadPackedMsg, &value->symb_l1, end) &&
-          pull8(ppReadPackedMsg, &value->cdm_type, end) &&
-          pull8(ppReadPackedMsg, &value->freq_density, end) &&
-          pull16(ppReadPackedMsg, &value->scramb_id, end) &&
-          pull8(ppReadPackedMsg, &value->power_control_offset, end) &&
-          pull8(ppReadPackedMsg, &value->power_control_offset_ss, end)
-        );
-}
-
-
-static uint8_t unpack_dl_tti_pdcch_pdu_rel15_value(void* tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
-
-	nfapi_nr_dl_tti_pdcch_pdu_rel15_t* value = (nfapi_nr_dl_tti_pdcch_pdu_rel15_t*)tlv;
-	
-	for(uint8_t i = 0; i < MAX_DCI_CORESET; ++i)
-	{
-		if(!(pull16(ppReadPackedMsg, &value->dci_pdu[i].RNTI, end) &&
-		pull16(ppReadPackedMsg, &value->dci_pdu[i].ScramblingId, end) &&
-		pull16(ppReadPackedMsg, &value->dci_pdu[i].ScramblingRNTI, end) &&
-		pull8(ppReadPackedMsg, &value->dci_pdu[i].CceIndex, end) &&
-		pull8(ppReadPackedMsg, &value->dci_pdu[i].AggregationLevel, end) &&
-		pull8(ppReadPackedMsg, &value->dci_pdu[i].beta_PDCCH_1_0, end) &&
-		pull8(ppReadPackedMsg, &value->dci_pdu[i].powerControlOffsetSS, end) &&
-		pull16(ppReadPackedMsg, &value->dci_pdu[i].PayloadSizeBits, end) &&
-		
-		pullarray8(ppReadPackedMsg, value->dci_pdu[i].Payload, value->dci_pdu[i].PayloadSizeBits, value->dci_pdu[i].PayloadSizeBits, end)))
-			
-		return 0;
-	}
-	// TODO: resolve the packaging of array (currently sending a single element)
-	return(
-		pull16(ppReadPackedMsg, &value->BWPSize, end) &&
-		pull16(ppReadPackedMsg, &value->BWPStart, end) &&
-		pull8(ppReadPackedMsg, &value->SubcarrierSpacing, end) &&
-		pull8(ppReadPackedMsg, &value->CyclicPrefix, end) &&
-		pull8(ppReadPackedMsg, &value->StartSymbolIndex, end) &&
-		pull8(ppReadPackedMsg, &value->DurationSymbols, end) &&
-		pullarray8(ppReadPackedMsg, value->FreqDomainResource, 6, 6, end) &&
-		pull8(ppReadPackedMsg, &value->CceRegMappingType, end) &&
-		pull8(ppReadPackedMsg, &value->RegBundleSize, end) &&
-		pull8(ppReadPackedMsg, &value->InterleaverSize, end) &&
-		pull8(ppReadPackedMsg, &value->CoreSetType, end) &&
-		pull16(ppReadPackedMsg, &value->ShiftIndex, end) &&
-		pull8(ppReadPackedMsg, &value->precoderGranularity, end) &&
-		pull16(ppReadPackedMsg, &value->numDlDci, end));
-}
-
-
-
-static uint8_t unpack_dl_tti_pdsch_pdu_rel15_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
-  nfapi_nr_dl_tti_pdsch_pdu_rel15_t *value = (nfapi_nr_dl_tti_pdsch_pdu_rel15_t *)tlv;
-  // TODO: resolve the packaging of array (currently sending a single element)
-  return(
-          pull16(ppReadPackedMsg, &value->pduBitmap, end) &&
-          pull16(ppReadPackedMsg, &value->rnti, end) &&
-          pull16(ppReadPackedMsg, &value->pduIndex, end) &&
-          pull16(ppReadPackedMsg, &value->BWPSize, end) &&
-          pull16(ppReadPackedMsg, &value->BWPStart, end) &&
-          pull8(ppReadPackedMsg, &value->SubcarrierSpacing, end) &&
-          pull8(ppReadPackedMsg, &value->CyclicPrefix, end) &&
-          pull8(ppReadPackedMsg, &value->NrOfCodewords, end) &&
-          pullarray16(ppReadPackedMsg, value->targetCodeRate, 2, 1, end) &&
-          pullarray8(ppReadPackedMsg, value->qamModOrder, 2, 1, end) &&
-          pullarray8(ppReadPackedMsg, value->mcsIndex, 2, 1, end) &&
-          pullarray8(ppReadPackedMsg, value->mcsTable, 2, 1, end) &&
-          pullarray8(ppReadPackedMsg, value->rvIndex, 2, 1, end) &&
-          pullarray32(ppReadPackedMsg, value->TBSize, 2, 1, end) &&
-          pull16(ppReadPackedMsg, &value->dataScramblingId, end) &&
-          pull8(ppReadPackedMsg, &value->nrOfLayers, end) &&
-          pull8(ppReadPackedMsg, &value->transmissionScheme, end) &&
-          pull8(ppReadPackedMsg, &value->refPoint, end) &&
-          pull16(ppReadPackedMsg, &value->dlDmrsSymbPos, end) &&
-          pull8(ppReadPackedMsg, &value->dmrsConfigType, end) &&
-          pull16(ppReadPackedMsg, &value->dlDmrsScramblingId, end) &&
-          pull8(ppReadPackedMsg, &value->SCID, end) &&
-          pull8(ppReadPackedMsg, &value->numDmrsCdmGrpsNoData, end) &&
-          pull16(ppReadPackedMsg, &value->dmrsPorts, end) &&
-          pull8(ppReadPackedMsg, &value->resourceAlloc, end) &&
-          pull16(ppReadPackedMsg, &value->rbStart, end) &&
-          pull16(ppReadPackedMsg, &value->rbSize, end) &&
-          pull8(ppReadPackedMsg, &value->VRBtoPRBMapping, end) &&
-          pull8(ppReadPackedMsg, &value->StartSymbolIndex, end) &&
-          pull8(ppReadPackedMsg, &value->NrOfSymbols, end) &&
-          pull8(ppReadPackedMsg, &value->PTRSPortIndex, end) &&
-          pull8(ppReadPackedMsg, &value->PTRSTimeDensity, end) &&
-          pull8(ppReadPackedMsg, &value->PTRSFreqDensity, end) &&
-          pull8(ppReadPackedMsg, &value->PTRSReOffset, end)
-        );
-}
-
-
-static uint8_t unpack_dl_tti_ssb_pdu_rel15_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
-  nfapi_nr_dl_tti_ssb_pdu_rel15_t *value = (nfapi_nr_dl_tti_ssb_pdu_rel15_t *)tlv;
-  return(
-          pull16(ppReadPackedMsg, &value->PhysCellId, end) &&
-          pull8(ppReadPackedMsg, &value->BetaPss, end) &&
-          pull8(ppReadPackedMsg, &value->SsbBlockIndex, end) &&
-          pull8(ppReadPackedMsg, &value->SsbSubcarrierOffset, end) &&
-          pull16(ppReadPackedMsg, &value->ssbOffsetPointA, end) &&
-          pull8(ppReadPackedMsg, &value->bchPayloadFlag, end) &&
-          pull32(ppReadPackedMsg, &value->bchPayload, end)
-          // TODO: pack precoding_and_beamforming too
-        );
-}
-
-
-// LTE:
-static uint8_t unpack_dl_config_dci_dl_pdu_rel8_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
-  nfapi_dl_config_dci_dl_pdu_rel8_t *dci_dl_pdu_rel8 = (nfapi_dl_config_dci_dl_pdu_rel8_t *)tlv;
-  return (pull8(ppReadPackedMsg, &dci_dl_pdu_rel8->dci_format, end) &&
-          pull8(ppReadPackedMsg, &dci_dl_pdu_rel8->cce_idx, end) &&
-          pull8(ppReadPackedMsg, &dci_dl_pdu_rel8->aggregation_level, end) &&
-          pull16(ppReadPackedMsg, &dci_dl_pdu_rel8->rnti, end) &&
-          pull8(ppReadPackedMsg, &dci_dl_pdu_rel8->resource_allocation_type, end) &&
-          pull8(ppReadPackedMsg, &dci_dl_pdu_rel8->virtual_resource_block_assignment_flag, end) &&
-          pull32(ppReadPackedMsg, &dci_dl_pdu_rel8->resource_block_coding, end) &&
-          pull8(ppReadPackedMsg, &dci_dl_pdu_rel8->mcs_1, end) &&
-          pull8(ppReadPackedMsg, &dci_dl_pdu_rel8->redundancy_version_1, end) &&
-          pull8(ppReadPackedMsg, &dci_dl_pdu_rel8->new_data_indicator_1, end) &&
-          pull8(ppReadPackedMsg, &dci_dl_pdu_rel8->transport_block_to_codeword_swap_flag, end) &&
-          pull8(ppReadPackedMsg, &dci_dl_pdu_rel8->mcs_2, end) &&
-          pull8(ppReadPackedMsg, &dci_dl_pdu_rel8->redundancy_version_2, end) &&
-          pull8(ppReadPackedMsg, &dci_dl_pdu_rel8->new_data_indicator_2, end) &&
-          pull8(ppReadPackedMsg, &dci_dl_pdu_rel8->harq_process, end) &&
-          pull8(ppReadPackedMsg, &dci_dl_pdu_rel8->tpmi, end) &&
-          pull8(ppReadPackedMsg, &dci_dl_pdu_rel8->pmi, end) &&
-          pull8(ppReadPackedMsg, &dci_dl_pdu_rel8->precoding_information, end) &&
-          pull8(ppReadPackedMsg, &dci_dl_pdu_rel8->tpc, end) &&
-          pull8(ppReadPackedMsg, &dci_dl_pdu_rel8->downlink_assignment_index, end) &&
-          pull8(ppReadPackedMsg, &dci_dl_pdu_rel8->ngap, end) &&
-          pull8(ppReadPackedMsg, &dci_dl_pdu_rel8->transport_block_size_index, end) &&
-          pull8(ppReadPackedMsg, &dci_dl_pdu_rel8->downlink_power_offset, end) &&
-          pull8(ppReadPackedMsg, &dci_dl_pdu_rel8->allocate_prach_flag, end) &&
-          pull8(ppReadPackedMsg, &dci_dl_pdu_rel8->preamble_index, end) &&
-          pull8(ppReadPackedMsg, &dci_dl_pdu_rel8->prach_mask_index, end) &&
-          pull8(ppReadPackedMsg, &dci_dl_pdu_rel8->rnti_type, end) &&
-          pull16(ppReadPackedMsg, &dci_dl_pdu_rel8->transmission_power, end));
-}
-
-static uint8_t unpack_dl_config_dci_dl_pdu_rel9_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
-  nfapi_dl_config_dci_dl_pdu_rel9_t *dci_dl_pdu_rel9 = (nfapi_dl_config_dci_dl_pdu_rel9_t *)tlv;
-  return ( pull8(ppReadPackedMsg, &dci_dl_pdu_rel9->mcch_flag, end) &&
-           pull8(ppReadPackedMsg, &dci_dl_pdu_rel9->mcch_change_notification, end) &&
-           pull8(ppReadPackedMsg, &dci_dl_pdu_rel9->scrambling_identity, end));
-}
-
-static uint8_t unpack_dl_config_dci_dl_pdu_rel10_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
-  nfapi_dl_config_dci_dl_pdu_rel10_t *dci_dl_pdu_rel10 = (nfapi_dl_config_dci_dl_pdu_rel10_t *)tlv;
-  return (pull8(ppReadPackedMsg, &dci_dl_pdu_rel10->cross_carrier_scheduling_flag, end) &&
-          pull8(ppReadPackedMsg, &dci_dl_pdu_rel10->carrier_indicator, end) &&
-          pull8(ppReadPackedMsg, &dci_dl_pdu_rel10->srs_flag, end) &&
-          pull8(ppReadPackedMsg, &dci_dl_pdu_rel10->srs_request, end) &&
-          pull8(ppReadPackedMsg, &dci_dl_pdu_rel10->antenna_ports_scrambling_and_layers, end) &&
-          pull8(ppReadPackedMsg, &dci_dl_pdu_rel10->total_dci_length_including_padding, end) &&
-          pull8(ppReadPackedMsg, &dci_dl_pdu_rel10->n_dl_rb, end));
-}
-
-static uint8_t unpack_dl_config_dci_dl_pdu_rel11_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
-  nfapi_dl_config_dci_dl_pdu_rel11_t *dci_dl_pdu_rel11 = (nfapi_dl_config_dci_dl_pdu_rel11_t *)tlv;
-  return (pull8(ppReadPackedMsg, &dci_dl_pdu_rel11->harq_ack_resource_offset, end) &&
-          pull8(ppReadPackedMsg, &dci_dl_pdu_rel11->pdsch_re_mapping_quasi_co_location_indicator, end));
-}
-
-static uint8_t unpack_dl_config_dci_dl_pdu_rel12_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
-  nfapi_dl_config_dci_dl_pdu_rel12_t *dci_dl_pdu_rel12 = (nfapi_dl_config_dci_dl_pdu_rel12_t *)tlv;
-  return (pull8(ppReadPackedMsg, &dci_dl_pdu_rel12->primary_cell_type, end) &&
-          pull8(ppReadPackedMsg, &dci_dl_pdu_rel12->ul_dl_configuration_flag, end) &&
-          pull8(ppReadPackedMsg, &dci_dl_pdu_rel12->number_ul_dl_configurations, end) &&
-          pullarray8(ppReadPackedMsg, dci_dl_pdu_rel12->ul_dl_configuration_indication, NFAPI_MAX_UL_DL_CONFIGURATIONS, dci_dl_pdu_rel12->number_ul_dl_configurations, end));
-}
-
-static uint8_t unpack_tpm_value(uint8_t **ppReadPackedMsg, nfapi_dl_config_dci_dl_tpm_t *value, uint8_t *end) {
-  if(!(pull8(ppReadPackedMsg, &value->num_prb_per_subband, end) &&
-       pull8(ppReadPackedMsg, &value->number_of_subbands, end) &&
-       pull8(ppReadPackedMsg, &value->num_antennas, end)))
-    return 0;
-
-  uint8_t idx = 0;
-
-  for(idx = 0; idx < value->number_of_subbands; ++idx) {
-    nfapi_dl_config_dci_dl_tpm_subband_info_t *subband_info = &(value->subband_info[idx]);
-
-    if(!(pull8(ppReadPackedMsg, &subband_info->subband_index, end) &&
-         pull8(ppReadPackedMsg, &subband_info->scheduled_ues, end)))
-      return 0;
-
-    uint8_t antenna_idx = 0;
-    uint8_t scheduled_ue_idx = 0;
-
-    for(antenna_idx = 0; antenna_idx < value->num_antennas; ++antenna_idx) {
-      for(scheduled_ue_idx = 0; scheduled_ue_idx < subband_info->scheduled_ues; ++scheduled_ue_idx) {
-        if(!pull16(ppReadPackedMsg, &(subband_info->precoding_value[antenna_idx][scheduled_ue_idx]), end))
-          return 0;
-      }
-    }
-  }
-
-  return 1;
-}
-
-
-static uint8_t unpack_dl_config_dci_dl_pdu_rel13_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
-  nfapi_dl_config_dci_dl_pdu_rel13_t *dci_dl_pdu_rel13 = (nfapi_dl_config_dci_dl_pdu_rel13_t *)tlv;
-  // If the length is greater than 5 then the TPM struct flag and possiably the TPM structure have been
-  // added
-  uint8_t tpm_struct_flag_present = dci_dl_pdu_rel13->tl.length > 5;
-  dci_dl_pdu_rel13->tpm_struct_flag = 0;
-  return (pull8(ppReadPackedMsg, &dci_dl_pdu_rel13->laa_end_partial_sf_flag, end) &&
-          pull8(ppReadPackedMsg, &dci_dl_pdu_rel13->laa_end_partial_sf_configuration, end) &&
-          pull8(ppReadPackedMsg, &dci_dl_pdu_rel13->initial_lbt_sf, end) &&
-          pull8(ppReadPackedMsg, &dci_dl_pdu_rel13->codebook_size_determination, end) &&
-          pull8(ppReadPackedMsg, &dci_dl_pdu_rel13->drms_table_flag, end) &&
-          ( (tpm_struct_flag_present == 1) ? pull8(ppReadPackedMsg, &dci_dl_pdu_rel13->tpm_struct_flag, end) : 1) &&
-          ( (tpm_struct_flag_present == 1 &&  dci_dl_pdu_rel13->tpm_struct_flag == 1) ? unpack_tpm_value(ppReadPackedMsg, &dci_dl_pdu_rel13->tpm, end) : 1));
-}
-
-static uint8_t unpack_dl_config_bch_pdu_rel8_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
-  nfapi_dl_config_bch_pdu_rel8_t *bch_pdu_rel8 = (nfapi_dl_config_bch_pdu_rel8_t *)tlv;
-  return ( pull16(ppReadPackedMsg, &bch_pdu_rel8->length, end) &&
-           pull16(ppReadPackedMsg, (uint16_t *)&bch_pdu_rel8->pdu_index, end) &&
-           pull16(ppReadPackedMsg, &bch_pdu_rel8->transmission_power, end));
-}
-
-static uint8_t unpack_dl_config_mch_pdu_rel8_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
-  nfapi_dl_config_mch_pdu_rel8_t *mch_pdu_rel8 = (nfapi_dl_config_mch_pdu_rel8_t *)tlv;
-  return (pull16(ppReadPackedMsg, &mch_pdu_rel8->length, end) &&
-          pull16(ppReadPackedMsg, (uint16_t *)&mch_pdu_rel8->pdu_index, end) &&
-          pull16(ppReadPackedMsg, &mch_pdu_rel8->rnti, end) &&
-          pull8(ppReadPackedMsg, &mch_pdu_rel8->resource_allocation_type, end) &&
-          pull32(ppReadPackedMsg, &mch_pdu_rel8->resource_block_coding, end) &&
-          pull8(ppReadPackedMsg, &mch_pdu_rel8->modulation, end) &&
-          pull16(ppReadPackedMsg, &mch_pdu_rel8->transmission_power, end) &&
-          pull16(ppReadPackedMsg, &mch_pdu_rel8->mbsfn_area_id, end));
-}
-
-static uint8_t unpack_dl_config_dlsch_pdu_rel8_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
-  nfapi_dl_config_dlsch_pdu_rel8_t *dlsch_pdu_rel8 = (nfapi_dl_config_dlsch_pdu_rel8_t *)tlv;
-
-  if (!(pull16(ppReadPackedMsg, &dlsch_pdu_rel8->length, end) &&
-        pull16(ppReadPackedMsg, (uint16_t *)&dlsch_pdu_rel8->pdu_index, end) &&
-        pull16(ppReadPackedMsg, &dlsch_pdu_rel8->rnti, end) &&
-        pull8(ppReadPackedMsg, &dlsch_pdu_rel8->resource_allocation_type, end) &&
-        pull8(ppReadPackedMsg, &dlsch_pdu_rel8->virtual_resource_block_assignment_flag, end) &&
-        pull32(ppReadPackedMsg, &dlsch_pdu_rel8->resource_block_coding, end) &&
-        pull8(ppReadPackedMsg, &dlsch_pdu_rel8->modulation, end) &&
-        pull8(ppReadPackedMsg, &dlsch_pdu_rel8->redundancy_version, end) &&
-        pull8(ppReadPackedMsg, &dlsch_pdu_rel8->transport_blocks, end) &&
-        pull8(ppReadPackedMsg, &dlsch_pdu_rel8->transport_block_to_codeword_swap_flag, end) &&
-        pull8(ppReadPackedMsg, &dlsch_pdu_rel8->transmission_scheme, end) &&
-        pull8(ppReadPackedMsg, &dlsch_pdu_rel8->number_of_layers, end) &&
-        pull8(ppReadPackedMsg, &dlsch_pdu_rel8->number_of_subbands, end) &&
-        pullarray8(ppReadPackedMsg, dlsch_pdu_rel8->codebook_index, NFAPI_MAX_NUM_SUBBANDS, dlsch_pdu_rel8->number_of_subbands, end) &&
-        pull8(ppReadPackedMsg, &dlsch_pdu_rel8->ue_category_capacity, end) &&
-        pull8(ppReadPackedMsg, &dlsch_pdu_rel8->pa, end) &&
-        pull8(ppReadPackedMsg, &dlsch_pdu_rel8->delta_power_offset_index, end) &&
-        pull8(ppReadPackedMsg, &dlsch_pdu_rel8->ngap, end) &&
-        pull8(ppReadPackedMsg, &dlsch_pdu_rel8->nprb, end) &&
-        pull8(ppReadPackedMsg, &dlsch_pdu_rel8->transmission_mode, end) &&
-        pull8(ppReadPackedMsg, &dlsch_pdu_rel8->num_bf_prb_per_subband, end) &&
-        pull8(ppReadPackedMsg, &dlsch_pdu_rel8->num_bf_vector, end)))
-    return 0;
-
-  uint16_t j = 0;
-
-  for(j = 0; j < dlsch_pdu_rel8->num_bf_vector; ++j) {
-    if(!(pull8(ppReadPackedMsg, &dlsch_pdu_rel8->bf_vector[j].subband_index, end) &&
-         pull8(ppReadPackedMsg, &dlsch_pdu_rel8->bf_vector[j].num_antennas, end) &&
-         pullarray16(ppReadPackedMsg, dlsch_pdu_rel8->bf_vector[j].bf_value, NFAPI_MAX_NUM_ANTENNAS, dlsch_pdu_rel8->bf_vector[j].num_antennas, end)))
-      return 0;
-  }
-
-  return 1;
-}
-static uint8_t unpack_dl_config_dlsch_pdu_rel9_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
-  nfapi_dl_config_dlsch_pdu_rel9_t *dlsch_pdu_rel9 = (nfapi_dl_config_dlsch_pdu_rel9_t *)tlv;
-  return ( pull8(ppReadPackedMsg, &dlsch_pdu_rel9->nscid, end) );
-}
-static uint8_t unpack_dl_config_dlsch_pdu_rel10_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
-  nfapi_dl_config_dlsch_pdu_rel10_t *dlsch_pdu_rel10 = (nfapi_dl_config_dlsch_pdu_rel10_t *)tlv;
-  return ( pull8(ppReadPackedMsg, &dlsch_pdu_rel10->csi_rs_flag, end) &&
-           pull8(ppReadPackedMsg, &dlsch_pdu_rel10->csi_rs_resource_config_r10, end) &&
-           pull16(ppReadPackedMsg, &dlsch_pdu_rel10->csi_rs_zero_tx_power_resource_config_bitmap_r10, end) &&
-           pull8(ppReadPackedMsg, &dlsch_pdu_rel10->csi_rs_number_nzp_configuration, end) &&
-           pullarray8(ppReadPackedMsg, dlsch_pdu_rel10->csi_rs_resource_config, NFAPI_MAX_CSI_RS_RESOURCE_CONFIG, dlsch_pdu_rel10->csi_rs_number_nzp_configuration, end) &&
-           pull8(ppReadPackedMsg, &dlsch_pdu_rel10->pdsch_start, end)) ;
-}
-static uint8_t unpack_dl_config_dlsch_pdu_rel11_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
-  nfapi_dl_config_dlsch_pdu_rel11_t *dlsch_pdu_rel11 = (nfapi_dl_config_dlsch_pdu_rel11_t *)tlv;
-  return ( pull8(ppReadPackedMsg, &dlsch_pdu_rel11->drms_config_flag, end) &&
-           pull16(ppReadPackedMsg, &dlsch_pdu_rel11->drms_scrambling, end) &&
-           pull8(ppReadPackedMsg, &dlsch_pdu_rel11->csi_config_flag, end) &&
-           pull16(ppReadPackedMsg, &dlsch_pdu_rel11->csi_scrambling, end) &&
-           pull8(ppReadPackedMsg, &dlsch_pdu_rel11->pdsch_re_mapping_flag, end) &&
-           pull8(ppReadPackedMsg, &dlsch_pdu_rel11->pdsch_re_mapping_atenna_ports, end) &&
-           pull8(ppReadPackedMsg, &dlsch_pdu_rel11->pdsch_re_mapping_freq_shift, end));
-}
-static uint8_t unpack_dl_config_dlsch_pdu_rel12_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
-  nfapi_dl_config_dlsch_pdu_rel12_t *dlsch_pdu_rel12 = (nfapi_dl_config_dlsch_pdu_rel12_t *)tlv;
-  return ( pull8(ppReadPackedMsg, &dlsch_pdu_rel12->altcqi_table_r12, end) &&
-           pull8(ppReadPackedMsg, &dlsch_pdu_rel12->maxlayers, end) &&
-           pull8(ppReadPackedMsg, &dlsch_pdu_rel12->n_dl_harq, end));
-}
-static uint8_t unpack_dl_config_dlsch_pdu_rel13_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
-  nfapi_dl_config_dlsch_pdu_rel13_t *dlsch_pdu_rel13 = (nfapi_dl_config_dlsch_pdu_rel13_t *)tlv;
-  return ( pull8(ppReadPackedMsg, &dlsch_pdu_rel13->dwpts_symbols, end) &&
-           pull8(ppReadPackedMsg, &dlsch_pdu_rel13->initial_lbt_sf, end) &&
-           pull8(ppReadPackedMsg, &dlsch_pdu_rel13->ue_type, end) &&
-           pull8(ppReadPackedMsg, &dlsch_pdu_rel13->pdsch_payload_type, end) &&
-           pull16(ppReadPackedMsg, &dlsch_pdu_rel13->initial_transmission_sf_io, end) &&
-           pull8(ppReadPackedMsg, &dlsch_pdu_rel13->drms_table_flag, end));
-}
-
-static uint8_t unpack_dl_config_pch_pdu_rel8_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
-  nfapi_dl_config_pch_pdu_rel8_t *pch_pdu_rel8 = (nfapi_dl_config_pch_pdu_rel8_t *)tlv;
-  return ( pull16(ppReadPackedMsg, &pch_pdu_rel8->length, end) &&
-           pull16(ppReadPackedMsg, (uint16_t *)&pch_pdu_rel8->pdu_index, end) &&
-           pull16(ppReadPackedMsg, &pch_pdu_rel8->p_rnti, end) &&
-           pull8(ppReadPackedMsg, &pch_pdu_rel8->resource_allocation_type, end) &&
-           pull8(ppReadPackedMsg, &pch_pdu_rel8->virtual_resource_block_assignment_flag, end) &&
-           pull32(ppReadPackedMsg, &pch_pdu_rel8->resource_block_coding, end) &&
-           pull8(ppReadPackedMsg, &pch_pdu_rel8->mcs, end) &&
-           pull8(ppReadPackedMsg, &pch_pdu_rel8->redundancy_version, end) &&
-           pull8(ppReadPackedMsg, &pch_pdu_rel8->number_of_transport_blocks, end) &&
-           pull8(ppReadPackedMsg, &pch_pdu_rel8->transport_block_to_codeword_swap_flag, end) &&
-           pull8(ppReadPackedMsg, &pch_pdu_rel8->transmission_scheme, end) &&
-           pull8(ppReadPackedMsg, &pch_pdu_rel8->number_of_layers, end) &&
-           pull8(ppReadPackedMsg, &pch_pdu_rel8->codebook_index, end) &&
-           pull8(ppReadPackedMsg, &pch_pdu_rel8->ue_category_capacity, end) &&
-           pull8(ppReadPackedMsg, &pch_pdu_rel8->pa, end) &&
-           pull16(ppReadPackedMsg, &pch_pdu_rel8->transmission_power, end) &&
-           pull8(ppReadPackedMsg, &pch_pdu_rel8->nprb, end) &&
-           pull8(ppReadPackedMsg, &pch_pdu_rel8->ngap, end));
-}
-static uint8_t unpack_dl_config_pch_pdu_rel13_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
-  nfapi_dl_config_pch_pdu_rel13_t *pch_pdu_rel13 = (nfapi_dl_config_pch_pdu_rel13_t *)tlv;
-  return ( pull8(ppReadPackedMsg, &pch_pdu_rel13->ue_mode, end) &&
-           pull16(ppReadPackedMsg, &pch_pdu_rel13->initial_transmission_sf_io, end));
-}
-
-static uint8_t unpack_dl_config_prs_pdu_rel9_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
-  nfapi_dl_config_prs_pdu_rel9_t *prs_pdu_rel9 = (nfapi_dl_config_prs_pdu_rel9_t *)tlv;
-  return ( pull16(ppReadPackedMsg, &prs_pdu_rel9->transmission_power, end) &&
-           pull8(ppReadPackedMsg, &prs_pdu_rel9->prs_bandwidth, end) &&
-           pull8(ppReadPackedMsg, &prs_pdu_rel9->prs_cyclic_prefix_type, end) &&
-           pull8(ppReadPackedMsg, &prs_pdu_rel9->prs_muting, end));
-}
-
-static uint8_t unpack_dl_config_csi_rs_pdu_rel10_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
-  nfapi_dl_config_csi_rs_pdu_rel10_t *csi_rs_pdu_rel10 = (nfapi_dl_config_csi_rs_pdu_rel10_t *)tlv;
-  return ( pull8(ppReadPackedMsg, &csi_rs_pdu_rel10->csi_rs_antenna_port_count_r10, end) &&
-           pull8(ppReadPackedMsg, &csi_rs_pdu_rel10->csi_rs_resource_config_r10, end) &&
-           pull16(ppReadPackedMsg, &csi_rs_pdu_rel10->transmission_power, end) &&
-           pull16(ppReadPackedMsg, &csi_rs_pdu_rel10->csi_rs_zero_tx_power_resource_config_bitmap_r10, end) &&
-           pull8(ppReadPackedMsg, &csi_rs_pdu_rel10->csi_rs_number_of_nzp_configuration, end) &&
-           pullarray8(ppReadPackedMsg, csi_rs_pdu_rel10->csi_rs_resource_config, NFAPI_MAX_CSI_RS_RESOURCE_CONFIG, csi_rs_pdu_rel10->csi_rs_number_of_nzp_configuration, end));
-}
-
-static uint8_t unpack_dl_config_csi_rs_pdu_rel13_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
-  nfapi_dl_config_csi_rs_pdu_rel13_t *csi_rs_pdu_rel13 = (nfapi_dl_config_csi_rs_pdu_rel13_t *)tlv;
-
-  if (!(pull8(ppReadPackedMsg, &csi_rs_pdu_rel13->csi_rs_class, end) &&
-        pull8(ppReadPackedMsg, &csi_rs_pdu_rel13->cdm_type, end) &&
-        pull8(ppReadPackedMsg, &csi_rs_pdu_rel13->num_bf_vector, end)))
-    return 0;
-
-  uint16_t idx =0;
-
-  for(idx = 0; idx < csi_rs_pdu_rel13->num_bf_vector; ++idx) {
-    if(!(pull8(ppReadPackedMsg, &csi_rs_pdu_rel13->bf_vector[idx].csi_rs_resource_index, end)))
-      return 0;
-
-    NFAPI_TRACE(NFAPI_TRACE_ERROR, "FIXME : HOW TO DECODE BF VALUE \n");
-    //pullarray16(ppReadPackedMsg, &csi_rs_pdu_rel13->bf_vector[idx].bf_vector, ??);
-  }
-
-  return 1;
-}
-
-static uint8_t unpack_dl_config_epdcch_params_rel11_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
-  nfapi_dl_config_epdcch_parameters_rel11_t *epdcch_params_rel11 = (nfapi_dl_config_epdcch_parameters_rel11_t *)tlv;
-  return (pull8(ppReadPackedMsg, &epdcch_params_rel11->epdcch_resource_assignment_flag, end) &&
-          pull16(ppReadPackedMsg, &epdcch_params_rel11->epdcch_id, end) &&
-          pull8(ppReadPackedMsg, &epdcch_params_rel11->epdcch_start_symbol, end) &&
-          pull8(ppReadPackedMsg, &epdcch_params_rel11->epdcch_num_prb, end) &&
-          pullarray8(ppReadPackedMsg, epdcch_params_rel11->epdcch_prb_index, NFAPI_MAX_EPDCCH_PRB, epdcch_params_rel11->epdcch_num_prb, end) &&
-          pull8(ppReadPackedMsg, &epdcch_params_rel11->bf_vector.subband_index, end) &&
-          pull8(ppReadPackedMsg, &epdcch_params_rel11->bf_vector.num_antennas, end) &&
-          pullarray16(ppReadPackedMsg, epdcch_params_rel11->bf_vector.bf_value, NFAPI_MAX_NUM_ANTENNAS, epdcch_params_rel11->bf_vector.num_antennas, end));
-}
-
-static uint8_t unpack_dl_config_epdcch_params_rel13_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
-  nfapi_dl_config_epdcch_parameters_rel13_t *epdcch_params_rel13 = (nfapi_dl_config_epdcch_parameters_rel13_t *)tlv;
-  return ( pull8(ppReadPackedMsg, &epdcch_params_rel13->dwpts_symbols, end) &&
-           pull8(ppReadPackedMsg, &epdcch_params_rel13->initial_lbt_sf, end));
-}
-
-static uint8_t unpack_dl_config_mpdcch_pdu_rel13_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
-  nfapi_dl_config_mpdcch_pdu_rel13_t *mpdcch_params_rel13 = (nfapi_dl_config_mpdcch_pdu_rel13_t *)tlv;
-  return ( pull8(ppReadPackedMsg, &mpdcch_params_rel13->mpdcch_narrow_band, end) &&
-           pull8(ppReadPackedMsg, &mpdcch_params_rel13->number_of_prb_pairs, end) &&
-           pull8(ppReadPackedMsg, &mpdcch_params_rel13->resource_block_assignment, end) &&
-           pull8(ppReadPackedMsg, &mpdcch_params_rel13->mpdcch_tansmission_type, end) &&
-           pull8(ppReadPackedMsg, &mpdcch_params_rel13->start_symbol, end) &&
-           pull8(ppReadPackedMsg, &mpdcch_params_rel13->ecce_index, end) &&
-           pull8(ppReadPackedMsg, &mpdcch_params_rel13->aggregation_level, end) &&
-           pull8(ppReadPackedMsg, &mpdcch_params_rel13->rnti_type, end) &&
-           pull16(ppReadPackedMsg, &mpdcch_params_rel13->rnti, end) &&
-           pull8(ppReadPackedMsg, &mpdcch_params_rel13->ce_mode, end) &&
-           pull16(ppReadPackedMsg, &mpdcch_params_rel13->drms_scrambling_init, end) &&
-           pull16(ppReadPackedMsg, &mpdcch_params_rel13->initial_transmission_sf_io, end) &&
-           pull16(ppReadPackedMsg, &mpdcch_params_rel13->transmission_power, end) &&
-           pull8(ppReadPackedMsg, &mpdcch_params_rel13->dci_format, end) &&
-           pull16(ppReadPackedMsg, &mpdcch_params_rel13->resource_block_coding, end) &&
-           pull8(ppReadPackedMsg, &mpdcch_params_rel13->mcs, end) &&
-           pull8(ppReadPackedMsg, &mpdcch_params_rel13->pdsch_reptition_levels, end) &&
-           pull8(ppReadPackedMsg, &mpdcch_params_rel13->redundancy_version, end) &&
-           pull8(ppReadPackedMsg, &mpdcch_params_rel13->new_data_indicator, end) &&
-           pull8(ppReadPackedMsg, &mpdcch_params_rel13->harq_process, end) &&
-           pull8(ppReadPackedMsg, &mpdcch_params_rel13->tpmi_length, end) &&
-           pull8(ppReadPackedMsg, &mpdcch_params_rel13->tpmi, end) &&
-           pull8(ppReadPackedMsg, &mpdcch_params_rel13->pmi_flag, end) &&
-           pull8(ppReadPackedMsg, &mpdcch_params_rel13->pmi, end) &&
-           pull8(ppReadPackedMsg, &mpdcch_params_rel13->harq_resource_offset, end) &&
-           pull8(ppReadPackedMsg, &mpdcch_params_rel13->dci_subframe_repetition_number, end) &&
-           pull8(ppReadPackedMsg, &mpdcch_params_rel13->tpc, end) &&
-           pull8(ppReadPackedMsg, &mpdcch_params_rel13->downlink_assignment_index_length, end) &&
-           pull8(ppReadPackedMsg, &mpdcch_params_rel13->downlink_assignment_index, end) &&
-           pull8(ppReadPackedMsg, &mpdcch_params_rel13->allocate_prach_flag, end) &&
-           pull8(ppReadPackedMsg, &mpdcch_params_rel13->preamble_index, end) &&
-           pull8(ppReadPackedMsg, &mpdcch_params_rel13->prach_mask_index, end) &&
-           pull8(ppReadPackedMsg, &mpdcch_params_rel13->starting_ce_level, end) &&
-           pull8(ppReadPackedMsg, &mpdcch_params_rel13->srs_request, end) &&
-           pull8(ppReadPackedMsg, &mpdcch_params_rel13->antenna_ports_and_scrambling_identity_flag, end) &&
-           pull8(ppReadPackedMsg, &mpdcch_params_rel13->antenna_ports_and_scrambling_identity, end) &&
-           pull8(ppReadPackedMsg, &mpdcch_params_rel13->frequency_hopping_enabled_flag, end) &&
-           pull8(ppReadPackedMsg, &mpdcch_params_rel13->paging_direct_indication_differentiation_flag, end) &&
-           pull8(ppReadPackedMsg, &mpdcch_params_rel13->direct_indication, end) &&
-           pull8(ppReadPackedMsg, &mpdcch_params_rel13->total_dci_length_including_padding, end) &&
-           pull8(ppReadPackedMsg, &mpdcch_params_rel13->number_of_tx_antenna_ports, end) &&
-           pullarray16(ppReadPackedMsg, mpdcch_params_rel13->precoding_value, NFAPI_MAX_TX_PHYSICAL_ANTENNA_PORTS, mpdcch_params_rel13->number_of_tx_antenna_ports, end));
-}
-
-
-static uint8_t unpack_dl_config_nbch_pdu_rel13_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
-  nfapi_dl_config_nbch_pdu_rel13_t *nbch_params_rel13 = (nfapi_dl_config_nbch_pdu_rel13_t *)tlv;
-  return ( pull16(ppReadPackedMsg, &nbch_params_rel13->length, end) &&
-           pull16(ppReadPackedMsg, (uint16_t *)&nbch_params_rel13->pdu_index, end) &&
-           pull16(ppReadPackedMsg, &nbch_params_rel13->transmission_power, end) &&
-           pull16(ppReadPackedMsg, &nbch_params_rel13->hyper_sfn_2_lsbs, end));
-}
-
-static uint8_t unpack_dl_config_npdcch_pdu_rel13_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
-  nfapi_dl_config_npdcch_pdu_rel13_t *npdcch_params_rel13 = (nfapi_dl_config_npdcch_pdu_rel13_t *)tlv;
-  return ( pull16(ppReadPackedMsg, &npdcch_params_rel13->length, end) &&
-           pull16(ppReadPackedMsg, (uint16_t *)&npdcch_params_rel13->pdu_index, end) &&
-           pull8(ppReadPackedMsg, &npdcch_params_rel13->ncce_index, end) &&
-           pull8(ppReadPackedMsg, &npdcch_params_rel13->aggregation_level, end) &&
-           pull8(ppReadPackedMsg, &npdcch_params_rel13->start_symbol, end) &&
-           pull8(ppReadPackedMsg, &npdcch_params_rel13->rnti_type, end) &&
-           pull16(ppReadPackedMsg, &npdcch_params_rel13->rnti, end) &&
-           pull8(ppReadPackedMsg, &npdcch_params_rel13->scrambling_reinitialization_batch_index, end) &&
-           pull8(ppReadPackedMsg, &npdcch_params_rel13->nrs_antenna_ports_assumed_by_the_ue, end) &&
-           pull8(ppReadPackedMsg, &npdcch_params_rel13->dci_format, end) &&
-           pull8(ppReadPackedMsg, &npdcch_params_rel13->scheduling_delay, end) &&
-           pull8(ppReadPackedMsg, &npdcch_params_rel13->resource_assignment, end) &&
-           pull8(ppReadPackedMsg, &npdcch_params_rel13->repetition_number, end) &&
-           pull8(ppReadPackedMsg, &npdcch_params_rel13->mcs, end) &&
-           pull8(ppReadPackedMsg, &npdcch_params_rel13->new_data_indicator, end) &&
-           pull8(ppReadPackedMsg, &npdcch_params_rel13->harq_ack_resource, end) &&
-           pull8(ppReadPackedMsg, &npdcch_params_rel13->npdcch_order_indication, end) &&
-           pull8(ppReadPackedMsg, &npdcch_params_rel13->starting_number_of_nprach_repetitions, end) &&
-           pull8(ppReadPackedMsg, &npdcch_params_rel13->subcarrier_indication_of_nprach, end) &&
-           pull8(ppReadPackedMsg, &npdcch_params_rel13->paging_direct_indication_differentation_flag, end) &&
-           pull8(ppReadPackedMsg, &npdcch_params_rel13->direct_indication, end) &&
-           pull8(ppReadPackedMsg, &npdcch_params_rel13->dci_subframe_repetition_number, end) &&
-           pull8(ppReadPackedMsg, &npdcch_params_rel13->total_dci_length_including_padding, end));
-}
-
-static uint8_t unpack_dl_config_ndlsch_pdu_rel13_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
-  nfapi_dl_config_ndlsch_pdu_rel13_t *ndlsch_params_rel13 = (nfapi_dl_config_ndlsch_pdu_rel13_t *)tlv;
-  return ( pull16(ppReadPackedMsg, &ndlsch_params_rel13->length, end) &&
-           pull16(ppReadPackedMsg, (uint16_t *)&ndlsch_params_rel13->pdu_index, end) &&
-           pull8(ppReadPackedMsg, &ndlsch_params_rel13->start_symbol, end) &&
-           pull8(ppReadPackedMsg, &ndlsch_params_rel13->rnti_type, end) &&
-           pull16(ppReadPackedMsg, &ndlsch_params_rel13->rnti, end) &&
-           pull16(ppReadPackedMsg, &ndlsch_params_rel13->resource_assignment, end) &&
-           pull16(ppReadPackedMsg, &ndlsch_params_rel13->repetition_number, end) &&
-           pull8(ppReadPackedMsg, &ndlsch_params_rel13->modulation, end) &&
-           pull8(ppReadPackedMsg, &ndlsch_params_rel13->number_of_subframes_for_resource_assignment, end) &&
-           pull8(ppReadPackedMsg, &ndlsch_params_rel13->scrambling_sequence_initialization_cinit, end) &&
-           pull16(ppReadPackedMsg, &ndlsch_params_rel13->sf_idx, end) &&
-           pull8(ppReadPackedMsg, &ndlsch_params_rel13->nrs_antenna_ports_assumed_by_the_ue, end));
-}
-
-
-static uint8_t unpack_dl_tti_request_body_value(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg) {
-  nfapi_nr_dl_tti_request_pdu_t *value = (nfapi_nr_dl_tti_request_pdu_t *)msg;
-
-  if(!(pull32(ppReadPackedMsg, &value->PDUSize, end) &&
-       pull16(ppReadPackedMsg, &value->PDUType, end) ))
-    return 0;
-
-  // first match the pdu type, then call the respective function
-  switch(value->PDUType) {
-    case NFAPI_NR_DL_TTI_CSI_RS_PDU_TYPE: {
-      if(!(unpack_dl_tti_csi_rs_pdu_rel15_value(&value->csi_rs_pdu.csi_rs_pdu_rel15,ppReadPackedMsg,end)))
-        return 0;
-    }
-    break;
-
-    case NFAPI_NR_DL_TTI_PDCCH_PDU_TYPE: {
-      if(!(unpack_dl_tti_pdcch_pdu_rel15_value(&value->pdcch_pdu.pdcch_pdu_rel15,ppReadPackedMsg,end)))
-        return 0;
-    }
-    break;
-
-    case NFAPI_NR_DL_TTI_PDSCH_PDU_TYPE: {
-      if(!(unpack_dl_tti_pdsch_pdu_rel15_value(&value->pdsch_pdu.pdsch_pdu_rel15,ppReadPackedMsg,end)))
-        return 0;
-    }
-    break;
-
-    case NFAPI_NR_DL_TTI_SSB_PDU_TYPE: {
-      if(!(unpack_dl_tti_ssb_pdu_rel15_value(&value->ssb_pdu.ssb_pdu_rel15,ppReadPackedMsg,end)))
-        return 0;
-    }
-    break;
-
-    default: {
-      NFAPI_TRACE(NFAPI_TRACE_ERROR, "FIXME : Invalid DL_TTI pdu type %d \n", value->PDUType );
-    }
-    break;
-  }
-
-  return 1;
-}
-
-
-
-
-static uint8_t unpack_dl_config_request_body_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end, nfapi_p7_codec_config_t *config) {
-  nfapi_dl_config_request_body_t *value = (nfapi_dl_config_request_body_t *)tlv;
-
-  if(!(pull8(ppReadPackedMsg, &value->number_pdcch_ofdm_symbols, end) &&
-       pull8(ppReadPackedMsg, &value->number_dci, end) &&
-       pull16(ppReadPackedMsg, &value->number_pdu, end) &&
-       pull8(ppReadPackedMsg, &value->number_pdsch_rnti, end) &&
-       pull16(ppReadPackedMsg, &value->transmission_power_pcfich, end)))
-    return 0;
-
-  if(value->number_pdu > NFAPI_DL_CONFIG_MAX_PDU) {
-    NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s number of dl config pdu's exceed maxium (count:%d max:%d)\n", __FUNCTION__, value->number_pdu, NFAPI_DL_CONFIG_MAX_PDU);
-    return 0;
-  }
-
-  if(value->number_pdu) {
-    value->dl_config_pdu_list = (nfapi_dl_config_request_pdu_t *)nfapi_p7_allocate(sizeof(nfapi_dl_config_request_pdu_t) * value->number_pdu, config);
-
-    if(value->dl_config_pdu_list == NULL) {
-      NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s failed to allocate dl config pdu list (count:%d)\n", __FUNCTION__, value->number_pdu);
-      return 0;
-    }
-  } else {
-    value->dl_config_pdu_list = 0;
-  }
-
-  uint16_t i;
-  uint16_t total_number_of_pdus = value->number_pdu;
-
-  for(i = 0; i < total_number_of_pdus; ++i) {
-    nfapi_dl_config_request_pdu_t *pdu = &(value->dl_config_pdu_list[i]);
-
-    if(!(pull8(ppReadPackedMsg, &pdu->pdu_type, end) &&
-         pull8(ppReadPackedMsg, &pdu->pdu_size, end)))
-      return 0;
-
-    uint8_t *packedPduEnd = (*ppReadPackedMsg) + pdu->pdu_size - 2;
-
-    if(packedPduEnd > end) {
-      // pdu end of beyond buffer end
-      return 0;
-    }
-
-    switch(pdu->pdu_type) {
-      case NFAPI_DL_CONFIG_DCI_DL_PDU_TYPE: {
-        unpack_tlv_t unpack_fns[] = {
-          { NFAPI_DL_CONFIG_REQUEST_DCI_DL_PDU_REL8_TAG, &pdu->dci_dl_pdu.dci_dl_pdu_rel8, &unpack_dl_config_dci_dl_pdu_rel8_value},
-          { NFAPI_DL_CONFIG_REQUEST_DCI_DL_PDU_REL9_TAG, &pdu->dci_dl_pdu.dci_dl_pdu_rel9, &unpack_dl_config_dci_dl_pdu_rel9_value},
-          { NFAPI_DL_CONFIG_REQUEST_DCI_DL_PDU_REL10_TAG, &pdu->dci_dl_pdu.dci_dl_pdu_rel10, &unpack_dl_config_dci_dl_pdu_rel10_value},
-          { NFAPI_DL_CONFIG_REQUEST_DCI_DL_PDU_REL11_TAG, &pdu->dci_dl_pdu.dci_dl_pdu_rel11, &unpack_dl_config_dci_dl_pdu_rel11_value},
-          { NFAPI_DL_CONFIG_REQUEST_DCI_DL_PDU_REL12_TAG, &pdu->dci_dl_pdu.dci_dl_pdu_rel12, &unpack_dl_config_dci_dl_pdu_rel12_value},
-          { NFAPI_DL_CONFIG_REQUEST_DCI_DL_PDU_REL13_TAG, &pdu->dci_dl_pdu.dci_dl_pdu_rel13, &unpack_dl_config_dci_dl_pdu_rel13_value},
-        };
-        unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0);
-      }
-      break;
-
-      case NFAPI_DL_CONFIG_BCH_PDU_TYPE: {
-        unpack_tlv_t unpack_fns[] = {
-          { NFAPI_DL_CONFIG_REQUEST_BCH_PDU_REL8_TAG, &pdu->bch_pdu.bch_pdu_rel8, &unpack_dl_config_bch_pdu_rel8_value},
-        };
-        unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0);
-      }
-      break;
-
-      case NFAPI_DL_CONFIG_MCH_PDU_TYPE: {
-        unpack_tlv_t unpack_fns[] = {
-          { NFAPI_DL_CONFIG_REQUEST_MCH_PDU_REL8_TAG, &pdu->mch_pdu.mch_pdu_rel8, &unpack_dl_config_mch_pdu_rel8_value},
-        };
-        unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0);
-      }
-      break;
-
-      case NFAPI_DL_CONFIG_DLSCH_PDU_TYPE: {
-        unpack_tlv_t unpack_fns[] = {
-          { NFAPI_DL_CONFIG_REQUEST_DLSCH_PDU_REL8_TAG, &pdu->dlsch_pdu.dlsch_pdu_rel8, &unpack_dl_config_dlsch_pdu_rel8_value},
-          { NFAPI_DL_CONFIG_REQUEST_DLSCH_PDU_REL9_TAG, &pdu->dlsch_pdu.dlsch_pdu_rel9, &unpack_dl_config_dlsch_pdu_rel9_value},
-          { NFAPI_DL_CONFIG_REQUEST_DLSCH_PDU_REL10_TAG, &pdu->dlsch_pdu.dlsch_pdu_rel10, &unpack_dl_config_dlsch_pdu_rel10_value},
-          { NFAPI_DL_CONFIG_REQUEST_DLSCH_PDU_REL11_TAG, &pdu->dlsch_pdu.dlsch_pdu_rel11, &unpack_dl_config_dlsch_pdu_rel11_value},
-          { NFAPI_DL_CONFIG_REQUEST_DLSCH_PDU_REL12_TAG, &pdu->dlsch_pdu.dlsch_pdu_rel12, &unpack_dl_config_dlsch_pdu_rel12_value},
-          { NFAPI_DL_CONFIG_REQUEST_DLSCH_PDU_REL13_TAG, &pdu->dlsch_pdu.dlsch_pdu_rel13, &unpack_dl_config_dlsch_pdu_rel13_value},
-        };
-        unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0);
-      }
-      break;
-
-      case NFAPI_DL_CONFIG_PCH_PDU_TYPE: {
-        unpack_tlv_t unpack_fns[] = {
-          { NFAPI_DL_CONFIG_REQUEST_PCH_PDU_REL8_TAG, &pdu->pch_pdu.pch_pdu_rel8, &unpack_dl_config_pch_pdu_rel8_value},
-          { NFAPI_DL_CONFIG_REQUEST_PCH_PDU_REL13_TAG, &pdu->pch_pdu.pch_pdu_rel13, &unpack_dl_config_pch_pdu_rel13_value},
-        };
-        unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0);
-      }
-      break;
-
-      case NFAPI_DL_CONFIG_PRS_PDU_TYPE: {
-        unpack_tlv_t unpack_fns[] = {
-          { NFAPI_DL_CONFIG_REQUEST_PRS_PDU_REL9_TAG, &pdu->prs_pdu.prs_pdu_rel9, &unpack_dl_config_prs_pdu_rel9_value},
-        };
-        unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0);
-      }
-      break;
-
-      case NFAPI_DL_CONFIG_CSI_RS_PDU_TYPE: {
-        unpack_tlv_t unpack_fns[] = {
-          { NFAPI_DL_CONFIG_REQUEST_CSI_RS_PDU_REL10_TAG, &pdu->csi_rs_pdu.csi_rs_pdu_rel10, &unpack_dl_config_csi_rs_pdu_rel10_value},
-          { NFAPI_DL_CONFIG_REQUEST_CSI_RS_PDU_REL13_TAG, &pdu->csi_rs_pdu.csi_rs_pdu_rel13, &unpack_dl_config_csi_rs_pdu_rel13_value},
-        };
-        unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0);
-      }
-      break;
-
-      case NFAPI_DL_CONFIG_EPDCCH_DL_PDU_TYPE: {
-        unpack_tlv_t unpack_fns[] = {
-          { NFAPI_DL_CONFIG_REQUEST_EPDCCH_PDU_REL8_TAG, &pdu->epdcch_pdu.epdcch_pdu_rel8, &unpack_dl_config_dci_dl_pdu_rel8_value},
-          { NFAPI_DL_CONFIG_REQUEST_EPDCCH_PDU_REL9_TAG, &pdu->epdcch_pdu.epdcch_pdu_rel9, &unpack_dl_config_dci_dl_pdu_rel9_value},
-          { NFAPI_DL_CONFIG_REQUEST_EPDCCH_PDU_REL10_TAG, &pdu->epdcch_pdu.epdcch_pdu_rel10, &unpack_dl_config_dci_dl_pdu_rel10_value},
-          { NFAPI_DL_CONFIG_REQUEST_EPDCCH_PDU_REL11_TAG, &pdu->epdcch_pdu.epdcch_pdu_rel11, &unpack_dl_config_dci_dl_pdu_rel11_value},
-          { NFAPI_DL_CONFIG_REQUEST_EPDCCH_PDU_REL12_TAG, &pdu->epdcch_pdu.epdcch_pdu_rel12, &unpack_dl_config_dci_dl_pdu_rel12_value},
-          { NFAPI_DL_CONFIG_REQUEST_EPDCCH_PDU_REL13_TAG, &pdu->epdcch_pdu.epdcch_pdu_rel13, &unpack_dl_config_dci_dl_pdu_rel13_value},
-          { NFAPI_DL_CONFIG_REQUEST_EPDCCH_PARAM_REL11_TAG, &pdu->epdcch_pdu.epdcch_params_rel11, &unpack_dl_config_epdcch_params_rel11_value},
-          { NFAPI_DL_CONFIG_REQUEST_EPDCCH_PARAM_REL13_TAG, &pdu->epdcch_pdu.epdcch_params_rel13, &unpack_dl_config_epdcch_params_rel13_value},
-        };
-        unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0);
-      }
-      break;
-
-      case NFAPI_DL_CONFIG_MPDCCH_PDU_TYPE: {
-        unpack_tlv_t unpack_fns[] = {
-          { NFAPI_DL_CONFIG_REQUEST_MPDCCH_PDU_REL13_TAG, &pdu->mpdcch_pdu.mpdcch_pdu_rel13, &unpack_dl_config_mpdcch_pdu_rel13_value},
-        };
-        unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0);
-      }
-      break;
-
-      case NFAPI_DL_CONFIG_NBCH_PDU_TYPE: {
-        unpack_tlv_t unpack_fns[] = {
-          { NFAPI_DL_CONFIG_REQUEST_NBCH_PDU_REL13_TAG, &pdu->nbch_pdu.nbch_pdu_rel13, &unpack_dl_config_nbch_pdu_rel13_value},
-        };
-        unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0);
-      }
-      break;
-
-      case NFAPI_DL_CONFIG_NPDCCH_PDU_TYPE: {
-        unpack_tlv_t unpack_fns[] = {
-          { NFAPI_DL_CONFIG_REQUEST_NPDCCH_PDU_REL13_TAG, &pdu->npdcch_pdu.npdcch_pdu_rel13, &unpack_dl_config_npdcch_pdu_rel13_value},
-        };
-        unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0);
-      }
-      break;
-
-      case NFAPI_DL_CONFIG_NDLSCH_PDU_TYPE: {
-        unpack_tlv_t unpack_fns[] = {
-          { NFAPI_DL_CONFIG_REQUEST_NDLSCH_PDU_REL13_TAG, &pdu->ndlsch_pdu.ndlsch_pdu_rel13, &unpack_dl_config_ndlsch_pdu_rel13_value},
-        };
-        unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0);
-      }
-      break;
-
-      default:
-        // Need to log an error
-        break;
-    }
-  }
-
-  return 1;
-}
-
-
-static uint8_t unpack_dl_tti_request(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p7_codec_config_t *config) {
-  nfapi_nr_dl_tti_request_t *pNfapiMsg = (nfapi_nr_dl_tti_request_t *)msg;
-
-  if (!(pull16(ppReadPackedMsg,&pNfapiMsg->SFN, end) &&
-        pull16(ppReadPackedMsg, &pNfapiMsg->Slot, end) &&
-        pull8(ppReadPackedMsg, &pNfapiMsg->dl_tti_request_body.nGroup, end) &&
-        pull8(ppReadPackedMsg, &pNfapiMsg->dl_tti_request_body.nPDUs, end) &&
-        pullarray8(ppReadPackedMsg,pNfapiMsg->dl_tti_request_body.nUe,256,pNfapiMsg->dl_tti_request_body.nGroup, end)
-        //pusharray8(pNfapiMsg->PduIdx[0] ,256,256, ppWritePackedMsg, end)
-       ))
-    return 0;
-
-  int arr[12];
-
-  for(int i=0; i<pNfapiMsg->dl_tti_request_body.nGroup; i++) {
-    for(int j=0; j<pNfapiMsg->dl_tti_request_body.nUe[i]; j++) {
-      arr[j] = pNfapiMsg->dl_tti_request_body.PduIdx[i][j];
-    }
-
-    if(!(pullarrays32(ppReadPackedMsg,arr,12,pNfapiMsg->dl_tti_request_body.nUe[i], end)))
-      return 0;
-  }
-
-  for(int i=0; i<pNfapiMsg->dl_tti_request_body.nPDUs; i++) {
-    if(!unpack_dl_tti_request_body_value(ppReadPackedMsg, end, &pNfapiMsg->dl_tti_request_body.dl_tti_pdu_list[i]))
-      return 0;
-  }
-
-  return 1;
-}
-
-
-static uint8_t unpack_ul_tti_request_prach_pdu(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
-  nfapi_nr_prach_pdu_t *prach_pdu = (nfapi_nr_prach_pdu_t *)tlv;
-  return(
-          pull16(ppReadPackedMsg, &prach_pdu->phys_cell_id, end) &&
-          pull8(ppReadPackedMsg, &prach_pdu->num_prach_ocas, end) &&
-          pull8(ppReadPackedMsg, &prach_pdu->prach_format, end) &&
-          pull8(ppReadPackedMsg, &prach_pdu->num_ra, end) &&
-          pull8(ppReadPackedMsg, &prach_pdu->prach_start_symbol, end) &&
-          pull16(ppReadPackedMsg, &prach_pdu->num_cs, end)
-          // TODO: ignoring beamforming tlv for now
-        );
-}
-
-
-static uint8_t unpack_ul_tti_request_pucch_pdu(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
-  nfapi_nr_pucch_pdu_t *pucch_pdu = (nfapi_nr_pucch_pdu_t *)tlv;
-  return(
-          pull16(ppReadPackedMsg, &pucch_pdu->rnti, end) &&
-          pull32(ppReadPackedMsg, &pucch_pdu->handle, end) &&
-          pull16(ppReadPackedMsg, &pucch_pdu->bwp_size, end) &&
-          pull16(ppReadPackedMsg, &pucch_pdu->bwp_start, end) &&
-          pull8(ppReadPackedMsg, &pucch_pdu->subcarrier_spacing, end) &&
-          pull8(ppReadPackedMsg, &pucch_pdu->cyclic_prefix, end) &&
-          pull8(ppReadPackedMsg, &pucch_pdu->format_type, end) &&
-          pull8(ppReadPackedMsg, &pucch_pdu->multi_slot_tx_indicator, end) &&
-          pull16(ppReadPackedMsg, &pucch_pdu->prb_start, end) &&
-          pull16(ppReadPackedMsg, &pucch_pdu->prb_size, end) &&
-          pull8(ppReadPackedMsg, &pucch_pdu->start_symbol_index, end) &&
-          pull8(ppReadPackedMsg, &pucch_pdu->nr_of_symbols, end) &&
-          pull8(ppReadPackedMsg, &pucch_pdu->freq_hop_flag, end) &&
-          pull16(ppReadPackedMsg, &pucch_pdu->second_hop_prb, end) &&
-          pull8(ppReadPackedMsg, &pucch_pdu->group_hop_flag, end) &&
-          pull8(ppReadPackedMsg, &pucch_pdu->sequence_hop_flag, end) &&
-          pull16(ppReadPackedMsg, &pucch_pdu->hopping_id, end) &&
-          pull16(ppReadPackedMsg, &pucch_pdu->initial_cyclic_shift, end) &&
-          pull16(ppReadPackedMsg, &pucch_pdu->data_scrambling_id, end) &&
-          pull8(ppReadPackedMsg, &pucch_pdu->time_domain_occ_idx, end) &&
-          pull8(ppReadPackedMsg, &pucch_pdu->pre_dft_occ_idx, end) &&
-          pull8(ppReadPackedMsg, &pucch_pdu->pre_dft_occ_len, end) &&
-          pull8(ppReadPackedMsg, &pucch_pdu->add_dmrs_flag, end) &&
-          pull16(ppReadPackedMsg, &pucch_pdu->dmrs_scrambling_id, end) &&
-          pull8(ppReadPackedMsg, &pucch_pdu->dmrs_cyclic_shift, end) &&
-          pull8(ppReadPackedMsg, &pucch_pdu->sr_flag, end) &&
-          pull8(ppReadPackedMsg, &pucch_pdu->bit_len_harq, end) &&
-          pull16(ppReadPackedMsg, &pucch_pdu->bit_len_csi_part1, end) &&
-          pull16(ppReadPackedMsg, &pucch_pdu->bit_len_csi_part2, end)
-          // TODO: ignoring beamforming tlv for now
-        );
-}
-
-
-static uint8_t unpack_ul_tti_request_pusch_pdu(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
-  nfapi_nr_pusch_pdu_t *pusch_pdu = (nfapi_nr_pusch_pdu_t *)tlv;
-
-  if (!(
-        pull16(ppReadPackedMsg, &pusch_pdu->pdu_bit_map, end) &&
-        pull16(ppReadPackedMsg, &pusch_pdu->rnti, end) &&
-        pull32(ppReadPackedMsg, &pusch_pdu->handle, end) &&
-        pull16(ppReadPackedMsg, &pusch_pdu->bwp_size, end) &&
-        pull16(ppReadPackedMsg, &pusch_pdu->bwp_start, end) &&
-        pull8(ppReadPackedMsg, &pusch_pdu->subcarrier_spacing, end) &&
-        pull8(ppReadPackedMsg, &pusch_pdu->cyclic_prefix, end) &&
-        pull16(ppReadPackedMsg, &pusch_pdu->target_code_rate,  end) &&
-        pull8(ppReadPackedMsg, &pusch_pdu->qam_mod_order,  end) &&
-        pull8(ppReadPackedMsg, &pusch_pdu->mcs_index,  end) &&
-        pull8(ppReadPackedMsg, &pusch_pdu->mcs_table, end) &&
-        pull8(ppReadPackedMsg, &pusch_pdu->transform_precoding, end) &&
-        pull16(ppReadPackedMsg, &pusch_pdu->data_scrambling_id, end) &&
-        pull8(ppReadPackedMsg, &pusch_pdu->nrOfLayers, end) &&
-        pull16(ppReadPackedMsg, &pusch_pdu->ul_dmrs_symb_pos, end) &&
-        pull8(ppReadPackedMsg, &pusch_pdu->dmrs_config_type, end) &&
-        pull16(ppReadPackedMsg, &pusch_pdu->ul_dmrs_scrambling_id, end) &&
-        pull8(ppReadPackedMsg, &pusch_pdu->scid, end) &&
-        pull8(ppReadPackedMsg, &pusch_pdu->num_dmrs_cdm_grps_no_data, end) &&
-        pull16(ppReadPackedMsg, &pusch_pdu->dmrs_ports, end) &&
-        pull8(ppReadPackedMsg, &pusch_pdu->resource_alloc, end) &&
-        pull8(ppReadPackedMsg, &pusch_pdu->resource_alloc,end) &&
-        pull16(ppReadPackedMsg, &pusch_pdu->dmrs_ports, end) &&
-        pull16(ppReadPackedMsg, &pusch_pdu->rb_start, end) &&
-        pull16(ppReadPackedMsg, &pusch_pdu->rb_size, end) &&
-        pull8(ppReadPackedMsg, &pusch_pdu->vrb_to_prb_mapping, end) &&
-        pull8(ppReadPackedMsg, &pusch_pdu->frequency_hopping, end) &&
-        pull16(ppReadPackedMsg, &pusch_pdu->tx_direct_current_location, end) &&
-        pull8(ppReadPackedMsg, &pusch_pdu->uplink_frequency_shift_7p5khz, end) &&
-        pull8(ppReadPackedMsg, &pusch_pdu->start_symbol_index, end) &&
-        pull8(ppReadPackedMsg, &pusch_pdu->nr_of_symbols, end)
-        // TODO: ignoring beamforming tlv for now
-      ))
-    return 0;
-
-  //Pack Optional Data only included if indicated in pduBitmap
-  switch(pusch_pdu->pdu_bit_map) {
-    case PUSCH_PDU_BITMAP_PUSCH_DATA: {
-      // pack optional TLVs
-      return(
-              pull8(ppReadPackedMsg, &pusch_pdu->pusch_data.rv_index, end) &&
-              pull8(ppReadPackedMsg, &pusch_pdu->pusch_data.harq_process_id, end) &&
-              pull32(ppReadPackedMsg, &pusch_pdu->pusch_data.tb_size, end) &&
-              pull16(ppReadPackedMsg, &pusch_pdu->pusch_data.num_cb, end) &&
-              pullarray8(ppReadPackedMsg, pusch_pdu->pusch_data.cb_present_and_position,1,1,end)
-            );
-    }
-    break;
-
-    case PUSCH_PDU_BITMAP_PUSCH_UCI: {
-      return(
-              pull16(ppReadPackedMsg, &pusch_pdu->pusch_uci.harq_ack_bit_length, end) &&
-              pull16(ppReadPackedMsg, &pusch_pdu->pusch_uci.csi_part1_bit_length, end) &&
-              pull16(ppReadPackedMsg, &pusch_pdu->pusch_uci.csi_part2_bit_length, end) &&
-              pull8(ppReadPackedMsg, &pusch_pdu->pusch_uci.alpha_scaling, end) &&
-              pull8(ppReadPackedMsg, &pusch_pdu->pusch_uci.beta_offset_harq_ack, end) &&
-              pull8(ppReadPackedMsg, &pusch_pdu->pusch_uci.beta_offset_csi1, end) &&
-              pull8(ppReadPackedMsg, &pusch_pdu->pusch_uci.beta_offset_csi2, end)
-            );
-    }
-    break;
-
-    case PUSCH_PDU_BITMAP_PUSCH_PTRS: {
-      return(
-              pull8(ppReadPackedMsg, &pusch_pdu->pusch_ptrs.num_ptrs_ports, end) &&
-              pull8(ppReadPackedMsg, &pusch_pdu->pusch_ptrs.ptrs_ports_list->ptrs_dmrs_port, end) &&
-              +               pull16(ppReadPackedMsg, &pusch_pdu->pusch_ptrs.ptrs_ports_list->ptrs_port_index, end) &&
-              +               pull8(ppReadPackedMsg, &pusch_pdu->pusch_ptrs.ptrs_ports_list->ptrs_re_offset, end) &&
-              pull8(ppReadPackedMsg, &pusch_pdu->pusch_ptrs.ptrs_time_density, end) &&
-              pull8(ppReadPackedMsg, &pusch_pdu->pusch_ptrs.ptrs_freq_density, end) &&
-              pull8(ppReadPackedMsg, &pusch_pdu->pusch_ptrs.ul_ptrs_power, end)
-            );
-    }
-    break;
-
-    case PUSCH_PDU_BITMAP_DFTS_OFDM: {
-      return(
-              pull8(ppReadPackedMsg, &pusch_pdu->dfts_ofdm.low_papr_group_number, end) &&
-              pull16(ppReadPackedMsg, &pusch_pdu->dfts_ofdm.low_papr_sequence_number, end) &&
-              pull8(ppReadPackedMsg, &pusch_pdu->dfts_ofdm.ul_ptrs_sample_density, end) &&
-              pull8(ppReadPackedMsg, &pusch_pdu->dfts_ofdm.ul_ptrs_time_density_transform_precoding, end)
-            );
-    }
-    break;
-
-    default: {
-      NFAPI_TRACE(NFAPI_TRACE_INFO, "Invalid pdu bitmap %d \n", pusch_pdu->pdu_bit_map );
-    }
-  }
-
-  return 1;
-}
-
-
-static uint8_t unpack_ul_tti_request_srs_pdu(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
-  nfapi_nr_srs_pdu_t *srs_pdu = (nfapi_nr_srs_pdu_t *)tlv;
-  return(
-          pull16(ppReadPackedMsg, &srs_pdu->rnti, end) &&
-          pull32(ppReadPackedMsg, &srs_pdu->handle, end) &&
-          pull16(ppReadPackedMsg, &srs_pdu->bwp_size, end) &&
-          pull16(ppReadPackedMsg, &srs_pdu->bwp_start, end) &&
-          pull8(ppReadPackedMsg, &srs_pdu->subcarrier_spacing, end) &&
-          pull8(ppReadPackedMsg, &srs_pdu->cyclic_prefix, end) &&
-          pull8(ppReadPackedMsg, &srs_pdu->num_ant_ports, end) &&
-          pull8(ppReadPackedMsg, &srs_pdu->num_symbols,  end) &&
-          pull8(ppReadPackedMsg, &srs_pdu->num_repetitions, end) &&
-          pull8(ppReadPackedMsg, &srs_pdu->time_start_position, end) &&
-          pull8(ppReadPackedMsg, &srs_pdu->config_index, end) &&
-          pull16(ppReadPackedMsg, &srs_pdu->sequence_id, end) &&
-          pull8(ppReadPackedMsg, &srs_pdu->bandwidth_index, end) &&
-          pull8(ppReadPackedMsg, &srs_pdu->comb_size, end) &&
-          pull8(ppReadPackedMsg, &srs_pdu->comb_offset, end) &&
-          pull8(ppReadPackedMsg, &srs_pdu->cyclic_shift, end) &&
-          pull8(ppReadPackedMsg, &srs_pdu->frequency_position, end) &&
-          pull8(ppReadPackedMsg, &srs_pdu->frequency_shift, end) &&
-          pull8(ppReadPackedMsg, &srs_pdu->frequency_hopping, end) &&
-          pull8(ppReadPackedMsg, &srs_pdu->group_or_sequence_hopping, end) &&
-          pull8(ppReadPackedMsg, &srs_pdu->resource_type, end) &&
-          pull16(ppReadPackedMsg, &srs_pdu->t_srs, end) &&
-          pull16(ppReadPackedMsg, &srs_pdu->t_offset, end)
-          // TODO: ignoring beamforming tlv for now
-        );
-}
-
-
-static uint8_t unpack_ul_tti_pdu_list_value(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg) {
-  nfapi_nr_ul_tti_request_number_of_pdus_t *pNfapiMsg = (nfapi_nr_ul_tti_request_number_of_pdus_t *)msg;
-
-  if(!(pull16(ppReadPackedMsg, &pNfapiMsg->pdu_size, end) &&
-       pull16(ppReadPackedMsg, &pNfapiMsg->pdu_type, end) ))
-    return 0;
-
-  // first natch the pdu type, then call the respective function
-  switch(pNfapiMsg->pdu_type) {
-    case NFAPI_NR_UL_CONFIG_PRACH_PDU_TYPE: {
-      if(!unpack_ul_tti_request_prach_pdu(&pNfapiMsg->prach_pdu, ppReadPackedMsg, end))
-        return 0;
-    }
-    break;
-
-    case NFAPI_NR_UL_CONFIG_PUCCH_PDU_TYPE: {
-      if(!unpack_ul_tti_request_pucch_pdu(&pNfapiMsg->pucch_pdu, ppReadPackedMsg, end))
-        return 0;
-    }
-    break;
-
-    case NFAPI_NR_UL_CONFIG_PUSCH_PDU_TYPE: {
-      if(!unpack_ul_tti_request_pusch_pdu(&pNfapiMsg->pusch_pdu, ppReadPackedMsg, end))
-        return 0;
-    }
-    break;
-
-    case NFAPI_NR_UL_CONFIG_SRS_PDU_TYPE: {
-      if(!unpack_ul_tti_request_srs_pdu(&pNfapiMsg->srs_pdu, ppReadPackedMsg, end))
-        return 0;
-    }
-    break;
-
-    default: {
-      NFAPI_TRACE(NFAPI_TRACE_ERROR, "FIXME : Invalid UL_TTI pdu type %d \n", pNfapiMsg->pdu_type );
-    }
-    break;
-  }
-
-  return 1;
-}
-
-
-static uint8_t unpack_ul_tti_groups_list_value(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg) {
-  nfapi_nr_ul_tti_request_number_of_groups_t *pNfapiMsg = (nfapi_nr_ul_tti_request_number_of_groups_t *)msg;
-
-  if(!pull8(ppReadPackedMsg, &pNfapiMsg->n_ue, end))
-    return 0;
-
-  for (int i = 0; i < pNfapiMsg->n_ue; i++) {
-    if(!pull8(ppReadPackedMsg, &pNfapiMsg->ue_list[i].pdu_idx,end) )
-      return 0;
-  }
-
-  return 1;
-}
-
-
-static uint8_t unpack_ul_tti_request(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p7_codec_config_t *config) {
-  nfapi_nr_ul_tti_request_t *pNfapiMsg = (nfapi_nr_ul_tti_request_t *)msg;
-
-  if (!(
-        pull16(ppReadPackedMsg, &pNfapiMsg->SFN, end) &&
-        pull16(ppReadPackedMsg, &pNfapiMsg->Slot, end) &&
-        pull8(ppReadPackedMsg, &pNfapiMsg->n_pdus, end) &&
-        pull8(ppReadPackedMsg, &pNfapiMsg->n_group, end) &&
-        pull8(ppReadPackedMsg, &pNfapiMsg->rach_present, end) &&
-        pull8(ppReadPackedMsg, &pNfapiMsg->n_ulcch, end) &&
-        pull8(ppReadPackedMsg, &pNfapiMsg->n_ulsch, end) ))
-    return 0;
-
-  for(int i=0; i< pNfapiMsg->n_pdus; i++) {
-    if (!unpack_ul_tti_pdu_list_value(ppReadPackedMsg, end, &pNfapiMsg->pdus_list[i]))
-      return 0;
-  }
-
-  for(int i=0; i< pNfapiMsg->n_group; i++) {
-    if (!unpack_ul_tti_groups_list_value(ppReadPackedMsg, end, &pNfapiMsg->groups_list[i]))
-      return 0;
-  }
-
-  return 1;
-}
-
-
-
-static uint8_t unpack_dl_config_request(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p7_codec_config_t *config) {
-  nfapi_dl_config_request_t *pNfapiMsg = (nfapi_dl_config_request_t *)msg;
-  unpack_p7_tlv_t unpack_fns[] = {
-    { NFAPI_DL_CONFIG_REQUEST_BODY_TAG, &pNfapiMsg->dl_config_request_body, &unpack_dl_config_request_body_value},
-  };
-  return ( pull16(ppReadPackedMsg, &pNfapiMsg->sfn_sf, end) &&
-           unpack_p7_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, end, config, &pNfapiMsg->vendor_extension));
-}
-
-static uint8_t unpack_ul_config_ulsch_pdu_rel8_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
-  nfapi_ul_config_ulsch_pdu_rel8_t *ulsch_pdu_rel8 = (nfapi_ul_config_ulsch_pdu_rel8_t *)tlv;
-  return (pull32(ppReadPackedMsg, &ulsch_pdu_rel8->handle, end) &&
-          pull16(ppReadPackedMsg, &ulsch_pdu_rel8->size, end) &&
-          pull16(ppReadPackedMsg, &ulsch_pdu_rel8->rnti, end) &&
-          pull8(ppReadPackedMsg, &ulsch_pdu_rel8->resource_block_start, end) &&
-          pull8(ppReadPackedMsg, &ulsch_pdu_rel8->number_of_resource_blocks, end) &&
-          pull8(ppReadPackedMsg, &ulsch_pdu_rel8->modulation_type, end) &&
-          pull8(ppReadPackedMsg, &ulsch_pdu_rel8->cyclic_shift_2_for_drms, end) &&
-          pull8(ppReadPackedMsg, &ulsch_pdu_rel8->frequency_hopping_enabled_flag, end) &&
-          pull8(ppReadPackedMsg, &ulsch_pdu_rel8->frequency_hopping_bits, end) &&
-          pull8(ppReadPackedMsg, &ulsch_pdu_rel8->new_data_indication, end) &&
-          pull8(ppReadPackedMsg, &ulsch_pdu_rel8->redundancy_version, end) &&
-          pull8(ppReadPackedMsg, &ulsch_pdu_rel8->harq_process_number, end) &&
-          pull8(ppReadPackedMsg, &ulsch_pdu_rel8->ul_tx_mode, end) &&
-          pull8(ppReadPackedMsg, &ulsch_pdu_rel8->current_tx_nb, end) &&
-          pull8(ppReadPackedMsg, &ulsch_pdu_rel8->n_srs, end ));
-}
-
-static uint8_t unpack_ul_config_ulsch_pdu_rel10_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
-  nfapi_ul_config_ulsch_pdu_rel10_t *ulsch_pdu_rel10 = (nfapi_ul_config_ulsch_pdu_rel10_t *)tlv;
-  return (pull8(ppReadPackedMsg, &ulsch_pdu_rel10->resource_allocation_type, end) &&
-          pull32(ppReadPackedMsg, &ulsch_pdu_rel10->resource_block_coding, end) &&
-          pull8(ppReadPackedMsg, &ulsch_pdu_rel10->transport_blocks, end) &&
-          pull8(ppReadPackedMsg, &ulsch_pdu_rel10->transmission_scheme, end) &&
-          pull8(ppReadPackedMsg, &ulsch_pdu_rel10->number_of_layers, end) &
-          pull8(ppReadPackedMsg, &ulsch_pdu_rel10->codebook_index, end) &&
-          pull8(ppReadPackedMsg, &ulsch_pdu_rel10->disable_sequence_hopping_flag, end));
-}
-static uint8_t unpack_ul_config_ulsch_pdu_rel11_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
-  nfapi_ul_config_ulsch_pdu_rel11_t *ulsch_pdu_rel11 = (nfapi_ul_config_ulsch_pdu_rel11_t *)tlv;
-  return ( pull8(ppReadPackedMsg, &ulsch_pdu_rel11->virtual_cell_id_enabled_flag, end) &&
-           pull16(ppReadPackedMsg, &ulsch_pdu_rel11->npusch_identity, end) &&
-           pull8(ppReadPackedMsg, &ulsch_pdu_rel11->dmrs_config_flag, end) &&
-           pull16(ppReadPackedMsg, &ulsch_pdu_rel11->ndmrs_csh_identity, end));
-}
-static uint8_t unpack_ul_config_ulsch_pdu_rel13_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
-  nfapi_ul_config_ulsch_pdu_rel13_t *ulsch_pdu_rel13 = (nfapi_ul_config_ulsch_pdu_rel13_t *)tlv;
-  return (pull8(ppReadPackedMsg,  &ulsch_pdu_rel13->ue_type, end) &&
-          pull16(ppReadPackedMsg, &ulsch_pdu_rel13->total_number_of_repetitions, end) &&
-          pull16(ppReadPackedMsg, &ulsch_pdu_rel13->repetition_number, end) &&
-          pull16(ppReadPackedMsg, &ulsch_pdu_rel13->initial_transmission_sf_io, end) &&
-          pull8(ppReadPackedMsg,  &ulsch_pdu_rel13->empty_symbols_due_to_re_tunning, end));
-}
-static uint8_t unpack_ul_config_cqi_ri_info_rel8_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
-  nfapi_ul_config_cqi_ri_information_rel8_t *cqi_ri_info_rel8 = (nfapi_ul_config_cqi_ri_information_rel8_t *)tlv;
-  return (pull8(ppReadPackedMsg, &cqi_ri_info_rel8->dl_cqi_pmi_size_rank_1, end) &&
-          pull8(ppReadPackedMsg, &cqi_ri_info_rel8->dl_cqi_pmi_size_rank_greater_1, end) &&
-          pull8(ppReadPackedMsg, &cqi_ri_info_rel8->ri_size, end) &&
-          pull8(ppReadPackedMsg, &cqi_ri_info_rel8->delta_offset_cqi, end) &&
-          pull8(ppReadPackedMsg, &cqi_ri_info_rel8->delta_offset_ri, end));
-}
-
-static uint8_t unpack_ul_config_cqi_ri_info_rel9_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
-  nfapi_ul_config_cqi_ri_information_rel9_t *cqi_ri_info_rel9 = (nfapi_ul_config_cqi_ri_information_rel9_t *)tlv;
-
-  if(!(pull8(ppReadPackedMsg, &cqi_ri_info_rel9->report_type, end) &&
-       pull8(ppReadPackedMsg, &cqi_ri_info_rel9->delta_offset_cqi, end) &&
-       pull8(ppReadPackedMsg, &cqi_ri_info_rel9->delta_offset_ri, end)))
-    return 0;
-
-  switch(cqi_ri_info_rel9->report_type) {
-    case NFAPI_CSI_REPORT_TYPE_PERIODIC: {
-      if(!(pull8(ppReadPackedMsg, &cqi_ri_info_rel9->periodic_cqi_pmi_ri_report.dl_cqi_pmi_ri_size, end) &&
-           pull8(ppReadPackedMsg, &cqi_ri_info_rel9->periodic_cqi_pmi_ri_report.control_type, end)))
-        return 0;
-    }
-    break;
-
-    case NFAPI_CSI_REPORT_TYPE_APERIODIC: {
-      if(pull8(ppReadPackedMsg, &cqi_ri_info_rel9->aperiodic_cqi_pmi_ri_report.number_of_cc, end) ==0)
-        return 0;
-
-      uint8_t i;
-
-      for(i = 0; i < cqi_ri_info_rel9->aperiodic_cqi_pmi_ri_report.number_of_cc; ++i) {
-        if(pull8(ppReadPackedMsg, &cqi_ri_info_rel9->aperiodic_cqi_pmi_ri_report.cc[i].ri_size, end) == 0)
-          return 0;
-
-        uint8_t j;
-
-        for(j = 0; j < 8; ++j) {
-          if(pull8(ppReadPackedMsg, &cqi_ri_info_rel9->aperiodic_cqi_pmi_ri_report.cc[i].dl_cqi_pmi_size[j], end) == 0)
-            return 0;
-        }
-      }
-    }
-    break;
-
-    default: {
-      NFAPI_TRACE(NFAPI_TRACE_ERROR, "FIXME : Invalid report type %d \n", cqi_ri_info_rel9->report_type );
-      return 0;
-    }
-    break;
-  };
-
-  return 1;
-}
-
-// NOTE : This function is a little unconventional as we uese the side to
-// determine the report type
-static uint8_t unpack_ul_config_cqi_ri_info_rel13_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
-  nfapi_ul_config_cqi_ri_information_rel13_t *cqi_ri_info_rel13 = (nfapi_ul_config_cqi_ri_information_rel13_t *)tlv;
-
-  if(cqi_ri_info_rel13->tl.length == 0) {
-    cqi_ri_info_rel13->report_type = NFAPI_CSI_REPORT_TYPE_APERIODIC;
-  } else {
-    cqi_ri_info_rel13->report_type = NFAPI_CSI_REPORT_TYPE_PERIODIC;
-
-    if(pull16(ppReadPackedMsg, &cqi_ri_info_rel13->periodic_cqi_pmi_ri_report.dl_cqi_pmi_ri_size_2, end) == 0)
-      return 0;
-  }
-
-  return 1;
-}
-static uint8_t unpack_ul_config_cqi_init_tx_params_rel8_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
-  nfapi_ul_config_initial_transmission_parameters_rel8_t *init_tx_params_rel8 = (nfapi_ul_config_initial_transmission_parameters_rel8_t *)tlv;
-  return (pull8(ppReadPackedMsg, &init_tx_params_rel8->n_srs_initial, end) &&
-          pull8(ppReadPackedMsg, &init_tx_params_rel8->initial_number_of_resource_blocks, end));
-}
-static uint8_t unpack_ul_config_ulsch_harq_info_rel10_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
-  nfapi_ul_config_ulsch_harq_information_rel10_t *harq_info_rel10 = (nfapi_ul_config_ulsch_harq_information_rel10_t *)tlv;
-  return (pull8(ppReadPackedMsg, &harq_info_rel10->harq_size, end) &&
-          pull8(ppReadPackedMsg, &harq_info_rel10->delta_offset_harq, end) &&
-          pull8(ppReadPackedMsg, &harq_info_rel10->ack_nack_mode, end));
-}
-
-static uint8_t unpack_ul_config_ulsch_harq_info_rel13_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
-  nfapi_ul_config_ulsch_harq_information_rel13_t *harq_info_rel13 = (nfapi_ul_config_ulsch_harq_information_rel13_t *)tlv;
-  return (pull16(ppReadPackedMsg, &harq_info_rel13->harq_size_2, end) &&
-          pull8(ppReadPackedMsg, &harq_info_rel13->delta_offset_harq_2, end));
-}
-
-static uint8_t unpack_ul_config_ue_info_rel8_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
-  nfapi_ul_config_ue_information_rel8_t *ue_info_rel8 = (nfapi_ul_config_ue_information_rel8_t *)tlv;
-  return (pull32(ppReadPackedMsg, &ue_info_rel8->handle, end) &&
-          pull16(ppReadPackedMsg, (uint16_t *)&ue_info_rel8->rnti, end));
-}
-static uint8_t unpack_ul_config_ue_info_rel11_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
-  nfapi_ul_config_ue_information_rel11_t *ue_info_rel11 = (nfapi_ul_config_ue_information_rel11_t *)tlv;
-  return (pull8(ppReadPackedMsg, &ue_info_rel11->virtual_cell_id_enabled_flag, end) &&
-          pull16(ppReadPackedMsg, &ue_info_rel11->npusch_identity, end));
-}
-static uint8_t unpack_ul_config_ue_info_rel13_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
-  nfapi_ul_config_ue_information_rel13_t *ue_info_rel13 = (nfapi_ul_config_ue_information_rel13_t *)tlv;
-  return (pull8(ppReadPackedMsg, &ue_info_rel13->ue_type, end) &&
-          pull8(ppReadPackedMsg, &ue_info_rel13->empty_symbols, end) &&
-          pull16(ppReadPackedMsg, &ue_info_rel13->total_number_of_repetitions, end) &&
-          pull16(ppReadPackedMsg, &ue_info_rel13->repetition_number, end));
-}
-
-static uint8_t unpack_ul_config_cqi_info_rel8_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
-  nfapi_ul_config_cqi_information_rel8_t *cqi_info_rel8 = (nfapi_ul_config_cqi_information_rel8_t *)tlv;
-  return ( pull16(ppReadPackedMsg, &cqi_info_rel8->pucch_index, end) &&
-           pull8(ppReadPackedMsg, &cqi_info_rel8->dl_cqi_pmi_size, end));
-}
-static uint8_t unpack_ul_config_cqi_info_rel10_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
-  nfapi_ul_config_cqi_information_rel10_t *cqi_info_rel10 = (nfapi_ul_config_cqi_information_rel10_t *)tlv;
-  return (pull8(ppReadPackedMsg, &cqi_info_rel10->number_of_pucch_resource, end) &&
-          pull16(ppReadPackedMsg, &cqi_info_rel10->pucch_index_p1, end));
-}
-static uint8_t unpack_ul_config_cqi_info_rel13_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
-  nfapi_ul_config_cqi_information_rel13_t *cqi_info_rel13 = (nfapi_ul_config_cqi_information_rel13_t *)tlv;
-  return (pull8(ppReadPackedMsg, &cqi_info_rel13->csi_mode, end) &&
-          pull16(ppReadPackedMsg, &cqi_info_rel13->dl_cqi_pmi_size_2, end) &&
-          pull8(ppReadPackedMsg, &cqi_info_rel13->starting_prb, end) &&
-          pull8(ppReadPackedMsg, &cqi_info_rel13->n_prb, end) &&
-          pull8(ppReadPackedMsg, &cqi_info_rel13->cdm_index, end) &&
-          pull8(ppReadPackedMsg, &cqi_info_rel13->n_srs, end));
-}
-
-static uint8_t unpack_ul_config_sr_info_rel8_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
-  nfapi_ul_config_sr_information_rel8_t *sr_info_rel8 = (nfapi_ul_config_sr_information_rel8_t *)tlv;
-  return ( pull16(ppReadPackedMsg, &sr_info_rel8->pucch_index, end));
-}
-
-static uint8_t unpack_ul_config_sr_info_rel10_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
-  nfapi_ul_config_sr_information_rel10_t *sr_info_rel10 = (nfapi_ul_config_sr_information_rel10_t *)tlv;
-  return (pull8(ppReadPackedMsg, &sr_info_rel10->number_of_pucch_resources, end) &&
-          pull16(ppReadPackedMsg, &sr_info_rel10->pucch_index_p1, end));
-}
-
-static uint8_t unpack_ul_config_harq_info_rel10_tdd_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
-  nfapi_ul_config_harq_information_rel10_tdd_t *harq_info_tdd_rel10 = (nfapi_ul_config_harq_information_rel10_tdd_t *)tlv;
-  return (pull8(ppReadPackedMsg, &harq_info_tdd_rel10->harq_size, end) &&
-          pull8(ppReadPackedMsg, &harq_info_tdd_rel10->ack_nack_mode, end) &&
-          pull8(ppReadPackedMsg, &harq_info_tdd_rel10->number_of_pucch_resources, end) &&
-          pull16(ppReadPackedMsg, &harq_info_tdd_rel10->n_pucch_1_0, end) &&
-          pull16(ppReadPackedMsg, &harq_info_tdd_rel10->n_pucch_1_1, end) &&
-          pull16(ppReadPackedMsg, &harq_info_tdd_rel10->n_pucch_1_2, end) &&
-          pull16(ppReadPackedMsg, &harq_info_tdd_rel10->n_pucch_1_3, end));
-}
-
-static uint8_t unpack_ul_config_harq_info_rel8_fdd_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
-  nfapi_ul_config_harq_information_rel8_fdd_t *harq_info_fdd_rel8 = (nfapi_ul_config_harq_information_rel8_fdd_t *)tlv;
-  return (pull16(ppReadPackedMsg, &harq_info_fdd_rel8->n_pucch_1_0, end) &&
-          pull8(ppReadPackedMsg, &harq_info_fdd_rel8->harq_size, end));
-}
-
-static uint8_t unpack_ul_config_harq_info_rel9_fdd_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
-  nfapi_ul_config_harq_information_rel9_fdd_t *harq_info_fdd_rel9 = (nfapi_ul_config_harq_information_rel9_fdd_t *)tlv;
-  return (pull8(ppReadPackedMsg, &harq_info_fdd_rel9->harq_size, end) &&
-          pull8(ppReadPackedMsg, &harq_info_fdd_rel9->ack_nack_mode, end) &&
-          pull8(ppReadPackedMsg, &harq_info_fdd_rel9->number_of_pucch_resources, end) &&
-          pull16(ppReadPackedMsg, &harq_info_fdd_rel9->n_pucch_1_0, end) &&
-          pull16(ppReadPackedMsg, &harq_info_fdd_rel9->n_pucch_1_1, end) &&
-          pull16(ppReadPackedMsg, &harq_info_fdd_rel9->n_pucch_1_2, end) &&
-          pull16(ppReadPackedMsg, &harq_info_fdd_rel9->n_pucch_1_3, end));
-}
-
-static uint8_t unpack_ul_config_harq_info_rel11_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
-  nfapi_ul_config_harq_information_rel11_t *harq_info_rel11 = (nfapi_ul_config_harq_information_rel11_t *)tlv;
-  return (pull8(ppReadPackedMsg, &harq_info_rel11->num_ant_ports, end) &&
-          pull16(ppReadPackedMsg, &harq_info_rel11->n_pucch_2_0, end) &&
-          pull16(ppReadPackedMsg, &harq_info_rel11->n_pucch_2_1, end) &&
-          pull16(ppReadPackedMsg, &harq_info_rel11->n_pucch_2_2, end) &&
-          pull16(ppReadPackedMsg, &harq_info_rel11->n_pucch_2_3, end));
-}
-
-static uint8_t unpack_ul_config_harq_info_rel13_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
-  nfapi_ul_config_harq_information_rel13_t *harq_info_rel13 = (nfapi_ul_config_harq_information_rel13_t *)tlv;
-  return (pull16(ppReadPackedMsg, &harq_info_rel13->harq_size_2, end) &&
-          pull8(ppReadPackedMsg, &harq_info_rel13->starting_prb, end) &&
-          pull8(ppReadPackedMsg, &harq_info_rel13->n_prb, end) &&
-          pull8(ppReadPackedMsg, &harq_info_rel13->cdm_index, end) &&
-          pull8(ppReadPackedMsg, &harq_info_rel13->n_srs, end));
-}
-
-
-static uint8_t unpack_ul_config_srs_pdu_rel8_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
-  nfapi_ul_config_srs_pdu_rel8_t *srs_pdu_rel8 = (nfapi_ul_config_srs_pdu_rel8_t *)tlv;
-  return (pull32(ppReadPackedMsg, &srs_pdu_rel8->handle, end) &&
-          pull16(ppReadPackedMsg, &srs_pdu_rel8->size, end) &&
-          pull16(ppReadPackedMsg, &srs_pdu_rel8->rnti, end) &&
-          pull8(ppReadPackedMsg, &srs_pdu_rel8->srs_bandwidth, end) &&
-          pull8(ppReadPackedMsg, &srs_pdu_rel8->frequency_domain_position, end) &&
-          pull8(ppReadPackedMsg, &srs_pdu_rel8->srs_hopping_bandwidth, end) &&
-          pull8(ppReadPackedMsg, &srs_pdu_rel8->transmission_comb, end) &&
-          pull16(ppReadPackedMsg, &srs_pdu_rel8->i_srs, end) &&
-          pull8(ppReadPackedMsg, &srs_pdu_rel8->sounding_reference_cyclic_shift, end));
-}
-
-static uint8_t unpack_ul_config_srs_pdu_rel10_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
-  nfapi_ul_config_srs_pdu_rel10_t *srs_pdu_rel10 = (nfapi_ul_config_srs_pdu_rel10_t *)tlv;
-  return pull8(ppReadPackedMsg, &srs_pdu_rel10->antenna_port, end);
-}
-
-static uint8_t unpack_ul_config_srs_pdu_rel13_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
-  nfapi_ul_config_srs_pdu_rel13_t *srs_pdu_rel13 = (nfapi_ul_config_srs_pdu_rel13_t *)tlv;
-  return (pull8(ppReadPackedMsg, &srs_pdu_rel13->number_of_combs, end));
-}
-
-static uint8_t unpack_ul_nb_harq_info_rel13_fdd_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
-  nfapi_ul_config_nb_harq_information_rel13_fdd_t *nb_harq_info_fdd_rel13 = (nfapi_ul_config_nb_harq_information_rel13_fdd_t *)tlv;
-  return (pull8(ppReadPackedMsg, &nb_harq_info_fdd_rel13->harq_ack_resource, end));
-}
-
-static uint8_t unpack_ul_config_nulsch_pdu_rel13_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
-  nfapi_ul_config_nulsch_pdu_rel13_t *nulsch_pdu_rel13 = (nfapi_ul_config_nulsch_pdu_rel13_t *)tlv;
-
-  if(!(pull8(ppReadPackedMsg, &nulsch_pdu_rel13->nulsch_format, end) &&
-       pull32(ppReadPackedMsg, &nulsch_pdu_rel13->handle, end) &&
-       pull16(ppReadPackedMsg, &nulsch_pdu_rel13->size, end) &&
-       pull16(ppReadPackedMsg, &nulsch_pdu_rel13->rnti, end) &&
-       pull8(ppReadPackedMsg, &nulsch_pdu_rel13->subcarrier_indication, end) &&
-       pull8(ppReadPackedMsg, &nulsch_pdu_rel13->resource_assignment, end) &&
-       pull8(ppReadPackedMsg, &nulsch_pdu_rel13->mcs, end) &&
-       pull8(ppReadPackedMsg, &nulsch_pdu_rel13->redudancy_version, end) &&
-       pull8(ppReadPackedMsg, &nulsch_pdu_rel13->repetition_number, end) &&
-       pull8(ppReadPackedMsg, &nulsch_pdu_rel13->new_data_indication, end) &&
-       pull8(ppReadPackedMsg, &nulsch_pdu_rel13->n_srs, end) &&
-       pull16(ppReadPackedMsg, &nulsch_pdu_rel13->scrambling_sequence_initialization_cinit, end) &&
-       pull16(ppReadPackedMsg, &nulsch_pdu_rel13->sf_idx, end)))
-    return 0;
-
-  unpack_tlv_t unpack_fns[] = {
-    { NFAPI_UL_CONFIG_REQUEST_UE_INFORMATION_REL8_TAG, &nulsch_pdu_rel13->ue_information.ue_information_rel8, &unpack_ul_config_ue_info_rel8_value},
-    { NFAPI_UL_CONFIG_REQUEST_UE_INFORMATION_REL11_TAG, &nulsch_pdu_rel13->ue_information.ue_information_rel11, &unpack_ul_config_ue_info_rel11_value},
-    { NFAPI_UL_CONFIG_REQUEST_UE_INFORMATION_REL13_TAG, &nulsch_pdu_rel13->ue_information.ue_information_rel13, &unpack_ul_config_ue_info_rel13_value},
-    { NFAPI_UL_CONFIG_REQUEST_NB_HARQ_INFORMATION_REL13_FDD_TAG, &nulsch_pdu_rel13->nb_harq_information.nb_harq_information_rel13_fdd, &unpack_ul_nb_harq_info_rel13_fdd_value},
-  };
-  return unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, end, 0, 0);
-}
-
-static uint8_t unpack_ul_config_nrach_pdu_rel13_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
-  nfapi_ul_config_nrach_pdu_rel13_t *nrach_pdu_rel13 = (nfapi_ul_config_nrach_pdu_rel13_t *)tlv;
-  return (pull8(ppReadPackedMsg, &nrach_pdu_rel13->nprach_config_0, end) &&
-          pull8(ppReadPackedMsg, &nrach_pdu_rel13->nprach_config_1, end) &&
-          pull8(ppReadPackedMsg, &nrach_pdu_rel13->nprach_config_2, end));
-}
-
-
-static uint8_t unpack_ul_config_request_body_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end, nfapi_p7_codec_config_t *config) {
-#define UL_CONFIG_ULSCH_PDU_UNPACK_FNS(_pdu) \
-  { NFAPI_UL_CONFIG_REQUEST_ULSCH_PDU_REL8_TAG, &_pdu.ulsch_pdu_rel8, &unpack_ul_config_ulsch_pdu_rel8_value}, \
-  { NFAPI_UL_CONFIG_REQUEST_ULSCH_PDU_REL10_TAG, &_pdu.ulsch_pdu_rel10, &unpack_ul_config_ulsch_pdu_rel10_value}, \
-  { NFAPI_UL_CONFIG_REQUEST_ULSCH_PDU_REL11_TAG, &_pdu.ulsch_pdu_rel11, &unpack_ul_config_ulsch_pdu_rel11_value}, \
-  { NFAPI_UL_CONFIG_REQUEST_ULSCH_PDU_REL13_TAG, &_pdu.ulsch_pdu_rel13, &unpack_ul_config_ulsch_pdu_rel13_value},
-#define UL_CONFIG_CQI_RI_INFO_UNPACK_FNS(_pdu) \
-  { NFAPI_UL_CONFIG_REQUEST_CQI_RI_INFORMATION_REL8_TAG, &_pdu.cqi_ri_information_rel8, &unpack_ul_config_cqi_ri_info_rel8_value}, \
-  { NFAPI_UL_CONFIG_REQUEST_CQI_RI_INFORMATION_REL9_TAG, &_pdu.cqi_ri_information_rel9, &unpack_ul_config_cqi_ri_info_rel9_value}, \
-  { NFAPI_UL_CONFIG_REQUEST_CQI_RI_INFORMATION_REL13_TAG, &_pdu.cqi_ri_information_rel13, &unpack_ul_config_cqi_ri_info_rel13_value},
-#define UL_CONFIG_ULSCH_HARQ_INFO_UNPACK_FNS(_pdu) \
-  { NFAPI_UL_CONFIG_REQUEST_ULSCH_HARQ_INFORMATION_REL10_TAG, &_pdu.harq_information_rel10, &unpack_ul_config_ulsch_harq_info_rel10_value},\
-  { NFAPI_UL_CONFIG_REQUEST_ULSCH_HARQ_INFORMATION_REL13_TAG, &_pdu.harq_information_rel13, &unpack_ul_config_ulsch_harq_info_rel13_value},
-#define UL_CONFIG_INIT_TX_PARAMS_UNPACK_FNS(_pdu) \
-  { NFAPI_UL_CONFIG_REQUEST_INITIAL_TRANSMISSION_PARAMETERS_REL8_TAG, &_pdu.initial_transmission_parameters_rel8, &unpack_ul_config_cqi_init_tx_params_rel8_value},
-#define UL_CONFIG_UCI_UE_INFO_UNPACK_FNS(_pdu) \
-  { NFAPI_UL_CONFIG_REQUEST_UE_INFORMATION_REL8_TAG, &_pdu.ue_information_rel8, &unpack_ul_config_ue_info_rel8_value}, \
-  { NFAPI_UL_CONFIG_REQUEST_UE_INFORMATION_REL11_TAG, &_pdu.ue_information_rel11, &unpack_ul_config_ue_info_rel11_value}, \
-  { NFAPI_UL_CONFIG_REQUEST_UE_INFORMATION_REL13_TAG, &_pdu.ue_information_rel13, &unpack_ul_config_ue_info_rel13_value},
-#define UL_CONFIG_UCI_CQI_INFO_UNPACK_FNS(_pdu) \
-  { NFAPI_UL_CONFIG_REQUEST_CQI_INFORMATION_REL8_TAG, &_pdu.cqi_information_rel8, &unpack_ul_config_cqi_info_rel8_value}, \
-  { NFAPI_UL_CONFIG_REQUEST_CQI_INFORMATION_REL10_TAG, &_pdu.cqi_information_rel10, &unpack_ul_config_cqi_info_rel10_value}, \
-  { NFAPI_UL_CONFIG_REQUEST_CQI_INFORMATION_REL13_TAG, &_pdu.cqi_information_rel13, &unpack_ul_config_cqi_info_rel13_value},
-#define UL_CONFIG_UCI_SR_INFO_UNPACK_FNS(_pdu) \
-  { NFAPI_UL_CONFIG_REQUEST_SR_INFORMATION_REL8_TAG, &_pdu.sr_information_rel8, &unpack_ul_config_sr_info_rel8_value}, \
-  { NFAPI_UL_CONFIG_REQUEST_SR_INFORMATION_REL10_TAG, &_pdu.sr_information_rel10, &unpack_ul_config_sr_info_rel10_value},
-#define UL_CONFIG_UCI_HARQ_INFO_UNPACK_FNS(_pdu) \
-  { NFAPI_UL_CONFIG_REQUEST_HARQ_INFORMATION_REL10_TDD_TAG, &_pdu.harq_information_rel10_tdd, &unpack_ul_config_harq_info_rel10_tdd_value}, \
-  { NFAPI_UL_CONFIG_REQUEST_HARQ_INFORMATION_REL8_FDD_TAG, &_pdu.harq_information_rel8_fdd, &unpack_ul_config_harq_info_rel8_fdd_value}, \
-  { NFAPI_UL_CONFIG_REQUEST_HARQ_INFORMATION_REL9_FDD_TAG, &_pdu.harq_information_rel9_fdd, &unpack_ul_config_harq_info_rel9_fdd_value}, \
-  { NFAPI_UL_CONFIG_REQUEST_HARQ_INFORMATION_REL11_TAG, &_pdu.harq_information_rel11, &unpack_ul_config_harq_info_rel11_value}, \
-  { NFAPI_UL_CONFIG_REQUEST_HARQ_INFORMATION_REL13_TAG, &_pdu.harq_information_rel13, &unpack_ul_config_harq_info_rel13_value},
-#define UL_CONFIG_SRS_PDU_UNPACK_FNS(_pdu) \
-  { NFAPI_UL_CONFIG_REQUEST_SRS_PDU_REL8_TAG, &_pdu.srs_pdu_rel8, &unpack_ul_config_srs_pdu_rel8_value}, \
-  { NFAPI_UL_CONFIG_REQUEST_SRS_PDU_REL10_TAG, &_pdu.srs_pdu_rel10, &unpack_ul_config_srs_pdu_rel10_value}, \
-  { NFAPI_UL_CONFIG_REQUEST_SRS_PDU_REL13_TAG, &_pdu.srs_pdu_rel13, &unpack_ul_config_srs_pdu_rel13_value},
-#define UL_CONFIG_NULSCH_PDU_UNPACK_FNS(_pdu) \
-  { NFAPI_UL_CONFIG_REQUEST_NULSCH_PDU_REL13_TAG, &_pdu.nulsch_pdu_rel13, &unpack_ul_config_nulsch_pdu_rel13_value},
-#define UL_CONFIG_NRACH_PDU_UNPACK_FNS(_pdu) \
-  { NFAPI_UL_CONFIG_REQUEST_NRACH_PDU_REL13_TAG, &_pdu.nrach_pdu_rel13, &unpack_ul_config_nrach_pdu_rel13_value},
-  nfapi_ul_config_request_body_t *value = (nfapi_ul_config_request_body_t *)tlv;
-
-  if(!(pull8(ppReadPackedMsg, &value->number_of_pdus, end) &&
-       pull8(ppReadPackedMsg, &value->rach_prach_frequency_resources, end) &&
-       pull8(ppReadPackedMsg, &value->srs_present, end)))
-    return 0;
-
-  if(value->number_of_pdus > NFAPI_UL_CONFIG_MAX_PDU) {
-    NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s number of ul config pdus exceed maxium (count:%d max:%d)\n", __FUNCTION__, value->number_of_pdus, NFAPI_UL_CONFIG_MAX_PDU);
-    return 0;
-  }
-
-  if(value->number_of_pdus > 0) {
-    value->ul_config_pdu_list = (nfapi_ul_config_request_pdu_t *)nfapi_p7_allocate(sizeof(nfapi_ul_config_request_pdu_t) * value->number_of_pdus, config);
-
-    if(value->ul_config_pdu_list == NULL) {
-      NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s failed to allocate ul config pdu list (count:%d)\n", __FUNCTION__, value->number_of_pdus);
-      return 0;
-    }
-  } else {
-    value->ul_config_pdu_list = 0;
-  }
-
-  uint16_t i;
-  uint16_t total_number_of_pdus = value->number_of_pdus;
-
-  for(i = 0; i < total_number_of_pdus; ++i) {
-    nfapi_ul_config_request_pdu_t *pdu = &(value->ul_config_pdu_list[i]);
-
-    if(!(pull8(ppReadPackedMsg, &pdu->pdu_type, end) &&
-         pull8(ppReadPackedMsg, &pdu->pdu_size, end)))
-      return 0;
-
-    uint8_t *packedPduEnd = (*ppReadPackedMsg) + pdu->pdu_size - 2;
-
-    if(packedPduEnd > end) {
-      // pdu end is past buffer end
-      return 0;
-    }
-
-    switch(pdu->pdu_type) {
-      case NFAPI_UL_CONFIG_ULSCH_PDU_TYPE: {
-        unpack_tlv_t unpack_fns[] = {
-          UL_CONFIG_ULSCH_PDU_UNPACK_FNS(pdu->ulsch_pdu)
-        };
-        unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0);
-      }
-      break;
-
-      case NFAPI_UL_CONFIG_ULSCH_CQI_RI_PDU_TYPE: {
-        unpack_tlv_t unpack_fns[] = {
-          UL_CONFIG_ULSCH_PDU_UNPACK_FNS(pdu->ulsch_cqi_ri_pdu.ulsch_pdu)
-          UL_CONFIG_CQI_RI_INFO_UNPACK_FNS(pdu->ulsch_cqi_ri_pdu.cqi_ri_information)
-          UL_CONFIG_INIT_TX_PARAMS_UNPACK_FNS(pdu->ulsch_cqi_ri_pdu.initial_transmission_parameters)
-        };
-        unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0);
-      }
-      break;
-
-      case NFAPI_UL_CONFIG_ULSCH_HARQ_PDU_TYPE: {
-        unpack_tlv_t unpack_fns[] = {
-          UL_CONFIG_ULSCH_PDU_UNPACK_FNS(pdu->ulsch_harq_pdu.ulsch_pdu)
-          UL_CONFIG_ULSCH_HARQ_INFO_UNPACK_FNS(pdu->ulsch_harq_pdu.harq_information)
-          UL_CONFIG_INIT_TX_PARAMS_UNPACK_FNS(pdu->ulsch_harq_pdu.initial_transmission_parameters)
-        };
-        unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0);
-      }
-      break;
-
-      case NFAPI_UL_CONFIG_ULSCH_CQI_HARQ_RI_PDU_TYPE: {
-        unpack_tlv_t unpack_fns[] = {
-          UL_CONFIG_ULSCH_PDU_UNPACK_FNS(pdu->ulsch_cqi_harq_ri_pdu.ulsch_pdu)
-          UL_CONFIG_CQI_RI_INFO_UNPACK_FNS(pdu->ulsch_cqi_harq_ri_pdu.cqi_ri_information)
-          UL_CONFIG_ULSCH_HARQ_INFO_UNPACK_FNS(pdu->ulsch_cqi_harq_ri_pdu.harq_information)
-          UL_CONFIG_INIT_TX_PARAMS_UNPACK_FNS(pdu->ulsch_cqi_harq_ri_pdu.initial_transmission_parameters)
-        };
-        unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0);
-      }
-      break;
-
-      case NFAPI_UL_CONFIG_UCI_CQI_PDU_TYPE: {
-        unpack_tlv_t unpack_fns[] = {
-          UL_CONFIG_UCI_UE_INFO_UNPACK_FNS(pdu->uci_cqi_pdu.ue_information)
-          UL_CONFIG_UCI_CQI_INFO_UNPACK_FNS(pdu->uci_cqi_pdu.cqi_information)
-        };
-        unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0);
-      }
-      break;
-
-      case NFAPI_UL_CONFIG_UCI_SR_PDU_TYPE: {
-        unpack_tlv_t unpack_fns[] = {
-          UL_CONFIG_UCI_UE_INFO_UNPACK_FNS(pdu->uci_sr_pdu.ue_information)
-          UL_CONFIG_UCI_SR_INFO_UNPACK_FNS(pdu->uci_sr_pdu.sr_information)
-        };
-        unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0);
-      }
-      break;
-
-      case NFAPI_UL_CONFIG_UCI_HARQ_PDU_TYPE: {
-        unpack_tlv_t unpack_fns[] = {
-          UL_CONFIG_UCI_UE_INFO_UNPACK_FNS(pdu->uci_harq_pdu.ue_information)
-          UL_CONFIG_UCI_HARQ_INFO_UNPACK_FNS(pdu->uci_harq_pdu.harq_information)
-        };
-        unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0);
-      }
-      break;
-
-      case NFAPI_UL_CONFIG_UCI_SR_HARQ_PDU_TYPE: {
-        unpack_tlv_t unpack_fns[] = {
-          UL_CONFIG_UCI_UE_INFO_UNPACK_FNS(pdu->uci_sr_harq_pdu.ue_information)
-          UL_CONFIG_UCI_SR_INFO_UNPACK_FNS(pdu->uci_sr_harq_pdu.sr_information)
-          UL_CONFIG_UCI_HARQ_INFO_UNPACK_FNS(pdu->uci_sr_harq_pdu.harq_information)
-        };
-        unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0);
-      }
-      break;
-
-      case NFAPI_UL_CONFIG_UCI_CQI_HARQ_PDU_TYPE: {
-        unpack_tlv_t unpack_fns[] = {
-          UL_CONFIG_UCI_UE_INFO_UNPACK_FNS(pdu->uci_cqi_harq_pdu.ue_information)
-          UL_CONFIG_UCI_CQI_INFO_UNPACK_FNS(pdu->uci_cqi_harq_pdu.cqi_information)
-          UL_CONFIG_UCI_HARQ_INFO_UNPACK_FNS(pdu->uci_cqi_harq_pdu.harq_information)
-        };
-        unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0);
-      }
-      break;
-
-      case NFAPI_UL_CONFIG_UCI_CQI_SR_PDU_TYPE: {
-        unpack_tlv_t unpack_fns[] = {
-          UL_CONFIG_UCI_UE_INFO_UNPACK_FNS(pdu->uci_cqi_sr_pdu.ue_information)
-          UL_CONFIG_UCI_CQI_INFO_UNPACK_FNS(pdu->uci_cqi_sr_pdu.cqi_information)
-          UL_CONFIG_UCI_SR_INFO_UNPACK_FNS(pdu->uci_cqi_sr_pdu.sr_information)
-        };
-        unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0);
-      }
-      break;
-
-      case NFAPI_UL_CONFIG_UCI_CQI_SR_HARQ_PDU_TYPE: {
-        unpack_tlv_t unpack_fns[] = {
-          UL_CONFIG_UCI_UE_INFO_UNPACK_FNS(pdu->uci_cqi_sr_harq_pdu.ue_information)
-          UL_CONFIG_UCI_CQI_INFO_UNPACK_FNS(pdu->uci_cqi_sr_harq_pdu.cqi_information)
-          UL_CONFIG_UCI_SR_INFO_UNPACK_FNS(pdu->uci_cqi_sr_harq_pdu.sr_information)
-          UL_CONFIG_UCI_HARQ_INFO_UNPACK_FNS(pdu->uci_cqi_sr_harq_pdu.harq_information)
-        };
-        unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0);
-      }
-      break;
-
-      case NFAPI_UL_CONFIG_SRS_PDU_TYPE: {
-        unpack_tlv_t unpack_fns[] = {
-          UL_CONFIG_SRS_PDU_UNPACK_FNS(pdu->srs_pdu)
-        };
-        unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0);
-      }
-      break;
-
-      case NFAPI_UL_CONFIG_HARQ_BUFFER_PDU_TYPE: {
-        unpack_tlv_t unpack_fns[] = {
-          UL_CONFIG_UCI_UE_INFO_UNPACK_FNS(pdu->harq_buffer_pdu.ue_information)
-        };
-        unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0);
-      }
-      break;
-
-      case NFAPI_UL_CONFIG_ULSCH_UCI_CSI_PDU_TYPE: {
-        unpack_tlv_t unpack_fns[] = {
-          UL_CONFIG_ULSCH_PDU_UNPACK_FNS(pdu->ulsch_uci_csi_pdu.ulsch_pdu)
-          UL_CONFIG_UCI_CQI_INFO_UNPACK_FNS(pdu->ulsch_uci_csi_pdu.csi_information)
-        };
-        unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0);
-      }
-      break;
-
-      case NFAPI_UL_CONFIG_ULSCH_UCI_HARQ_PDU_TYPE: {
-        unpack_tlv_t unpack_fns[] = {
-          UL_CONFIG_ULSCH_PDU_UNPACK_FNS(pdu->ulsch_uci_harq_pdu.ulsch_pdu)
-          UL_CONFIG_UCI_HARQ_INFO_UNPACK_FNS(pdu->ulsch_uci_harq_pdu.harq_information)
-        };
-        unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0);
-      }
-      break;
-
-      case NFAPI_UL_CONFIG_ULSCH_CSI_UCI_HARQ_PDU_TYPE: {
-        unpack_tlv_t unpack_fns[] = {
-          UL_CONFIG_ULSCH_PDU_UNPACK_FNS(pdu->ulsch_csi_uci_harq_pdu.ulsch_pdu)
-          UL_CONFIG_UCI_CQI_INFO_UNPACK_FNS(pdu->ulsch_csi_uci_harq_pdu.csi_information)
-          UL_CONFIG_UCI_HARQ_INFO_UNPACK_FNS(pdu->ulsch_csi_uci_harq_pdu.harq_information)
-        };
-        unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0);
-      }
-      break;
-
-      case NFAPI_UL_CONFIG_NULSCH_PDU_TYPE: {
-        unpack_tlv_t unpack_fns[] = {
-          UL_CONFIG_NULSCH_PDU_UNPACK_FNS(pdu->nulsch_pdu)
-        };
-        unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0);
-      }
-      break;
-
-      case NFAPI_UL_CONFIG_NRACH_PDU_TYPE: {
-        unpack_tlv_t unpack_fns[] = {
-          UL_CONFIG_NRACH_PDU_UNPACK_FNS(pdu->nrach_pdu)
-        };
-        unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0);
-      }
-      break;
-    }
-  }
-
-  return 1;
-}
-
-
-static uint8_t unpack_ul_config_request(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p7_codec_config_t *config) {
-  nfapi_ul_config_request_t *pNfapiMsg = (nfapi_ul_config_request_t *)msg;
-  unpack_p7_tlv_t unpack_fns[] = {
-    { NFAPI_UL_CONFIG_REQUEST_BODY_TAG, &pNfapiMsg->ul_config_request_body, &unpack_ul_config_request_body_value},
-  };
-  return (pull16(ppReadPackedMsg, &pNfapiMsg->sfn_sf, end) &&
-          unpack_p7_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, end, config, &pNfapiMsg->vendor_extension));
-}
-
-static uint8_t unpack_hi_dci0_hi_pdu_rel8_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
-  nfapi_hi_dci0_hi_pdu_rel8_t *hi_pdu_rel8 = (nfapi_hi_dci0_hi_pdu_rel8_t *)tlv;
-  return( pull8(ppReadPackedMsg, &hi_pdu_rel8->resource_block_start, end) &&
-          pull8(ppReadPackedMsg, &hi_pdu_rel8->cyclic_shift_2_for_drms, end) &&
-          pull8(ppReadPackedMsg, &hi_pdu_rel8->hi_value, end) &&
-          pull8(ppReadPackedMsg, &hi_pdu_rel8->i_phich, end) &&
-          pull16(ppReadPackedMsg, &hi_pdu_rel8->transmission_power, end));
-}
-
-static uint8_t unpack_hi_dci0_hi_pdu_rel10_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
-  nfapi_hi_dci0_hi_pdu_rel10_t *hi_pdu_rel10 = (nfapi_hi_dci0_hi_pdu_rel10_t *)tlv;
-  return (pull8(ppReadPackedMsg, &hi_pdu_rel10->flag_tb2, end) &&
-          pull8(ppReadPackedMsg, &hi_pdu_rel10->hi_value_2, end));
-}
-
-static uint8_t unpack_hi_dci0_dci_pdu_rel8_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
-  nfapi_hi_dci0_dci_pdu_rel8_t *dci_pdu_rel8 = (nfapi_hi_dci0_dci_pdu_rel8_t *)tlv;
-  return (pull8(ppReadPackedMsg, &dci_pdu_rel8->dci_format, end) &&
-          pull8(ppReadPackedMsg, &dci_pdu_rel8->cce_index, end) &&
-          pull8(ppReadPackedMsg, &dci_pdu_rel8->aggregation_level, end) &&
-          pull16(ppReadPackedMsg, &dci_pdu_rel8->rnti, end) &&
-          pull8(ppReadPackedMsg, &dci_pdu_rel8->resource_block_start, end) &&
-          pull8(ppReadPackedMsg, &dci_pdu_rel8->number_of_resource_block, end) &&
-          pull8(ppReadPackedMsg, &dci_pdu_rel8->mcs_1, end) &&
-          pull8(ppReadPackedMsg, &dci_pdu_rel8->cyclic_shift_2_for_drms, end) &&
-          pull8(ppReadPackedMsg, &dci_pdu_rel8->frequency_hopping_enabled_flag, end) &&
-          pull8(ppReadPackedMsg, &dci_pdu_rel8->frequency_hopping_bits, end) &&
-          pull8(ppReadPackedMsg, &dci_pdu_rel8->new_data_indication_1, end) &&
-          pull8(ppReadPackedMsg, &dci_pdu_rel8->ue_tx_antenna_seleciton, end) &&
-          pull8(ppReadPackedMsg, &dci_pdu_rel8->tpc, end) &&
-          pull8(ppReadPackedMsg, &dci_pdu_rel8->cqi_csi_request, end) &&
-          pull8(ppReadPackedMsg, &dci_pdu_rel8->ul_index, end) &&
-          pull8(ppReadPackedMsg, &dci_pdu_rel8->dl_assignment_index, end) &&
-          pull32(ppReadPackedMsg, &dci_pdu_rel8->tpc_bitmap, end) &&
-          pull16(ppReadPackedMsg, &dci_pdu_rel8->transmission_power, end));
-}
-
-static uint8_t unpack_hi_dci0_dci_pdu_rel10_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
-  nfapi_hi_dci0_dci_pdu_rel10_t *dci_pdu_rel10 = (nfapi_hi_dci0_dci_pdu_rel10_t *)tlv;
-  return (pull8(ppReadPackedMsg, &dci_pdu_rel10->cross_carrier_scheduling_flag, end) &&
-          pull8(ppReadPackedMsg, &dci_pdu_rel10->carrier_indicator, end) &&
-          pull8(ppReadPackedMsg, &dci_pdu_rel10->size_of_cqi_csi_feild, end) &&
-          pull8(ppReadPackedMsg, &dci_pdu_rel10->srs_flag, end) &&
-          pull8(ppReadPackedMsg, &dci_pdu_rel10->srs_request, end) &&
-          pull8(ppReadPackedMsg, &dci_pdu_rel10->resource_allocation_flag, end) &&
-          pull8(ppReadPackedMsg, &dci_pdu_rel10->resource_allocation_type, end) &&
-          pull32(ppReadPackedMsg, &dci_pdu_rel10->resource_block_coding, end) &&
-          pull8(ppReadPackedMsg, &dci_pdu_rel10->mcs_2, end) &&
-          pull8(ppReadPackedMsg, &dci_pdu_rel10->new_data_indication_2, end) &&
-          pull8(ppReadPackedMsg, &dci_pdu_rel10->number_of_antenna_ports, end) &&
-          pull8(ppReadPackedMsg, &dci_pdu_rel10->tpmi, end) &&
-          pull8(ppReadPackedMsg, &dci_pdu_rel10->total_dci_length_including_padding, end) &&
-          pull8(ppReadPackedMsg, &dci_pdu_rel10->n_ul_rb, end));
-}
-
-static uint8_t unpack_hi_dci0_dci_pdu_rel12_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
-  nfapi_hi_dci0_dci_pdu_rel12_t *dci_pdu_rel12 = (nfapi_hi_dci0_dci_pdu_rel12_t *)tlv;
-  return ( pull8(ppReadPackedMsg, &dci_pdu_rel12->pscch_resource, end) &&
-           pull8(ppReadPackedMsg, &dci_pdu_rel12->time_resource_pattern, end));
-}
-
-static uint8_t unpack_hi_dci0_mpdcch_dci_pdu_rel13_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
-  nfapi_hi_dci0_mpdcch_dci_pdu_rel13_t *value = (nfapi_hi_dci0_mpdcch_dci_pdu_rel13_t *)tlv;
-  return (pull8(ppReadPackedMsg, &value->mpdcch_narrowband, end) &&
-          pull8(ppReadPackedMsg, &value->number_of_prb_pairs, end) &&
-          pull8(ppReadPackedMsg, &value->resource_block_assignment, end) &&
-          pull8(ppReadPackedMsg, &value->mpdcch_transmission_type, end) &&
-          pull8(ppReadPackedMsg, &value->start_symbol, end) &&
-          pull8(ppReadPackedMsg, &value->ecce_index, end) &&
-          pull8(ppReadPackedMsg, &value->aggreagation_level, end) &&
-          pull8(ppReadPackedMsg, &value->rnti_type, end) &&
-          pull16(ppReadPackedMsg, &value->rnti, end) &&
-          pull8(ppReadPackedMsg, &value->ce_mode, end) &&
-          pull16(ppReadPackedMsg, &value->drms_scrambling_init, end) &&
-          pull16(ppReadPackedMsg, &value->initial_transmission_sf_io, end) &&
-          pull16(ppReadPackedMsg, &value->transmission_power, end) &&
-          pull8(ppReadPackedMsg, &value->dci_format, end) &&
-          pull8(ppReadPackedMsg, &value->resource_block_start, end) &&
-          pull8(ppReadPackedMsg, &value->number_of_resource_blocks, end) &&
-          pull8(ppReadPackedMsg, &value->mcs, end) &&
-          pull8(ppReadPackedMsg, &value->pusch_repetition_levels, end) &&
-          pull8(ppReadPackedMsg, &value->frequency_hopping_flag, end) &&
-          pull8(ppReadPackedMsg, &value->new_data_indication, end) &&
-          pull8(ppReadPackedMsg, &value->harq_process, end) &&
-          pull8(ppReadPackedMsg, &value->redudency_version, end) &&
-          pull8(ppReadPackedMsg, &value->tpc, end) &&
-          pull8(ppReadPackedMsg, &value->csi_request, end) &&
-          pull8(ppReadPackedMsg, &value->ul_inex, end) &&
-          pull8(ppReadPackedMsg, &value->dai_presence_flag, end) &&
-          pull8(ppReadPackedMsg, &value->dl_assignment_index, end) &&
-          pull8(ppReadPackedMsg, &value->srs_request, end) &&
-          pull8(ppReadPackedMsg, &value->dci_subframe_repetition_number, end) &&
-          pull32(ppReadPackedMsg, &value->tcp_bitmap, end) &&
-          pull8(ppReadPackedMsg, &value->total_dci_length_include_padding, end) &&
-          pull8(ppReadPackedMsg, &value->number_of_tx_antenna_ports, end) &&
-          pullarray16(ppReadPackedMsg, value->precoding_value, NFAPI_MAX_TX_PHYSICAL_ANTENNA_PORTS, value->number_of_tx_antenna_ports, end));
-}
-
-static uint8_t unpack_hi_dci0_npdcch_dci_pdu_rel13_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
-  nfapi_hi_dci0_npdcch_dci_pdu_rel13_t *value = (nfapi_hi_dci0_npdcch_dci_pdu_rel13_t *)tlv;
-  return (pull8(ppReadPackedMsg, &value->ncce_index, end) &&
-          pull8(ppReadPackedMsg, &value->aggregation_level, end) &&
-          pull8(ppReadPackedMsg, &value->start_symbol, end) &&
-          pull16(ppReadPackedMsg, &value->rnti, end) &&
-          pull8(ppReadPackedMsg, &value->scrambling_reinitialization_batch_index, end) &&
-          pull8(ppReadPackedMsg, &value->nrs_antenna_ports_assumed_by_the_ue, end) &&
-          pull8(ppReadPackedMsg, &value->subcarrier_indication, end) &&
-          pull8(ppReadPackedMsg, &value->resource_assignment, end) &&
-          pull8(ppReadPackedMsg, &value->scheduling_delay, end) &&
-          pull8(ppReadPackedMsg, &value->mcs, end) &&
-          pull8(ppReadPackedMsg, &value->redudancy_version, end) &&
-          pull8(ppReadPackedMsg, &value->repetition_number, end) &&
-          pull8(ppReadPackedMsg, &value->new_data_indicator, end) &&
-          pull8(ppReadPackedMsg, &value->dci_subframe_repetition_number, end));
-}
-
-static uint8_t unpack_hi_dci0_request_body_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end, nfapi_p7_codec_config_t *config) {
-  nfapi_hi_dci0_request_body_t *value = (nfapi_hi_dci0_request_body_t *)tlv;
-
-  if(!(pull16(ppReadPackedMsg, &value->sfnsf, end) &&
-       pull8(ppReadPackedMsg, &value->number_of_dci, end) &&
-       pull8(ppReadPackedMsg, &value->number_of_hi, end)))
-    return 0;
-
-  uint8_t totalNumPdus = value->number_of_hi + value->number_of_dci;
-
-  if(totalNumPdus > NFAPI_HI_DCI0_MAX_PDU) {
-    NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s number of dci0 pdu's exceed maxium (count:%d max:%d)\n", __FUNCTION__, totalNumPdus, NFAPI_HI_DCI0_MAX_PDU);
-    return 0;
-  }
-
-  if(totalNumPdus > 0) {
-    value->hi_dci0_pdu_list = (nfapi_hi_dci0_request_pdu_t *)nfapi_p7_allocate(sizeof(nfapi_hi_dci0_request_pdu_t) * totalNumPdus, config);
-
-    if(value->hi_dci0_pdu_list == NULL) {
-      NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s failed to allocate hi dci0 pdu list (count:%d)\n", __FUNCTION__, totalNumPdus);
-      return 0;
-    }
-  } else {
-    value->hi_dci0_pdu_list = 0;
-  }
-
-  uint8_t i;
-
-  for(i = 0; i < totalNumPdus; ++i) {
-    nfapi_hi_dci0_request_pdu_t *pdu = &(value->hi_dci0_pdu_list[i]);
-
-    if(!(pull8(ppReadPackedMsg, &pdu->pdu_type, end) &&
-         pull8(ppReadPackedMsg, &pdu->pdu_size, end)))
-      return 0;
-
-    uint8_t *packedPduEnd = (*ppReadPackedMsg) + pdu->pdu_size - 2;
-
-    if(packedPduEnd > end) {
-      // pdu end if past buffer end
-      NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s pdu size to big %d %d\n", __FUNCTION__, packedPduEnd, end);
-      return 0;
-    }
-
-    switch(pdu->pdu_type) {
-      case NFAPI_HI_DCI0_HI_PDU_TYPE: {
-        unpack_tlv_t unpack_fns[] = {
-          { NFAPI_HI_DCI0_REQUEST_HI_PDU_REL8_TAG, &pdu->hi_pdu.hi_pdu_rel8, &unpack_hi_dci0_hi_pdu_rel8_value},
-          { NFAPI_HI_DCI0_REQUEST_HI_PDU_REL10_TAG, &pdu->hi_pdu.hi_pdu_rel10, &unpack_hi_dci0_hi_pdu_rel10_value},
-        };
-        unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0);
-      }
-      break;
-
-      case NFAPI_HI_DCI0_DCI_PDU_TYPE: {
-        unpack_tlv_t unpack_fns[] = {
-          { NFAPI_HI_DCI0_REQUEST_DCI_PDU_REL8_TAG, &pdu->dci_pdu.dci_pdu_rel8, &unpack_hi_dci0_dci_pdu_rel8_value},
-          { NFAPI_HI_DCI0_REQUEST_DCI_PDU_REL10_TAG, &pdu->dci_pdu.dci_pdu_rel10, &unpack_hi_dci0_dci_pdu_rel10_value},
-          { NFAPI_HI_DCI0_REQUEST_DCI_PDU_REL12_TAG, &pdu->dci_pdu.dci_pdu_rel12, &unpack_hi_dci0_dci_pdu_rel12_value},
-        };
-        unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0);
-      }
-      break;
-
-      case NFAPI_HI_DCI0_EPDCCH_DCI_PDU_TYPE: {
-        unpack_tlv_t unpack_fns[] = {
-          { NFAPI_HI_DCI0_REQUEST_EPDCCH_DCI_PDU_REL8_TAG, &pdu->epdcch_dci_pdu.epdcch_dci_pdu_rel8, &unpack_hi_dci0_dci_pdu_rel8_value},
-          { NFAPI_HI_DCI0_REQUEST_EPDCCH_DCI_PDU_REL10_TAG, &pdu->epdcch_dci_pdu.epdcch_dci_pdu_rel10, &unpack_hi_dci0_dci_pdu_rel10_value},
-          { NFAPI_HI_DCI0_REQUEST_EPDCCH_PARAMETERS_REL11_TAG, &pdu->epdcch_dci_pdu.epdcch_parameters_rel11, &unpack_dl_config_epdcch_params_rel11_value},
-        };
-        unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0);
-      }
-      break;
-
-      case NFAPI_HI_DCI0_MPDCCH_DCI_PDU_TYPE: {
-        unpack_tlv_t unpack_fns[] = {
-          { NFAPI_HI_DCI0_REQUEST_MPDCCH_DCI_PDU_REL13_TAG, &pdu->mpdcch_dci_pdu.mpdcch_dci_pdu_rel13, &unpack_hi_dci0_mpdcch_dci_pdu_rel13_value},
-        };
-        unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0);
-      }
-      break;
-
-      case NFAPI_HI_DCI0_NPDCCH_DCI_PDU_TYPE: {
-        unpack_tlv_t unpack_fns[] = {
-          { NFAPI_HI_DCI0_REQUEST_NPDCCH_DCI_PDU_REL13_TAG, &pdu->npdcch_dci_pdu.npdcch_dci_pdu_rel13, &unpack_hi_dci0_npdcch_dci_pdu_rel13_value},
-        };
-        unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0);
-      }
-      break;
-
-      default: {
-        NFAPI_TRACE(NFAPI_TRACE_ERROR, "FIXME : Invalid pdu type %d \n", pdu->pdu_type );
-      }
-      break;
-    };
-  }
-
-  return 1;
-}
-//unpack_ul_dci_pdu_list_value
-
-static uint8_t unpack_ul_dci_pdu_list_value(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg)
-{
-	nfapi_nr_ul_dci_request_pdus_t* value = (nfapi_nr_ul_dci_request_pdus_t*)msg;
-	for(uint8_t i = 0; i < MAX_DCI_CORESET; ++i)
-	{
-		if(!(pull16(ppReadPackedMsg, &value->pdcch_pdu.pdcch_pdu_rel15.dci_pdu[i].RNTI,  end) &&
-		pull16(ppReadPackedMsg, &value->pdcch_pdu.pdcch_pdu_rel15.dci_pdu[i].ScramblingId, end) &&
-
-		pull16(ppReadPackedMsg, &value->pdcch_pdu.pdcch_pdu_rel15.dci_pdu[i].ScramblingRNTI, end) &&
-		pull8(ppReadPackedMsg, &value->pdcch_pdu.pdcch_pdu_rel15.dci_pdu[i].CceIndex, end) &&
-		pull8(ppReadPackedMsg, &value->pdcch_pdu.pdcch_pdu_rel15.dci_pdu[i].AggregationLevel, end) &&
-		pull8(ppReadPackedMsg, &value->pdcch_pdu.pdcch_pdu_rel15.dci_pdu[i].beta_PDCCH_1_0, end) &&
-
-		pull8(ppReadPackedMsg, &value->pdcch_pdu.pdcch_pdu_rel15.dci_pdu[i].powerControlOffsetSS, end) &&
-		pull16(ppReadPackedMsg, &value->pdcch_pdu.pdcch_pdu_rel15.dci_pdu[i].PayloadSizeBits, end) &&
-		
-		pullarray8(ppReadPackedMsg, value->pdcch_pdu.pdcch_pdu_rel15.dci_pdu[i].Payload, value->pdcch_pdu.pdcch_pdu_rel15.dci_pdu[i].PayloadSizeBits, value->pdcch_pdu.pdcch_pdu_rel15.dci_pdu[i].PayloadSizeBits, end)))
-	
-		return 0;
-	}
-
-	return (pull16(ppReadPackedMsg, &value->PDUType, end) &&
-	   	    pull16(ppReadPackedMsg, &value->PDUSize, end) &&
-			pull16(ppReadPackedMsg, &value->pdcch_pdu.pdcch_pdu_rel15.BWPSize, end) &&
-			pull16(ppReadPackedMsg, &value->pdcch_pdu.pdcch_pdu_rel15.BWPStart, end) &&
-			pull8(ppReadPackedMsg, &value->pdcch_pdu.pdcch_pdu_rel15.SubcarrierSpacing, end) &&
-			pull8(ppReadPackedMsg, &value->pdcch_pdu.pdcch_pdu_rel15.CyclicPrefix, end) &&
-
-			pull8(ppReadPackedMsg, &value->pdcch_pdu.pdcch_pdu_rel15.StartSymbolIndex, end) &&
-			pull8(ppReadPackedMsg, &value->pdcch_pdu.pdcch_pdu_rel15.DurationSymbols, end) &&
-			pullarray8(ppReadPackedMsg, value->pdcch_pdu.pdcch_pdu_rel15.FreqDomainResource, 6, 6, end) &&
-			pull8(ppReadPackedMsg, &value->pdcch_pdu.pdcch_pdu_rel15.CceRegMappingType, end) &&
-
-			pull8(ppReadPackedMsg, &value->pdcch_pdu.pdcch_pdu_rel15.RegBundleSize, end) &&
-			pull8(ppReadPackedMsg, &value->pdcch_pdu.pdcch_pdu_rel15.InterleaverSize, end) &&
-			pull8(ppReadPackedMsg, &value->pdcch_pdu.pdcch_pdu_rel15.CoreSetType, end) &&
-			pull16(ppReadPackedMsg, &value->pdcch_pdu.pdcch_pdu_rel15.ShiftIndex, end) &&
-			pull8(ppReadPackedMsg, &value->pdcch_pdu.pdcch_pdu_rel15.precoderGranularity, end) &&
-			pull16(ppReadPackedMsg, &value->pdcch_pdu.pdcch_pdu_rel15.numDlDci, end));
-		  
-}
-
-static uint8_t unpack_ul_dci_request(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p7_codec_config_t *config) {
-  nfapi_nr_ul_dci_request_t *pNfapiMsg = (nfapi_nr_ul_dci_request_t *)msg;
-
-  if (!(pull16(ppReadPackedMsg, &pNfapiMsg->SFN, end) &&
-        pull16(ppReadPackedMsg, &pNfapiMsg->Slot, end) &&
-        pull8(ppReadPackedMsg, &pNfapiMsg->numPdus, end)
-       ))
-    return 0;
-
-  for(int i=0; i< pNfapiMsg->numPdus; i++) {
-    if (!unpack_ul_dci_pdu_list_value(ppReadPackedMsg, end, &pNfapiMsg->ul_dci_pdu_list[i]))
-      return 0;
-  }
-
-  return 1;
-}
-
-static uint8_t unpack_hi_dci0_request(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p7_codec_config_t *config) {
-  nfapi_hi_dci0_request_t *pNfapiMsg = (nfapi_hi_dci0_request_t *)msg;
-  unpack_p7_tlv_t unpack_fns[] = {
-    { NFAPI_HI_DCI0_REQUEST_BODY_TAG, &pNfapiMsg->hi_dci0_request_body, &unpack_hi_dci0_request_body_value},
-  };
-  return (pull16(ppReadPackedMsg, &pNfapiMsg->sfn_sf, end) &&
-          unpack_p7_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, end, config, &pNfapiMsg->vendor_extension));
-}
-static uint8_t unpack_tx_data_pdu_list_value(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg) {
-  nfapi_nr_pdu_t *pNfapiMsg = (nfapi_nr_pdu_t *)msg;
-
-  if(!(pull32(ppReadPackedMsg, &pNfapiMsg->num_TLV, end) &&
-       pull16(ppReadPackedMsg, &pNfapiMsg->PDU_index, end) &&
-       pull16(ppReadPackedMsg, &pNfapiMsg->PDU_length, end)
-      ))
-    return 0;
-
-  uint16_t i = 0;
-  uint16_t total_number_of_tlvs = pNfapiMsg->num_TLV;
-
-  for(; i < total_number_of_tlvs; ++i) {
-    if (!(pull16(ppReadPackedMsg, &pNfapiMsg->TLVs[i].length, end) &&
-          pull16(ppReadPackedMsg, &pNfapiMsg->TLVs[i].tag, end)))
-      return 0;
-
-    switch(pNfapiMsg->TLVs[i].tag) {
-      case 0: {
-        if(!pullarray32(ppReadPackedMsg, pNfapiMsg->TLVs[i].value.direct, 16384, pNfapiMsg->TLVs[i].length, end))
-          return 0;
-
-        break;
-      }
-
-      case 1: {
-        if(!pullarray32(ppReadPackedMsg, pNfapiMsg->TLVs[i].value.ptr, pNfapiMsg->TLVs[i].length, pNfapiMsg->TLVs[i].length, end))
-          return 0;
-
-        break;
-      }
-
-      default: {
-        NFAPI_TRACE(NFAPI_TRACE_ERROR, "FIXME : Invalid tag value %d \n", pNfapiMsg->TLVs[i].tag );
-        break;
-      }
-    }
-  }
-
-  return 1;
-}
-
-static uint8_t unpack_tx_data_request(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p7_codec_config_t *config) {
-  nfapi_nr_tx_data_request_t *pNfapiMsg = (nfapi_nr_tx_data_request_t *)msg;
-
-  if(!(pull16(ppReadPackedMsg, &pNfapiMsg->SFN, end) &&
-       pull16(ppReadPackedMsg, &pNfapiMsg->Slot, end) &&
-       pull16(ppReadPackedMsg, &pNfapiMsg->Number_of_PDUs, end)))
-    return 0;
-
-  for(int i=0; i< pNfapiMsg->Number_of_PDUs; i++) {
-    if (!unpack_tx_data_pdu_list_value(ppReadPackedMsg, end, &pNfapiMsg->pdu_list[i]))
-      return 0;
-  }
-
-  return 1;
-}
-
-static uint8_t unpack_tx_request(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p7_codec_config_t *config) {
-  uint8_t proceed = 1;
-  nfapi_tx_request_t *pNfapiMsg = (nfapi_tx_request_t *)msg;
-
-  if(pull16(ppReadPackedMsg, &pNfapiMsg->sfn_sf, end) == 0)
-    return 0;
-
-  while (((uint8_t *)(*ppReadPackedMsg) < end) && proceed) {
-    nfapi_tl_t generic_tl;
-
-    if(unpack_tl(ppReadPackedMsg, &generic_tl, end) == 0)
-      return 0;
-
-    switch(generic_tl.tag) {
-      case NFAPI_TX_REQUEST_BODY_TAG: {
-        pNfapiMsg->tx_request_body.tl = generic_tl;
-
-        if( pull16(ppReadPackedMsg, &pNfapiMsg->tx_request_body.number_of_pdus, end) == 0)
-          return 0;
-
-        if(pNfapiMsg->tx_request_body.number_of_pdus > NFAPI_TX_MAX_PDU) {
-          NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s number of tx pdu's exceed maxium (count:%d max:%d)\n", __FUNCTION__, pNfapiMsg->tx_request_body.number_of_pdus, NFAPI_TX_MAX_PDU);
-          return 0;
-        }
-
-        if(pNfapiMsg->tx_request_body.number_of_pdus > 0) {
-          pNfapiMsg->tx_request_body.tx_pdu_list = (nfapi_tx_request_pdu_t *)nfapi_p7_allocate(sizeof(nfapi_tx_request_pdu_t) * pNfapiMsg->tx_request_body.number_of_pdus, config);
-
-          if(pNfapiMsg->tx_request_body.tx_pdu_list == NULL) {
-            NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s failed to allocate tx  pdu list (count:%d)\n", __FUNCTION__, pNfapiMsg->tx_request_body.number_of_pdus);
-            return 0;
-          }
-        } else {
-          pNfapiMsg->tx_request_body.tx_pdu_list = 0;
-        }
-
-        uint16_t i;
-        uint16_t totalNumPdus = pNfapiMsg->tx_request_body.number_of_pdus;
-
-        for(i = 0; i < totalNumPdus; ++i) {
-          nfapi_tx_request_pdu_t *pdu = &(pNfapiMsg->tx_request_body.tx_pdu_list[i]);
-
-          if (pdu) {
-            uint16_t length = 0;
-            uint16_t index = 0;
-
-            if(!(pull16(ppReadPackedMsg, &length, end) &&
-                 pull16(ppReadPackedMsg, &index, end)))
-              return 0;
-
-            pdu->pdu_length = length;
-            pdu->pdu_index = index;
-            // TODO : May need to rethink this bit
-            pdu->num_segments = 1;
-            pdu->segments[0].segment_length = pdu->pdu_length;
-            pdu->segments[0].segment_data = nfapi_p7_allocate(pdu->pdu_length, config);
-
-            if(pdu->segments[0].segment_data) {
-              if(!pullarray8(ppReadPackedMsg, pdu->segments[0].segment_data, pdu->segments[0].segment_length, pdu->segments[0].segment_length, end))
-                return 0;
-
-              if (pdu->segments[0].segment_length == 3) {
-                NFAPI_TRACE(NFAPI_TRACE_INFO, "%s() BCH? segment_data:%x %x %x\n", __FUNCTION__,
-                            pdu->segments[0].segment_data[0],
-                            pdu->segments[0].segment_data[1],
-                            pdu->segments[0].segment_data[2]
-                           );
-              }
-            } else {
-              NFAPI_TRACE(NFAPI_TRACE_ERROR, "unpack_tx_request: Failed to allocate pdu (len:%d) %d/%d %d\n", pdu->pdu_length, totalNumPdus, i, pdu->pdu_index);
-            }
-          } else {
-            NFAPI_TRACE(NFAPI_TRACE_ERROR, "NULL pdu\n");
-          }
-        }
-      }
-      break;
-
-      default: {
-        NFAPI_TRACE(NFAPI_TRACE_ERROR, "unpack_tx_request FIXME : Invalid pdu type %d \n", generic_tl.tag );
-      }
-      break;
-    };
-  }
-
-  return 1;
-}
-
-//UNPACK NR UPLINK INDICATION FUNCTIONS 
-
-//SLOT INDICATION
-
-static uint8_t unpack_nr_slot_indication(uint8_t **ppReadPackedMsg, uint8_t *end, nfapi_nr_slot_indication_scf_t *msg, nfapi_p7_codec_config_t* config)
-{	
-	nfapi_nr_slot_indication_scf_t *pNfapiMsg = (nfapi_nr_slot_indication_scf_t*)msg;
-	
-	if (!(pull16(ppReadPackedMsg, &pNfapiMsg->sfn , end) &&
-		pull16(ppReadPackedMsg, &pNfapiMsg->slot , end)
-		))
-			return 0;
-
-return 1;
-}
-
-//RX DATA INDICATION 
-
-static uint8_t unpack_nr_rx_data_indication_body(void* tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
-{
-	nfapi_nr_rx_data_pdu_t* value = (nfapi_nr_rx_data_pdu_t*)tlv;
-
-	if(!(pull32(ppReadPackedMsg, &value->handle, end) &&
-	 	 pull16(ppReadPackedMsg, &value->rnti, end) &&
-		 pull8(ppReadPackedMsg, &value->harq_id, end) &&
-		 pull16(ppReadPackedMsg, &value->pdu_length, end) &&
-		 pull8(ppReadPackedMsg, &value->ul_cqi, end) &&
-		 pull16(ppReadPackedMsg, &value->timing_advance, end) && 
-		 pull16(ppReadPackedMsg, &value->rssi, end) 
-		 ))
-		  return 0;
-	return 1;
-}
-
-
-static uint8_t unpack_nr_rx_data_indication(uint8_t **ppReadPackedMsg, uint8_t *end, nfapi_nr_rx_data_indication_t *msg, nfapi_p7_codec_config_t* config)
-{	
-	nfapi_nr_rx_data_indication_t *pNfapiMsg = (nfapi_nr_rx_data_indication_t*)msg;
-	
-	if (!(pull16(ppReadPackedMsg, &pNfapiMsg->sfn , end) &&
-		pull16(ppReadPackedMsg, &pNfapiMsg->slot , end) &&
-		pull16(ppReadPackedMsg, &pNfapiMsg->number_of_pdus, end)
-		))
-			return 0;
-
-	for(int i=0; i<pNfapiMsg->number_of_pdus;i++)	
-	{
-		if(!unpack_nr_rx_data_indication_body(pNfapiMsg->pdu_list, ppReadPackedMsg, end))
-		return 0;
-	}
-
-return 1;
-}
-
-//NR CRC INDICATION
-
-static uint8_t unpack_nr_crc_indication_body(nfapi_nr_crc_t* value, uint8_t **ppReadPackedMsg, uint8_t *end)
-{	
-	if(!(pull32(ppReadPackedMsg, &value->handle, end) &&
-	 	 pull16(ppReadPackedMsg, &value->rnti, end) &&
-		 pull8(ppReadPackedMsg, &value->harq_id, end) &&
-		 pull8(ppReadPackedMsg, &value->tb_crc_status, end) &&
-		 pull16(ppReadPackedMsg, &value->num_cb, end) &&
-		 //pullarray8(ppReadPackedMsg, value->cb_crc_status, (int)(value->num_cb / 8) + 1, (int)(value->num_cb / 8) + 1, end) && //length is ceil(NumCb/8)
-		 pull8(ppReadPackedMsg, &value->ul_cqi, end) && 
-		 pull16(ppReadPackedMsg, &value->timing_advance, end) &&
-		 pull16(ppReadPackedMsg, &value->rssi, end)
-		 ))
-		  return 0;
-
-	//memcpy((nfapi_nr_crc_t *)tlv,value,sizeof(nfapi_nr_crc_t));
-
-	return 1;
-}
-
-static uint8_t unpack_nr_crc_indication(uint8_t **ppReadPackedMsg, uint8_t *end, nfapi_nr_crc_indication_t *msg, nfapi_p7_codec_config_t* config)
-{
-	nfapi_nr_crc_indication_t *pNfapiMsg = (nfapi_nr_crc_indication_t *) msg;
-	// pNfapiMsg = (nfapi_nr_crc_indication_t *) malloc(sizeof(nfapi_nr_crc_indication_t));
-	// pNfapiMsg->crc_list = (nfapi_nr_crc_t *) malloc(sizeof(nfapi_nr_crc_t));
-	
-	if (!(pull16(ppReadPackedMsg, &pNfapiMsg->sfn, end) &&
-		pull16(ppReadPackedMsg, &pNfapiMsg->slot, end) &&
-		pull16(ppReadPackedMsg, &pNfapiMsg->number_crcs, end)
-		))
-		return 0;
-
-	for(int i=0; i<pNfapiMsg->number_crcs;i++)	
-	{
-		if(!unpack_nr_crc_indication_body(pNfapiMsg->crc_list,ppReadPackedMsg,end))
-		//if(!unpack_nr_crc_indication_body(value,ppReadPackedMsg,end))
-		return 0;
-	}
-
-return 1;
-}
-
-//SRS INDICATION
-
-static uint8_t unpack_nr_srs_indication_body(void* tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
-{
-	nfapi_nr_srs_indication_pdu_t* value = (nfapi_nr_srs_indication_pdu_t*)tlv;
-
-	if(!(pull32(ppReadPackedMsg, &value->handle, end) &&
-	 	 pull16(ppReadPackedMsg, &value->rnti, end) &&
-		 pull16(ppReadPackedMsg, &value->timing_advance, end) &&
-		 pull8(ppReadPackedMsg, &value->num_symbols, end) &&
-		 pull8(ppReadPackedMsg, &value->wide_band_snr, end) &&
-		 pull8(ppReadPackedMsg, &value->num_reported_symbols, end) && 
-		 pull16(ppReadPackedMsg, &value->reported_symbol_list->num_rbs, end)
-		 ))
-		  return 0;
-	for(int i = 0; i < value->reported_symbol_list->num_rbs; i++)
-	{
-		if(!(pull8(ppReadPackedMsg, &value->reported_symbol_list->rb_list->rb_snr, end)
-			))
-			return 0;
-	}
-	return 1;
-}
-
-static uint8_t unpack_nr_srs_indication(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p7_codec_config_t* config)
-{
-	nfapi_nr_srs_indication_t *pNfapiMsg = (nfapi_nr_srs_indication_t*)msg;
-
-	if (!(pull16(ppReadPackedMsg,&pNfapiMsg->sfn , end) &&
-		pull16(ppReadPackedMsg,&pNfapiMsg->slot , end) &&
-		pull8(ppReadPackedMsg,&pNfapiMsg->number_of_pdus, end)
-		))
-			return 0;
-
-	for(int i=0; i<pNfapiMsg->number_of_pdus;i++)	
-	{
-		if(!unpack_nr_srs_indication_body(&pNfapiMsg->pdu_list,ppReadPackedMsg,end))
-		return 0;
-	}
-
-return 1;
-}
-
-//NR RACH
-
-static uint8_t unpack_nr_rach_indication_body(nfapi_nr_prach_indication_pdu_t* tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
-{
-	nfapi_nr_prach_indication_pdu_t* value = (nfapi_nr_prach_indication_pdu_t*)tlv;
-
-	if(!(pull16(ppReadPackedMsg, &value->phy_cell_id, end) &&
-	 	 pull8(ppReadPackedMsg, &value->symbol_index, end) &&
-		 pull8(ppReadPackedMsg, &value->slot_index, end) &&
-		 pull8(ppReadPackedMsg, &value->freq_index, end) &&
-		 pull8(ppReadPackedMsg, &value->avg_rssi, end) &&
-		 pull8(ppReadPackedMsg, &value->avg_snr, end) && 
-		 pull8(ppReadPackedMsg, &value->num_preamble, end)
-		 ))
-		  return 0;
-	value->preamble_list = (nfapi_nr_prach_indication_preamble_t*) malloc(sizeof(nfapi_nr_prach_indication_preamble_t) * value->num_preamble);
-	for(int i = 0; i < value->num_preamble; i++)
-	{
-		if(!(pull8(ppReadPackedMsg, &value->preamble_list->preamble_index, end) &&
-			pull16(ppReadPackedMsg, &value->preamble_list->timing_advance, end) &&
-			pull32(ppReadPackedMsg, &value->preamble_list->preamble_pwr, end)
-			))
-			return 0;
-	}
-	return 1;
-}
-
-static uint8_t unpack_nr_rach_indication(uint8_t **ppReadPackedMsg, uint8_t *end, nfapi_nr_rach_indication_t* msg, nfapi_p7_codec_config_t* config) {
-
-	nfapi_nr_rach_indication_t *pNfapiMsg = (nfapi_nr_rach_indication_t*)msg;
-	if (!(pull16(ppReadPackedMsg, &pNfapiMsg->sfn , end) &&
-		pull16(ppReadPackedMsg, &pNfapiMsg->slot , end) &&
-		pull8(ppReadPackedMsg, &pNfapiMsg->number_of_pdus, end)
-		))
-			return 0;
-	pNfapiMsg->pdu_list = (nfapi_nr_prach_indication_pdu_t*) malloc(sizeof(nfapi_nr_prach_indication_pdu_t) * pNfapiMsg->number_of_pdus);
-	for(int i=0; i< pNfapiMsg->number_of_pdus;i++)	
-	{
-		if(!unpack_nr_rach_indication_body(pNfapiMsg->pdu_list,ppReadPackedMsg,end))
-		return 0;
-	}
-
-return 1;
-}
-
-//NR UCI 
-
-static uint8_t unpack_nr_uci_pucch_0_1(nfapi_nr_uci_pucch_pdu_format_0_1_t* tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
-	nfapi_nr_uci_pucch_pdu_format_0_1_t* value = (nfapi_nr_uci_pucch_pdu_format_0_1_t*)tlv;
-
-	// uint8_t *ptr = *ppReadPackedMsg;
-	// printf("\n Read P7 message uci_0_1 indication unpack: ");
-	// while(ptr < end){
-	// 	printf(" %d ", *ptr);
-	// 	ptr++;
-	// }
-	// printf("\n");
-
-	if(!(pull8(ppReadPackedMsg, &value->pduBitmap, end) &&
-	 	 pull32(ppReadPackedMsg, &value->handle, end) &&
-		 pull16(ppReadPackedMsg, &value->rnti, end) &&
-		 pull8(ppReadPackedMsg, &value->pucch_format, end) &&
-		 pull8(ppReadPackedMsg, &value->ul_cqi, end) &&
-		 pull16(ppReadPackedMsg, &value->timing_advance, end) && 
-		 pull16(ppReadPackedMsg, &value->rssi, end)
-		 ))
-		  return 0;
-	if (value->pduBitmap & 0x01) { //SR
-		value->sr = (nfapi_nr_sr_pdu_0_1_t*) malloc(sizeof(nfapi_nr_sr_pdu_0_1_t));
-		if(!(pull8(ppReadPackedMsg, &value->sr->sr_indication, end) &&
-	 	 pull8(ppReadPackedMsg, &value->sr->sr_confidence_level, end) 
-		 ))
-		  return 0;
-	}
-
-	if (((value->pduBitmap >> 1) & 0x01)) { //HARQ
-		value->harq = (nfapi_nr_harq_pdu_0_1_t*) malloc(sizeof(nfapi_nr_harq_pdu_0_1_t));
-		if(!(pull8(ppReadPackedMsg, &value->harq->num_harq, end) &&
-	 	 pull8(ppReadPackedMsg, &value->harq->harq_confidence_level, end) 
-		 ))
-			return 0;
-		value->harq->harq_list = (nfapi_nr_harq_t*) malloc(sizeof(nfapi_nr_harq_t*) * value->harq->num_harq);
-		for(int i=0; i<value->harq->num_harq;i++)	
-		{
-			if(!(pull8(ppReadPackedMsg, &value->harq->harq_list->harq_value, end) 
-			))
-			return 0;
-		}
-	}
-
-	return 1;
-}
-
-
-static uint8_t unpack_nr_uci_pucch_2_3_4(nfapi_nr_uci_pucch_pdu_format_2_3_4_t* tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
-	nfapi_nr_uci_pucch_pdu_format_2_3_4_t* value = (nfapi_nr_uci_pucch_pdu_format_2_3_4_t*) tlv;
-
-	if(!(pull8(ppReadPackedMsg, &value->pduBitmap, end) &&
-	 	 pull32(ppReadPackedMsg, &value->handle, end) &&
-		 pull16(ppReadPackedMsg, &value->rnti, end) &&
-		 pull8(ppReadPackedMsg, &value->pucch_format, end) &&
-		 pull8(ppReadPackedMsg, &value->ul_cqi, end) &&
-		 pull16(ppReadPackedMsg, &value->timing_advance, end) && 
-		 pull16(ppReadPackedMsg, &value->rssi, end)
-		 ))
-		  return 0;
-	if (value->pduBitmap & 0x01) { //SR
-		if(!(pull16(ppReadPackedMsg, &value->sr.sr_bit_len, end)))
-			return 0; 
-
-		value->sr.sr_payload = (uint8_t*) malloc(sizeof(uint8_t) * ((value->sr.sr_bit_len/8)));
-
-	 	if(!(pullarray8(ppReadPackedMsg, &value->sr.sr_payload[0], (int)(value->sr.sr_bit_len / 8), (int)(value->sr.sr_bit_len / 8), end)))
-		  	return 0;
-	}
-
-	if (((value->pduBitmap >> 1) & 0x01)) { //HARQ
-		if(!(pull8(ppReadPackedMsg, &value->harq.harq_crc, end)) &&
-			(pull16(ppReadPackedMsg, &value->harq.harq_bit_len, end)))
-			return 0; 
-		
-		value->harq.harq_payload = (uint8_t*) malloc(sizeof(uint8_t) * ((value->harq.harq_bit_len/8 )));
-
-	 	if(!(pullarray8(ppReadPackedMsg, value->harq.harq_payload, (int)(value->harq.harq_bit_len / 8), (int)(value->harq.harq_bit_len / 8), end)))
-			return 0;
-	}
-
-	if (((value->pduBitmap >> 2) & 0x01)) { //CSI-1
-		if(!(pull8(ppReadPackedMsg, &value->csi_part1.csi_part1_crc, end)) &&
-			(pull16(ppReadPackedMsg, &value->csi_part1.csi_part1_bit_len, end)))
-			return 0; 
-
-		value->csi_part1.csi_part1_payload = (uint8_t*) malloc(sizeof(uint8_t) * ((value->csi_part1.csi_part1_bit_len/8)));
-
-//		if(!(pullarray8(ppReadPackedMsg, value->csi_part1.csi_part1_payload, (int)(value->csi_part1.csi_part1_bit_len / 8), (int)(value->csi_part1.csi_part1_bit_len / 8), end)))
-//			return 0;
-	}
-
-	if (((value->pduBitmap >> 3) & 0x01)) { //CSI-2
-		if(!(pull8(ppReadPackedMsg, &value->csi_part2.csi_part2_crc, end)) &&
-			(pull16(ppReadPackedMsg, &value->csi_part2.csi_part2_bit_len, end)))
-			return 0; 
-
-		value->csi_part2.csi_part2_payload = (uint8_t*) malloc(sizeof(uint8_t) * ((value->csi_part2.csi_part2_bit_len/8 )));
-
-		if(!(pullarray8(ppReadPackedMsg, value->csi_part2.csi_part2_payload, (int)(value->csi_part2.csi_part2_bit_len / 8) , (int)(value->csi_part2.csi_part2_bit_len / 8) , end)))
-			return 0;
-	}
-
-	return 1;
-}
-
-static uint8_t unpack_nr_uci_indication_body(nfapi_nr_uci_t* value, uint8_t **ppReadPackedMsg, uint8_t *end)
-{
-	if(!(pull16(ppReadPackedMsg, &value->pdu_type, end) &&
-		pull16(ppReadPackedMsg, &value->pdu_size, end)
-		))
-		return 0;
-	
-	switch (value->pdu_type) {
-      case NFAPI_NR_UCI_PUSCH_PDU_TYPE:
-        printf("Unhandled NFAPI_NR_UCI_PUSCH_PDU_TYPE \n");
-        break;
-
-      case NFAPI_NR_UCI_FORMAT_0_1_PDU_TYPE: {
-        nfapi_nr_uci_pucch_pdu_format_0_1_t* uci_pdu = &value->pucch_pdu_format_0_1;
-        unpack_nr_uci_pucch_0_1(uci_pdu, ppReadPackedMsg, end);
-		break;
-        }
-      case NFAPI_NR_UCI_FORMAT_2_3_4_PDU_TYPE: {
-        nfapi_nr_uci_pucch_pdu_format_2_3_4_t *uci_pdu = &value->pucch_pdu_format_2_3_4;
-        unpack_nr_uci_pucch_2_3_4(uci_pdu, ppReadPackedMsg, end);
-        break;
-    	}
-	}	
-
-	return 1;	
-}
-
-static uint8_t unpack_nr_uci_indication(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p7_codec_config_t* config)
-{
-	nfapi_nr_uci_indication_t *pNfapiMsg = (nfapi_nr_uci_indication_t*)msg;
-
-	if (!(pull16(ppReadPackedMsg, &pNfapiMsg->sfn , end) &&
-		pull16(ppReadPackedMsg, &pNfapiMsg->slot , end) &&
-		pull16(ppReadPackedMsg, &pNfapiMsg->num_ucis, end)
-		))
-			return 0;
-
-	for(int i=0; i<pNfapiMsg->num_ucis;i++)	
-	{
-		if(!unpack_nr_uci_indication_body(pNfapiMsg->uci_list,ppReadPackedMsg,end))
-		return 0;
-	}
-
-return 1;
-}
-
-static uint8_t unpack_ue_release_request(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p7_codec_config_t *config) {
-  uint8_t proceed = 1;
-  nfapi_ue_release_request_t *pNfapiMsg = (nfapi_ue_release_request_t *)msg;
-
-  if(pull16(ppReadPackedMsg, &pNfapiMsg->sfn_sf, end) == 0)
-    return 0;
-
-  while (((uint8_t *)(*ppReadPackedMsg) < end) && proceed) {
-    nfapi_tl_t generic_tl;
-
-    if(unpack_tl(ppReadPackedMsg, &generic_tl, end) == 0)
-      return 0;
-
-    switch(generic_tl.tag) {
-      case NFAPI_UE_RELEASE_BODY_TAG: {
-        pNfapiMsg->ue_release_request_body.tl = generic_tl;
-
-        if( pull16(ppReadPackedMsg, &pNfapiMsg->ue_release_request_body.number_of_TLVs, end) == 0)
-          return 0;
-
-        if(pNfapiMsg->ue_release_request_body.number_of_TLVs > NFAPI_RELEASE_MAX_RNTI) {
-          NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s number of relese rnti's exceed maxium (count:%d max:%d)\n", __FUNCTION__, pNfapiMsg->ue_release_request_body.number_of_TLVs, NFAPI_RELEASE_MAX_RNTI);
-          return 0;
-        } else {
-          uint8_t j;
-          uint16_t num = pNfapiMsg->ue_release_request_body.number_of_TLVs;
-
-          for(j = 0; j < num; ++j) {
-            if(pull16(ppReadPackedMsg, &pNfapiMsg->ue_release_request_body.ue_release_request_TLVs_list[j].rnti, end) == 0) {
-              return 0;
-            }
-          }
-        }
-      }
-      break;
-
-      default: {
-        NFAPI_TRACE(NFAPI_TRACE_ERROR, "unpack_ue_release_request FIXME : Invalid type %d \n", generic_tl.tag );
-      }
-      break;
-    };
-  }
-
-  return 1;
-}
-
-static uint8_t unpack_harq_indication_tdd_harq_data_bundling(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
-  nfapi_harq_indication_tdd_harq_data_bundling_t *value = (nfapi_harq_indication_tdd_harq_data_bundling_t *)tlv;
-  return (pull8(ppReadPackedMsg, &value->value_0, end) &&
-          pull8(ppReadPackedMsg, &value->value_1, end));
-}
-
-static uint8_t unpack_harq_indication_tdd_harq_data_multiplexing(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
-  nfapi_harq_indication_tdd_harq_data_multiplexing_t *value = (nfapi_harq_indication_tdd_harq_data_multiplexing_t *)tlv;
-  return (pull8(ppReadPackedMsg, &value->value_0, end) &&
-          pull8(ppReadPackedMsg, &value->value_1, end) &&
-          pull8(ppReadPackedMsg, &value->value_2, end) &&
-          pull8(ppReadPackedMsg, &value->value_3, end));
-}
-static uint8_t unpack_harq_indication_tdd_harq_data_special_bundling(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
-  nfapi_harq_indication_tdd_harq_data_special_bundling_t *value = (nfapi_harq_indication_tdd_harq_data_special_bundling_t *)tlv;
-  return ( pull8(ppReadPackedMsg, &value->value_0, end));
-}
-static uint8_t unpack_harq_indication_tdd_harq_data(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
-  nfapi_harq_indication_tdd_harq_data_t *value = (nfapi_harq_indication_tdd_harq_data_t *)tlv;
-  return  (pull8(ppReadPackedMsg, &value->value_0, end));
-}
-
-static uint8_t unpack_harq_indication_tdd_rel8_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
-  nfapi_harq_indication_tdd_rel8_t *value = (nfapi_harq_indication_tdd_rel8_t *)tlv;
-
-  if(!(pull8(ppReadPackedMsg, &value->mode, end) &&
-       pull8(ppReadPackedMsg, &value->number_of_ack_nack, end)))
-    return 0;
-
-  uint8_t result = 0;
-
-  switch(value->mode) {
-    case NFAPI_HARQ_INDICATION_TDD_HARQ_ACK_NACK_FORMAT_BUNDLING:
-      result = unpack_harq_indication_tdd_harq_data_bundling(&value->harq_data.bundling, ppReadPackedMsg, end);
-      break;
-
-    case NFAPI_HARQ_INDICATION_TDD_HARQ_ACK_NACK_FORMAT_MULIPLEXING:
-      result = unpack_harq_indication_tdd_harq_data_multiplexing(&value->harq_data.multiplex, ppReadPackedMsg, end);
-      break;
-
-    case NFAPI_HARQ_INDICATION_TDD_HARQ_ACK_NACK_FORMAT_SPECIAL_BUNDLING:
-      result = unpack_harq_indication_tdd_harq_data_special_bundling(&value->harq_data.special_bundling, ppReadPackedMsg, end);
-      break;
-
-    case NFAPI_HARQ_INDICATION_TDD_HARQ_ACK_NACK_FORMAT_FORMAT_3:
-    case NFAPI_HARQ_INDICATION_TDD_HARQ_ACK_NACK_FORMAT_CHANNEL_SELECTION:
-      result = 1;
-      break;
-
-    default:
-      // TODO add error message
-      return 0;
-      break;
-  }
-
-  return result;
-}
-
-static uint8_t unpack_harq_indication_tdd_rel9_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
-  nfapi_harq_indication_tdd_rel9_t *value = (nfapi_harq_indication_tdd_rel9_t *)tlv;
-
-  if(!(pull8(ppReadPackedMsg, &value->mode, end) &&
-       pull8(ppReadPackedMsg, &value->number_of_ack_nack, end)))
-    return 0;
-
-  if(value->number_of_ack_nack > NFAPI_MAX_NUMBER_ACK_NACK_TDD) {
-    // TODO : add error message
-    return 0;
-  }
-
-  uint16_t idx = 0;
-
-  for(idx = 0; idx < value->number_of_ack_nack; ++idx) {
-    uint8_t result = 0;
-
-    switch(value->mode) {
-      case NFAPI_HARQ_INDICATION_TDD_HARQ_ACK_NACK_FORMAT_BUNDLING:
-        result = unpack_harq_indication_tdd_harq_data(&value->harq_data[idx].bundling, ppReadPackedMsg, end);
-        break;
-
-      case NFAPI_HARQ_INDICATION_TDD_HARQ_ACK_NACK_FORMAT_MULIPLEXING:
-        result = unpack_harq_indication_tdd_harq_data(&value->harq_data[idx].multiplex, ppReadPackedMsg, end);
-        break;
-
-      case NFAPI_HARQ_INDICATION_TDD_HARQ_ACK_NACK_FORMAT_SPECIAL_BUNDLING:
-        result = unpack_harq_indication_tdd_harq_data_special_bundling(&value->harq_data[idx].special_bundling, ppReadPackedMsg, end);
-        break;
-
-      case NFAPI_HARQ_INDICATION_TDD_HARQ_ACK_NACK_FORMAT_CHANNEL_SELECTION:
-        result = unpack_harq_indication_tdd_harq_data(&value->harq_data[idx].channel_selection, ppReadPackedMsg, end);
-        break;
-
-      case NFAPI_HARQ_INDICATION_TDD_HARQ_ACK_NACK_FORMAT_FORMAT_3:
-        result = unpack_harq_indication_tdd_harq_data(&value->harq_data[idx].format_3, ppReadPackedMsg, end);
-        break;
-
-      default:
-        // TODO add error message
-        return 0;
-        break;
-    }
-
-    if(result == 0)
-      return 0;
-  }
-
-  return 1;
-}
-
-static uint8_t unpack_harq_indication_tdd_rel13_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
-  nfapi_harq_indication_tdd_rel13_t *value = (nfapi_harq_indication_tdd_rel13_t *)tlv;
-
-  if(!(pull8(ppReadPackedMsg, &value->mode, end) &&
-       pull16(ppReadPackedMsg, &value->number_of_ack_nack, end)))
-    return 0;
-
-  if(value->number_of_ack_nack > NFAPI_MAX_NUMBER_ACK_NACK_TDD) {
-    // TODO : add error message
-    return 0;
-  }
-
-  uint16_t idx = 0;
-
-  for(idx = 0; idx < value->number_of_ack_nack; ++idx) {
-    uint8_t result = 0;
-
-    switch(value->mode) {
-      case NFAPI_HARQ_INDICATION_TDD_HARQ_ACK_NACK_FORMAT_BUNDLING:
-        result = unpack_harq_indication_tdd_harq_data(&value->harq_data[idx].bundling, ppReadPackedMsg, end);
-        break;
-
-      case NFAPI_HARQ_INDICATION_TDD_HARQ_ACK_NACK_FORMAT_MULIPLEXING:
-        result = unpack_harq_indication_tdd_harq_data(&value->harq_data[idx].multiplex, ppReadPackedMsg, end);
-        break;
-
-      case NFAPI_HARQ_INDICATION_TDD_HARQ_ACK_NACK_FORMAT_SPECIAL_BUNDLING:
-        result = unpack_harq_indication_tdd_harq_data_special_bundling(&value->harq_data[idx].special_bundling, ppReadPackedMsg, end);
-        break;
-
-      case NFAPI_HARQ_INDICATION_TDD_HARQ_ACK_NACK_FORMAT_CHANNEL_SELECTION:
-        result = unpack_harq_indication_tdd_harq_data(&value->harq_data[idx].channel_selection, ppReadPackedMsg, end);
-        break;
-
-      case NFAPI_HARQ_INDICATION_TDD_HARQ_ACK_NACK_FORMAT_FORMAT_3:
-        result = unpack_harq_indication_tdd_harq_data(&value->harq_data[idx].format_3, ppReadPackedMsg, end);
-        break;
-
-      case NFAPI_HARQ_INDICATION_TDD_HARQ_ACK_NACK_FORMAT_FORMAT_4:
-        result = unpack_harq_indication_tdd_harq_data(&value->harq_data[idx].format_4, ppReadPackedMsg, end);
-        break;
-
-      case NFAPI_HARQ_INDICATION_TDD_HARQ_ACK_NACK_FORMAT_FORMAT_5:
-        result = unpack_harq_indication_tdd_harq_data(&value->harq_data[idx].format_5, ppReadPackedMsg, end);
-        break;
-
-      default:
-        // TODO add error message
-        return 0;
-        break;
-    }
-
-    if(result == 0)
-      return 0;
-  }
-
-  return 1;
-}
-
-static uint8_t unpack_harq_indication_fdd_rel8_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
-  nfapi_harq_indication_fdd_rel8_t *value = (nfapi_harq_indication_fdd_rel8_t *)tlv;
-  return (pull8(ppReadPackedMsg, &value->harq_tb1, end) &&
-          pull8(ppReadPackedMsg, &value->harq_tb2, end));
-}
-
-static uint8_t unpack_harq_indication_fdd_rel9_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
-  nfapi_harq_indication_fdd_rel9_t *value = (nfapi_harq_indication_fdd_rel9_t *)tlv;
-  return (pull8(ppReadPackedMsg, &value->mode, end) &&
-          pull8(ppReadPackedMsg, &value->number_of_ack_nack, end) &&
-          pullarray8(ppReadPackedMsg, value->harq_tb_n, NFAPI_HARQ_ACK_NACK_REL9_MAX, value->number_of_ack_nack, end));
-}
-
-static uint8_t unpack_harq_indication_fdd_rel13_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
-  nfapi_harq_indication_fdd_rel13_t *value = (nfapi_harq_indication_fdd_rel13_t *)tlv;
-  return (pull8(ppReadPackedMsg, &value->mode, end) &&
-          pull16(ppReadPackedMsg, &value->number_of_ack_nack, end) &&
-          pullarray8(ppReadPackedMsg, value->harq_tb_n, NFAPI_HARQ_ACK_NACK_REL13_MAX, value->number_of_ack_nack, end));
-}
-
-static uint8_t unpack_ul_cqi_information_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
-  nfapi_ul_cqi_information_t *value = (nfapi_ul_cqi_information_t *)tlv;
-  return (pull8(ppReadPackedMsg, &value->ul_cqi, end) &&
-          pull8(ppReadPackedMsg, &value->channel, end));
-}
-
-
-
-static uint8_t unpack_harq_indication_body_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end, nfapi_p7_codec_config_t *config) {
-  nfapi_harq_indication_body_t *value = (nfapi_harq_indication_body_t *)tlv;
-  uint8_t *harqBodyEnd = *ppReadPackedMsg + value->tl.length;
-
-  if(harqBodyEnd > end)
-    return 0;
-
-  if(pull16(ppReadPackedMsg, &value->number_of_harqs, end) == 0)
-    return 0;
-
-  if(value->number_of_harqs > NFAPI_HARQ_IND_MAX_PDU) {
-    NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s number of harq ind pdus exceed maxium (count:%d max:%d)\n", __FUNCTION__, value->number_of_harqs, NFAPI_HARQ_IND_MAX_PDU);
-    return 0;
-  }
-
-  value->harq_pdu_list = (nfapi_harq_indication_pdu_t *)nfapi_p7_allocate(sizeof(nfapi_harq_indication_pdu_t) * value->number_of_harqs, config);
-
-  if(value->harq_pdu_list == NULL) {
-    NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s failed to allocate harq ind pdu list (count:%d)\n", __FUNCTION__, value->number_of_harqs);
-    return 0;
-  }
-
-  uint8_t i = 0;
-
-  for(i = 0; i < value->number_of_harqs; ++i) {
-    nfapi_harq_indication_pdu_t *pdu = &(value->harq_pdu_list[i]);
-
-    if(pull16(ppReadPackedMsg, &pdu->instance_length, end) == 0)
-      return 0;
-
-    uint8_t *harqPduInstanceEnd = *ppReadPackedMsg + pdu->instance_length;
-    unpack_tlv_t unpack_fns[] = {
-      { NFAPI_RX_UE_INFORMATION_TAG, &pdu->rx_ue_information, unpack_rx_ue_information_value },
-      { NFAPI_HARQ_INDICATION_TDD_REL8_TAG, &pdu->harq_indication_tdd_rel8, &unpack_harq_indication_tdd_rel8_value},
-      { NFAPI_HARQ_INDICATION_TDD_REL9_TAG, &pdu->harq_indication_tdd_rel9, &unpack_harq_indication_tdd_rel9_value},
-      { NFAPI_HARQ_INDICATION_TDD_REL13_TAG, &pdu->harq_indication_tdd_rel13, &unpack_harq_indication_tdd_rel13_value},
-      { NFAPI_HARQ_INDICATION_FDD_REL8_TAG, &pdu->harq_indication_fdd_rel8, &unpack_harq_indication_fdd_rel8_value},
-      { NFAPI_HARQ_INDICATION_FDD_REL9_TAG, &pdu->harq_indication_fdd_rel9, &unpack_harq_indication_fdd_rel9_value},
-      { NFAPI_HARQ_INDICATION_FDD_REL13_TAG, &pdu->harq_indication_fdd_rel13, &unpack_harq_indication_fdd_rel13_value},
-      { NFAPI_UL_CQI_INFORMATION_TAG, &pdu->ul_cqi_information, &unpack_ul_cqi_information_value}
-    };
-
-    if(unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, harqPduInstanceEnd, 0, 0) == 0)
-      return 0;
-  }
-
-  return 1;
-}
-
-static uint8_t unpack_harq_indication(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p7_codec_config_t *config) {
-  nfapi_harq_indication_t *pNfapiMsg = (nfapi_harq_indication_t *)msg;
-  unpack_p7_tlv_t unpack_fns[] = {
-    { NFAPI_HARQ_INDICATION_BODY_TAG, &pNfapiMsg->harq_indication_body, &unpack_harq_indication_body_value},
-  };
-  return (pull16(ppReadPackedMsg, &pNfapiMsg->sfn_sf, end) &&
-          unpack_p7_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, end, config, &pNfapiMsg->vendor_extension));
-}
-
-static uint8_t unpack_crc_indication_rel8_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
-  nfapi_crc_indication_rel8_t *crc_pdu_rel8 = (nfapi_crc_indication_rel8_t *)tlv;
-  return ( pull8(ppReadPackedMsg, &crc_pdu_rel8->crc_flag, end) );
-}
-
-static uint8_t unpack_crc_indication_body_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end,  nfapi_p7_codec_config_t *config) {
-  nfapi_crc_indication_body_t *value = (nfapi_crc_indication_body_t *)tlv;
-  uint8_t *crcBodyEnd = *ppReadPackedMsg + value->tl.length;
-
-  if(crcBodyEnd > end)
-    return 0;
-
-  if(pull16(ppReadPackedMsg, &value->number_of_crcs, end) == 0)
-    return 0;
-
-  if(value->number_of_crcs > NFAPI_CRC_IND_MAX_PDU) {
-    NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s number of crc ind pdu's exceed maxium (count:%d max:%d)\n", __FUNCTION__, value->number_of_crcs, NFAPI_CRC_IND_MAX_PDU);
-    return 0;
-  }
-
-  if(value->number_of_crcs > 0) {
-    value->crc_pdu_list = (nfapi_crc_indication_pdu_t *)nfapi_p7_allocate(sizeof(nfapi_crc_indication_pdu_t) * value->number_of_crcs, config);
-
-    if(value->crc_pdu_list == NULL) {
-      NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s failed to allocate crc ind pdu list (count:%d)\n", __FUNCTION__, value->number_of_crcs);
-      return 0;
-    }
-  } else {
-    value->crc_pdu_list = 0;
-  }
-
-  uint8_t i = 0;
-
-  for(i = 0; i < value->number_of_crcs; ++i) {
-    nfapi_crc_indication_pdu_t *pdu = &(value->crc_pdu_list[i]);
-
-    if(pull16(ppReadPackedMsg, &pdu->instance_length, end) == 0)
-      return 0;
-
-    uint8_t *crcPduInstanceEnd = *ppReadPackedMsg + pdu->instance_length;
-    unpack_tlv_t unpack_fns[] = {
-      { NFAPI_RX_UE_INFORMATION_TAG, &pdu->rx_ue_information, unpack_rx_ue_information_value },
-      { NFAPI_CRC_INDICATION_REL8_TAG, &pdu->crc_indication_rel8, unpack_crc_indication_rel8_value },
-    };
-
-    if(unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, crcPduInstanceEnd, 0, 0) == 0)
-      return 0;
-  }
-
-  return 1;
-}
-
-static uint8_t unpack_crc_indication(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p7_codec_config_t *config) {
-  nfapi_crc_indication_t *pNfapiMsg = (nfapi_crc_indication_t *)msg;
-  unpack_p7_tlv_t unpack_fns[] = {
-    { NFAPI_CRC_INDICATION_BODY_TAG, &pNfapiMsg->crc_indication_body, &unpack_crc_indication_body_value},
-  };
-  return (pull16(ppReadPackedMsg, &pNfapiMsg->sfn_sf, end) &&
-          unpack_p7_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, end, config, &pNfapiMsg->vendor_extension));
-}
-
-static uint8_t unpack_rx_indication_rel8_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
-  nfapi_rx_indication_rel8_t *value = (nfapi_rx_indication_rel8_t *)tlv;
-  return (pull16(ppReadPackedMsg, &value->length, end) &&
-          pull16(ppReadPackedMsg, &value->offset, end) &&
-          pull8(ppReadPackedMsg, &value->ul_cqi, end) &&
-          pull16(ppReadPackedMsg, &value->timing_advance, end));
-}
-static uint8_t unpack_rx_indication_rel9_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
-  nfapi_rx_indication_rel9_t *value = (nfapi_rx_indication_rel9_t *)tlv;
-  return (pull16(ppReadPackedMsg, &value->timing_advance_r9, end));
-}
-
-static uint8_t unpack_rx_indication_body_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end, nfapi_p7_codec_config_t *config) {
-  nfapi_rx_indication_body_t *value = (nfapi_rx_indication_body_t *)tlv;
-  // the rxBodyEnd points to the end of the cqi PDU's
-  uint8_t *rxBodyEnd = *ppReadPackedMsg + value->tl.length;
-  uint8_t *rxPduEnd = rxBodyEnd;
-  uint8_t *numberOfPdusAddress = *ppReadPackedMsg;
-
-  if(rxBodyEnd > end) {
-    // pdu end is past buffer end
-    return 0;
-  }
-
-  if(pull16(ppReadPackedMsg, &value->number_of_pdus, end) == 0)
-    return 0;
-
-  if(value->number_of_pdus > NFAPI_RX_IND_MAX_PDU) {
-    NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s number of rx ind pdu's exceed maxium (count:%d max:%d)\n", __FUNCTION__, value->number_of_pdus, NFAPI_RX_IND_MAX_PDU);
-    return 0;
-  }
-
-  if(value->number_of_pdus > 0) {
-    value->rx_pdu_list = (nfapi_rx_indication_pdu_t *)nfapi_p7_allocate(sizeof(nfapi_rx_indication_pdu_t) * value->number_of_pdus, config);
-
-    if(value->rx_pdu_list == NULL) {
-      NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s failed to allocate rx ind pdu list (count:%d)\n", __FUNCTION__, value->number_of_pdus);
-      return 0;
-    }
-  } else {
-    value->rx_pdu_list = 0;
-  }
-
-  uint8_t i = 0;
-  nfapi_rx_indication_pdu_t *pdu = 0;
-
-  while((uint8_t *)(*ppReadPackedMsg) < rxBodyEnd && (uint8_t *)(*ppReadPackedMsg) < rxPduEnd) {
-    nfapi_tl_t generic_tl;
-
-    if( unpack_tl(ppReadPackedMsg, &generic_tl, end) == 0)
-      return 0;
-
-    switch(generic_tl.tag) {
-      case NFAPI_RX_UE_INFORMATION_TAG: {
-        pdu = &(value->rx_pdu_list[i++]);
-        pdu->rx_ue_information.tl = generic_tl;
-
-        if(unpack_rx_ue_information_value(&pdu->rx_ue_information, ppReadPackedMsg, end) == 0)
-          return 0;
-      }
-      break;
-
-      case NFAPI_RX_INDICATION_REL8_TAG: {
-        if(pdu != 0) {
-          pdu->rx_indication_rel8.tl = generic_tl;
-
-          if(unpack_rx_indication_rel8_value(&pdu->rx_indication_rel8, ppReadPackedMsg, end) == 0)
-            return 0;
-
-          if(pdu->rx_indication_rel8.offset > 0) {
-            // Need to check that the data is within the tlv
-            if(numberOfPdusAddress + pdu->rx_indication_rel8.offset + pdu->rx_indication_rel8.length <= rxBodyEnd) {
-              // If this the first pdu set the rxPduEnd
-              if(numberOfPdusAddress + pdu->rx_indication_rel8.offset < rxPduEnd) {
-                rxPduEnd = numberOfPdusAddress + pdu->rx_indication_rel8.offset;
-
-                if(rxPduEnd > end) {
-                  // pdu end is past buffer end
-                  return 0;
-                }
-              }
-            } else {
-              NFAPI_TRACE(NFAPI_TRACE_ERROR, "FIXME: the rx data is outside of the tlv\n");
-            }
-          }
-        }
-      }
-      break;
-
-      case NFAPI_RX_INDICATION_REL9_TAG: {
-        if(pdu != 0) {
-          pdu->rx_indication_rel9.tl = generic_tl;
-
-          if(unpack_rx_indication_rel9_value(&pdu->rx_indication_rel9, ppReadPackedMsg, end) == 0)
-            return 0;
-        }
-      }
-      break;
-
-      default: {
-        NFAPI_TRACE(NFAPI_TRACE_ERROR, "RX_ULSCH.indication Invalid pdu type %d \n", generic_tl.tag );
-      }
-      break;
-    }
-  }
-
-  uint8_t idx = 0;
-
-  for(idx = 0; idx < value->number_of_pdus; ++idx) {
-    if(value->rx_pdu_list[idx].rx_indication_rel8.tl.tag == NFAPI_RX_INDICATION_REL8_TAG) {
-      uint32_t length = value->rx_pdu_list[idx].rx_indication_rel8.length;
-      value->rx_pdu_list[idx].data = nfapi_p7_allocate(length, config);
-
-      if(pullarray8(ppReadPackedMsg, value->rx_pdu_list[idx].data, length, length, end) == 0) {
-        return 0;
-      }
-    }
-  }
-
-  return 1;
-}
-
-static uint8_t unpack_rx_indication(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p7_codec_config_t *config) {
-  nfapi_rx_indication_t *pNfapiMsg = (nfapi_rx_indication_t *)msg;
-  unpack_p7_tlv_t unpack_fns[] = {
-    { NFAPI_RX_INDICATION_BODY_TAG, &pNfapiMsg->rx_indication_body, &unpack_rx_indication_body_value},
-  };
-  return (pull16(ppReadPackedMsg, &pNfapiMsg->sfn_sf, end) &&
-          unpack_p7_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, end, config, &pNfapiMsg->vendor_extension));
-}
-
-static uint8_t unpack_preamble_pdu_rel8_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
-  nfapi_preamble_pdu_rel8_t *preamble_pdu_rel8 = (nfapi_preamble_pdu_rel8_t *)tlv;
-  return (pull16(ppReadPackedMsg, &preamble_pdu_rel8->rnti, end) &&
-          pull8(ppReadPackedMsg, &preamble_pdu_rel8->preamble, end) &&
-          pull16(ppReadPackedMsg, &preamble_pdu_rel8->timing_advance, end));
-}
-
-static uint8_t unpack_preamble_pdu_rel9_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
-  nfapi_preamble_pdu_rel9_t *preamble_pdu_rel9 = (nfapi_preamble_pdu_rel9_t *)tlv;
-  return pull16(ppReadPackedMsg, &preamble_pdu_rel9->timing_advance_r9, end);
-}
-
-static uint8_t unpack_preamble_pdu_rel13_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
-  nfapi_preamble_pdu_rel13_t *preamble_pdu_rel13 = (nfapi_preamble_pdu_rel13_t *)tlv;
-  return pull8(ppReadPackedMsg, &preamble_pdu_rel13->rach_resource_type, end);
-}
-
-static uint8_t unpack_rach_indication_body_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end, nfapi_p7_codec_config_t *config) {
-  nfapi_rach_indication_body_t *value = (nfapi_rach_indication_body_t *)tlv;
-  uint8_t *rachBodyEnd = *ppReadPackedMsg + value->tl.length;
-
-  if(rachBodyEnd > end)
-    return 0;
-
-  if(pull16(ppReadPackedMsg, &value->number_of_preambles, end) == 0)
-    return 0;
-
-  if(value->number_of_preambles > NFAPI_PREAMBLE_MAX_PDU) {
-    NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s number of preamble du's exceed maxium (count:%d max:%d)\n", __FUNCTION__, value->number_of_preambles, NFAPI_PREAMBLE_MAX_PDU);
-    return 0;
-  }
-
-  if(value->number_of_preambles > 0) {
-    value->preamble_list = (nfapi_preamble_pdu_t *)nfapi_p7_allocate(sizeof(nfapi_preamble_pdu_t) * value->number_of_preambles, config);
-
-    if(value->preamble_list == NULL) {
-      NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s failed to allocate preamble pdu list (count:%d)\n", __FUNCTION__, value->number_of_preambles);
-      return 0;
-    }
-  } else {
-    value->preamble_list = 0;
-  }
-
-  uint8_t i = 0;
-
-  for(i = 0; i < value->number_of_preambles; ++i) {
-    nfapi_preamble_pdu_t *pdu = &(value->preamble_list[i]);
-
-    if(pull16(ppReadPackedMsg, &pdu->instance_length, end) == 0)
-      return 0;
-
-    uint8_t *preamblePduInstanceEnd = *ppReadPackedMsg + pdu->instance_length;
-    unpack_tlv_t unpack_fns[] = {
-      { NFAPI_PREAMBLE_REL8_TAG, &pdu->preamble_rel8, unpack_preamble_pdu_rel8_value },
-      { NFAPI_PREAMBLE_REL9_TAG, &pdu->preamble_rel9, unpack_preamble_pdu_rel9_value },
-      { NFAPI_PREAMBLE_REL13_TAG, &pdu->preamble_rel13, unpack_preamble_pdu_rel13_value },
-    };
-
-    if(unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, preamblePduInstanceEnd, 0, 0) == 0)
-      return 0;
-  }
-
-  return 1;
-}
-
-static uint8_t unpack_rach_indication(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p7_codec_config_t *config) {
-  nfapi_rach_indication_t *pNfapiMsg = (nfapi_rach_indication_t *)msg;
-  unpack_p7_tlv_t unpack_fns[] = {
-    { NFAPI_RACH_INDICATION_BODY_TAG, &pNfapiMsg->rach_indication_body, &unpack_rach_indication_body_value},
-  };
-  return (pull16(ppReadPackedMsg, &pNfapiMsg->sfn_sf, end) &&
-          unpack_p7_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, end, config, &pNfapiMsg->vendor_extension));
-}
-
-static uint8_t unpack_srs_indication_fdd_rel8_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
-  nfapi_srs_indication_fdd_rel8_t *srs_pdu_fdd_rel8 = (nfapi_srs_indication_fdd_rel8_t *)tlv;
-
-  if(!(pull16(ppReadPackedMsg, &srs_pdu_fdd_rel8->doppler_estimation, end) &&
-       pull16(ppReadPackedMsg, &srs_pdu_fdd_rel8->timing_advance, end) &&
-       pull8(ppReadPackedMsg, &srs_pdu_fdd_rel8->number_of_resource_blocks, end) &&
-       pull8(ppReadPackedMsg, &srs_pdu_fdd_rel8->rb_start, end) &&
-       pullarray8(ppReadPackedMsg, srs_pdu_fdd_rel8->snr, NFAPI_NUM_RB_MAX, srs_pdu_fdd_rel8->number_of_resource_blocks, end)))
-    return 0;
-
-  return 1;
-}
-
-static uint8_t unpack_srs_indication_fdd_rel9_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
-  nfapi_srs_indication_fdd_rel9_t *srs_pdu_fdd_rel9 = (nfapi_srs_indication_fdd_rel9_t *)tlv;
-  return (pull16(ppReadPackedMsg, &srs_pdu_fdd_rel9->timing_advance_r9, end));
-}
-
-static uint8_t unpack_srs_indication_tdd_rel10_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
-  nfapi_srs_indication_ttd_rel10_t *srs_pdu_tdd_rel10 = (nfapi_srs_indication_ttd_rel10_t *)tlv;
-  return (pull8(ppReadPackedMsg, &srs_pdu_tdd_rel10->uppts_symbol, end));
-}
-
-static uint8_t unpack_srs_indication_fdd_rel11_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
-  nfapi_srs_indication_fdd_rel11_t *srs_pdu_fdd_rel11 = (nfapi_srs_indication_fdd_rel11_t *)tlv;
-  return ( pull16(ppReadPackedMsg, &srs_pdu_fdd_rel11->ul_rtoa, end));
-}
-
-static uint8_t unpack_tdd_channel_measurement_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
-  nfapi_tdd_channel_measurement_t *value = (nfapi_tdd_channel_measurement_t *)tlv;
-
-  if(!(pull8(ppReadPackedMsg, &value->num_prb_per_subband, end) &&
-       pull8(ppReadPackedMsg, &value->number_of_subbands, end) &&
-       pull8(ppReadPackedMsg, &value->num_atennas, end)))
-    return 0;
-
-  if(value->number_of_subbands > NFAPI_MAX_NUM_SUBBANDS) {
-    // todo : add error
-    return 0;
-  }
-
-  if(value->num_atennas > NFAPI_MAX_NUM_PHYSICAL_ANTENNAS) {
-    // todo : add error
-    return 0;
-  }
-
-  uint8_t idx = 0;
-
-  for(idx = 0; idx < value->number_of_subbands; ++idx) {
-    if(!(pull8(ppReadPackedMsg, &value->subands[idx].subband_index, end) &&
-         pullarray16(ppReadPackedMsg, value->subands[idx].channel, NFAPI_MAX_NUM_PHYSICAL_ANTENNAS, value->num_atennas, end)))
-      return 0;
-  }
-
-  return 1;
-}
-
-
-static uint8_t unpack_srs_indication_body_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end, nfapi_p7_codec_config_t *config) {
-  nfapi_srs_indication_body_t *value = (nfapi_srs_indication_body_t *)tlv;
-  uint8_t *srsBodyEnd = *ppReadPackedMsg + value->tl.length;
-
-  if(srsBodyEnd > end)
-    return 0;
-
-  if(pull8(ppReadPackedMsg, &value->number_of_ues, end) == 0)
-    return 0;
-
-  if(value->number_of_ues > NFAPI_SRS_IND_MAX_PDU) {
-    NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s number of srs ind pdu's exceed maxium (count:%d max:%d)\n", __FUNCTION__, value->number_of_ues, NFAPI_SRS_IND_MAX_PDU);
-    return 0;
-  }
-
-  if(value->number_of_ues > 0) {
-    value->srs_pdu_list = (nfapi_srs_indication_pdu_t *)nfapi_p7_allocate(sizeof(nfapi_srs_indication_pdu_t) * value->number_of_ues, config);
-
-    if(value->srs_pdu_list == NULL) {
-      NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s failed to allocate srs ind pdu list (count:%d)\n", __FUNCTION__, value->number_of_ues);
-      return 0;
-    }
-  } else {
-    value->srs_pdu_list = 0;
-  }
-
-  uint8_t i = 0;
-
-  for(i = 0; i < value->number_of_ues; ++i) {
-    nfapi_srs_indication_pdu_t *pdu = &(value->srs_pdu_list[i]);
-
-    if(pull16(ppReadPackedMsg, &pdu->instance_length, end) == 0)
-      return 0;
-
-    uint8_t *srsPduInstanceEnd = *ppReadPackedMsg + pdu->instance_length;
-    unpack_tlv_t unpack_fns[] = {
-      { NFAPI_RX_UE_INFORMATION_TAG, &pdu->rx_ue_information, unpack_rx_ue_information_value },
-      { NFAPI_SRS_INDICATION_FDD_REL8_TAG, &pdu->srs_indication_fdd_rel8, unpack_srs_indication_fdd_rel8_value},
-      { NFAPI_SRS_INDICATION_FDD_REL9_TAG, &pdu->srs_indication_fdd_rel9, unpack_srs_indication_fdd_rel9_value},
-      { NFAPI_SRS_INDICATION_TDD_REL10_TAG, &pdu->srs_indication_tdd_rel10, unpack_srs_indication_tdd_rel10_value},
-      { NFAPI_SRS_INDICATION_FDD_REL11_TAG, &pdu->srs_indication_fdd_rel11, unpack_srs_indication_fdd_rel11_value},
-      { NFAPI_TDD_CHANNEL_MEASUREMENT_TAG, &pdu->tdd_channel_measurement, unpack_tdd_channel_measurement_value},
-    };
-
-    if(unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, srsPduInstanceEnd, 0, 0) == 0)
-      return 0;
-  }
-
-  return 1;
-}
-
-static uint8_t unpack_srs_indication(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p7_codec_config_t *config) {
-  nfapi_srs_indication_t *pNfapiMsg = (nfapi_srs_indication_t *)msg;
-  unpack_p7_tlv_t unpack_fns[] = {
-    { NFAPI_SRS_INDICATION_BODY_TAG, &pNfapiMsg->srs_indication_body, &unpack_srs_indication_body_value},
-  };
-  return (pull16(ppReadPackedMsg, &pNfapiMsg->sfn_sf, end) &&
-          unpack_p7_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, end, config, &pNfapiMsg->vendor_extension));
-}
-
-
-static uint8_t unpack_sr_indication_body_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end, nfapi_p7_codec_config_t *config) {
-  nfapi_sr_indication_body_t *value = (nfapi_sr_indication_body_t *)tlv;
-  uint8_t *srBodyEnd = *ppReadPackedMsg + value->tl.length;
-
-  if(srBodyEnd > end)
-    return 0;
-
-  if(pull16(ppReadPackedMsg, &value->number_of_srs, end) == 0)
-    return 0;
-
-  if(value->number_of_srs > NFAPI_SR_IND_MAX_PDU) {
-    NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s number of sr ind pdu's exceed maxium (count:%d max:%d)\n", __FUNCTION__, value->number_of_srs, NFAPI_SR_IND_MAX_PDU);
-    return 0;
-  }
-
-  if(value->number_of_srs > 0) {
-    value->sr_pdu_list = (nfapi_sr_indication_pdu_t *)nfapi_p7_allocate(sizeof(nfapi_sr_indication_pdu_t) * value->number_of_srs, config);
-
-    if(value->sr_pdu_list == NULL) {
-      NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s failed to allocate sr ind pdu list (count:%d)\n", __FUNCTION__, value->number_of_srs);
-      return 0;
-    }
-  } else {
-    value->sr_pdu_list = 0;
-  }
-
-  uint8_t i = 0;
-
-  for(i = 0; i < value->number_of_srs; ++i) {
-    nfapi_sr_indication_pdu_t *pdu = &(value->sr_pdu_list[i]);
-
-    if(pull16(ppReadPackedMsg, &pdu->instance_length, end) == 0)
-      return 0;
-
-    uint8_t *srPduInstanceEnd = *ppReadPackedMsg + pdu->instance_length;
-    unpack_tlv_t unpack_fns[] = {
-      { NFAPI_RX_UE_INFORMATION_TAG, &pdu->rx_ue_information, unpack_rx_ue_information_value },
-      { NFAPI_UL_CQI_INFORMATION_TAG, &pdu->ul_cqi_information, unpack_ul_cqi_information_value },
-    };
-
-    if(unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, srPduInstanceEnd, 0, 0) == 0)
-      return 0;
-  }
-
-  return 1;
-}
-
-static int unpack_sr_indication(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p7_codec_config_t *config) {
-  nfapi_sr_indication_t *pNfapiMsg = (nfapi_sr_indication_t *)msg;
-  unpack_p7_tlv_t unpack_fns[] = {
-    { NFAPI_SR_INDICATION_BODY_TAG, &pNfapiMsg->sr_indication_body, &unpack_sr_indication_body_value},
-  };
-  return (pull16(ppReadPackedMsg, &pNfapiMsg->sfn_sf, end) &&
-          unpack_p7_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, end, config, &pNfapiMsg->vendor_extension));
-}
-static uint8_t unpack_cqi_indication_rel8_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
-  nfapi_cqi_indication_rel8_t *cqi_pdu_rel8 = (nfapi_cqi_indication_rel8_t *)tlv;
-  return (pull16(ppReadPackedMsg, &cqi_pdu_rel8->length, end) &&
-          pull16(ppReadPackedMsg, &cqi_pdu_rel8->data_offset, end) &&
-          pull8(ppReadPackedMsg, &cqi_pdu_rel8->ul_cqi, end) &&
-          pull8(ppReadPackedMsg, &cqi_pdu_rel8->ri, end) &&
-          pull16(ppReadPackedMsg, &cqi_pdu_rel8->timing_advance, end));
-}
-
-static uint8_t unpack_cqi_indication_rel9_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
-  nfapi_cqi_indication_rel9_t *cqi_pdu_rel9 = (nfapi_cqi_indication_rel9_t *)tlv;
-
-  if(!(pull16(ppReadPackedMsg, &cqi_pdu_rel9->length, end) &&
-       pull16(ppReadPackedMsg, &cqi_pdu_rel9->data_offset, end) &&
-       pull8(ppReadPackedMsg, &cqi_pdu_rel9->ul_cqi, end) &&
-       pull8(ppReadPackedMsg, &cqi_pdu_rel9->number_of_cc_reported, end)))
-    return 0;
-
-  if(cqi_pdu_rel9->number_of_cc_reported > NFAPI_CC_MAX) {
-    NFAPI_TRACE(NFAPI_TRACE_ERROR, "FIXME : out of bound array\n");
-    return 0;
-  }
-
-  if(!(pullarray8(ppReadPackedMsg, cqi_pdu_rel9->ri, NFAPI_CC_MAX, cqi_pdu_rel9->number_of_cc_reported, end) &&
-       pull16(ppReadPackedMsg, &cqi_pdu_rel9->timing_advance, end) &&
-       pull16(ppReadPackedMsg, &cqi_pdu_rel9->timing_advance_r9, end)))
-    return 0;
-
-  return 1;
-}
-
-static uint8_t  unpack_cqi_indication_body_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end,  nfapi_p7_codec_config_t *config) {
-  nfapi_cqi_indication_body_t *value = (nfapi_cqi_indication_body_t *)tlv;
-  // the cqiBodyEnd points to the end of the cqi PDU's
-  uint8_t *cqiBodyEnd = *ppReadPackedMsg + value->tl.length;
-
-  //uint8_t* cqiPduEnd = cqiBodyEnd;
-  //uint8_t* numberOfPdusAddress = *ppReadPackedMsg;
-
-  if(cqiBodyEnd > end)
-    return 0;
-
-  if(pull16(ppReadPackedMsg, &value->number_of_cqis, end) == 0)
-    return 0;
-
-  if(value->number_of_cqis > NFAPI_CQI_IND_MAX_PDU) {
-    NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s number of cqi ind pdu's exceed maxium (count:%d max:%d)\n", __FUNCTION__, value->number_of_cqis, NFAPI_CQI_IND_MAX_PDU);
-    return -1;
-  }
-
-  if(value->number_of_cqis > 0) {
-    value->cqi_pdu_list = (nfapi_cqi_indication_pdu_t *)nfapi_p7_allocate(sizeof(nfapi_cqi_indication_pdu_t) * value->number_of_cqis, config);
-
-    if(value->cqi_pdu_list == NULL) {
-      NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s failed to allocate cqi ind pdu list (count:%d)\n", __FUNCTION__, value->number_of_cqis);
-      return 0;
-    }
-  } else {
-    value->cqi_pdu_list = 0;
-  }
-
-  if(value->number_of_cqis > 0) {
-    value->cqi_raw_pdu_list = (nfapi_cqi_indication_raw_pdu_t *)nfapi_p7_allocate(sizeof(nfapi_cqi_indication_raw_pdu_t) * value->number_of_cqis, config);
-
-    if(value->cqi_raw_pdu_list == NULL) {
-      NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s failed to allocate raw cqi ind pdu list (count:%d)\n", __FUNCTION__, value->number_of_cqis);
-      return 0;
-    }
-  } else {
-    value->cqi_raw_pdu_list = 0;
-  }
-
-  uint8_t i = 0;
-
-  for(i = 0; i < value->number_of_cqis; ++i) {
-    nfapi_cqi_indication_pdu_t *pdu = &(value->cqi_pdu_list[i]);
-    memset(pdu, 0, sizeof(nfapi_cqi_indication_pdu_t));
-
-    if(pull16(ppReadPackedMsg, &pdu->instance_length, end) == 0)
-      return 0;
-
-    uint8_t *cqiPduInstanceEnd = *ppReadPackedMsg + pdu->instance_length;
-
-    while((uint8_t *)(*ppReadPackedMsg) < cqiPduInstanceEnd) {
-      nfapi_tl_t generic_tl;
-
-      if(unpack_tl(ppReadPackedMsg, &generic_tl, end) == 0)
-        return 0;
-
-      switch(generic_tl.tag) {
-        case NFAPI_RX_UE_INFORMATION_TAG:
-          pdu->rx_ue_information.tl = generic_tl;
-
-          if(unpack_rx_ue_information_value(&pdu->rx_ue_information, ppReadPackedMsg, end) == 0)
-            return 0;
-
-          break;
-
-        case NFAPI_CQI_INDICATION_REL8_TAG:
-          pdu->cqi_indication_rel8.tl = generic_tl;
-
-          if(unpack_cqi_indication_rel8_value(&pdu->cqi_indication_rel8, ppReadPackedMsg, end) == 0)
-            return 0;
-
-          break;
-
-        case NFAPI_CQI_INDICATION_REL9_TAG:
-          pdu->cqi_indication_rel9.tl = generic_tl;
-
-          if(unpack_cqi_indication_rel9_value(&pdu->cqi_indication_rel9, ppReadPackedMsg, end) == 0)
-            return 0;
-
-          break;
-
-        case NFAPI_UL_CQI_INFORMATION_TAG:
-          pdu->ul_cqi_information.tl = generic_tl;
-
-          if(unpack_ul_cqi_information_value(&pdu->ul_cqi_information, ppReadPackedMsg, end) == 0)
-            return 0;
-
-          break;
-
-        default: {
-          NFAPI_TRACE(NFAPI_TRACE_ERROR, "RX_CQI.indication Invalid pdu type %d \n", generic_tl.tag );
-        }
-        break;
-      };
-    }
-  }
-
-  uint8_t idx = 0;
-
-  for(idx = 0; idx < value->number_of_cqis; ++idx) {
-    if(value->cqi_pdu_list[idx].cqi_indication_rel8.tl.tag == NFAPI_CQI_INDICATION_REL8_TAG) {
-      if(pullarray8(ppReadPackedMsg, &(value->cqi_raw_pdu_list[idx].pdu[0]), NFAPI_CQI_RAW_MAX_LEN, value->cqi_pdu_list[idx].cqi_indication_rel8.length, end) == 0)
-        return 0;
-    } else if(value->cqi_pdu_list[idx].cqi_indication_rel9.tl.tag == NFAPI_CQI_INDICATION_REL9_TAG) {
-      if(pullarray8(ppReadPackedMsg, &(value->cqi_raw_pdu_list[idx].pdu[0]), NFAPI_CQI_RAW_MAX_LEN, value->cqi_pdu_list[idx].cqi_indication_rel9.length, end) == 0)
-        return 0;
-    }
-  }
-
-  return 1;
-}
-
-static uint8_t unpack_cqi_indication(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p7_codec_config_t *config) {
-  nfapi_cqi_indication_t *pNfapiMsg = (nfapi_cqi_indication_t *)msg;
-  unpack_p7_tlv_t unpack_fns[] = {
-    { NFAPI_CQI_INDICATION_BODY_TAG, &pNfapiMsg->cqi_indication_body, &unpack_cqi_indication_body_value},
-  };
-  return (pull16(ppReadPackedMsg, &pNfapiMsg->sfn_sf, end) &&
-          unpack_p7_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, end, config, &pNfapiMsg->vendor_extension));
-}
-static uint8_t unpack_lbt_pdsch_req_pdu_rel13_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
-  nfapi_lbt_pdsch_req_pdu_rel13_t *value = (nfapi_lbt_pdsch_req_pdu_rel13_t *)tlv;
-  return (pull32(ppReadPackedMsg, &value->handle, end) &&
-          pull32(ppReadPackedMsg, &value->mp_cca, end) &&
-          pull32(ppReadPackedMsg, &value->n_cca, end) &&
-          pull32(ppReadPackedMsg, &value->offset, end) &&
-          pull32(ppReadPackedMsg, &value->lte_txop_sf, end) &&
-          pull16(ppReadPackedMsg, &value->txop_sfn_sf_end, end) &&
-          pull32(ppReadPackedMsg, &value->lbt_mode, end));
-}
-
-static uint8_t unpack_lbt_drs_req_pdu_rel13_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
-  nfapi_lbt_drs_req_pdu_rel13_t *value = (nfapi_lbt_drs_req_pdu_rel13_t *)tlv;
-  return (pull32(ppReadPackedMsg, &value->handle, end) &&
-          pull32(ppReadPackedMsg, &value->offset, end) &&
-          pull16(ppReadPackedMsg, &value->sfn_sf_end, end) &&
-          pull32(ppReadPackedMsg, &value->lbt_mode, end));
-}
-
-
-static uint8_t unpack_lbt_config_request_body_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end, nfapi_p7_codec_config_t *config) {
-  nfapi_lbt_dl_config_request_body_t *value = (nfapi_lbt_dl_config_request_body_t *)tlv;
-
-  if(pull16(ppReadPackedMsg, &value->number_of_pdus, end) == 0)
-    return 0;
-
-  if(value->number_of_pdus > NFAPI_LBT_DL_CONFIG_REQ_MAX_PDU) {
-    NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s number of lbt dl config pdu's exceed maxium (count:%d max:%d)\n", __FUNCTION__, value->number_of_pdus, NFAPI_LBT_DL_CONFIG_REQ_MAX_PDU);
-    return 0;
-  }
-
-  if(value->number_of_pdus) {
-    value->lbt_dl_config_req_pdu_list = (nfapi_lbt_dl_config_request_pdu_t *)nfapi_p7_allocate(sizeof(nfapi_lbt_dl_config_request_pdu_t) * value->number_of_pdus, config);
-
-    if(value->lbt_dl_config_req_pdu_list == NULL) {
-      NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s failed to allocate lbt dl config pdu list (count:%d)\n", __FUNCTION__, value->number_of_pdus);
-      return 0;
-    }
-  } else {
-    value->lbt_dl_config_req_pdu_list = 0;
-  }
-
-  uint16_t i;
-  uint16_t total_number_of_pdus = value->number_of_pdus;
-
-  for(i = 0; i < total_number_of_pdus; ++i) {
-    nfapi_lbt_dl_config_request_pdu_t *pdu = &(value->lbt_dl_config_req_pdu_list[i]);
-
-    if(!(pull8(ppReadPackedMsg, &pdu->pdu_type, end) &&
-         pull8(ppReadPackedMsg, &pdu->pdu_size, end)))
-      return 0;
-
-    uint8_t *packedPduEnd = (*ppReadPackedMsg) + pdu->pdu_size - 2;
-
-    if(packedPduEnd > end)
-      return 0;
-
-    switch(pdu->pdu_type) {
-      case NFAPI_LBT_DL_CONFIG_REQUEST_PDSCH_PDU_TYPE: {
-        unpack_tlv_t unpack_fns[] = {
-          { NFAPI_LBT_PDSCH_REQ_PDU_REL13_TAG, &pdu->lbt_pdsch_req_pdu.lbt_pdsch_req_pdu_rel13, &unpack_lbt_pdsch_req_pdu_rel13_value},
-        };
-        unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0);
-      }
-      break;
-
-      case NFAPI_LBT_DL_CONFIG_REQUEST_DRS_PDU_TYPE: {
-        unpack_tlv_t unpack_fns[] = {
-          { NFAPI_LBT_DRS_REQ_PDU_REL13_TAG, &pdu->lbt_drs_req_pdu.lbt_drs_req_pdu_rel13, &unpack_lbt_drs_req_pdu_rel13_value},
-        };
-        unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0);
-      }
-      break;
-
-      default:
-        NFAPI_TRACE(NFAPI_TRACE_ERROR, "LBT_DL_CONFIG.request body invalid pdu type %d\n", pdu->pdu_type);
-        return 0;
-    }
-  }
-
-  return 1;
-}
-static uint8_t unpack_lbt_dl_config_request(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p7_codec_config_t *config) {
-  nfapi_lbt_dl_config_request_t *pNfapiMsg = (nfapi_lbt_dl_config_request_t *)msg;
-  unpack_p7_tlv_t unpack_fns[] = {
-    { NFAPI_LBT_DL_CONFIG_REQUEST_BODY_TAG, &pNfapiMsg->lbt_dl_config_request_body, &unpack_lbt_config_request_body_value},
-  };
-  return (pull16(ppReadPackedMsg, &pNfapiMsg->sfn_sf, end) &&
-          unpack_p7_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, end, config, &pNfapiMsg->vendor_extension));
-}
-
-static uint8_t unpack_lbt_pdsch_rsp_pdu_rel13_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
-  nfapi_lbt_pdsch_rsp_pdu_rel13_t *value = (nfapi_lbt_pdsch_rsp_pdu_rel13_t *)tlv;
-  return (pull32(ppReadPackedMsg, &value->handle, end) &&
-          pull32(ppReadPackedMsg, &value->result, end) &&
-          pull32(ppReadPackedMsg, &value->lte_txop_symbols, end) &&
-          pull32(ppReadPackedMsg, &value->initial_partial_sf, end));
-}
-static uint8_t unpack_lbt_drs_rsp_pdu_rel13_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
-  nfapi_lbt_drs_rsp_pdu_rel13_t *value = (nfapi_lbt_drs_rsp_pdu_rel13_t *)tlv;
-  return (pull32(ppReadPackedMsg, &value->handle, end) &&
-          pull32(ppReadPackedMsg, &value->result, end));
-}
-
-static uint8_t unpack_lbt_indication_body_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end, nfapi_p7_codec_config_t *config) {
-  nfapi_lbt_dl_indication_body_t *value = (nfapi_lbt_dl_indication_body_t *)tlv;
-
-  if(pull16(ppReadPackedMsg, &value->number_of_pdus, end) == 0)
-    return 0;
-
-  if(value->number_of_pdus > NFAPI_LBT_IND_MAX_PDU) {
-    NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s number of lbt dl ind pdu's exceed maxium (count:%d max:%d)\n", __FUNCTION__, value->number_of_pdus, NFAPI_LBT_IND_MAX_PDU);
-    return 0;
-  }
-
-  if(value->number_of_pdus > 0) {
-    value->lbt_indication_pdu_list = (nfapi_lbt_dl_indication_pdu_t *)nfapi_p7_allocate(sizeof(nfapi_lbt_dl_indication_pdu_t) * value->number_of_pdus, config);
-
-    if(value->lbt_indication_pdu_list == NULL) {
-      NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s failed to allocate lbt dl ind config pdu list (count:%d)\n", __FUNCTION__, value->number_of_pdus);
-      return 0;
-    }
-  } else {
-    value->lbt_indication_pdu_list = 0;
-  }
-
-  uint16_t i;
-  uint16_t total_number_of_pdus = value->number_of_pdus;
-
-  for(i = 0; i < total_number_of_pdus; ++i) {
-    nfapi_lbt_dl_indication_pdu_t *pdu = &(value->lbt_indication_pdu_list[i]);
-
-    if(!(pull8(ppReadPackedMsg, &pdu->pdu_type, end) &&
-         pull8(ppReadPackedMsg, &pdu->pdu_size, end)))
-      return 0;
-
-    uint8_t *packedPduEnd = (*ppReadPackedMsg) + pdu->pdu_size - 2;
-
-    if(packedPduEnd > end)
-      return 0;
-
-    switch(pdu->pdu_type) {
-      case NFAPI_LBT_DL_RSP_PDSCH_PDU_TYPE: {
-        unpack_tlv_t unpack_fns[] = {
-          { NFAPI_LBT_PDSCH_RSP_PDU_REL13_TAG, &pdu->lbt_pdsch_rsp_pdu.lbt_pdsch_rsp_pdu_rel13, &unpack_lbt_pdsch_rsp_pdu_rel13_value},
-        };
-        unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0);
-      }
-      break;
-
-      case NFAPI_LBT_DL_RSP_DRS_PDU_TYPE: {
-        unpack_tlv_t unpack_fns[] = {
-          { NFAPI_LBT_DRS_RSP_PDU_REL13_TAG, &pdu->lbt_drs_rsp_pdu.lbt_drs_rsp_pdu_rel13, &unpack_lbt_drs_rsp_pdu_rel13_value},
-        };
-        unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0);
-      }
-      break;
-
-      default:
-        NFAPI_TRACE(NFAPI_TRACE_ERROR, "LBT_DL.indication body invalid pdu type %d\n", pdu->pdu_type);
-        return 0;
-    }
-  }
-
-  return 1;
-}
-static uint8_t unpack_lbt_dl_indication(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p7_codec_config_t *config) {
-  nfapi_lbt_dl_indication_t *pNfapiMsg = (nfapi_lbt_dl_indication_t *)msg;
-  unpack_p7_tlv_t unpack_fns[] = {
-    { NFAPI_LBT_DL_INDICATION_BODY_TAG, &pNfapiMsg->lbt_dl_indication_body, &unpack_lbt_indication_body_value},
-  };
-  return (pull16(ppReadPackedMsg, &pNfapiMsg->sfn_sf, end) &&
-          unpack_p7_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, end, config, &pNfapiMsg->vendor_extension));
-}
-
-static uint8_t unpack_nb_harq_indication_fdd_rel13_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
-  nfapi_nb_harq_indication_fdd_rel13_t *value = (nfapi_nb_harq_indication_fdd_rel13_t *)tlv;
-  return (pull8(ppReadPackedMsg, &value->harq_tb1, end));
-}
-
-
-static uint8_t unpack_nb_harq_indication_body_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end, nfapi_p7_codec_config_t *config) {
-  nfapi_nb_harq_indication_body_t *value = (nfapi_nb_harq_indication_body_t *)tlv;
-  uint8_t *nbharqBodyEnd = *ppReadPackedMsg + value->tl.length;
-
-  if(nbharqBodyEnd > end)
-    return 0;
-
-  if(pull16(ppReadPackedMsg, &value->number_of_harqs, end) == 0)
-    return 0;
-
-  if(value->number_of_harqs > NFAPI_HARQ_IND_MAX_PDU) {
-    NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s number of harq ind pdus exceed maxium (count:%d max:%d)\n", __FUNCTION__, value->number_of_harqs, NFAPI_HARQ_IND_MAX_PDU);
-    return 0;
-  }
-
-  value->nb_harq_pdu_list = (nfapi_nb_harq_indication_pdu_t *)nfapi_p7_allocate(sizeof(nfapi_nb_harq_indication_pdu_t) * value->number_of_harqs, config);
-
-  if(value->nb_harq_pdu_list == NULL) {
-    NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s failed to allocate harq ind pdu list (count:%d)\n", __FUNCTION__, value->number_of_harqs);
-    return 0;
-  }
-
-  uint8_t i = 0;
-
-  for(i = 0; i < value->number_of_harqs; ++i) {
-    nfapi_nb_harq_indication_pdu_t *pdu = &(value->nb_harq_pdu_list[i]);
-
-    if(pull16(ppReadPackedMsg, &pdu->instance_length, end) == 0)
-      return 0;
-
-    uint8_t *harqPduInstanceEnd = *ppReadPackedMsg + pdu->instance_length;
-    unpack_tlv_t unpack_fns[] = {
-      { NFAPI_RX_UE_INFORMATION_TAG, &pdu->rx_ue_information, unpack_rx_ue_information_value },
-      { NFAPI_NB_HARQ_INDICATION_FDD_REL13_TAG, &pdu->nb_harq_indication_fdd_rel13, &unpack_nb_harq_indication_fdd_rel13_value},
-      { NFAPI_UL_CQI_INFORMATION_TAG, &pdu->ul_cqi_information, &unpack_ul_cqi_information_value}
-    };
-
-    if(unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, harqPduInstanceEnd, 0, 0) == 0)
-      return 0;
-  }
-
-  return 1;
-}
-
-static uint8_t unpack_nb_harq_indication(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p7_codec_config_t *config) {
-  nfapi_nb_harq_indication_t *pNfapiMsg = (nfapi_nb_harq_indication_t *)msg;
-  unpack_p7_tlv_t unpack_fns[] = {
-    { NFAPI_NB_HARQ_INDICATION_BODY_TAG, &pNfapiMsg->nb_harq_indication_body, &unpack_nb_harq_indication_body_value},
-  };
-  return (pull16(ppReadPackedMsg, &pNfapiMsg->sfn_sf, end) &&
-          unpack_p7_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, end, config, &pNfapiMsg->vendor_extension));
-}
-
-static uint8_t unpack_nrach_indication_rel13_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
-  nfapi_nrach_indication_pdu_rel13_t *value = (nfapi_nrach_indication_pdu_rel13_t *)tlv;
-  return (pull16(ppReadPackedMsg, &value->rnti, end) &&
-          pull8(ppReadPackedMsg, &value->initial_sc, end) &&
-          pull16(ppReadPackedMsg, &value->timing_advance, end) &&
-          pull8(ppReadPackedMsg, &value->nrach_ce_level, end));
-}
-
-static uint8_t unpack_ue_release_resp(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p7_codec_config_t *config) {
-  nfapi_ue_release_response_t *pNfapiMsg = (nfapi_ue_release_response_t *)msg;
-
-  if(pull32(ppReadPackedMsg, &pNfapiMsg->error_code, end) == 0) {
-    return 0;
-  } else {
-    NFAPI_TRACE(NFAPI_TRACE_INFO, "ue_release_response:error_code = %d\n", pNfapiMsg->error_code);
-  }
-
-  return 1;
-}
-
-static uint8_t unpack_nrach_indication_body_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end, nfapi_p7_codec_config_t *config) {
-  nfapi_nrach_indication_body_t *value = (nfapi_nrach_indication_body_t *)tlv;
-  uint8_t *nrachBodyEnd = *ppReadPackedMsg + value->tl.length;
-
-  if(nrachBodyEnd > end)
-    return 0;
-
-  if(pull8(ppReadPackedMsg, &value->number_of_initial_scs_detected, end) == 0)
-    return 0;
-
-  if(value->number_of_initial_scs_detected > NFAPI_PREAMBLE_MAX_PDU) {
-    NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s number of detected scs ind pdus exceed maxium (count:%d max:%d)\n", __FUNCTION__, value->number_of_initial_scs_detected, NFAPI_PREAMBLE_MAX_PDU);
-    return 0;
-  }
-
-  value->nrach_pdu_list = (nfapi_nrach_indication_pdu_t *)nfapi_p7_allocate(sizeof(nfapi_nrach_indication_pdu_t) * value->number_of_initial_scs_detected, config);
-
-  if(value->nrach_pdu_list == NULL) {
-    NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s failed to allocate nrach ind pdu list (count:%d)\n", __FUNCTION__, value->number_of_initial_scs_detected);
-    return 0;
-  }
-
-  uint8_t i = 0;
-
-  for(i = 0; i < value->number_of_initial_scs_detected; ++i) {
-    nfapi_nrach_indication_pdu_t *pdu = &(value->nrach_pdu_list[i]);
-    uint8_t *nrachPduInstanceEnd = *ppReadPackedMsg + 4 + 6;
-    unpack_tlv_t unpack_fns[] = {
-      { NFAPI_NRACH_INDICATION_REL13_TAG, &pdu->nrach_indication_rel13, &unpack_nrach_indication_rel13_value},
-    };
-
-    if(unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, nrachPduInstanceEnd, 0, 0) == 0)
-      return 0;
-  }
-
-  return 1;
-}
-
-static uint8_t unpack_nrach_indication(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p7_codec_config_t *config) {
-  nfapi_nrach_indication_t *pNfapiMsg = (nfapi_nrach_indication_t *)msg;
-  unpack_p7_tlv_t unpack_fns[] = {
-    { NFAPI_NRACH_INDICATION_BODY_TAG, &pNfapiMsg->nrach_indication_body, &unpack_nrach_indication_body_value},
-  };
-  return (pull16(ppReadPackedMsg, &pNfapiMsg->sfn_sf, end) &&
-          unpack_p7_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, end, config, &pNfapiMsg->vendor_extension));
-}
-
-static uint8_t unpack_nr_dl_node_sync(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p7_codec_config_t *config) {
-  nfapi_nr_dl_node_sync_t *pNfapiMsg = (nfapi_nr_dl_node_sync_t *)msg;
-  return (pull32(ppReadPackedMsg, &pNfapiMsg->t1, end) &&
-          pulls32(ppReadPackedMsg, &pNfapiMsg->delta_sfn_slot, end) &&
-          unpack_p7_tlv_list(NULL, 0, ppReadPackedMsg, end, config, &pNfapiMsg->vendor_extension));
-}
-
-static uint8_t unpack_dl_node_sync(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p7_codec_config_t *config) {
-  nfapi_dl_node_sync_t *pNfapiMsg = (nfapi_dl_node_sync_t *)msg;
-  return (pull32(ppReadPackedMsg, &pNfapiMsg->t1, end) &&
-          pulls32(ppReadPackedMsg, &pNfapiMsg->delta_sfn_sf, end) &&
-          unpack_p7_tlv_list(NULL, 0, ppReadPackedMsg, end, config, &pNfapiMsg->vendor_extension));
-}
-
-
-static uint8_t unpack_nr_ul_node_sync(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p7_codec_config_t *config) {
-  nfapi_nr_ul_node_sync_t *pNfapiMsg = (nfapi_nr_ul_node_sync_t *)msg;
-  return (pull32(ppReadPackedMsg, &pNfapiMsg->t1, end) &&
-          pull32(ppReadPackedMsg, &pNfapiMsg->t2, end) &&
-          pull32(ppReadPackedMsg, &pNfapiMsg->t3, end) &&
-          unpack_p7_tlv_list(NULL, 0, ppReadPackedMsg, end, config, &pNfapiMsg->vendor_extension));
-}
-
-
-static uint8_t unpack_ul_node_sync(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p7_codec_config_t *config) {
-  nfapi_ul_node_sync_t *pNfapiMsg = (nfapi_ul_node_sync_t *)msg;
-  return (pull32(ppReadPackedMsg, &pNfapiMsg->t1, end) &&
-          pull32(ppReadPackedMsg, &pNfapiMsg->t2, end) &&
-          pull32(ppReadPackedMsg, &pNfapiMsg->t3, end) &&
-          unpack_p7_tlv_list(NULL, 0, ppReadPackedMsg, end, config, &pNfapiMsg->vendor_extension));
-}
-
-static uint8_t unpack_timing_info(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p7_codec_config_t *config) {
-  nfapi_timing_info_t *pNfapiMsg = (nfapi_timing_info_t *)msg;
-  return (pull32(ppReadPackedMsg, &pNfapiMsg->last_sfn_sf, end) &&
-          pull32(ppReadPackedMsg, &pNfapiMsg->time_since_last_timing_info, end) &&
-          pull32(ppReadPackedMsg, &pNfapiMsg->dl_config_jitter, end) &&
-          pull32(ppReadPackedMsg, &pNfapiMsg->tx_request_jitter, end) &&
-          pull32(ppReadPackedMsg, &pNfapiMsg->ul_config_jitter, end) &&
-          pull32(ppReadPackedMsg, &pNfapiMsg->hi_dci0_jitter, end) &&
-          pulls32(ppReadPackedMsg, &pNfapiMsg->dl_config_latest_delay, end) &&
-          pulls32(ppReadPackedMsg, &pNfapiMsg->tx_request_latest_delay, end) &&
-          pulls32(ppReadPackedMsg, &pNfapiMsg->ul_config_latest_delay, end) &&
-          pulls32(ppReadPackedMsg, &pNfapiMsg->hi_dci0_latest_delay, end) &&
-          pulls32(ppReadPackedMsg, &pNfapiMsg->dl_config_earliest_arrival, end) &&
-          pulls32(ppReadPackedMsg, &pNfapiMsg->tx_request_earliest_arrival, end) &&
-          pulls32(ppReadPackedMsg, &pNfapiMsg->ul_config_earliest_arrival, end) &&
-          pulls32(ppReadPackedMsg, &pNfapiMsg->hi_dci0_earliest_arrival, end) &&
-          unpack_p7_tlv_list(NULL, 0, ppReadPackedMsg, end, config, &pNfapiMsg->vendor_extension));
-}
-
-
-static uint8_t unpack_nr_timing_info(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p7_codec_config_t *config) {
-  nfapi_nr_timing_info_t *pNfapiMsg = (nfapi_nr_timing_info_t *)msg;
-  return (pull32(ppReadPackedMsg, &pNfapiMsg->last_sfn, end) &&
-          pull32(ppReadPackedMsg, &pNfapiMsg->last_slot, end) &&
-          pull32(ppReadPackedMsg, &pNfapiMsg->time_since_last_timing_info, end) &&
-          pull32(ppReadPackedMsg, &pNfapiMsg->dl_tti_jitter, end) &&
-          pull32(ppReadPackedMsg, &pNfapiMsg->tx_data_request_jitter, end) &&
-          pull32(ppReadPackedMsg, &pNfapiMsg->ul_tti_jitter, end) &&
-          pull32(ppReadPackedMsg, &pNfapiMsg->ul_dci_jitter, end) &&
-          pulls32(ppReadPackedMsg, &pNfapiMsg->dl_tti_latest_delay, end) &&
-          pulls32(ppReadPackedMsg, &pNfapiMsg->tx_data_request_latest_delay, end) &&
-          pulls32(ppReadPackedMsg, &pNfapiMsg->ul_tti_latest_delay, end) &&
-          pulls32(ppReadPackedMsg, &pNfapiMsg->ul_dci_latest_delay, end) &&
-          pulls32(ppReadPackedMsg, &pNfapiMsg->dl_tti_earliest_arrival, end) &&
-          pulls32(ppReadPackedMsg, &pNfapiMsg->tx_data_request_earliest_arrival, end) &&
-          pulls32(ppReadPackedMsg, &pNfapiMsg->ul_tti_earliest_arrival, end) &&
-          pulls32(ppReadPackedMsg, &pNfapiMsg->ul_dci_earliest_arrival, end) &&
-          unpack_p7_tlv_list(NULL, 0, ppReadPackedMsg, end, config, &pNfapiMsg->vendor_extension));
-}
-
-
-
-// unpack length check
-
-static int check_unpack_length(nfapi_message_id_e msgId, uint32_t unpackedBufLen) {
-  int retLen = 0;
-
-  switch (msgId) {
-    case NFAPI_DL_CONFIG_REQUEST:
-      if (unpackedBufLen >= sizeof(nfapi_dl_config_request_t))
-        retLen = sizeof(nfapi_dl_config_request_t);
-
-      break;
-
-    case NFAPI_UL_CONFIG_REQUEST:
-      if (unpackedBufLen >= sizeof(nfapi_ul_config_request_t))
-        retLen = sizeof(nfapi_ul_config_request_t);
-
-      break;
-
-    case NFAPI_SUBFRAME_INDICATION:
-      if (unpackedBufLen >= sizeof(nfapi_subframe_indication_t))
-        retLen = sizeof(nfapi_subframe_indication_t);
-
-      break;
-
-    case NFAPI_HI_DCI0_REQUEST:
-      if (unpackedBufLen >= sizeof(nfapi_hi_dci0_request_t))
-        retLen = sizeof(nfapi_hi_dci0_request_t);
-
-      break;
-
-    case NFAPI_TX_REQUEST:
-      if (unpackedBufLen >= sizeof(nfapi_tx_request_t))
-        retLen = sizeof(nfapi_tx_request_t);
-
-      break;
-
-    case NFAPI_HARQ_INDICATION:
-      if (unpackedBufLen >= sizeof(nfapi_harq_indication_t))
-        retLen = sizeof(nfapi_harq_indication_t);
-
-      break;
-
-    case NFAPI_CRC_INDICATION:
-      if (unpackedBufLen >= sizeof(nfapi_crc_indication_t))
-        retLen = sizeof(nfapi_crc_indication_t);
-
-      break;
-
-    case NFAPI_RX_ULSCH_INDICATION:
-      if (unpackedBufLen >= sizeof(nfapi_rx_indication_t))
-        retLen = sizeof(nfapi_rx_indication_t);
-
-      break;
-
-    case NFAPI_RACH_INDICATION:
-      if (unpackedBufLen >= sizeof(nfapi_rach_indication_t))
-        retLen = sizeof(nfapi_rach_indication_t);
-
-      break;
-
-    case NFAPI_SRS_INDICATION:
-      if (unpackedBufLen >= sizeof(nfapi_srs_indication_t))
-        retLen = sizeof(nfapi_srs_indication_t);
-
-      break;
-
-    case NFAPI_RX_SR_INDICATION:
-      if (unpackedBufLen >= sizeof(nfapi_sr_indication_t))
-        retLen = sizeof(nfapi_sr_indication_t);
-
-      break;
-
-    case NFAPI_RX_CQI_INDICATION:
-      if (unpackedBufLen >= sizeof(nfapi_cqi_indication_t))
-        retLen = sizeof(nfapi_cqi_indication_t);
-
-      break;
-
-    case NFAPI_LBT_DL_CONFIG_REQUEST:
-      if (unpackedBufLen >= sizeof(nfapi_lbt_dl_config_request_t))
-        retLen = sizeof(nfapi_lbt_dl_config_request_t);
-
-      break;
-
-    case NFAPI_LBT_DL_INDICATION:
-      if (unpackedBufLen >= sizeof(nfapi_lbt_dl_indication_t))
-        retLen = sizeof(nfapi_lbt_dl_indication_t);
-
-      break;
-
-    case NFAPI_NB_HARQ_INDICATION:
-      if (unpackedBufLen >= sizeof(nfapi_nb_harq_indication_t))
-        retLen = sizeof(nfapi_nb_harq_indication_t);
-
-      break;
-
-    case NFAPI_NRACH_INDICATION:
-      if (unpackedBufLen >= sizeof(nfapi_nrach_indication_t))
-        retLen = sizeof(nfapi_nrach_indication_t);
-
-      break;
-
-    case NFAPI_DL_NODE_SYNC:
-      if (unpackedBufLen >= sizeof(nfapi_dl_node_sync_t))
-        retLen = sizeof(nfapi_dl_node_sync_t);
-
-      break;
-
-    case NFAPI_UL_NODE_SYNC:
-      if (unpackedBufLen >= sizeof(nfapi_ul_node_sync_t))
-        retLen = sizeof(nfapi_ul_node_sync_t);
-
-      break;
-
-    case NFAPI_TIMING_INFO:
-      if (unpackedBufLen >= sizeof(nfapi_timing_info_t))
-        retLen = sizeof(nfapi_timing_info_t);
-
-      break;
-
-    case NFAPI_UE_RELEASE_REQUEST:
-      if (unpackedBufLen >= sizeof(nfapi_ue_release_request_t))
-        retLen = sizeof(nfapi_ue_release_request_t);
-
-      break;
-
-    case NFAPI_UE_RELEASE_RESPONSE:
-      if (unpackedBufLen >= sizeof(nfapi_ue_release_response_t))
-        retLen = sizeof(nfapi_ue_release_response_t);
-
-      break;
-
-    default:
-      NFAPI_TRACE(NFAPI_TRACE_ERROR, "Unknown message ID %d\n", msgId);
-      break;
-  }
-
-  return retLen;
-}
-
-static int check_nr_unpack_length(nfapi_message_id_e msgId, uint32_t unpackedBufLen)
-{
-	int retLen = 0;
-
-	switch (msgId)
-	{
-		case NFAPI_NR_PHY_MSG_TYPE_DL_TTI_REQUEST:
-			if (unpackedBufLen >= sizeof(nfapi_nr_dl_tti_request_t))
-				retLen = sizeof(nfapi_nr_dl_tti_request_t);
-			break;
-
-		case NFAPI_NR_PHY_MSG_TYPE_UL_TTI_REQUEST:
-			if (unpackedBufLen >= sizeof(nfapi_nr_ul_tti_request_t))
-				retLen = sizeof(nfapi_nr_ul_tti_request_t);
-			break;
-
-		case NFAPI_SUBFRAME_INDICATION:
-			if (unpackedBufLen >= sizeof(nfapi_subframe_indication_t))
-				retLen = sizeof(nfapi_subframe_indication_t);
-			break;
-
-		case NFAPI_NR_PHY_MSG_TYPE_UL_DCI_REQUEST:
-			if (unpackedBufLen >= sizeof(nfapi_nr_ul_dci_request_t))
-				retLen = sizeof(nfapi_nr_ul_dci_request_t);
-			break;
-
-		case NFAPI_NR_PHY_MSG_TYPE_TX_DATA_REQUEST:
-			if (unpackedBufLen >= sizeof(nfapi_nr_tx_data_request_t))
-				retLen = sizeof(nfapi_nr_tx_data_request_t);
-			break;
-		
-		case NFAPI_NR_PHY_MSG_TYPE_RX_DATA_INDICATION:
-			if (unpackedBufLen >= sizeof(nfapi_nr_rx_data_indication_t))
-				retLen = sizeof(nfapi_nr_rx_data_indication_t);
-			break;
-		
-		case NFAPI_NR_PHY_MSG_TYPE_CRC_INDICATION:
-			if (unpackedBufLen >= sizeof(nfapi_nr_crc_indication_t))
-				retLen = sizeof(nfapi_nr_crc_indication_t);
-			break;
-
-		case NFAPI_NR_PHY_MSG_TYPE_RACH_INDICATION:
-			if (unpackedBufLen >= sizeof(nfapi_nr_rach_indication_t))
-				retLen = sizeof(nfapi_nr_rach_indication_t);
-			break;
-		
-		case NFAPI_NR_PHY_MSG_TYPE_UCI_INDICATION:
-			if (unpackedBufLen >= sizeof(nfapi_nr_uci_indication_t))
-				retLen = sizeof(nfapi_nr_uci_indication_t);
-			break;
-		
-		case NFAPI_NR_PHY_MSG_TYPE_SRS_INDICATION:
-			if (unpackedBufLen >= sizeof(nfapi_nr_srs_indication_t))
-				retLen = sizeof(nfapi_nr_srs_indication_t);
-			break;
-		
-		case NFAPI_NR_PHY_MSG_TYPE_DL_NODE_SYNC:
-			if (unpackedBufLen >= sizeof(nfapi_nr_dl_node_sync_t))
-				retLen = sizeof(nfapi_nr_dl_node_sync_t);
-			break;
-
-		case NFAPI_NR_PHY_MSG_TYPE_UL_NODE_SYNC:
-			if (unpackedBufLen >= sizeof(nfapi_nr_ul_node_sync_t))
-				retLen = sizeof(nfapi_nr_ul_node_sync_t);
-			break;
-
-		case NFAPI_TIMING_INFO:
-			if (unpackedBufLen >= sizeof(nfapi_timing_info_t))
-				retLen = sizeof(nfapi_timing_info_t);
-			break;
-
-		case NFAPI_UE_RELEASE_REQUEST:
-			if (unpackedBufLen >= sizeof(nfapi_ue_release_request_t))
-				retLen = sizeof(nfapi_ue_release_request_t);
-			break;
-
-		case NFAPI_UE_RELEASE_RESPONSE:
-			if (unpackedBufLen >= sizeof(nfapi_ue_release_response_t))
-				retLen = sizeof(nfapi_ue_release_response_t);
-			break;
-
-		default:
-			NFAPI_TRACE(NFAPI_TRACE_ERROR, "Unknown message ID %d\n", msgId);
-			break;
-	}
-
-	return retLen;
-}
-
-
-
-// Main unpack functions - public
-
-int nfapi_p7_message_header_unpack(void *pMessageBuf, uint32_t messageBufLen, void *pUnpackedBuf, uint32_t unpackedBufLen, nfapi_p7_codec_config_t *config) {
-  nfapi_p7_message_header_t *pMessageHeader = pUnpackedBuf;
-  uint8_t *pReadPackedMessage = pMessageBuf;
-  uint8_t *end = pMessageBuf + messageBufLen;
-
-  if (pMessageBuf == NULL || pUnpackedBuf == NULL) {
-    NFAPI_TRACE(NFAPI_TRACE_ERROR, "P7 header unpack supplied pointers are null\n");
-    return -1;
-  }
-
-  if (messageBufLen < NFAPI_P7_HEADER_LENGTH || unpackedBufLen < sizeof(nfapi_p7_message_header_t)) {
-    NFAPI_TRACE(NFAPI_TRACE_ERROR, "P7 header unpack supplied message buffer is too small %d, %d\n", messageBufLen, unpackedBufLen);
-    return -1;
-  }
-
-  // process the header
-  if(!(pull16(&pReadPackedMessage, &pMessageHeader->phy_id, end) &&
-       pull16(&pReadPackedMessage, &pMessageHeader->message_id, end) &&
-       pull16(&pReadPackedMessage, &pMessageHeader->message_length, end) &&
-       pull16(&pReadPackedMessage, &pMessageHeader->m_segment_sequence, end) &&
-       pull32(&pReadPackedMessage, &pMessageHeader->checksum, end) &&
-       pull32(&pReadPackedMessage, &pMessageHeader->transmit_timestamp, end)))
-    return -1;
-
-  return 0;
-}
-
-int nfapi_p7_message_unpack(void *pMessageBuf, uint32_t messageBufLen, void *pUnpackedBuf, uint32_t unpackedBufLen, nfapi_p7_codec_config_t *config) {
-  int result = 0;
-  nfapi_p7_message_header_t *pMessageHeader = (nfapi_p7_message_header_t *)pUnpackedBuf;
-  uint8_t *pReadPackedMessage = pMessageBuf;
-  uint8_t *end = pMessageBuf + messageBufLen;
-
-  if (pMessageBuf == NULL || pUnpackedBuf == NULL) {
-    NFAPI_TRACE(NFAPI_TRACE_ERROR, "P7 unpack supplied pointers are null\n");
-    return -1;
-  }
-
-  if (messageBufLen < NFAPI_P7_HEADER_LENGTH || unpackedBufLen < sizeof(nfapi_p7_message_header_t)) {
-    NFAPI_TRACE(NFAPI_TRACE_ERROR, "P7 unpack supplied message buffer is too small %d, %d\n", messageBufLen, unpackedBufLen);
-    return -1;
-  }
-
-  /*
-    uint8_t *ptr = pMessageBuf;
-  printf("\n Read P7 message unpack: ");
-  while(ptr < end){
-    printf(" %d ", *ptr);
-    ptr++;
-  }
-  printf("\n");
-  */
-  // clean the supplied buffer for - tag value blanking
-  (void)memset(pUnpackedBuf, 0, unpackedBufLen);
-
-  // process the header
-  if(!(pull16(&pReadPackedMessage, &pMessageHeader->phy_id, end) &&
-       pull16(&pReadPackedMessage, &pMessageHeader->message_id, end) &&
-       pull16(&pReadPackedMessage, &pMessageHeader->message_length, end) &&
-       pull16(&pReadPackedMessage, &pMessageHeader->m_segment_sequence, end) &&
-       pull32(&pReadPackedMessage, &pMessageHeader->checksum, end) &&
-       pull32(&pReadPackedMessage, &pMessageHeader->transmit_timestamp, end))) {
-    NFAPI_TRACE(NFAPI_TRACE_ERROR, "P7 unpack header failed\n");
-    return -1;
-  }
-
-  if((uint8_t *)(pMessageBuf + pMessageHeader->message_length) > end) {
-    NFAPI_TRACE(NFAPI_TRACE_ERROR, "P7 unpack message length is greater than the message buffer \n");
-    return -1;
-  }
-
-  /*
-  if(check_unpack_length(pMessageHeader->message_id, unpackedBufLen) == 0)
-  {
-    NFAPI_TRACE(NFAPI_TRACE_ERROR, "P7 unpack unpack buffer is not large enough \n");
-    return -1;
-  }
-  */
-
-  // look for the specific message
-  switch (pMessageHeader->message_id) {
-    case NFAPI_DL_CONFIG_REQUEST:
-      if (check_unpack_length(NFAPI_DL_CONFIG_REQUEST, unpackedBufLen))
-        result = unpack_dl_config_request(&pReadPackedMessage,  end, pMessageHeader, config);
-      else
-        return -1;
-
-      break;
-
-    case NFAPI_UL_CONFIG_REQUEST:
-      if (check_unpack_length(NFAPI_UL_CONFIG_REQUEST, unpackedBufLen))
-        result = unpack_ul_config_request(&pReadPackedMessage, end, pMessageHeader, config);
-      else
-        return -1;
-
-      break;
-
-    case NFAPI_TX_REQUEST:
-      if (check_unpack_length(NFAPI_TX_REQUEST, unpackedBufLen))
-        result = unpack_tx_request(&pReadPackedMessage,  end, pMessageHeader, config);
-      else
-        return -1;
-
-      break;
-
-    case NFAPI_HI_DCI0_REQUEST:
-      if (check_unpack_length(NFAPI_HI_DCI0_REQUEST, unpackedBufLen))
-        result = unpack_hi_dci0_request(&pReadPackedMessage,  end, pMessageHeader, config);
-      else
-        return -1;
-
-      break;
-
-    case NFAPI_UE_RELEASE_REQUEST:
-      if (check_unpack_length(NFAPI_UE_RELEASE_REQUEST, unpackedBufLen))
-        result = unpack_ue_release_request(&pReadPackedMessage,  end, pMessageHeader, config);
-      else
-        return -1;
-
-      break;
-
-    case NFAPI_HARQ_INDICATION:
-      if (check_unpack_length(NFAPI_HARQ_INDICATION, unpackedBufLen))
-        result = unpack_harq_indication(&pReadPackedMessage,  end, pMessageHeader, config);
-      else
-        return -1;
-
-      break;
-
-    case NFAPI_CRC_INDICATION:
-      if (check_unpack_length(NFAPI_CRC_INDICATION, unpackedBufLen))
-        result = unpack_crc_indication(&pReadPackedMessage,end, pMessageHeader, config);
-      else
-        return -1;
-
-      break;
-
-    case NFAPI_RX_ULSCH_INDICATION:
-      if (check_unpack_length(NFAPI_RX_ULSCH_INDICATION, unpackedBufLen))
-        result = unpack_rx_indication(&pReadPackedMessage,  end, pMessageHeader, config);
-      else
-        return -1;
-
-      break;
-
-    case NFAPI_RACH_INDICATION:
-      if (check_unpack_length(NFAPI_RACH_INDICATION, unpackedBufLen))
-        result = unpack_rach_indication(&pReadPackedMessage,  end, pMessageHeader, config);
-      else
-        return -1;
-
-      break;
-
-    case NFAPI_SRS_INDICATION:
-      if (check_unpack_length(NFAPI_SRS_INDICATION, unpackedBufLen))
-        result = unpack_srs_indication(&pReadPackedMessage,  end, pMessageHeader, config);
-      else
-        return -1;
-
-      break;
-
-    case NFAPI_RX_SR_INDICATION:
-      if (check_unpack_length(NFAPI_RX_SR_INDICATION, unpackedBufLen))
-        result = unpack_sr_indication(&pReadPackedMessage,  end, pMessageHeader, config);
-      else
-        return -1;
-
-      break;
-
-    case NFAPI_RX_CQI_INDICATION:
-      if (check_unpack_length(NFAPI_RX_CQI_INDICATION, unpackedBufLen))
-        result = unpack_cqi_indication(&pReadPackedMessage,  end, pMessageHeader, config);
-      else
-        return -1;
-
-      break;
-
-    case NFAPI_LBT_DL_CONFIG_REQUEST:
-      if (check_unpack_length(NFAPI_LBT_DL_CONFIG_REQUEST, unpackedBufLen))
-        result = unpack_lbt_dl_config_request(&pReadPackedMessage,  end, pMessageHeader, config);
-      else
-        return -1;
-
-      break;
-
-    case NFAPI_LBT_DL_INDICATION:
-      if (check_unpack_length(NFAPI_LBT_DL_INDICATION, unpackedBufLen))
-        result = unpack_lbt_dl_indication(&pReadPackedMessage,  end, pMessageHeader, config);
-      else
-        return -1;
-
-      break;
-
-    case NFAPI_NB_HARQ_INDICATION:
-      if (check_unpack_length(NFAPI_NB_HARQ_INDICATION, unpackedBufLen))
-        result = unpack_nb_harq_indication(&pReadPackedMessage,  end, pMessageHeader, config);
-      else
-        return -1;
-
-      break;
-
-    case NFAPI_NRACH_INDICATION:
-      if (check_unpack_length(NFAPI_NRACH_INDICATION, unpackedBufLen))
-        result = unpack_nrach_indication(&pReadPackedMessage,  end, pMessageHeader, config);
-      else
-        return -1;
-
-      break;
-
-    case NFAPI_DL_NODE_SYNC:
-      if (check_unpack_length(NFAPI_DL_NODE_SYNC, unpackedBufLen))
-        result = unpack_dl_node_sync(&pReadPackedMessage,  end, pMessageHeader, config);
-      else
-        return -1;
-
-      break;
-
-    case NFAPI_UL_NODE_SYNC:
-      if (check_unpack_length(NFAPI_UL_NODE_SYNC, unpackedBufLen))
-        result = unpack_ul_node_sync(&pReadPackedMessage, end, pMessageHeader, config);
-      else
-        return -1;
-
-      break;
-
-    case NFAPI_TIMING_INFO:
-      if (check_unpack_length(NFAPI_TIMING_INFO, unpackedBufLen))
-        result = unpack_timing_info(&pReadPackedMessage, end, pMessageHeader, config);
-      else
-        return -1;
-
-      break;
-
-    case NFAPI_UE_RELEASE_RESPONSE:
-      if (check_unpack_length(NFAPI_UE_RELEASE_RESPONSE, unpackedBufLen))
-        result = unpack_ue_release_resp(&pReadPackedMessage,  end, pMessageHeader, config);
-      else
-        return -1;
-
-      break;
-
-    default:
-      if(pMessageHeader->message_id >= NFAPI_VENDOR_EXT_MSG_MIN &&
-          pMessageHeader->message_id <= NFAPI_VENDOR_EXT_MSG_MAX) {
-        if(config && config->unpack_p7_vendor_extension) {
-          result = (config->unpack_p7_vendor_extension)(pMessageHeader, &pReadPackedMessage, end, config);
-        } else {
-          NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s VE NFAPI message ID %d. No ve decoder provided\n", __FUNCTION__, pMessageHeader->message_id);
-        }
-      } else {
-        NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s NFAPI Unknown message ID %d\n", __FUNCTION__, pMessageHeader->message_id);
-      }
-
-      break;
-  }
-
-  if(result == 0)
-    return -1;
-  else
-    return 0;
-}
-
-int nfapi_nr_p7_message_unpack(void *pMessageBuf, uint32_t messageBufLen, void *pUnpackedBuf, uint32_t unpackedBufLen, nfapi_p7_codec_config_t* config)
-{
-	int result = 0;
-	nfapi_p7_message_header_t *pMessageHeader = (nfapi_p7_message_header_t*)pUnpackedBuf;
-	uint8_t *pReadPackedMessage = pMessageBuf;
-	uint8_t *end = pMessageBuf + messageBufLen;
-	
-	if (pMessageBuf == NULL || pUnpackedBuf == NULL)
-	{
-		NFAPI_TRACE(NFAPI_TRACE_ERROR, "P7 unpack supplied pointers are null\n");
-		return -1;
-	}
-
-	if (messageBufLen < NFAPI_P7_HEADER_LENGTH || unpackedBufLen < sizeof(nfapi_p7_message_header_t))
-	{
-		NFAPI_TRACE(NFAPI_TRACE_ERROR, "P7 unpack supplied message buffer is too small %d, %d\n", messageBufLen, unpackedBufLen);
-		return -1;
-	}
-  
-    // uint8_t *ptr = pMessageBuf;
-	// printf("\n Read P7 message unpack: ");
-	// while(ptr < end){
-	// 	printf(" %d ", *ptr);
-	// 	ptr++;
-	// }
-	// printf("\n");
-
-	// clean the supplied buffer for - tag value blanking
-	(void)memset(pUnpackedBuf, 0, unpackedBufLen);
-
-	// process the header
-	if(!(pull16(&pReadPackedMessage, &pMessageHeader->phy_id, end) &&
-		 pull16(&pReadPackedMessage, &pMessageHeader->message_id, end) &&
-		 pull16(&pReadPackedMessage, &pMessageHeader->message_length, end) &&
-		 pull16(&pReadPackedMessage, &pMessageHeader->m_segment_sequence, end) &&
-		 pull32(&pReadPackedMessage, &pMessageHeader->checksum, end) &&
-		 pull32(&pReadPackedMessage, &pMessageHeader->transmit_timestamp, end)))
-	{
-		NFAPI_TRACE(NFAPI_TRACE_ERROR, "P7 unpack header failed\n");
-		return -1;
-	}
-
-	if((uint8_t*)(pMessageBuf + pMessageHeader->message_length) > end)
-	{
-		NFAPI_TRACE(NFAPI_TRACE_ERROR, "P7 unpack message length is greater than the message buffer \n");
-		return -1;
-	}
-
-	/*
-	if(check_unpack_length(pMessageHeader->message_id, unpackedBufLen) == 0)
-	{
-		NFAPI_TRACE(NFAPI_TRACE_ERROR, "P7 unpack unpack buffer is not large enough \n");
-		return -1;
-	}
-	*/
-
-	// look for the specific message
-	switch (pMessageHeader->message_id)
-	{   
-		case NFAPI_NR_PHY_MSG_TYPE_DL_TTI_REQUEST:
-			if (check_nr_unpack_length(NFAPI_NR_PHY_MSG_TYPE_DL_TTI_REQUEST, unpackedBufLen))
-				result = unpack_dl_tti_request(&pReadPackedMessage,  end, pMessageHeader, config);
-			else
-				return -1;
-			break;
-
-		case NFAPI_NR_PHY_MSG_TYPE_UL_TTI_REQUEST:
-			if (check_nr_unpack_length(NFAPI_NR_PHY_MSG_TYPE_UL_TTI_REQUEST, unpackedBufLen))
-				result = unpack_ul_tti_request(&pReadPackedMessage,  end, pMessageHeader, config);
-			else
-				return -1;
-			break;
-		case NFAPI_NR_PHY_MSG_TYPE_TX_DATA_REQUEST:
-			if (check_nr_unpack_length(NFAPI_NR_PHY_MSG_TYPE_TX_DATA_REQUEST, unpackedBufLen))
-				result = unpack_tx_data_request(&pReadPackedMessage,  end, pMessageHeader, config);
-			else
-				return -1;
-			break;
-		case NFAPI_NR_PHY_MSG_TYPE_UL_DCI_REQUEST:
-			if (check_nr_unpack_length(NFAPI_NR_PHY_MSG_TYPE_UL_DCI_REQUEST, unpackedBufLen))
-				result = unpack_ul_dci_request(&pReadPackedMessage,  end, pMessageHeader, config);
-			else
-				return -1;
-			break;
-		
-		case NFAPI_UE_RELEASE_REQUEST:
-			if (check_nr_unpack_length(NFAPI_UE_RELEASE_REQUEST, unpackedBufLen))
-				result = unpack_ue_release_request(&pReadPackedMessage,  end, pMessageHeader, config);
-			else
-				return -1;
-			break;
-		case NFAPI_NR_PHY_MSG_TYPE_SLOT_INDICATION:
-			if (check_nr_unpack_length(NFAPI_NR_PHY_MSG_TYPE_SLOT_INDICATION, unpackedBufLen)){
-				nfapi_nr_slot_indication_scf_t* msg = (nfapi_nr_slot_indication_scf_t*) pMessageHeader;
-				result = unpack_nr_slot_indication(&pReadPackedMessage,  end, msg, config);
-			}
-			else
-				return -1;
-			break;
-
-		case  NFAPI_NR_PHY_MSG_TYPE_RX_DATA_INDICATION:
-			if (check_nr_unpack_length(NFAPI_NR_PHY_MSG_TYPE_RX_DATA_INDICATION, unpackedBufLen)){
-				nfapi_nr_rx_data_indication_t* msg = (nfapi_nr_rx_data_indication_t*) pMessageHeader;
-				msg->pdu_list = (nfapi_nr_rx_data_pdu_t*) malloc(sizeof(nfapi_nr_rx_data_pdu_t));
-				msg->pdu_list->pdu = (uint8_t *) malloc(sizeof(uint8_t));
-				result = unpack_nr_rx_data_indication(&pReadPackedMessage,  end, msg, config);
-			}
-			else
-				return -1;
-			break;
-
-		case  NFAPI_NR_PHY_MSG_TYPE_CRC_INDICATION:
-			if (check_nr_unpack_length(NFAPI_NR_PHY_MSG_TYPE_CRC_INDICATION, unpackedBufLen)){
-
-				nfapi_nr_crc_indication_t* msg = (nfapi_nr_crc_indication_t*) pMessageHeader;
-				msg->crc_list = (nfapi_nr_crc_t*) malloc(sizeof(nfapi_nr_crc_t));
-				result = unpack_nr_crc_indication(&pReadPackedMessage,end , msg, config);
-			}
-			else
-				return -1;
-			break;
-
-		case  NFAPI_NR_PHY_MSG_TYPE_UCI_INDICATION:
-			if (check_nr_unpack_length(NFAPI_NR_PHY_MSG_TYPE_UCI_INDICATION, unpackedBufLen)){
-				nfapi_nr_uci_indication_t* msg = (nfapi_nr_uci_indication_t*) pMessageHeader;
-				msg->uci_list = (nfapi_nr_uci_t*) malloc(sizeof(nfapi_nr_uci_t));
-				result = unpack_nr_uci_indication(&pReadPackedMessage,  end, msg, config);
-			}
-			else
-				return -1;
-			break;
-
-		case  NFAPI_NR_PHY_MSG_TYPE_SRS_INDICATION:
-			if (check_nr_unpack_length(NFAPI_NR_PHY_MSG_TYPE_SRS_INDICATION, unpackedBufLen)){
-				nfapi_nr_srs_indication_t* msg = (nfapi_nr_srs_indication_t*) pMessageHeader;
-				msg->pdu_list = (nfapi_nr_srs_indication_pdu_t*) malloc(sizeof(nfapi_nr_srs_indication_pdu_t));
-				result = unpack_nr_srs_indication(&pReadPackedMessage,  end, msg, config);
-			}
-			else
-				return -1;
-			break;
-
-		case  NFAPI_NR_PHY_MSG_TYPE_RACH_INDICATION:
-			if (check_nr_unpack_length(NFAPI_NR_PHY_MSG_TYPE_RACH_INDICATION, unpackedBufLen)){
-				nfapi_nr_rach_indication_t* msg = (nfapi_nr_rach_indication_t*) pMessageHeader;
-				result = unpack_nr_rach_indication(&pReadPackedMessage,  end, msg, config);
-			}
-			else
-				return -1;
-			break;
-
-		case NFAPI_NR_PHY_MSG_TYPE_DL_NODE_SYNC:
-			if (check_nr_unpack_length(NFAPI_NR_PHY_MSG_TYPE_DL_NODE_SYNC, unpackedBufLen))
-				result = unpack_nr_dl_node_sync(&pReadPackedMessage,  end, pMessageHeader, config);
-			else
-				return -1;
-			break;
-
-		case NFAPI_NR_PHY_MSG_TYPE_UL_NODE_SYNC:
-			if (check_nr_unpack_length(NFAPI_NR_PHY_MSG_TYPE_UL_NODE_SYNC, unpackedBufLen))
-				result = unpack_nr_ul_node_sync(&pReadPackedMessage, end , pMessageHeader, config);
-			else
-				return -1;
-			break;
-
-		case NFAPI_TIMING_INFO:
-			if (check_nr_unpack_length(NFAPI_TIMING_INFO, unpackedBufLen))
-				result = unpack_nr_timing_info(&pReadPackedMessage, end, pMessageHeader, config);
-			else
-				return -1;
-			break;
-
-		case NFAPI_UE_RELEASE_RESPONSE:
-			if (check_nr_unpack_length(NFAPI_UE_RELEASE_RESPONSE, unpackedBufLen))
-				result = unpack_ue_release_resp(&pReadPackedMessage,  end, pMessageHeader, config);
-			else
-				return -1;
-			break;
-
-		default:
-
-			if(pMessageHeader->message_id >= NFAPI_VENDOR_EXT_MSG_MIN && 
-			   pMessageHeader->message_id <= NFAPI_VENDOR_EXT_MSG_MAX)
-			{
-				if(config && config->unpack_p7_vendor_extension)
-				{
-					result = (config->unpack_p7_vendor_extension)(pMessageHeader, &pReadPackedMessage, end, config);
-				}
-				else
-				{
-					NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s VE NFAPI message ID %d. No ve decoder provided\n", __FUNCTION__, pMessageHeader->message_id);
-				}
-			}
-			else
-			{
-				NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s NFAPI Unknown message ID %d\n", __FUNCTION__, pMessageHeader->message_id);
-			}
-			break;
-	}
-
-	if(result == 0)
-		return -1;
-	else 
-		return 0;
-}
-
-
+/*
+ * Copyright 2017 Cisco Systems, Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+
+#include <assert.h>
+#include <signal.h>
+#include <sys/time.h>
+#include <sys/socket.h>
+#include <sys/types.h>
+#include <netinet/in.h>
+#include <arpa/inet.h>
+#include <zlib.h>
+#include <sched.h>
+#include <time.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+#include <errno.h>
+#include <pthread.h>
+#include <stdint.h>
+
+#include <nfapi_interface.h>
+#include <nfapi.h>
+#include <debug.h>
+#include "nfapi_nr_interface_scf.h"
+
+extern int nfapi_unpack_p7_vendor_extension(nfapi_p7_message_header_t *header, uint8_t **ppReadPackedMsg, void *user_data);
+extern int nfapi_pack_p7_vendor_extension(nfapi_p7_message_header_t *header, uint8_t **ppWritePackedMsg, void *user_data);
+
+uint32_t nfapi_calculate_checksum(uint8_t *buffer, uint16_t len) {
+  uint32_t chksum = 0;
+  // calcaulte upto the checksum
+  chksum = crc32(chksum, buffer, 8);
+  // skip the checksum
+  uint8_t zeros[4] = {0, 0, 0, 0};
+  chksum = crc32(chksum, zeros, 4);
+  // continu with the rest of the mesage
+  chksum = crc32(chksum, &buffer[NFAPI_P7_HEADER_LENGTH], len - NFAPI_P7_HEADER_LENGTH);
+  // return the inverse
+  return ~(chksum);
+}
+
+int nfapi_p7_update_checksum(uint8_t *buffer, uint32_t len) {
+  uint32_t checksum = nfapi_calculate_checksum(buffer, len);
+  uint8_t *p_write = &buffer[8];
+  return (push32(checksum, &p_write, buffer + len) > 0 ? 0 : -1);
+}
+
+int nfapi_p7_update_transmit_timestamp(uint8_t *buffer, uint32_t timestamp) {
+  uint8_t *p_write = &buffer[12];
+  return (push32(timestamp, &p_write, buffer + 16) > 0 ? 0 : -1);
+}
+
+uint32_t nfapi_p7_calculate_checksum(uint8_t *buffer, uint32_t len) {
+  return nfapi_calculate_checksum(buffer, len);
+}
+
+void *nfapi_p7_allocate(size_t size, nfapi_p7_codec_config_t *config) {
+  if(size == 0)
+    return 0;
+
+  void *buffer_p = NULL;
+
+  if(config && config->allocate) {
+    buffer_p = (config->allocate)(size);
+
+    if(buffer_p != NULL) {
+      memset(buffer_p,0,size);
+    }
+
+    return buffer_p;
+  } else {
+    buffer_p = calloc(1, size);
+    return buffer_p;
+  }
+}
+
+void nfapi_p7_deallocate(void *ptr, nfapi_p7_codec_config_t *config) {
+  if(ptr == NULL)
+    return;
+
+  if(config && config->deallocate) {
+    return (config->deallocate)(ptr);
+  } else {
+    return free(ptr);
+  }
+}
+// Pack routines
+
+
+static uint8_t pack_dl_config_dci_dl_pdu_rel8_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_dl_config_dci_dl_pdu_rel8_t *value = (nfapi_dl_config_dci_dl_pdu_rel8_t *)tlv;
+  //NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s() dci_format:%u\n", __FUNCTION__, value->dci_format);
+  return ( push8(value->dci_format, ppWritePackedMsg, end) &&
+           push8(value->cce_idx, ppWritePackedMsg, end) &&
+           push8(value->aggregation_level, ppWritePackedMsg, end) &&
+           push16(value->rnti, ppWritePackedMsg, end) &&
+           push8(value->resource_allocation_type, ppWritePackedMsg, end) &&
+           push8(value->virtual_resource_block_assignment_flag, ppWritePackedMsg, end) &&
+           push32(value->resource_block_coding, ppWritePackedMsg, end) &&
+           push8(value->mcs_1, ppWritePackedMsg, end) &&
+           push8(value->redundancy_version_1, ppWritePackedMsg, end) &&
+           push8(value->new_data_indicator_1, ppWritePackedMsg, end) &&
+           push8(value->transport_block_to_codeword_swap_flag, ppWritePackedMsg, end) &&
+           push8(value->mcs_2, ppWritePackedMsg, end) &&
+           push8(value->redundancy_version_2, ppWritePackedMsg, end) &&
+           push8(value->new_data_indicator_2, ppWritePackedMsg, end) &&
+           push8(value->harq_process, ppWritePackedMsg, end) &&
+           push8(value->tpmi, ppWritePackedMsg, end) &&
+           push8(value->pmi, ppWritePackedMsg, end) &&
+           push8(value->precoding_information, ppWritePackedMsg, end) &&
+           push8(value->tpc, ppWritePackedMsg, end) &&
+           push8(value->downlink_assignment_index, ppWritePackedMsg, end) &&
+           push8(value->ngap, ppWritePackedMsg, end) &&
+           push8(value->transport_block_size_index, ppWritePackedMsg, end) &&
+           push8(value->downlink_power_offset, ppWritePackedMsg, end) &&
+           push8(value->allocate_prach_flag, ppWritePackedMsg, end) &&
+           push8(value->preamble_index, ppWritePackedMsg, end) &&
+           push8(value->prach_mask_index, ppWritePackedMsg, end) &&
+           push8(value->rnti_type, ppWritePackedMsg, end) &&
+           push16(value->transmission_power, ppWritePackedMsg, end));
+}
+
+static uint8_t pack_dl_config_dci_dl_pdu_rel9_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_dl_config_dci_dl_pdu_rel9_t *value = (nfapi_dl_config_dci_dl_pdu_rel9_t *)tlv;
+  return( push8(value->mcch_flag, ppWritePackedMsg, end) &&
+          push8(value->mcch_change_notification, ppWritePackedMsg, end) &&
+          push8(value->scrambling_identity, ppWritePackedMsg, end));
+}
+
+static uint8_t pack_dl_config_dci_dl_pdu_rel10_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_dl_config_dci_dl_pdu_rel10_t *value = (nfapi_dl_config_dci_dl_pdu_rel10_t *)tlv;
+  return ( push8(value->cross_carrier_scheduling_flag, ppWritePackedMsg, end) &&
+           push8(value->carrier_indicator, ppWritePackedMsg, end) &&
+           push8(value->srs_flag, ppWritePackedMsg, end) &&
+           push8(value->srs_request, ppWritePackedMsg, end) &&
+           push8(value->antenna_ports_scrambling_and_layers, ppWritePackedMsg, end) &&
+           push8(value->total_dci_length_including_padding, ppWritePackedMsg, end) &&
+           push8(value->n_dl_rb, ppWritePackedMsg, end));
+}
+
+static uint8_t pack_dl_config_dci_dl_pdu_rel11_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_dl_config_dci_dl_pdu_rel11_t *value = (nfapi_dl_config_dci_dl_pdu_rel11_t *)tlv;
+  return ( push8(value->harq_ack_resource_offset, ppWritePackedMsg, end) &&
+           push8(value->pdsch_re_mapping_quasi_co_location_indicator, ppWritePackedMsg, end));
+}
+
+static uint8_t pack_dl_config_dci_dl_pdu_rel12_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_dl_config_dci_dl_pdu_rel12_t *value = (nfapi_dl_config_dci_dl_pdu_rel12_t *)tlv;
+  return ( push8(value->primary_cell_type, ppWritePackedMsg, end) &&
+           push8(value->ul_dl_configuration_flag, ppWritePackedMsg, end) &&
+           push8(value->number_ul_dl_configurations, ppWritePackedMsg, end) &&
+           pusharray8(value->ul_dl_configuration_indication, NFAPI_MAX_UL_DL_CONFIGURATIONS, value->number_ul_dl_configurations, ppWritePackedMsg, end));
+}
+
+static uint8_t pack_tpm_value(nfapi_dl_config_dci_dl_tpm_t *value, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  if (!( push8(value->num_prb_per_subband, ppWritePackedMsg, end) &&
+         push8(value->number_of_subbands, ppWritePackedMsg, end) &&
+         push8(value->num_antennas, ppWritePackedMsg, end)))
+    return 0;
+
+  uint8_t idx = 0;
+
+  for(idx = 0; idx < value->number_of_subbands; ++idx) {
+    nfapi_dl_config_dci_dl_tpm_subband_info_t *subband_info = &(value->subband_info[idx]);
+
+    if(!(push8(subband_info->subband_index, ppWritePackedMsg, end) &&
+         push8(subband_info->scheduled_ues, ppWritePackedMsg, end)))
+      return 0;
+
+    uint8_t antenna_idx = 0;
+    uint8_t scheduled_ue_idx = 0;
+
+    for(antenna_idx = 0; antenna_idx < value->num_antennas; ++antenna_idx) {
+      for(scheduled_ue_idx = 0; scheduled_ue_idx < subband_info->scheduled_ues; ++scheduled_ue_idx) {
+        if(!push16(subband_info->precoding_value[antenna_idx][scheduled_ue_idx], ppWritePackedMsg, end))
+          return 0;
+      }
+    }
+  }
+
+  return 1;
+}
+
+
+static uint8_t pack_dl_tti_csi_rs_pdu_rel15_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_nr_dl_tti_csi_rs_pdu_rel15_t *value = (nfapi_nr_dl_tti_csi_rs_pdu_rel15_t *)tlv;
+  return(
+          push16(value->bwp_size, ppWritePackedMsg, end) &&
+          push16(value->bwp_start, ppWritePackedMsg, end) &&
+          push8(value->subcarrier_spacing, ppWritePackedMsg, end) &&
+          push8(value->cyclic_prefix, ppWritePackedMsg, end) &&
+          push16(value->start_rb, ppWritePackedMsg, end) &&
+          push16(value->nr_of_rbs, ppWritePackedMsg, end) &&
+          push8(value->csi_type, ppWritePackedMsg, end) &&
+          push8(value->row, ppWritePackedMsg, end) &&
+          push16(value->freq_domain, ppWritePackedMsg, end) &&
+          push8(value->symb_l0, ppWritePackedMsg, end) &&
+          push8(value->symb_l1, ppWritePackedMsg, end) &&
+          push8(value->cdm_type, ppWritePackedMsg, end) &&
+          push8(value->freq_density, ppWritePackedMsg, end) &&
+          push16(value->scramb_id, ppWritePackedMsg, end) &&
+          push8(value->power_control_offset, ppWritePackedMsg, end) &&
+          push8(value->power_control_offset_ss, ppWritePackedMsg, end)
+        );
+}
+
+
+static uint8_t pack_dl_tti_pdcch_pdu_rel15_value(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+
+	nfapi_nr_dl_tti_pdcch_pdu_rel15_t* value = (nfapi_nr_dl_tti_pdcch_pdu_rel15_t*)tlv;
+
+	for(uint8_t i = 0; i < MAX_DCI_CORESET; ++i)
+	{
+		if(!(push16(value->dci_pdu[i].RNTI, ppWritePackedMsg, end) &&
+		push16(value->dci_pdu[i].ScramblingId, ppWritePackedMsg, end) &&
+		push16(value->dci_pdu[i].ScramblingRNTI, ppWritePackedMsg, end) &&
+		push8(value->dci_pdu[i].CceIndex, ppWritePackedMsg, end) &&
+		push8(value->dci_pdu[i].AggregationLevel, ppWritePackedMsg, end) &&
+		push8(value->dci_pdu[i].beta_PDCCH_1_0, ppWritePackedMsg, end) &&
+		push8(value->dci_pdu[i].powerControlOffsetSS, ppWritePackedMsg, end) &&
+		push16(value->dci_pdu[i].PayloadSizeBits, ppWritePackedMsg, end) &&
+		pusharray8(value->dci_pdu[i].Payload, value->dci_pdu[i].PayloadSizeBits, value->dci_pdu[i].PayloadSizeBits, ppWritePackedMsg, end)))
+		return 0;
+
+	}
+	// TODO: resolve the packaging of array (currently sending a single element)
+	return(
+		push16(value->BWPSize, ppWritePackedMsg, end) &&
+		push16(value->BWPStart, ppWritePackedMsg, end) &&
+		push8(value->SubcarrierSpacing, ppWritePackedMsg, end) &&
+		push8(value->CyclicPrefix, ppWritePackedMsg, end) &&
+		push8(value->StartSymbolIndex, ppWritePackedMsg, end) &&
+		push8(value->DurationSymbols, ppWritePackedMsg, end) &&
+		pusharray8(value->FreqDomainResource, 6, 6, ppWritePackedMsg, end) &&
+		push8(value->CceRegMappingType, ppWritePackedMsg, end) &&
+		push8(value->RegBundleSize, ppWritePackedMsg, end) &&
+		push8(value->InterleaverSize, ppWritePackedMsg, end) &&
+		push8(value->CoreSetType, ppWritePackedMsg, end) &&
+		push16(value->ShiftIndex, ppWritePackedMsg, end) &&
+		push8(value->precoderGranularity, ppWritePackedMsg, end) &&
+		push16(value->numDlDci, ppWritePackedMsg, end));
+}
+
+
+static uint8_t pack_dl_tti_pdsch_pdu_rel15_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_nr_dl_tti_pdsch_pdu_rel15_t *value = (nfapi_nr_dl_tti_pdsch_pdu_rel15_t *)tlv;
+  // TODO: resolve the packaging of array (currently sending a single element)
+  return(
+          push16(value->pduBitmap, ppWritePackedMsg, end) &&
+          push16(value->rnti, ppWritePackedMsg, end) &&
+          push16(value->pduIndex, ppWritePackedMsg, end) &&
+          push16(value->BWPSize, ppWritePackedMsg, end) &&
+          push16(value->BWPStart, ppWritePackedMsg, end) &&
+          push8(value->SubcarrierSpacing, ppWritePackedMsg, end) &&
+          push8(value->CyclicPrefix, ppWritePackedMsg, end) &&
+          push8(value->NrOfCodewords, ppWritePackedMsg, end) &&
+          pusharray16(value->targetCodeRate, 2, 1, ppWritePackedMsg, end) &&
+          pusharray8(value->qamModOrder, 2, 1, ppWritePackedMsg, end) &&
+          pusharray8(value->mcsIndex, 2, 1, ppWritePackedMsg, end) &&
+          pusharray8(value->mcsTable, 2, 1, ppWritePackedMsg, end) &&
+          pusharray8(value->rvIndex, 2, 1, ppWritePackedMsg, end) &&
+          pusharray32(value->TBSize, 2, 1, ppWritePackedMsg, end) &&
+          push16(value->dataScramblingId, ppWritePackedMsg, end) &&
+          push8(value->nrOfLayers, ppWritePackedMsg, end) &&
+          push8(value->transmissionScheme, ppWritePackedMsg, end) &&
+          push8(value->refPoint, ppWritePackedMsg, end) &&
+          push16(value->dlDmrsSymbPos, ppWritePackedMsg, end) &&
+          push8(value->dmrsConfigType, ppWritePackedMsg, end) &&
+          push16(value->dlDmrsScramblingId, ppWritePackedMsg, end) &&
+          push8(value->SCID, ppWritePackedMsg, end) &&
+          push8(value->numDmrsCdmGrpsNoData, ppWritePackedMsg, end) &&
+          push16(value->dmrsPorts, ppWritePackedMsg, end) &&
+          push8(value->resourceAlloc, ppWritePackedMsg, end) &&
+          push16(value->rbStart, ppWritePackedMsg, end) &&
+          push16(value->rbSize, ppWritePackedMsg, end) &&
+          push8(value->VRBtoPRBMapping, ppWritePackedMsg, end) &&
+          push8(value->StartSymbolIndex, ppWritePackedMsg, end) &&
+          push8(value->NrOfSymbols, ppWritePackedMsg, end) &&
+          push8(value->PTRSPortIndex, ppWritePackedMsg, end) &&
+          push8(value->PTRSTimeDensity, ppWritePackedMsg, end) &&
+          push8(value->PTRSFreqDensity, ppWritePackedMsg, end) &&
+          push8(value->PTRSReOffset, ppWritePackedMsg, end)
+        );
+}
+
+
+static uint8_t pack_dl_tti_ssb_pdu_rel15_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_nr_dl_tti_ssb_pdu_rel15_t *value = (nfapi_nr_dl_tti_ssb_pdu_rel15_t *)tlv;
+  return(
+          push16(value->PhysCellId, ppWritePackedMsg, end) &&
+          push8(value->BetaPss, ppWritePackedMsg, end) &&
+          push8(value->SsbBlockIndex, ppWritePackedMsg, end) &&
+          push8(value->SsbSubcarrierOffset, ppWritePackedMsg, end) &&
+          push16(value->ssbOffsetPointA, ppWritePackedMsg, end) &&
+          push8(value->bchPayloadFlag, ppWritePackedMsg, end) &&
+          push32(value->bchPayload, ppWritePackedMsg, end)
+          // TODO: pack precoding_and_beamforming too
+        );
+}
+
+
+static uint8_t pack_dl_config_dci_dl_pdu_rel13_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_dl_config_dci_dl_pdu_rel13_t *value = (nfapi_dl_config_dci_dl_pdu_rel13_t *)tlv;
+  return( push8(value->laa_end_partial_sf_flag, ppWritePackedMsg, end) &&
+          push8(value->laa_end_partial_sf_configuration, ppWritePackedMsg, end) &&
+          push8(value->initial_lbt_sf, ppWritePackedMsg, end) &&
+          push8(value->codebook_size_determination, ppWritePackedMsg, end) &&
+          push8(value->drms_table_flag, ppWritePackedMsg, end) &&
+          push8(value->tpm_struct_flag, ppWritePackedMsg, end) &&
+          (value->tpm_struct_flag == 1 ? pack_tpm_value(&(value->tpm), ppWritePackedMsg, end) : 1));
+}
+
+static uint8_t pack_dl_config_bch_pdu_rel8_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_dl_config_bch_pdu_rel8_t *value = (nfapi_dl_config_bch_pdu_rel8_t *)tlv;
+  //NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s()\n", __FUNCTION__);
+  return( push16(value->length, ppWritePackedMsg, end) &&
+          push16(value->pdu_index, ppWritePackedMsg, end) &&
+          push16(value->transmission_power, ppWritePackedMsg, end));
+}
+static uint8_t pack_dl_config_mch_pdu_rel8_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_dl_config_mch_pdu_rel8_t *value = (nfapi_dl_config_mch_pdu_rel8_t *)tlv;
+  return ( push16(value->length, ppWritePackedMsg, end) &&
+           push16(value->pdu_index, ppWritePackedMsg, end) &&
+           push16(value->rnti, ppWritePackedMsg, end) &&
+           push8(value->resource_allocation_type, ppWritePackedMsg, end) &&
+           push32(value->resource_block_coding, ppWritePackedMsg, end) &&
+           push8(value->modulation, ppWritePackedMsg, end) &&
+           push16(value->transmission_power, ppWritePackedMsg, end) &&
+           push16(value->mbsfn_area_id, ppWritePackedMsg, end));
+}
+
+static uint8_t pack_bf_vector_info(void *elem, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_bf_vector_t *bf = (nfapi_bf_vector_t *)elem;
+  return ( push8(bf->subband_index, ppWritePackedMsg, end) &&
+           push8(bf->num_antennas, ppWritePackedMsg, end) &&
+           pusharray16(bf->bf_value, NFAPI_MAX_NUM_ANTENNAS, bf->num_antennas, ppWritePackedMsg, end));
+}
+static uint8_t pack_dl_config_dlsch_pdu_rel8_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_dl_config_dlsch_pdu_rel8_t *value = (nfapi_dl_config_dlsch_pdu_rel8_t *)tlv;
+  return ( push16(value->length, ppWritePackedMsg, end) &&
+           push16(value->pdu_index, ppWritePackedMsg, end) &&
+           push16(value->rnti, ppWritePackedMsg, end) &&
+           push8(value->resource_allocation_type, ppWritePackedMsg, end) &&
+           push8(value->virtual_resource_block_assignment_flag, ppWritePackedMsg, end) &&
+           push32(value->resource_block_coding, ppWritePackedMsg, end) &&
+           push8(value->modulation, ppWritePackedMsg, end) &&
+           push8(value->redundancy_version, ppWritePackedMsg, end) &&
+           push8(value->transport_blocks, ppWritePackedMsg, end) &&
+           push8(value->transport_block_to_codeword_swap_flag, ppWritePackedMsg, end) &&
+           push8(value->transmission_scheme, ppWritePackedMsg, end) &&
+           push8(value->number_of_layers, ppWritePackedMsg, end) &&
+           push8(value->number_of_subbands, ppWritePackedMsg, end) &&
+           pusharray8(value->codebook_index, NFAPI_MAX_NUM_SUBBANDS, value->number_of_subbands, ppWritePackedMsg, end) &&
+           push8(value->ue_category_capacity, ppWritePackedMsg, end) &&
+           push8(value->pa, ppWritePackedMsg, end) &&
+           push8(value->delta_power_offset_index, ppWritePackedMsg, end) &&
+           push8(value->ngap, ppWritePackedMsg, end) &&
+           push8(value->nprb, ppWritePackedMsg, end) &&
+           push8(value->transmission_mode, ppWritePackedMsg, end) &&
+           push8(value->num_bf_prb_per_subband, ppWritePackedMsg, end) &&
+           push8(value->num_bf_vector, ppWritePackedMsg, end) &&
+           packarray(value->bf_vector, sizeof(nfapi_bf_vector_t), NFAPI_MAX_BF_VECTORS, value->num_bf_vector, ppWritePackedMsg, end, &pack_bf_vector_info));
+}
+static uint8_t pack_dl_config_dlsch_pdu_rel9_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_dl_config_dlsch_pdu_rel9_t *value = (nfapi_dl_config_dlsch_pdu_rel9_t *)tlv;
+  return ( push8(value->nscid, ppWritePackedMsg, end) );
+}
+static uint8_t pack_dl_config_dlsch_pdu_rel10_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_dl_config_dlsch_pdu_rel10_t *value = (nfapi_dl_config_dlsch_pdu_rel10_t *)tlv;
+  return ( push8(value->csi_rs_flag, ppWritePackedMsg, end) &&
+           push8(value->csi_rs_resource_config_r10, ppWritePackedMsg, end) &&
+           push16(value->csi_rs_zero_tx_power_resource_config_bitmap_r10, ppWritePackedMsg, end) &&
+           push8(value->csi_rs_number_nzp_configuration, ppWritePackedMsg, end) &&
+           pusharray8(value->csi_rs_resource_config, NFAPI_MAX_CSI_RS_RESOURCE_CONFIG, value->csi_rs_number_nzp_configuration, ppWritePackedMsg, end) &&
+           push8(value->pdsch_start, ppWritePackedMsg, end));
+}
+static uint8_t pack_dl_config_dlsch_pdu_rel11_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_dl_config_dlsch_pdu_rel11_t *value = (nfapi_dl_config_dlsch_pdu_rel11_t *)tlv;
+  return( push8(value->drms_config_flag, ppWritePackedMsg, end) &&
+          push16(value->drms_scrambling, ppWritePackedMsg, end) &&
+          push8(value->csi_config_flag, ppWritePackedMsg, end) &&
+          push16(value->csi_scrambling, ppWritePackedMsg, end) &&
+          push8(value->pdsch_re_mapping_flag, ppWritePackedMsg, end) &&
+          push8(value->pdsch_re_mapping_atenna_ports, ppWritePackedMsg, end) &&
+          push8(value->pdsch_re_mapping_freq_shift, ppWritePackedMsg, end));
+}
+static uint8_t pack_dl_config_dlsch_pdu_rel12_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_dl_config_dlsch_pdu_rel12_t *value = (nfapi_dl_config_dlsch_pdu_rel12_t *)tlv;
+  return( push8(value->altcqi_table_r12, ppWritePackedMsg, end) &&
+          push8(value->maxlayers, ppWritePackedMsg, end) &&
+          push8(value->n_dl_harq, ppWritePackedMsg, end));
+}
+static uint8_t pack_dl_config_dlsch_pdu_rel13_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_dl_config_dlsch_pdu_rel13_t *value = (nfapi_dl_config_dlsch_pdu_rel13_t *)tlv;
+  return( push8(value->dwpts_symbols, ppWritePackedMsg, end) &&
+          push8(value->initial_lbt_sf, ppWritePackedMsg, end) &&
+          push8(value->ue_type, ppWritePackedMsg, end) &&
+          push8(value->pdsch_payload_type, ppWritePackedMsg, end) &&
+          push16(value->initial_transmission_sf_io, ppWritePackedMsg, end) &&
+          push8(value->drms_table_flag, ppWritePackedMsg, end));
+}
+static uint8_t pack_dl_config_pch_pdu_rel8_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_dl_config_pch_pdu_rel8_t *value = (nfapi_dl_config_pch_pdu_rel8_t *)tlv;
+  return( push16(value->length, ppWritePackedMsg, end) &&
+          push16(value->pdu_index, ppWritePackedMsg, end) &&
+          push16(value->p_rnti, ppWritePackedMsg, end) &&
+          push8(value->resource_allocation_type, ppWritePackedMsg, end) &&
+          push8(value->virtual_resource_block_assignment_flag, ppWritePackedMsg, end) &&
+          push32(value->resource_block_coding, ppWritePackedMsg, end) &&
+          push8(value->mcs, ppWritePackedMsg, end) &&
+          push8(value->redundancy_version, ppWritePackedMsg, end) &&
+          push8(value->number_of_transport_blocks, ppWritePackedMsg, end) &&
+          push8(value->transport_block_to_codeword_swap_flag, ppWritePackedMsg, end) &&
+          push8(value->transmission_scheme, ppWritePackedMsg, end) &&
+          push8(value->number_of_layers, ppWritePackedMsg, end) &&
+          push8(value->codebook_index, ppWritePackedMsg, end) &&
+          push8(value->ue_category_capacity, ppWritePackedMsg, end) &&
+          push8(value->pa, ppWritePackedMsg, end) &&
+          push16(value->transmission_power, ppWritePackedMsg, end) &&
+          push8(value->nprb, ppWritePackedMsg, end) &&
+          push8(value->ngap, ppWritePackedMsg, end));
+}
+static uint8_t pack_dl_config_pch_pdu_rel13_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_dl_config_pch_pdu_rel13_t *value = (nfapi_dl_config_pch_pdu_rel13_t *)tlv;
+  return ( push8(value->ue_mode, ppWritePackedMsg, end) &&
+           push16(value->initial_transmission_sf_io, ppWritePackedMsg, end));
+}
+static uint8_t pack_dl_config_prs_pdu_rel9_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_dl_config_prs_pdu_rel9_t *value = (nfapi_dl_config_prs_pdu_rel9_t *)tlv;
+  return( push16(value->transmission_power, ppWritePackedMsg, end) &&
+          push8(value->prs_bandwidth, ppWritePackedMsg, end) &&
+          push8(value->prs_cyclic_prefix_type, ppWritePackedMsg, end) &&
+          push8(value->prs_muting, ppWritePackedMsg, end));
+}
+static uint8_t pack_dl_config_csi_rs_pdu_rel10_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_dl_config_csi_rs_pdu_rel10_t *value = (nfapi_dl_config_csi_rs_pdu_rel10_t *)tlv;
+  return( push8(value->csi_rs_antenna_port_count_r10, ppWritePackedMsg, end) &&
+          push8(value->csi_rs_resource_config_r10, ppWritePackedMsg, end) &&
+          push16(value->transmission_power, ppWritePackedMsg, end) &&
+          push16(value->csi_rs_zero_tx_power_resource_config_bitmap_r10, ppWritePackedMsg, end) &&
+          push8(value->csi_rs_number_of_nzp_configuration, ppWritePackedMsg, end) &&
+          pusharray8(value->csi_rs_resource_config, NFAPI_MAX_CSI_RS_RESOURCE_CONFIG, value->csi_rs_number_of_nzp_configuration, ppWritePackedMsg, end));
+}
+static uint8_t pack_dl_config_csi_rs_pdu_rel13_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_dl_config_csi_rs_pdu_rel13_t *value = (nfapi_dl_config_csi_rs_pdu_rel13_t *)tlv;
+
+  if(!(push8(value->csi_rs_class, ppWritePackedMsg, end) &&
+       push8(value->cdm_type, ppWritePackedMsg, end) &&
+       push8(value->num_bf_vector, ppWritePackedMsg, end))) {
+    return 0;
+  }
+
+  uint16_t i;
+
+  for(i = 0; i < value->num_bf_vector; ++i) {
+    if(!(push8(value->bf_vector[i].csi_rs_resource_index, ppWritePackedMsg, end) &&
+         pusharray16(value->bf_vector[i].bf_value, NFAPI_MAX_ANTENNA_PORT_COUNT, NFAPI_MAX_ANTENNA_PORT_COUNT, ppWritePackedMsg, end)))
+      return 0;
+  }
+
+  return 1;
+}
+static uint8_t pack_bf_vector(nfapi_bf_vector_t *vector, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  return ( push8(vector->subband_index, ppWritePackedMsg, end) &&
+           push8(vector->num_antennas, ppWritePackedMsg, end) &&
+           pusharray16(vector->bf_value, NFAPI_MAX_NUM_ANTENNAS, vector->num_antennas, ppWritePackedMsg, end));
+}
+
+static uint8_t pack_dl_config_epdcch_parameters_rel11_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_dl_config_epdcch_parameters_rel11_t *value = (nfapi_dl_config_epdcch_parameters_rel11_t *)tlv;
+  return ( push8(value->epdcch_resource_assignment_flag, ppWritePackedMsg, end) &&
+           push16(value->epdcch_id, ppWritePackedMsg, end) &&
+           push8(value->epdcch_start_symbol, ppWritePackedMsg, end) &&
+           push8(value->epdcch_num_prb, ppWritePackedMsg, end) &&
+           pusharray8(value->epdcch_prb_index, NFAPI_MAX_EPDCCH_PRB, value->epdcch_num_prb, ppWritePackedMsg, end) &&
+           pack_bf_vector(&value->bf_vector, ppWritePackedMsg, end));
+}
+static uint8_t pack_dl_config_epdcch_parameters_rel13_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_dl_config_epdcch_parameters_rel13_t *value = (nfapi_dl_config_epdcch_parameters_rel13_t *)tlv;
+  return (push8(value->dwpts_symbols, ppWritePackedMsg, end) &&
+          push8(value->initial_lbt_sf, ppWritePackedMsg, end));
+}
+static uint8_t pack_dl_config_mpdcch_pdu_rel13_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_dl_config_mpdcch_pdu_rel13_t *value = (nfapi_dl_config_mpdcch_pdu_rel13_t *)tlv;
+  return ( push8(value->mpdcch_narrow_band, ppWritePackedMsg, end) &&
+           push8(value->number_of_prb_pairs, ppWritePackedMsg, end) &&
+           push8(value->resource_block_assignment, ppWritePackedMsg, end) &&
+           push8(value->mpdcch_tansmission_type, ppWritePackedMsg, end) &&
+           push8(value->start_symbol, ppWritePackedMsg, end) &&
+           push8(value->ecce_index, ppWritePackedMsg, end) &&
+           push8(value->aggregation_level, ppWritePackedMsg, end) &&
+           push8(value->rnti_type, ppWritePackedMsg, end) &&
+           push16(value->rnti, ppWritePackedMsg, end) &&
+           push8(value->ce_mode, ppWritePackedMsg, end) &&
+           push16(value->drms_scrambling_init, ppWritePackedMsg, end) &&
+           push16(value->initial_transmission_sf_io, ppWritePackedMsg, end) &&
+           push16(value->transmission_power, ppWritePackedMsg, end) &&
+           push8(value->dci_format, ppWritePackedMsg, end) &&
+           push16(value->resource_block_coding, ppWritePackedMsg, end) &&
+           push8(value->mcs, ppWritePackedMsg, end) &&
+           push8(value->pdsch_reptition_levels, ppWritePackedMsg, end) &&
+           push8(value->redundancy_version, ppWritePackedMsg, end) &&
+           push8(value->new_data_indicator, ppWritePackedMsg, end) &&
+           push8(value->harq_process, ppWritePackedMsg, end) &&
+           push8(value->tpmi_length, ppWritePackedMsg, end) &&
+           push8(value->tpmi, ppWritePackedMsg, end) &&
+           push8(value->pmi_flag, ppWritePackedMsg, end) &&
+           push8(value->pmi, ppWritePackedMsg, end) &&
+           push8(value->harq_resource_offset, ppWritePackedMsg, end) &&
+           push8(value->dci_subframe_repetition_number, ppWritePackedMsg, end) &&
+           push8(value->tpc, ppWritePackedMsg, end) &&
+           push8(value->downlink_assignment_index_length, ppWritePackedMsg, end) &&
+           push8(value->downlink_assignment_index, ppWritePackedMsg, end) &&
+           push8(value->allocate_prach_flag, ppWritePackedMsg, end) &&
+           push8(value->preamble_index, ppWritePackedMsg, end) &&
+           push8(value->prach_mask_index, ppWritePackedMsg, end) &&
+           push8(value->starting_ce_level, ppWritePackedMsg, end) &&
+           push8(value->srs_request, ppWritePackedMsg, end) &&
+           push8(value->antenna_ports_and_scrambling_identity_flag, ppWritePackedMsg, end) &&
+           push8(value->antenna_ports_and_scrambling_identity, ppWritePackedMsg, end) &&
+           push8(value->frequency_hopping_enabled_flag, ppWritePackedMsg, end) &&
+           push8(value->paging_direct_indication_differentiation_flag, ppWritePackedMsg, end) &&
+           push8(value->direct_indication, ppWritePackedMsg, end) &&
+           push8(value->total_dci_length_including_padding, ppWritePackedMsg, end) &&
+           push8(value->number_of_tx_antenna_ports, ppWritePackedMsg, end) &&
+           pusharray16(value->precoding_value, NFAPI_MAX_TX_PHYSICAL_ANTENNA_PORTS, value->number_of_tx_antenna_ports, ppWritePackedMsg, end));
+}
+
+
+static uint8_t pack_dl_config_nbch_pdu_rel13_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_dl_config_nbch_pdu_rel13_t *value = (nfapi_dl_config_nbch_pdu_rel13_t *)tlv;
+  return (push16(value->length, ppWritePackedMsg, end) &&
+          push16(value->pdu_index, ppWritePackedMsg, end) &&
+          push16(value->transmission_power, ppWritePackedMsg, end) &&
+          push16(value->hyper_sfn_2_lsbs, ppWritePackedMsg, end));
+}
+
+
+static uint8_t pack_dl_config_npdcch_pdu_rel13_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_dl_config_npdcch_pdu_rel13_t *value = (nfapi_dl_config_npdcch_pdu_rel13_t *)tlv;
+  return (push16(value->length, ppWritePackedMsg, end) &&
+          push16(value->pdu_index, ppWritePackedMsg, end) &&
+          push8(value->ncce_index, ppWritePackedMsg, end) &&
+          push8(value->aggregation_level, ppWritePackedMsg, end) &&
+          push8(value->start_symbol, ppWritePackedMsg, end) &&
+          push8(value->rnti_type, ppWritePackedMsg, end) &&
+          push16(value->rnti, ppWritePackedMsg, end) &&
+          push8(value->scrambling_reinitialization_batch_index, ppWritePackedMsg, end) &&
+          push8(value->nrs_antenna_ports_assumed_by_the_ue, ppWritePackedMsg, end) &&
+          push8(value->dci_format, ppWritePackedMsg, end) &&
+          push8(value->scheduling_delay, ppWritePackedMsg, end) &&
+          push8(value->resource_assignment, ppWritePackedMsg, end) &&
+          push8(value->repetition_number, ppWritePackedMsg, end) &&
+          push8(value->mcs, ppWritePackedMsg, end) &&
+          push8(value->new_data_indicator, ppWritePackedMsg, end) &&
+          push8(value->harq_ack_resource, ppWritePackedMsg, end) &&
+          push8(value->npdcch_order_indication, ppWritePackedMsg, end) &&
+          push8(value->starting_number_of_nprach_repetitions, ppWritePackedMsg, end) &&
+          push8(value->subcarrier_indication_of_nprach, ppWritePackedMsg, end) &&
+          push8(value->paging_direct_indication_differentation_flag, ppWritePackedMsg, end) &&
+          push8(value->direct_indication, ppWritePackedMsg, end) &&
+          push8(value->dci_subframe_repetition_number, ppWritePackedMsg, end) &&
+          push8(value->total_dci_length_including_padding, ppWritePackedMsg, end));
+}
+
+static uint8_t pack_dl_config_ndlsch_pdu_rel13_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_dl_config_ndlsch_pdu_rel13_t *value = (nfapi_dl_config_ndlsch_pdu_rel13_t *)tlv;
+  return (push16(value->length, ppWritePackedMsg, end) &&
+          push16(value->pdu_index, ppWritePackedMsg, end) &&
+          push8(value->start_symbol, ppWritePackedMsg, end) &&
+          push8(value->rnti_type, ppWritePackedMsg, end) &&
+          push16(value->rnti, ppWritePackedMsg, end) &&
+          push16(value->resource_assignment, ppWritePackedMsg, end) &&
+          push16(value->repetition_number, ppWritePackedMsg, end) &&
+          push8(value->modulation, ppWritePackedMsg, end) &&
+          push8(value->number_of_subframes_for_resource_assignment, ppWritePackedMsg, end) &&
+          push8(value->scrambling_sequence_initialization_cinit, ppWritePackedMsg, end) &&
+          push16(value->sf_idx, ppWritePackedMsg, end) &&
+          push8(value->nrs_antenna_ports_assumed_by_the_ue, ppWritePackedMsg, end));
+}
+
+
+static uint8_t pack_dl_tti_request_body_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_nr_dl_tti_request_pdu_t *value = (nfapi_nr_dl_tti_request_pdu_t *)tlv;
+
+  if(!(push32(value->PDUSize, ppWritePackedMsg, end) &&
+       push16(value->PDUType, ppWritePackedMsg, end) ))
+    return 0;
+
+  // first match the pdu type, then call the respective function
+  switch(value->PDUType) {
+    case NFAPI_NR_DL_TTI_CSI_RS_PDU_TYPE: {
+      if(!(pack_dl_tti_csi_rs_pdu_rel15_value(&value->csi_rs_pdu.csi_rs_pdu_rel15,ppWritePackedMsg,end)))
+        return 0;
+    }
+    break;
+
+    case NFAPI_NR_DL_TTI_PDCCH_PDU_TYPE: {
+      if(!(pack_dl_tti_pdcch_pdu_rel15_value(&value->pdcch_pdu.pdcch_pdu_rel15,ppWritePackedMsg,end)))
+        return 0;
+    }
+    break;
+
+    case NFAPI_NR_DL_TTI_PDSCH_PDU_TYPE: {
+      if(!(pack_dl_tti_pdsch_pdu_rel15_value(&value->pdsch_pdu.pdsch_pdu_rel15,ppWritePackedMsg,end)))
+        return 0;
+    }
+    break;
+
+    case NFAPI_NR_DL_TTI_SSB_PDU_TYPE: {
+      if(!(pack_dl_tti_ssb_pdu_rel15_value(&value->ssb_pdu.ssb_pdu_rel15,ppWritePackedMsg,end)))
+        return 0;
+    }
+    break;
+
+    default: {
+      NFAPI_TRACE(NFAPI_TRACE_ERROR, "FIXME : Invalid DL_TTI pdu type %d \n", value->PDUType );
+    }
+    break;
+  }
+
+  return 1;
+}
+
+static uint8_t pack_dl_config_request_body_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_dl_config_request_body_t *value = (nfapi_dl_config_request_body_t *)tlv;
+
+  //NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s() dci:%u pdu:%u pdsch:%u rnti:%u pcfich:%u\n", __FUNCTION__, value->number_dci, value->number_pdu, value->number_pdsch_rnti, value->transmission_power_pcfich);
+
+  if(!(push8(value->number_pdcch_ofdm_symbols, ppWritePackedMsg, end) &&
+       push8(value->number_dci, ppWritePackedMsg, end) &&
+       push16(value->number_pdu, ppWritePackedMsg, end) &&
+       push8(value->number_pdsch_rnti, ppWritePackedMsg, end) &&
+       push16(value->transmission_power_pcfich, ppWritePackedMsg, end))) {
+    return 0;
+  }
+
+  uint16_t i = 0;
+  uint16_t total_number_of_pdus = value->number_pdu;
+
+  for(; i < total_number_of_pdus; ++i) {
+    nfapi_dl_config_request_pdu_t *pdu = &(value->dl_config_pdu_list[i]);
+
+    if(push8(pdu->pdu_type, ppWritePackedMsg, end) == 0)
+      return 0;
+
+    // Put a 0 size in and then determine the size after the pdu
+    // has been writen and write the calculated size
+    uint8_t *pWritePackedMsgPduSize = *ppWritePackedMsg;
+    pdu->pdu_size = 0;
+
+    if(push8(pdu->pdu_size, ppWritePackedMsg, end) == 0)
+      return 0;
+
+    switch(pdu->pdu_type) {
+      case NFAPI_DL_CONFIG_DCI_DL_PDU_TYPE: {
+        //NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s() NFAPI_DL_CONFIG_DCI_DL_PDU_TYPE\n", __FUNCTION__);
+        if(!(pack_tlv(NFAPI_DL_CONFIG_REQUEST_DCI_DL_PDU_REL8_TAG, &pdu->dci_dl_pdu.dci_dl_pdu_rel8, ppWritePackedMsg, end, &pack_dl_config_dci_dl_pdu_rel8_value) &&
+             pack_tlv(NFAPI_DL_CONFIG_REQUEST_DCI_DL_PDU_REL9_TAG, &pdu->dci_dl_pdu.dci_dl_pdu_rel9, ppWritePackedMsg, end, &pack_dl_config_dci_dl_pdu_rel9_value) &&
+             pack_tlv(NFAPI_DL_CONFIG_REQUEST_DCI_DL_PDU_REL10_TAG, &pdu->dci_dl_pdu.dci_dl_pdu_rel10, ppWritePackedMsg, end, &pack_dl_config_dci_dl_pdu_rel10_value) &&
+             pack_tlv(NFAPI_DL_CONFIG_REQUEST_DCI_DL_PDU_REL11_TAG, &pdu->dci_dl_pdu.dci_dl_pdu_rel11, ppWritePackedMsg, end, &pack_dl_config_dci_dl_pdu_rel11_value) &&
+             pack_tlv(NFAPI_DL_CONFIG_REQUEST_DCI_DL_PDU_REL12_TAG, &pdu->dci_dl_pdu.dci_dl_pdu_rel12, ppWritePackedMsg, end, &pack_dl_config_dci_dl_pdu_rel12_value) &&
+             pack_tlv(NFAPI_DL_CONFIG_REQUEST_DCI_DL_PDU_REL13_TAG, &pdu->dci_dl_pdu.dci_dl_pdu_rel13, ppWritePackedMsg, end, &pack_dl_config_dci_dl_pdu_rel13_value))) {
+          return 0;
+        }
+      }
+      break;
+
+      case NFAPI_DL_CONFIG_BCH_PDU_TYPE: {
+        //NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s() NFAPI_DL_CONFIG_BCH_PDU_TYPE\n", __FUNCTION__);
+        if(!(pack_tlv(NFAPI_DL_CONFIG_REQUEST_BCH_PDU_REL8_TAG, &pdu->bch_pdu.bch_pdu_rel8, ppWritePackedMsg, end, &pack_dl_config_bch_pdu_rel8_value)))
+          return 0;
+      }
+      break;
+
+      case NFAPI_DL_CONFIG_MCH_PDU_TYPE: {
+        if(!(pack_tlv(NFAPI_DL_CONFIG_REQUEST_MCH_PDU_REL8_TAG, &pdu->mch_pdu.mch_pdu_rel8, ppWritePackedMsg, end, &pack_dl_config_mch_pdu_rel8_value)))
+          return 0;
+      }
+      break;
+
+      case NFAPI_DL_CONFIG_DLSCH_PDU_TYPE: {
+        if(!(pack_tlv(NFAPI_DL_CONFIG_REQUEST_DLSCH_PDU_REL8_TAG, &pdu->dlsch_pdu.dlsch_pdu_rel8, ppWritePackedMsg, end, &pack_dl_config_dlsch_pdu_rel8_value) &&
+             pack_tlv(NFAPI_DL_CONFIG_REQUEST_DLSCH_PDU_REL9_TAG, &pdu->dlsch_pdu.dlsch_pdu_rel9, ppWritePackedMsg, end, &pack_dl_config_dlsch_pdu_rel9_value) &&
+             pack_tlv(NFAPI_DL_CONFIG_REQUEST_DLSCH_PDU_REL10_TAG, &pdu->dlsch_pdu.dlsch_pdu_rel10, ppWritePackedMsg, end, &pack_dl_config_dlsch_pdu_rel10_value) &&
+             pack_tlv(NFAPI_DL_CONFIG_REQUEST_DLSCH_PDU_REL11_TAG, &pdu->dlsch_pdu.dlsch_pdu_rel11, ppWritePackedMsg, end, &pack_dl_config_dlsch_pdu_rel11_value) &&
+             pack_tlv(NFAPI_DL_CONFIG_REQUEST_DLSCH_PDU_REL12_TAG, &pdu->dlsch_pdu.dlsch_pdu_rel12, ppWritePackedMsg, end, &pack_dl_config_dlsch_pdu_rel12_value) &&
+             pack_tlv(NFAPI_DL_CONFIG_REQUEST_DLSCH_PDU_REL13_TAG, &pdu->dlsch_pdu.dlsch_pdu_rel13, ppWritePackedMsg, end, &pack_dl_config_dlsch_pdu_rel13_value)))
+          return 0;
+      }
+      break;
+
+      case NFAPI_DL_CONFIG_PCH_PDU_TYPE: {
+        if(!(pack_tlv(NFAPI_DL_CONFIG_REQUEST_PCH_PDU_REL8_TAG, &pdu->pch_pdu.pch_pdu_rel8, ppWritePackedMsg, end, &pack_dl_config_pch_pdu_rel8_value) &&
+             pack_tlv(NFAPI_DL_CONFIG_REQUEST_PCH_PDU_REL13_TAG, &pdu->pch_pdu.pch_pdu_rel13, ppWritePackedMsg, end, &pack_dl_config_pch_pdu_rel13_value)))
+          return 0;
+      }
+      break;
+
+      case NFAPI_DL_CONFIG_PRS_PDU_TYPE: {
+        if(!(pack_tlv(NFAPI_DL_CONFIG_REQUEST_PRS_PDU_REL9_TAG, &pdu->prs_pdu.prs_pdu_rel9, ppWritePackedMsg, end, &pack_dl_config_prs_pdu_rel9_value)))
+          return 0;
+      }
+      break;
+
+      case NFAPI_DL_CONFIG_CSI_RS_PDU_TYPE: {
+        if(!(pack_tlv(NFAPI_DL_CONFIG_REQUEST_CSI_RS_PDU_REL10_TAG, &pdu->csi_rs_pdu.csi_rs_pdu_rel10, ppWritePackedMsg, end,  &pack_dl_config_csi_rs_pdu_rel10_value) &&
+             pack_tlv(NFAPI_DL_CONFIG_REQUEST_CSI_RS_PDU_REL13_TAG, &pdu->csi_rs_pdu.csi_rs_pdu_rel13, ppWritePackedMsg, end,  &pack_dl_config_csi_rs_pdu_rel13_value)))
+          return 0;
+      }
+      break;
+
+      case NFAPI_DL_CONFIG_EPDCCH_DL_PDU_TYPE: {
+        if(!(pack_tlv(NFAPI_DL_CONFIG_REQUEST_EPDCCH_PDU_REL8_TAG, &pdu->epdcch_pdu.epdcch_pdu_rel8, ppWritePackedMsg, end, &pack_dl_config_dci_dl_pdu_rel8_value) &&
+             pack_tlv(NFAPI_DL_CONFIG_REQUEST_EPDCCH_PDU_REL9_TAG, &pdu->epdcch_pdu.epdcch_pdu_rel9, ppWritePackedMsg, end, &pack_dl_config_dci_dl_pdu_rel9_value) &&
+             pack_tlv(NFAPI_DL_CONFIG_REQUEST_EPDCCH_PDU_REL10_TAG, &pdu->epdcch_pdu.epdcch_pdu_rel10, ppWritePackedMsg, end, &pack_dl_config_dci_dl_pdu_rel10_value) &&
+             pack_tlv(NFAPI_DL_CONFIG_REQUEST_EPDCCH_PDU_REL11_TAG, &pdu->epdcch_pdu.epdcch_pdu_rel11, ppWritePackedMsg, end, &pack_dl_config_dci_dl_pdu_rel11_value) &&
+             pack_tlv(NFAPI_DL_CONFIG_REQUEST_EPDCCH_PDU_REL12_TAG, &pdu->epdcch_pdu.epdcch_pdu_rel12, ppWritePackedMsg, end, &pack_dl_config_dci_dl_pdu_rel12_value) &&
+             pack_tlv(NFAPI_DL_CONFIG_REQUEST_EPDCCH_PDU_REL13_TAG, &pdu->epdcch_pdu.epdcch_pdu_rel13, ppWritePackedMsg, end, &pack_dl_config_dci_dl_pdu_rel13_value) &&
+             pack_tlv(NFAPI_DL_CONFIG_REQUEST_EPDCCH_PARAM_REL11_TAG, &pdu->epdcch_pdu.epdcch_params_rel11, ppWritePackedMsg, end, &pack_dl_config_epdcch_parameters_rel11_value) &
+             pack_tlv(NFAPI_DL_CONFIG_REQUEST_EPDCCH_PARAM_REL13_TAG, &pdu->epdcch_pdu.epdcch_params_rel13, ppWritePackedMsg, end, &pack_dl_config_epdcch_parameters_rel13_value)))
+          return 0;
+      }
+      break;
+
+      case NFAPI_DL_CONFIG_MPDCCH_PDU_TYPE: {
+        if(!(pack_tlv(NFAPI_DL_CONFIG_REQUEST_MPDCCH_PDU_REL13_TAG, &pdu->mpdcch_pdu.mpdcch_pdu_rel13, ppWritePackedMsg, end, &pack_dl_config_mpdcch_pdu_rel13_value)))
+          return 0;
+      }
+      break;
+
+      case NFAPI_DL_CONFIG_NBCH_PDU_TYPE: {
+        if(!(pack_tlv(NFAPI_DL_CONFIG_REQUEST_NBCH_PDU_REL13_TAG, &pdu->nbch_pdu.nbch_pdu_rel13, ppWritePackedMsg, end, &pack_dl_config_nbch_pdu_rel13_value)))
+          return 0;
+      }
+      break;
+
+      case NFAPI_DL_CONFIG_NPDCCH_PDU_TYPE: {
+        if(!(pack_tlv(NFAPI_DL_CONFIG_REQUEST_NPDCCH_PDU_REL13_TAG, &pdu->npdcch_pdu.npdcch_pdu_rel13, ppWritePackedMsg, end, &pack_dl_config_npdcch_pdu_rel13_value)))
+          return 0;
+      }
+      break;
+
+      case NFAPI_DL_CONFIG_NDLSCH_PDU_TYPE: {
+        if(!(pack_tlv(NFAPI_DL_CONFIG_REQUEST_NDLSCH_PDU_REL13_TAG, &pdu->ndlsch_pdu.ndlsch_pdu_rel13, ppWritePackedMsg, end, &pack_dl_config_ndlsch_pdu_rel13_value)))
+          return 0;
+      }
+      break;
+
+      default: {
+        NFAPI_TRACE(NFAPI_TRACE_ERROR, "FIXME : Invalid pdu type %d \n", pdu->pdu_type );
+      }
+      break;
+    };
+
+    // add 1 for the pdu_type. The delta will include the pdu_size
+    pdu->pdu_size = 1 + (*ppWritePackedMsg - pWritePackedMsgPduSize);
+
+    push8(pdu->pdu_size, &pWritePackedMsgPduSize, end);
+  }
+
+  return 1;
+}
+
+
+static uint8_t pack_dl_tti_request(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p7_codec_config_t *config) {
+  nfapi_nr_dl_tti_request_t *pNfapiMsg = (nfapi_nr_dl_tti_request_t *)msg;
+
+  if (!(push16(pNfapiMsg->SFN, ppWritePackedMsg, end) &&
+        push16(pNfapiMsg->Slot, ppWritePackedMsg, end) &&
+        push8(pNfapiMsg->dl_tti_request_body.nGroup, ppWritePackedMsg, end) &&
+        push8(pNfapiMsg->dl_tti_request_body.nPDUs, ppWritePackedMsg, end) &&
+        pusharray8(pNfapiMsg->dl_tti_request_body.nUe,256,pNfapiMsg->dl_tti_request_body.nGroup, ppWritePackedMsg, end)
+        //pusharray8(pNfapiMsg->PduIdx[0] ,256,256, ppWritePackedMsg, end)
+       ))
+    return 0;
+
+  int arr[12];
+
+  for(int i=0; i<pNfapiMsg->dl_tti_request_body.nGroup; i++) {
+    for(int j=0; j<pNfapiMsg->dl_tti_request_body.nUe[i]; j++) {
+      arr[j] = pNfapiMsg->dl_tti_request_body.PduIdx[i][j];
+    }
+
+    if(!(pusharrays32(arr,12,pNfapiMsg->dl_tti_request_body.nUe[i],ppWritePackedMsg, end)))
+      return 0;
+  }
+
+  for(int i=0; i<pNfapiMsg->dl_tti_request_body.nPDUs; i++) {
+    if(!pack_dl_tti_request_body_value(&pNfapiMsg->dl_tti_request_body.dl_tti_pdu_list[i],ppWritePackedMsg,end))
+      return 0;
+  }
+
+  return 1;
+}
+
+
+static uint8_t pack_dl_config_request(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p7_codec_config_t *config) {
+  nfapi_dl_config_request_t *pNfapiMsg = (nfapi_dl_config_request_t *)msg;
+  //return ( push16(pNfapiMsg->sfn_sf, ppWritePackedMsg, end) &&
+  //pack_tlv(NFAPI_DL_CONFIG_REQUEST_BODY_TAG, &pNfapiMsg->dl_config_request_body, ppWritePackedMsg, end, &pack_dl_config_request_body_value) &&
+  //pack_p7_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config));
+  {
+    uint8_t x = push16(pNfapiMsg->sfn_sf, ppWritePackedMsg, end);
+    uint8_t y = pack_tlv(NFAPI_DL_CONFIG_REQUEST_BODY_TAG, &pNfapiMsg->dl_config_request_body, ppWritePackedMsg, end, &pack_dl_config_request_body_value);
+    uint8_t z = pack_p7_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config);
+
+    if (!x || !y || !z) {
+      NFAPI_TRACE(NFAPI_TRACE_INFO, "%s() NFAPI_DL_CONFIG_REQUEST x:%u y:%u z:%u \n", __FUNCTION__,x,y,z);
+    }
+
+    return x && y && z;
+  }
+}
+
+
+
+
+static uint8_t pack_ul_config_request_ulsch_rel8_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_ul_config_ulsch_pdu_rel8_t *ulsch_pdu_rel8 = (nfapi_ul_config_ulsch_pdu_rel8_t *)tlv;
+  return( push32(ulsch_pdu_rel8->handle, ppWritePackedMsg, end) &&
+          push16(ulsch_pdu_rel8->size, ppWritePackedMsg, end) &&
+          push16(ulsch_pdu_rel8->rnti, ppWritePackedMsg, end) &&
+          push8(ulsch_pdu_rel8->resource_block_start, ppWritePackedMsg, end) &&
+          push8(ulsch_pdu_rel8->number_of_resource_blocks, ppWritePackedMsg, end) &&
+          push8(ulsch_pdu_rel8->modulation_type, ppWritePackedMsg, end) &&
+          push8(ulsch_pdu_rel8->cyclic_shift_2_for_drms, ppWritePackedMsg, end) &&
+          push8(ulsch_pdu_rel8->frequency_hopping_enabled_flag, ppWritePackedMsg, end) &&
+          push8(ulsch_pdu_rel8->frequency_hopping_bits, ppWritePackedMsg, end) &&
+          push8(ulsch_pdu_rel8->new_data_indication, ppWritePackedMsg, end) &&
+          push8(ulsch_pdu_rel8->redundancy_version, ppWritePackedMsg, end) &&
+          push8(ulsch_pdu_rel8->harq_process_number, ppWritePackedMsg, end) &&
+          push8(ulsch_pdu_rel8->ul_tx_mode, ppWritePackedMsg, end) &&
+          push8(ulsch_pdu_rel8->current_tx_nb, ppWritePackedMsg, end) &&
+          push8(ulsch_pdu_rel8->n_srs, ppWritePackedMsg, end));
+}
+static uint8_t pack_ul_config_request_ulsch_rel10_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_ul_config_ulsch_pdu_rel10_t *ulsch_pdu_rel10 = (nfapi_ul_config_ulsch_pdu_rel10_t *)tlv;
+  return (push8(ulsch_pdu_rel10->resource_allocation_type, ppWritePackedMsg, end) &&
+          push32(ulsch_pdu_rel10->resource_block_coding, ppWritePackedMsg, end) &&
+          push8(ulsch_pdu_rel10->transport_blocks, ppWritePackedMsg, end) &&
+          push8(ulsch_pdu_rel10->transmission_scheme, ppWritePackedMsg, end) &&
+          push8(ulsch_pdu_rel10->number_of_layers, ppWritePackedMsg, end) &&
+          push8(ulsch_pdu_rel10->codebook_index, ppWritePackedMsg, end) &&
+          push8(ulsch_pdu_rel10->disable_sequence_hopping_flag, ppWritePackedMsg, end));
+}
+
+static uint8_t pack_ul_config_request_ulsch_rel11_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_ul_config_ulsch_pdu_rel11_t *ulsch_pdu_rel11 = (nfapi_ul_config_ulsch_pdu_rel11_t *)tlv;
+  return (push8(ulsch_pdu_rel11->virtual_cell_id_enabled_flag, ppWritePackedMsg, end) &&
+          push16(ulsch_pdu_rel11->npusch_identity, ppWritePackedMsg, end) &&
+          push8(ulsch_pdu_rel11->dmrs_config_flag, ppWritePackedMsg, end) &&
+          push16(ulsch_pdu_rel11->ndmrs_csh_identity, ppWritePackedMsg, end));
+}
+
+static uint8_t pack_ul_config_request_ulsch_rel13_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_ul_config_ulsch_pdu_rel13_t *ulsch_pdu_rel13 = (nfapi_ul_config_ulsch_pdu_rel13_t *)tlv;
+  return (push8(ulsch_pdu_rel13->ue_type, ppWritePackedMsg, end) &&
+          push16(ulsch_pdu_rel13->total_number_of_repetitions, ppWritePackedMsg, end) &&
+          push16(ulsch_pdu_rel13->repetition_number, ppWritePackedMsg, end) &&
+          push16(ulsch_pdu_rel13->initial_transmission_sf_io, ppWritePackedMsg, end) &&
+          push8(ulsch_pdu_rel13->empty_symbols_due_to_re_tunning, ppWritePackedMsg, end));
+}
+
+//Pack fns for ul_tti PDUS
+
+
+static uint8_t pack_ul_tti_request_prach_pdu(nfapi_nr_prach_pdu_t *prach_pdu, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  return(
+          push16(prach_pdu->phys_cell_id, ppWritePackedMsg, end) &&
+          push8(prach_pdu->num_prach_ocas, ppWritePackedMsg, end) &&
+          push8(prach_pdu->prach_format, ppWritePackedMsg, end) &&
+          push8(prach_pdu->num_ra, ppWritePackedMsg, end) &&
+          push8(prach_pdu->prach_start_symbol, ppWritePackedMsg, end) &&
+          push16(prach_pdu->num_cs, ppWritePackedMsg, end)
+          // TODO: ignoring beamforming tlv for now
+        );
+}
+
+static uint8_t pack_ul_tti_request_pucch_pdu(nfapi_nr_pucch_pdu_t *pucch_pdu, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  return(
+          push16(pucch_pdu->rnti, ppWritePackedMsg, end) &&
+          push32(pucch_pdu->handle, ppWritePackedMsg, end) &&
+          push16(pucch_pdu->bwp_size, ppWritePackedMsg, end) &&
+          push16(pucch_pdu->bwp_start, ppWritePackedMsg, end) &&
+          push8(pucch_pdu->subcarrier_spacing, ppWritePackedMsg, end) &&
+          push8(pucch_pdu->cyclic_prefix, ppWritePackedMsg, end) &&
+          push8(pucch_pdu->format_type, ppWritePackedMsg, end) &&
+          push8(pucch_pdu->multi_slot_tx_indicator, ppWritePackedMsg, end) &&
+          push16(pucch_pdu->prb_start, ppWritePackedMsg, end) &&
+          push16(pucch_pdu->prb_size, ppWritePackedMsg, end) &&
+          push8(pucch_pdu->start_symbol_index, ppWritePackedMsg, end) &&
+          push8(pucch_pdu->nr_of_symbols, ppWritePackedMsg, end) &&
+          push8(pucch_pdu->freq_hop_flag, ppWritePackedMsg, end) &&
+          push16(pucch_pdu->second_hop_prb, ppWritePackedMsg, end) &&
+          push8(pucch_pdu->group_hop_flag, ppWritePackedMsg, end) &&
+          push8(pucch_pdu->sequence_hop_flag, ppWritePackedMsg, end) &&
+          push16(pucch_pdu->hopping_id, ppWritePackedMsg, end) &&
+          push16(pucch_pdu->initial_cyclic_shift, ppWritePackedMsg, end) &&
+          push16(pucch_pdu->data_scrambling_id, ppWritePackedMsg, end) &&
+          push8(pucch_pdu->time_domain_occ_idx, ppWritePackedMsg, end) &&
+          push8(pucch_pdu->pre_dft_occ_idx, ppWritePackedMsg, end) &&
+          push8(pucch_pdu->pre_dft_occ_len, ppWritePackedMsg, end) &&
+          push8(pucch_pdu->add_dmrs_flag, ppWritePackedMsg, end) &&
+          push16(pucch_pdu->dmrs_scrambling_id, ppWritePackedMsg, end) &&
+          push8(pucch_pdu->dmrs_cyclic_shift, ppWritePackedMsg, end) &&
+          push8(pucch_pdu->sr_flag, ppWritePackedMsg, end) &&
+          push8(pucch_pdu->bit_len_harq, ppWritePackedMsg, end) &&
+          push16(pucch_pdu->bit_len_csi_part1, ppWritePackedMsg, end) &&
+          push16(pucch_pdu->bit_len_csi_part2, ppWritePackedMsg, end)
+          // TODO: ignoring beamforming tlv for now
+        );
+}
+
+
+static uint8_t pack_ul_tti_request_pusch_pdu(nfapi_nr_pusch_pdu_t *pusch_pdu, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  if (!(
+        push16(pusch_pdu->pdu_bit_map, ppWritePackedMsg, end) &&
+        push16(pusch_pdu->rnti, ppWritePackedMsg, end) &&
+        push32(pusch_pdu->handle, ppWritePackedMsg, end) &&
+        push16(pusch_pdu->bwp_size, ppWritePackedMsg, end) &&
+        push16(pusch_pdu->bwp_start, ppWritePackedMsg, end) &&
+        push8(pusch_pdu->subcarrier_spacing, ppWritePackedMsg, end) &&
+        push8(pusch_pdu->cyclic_prefix, ppWritePackedMsg, end) &&
+        push16(pusch_pdu->target_code_rate, ppWritePackedMsg, end) &&
+        push8(pusch_pdu->qam_mod_order, ppWritePackedMsg, end) &&
+        push8(pusch_pdu->mcs_index, ppWritePackedMsg, end) &&
+        push8(pusch_pdu->mcs_table, ppWritePackedMsg, end) &&
+        push8(pusch_pdu->transform_precoding, ppWritePackedMsg, end) &&
+        push16(pusch_pdu->data_scrambling_id, ppWritePackedMsg, end) &&
+        push8(pusch_pdu->nrOfLayers, ppWritePackedMsg, end) &&
+        push16(pusch_pdu->ul_dmrs_symb_pos, ppWritePackedMsg, end) &&
+        push8(pusch_pdu->dmrs_config_type, ppWritePackedMsg, end) &&
+        push16(pusch_pdu->ul_dmrs_scrambling_id, ppWritePackedMsg, end) &&
+        push8(pusch_pdu->scid, ppWritePackedMsg, end) &&
+        push8(pusch_pdu->num_dmrs_cdm_grps_no_data, ppWritePackedMsg, end) &&
+        push16(pusch_pdu->dmrs_ports, ppWritePackedMsg, end) &&
+        push8(pusch_pdu->resource_alloc, ppWritePackedMsg, end) &&
+        push8(pusch_pdu->resource_alloc,ppWritePackedMsg, end) &&
+        push16(pusch_pdu->dmrs_ports, ppWritePackedMsg, end) &&
+        push16(pusch_pdu->rb_start, ppWritePackedMsg, end) &&
+        push16(pusch_pdu->rb_size, ppWritePackedMsg, end) &&
+        push8(pusch_pdu->vrb_to_prb_mapping, ppWritePackedMsg, end) &&
+        push8(pusch_pdu->frequency_hopping, ppWritePackedMsg, end) &&
+        push16(pusch_pdu->tx_direct_current_location, ppWritePackedMsg, end) &&
+        push8(pusch_pdu->uplink_frequency_shift_7p5khz, ppWritePackedMsg, end) &&
+        push8(pusch_pdu->start_symbol_index, ppWritePackedMsg, end) &&
+        push8(pusch_pdu->nr_of_symbols, ppWritePackedMsg, end)
+        // TODO: ignoring beamforming tlv for now
+      ))
+    return 0;
+
+  //Pack Optional Data only included if indicated in pduBitmap
+  switch(pusch_pdu->pdu_bit_map) {
+    case PUSCH_PDU_BITMAP_PUSCH_DATA: {
+      // pack optional TLVs
+      return(
+              push8(pusch_pdu->pusch_data.rv_index, ppWritePackedMsg, end) &&
+              push8(pusch_pdu->pusch_data.harq_process_id, ppWritePackedMsg, end) &&
+              push32(pusch_pdu->pusch_data.tb_size, ppWritePackedMsg, end) &&
+              push16(pusch_pdu->pusch_data.num_cb, ppWritePackedMsg, end) &&
+              pusharray8(pusch_pdu->pusch_data.cb_present_and_position,1,1,ppWritePackedMsg, end)
+            );
+    }
+    break;
+
+    case PUSCH_PDU_BITMAP_PUSCH_UCI: {
+      return(
+              push16(pusch_pdu->pusch_uci.harq_ack_bit_length, ppWritePackedMsg, end) &&
+              push16(pusch_pdu->pusch_uci.csi_part1_bit_length, ppWritePackedMsg, end) &&
+              push16(pusch_pdu->pusch_uci.csi_part2_bit_length, ppWritePackedMsg, end) &&
+              push8(pusch_pdu->pusch_uci.alpha_scaling, ppWritePackedMsg, end) &&
+              push8(pusch_pdu->pusch_uci.beta_offset_harq_ack, ppWritePackedMsg, end) &&
+              push8(pusch_pdu->pusch_uci.beta_offset_csi1, ppWritePackedMsg, end) &&
+              push8(pusch_pdu->pusch_uci.beta_offset_csi2, ppWritePackedMsg, end)
+            );
+    }
+    break;
+
+    case PUSCH_PDU_BITMAP_PUSCH_PTRS: {
+      return(
+              push8(pusch_pdu->pusch_ptrs.num_ptrs_ports, ppWritePackedMsg, end) &&
+              push8(pusch_pdu->pusch_ptrs.ptrs_ports_list->ptrs_dmrs_port, ppWritePackedMsg, end) &&
+              push16(pusch_pdu->pusch_ptrs.ptrs_ports_list->ptrs_port_index, ppWritePackedMsg, end) &&
+              push8(pusch_pdu->pusch_ptrs.ptrs_ports_list->ptrs_re_offset, ppWritePackedMsg, end) &&
+              push8(pusch_pdu->pusch_ptrs.ptrs_time_density, ppWritePackedMsg, end) &&
+              push8(pusch_pdu->pusch_ptrs.ptrs_freq_density, ppWritePackedMsg, end) &&
+              push8(pusch_pdu->pusch_ptrs.ul_ptrs_power, ppWritePackedMsg, end)
+            );
+    }
+    break;
+
+    case PUSCH_PDU_BITMAP_DFTS_OFDM: {
+      return(
+              push8(pusch_pdu->dfts_ofdm.low_papr_group_number, ppWritePackedMsg, end) &&
+              push16(pusch_pdu->dfts_ofdm.low_papr_sequence_number, ppWritePackedMsg, end) &&
+              push8(pusch_pdu->dfts_ofdm.ul_ptrs_sample_density, ppWritePackedMsg, end) &&
+              push8(pusch_pdu->dfts_ofdm.ul_ptrs_time_density_transform_precoding, ppWritePackedMsg, end)
+            );
+    }
+    break;
+
+    default: {
+      NFAPI_TRACE(NFAPI_TRACE_INFO, "Invalid pdu bitmap %d \n", pusch_pdu->pdu_bit_map );
+    }
+  }
+
+  return 1;
+}
+
+static uint8_t pack_ul_tti_request_srs_pdu(nfapi_nr_srs_pdu_t *srs_pdu, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  return(
+          push16(srs_pdu->rnti, ppWritePackedMsg, end) &&
+          push32(srs_pdu->handle, ppWritePackedMsg, end) &&
+          push16(srs_pdu->bwp_size, ppWritePackedMsg, end) &&
+          push16(srs_pdu->bwp_start, ppWritePackedMsg, end) &&
+          push8(srs_pdu->subcarrier_spacing, ppWritePackedMsg, end) &&
+          push8(srs_pdu->cyclic_prefix, ppWritePackedMsg, end) &&
+          push8(srs_pdu->num_ant_ports, ppWritePackedMsg, end) &&
+          push8(srs_pdu->num_symbols, ppWritePackedMsg, end) &&
+          push8(srs_pdu->num_repetitions, ppWritePackedMsg, end) &&
+          push8(srs_pdu->time_start_position, ppWritePackedMsg, end) &&
+          push8(srs_pdu->config_index, ppWritePackedMsg, end) &&
+          push16(srs_pdu->sequence_id, ppWritePackedMsg, end) &&
+          push8(srs_pdu->bandwidth_index, ppWritePackedMsg, end) &&
+          push8(srs_pdu->comb_size, ppWritePackedMsg, end) &&
+          push8(srs_pdu->comb_offset, ppWritePackedMsg, end) &&
+          push8(srs_pdu->cyclic_shift, ppWritePackedMsg, end) &&
+          push8(srs_pdu->frequency_position, ppWritePackedMsg, end) &&
+          push8(srs_pdu->frequency_shift, ppWritePackedMsg, end) &&
+          push8(srs_pdu->frequency_hopping, ppWritePackedMsg, end) &&
+          push8(srs_pdu->group_or_sequence_hopping, ppWritePackedMsg, end) &&
+          push8(srs_pdu->resource_type, ppWritePackedMsg, end) &&
+          push16(srs_pdu->t_srs, ppWritePackedMsg, end) &&
+          push16(srs_pdu->t_offset, ppWritePackedMsg, end)
+          // TODO: ignoring beamforming tlv for now
+        );
+}
+
+static uint8_t pack_ul_config_request_ulsch_pdu(nfapi_ul_config_ulsch_pdu *ulsch_pdu, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  return ( pack_tlv(NFAPI_UL_CONFIG_REQUEST_ULSCH_PDU_REL8_TAG, &ulsch_pdu->ulsch_pdu_rel8, ppWritePackedMsg, end, &pack_ul_config_request_ulsch_rel8_value) &&
+           pack_tlv(NFAPI_UL_CONFIG_REQUEST_ULSCH_PDU_REL10_TAG, &ulsch_pdu->ulsch_pdu_rel10, ppWritePackedMsg, end, &pack_ul_config_request_ulsch_rel10_value) &&
+           pack_tlv(NFAPI_UL_CONFIG_REQUEST_ULSCH_PDU_REL11_TAG, &ulsch_pdu->ulsch_pdu_rel11, ppWritePackedMsg, end, &pack_ul_config_request_ulsch_rel11_value) &&
+           pack_tlv(NFAPI_UL_CONFIG_REQUEST_ULSCH_PDU_REL13_TAG, &ulsch_pdu->ulsch_pdu_rel13, ppWritePackedMsg, end, &pack_ul_config_request_ulsch_rel13_value));
+}
+
+static uint8_t pack_ul_config_request_cqi_ri_rel8_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_ul_config_cqi_ri_information_rel8_t *cqi_ri_info_rel8 = (nfapi_ul_config_cqi_ri_information_rel8_t *)tlv;
+  return ( push8(cqi_ri_info_rel8->dl_cqi_pmi_size_rank_1, ppWritePackedMsg, end) &&
+           push8(cqi_ri_info_rel8->dl_cqi_pmi_size_rank_greater_1, ppWritePackedMsg, end) &&
+           push8(cqi_ri_info_rel8->ri_size, ppWritePackedMsg, end) &&
+           push8(cqi_ri_info_rel8->delta_offset_cqi, ppWritePackedMsg, end) &&
+           push8(cqi_ri_info_rel8->delta_offset_ri, ppWritePackedMsg, end));
+}
+
+static uint8_t pack_ul_config_request_cqi_ri_rel9_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_ul_config_cqi_ri_information_rel9_t *cqi_ri_info_rel9 = (nfapi_ul_config_cqi_ri_information_rel9_t *)tlv;
+
+  if(!(push8(cqi_ri_info_rel9->report_type, ppWritePackedMsg, end) &&
+       push8(cqi_ri_info_rel9->delta_offset_cqi, ppWritePackedMsg, end) &&
+       push8(cqi_ri_info_rel9->delta_offset_ri, ppWritePackedMsg, end))) {
+    return 0;
+  }
+
+  switch(cqi_ri_info_rel9->report_type) {
+    case NFAPI_CSI_REPORT_TYPE_PERIODIC: {
+      if(!(push8(cqi_ri_info_rel9->periodic_cqi_pmi_ri_report.dl_cqi_pmi_ri_size, ppWritePackedMsg, end) &&
+           push8(cqi_ri_info_rel9->periodic_cqi_pmi_ri_report.control_type, ppWritePackedMsg, end))) {
+        return 0;
+      }
+    }
+    break;
+
+    case NFAPI_CSI_REPORT_TYPE_APERIODIC: {
+      if(push8(cqi_ri_info_rel9->aperiodic_cqi_pmi_ri_report.number_of_cc, ppWritePackedMsg, end) == 0)
+        return 0;
+
+      uint8_t i;
+
+      for(i = 0; i < cqi_ri_info_rel9->aperiodic_cqi_pmi_ri_report.number_of_cc; ++i) {
+        if(push8(cqi_ri_info_rel9->aperiodic_cqi_pmi_ri_report.cc[i].ri_size, ppWritePackedMsg, end) == 0)
+          return 0;
+
+        uint8_t j;
+
+        for(j = 0; j < 8; ++j) {
+          if(push8(cqi_ri_info_rel9->aperiodic_cqi_pmi_ri_report.cc[i].dl_cqi_pmi_size[j], ppWritePackedMsg, end) == 0)
+            return 0;
+        }
+      }
+    }
+    break;
+
+    default: {
+      NFAPI_TRACE(NFAPI_TRACE_ERROR, "FIXME : Invalid report type %d \n", cqi_ri_info_rel9->report_type );
+    }
+    break;
+  };
+
+  return 1;
+}
+
+static uint8_t pack_ul_config_request_cqi_ri_rel13_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_ul_config_cqi_ri_information_rel13_t *cqi_ri_info_rel13 = (nfapi_ul_config_cqi_ri_information_rel13_t *)tlv;
+
+  switch(cqi_ri_info_rel13->report_type) {
+    case NFAPI_CSI_REPORT_TYPE_PERIODIC: {
+      if(push16(cqi_ri_info_rel13->periodic_cqi_pmi_ri_report.dl_cqi_pmi_ri_size_2, ppWritePackedMsg, end) == 0)
+        return 0;
+    }
+    break;
+
+    case NFAPI_CSI_REPORT_TYPE_APERIODIC: {
+      // No parameters
+    }
+    break;
+
+    default: {
+      NFAPI_TRACE(NFAPI_TRACE_ERROR, "FIXME : Invalid report type %d \n", cqi_ri_info_rel13->report_type );
+    }
+    break;
+  };
+
+  return 1;
+}
+
+static uint8_t pack_ul_config_request_cqi_ri_information(nfapi_ul_config_cqi_ri_information *cqi_ri_info, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  return (pack_tlv(NFAPI_UL_CONFIG_REQUEST_CQI_RI_INFORMATION_REL8_TAG, &cqi_ri_info->cqi_ri_information_rel8, ppWritePackedMsg, end, &pack_ul_config_request_cqi_ri_rel8_value) &&
+          pack_tlv(NFAPI_UL_CONFIG_REQUEST_CQI_RI_INFORMATION_REL9_TAG, &cqi_ri_info->cqi_ri_information_rel9, ppWritePackedMsg, end, &pack_ul_config_request_cqi_ri_rel9_value) &&
+          pack_tlv(NFAPI_UL_CONFIG_REQUEST_CQI_RI_INFORMATION_REL13_TAG, &cqi_ri_info->cqi_ri_information_rel13, ppWritePackedMsg, end, &pack_ul_config_request_cqi_ri_rel13_value));
+}
+
+static uint8_t pack_ul_config_request_init_tx_params_rel8_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_ul_config_initial_transmission_parameters_rel8_t *init_tx_params_rel8 = (nfapi_ul_config_initial_transmission_parameters_rel8_t *)tlv;
+  return (push8(init_tx_params_rel8->n_srs_initial, ppWritePackedMsg, end) &&
+          push8(init_tx_params_rel8->initial_number_of_resource_blocks, ppWritePackedMsg, end));
+}
+
+static uint8_t pack_ul_config_request_initial_transmission_parameters(nfapi_ul_config_initial_transmission_parameters *init_tx_params, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  return pack_tlv(NFAPI_UL_CONFIG_REQUEST_INITIAL_TRANSMISSION_PARAMETERS_REL8_TAG, &init_tx_params->initial_transmission_parameters_rel8, ppWritePackedMsg, end,
+                  &pack_ul_config_request_init_tx_params_rel8_value);
+}
+
+static uint8_t pack_ul_config_request_ulsch_harq_info_rel10_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_ul_config_ulsch_harq_information_rel10_t *harq_info_rel10 = (nfapi_ul_config_ulsch_harq_information_rel10_t *)tlv;
+  return (push8(harq_info_rel10->harq_size, ppWritePackedMsg, end) &&
+          push8(harq_info_rel10->delta_offset_harq, ppWritePackedMsg, end) &&
+          push8(harq_info_rel10->ack_nack_mode, ppWritePackedMsg, end));
+}
+static uint8_t pack_ul_config_request_ulsch_harq_info_rel13_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_ul_config_ulsch_harq_information_rel13_t *harq_info_rel13 = (nfapi_ul_config_ulsch_harq_information_rel13_t *)tlv;
+  return (push16(harq_info_rel13->harq_size_2, ppWritePackedMsg, end) &&
+          push8(harq_info_rel13->delta_offset_harq_2, ppWritePackedMsg, end));
+}
+
+static uint8_t pack_ul_config_request_ulsch_harq_information(nfapi_ul_config_ulsch_harq_information *harq_info, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  return ( pack_tlv(NFAPI_UL_CONFIG_REQUEST_ULSCH_HARQ_INFORMATION_REL10_TAG, &harq_info->harq_information_rel10, ppWritePackedMsg, end, &pack_ul_config_request_ulsch_harq_info_rel10_value) &&
+           pack_tlv(NFAPI_UL_CONFIG_REQUEST_ULSCH_HARQ_INFORMATION_REL13_TAG, &harq_info->harq_information_rel13, ppWritePackedMsg, end, &pack_ul_config_request_ulsch_harq_info_rel13_value));
+}
+
+static uint8_t pack_ul_config_request_ue_info_rel8_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_ul_config_ue_information_rel8_t *ue_info_rel8 = (nfapi_ul_config_ue_information_rel8_t *)tlv;
+  return ( push32(ue_info_rel8->handle, ppWritePackedMsg, end) &&
+           push16(ue_info_rel8->rnti, ppWritePackedMsg, end));
+}
+static uint8_t pack_ul_config_request_ue_info_rel11_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_ul_config_ue_information_rel11_t *ue_info_rel11 = (nfapi_ul_config_ue_information_rel11_t *)tlv;
+  return ( push8(ue_info_rel11->virtual_cell_id_enabled_flag, ppWritePackedMsg, end) &&
+           push16(ue_info_rel11->npusch_identity, ppWritePackedMsg, end));
+}
+static uint8_t pack_ul_config_request_ue_info_rel13_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_ul_config_ue_information_rel13_t *ue_info_rel13 = (nfapi_ul_config_ue_information_rel13_t *)tlv;
+  return ( push8(ue_info_rel13->ue_type, ppWritePackedMsg, end) &&
+           push8(ue_info_rel13->empty_symbols, ppWritePackedMsg, end) &&
+           push16(ue_info_rel13->total_number_of_repetitions, ppWritePackedMsg, end) &&
+           push16(ue_info_rel13->repetition_number, ppWritePackedMsg, end));
+}
+
+static uint8_t pack_ul_config_request_ue_information(nfapi_ul_config_ue_information *ue_info, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  return ( pack_tlv(NFAPI_UL_CONFIG_REQUEST_UE_INFORMATION_REL8_TAG, &ue_info->ue_information_rel8, ppWritePackedMsg, end, &pack_ul_config_request_ue_info_rel8_value) &&
+           pack_tlv(NFAPI_UL_CONFIG_REQUEST_UE_INFORMATION_REL11_TAG, &ue_info->ue_information_rel11, ppWritePackedMsg, end, &pack_ul_config_request_ue_info_rel11_value) &&
+           pack_tlv(NFAPI_UL_CONFIG_REQUEST_UE_INFORMATION_REL13_TAG, &ue_info->ue_information_rel13, ppWritePackedMsg, end, &pack_ul_config_request_ue_info_rel13_value));
+}
+
+static uint8_t pack_ul_config_request_harq_info_rel10_tdd_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_ul_config_harq_information_rel10_tdd_t *harq_info_rel10_tdd = (nfapi_ul_config_harq_information_rel10_tdd_t *)tlv;
+  return ( push8(harq_info_rel10_tdd->harq_size, ppWritePackedMsg, end) &&
+           push8(harq_info_rel10_tdd->ack_nack_mode, ppWritePackedMsg, end) &&
+           push8(harq_info_rel10_tdd->number_of_pucch_resources, ppWritePackedMsg, end) &&
+           push16(harq_info_rel10_tdd->n_pucch_1_0, ppWritePackedMsg, end) &&
+           push16(harq_info_rel10_tdd->n_pucch_1_1, ppWritePackedMsg, end) &&
+           push16(harq_info_rel10_tdd->n_pucch_1_2, ppWritePackedMsg, end) &&
+           push16(harq_info_rel10_tdd->n_pucch_1_3, ppWritePackedMsg, end));
+}
+static uint8_t pack_ul_config_request_harq_info_rel8_fdd_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_ul_config_harq_information_rel8_fdd_t *harq_info_rel8_fdd = (nfapi_ul_config_harq_information_rel8_fdd_t *)tlv;
+  return ( push16(harq_info_rel8_fdd->n_pucch_1_0, ppWritePackedMsg, end) &&
+           push8(harq_info_rel8_fdd->harq_size, ppWritePackedMsg, end));
+}
+static uint8_t pack_ul_config_request_harq_info_rel9_fdd_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_ul_config_harq_information_rel9_fdd_t *harq_info_rel9_fdd = (nfapi_ul_config_harq_information_rel9_fdd_t *)tlv;
+  return ( push8(harq_info_rel9_fdd->harq_size, ppWritePackedMsg, end) &&
+           push8(harq_info_rel9_fdd->ack_nack_mode, ppWritePackedMsg, end) &&
+           push8(harq_info_rel9_fdd->number_of_pucch_resources, ppWritePackedMsg, end) &&
+           push16(harq_info_rel9_fdd->n_pucch_1_0, ppWritePackedMsg, end) &&
+           push16(harq_info_rel9_fdd->n_pucch_1_1, ppWritePackedMsg, end) &&
+           push16(harq_info_rel9_fdd->n_pucch_1_2, ppWritePackedMsg, end) &&
+           push16(harq_info_rel9_fdd->n_pucch_1_3, ppWritePackedMsg, end));
+}
+static uint8_t pack_ul_config_request_harq_info_rel11_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_ul_config_harq_information_rel11_t *harq_info_rel11 = (nfapi_ul_config_harq_information_rel11_t *)tlv;
+  return ( push8(harq_info_rel11->num_ant_ports, ppWritePackedMsg, end) &&
+           push16(harq_info_rel11->n_pucch_2_0, ppWritePackedMsg, end) &&
+           push16(harq_info_rel11->n_pucch_2_1, ppWritePackedMsg, end) &&
+           push16(harq_info_rel11->n_pucch_2_2, ppWritePackedMsg, end) &&
+           push16(harq_info_rel11->n_pucch_2_3, ppWritePackedMsg, end));
+}
+static uint8_t pack_ul_config_request_harq_info_rel13_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_ul_config_harq_information_rel13_t *harq_info_rel13 = (nfapi_ul_config_harq_information_rel13_t *)tlv;
+  return ( push16(harq_info_rel13->harq_size_2, ppWritePackedMsg, end) &&
+           push8(harq_info_rel13->starting_prb, ppWritePackedMsg, end) &&
+           push8(harq_info_rel13->n_prb, ppWritePackedMsg, end) &&
+           push8(harq_info_rel13->cdm_index, ppWritePackedMsg, end) &&
+           push8(harq_info_rel13->n_srs, ppWritePackedMsg, end));
+}
+
+static uint8_t pack_ul_config_request_harq_information(nfapi_ul_config_harq_information *harq_info, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  return ( pack_tlv(NFAPI_UL_CONFIG_REQUEST_HARQ_INFORMATION_REL10_TDD_TAG, &harq_info->harq_information_rel10_tdd, ppWritePackedMsg, end, &pack_ul_config_request_harq_info_rel10_tdd_value) &&
+           pack_tlv(NFAPI_UL_CONFIG_REQUEST_HARQ_INFORMATION_REL8_FDD_TAG, &harq_info->harq_information_rel8_fdd, ppWritePackedMsg, end, &pack_ul_config_request_harq_info_rel8_fdd_value) &&
+           pack_tlv(NFAPI_UL_CONFIG_REQUEST_HARQ_INFORMATION_REL9_FDD_TAG, &harq_info->harq_information_rel9_fdd, ppWritePackedMsg, end, &pack_ul_config_request_harq_info_rel9_fdd_value) &&
+           pack_tlv(NFAPI_UL_CONFIG_REQUEST_HARQ_INFORMATION_REL11_TAG, &harq_info->harq_information_rel11, ppWritePackedMsg, end, &pack_ul_config_request_harq_info_rel11_value) &&
+           pack_tlv(NFAPI_UL_CONFIG_REQUEST_HARQ_INFORMATION_REL13_TAG, &harq_info->harq_information_rel13, ppWritePackedMsg, end, &pack_ul_config_request_harq_info_rel13_value));
+}
+
+static uint8_t pack_ul_config_request_cqi_info_rel8_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_ul_config_cqi_information_rel8_t *cqi_info_rel8 = (nfapi_ul_config_cqi_information_rel8_t *)tlv;
+  return ( push16(cqi_info_rel8->pucch_index, ppWritePackedMsg, end) &&
+           push8(cqi_info_rel8->dl_cqi_pmi_size, ppWritePackedMsg, end));
+}
+static uint8_t pack_ul_config_request_cqi_info_rel10_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_ul_config_cqi_information_rel10_t *cqi_info_rel10 = (nfapi_ul_config_cqi_information_rel10_t *)tlv;
+  return ( push8(cqi_info_rel10->number_of_pucch_resource, ppWritePackedMsg, end) &&
+           push16(cqi_info_rel10->pucch_index_p1, ppWritePackedMsg, end));
+}
+static uint8_t pack_ul_config_request_cqi_info_rel13_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_ul_config_cqi_information_rel13_t *cqi_info_rel13 = (nfapi_ul_config_cqi_information_rel13_t *)tlv;
+  return ( push8(cqi_info_rel13->csi_mode, ppWritePackedMsg, end) &&
+           push16(cqi_info_rel13->dl_cqi_pmi_size_2, ppWritePackedMsg, end) &&
+           push8(cqi_info_rel13->starting_prb, ppWritePackedMsg, end) &&
+           push8(cqi_info_rel13->n_prb, ppWritePackedMsg, end) &&
+           push8(cqi_info_rel13->cdm_index, ppWritePackedMsg, end) &&
+           push8(cqi_info_rel13->n_srs, ppWritePackedMsg, end));
+}
+
+static uint8_t pack_ul_config_request_cqi_information(nfapi_ul_config_cqi_information *cqi_info, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  return ( pack_tlv(NFAPI_UL_CONFIG_REQUEST_CQI_INFORMATION_REL8_TAG, &cqi_info->cqi_information_rel8, ppWritePackedMsg, end, &pack_ul_config_request_cqi_info_rel8_value) &&
+           pack_tlv(NFAPI_UL_CONFIG_REQUEST_CQI_INFORMATION_REL10_TAG, &cqi_info->cqi_information_rel10, ppWritePackedMsg, end, &pack_ul_config_request_cqi_info_rel10_value) &&
+           pack_tlv(NFAPI_UL_CONFIG_REQUEST_CQI_INFORMATION_REL13_TAG, &cqi_info->cqi_information_rel13, ppWritePackedMsg, end, &pack_ul_config_request_cqi_info_rel13_value));
+}
+
+static uint8_t pack_ul_config_request_sr_info_rel8_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_ul_config_sr_information_rel8_t *sr_info_rel8 = (nfapi_ul_config_sr_information_rel8_t *)tlv;
+  return push16(sr_info_rel8->pucch_index, ppWritePackedMsg, end);
+}
+static uint8_t pack_ul_config_request_sr_info_rel10_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_ul_config_sr_information_rel10_t *sr_info_rel10 = (nfapi_ul_config_sr_information_rel10_t *)tlv;
+  return ( push8(sr_info_rel10->number_of_pucch_resources, ppWritePackedMsg, end) &&
+           push16(sr_info_rel10->pucch_index_p1, ppWritePackedMsg, end));
+}
+
+static uint8_t pack_ul_config_request_sr_information(nfapi_ul_config_sr_information *sr_info, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  return ( pack_tlv(NFAPI_UL_CONFIG_REQUEST_SR_INFORMATION_REL8_TAG, &sr_info->sr_information_rel8, ppWritePackedMsg, end, &pack_ul_config_request_sr_info_rel8_value) &&
+           pack_tlv(NFAPI_UL_CONFIG_REQUEST_SR_INFORMATION_REL10_TAG, &sr_info->sr_information_rel10, ppWritePackedMsg, end, &pack_ul_config_request_sr_info_rel10_value));
+}
+
+static uint8_t pack_ul_config_request_srs_pdu_rel8_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_ul_config_srs_pdu_rel8_t *srs_pdu_rel8 = (nfapi_ul_config_srs_pdu_rel8_t *)tlv;
+  return (push32(srs_pdu_rel8->handle, ppWritePackedMsg, end) &&
+          push16(srs_pdu_rel8->size, ppWritePackedMsg, end) &&
+          push16(srs_pdu_rel8->rnti, ppWritePackedMsg, end) &&
+          push8(srs_pdu_rel8->srs_bandwidth, ppWritePackedMsg, end) &&
+          push8(srs_pdu_rel8->frequency_domain_position, ppWritePackedMsg, end) &&
+          push8(srs_pdu_rel8->srs_hopping_bandwidth, ppWritePackedMsg, end) &&
+          push8(srs_pdu_rel8->transmission_comb, ppWritePackedMsg, end) &&
+          push16(srs_pdu_rel8->i_srs, ppWritePackedMsg, end) &&
+          push8(srs_pdu_rel8->sounding_reference_cyclic_shift, ppWritePackedMsg, end));
+}
+
+static uint8_t pack_ul_config_request_srs_pdu_rel10_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_ul_config_srs_pdu_rel10_t *srs_pdu_rel10 = (nfapi_ul_config_srs_pdu_rel10_t *)tlv;
+  return push8(srs_pdu_rel10->antenna_port, ppWritePackedMsg, end);
+}
+
+static uint8_t pack_ul_config_request_srs_pdu_rel13_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_ul_config_srs_pdu_rel13_t *srs_pdu_rel13 = (nfapi_ul_config_srs_pdu_rel13_t *)tlv;
+  return ( push8(srs_pdu_rel13->number_of_combs, ppWritePackedMsg, end));
+}
+
+static uint8_t pack_ul_config_request_nb_harq_rel13_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_ul_config_nb_harq_information_rel13_fdd_t *nb_harq_pdu_rel13 = (nfapi_ul_config_nb_harq_information_rel13_fdd_t *)tlv;
+  return ( push8(nb_harq_pdu_rel13->harq_ack_resource, ppWritePackedMsg, end));
+}
+
+static uint8_t pack_ul_config_request_nulsch_pdu_rel13_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_ul_config_nulsch_pdu_rel13_t *nulsch_pdu_rel13 = (nfapi_ul_config_nulsch_pdu_rel13_t *)tlv;
+  return (push8(nulsch_pdu_rel13->nulsch_format, ppWritePackedMsg, end) &&
+          push32(nulsch_pdu_rel13->handle, ppWritePackedMsg, end) &&
+          push16(nulsch_pdu_rel13->size, ppWritePackedMsg, end) &&
+          push16(nulsch_pdu_rel13->rnti, ppWritePackedMsg, end) &&
+          push8(nulsch_pdu_rel13->subcarrier_indication, ppWritePackedMsg, end) &&
+          push8(nulsch_pdu_rel13->resource_assignment, ppWritePackedMsg, end) &&
+          push8(nulsch_pdu_rel13->mcs, ppWritePackedMsg, end) &&
+          push8(nulsch_pdu_rel13->redudancy_version, ppWritePackedMsg, end) &&
+          push8(nulsch_pdu_rel13->repetition_number, ppWritePackedMsg, end) &&
+          push8(nulsch_pdu_rel13->new_data_indication, ppWritePackedMsg, end) &&
+          push8(nulsch_pdu_rel13->n_srs, ppWritePackedMsg, end) &&
+          push16(nulsch_pdu_rel13->scrambling_sequence_initialization_cinit, ppWritePackedMsg, end) &&
+          push16(nulsch_pdu_rel13->sf_idx, ppWritePackedMsg, end) &&
+          pack_ul_config_request_ue_information(&(nulsch_pdu_rel13->ue_information), ppWritePackedMsg, end) &&
+          pack_tlv(NFAPI_UL_CONFIG_REQUEST_NB_HARQ_INFORMATION_REL13_FDD_TAG, &nulsch_pdu_rel13->nb_harq_information.nb_harq_information_rel13_fdd, ppWritePackedMsg, end,
+                   &pack_ul_config_request_nb_harq_rel13_value));
+}
+static uint8_t pack_ul_config_request_nrach_pdu_rel13_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_ul_config_nrach_pdu_rel13_t *nrach_pdu_rel13 = (nfapi_ul_config_nrach_pdu_rel13_t *)tlv;
+  return ( push8(nrach_pdu_rel13->nprach_config_0, ppWritePackedMsg, end) &&
+           push8(nrach_pdu_rel13->nprach_config_1, ppWritePackedMsg, end) &&
+           push8(nrach_pdu_rel13->nprach_config_2, ppWritePackedMsg, end));
+}
+
+
+
+static uint8_t pack_ul_tti_pdu_list_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_nr_ul_tti_request_number_of_pdus_t *value = (nfapi_nr_ul_tti_request_number_of_pdus_t *)tlv;
+
+  if(!(push16(value->pdu_size, ppWritePackedMsg, end) &&
+       push16(value->pdu_type, ppWritePackedMsg, end) ))
+    return 0;
+
+  // first match the pdu type, then call the respective function
+  switch(value->pdu_type) {
+    case NFAPI_NR_UL_CONFIG_PRACH_PDU_TYPE: {
+      if(!pack_ul_tti_request_prach_pdu(&value->prach_pdu, ppWritePackedMsg, end))
+        return 0;
+    }
+    break;
+
+    case NFAPI_NR_UL_CONFIG_PUCCH_PDU_TYPE: {
+      if(!pack_ul_tti_request_pucch_pdu(&value->pucch_pdu, ppWritePackedMsg, end))
+        return 0;
+    }
+    break;
+
+    case NFAPI_NR_UL_CONFIG_PUSCH_PDU_TYPE: {
+      if(!pack_ul_tti_request_pusch_pdu(&value->pusch_pdu, ppWritePackedMsg, end))
+        return 0;
+    }
+    break;
+
+    case NFAPI_NR_UL_CONFIG_SRS_PDU_TYPE: {
+      if(!pack_ul_tti_request_srs_pdu(&value->srs_pdu, ppWritePackedMsg, end))
+        return 0;
+    }
+    break;
+
+    default: {
+      NFAPI_TRACE(NFAPI_TRACE_ERROR, "FIXME : Invalid UL_TTI pdu type %d \n", value->pdu_type );
+    }
+    break;
+  }
+
+  return 1;
+}
+
+static uint8_t pack_ul_tti_groups_list_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_nr_ul_tti_request_number_of_groups_t *value = (nfapi_nr_ul_tti_request_number_of_groups_t *)tlv;
+
+  if(!push8(value->n_ue, ppWritePackedMsg, end))
+    return 0;
+
+  for(int i=0; i<value->n_ue; i++) {
+    if(!push8(value->ue_list[i].pdu_idx, ppWritePackedMsg, end))
+      return 0;
+  }
+
+  return 1;
+}
+
+static uint8_t pack_ul_config_request_body_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_ul_config_request_body_t *value = (nfapi_ul_config_request_body_t *)tlv;
+
+  if(!(push8(value->number_of_pdus, ppWritePackedMsg, end) &&
+       push8(value->rach_prach_frequency_resources, ppWritePackedMsg, end) &&
+       push8(value->srs_present, ppWritePackedMsg, end)))
+    return 0;
+
+  uint16_t i = 0;
+
+  for(i = 0; i < value->number_of_pdus; ++i) {
+    nfapi_ul_config_request_pdu_t *pdu = &(value->ul_config_pdu_list[i]);
+
+    if(push8(pdu->pdu_type, ppWritePackedMsg, end) == 0)
+      return 0;
+
+    // Put a 0 size in and then determine the size after the pdu
+    // has been writen and write the calculated size
+    uint8_t *pWritePackedMsgPduSize = *ppWritePackedMsg;
+    pdu->pdu_size = 0;
+
+    if(push8(pdu->pdu_size, ppWritePackedMsg, end) == 0)
+      return 0;
+
+    switch(pdu->pdu_type) {
+      case NFAPI_UL_CONFIG_ULSCH_PDU_TYPE: {
+        if(!pack_ul_config_request_ulsch_pdu(&(pdu->ulsch_pdu), ppWritePackedMsg, end))
+          return 0;
+      }
+      break;
+
+      case NFAPI_UL_CONFIG_ULSCH_CQI_RI_PDU_TYPE: {
+        if(!(pack_ul_config_request_ulsch_pdu(&(pdu->ulsch_cqi_ri_pdu.ulsch_pdu), ppWritePackedMsg, end) &&
+             pack_ul_config_request_cqi_ri_information(&(pdu->ulsch_cqi_ri_pdu.cqi_ri_information), ppWritePackedMsg, end) &&
+             pack_ul_config_request_initial_transmission_parameters(&(pdu->ulsch_cqi_ri_pdu.initial_transmission_parameters), ppWritePackedMsg, end)))
+          return 0;
+      }
+      break;
+
+      case NFAPI_UL_CONFIG_ULSCH_HARQ_PDU_TYPE: {
+        if(!(pack_ul_config_request_ulsch_pdu(&(pdu->ulsch_harq_pdu.ulsch_pdu), ppWritePackedMsg, end) &&
+             pack_ul_config_request_ulsch_harq_information(&(pdu->ulsch_harq_pdu.harq_information), ppWritePackedMsg, end) &&
+             pack_ul_config_request_initial_transmission_parameters(&(pdu->ulsch_harq_pdu.initial_transmission_parameters), ppWritePackedMsg, end)))
+          return 0;
+      }
+      break;
+
+      case NFAPI_UL_CONFIG_ULSCH_CQI_HARQ_RI_PDU_TYPE: {
+        if(!(pack_ul_config_request_ulsch_pdu(&(pdu->ulsch_cqi_harq_ri_pdu.ulsch_pdu), ppWritePackedMsg, end) &&
+             pack_ul_config_request_cqi_ri_information(&(pdu->ulsch_cqi_harq_ri_pdu.cqi_ri_information), ppWritePackedMsg, end) &&
+             pack_ul_config_request_ulsch_harq_information(&(pdu->ulsch_cqi_harq_ri_pdu.harq_information), ppWritePackedMsg, end) &&
+             pack_ul_config_request_initial_transmission_parameters(&(pdu->ulsch_cqi_harq_ri_pdu.initial_transmission_parameters), ppWritePackedMsg, end)))
+          return 0;
+      }
+      break;
+
+      case NFAPI_UL_CONFIG_UCI_CQI_PDU_TYPE: {
+        if(!(pack_ul_config_request_ue_information(&(pdu->uci_cqi_pdu.ue_information), ppWritePackedMsg, end) &&
+             pack_ul_config_request_cqi_information(&(pdu->uci_cqi_pdu.cqi_information), ppWritePackedMsg, end)))
+          return 0;
+      }
+      break;
+
+      case NFAPI_UL_CONFIG_UCI_SR_PDU_TYPE: {
+        if(!(pack_ul_config_request_ue_information(&(pdu->uci_sr_pdu.ue_information), ppWritePackedMsg, end) &&
+             pack_ul_config_request_sr_information(&(pdu->uci_sr_pdu.sr_information), ppWritePackedMsg, end)))
+          return 0;
+      }
+      break;
+
+      case NFAPI_UL_CONFIG_UCI_HARQ_PDU_TYPE: {
+        if(!(pack_ul_config_request_ue_information(&(pdu->uci_harq_pdu.ue_information), ppWritePackedMsg, end) &&
+             pack_ul_config_request_harq_information(&(pdu->uci_harq_pdu.harq_information), ppWritePackedMsg, end)))
+          return 0;
+      }
+      break;
+
+      case NFAPI_UL_CONFIG_UCI_SR_HARQ_PDU_TYPE: {
+        if(!(pack_ul_config_request_ue_information(&(pdu->uci_sr_harq_pdu.ue_information), ppWritePackedMsg, end) &&
+             pack_ul_config_request_sr_information(&(pdu->uci_sr_harq_pdu.sr_information), ppWritePackedMsg, end) &&
+             pack_ul_config_request_harq_information(&(pdu->uci_sr_harq_pdu.harq_information), ppWritePackedMsg, end)))
+          return 0;
+      }
+      break;
+
+      case NFAPI_UL_CONFIG_UCI_CQI_HARQ_PDU_TYPE: {
+        if(!(pack_ul_config_request_ue_information(&(pdu->uci_cqi_harq_pdu.ue_information), ppWritePackedMsg, end) &&
+             pack_ul_config_request_cqi_information(&(pdu->uci_cqi_harq_pdu.cqi_information), ppWritePackedMsg, end) &&
+             pack_ul_config_request_harq_information(&(pdu->uci_cqi_harq_pdu.harq_information), ppWritePackedMsg, end)))
+          return 0;
+      }
+      break;
+
+      case NFAPI_UL_CONFIG_UCI_CQI_SR_PDU_TYPE: {
+        if(!(pack_ul_config_request_ue_information(&(pdu->uci_cqi_sr_pdu.ue_information), ppWritePackedMsg, end) &&
+             pack_ul_config_request_cqi_information(&(pdu->uci_cqi_sr_pdu.cqi_information), ppWritePackedMsg, end) &&
+             pack_ul_config_request_sr_information(&(pdu->uci_cqi_sr_pdu.sr_information), ppWritePackedMsg, end)))
+          return 0;
+      }
+      break;
+
+      case NFAPI_UL_CONFIG_UCI_CQI_SR_HARQ_PDU_TYPE: {
+        if(!(pack_ul_config_request_ue_information(&(pdu->uci_cqi_sr_harq_pdu.ue_information), ppWritePackedMsg, end) &&
+             pack_ul_config_request_cqi_information(&(pdu->uci_cqi_sr_harq_pdu.cqi_information), ppWritePackedMsg, end) &&
+             pack_ul_config_request_sr_information(&(pdu->uci_cqi_sr_harq_pdu.sr_information), ppWritePackedMsg, end) &&
+             pack_ul_config_request_harq_information(&(pdu->uci_cqi_sr_harq_pdu.harq_information), ppWritePackedMsg, end)))
+          return 0;
+      }
+      break;
+
+      case NFAPI_UL_CONFIG_SRS_PDU_TYPE: {
+        if(!(pack_tlv(NFAPI_UL_CONFIG_REQUEST_SRS_PDU_REL8_TAG, &pdu->srs_pdu.srs_pdu_rel8, ppWritePackedMsg, end, &pack_ul_config_request_srs_pdu_rel8_value) &&
+             pack_tlv(NFAPI_UL_CONFIG_REQUEST_SRS_PDU_REL10_TAG, &pdu->srs_pdu.srs_pdu_rel10, ppWritePackedMsg, end, &pack_ul_config_request_srs_pdu_rel10_value) &&
+             pack_tlv(NFAPI_UL_CONFIG_REQUEST_SRS_PDU_REL13_TAG, &pdu->srs_pdu.srs_pdu_rel13, ppWritePackedMsg, end, &pack_ul_config_request_srs_pdu_rel13_value)))
+          return 0;
+      }
+      break;
+
+      case NFAPI_UL_CONFIG_HARQ_BUFFER_PDU_TYPE: {
+        if(!(pack_ul_config_request_ue_information(&(pdu->harq_buffer_pdu.ue_information), ppWritePackedMsg, end)))
+          return 0;
+      }
+      break;
+
+      case NFAPI_UL_CONFIG_ULSCH_UCI_CSI_PDU_TYPE: {
+        if(!(pack_ul_config_request_ulsch_pdu(&(pdu->ulsch_uci_csi_pdu.ulsch_pdu), ppWritePackedMsg, end) &&
+             pack_ul_config_request_cqi_information(&(pdu->ulsch_uci_csi_pdu.csi_information), ppWritePackedMsg, end)))
+          return 0;
+      }
+      break;
+
+      case NFAPI_UL_CONFIG_ULSCH_UCI_HARQ_PDU_TYPE: {
+        if(!(pack_ul_config_request_ulsch_pdu(&(pdu->ulsch_uci_harq_pdu.ulsch_pdu), ppWritePackedMsg, end) &&
+             pack_ul_config_request_harq_information(&(pdu->ulsch_uci_harq_pdu.harq_information), ppWritePackedMsg, end)))
+          return 0;
+      }
+      break;
+
+      case NFAPI_UL_CONFIG_ULSCH_CSI_UCI_HARQ_PDU_TYPE: {
+        if(!(pack_ul_config_request_ulsch_pdu(&(pdu->ulsch_csi_uci_harq_pdu.ulsch_pdu), ppWritePackedMsg, end) &&
+             pack_ul_config_request_cqi_information(&(pdu->ulsch_csi_uci_harq_pdu.csi_information), ppWritePackedMsg, end) &&
+             pack_ul_config_request_harq_information(&(pdu->ulsch_csi_uci_harq_pdu.harq_information), ppWritePackedMsg, end)))
+          return 0;
+      }
+      break;
+
+      case NFAPI_UL_CONFIG_NULSCH_PDU_TYPE: {
+        if(!(pack_tlv(NFAPI_UL_CONFIG_REQUEST_NULSCH_PDU_REL13_TAG, &pdu->nulsch_pdu.nulsch_pdu_rel13, ppWritePackedMsg, end, &pack_ul_config_request_nulsch_pdu_rel13_value)))
+          return 0;
+      }
+      break;
+
+      case NFAPI_UL_CONFIG_NRACH_PDU_TYPE: {
+        if(!(pack_tlv(NFAPI_UL_CONFIG_REQUEST_NRACH_PDU_REL13_TAG, &pdu->nrach_pdu.nrach_pdu_rel13, ppWritePackedMsg, end, &pack_ul_config_request_nrach_pdu_rel13_value)))
+          return 0;
+      }
+      break;
+
+      default: {
+        NFAPI_TRACE(NFAPI_TRACE_ERROR, "FIXME : Invalid pdu type %d \n", pdu->pdu_type );
+      }
+      break;
+    };
+
+    // add 1 for the pdu_type. The delta will include the pdu_size
+    pdu->pdu_size = 1 + (*ppWritePackedMsg - pWritePackedMsgPduSize);
+
+    push8(pdu->pdu_size, &pWritePackedMsgPduSize, end);
+  }
+
+  return 1;
+}
+
+
+static uint8_t pack_ul_tti_request(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p7_codec_config_t *config) {
+  nfapi_nr_ul_tti_request_t *pNfapiMsg = (nfapi_nr_ul_tti_request_t *)msg;
+
+  if (!(push16(pNfapiMsg->SFN, ppWritePackedMsg, end) &&
+        push16(pNfapiMsg->Slot, ppWritePackedMsg, end) &&
+        push8(pNfapiMsg->n_pdus, ppWritePackedMsg, end) &&
+        push8(pNfapiMsg->rach_present, ppWritePackedMsg, end) &&
+        push8(pNfapiMsg->n_ulsch, ppWritePackedMsg, end) &&
+        push8(pNfapiMsg->n_ulcch, ppWritePackedMsg, end) &&
+        push8(pNfapiMsg->n_group, ppWritePackedMsg, end) ))
+    return 0;
+
+  for(int i=0; i<pNfapiMsg->n_pdus; i++) {
+    if(!pack_ul_tti_pdu_list_value(&pNfapiMsg->pdus_list[i], ppWritePackedMsg, end))
+      return 0;
+  }
+
+  for(int i=0; i<pNfapiMsg->n_group; i++) {
+    if(!pack_ul_tti_groups_list_value(&pNfapiMsg->groups_list[i], ppWritePackedMsg, end))
+      return 0;
+  }
+
+  return 1;
+}
+
+
+static uint8_t pack_ul_config_request(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p7_codec_config_t *config) {
+  nfapi_ul_config_request_t *pNfapiMsg = (nfapi_ul_config_request_t *)msg;
+  return ( push16(pNfapiMsg->sfn_sf, ppWritePackedMsg, end) &&
+           pack_tlv(NFAPI_UL_CONFIG_REQUEST_BODY_TAG, &pNfapiMsg->ul_config_request_body, ppWritePackedMsg, end, &pack_ul_config_request_body_value) &&
+           pack_p7_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config)) ;
+}
+
+static uint8_t pack_hi_dci0_hi_rel8_pdu_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_hi_dci0_hi_pdu_rel8_t *hi_pdu_rel8 = (nfapi_hi_dci0_hi_pdu_rel8_t *)tlv;
+  return ( push8(hi_pdu_rel8->resource_block_start, ppWritePackedMsg, end) &&
+           push8(hi_pdu_rel8->cyclic_shift_2_for_drms, ppWritePackedMsg, end) &&
+           push8(hi_pdu_rel8->hi_value, ppWritePackedMsg, end) &&
+           push8(hi_pdu_rel8->i_phich, ppWritePackedMsg, end) &&
+           push16(hi_pdu_rel8->transmission_power, ppWritePackedMsg, end));
+}
+
+static uint8_t pack_hi_dci0_hi_rel10_pdu_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_hi_dci0_hi_pdu_rel10_t *hi_pdu_rel10 = (nfapi_hi_dci0_hi_pdu_rel10_t *)tlv;
+  return ( push8(hi_pdu_rel10->flag_tb2, ppWritePackedMsg, end) &&
+           push8(hi_pdu_rel10->hi_value_2, ppWritePackedMsg, end));
+}
+
+static uint8_t pack_hi_dci0_dci_rel8_pdu_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_hi_dci0_dci_pdu_rel8_t *dci_pdu_rel8 = (nfapi_hi_dci0_dci_pdu_rel8_t *)tlv;
+  return ( push8(dci_pdu_rel8->dci_format, ppWritePackedMsg, end) &&
+           push8(dci_pdu_rel8->cce_index, ppWritePackedMsg, end) &&
+           push8(dci_pdu_rel8->aggregation_level, ppWritePackedMsg, end) &&
+           push16(dci_pdu_rel8->rnti, ppWritePackedMsg, end) &&
+           push8(dci_pdu_rel8->resource_block_start, ppWritePackedMsg, end) &&
+           push8(dci_pdu_rel8->number_of_resource_block, ppWritePackedMsg, end) &&
+           push8(dci_pdu_rel8->mcs_1, ppWritePackedMsg, end) &&
+           push8(dci_pdu_rel8->cyclic_shift_2_for_drms, ppWritePackedMsg, end) &&
+           push8(dci_pdu_rel8->frequency_hopping_enabled_flag, ppWritePackedMsg, end) &&
+           push8(dci_pdu_rel8->frequency_hopping_bits, ppWritePackedMsg, end) &&
+           push8(dci_pdu_rel8->new_data_indication_1, ppWritePackedMsg, end) &&
+           push8(dci_pdu_rel8->ue_tx_antenna_seleciton, ppWritePackedMsg, end) &&
+           push8(dci_pdu_rel8->tpc, ppWritePackedMsg, end) &&
+           push8(dci_pdu_rel8->cqi_csi_request, ppWritePackedMsg, end) &&
+           push8(dci_pdu_rel8->ul_index, ppWritePackedMsg, end) &&
+           push8(dci_pdu_rel8->dl_assignment_index, ppWritePackedMsg, end) &&
+           push32(dci_pdu_rel8->tpc_bitmap, ppWritePackedMsg, end) &&
+           push16(dci_pdu_rel8->transmission_power, ppWritePackedMsg, end));
+}
+
+static uint8_t pack_hi_dci0_dci_rel10_pdu_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_hi_dci0_dci_pdu_rel10_t *dci_pdu_rel10 = (nfapi_hi_dci0_dci_pdu_rel10_t *)tlv;
+  return ( push8(dci_pdu_rel10->cross_carrier_scheduling_flag, ppWritePackedMsg, end) &&
+           push8(dci_pdu_rel10->carrier_indicator, ppWritePackedMsg, end) &&
+           push8(dci_pdu_rel10->size_of_cqi_csi_feild, ppWritePackedMsg, end) &&
+           push8(dci_pdu_rel10->srs_flag, ppWritePackedMsg, end) &&
+           push8(dci_pdu_rel10->srs_request, ppWritePackedMsg, end) &&
+           push8(dci_pdu_rel10->resource_allocation_flag, ppWritePackedMsg, end) &&
+           push8(dci_pdu_rel10->resource_allocation_type, ppWritePackedMsg, end) &&
+           push32(dci_pdu_rel10->resource_block_coding, ppWritePackedMsg, end) &&
+           push8(dci_pdu_rel10->mcs_2, ppWritePackedMsg, end) &&
+           push8(dci_pdu_rel10->new_data_indication_2, ppWritePackedMsg, end) &&
+           push8(dci_pdu_rel10->number_of_antenna_ports, ppWritePackedMsg, end) &&
+           push8(dci_pdu_rel10->tpmi, ppWritePackedMsg, end) &&
+           push8(dci_pdu_rel10->total_dci_length_including_padding, ppWritePackedMsg, end) &&
+           push8(dci_pdu_rel10->n_ul_rb, ppWritePackedMsg, end));
+}
+
+static uint8_t pack_hi_dci0_dci_rel12_pdu_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_hi_dci0_dci_pdu_rel12_t *dci_pdu_rel12 = (nfapi_hi_dci0_dci_pdu_rel12_t *)tlv;
+  return ( push8(dci_pdu_rel12->pscch_resource, ppWritePackedMsg, end) &&
+           push8(dci_pdu_rel12->time_resource_pattern, ppWritePackedMsg, end));
+}
+
+static uint8_t pack_hi_dci0_mpdcch_dci_rel13_pdu_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_hi_dci0_mpdcch_dci_pdu_rel13_t *mpdcch_dci_pdu_rel13 = (nfapi_hi_dci0_mpdcch_dci_pdu_rel13_t *)tlv;
+  return ( push8(mpdcch_dci_pdu_rel13->mpdcch_narrowband, ppWritePackedMsg, end) &&
+           push8(mpdcch_dci_pdu_rel13->number_of_prb_pairs, ppWritePackedMsg, end) &&
+           push8(mpdcch_dci_pdu_rel13->resource_block_assignment, ppWritePackedMsg, end) &&
+           push8(mpdcch_dci_pdu_rel13->mpdcch_transmission_type, ppWritePackedMsg, end) &&
+           push8(mpdcch_dci_pdu_rel13->start_symbol, ppWritePackedMsg, end) &&
+           push8(mpdcch_dci_pdu_rel13->ecce_index, ppWritePackedMsg, end) &&
+           push8(mpdcch_dci_pdu_rel13->aggreagation_level, ppWritePackedMsg, end) &&
+           push8(mpdcch_dci_pdu_rel13->rnti_type, ppWritePackedMsg, end) &&
+           push16(mpdcch_dci_pdu_rel13->rnti, ppWritePackedMsg, end) &&
+           push8(mpdcch_dci_pdu_rel13->ce_mode, ppWritePackedMsg, end) &&
+           push16(mpdcch_dci_pdu_rel13->drms_scrambling_init, ppWritePackedMsg, end) &&
+           push16(mpdcch_dci_pdu_rel13->initial_transmission_sf_io, ppWritePackedMsg, end) &&
+           push16(mpdcch_dci_pdu_rel13->transmission_power, ppWritePackedMsg, end) &&
+           push8(mpdcch_dci_pdu_rel13->dci_format, ppWritePackedMsg, end) &&
+           push8(mpdcch_dci_pdu_rel13->resource_block_start, ppWritePackedMsg, end) &&
+           push8(mpdcch_dci_pdu_rel13->number_of_resource_blocks, ppWritePackedMsg, end) &&
+           push8(mpdcch_dci_pdu_rel13->mcs, ppWritePackedMsg, end) &&
+           push8(mpdcch_dci_pdu_rel13->pusch_repetition_levels, ppWritePackedMsg, end) &&
+           push8(mpdcch_dci_pdu_rel13->frequency_hopping_flag, ppWritePackedMsg, end) &&
+           push8(mpdcch_dci_pdu_rel13->new_data_indication, ppWritePackedMsg, end) &&
+           push8(mpdcch_dci_pdu_rel13->harq_process, ppWritePackedMsg, end) &&
+           push8(mpdcch_dci_pdu_rel13->redudency_version, ppWritePackedMsg, end) &&
+           push8(mpdcch_dci_pdu_rel13->tpc, ppWritePackedMsg, end) &&
+           push8(mpdcch_dci_pdu_rel13->csi_request, ppWritePackedMsg, end) &&
+           push8(mpdcch_dci_pdu_rel13->ul_inex, ppWritePackedMsg, end) &&
+           push8(mpdcch_dci_pdu_rel13->dai_presence_flag, ppWritePackedMsg, end) &&
+           push8(mpdcch_dci_pdu_rel13->dl_assignment_index, ppWritePackedMsg, end) &&
+           push8(mpdcch_dci_pdu_rel13->srs_request, ppWritePackedMsg, end) &&
+           push8(mpdcch_dci_pdu_rel13->dci_subframe_repetition_number, ppWritePackedMsg, end) &&
+           push32(mpdcch_dci_pdu_rel13->tcp_bitmap, ppWritePackedMsg, end) &&
+           push8(mpdcch_dci_pdu_rel13->total_dci_length_include_padding, ppWritePackedMsg, end) &&
+           push8(mpdcch_dci_pdu_rel13->number_of_tx_antenna_ports, ppWritePackedMsg, end) &&
+           pusharray16(mpdcch_dci_pdu_rel13->precoding_value, NFAPI_MAX_TX_PHYSICAL_ANTENNA_PORTS, mpdcch_dci_pdu_rel13->number_of_tx_antenna_ports, ppWritePackedMsg, end));
+}
+
+static uint8_t pack_hi_dci0_npdcch_dci_rel13_pdu_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_hi_dci0_npdcch_dci_pdu_rel13_t *npdcch_dci_pdu_rel13 = (nfapi_hi_dci0_npdcch_dci_pdu_rel13_t *)tlv;
+  return ( push8(npdcch_dci_pdu_rel13->ncce_index, ppWritePackedMsg, end) &&
+           push8(npdcch_dci_pdu_rel13->aggregation_level, ppWritePackedMsg, end) &&
+           push8(npdcch_dci_pdu_rel13->start_symbol, ppWritePackedMsg, end) &&
+           push16(npdcch_dci_pdu_rel13->rnti, ppWritePackedMsg, end) &&
+           push8(npdcch_dci_pdu_rel13->scrambling_reinitialization_batch_index, ppWritePackedMsg, end) &&
+           push8(npdcch_dci_pdu_rel13->nrs_antenna_ports_assumed_by_the_ue, ppWritePackedMsg, end) &&
+           push8(npdcch_dci_pdu_rel13->subcarrier_indication, ppWritePackedMsg, end) &&
+           push8(npdcch_dci_pdu_rel13->resource_assignment, ppWritePackedMsg, end) &&
+           push8(npdcch_dci_pdu_rel13->scheduling_delay, ppWritePackedMsg, end) &&
+           push8(npdcch_dci_pdu_rel13->mcs, ppWritePackedMsg, end) &&
+           push8(npdcch_dci_pdu_rel13->redudancy_version, ppWritePackedMsg, end) &&
+           push8(npdcch_dci_pdu_rel13->repetition_number, ppWritePackedMsg, end) &&
+           push8(npdcch_dci_pdu_rel13->new_data_indicator, ppWritePackedMsg, end) &&
+           push8(npdcch_dci_pdu_rel13->dci_subframe_repetition_number, ppWritePackedMsg, end));
+}
+
+
+static uint8_t pack_hi_dci0_request_body_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_hi_dci0_request_body_t *value = (nfapi_hi_dci0_request_body_t *)tlv;
+
+  if(!(push16(value->sfnsf, ppWritePackedMsg, end) &&
+       push8(value->number_of_dci, ppWritePackedMsg, end) &&
+       push8(value->number_of_hi, ppWritePackedMsg, end)))
+    return 0;
+
+  uint16_t i = 0;
+  uint16_t total_number_of_pdus = value->number_of_dci + value->number_of_hi;
+
+  for(i = 0; i < total_number_of_pdus; ++i) {
+    nfapi_hi_dci0_request_pdu_t *pdu = &(value->hi_dci0_pdu_list[i]);
+
+    if(push8(pdu->pdu_type, ppWritePackedMsg, end) == 0)
+      return 0;
+
+    // Put a 0 size in and then determine the size after the pdu
+    // has been writen and write the calculated size
+    uint8_t *pWritePackedMsgPduSize = *ppWritePackedMsg;
+    pdu->pdu_size = 0;
+
+    if(push8(pdu->pdu_size, ppWritePackedMsg, end) == 0)
+      return 0;
+
+    switch(pdu->pdu_type) {
+      case NFAPI_HI_DCI0_HI_PDU_TYPE: {
+        if(!(pack_tlv(NFAPI_HI_DCI0_REQUEST_HI_PDU_REL8_TAG, &pdu->hi_pdu.hi_pdu_rel8, ppWritePackedMsg, end, pack_hi_dci0_hi_rel8_pdu_value) &&
+             pack_tlv(NFAPI_HI_DCI0_REQUEST_HI_PDU_REL10_TAG, &pdu->hi_pdu.hi_pdu_rel10, ppWritePackedMsg, end, pack_hi_dci0_hi_rel10_pdu_value)))
+          return 0;
+      }
+      break;
+
+      case NFAPI_HI_DCI0_DCI_PDU_TYPE: {
+        if(!(pack_tlv(NFAPI_HI_DCI0_REQUEST_DCI_PDU_REL8_TAG, &pdu->dci_pdu.dci_pdu_rel8, ppWritePackedMsg, end, pack_hi_dci0_dci_rel8_pdu_value) &&
+             pack_tlv(NFAPI_HI_DCI0_REQUEST_DCI_PDU_REL10_TAG, &pdu->dci_pdu.dci_pdu_rel10, ppWritePackedMsg, end, pack_hi_dci0_dci_rel10_pdu_value) &&
+             pack_tlv(NFAPI_HI_DCI0_REQUEST_DCI_PDU_REL12_TAG, &pdu->dci_pdu.dci_pdu_rel12, ppWritePackedMsg, end, pack_hi_dci0_dci_rel12_pdu_value)))
+          return 0;
+      }
+      break;
+
+      case NFAPI_HI_DCI0_EPDCCH_DCI_PDU_TYPE: {
+        if(!(pack_tlv(NFAPI_HI_DCI0_REQUEST_EPDCCH_DCI_PDU_REL8_TAG, &pdu->epdcch_dci_pdu.epdcch_dci_pdu_rel8, ppWritePackedMsg, end, pack_hi_dci0_dci_rel8_pdu_value) &&
+             pack_tlv(NFAPI_HI_DCI0_REQUEST_EPDCCH_DCI_PDU_REL10_TAG, &pdu->epdcch_dci_pdu.epdcch_dci_pdu_rel10, ppWritePackedMsg, end, pack_hi_dci0_dci_rel10_pdu_value) &&
+             pack_tlv(NFAPI_HI_DCI0_REQUEST_EPDCCH_PARAMETERS_REL11_TAG, &pdu->epdcch_dci_pdu.epdcch_parameters_rel11, ppWritePackedMsg, end, pack_dl_config_epdcch_parameters_rel11_value)))
+          return 0;
+      }
+      break;
+
+      case NFAPI_HI_DCI0_MPDCCH_DCI_PDU_TYPE: {
+        if(!(pack_tlv(NFAPI_HI_DCI0_REQUEST_MPDCCH_DCI_PDU_REL13_TAG, &pdu->mpdcch_dci_pdu.mpdcch_dci_pdu_rel13, ppWritePackedMsg, end, pack_hi_dci0_mpdcch_dci_rel13_pdu_value)))
+          return 0;
+      }
+      break;
+
+      case NFAPI_HI_DCI0_NPDCCH_DCI_PDU_TYPE: {
+        if(!(pack_tlv(NFAPI_HI_DCI0_REQUEST_NPDCCH_DCI_PDU_REL13_TAG, &pdu->npdcch_dci_pdu.npdcch_dci_pdu_rel13, ppWritePackedMsg, end, pack_hi_dci0_npdcch_dci_rel13_pdu_value)))
+          return 0;
+      }
+      break;
+
+      default: {
+        NFAPI_TRACE(NFAPI_TRACE_ERROR, "FIXME : Invalid pdu type %d \n", pdu->pdu_type );
+      }
+      break;
+    };
+
+    // add 1 for the pdu_type. The delta will include the pdu_size
+    pdu->pdu_size = 1 + (*ppWritePackedMsg - pWritePackedMsgPduSize);
+
+    push8(pdu->pdu_size, &pWritePackedMsgPduSize, end);
+  }
+
+  return 1;
+}
+
+static uint8_t pack_ul_dci_pdu_list_value(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
+{
+	nfapi_nr_ul_dci_request_pdus_t* value = (nfapi_nr_ul_dci_request_pdus_t*)tlv;
+
+	for(uint8_t i = 0; i < MAX_DCI_CORESET; ++i)
+	{
+		if(!(push16(value->pdcch_pdu.pdcch_pdu_rel15.dci_pdu[i].RNTI, ppWritePackedMsg, end) &&
+		push16(value->pdcch_pdu.pdcch_pdu_rel15.dci_pdu[i].ScramblingId, ppWritePackedMsg, end) &&
+
+		push16(value->pdcch_pdu.pdcch_pdu_rel15.dci_pdu[i].ScramblingRNTI, ppWritePackedMsg, end) &&
+		push8(value->pdcch_pdu.pdcch_pdu_rel15.dci_pdu[i].CceIndex, ppWritePackedMsg, end) &&
+		push8(value->pdcch_pdu.pdcch_pdu_rel15.dci_pdu[i].AggregationLevel, ppWritePackedMsg, end) &&
+		push8(value->pdcch_pdu.pdcch_pdu_rel15.dci_pdu[i].beta_PDCCH_1_0, ppWritePackedMsg, end) &&
+
+		push8(value->pdcch_pdu.pdcch_pdu_rel15.dci_pdu[i].powerControlOffsetSS, ppWritePackedMsg, end) &&
+		push16(value->pdcch_pdu.pdcch_pdu_rel15.dci_pdu[i].PayloadSizeBits, ppWritePackedMsg, end) &&
+
+		pusharray8(value->pdcch_pdu.pdcch_pdu_rel15.dci_pdu[i].Payload, value->pdcch_pdu.pdcch_pdu_rel15.dci_pdu[i].PayloadSizeBits, value->pdcch_pdu.pdcch_pdu_rel15.dci_pdu[i].PayloadSizeBits, ppWritePackedMsg, end)))
+
+		return 0;
+	}
+
+	return (push16(value->PDUType, ppWritePackedMsg, end) &&
+	   	    push16(value->PDUSize, ppWritePackedMsg, end) &&
+			    push16(value->pdcch_pdu.pdcch_pdu_rel15.BWPSize, ppWritePackedMsg, end) &&
+			    push16(value->pdcch_pdu.pdcch_pdu_rel15.BWPStart, ppWritePackedMsg, end) &&
+			    push8(value->pdcch_pdu.pdcch_pdu_rel15.SubcarrierSpacing, ppWritePackedMsg, end) &&
+			    push8(value->pdcch_pdu.pdcch_pdu_rel15.CyclicPrefix, ppWritePackedMsg, end) &&
+
+			    push8(value->pdcch_pdu.pdcch_pdu_rel15.StartSymbolIndex, ppWritePackedMsg, end) &&
+			    push8(value->pdcch_pdu.pdcch_pdu_rel15.DurationSymbols, ppWritePackedMsg, end) &&
+			    pusharray8(value->pdcch_pdu.pdcch_pdu_rel15.FreqDomainResource, 6, 6, ppWritePackedMsg, end) &&
+			    push8(value->pdcch_pdu.pdcch_pdu_rel15.CceRegMappingType, ppWritePackedMsg, end) &&
+
+			    push8(value->pdcch_pdu.pdcch_pdu_rel15.RegBundleSize, ppWritePackedMsg, end) &&
+			    push8(value->pdcch_pdu.pdcch_pdu_rel15.InterleaverSize, ppWritePackedMsg, end) &&
+			    push8(value->pdcch_pdu.pdcch_pdu_rel15.CoreSetType, ppWritePackedMsg, end) &&
+			    push16(value->pdcch_pdu.pdcch_pdu_rel15.ShiftIndex, ppWritePackedMsg, end) &&
+			    push8(value->pdcch_pdu.pdcch_pdu_rel15.precoderGranularity, ppWritePackedMsg, end) &&
+			    push16(value->pdcch_pdu.pdcch_pdu_rel15.numDlDci, ppWritePackedMsg, end));
+
+}
+
+static uint8_t pack_ul_dci_request(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p7_codec_config_t *config) {
+  nfapi_nr_ul_dci_request_t *pNfapiMsg = (nfapi_nr_ul_dci_request_t *)msg;
+
+  if (!(push16(pNfapiMsg->SFN, ppWritePackedMsg, end) &&
+        push16(pNfapiMsg->Slot, ppWritePackedMsg, end) &&
+        push8(pNfapiMsg->numPdus, ppWritePackedMsg, end)
+       ))
+    return 0;
+
+  for(int i=0; i<pNfapiMsg->numPdus; i++) {
+    if(!pack_ul_dci_pdu_list_value(&pNfapiMsg->ul_dci_pdu_list[i], ppWritePackedMsg, end))
+      return 0;
+  }
+
+  return 1;
+}
+
+
+
+static uint8_t pack_hi_dci0_request(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p7_codec_config_t *config) {
+  nfapi_hi_dci0_request_t *pNfapiMsg = (nfapi_hi_dci0_request_t *)msg;
+  return ( push16(pNfapiMsg->sfn_sf, ppWritePackedMsg, end) &&
+           pack_tlv(NFAPI_HI_DCI0_REQUEST_BODY_TAG, &pNfapiMsg->hi_dci0_request_body, ppWritePackedMsg, end, &pack_hi_dci0_request_body_value) &&
+           pack_p7_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config));
+}
+
+//pack_tx_data_pdu_list_value
+static uint8_t pack_tx_data_pdu_list_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_nr_pdu_t *value = (nfapi_nr_pdu_t *)tlv;
+
+  if(!(push32(value->num_TLV, ppWritePackedMsg, end) &&
+       push16(value->PDU_index, ppWritePackedMsg, end) &&
+       push16(value->PDU_length, ppWritePackedMsg, end)
+      ))
+    return 0;
+
+  uint16_t i = 0;
+  uint16_t total_number_of_tlvs = value->num_TLV;
+
+  for(; i < total_number_of_tlvs; ++i) {
+    if (!(push16(value->TLVs[i].length, ppWritePackedMsg, end) &&
+          push16(value->TLVs[i].tag, ppWritePackedMsg, end)))
+      return 0;
+
+    switch(value->TLVs[i].tag) {
+      case 0: {
+        if(!pusharray32(value->TLVs[i].value.direct, 16384, value->TLVs[i].length, ppWritePackedMsg, end))
+          return 0;
+
+        break;
+      }
+
+      case 1: {
+        if(!pusharray32(value->TLVs[i].value.ptr, value->TLVs[i].length, value->TLVs[i].length, ppWritePackedMsg, end))
+          return 0;
+
+        break;
+      }
+
+      default: {
+        NFAPI_TRACE(NFAPI_TRACE_ERROR, "FIXME : Invalid tag value %d \n", value->TLVs[i].tag );
+        break;
+      }
+    }
+  }
+
+  return 1;
+}
+
+static uint8_t pack_tx_request_body_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_tx_request_body_t *value = (nfapi_tx_request_body_t *)tlv;
+
+  if(push16(value->number_of_pdus, ppWritePackedMsg, end) == 0)
+    return 0;
+
+  uint16_t i = 0;
+  uint16_t total_number_of_pdus = value->number_of_pdus;
+
+  for(; i < total_number_of_pdus; ++i) {
+    nfapi_tx_request_pdu_t *pdu = &(value->tx_pdu_list[i]);
+
+    if(!(push16(pdu->pdu_length, ppWritePackedMsg, end) &&
+         push16(pdu->pdu_index, ppWritePackedMsg, end)))
+      return 0;
+
+    uint8_t j;
+
+    for(j = 0; j < pdu->num_segments; ++j) {
+      // Use -1 as it is unbounded
+      // DJP - does not handle -1
+      // DJP - if(pusharray8(pdu->segments[j].segment_data, (uint32_t)(-1), pdu->segments[j].segment_length, ppWritePackedMsg, end) == 0)
+      int push_ret = pusharray8(pdu->segments[j].segment_data, 65535, pdu->segments[j].segment_length, ppWritePackedMsg, end);
+
+      if (pdu->segments[j].segment_length == 3) {
+        NFAPI_TRACE(NFAPI_TRACE_INFO, "%s() BCH? segment_data:%x %x %x\n", __FUNCTION__,
+                    pdu->segments[j].segment_data[0],
+                    pdu->segments[j].segment_data[1],
+                    pdu->segments[j].segment_data[2]
+                   );
+      }
+
+      //NFAPI_TRACE(NFAPI_TRACE_INFO, "%s() segment_data:%p segment_length:%u pusharray8()=%d\n", __FUNCTION__, pdu->segments[j].segment_data, pdu->segments[j].segment_length, push_ret);
+
+      if (push_ret == 0) {
+        return 0;
+      }
+    }
+  }
+
+  return 1;
+}
+
+static uint8_t pack_tx_data_request(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p7_codec_config_t *config) {
+  nfapi_nr_tx_data_request_t *pNfapiMsg = (nfapi_nr_tx_data_request_t *)msg;
+
+  if (!(
+        push16(pNfapiMsg->SFN, ppWritePackedMsg, end) &&
+        push16(pNfapiMsg->Slot, ppWritePackedMsg, end) &&
+        push16(pNfapiMsg->Number_of_PDUs, ppWritePackedMsg, end)
+      ))
+    return 0;
+
+  for(int i=0; i<pNfapiMsg->Number_of_PDUs; i++) {
+    if(!pack_tx_data_pdu_list_value(&pNfapiMsg->pdu_list[i], ppWritePackedMsg, end))
+      return 0;
+  }
+
+  return 1;
+}
+
+static uint8_t pack_tx_request(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p7_codec_config_t *config) {
+  nfapi_tx_request_t *pNfapiMsg = (nfapi_tx_request_t *)msg;
+  int x = push16(pNfapiMsg->sfn_sf, ppWritePackedMsg, end);
+  int y = pack_tlv(NFAPI_TX_REQUEST_BODY_TAG, &pNfapiMsg->tx_request_body, ppWritePackedMsg, end, &pack_tx_request_body_value);
+  int z = pack_p7_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config);
+  //NFAPI_TRACE(NFAPI_TRACE_INFO, "%s() x:%d y:%d z:%d\n", __FUNCTION__, x, y, z);
+  return x && y && z;
+}
+
+static uint8_t pack_release_request_body_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_ue_release_request_body_t *value = (nfapi_ue_release_request_body_t *)tlv;
+
+  if(push16(value->number_of_TLVs, ppWritePackedMsg, end) == 0) {
+    return 0;
+  }
+
+  uint8_t j;
+  uint16_t num = value->number_of_TLVs;
+
+  for(j = 0; j < num; ++j) {
+    if(push16(value->ue_release_request_TLVs_list[j].rnti, ppWritePackedMsg, end) == 0) {
+      return 0;
+    }
+  }
+
+  return 1;
+}
+
+static uint8_t pack_ue_release_request(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p7_codec_config_t *config) {
+  nfapi_ue_release_request_t *pNfapiMsg = (nfapi_ue_release_request_t *)msg;
+  int x = push16(pNfapiMsg->sfn_sf, ppWritePackedMsg, end);
+  int y = pack_tlv(NFAPI_UE_RELEASE_BODY_TAG, &pNfapiMsg->ue_release_request_body, ppWritePackedMsg, end, &pack_release_request_body_value);
+  int z = pack_p7_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config);
+  return x && y && z;
+}
+
+static uint8_t pack_ue_release_response(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p7_codec_config_t *config) {
+  nfapi_ue_release_response_t *pNfapiMsg = (nfapi_ue_release_response_t *)msg;
+  int x = push32(pNfapiMsg->error_code, ppWritePackedMsg, end);
+  int z = pack_p7_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config);
+  return x && z;
+}
+
+static uint8_t pack_rx_ue_information_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_rx_ue_information *value = (nfapi_rx_ue_information *)tlv;
+  return ( push32(value->handle, ppWritePackedMsg, end) &&
+           push16(value->rnti, ppWritePackedMsg, end) );
+}
+
+static uint8_t unpack_rx_ue_information_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_rx_ue_information *value = (nfapi_rx_ue_information *)tlv;
+  return ( pull32(ppReadPackedMsg, &value->handle, end) &&
+           pull16(ppReadPackedMsg, &value->rnti, end));
+}
+
+static uint8_t pack_harq_indication_tdd_harq_data_bundling(nfapi_harq_indication_tdd_harq_data_bundling_t *data, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  return ( push8(data->value_0, ppWritePackedMsg, end) &&
+           push8(data->value_1, ppWritePackedMsg, end));
+}
+
+static uint8_t pack_harq_indication_tdd_harq_data_multiplexing(nfapi_harq_indication_tdd_harq_data_multiplexing_t *data, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  return ( push8(data->value_0, ppWritePackedMsg, end) &&
+           push8(data->value_1, ppWritePackedMsg, end) &&
+           push8(data->value_2, ppWritePackedMsg, end) &&
+           push8(data->value_3, ppWritePackedMsg, end));
+}
+
+static uint8_t pack_harq_indication_tdd_harq_data_special_bundling(nfapi_harq_indication_tdd_harq_data_special_bundling_t *data, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  return ( push8(data->value_0, ppWritePackedMsg, end) );
+}
+
+static uint8_t pack_harq_indication_tdd_harq_data(nfapi_harq_indication_tdd_harq_data_t *data, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  return ( push8(data->value_0, ppWritePackedMsg, end) );
+}
+
+static uint8_t pack_harq_indication_tdd_rel8_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_harq_indication_tdd_rel8_t *harq_indication_tdd_rel8 = (nfapi_harq_indication_tdd_rel8_t *)tlv;
+
+  if(!(push8(harq_indication_tdd_rel8->mode, ppWritePackedMsg, end) &&
+       push8(harq_indication_tdd_rel8->number_of_ack_nack, ppWritePackedMsg, end)))
+    return 0;
+
+  uint8_t result = 0;
+
+  switch(harq_indication_tdd_rel8->mode) {
+    case NFAPI_HARQ_INDICATION_TDD_HARQ_ACK_NACK_FORMAT_BUNDLING:
+      result = pack_harq_indication_tdd_harq_data_bundling(&harq_indication_tdd_rel8->harq_data.bundling, ppWritePackedMsg, end);
+      break;
+
+    case NFAPI_HARQ_INDICATION_TDD_HARQ_ACK_NACK_FORMAT_MULIPLEXING:
+      result = pack_harq_indication_tdd_harq_data_multiplexing(&harq_indication_tdd_rel8->harq_data.multiplex, ppWritePackedMsg, end);
+      break;
+
+    case NFAPI_HARQ_INDICATION_TDD_HARQ_ACK_NACK_FORMAT_SPECIAL_BUNDLING:
+      result = pack_harq_indication_tdd_harq_data_special_bundling(&harq_indication_tdd_rel8->harq_data.special_bundling, ppWritePackedMsg, end);
+      break;
+
+    case NFAPI_HARQ_INDICATION_TDD_HARQ_ACK_NACK_FORMAT_CHANNEL_SELECTION:
+    case NFAPI_HARQ_INDICATION_TDD_HARQ_ACK_NACK_FORMAT_FORMAT_3:
+      result = 1;
+      break;
+
+    default:
+      // err....
+      break;
+  }
+
+  return result;
+}
+
+static uint8_t pack_harq_indication_tdd_rel9_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_harq_indication_tdd_rel9_t *harq_indication_tdd_rel9 = (nfapi_harq_indication_tdd_rel9_t *)tlv;
+
+  if(!(push8(harq_indication_tdd_rel9->mode, ppWritePackedMsg, end) &&
+       push8(harq_indication_tdd_rel9->number_of_ack_nack, ppWritePackedMsg, end)))
+    return 0;
+
+  uint8_t idx;
+
+  for(idx = 0; idx < harq_indication_tdd_rel9->number_of_ack_nack; ++idx) {
+    uint8_t result = 0;
+
+    switch(harq_indication_tdd_rel9->mode) {
+      case NFAPI_HARQ_INDICATION_TDD_HARQ_ACK_NACK_FORMAT_BUNDLING:
+        result = pack_harq_indication_tdd_harq_data(&(harq_indication_tdd_rel9->harq_data[idx].bundling), ppWritePackedMsg, end);
+        break;
+
+      case NFAPI_HARQ_INDICATION_TDD_HARQ_ACK_NACK_FORMAT_MULIPLEXING:
+        result = pack_harq_indication_tdd_harq_data(&harq_indication_tdd_rel9->harq_data[idx].multiplex, ppWritePackedMsg, end);
+        break;
+
+      case NFAPI_HARQ_INDICATION_TDD_HARQ_ACK_NACK_FORMAT_SPECIAL_BUNDLING:
+        result = pack_harq_indication_tdd_harq_data_special_bundling(&harq_indication_tdd_rel9->harq_data[idx].special_bundling, ppWritePackedMsg, end);
+        break;
+
+      case NFAPI_HARQ_INDICATION_TDD_HARQ_ACK_NACK_FORMAT_CHANNEL_SELECTION:
+        result = pack_harq_indication_tdd_harq_data(&harq_indication_tdd_rel9->harq_data[idx].channel_selection, ppWritePackedMsg, end);
+        break;
+
+      case NFAPI_HARQ_INDICATION_TDD_HARQ_ACK_NACK_FORMAT_FORMAT_3:
+        result = pack_harq_indication_tdd_harq_data(&harq_indication_tdd_rel9->harq_data[idx].format_3, ppWritePackedMsg, end);
+        break;
+
+      default:
+        // err....
+        break;
+    }
+
+    if(result == 0)
+      return 0;
+  }
+
+  return 1;
+}
+
+static uint8_t pack_harq_indication_tdd_rel13_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_harq_indication_tdd_rel13_t *harq_indication_tdd_rel13 = (nfapi_harq_indication_tdd_rel13_t *)tlv;
+
+  if(!(push8(harq_indication_tdd_rel13->mode, ppWritePackedMsg, end) &&
+       push16(harq_indication_tdd_rel13->number_of_ack_nack, ppWritePackedMsg, end)))
+    return 0;
+
+  uint8_t idx;
+
+  for(idx = 0; idx < harq_indication_tdd_rel13->number_of_ack_nack; ++idx) {
+    uint8_t result = 0;
+
+    switch(harq_indication_tdd_rel13->mode) {
+      case NFAPI_HARQ_INDICATION_TDD_HARQ_ACK_NACK_FORMAT_BUNDLING:
+        result = pack_harq_indication_tdd_harq_data(&harq_indication_tdd_rel13->harq_data[idx].bundling, ppWritePackedMsg, end);
+        break;
+
+      case NFAPI_HARQ_INDICATION_TDD_HARQ_ACK_NACK_FORMAT_MULIPLEXING:
+        result = pack_harq_indication_tdd_harq_data(&harq_indication_tdd_rel13->harq_data[idx].multiplex, ppWritePackedMsg, end);
+        break;
+
+      case NFAPI_HARQ_INDICATION_TDD_HARQ_ACK_NACK_FORMAT_SPECIAL_BUNDLING:
+        result = pack_harq_indication_tdd_harq_data_special_bundling(&harq_indication_tdd_rel13->harq_data[idx].special_bundling, ppWritePackedMsg, end);
+        break;
+
+      case NFAPI_HARQ_INDICATION_TDD_HARQ_ACK_NACK_FORMAT_CHANNEL_SELECTION:
+        result = pack_harq_indication_tdd_harq_data(&harq_indication_tdd_rel13->harq_data[idx].channel_selection, ppWritePackedMsg, end);
+        break;
+
+      case NFAPI_HARQ_INDICATION_TDD_HARQ_ACK_NACK_FORMAT_FORMAT_3:
+        result = pack_harq_indication_tdd_harq_data(&harq_indication_tdd_rel13->harq_data[idx].format_3, ppWritePackedMsg, end);
+        break;
+
+      case NFAPI_HARQ_INDICATION_TDD_HARQ_ACK_NACK_FORMAT_FORMAT_4:
+        result = pack_harq_indication_tdd_harq_data(&harq_indication_tdd_rel13->harq_data[idx].format_4, ppWritePackedMsg, end);
+        break;
+
+      case NFAPI_HARQ_INDICATION_TDD_HARQ_ACK_NACK_FORMAT_FORMAT_5:
+        result = pack_harq_indication_tdd_harq_data(&harq_indication_tdd_rel13->harq_data[idx].format_5, ppWritePackedMsg, end);
+        break;
+
+      default:
+        // err....
+        break;
+    }
+
+    if(result == 0)
+      return 0;
+  }
+
+  return 1;
+}
+
+static uint8_t pack_harq_indication_fdd_rel8_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_harq_indication_fdd_rel8_t *harq_indication_fdd_rel8 = (nfapi_harq_indication_fdd_rel8_t *)tlv;
+  return ( push8(harq_indication_fdd_rel8->harq_tb1, ppWritePackedMsg, end) &&
+           push8(harq_indication_fdd_rel8->harq_tb2, ppWritePackedMsg, end));
+}
+
+static uint8_t pack_harq_indication_fdd_rel9_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_harq_indication_fdd_rel9_t *harq_indication_fdd_rel9 = (nfapi_harq_indication_fdd_rel9_t *)tlv;
+  return ( push8(harq_indication_fdd_rel9->mode, ppWritePackedMsg, end) &&
+           push8(harq_indication_fdd_rel9->number_of_ack_nack, ppWritePackedMsg, end) &&
+           pusharray8(harq_indication_fdd_rel9->harq_tb_n, NFAPI_HARQ_ACK_NACK_REL9_MAX, harq_indication_fdd_rel9->number_of_ack_nack, ppWritePackedMsg, end));
+}
+
+static uint8_t pack_harq_indication_fdd_rel13_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_harq_indication_fdd_rel13_t *harq_indication_fdd_rel13 = (nfapi_harq_indication_fdd_rel13_t *)tlv;
+  return ( push8(harq_indication_fdd_rel13->mode, ppWritePackedMsg, end) &&
+           push16(harq_indication_fdd_rel13->number_of_ack_nack, ppWritePackedMsg, end) &&
+           pusharray8(harq_indication_fdd_rel13->harq_tb_n, NFAPI_HARQ_ACK_NACK_REL13_MAX, harq_indication_fdd_rel13->number_of_ack_nack, ppWritePackedMsg, end));
+}
+
+static uint8_t pack_ul_cqi_information_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_ul_cqi_information_t *value = (nfapi_ul_cqi_information_t *)tlv;
+  return ( push8(value->ul_cqi, ppWritePackedMsg, end) &&
+           push8(value->channel, ppWritePackedMsg, end));
+}
+
+static uint8_t pack_harq_indication_body_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_harq_indication_body_t *value = (nfapi_harq_indication_body_t *)tlv;
+
+  if(push16(value->number_of_harqs, ppWritePackedMsg, end) == 0)
+    return 0;
+
+  uint16_t i = 0;
+  uint16_t total_number_of_pdus = value->number_of_harqs;
+
+  for(; i < total_number_of_pdus; ++i) {
+    nfapi_harq_indication_pdu_t *pdu = &(value->harq_pdu_list[i]);
+    uint8_t *instance_length_p = *ppWritePackedMsg;
+
+    if(!push16(pdu->instance_length, ppWritePackedMsg, end))
+      return 0;
+
+    if(!(pack_tlv(NFAPI_RX_UE_INFORMATION_TAG, &pdu->rx_ue_information, ppWritePackedMsg, end, pack_rx_ue_information_value) &&
+         pack_tlv(NFAPI_HARQ_INDICATION_TDD_REL8_TAG, &pdu->harq_indication_tdd_rel8, ppWritePackedMsg, end, pack_harq_indication_tdd_rel8_value) &&
+         pack_tlv(NFAPI_HARQ_INDICATION_TDD_REL9_TAG, &pdu->harq_indication_tdd_rel9, ppWritePackedMsg, end, pack_harq_indication_tdd_rel9_value) &&
+         pack_tlv(NFAPI_HARQ_INDICATION_TDD_REL13_TAG, &pdu->harq_indication_tdd_rel13, ppWritePackedMsg, end, pack_harq_indication_tdd_rel13_value) &&
+         pack_tlv(NFAPI_HARQ_INDICATION_FDD_REL8_TAG, &pdu->harq_indication_fdd_rel8, ppWritePackedMsg, end, pack_harq_indication_fdd_rel8_value) &&
+         pack_tlv(NFAPI_HARQ_INDICATION_FDD_REL9_TAG, &pdu->harq_indication_fdd_rel9, ppWritePackedMsg, end, pack_harq_indication_fdd_rel9_value) &&
+         pack_tlv(NFAPI_HARQ_INDICATION_FDD_REL13_TAG, &pdu->harq_indication_fdd_rel13, ppWritePackedMsg, end, pack_harq_indication_fdd_rel13_value) &&
+         pack_tlv(NFAPI_UL_CQI_INFORMATION_TAG, &pdu->ul_cqi_information, ppWritePackedMsg, end, pack_ul_cqi_information_value)))
+      return 0;
+
+    // calculate the instance length subtracting the size of the instance
+    // length feild
+    uint16_t instance_length = *ppWritePackedMsg - instance_length_p - 2;
+    push16(instance_length, &instance_length_p, end);
+  }
+
+  return 1;
+}
+
+static uint8_t pack_harq_indication(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p7_codec_config_t *config) {
+  nfapi_harq_indication_t *pNfapiMsg = (nfapi_harq_indication_t *)msg;
+  return ( push16(pNfapiMsg->sfn_sf, ppWritePackedMsg, end) &&
+           pack_tlv(NFAPI_HARQ_INDICATION_BODY_TAG, &pNfapiMsg->harq_indication_body, ppWritePackedMsg, end, pack_harq_indication_body_value) &&
+           pack_p7_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config));
+}
+
+static uint8_t pack_crc_indication_rel8_body(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_crc_indication_rel8_t *crc_indication_rel8 = (nfapi_crc_indication_rel8_t *)tlv;
+  return ( push8(crc_indication_rel8->crc_flag, ppWritePackedMsg, end) );
+}
+
+static uint8_t pack_crc_indication_body_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_crc_indication_body_t *value = (nfapi_crc_indication_body_t *)tlv;
+
+  if(push16(value->number_of_crcs, ppWritePackedMsg, end) == 0)
+    return 0;
+
+  uint16_t i = 0;
+  uint16_t total_number_of_pdus = value->number_of_crcs;
+
+  for(; i < total_number_of_pdus; ++i) {
+    nfapi_crc_indication_pdu_t *pdu = &(value->crc_pdu_list[i]);
+    uint8_t *instance_length_p = *ppWritePackedMsg;
+
+    if(!push16(pdu->instance_length, ppWritePackedMsg, end))
+      return 0;
+
+    if(!(pack_tlv(NFAPI_RX_UE_INFORMATION_TAG, &pdu->rx_ue_information, ppWritePackedMsg, end, pack_rx_ue_information_value) &&
+         pack_tlv(NFAPI_CRC_INDICATION_REL8_TAG, &pdu->crc_indication_rel8, ppWritePackedMsg, end, pack_crc_indication_rel8_body)))
+      return 0;
+
+    // calculate the instance length subtracting the size of the instance
+    // length feild
+    uint16_t instance_length = *ppWritePackedMsg - instance_length_p - 2;
+    push16(instance_length, &instance_length_p, end);
+  }
+
+  return 1;
+}
+
+static uint8_t pack_crc_indication(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p7_codec_config_t *config) {
+  nfapi_crc_indication_t *pNfapiMsg = (nfapi_crc_indication_t *)msg;
+  return ( push16(pNfapiMsg->sfn_sf, ppWritePackedMsg, end) &&
+           pack_tlv(NFAPI_CRC_INDICATION_BODY_TAG, &pNfapiMsg->crc_indication_body, ppWritePackedMsg, end, &pack_crc_indication_body_value) &&
+           pack_p7_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config));
+}
+static uint8_t pack_rx_indication_rel8_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_rx_indication_rel8_t *value = (nfapi_rx_indication_rel8_t *)tlv;
+  return ( push16(value->length, ppWritePackedMsg, end) &&
+           push16(value->offset, ppWritePackedMsg, end) &&
+           push8(value->ul_cqi, ppWritePackedMsg, end) &&
+           push16(value->timing_advance, ppWritePackedMsg, end));
+}
+static uint8_t pack_rx_indication_rel9_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_rx_indication_rel9_t *value = (nfapi_rx_indication_rel9_t *)tlv;
+  return ( push16(value->timing_advance_r9, ppWritePackedMsg, end));
+}
+
+static uint8_t pack_rx_ulsch_indication_body_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_rx_indication_body_t *value = (nfapi_rx_indication_body_t *)tlv;
+
+  //printf("RX ULSCH BODY\n");
+
+  if( push16(value->number_of_pdus, ppWritePackedMsg, end) == 0)
+    return 0;
+
+  // need to calculate the data offset's.
+  uint16_t i = 0;
+  uint16_t offset = 2; // taking into account the number_of_pdus
+  uint16_t total_number_of_pdus = value->number_of_pdus;
+  //printf("ULSCH:pdus:%d\n", total_number_of_pdus);
+
+  for(i = 0; i < total_number_of_pdus; ++i) {
+    nfapi_rx_indication_pdu_t *pdu = &(value->rx_pdu_list[i]);
+
+    if(pdu->rx_ue_information.tl.tag == NFAPI_RX_UE_INFORMATION_TAG) {
+      //printf("NFAPI_RX_UE_INFORMATION_TAG\n");
+      offset += 4 + 6;
+    }
+
+    if(pdu->rx_indication_rel8.tl.tag == NFAPI_RX_INDICATION_REL8_TAG) {
+      //printf("NFAPI_RX_INDICATION_REL8_TAG\n");
+      offset += 4 + 7;
+    }
+
+    if(pdu->rx_indication_rel9.tl.tag == NFAPI_RX_INDICATION_REL9_TAG) {
+      //printf("NFAPI_RX_INDICATION_REL9_TAG\n");
+      offset += 4 + 2;
+    }
+  }
+
+  // Now update the structure to include the offset
+  for(i =0; i < total_number_of_pdus; ++i) {
+    nfapi_rx_indication_pdu_t *pdu = &(value->rx_pdu_list[i]);
+
+    if(pdu->rx_indication_rel8.tl.tag == NFAPI_RX_INDICATION_REL8_TAG) {
+      if(pdu->rx_indication_rel8.offset == 1) {
+        pdu->rx_indication_rel8.offset = offset;
+        offset += pdu->rx_indication_rel8.length;
+      }
+    }
+  }
+
+  // Write out the pdu
+  for(i = 0; i < total_number_of_pdus; ++i) {
+    nfapi_rx_indication_pdu_t *pdu = &(value->rx_pdu_list[i]);
+
+    if(!(pack_tlv(NFAPI_RX_UE_INFORMATION_TAG, &pdu->rx_ue_information, ppWritePackedMsg, end, pack_rx_ue_information_value) &&
+         pack_tlv(NFAPI_RX_INDICATION_REL8_TAG, &pdu->rx_indication_rel8, ppWritePackedMsg, end, pack_rx_indication_rel8_value) &&
+         pack_tlv(NFAPI_RX_INDICATION_REL9_TAG, &pdu->rx_indication_rel9, ppWritePackedMsg, end, pack_rx_indication_rel9_value)))
+      return 0;
+  }
+
+  // Write out the pdu data
+  for(i = 0; i < total_number_of_pdus; ++i) {
+    uint16_t length = 0;
+    nfapi_rx_indication_pdu_t *pdu = &(value->rx_pdu_list[i]);
+
+    if(pdu->rx_indication_rel8.tl.tag == NFAPI_RX_INDICATION_REL8_TAG) {
+      length = pdu->rx_indication_rel8.length;
+    }
+
+    if( pusharray8(value->rx_pdu_list[i].data, length, length, ppWritePackedMsg, end) == 0)
+      return 0;
+  }
+
+  return 1;
+}
+
+
+static uint8_t pack_rx_ulsch_indication(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p7_codec_config_t *config) {
+  nfapi_rx_indication_t *pNfapiMsg = (nfapi_rx_indication_t *)msg;
+  return ( push16(pNfapiMsg->sfn_sf, ppWritePackedMsg, end) &&
+           pack_tlv(NFAPI_RX_INDICATION_BODY_TAG, &pNfapiMsg->rx_indication_body, ppWritePackedMsg, end, pack_rx_ulsch_indication_body_value) &&
+           pack_p7_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config));
+}
+
+static uint8_t pack_preamble_pdu_rel8_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_preamble_pdu_rel8_t *preamble_rel8 = (nfapi_preamble_pdu_rel8_t *)tlv;
+  return ( push16(preamble_rel8->rnti, ppWritePackedMsg, end) &&
+           push8(preamble_rel8->preamble, ppWritePackedMsg, end) &&
+           push16(preamble_rel8->timing_advance, ppWritePackedMsg, end));
+}
+static uint8_t pack_preamble_pdu_rel9_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_preamble_pdu_rel9_t *preamble_rel9 = (nfapi_preamble_pdu_rel9_t *)tlv;
+  return ( push16(preamble_rel9->timing_advance_r9, ppWritePackedMsg, end) );
+}
+static uint8_t pack_preamble_pdu_rel13_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_preamble_pdu_rel13_t *preamble_rel13 = (nfapi_preamble_pdu_rel13_t *)tlv;
+  return ( push8(preamble_rel13->rach_resource_type, ppWritePackedMsg, end) );
+}
+
+static uint8_t pack_rach_indication_body_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_rach_indication_body_t *value = (nfapi_rach_indication_body_t *)tlv;
+
+  if( push16(value->number_of_preambles, ppWritePackedMsg, end) == 0)
+    return 0;
+
+  uint16_t i = 0;
+  uint16_t total_number_of_pdus = value->number_of_preambles;
+
+  for(; i < total_number_of_pdus; ++i) {
+    nfapi_preamble_pdu_t *pdu = &(value->preamble_list[i]);
+    uint8_t *instance_length_p = *ppWritePackedMsg;
+
+    if(!push16(pdu->instance_length, ppWritePackedMsg, end))
+      return 0;
+
+    if(!(pack_tlv(NFAPI_PREAMBLE_REL8_TAG, &pdu->preamble_rel8, ppWritePackedMsg, end, pack_preamble_pdu_rel8_value) &&
+         pack_tlv(NFAPI_PREAMBLE_REL9_TAG, &pdu->preamble_rel9, ppWritePackedMsg, end, pack_preamble_pdu_rel9_value) &&
+         pack_tlv(NFAPI_PREAMBLE_REL13_TAG, &pdu->preamble_rel13, ppWritePackedMsg, end, pack_preamble_pdu_rel13_value)))
+      return 0;
+
+    // calculate the instance length subtracting the size of the instance
+    // length feild
+    uint16_t instance_length = *ppWritePackedMsg - instance_length_p - 2;
+    push16(instance_length, &instance_length_p, end);
+  }
+
+  return 1;
+}
+
+static uint8_t pack_rach_indication(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p7_codec_config_t *config) {
+  nfapi_rach_indication_t *pNfapiMsg = (nfapi_rach_indication_t *)msg;
+  return ( push16(pNfapiMsg->sfn_sf, ppWritePackedMsg, end) &&
+           pack_tlv(NFAPI_RACH_INDICATION_BODY_TAG, &pNfapiMsg->rach_indication_body, ppWritePackedMsg, end, pack_rach_indication_body_value) &&
+           pack_p7_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config));
+}
+
+static uint8_t pack_srs_indication_fdd_rel8_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_srs_indication_fdd_rel8_t *srs_pdu_rel8 = (nfapi_srs_indication_fdd_rel8_t *)tlv;
+  return ( push16(srs_pdu_rel8->doppler_estimation, ppWritePackedMsg, end) &&
+           push16(srs_pdu_rel8->timing_advance, ppWritePackedMsg, end) &&
+           push8(srs_pdu_rel8->number_of_resource_blocks, ppWritePackedMsg, end) &&
+           push8(srs_pdu_rel8->rb_start, ppWritePackedMsg, end) &&
+           pusharray8(srs_pdu_rel8->snr, NFAPI_NUM_RB_MAX, srs_pdu_rel8->number_of_resource_blocks, ppWritePackedMsg, end));
+}
+
+static uint8_t pack_srs_indication_fdd_rel9_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_srs_indication_fdd_rel9_t *srs_pdu_rel9 = (nfapi_srs_indication_fdd_rel9_t *)tlv;
+  return ( push16(srs_pdu_rel9->timing_advance_r9, ppWritePackedMsg, end) );
+}
+
+static uint8_t pack_srs_indication_tdd_rel10_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_srs_indication_ttd_rel10_t *srs_pdu_rel10 = (nfapi_srs_indication_ttd_rel10_t *)tlv;
+  return ( push8(srs_pdu_rel10->uppts_symbol, ppWritePackedMsg, end) );
+}
+
+static uint8_t pack_srs_indication_fdd_rel11_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_srs_indication_fdd_rel11_t *srs_pdu_rel11 = (nfapi_srs_indication_fdd_rel11_t *)tlv;
+  return ( push16(srs_pdu_rel11->ul_rtoa, ppWritePackedMsg, end) ) ;
+}
+
+static uint8_t pack_tdd_channel_measurement_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_tdd_channel_measurement_t *value = (nfapi_tdd_channel_measurement_t *)tlv;
+
+  if(!(push8(value->num_prb_per_subband, ppWritePackedMsg, end) &&
+       push8(value->number_of_subbands, ppWritePackedMsg, end) &&
+       push8(value->num_atennas, ppWritePackedMsg, end)))
+    return 0;
+
+  uint8_t idx = 0;
+
+  for(idx = 0; idx < value->number_of_subbands; ++idx) {
+    if(!(push8(value->subands[idx].subband_index, ppWritePackedMsg, end) &&
+         pusharray16(value->subands[idx].channel, NFAPI_MAX_NUM_PHYSICAL_ANTENNAS, value->num_atennas, ppWritePackedMsg, end)))
+      return 0;
+  }
+
+  return 1;
+}
+
+static uint8_t pack_srs_indication_body_value(void *tlv, uint8_t **ppWritePackedMsg,  uint8_t *end) {
+  nfapi_srs_indication_body_t *value = (nfapi_srs_indication_body_t *)tlv;
+
+  if( push8(value->number_of_ues, ppWritePackedMsg, end) == 0)
+    return 0;
+
+  uint16_t i = 0;
+  uint16_t total_number_of_pdus = value->number_of_ues;
+
+  for(; i < total_number_of_pdus; ++i) {
+    nfapi_srs_indication_pdu_t *pdu = &(value->srs_pdu_list[i]);
+    uint8_t *instance_length_p = *ppWritePackedMsg;
+
+    if(!push16(pdu->instance_length, ppWritePackedMsg, end))
+      return 0;
+
+    if(!(pack_tlv(NFAPI_RX_UE_INFORMATION_TAG, &pdu->rx_ue_information, ppWritePackedMsg, end, &pack_rx_ue_information_value) &&
+         pack_tlv(NFAPI_SRS_INDICATION_FDD_REL8_TAG, &pdu->srs_indication_fdd_rel8, ppWritePackedMsg, end, &pack_srs_indication_fdd_rel8_value) &&
+         pack_tlv(NFAPI_SRS_INDICATION_FDD_REL9_TAG, &pdu->srs_indication_fdd_rel9, ppWritePackedMsg, end, &pack_srs_indication_fdd_rel9_value) &&
+         pack_tlv(NFAPI_SRS_INDICATION_TDD_REL10_TAG, &pdu->srs_indication_tdd_rel10, ppWritePackedMsg, end, &pack_srs_indication_tdd_rel10_value) &&
+         pack_tlv(NFAPI_SRS_INDICATION_FDD_REL11_TAG, &pdu->srs_indication_fdd_rel11, ppWritePackedMsg, end, &pack_srs_indication_fdd_rel11_value) &&
+         pack_tlv(NFAPI_TDD_CHANNEL_MEASUREMENT_TAG, &pdu->tdd_channel_measurement, ppWritePackedMsg, end, &pack_tdd_channel_measurement_value)))
+      return 0;
+
+    // calculate the instance length subtracting the size of the instance
+    // length feild
+    uint16_t instance_length = *ppWritePackedMsg - instance_length_p - 2;
+    push16(instance_length, &instance_length_p, end);
+  }
+
+  return 1;
+}
+
+static uint8_t pack_srs_indication(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p7_codec_config_t *config) {
+  nfapi_srs_indication_t *pNfapiMsg = (nfapi_srs_indication_t *)msg;
+  return ( push16(pNfapiMsg->sfn_sf, ppWritePackedMsg, end) &&
+           pack_tlv(NFAPI_SRS_INDICATION_BODY_TAG, &pNfapiMsg->srs_indication_body, ppWritePackedMsg, end, &pack_srs_indication_body_value) &&
+           pack_p7_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config));
+}
+
+static uint8_t pack_sr_indication_body_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_sr_indication_body_t *value = (nfapi_sr_indication_body_t *)tlv;
+
+  if(push16(value->number_of_srs, ppWritePackedMsg, end) == 0)
+    return 0;
+
+  uint16_t i = 0;
+  uint16_t total_number_of_pdus = value->number_of_srs;
+
+  for(; i < total_number_of_pdus; ++i) {
+    nfapi_sr_indication_pdu_t *pdu = &(value->sr_pdu_list[i]);
+    uint8_t *instance_length_p = *ppWritePackedMsg;
+
+    if(!push16(pdu->instance_length, ppWritePackedMsg, end))
+      return 0;
+
+    if(!(pack_tlv(NFAPI_RX_UE_INFORMATION_TAG, &pdu->rx_ue_information, ppWritePackedMsg, end, pack_rx_ue_information_value) &&
+         pack_tlv(NFAPI_UL_CQI_INFORMATION_TAG, &pdu->ul_cqi_information, ppWritePackedMsg, end, pack_ul_cqi_information_value)))
+      return 0;
+
+    // calculate the instance length subtracting the size of the instance
+    // length feild
+    uint16_t instance_length = *ppWritePackedMsg - instance_length_p - 2;
+    push16(instance_length, &instance_length_p, end);
+  }
+
+  return 1;
+}
+
+static uint8_t pack_sr_indication(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p7_codec_config_t *config) {
+  nfapi_sr_indication_t *pNfapiMsg = (nfapi_sr_indication_t *)msg;
+  return ( push16(pNfapiMsg->sfn_sf, ppWritePackedMsg, end) &&
+           pack_tlv(NFAPI_SR_INDICATION_BODY_TAG, &pNfapiMsg->sr_indication_body, ppWritePackedMsg, end, &pack_sr_indication_body_value) &&
+           pack_p7_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config));
+}
+
+static uint8_t pack_cqi_indication_rel8_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_cqi_indication_rel8_t *cqi_pdu_rel8 = (nfapi_cqi_indication_rel8_t *)tlv;
+  return ( push16(cqi_pdu_rel8->length, ppWritePackedMsg, end) &&
+           push16(cqi_pdu_rel8->data_offset, ppWritePackedMsg, end) &&
+           push8(cqi_pdu_rel8->ul_cqi, ppWritePackedMsg, end) &&
+           push8(cqi_pdu_rel8->ri, ppWritePackedMsg, end) &&
+           push16(cqi_pdu_rel8->timing_advance, ppWritePackedMsg, end));
+}
+
+static uint8_t pack_cqi_indication_rel9_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_cqi_indication_rel9_t *cqi_pdu_rel9 = (nfapi_cqi_indication_rel9_t *)tlv;
+  return  ( push16(cqi_pdu_rel9->length, ppWritePackedMsg, end) &&
+            push16(cqi_pdu_rel9->data_offset, ppWritePackedMsg, end) &&
+            push8(cqi_pdu_rel9->ul_cqi, ppWritePackedMsg, end) &&
+            push8(cqi_pdu_rel9->number_of_cc_reported, ppWritePackedMsg, end) &&
+            pusharray8(cqi_pdu_rel9->ri, NFAPI_CC_MAX, cqi_pdu_rel9->number_of_cc_reported, ppWritePackedMsg, end) &&
+            push16(cqi_pdu_rel9->timing_advance, ppWritePackedMsg, end) &&
+            push16(cqi_pdu_rel9->timing_advance_r9, ppWritePackedMsg, end));
+}
+
+static uint8_t pack_cqi_indication_body_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_cqi_indication_body_t *value = (nfapi_cqi_indication_body_t *)tlv;
+
+  if( push16(value->number_of_cqis, ppWritePackedMsg, end) == 0)
+    return 0;
+
+  // need to calculate the data offset's. This very bittle due the hardcoding
+  // of the sizes. can not use the sizeof as we have an array for the Rel9
+  // info
+  uint16_t i = 0;
+  uint16_t offset = 2; // taking into account the number_of_cqis
+  uint16_t total_number_of_pdus = value->number_of_cqis;
+
+  for(i = 0; i < total_number_of_pdus; ++i) {
+    nfapi_cqi_indication_pdu_t *pdu = &(value->cqi_pdu_list[i]);
+    offset += 2; // for the instance length
+
+    if(pdu->rx_ue_information.tl.tag == NFAPI_RX_UE_INFORMATION_TAG) {
+      offset += 4 + 6; // sizeof(nfapi_rx_ue_information) - sizeof(nfapi_tl_t)
+    }
+
+    if(pdu->cqi_indication_rel8.tl.tag == NFAPI_CQI_INDICATION_REL8_TAG) {
+      offset += 4 + 8;
+    }
+
+    if(pdu->cqi_indication_rel9.tl.tag == NFAPI_CQI_INDICATION_REL9_TAG) {
+      offset += 4 + 10 + pdu->cqi_indication_rel9.number_of_cc_reported;
+    }
+
+    if(pdu->ul_cqi_information.tl.tag == NFAPI_UL_CQI_INFORMATION_TAG) {
+      offset += 4 + 2;
+    }
+  }
+
+  // Now update the structure to include the offset
+  for(i =0; i < total_number_of_pdus; ++i) {
+    nfapi_cqi_indication_pdu_t *pdu = &(value->cqi_pdu_list[i]);
+
+    if(pdu->cqi_indication_rel8.tl.tag == NFAPI_CQI_INDICATION_REL8_TAG) {
+      if(pdu->cqi_indication_rel8.data_offset == 1) {
+        pdu->cqi_indication_rel8.data_offset = offset;
+        offset += pdu->cqi_indication_rel8.length;
+      }
+    }
+
+    if(pdu->cqi_indication_rel9.tl.tag == NFAPI_CQI_INDICATION_REL9_TAG) {
+      if(pdu->cqi_indication_rel9.data_offset == 1) {
+        pdu->cqi_indication_rel9.data_offset = offset;
+        offset += pdu->cqi_indication_rel9.length;
+      }
+    }
+  }
+
+  // Write out the cqi information
+  for(i = 0; i < total_number_of_pdus; ++i) {
+    nfapi_cqi_indication_pdu_t *pdu = &(value->cqi_pdu_list[i]);
+    uint8_t *instance_length_p = *ppWritePackedMsg;
+
+    if(!push16(pdu->instance_length, ppWritePackedMsg, end))
+      return 0;
+
+    if(!(pack_tlv(NFAPI_RX_UE_INFORMATION_TAG, &pdu->rx_ue_information, ppWritePackedMsg, end,pack_rx_ue_information_value) &&
+         pack_tlv(NFAPI_CQI_INDICATION_REL8_TAG, &pdu->cqi_indication_rel8, ppWritePackedMsg, end, pack_cqi_indication_rel8_value) &&
+         pack_tlv(NFAPI_CQI_INDICATION_REL9_TAG, &pdu->cqi_indication_rel9, ppWritePackedMsg, end, pack_cqi_indication_rel9_value) &&
+         pack_tlv(NFAPI_UL_CQI_INFORMATION_TAG, &pdu->ul_cqi_information, ppWritePackedMsg, end, pack_ul_cqi_information_value)))
+      return 0;
+
+    // calculate the instance length subtracting the size of the instance
+    // length feild
+    uint16_t instance_length = *ppWritePackedMsg - instance_length_p - 2;
+    push16(instance_length, &instance_length_p, end);
+  }
+
+  // Write out the cqi raw data
+  for(i = 0; i < total_number_of_pdus; ++i) {
+    uint16_t length = 0;
+    nfapi_cqi_indication_pdu_t *pdu = &(value->cqi_pdu_list[i]);
+
+    if(pdu->cqi_indication_rel8.tl.tag == NFAPI_CQI_INDICATION_REL8_TAG) {
+      length = pdu->cqi_indication_rel8.length;
+    }
+
+    if(pdu->cqi_indication_rel9.tl.tag == NFAPI_CQI_INDICATION_REL9_TAG) {
+      length = pdu->cqi_indication_rel9.length;
+    }
+
+    if( pusharray8(value->cqi_raw_pdu_list[i].pdu, NFAPI_CQI_RAW_MAX_LEN, length, ppWritePackedMsg, end) == 0)
+      return 0;
+  }
+
+  return 1;
+}
+
+static uint8_t pack_cqi_indication(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p7_codec_config_t *config) {
+  nfapi_cqi_indication_t *pNfapiMsg = (nfapi_cqi_indication_t *)msg;
+  //Fixme: allocate some mem to fix pure bug, need to find out proper size
+  pNfapiMsg->vendor_extension=NULL;//(nfapi_vendor_extension_tlv_t)malloc( sizeof(* pNfapiMsg->vendor_extension));
+  return ( push16(pNfapiMsg->sfn_sf, ppWritePackedMsg, end) &&
+           pack_tlv(NFAPI_CQI_INDICATION_BODY_TAG, &pNfapiMsg->cqi_indication_body, ppWritePackedMsg, end, pack_cqi_indication_body_value) &&
+           pack_p7_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config));
+}
+
+static uint8_t pack_lbt_pdsch_req_pdu_rel13_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_lbt_pdsch_req_pdu_rel13_t *value = (nfapi_lbt_pdsch_req_pdu_rel13_t *)tlv;
+  return ( push32(value->handle, ppWritePackedMsg, end) &&
+           push32(value->mp_cca, ppWritePackedMsg, end) &&
+           push32(value->n_cca, ppWritePackedMsg, end) &&
+           push32(value->offset, ppWritePackedMsg, end) &&
+           push32(value->lte_txop_sf, ppWritePackedMsg, end) &&
+           push16(value->txop_sfn_sf_end, ppWritePackedMsg, end) &&
+           push32(value->lbt_mode, ppWritePackedMsg, end));
+}
+
+static uint8_t pack_lbt_drs_req_pdu_rel13_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_lbt_drs_req_pdu_rel13_t *value = (nfapi_lbt_drs_req_pdu_rel13_t *)tlv;
+  return ( push32(value->handle, ppWritePackedMsg, end) &&
+           push32(value->offset, ppWritePackedMsg, end) &&
+           push16(value->sfn_sf_end, ppWritePackedMsg, end) &&
+           push32(value->lbt_mode, ppWritePackedMsg, end));
+}
+
+static uint8_t pack_lbt_dl_config_request_body_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_lbt_dl_config_request_body_t *value = (nfapi_lbt_dl_config_request_body_t *)tlv;
+
+  if( push16(value->number_of_pdus, ppWritePackedMsg, end) == 0)
+    return 0;
+
+  uint16_t i = 0;
+  uint16_t total_number_of_pdus = value->number_of_pdus;
+
+  for(; i < total_number_of_pdus; ++i) {
+    nfapi_lbt_dl_config_request_pdu_t *pdu = &(value->lbt_dl_config_req_pdu_list[i]);
+
+    if( push8(pdu->pdu_type, ppWritePackedMsg, end) == 0)
+      return 0;
+
+    // Put a 0 size in and then determine the size after the pdu
+    // has been writen and write the calculated size
+    uint8_t *pWritePackedMsgPduSize = *ppWritePackedMsg;
+    pdu->pdu_size = 0;
+
+    if( push8(pdu->pdu_size, ppWritePackedMsg, end) == 0)
+      return 0;
+
+    switch(pdu->pdu_type) {
+      case NFAPI_LBT_DL_CONFIG_REQUEST_PDSCH_PDU_TYPE: {
+        if( pack_tlv(NFAPI_LBT_PDSCH_REQ_PDU_REL13_TAG, &pdu->lbt_pdsch_req_pdu.lbt_pdsch_req_pdu_rel13, ppWritePackedMsg, end, pack_lbt_pdsch_req_pdu_rel13_value) == 0)
+          return 0;
+      }
+      break;
+
+      case NFAPI_LBT_DL_CONFIG_REQUEST_DRS_PDU_TYPE: {
+        if(pack_tlv(NFAPI_LBT_DRS_REQ_PDU_REL13_TAG, &pdu->lbt_drs_req_pdu.lbt_drs_req_pdu_rel13, ppWritePackedMsg, end, pack_lbt_drs_req_pdu_rel13_value) == 0)
+          return 0;
+      }
+      break;
+
+      default: {
+        NFAPI_TRACE(NFAPI_TRACE_ERROR, "LBT_DL_CONFIG.request invalid pdu type %d \n", pdu->pdu_type );
+      }
+      break;
+    };
+
+    // add 1 for the pdu_type. The delta will include the pdu_size
+    pdu->pdu_size = 1 + (*ppWritePackedMsg - pWritePackedMsgPduSize);
+
+    push8(pdu->pdu_size, &pWritePackedMsgPduSize, end);
+  }
+
+  return 1;
+}
+
+static uint8_t pack_lbt_pdsch_rsp_pdu_rel13_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_lbt_pdsch_rsp_pdu_rel13_t *value = (nfapi_lbt_pdsch_rsp_pdu_rel13_t *)tlv;
+  return ( push32(value->handle, ppWritePackedMsg, end) &&
+           push32(value->result, ppWritePackedMsg, end) &&
+           push32(value->lte_txop_symbols, ppWritePackedMsg, end) &&
+           push32(value->initial_partial_sf, ppWritePackedMsg, end));
+}
+
+static uint8_t pack_lbt_drs_rsp_pdu_rel13_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_lbt_drs_rsp_pdu_rel13_t *value = (nfapi_lbt_drs_rsp_pdu_rel13_t *)tlv;
+  return ( push32(value->handle, ppWritePackedMsg, end) &&
+           push32(value->result, ppWritePackedMsg, end));
+}
+
+static uint8_t pack_lbt_dl_config_request(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p7_codec_config_t *config) {
+  nfapi_lbt_dl_config_request_t *pNfapiMsg = (nfapi_lbt_dl_config_request_t *)msg;
+  return ( push16(pNfapiMsg->sfn_sf, ppWritePackedMsg, end) &&
+           pack_tlv(NFAPI_LBT_DL_CONFIG_REQUEST_BODY_TAG, &pNfapiMsg->lbt_dl_config_request_body, ppWritePackedMsg, end, &pack_lbt_dl_config_request_body_value) &&
+           pack_p7_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config));
+}
+
+static uint8_t pack_lbt_dl_config_indication_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_lbt_dl_indication_body_t *value = (nfapi_lbt_dl_indication_body_t *)tlv;
+
+  if( push16(value->number_of_pdus, ppWritePackedMsg, end) == 0)
+    return 0;
+
+  uint16_t i = 0;
+  uint16_t total_number_of_pdus = value->number_of_pdus;
+
+  for(; i < total_number_of_pdus; ++i) {
+    nfapi_lbt_dl_indication_pdu_t *pdu = &(value->lbt_indication_pdu_list[i]);
+
+    if( push8(pdu->pdu_type, ppWritePackedMsg, end) == 0)
+      return 0;
+
+    // Put a 0 size in and then determine the size after the pdu
+    // has been writen and write the calculated size
+    uint8_t *pWritePackedMsgPduSize = *ppWritePackedMsg;
+    pdu->pdu_size = 0;
+
+    if(push8(pdu->pdu_size, ppWritePackedMsg, end) == 0)
+      return 0;
+
+    switch(pdu->pdu_type) {
+      case NFAPI_LBT_DL_RSP_PDSCH_PDU_TYPE: {
+        if( pack_tlv(NFAPI_LBT_PDSCH_RSP_PDU_REL13_TAG, &pdu->lbt_pdsch_rsp_pdu.lbt_pdsch_rsp_pdu_rel13, ppWritePackedMsg, end, pack_lbt_pdsch_rsp_pdu_rel13_value) == 0)
+          return 0;
+      }
+      break;
+
+      case NFAPI_LBT_DL_RSP_DRS_PDU_TYPE: {
+        if( pack_tlv(NFAPI_LBT_DRS_RSP_PDU_REL13_TAG, &pdu->lbt_drs_rsp_pdu.lbt_drs_rsp_pdu_rel13, ppWritePackedMsg, end, pack_lbt_drs_rsp_pdu_rel13_value) == 0)
+          return 0;
+      }
+      break;
+
+      default: {
+        NFAPI_TRACE(NFAPI_TRACE_ERROR, "LBT_DL.indication body invalid pdu type %d \n", pdu->pdu_type );
+      }
+      break;
+    };
+
+    // add 1 for the pdu_type. The delta will include the pdu_size
+    pdu->pdu_size = 1 + (*ppWritePackedMsg - pWritePackedMsgPduSize);
+
+    push8(pdu->pdu_size, &pWritePackedMsgPduSize, end);
+  }
+
+  return 1;
+}
+
+static uint8_t pack_lbt_dl_indication(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p7_codec_config_t *config) {
+  nfapi_lbt_dl_indication_t *pNfapiMsg = (nfapi_lbt_dl_indication_t *)msg;
+  return ( push16(pNfapiMsg->sfn_sf, ppWritePackedMsg, end) &&
+           pack_tlv(NFAPI_LBT_DL_INDICATION_BODY_TAG, &pNfapiMsg->lbt_dl_indication_body, ppWritePackedMsg, end, &pack_lbt_dl_config_indication_value) &&
+           pack_p7_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config));
+}
+
+static uint8_t pack_nb_harq_indication_fdd_rel13_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_nb_harq_indication_fdd_rel13_t *nb_harq_indication_fdd_rel13 = (nfapi_nb_harq_indication_fdd_rel13_t *)tlv;
+  return ( push8(nb_harq_indication_fdd_rel13->harq_tb1, ppWritePackedMsg, end) );
+}
+
+static uint8_t pack_nb_harq_indication_body_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_nb_harq_indication_body_t *value = (nfapi_nb_harq_indication_body_t *)tlv;
+
+  if( push16(value->number_of_harqs, ppWritePackedMsg, end) == 0)
+    return 0;
+
+  uint16_t i = 0;
+  uint16_t total_number_of_harqs = value->number_of_harqs;
+
+  for(; i < total_number_of_harqs; ++i) {
+    nfapi_nb_harq_indication_pdu_t *pdu = &(value->nb_harq_pdu_list[i]);
+    uint8_t *instance_length_p = *ppWritePackedMsg;
+
+    if(!push16(pdu->instance_length, ppWritePackedMsg, end))
+      return 0;
+
+    if(!(pack_tlv(NFAPI_RX_UE_INFORMATION_TAG, &pdu->rx_ue_information, ppWritePackedMsg, end, pack_rx_ue_information_value) &&
+         pack_tlv(NFAPI_NB_HARQ_INDICATION_FDD_REL13_TAG, &pdu->nb_harq_indication_fdd_rel13, ppWritePackedMsg, end, pack_nb_harq_indication_fdd_rel13_value) &&
+         pack_tlv(NFAPI_UL_CQI_INFORMATION_TAG, &pdu->ul_cqi_information, ppWritePackedMsg, end, pack_ul_cqi_information_value)))
+      return 0;
+
+    // calculate the instance length subtracting the size of the instance
+    // length feild
+    uint16_t instance_length = *ppWritePackedMsg - instance_length_p - 2;
+    push16(instance_length, &instance_length_p, end);
+  }
+
+  return 1;
+}
+
+
+static uint8_t pack_nb_harq_indication(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p7_codec_config_t *config) {
+  nfapi_nb_harq_indication_t *pNfapiMsg = (nfapi_nb_harq_indication_t *)msg;
+  return ( push16(pNfapiMsg->sfn_sf, ppWritePackedMsg, end) &&
+           pack_tlv(NFAPI_NB_HARQ_INDICATION_BODY_TAG, &pNfapiMsg->nb_harq_indication_body, ppWritePackedMsg, end, &pack_nb_harq_indication_body_value) &&
+           pack_p7_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config));
+}
+
+static uint8_t pack_nrach_indication_rel13_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_nrach_indication_pdu_rel13_t *nrach_indication_fdd_rel13 = (nfapi_nrach_indication_pdu_rel13_t *)tlv;
+  return ( push16(nrach_indication_fdd_rel13->rnti, ppWritePackedMsg, end) &&
+           push8(nrach_indication_fdd_rel13->initial_sc, ppWritePackedMsg, end) &&
+           push16(nrach_indication_fdd_rel13->timing_advance, ppWritePackedMsg, end) &&
+           push8(nrach_indication_fdd_rel13->nrach_ce_level, ppWritePackedMsg, end));
+}
+
+
+static uint8_t pack_nrach_indication_body_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_nrach_indication_body_t *value = (nfapi_nrach_indication_body_t *)tlv;
+
+  if( push8(value->number_of_initial_scs_detected, ppWritePackedMsg, end) == 0)
+    return 0;
+
+  uint16_t i = 0;
+  uint16_t total_number_of_initial_scs_detected = value->number_of_initial_scs_detected;
+
+  for(; i < total_number_of_initial_scs_detected; ++i) {
+    nfapi_nrach_indication_pdu_t *pdu = &(value->nrach_pdu_list[i]);
+
+    //uint8_t* instance_length_p = *ppWritePackedMsg;
+    //if(!push16(pdu->instance_length, ppWritePackedMsg, end))
+    //  return 0;
+
+    if(!(pack_tlv(NFAPI_NRACH_INDICATION_REL13_TAG, &pdu->nrach_indication_rel13, ppWritePackedMsg, end, pack_nrach_indication_rel13_value)))
+      return 0;
+
+    // calculate the instance length subtracting the size of the instance
+    // length feild
+    //uint16_t instance_length = *ppWritePackedMsg - instance_length_p - 2;
+    //push16(instance_length, &instance_length_p, end);
+  }
+
+  return 1;
+}
+
+static uint8_t pack_nrach_indication(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p7_codec_config_t *config) {
+  nfapi_nrach_indication_t *pNfapiMsg = (nfapi_nrach_indication_t *)msg;
+  return ( push16(pNfapiMsg->sfn_sf, ppWritePackedMsg, end) &&
+           pack_tlv(NFAPI_NRACH_INDICATION_BODY_TAG, &pNfapiMsg->nrach_indication_body, ppWritePackedMsg, end, &pack_nrach_indication_body_value) &&
+           pack_p7_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config));
+}
+
+static uint8_t pack_nr_dl_node_sync(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p7_codec_config_t *config) {
+  nfapi_nr_dl_node_sync_t *pNfapiMsg = (nfapi_nr_dl_node_sync_t *)msg;
+  return ( push32(pNfapiMsg->t1, ppWritePackedMsg, end) &&
+           pushs32(pNfapiMsg->delta_sfn_slot, ppWritePackedMsg, end) &&
+           pack_p7_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config));
+}
+
+static uint8_t pack_dl_node_sync(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p7_codec_config_t *config) {
+  nfapi_dl_node_sync_t *pNfapiMsg = (nfapi_dl_node_sync_t *)msg;
+  return ( push32(pNfapiMsg->t1, ppWritePackedMsg, end) &&
+           pushs32(pNfapiMsg->delta_sfn_sf, ppWritePackedMsg, end) &&
+           pack_p7_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config));
+}
+
+static uint8_t pack_nr_ul_node_sync(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p7_codec_config_t *config) {
+  nfapi_nr_ul_node_sync_t *pNfapiMsg = (nfapi_nr_ul_node_sync_t *)msg;
+  return (push32(pNfapiMsg->t1, ppWritePackedMsg, end) &&
+          push32(pNfapiMsg->t2, ppWritePackedMsg, end) &&
+          push32(pNfapiMsg->t3, ppWritePackedMsg, end) &&
+          pack_p7_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config));
+}
+
+static uint8_t pack_ul_node_sync(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p7_codec_config_t *config) {
+  nfapi_ul_node_sync_t *pNfapiMsg = (nfapi_ul_node_sync_t *)msg;
+  return (push32(pNfapiMsg->t1, ppWritePackedMsg, end) &&
+          push32(pNfapiMsg->t2, ppWritePackedMsg, end) &&
+          push32(pNfapiMsg->t3, ppWritePackedMsg, end) &&
+          pack_p7_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config));
+}
+
+static uint8_t pack_timing_info(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p7_codec_config_t *config) {
+  nfapi_timing_info_t *pNfapiMsg = (nfapi_timing_info_t *)msg;
+  return (push32(pNfapiMsg->last_sfn_sf, ppWritePackedMsg, end) &&
+          push32(pNfapiMsg->time_since_last_timing_info, ppWritePackedMsg, end) &&
+          push32(pNfapiMsg->dl_config_jitter, ppWritePackedMsg, end) &&
+          push32(pNfapiMsg->tx_request_jitter, ppWritePackedMsg, end) &&
+          push32(pNfapiMsg->ul_config_jitter, ppWritePackedMsg, end) &&
+          push32(pNfapiMsg->hi_dci0_jitter, ppWritePackedMsg, end) &&
+          pushs32(pNfapiMsg->dl_config_latest_delay, ppWritePackedMsg, end) &&
+          pushs32(pNfapiMsg->tx_request_latest_delay, ppWritePackedMsg, end) &&
+          pushs32(pNfapiMsg->ul_config_latest_delay, ppWritePackedMsg, end) &&
+          pushs32(pNfapiMsg->hi_dci0_latest_delay, ppWritePackedMsg, end) &&
+          pushs32(pNfapiMsg->dl_config_earliest_arrival, ppWritePackedMsg, end) &&
+          pushs32(pNfapiMsg->tx_request_earliest_arrival, ppWritePackedMsg, end) &&
+          pushs32(pNfapiMsg->ul_config_earliest_arrival, ppWritePackedMsg, end) &&
+          pushs32(pNfapiMsg->hi_dci0_earliest_arrival, ppWritePackedMsg, end) &&
+          pack_p7_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config));
+}
+
+static uint8_t pack_nr_timing_info(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p7_codec_config_t *config) {
+  nfapi_nr_timing_info_t *pNfapiMsg = (nfapi_nr_timing_info_t *)msg;
+  return (push32(pNfapiMsg->last_sfn, ppWritePackedMsg, end) &&
+          push32(pNfapiMsg->last_slot, ppWritePackedMsg, end) &&
+          push32(pNfapiMsg->time_since_last_timing_info, ppWritePackedMsg, end) &&
+          push32(pNfapiMsg->dl_tti_jitter, ppWritePackedMsg, end) &&
+          push32(pNfapiMsg->tx_data_request_jitter, ppWritePackedMsg, end) &&
+          push32(pNfapiMsg->ul_tti_jitter, ppWritePackedMsg, end) &&
+          push32(pNfapiMsg->ul_dci_jitter, ppWritePackedMsg, end) &&
+          pushs32(pNfapiMsg->dl_tti_latest_delay, ppWritePackedMsg, end) &&
+          pushs32(pNfapiMsg->tx_data_request_latest_delay, ppWritePackedMsg, end) &&
+          pushs32(pNfapiMsg->ul_tti_latest_delay, ppWritePackedMsg, end) &&
+          pushs32(pNfapiMsg->ul_dci_latest_delay, ppWritePackedMsg, end) &&
+          pushs32(pNfapiMsg->dl_tti_earliest_arrival, ppWritePackedMsg, end) &&
+          pushs32(pNfapiMsg->tx_data_request_earliest_arrival, ppWritePackedMsg, end) &&
+          pushs32(pNfapiMsg->ul_tti_earliest_arrival, ppWritePackedMsg, end) &&
+          pushs32(pNfapiMsg->ul_dci_earliest_arrival, ppWritePackedMsg, end) &&
+          pack_p7_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config));
+}
+
+//NR UPLINK indication function packing
+
+//SLOT INDICATION
+
+static uint8_t pack_nr_slot_indication(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p7_codec_config_t* config)
+{
+	nfapi_nr_slot_indication_scf_t *pNfapiMsg = (nfapi_nr_slot_indication_scf_t*)msg;
+
+	if (!(push16((uint16_t)pNfapiMsg->sfn , ppWritePackedMsg, end) &&
+		push16((uint16_t)pNfapiMsg->slot , ppWritePackedMsg, end)
+		))
+			return 0;
+
+return 1;
+}
+
+//RX DATA INDICATION
+
+static uint8_t pack_nr_rx_data_indication_body(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
+{
+	nfapi_nr_rx_data_pdu_t* value = (nfapi_nr_rx_data_pdu_t*)tlv;
+
+	if(!(push32(value->handle, ppWritePackedMsg, end) &&
+	 	 push16(value->rnti, ppWritePackedMsg, end) &&
+		 push8(value->harq_id, ppWritePackedMsg, end) &&
+		 push16(value->pdu_length, ppWritePackedMsg, end) &&
+		 push8(value->ul_cqi, ppWritePackedMsg, end) &&
+		 push16(value->timing_advance, ppWritePackedMsg, end) &&
+		 push16(value->rssi, ppWritePackedMsg, end)
+		 ))
+		  return 0;
+
+	return 1;
+}
+
+
+static uint8_t pack_nr_rx_data_indication(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p7_codec_config_t* config)
+{
+	nfapi_nr_rx_data_indication_t *pNfapiMsg = (nfapi_nr_rx_data_indication_t*)msg;
+
+	if (!(push16(pNfapiMsg->sfn , ppWritePackedMsg, end) &&
+		push16(pNfapiMsg->slot , ppWritePackedMsg, end) &&
+		push16(pNfapiMsg->number_of_pdus, ppWritePackedMsg, end)
+		))
+			return 0;
+
+	for(int i=0; i<pNfapiMsg->number_of_pdus;i++)
+	{
+		if(!pack_nr_rx_data_indication_body(pNfapiMsg->pdu_list,ppWritePackedMsg,end))
+		return 0;
+	}
+
+return 1;
+}
+
+//NR CRC INDICATION
+
+static uint8_t pack_nr_crc_indication_body(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
+{
+	nfapi_nr_crc_t* value = (nfapi_nr_crc_t*)tlv;
+
+	if(!(push32(value->handle, ppWritePackedMsg, end) &&
+	 	 push16(value->rnti, ppWritePackedMsg, end) &&
+		 push8(value->harq_id, ppWritePackedMsg, end) &&
+		 push8(value->tb_crc_status, ppWritePackedMsg, end) &&
+		 push16(value->num_cb, ppWritePackedMsg, end) &&
+		 //pusharray8(value->cb_crc_status, (int)(value->num_cb / 8) + 1, (int)(value->num_cb / 8) + 1, ppWritePackedMsg, end) && //length is ceil(NumCb/8)
+		 push8(value->ul_cqi, ppWritePackedMsg, end) &&
+		 push16(value->timing_advance, ppWritePackedMsg, end) &&
+		 push16(value->rssi, ppWritePackedMsg, end)
+		 ))
+		  return 0;
+
+	return 1;
+}
+
+static uint8_t pack_nr_crc_indication(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p7_codec_config_t* config)
+{
+	nfapi_nr_crc_indication_t *pNfapiMsg = (nfapi_nr_crc_indication_t*)msg;
+
+	if (!(push16(pNfapiMsg->sfn , ppWritePackedMsg, end) &&
+		push16(pNfapiMsg->slot , ppWritePackedMsg, end) &&
+		push16(pNfapiMsg->number_crcs, ppWritePackedMsg, end)
+		))
+			return 0;
+
+	for(int i=0; i<pNfapiMsg->number_crcs;i++)
+	{
+		if(!pack_nr_crc_indication_body(pNfapiMsg->crc_list,ppWritePackedMsg,end))
+		return 0;
+	}
+
+return 1;
+}
+
+//SRS INDICATION
+
+static uint8_t pack_nr_srs_indication_body(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
+{
+	nfapi_nr_srs_indication_pdu_t* value = (nfapi_nr_srs_indication_pdu_t*)tlv;
+
+	if(!(push32(value->handle, ppWritePackedMsg, end) &&
+	 	 push16(value->rnti, ppWritePackedMsg, end) &&
+		 push16(value->timing_advance, ppWritePackedMsg, end) &&
+		 push8(value->num_symbols, ppWritePackedMsg, end) &&
+		 push8(value->wide_band_snr, ppWritePackedMsg, end) &&
+		 push8(value->num_reported_symbols, ppWritePackedMsg, end) &&
+		 push8(value->reported_symbol_list->num_rbs, ppWritePackedMsg, end)
+		 ))
+		  return 0;
+	for(int i = 0; i < value->reported_symbol_list->num_rbs; i++)
+	{
+		if(!(push8(value->reported_symbol_list->rb_list->rb_snr, ppWritePackedMsg, end)
+			))
+			return 0;
+	}
+	return 1;
+}
+
+static uint8_t pack_nr_srs_indication(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p7_codec_config_t* config)
+{
+	nfapi_nr_srs_indication_t *pNfapiMsg = (nfapi_nr_srs_indication_t*)msg;
+
+	if (!(push16(pNfapiMsg->sfn , ppWritePackedMsg, end) &&
+		push16(pNfapiMsg->slot , ppWritePackedMsg, end) &&
+		push16(pNfapiMsg->number_of_pdus, ppWritePackedMsg, end)
+		))
+			return 0;
+
+	for(int i=0; i<pNfapiMsg->number_of_pdus;i++)
+	{
+		if(!pack_nr_srs_indication_body(&(pNfapiMsg->pdu_list[i]),ppWritePackedMsg,end))
+		return 0;
+	}
+
+return 1;
+}
+
+//RACH INDICATION
+
+static uint8_t pack_nr_rach_indication_body(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
+{
+	nfapi_nr_prach_indication_pdu_t* value = (nfapi_nr_prach_indication_pdu_t*)tlv;
+
+	if(!(push16(value->phy_cell_id, ppWritePackedMsg, end) &&
+	 	 push8(value->symbol_index, ppWritePackedMsg, end) &&
+		 push8(value->slot_index, ppWritePackedMsg, end) &&
+		 push8(value->freq_index, ppWritePackedMsg, end) &&
+		 push8(value->avg_rssi, ppWritePackedMsg, end) &&
+		 push8(value->avg_snr, ppWritePackedMsg, end) &&
+		 push8(value->num_preamble, ppWritePackedMsg, end)
+		 ))
+		  return 0;
+	for(int i = 0; i < value->num_preamble; i++)
+	{
+		if(!(push8(value->preamble_list->preamble_index, ppWritePackedMsg, end) &&
+			push16(value->preamble_list->timing_advance, ppWritePackedMsg, end) &&
+			push32(value->preamble_list->preamble_pwr, ppWritePackedMsg, end)
+			))
+			return 0;
+	}
+	return 1;
+}
+
+static uint8_t pack_nr_rach_indication(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p7_codec_config_t* config)
+{
+	nfapi_nr_rach_indication_t *pNfapiMsg = (nfapi_nr_rach_indication_t*)msg;
+
+	if (!(push16(pNfapiMsg->sfn , ppWritePackedMsg, end) &&
+		push16(pNfapiMsg->slot , ppWritePackedMsg, end) &&
+		push8(pNfapiMsg->number_of_pdus, ppWritePackedMsg, end)
+		))
+			return 0;
+
+	for(int i=0; i<pNfapiMsg->number_of_pdus;i++)
+	{
+		if(!pack_nr_rach_indication_body(&(pNfapiMsg->pdu_list[i]),ppWritePackedMsg,end))
+		return 0;
+	}
+
+return 1;
+}
+
+
+//UCI INDICATION
+
+static uint8_t pack_nr_uci_pucch_0_1(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+	nfapi_nr_uci_pucch_pdu_format_0_1_t* value = (nfapi_nr_uci_pucch_pdu_format_0_1_t*)tlv;
+
+	if(!(push8(value->pduBitmap, ppWritePackedMsg, end) &&
+	 	 push32(value->handle, ppWritePackedMsg, end) &&
+		 push16(value->rnti, ppWritePackedMsg, end) &&
+		 push8(value->pucch_format, ppWritePackedMsg, end) &&
+		 push8(value->ul_cqi, ppWritePackedMsg, end) &&
+		 push16(value->timing_advance, ppWritePackedMsg, end) &&
+		 push16(value->rssi, ppWritePackedMsg, end)
+		 ))
+		  return 0;
+	if (value->pduBitmap & 0x01) { //SR
+		if(!(push8(value->sr->sr_indication, ppWritePackedMsg, end) &&
+	 	 push8(value->sr->sr_confidence_level, ppWritePackedMsg, end)
+		 ))
+		  return 0;
+	}
+
+	if (((value->pduBitmap >> 1) & 0x01)) { //HARQ
+		if(!(push8(value->harq->num_harq, ppWritePackedMsg, end) &&
+	 	 push8(value->harq->harq_confidence_level, ppWritePackedMsg, end)
+		 ))
+			return 0;
+
+		for(int i=0; i<value->harq->num_harq;i++)
+		{
+			if(!(push8(value->harq->harq_list[i].harq_value, ppWritePackedMsg, end)
+			))
+			return 0;
+		}
+	}
+
+	return 1;
+}
+
+static uint8_t pack_nr_uci_pucch_2_3_4(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+	nfapi_nr_uci_pucch_pdu_format_2_3_4_t* value = (nfapi_nr_uci_pucch_pdu_format_2_3_4_t*) tlv;
+
+	if(!(push8(value->pduBitmap, ppWritePackedMsg, end) &&
+	 	 push32(value->handle, ppWritePackedMsg, end) &&
+		 push16(value->rnti, ppWritePackedMsg, end) &&
+		 push8(value->pucch_format, ppWritePackedMsg, end) &&
+		 push8(value->ul_cqi, ppWritePackedMsg, end) &&
+		 push16(value->timing_advance, ppWritePackedMsg, end) &&
+		 push16(value->rssi, ppWritePackedMsg, end)
+		 ))
+		  return 0;
+
+	if (value->pduBitmap & 0x01) { //SR
+		if(!(push8(value->sr.sr_bit_len, ppWritePackedMsg, end) &&
+	 	 pusharray8(value->sr.sr_payload, (int)(value->sr.sr_bit_len / 8) + 1, (int)(value->sr.sr_bit_len / 8) + 1, ppWritePackedMsg, end)
+		 ))
+		  return 0;
+	}
+
+	if (((value->pduBitmap >> 1) & 0x01)) { //HARQ
+		if(!(push8(value->harq.harq_crc, ppWritePackedMsg, end) &&
+			push8(value->harq.harq_bit_len, ppWritePackedMsg, end) &&
+	 	 	pusharray8(value->harq.harq_payload, (int)(value->harq.harq_bit_len / 8) + 1, (int)(value->harq.harq_bit_len / 8) + 1, ppWritePackedMsg, end)
+			))
+			return 0;
+	}
+
+	if (((value->pduBitmap >> 2) & 0x01)) { //CSI-1
+		if(!(push8(value->csi_part1.csi_part1_crc, ppWritePackedMsg, end) &&
+			push8(value->csi_part1.csi_part1_bit_len, ppWritePackedMsg, end) &&
+	 	 	pusharray8(value->csi_part1.csi_part1_payload, (int)(value->csi_part1.csi_part1_bit_len / 8) + 1, (int)(value->csi_part1.csi_part1_bit_len / 8) + 1, ppWritePackedMsg, end)
+			))
+			return 0;
+	}
+
+	if (((value->pduBitmap >> 3) & 0x01)) { //CSI-2
+		if(!(push8(value->csi_part2.csi_part2_crc, ppWritePackedMsg, end) &&
+			push8(value->csi_part2.csi_part2_bit_len, ppWritePackedMsg, end) &&
+	 	 	pusharray8(value->csi_part2.csi_part2_payload, (int)(value->csi_part2.csi_part2_bit_len / 8) + 1, (int)(value->csi_part2.csi_part2_bit_len / 8) + 1, ppWritePackedMsg, end)
+			))
+			return 0;
+	}
+
+	return 1;
+}
+
+static uint8_t pack_nr_uci_indication_body(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
+{
+	nfapi_nr_uci_t* value = (nfapi_nr_uci_t*)tlv;
+
+	if(!(push16(value->pdu_type, ppWritePackedMsg, end) &&
+		push16(value->pdu_size, ppWritePackedMsg, end)
+		))
+		return 0;
+
+	switch (value->pdu_type) {
+      case NFAPI_NR_UCI_PUSCH_PDU_TYPE:
+        printf("Unhandled NFAPI_NR_UCI_PUSCH_PDU_TYPE \n");
+        break;
+
+      case NFAPI_NR_UCI_FORMAT_0_1_PDU_TYPE:
+        pack_nr_uci_pucch_0_1(&value->pucch_pdu_format_0_1, ppWritePackedMsg, end);
+        break;
+
+      case NFAPI_NR_UCI_FORMAT_2_3_4_PDU_TYPE:
+        pack_nr_uci_pucch_2_3_4(&value->pucch_pdu_format_2_3_4, ppWritePackedMsg, end);
+        break;
+	}
+
+	return 1;
+}
+
+static uint8_t pack_nr_uci_indication(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p7_codec_config_t* config)
+{
+	nfapi_nr_uci_indication_t *pNfapiMsg = (nfapi_nr_uci_indication_t*)msg;
+
+	if (!(push16(pNfapiMsg->sfn , ppWritePackedMsg, end) &&
+		push16(pNfapiMsg->slot , ppWritePackedMsg, end) &&
+		push16(pNfapiMsg->num_ucis, ppWritePackedMsg, end)
+		))
+			return 0;
+
+	for(int i=0; i<pNfapiMsg->num_ucis;i++)
+	{
+		if(!pack_nr_uci_indication_body(pNfapiMsg->uci_list,ppWritePackedMsg,end))
+		return 0;
+	}
+
+return 1;
+}
+
+
+// Main pack function - public
+
+int nfapi_nr_p7_message_pack(void *pMessageBuf, void *pPackedBuf, uint32_t packedBufLen, nfapi_p7_codec_config_t* config)
+{
+	nfapi_p7_message_header_t *pMessageHeader = pMessageBuf;
+	uint8_t *pWritePackedMessage = pPackedBuf;
+	uint8_t *pPackedLengthField = &pWritePackedMessage[4];
+	uint8_t *end = pPackedBuf + packedBufLen;
+
+	if (pMessageBuf == NULL || pPackedBuf == NULL)
+	{
+		NFAPI_TRACE(NFAPI_TRACE_ERROR, "P7 Pack supplied pointers are null\n");
+		return -1;
+	}
+	/*
+	printf("\n P7 MESSAGE SENT: \n");
+	for(int i=0; i< packedBufLen; i++){
+		printf("%d", *(uint8_t *)(pMessageBuf + i));
+	}
+	printf("\n");
+	*/
+	// process the header
+	if(!(push16(pMessageHeader->phy_id, &pWritePackedMessage, end) &&
+		 push16(pMessageHeader->message_id, &pWritePackedMessage, end) &&
+		 push16(0/*pMessageHeader->message_length*/, &pWritePackedMessage, end) &&
+		 push16(pMessageHeader->m_segment_sequence, &pWritePackedMessage, end) &&
+		 push32(0/*pMessageHeader->checksum*/, &pWritePackedMessage, end) &&
+		 push32(pMessageHeader->transmit_timestamp, &pWritePackedMessage, end)))
+	{
+		NFAPI_TRACE(NFAPI_TRACE_ERROR, "P7 Pack header failed\n");
+		return -1;
+	}
+
+        if (pMessageHeader->message_id != NFAPI_TIMING_INFO)
+        {
+          //NFAPI_TRACE(NFAPI_TRACE_INFO, "%s() message_id:0x%04x phy_id:%u m_segment_sequence:%u timestamp:%u\n", __FUNCTION__, pMessageHeader->message_id, pMessageHeader->phy_id, pMessageHeader->m_segment_sequence, pMessageHeader->transmit_timestamp);
+        }
+	// look for the specific message
+	uint8_t result = 0;
+	switch (pMessageHeader->message_id)
+	{
+		case NFAPI_NR_PHY_MSG_TYPE_DL_TTI_REQUEST:
+			result = pack_dl_tti_request(pMessageHeader, &pWritePackedMessage, end, config);
+			break;
+
+		case NFAPI_NR_PHY_MSG_TYPE_UL_TTI_REQUEST:
+			result = pack_ul_tti_request(pMessageHeader, &pWritePackedMessage, end, config);
+			break;
+
+		case NFAPI_NR_PHY_MSG_TYPE_TX_DATA_REQUEST:
+			result = pack_tx_data_request(pMessageHeader, &pWritePackedMessage, end, config);
+			break;
+
+		case NFAPI_NR_PHY_MSG_TYPE_UL_DCI_REQUEST:
+			result = pack_ul_dci_request(pMessageHeader, &pWritePackedMessage, end, config);
+			break;
+
+		case NFAPI_UE_RELEASE_REQUEST:
+			result =pack_ue_release_request(pMessageHeader, &pWritePackedMessage, end, config);
+			break;
+
+		case NFAPI_UE_RELEASE_RESPONSE:
+			result =pack_ue_release_response(pMessageHeader, &pWritePackedMessage, end, config);
+			break;
+
+		case NFAPI_NR_PHY_MSG_TYPE_SLOT_INDICATION:
+			result = pack_nr_slot_indication(pMessageHeader, &pWritePackedMessage, end, config);
+
+		case NFAPI_NR_PHY_MSG_TYPE_RX_DATA_INDICATION:
+			result = pack_nr_rx_data_indication(pMessageHeader, &pWritePackedMessage, end, config);
+			break;
+
+		case NFAPI_NR_PHY_MSG_TYPE_CRC_INDICATION:
+			result = pack_nr_crc_indication(pMessageHeader, &pWritePackedMessage, end, config);
+			break;
+
+		case NFAPI_NR_PHY_MSG_TYPE_UCI_INDICATION:
+			result = pack_nr_uci_indication(pMessageHeader, &pWritePackedMessage, end, config);
+			break;
+
+		case NFAPI_NR_PHY_MSG_TYPE_SRS_INDICATION:
+			result = pack_nr_srs_indication(pMessageHeader, &pWritePackedMessage, end, config);
+			break;
+
+		case NFAPI_NR_PHY_MSG_TYPE_RACH_INDICATION:
+			result = pack_nr_rach_indication(pMessageHeader, &pWritePackedMessage, end, config);
+			break;
+
+		case NFAPI_NR_PHY_MSG_TYPE_DL_NODE_SYNC:
+			result = pack_nr_dl_node_sync(pMessageHeader, &pWritePackedMessage, end, config);
+			break;
+
+		case NFAPI_NR_PHY_MSG_TYPE_UL_NODE_SYNC:
+			result = pack_nr_ul_node_sync(pMessageHeader, &pWritePackedMessage, end, config);
+			break;
+
+		case NFAPI_TIMING_INFO:
+			result = pack_nr_timing_info(pMessageHeader, &pWritePackedMessage, end, config);
+			break;
+
+		default:
+			{
+				if(pMessageHeader->message_id >= NFAPI_VENDOR_EXT_MSG_MIN &&
+				   pMessageHeader->message_id <= NFAPI_VENDOR_EXT_MSG_MAX)
+				{
+					if(config && config->pack_p7_vendor_extension)
+					{
+						result = (config->pack_p7_vendor_extension)(pMessageHeader, &pWritePackedMessage, end, config);
+					}
+					else
+					{
+						NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s VE NFAPI message ID %d. No ve ecoder provided\n", __FUNCTION__, pMessageHeader->message_id);
+					}
+				}
+				else
+				{
+					NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s NFAPI Unknown message ID %d\n", __FUNCTION__, pMessageHeader->message_id);
+				}
+			}
+			break;
+	}
+
+	if(result == 0)
+	{
+		NFAPI_TRACE(NFAPI_TRACE_ERROR, "P7 Pack failed to pack message\n");
+		return -1;
+	}
+
+	// check for a valid message length
+	uintptr_t msgHead = (uintptr_t)pPackedBuf;
+	uintptr_t msgEnd = (uintptr_t)pWritePackedMessage;
+	uint32_t packedMsgLen = msgEnd - msgHead;
+	uint16_t packedMsgLen16;
+	if (packedMsgLen > 0xFFFF || packedMsgLen > packedBufLen)
+	{
+		NFAPI_TRACE(NFAPI_TRACE_ERROR, "Packed message length error %d, buffer supplied %d\n", packedMsgLen, packedBufLen);
+		return -1;
+	}
+	else
+	{
+		packedMsgLen16 = (uint16_t)packedMsgLen;
+	}
+
+	// Update the message length in the header
+	pMessageHeader->message_length = packedMsgLen16;
+
+	if(!push16(packedMsgLen16, &pPackedLengthField, end))
+		return -1;
+
+	if(1)
+	{
+		//quick test
+		if(pMessageHeader->message_length != packedMsgLen)
+		{
+			NFAPI_TRACE(NFAPI_TRACE_ERROR, "nfapi packedMsgLen(%d) != message_length(%d) id %d\n", packedMsgLen, pMessageHeader->message_length, pMessageHeader->message_id);
+		}
+	}
+
+	return (packedMsgLen);
+}
+
+int nfapi_p7_message_pack(void *pMessageBuf, void *pPackedBuf, uint32_t packedBufLen, nfapi_p7_codec_config_t *config) {
+  nfapi_p7_message_header_t *pMessageHeader = pMessageBuf;
+  uint8_t *pWritePackedMessage = pPackedBuf;
+  uint8_t *pPackedLengthField = &pWritePackedMessage[4];
+  uint8_t *end = pPackedBuf + packedBufLen;
+
+  if (pMessageBuf == NULL || pPackedBuf == NULL) {
+    NFAPI_TRACE(NFAPI_TRACE_ERROR, "P7 Pack supplied pointers are null\n");
+    return -1;
+  }
+
+  /*
+  printf("\n P7 MESSAGE SENT: \n");
+  for(int i=0; i< packedBufLen; i++){
+    printf("%d", *(uint8_t *)(pMessageBuf + i));
+  }
+  printf("\n");
+  */
+  // process the header
+  if(!(push16(pMessageHeader->phy_id, &pWritePackedMessage, end) &&
+       push16(pMessageHeader->message_id, &pWritePackedMessage, end) &&
+       push16(0/*pMessageHeader->message_length*/, &pWritePackedMessage, end) &&
+       push16(pMessageHeader->m_segment_sequence, &pWritePackedMessage, end) &&
+       push32(0/*pMessageHeader->checksum*/, &pWritePackedMessage, end) &&
+       push32(pMessageHeader->transmit_timestamp, &pWritePackedMessage, end))) {
+    NFAPI_TRACE(NFAPI_TRACE_ERROR, "P7 Pack header failed\n");
+    return -1;
+  }
+
+  if (pMessageHeader->message_id != NFAPI_TIMING_INFO) {
+    //NFAPI_TRACE(NFAPI_TRACE_INFO, "%s() message_id:0x%04x phy_id:%u m_segment_sequence:%u timestamp:%u\n", __FUNCTION__, pMessageHeader->message_id, pMessageHeader->phy_id, pMessageHeader->m_segment_sequence, pMessageHeader->transmit_timestamp);
+  }
+
+  // look for the specific message
+  uint8_t result = 0;
+
+  switch (pMessageHeader->message_id) {
+    case NFAPI_DL_CONFIG_REQUEST:
+      //NFAPI_TRACE(NFAPI_TRACE_INFO, "%s() NFAPI_DL_CONFIG_REQUEST\n", __FUNCTION__);
+      result = pack_dl_config_request(pMessageHeader, &pWritePackedMessage, end, config);
+      break;
+
+    case NFAPI_UL_CONFIG_REQUEST:
+      result = pack_ul_config_request(pMessageHeader, &pWritePackedMessage, end, config);
+      break;
+
+    case NFAPI_TX_REQUEST:
+      //NFAPI_TRACE(NFAPI_TRACE_INFO, "%s() NFAPI_TX_REQUEST\n", __FUNCTION__);
+      result = pack_tx_request(pMessageHeader, &pWritePackedMessage, end, config);
+      break;
+
+    case NFAPI_HI_DCI0_REQUEST:
+      result = pack_hi_dci0_request(pMessageHeader, &pWritePackedMessage, end, config);
+      break;
+
+    case NFAPI_UE_RELEASE_REQUEST:
+      result =pack_ue_release_request(pMessageHeader, &pWritePackedMessage, end, config);
+      break;
+
+    case NFAPI_UE_RELEASE_RESPONSE:
+      result =pack_ue_release_response(pMessageHeader, &pWritePackedMessage, end, config);
+      break;
+
+    case NFAPI_HARQ_INDICATION:
+      result = pack_harq_indication(pMessageHeader, &pWritePackedMessage, end, config);
+      break;
+
+    case NFAPI_CRC_INDICATION:
+      result = pack_crc_indication(pMessageHeader, &pWritePackedMessage, end, config);
+      break;
+
+    case NFAPI_RX_ULSCH_INDICATION:
+      //printf("RX ULSCH\n");
+      result = pack_rx_ulsch_indication(pMessageHeader, &pWritePackedMessage, end, config);
+      break;
+
+    case NFAPI_RACH_INDICATION:
+      result = pack_rach_indication(pMessageHeader, &pWritePackedMessage, end, config);
+      break;
+
+    case NFAPI_SRS_INDICATION:
+      result = pack_srs_indication(pMessageHeader, &pWritePackedMessage, end, config);
+      break;
+
+    case NFAPI_RX_SR_INDICATION:
+      result = pack_sr_indication(pMessageHeader, &pWritePackedMessage, end, config);
+      break;
+
+    case NFAPI_RX_CQI_INDICATION:
+      result = pack_cqi_indication(pMessageHeader, &pWritePackedMessage, end, config);
+      break;
+
+    case NFAPI_LBT_DL_CONFIG_REQUEST:
+      result = pack_lbt_dl_config_request(pMessageHeader, &pWritePackedMessage, end, config);
+      break;
+
+    case NFAPI_LBT_DL_INDICATION:
+      result = pack_lbt_dl_indication(pMessageHeader, &pWritePackedMessage, end, config);
+      break;
+
+    case NFAPI_NB_HARQ_INDICATION:
+      result = pack_nb_harq_indication(pMessageHeader, &pWritePackedMessage, end, config);
+      break;
+
+    case NFAPI_NRACH_INDICATION:
+      result = pack_nrach_indication(pMessageHeader, &pWritePackedMessage, end, config);
+      break;
+
+    case NFAPI_DL_NODE_SYNC:
+      result = pack_dl_node_sync(pMessageHeader, &pWritePackedMessage, end, config);
+      break;
+
+    case NFAPI_UL_NODE_SYNC:
+      result = pack_ul_node_sync(pMessageHeader, &pWritePackedMessage, end, config);
+      break;
+
+    case NFAPI_TIMING_INFO:
+      result = pack_timing_info(pMessageHeader, &pWritePackedMessage, end, config);
+      break;
+
+    default: {
+      if(pMessageHeader->message_id >= NFAPI_VENDOR_EXT_MSG_MIN &&
+          pMessageHeader->message_id <= NFAPI_VENDOR_EXT_MSG_MAX) {
+        if(config && config->pack_p7_vendor_extension) {
+          result = (config->pack_p7_vendor_extension)(pMessageHeader, &pWritePackedMessage, end, config);
+        } else {
+          NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s VE NFAPI message ID %d. No ve ecoder provided\n", __FUNCTION__, pMessageHeader->message_id);
+        }
+      } else {
+        NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s NFAPI Unknown message ID %d\n", __FUNCTION__, pMessageHeader->message_id);
+      }
+    }
+    break;
+  }
+
+  if(result == 0) {
+    NFAPI_TRACE(NFAPI_TRACE_ERROR, "P7 Pack failed to pack message\n");
+    return -1;
+  }
+
+  // check for a valid message length
+  uintptr_t msgHead = (uintptr_t)pPackedBuf;
+  uintptr_t msgEnd = (uintptr_t)pWritePackedMessage;
+  uint32_t packedMsgLen = msgEnd - msgHead;
+  uint16_t packedMsgLen16;
+
+  if (packedMsgLen > 0xFFFF || packedMsgLen > packedBufLen) {
+    NFAPI_TRACE(NFAPI_TRACE_ERROR, "Packed message length error %d, buffer supplied %d\n", packedMsgLen, packedBufLen);
+    return -1;
+  } else {
+    packedMsgLen16 = (uint16_t)packedMsgLen;
+  }
+
+  // Update the message length in the header
+  pMessageHeader->message_length = packedMsgLen16;
+
+  if(!push16(packedMsgLen16, &pPackedLengthField, end))
+    return -1;
+
+  if(1) {
+    //quick test
+    if(pMessageHeader->message_length != packedMsgLen) {
+      NFAPI_TRACE(NFAPI_TRACE_ERROR, "nfapi packedMsgLen(%d) != message_length(%d) id %d\n", packedMsgLen, pMessageHeader->message_length, pMessageHeader->message_id);
+    }
+  }
+
+  return (packedMsgLen);
+}
+
+// Unpack routines
+// NR:
+static uint8_t unpack_dl_tti_csi_rs_pdu_rel15_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_nr_dl_tti_csi_rs_pdu_rel15_t *value = (nfapi_nr_dl_tti_csi_rs_pdu_rel15_t *)tlv;
+  return(
+          pull16(ppReadPackedMsg, &value->bwp_size, end) &&
+          pull16(ppReadPackedMsg, &value->bwp_start, end) &&
+          pull8(ppReadPackedMsg, &value->subcarrier_spacing, end) &&
+          pull8(ppReadPackedMsg, &value->cyclic_prefix, end) &&
+          pull16(ppReadPackedMsg, &value->start_rb, end) &&
+          pull16(ppReadPackedMsg, &value->nr_of_rbs, end) &&
+          pull8(ppReadPackedMsg, &value->csi_type, end) &&
+          pull8(ppReadPackedMsg, &value->row, end) &&
+          pull16(ppReadPackedMsg, &value->freq_domain, end) &&
+          pull8(ppReadPackedMsg, &value->symb_l0, end) &&
+          pull8(ppReadPackedMsg, &value->symb_l1, end) &&
+          pull8(ppReadPackedMsg, &value->cdm_type, end) &&
+          pull8(ppReadPackedMsg, &value->freq_density, end) &&
+          pull16(ppReadPackedMsg, &value->scramb_id, end) &&
+          pull8(ppReadPackedMsg, &value->power_control_offset, end) &&
+          pull8(ppReadPackedMsg, &value->power_control_offset_ss, end)
+        );
+}
+
+
+static uint8_t unpack_dl_tti_pdcch_pdu_rel15_value(void* tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+
+	nfapi_nr_dl_tti_pdcch_pdu_rel15_t* value = (nfapi_nr_dl_tti_pdcch_pdu_rel15_t*)tlv;
+
+	for(uint8_t i = 0; i < MAX_DCI_CORESET; ++i)
+	{
+		if(!(pull16(ppReadPackedMsg, &value->dci_pdu[i].RNTI, end) &&
+		pull16(ppReadPackedMsg, &value->dci_pdu[i].ScramblingId, end) &&
+		pull16(ppReadPackedMsg, &value->dci_pdu[i].ScramblingRNTI, end) &&
+		pull8(ppReadPackedMsg, &value->dci_pdu[i].CceIndex, end) &&
+		pull8(ppReadPackedMsg, &value->dci_pdu[i].AggregationLevel, end) &&
+		pull8(ppReadPackedMsg, &value->dci_pdu[i].beta_PDCCH_1_0, end) &&
+		pull8(ppReadPackedMsg, &value->dci_pdu[i].powerControlOffsetSS, end) &&
+		pull16(ppReadPackedMsg, &value->dci_pdu[i].PayloadSizeBits, end) &&
+
+		pullarray8(ppReadPackedMsg, value->dci_pdu[i].Payload, value->dci_pdu[i].PayloadSizeBits, value->dci_pdu[i].PayloadSizeBits, end)))
+
+		return 0;
+	}
+	// TODO: resolve the packaging of array (currently sending a single element)
+	return(
+		pull16(ppReadPackedMsg, &value->BWPSize, end) &&
+		pull16(ppReadPackedMsg, &value->BWPStart, end) &&
+		pull8(ppReadPackedMsg, &value->SubcarrierSpacing, end) &&
+		pull8(ppReadPackedMsg, &value->CyclicPrefix, end) &&
+		pull8(ppReadPackedMsg, &value->StartSymbolIndex, end) &&
+		pull8(ppReadPackedMsg, &value->DurationSymbols, end) &&
+		pullarray8(ppReadPackedMsg, value->FreqDomainResource, 6, 6, end) &&
+		pull8(ppReadPackedMsg, &value->CceRegMappingType, end) &&
+		pull8(ppReadPackedMsg, &value->RegBundleSize, end) &&
+		pull8(ppReadPackedMsg, &value->InterleaverSize, end) &&
+		pull8(ppReadPackedMsg, &value->CoreSetType, end) &&
+		pull16(ppReadPackedMsg, &value->ShiftIndex, end) &&
+		pull8(ppReadPackedMsg, &value->precoderGranularity, end) &&
+		pull16(ppReadPackedMsg, &value->numDlDci, end));
+}
+
+
+
+static uint8_t unpack_dl_tti_pdsch_pdu_rel15_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_nr_dl_tti_pdsch_pdu_rel15_t *value = (nfapi_nr_dl_tti_pdsch_pdu_rel15_t *)tlv;
+  // TODO: resolve the packaging of array (currently sending a single element)
+  return(
+          pull16(ppReadPackedMsg, &value->pduBitmap, end) &&
+          pull16(ppReadPackedMsg, &value->rnti, end) &&
+          pull16(ppReadPackedMsg, &value->pduIndex, end) &&
+          pull16(ppReadPackedMsg, &value->BWPSize, end) &&
+          pull16(ppReadPackedMsg, &value->BWPStart, end) &&
+          pull8(ppReadPackedMsg, &value->SubcarrierSpacing, end) &&
+          pull8(ppReadPackedMsg, &value->CyclicPrefix, end) &&
+          pull8(ppReadPackedMsg, &value->NrOfCodewords, end) &&
+          pullarray16(ppReadPackedMsg, value->targetCodeRate, 2, 1, end) &&
+          pullarray8(ppReadPackedMsg, value->qamModOrder, 2, 1, end) &&
+          pullarray8(ppReadPackedMsg, value->mcsIndex, 2, 1, end) &&
+          pullarray8(ppReadPackedMsg, value->mcsTable, 2, 1, end) &&
+          pullarray8(ppReadPackedMsg, value->rvIndex, 2, 1, end) &&
+          pullarray32(ppReadPackedMsg, value->TBSize, 2, 1, end) &&
+          pull16(ppReadPackedMsg, &value->dataScramblingId, end) &&
+          pull8(ppReadPackedMsg, &value->nrOfLayers, end) &&
+          pull8(ppReadPackedMsg, &value->transmissionScheme, end) &&
+          pull8(ppReadPackedMsg, &value->refPoint, end) &&
+          pull16(ppReadPackedMsg, &value->dlDmrsSymbPos, end) &&
+          pull8(ppReadPackedMsg, &value->dmrsConfigType, end) &&
+          pull16(ppReadPackedMsg, &value->dlDmrsScramblingId, end) &&
+          pull8(ppReadPackedMsg, &value->SCID, end) &&
+          pull8(ppReadPackedMsg, &value->numDmrsCdmGrpsNoData, end) &&
+          pull16(ppReadPackedMsg, &value->dmrsPorts, end) &&
+          pull8(ppReadPackedMsg, &value->resourceAlloc, end) &&
+          pull16(ppReadPackedMsg, &value->rbStart, end) &&
+          pull16(ppReadPackedMsg, &value->rbSize, end) &&
+          pull8(ppReadPackedMsg, &value->VRBtoPRBMapping, end) &&
+          pull8(ppReadPackedMsg, &value->StartSymbolIndex, end) &&
+          pull8(ppReadPackedMsg, &value->NrOfSymbols, end) &&
+          pull8(ppReadPackedMsg, &value->PTRSPortIndex, end) &&
+          pull8(ppReadPackedMsg, &value->PTRSTimeDensity, end) &&
+          pull8(ppReadPackedMsg, &value->PTRSFreqDensity, end) &&
+          pull8(ppReadPackedMsg, &value->PTRSReOffset, end)
+        );
+}
+
+
+static uint8_t unpack_dl_tti_ssb_pdu_rel15_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_nr_dl_tti_ssb_pdu_rel15_t *value = (nfapi_nr_dl_tti_ssb_pdu_rel15_t *)tlv;
+  return(
+          pull16(ppReadPackedMsg, &value->PhysCellId, end) &&
+          pull8(ppReadPackedMsg, &value->BetaPss, end) &&
+          pull8(ppReadPackedMsg, &value->SsbBlockIndex, end) &&
+          pull8(ppReadPackedMsg, &value->SsbSubcarrierOffset, end) &&
+          pull16(ppReadPackedMsg, &value->ssbOffsetPointA, end) &&
+          pull8(ppReadPackedMsg, &value->bchPayloadFlag, end) &&
+          pull32(ppReadPackedMsg, &value->bchPayload, end)
+          // TODO: pack precoding_and_beamforming too
+        );
+}
+
+
+// LTE:
+static uint8_t unpack_dl_config_dci_dl_pdu_rel8_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_dl_config_dci_dl_pdu_rel8_t *dci_dl_pdu_rel8 = (nfapi_dl_config_dci_dl_pdu_rel8_t *)tlv;
+  return (pull8(ppReadPackedMsg, &dci_dl_pdu_rel8->dci_format, end) &&
+          pull8(ppReadPackedMsg, &dci_dl_pdu_rel8->cce_idx, end) &&
+          pull8(ppReadPackedMsg, &dci_dl_pdu_rel8->aggregation_level, end) &&
+          pull16(ppReadPackedMsg, &dci_dl_pdu_rel8->rnti, end) &&
+          pull8(ppReadPackedMsg, &dci_dl_pdu_rel8->resource_allocation_type, end) &&
+          pull8(ppReadPackedMsg, &dci_dl_pdu_rel8->virtual_resource_block_assignment_flag, end) &&
+          pull32(ppReadPackedMsg, &dci_dl_pdu_rel8->resource_block_coding, end) &&
+          pull8(ppReadPackedMsg, &dci_dl_pdu_rel8->mcs_1, end) &&
+          pull8(ppReadPackedMsg, &dci_dl_pdu_rel8->redundancy_version_1, end) &&
+          pull8(ppReadPackedMsg, &dci_dl_pdu_rel8->new_data_indicator_1, end) &&
+          pull8(ppReadPackedMsg, &dci_dl_pdu_rel8->transport_block_to_codeword_swap_flag, end) &&
+          pull8(ppReadPackedMsg, &dci_dl_pdu_rel8->mcs_2, end) &&
+          pull8(ppReadPackedMsg, &dci_dl_pdu_rel8->redundancy_version_2, end) &&
+          pull8(ppReadPackedMsg, &dci_dl_pdu_rel8->new_data_indicator_2, end) &&
+          pull8(ppReadPackedMsg, &dci_dl_pdu_rel8->harq_process, end) &&
+          pull8(ppReadPackedMsg, &dci_dl_pdu_rel8->tpmi, end) &&
+          pull8(ppReadPackedMsg, &dci_dl_pdu_rel8->pmi, end) &&
+          pull8(ppReadPackedMsg, &dci_dl_pdu_rel8->precoding_information, end) &&
+          pull8(ppReadPackedMsg, &dci_dl_pdu_rel8->tpc, end) &&
+          pull8(ppReadPackedMsg, &dci_dl_pdu_rel8->downlink_assignment_index, end) &&
+          pull8(ppReadPackedMsg, &dci_dl_pdu_rel8->ngap, end) &&
+          pull8(ppReadPackedMsg, &dci_dl_pdu_rel8->transport_block_size_index, end) &&
+          pull8(ppReadPackedMsg, &dci_dl_pdu_rel8->downlink_power_offset, end) &&
+          pull8(ppReadPackedMsg, &dci_dl_pdu_rel8->allocate_prach_flag, end) &&
+          pull8(ppReadPackedMsg, &dci_dl_pdu_rel8->preamble_index, end) &&
+          pull8(ppReadPackedMsg, &dci_dl_pdu_rel8->prach_mask_index, end) &&
+          pull8(ppReadPackedMsg, &dci_dl_pdu_rel8->rnti_type, end) &&
+          pull16(ppReadPackedMsg, &dci_dl_pdu_rel8->transmission_power, end));
+}
+
+static uint8_t unpack_dl_config_dci_dl_pdu_rel9_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_dl_config_dci_dl_pdu_rel9_t *dci_dl_pdu_rel9 = (nfapi_dl_config_dci_dl_pdu_rel9_t *)tlv;
+  return ( pull8(ppReadPackedMsg, &dci_dl_pdu_rel9->mcch_flag, end) &&
+           pull8(ppReadPackedMsg, &dci_dl_pdu_rel9->mcch_change_notification, end) &&
+           pull8(ppReadPackedMsg, &dci_dl_pdu_rel9->scrambling_identity, end));
+}
+
+static uint8_t unpack_dl_config_dci_dl_pdu_rel10_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_dl_config_dci_dl_pdu_rel10_t *dci_dl_pdu_rel10 = (nfapi_dl_config_dci_dl_pdu_rel10_t *)tlv;
+  return (pull8(ppReadPackedMsg, &dci_dl_pdu_rel10->cross_carrier_scheduling_flag, end) &&
+          pull8(ppReadPackedMsg, &dci_dl_pdu_rel10->carrier_indicator, end) &&
+          pull8(ppReadPackedMsg, &dci_dl_pdu_rel10->srs_flag, end) &&
+          pull8(ppReadPackedMsg, &dci_dl_pdu_rel10->srs_request, end) &&
+          pull8(ppReadPackedMsg, &dci_dl_pdu_rel10->antenna_ports_scrambling_and_layers, end) &&
+          pull8(ppReadPackedMsg, &dci_dl_pdu_rel10->total_dci_length_including_padding, end) &&
+          pull8(ppReadPackedMsg, &dci_dl_pdu_rel10->n_dl_rb, end));
+}
+
+static uint8_t unpack_dl_config_dci_dl_pdu_rel11_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_dl_config_dci_dl_pdu_rel11_t *dci_dl_pdu_rel11 = (nfapi_dl_config_dci_dl_pdu_rel11_t *)tlv;
+  return (pull8(ppReadPackedMsg, &dci_dl_pdu_rel11->harq_ack_resource_offset, end) &&
+          pull8(ppReadPackedMsg, &dci_dl_pdu_rel11->pdsch_re_mapping_quasi_co_location_indicator, end));
+}
+
+static uint8_t unpack_dl_config_dci_dl_pdu_rel12_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_dl_config_dci_dl_pdu_rel12_t *dci_dl_pdu_rel12 = (nfapi_dl_config_dci_dl_pdu_rel12_t *)tlv;
+  return (pull8(ppReadPackedMsg, &dci_dl_pdu_rel12->primary_cell_type, end) &&
+          pull8(ppReadPackedMsg, &dci_dl_pdu_rel12->ul_dl_configuration_flag, end) &&
+          pull8(ppReadPackedMsg, &dci_dl_pdu_rel12->number_ul_dl_configurations, end) &&
+          pullarray8(ppReadPackedMsg, dci_dl_pdu_rel12->ul_dl_configuration_indication, NFAPI_MAX_UL_DL_CONFIGURATIONS, dci_dl_pdu_rel12->number_ul_dl_configurations, end));
+}
+
+static uint8_t unpack_tpm_value(uint8_t **ppReadPackedMsg, nfapi_dl_config_dci_dl_tpm_t *value, uint8_t *end) {
+  if(!(pull8(ppReadPackedMsg, &value->num_prb_per_subband, end) &&
+       pull8(ppReadPackedMsg, &value->number_of_subbands, end) &&
+       pull8(ppReadPackedMsg, &value->num_antennas, end)))
+    return 0;
+
+  uint8_t idx = 0;
+
+  for(idx = 0; idx < value->number_of_subbands; ++idx) {
+    nfapi_dl_config_dci_dl_tpm_subband_info_t *subband_info = &(value->subband_info[idx]);
+
+    if(!(pull8(ppReadPackedMsg, &subband_info->subband_index, end) &&
+         pull8(ppReadPackedMsg, &subband_info->scheduled_ues, end)))
+      return 0;
+
+    uint8_t antenna_idx = 0;
+    uint8_t scheduled_ue_idx = 0;
+
+    for(antenna_idx = 0; antenna_idx < value->num_antennas; ++antenna_idx) {
+      for(scheduled_ue_idx = 0; scheduled_ue_idx < subband_info->scheduled_ues; ++scheduled_ue_idx) {
+        if(!pull16(ppReadPackedMsg, &(subband_info->precoding_value[antenna_idx][scheduled_ue_idx]), end))
+          return 0;
+      }
+    }
+  }
+
+  return 1;
+}
+
+
+static uint8_t unpack_dl_config_dci_dl_pdu_rel13_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_dl_config_dci_dl_pdu_rel13_t *dci_dl_pdu_rel13 = (nfapi_dl_config_dci_dl_pdu_rel13_t *)tlv;
+  // If the length is greater than 5 then the TPM struct flag and possiably the TPM structure have been
+  // added
+  uint8_t tpm_struct_flag_present = dci_dl_pdu_rel13->tl.length > 5;
+  dci_dl_pdu_rel13->tpm_struct_flag = 0;
+  return (pull8(ppReadPackedMsg, &dci_dl_pdu_rel13->laa_end_partial_sf_flag, end) &&
+          pull8(ppReadPackedMsg, &dci_dl_pdu_rel13->laa_end_partial_sf_configuration, end) &&
+          pull8(ppReadPackedMsg, &dci_dl_pdu_rel13->initial_lbt_sf, end) &&
+          pull8(ppReadPackedMsg, &dci_dl_pdu_rel13->codebook_size_determination, end) &&
+          pull8(ppReadPackedMsg, &dci_dl_pdu_rel13->drms_table_flag, end) &&
+          ( (tpm_struct_flag_present == 1) ? pull8(ppReadPackedMsg, &dci_dl_pdu_rel13->tpm_struct_flag, end) : 1) &&
+          ( (tpm_struct_flag_present == 1 &&  dci_dl_pdu_rel13->tpm_struct_flag == 1) ? unpack_tpm_value(ppReadPackedMsg, &dci_dl_pdu_rel13->tpm, end) : 1));
+}
+
+static uint8_t unpack_dl_config_bch_pdu_rel8_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_dl_config_bch_pdu_rel8_t *bch_pdu_rel8 = (nfapi_dl_config_bch_pdu_rel8_t *)tlv;
+  return ( pull16(ppReadPackedMsg, &bch_pdu_rel8->length, end) &&
+           pull16(ppReadPackedMsg, (uint16_t *)&bch_pdu_rel8->pdu_index, end) &&
+           pull16(ppReadPackedMsg, &bch_pdu_rel8->transmission_power, end));
+}
+
+static uint8_t unpack_dl_config_mch_pdu_rel8_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_dl_config_mch_pdu_rel8_t *mch_pdu_rel8 = (nfapi_dl_config_mch_pdu_rel8_t *)tlv;
+  return (pull16(ppReadPackedMsg, &mch_pdu_rel8->length, end) &&
+          pull16(ppReadPackedMsg, (uint16_t *)&mch_pdu_rel8->pdu_index, end) &&
+          pull16(ppReadPackedMsg, &mch_pdu_rel8->rnti, end) &&
+          pull8(ppReadPackedMsg, &mch_pdu_rel8->resource_allocation_type, end) &&
+          pull32(ppReadPackedMsg, &mch_pdu_rel8->resource_block_coding, end) &&
+          pull8(ppReadPackedMsg, &mch_pdu_rel8->modulation, end) &&
+          pull16(ppReadPackedMsg, &mch_pdu_rel8->transmission_power, end) &&
+          pull16(ppReadPackedMsg, &mch_pdu_rel8->mbsfn_area_id, end));
+}
+
+static uint8_t unpack_dl_config_dlsch_pdu_rel8_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_dl_config_dlsch_pdu_rel8_t *dlsch_pdu_rel8 = (nfapi_dl_config_dlsch_pdu_rel8_t *)tlv;
+
+  if (!(pull16(ppReadPackedMsg, &dlsch_pdu_rel8->length, end) &&
+        pull16(ppReadPackedMsg, (uint16_t *)&dlsch_pdu_rel8->pdu_index, end) &&
+        pull16(ppReadPackedMsg, &dlsch_pdu_rel8->rnti, end) &&
+        pull8(ppReadPackedMsg, &dlsch_pdu_rel8->resource_allocation_type, end) &&
+        pull8(ppReadPackedMsg, &dlsch_pdu_rel8->virtual_resource_block_assignment_flag, end) &&
+        pull32(ppReadPackedMsg, &dlsch_pdu_rel8->resource_block_coding, end) &&
+        pull8(ppReadPackedMsg, &dlsch_pdu_rel8->modulation, end) &&
+        pull8(ppReadPackedMsg, &dlsch_pdu_rel8->redundancy_version, end) &&
+        pull8(ppReadPackedMsg, &dlsch_pdu_rel8->transport_blocks, end) &&
+        pull8(ppReadPackedMsg, &dlsch_pdu_rel8->transport_block_to_codeword_swap_flag, end) &&
+        pull8(ppReadPackedMsg, &dlsch_pdu_rel8->transmission_scheme, end) &&
+        pull8(ppReadPackedMsg, &dlsch_pdu_rel8->number_of_layers, end) &&
+        pull8(ppReadPackedMsg, &dlsch_pdu_rel8->number_of_subbands, end) &&
+        pullarray8(ppReadPackedMsg, dlsch_pdu_rel8->codebook_index, NFAPI_MAX_NUM_SUBBANDS, dlsch_pdu_rel8->number_of_subbands, end) &&
+        pull8(ppReadPackedMsg, &dlsch_pdu_rel8->ue_category_capacity, end) &&
+        pull8(ppReadPackedMsg, &dlsch_pdu_rel8->pa, end) &&
+        pull8(ppReadPackedMsg, &dlsch_pdu_rel8->delta_power_offset_index, end) &&
+        pull8(ppReadPackedMsg, &dlsch_pdu_rel8->ngap, end) &&
+        pull8(ppReadPackedMsg, &dlsch_pdu_rel8->nprb, end) &&
+        pull8(ppReadPackedMsg, &dlsch_pdu_rel8->transmission_mode, end) &&
+        pull8(ppReadPackedMsg, &dlsch_pdu_rel8->num_bf_prb_per_subband, end) &&
+        pull8(ppReadPackedMsg, &dlsch_pdu_rel8->num_bf_vector, end)))
+    return 0;
+
+  uint16_t j = 0;
+
+  for(j = 0; j < dlsch_pdu_rel8->num_bf_vector; ++j) {
+    if(!(pull8(ppReadPackedMsg, &dlsch_pdu_rel8->bf_vector[j].subband_index, end) &&
+         pull8(ppReadPackedMsg, &dlsch_pdu_rel8->bf_vector[j].num_antennas, end) &&
+         pullarray16(ppReadPackedMsg, dlsch_pdu_rel8->bf_vector[j].bf_value, NFAPI_MAX_NUM_ANTENNAS, dlsch_pdu_rel8->bf_vector[j].num_antennas, end)))
+      return 0;
+  }
+
+  return 1;
+}
+static uint8_t unpack_dl_config_dlsch_pdu_rel9_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_dl_config_dlsch_pdu_rel9_t *dlsch_pdu_rel9 = (nfapi_dl_config_dlsch_pdu_rel9_t *)tlv;
+  return ( pull8(ppReadPackedMsg, &dlsch_pdu_rel9->nscid, end) );
+}
+static uint8_t unpack_dl_config_dlsch_pdu_rel10_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_dl_config_dlsch_pdu_rel10_t *dlsch_pdu_rel10 = (nfapi_dl_config_dlsch_pdu_rel10_t *)tlv;
+  return ( pull8(ppReadPackedMsg, &dlsch_pdu_rel10->csi_rs_flag, end) &&
+           pull8(ppReadPackedMsg, &dlsch_pdu_rel10->csi_rs_resource_config_r10, end) &&
+           pull16(ppReadPackedMsg, &dlsch_pdu_rel10->csi_rs_zero_tx_power_resource_config_bitmap_r10, end) &&
+           pull8(ppReadPackedMsg, &dlsch_pdu_rel10->csi_rs_number_nzp_configuration, end) &&
+           pullarray8(ppReadPackedMsg, dlsch_pdu_rel10->csi_rs_resource_config, NFAPI_MAX_CSI_RS_RESOURCE_CONFIG, dlsch_pdu_rel10->csi_rs_number_nzp_configuration, end) &&
+           pull8(ppReadPackedMsg, &dlsch_pdu_rel10->pdsch_start, end)) ;
+}
+static uint8_t unpack_dl_config_dlsch_pdu_rel11_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_dl_config_dlsch_pdu_rel11_t *dlsch_pdu_rel11 = (nfapi_dl_config_dlsch_pdu_rel11_t *)tlv;
+  return ( pull8(ppReadPackedMsg, &dlsch_pdu_rel11->drms_config_flag, end) &&
+           pull16(ppReadPackedMsg, &dlsch_pdu_rel11->drms_scrambling, end) &&
+           pull8(ppReadPackedMsg, &dlsch_pdu_rel11->csi_config_flag, end) &&
+           pull16(ppReadPackedMsg, &dlsch_pdu_rel11->csi_scrambling, end) &&
+           pull8(ppReadPackedMsg, &dlsch_pdu_rel11->pdsch_re_mapping_flag, end) &&
+           pull8(ppReadPackedMsg, &dlsch_pdu_rel11->pdsch_re_mapping_atenna_ports, end) &&
+           pull8(ppReadPackedMsg, &dlsch_pdu_rel11->pdsch_re_mapping_freq_shift, end));
+}
+static uint8_t unpack_dl_config_dlsch_pdu_rel12_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_dl_config_dlsch_pdu_rel12_t *dlsch_pdu_rel12 = (nfapi_dl_config_dlsch_pdu_rel12_t *)tlv;
+  return ( pull8(ppReadPackedMsg, &dlsch_pdu_rel12->altcqi_table_r12, end) &&
+           pull8(ppReadPackedMsg, &dlsch_pdu_rel12->maxlayers, end) &&
+           pull8(ppReadPackedMsg, &dlsch_pdu_rel12->n_dl_harq, end));
+}
+static uint8_t unpack_dl_config_dlsch_pdu_rel13_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_dl_config_dlsch_pdu_rel13_t *dlsch_pdu_rel13 = (nfapi_dl_config_dlsch_pdu_rel13_t *)tlv;
+  return ( pull8(ppReadPackedMsg, &dlsch_pdu_rel13->dwpts_symbols, end) &&
+           pull8(ppReadPackedMsg, &dlsch_pdu_rel13->initial_lbt_sf, end) &&
+           pull8(ppReadPackedMsg, &dlsch_pdu_rel13->ue_type, end) &&
+           pull8(ppReadPackedMsg, &dlsch_pdu_rel13->pdsch_payload_type, end) &&
+           pull16(ppReadPackedMsg, &dlsch_pdu_rel13->initial_transmission_sf_io, end) &&
+           pull8(ppReadPackedMsg, &dlsch_pdu_rel13->drms_table_flag, end));
+}
+
+static uint8_t unpack_dl_config_pch_pdu_rel8_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_dl_config_pch_pdu_rel8_t *pch_pdu_rel8 = (nfapi_dl_config_pch_pdu_rel8_t *)tlv;
+  return ( pull16(ppReadPackedMsg, &pch_pdu_rel8->length, end) &&
+           pull16(ppReadPackedMsg, (uint16_t *)&pch_pdu_rel8->pdu_index, end) &&
+           pull16(ppReadPackedMsg, &pch_pdu_rel8->p_rnti, end) &&
+           pull8(ppReadPackedMsg, &pch_pdu_rel8->resource_allocation_type, end) &&
+           pull8(ppReadPackedMsg, &pch_pdu_rel8->virtual_resource_block_assignment_flag, end) &&
+           pull32(ppReadPackedMsg, &pch_pdu_rel8->resource_block_coding, end) &&
+           pull8(ppReadPackedMsg, &pch_pdu_rel8->mcs, end) &&
+           pull8(ppReadPackedMsg, &pch_pdu_rel8->redundancy_version, end) &&
+           pull8(ppReadPackedMsg, &pch_pdu_rel8->number_of_transport_blocks, end) &&
+           pull8(ppReadPackedMsg, &pch_pdu_rel8->transport_block_to_codeword_swap_flag, end) &&
+           pull8(ppReadPackedMsg, &pch_pdu_rel8->transmission_scheme, end) &&
+           pull8(ppReadPackedMsg, &pch_pdu_rel8->number_of_layers, end) &&
+           pull8(ppReadPackedMsg, &pch_pdu_rel8->codebook_index, end) &&
+           pull8(ppReadPackedMsg, &pch_pdu_rel8->ue_category_capacity, end) &&
+           pull8(ppReadPackedMsg, &pch_pdu_rel8->pa, end) &&
+           pull16(ppReadPackedMsg, &pch_pdu_rel8->transmission_power, end) &&
+           pull8(ppReadPackedMsg, &pch_pdu_rel8->nprb, end) &&
+           pull8(ppReadPackedMsg, &pch_pdu_rel8->ngap, end));
+}
+static uint8_t unpack_dl_config_pch_pdu_rel13_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_dl_config_pch_pdu_rel13_t *pch_pdu_rel13 = (nfapi_dl_config_pch_pdu_rel13_t *)tlv;
+  return ( pull8(ppReadPackedMsg, &pch_pdu_rel13->ue_mode, end) &&
+           pull16(ppReadPackedMsg, &pch_pdu_rel13->initial_transmission_sf_io, end));
+}
+
+static uint8_t unpack_dl_config_prs_pdu_rel9_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_dl_config_prs_pdu_rel9_t *prs_pdu_rel9 = (nfapi_dl_config_prs_pdu_rel9_t *)tlv;
+  return ( pull16(ppReadPackedMsg, &prs_pdu_rel9->transmission_power, end) &&
+           pull8(ppReadPackedMsg, &prs_pdu_rel9->prs_bandwidth, end) &&
+           pull8(ppReadPackedMsg, &prs_pdu_rel9->prs_cyclic_prefix_type, end) &&
+           pull8(ppReadPackedMsg, &prs_pdu_rel9->prs_muting, end));
+}
+
+static uint8_t unpack_dl_config_csi_rs_pdu_rel10_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_dl_config_csi_rs_pdu_rel10_t *csi_rs_pdu_rel10 = (nfapi_dl_config_csi_rs_pdu_rel10_t *)tlv;
+  return ( pull8(ppReadPackedMsg, &csi_rs_pdu_rel10->csi_rs_antenna_port_count_r10, end) &&
+           pull8(ppReadPackedMsg, &csi_rs_pdu_rel10->csi_rs_resource_config_r10, end) &&
+           pull16(ppReadPackedMsg, &csi_rs_pdu_rel10->transmission_power, end) &&
+           pull16(ppReadPackedMsg, &csi_rs_pdu_rel10->csi_rs_zero_tx_power_resource_config_bitmap_r10, end) &&
+           pull8(ppReadPackedMsg, &csi_rs_pdu_rel10->csi_rs_number_of_nzp_configuration, end) &&
+           pullarray8(ppReadPackedMsg, csi_rs_pdu_rel10->csi_rs_resource_config, NFAPI_MAX_CSI_RS_RESOURCE_CONFIG, csi_rs_pdu_rel10->csi_rs_number_of_nzp_configuration, end));
+}
+
+static uint8_t unpack_dl_config_csi_rs_pdu_rel13_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_dl_config_csi_rs_pdu_rel13_t *csi_rs_pdu_rel13 = (nfapi_dl_config_csi_rs_pdu_rel13_t *)tlv;
+
+  if (!(pull8(ppReadPackedMsg, &csi_rs_pdu_rel13->csi_rs_class, end) &&
+        pull8(ppReadPackedMsg, &csi_rs_pdu_rel13->cdm_type, end) &&
+        pull8(ppReadPackedMsg, &csi_rs_pdu_rel13->num_bf_vector, end)))
+    return 0;
+
+  uint16_t idx =0;
+
+  for(idx = 0; idx < csi_rs_pdu_rel13->num_bf_vector; ++idx) {
+    if(!(pull8(ppReadPackedMsg, &csi_rs_pdu_rel13->bf_vector[idx].csi_rs_resource_index, end)))
+      return 0;
+
+    NFAPI_TRACE(NFAPI_TRACE_ERROR, "FIXME : HOW TO DECODE BF VALUE \n");
+    //pullarray16(ppReadPackedMsg, &csi_rs_pdu_rel13->bf_vector[idx].bf_vector, ??);
+  }
+
+  return 1;
+}
+
+static uint8_t unpack_dl_config_epdcch_params_rel11_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_dl_config_epdcch_parameters_rel11_t *epdcch_params_rel11 = (nfapi_dl_config_epdcch_parameters_rel11_t *)tlv;
+  return (pull8(ppReadPackedMsg, &epdcch_params_rel11->epdcch_resource_assignment_flag, end) &&
+          pull16(ppReadPackedMsg, &epdcch_params_rel11->epdcch_id, end) &&
+          pull8(ppReadPackedMsg, &epdcch_params_rel11->epdcch_start_symbol, end) &&
+          pull8(ppReadPackedMsg, &epdcch_params_rel11->epdcch_num_prb, end) &&
+          pullarray8(ppReadPackedMsg, epdcch_params_rel11->epdcch_prb_index, NFAPI_MAX_EPDCCH_PRB, epdcch_params_rel11->epdcch_num_prb, end) &&
+          pull8(ppReadPackedMsg, &epdcch_params_rel11->bf_vector.subband_index, end) &&
+          pull8(ppReadPackedMsg, &epdcch_params_rel11->bf_vector.num_antennas, end) &&
+          pullarray16(ppReadPackedMsg, epdcch_params_rel11->bf_vector.bf_value, NFAPI_MAX_NUM_ANTENNAS, epdcch_params_rel11->bf_vector.num_antennas, end));
+}
+
+static uint8_t unpack_dl_config_epdcch_params_rel13_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_dl_config_epdcch_parameters_rel13_t *epdcch_params_rel13 = (nfapi_dl_config_epdcch_parameters_rel13_t *)tlv;
+  return ( pull8(ppReadPackedMsg, &epdcch_params_rel13->dwpts_symbols, end) &&
+           pull8(ppReadPackedMsg, &epdcch_params_rel13->initial_lbt_sf, end));
+}
+
+static uint8_t unpack_dl_config_mpdcch_pdu_rel13_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_dl_config_mpdcch_pdu_rel13_t *mpdcch_params_rel13 = (nfapi_dl_config_mpdcch_pdu_rel13_t *)tlv;
+  return ( pull8(ppReadPackedMsg, &mpdcch_params_rel13->mpdcch_narrow_band, end) &&
+           pull8(ppReadPackedMsg, &mpdcch_params_rel13->number_of_prb_pairs, end) &&
+           pull8(ppReadPackedMsg, &mpdcch_params_rel13->resource_block_assignment, end) &&
+           pull8(ppReadPackedMsg, &mpdcch_params_rel13->mpdcch_tansmission_type, end) &&
+           pull8(ppReadPackedMsg, &mpdcch_params_rel13->start_symbol, end) &&
+           pull8(ppReadPackedMsg, &mpdcch_params_rel13->ecce_index, end) &&
+           pull8(ppReadPackedMsg, &mpdcch_params_rel13->aggregation_level, end) &&
+           pull8(ppReadPackedMsg, &mpdcch_params_rel13->rnti_type, end) &&
+           pull16(ppReadPackedMsg, &mpdcch_params_rel13->rnti, end) &&
+           pull8(ppReadPackedMsg, &mpdcch_params_rel13->ce_mode, end) &&
+           pull16(ppReadPackedMsg, &mpdcch_params_rel13->drms_scrambling_init, end) &&
+           pull16(ppReadPackedMsg, &mpdcch_params_rel13->initial_transmission_sf_io, end) &&
+           pull16(ppReadPackedMsg, &mpdcch_params_rel13->transmission_power, end) &&
+           pull8(ppReadPackedMsg, &mpdcch_params_rel13->dci_format, end) &&
+           pull16(ppReadPackedMsg, &mpdcch_params_rel13->resource_block_coding, end) &&
+           pull8(ppReadPackedMsg, &mpdcch_params_rel13->mcs, end) &&
+           pull8(ppReadPackedMsg, &mpdcch_params_rel13->pdsch_reptition_levels, end) &&
+           pull8(ppReadPackedMsg, &mpdcch_params_rel13->redundancy_version, end) &&
+           pull8(ppReadPackedMsg, &mpdcch_params_rel13->new_data_indicator, end) &&
+           pull8(ppReadPackedMsg, &mpdcch_params_rel13->harq_process, end) &&
+           pull8(ppReadPackedMsg, &mpdcch_params_rel13->tpmi_length, end) &&
+           pull8(ppReadPackedMsg, &mpdcch_params_rel13->tpmi, end) &&
+           pull8(ppReadPackedMsg, &mpdcch_params_rel13->pmi_flag, end) &&
+           pull8(ppReadPackedMsg, &mpdcch_params_rel13->pmi, end) &&
+           pull8(ppReadPackedMsg, &mpdcch_params_rel13->harq_resource_offset, end) &&
+           pull8(ppReadPackedMsg, &mpdcch_params_rel13->dci_subframe_repetition_number, end) &&
+           pull8(ppReadPackedMsg, &mpdcch_params_rel13->tpc, end) &&
+           pull8(ppReadPackedMsg, &mpdcch_params_rel13->downlink_assignment_index_length, end) &&
+           pull8(ppReadPackedMsg, &mpdcch_params_rel13->downlink_assignment_index, end) &&
+           pull8(ppReadPackedMsg, &mpdcch_params_rel13->allocate_prach_flag, end) &&
+           pull8(ppReadPackedMsg, &mpdcch_params_rel13->preamble_index, end) &&
+           pull8(ppReadPackedMsg, &mpdcch_params_rel13->prach_mask_index, end) &&
+           pull8(ppReadPackedMsg, &mpdcch_params_rel13->starting_ce_level, end) &&
+           pull8(ppReadPackedMsg, &mpdcch_params_rel13->srs_request, end) &&
+           pull8(ppReadPackedMsg, &mpdcch_params_rel13->antenna_ports_and_scrambling_identity_flag, end) &&
+           pull8(ppReadPackedMsg, &mpdcch_params_rel13->antenna_ports_and_scrambling_identity, end) &&
+           pull8(ppReadPackedMsg, &mpdcch_params_rel13->frequency_hopping_enabled_flag, end) &&
+           pull8(ppReadPackedMsg, &mpdcch_params_rel13->paging_direct_indication_differentiation_flag, end) &&
+           pull8(ppReadPackedMsg, &mpdcch_params_rel13->direct_indication, end) &&
+           pull8(ppReadPackedMsg, &mpdcch_params_rel13->total_dci_length_including_padding, end) &&
+           pull8(ppReadPackedMsg, &mpdcch_params_rel13->number_of_tx_antenna_ports, end) &&
+           pullarray16(ppReadPackedMsg, mpdcch_params_rel13->precoding_value, NFAPI_MAX_TX_PHYSICAL_ANTENNA_PORTS, mpdcch_params_rel13->number_of_tx_antenna_ports, end));
+}
+
+
+static uint8_t unpack_dl_config_nbch_pdu_rel13_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_dl_config_nbch_pdu_rel13_t *nbch_params_rel13 = (nfapi_dl_config_nbch_pdu_rel13_t *)tlv;
+  return ( pull16(ppReadPackedMsg, &nbch_params_rel13->length, end) &&
+           pull16(ppReadPackedMsg, (uint16_t *)&nbch_params_rel13->pdu_index, end) &&
+           pull16(ppReadPackedMsg, &nbch_params_rel13->transmission_power, end) &&
+           pull16(ppReadPackedMsg, &nbch_params_rel13->hyper_sfn_2_lsbs, end));
+}
+
+static uint8_t unpack_dl_config_npdcch_pdu_rel13_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_dl_config_npdcch_pdu_rel13_t *npdcch_params_rel13 = (nfapi_dl_config_npdcch_pdu_rel13_t *)tlv;
+  return ( pull16(ppReadPackedMsg, &npdcch_params_rel13->length, end) &&
+           pull16(ppReadPackedMsg, (uint16_t *)&npdcch_params_rel13->pdu_index, end) &&
+           pull8(ppReadPackedMsg, &npdcch_params_rel13->ncce_index, end) &&
+           pull8(ppReadPackedMsg, &npdcch_params_rel13->aggregation_level, end) &&
+           pull8(ppReadPackedMsg, &npdcch_params_rel13->start_symbol, end) &&
+           pull8(ppReadPackedMsg, &npdcch_params_rel13->rnti_type, end) &&
+           pull16(ppReadPackedMsg, &npdcch_params_rel13->rnti, end) &&
+           pull8(ppReadPackedMsg, &npdcch_params_rel13->scrambling_reinitialization_batch_index, end) &&
+           pull8(ppReadPackedMsg, &npdcch_params_rel13->nrs_antenna_ports_assumed_by_the_ue, end) &&
+           pull8(ppReadPackedMsg, &npdcch_params_rel13->dci_format, end) &&
+           pull8(ppReadPackedMsg, &npdcch_params_rel13->scheduling_delay, end) &&
+           pull8(ppReadPackedMsg, &npdcch_params_rel13->resource_assignment, end) &&
+           pull8(ppReadPackedMsg, &npdcch_params_rel13->repetition_number, end) &&
+           pull8(ppReadPackedMsg, &npdcch_params_rel13->mcs, end) &&
+           pull8(ppReadPackedMsg, &npdcch_params_rel13->new_data_indicator, end) &&
+           pull8(ppReadPackedMsg, &npdcch_params_rel13->harq_ack_resource, end) &&
+           pull8(ppReadPackedMsg, &npdcch_params_rel13->npdcch_order_indication, end) &&
+           pull8(ppReadPackedMsg, &npdcch_params_rel13->starting_number_of_nprach_repetitions, end) &&
+           pull8(ppReadPackedMsg, &npdcch_params_rel13->subcarrier_indication_of_nprach, end) &&
+           pull8(ppReadPackedMsg, &npdcch_params_rel13->paging_direct_indication_differentation_flag, end) &&
+           pull8(ppReadPackedMsg, &npdcch_params_rel13->direct_indication, end) &&
+           pull8(ppReadPackedMsg, &npdcch_params_rel13->dci_subframe_repetition_number, end) &&
+           pull8(ppReadPackedMsg, &npdcch_params_rel13->total_dci_length_including_padding, end));
+}
+
+static uint8_t unpack_dl_config_ndlsch_pdu_rel13_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_dl_config_ndlsch_pdu_rel13_t *ndlsch_params_rel13 = (nfapi_dl_config_ndlsch_pdu_rel13_t *)tlv;
+  return ( pull16(ppReadPackedMsg, &ndlsch_params_rel13->length, end) &&
+           pull16(ppReadPackedMsg, (uint16_t *)&ndlsch_params_rel13->pdu_index, end) &&
+           pull8(ppReadPackedMsg, &ndlsch_params_rel13->start_symbol, end) &&
+           pull8(ppReadPackedMsg, &ndlsch_params_rel13->rnti_type, end) &&
+           pull16(ppReadPackedMsg, &ndlsch_params_rel13->rnti, end) &&
+           pull16(ppReadPackedMsg, &ndlsch_params_rel13->resource_assignment, end) &&
+           pull16(ppReadPackedMsg, &ndlsch_params_rel13->repetition_number, end) &&
+           pull8(ppReadPackedMsg, &ndlsch_params_rel13->modulation, end) &&
+           pull8(ppReadPackedMsg, &ndlsch_params_rel13->number_of_subframes_for_resource_assignment, end) &&
+           pull8(ppReadPackedMsg, &ndlsch_params_rel13->scrambling_sequence_initialization_cinit, end) &&
+           pull16(ppReadPackedMsg, &ndlsch_params_rel13->sf_idx, end) &&
+           pull8(ppReadPackedMsg, &ndlsch_params_rel13->nrs_antenna_ports_assumed_by_the_ue, end));
+}
+
+
+static uint8_t unpack_dl_tti_request_body_value(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg) {
+  nfapi_nr_dl_tti_request_pdu_t *value = (nfapi_nr_dl_tti_request_pdu_t *)msg;
+
+  if(!(pull32(ppReadPackedMsg, &value->PDUSize, end) &&
+       pull16(ppReadPackedMsg, &value->PDUType, end) ))
+    return 0;
+
+  // first match the pdu type, then call the respective function
+  switch(value->PDUType) {
+    case NFAPI_NR_DL_TTI_CSI_RS_PDU_TYPE: {
+      if(!(unpack_dl_tti_csi_rs_pdu_rel15_value(&value->csi_rs_pdu.csi_rs_pdu_rel15,ppReadPackedMsg,end)))
+        return 0;
+    }
+    break;
+
+    case NFAPI_NR_DL_TTI_PDCCH_PDU_TYPE: {
+      if(!(unpack_dl_tti_pdcch_pdu_rel15_value(&value->pdcch_pdu.pdcch_pdu_rel15,ppReadPackedMsg,end)))
+        return 0;
+    }
+    break;
+
+    case NFAPI_NR_DL_TTI_PDSCH_PDU_TYPE: {
+      if(!(unpack_dl_tti_pdsch_pdu_rel15_value(&value->pdsch_pdu.pdsch_pdu_rel15,ppReadPackedMsg,end)))
+        return 0;
+    }
+    break;
+
+    case NFAPI_NR_DL_TTI_SSB_PDU_TYPE: {
+      if(!(unpack_dl_tti_ssb_pdu_rel15_value(&value->ssb_pdu.ssb_pdu_rel15,ppReadPackedMsg,end)))
+        return 0;
+    }
+    break;
+
+    default: {
+      NFAPI_TRACE(NFAPI_TRACE_ERROR, "FIXME : Invalid DL_TTI pdu type %d \n", value->PDUType );
+    }
+    break;
+  }
+
+  return 1;
+}
+
+
+
+
+static uint8_t unpack_dl_config_request_body_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end, nfapi_p7_codec_config_t *config) {
+  nfapi_dl_config_request_body_t *value = (nfapi_dl_config_request_body_t *)tlv;
+
+  if(!(pull8(ppReadPackedMsg, &value->number_pdcch_ofdm_symbols, end) &&
+       pull8(ppReadPackedMsg, &value->number_dci, end) &&
+       pull16(ppReadPackedMsg, &value->number_pdu, end) &&
+       pull8(ppReadPackedMsg, &value->number_pdsch_rnti, end) &&
+       pull16(ppReadPackedMsg, &value->transmission_power_pcfich, end)))
+    return 0;
+
+  if(value->number_pdu > NFAPI_DL_CONFIG_MAX_PDU) {
+    NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s number of dl config pdu's exceed maxium (count:%d max:%d)\n", __FUNCTION__, value->number_pdu, NFAPI_DL_CONFIG_MAX_PDU);
+    return 0;
+  }
+
+  if(value->number_pdu) {
+    value->dl_config_pdu_list = (nfapi_dl_config_request_pdu_t *)nfapi_p7_allocate(sizeof(nfapi_dl_config_request_pdu_t) * value->number_pdu, config);
+
+    if(value->dl_config_pdu_list == NULL) {
+      NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s failed to allocate dl config pdu list (count:%d)\n", __FUNCTION__, value->number_pdu);
+      return 0;
+    }
+  } else {
+    value->dl_config_pdu_list = 0;
+  }
+
+  uint16_t i;
+  uint16_t total_number_of_pdus = value->number_pdu;
+
+  for(i = 0; i < total_number_of_pdus; ++i) {
+    nfapi_dl_config_request_pdu_t *pdu = &(value->dl_config_pdu_list[i]);
+
+    if(!(pull8(ppReadPackedMsg, &pdu->pdu_type, end) &&
+         pull8(ppReadPackedMsg, &pdu->pdu_size, end)))
+      return 0;
+
+    uint8_t *packedPduEnd = (*ppReadPackedMsg) + pdu->pdu_size - 2;
+
+    if(packedPduEnd > end) {
+      // pdu end of beyond buffer end
+      return 0;
+    }
+
+    switch(pdu->pdu_type) {
+      case NFAPI_DL_CONFIG_DCI_DL_PDU_TYPE: {
+        unpack_tlv_t unpack_fns[] = {
+          { NFAPI_DL_CONFIG_REQUEST_DCI_DL_PDU_REL8_TAG, &pdu->dci_dl_pdu.dci_dl_pdu_rel8, &unpack_dl_config_dci_dl_pdu_rel8_value},
+          { NFAPI_DL_CONFIG_REQUEST_DCI_DL_PDU_REL9_TAG, &pdu->dci_dl_pdu.dci_dl_pdu_rel9, &unpack_dl_config_dci_dl_pdu_rel9_value},
+          { NFAPI_DL_CONFIG_REQUEST_DCI_DL_PDU_REL10_TAG, &pdu->dci_dl_pdu.dci_dl_pdu_rel10, &unpack_dl_config_dci_dl_pdu_rel10_value},
+          { NFAPI_DL_CONFIG_REQUEST_DCI_DL_PDU_REL11_TAG, &pdu->dci_dl_pdu.dci_dl_pdu_rel11, &unpack_dl_config_dci_dl_pdu_rel11_value},
+          { NFAPI_DL_CONFIG_REQUEST_DCI_DL_PDU_REL12_TAG, &pdu->dci_dl_pdu.dci_dl_pdu_rel12, &unpack_dl_config_dci_dl_pdu_rel12_value},
+          { NFAPI_DL_CONFIG_REQUEST_DCI_DL_PDU_REL13_TAG, &pdu->dci_dl_pdu.dci_dl_pdu_rel13, &unpack_dl_config_dci_dl_pdu_rel13_value},
+        };
+        unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0);
+      }
+      break;
+
+      case NFAPI_DL_CONFIG_BCH_PDU_TYPE: {
+        unpack_tlv_t unpack_fns[] = {
+          { NFAPI_DL_CONFIG_REQUEST_BCH_PDU_REL8_TAG, &pdu->bch_pdu.bch_pdu_rel8, &unpack_dl_config_bch_pdu_rel8_value},
+        };
+        unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0);
+      }
+      break;
+
+      case NFAPI_DL_CONFIG_MCH_PDU_TYPE: {
+        unpack_tlv_t unpack_fns[] = {
+          { NFAPI_DL_CONFIG_REQUEST_MCH_PDU_REL8_TAG, &pdu->mch_pdu.mch_pdu_rel8, &unpack_dl_config_mch_pdu_rel8_value},
+        };
+        unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0);
+      }
+      break;
+
+      case NFAPI_DL_CONFIG_DLSCH_PDU_TYPE: {
+        unpack_tlv_t unpack_fns[] = {
+          { NFAPI_DL_CONFIG_REQUEST_DLSCH_PDU_REL8_TAG, &pdu->dlsch_pdu.dlsch_pdu_rel8, &unpack_dl_config_dlsch_pdu_rel8_value},
+          { NFAPI_DL_CONFIG_REQUEST_DLSCH_PDU_REL9_TAG, &pdu->dlsch_pdu.dlsch_pdu_rel9, &unpack_dl_config_dlsch_pdu_rel9_value},
+          { NFAPI_DL_CONFIG_REQUEST_DLSCH_PDU_REL10_TAG, &pdu->dlsch_pdu.dlsch_pdu_rel10, &unpack_dl_config_dlsch_pdu_rel10_value},
+          { NFAPI_DL_CONFIG_REQUEST_DLSCH_PDU_REL11_TAG, &pdu->dlsch_pdu.dlsch_pdu_rel11, &unpack_dl_config_dlsch_pdu_rel11_value},
+          { NFAPI_DL_CONFIG_REQUEST_DLSCH_PDU_REL12_TAG, &pdu->dlsch_pdu.dlsch_pdu_rel12, &unpack_dl_config_dlsch_pdu_rel12_value},
+          { NFAPI_DL_CONFIG_REQUEST_DLSCH_PDU_REL13_TAG, &pdu->dlsch_pdu.dlsch_pdu_rel13, &unpack_dl_config_dlsch_pdu_rel13_value},
+        };
+        unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0);
+      }
+      break;
+
+      case NFAPI_DL_CONFIG_PCH_PDU_TYPE: {
+        unpack_tlv_t unpack_fns[] = {
+          { NFAPI_DL_CONFIG_REQUEST_PCH_PDU_REL8_TAG, &pdu->pch_pdu.pch_pdu_rel8, &unpack_dl_config_pch_pdu_rel8_value},
+          { NFAPI_DL_CONFIG_REQUEST_PCH_PDU_REL13_TAG, &pdu->pch_pdu.pch_pdu_rel13, &unpack_dl_config_pch_pdu_rel13_value},
+        };
+        unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0);
+      }
+      break;
+
+      case NFAPI_DL_CONFIG_PRS_PDU_TYPE: {
+        unpack_tlv_t unpack_fns[] = {
+          { NFAPI_DL_CONFIG_REQUEST_PRS_PDU_REL9_TAG, &pdu->prs_pdu.prs_pdu_rel9, &unpack_dl_config_prs_pdu_rel9_value},
+        };
+        unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0);
+      }
+      break;
+
+      case NFAPI_DL_CONFIG_CSI_RS_PDU_TYPE: {
+        unpack_tlv_t unpack_fns[] = {
+          { NFAPI_DL_CONFIG_REQUEST_CSI_RS_PDU_REL10_TAG, &pdu->csi_rs_pdu.csi_rs_pdu_rel10, &unpack_dl_config_csi_rs_pdu_rel10_value},
+          { NFAPI_DL_CONFIG_REQUEST_CSI_RS_PDU_REL13_TAG, &pdu->csi_rs_pdu.csi_rs_pdu_rel13, &unpack_dl_config_csi_rs_pdu_rel13_value},
+        };
+        unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0);
+      }
+      break;
+
+      case NFAPI_DL_CONFIG_EPDCCH_DL_PDU_TYPE: {
+        unpack_tlv_t unpack_fns[] = {
+          { NFAPI_DL_CONFIG_REQUEST_EPDCCH_PDU_REL8_TAG, &pdu->epdcch_pdu.epdcch_pdu_rel8, &unpack_dl_config_dci_dl_pdu_rel8_value},
+          { NFAPI_DL_CONFIG_REQUEST_EPDCCH_PDU_REL9_TAG, &pdu->epdcch_pdu.epdcch_pdu_rel9, &unpack_dl_config_dci_dl_pdu_rel9_value},
+          { NFAPI_DL_CONFIG_REQUEST_EPDCCH_PDU_REL10_TAG, &pdu->epdcch_pdu.epdcch_pdu_rel10, &unpack_dl_config_dci_dl_pdu_rel10_value},
+          { NFAPI_DL_CONFIG_REQUEST_EPDCCH_PDU_REL11_TAG, &pdu->epdcch_pdu.epdcch_pdu_rel11, &unpack_dl_config_dci_dl_pdu_rel11_value},
+          { NFAPI_DL_CONFIG_REQUEST_EPDCCH_PDU_REL12_TAG, &pdu->epdcch_pdu.epdcch_pdu_rel12, &unpack_dl_config_dci_dl_pdu_rel12_value},
+          { NFAPI_DL_CONFIG_REQUEST_EPDCCH_PDU_REL13_TAG, &pdu->epdcch_pdu.epdcch_pdu_rel13, &unpack_dl_config_dci_dl_pdu_rel13_value},
+          { NFAPI_DL_CONFIG_REQUEST_EPDCCH_PARAM_REL11_TAG, &pdu->epdcch_pdu.epdcch_params_rel11, &unpack_dl_config_epdcch_params_rel11_value},
+          { NFAPI_DL_CONFIG_REQUEST_EPDCCH_PARAM_REL13_TAG, &pdu->epdcch_pdu.epdcch_params_rel13, &unpack_dl_config_epdcch_params_rel13_value},
+        };
+        unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0);
+      }
+      break;
+
+      case NFAPI_DL_CONFIG_MPDCCH_PDU_TYPE: {
+        unpack_tlv_t unpack_fns[] = {
+          { NFAPI_DL_CONFIG_REQUEST_MPDCCH_PDU_REL13_TAG, &pdu->mpdcch_pdu.mpdcch_pdu_rel13, &unpack_dl_config_mpdcch_pdu_rel13_value},
+        };
+        unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0);
+      }
+      break;
+
+      case NFAPI_DL_CONFIG_NBCH_PDU_TYPE: {
+        unpack_tlv_t unpack_fns[] = {
+          { NFAPI_DL_CONFIG_REQUEST_NBCH_PDU_REL13_TAG, &pdu->nbch_pdu.nbch_pdu_rel13, &unpack_dl_config_nbch_pdu_rel13_value},
+        };
+        unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0);
+      }
+      break;
+
+      case NFAPI_DL_CONFIG_NPDCCH_PDU_TYPE: {
+        unpack_tlv_t unpack_fns[] = {
+          { NFAPI_DL_CONFIG_REQUEST_NPDCCH_PDU_REL13_TAG, &pdu->npdcch_pdu.npdcch_pdu_rel13, &unpack_dl_config_npdcch_pdu_rel13_value},
+        };
+        unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0);
+      }
+      break;
+
+      case NFAPI_DL_CONFIG_NDLSCH_PDU_TYPE: {
+        unpack_tlv_t unpack_fns[] = {
+          { NFAPI_DL_CONFIG_REQUEST_NDLSCH_PDU_REL13_TAG, &pdu->ndlsch_pdu.ndlsch_pdu_rel13, &unpack_dl_config_ndlsch_pdu_rel13_value},
+        };
+        unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0);
+      }
+      break;
+
+      default:
+        // Need to log an error
+        break;
+    }
+  }
+
+  return 1;
+}
+
+
+static uint8_t unpack_dl_tti_request(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p7_codec_config_t *config) {
+  nfapi_nr_dl_tti_request_t *pNfapiMsg = (nfapi_nr_dl_tti_request_t *)msg;
+
+  if (!(pull16(ppReadPackedMsg,&pNfapiMsg->SFN, end) &&
+        pull16(ppReadPackedMsg, &pNfapiMsg->Slot, end) &&
+        pull8(ppReadPackedMsg, &pNfapiMsg->dl_tti_request_body.nGroup, end) &&
+        pull8(ppReadPackedMsg, &pNfapiMsg->dl_tti_request_body.nPDUs, end) &&
+        pullarray8(ppReadPackedMsg,pNfapiMsg->dl_tti_request_body.nUe,256,pNfapiMsg->dl_tti_request_body.nGroup, end)
+        //pusharray8(pNfapiMsg->PduIdx[0] ,256,256, ppWritePackedMsg, end)
+       ))
+    return 0;
+
+  int arr[12];
+
+  for(int i=0; i<pNfapiMsg->dl_tti_request_body.nGroup; i++) {
+    for(int j=0; j<pNfapiMsg->dl_tti_request_body.nUe[i]; j++) {
+      arr[j] = pNfapiMsg->dl_tti_request_body.PduIdx[i][j];
+    }
+
+    if(!(pullarrays32(ppReadPackedMsg,arr,12,pNfapiMsg->dl_tti_request_body.nUe[i], end)))
+      return 0;
+  }
+
+  for(int i=0; i<pNfapiMsg->dl_tti_request_body.nPDUs; i++) {
+    if(!unpack_dl_tti_request_body_value(ppReadPackedMsg, end, &pNfapiMsg->dl_tti_request_body.dl_tti_pdu_list[i]))
+      return 0;
+  }
+
+  return 1;
+}
+
+
+static uint8_t unpack_ul_tti_request_prach_pdu(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_nr_prach_pdu_t *prach_pdu = (nfapi_nr_prach_pdu_t *)tlv;
+  return(
+          pull16(ppReadPackedMsg, &prach_pdu->phys_cell_id, end) &&
+          pull8(ppReadPackedMsg, &prach_pdu->num_prach_ocas, end) &&
+          pull8(ppReadPackedMsg, &prach_pdu->prach_format, end) &&
+          pull8(ppReadPackedMsg, &prach_pdu->num_ra, end) &&
+          pull8(ppReadPackedMsg, &prach_pdu->prach_start_symbol, end) &&
+          pull16(ppReadPackedMsg, &prach_pdu->num_cs, end)
+          // TODO: ignoring beamforming tlv for now
+        );
+}
+
+
+static uint8_t unpack_ul_tti_request_pucch_pdu(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_nr_pucch_pdu_t *pucch_pdu = (nfapi_nr_pucch_pdu_t *)tlv;
+  return(
+          pull16(ppReadPackedMsg, &pucch_pdu->rnti, end) &&
+          pull32(ppReadPackedMsg, &pucch_pdu->handle, end) &&
+          pull16(ppReadPackedMsg, &pucch_pdu->bwp_size, end) &&
+          pull16(ppReadPackedMsg, &pucch_pdu->bwp_start, end) &&
+          pull8(ppReadPackedMsg, &pucch_pdu->subcarrier_spacing, end) &&
+          pull8(ppReadPackedMsg, &pucch_pdu->cyclic_prefix, end) &&
+          pull8(ppReadPackedMsg, &pucch_pdu->format_type, end) &&
+          pull8(ppReadPackedMsg, &pucch_pdu->multi_slot_tx_indicator, end) &&
+          pull16(ppReadPackedMsg, &pucch_pdu->prb_start, end) &&
+          pull16(ppReadPackedMsg, &pucch_pdu->prb_size, end) &&
+          pull8(ppReadPackedMsg, &pucch_pdu->start_symbol_index, end) &&
+          pull8(ppReadPackedMsg, &pucch_pdu->nr_of_symbols, end) &&
+          pull8(ppReadPackedMsg, &pucch_pdu->freq_hop_flag, end) &&
+          pull16(ppReadPackedMsg, &pucch_pdu->second_hop_prb, end) &&
+          pull8(ppReadPackedMsg, &pucch_pdu->group_hop_flag, end) &&
+          pull8(ppReadPackedMsg, &pucch_pdu->sequence_hop_flag, end) &&
+          pull16(ppReadPackedMsg, &pucch_pdu->hopping_id, end) &&
+          pull16(ppReadPackedMsg, &pucch_pdu->initial_cyclic_shift, end) &&
+          pull16(ppReadPackedMsg, &pucch_pdu->data_scrambling_id, end) &&
+          pull8(ppReadPackedMsg, &pucch_pdu->time_domain_occ_idx, end) &&
+          pull8(ppReadPackedMsg, &pucch_pdu->pre_dft_occ_idx, end) &&
+          pull8(ppReadPackedMsg, &pucch_pdu->pre_dft_occ_len, end) &&
+          pull8(ppReadPackedMsg, &pucch_pdu->add_dmrs_flag, end) &&
+          pull16(ppReadPackedMsg, &pucch_pdu->dmrs_scrambling_id, end) &&
+          pull8(ppReadPackedMsg, &pucch_pdu->dmrs_cyclic_shift, end) &&
+          pull8(ppReadPackedMsg, &pucch_pdu->sr_flag, end) &&
+          pull8(ppReadPackedMsg, &pucch_pdu->bit_len_harq, end) &&
+          pull16(ppReadPackedMsg, &pucch_pdu->bit_len_csi_part1, end) &&
+          pull16(ppReadPackedMsg, &pucch_pdu->bit_len_csi_part2, end)
+          // TODO: ignoring beamforming tlv for now
+        );
+}
+
+
+static uint8_t unpack_ul_tti_request_pusch_pdu(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_nr_pusch_pdu_t *pusch_pdu = (nfapi_nr_pusch_pdu_t *)tlv;
+
+  if (!(
+        pull16(ppReadPackedMsg, &pusch_pdu->pdu_bit_map, end) &&
+        pull16(ppReadPackedMsg, &pusch_pdu->rnti, end) &&
+        pull32(ppReadPackedMsg, &pusch_pdu->handle, end) &&
+        pull16(ppReadPackedMsg, &pusch_pdu->bwp_size, end) &&
+        pull16(ppReadPackedMsg, &pusch_pdu->bwp_start, end) &&
+        pull8(ppReadPackedMsg, &pusch_pdu->subcarrier_spacing, end) &&
+        pull8(ppReadPackedMsg, &pusch_pdu->cyclic_prefix, end) &&
+        pull16(ppReadPackedMsg, &pusch_pdu->target_code_rate,  end) &&
+        pull8(ppReadPackedMsg, &pusch_pdu->qam_mod_order,  end) &&
+        pull8(ppReadPackedMsg, &pusch_pdu->mcs_index,  end) &&
+        pull8(ppReadPackedMsg, &pusch_pdu->mcs_table, end) &&
+        pull8(ppReadPackedMsg, &pusch_pdu->transform_precoding, end) &&
+        pull16(ppReadPackedMsg, &pusch_pdu->data_scrambling_id, end) &&
+        pull8(ppReadPackedMsg, &pusch_pdu->nrOfLayers, end) &&
+        pull16(ppReadPackedMsg, &pusch_pdu->ul_dmrs_symb_pos, end) &&
+        pull8(ppReadPackedMsg, &pusch_pdu->dmrs_config_type, end) &&
+        pull16(ppReadPackedMsg, &pusch_pdu->ul_dmrs_scrambling_id, end) &&
+        pull8(ppReadPackedMsg, &pusch_pdu->scid, end) &&
+        pull8(ppReadPackedMsg, &pusch_pdu->num_dmrs_cdm_grps_no_data, end) &&
+        pull16(ppReadPackedMsg, &pusch_pdu->dmrs_ports, end) &&
+        pull8(ppReadPackedMsg, &pusch_pdu->resource_alloc, end) &&
+        pull8(ppReadPackedMsg, &pusch_pdu->resource_alloc,end) &&
+        pull16(ppReadPackedMsg, &pusch_pdu->dmrs_ports, end) &&
+        pull16(ppReadPackedMsg, &pusch_pdu->rb_start, end) &&
+        pull16(ppReadPackedMsg, &pusch_pdu->rb_size, end) &&
+        pull8(ppReadPackedMsg, &pusch_pdu->vrb_to_prb_mapping, end) &&
+        pull8(ppReadPackedMsg, &pusch_pdu->frequency_hopping, end) &&
+        pull16(ppReadPackedMsg, &pusch_pdu->tx_direct_current_location, end) &&
+        pull8(ppReadPackedMsg, &pusch_pdu->uplink_frequency_shift_7p5khz, end) &&
+        pull8(ppReadPackedMsg, &pusch_pdu->start_symbol_index, end) &&
+        pull8(ppReadPackedMsg, &pusch_pdu->nr_of_symbols, end)
+        // TODO: ignoring beamforming tlv for now
+      ))
+    return 0;
+
+  //Pack Optional Data only included if indicated in pduBitmap
+  switch(pusch_pdu->pdu_bit_map) {
+    case PUSCH_PDU_BITMAP_PUSCH_DATA: {
+      // pack optional TLVs
+      return(
+              pull8(ppReadPackedMsg, &pusch_pdu->pusch_data.rv_index, end) &&
+              pull8(ppReadPackedMsg, &pusch_pdu->pusch_data.harq_process_id, end) &&
+              pull32(ppReadPackedMsg, &pusch_pdu->pusch_data.tb_size, end) &&
+              pull16(ppReadPackedMsg, &pusch_pdu->pusch_data.num_cb, end) &&
+              pullarray8(ppReadPackedMsg, pusch_pdu->pusch_data.cb_present_and_position,1,1,end)
+            );
+    }
+    break;
+
+    case PUSCH_PDU_BITMAP_PUSCH_UCI: {
+      return(
+              pull16(ppReadPackedMsg, &pusch_pdu->pusch_uci.harq_ack_bit_length, end) &&
+              pull16(ppReadPackedMsg, &pusch_pdu->pusch_uci.csi_part1_bit_length, end) &&
+              pull16(ppReadPackedMsg, &pusch_pdu->pusch_uci.csi_part2_bit_length, end) &&
+              pull8(ppReadPackedMsg, &pusch_pdu->pusch_uci.alpha_scaling, end) &&
+              pull8(ppReadPackedMsg, &pusch_pdu->pusch_uci.beta_offset_harq_ack, end) &&
+              pull8(ppReadPackedMsg, &pusch_pdu->pusch_uci.beta_offset_csi1, end) &&
+              pull8(ppReadPackedMsg, &pusch_pdu->pusch_uci.beta_offset_csi2, end)
+            );
+    }
+    break;
+
+    case PUSCH_PDU_BITMAP_PUSCH_PTRS: {
+      return(
+              pull8(ppReadPackedMsg, &pusch_pdu->pusch_ptrs.num_ptrs_ports, end) &&
+              pull8(ppReadPackedMsg, &pusch_pdu->pusch_ptrs.ptrs_ports_list->ptrs_dmrs_port, end) &&
+              +               pull16(ppReadPackedMsg, &pusch_pdu->pusch_ptrs.ptrs_ports_list->ptrs_port_index, end) &&
+              +               pull8(ppReadPackedMsg, &pusch_pdu->pusch_ptrs.ptrs_ports_list->ptrs_re_offset, end) &&
+              pull8(ppReadPackedMsg, &pusch_pdu->pusch_ptrs.ptrs_time_density, end) &&
+              pull8(ppReadPackedMsg, &pusch_pdu->pusch_ptrs.ptrs_freq_density, end) &&
+              pull8(ppReadPackedMsg, &pusch_pdu->pusch_ptrs.ul_ptrs_power, end)
+            );
+    }
+    break;
+
+    case PUSCH_PDU_BITMAP_DFTS_OFDM: {
+      return(
+              pull8(ppReadPackedMsg, &pusch_pdu->dfts_ofdm.low_papr_group_number, end) &&
+              pull16(ppReadPackedMsg, &pusch_pdu->dfts_ofdm.low_papr_sequence_number, end) &&
+              pull8(ppReadPackedMsg, &pusch_pdu->dfts_ofdm.ul_ptrs_sample_density, end) &&
+              pull8(ppReadPackedMsg, &pusch_pdu->dfts_ofdm.ul_ptrs_time_density_transform_precoding, end)
+            );
+    }
+    break;
+
+    default: {
+      NFAPI_TRACE(NFAPI_TRACE_INFO, "Invalid pdu bitmap %d \n", pusch_pdu->pdu_bit_map );
+    }
+  }
+
+  return 1;
+}
+
+
+static uint8_t unpack_ul_tti_request_srs_pdu(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_nr_srs_pdu_t *srs_pdu = (nfapi_nr_srs_pdu_t *)tlv;
+  return(
+          pull16(ppReadPackedMsg, &srs_pdu->rnti, end) &&
+          pull32(ppReadPackedMsg, &srs_pdu->handle, end) &&
+          pull16(ppReadPackedMsg, &srs_pdu->bwp_size, end) &&
+          pull16(ppReadPackedMsg, &srs_pdu->bwp_start, end) &&
+          pull8(ppReadPackedMsg, &srs_pdu->subcarrier_spacing, end) &&
+          pull8(ppReadPackedMsg, &srs_pdu->cyclic_prefix, end) &&
+          pull8(ppReadPackedMsg, &srs_pdu->num_ant_ports, end) &&
+          pull8(ppReadPackedMsg, &srs_pdu->num_symbols,  end) &&
+          pull8(ppReadPackedMsg, &srs_pdu->num_repetitions, end) &&
+          pull8(ppReadPackedMsg, &srs_pdu->time_start_position, end) &&
+          pull8(ppReadPackedMsg, &srs_pdu->config_index, end) &&
+          pull16(ppReadPackedMsg, &srs_pdu->sequence_id, end) &&
+          pull8(ppReadPackedMsg, &srs_pdu->bandwidth_index, end) &&
+          pull8(ppReadPackedMsg, &srs_pdu->comb_size, end) &&
+          pull8(ppReadPackedMsg, &srs_pdu->comb_offset, end) &&
+          pull8(ppReadPackedMsg, &srs_pdu->cyclic_shift, end) &&
+          pull8(ppReadPackedMsg, &srs_pdu->frequency_position, end) &&
+          pull8(ppReadPackedMsg, &srs_pdu->frequency_shift, end) &&
+          pull8(ppReadPackedMsg, &srs_pdu->frequency_hopping, end) &&
+          pull8(ppReadPackedMsg, &srs_pdu->group_or_sequence_hopping, end) &&
+          pull8(ppReadPackedMsg, &srs_pdu->resource_type, end) &&
+          pull16(ppReadPackedMsg, &srs_pdu->t_srs, end) &&
+          pull16(ppReadPackedMsg, &srs_pdu->t_offset, end)
+          // TODO: ignoring beamforming tlv for now
+        );
+}
+
+
+static uint8_t unpack_ul_tti_pdu_list_value(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg) {
+  nfapi_nr_ul_tti_request_number_of_pdus_t *pNfapiMsg = (nfapi_nr_ul_tti_request_number_of_pdus_t *)msg;
+
+  if(!(pull16(ppReadPackedMsg, &pNfapiMsg->pdu_size, end) &&
+       pull16(ppReadPackedMsg, &pNfapiMsg->pdu_type, end) ))
+    return 0;
+
+  // first natch the pdu type, then call the respective function
+  switch(pNfapiMsg->pdu_type) {
+    case NFAPI_NR_UL_CONFIG_PRACH_PDU_TYPE: {
+      if(!unpack_ul_tti_request_prach_pdu(&pNfapiMsg->prach_pdu, ppReadPackedMsg, end))
+        return 0;
+    }
+    break;
+
+    case NFAPI_NR_UL_CONFIG_PUCCH_PDU_TYPE: {
+      if(!unpack_ul_tti_request_pucch_pdu(&pNfapiMsg->pucch_pdu, ppReadPackedMsg, end))
+        return 0;
+    }
+    break;
+
+    case NFAPI_NR_UL_CONFIG_PUSCH_PDU_TYPE: {
+      if(!unpack_ul_tti_request_pusch_pdu(&pNfapiMsg->pusch_pdu, ppReadPackedMsg, end))
+        return 0;
+    }
+    break;
+
+    case NFAPI_NR_UL_CONFIG_SRS_PDU_TYPE: {
+      if(!unpack_ul_tti_request_srs_pdu(&pNfapiMsg->srs_pdu, ppReadPackedMsg, end))
+        return 0;
+    }
+    break;
+
+    default: {
+      NFAPI_TRACE(NFAPI_TRACE_ERROR, "FIXME : Invalid UL_TTI pdu type %d \n", pNfapiMsg->pdu_type );
+    }
+    break;
+  }
+
+  return 1;
+}
+
+
+static uint8_t unpack_ul_tti_groups_list_value(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg) {
+  nfapi_nr_ul_tti_request_number_of_groups_t *pNfapiMsg = (nfapi_nr_ul_tti_request_number_of_groups_t *)msg;
+
+  if(!pull8(ppReadPackedMsg, &pNfapiMsg->n_ue, end))
+    return 0;
+
+  for (int i = 0; i < pNfapiMsg->n_ue; i++) {
+    if(!pull8(ppReadPackedMsg, &pNfapiMsg->ue_list[i].pdu_idx,end) )
+      return 0;
+  }
+
+  return 1;
+}
+
+
+static uint8_t unpack_ul_tti_request(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p7_codec_config_t *config) {
+  nfapi_nr_ul_tti_request_t *pNfapiMsg = (nfapi_nr_ul_tti_request_t *)msg;
+
+  if (!(
+        pull16(ppReadPackedMsg, &pNfapiMsg->SFN, end) &&
+        pull16(ppReadPackedMsg, &pNfapiMsg->Slot, end) &&
+        pull8(ppReadPackedMsg, &pNfapiMsg->n_pdus, end) &&
+        pull8(ppReadPackedMsg, &pNfapiMsg->n_group, end) &&
+        pull8(ppReadPackedMsg, &pNfapiMsg->rach_present, end) &&
+        pull8(ppReadPackedMsg, &pNfapiMsg->n_ulcch, end) &&
+        pull8(ppReadPackedMsg, &pNfapiMsg->n_ulsch, end) ))
+    return 0;
+
+  for(int i=0; i< pNfapiMsg->n_pdus; i++) {
+    if (!unpack_ul_tti_pdu_list_value(ppReadPackedMsg, end, &pNfapiMsg->pdus_list[i]))
+      return 0;
+  }
+
+  for(int i=0; i< pNfapiMsg->n_group; i++) {
+    if (!unpack_ul_tti_groups_list_value(ppReadPackedMsg, end, &pNfapiMsg->groups_list[i]))
+      return 0;
+  }
+
+  return 1;
+}
+
+
+
+static uint8_t unpack_dl_config_request(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p7_codec_config_t *config) {
+  nfapi_dl_config_request_t *pNfapiMsg = (nfapi_dl_config_request_t *)msg;
+  unpack_p7_tlv_t unpack_fns[] = {
+    { NFAPI_DL_CONFIG_REQUEST_BODY_TAG, &pNfapiMsg->dl_config_request_body, &unpack_dl_config_request_body_value},
+  };
+  return ( pull16(ppReadPackedMsg, &pNfapiMsg->sfn_sf, end) &&
+           unpack_p7_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, end, config, &pNfapiMsg->vendor_extension));
+}
+
+static uint8_t unpack_ul_config_ulsch_pdu_rel8_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_ul_config_ulsch_pdu_rel8_t *ulsch_pdu_rel8 = (nfapi_ul_config_ulsch_pdu_rel8_t *)tlv;
+  return (pull32(ppReadPackedMsg, &ulsch_pdu_rel8->handle, end) &&
+          pull16(ppReadPackedMsg, &ulsch_pdu_rel8->size, end) &&
+          pull16(ppReadPackedMsg, &ulsch_pdu_rel8->rnti, end) &&
+          pull8(ppReadPackedMsg, &ulsch_pdu_rel8->resource_block_start, end) &&
+          pull8(ppReadPackedMsg, &ulsch_pdu_rel8->number_of_resource_blocks, end) &&
+          pull8(ppReadPackedMsg, &ulsch_pdu_rel8->modulation_type, end) &&
+          pull8(ppReadPackedMsg, &ulsch_pdu_rel8->cyclic_shift_2_for_drms, end) &&
+          pull8(ppReadPackedMsg, &ulsch_pdu_rel8->frequency_hopping_enabled_flag, end) &&
+          pull8(ppReadPackedMsg, &ulsch_pdu_rel8->frequency_hopping_bits, end) &&
+          pull8(ppReadPackedMsg, &ulsch_pdu_rel8->new_data_indication, end) &&
+          pull8(ppReadPackedMsg, &ulsch_pdu_rel8->redundancy_version, end) &&
+          pull8(ppReadPackedMsg, &ulsch_pdu_rel8->harq_process_number, end) &&
+          pull8(ppReadPackedMsg, &ulsch_pdu_rel8->ul_tx_mode, end) &&
+          pull8(ppReadPackedMsg, &ulsch_pdu_rel8->current_tx_nb, end) &&
+          pull8(ppReadPackedMsg, &ulsch_pdu_rel8->n_srs, end ));
+}
+
+static uint8_t unpack_ul_config_ulsch_pdu_rel10_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_ul_config_ulsch_pdu_rel10_t *ulsch_pdu_rel10 = (nfapi_ul_config_ulsch_pdu_rel10_t *)tlv;
+  return (pull8(ppReadPackedMsg, &ulsch_pdu_rel10->resource_allocation_type, end) &&
+          pull32(ppReadPackedMsg, &ulsch_pdu_rel10->resource_block_coding, end) &&
+          pull8(ppReadPackedMsg, &ulsch_pdu_rel10->transport_blocks, end) &&
+          pull8(ppReadPackedMsg, &ulsch_pdu_rel10->transmission_scheme, end) &&
+          pull8(ppReadPackedMsg, &ulsch_pdu_rel10->number_of_layers, end) &
+          pull8(ppReadPackedMsg, &ulsch_pdu_rel10->codebook_index, end) &&
+          pull8(ppReadPackedMsg, &ulsch_pdu_rel10->disable_sequence_hopping_flag, end));
+}
+static uint8_t unpack_ul_config_ulsch_pdu_rel11_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_ul_config_ulsch_pdu_rel11_t *ulsch_pdu_rel11 = (nfapi_ul_config_ulsch_pdu_rel11_t *)tlv;
+  return ( pull8(ppReadPackedMsg, &ulsch_pdu_rel11->virtual_cell_id_enabled_flag, end) &&
+           pull16(ppReadPackedMsg, &ulsch_pdu_rel11->npusch_identity, end) &&
+           pull8(ppReadPackedMsg, &ulsch_pdu_rel11->dmrs_config_flag, end) &&
+           pull16(ppReadPackedMsg, &ulsch_pdu_rel11->ndmrs_csh_identity, end));
+}
+static uint8_t unpack_ul_config_ulsch_pdu_rel13_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_ul_config_ulsch_pdu_rel13_t *ulsch_pdu_rel13 = (nfapi_ul_config_ulsch_pdu_rel13_t *)tlv;
+  return (pull8(ppReadPackedMsg,  &ulsch_pdu_rel13->ue_type, end) &&
+          pull16(ppReadPackedMsg, &ulsch_pdu_rel13->total_number_of_repetitions, end) &&
+          pull16(ppReadPackedMsg, &ulsch_pdu_rel13->repetition_number, end) &&
+          pull16(ppReadPackedMsg, &ulsch_pdu_rel13->initial_transmission_sf_io, end) &&
+          pull8(ppReadPackedMsg,  &ulsch_pdu_rel13->empty_symbols_due_to_re_tunning, end));
+}
+static uint8_t unpack_ul_config_cqi_ri_info_rel8_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_ul_config_cqi_ri_information_rel8_t *cqi_ri_info_rel8 = (nfapi_ul_config_cqi_ri_information_rel8_t *)tlv;
+  return (pull8(ppReadPackedMsg, &cqi_ri_info_rel8->dl_cqi_pmi_size_rank_1, end) &&
+          pull8(ppReadPackedMsg, &cqi_ri_info_rel8->dl_cqi_pmi_size_rank_greater_1, end) &&
+          pull8(ppReadPackedMsg, &cqi_ri_info_rel8->ri_size, end) &&
+          pull8(ppReadPackedMsg, &cqi_ri_info_rel8->delta_offset_cqi, end) &&
+          pull8(ppReadPackedMsg, &cqi_ri_info_rel8->delta_offset_ri, end));
+}
+
+static uint8_t unpack_ul_config_cqi_ri_info_rel9_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_ul_config_cqi_ri_information_rel9_t *cqi_ri_info_rel9 = (nfapi_ul_config_cqi_ri_information_rel9_t *)tlv;
+
+  if(!(pull8(ppReadPackedMsg, &cqi_ri_info_rel9->report_type, end) &&
+       pull8(ppReadPackedMsg, &cqi_ri_info_rel9->delta_offset_cqi, end) &&
+       pull8(ppReadPackedMsg, &cqi_ri_info_rel9->delta_offset_ri, end)))
+    return 0;
+
+  switch(cqi_ri_info_rel9->report_type) {
+    case NFAPI_CSI_REPORT_TYPE_PERIODIC: {
+      if(!(pull8(ppReadPackedMsg, &cqi_ri_info_rel9->periodic_cqi_pmi_ri_report.dl_cqi_pmi_ri_size, end) &&
+           pull8(ppReadPackedMsg, &cqi_ri_info_rel9->periodic_cqi_pmi_ri_report.control_type, end)))
+        return 0;
+    }
+    break;
+
+    case NFAPI_CSI_REPORT_TYPE_APERIODIC: {
+      if(pull8(ppReadPackedMsg, &cqi_ri_info_rel9->aperiodic_cqi_pmi_ri_report.number_of_cc, end) ==0)
+        return 0;
+
+      uint8_t i;
+
+      for(i = 0; i < cqi_ri_info_rel9->aperiodic_cqi_pmi_ri_report.number_of_cc; ++i) {
+        if(pull8(ppReadPackedMsg, &cqi_ri_info_rel9->aperiodic_cqi_pmi_ri_report.cc[i].ri_size, end) == 0)
+          return 0;
+
+        uint8_t j;
+
+        for(j = 0; j < 8; ++j) {
+          if(pull8(ppReadPackedMsg, &cqi_ri_info_rel9->aperiodic_cqi_pmi_ri_report.cc[i].dl_cqi_pmi_size[j], end) == 0)
+            return 0;
+        }
+      }
+    }
+    break;
+
+    default: {
+      NFAPI_TRACE(NFAPI_TRACE_ERROR, "FIXME : Invalid report type %d \n", cqi_ri_info_rel9->report_type );
+      return 0;
+    }
+    break;
+  };
+
+  return 1;
+}
+
+// NOTE : This function is a little unconventional as we uese the side to
+// determine the report type
+static uint8_t unpack_ul_config_cqi_ri_info_rel13_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_ul_config_cqi_ri_information_rel13_t *cqi_ri_info_rel13 = (nfapi_ul_config_cqi_ri_information_rel13_t *)tlv;
+
+  if(cqi_ri_info_rel13->tl.length == 0) {
+    cqi_ri_info_rel13->report_type = NFAPI_CSI_REPORT_TYPE_APERIODIC;
+  } else {
+    cqi_ri_info_rel13->report_type = NFAPI_CSI_REPORT_TYPE_PERIODIC;
+
+    if(pull16(ppReadPackedMsg, &cqi_ri_info_rel13->periodic_cqi_pmi_ri_report.dl_cqi_pmi_ri_size_2, end) == 0)
+      return 0;
+  }
+
+  return 1;
+}
+static uint8_t unpack_ul_config_cqi_init_tx_params_rel8_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_ul_config_initial_transmission_parameters_rel8_t *init_tx_params_rel8 = (nfapi_ul_config_initial_transmission_parameters_rel8_t *)tlv;
+  return (pull8(ppReadPackedMsg, &init_tx_params_rel8->n_srs_initial, end) &&
+          pull8(ppReadPackedMsg, &init_tx_params_rel8->initial_number_of_resource_blocks, end));
+}
+static uint8_t unpack_ul_config_ulsch_harq_info_rel10_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_ul_config_ulsch_harq_information_rel10_t *harq_info_rel10 = (nfapi_ul_config_ulsch_harq_information_rel10_t *)tlv;
+  return (pull8(ppReadPackedMsg, &harq_info_rel10->harq_size, end) &&
+          pull8(ppReadPackedMsg, &harq_info_rel10->delta_offset_harq, end) &&
+          pull8(ppReadPackedMsg, &harq_info_rel10->ack_nack_mode, end));
+}
+
+static uint8_t unpack_ul_config_ulsch_harq_info_rel13_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_ul_config_ulsch_harq_information_rel13_t *harq_info_rel13 = (nfapi_ul_config_ulsch_harq_information_rel13_t *)tlv;
+  return (pull16(ppReadPackedMsg, &harq_info_rel13->harq_size_2, end) &&
+          pull8(ppReadPackedMsg, &harq_info_rel13->delta_offset_harq_2, end));
+}
+
+static uint8_t unpack_ul_config_ue_info_rel8_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_ul_config_ue_information_rel8_t *ue_info_rel8 = (nfapi_ul_config_ue_information_rel8_t *)tlv;
+  return (pull32(ppReadPackedMsg, &ue_info_rel8->handle, end) &&
+          pull16(ppReadPackedMsg, (uint16_t *)&ue_info_rel8->rnti, end));
+}
+static uint8_t unpack_ul_config_ue_info_rel11_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_ul_config_ue_information_rel11_t *ue_info_rel11 = (nfapi_ul_config_ue_information_rel11_t *)tlv;
+  return (pull8(ppReadPackedMsg, &ue_info_rel11->virtual_cell_id_enabled_flag, end) &&
+          pull16(ppReadPackedMsg, &ue_info_rel11->npusch_identity, end));
+}
+static uint8_t unpack_ul_config_ue_info_rel13_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_ul_config_ue_information_rel13_t *ue_info_rel13 = (nfapi_ul_config_ue_information_rel13_t *)tlv;
+  return (pull8(ppReadPackedMsg, &ue_info_rel13->ue_type, end) &&
+          pull8(ppReadPackedMsg, &ue_info_rel13->empty_symbols, end) &&
+          pull16(ppReadPackedMsg, &ue_info_rel13->total_number_of_repetitions, end) &&
+          pull16(ppReadPackedMsg, &ue_info_rel13->repetition_number, end));
+}
+
+static uint8_t unpack_ul_config_cqi_info_rel8_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_ul_config_cqi_information_rel8_t *cqi_info_rel8 = (nfapi_ul_config_cqi_information_rel8_t *)tlv;
+  return ( pull16(ppReadPackedMsg, &cqi_info_rel8->pucch_index, end) &&
+           pull8(ppReadPackedMsg, &cqi_info_rel8->dl_cqi_pmi_size, end));
+}
+static uint8_t unpack_ul_config_cqi_info_rel10_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_ul_config_cqi_information_rel10_t *cqi_info_rel10 = (nfapi_ul_config_cqi_information_rel10_t *)tlv;
+  return (pull8(ppReadPackedMsg, &cqi_info_rel10->number_of_pucch_resource, end) &&
+          pull16(ppReadPackedMsg, &cqi_info_rel10->pucch_index_p1, end));
+}
+static uint8_t unpack_ul_config_cqi_info_rel13_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_ul_config_cqi_information_rel13_t *cqi_info_rel13 = (nfapi_ul_config_cqi_information_rel13_t *)tlv;
+  return (pull8(ppReadPackedMsg, &cqi_info_rel13->csi_mode, end) &&
+          pull16(ppReadPackedMsg, &cqi_info_rel13->dl_cqi_pmi_size_2, end) &&
+          pull8(ppReadPackedMsg, &cqi_info_rel13->starting_prb, end) &&
+          pull8(ppReadPackedMsg, &cqi_info_rel13->n_prb, end) &&
+          pull8(ppReadPackedMsg, &cqi_info_rel13->cdm_index, end) &&
+          pull8(ppReadPackedMsg, &cqi_info_rel13->n_srs, end));
+}
+
+static uint8_t unpack_ul_config_sr_info_rel8_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_ul_config_sr_information_rel8_t *sr_info_rel8 = (nfapi_ul_config_sr_information_rel8_t *)tlv;
+  return ( pull16(ppReadPackedMsg, &sr_info_rel8->pucch_index, end));
+}
+
+static uint8_t unpack_ul_config_sr_info_rel10_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_ul_config_sr_information_rel10_t *sr_info_rel10 = (nfapi_ul_config_sr_information_rel10_t *)tlv;
+  return (pull8(ppReadPackedMsg, &sr_info_rel10->number_of_pucch_resources, end) &&
+          pull16(ppReadPackedMsg, &sr_info_rel10->pucch_index_p1, end));
+}
+
+static uint8_t unpack_ul_config_harq_info_rel10_tdd_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_ul_config_harq_information_rel10_tdd_t *harq_info_tdd_rel10 = (nfapi_ul_config_harq_information_rel10_tdd_t *)tlv;
+  return (pull8(ppReadPackedMsg, &harq_info_tdd_rel10->harq_size, end) &&
+          pull8(ppReadPackedMsg, &harq_info_tdd_rel10->ack_nack_mode, end) &&
+          pull8(ppReadPackedMsg, &harq_info_tdd_rel10->number_of_pucch_resources, end) &&
+          pull16(ppReadPackedMsg, &harq_info_tdd_rel10->n_pucch_1_0, end) &&
+          pull16(ppReadPackedMsg, &harq_info_tdd_rel10->n_pucch_1_1, end) &&
+          pull16(ppReadPackedMsg, &harq_info_tdd_rel10->n_pucch_1_2, end) &&
+          pull16(ppReadPackedMsg, &harq_info_tdd_rel10->n_pucch_1_3, end));
+}
+
+static uint8_t unpack_ul_config_harq_info_rel8_fdd_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_ul_config_harq_information_rel8_fdd_t *harq_info_fdd_rel8 = (nfapi_ul_config_harq_information_rel8_fdd_t *)tlv;
+  return (pull16(ppReadPackedMsg, &harq_info_fdd_rel8->n_pucch_1_0, end) &&
+          pull8(ppReadPackedMsg, &harq_info_fdd_rel8->harq_size, end));
+}
+
+static uint8_t unpack_ul_config_harq_info_rel9_fdd_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_ul_config_harq_information_rel9_fdd_t *harq_info_fdd_rel9 = (nfapi_ul_config_harq_information_rel9_fdd_t *)tlv;
+  return (pull8(ppReadPackedMsg, &harq_info_fdd_rel9->harq_size, end) &&
+          pull8(ppReadPackedMsg, &harq_info_fdd_rel9->ack_nack_mode, end) &&
+          pull8(ppReadPackedMsg, &harq_info_fdd_rel9->number_of_pucch_resources, end) &&
+          pull16(ppReadPackedMsg, &harq_info_fdd_rel9->n_pucch_1_0, end) &&
+          pull16(ppReadPackedMsg, &harq_info_fdd_rel9->n_pucch_1_1, end) &&
+          pull16(ppReadPackedMsg, &harq_info_fdd_rel9->n_pucch_1_2, end) &&
+          pull16(ppReadPackedMsg, &harq_info_fdd_rel9->n_pucch_1_3, end));
+}
+
+static uint8_t unpack_ul_config_harq_info_rel11_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_ul_config_harq_information_rel11_t *harq_info_rel11 = (nfapi_ul_config_harq_information_rel11_t *)tlv;
+  return (pull8(ppReadPackedMsg, &harq_info_rel11->num_ant_ports, end) &&
+          pull16(ppReadPackedMsg, &harq_info_rel11->n_pucch_2_0, end) &&
+          pull16(ppReadPackedMsg, &harq_info_rel11->n_pucch_2_1, end) &&
+          pull16(ppReadPackedMsg, &harq_info_rel11->n_pucch_2_2, end) &&
+          pull16(ppReadPackedMsg, &harq_info_rel11->n_pucch_2_3, end));
+}
+
+static uint8_t unpack_ul_config_harq_info_rel13_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_ul_config_harq_information_rel13_t *harq_info_rel13 = (nfapi_ul_config_harq_information_rel13_t *)tlv;
+  return (pull16(ppReadPackedMsg, &harq_info_rel13->harq_size_2, end) &&
+          pull8(ppReadPackedMsg, &harq_info_rel13->starting_prb, end) &&
+          pull8(ppReadPackedMsg, &harq_info_rel13->n_prb, end) &&
+          pull8(ppReadPackedMsg, &harq_info_rel13->cdm_index, end) &&
+          pull8(ppReadPackedMsg, &harq_info_rel13->n_srs, end));
+}
+
+
+static uint8_t unpack_ul_config_srs_pdu_rel8_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_ul_config_srs_pdu_rel8_t *srs_pdu_rel8 = (nfapi_ul_config_srs_pdu_rel8_t *)tlv;
+  return (pull32(ppReadPackedMsg, &srs_pdu_rel8->handle, end) &&
+          pull16(ppReadPackedMsg, &srs_pdu_rel8->size, end) &&
+          pull16(ppReadPackedMsg, &srs_pdu_rel8->rnti, end) &&
+          pull8(ppReadPackedMsg, &srs_pdu_rel8->srs_bandwidth, end) &&
+          pull8(ppReadPackedMsg, &srs_pdu_rel8->frequency_domain_position, end) &&
+          pull8(ppReadPackedMsg, &srs_pdu_rel8->srs_hopping_bandwidth, end) &&
+          pull8(ppReadPackedMsg, &srs_pdu_rel8->transmission_comb, end) &&
+          pull16(ppReadPackedMsg, &srs_pdu_rel8->i_srs, end) &&
+          pull8(ppReadPackedMsg, &srs_pdu_rel8->sounding_reference_cyclic_shift, end));
+}
+
+static uint8_t unpack_ul_config_srs_pdu_rel10_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_ul_config_srs_pdu_rel10_t *srs_pdu_rel10 = (nfapi_ul_config_srs_pdu_rel10_t *)tlv;
+  return pull8(ppReadPackedMsg, &srs_pdu_rel10->antenna_port, end);
+}
+
+static uint8_t unpack_ul_config_srs_pdu_rel13_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_ul_config_srs_pdu_rel13_t *srs_pdu_rel13 = (nfapi_ul_config_srs_pdu_rel13_t *)tlv;
+  return (pull8(ppReadPackedMsg, &srs_pdu_rel13->number_of_combs, end));
+}
+
+static uint8_t unpack_ul_nb_harq_info_rel13_fdd_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_ul_config_nb_harq_information_rel13_fdd_t *nb_harq_info_fdd_rel13 = (nfapi_ul_config_nb_harq_information_rel13_fdd_t *)tlv;
+  return (pull8(ppReadPackedMsg, &nb_harq_info_fdd_rel13->harq_ack_resource, end));
+}
+
+static uint8_t unpack_ul_config_nulsch_pdu_rel13_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_ul_config_nulsch_pdu_rel13_t *nulsch_pdu_rel13 = (nfapi_ul_config_nulsch_pdu_rel13_t *)tlv;
+
+  if(!(pull8(ppReadPackedMsg, &nulsch_pdu_rel13->nulsch_format, end) &&
+       pull32(ppReadPackedMsg, &nulsch_pdu_rel13->handle, end) &&
+       pull16(ppReadPackedMsg, &nulsch_pdu_rel13->size, end) &&
+       pull16(ppReadPackedMsg, &nulsch_pdu_rel13->rnti, end) &&
+       pull8(ppReadPackedMsg, &nulsch_pdu_rel13->subcarrier_indication, end) &&
+       pull8(ppReadPackedMsg, &nulsch_pdu_rel13->resource_assignment, end) &&
+       pull8(ppReadPackedMsg, &nulsch_pdu_rel13->mcs, end) &&
+       pull8(ppReadPackedMsg, &nulsch_pdu_rel13->redudancy_version, end) &&
+       pull8(ppReadPackedMsg, &nulsch_pdu_rel13->repetition_number, end) &&
+       pull8(ppReadPackedMsg, &nulsch_pdu_rel13->new_data_indication, end) &&
+       pull8(ppReadPackedMsg, &nulsch_pdu_rel13->n_srs, end) &&
+       pull16(ppReadPackedMsg, &nulsch_pdu_rel13->scrambling_sequence_initialization_cinit, end) &&
+       pull16(ppReadPackedMsg, &nulsch_pdu_rel13->sf_idx, end)))
+    return 0;
+
+  unpack_tlv_t unpack_fns[] = {
+    { NFAPI_UL_CONFIG_REQUEST_UE_INFORMATION_REL8_TAG, &nulsch_pdu_rel13->ue_information.ue_information_rel8, &unpack_ul_config_ue_info_rel8_value},
+    { NFAPI_UL_CONFIG_REQUEST_UE_INFORMATION_REL11_TAG, &nulsch_pdu_rel13->ue_information.ue_information_rel11, &unpack_ul_config_ue_info_rel11_value},
+    { NFAPI_UL_CONFIG_REQUEST_UE_INFORMATION_REL13_TAG, &nulsch_pdu_rel13->ue_information.ue_information_rel13, &unpack_ul_config_ue_info_rel13_value},
+    { NFAPI_UL_CONFIG_REQUEST_NB_HARQ_INFORMATION_REL13_FDD_TAG, &nulsch_pdu_rel13->nb_harq_information.nb_harq_information_rel13_fdd, &unpack_ul_nb_harq_info_rel13_fdd_value},
+  };
+  return unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, end, 0, 0);
+}
+
+static uint8_t unpack_ul_config_nrach_pdu_rel13_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_ul_config_nrach_pdu_rel13_t *nrach_pdu_rel13 = (nfapi_ul_config_nrach_pdu_rel13_t *)tlv;
+  return (pull8(ppReadPackedMsg, &nrach_pdu_rel13->nprach_config_0, end) &&
+          pull8(ppReadPackedMsg, &nrach_pdu_rel13->nprach_config_1, end) &&
+          pull8(ppReadPackedMsg, &nrach_pdu_rel13->nprach_config_2, end));
+}
+
+
+static uint8_t unpack_ul_config_request_body_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end, nfapi_p7_codec_config_t *config) {
+#define UL_CONFIG_ULSCH_PDU_UNPACK_FNS(_pdu) \
+  { NFAPI_UL_CONFIG_REQUEST_ULSCH_PDU_REL8_TAG, &_pdu.ulsch_pdu_rel8, &unpack_ul_config_ulsch_pdu_rel8_value}, \
+  { NFAPI_UL_CONFIG_REQUEST_ULSCH_PDU_REL10_TAG, &_pdu.ulsch_pdu_rel10, &unpack_ul_config_ulsch_pdu_rel10_value}, \
+  { NFAPI_UL_CONFIG_REQUEST_ULSCH_PDU_REL11_TAG, &_pdu.ulsch_pdu_rel11, &unpack_ul_config_ulsch_pdu_rel11_value}, \
+  { NFAPI_UL_CONFIG_REQUEST_ULSCH_PDU_REL13_TAG, &_pdu.ulsch_pdu_rel13, &unpack_ul_config_ulsch_pdu_rel13_value},
+#define UL_CONFIG_CQI_RI_INFO_UNPACK_FNS(_pdu) \
+  { NFAPI_UL_CONFIG_REQUEST_CQI_RI_INFORMATION_REL8_TAG, &_pdu.cqi_ri_information_rel8, &unpack_ul_config_cqi_ri_info_rel8_value}, \
+  { NFAPI_UL_CONFIG_REQUEST_CQI_RI_INFORMATION_REL9_TAG, &_pdu.cqi_ri_information_rel9, &unpack_ul_config_cqi_ri_info_rel9_value}, \
+  { NFAPI_UL_CONFIG_REQUEST_CQI_RI_INFORMATION_REL13_TAG, &_pdu.cqi_ri_information_rel13, &unpack_ul_config_cqi_ri_info_rel13_value},
+#define UL_CONFIG_ULSCH_HARQ_INFO_UNPACK_FNS(_pdu) \
+  { NFAPI_UL_CONFIG_REQUEST_ULSCH_HARQ_INFORMATION_REL10_TAG, &_pdu.harq_information_rel10, &unpack_ul_config_ulsch_harq_info_rel10_value},\
+  { NFAPI_UL_CONFIG_REQUEST_ULSCH_HARQ_INFORMATION_REL13_TAG, &_pdu.harq_information_rel13, &unpack_ul_config_ulsch_harq_info_rel13_value},
+#define UL_CONFIG_INIT_TX_PARAMS_UNPACK_FNS(_pdu) \
+  { NFAPI_UL_CONFIG_REQUEST_INITIAL_TRANSMISSION_PARAMETERS_REL8_TAG, &_pdu.initial_transmission_parameters_rel8, &unpack_ul_config_cqi_init_tx_params_rel8_value},
+#define UL_CONFIG_UCI_UE_INFO_UNPACK_FNS(_pdu) \
+  { NFAPI_UL_CONFIG_REQUEST_UE_INFORMATION_REL8_TAG, &_pdu.ue_information_rel8, &unpack_ul_config_ue_info_rel8_value}, \
+  { NFAPI_UL_CONFIG_REQUEST_UE_INFORMATION_REL11_TAG, &_pdu.ue_information_rel11, &unpack_ul_config_ue_info_rel11_value}, \
+  { NFAPI_UL_CONFIG_REQUEST_UE_INFORMATION_REL13_TAG, &_pdu.ue_information_rel13, &unpack_ul_config_ue_info_rel13_value},
+#define UL_CONFIG_UCI_CQI_INFO_UNPACK_FNS(_pdu) \
+  { NFAPI_UL_CONFIG_REQUEST_CQI_INFORMATION_REL8_TAG, &_pdu.cqi_information_rel8, &unpack_ul_config_cqi_info_rel8_value}, \
+  { NFAPI_UL_CONFIG_REQUEST_CQI_INFORMATION_REL10_TAG, &_pdu.cqi_information_rel10, &unpack_ul_config_cqi_info_rel10_value}, \
+  { NFAPI_UL_CONFIG_REQUEST_CQI_INFORMATION_REL13_TAG, &_pdu.cqi_information_rel13, &unpack_ul_config_cqi_info_rel13_value},
+#define UL_CONFIG_UCI_SR_INFO_UNPACK_FNS(_pdu) \
+  { NFAPI_UL_CONFIG_REQUEST_SR_INFORMATION_REL8_TAG, &_pdu.sr_information_rel8, &unpack_ul_config_sr_info_rel8_value}, \
+  { NFAPI_UL_CONFIG_REQUEST_SR_INFORMATION_REL10_TAG, &_pdu.sr_information_rel10, &unpack_ul_config_sr_info_rel10_value},
+#define UL_CONFIG_UCI_HARQ_INFO_UNPACK_FNS(_pdu) \
+  { NFAPI_UL_CONFIG_REQUEST_HARQ_INFORMATION_REL10_TDD_TAG, &_pdu.harq_information_rel10_tdd, &unpack_ul_config_harq_info_rel10_tdd_value}, \
+  { NFAPI_UL_CONFIG_REQUEST_HARQ_INFORMATION_REL8_FDD_TAG, &_pdu.harq_information_rel8_fdd, &unpack_ul_config_harq_info_rel8_fdd_value}, \
+  { NFAPI_UL_CONFIG_REQUEST_HARQ_INFORMATION_REL9_FDD_TAG, &_pdu.harq_information_rel9_fdd, &unpack_ul_config_harq_info_rel9_fdd_value}, \
+  { NFAPI_UL_CONFIG_REQUEST_HARQ_INFORMATION_REL11_TAG, &_pdu.harq_information_rel11, &unpack_ul_config_harq_info_rel11_value}, \
+  { NFAPI_UL_CONFIG_REQUEST_HARQ_INFORMATION_REL13_TAG, &_pdu.harq_information_rel13, &unpack_ul_config_harq_info_rel13_value},
+#define UL_CONFIG_SRS_PDU_UNPACK_FNS(_pdu) \
+  { NFAPI_UL_CONFIG_REQUEST_SRS_PDU_REL8_TAG, &_pdu.srs_pdu_rel8, &unpack_ul_config_srs_pdu_rel8_value}, \
+  { NFAPI_UL_CONFIG_REQUEST_SRS_PDU_REL10_TAG, &_pdu.srs_pdu_rel10, &unpack_ul_config_srs_pdu_rel10_value}, \
+  { NFAPI_UL_CONFIG_REQUEST_SRS_PDU_REL13_TAG, &_pdu.srs_pdu_rel13, &unpack_ul_config_srs_pdu_rel13_value},
+#define UL_CONFIG_NULSCH_PDU_UNPACK_FNS(_pdu) \
+  { NFAPI_UL_CONFIG_REQUEST_NULSCH_PDU_REL13_TAG, &_pdu.nulsch_pdu_rel13, &unpack_ul_config_nulsch_pdu_rel13_value},
+#define UL_CONFIG_NRACH_PDU_UNPACK_FNS(_pdu) \
+  { NFAPI_UL_CONFIG_REQUEST_NRACH_PDU_REL13_TAG, &_pdu.nrach_pdu_rel13, &unpack_ul_config_nrach_pdu_rel13_value},
+  nfapi_ul_config_request_body_t *value = (nfapi_ul_config_request_body_t *)tlv;
+
+  if(!(pull8(ppReadPackedMsg, &value->number_of_pdus, end) &&
+       pull8(ppReadPackedMsg, &value->rach_prach_frequency_resources, end) &&
+       pull8(ppReadPackedMsg, &value->srs_present, end)))
+    return 0;
+
+  if(value->number_of_pdus > NFAPI_UL_CONFIG_MAX_PDU) {
+    NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s number of ul config pdus exceed maxium (count:%d max:%d)\n", __FUNCTION__, value->number_of_pdus, NFAPI_UL_CONFIG_MAX_PDU);
+    return 0;
+  }
+
+  if(value->number_of_pdus > 0) {
+    value->ul_config_pdu_list = (nfapi_ul_config_request_pdu_t *)nfapi_p7_allocate(sizeof(nfapi_ul_config_request_pdu_t) * value->number_of_pdus, config);
+
+    if(value->ul_config_pdu_list == NULL) {
+      NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s failed to allocate ul config pdu list (count:%d)\n", __FUNCTION__, value->number_of_pdus);
+      return 0;
+    }
+  } else {
+    value->ul_config_pdu_list = 0;
+  }
+
+  uint16_t i;
+  uint16_t total_number_of_pdus = value->number_of_pdus;
+
+  for(i = 0; i < total_number_of_pdus; ++i) {
+    nfapi_ul_config_request_pdu_t *pdu = &(value->ul_config_pdu_list[i]);
+
+    if(!(pull8(ppReadPackedMsg, &pdu->pdu_type, end) &&
+         pull8(ppReadPackedMsg, &pdu->pdu_size, end)))
+      return 0;
+
+    uint8_t *packedPduEnd = (*ppReadPackedMsg) + pdu->pdu_size - 2;
+
+    if(packedPduEnd > end) {
+      // pdu end is past buffer end
+      return 0;
+    }
+
+    switch(pdu->pdu_type) {
+      case NFAPI_UL_CONFIG_ULSCH_PDU_TYPE: {
+        unpack_tlv_t unpack_fns[] = {
+          UL_CONFIG_ULSCH_PDU_UNPACK_FNS(pdu->ulsch_pdu)
+        };
+        unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0);
+      }
+      break;
+
+      case NFAPI_UL_CONFIG_ULSCH_CQI_RI_PDU_TYPE: {
+        unpack_tlv_t unpack_fns[] = {
+          UL_CONFIG_ULSCH_PDU_UNPACK_FNS(pdu->ulsch_cqi_ri_pdu.ulsch_pdu)
+          UL_CONFIG_CQI_RI_INFO_UNPACK_FNS(pdu->ulsch_cqi_ri_pdu.cqi_ri_information)
+          UL_CONFIG_INIT_TX_PARAMS_UNPACK_FNS(pdu->ulsch_cqi_ri_pdu.initial_transmission_parameters)
+        };
+        unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0);
+      }
+      break;
+
+      case NFAPI_UL_CONFIG_ULSCH_HARQ_PDU_TYPE: {
+        unpack_tlv_t unpack_fns[] = {
+          UL_CONFIG_ULSCH_PDU_UNPACK_FNS(pdu->ulsch_harq_pdu.ulsch_pdu)
+          UL_CONFIG_ULSCH_HARQ_INFO_UNPACK_FNS(pdu->ulsch_harq_pdu.harq_information)
+          UL_CONFIG_INIT_TX_PARAMS_UNPACK_FNS(pdu->ulsch_harq_pdu.initial_transmission_parameters)
+        };
+        unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0);
+      }
+      break;
+
+      case NFAPI_UL_CONFIG_ULSCH_CQI_HARQ_RI_PDU_TYPE: {
+        unpack_tlv_t unpack_fns[] = {
+          UL_CONFIG_ULSCH_PDU_UNPACK_FNS(pdu->ulsch_cqi_harq_ri_pdu.ulsch_pdu)
+          UL_CONFIG_CQI_RI_INFO_UNPACK_FNS(pdu->ulsch_cqi_harq_ri_pdu.cqi_ri_information)
+          UL_CONFIG_ULSCH_HARQ_INFO_UNPACK_FNS(pdu->ulsch_cqi_harq_ri_pdu.harq_information)
+          UL_CONFIG_INIT_TX_PARAMS_UNPACK_FNS(pdu->ulsch_cqi_harq_ri_pdu.initial_transmission_parameters)
+        };
+        unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0);
+      }
+      break;
+
+      case NFAPI_UL_CONFIG_UCI_CQI_PDU_TYPE: {
+        unpack_tlv_t unpack_fns[] = {
+          UL_CONFIG_UCI_UE_INFO_UNPACK_FNS(pdu->uci_cqi_pdu.ue_information)
+          UL_CONFIG_UCI_CQI_INFO_UNPACK_FNS(pdu->uci_cqi_pdu.cqi_information)
+        };
+        unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0);
+      }
+      break;
+
+      case NFAPI_UL_CONFIG_UCI_SR_PDU_TYPE: {
+        unpack_tlv_t unpack_fns[] = {
+          UL_CONFIG_UCI_UE_INFO_UNPACK_FNS(pdu->uci_sr_pdu.ue_information)
+          UL_CONFIG_UCI_SR_INFO_UNPACK_FNS(pdu->uci_sr_pdu.sr_information)
+        };
+        unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0);
+      }
+      break;
+
+      case NFAPI_UL_CONFIG_UCI_HARQ_PDU_TYPE: {
+        unpack_tlv_t unpack_fns[] = {
+          UL_CONFIG_UCI_UE_INFO_UNPACK_FNS(pdu->uci_harq_pdu.ue_information)
+          UL_CONFIG_UCI_HARQ_INFO_UNPACK_FNS(pdu->uci_harq_pdu.harq_information)
+        };
+        unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0);
+      }
+      break;
+
+      case NFAPI_UL_CONFIG_UCI_SR_HARQ_PDU_TYPE: {
+        unpack_tlv_t unpack_fns[] = {
+          UL_CONFIG_UCI_UE_INFO_UNPACK_FNS(pdu->uci_sr_harq_pdu.ue_information)
+          UL_CONFIG_UCI_SR_INFO_UNPACK_FNS(pdu->uci_sr_harq_pdu.sr_information)
+          UL_CONFIG_UCI_HARQ_INFO_UNPACK_FNS(pdu->uci_sr_harq_pdu.harq_information)
+        };
+        unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0);
+      }
+      break;
+
+      case NFAPI_UL_CONFIG_UCI_CQI_HARQ_PDU_TYPE: {
+        unpack_tlv_t unpack_fns[] = {
+          UL_CONFIG_UCI_UE_INFO_UNPACK_FNS(pdu->uci_cqi_harq_pdu.ue_information)
+          UL_CONFIG_UCI_CQI_INFO_UNPACK_FNS(pdu->uci_cqi_harq_pdu.cqi_information)
+          UL_CONFIG_UCI_HARQ_INFO_UNPACK_FNS(pdu->uci_cqi_harq_pdu.harq_information)
+        };
+        unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0);
+      }
+      break;
+
+      case NFAPI_UL_CONFIG_UCI_CQI_SR_PDU_TYPE: {
+        unpack_tlv_t unpack_fns[] = {
+          UL_CONFIG_UCI_UE_INFO_UNPACK_FNS(pdu->uci_cqi_sr_pdu.ue_information)
+          UL_CONFIG_UCI_CQI_INFO_UNPACK_FNS(pdu->uci_cqi_sr_pdu.cqi_information)
+          UL_CONFIG_UCI_SR_INFO_UNPACK_FNS(pdu->uci_cqi_sr_pdu.sr_information)
+        };
+        unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0);
+      }
+      break;
+
+      case NFAPI_UL_CONFIG_UCI_CQI_SR_HARQ_PDU_TYPE: {
+        unpack_tlv_t unpack_fns[] = {
+          UL_CONFIG_UCI_UE_INFO_UNPACK_FNS(pdu->uci_cqi_sr_harq_pdu.ue_information)
+          UL_CONFIG_UCI_CQI_INFO_UNPACK_FNS(pdu->uci_cqi_sr_harq_pdu.cqi_information)
+          UL_CONFIG_UCI_SR_INFO_UNPACK_FNS(pdu->uci_cqi_sr_harq_pdu.sr_information)
+          UL_CONFIG_UCI_HARQ_INFO_UNPACK_FNS(pdu->uci_cqi_sr_harq_pdu.harq_information)
+        };
+        unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0);
+      }
+      break;
+
+      case NFAPI_UL_CONFIG_SRS_PDU_TYPE: {
+        unpack_tlv_t unpack_fns[] = {
+          UL_CONFIG_SRS_PDU_UNPACK_FNS(pdu->srs_pdu)
+        };
+        unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0);
+      }
+      break;
+
+      case NFAPI_UL_CONFIG_HARQ_BUFFER_PDU_TYPE: {
+        unpack_tlv_t unpack_fns[] = {
+          UL_CONFIG_UCI_UE_INFO_UNPACK_FNS(pdu->harq_buffer_pdu.ue_information)
+        };
+        unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0);
+      }
+      break;
+
+      case NFAPI_UL_CONFIG_ULSCH_UCI_CSI_PDU_TYPE: {
+        unpack_tlv_t unpack_fns[] = {
+          UL_CONFIG_ULSCH_PDU_UNPACK_FNS(pdu->ulsch_uci_csi_pdu.ulsch_pdu)
+          UL_CONFIG_UCI_CQI_INFO_UNPACK_FNS(pdu->ulsch_uci_csi_pdu.csi_information)
+        };
+        unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0);
+      }
+      break;
+
+      case NFAPI_UL_CONFIG_ULSCH_UCI_HARQ_PDU_TYPE: {
+        unpack_tlv_t unpack_fns[] = {
+          UL_CONFIG_ULSCH_PDU_UNPACK_FNS(pdu->ulsch_uci_harq_pdu.ulsch_pdu)
+          UL_CONFIG_UCI_HARQ_INFO_UNPACK_FNS(pdu->ulsch_uci_harq_pdu.harq_information)
+        };
+        unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0);
+      }
+      break;
+
+      case NFAPI_UL_CONFIG_ULSCH_CSI_UCI_HARQ_PDU_TYPE: {
+        unpack_tlv_t unpack_fns[] = {
+          UL_CONFIG_ULSCH_PDU_UNPACK_FNS(pdu->ulsch_csi_uci_harq_pdu.ulsch_pdu)
+          UL_CONFIG_UCI_CQI_INFO_UNPACK_FNS(pdu->ulsch_csi_uci_harq_pdu.csi_information)
+          UL_CONFIG_UCI_HARQ_INFO_UNPACK_FNS(pdu->ulsch_csi_uci_harq_pdu.harq_information)
+        };
+        unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0);
+      }
+      break;
+
+      case NFAPI_UL_CONFIG_NULSCH_PDU_TYPE: {
+        unpack_tlv_t unpack_fns[] = {
+          UL_CONFIG_NULSCH_PDU_UNPACK_FNS(pdu->nulsch_pdu)
+        };
+        unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0);
+      }
+      break;
+
+      case NFAPI_UL_CONFIG_NRACH_PDU_TYPE: {
+        unpack_tlv_t unpack_fns[] = {
+          UL_CONFIG_NRACH_PDU_UNPACK_FNS(pdu->nrach_pdu)
+        };
+        unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0);
+      }
+      break;
+    }
+  }
+
+  return 1;
+}
+
+
+static uint8_t unpack_ul_config_request(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p7_codec_config_t *config) {
+  nfapi_ul_config_request_t *pNfapiMsg = (nfapi_ul_config_request_t *)msg;
+  unpack_p7_tlv_t unpack_fns[] = {
+    { NFAPI_UL_CONFIG_REQUEST_BODY_TAG, &pNfapiMsg->ul_config_request_body, &unpack_ul_config_request_body_value},
+  };
+  return (pull16(ppReadPackedMsg, &pNfapiMsg->sfn_sf, end) &&
+          unpack_p7_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, end, config, &pNfapiMsg->vendor_extension));
+}
+
+static uint8_t unpack_hi_dci0_hi_pdu_rel8_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_hi_dci0_hi_pdu_rel8_t *hi_pdu_rel8 = (nfapi_hi_dci0_hi_pdu_rel8_t *)tlv;
+  return( pull8(ppReadPackedMsg, &hi_pdu_rel8->resource_block_start, end) &&
+          pull8(ppReadPackedMsg, &hi_pdu_rel8->cyclic_shift_2_for_drms, end) &&
+          pull8(ppReadPackedMsg, &hi_pdu_rel8->hi_value, end) &&
+          pull8(ppReadPackedMsg, &hi_pdu_rel8->i_phich, end) &&
+          pull16(ppReadPackedMsg, &hi_pdu_rel8->transmission_power, end));
+}
+
+static uint8_t unpack_hi_dci0_hi_pdu_rel10_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_hi_dci0_hi_pdu_rel10_t *hi_pdu_rel10 = (nfapi_hi_dci0_hi_pdu_rel10_t *)tlv;
+  return (pull8(ppReadPackedMsg, &hi_pdu_rel10->flag_tb2, end) &&
+          pull8(ppReadPackedMsg, &hi_pdu_rel10->hi_value_2, end));
+}
+
+static uint8_t unpack_hi_dci0_dci_pdu_rel8_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_hi_dci0_dci_pdu_rel8_t *dci_pdu_rel8 = (nfapi_hi_dci0_dci_pdu_rel8_t *)tlv;
+  return (pull8(ppReadPackedMsg, &dci_pdu_rel8->dci_format, end) &&
+          pull8(ppReadPackedMsg, &dci_pdu_rel8->cce_index, end) &&
+          pull8(ppReadPackedMsg, &dci_pdu_rel8->aggregation_level, end) &&
+          pull16(ppReadPackedMsg, &dci_pdu_rel8->rnti, end) &&
+          pull8(ppReadPackedMsg, &dci_pdu_rel8->resource_block_start, end) &&
+          pull8(ppReadPackedMsg, &dci_pdu_rel8->number_of_resource_block, end) &&
+          pull8(ppReadPackedMsg, &dci_pdu_rel8->mcs_1, end) &&
+          pull8(ppReadPackedMsg, &dci_pdu_rel8->cyclic_shift_2_for_drms, end) &&
+          pull8(ppReadPackedMsg, &dci_pdu_rel8->frequency_hopping_enabled_flag, end) &&
+          pull8(ppReadPackedMsg, &dci_pdu_rel8->frequency_hopping_bits, end) &&
+          pull8(ppReadPackedMsg, &dci_pdu_rel8->new_data_indication_1, end) &&
+          pull8(ppReadPackedMsg, &dci_pdu_rel8->ue_tx_antenna_seleciton, end) &&
+          pull8(ppReadPackedMsg, &dci_pdu_rel8->tpc, end) &&
+          pull8(ppReadPackedMsg, &dci_pdu_rel8->cqi_csi_request, end) &&
+          pull8(ppReadPackedMsg, &dci_pdu_rel8->ul_index, end) &&
+          pull8(ppReadPackedMsg, &dci_pdu_rel8->dl_assignment_index, end) &&
+          pull32(ppReadPackedMsg, &dci_pdu_rel8->tpc_bitmap, end) &&
+          pull16(ppReadPackedMsg, &dci_pdu_rel8->transmission_power, end));
+}
+
+static uint8_t unpack_hi_dci0_dci_pdu_rel10_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_hi_dci0_dci_pdu_rel10_t *dci_pdu_rel10 = (nfapi_hi_dci0_dci_pdu_rel10_t *)tlv;
+  return (pull8(ppReadPackedMsg, &dci_pdu_rel10->cross_carrier_scheduling_flag, end) &&
+          pull8(ppReadPackedMsg, &dci_pdu_rel10->carrier_indicator, end) &&
+          pull8(ppReadPackedMsg, &dci_pdu_rel10->size_of_cqi_csi_feild, end) &&
+          pull8(ppReadPackedMsg, &dci_pdu_rel10->srs_flag, end) &&
+          pull8(ppReadPackedMsg, &dci_pdu_rel10->srs_request, end) &&
+          pull8(ppReadPackedMsg, &dci_pdu_rel10->resource_allocation_flag, end) &&
+          pull8(ppReadPackedMsg, &dci_pdu_rel10->resource_allocation_type, end) &&
+          pull32(ppReadPackedMsg, &dci_pdu_rel10->resource_block_coding, end) &&
+          pull8(ppReadPackedMsg, &dci_pdu_rel10->mcs_2, end) &&
+          pull8(ppReadPackedMsg, &dci_pdu_rel10->new_data_indication_2, end) &&
+          pull8(ppReadPackedMsg, &dci_pdu_rel10->number_of_antenna_ports, end) &&
+          pull8(ppReadPackedMsg, &dci_pdu_rel10->tpmi, end) &&
+          pull8(ppReadPackedMsg, &dci_pdu_rel10->total_dci_length_including_padding, end) &&
+          pull8(ppReadPackedMsg, &dci_pdu_rel10->n_ul_rb, end));
+}
+
+static uint8_t unpack_hi_dci0_dci_pdu_rel12_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_hi_dci0_dci_pdu_rel12_t *dci_pdu_rel12 = (nfapi_hi_dci0_dci_pdu_rel12_t *)tlv;
+  return ( pull8(ppReadPackedMsg, &dci_pdu_rel12->pscch_resource, end) &&
+           pull8(ppReadPackedMsg, &dci_pdu_rel12->time_resource_pattern, end));
+}
+
+static uint8_t unpack_hi_dci0_mpdcch_dci_pdu_rel13_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_hi_dci0_mpdcch_dci_pdu_rel13_t *value = (nfapi_hi_dci0_mpdcch_dci_pdu_rel13_t *)tlv;
+  return (pull8(ppReadPackedMsg, &value->mpdcch_narrowband, end) &&
+          pull8(ppReadPackedMsg, &value->number_of_prb_pairs, end) &&
+          pull8(ppReadPackedMsg, &value->resource_block_assignment, end) &&
+          pull8(ppReadPackedMsg, &value->mpdcch_transmission_type, end) &&
+          pull8(ppReadPackedMsg, &value->start_symbol, end) &&
+          pull8(ppReadPackedMsg, &value->ecce_index, end) &&
+          pull8(ppReadPackedMsg, &value->aggreagation_level, end) &&
+          pull8(ppReadPackedMsg, &value->rnti_type, end) &&
+          pull16(ppReadPackedMsg, &value->rnti, end) &&
+          pull8(ppReadPackedMsg, &value->ce_mode, end) &&
+          pull16(ppReadPackedMsg, &value->drms_scrambling_init, end) &&
+          pull16(ppReadPackedMsg, &value->initial_transmission_sf_io, end) &&
+          pull16(ppReadPackedMsg, &value->transmission_power, end) &&
+          pull8(ppReadPackedMsg, &value->dci_format, end) &&
+          pull8(ppReadPackedMsg, &value->resource_block_start, end) &&
+          pull8(ppReadPackedMsg, &value->number_of_resource_blocks, end) &&
+          pull8(ppReadPackedMsg, &value->mcs, end) &&
+          pull8(ppReadPackedMsg, &value->pusch_repetition_levels, end) &&
+          pull8(ppReadPackedMsg, &value->frequency_hopping_flag, end) &&
+          pull8(ppReadPackedMsg, &value->new_data_indication, end) &&
+          pull8(ppReadPackedMsg, &value->harq_process, end) &&
+          pull8(ppReadPackedMsg, &value->redudency_version, end) &&
+          pull8(ppReadPackedMsg, &value->tpc, end) &&
+          pull8(ppReadPackedMsg, &value->csi_request, end) &&
+          pull8(ppReadPackedMsg, &value->ul_inex, end) &&
+          pull8(ppReadPackedMsg, &value->dai_presence_flag, end) &&
+          pull8(ppReadPackedMsg, &value->dl_assignment_index, end) &&
+          pull8(ppReadPackedMsg, &value->srs_request, end) &&
+          pull8(ppReadPackedMsg, &value->dci_subframe_repetition_number, end) &&
+          pull32(ppReadPackedMsg, &value->tcp_bitmap, end) &&
+          pull8(ppReadPackedMsg, &value->total_dci_length_include_padding, end) &&
+          pull8(ppReadPackedMsg, &value->number_of_tx_antenna_ports, end) &&
+          pullarray16(ppReadPackedMsg, value->precoding_value, NFAPI_MAX_TX_PHYSICAL_ANTENNA_PORTS, value->number_of_tx_antenna_ports, end));
+}
+
+static uint8_t unpack_hi_dci0_npdcch_dci_pdu_rel13_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_hi_dci0_npdcch_dci_pdu_rel13_t *value = (nfapi_hi_dci0_npdcch_dci_pdu_rel13_t *)tlv;
+  return (pull8(ppReadPackedMsg, &value->ncce_index, end) &&
+          pull8(ppReadPackedMsg, &value->aggregation_level, end) &&
+          pull8(ppReadPackedMsg, &value->start_symbol, end) &&
+          pull16(ppReadPackedMsg, &value->rnti, end) &&
+          pull8(ppReadPackedMsg, &value->scrambling_reinitialization_batch_index, end) &&
+          pull8(ppReadPackedMsg, &value->nrs_antenna_ports_assumed_by_the_ue, end) &&
+          pull8(ppReadPackedMsg, &value->subcarrier_indication, end) &&
+          pull8(ppReadPackedMsg, &value->resource_assignment, end) &&
+          pull8(ppReadPackedMsg, &value->scheduling_delay, end) &&
+          pull8(ppReadPackedMsg, &value->mcs, end) &&
+          pull8(ppReadPackedMsg, &value->redudancy_version, end) &&
+          pull8(ppReadPackedMsg, &value->repetition_number, end) &&
+          pull8(ppReadPackedMsg, &value->new_data_indicator, end) &&
+          pull8(ppReadPackedMsg, &value->dci_subframe_repetition_number, end));
+}
+
+static uint8_t unpack_hi_dci0_request_body_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end, nfapi_p7_codec_config_t *config) {
+  nfapi_hi_dci0_request_body_t *value = (nfapi_hi_dci0_request_body_t *)tlv;
+
+  if(!(pull16(ppReadPackedMsg, &value->sfnsf, end) &&
+       pull8(ppReadPackedMsg, &value->number_of_dci, end) &&
+       pull8(ppReadPackedMsg, &value->number_of_hi, end)))
+    return 0;
+
+  uint8_t totalNumPdus = value->number_of_hi + value->number_of_dci;
+
+  if(totalNumPdus > NFAPI_HI_DCI0_MAX_PDU) {
+    NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s number of dci0 pdu's exceed maxium (count:%d max:%d)\n", __FUNCTION__, totalNumPdus, NFAPI_HI_DCI0_MAX_PDU);
+    return 0;
+  }
+
+  if(totalNumPdus > 0) {
+    value->hi_dci0_pdu_list = (nfapi_hi_dci0_request_pdu_t *)nfapi_p7_allocate(sizeof(nfapi_hi_dci0_request_pdu_t) * totalNumPdus, config);
+
+    if(value->hi_dci0_pdu_list == NULL) {
+      NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s failed to allocate hi dci0 pdu list (count:%d)\n", __FUNCTION__, totalNumPdus);
+      return 0;
+    }
+  } else {
+    value->hi_dci0_pdu_list = 0;
+  }
+
+  uint8_t i;
+
+  for(i = 0; i < totalNumPdus; ++i) {
+    nfapi_hi_dci0_request_pdu_t *pdu = &(value->hi_dci0_pdu_list[i]);
+
+    if(!(pull8(ppReadPackedMsg, &pdu->pdu_type, end) &&
+         pull8(ppReadPackedMsg, &pdu->pdu_size, end)))
+      return 0;
+
+    uint8_t *packedPduEnd = (*ppReadPackedMsg) + pdu->pdu_size - 2;
+
+    if(packedPduEnd > end) {
+      // pdu end if past buffer end
+      NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s pdu size to big %d %d\n", __FUNCTION__, packedPduEnd, end);
+      return 0;
+    }
+
+    switch(pdu->pdu_type) {
+      case NFAPI_HI_DCI0_HI_PDU_TYPE: {
+        unpack_tlv_t unpack_fns[] = {
+          { NFAPI_HI_DCI0_REQUEST_HI_PDU_REL8_TAG, &pdu->hi_pdu.hi_pdu_rel8, &unpack_hi_dci0_hi_pdu_rel8_value},
+          { NFAPI_HI_DCI0_REQUEST_HI_PDU_REL10_TAG, &pdu->hi_pdu.hi_pdu_rel10, &unpack_hi_dci0_hi_pdu_rel10_value},
+        };
+        unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0);
+      }
+      break;
+
+      case NFAPI_HI_DCI0_DCI_PDU_TYPE: {
+        unpack_tlv_t unpack_fns[] = {
+          { NFAPI_HI_DCI0_REQUEST_DCI_PDU_REL8_TAG, &pdu->dci_pdu.dci_pdu_rel8, &unpack_hi_dci0_dci_pdu_rel8_value},
+          { NFAPI_HI_DCI0_REQUEST_DCI_PDU_REL10_TAG, &pdu->dci_pdu.dci_pdu_rel10, &unpack_hi_dci0_dci_pdu_rel10_value},
+          { NFAPI_HI_DCI0_REQUEST_DCI_PDU_REL12_TAG, &pdu->dci_pdu.dci_pdu_rel12, &unpack_hi_dci0_dci_pdu_rel12_value},
+        };
+        unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0);
+      }
+      break;
+
+      case NFAPI_HI_DCI0_EPDCCH_DCI_PDU_TYPE: {
+        unpack_tlv_t unpack_fns[] = {
+          { NFAPI_HI_DCI0_REQUEST_EPDCCH_DCI_PDU_REL8_TAG, &pdu->epdcch_dci_pdu.epdcch_dci_pdu_rel8, &unpack_hi_dci0_dci_pdu_rel8_value},
+          { NFAPI_HI_DCI0_REQUEST_EPDCCH_DCI_PDU_REL10_TAG, &pdu->epdcch_dci_pdu.epdcch_dci_pdu_rel10, &unpack_hi_dci0_dci_pdu_rel10_value},
+          { NFAPI_HI_DCI0_REQUEST_EPDCCH_PARAMETERS_REL11_TAG, &pdu->epdcch_dci_pdu.epdcch_parameters_rel11, &unpack_dl_config_epdcch_params_rel11_value},
+        };
+        unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0);
+      }
+      break;
+
+      case NFAPI_HI_DCI0_MPDCCH_DCI_PDU_TYPE: {
+        unpack_tlv_t unpack_fns[] = {
+          { NFAPI_HI_DCI0_REQUEST_MPDCCH_DCI_PDU_REL13_TAG, &pdu->mpdcch_dci_pdu.mpdcch_dci_pdu_rel13, &unpack_hi_dci0_mpdcch_dci_pdu_rel13_value},
+        };
+        unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0);
+      }
+      break;
+
+      case NFAPI_HI_DCI0_NPDCCH_DCI_PDU_TYPE: {
+        unpack_tlv_t unpack_fns[] = {
+          { NFAPI_HI_DCI0_REQUEST_NPDCCH_DCI_PDU_REL13_TAG, &pdu->npdcch_dci_pdu.npdcch_dci_pdu_rel13, &unpack_hi_dci0_npdcch_dci_pdu_rel13_value},
+        };
+        unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0);
+      }
+      break;
+
+      default: {
+        NFAPI_TRACE(NFAPI_TRACE_ERROR, "FIXME : Invalid pdu type %d \n", pdu->pdu_type );
+      }
+      break;
+    };
+  }
+
+  return 1;
+}
+//unpack_ul_dci_pdu_list_value
+
+static uint8_t unpack_ul_dci_pdu_list_value(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg)
+{
+	nfapi_nr_ul_dci_request_pdus_t* value = (nfapi_nr_ul_dci_request_pdus_t*)msg;
+	for(uint8_t i = 0; i < MAX_DCI_CORESET; ++i)
+	{
+		if(!(pull16(ppReadPackedMsg, &value->pdcch_pdu.pdcch_pdu_rel15.dci_pdu[i].RNTI,  end) &&
+		pull16(ppReadPackedMsg, &value->pdcch_pdu.pdcch_pdu_rel15.dci_pdu[i].ScramblingId, end) &&
+
+		pull16(ppReadPackedMsg, &value->pdcch_pdu.pdcch_pdu_rel15.dci_pdu[i].ScramblingRNTI, end) &&
+		pull8(ppReadPackedMsg, &value->pdcch_pdu.pdcch_pdu_rel15.dci_pdu[i].CceIndex, end) &&
+		pull8(ppReadPackedMsg, &value->pdcch_pdu.pdcch_pdu_rel15.dci_pdu[i].AggregationLevel, end) &&
+		pull8(ppReadPackedMsg, &value->pdcch_pdu.pdcch_pdu_rel15.dci_pdu[i].beta_PDCCH_1_0, end) &&
+
+		pull8(ppReadPackedMsg, &value->pdcch_pdu.pdcch_pdu_rel15.dci_pdu[i].powerControlOffsetSS, end) &&
+		pull16(ppReadPackedMsg, &value->pdcch_pdu.pdcch_pdu_rel15.dci_pdu[i].PayloadSizeBits, end) &&
+
+		pullarray8(ppReadPackedMsg, value->pdcch_pdu.pdcch_pdu_rel15.dci_pdu[i].Payload, value->pdcch_pdu.pdcch_pdu_rel15.dci_pdu[i].PayloadSizeBits, value->pdcch_pdu.pdcch_pdu_rel15.dci_pdu[i].PayloadSizeBits, end)))
+
+		return 0;
+	}
+
+	return (pull16(ppReadPackedMsg, &value->PDUType, end) &&
+	   	    pull16(ppReadPackedMsg, &value->PDUSize, end) &&
+			pull16(ppReadPackedMsg, &value->pdcch_pdu.pdcch_pdu_rel15.BWPSize, end) &&
+			pull16(ppReadPackedMsg, &value->pdcch_pdu.pdcch_pdu_rel15.BWPStart, end) &&
+			pull8(ppReadPackedMsg, &value->pdcch_pdu.pdcch_pdu_rel15.SubcarrierSpacing, end) &&
+			pull8(ppReadPackedMsg, &value->pdcch_pdu.pdcch_pdu_rel15.CyclicPrefix, end) &&
+
+			pull8(ppReadPackedMsg, &value->pdcch_pdu.pdcch_pdu_rel15.StartSymbolIndex, end) &&
+			pull8(ppReadPackedMsg, &value->pdcch_pdu.pdcch_pdu_rel15.DurationSymbols, end) &&
+			pullarray8(ppReadPackedMsg, value->pdcch_pdu.pdcch_pdu_rel15.FreqDomainResource, 6, 6, end) &&
+			pull8(ppReadPackedMsg, &value->pdcch_pdu.pdcch_pdu_rel15.CceRegMappingType, end) &&
+
+			pull8(ppReadPackedMsg, &value->pdcch_pdu.pdcch_pdu_rel15.RegBundleSize, end) &&
+			pull8(ppReadPackedMsg, &value->pdcch_pdu.pdcch_pdu_rel15.InterleaverSize, end) &&
+			pull8(ppReadPackedMsg, &value->pdcch_pdu.pdcch_pdu_rel15.CoreSetType, end) &&
+			pull16(ppReadPackedMsg, &value->pdcch_pdu.pdcch_pdu_rel15.ShiftIndex, end) &&
+			pull8(ppReadPackedMsg, &value->pdcch_pdu.pdcch_pdu_rel15.precoderGranularity, end) &&
+			pull16(ppReadPackedMsg, &value->pdcch_pdu.pdcch_pdu_rel15.numDlDci, end));
+
+}
+
+static uint8_t unpack_ul_dci_request(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p7_codec_config_t *config) {
+  nfapi_nr_ul_dci_request_t *pNfapiMsg = (nfapi_nr_ul_dci_request_t *)msg;
+
+  if (!(pull16(ppReadPackedMsg, &pNfapiMsg->SFN, end) &&
+        pull16(ppReadPackedMsg, &pNfapiMsg->Slot, end) &&
+        pull8(ppReadPackedMsg, &pNfapiMsg->numPdus, end)
+       ))
+    return 0;
+
+  for(int i=0; i< pNfapiMsg->numPdus; i++) {
+    if (!unpack_ul_dci_pdu_list_value(ppReadPackedMsg, end, &pNfapiMsg->ul_dci_pdu_list[i]))
+      return 0;
+  }
+
+  return 1;
+}
+
+static uint8_t unpack_hi_dci0_request(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p7_codec_config_t *config) {
+  nfapi_hi_dci0_request_t *pNfapiMsg = (nfapi_hi_dci0_request_t *)msg;
+  unpack_p7_tlv_t unpack_fns[] = {
+    { NFAPI_HI_DCI0_REQUEST_BODY_TAG, &pNfapiMsg->hi_dci0_request_body, &unpack_hi_dci0_request_body_value},
+  };
+  return (pull16(ppReadPackedMsg, &pNfapiMsg->sfn_sf, end) &&
+          unpack_p7_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, end, config, &pNfapiMsg->vendor_extension));
+}
+static uint8_t unpack_tx_data_pdu_list_value(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg) {
+  nfapi_nr_pdu_t *pNfapiMsg = (nfapi_nr_pdu_t *)msg;
+
+  if(!(pull32(ppReadPackedMsg, &pNfapiMsg->num_TLV, end) &&
+       pull16(ppReadPackedMsg, &pNfapiMsg->PDU_index, end) &&
+       pull16(ppReadPackedMsg, &pNfapiMsg->PDU_length, end)
+      ))
+    return 0;
+
+  uint16_t i = 0;
+  uint16_t total_number_of_tlvs = pNfapiMsg->num_TLV;
+
+  for(; i < total_number_of_tlvs; ++i) {
+    if (!(pull16(ppReadPackedMsg, &pNfapiMsg->TLVs[i].length, end) &&
+          pull16(ppReadPackedMsg, &pNfapiMsg->TLVs[i].tag, end)))
+      return 0;
+
+    switch(pNfapiMsg->TLVs[i].tag) {
+      case 0: {
+        if(!pullarray32(ppReadPackedMsg, pNfapiMsg->TLVs[i].value.direct, 16384, pNfapiMsg->TLVs[i].length, end))
+          return 0;
+
+        break;
+      }
+
+      case 1: {
+        if(!pullarray32(ppReadPackedMsg, pNfapiMsg->TLVs[i].value.ptr, pNfapiMsg->TLVs[i].length, pNfapiMsg->TLVs[i].length, end))
+          return 0;
+
+        break;
+      }
+
+      default: {
+        NFAPI_TRACE(NFAPI_TRACE_ERROR, "FIXME : Invalid tag value %d \n", pNfapiMsg->TLVs[i].tag );
+        break;
+      }
+    }
+  }
+
+  return 1;
+}
+
+static uint8_t unpack_tx_data_request(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p7_codec_config_t *config) {
+  nfapi_nr_tx_data_request_t *pNfapiMsg = (nfapi_nr_tx_data_request_t *)msg;
+
+  if(!(pull16(ppReadPackedMsg, &pNfapiMsg->SFN, end) &&
+       pull16(ppReadPackedMsg, &pNfapiMsg->Slot, end) &&
+       pull16(ppReadPackedMsg, &pNfapiMsg->Number_of_PDUs, end)))
+    return 0;
+
+  for(int i=0; i< pNfapiMsg->Number_of_PDUs; i++) {
+    if (!unpack_tx_data_pdu_list_value(ppReadPackedMsg, end, &pNfapiMsg->pdu_list[i]))
+      return 0;
+  }
+
+  return 1;
+}
+
+static uint8_t unpack_tx_request(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p7_codec_config_t *config) {
+  uint8_t proceed = 1;
+  nfapi_tx_request_t *pNfapiMsg = (nfapi_tx_request_t *)msg;
+
+  if(pull16(ppReadPackedMsg, &pNfapiMsg->sfn_sf, end) == 0)
+    return 0;
+
+  while (((uint8_t *)(*ppReadPackedMsg) < end) && proceed) {
+    nfapi_tl_t generic_tl;
+
+    if(unpack_tl(ppReadPackedMsg, &generic_tl, end) == 0)
+      return 0;
+
+    switch(generic_tl.tag) {
+      case NFAPI_TX_REQUEST_BODY_TAG: {
+        pNfapiMsg->tx_request_body.tl = generic_tl;
+
+        if( pull16(ppReadPackedMsg, &pNfapiMsg->tx_request_body.number_of_pdus, end) == 0)
+          return 0;
+
+        if(pNfapiMsg->tx_request_body.number_of_pdus > NFAPI_TX_MAX_PDU) {
+          NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s number of tx pdu's exceed maxium (count:%d max:%d)\n", __FUNCTION__, pNfapiMsg->tx_request_body.number_of_pdus, NFAPI_TX_MAX_PDU);
+          return 0;
+        }
+
+        if(pNfapiMsg->tx_request_body.number_of_pdus > 0) {
+          pNfapiMsg->tx_request_body.tx_pdu_list = (nfapi_tx_request_pdu_t *)nfapi_p7_allocate(sizeof(nfapi_tx_request_pdu_t) * pNfapiMsg->tx_request_body.number_of_pdus, config);
+
+          if(pNfapiMsg->tx_request_body.tx_pdu_list == NULL) {
+            NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s failed to allocate tx  pdu list (count:%d)\n", __FUNCTION__, pNfapiMsg->tx_request_body.number_of_pdus);
+            return 0;
+          }
+        } else {
+          pNfapiMsg->tx_request_body.tx_pdu_list = 0;
+        }
+
+        uint16_t i;
+        uint16_t totalNumPdus = pNfapiMsg->tx_request_body.number_of_pdus;
+
+        for(i = 0; i < totalNumPdus; ++i) {
+          nfapi_tx_request_pdu_t *pdu = &(pNfapiMsg->tx_request_body.tx_pdu_list[i]);
+
+          if (pdu) {
+            uint16_t length = 0;
+            uint16_t index = 0;
+
+            if(!(pull16(ppReadPackedMsg, &length, end) &&
+                 pull16(ppReadPackedMsg, &index, end)))
+              return 0;
+
+            pdu->pdu_length = length;
+            pdu->pdu_index = index;
+            // TODO : May need to rethink this bit
+            pdu->num_segments = 1;
+            pdu->segments[0].segment_length = pdu->pdu_length;
+            pdu->segments[0].segment_data = nfapi_p7_allocate(pdu->pdu_length, config);
+
+            if(pdu->segments[0].segment_data) {
+              if(!pullarray8(ppReadPackedMsg, pdu->segments[0].segment_data, pdu->segments[0].segment_length, pdu->segments[0].segment_length, end))
+                return 0;
+
+              if (pdu->segments[0].segment_length == 3) {
+                NFAPI_TRACE(NFAPI_TRACE_INFO, "%s() BCH? segment_data:%x %x %x\n", __FUNCTION__,
+                            pdu->segments[0].segment_data[0],
+                            pdu->segments[0].segment_data[1],
+                            pdu->segments[0].segment_data[2]
+                           );
+              }
+            } else {
+              NFAPI_TRACE(NFAPI_TRACE_ERROR, "unpack_tx_request: Failed to allocate pdu (len:%d) %d/%d %d\n", pdu->pdu_length, totalNumPdus, i, pdu->pdu_index);
+            }
+          } else {
+            NFAPI_TRACE(NFAPI_TRACE_ERROR, "NULL pdu\n");
+          }
+        }
+      }
+      break;
+
+      default: {
+        NFAPI_TRACE(NFAPI_TRACE_ERROR, "unpack_tx_request FIXME : Invalid pdu type %d \n", generic_tl.tag );
+      }
+      break;
+    };
+  }
+
+  return 1;
+}
+
+//UNPACK NR UPLINK INDICATION FUNCTIONS
+
+//SLOT INDICATION
+
+static uint8_t unpack_nr_slot_indication(uint8_t **ppReadPackedMsg, uint8_t *end, nfapi_nr_slot_indication_scf_t *msg, nfapi_p7_codec_config_t* config)
+{
+	nfapi_nr_slot_indication_scf_t *pNfapiMsg = (nfapi_nr_slot_indication_scf_t*)msg;
+
+	if (!(pull16(ppReadPackedMsg, &pNfapiMsg->sfn , end) &&
+		pull16(ppReadPackedMsg, &pNfapiMsg->slot , end)
+		))
+			return 0;
+
+return 1;
+}
+
+//RX DATA INDICATION
+
+static uint8_t unpack_nr_rx_data_indication_body(void* tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
+{
+	nfapi_nr_rx_data_pdu_t* value = (nfapi_nr_rx_data_pdu_t*)tlv;
+
+	if(!(pull32(ppReadPackedMsg, &value->handle, end) &&
+	 	 pull16(ppReadPackedMsg, &value->rnti, end) &&
+		 pull8(ppReadPackedMsg, &value->harq_id, end) &&
+		 pull16(ppReadPackedMsg, &value->pdu_length, end) &&
+		 pull8(ppReadPackedMsg, &value->ul_cqi, end) &&
+		 pull16(ppReadPackedMsg, &value->timing_advance, end) &&
+		 pull16(ppReadPackedMsg, &value->rssi, end)
+		 ))
+		  return 0;
+	return 1;
+}
+
+
+static uint8_t unpack_nr_rx_data_indication(uint8_t **ppReadPackedMsg, uint8_t *end, nfapi_nr_rx_data_indication_t *msg, nfapi_p7_codec_config_t* config)
+{
+	nfapi_nr_rx_data_indication_t *pNfapiMsg = (nfapi_nr_rx_data_indication_t*)msg;
+
+	if (!(pull16(ppReadPackedMsg, &pNfapiMsg->sfn , end) &&
+		pull16(ppReadPackedMsg, &pNfapiMsg->slot , end) &&
+		pull16(ppReadPackedMsg, &pNfapiMsg->number_of_pdus, end)
+		))
+			return 0;
+
+	for(int i=0; i<pNfapiMsg->number_of_pdus;i++)
+	{
+		if(!unpack_nr_rx_data_indication_body(pNfapiMsg->pdu_list, ppReadPackedMsg, end))
+		return 0;
+	}
+
+return 1;
+}
+
+//NR CRC INDICATION
+
+static uint8_t unpack_nr_crc_indication_body(nfapi_nr_crc_t* value, uint8_t **ppReadPackedMsg, uint8_t *end)
+{
+	if(!(pull32(ppReadPackedMsg, &value->handle, end) &&
+	 	 pull16(ppReadPackedMsg, &value->rnti, end) &&
+		 pull8(ppReadPackedMsg, &value->harq_id, end) &&
+		 pull8(ppReadPackedMsg, &value->tb_crc_status, end) &&
+		 pull16(ppReadPackedMsg, &value->num_cb, end) &&
+		 //pullarray8(ppReadPackedMsg, value->cb_crc_status, (int)(value->num_cb / 8) + 1, (int)(value->num_cb / 8) + 1, end) && //length is ceil(NumCb/8)
+		 pull8(ppReadPackedMsg, &value->ul_cqi, end) &&
+		 pull16(ppReadPackedMsg, &value->timing_advance, end) &&
+		 pull16(ppReadPackedMsg, &value->rssi, end)
+		 ))
+		  return 0;
+
+	//memcpy((nfapi_nr_crc_t *)tlv,value,sizeof(nfapi_nr_crc_t));
+
+	return 1;
+}
+
+static uint8_t unpack_nr_crc_indication(uint8_t **ppReadPackedMsg, uint8_t *end, nfapi_nr_crc_indication_t *msg, nfapi_p7_codec_config_t* config)
+{
+	nfapi_nr_crc_indication_t *pNfapiMsg = (nfapi_nr_crc_indication_t *) msg;
+	// pNfapiMsg = (nfapi_nr_crc_indication_t *) malloc(sizeof(nfapi_nr_crc_indication_t));
+	// pNfapiMsg->crc_list = (nfapi_nr_crc_t *) malloc(sizeof(nfapi_nr_crc_t));
+
+	if (!(pull16(ppReadPackedMsg, &pNfapiMsg->sfn, end) &&
+		pull16(ppReadPackedMsg, &pNfapiMsg->slot, end) &&
+		pull16(ppReadPackedMsg, &pNfapiMsg->number_crcs, end)
+		))
+		return 0;
+
+	for(int i=0; i<pNfapiMsg->number_crcs;i++)
+	{
+		if(!unpack_nr_crc_indication_body(pNfapiMsg->crc_list,ppReadPackedMsg,end))
+		//if(!unpack_nr_crc_indication_body(value,ppReadPackedMsg,end))
+		return 0;
+	}
+
+return 1;
+}
+
+//SRS INDICATION
+
+static uint8_t unpack_nr_srs_indication_body(void* tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
+{
+	nfapi_nr_srs_indication_pdu_t* value = (nfapi_nr_srs_indication_pdu_t*)tlv;
+
+	if(!(pull32(ppReadPackedMsg, &value->handle, end) &&
+	 	 pull16(ppReadPackedMsg, &value->rnti, end) &&
+		 pull16(ppReadPackedMsg, &value->timing_advance, end) &&
+		 pull8(ppReadPackedMsg, &value->num_symbols, end) &&
+		 pull8(ppReadPackedMsg, &value->wide_band_snr, end) &&
+		 pull8(ppReadPackedMsg, &value->num_reported_symbols, end) &&
+		 pull16(ppReadPackedMsg, &value->reported_symbol_list->num_rbs, end)
+		 ))
+		  return 0;
+	for(int i = 0; i < value->reported_symbol_list->num_rbs; i++)
+	{
+		if(!(pull8(ppReadPackedMsg, &value->reported_symbol_list->rb_list->rb_snr, end)
+			))
+			return 0;
+	}
+	return 1;
+}
+
+static uint8_t unpack_nr_srs_indication(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p7_codec_config_t* config)
+{
+	nfapi_nr_srs_indication_t *pNfapiMsg = (nfapi_nr_srs_indication_t*)msg;
+
+	if (!(pull16(ppReadPackedMsg,&pNfapiMsg->sfn , end) &&
+		pull16(ppReadPackedMsg,&pNfapiMsg->slot , end) &&
+		pull8(ppReadPackedMsg,&pNfapiMsg->number_of_pdus, end)
+		))
+			return 0;
+
+	for(int i=0; i<pNfapiMsg->number_of_pdus;i++)
+	{
+		if(!unpack_nr_srs_indication_body(&pNfapiMsg->pdu_list,ppReadPackedMsg,end))
+		return 0;
+	}
+
+return 1;
+}
+
+//NR RACH
+
+static uint8_t unpack_nr_rach_indication_body(nfapi_nr_prach_indication_pdu_t* tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
+{
+	nfapi_nr_prach_indication_pdu_t* value = (nfapi_nr_prach_indication_pdu_t*)tlv;
+
+	if(!(pull16(ppReadPackedMsg, &value->phy_cell_id, end) &&
+	 	 pull8(ppReadPackedMsg, &value->symbol_index, end) &&
+		 pull8(ppReadPackedMsg, &value->slot_index, end) &&
+		 pull8(ppReadPackedMsg, &value->freq_index, end) &&
+		 pull8(ppReadPackedMsg, &value->avg_rssi, end) &&
+		 pull8(ppReadPackedMsg, &value->avg_snr, end) &&
+		 pull8(ppReadPackedMsg, &value->num_preamble, end)
+		 ))
+		  return 0;
+	value->preamble_list = (nfapi_nr_prach_indication_preamble_t*) malloc(sizeof(nfapi_nr_prach_indication_preamble_t) * value->num_preamble);
+	for(int i = 0; i < value->num_preamble; i++)
+	{
+		if(!(pull8(ppReadPackedMsg, &value->preamble_list->preamble_index, end) &&
+			pull16(ppReadPackedMsg, &value->preamble_list->timing_advance, end) &&
+			pull32(ppReadPackedMsg, &value->preamble_list->preamble_pwr, end)
+			))
+			return 0;
+	}
+	return 1;
+}
+
+static uint8_t unpack_nr_rach_indication(uint8_t **ppReadPackedMsg, uint8_t *end, nfapi_nr_rach_indication_t* msg, nfapi_p7_codec_config_t* config) {
+
+	nfapi_nr_rach_indication_t *pNfapiMsg = (nfapi_nr_rach_indication_t*)msg;
+	if (!(pull16(ppReadPackedMsg, &pNfapiMsg->sfn , end) &&
+		pull16(ppReadPackedMsg, &pNfapiMsg->slot , end) &&
+		pull8(ppReadPackedMsg, &pNfapiMsg->number_of_pdus, end)
+		))
+			return 0;
+	pNfapiMsg->pdu_list = (nfapi_nr_prach_indication_pdu_t*) malloc(sizeof(nfapi_nr_prach_indication_pdu_t) * pNfapiMsg->number_of_pdus);
+	for(int i=0; i< pNfapiMsg->number_of_pdus;i++)
+	{
+		if(!unpack_nr_rach_indication_body(pNfapiMsg->pdu_list,ppReadPackedMsg,end))
+		return 0;
+	}
+
+return 1;
+}
+
+//NR UCI
+
+static uint8_t unpack_nr_uci_pucch_0_1(nfapi_nr_uci_pucch_pdu_format_0_1_t* tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+	nfapi_nr_uci_pucch_pdu_format_0_1_t* value = (nfapi_nr_uci_pucch_pdu_format_0_1_t*)tlv;
+
+	// uint8_t *ptr = *ppReadPackedMsg;
+	// printf("\n Read P7 message uci_0_1 indication unpack: ");
+	// while(ptr < end){
+	// 	printf(" %d ", *ptr);
+	// 	ptr++;
+	// }
+	// printf("\n");
+
+	if(!(pull8(ppReadPackedMsg, &value->pduBitmap, end) &&
+	 	 pull32(ppReadPackedMsg, &value->handle, end) &&
+		 pull16(ppReadPackedMsg, &value->rnti, end) &&
+		 pull8(ppReadPackedMsg, &value->pucch_format, end) &&
+		 pull8(ppReadPackedMsg, &value->ul_cqi, end) &&
+		 pull16(ppReadPackedMsg, &value->timing_advance, end) &&
+		 pull16(ppReadPackedMsg, &value->rssi, end)
+		 ))
+		  return 0;
+	if (value->pduBitmap & 0x01) { //SR
+		value->sr = (nfapi_nr_sr_pdu_0_1_t*) malloc(sizeof(nfapi_nr_sr_pdu_0_1_t));
+		if(!(pull8(ppReadPackedMsg, &value->sr->sr_indication, end) &&
+	 	 pull8(ppReadPackedMsg, &value->sr->sr_confidence_level, end)
+		 ))
+		  return 0;
+	}
+
+	if (((value->pduBitmap >> 1) & 0x01)) { //HARQ
+		value->harq = (nfapi_nr_harq_pdu_0_1_t*) malloc(sizeof(nfapi_nr_harq_pdu_0_1_t));
+		if(!(pull8(ppReadPackedMsg, &value->harq->num_harq, end) &&
+	 	 pull8(ppReadPackedMsg, &value->harq->harq_confidence_level, end)
+		 ))
+			return 0;
+		value->harq->harq_list = (nfapi_nr_harq_t*) malloc(sizeof(nfapi_nr_harq_t*) * value->harq->num_harq);
+		for(int i=0; i<value->harq->num_harq;i++)
+		{
+			if(!(pull8(ppReadPackedMsg, &value->harq->harq_list->harq_value, end)
+			))
+			return 0;
+		}
+	}
+
+	return 1;
+}
+
+
+static uint8_t unpack_nr_uci_pucch_2_3_4(nfapi_nr_uci_pucch_pdu_format_2_3_4_t* tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+	nfapi_nr_uci_pucch_pdu_format_2_3_4_t* value = (nfapi_nr_uci_pucch_pdu_format_2_3_4_t*) tlv;
+
+	if(!(pull8(ppReadPackedMsg, &value->pduBitmap, end) &&
+	 	 pull32(ppReadPackedMsg, &value->handle, end) &&
+		 pull16(ppReadPackedMsg, &value->rnti, end) &&
+		 pull8(ppReadPackedMsg, &value->pucch_format, end) &&
+		 pull8(ppReadPackedMsg, &value->ul_cqi, end) &&
+		 pull16(ppReadPackedMsg, &value->timing_advance, end) &&
+		 pull16(ppReadPackedMsg, &value->rssi, end)
+		 ))
+		  return 0;
+	if (value->pduBitmap & 0x01) { //SR
+		if(!(pull16(ppReadPackedMsg, &value->sr.sr_bit_len, end)))
+			return 0;
+
+		value->sr.sr_payload = (uint8_t*) malloc(sizeof(uint8_t) * ((value->sr.sr_bit_len/8)));
+
+	 	if(!(pullarray8(ppReadPackedMsg, &value->sr.sr_payload[0], (int)(value->sr.sr_bit_len / 8), (int)(value->sr.sr_bit_len / 8), end)))
+		  	return 0;
+	}
+
+	if (((value->pduBitmap >> 1) & 0x01)) { //HARQ
+		if(!(pull8(ppReadPackedMsg, &value->harq.harq_crc, end)) &&
+			(pull16(ppReadPackedMsg, &value->harq.harq_bit_len, end)))
+			return 0;
+
+		value->harq.harq_payload = (uint8_t*) malloc(sizeof(uint8_t) * ((value->harq.harq_bit_len/8 )));
+
+	 	if(!(pullarray8(ppReadPackedMsg, value->harq.harq_payload, (int)(value->harq.harq_bit_len / 8), (int)(value->harq.harq_bit_len / 8), end)))
+			return 0;
+	}
+
+	if (((value->pduBitmap >> 2) & 0x01)) { //CSI-1
+		if(!(pull8(ppReadPackedMsg, &value->csi_part1.csi_part1_crc, end)) &&
+			(pull16(ppReadPackedMsg, &value->csi_part1.csi_part1_bit_len, end)))
+			return 0;
+
+		value->csi_part1.csi_part1_payload = (uint8_t*) malloc(sizeof(uint8_t) * ((value->csi_part1.csi_part1_bit_len/8)));
+
+//		if(!(pullarray8(ppReadPackedMsg, value->csi_part1.csi_part1_payload, (int)(value->csi_part1.csi_part1_bit_len / 8), (int)(value->csi_part1.csi_part1_bit_len / 8), end)))
+//			return 0;
+	}
+
+	if (((value->pduBitmap >> 3) & 0x01)) { //CSI-2
+		if(!(pull8(ppReadPackedMsg, &value->csi_part2.csi_part2_crc, end)) &&
+			(pull16(ppReadPackedMsg, &value->csi_part2.csi_part2_bit_len, end)))
+			return 0;
+
+		value->csi_part2.csi_part2_payload = (uint8_t*) malloc(sizeof(uint8_t) * ((value->csi_part2.csi_part2_bit_len/8 )));
+
+		if(!(pullarray8(ppReadPackedMsg, value->csi_part2.csi_part2_payload, (int)(value->csi_part2.csi_part2_bit_len / 8) , (int)(value->csi_part2.csi_part2_bit_len / 8) , end)))
+			return 0;
+	}
+
+	return 1;
+}
+
+static uint8_t unpack_nr_uci_indication_body(nfapi_nr_uci_t* value, uint8_t **ppReadPackedMsg, uint8_t *end)
+{
+	if(!(pull16(ppReadPackedMsg, &value->pdu_type, end) &&
+		pull16(ppReadPackedMsg, &value->pdu_size, end)
+		))
+		return 0;
+
+	switch (value->pdu_type) {
+      case NFAPI_NR_UCI_PUSCH_PDU_TYPE:
+        printf("Unhandled NFAPI_NR_UCI_PUSCH_PDU_TYPE \n");
+        break;
+
+      case NFAPI_NR_UCI_FORMAT_0_1_PDU_TYPE: {
+        nfapi_nr_uci_pucch_pdu_format_0_1_t* uci_pdu = &value->pucch_pdu_format_0_1;
+        unpack_nr_uci_pucch_0_1(uci_pdu, ppReadPackedMsg, end);
+		break;
+        }
+      case NFAPI_NR_UCI_FORMAT_2_3_4_PDU_TYPE: {
+        nfapi_nr_uci_pucch_pdu_format_2_3_4_t *uci_pdu = &value->pucch_pdu_format_2_3_4;
+        unpack_nr_uci_pucch_2_3_4(uci_pdu, ppReadPackedMsg, end);
+        break;
+    	}
+	}
+
+	return 1;
+}
+
+static uint8_t unpack_nr_uci_indication(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p7_codec_config_t* config)
+{
+	nfapi_nr_uci_indication_t *pNfapiMsg = (nfapi_nr_uci_indication_t*)msg;
+
+	if (!(pull16(ppReadPackedMsg, &pNfapiMsg->sfn , end) &&
+		pull16(ppReadPackedMsg, &pNfapiMsg->slot , end) &&
+		pull16(ppReadPackedMsg, &pNfapiMsg->num_ucis, end)
+		))
+			return 0;
+
+	for(int i=0; i<pNfapiMsg->num_ucis;i++)
+	{
+		if(!unpack_nr_uci_indication_body(pNfapiMsg->uci_list,ppReadPackedMsg,end))
+		return 0;
+	}
+
+return 1;
+}
+
+static uint8_t unpack_ue_release_request(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p7_codec_config_t *config) {
+  uint8_t proceed = 1;
+  nfapi_ue_release_request_t *pNfapiMsg = (nfapi_ue_release_request_t *)msg;
+
+  if(pull16(ppReadPackedMsg, &pNfapiMsg->sfn_sf, end) == 0)
+    return 0;
+
+  while (((uint8_t *)(*ppReadPackedMsg) < end) && proceed) {
+    nfapi_tl_t generic_tl;
+
+    if(unpack_tl(ppReadPackedMsg, &generic_tl, end) == 0)
+      return 0;
+
+    switch(generic_tl.tag) {
+      case NFAPI_UE_RELEASE_BODY_TAG: {
+        pNfapiMsg->ue_release_request_body.tl = generic_tl;
+
+        if( pull16(ppReadPackedMsg, &pNfapiMsg->ue_release_request_body.number_of_TLVs, end) == 0)
+          return 0;
+
+        if(pNfapiMsg->ue_release_request_body.number_of_TLVs > NFAPI_RELEASE_MAX_RNTI) {
+          NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s number of relese rnti's exceed maxium (count:%d max:%d)\n", __FUNCTION__, pNfapiMsg->ue_release_request_body.number_of_TLVs, NFAPI_RELEASE_MAX_RNTI);
+          return 0;
+        } else {
+          uint8_t j;
+          uint16_t num = pNfapiMsg->ue_release_request_body.number_of_TLVs;
+
+          for(j = 0; j < num; ++j) {
+            if(pull16(ppReadPackedMsg, &pNfapiMsg->ue_release_request_body.ue_release_request_TLVs_list[j].rnti, end) == 0) {
+              return 0;
+            }
+          }
+        }
+      }
+      break;
+
+      default: {
+        NFAPI_TRACE(NFAPI_TRACE_ERROR, "unpack_ue_release_request FIXME : Invalid type %d \n", generic_tl.tag );
+      }
+      break;
+    };
+  }
+
+  return 1;
+}
+
+static uint8_t unpack_harq_indication_tdd_harq_data_bundling(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_harq_indication_tdd_harq_data_bundling_t *value = (nfapi_harq_indication_tdd_harq_data_bundling_t *)tlv;
+  return (pull8(ppReadPackedMsg, &value->value_0, end) &&
+          pull8(ppReadPackedMsg, &value->value_1, end));
+}
+
+static uint8_t unpack_harq_indication_tdd_harq_data_multiplexing(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_harq_indication_tdd_harq_data_multiplexing_t *value = (nfapi_harq_indication_tdd_harq_data_multiplexing_t *)tlv;
+  return (pull8(ppReadPackedMsg, &value->value_0, end) &&
+          pull8(ppReadPackedMsg, &value->value_1, end) &&
+          pull8(ppReadPackedMsg, &value->value_2, end) &&
+          pull8(ppReadPackedMsg, &value->value_3, end));
+}
+static uint8_t unpack_harq_indication_tdd_harq_data_special_bundling(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_harq_indication_tdd_harq_data_special_bundling_t *value = (nfapi_harq_indication_tdd_harq_data_special_bundling_t *)tlv;
+  return ( pull8(ppReadPackedMsg, &value->value_0, end));
+}
+static uint8_t unpack_harq_indication_tdd_harq_data(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_harq_indication_tdd_harq_data_t *value = (nfapi_harq_indication_tdd_harq_data_t *)tlv;
+  return  (pull8(ppReadPackedMsg, &value->value_0, end));
+}
+
+static uint8_t unpack_harq_indication_tdd_rel8_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_harq_indication_tdd_rel8_t *value = (nfapi_harq_indication_tdd_rel8_t *)tlv;
+
+  if(!(pull8(ppReadPackedMsg, &value->mode, end) &&
+       pull8(ppReadPackedMsg, &value->number_of_ack_nack, end)))
+    return 0;
+
+  uint8_t result = 0;
+
+  switch(value->mode) {
+    case NFAPI_HARQ_INDICATION_TDD_HARQ_ACK_NACK_FORMAT_BUNDLING:
+      result = unpack_harq_indication_tdd_harq_data_bundling(&value->harq_data.bundling, ppReadPackedMsg, end);
+      break;
+
+    case NFAPI_HARQ_INDICATION_TDD_HARQ_ACK_NACK_FORMAT_MULIPLEXING:
+      result = unpack_harq_indication_tdd_harq_data_multiplexing(&value->harq_data.multiplex, ppReadPackedMsg, end);
+      break;
+
+    case NFAPI_HARQ_INDICATION_TDD_HARQ_ACK_NACK_FORMAT_SPECIAL_BUNDLING:
+      result = unpack_harq_indication_tdd_harq_data_special_bundling(&value->harq_data.special_bundling, ppReadPackedMsg, end);
+      break;
+
+    case NFAPI_HARQ_INDICATION_TDD_HARQ_ACK_NACK_FORMAT_FORMAT_3:
+    case NFAPI_HARQ_INDICATION_TDD_HARQ_ACK_NACK_FORMAT_CHANNEL_SELECTION:
+      result = 1;
+      break;
+
+    default:
+      // TODO add error message
+      return 0;
+      break;
+  }
+
+  return result;
+}
+
+static uint8_t unpack_harq_indication_tdd_rel9_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_harq_indication_tdd_rel9_t *value = (nfapi_harq_indication_tdd_rel9_t *)tlv;
+
+  if(!(pull8(ppReadPackedMsg, &value->mode, end) &&
+       pull8(ppReadPackedMsg, &value->number_of_ack_nack, end)))
+    return 0;
+
+  if(value->number_of_ack_nack > NFAPI_MAX_NUMBER_ACK_NACK_TDD) {
+    // TODO : add error message
+    return 0;
+  }
+
+  uint16_t idx = 0;
+
+  for(idx = 0; idx < value->number_of_ack_nack; ++idx) {
+    uint8_t result = 0;
+
+    switch(value->mode) {
+      case NFAPI_HARQ_INDICATION_TDD_HARQ_ACK_NACK_FORMAT_BUNDLING:
+        result = unpack_harq_indication_tdd_harq_data(&value->harq_data[idx].bundling, ppReadPackedMsg, end);
+        break;
+
+      case NFAPI_HARQ_INDICATION_TDD_HARQ_ACK_NACK_FORMAT_MULIPLEXING:
+        result = unpack_harq_indication_tdd_harq_data(&value->harq_data[idx].multiplex, ppReadPackedMsg, end);
+        break;
+
+      case NFAPI_HARQ_INDICATION_TDD_HARQ_ACK_NACK_FORMAT_SPECIAL_BUNDLING:
+        result = unpack_harq_indication_tdd_harq_data_special_bundling(&value->harq_data[idx].special_bundling, ppReadPackedMsg, end);
+        break;
+
+      case NFAPI_HARQ_INDICATION_TDD_HARQ_ACK_NACK_FORMAT_CHANNEL_SELECTION:
+        result = unpack_harq_indication_tdd_harq_data(&value->harq_data[idx].channel_selection, ppReadPackedMsg, end);
+        break;
+
+      case NFAPI_HARQ_INDICATION_TDD_HARQ_ACK_NACK_FORMAT_FORMAT_3:
+        result = unpack_harq_indication_tdd_harq_data(&value->harq_data[idx].format_3, ppReadPackedMsg, end);
+        break;
+
+      default:
+        // TODO add error message
+        return 0;
+        break;
+    }
+
+    if(result == 0)
+      return 0;
+  }
+
+  return 1;
+}
+
+static uint8_t unpack_harq_indication_tdd_rel13_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_harq_indication_tdd_rel13_t *value = (nfapi_harq_indication_tdd_rel13_t *)tlv;
+
+  if(!(pull8(ppReadPackedMsg, &value->mode, end) &&
+       pull16(ppReadPackedMsg, &value->number_of_ack_nack, end)))
+    return 0;
+
+  if(value->number_of_ack_nack > NFAPI_MAX_NUMBER_ACK_NACK_TDD) {
+    // TODO : add error message
+    return 0;
+  }
+
+  uint16_t idx = 0;
+
+  for(idx = 0; idx < value->number_of_ack_nack; ++idx) {
+    uint8_t result = 0;
+
+    switch(value->mode) {
+      case NFAPI_HARQ_INDICATION_TDD_HARQ_ACK_NACK_FORMAT_BUNDLING:
+        result = unpack_harq_indication_tdd_harq_data(&value->harq_data[idx].bundling, ppReadPackedMsg, end);
+        break;
+
+      case NFAPI_HARQ_INDICATION_TDD_HARQ_ACK_NACK_FORMAT_MULIPLEXING:
+        result = unpack_harq_indication_tdd_harq_data(&value->harq_data[idx].multiplex, ppReadPackedMsg, end);
+        break;
+
+      case NFAPI_HARQ_INDICATION_TDD_HARQ_ACK_NACK_FORMAT_SPECIAL_BUNDLING:
+        result = unpack_harq_indication_tdd_harq_data_special_bundling(&value->harq_data[idx].special_bundling, ppReadPackedMsg, end);
+        break;
+
+      case NFAPI_HARQ_INDICATION_TDD_HARQ_ACK_NACK_FORMAT_CHANNEL_SELECTION:
+        result = unpack_harq_indication_tdd_harq_data(&value->harq_data[idx].channel_selection, ppReadPackedMsg, end);
+        break;
+
+      case NFAPI_HARQ_INDICATION_TDD_HARQ_ACK_NACK_FORMAT_FORMAT_3:
+        result = unpack_harq_indication_tdd_harq_data(&value->harq_data[idx].format_3, ppReadPackedMsg, end);
+        break;
+
+      case NFAPI_HARQ_INDICATION_TDD_HARQ_ACK_NACK_FORMAT_FORMAT_4:
+        result = unpack_harq_indication_tdd_harq_data(&value->harq_data[idx].format_4, ppReadPackedMsg, end);
+        break;
+
+      case NFAPI_HARQ_INDICATION_TDD_HARQ_ACK_NACK_FORMAT_FORMAT_5:
+        result = unpack_harq_indication_tdd_harq_data(&value->harq_data[idx].format_5, ppReadPackedMsg, end);
+        break;
+
+      default:
+        // TODO add error message
+        return 0;
+        break;
+    }
+
+    if(result == 0)
+      return 0;
+  }
+
+  return 1;
+}
+
+static uint8_t unpack_harq_indication_fdd_rel8_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_harq_indication_fdd_rel8_t *value = (nfapi_harq_indication_fdd_rel8_t *)tlv;
+  return (pull8(ppReadPackedMsg, &value->harq_tb1, end) &&
+          pull8(ppReadPackedMsg, &value->harq_tb2, end));
+}
+
+static uint8_t unpack_harq_indication_fdd_rel9_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_harq_indication_fdd_rel9_t *value = (nfapi_harq_indication_fdd_rel9_t *)tlv;
+  return (pull8(ppReadPackedMsg, &value->mode, end) &&
+          pull8(ppReadPackedMsg, &value->number_of_ack_nack, end) &&
+          pullarray8(ppReadPackedMsg, value->harq_tb_n, NFAPI_HARQ_ACK_NACK_REL9_MAX, value->number_of_ack_nack, end));
+}
+
+static uint8_t unpack_harq_indication_fdd_rel13_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_harq_indication_fdd_rel13_t *value = (nfapi_harq_indication_fdd_rel13_t *)tlv;
+  return (pull8(ppReadPackedMsg, &value->mode, end) &&
+          pull16(ppReadPackedMsg, &value->number_of_ack_nack, end) &&
+          pullarray8(ppReadPackedMsg, value->harq_tb_n, NFAPI_HARQ_ACK_NACK_REL13_MAX, value->number_of_ack_nack, end));
+}
+
+static uint8_t unpack_ul_cqi_information_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_ul_cqi_information_t *value = (nfapi_ul_cqi_information_t *)tlv;
+  return (pull8(ppReadPackedMsg, &value->ul_cqi, end) &&
+          pull8(ppReadPackedMsg, &value->channel, end));
+}
+
+
+
+static uint8_t unpack_harq_indication_body_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end, nfapi_p7_codec_config_t *config) {
+  nfapi_harq_indication_body_t *value = (nfapi_harq_indication_body_t *)tlv;
+  uint8_t *harqBodyEnd = *ppReadPackedMsg + value->tl.length;
+
+  if(harqBodyEnd > end)
+    return 0;
+
+  if(pull16(ppReadPackedMsg, &value->number_of_harqs, end) == 0)
+    return 0;
+
+  if(value->number_of_harqs > NFAPI_HARQ_IND_MAX_PDU) {
+    NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s number of harq ind pdus exceed maxium (count:%d max:%d)\n", __FUNCTION__, value->number_of_harqs, NFAPI_HARQ_IND_MAX_PDU);
+    return 0;
+  }
+
+  value->harq_pdu_list = (nfapi_harq_indication_pdu_t *)nfapi_p7_allocate(sizeof(nfapi_harq_indication_pdu_t) * value->number_of_harqs, config);
+
+  if(value->harq_pdu_list == NULL) {
+    NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s failed to allocate harq ind pdu list (count:%d)\n", __FUNCTION__, value->number_of_harqs);
+    return 0;
+  }
+
+  uint8_t i = 0;
+
+  for(i = 0; i < value->number_of_harqs; ++i) {
+    nfapi_harq_indication_pdu_t *pdu = &(value->harq_pdu_list[i]);
+
+    if(pull16(ppReadPackedMsg, &pdu->instance_length, end) == 0)
+      return 0;
+
+    uint8_t *harqPduInstanceEnd = *ppReadPackedMsg + pdu->instance_length;
+    unpack_tlv_t unpack_fns[] = {
+      { NFAPI_RX_UE_INFORMATION_TAG, &pdu->rx_ue_information, unpack_rx_ue_information_value },
+      { NFAPI_HARQ_INDICATION_TDD_REL8_TAG, &pdu->harq_indication_tdd_rel8, &unpack_harq_indication_tdd_rel8_value},
+      { NFAPI_HARQ_INDICATION_TDD_REL9_TAG, &pdu->harq_indication_tdd_rel9, &unpack_harq_indication_tdd_rel9_value},
+      { NFAPI_HARQ_INDICATION_TDD_REL13_TAG, &pdu->harq_indication_tdd_rel13, &unpack_harq_indication_tdd_rel13_value},
+      { NFAPI_HARQ_INDICATION_FDD_REL8_TAG, &pdu->harq_indication_fdd_rel8, &unpack_harq_indication_fdd_rel8_value},
+      { NFAPI_HARQ_INDICATION_FDD_REL9_TAG, &pdu->harq_indication_fdd_rel9, &unpack_harq_indication_fdd_rel9_value},
+      { NFAPI_HARQ_INDICATION_FDD_REL13_TAG, &pdu->harq_indication_fdd_rel13, &unpack_harq_indication_fdd_rel13_value},
+      { NFAPI_UL_CQI_INFORMATION_TAG, &pdu->ul_cqi_information, &unpack_ul_cqi_information_value}
+    };
+
+    if(unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, harqPduInstanceEnd, 0, 0) == 0)
+      return 0;
+  }
+
+  return 1;
+}
+
+static uint8_t unpack_harq_indication(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p7_codec_config_t *config) {
+  nfapi_harq_indication_t *pNfapiMsg = (nfapi_harq_indication_t *)msg;
+  unpack_p7_tlv_t unpack_fns[] = {
+    { NFAPI_HARQ_INDICATION_BODY_TAG, &pNfapiMsg->harq_indication_body, &unpack_harq_indication_body_value},
+  };
+  return (pull16(ppReadPackedMsg, &pNfapiMsg->sfn_sf, end) &&
+          unpack_p7_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, end, config, &pNfapiMsg->vendor_extension));
+}
+
+static uint8_t unpack_crc_indication_rel8_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_crc_indication_rel8_t *crc_pdu_rel8 = (nfapi_crc_indication_rel8_t *)tlv;
+  return ( pull8(ppReadPackedMsg, &crc_pdu_rel8->crc_flag, end) );
+}
+
+static uint8_t unpack_crc_indication_body_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end,  nfapi_p7_codec_config_t *config) {
+  nfapi_crc_indication_body_t *value = (nfapi_crc_indication_body_t *)tlv;
+  uint8_t *crcBodyEnd = *ppReadPackedMsg + value->tl.length;
+
+  if(crcBodyEnd > end)
+    return 0;
+
+  if(pull16(ppReadPackedMsg, &value->number_of_crcs, end) == 0)
+    return 0;
+
+  if(value->number_of_crcs > NFAPI_CRC_IND_MAX_PDU) {
+    NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s number of crc ind pdu's exceed maxium (count:%d max:%d)\n", __FUNCTION__, value->number_of_crcs, NFAPI_CRC_IND_MAX_PDU);
+    return 0;
+  }
+
+  if(value->number_of_crcs > 0) {
+    value->crc_pdu_list = (nfapi_crc_indication_pdu_t *)nfapi_p7_allocate(sizeof(nfapi_crc_indication_pdu_t) * value->number_of_crcs, config);
+
+    if(value->crc_pdu_list == NULL) {
+      NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s failed to allocate crc ind pdu list (count:%d)\n", __FUNCTION__, value->number_of_crcs);
+      return 0;
+    }
+  } else {
+    value->crc_pdu_list = 0;
+  }
+
+  uint8_t i = 0;
+
+  for(i = 0; i < value->number_of_crcs; ++i) {
+    nfapi_crc_indication_pdu_t *pdu = &(value->crc_pdu_list[i]);
+
+    if(pull16(ppReadPackedMsg, &pdu->instance_length, end) == 0)
+      return 0;
+
+    uint8_t *crcPduInstanceEnd = *ppReadPackedMsg + pdu->instance_length;
+    unpack_tlv_t unpack_fns[] = {
+      { NFAPI_RX_UE_INFORMATION_TAG, &pdu->rx_ue_information, unpack_rx_ue_information_value },
+      { NFAPI_CRC_INDICATION_REL8_TAG, &pdu->crc_indication_rel8, unpack_crc_indication_rel8_value },
+    };
+
+    if(unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, crcPduInstanceEnd, 0, 0) == 0)
+      return 0;
+  }
+
+  return 1;
+}
+
+static uint8_t unpack_crc_indication(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p7_codec_config_t *config) {
+  nfapi_crc_indication_t *pNfapiMsg = (nfapi_crc_indication_t *)msg;
+  unpack_p7_tlv_t unpack_fns[] = {
+    { NFAPI_CRC_INDICATION_BODY_TAG, &pNfapiMsg->crc_indication_body, &unpack_crc_indication_body_value},
+  };
+  return (pull16(ppReadPackedMsg, &pNfapiMsg->sfn_sf, end) &&
+          unpack_p7_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, end, config, &pNfapiMsg->vendor_extension));
+}
+
+static uint8_t unpack_rx_indication_rel8_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_rx_indication_rel8_t *value = (nfapi_rx_indication_rel8_t *)tlv;
+  return (pull16(ppReadPackedMsg, &value->length, end) &&
+          pull16(ppReadPackedMsg, &value->offset, end) &&
+          pull8(ppReadPackedMsg, &value->ul_cqi, end) &&
+          pull16(ppReadPackedMsg, &value->timing_advance, end));
+}
+static uint8_t unpack_rx_indication_rel9_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_rx_indication_rel9_t *value = (nfapi_rx_indication_rel9_t *)tlv;
+  return (pull16(ppReadPackedMsg, &value->timing_advance_r9, end));
+}
+
+static uint8_t unpack_rx_indication_body_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end, nfapi_p7_codec_config_t *config) {
+  nfapi_rx_indication_body_t *value = (nfapi_rx_indication_body_t *)tlv;
+  // the rxBodyEnd points to the end of the cqi PDU's
+  uint8_t *rxBodyEnd = *ppReadPackedMsg + value->tl.length;
+  uint8_t *rxPduEnd = rxBodyEnd;
+  uint8_t *numberOfPdusAddress = *ppReadPackedMsg;
+
+  if(rxBodyEnd > end) {
+    // pdu end is past buffer end
+    return 0;
+  }
+
+  if(pull16(ppReadPackedMsg, &value->number_of_pdus, end) == 0)
+    return 0;
+
+  if(value->number_of_pdus > NFAPI_RX_IND_MAX_PDU) {
+    NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s number of rx ind pdu's exceed maxium (count:%d max:%d)\n", __FUNCTION__, value->number_of_pdus, NFAPI_RX_IND_MAX_PDU);
+    return 0;
+  }
+
+  if(value->number_of_pdus > 0) {
+    value->rx_pdu_list = (nfapi_rx_indication_pdu_t *)nfapi_p7_allocate(sizeof(nfapi_rx_indication_pdu_t) * value->number_of_pdus, config);
+
+    if(value->rx_pdu_list == NULL) {
+      NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s failed to allocate rx ind pdu list (count:%d)\n", __FUNCTION__, value->number_of_pdus);
+      return 0;
+    }
+  } else {
+    value->rx_pdu_list = 0;
+  }
+
+  uint8_t i = 0;
+  nfapi_rx_indication_pdu_t *pdu = 0;
+
+  while((uint8_t *)(*ppReadPackedMsg) < rxBodyEnd && (uint8_t *)(*ppReadPackedMsg) < rxPduEnd) {
+    nfapi_tl_t generic_tl;
+
+    if( unpack_tl(ppReadPackedMsg, &generic_tl, end) == 0)
+      return 0;
+
+    switch(generic_tl.tag) {
+      case NFAPI_RX_UE_INFORMATION_TAG: {
+        pdu = &(value->rx_pdu_list[i++]);
+        pdu->rx_ue_information.tl = generic_tl;
+
+        if(unpack_rx_ue_information_value(&pdu->rx_ue_information, ppReadPackedMsg, end) == 0)
+          return 0;
+      }
+      break;
+
+      case NFAPI_RX_INDICATION_REL8_TAG: {
+        if(pdu != 0) {
+          pdu->rx_indication_rel8.tl = generic_tl;
+
+          if(unpack_rx_indication_rel8_value(&pdu->rx_indication_rel8, ppReadPackedMsg, end) == 0)
+            return 0;
+
+          if(pdu->rx_indication_rel8.offset > 0) {
+            // Need to check that the data is within the tlv
+            if(numberOfPdusAddress + pdu->rx_indication_rel8.offset + pdu->rx_indication_rel8.length <= rxBodyEnd) {
+              // If this the first pdu set the rxPduEnd
+              if(numberOfPdusAddress + pdu->rx_indication_rel8.offset < rxPduEnd) {
+                rxPduEnd = numberOfPdusAddress + pdu->rx_indication_rel8.offset;
+
+                if(rxPduEnd > end) {
+                  // pdu end is past buffer end
+                  return 0;
+                }
+              }
+            } else {
+              NFAPI_TRACE(NFAPI_TRACE_ERROR, "FIXME: the rx data is outside of the tlv\n");
+            }
+          }
+        }
+      }
+      break;
+
+      case NFAPI_RX_INDICATION_REL9_TAG: {
+        if(pdu != 0) {
+          pdu->rx_indication_rel9.tl = generic_tl;
+
+          if(unpack_rx_indication_rel9_value(&pdu->rx_indication_rel9, ppReadPackedMsg, end) == 0)
+            return 0;
+        }
+      }
+      break;
+
+      default: {
+        NFAPI_TRACE(NFAPI_TRACE_ERROR, "RX_ULSCH.indication Invalid pdu type %d \n", generic_tl.tag );
+      }
+      break;
+    }
+  }
+
+  uint8_t idx = 0;
+
+  for(idx = 0; idx < value->number_of_pdus; ++idx) {
+    if(value->rx_pdu_list[idx].rx_indication_rel8.tl.tag == NFAPI_RX_INDICATION_REL8_TAG) {
+      uint32_t length = value->rx_pdu_list[idx].rx_indication_rel8.length;
+      value->rx_pdu_list[idx].data = nfapi_p7_allocate(length, config);
+
+      if(pullarray8(ppReadPackedMsg, value->rx_pdu_list[idx].data, length, length, end) == 0) {
+        return 0;
+      }
+    }
+  }
+
+  return 1;
+}
+
+static uint8_t unpack_rx_indication(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p7_codec_config_t *config) {
+  nfapi_rx_indication_t *pNfapiMsg = (nfapi_rx_indication_t *)msg;
+  unpack_p7_tlv_t unpack_fns[] = {
+    { NFAPI_RX_INDICATION_BODY_TAG, &pNfapiMsg->rx_indication_body, &unpack_rx_indication_body_value},
+  };
+  return (pull16(ppReadPackedMsg, &pNfapiMsg->sfn_sf, end) &&
+          unpack_p7_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, end, config, &pNfapiMsg->vendor_extension));
+}
+
+static uint8_t unpack_preamble_pdu_rel8_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_preamble_pdu_rel8_t *preamble_pdu_rel8 = (nfapi_preamble_pdu_rel8_t *)tlv;
+  return (pull16(ppReadPackedMsg, &preamble_pdu_rel8->rnti, end) &&
+          pull8(ppReadPackedMsg, &preamble_pdu_rel8->preamble, end) &&
+          pull16(ppReadPackedMsg, &preamble_pdu_rel8->timing_advance, end));
+}
+
+static uint8_t unpack_preamble_pdu_rel9_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_preamble_pdu_rel9_t *preamble_pdu_rel9 = (nfapi_preamble_pdu_rel9_t *)tlv;
+  return pull16(ppReadPackedMsg, &preamble_pdu_rel9->timing_advance_r9, end);
+}
+
+static uint8_t unpack_preamble_pdu_rel13_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_preamble_pdu_rel13_t *preamble_pdu_rel13 = (nfapi_preamble_pdu_rel13_t *)tlv;
+  return pull8(ppReadPackedMsg, &preamble_pdu_rel13->rach_resource_type, end);
+}
+
+static uint8_t unpack_rach_indication_body_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end, nfapi_p7_codec_config_t *config) {
+  nfapi_rach_indication_body_t *value = (nfapi_rach_indication_body_t *)tlv;
+  uint8_t *rachBodyEnd = *ppReadPackedMsg + value->tl.length;
+
+  if(rachBodyEnd > end)
+    return 0;
+
+  if(pull16(ppReadPackedMsg, &value->number_of_preambles, end) == 0)
+    return 0;
+
+  if(value->number_of_preambles > NFAPI_PREAMBLE_MAX_PDU) {
+    NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s number of preamble du's exceed maxium (count:%d max:%d)\n", __FUNCTION__, value->number_of_preambles, NFAPI_PREAMBLE_MAX_PDU);
+    return 0;
+  }
+
+  if(value->number_of_preambles > 0) {
+    value->preamble_list = (nfapi_preamble_pdu_t *)nfapi_p7_allocate(sizeof(nfapi_preamble_pdu_t) * value->number_of_preambles, config);
+
+    if(value->preamble_list == NULL) {
+      NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s failed to allocate preamble pdu list (count:%d)\n", __FUNCTION__, value->number_of_preambles);
+      return 0;
+    }
+  } else {
+    value->preamble_list = 0;
+  }
+
+  uint8_t i = 0;
+
+  for(i = 0; i < value->number_of_preambles; ++i) {
+    nfapi_preamble_pdu_t *pdu = &(value->preamble_list[i]);
+
+    if(pull16(ppReadPackedMsg, &pdu->instance_length, end) == 0)
+      return 0;
+
+    uint8_t *preamblePduInstanceEnd = *ppReadPackedMsg + pdu->instance_length;
+    unpack_tlv_t unpack_fns[] = {
+      { NFAPI_PREAMBLE_REL8_TAG, &pdu->preamble_rel8, unpack_preamble_pdu_rel8_value },
+      { NFAPI_PREAMBLE_REL9_TAG, &pdu->preamble_rel9, unpack_preamble_pdu_rel9_value },
+      { NFAPI_PREAMBLE_REL13_TAG, &pdu->preamble_rel13, unpack_preamble_pdu_rel13_value },
+    };
+
+    if(unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, preamblePduInstanceEnd, 0, 0) == 0)
+      return 0;
+  }
+
+  return 1;
+}
+
+static uint8_t unpack_rach_indication(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p7_codec_config_t *config) {
+  nfapi_rach_indication_t *pNfapiMsg = (nfapi_rach_indication_t *)msg;
+  unpack_p7_tlv_t unpack_fns[] = {
+    { NFAPI_RACH_INDICATION_BODY_TAG, &pNfapiMsg->rach_indication_body, &unpack_rach_indication_body_value},
+  };
+  return (pull16(ppReadPackedMsg, &pNfapiMsg->sfn_sf, end) &&
+          unpack_p7_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, end, config, &pNfapiMsg->vendor_extension));
+}
+
+static uint8_t unpack_srs_indication_fdd_rel8_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_srs_indication_fdd_rel8_t *srs_pdu_fdd_rel8 = (nfapi_srs_indication_fdd_rel8_t *)tlv;
+
+  if(!(pull16(ppReadPackedMsg, &srs_pdu_fdd_rel8->doppler_estimation, end) &&
+       pull16(ppReadPackedMsg, &srs_pdu_fdd_rel8->timing_advance, end) &&
+       pull8(ppReadPackedMsg, &srs_pdu_fdd_rel8->number_of_resource_blocks, end) &&
+       pull8(ppReadPackedMsg, &srs_pdu_fdd_rel8->rb_start, end) &&
+       pullarray8(ppReadPackedMsg, srs_pdu_fdd_rel8->snr, NFAPI_NUM_RB_MAX, srs_pdu_fdd_rel8->number_of_resource_blocks, end)))
+    return 0;
+
+  return 1;
+}
+
+static uint8_t unpack_srs_indication_fdd_rel9_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_srs_indication_fdd_rel9_t *srs_pdu_fdd_rel9 = (nfapi_srs_indication_fdd_rel9_t *)tlv;
+  return (pull16(ppReadPackedMsg, &srs_pdu_fdd_rel9->timing_advance_r9, end));
+}
+
+static uint8_t unpack_srs_indication_tdd_rel10_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_srs_indication_ttd_rel10_t *srs_pdu_tdd_rel10 = (nfapi_srs_indication_ttd_rel10_t *)tlv;
+  return (pull8(ppReadPackedMsg, &srs_pdu_tdd_rel10->uppts_symbol, end));
+}
+
+static uint8_t unpack_srs_indication_fdd_rel11_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_srs_indication_fdd_rel11_t *srs_pdu_fdd_rel11 = (nfapi_srs_indication_fdd_rel11_t *)tlv;
+  return ( pull16(ppReadPackedMsg, &srs_pdu_fdd_rel11->ul_rtoa, end));
+}
+
+static uint8_t unpack_tdd_channel_measurement_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_tdd_channel_measurement_t *value = (nfapi_tdd_channel_measurement_t *)tlv;
+
+  if(!(pull8(ppReadPackedMsg, &value->num_prb_per_subband, end) &&
+       pull8(ppReadPackedMsg, &value->number_of_subbands, end) &&
+       pull8(ppReadPackedMsg, &value->num_atennas, end)))
+    return 0;
+
+  if(value->number_of_subbands > NFAPI_MAX_NUM_SUBBANDS) {
+    // todo : add error
+    return 0;
+  }
+
+  if(value->num_atennas > NFAPI_MAX_NUM_PHYSICAL_ANTENNAS) {
+    // todo : add error
+    return 0;
+  }
+
+  uint8_t idx = 0;
+
+  for(idx = 0; idx < value->number_of_subbands; ++idx) {
+    if(!(pull8(ppReadPackedMsg, &value->subands[idx].subband_index, end) &&
+         pullarray16(ppReadPackedMsg, value->subands[idx].channel, NFAPI_MAX_NUM_PHYSICAL_ANTENNAS, value->num_atennas, end)))
+      return 0;
+  }
+
+  return 1;
+}
+
+
+static uint8_t unpack_srs_indication_body_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end, nfapi_p7_codec_config_t *config) {
+  nfapi_srs_indication_body_t *value = (nfapi_srs_indication_body_t *)tlv;
+  uint8_t *srsBodyEnd = *ppReadPackedMsg + value->tl.length;
+
+  if(srsBodyEnd > end)
+    return 0;
+
+  if(pull8(ppReadPackedMsg, &value->number_of_ues, end) == 0)
+    return 0;
+
+  if(value->number_of_ues > NFAPI_SRS_IND_MAX_PDU) {
+    NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s number of srs ind pdu's exceed maxium (count:%d max:%d)\n", __FUNCTION__, value->number_of_ues, NFAPI_SRS_IND_MAX_PDU);
+    return 0;
+  }
+
+  if(value->number_of_ues > 0) {
+    value->srs_pdu_list = (nfapi_srs_indication_pdu_t *)nfapi_p7_allocate(sizeof(nfapi_srs_indication_pdu_t) * value->number_of_ues, config);
+
+    if(value->srs_pdu_list == NULL) {
+      NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s failed to allocate srs ind pdu list (count:%d)\n", __FUNCTION__, value->number_of_ues);
+      return 0;
+    }
+  } else {
+    value->srs_pdu_list = 0;
+  }
+
+  uint8_t i = 0;
+
+  for(i = 0; i < value->number_of_ues; ++i) {
+    nfapi_srs_indication_pdu_t *pdu = &(value->srs_pdu_list[i]);
+
+    if(pull16(ppReadPackedMsg, &pdu->instance_length, end) == 0)
+      return 0;
+
+    uint8_t *srsPduInstanceEnd = *ppReadPackedMsg + pdu->instance_length;
+    unpack_tlv_t unpack_fns[] = {
+      { NFAPI_RX_UE_INFORMATION_TAG, &pdu->rx_ue_information, unpack_rx_ue_information_value },
+      { NFAPI_SRS_INDICATION_FDD_REL8_TAG, &pdu->srs_indication_fdd_rel8, unpack_srs_indication_fdd_rel8_value},
+      { NFAPI_SRS_INDICATION_FDD_REL9_TAG, &pdu->srs_indication_fdd_rel9, unpack_srs_indication_fdd_rel9_value},
+      { NFAPI_SRS_INDICATION_TDD_REL10_TAG, &pdu->srs_indication_tdd_rel10, unpack_srs_indication_tdd_rel10_value},
+      { NFAPI_SRS_INDICATION_FDD_REL11_TAG, &pdu->srs_indication_fdd_rel11, unpack_srs_indication_fdd_rel11_value},
+      { NFAPI_TDD_CHANNEL_MEASUREMENT_TAG, &pdu->tdd_channel_measurement, unpack_tdd_channel_measurement_value},
+    };
+
+    if(unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, srsPduInstanceEnd, 0, 0) == 0)
+      return 0;
+  }
+
+  return 1;
+}
+
+static uint8_t unpack_srs_indication(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p7_codec_config_t *config) {
+  nfapi_srs_indication_t *pNfapiMsg = (nfapi_srs_indication_t *)msg;
+  unpack_p7_tlv_t unpack_fns[] = {
+    { NFAPI_SRS_INDICATION_BODY_TAG, &pNfapiMsg->srs_indication_body, &unpack_srs_indication_body_value},
+  };
+  return (pull16(ppReadPackedMsg, &pNfapiMsg->sfn_sf, end) &&
+          unpack_p7_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, end, config, &pNfapiMsg->vendor_extension));
+}
+
+
+static uint8_t unpack_sr_indication_body_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end, nfapi_p7_codec_config_t *config) {
+  nfapi_sr_indication_body_t *value = (nfapi_sr_indication_body_t *)tlv;
+  uint8_t *srBodyEnd = *ppReadPackedMsg + value->tl.length;
+
+  if(srBodyEnd > end)
+    return 0;
+
+  if(pull16(ppReadPackedMsg, &value->number_of_srs, end) == 0)
+    return 0;
+
+  if(value->number_of_srs > NFAPI_SR_IND_MAX_PDU) {
+    NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s number of sr ind pdu's exceed maxium (count:%d max:%d)\n", __FUNCTION__, value->number_of_srs, NFAPI_SR_IND_MAX_PDU);
+    return 0;
+  }
+
+  if(value->number_of_srs > 0) {
+    value->sr_pdu_list = (nfapi_sr_indication_pdu_t *)nfapi_p7_allocate(sizeof(nfapi_sr_indication_pdu_t) * value->number_of_srs, config);
+
+    if(value->sr_pdu_list == NULL) {
+      NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s failed to allocate sr ind pdu list (count:%d)\n", __FUNCTION__, value->number_of_srs);
+      return 0;
+    }
+  } else {
+    value->sr_pdu_list = 0;
+  }
+
+  uint8_t i = 0;
+
+  for(i = 0; i < value->number_of_srs; ++i) {
+    nfapi_sr_indication_pdu_t *pdu = &(value->sr_pdu_list[i]);
+
+    if(pull16(ppReadPackedMsg, &pdu->instance_length, end) == 0)
+      return 0;
+
+    uint8_t *srPduInstanceEnd = *ppReadPackedMsg + pdu->instance_length;
+    unpack_tlv_t unpack_fns[] = {
+      { NFAPI_RX_UE_INFORMATION_TAG, &pdu->rx_ue_information, unpack_rx_ue_information_value },
+      { NFAPI_UL_CQI_INFORMATION_TAG, &pdu->ul_cqi_information, unpack_ul_cqi_information_value },
+    };
+
+    if(unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, srPduInstanceEnd, 0, 0) == 0)
+      return 0;
+  }
+
+  return 1;
+}
+
+static int unpack_sr_indication(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p7_codec_config_t *config) {
+  nfapi_sr_indication_t *pNfapiMsg = (nfapi_sr_indication_t *)msg;
+  unpack_p7_tlv_t unpack_fns[] = {
+    { NFAPI_SR_INDICATION_BODY_TAG, &pNfapiMsg->sr_indication_body, &unpack_sr_indication_body_value},
+  };
+  return (pull16(ppReadPackedMsg, &pNfapiMsg->sfn_sf, end) &&
+          unpack_p7_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, end, config, &pNfapiMsg->vendor_extension));
+}
+static uint8_t unpack_cqi_indication_rel8_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_cqi_indication_rel8_t *cqi_pdu_rel8 = (nfapi_cqi_indication_rel8_t *)tlv;
+  return (pull16(ppReadPackedMsg, &cqi_pdu_rel8->length, end) &&
+          pull16(ppReadPackedMsg, &cqi_pdu_rel8->data_offset, end) &&
+          pull8(ppReadPackedMsg, &cqi_pdu_rel8->ul_cqi, end) &&
+          pull8(ppReadPackedMsg, &cqi_pdu_rel8->ri, end) &&
+          pull16(ppReadPackedMsg, &cqi_pdu_rel8->timing_advance, end));
+}
+
+static uint8_t unpack_cqi_indication_rel9_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_cqi_indication_rel9_t *cqi_pdu_rel9 = (nfapi_cqi_indication_rel9_t *)tlv;
+
+  if(!(pull16(ppReadPackedMsg, &cqi_pdu_rel9->length, end) &&
+       pull16(ppReadPackedMsg, &cqi_pdu_rel9->data_offset, end) &&
+       pull8(ppReadPackedMsg, &cqi_pdu_rel9->ul_cqi, end) &&
+       pull8(ppReadPackedMsg, &cqi_pdu_rel9->number_of_cc_reported, end)))
+    return 0;
+
+  if(cqi_pdu_rel9->number_of_cc_reported > NFAPI_CC_MAX) {
+    NFAPI_TRACE(NFAPI_TRACE_ERROR, "FIXME : out of bound array\n");
+    return 0;
+  }
+
+  if(!(pullarray8(ppReadPackedMsg, cqi_pdu_rel9->ri, NFAPI_CC_MAX, cqi_pdu_rel9->number_of_cc_reported, end) &&
+       pull16(ppReadPackedMsg, &cqi_pdu_rel9->timing_advance, end) &&
+       pull16(ppReadPackedMsg, &cqi_pdu_rel9->timing_advance_r9, end)))
+    return 0;
+
+  return 1;
+}
+
+static uint8_t  unpack_cqi_indication_body_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end,  nfapi_p7_codec_config_t *config) {
+  nfapi_cqi_indication_body_t *value = (nfapi_cqi_indication_body_t *)tlv;
+  // the cqiBodyEnd points to the end of the cqi PDU's
+  uint8_t *cqiBodyEnd = *ppReadPackedMsg + value->tl.length;
+
+  //uint8_t* cqiPduEnd = cqiBodyEnd;
+  //uint8_t* numberOfPdusAddress = *ppReadPackedMsg;
+
+  if(cqiBodyEnd > end)
+    return 0;
+
+  if(pull16(ppReadPackedMsg, &value->number_of_cqis, end) == 0)
+    return 0;
+
+  if(value->number_of_cqis > NFAPI_CQI_IND_MAX_PDU) {
+    NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s number of cqi ind pdu's exceed maxium (count:%d max:%d)\n", __FUNCTION__, value->number_of_cqis, NFAPI_CQI_IND_MAX_PDU);
+    return -1;
+  }
+
+  if(value->number_of_cqis > 0) {
+    value->cqi_pdu_list = (nfapi_cqi_indication_pdu_t *)nfapi_p7_allocate(sizeof(nfapi_cqi_indication_pdu_t) * value->number_of_cqis, config);
+
+    if(value->cqi_pdu_list == NULL) {
+      NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s failed to allocate cqi ind pdu list (count:%d)\n", __FUNCTION__, value->number_of_cqis);
+      return 0;
+    }
+  } else {
+    value->cqi_pdu_list = 0;
+  }
+
+  if(value->number_of_cqis > 0) {
+    value->cqi_raw_pdu_list = (nfapi_cqi_indication_raw_pdu_t *)nfapi_p7_allocate(sizeof(nfapi_cqi_indication_raw_pdu_t) * value->number_of_cqis, config);
+
+    if(value->cqi_raw_pdu_list == NULL) {
+      NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s failed to allocate raw cqi ind pdu list (count:%d)\n", __FUNCTION__, value->number_of_cqis);
+      return 0;
+    }
+  } else {
+    value->cqi_raw_pdu_list = 0;
+  }
+
+  uint8_t i = 0;
+
+  for(i = 0; i < value->number_of_cqis; ++i) {
+    nfapi_cqi_indication_pdu_t *pdu = &(value->cqi_pdu_list[i]);
+    memset(pdu, 0, sizeof(nfapi_cqi_indication_pdu_t));
+
+    if(pull16(ppReadPackedMsg, &pdu->instance_length, end) == 0)
+      return 0;
+
+    uint8_t *cqiPduInstanceEnd = *ppReadPackedMsg + pdu->instance_length;
+
+    while((uint8_t *)(*ppReadPackedMsg) < cqiPduInstanceEnd) {
+      nfapi_tl_t generic_tl;
+
+      if(unpack_tl(ppReadPackedMsg, &generic_tl, end) == 0)
+        return 0;
+
+      switch(generic_tl.tag) {
+        case NFAPI_RX_UE_INFORMATION_TAG:
+          pdu->rx_ue_information.tl = generic_tl;
+
+          if(unpack_rx_ue_information_value(&pdu->rx_ue_information, ppReadPackedMsg, end) == 0)
+            return 0;
+
+          break;
+
+        case NFAPI_CQI_INDICATION_REL8_TAG:
+          pdu->cqi_indication_rel8.tl = generic_tl;
+
+          if(unpack_cqi_indication_rel8_value(&pdu->cqi_indication_rel8, ppReadPackedMsg, end) == 0)
+            return 0;
+
+          break;
+
+        case NFAPI_CQI_INDICATION_REL9_TAG:
+          pdu->cqi_indication_rel9.tl = generic_tl;
+
+          if(unpack_cqi_indication_rel9_value(&pdu->cqi_indication_rel9, ppReadPackedMsg, end) == 0)
+            return 0;
+
+          break;
+
+        case NFAPI_UL_CQI_INFORMATION_TAG:
+          pdu->ul_cqi_information.tl = generic_tl;
+
+          if(unpack_ul_cqi_information_value(&pdu->ul_cqi_information, ppReadPackedMsg, end) == 0)
+            return 0;
+
+          break;
+
+        default: {
+          NFAPI_TRACE(NFAPI_TRACE_ERROR, "RX_CQI.indication Invalid pdu type %d \n", generic_tl.tag );
+        }
+        break;
+      };
+    }
+  }
+
+  uint8_t idx = 0;
+
+  for(idx = 0; idx < value->number_of_cqis; ++idx) {
+    if(value->cqi_pdu_list[idx].cqi_indication_rel8.tl.tag == NFAPI_CQI_INDICATION_REL8_TAG) {
+      if(pullarray8(ppReadPackedMsg, &(value->cqi_raw_pdu_list[idx].pdu[0]), NFAPI_CQI_RAW_MAX_LEN, value->cqi_pdu_list[idx].cqi_indication_rel8.length, end) == 0)
+        return 0;
+    } else if(value->cqi_pdu_list[idx].cqi_indication_rel9.tl.tag == NFAPI_CQI_INDICATION_REL9_TAG) {
+      if(pullarray8(ppReadPackedMsg, &(value->cqi_raw_pdu_list[idx].pdu[0]), NFAPI_CQI_RAW_MAX_LEN, value->cqi_pdu_list[idx].cqi_indication_rel9.length, end) == 0)
+        return 0;
+    }
+  }
+
+  return 1;
+}
+
+static uint8_t unpack_cqi_indication(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p7_codec_config_t *config) {
+  nfapi_cqi_indication_t *pNfapiMsg = (nfapi_cqi_indication_t *)msg;
+  unpack_p7_tlv_t unpack_fns[] = {
+    { NFAPI_CQI_INDICATION_BODY_TAG, &pNfapiMsg->cqi_indication_body, &unpack_cqi_indication_body_value},
+  };
+  return (pull16(ppReadPackedMsg, &pNfapiMsg->sfn_sf, end) &&
+          unpack_p7_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, end, config, &pNfapiMsg->vendor_extension));
+}
+static uint8_t unpack_lbt_pdsch_req_pdu_rel13_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_lbt_pdsch_req_pdu_rel13_t *value = (nfapi_lbt_pdsch_req_pdu_rel13_t *)tlv;
+  return (pull32(ppReadPackedMsg, &value->handle, end) &&
+          pull32(ppReadPackedMsg, &value->mp_cca, end) &&
+          pull32(ppReadPackedMsg, &value->n_cca, end) &&
+          pull32(ppReadPackedMsg, &value->offset, end) &&
+          pull32(ppReadPackedMsg, &value->lte_txop_sf, end) &&
+          pull16(ppReadPackedMsg, &value->txop_sfn_sf_end, end) &&
+          pull32(ppReadPackedMsg, &value->lbt_mode, end));
+}
+
+static uint8_t unpack_lbt_drs_req_pdu_rel13_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_lbt_drs_req_pdu_rel13_t *value = (nfapi_lbt_drs_req_pdu_rel13_t *)tlv;
+  return (pull32(ppReadPackedMsg, &value->handle, end) &&
+          pull32(ppReadPackedMsg, &value->offset, end) &&
+          pull16(ppReadPackedMsg, &value->sfn_sf_end, end) &&
+          pull32(ppReadPackedMsg, &value->lbt_mode, end));
+}
+
+
+static uint8_t unpack_lbt_config_request_body_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end, nfapi_p7_codec_config_t *config) {
+  nfapi_lbt_dl_config_request_body_t *value = (nfapi_lbt_dl_config_request_body_t *)tlv;
+
+  if(pull16(ppReadPackedMsg, &value->number_of_pdus, end) == 0)
+    return 0;
+
+  if(value->number_of_pdus > NFAPI_LBT_DL_CONFIG_REQ_MAX_PDU) {
+    NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s number of lbt dl config pdu's exceed maxium (count:%d max:%d)\n", __FUNCTION__, value->number_of_pdus, NFAPI_LBT_DL_CONFIG_REQ_MAX_PDU);
+    return 0;
+  }
+
+  if(value->number_of_pdus) {
+    value->lbt_dl_config_req_pdu_list = (nfapi_lbt_dl_config_request_pdu_t *)nfapi_p7_allocate(sizeof(nfapi_lbt_dl_config_request_pdu_t) * value->number_of_pdus, config);
+
+    if(value->lbt_dl_config_req_pdu_list == NULL) {
+      NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s failed to allocate lbt dl config pdu list (count:%d)\n", __FUNCTION__, value->number_of_pdus);
+      return 0;
+    }
+  } else {
+    value->lbt_dl_config_req_pdu_list = 0;
+  }
+
+  uint16_t i;
+  uint16_t total_number_of_pdus = value->number_of_pdus;
+
+  for(i = 0; i < total_number_of_pdus; ++i) {
+    nfapi_lbt_dl_config_request_pdu_t *pdu = &(value->lbt_dl_config_req_pdu_list[i]);
+
+    if(!(pull8(ppReadPackedMsg, &pdu->pdu_type, end) &&
+         pull8(ppReadPackedMsg, &pdu->pdu_size, end)))
+      return 0;
+
+    uint8_t *packedPduEnd = (*ppReadPackedMsg) + pdu->pdu_size - 2;
+
+    if(packedPduEnd > end)
+      return 0;
+
+    switch(pdu->pdu_type) {
+      case NFAPI_LBT_DL_CONFIG_REQUEST_PDSCH_PDU_TYPE: {
+        unpack_tlv_t unpack_fns[] = {
+          { NFAPI_LBT_PDSCH_REQ_PDU_REL13_TAG, &pdu->lbt_pdsch_req_pdu.lbt_pdsch_req_pdu_rel13, &unpack_lbt_pdsch_req_pdu_rel13_value},
+        };
+        unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0);
+      }
+      break;
+
+      case NFAPI_LBT_DL_CONFIG_REQUEST_DRS_PDU_TYPE: {
+        unpack_tlv_t unpack_fns[] = {
+          { NFAPI_LBT_DRS_REQ_PDU_REL13_TAG, &pdu->lbt_drs_req_pdu.lbt_drs_req_pdu_rel13, &unpack_lbt_drs_req_pdu_rel13_value},
+        };
+        unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0);
+      }
+      break;
+
+      default:
+        NFAPI_TRACE(NFAPI_TRACE_ERROR, "LBT_DL_CONFIG.request body invalid pdu type %d\n", pdu->pdu_type);
+        return 0;
+    }
+  }
+
+  return 1;
+}
+static uint8_t unpack_lbt_dl_config_request(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p7_codec_config_t *config) {
+  nfapi_lbt_dl_config_request_t *pNfapiMsg = (nfapi_lbt_dl_config_request_t *)msg;
+  unpack_p7_tlv_t unpack_fns[] = {
+    { NFAPI_LBT_DL_CONFIG_REQUEST_BODY_TAG, &pNfapiMsg->lbt_dl_config_request_body, &unpack_lbt_config_request_body_value},
+  };
+  return (pull16(ppReadPackedMsg, &pNfapiMsg->sfn_sf, end) &&
+          unpack_p7_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, end, config, &pNfapiMsg->vendor_extension));
+}
+
+static uint8_t unpack_lbt_pdsch_rsp_pdu_rel13_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_lbt_pdsch_rsp_pdu_rel13_t *value = (nfapi_lbt_pdsch_rsp_pdu_rel13_t *)tlv;
+  return (pull32(ppReadPackedMsg, &value->handle, end) &&
+          pull32(ppReadPackedMsg, &value->result, end) &&
+          pull32(ppReadPackedMsg, &value->lte_txop_symbols, end) &&
+          pull32(ppReadPackedMsg, &value->initial_partial_sf, end));
+}
+static uint8_t unpack_lbt_drs_rsp_pdu_rel13_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_lbt_drs_rsp_pdu_rel13_t *value = (nfapi_lbt_drs_rsp_pdu_rel13_t *)tlv;
+  return (pull32(ppReadPackedMsg, &value->handle, end) &&
+          pull32(ppReadPackedMsg, &value->result, end));
+}
+
+static uint8_t unpack_lbt_indication_body_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end, nfapi_p7_codec_config_t *config) {
+  nfapi_lbt_dl_indication_body_t *value = (nfapi_lbt_dl_indication_body_t *)tlv;
+
+  if(pull16(ppReadPackedMsg, &value->number_of_pdus, end) == 0)
+    return 0;
+
+  if(value->number_of_pdus > NFAPI_LBT_IND_MAX_PDU) {
+    NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s number of lbt dl ind pdu's exceed maxium (count:%d max:%d)\n", __FUNCTION__, value->number_of_pdus, NFAPI_LBT_IND_MAX_PDU);
+    return 0;
+  }
+
+  if(value->number_of_pdus > 0) {
+    value->lbt_indication_pdu_list = (nfapi_lbt_dl_indication_pdu_t *)nfapi_p7_allocate(sizeof(nfapi_lbt_dl_indication_pdu_t) * value->number_of_pdus, config);
+
+    if(value->lbt_indication_pdu_list == NULL) {
+      NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s failed to allocate lbt dl ind config pdu list (count:%d)\n", __FUNCTION__, value->number_of_pdus);
+      return 0;
+    }
+  } else {
+    value->lbt_indication_pdu_list = 0;
+  }
+
+  uint16_t i;
+  uint16_t total_number_of_pdus = value->number_of_pdus;
+
+  for(i = 0; i < total_number_of_pdus; ++i) {
+    nfapi_lbt_dl_indication_pdu_t *pdu = &(value->lbt_indication_pdu_list[i]);
+
+    if(!(pull8(ppReadPackedMsg, &pdu->pdu_type, end) &&
+         pull8(ppReadPackedMsg, &pdu->pdu_size, end)))
+      return 0;
+
+    uint8_t *packedPduEnd = (*ppReadPackedMsg) + pdu->pdu_size - 2;
+
+    if(packedPduEnd > end)
+      return 0;
+
+    switch(pdu->pdu_type) {
+      case NFAPI_LBT_DL_RSP_PDSCH_PDU_TYPE: {
+        unpack_tlv_t unpack_fns[] = {
+          { NFAPI_LBT_PDSCH_RSP_PDU_REL13_TAG, &pdu->lbt_pdsch_rsp_pdu.lbt_pdsch_rsp_pdu_rel13, &unpack_lbt_pdsch_rsp_pdu_rel13_value},
+        };
+        unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0);
+      }
+      break;
+
+      case NFAPI_LBT_DL_RSP_DRS_PDU_TYPE: {
+        unpack_tlv_t unpack_fns[] = {
+          { NFAPI_LBT_DRS_RSP_PDU_REL13_TAG, &pdu->lbt_drs_rsp_pdu.lbt_drs_rsp_pdu_rel13, &unpack_lbt_drs_rsp_pdu_rel13_value},
+        };
+        unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0);
+      }
+      break;
+
+      default:
+        NFAPI_TRACE(NFAPI_TRACE_ERROR, "LBT_DL.indication body invalid pdu type %d\n", pdu->pdu_type);
+        return 0;
+    }
+  }
+
+  return 1;
+}
+static uint8_t unpack_lbt_dl_indication(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p7_codec_config_t *config) {
+  nfapi_lbt_dl_indication_t *pNfapiMsg = (nfapi_lbt_dl_indication_t *)msg;
+  unpack_p7_tlv_t unpack_fns[] = {
+    { NFAPI_LBT_DL_INDICATION_BODY_TAG, &pNfapiMsg->lbt_dl_indication_body, &unpack_lbt_indication_body_value},
+  };
+  return (pull16(ppReadPackedMsg, &pNfapiMsg->sfn_sf, end) &&
+          unpack_p7_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, end, config, &pNfapiMsg->vendor_extension));
+}
+
+static uint8_t unpack_nb_harq_indication_fdd_rel13_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_nb_harq_indication_fdd_rel13_t *value = (nfapi_nb_harq_indication_fdd_rel13_t *)tlv;
+  return (pull8(ppReadPackedMsg, &value->harq_tb1, end));
+}
+
+
+static uint8_t unpack_nb_harq_indication_body_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end, nfapi_p7_codec_config_t *config) {
+  nfapi_nb_harq_indication_body_t *value = (nfapi_nb_harq_indication_body_t *)tlv;
+  uint8_t *nbharqBodyEnd = *ppReadPackedMsg + value->tl.length;
+
+  if(nbharqBodyEnd > end)
+    return 0;
+
+  if(pull16(ppReadPackedMsg, &value->number_of_harqs, end) == 0)
+    return 0;
+
+  if(value->number_of_harqs > NFAPI_HARQ_IND_MAX_PDU) {
+    NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s number of harq ind pdus exceed maxium (count:%d max:%d)\n", __FUNCTION__, value->number_of_harqs, NFAPI_HARQ_IND_MAX_PDU);
+    return 0;
+  }
+
+  value->nb_harq_pdu_list = (nfapi_nb_harq_indication_pdu_t *)nfapi_p7_allocate(sizeof(nfapi_nb_harq_indication_pdu_t) * value->number_of_harqs, config);
+
+  if(value->nb_harq_pdu_list == NULL) {
+    NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s failed to allocate harq ind pdu list (count:%d)\n", __FUNCTION__, value->number_of_harqs);
+    return 0;
+  }
+
+  uint8_t i = 0;
+
+  for(i = 0; i < value->number_of_harqs; ++i) {
+    nfapi_nb_harq_indication_pdu_t *pdu = &(value->nb_harq_pdu_list[i]);
+
+    if(pull16(ppReadPackedMsg, &pdu->instance_length, end) == 0)
+      return 0;
+
+    uint8_t *harqPduInstanceEnd = *ppReadPackedMsg + pdu->instance_length;
+    unpack_tlv_t unpack_fns[] = {
+      { NFAPI_RX_UE_INFORMATION_TAG, &pdu->rx_ue_information, unpack_rx_ue_information_value },
+      { NFAPI_NB_HARQ_INDICATION_FDD_REL13_TAG, &pdu->nb_harq_indication_fdd_rel13, &unpack_nb_harq_indication_fdd_rel13_value},
+      { NFAPI_UL_CQI_INFORMATION_TAG, &pdu->ul_cqi_information, &unpack_ul_cqi_information_value}
+    };
+
+    if(unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, harqPduInstanceEnd, 0, 0) == 0)
+      return 0;
+  }
+
+  return 1;
+}
+
+static uint8_t unpack_nb_harq_indication(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p7_codec_config_t *config) {
+  nfapi_nb_harq_indication_t *pNfapiMsg = (nfapi_nb_harq_indication_t *)msg;
+  unpack_p7_tlv_t unpack_fns[] = {
+    { NFAPI_NB_HARQ_INDICATION_BODY_TAG, &pNfapiMsg->nb_harq_indication_body, &unpack_nb_harq_indication_body_value},
+  };
+  return (pull16(ppReadPackedMsg, &pNfapiMsg->sfn_sf, end) &&
+          unpack_p7_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, end, config, &pNfapiMsg->vendor_extension));
+}
+
+static uint8_t unpack_nrach_indication_rel13_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_nrach_indication_pdu_rel13_t *value = (nfapi_nrach_indication_pdu_rel13_t *)tlv;
+  return (pull16(ppReadPackedMsg, &value->rnti, end) &&
+          pull8(ppReadPackedMsg, &value->initial_sc, end) &&
+          pull16(ppReadPackedMsg, &value->timing_advance, end) &&
+          pull8(ppReadPackedMsg, &value->nrach_ce_level, end));
+}
+
+static uint8_t unpack_ue_release_resp(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p7_codec_config_t *config) {
+  nfapi_ue_release_response_t *pNfapiMsg = (nfapi_ue_release_response_t *)msg;
+
+  if(pull32(ppReadPackedMsg, &pNfapiMsg->error_code, end) == 0) {
+    return 0;
+  } else {
+    NFAPI_TRACE(NFAPI_TRACE_INFO, "ue_release_response:error_code = %d\n", pNfapiMsg->error_code);
+  }
+
+  return 1;
+}
+
+static uint8_t unpack_nrach_indication_body_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end, nfapi_p7_codec_config_t *config) {
+  nfapi_nrach_indication_body_t *value = (nfapi_nrach_indication_body_t *)tlv;
+  uint8_t *nrachBodyEnd = *ppReadPackedMsg + value->tl.length;
+
+  if(nrachBodyEnd > end)
+    return 0;
+
+  if(pull8(ppReadPackedMsg, &value->number_of_initial_scs_detected, end) == 0)
+    return 0;
+
+  if(value->number_of_initial_scs_detected > NFAPI_PREAMBLE_MAX_PDU) {
+    NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s number of detected scs ind pdus exceed maxium (count:%d max:%d)\n", __FUNCTION__, value->number_of_initial_scs_detected, NFAPI_PREAMBLE_MAX_PDU);
+    return 0;
+  }
+
+  value->nrach_pdu_list = (nfapi_nrach_indication_pdu_t *)nfapi_p7_allocate(sizeof(nfapi_nrach_indication_pdu_t) * value->number_of_initial_scs_detected, config);
+
+  if(value->nrach_pdu_list == NULL) {
+    NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s failed to allocate nrach ind pdu list (count:%d)\n", __FUNCTION__, value->number_of_initial_scs_detected);
+    return 0;
+  }
+
+  uint8_t i = 0;
+
+  for(i = 0; i < value->number_of_initial_scs_detected; ++i) {
+    nfapi_nrach_indication_pdu_t *pdu = &(value->nrach_pdu_list[i]);
+    uint8_t *nrachPduInstanceEnd = *ppReadPackedMsg + 4 + 6;
+    unpack_tlv_t unpack_fns[] = {
+      { NFAPI_NRACH_INDICATION_REL13_TAG, &pdu->nrach_indication_rel13, &unpack_nrach_indication_rel13_value},
+    };
+
+    if(unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, nrachPduInstanceEnd, 0, 0) == 0)
+      return 0;
+  }
+
+  return 1;
+}
+
+static uint8_t unpack_nrach_indication(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p7_codec_config_t *config) {
+  nfapi_nrach_indication_t *pNfapiMsg = (nfapi_nrach_indication_t *)msg;
+  unpack_p7_tlv_t unpack_fns[] = {
+    { NFAPI_NRACH_INDICATION_BODY_TAG, &pNfapiMsg->nrach_indication_body, &unpack_nrach_indication_body_value},
+  };
+  return (pull16(ppReadPackedMsg, &pNfapiMsg->sfn_sf, end) &&
+          unpack_p7_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, end, config, &pNfapiMsg->vendor_extension));
+}
+
+static uint8_t unpack_nr_dl_node_sync(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p7_codec_config_t *config) {
+  nfapi_nr_dl_node_sync_t *pNfapiMsg = (nfapi_nr_dl_node_sync_t *)msg;
+  return (pull32(ppReadPackedMsg, &pNfapiMsg->t1, end) &&
+          pulls32(ppReadPackedMsg, &pNfapiMsg->delta_sfn_slot, end) &&
+          unpack_p7_tlv_list(NULL, 0, ppReadPackedMsg, end, config, &pNfapiMsg->vendor_extension));
+}
+
+static uint8_t unpack_dl_node_sync(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p7_codec_config_t *config) {
+  nfapi_dl_node_sync_t *pNfapiMsg = (nfapi_dl_node_sync_t *)msg;
+  return (pull32(ppReadPackedMsg, &pNfapiMsg->t1, end) &&
+          pulls32(ppReadPackedMsg, &pNfapiMsg->delta_sfn_sf, end) &&
+          unpack_p7_tlv_list(NULL, 0, ppReadPackedMsg, end, config, &pNfapiMsg->vendor_extension));
+}
+
+
+static uint8_t unpack_nr_ul_node_sync(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p7_codec_config_t *config) {
+  nfapi_nr_ul_node_sync_t *pNfapiMsg = (nfapi_nr_ul_node_sync_t *)msg;
+  return (pull32(ppReadPackedMsg, &pNfapiMsg->t1, end) &&
+          pull32(ppReadPackedMsg, &pNfapiMsg->t2, end) &&
+          pull32(ppReadPackedMsg, &pNfapiMsg->t3, end) &&
+          unpack_p7_tlv_list(NULL, 0, ppReadPackedMsg, end, config, &pNfapiMsg->vendor_extension));
+}
+
+
+static uint8_t unpack_ul_node_sync(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p7_codec_config_t *config) {
+  nfapi_ul_node_sync_t *pNfapiMsg = (nfapi_ul_node_sync_t *)msg;
+  return (pull32(ppReadPackedMsg, &pNfapiMsg->t1, end) &&
+          pull32(ppReadPackedMsg, &pNfapiMsg->t2, end) &&
+          pull32(ppReadPackedMsg, &pNfapiMsg->t3, end) &&
+          unpack_p7_tlv_list(NULL, 0, ppReadPackedMsg, end, config, &pNfapiMsg->vendor_extension));
+}
+
+static uint8_t unpack_timing_info(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p7_codec_config_t *config) {
+  nfapi_timing_info_t *pNfapiMsg = (nfapi_timing_info_t *)msg;
+  return (pull32(ppReadPackedMsg, &pNfapiMsg->last_sfn_sf, end) &&
+          pull32(ppReadPackedMsg, &pNfapiMsg->time_since_last_timing_info, end) &&
+          pull32(ppReadPackedMsg, &pNfapiMsg->dl_config_jitter, end) &&
+          pull32(ppReadPackedMsg, &pNfapiMsg->tx_request_jitter, end) &&
+          pull32(ppReadPackedMsg, &pNfapiMsg->ul_config_jitter, end) &&
+          pull32(ppReadPackedMsg, &pNfapiMsg->hi_dci0_jitter, end) &&
+          pulls32(ppReadPackedMsg, &pNfapiMsg->dl_config_latest_delay, end) &&
+          pulls32(ppReadPackedMsg, &pNfapiMsg->tx_request_latest_delay, end) &&
+          pulls32(ppReadPackedMsg, &pNfapiMsg->ul_config_latest_delay, end) &&
+          pulls32(ppReadPackedMsg, &pNfapiMsg->hi_dci0_latest_delay, end) &&
+          pulls32(ppReadPackedMsg, &pNfapiMsg->dl_config_earliest_arrival, end) &&
+          pulls32(ppReadPackedMsg, &pNfapiMsg->tx_request_earliest_arrival, end) &&
+          pulls32(ppReadPackedMsg, &pNfapiMsg->ul_config_earliest_arrival, end) &&
+          pulls32(ppReadPackedMsg, &pNfapiMsg->hi_dci0_earliest_arrival, end) &&
+          unpack_p7_tlv_list(NULL, 0, ppReadPackedMsg, end, config, &pNfapiMsg->vendor_extension));
+}
+
+
+static uint8_t unpack_nr_timing_info(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p7_codec_config_t *config) {
+  nfapi_nr_timing_info_t *pNfapiMsg = (nfapi_nr_timing_info_t *)msg;
+  return (pull32(ppReadPackedMsg, &pNfapiMsg->last_sfn, end) &&
+          pull32(ppReadPackedMsg, &pNfapiMsg->last_slot, end) &&
+          pull32(ppReadPackedMsg, &pNfapiMsg->time_since_last_timing_info, end) &&
+          pull32(ppReadPackedMsg, &pNfapiMsg->dl_tti_jitter, end) &&
+          pull32(ppReadPackedMsg, &pNfapiMsg->tx_data_request_jitter, end) &&
+          pull32(ppReadPackedMsg, &pNfapiMsg->ul_tti_jitter, end) &&
+          pull32(ppReadPackedMsg, &pNfapiMsg->ul_dci_jitter, end) &&
+          pulls32(ppReadPackedMsg, &pNfapiMsg->dl_tti_latest_delay, end) &&
+          pulls32(ppReadPackedMsg, &pNfapiMsg->tx_data_request_latest_delay, end) &&
+          pulls32(ppReadPackedMsg, &pNfapiMsg->ul_tti_latest_delay, end) &&
+          pulls32(ppReadPackedMsg, &pNfapiMsg->ul_dci_latest_delay, end) &&
+          pulls32(ppReadPackedMsg, &pNfapiMsg->dl_tti_earliest_arrival, end) &&
+          pulls32(ppReadPackedMsg, &pNfapiMsg->tx_data_request_earliest_arrival, end) &&
+          pulls32(ppReadPackedMsg, &pNfapiMsg->ul_tti_earliest_arrival, end) &&
+          pulls32(ppReadPackedMsg, &pNfapiMsg->ul_dci_earliest_arrival, end) &&
+          unpack_p7_tlv_list(NULL, 0, ppReadPackedMsg, end, config, &pNfapiMsg->vendor_extension));
+}
+
+
+
+// unpack length check
+
+static int check_unpack_length(nfapi_message_id_e msgId, uint32_t unpackedBufLen) {
+  int retLen = 0;
+
+  switch (msgId) {
+    case NFAPI_DL_CONFIG_REQUEST:
+      if (unpackedBufLen >= sizeof(nfapi_dl_config_request_t))
+        retLen = sizeof(nfapi_dl_config_request_t);
+
+      break;
+
+    case NFAPI_UL_CONFIG_REQUEST:
+      if (unpackedBufLen >= sizeof(nfapi_ul_config_request_t))
+        retLen = sizeof(nfapi_ul_config_request_t);
+
+      break;
+
+    case NFAPI_SUBFRAME_INDICATION:
+      if (unpackedBufLen >= sizeof(nfapi_subframe_indication_t))
+        retLen = sizeof(nfapi_subframe_indication_t);
+
+      break;
+
+    case NFAPI_HI_DCI0_REQUEST:
+      if (unpackedBufLen >= sizeof(nfapi_hi_dci0_request_t))
+        retLen = sizeof(nfapi_hi_dci0_request_t);
+
+      break;
+
+    case NFAPI_TX_REQUEST:
+      if (unpackedBufLen >= sizeof(nfapi_tx_request_t))
+        retLen = sizeof(nfapi_tx_request_t);
+
+      break;
+
+    case NFAPI_HARQ_INDICATION:
+      if (unpackedBufLen >= sizeof(nfapi_harq_indication_t))
+        retLen = sizeof(nfapi_harq_indication_t);
+
+      break;
+
+    case NFAPI_CRC_INDICATION:
+      if (unpackedBufLen >= sizeof(nfapi_crc_indication_t))
+        retLen = sizeof(nfapi_crc_indication_t);
+
+      break;
+
+    case NFAPI_RX_ULSCH_INDICATION:
+      if (unpackedBufLen >= sizeof(nfapi_rx_indication_t))
+        retLen = sizeof(nfapi_rx_indication_t);
+
+      break;
+
+    case NFAPI_RACH_INDICATION:
+      if (unpackedBufLen >= sizeof(nfapi_rach_indication_t))
+        retLen = sizeof(nfapi_rach_indication_t);
+
+      break;
+
+    case NFAPI_SRS_INDICATION:
+      if (unpackedBufLen >= sizeof(nfapi_srs_indication_t))
+        retLen = sizeof(nfapi_srs_indication_t);
+
+      break;
+
+    case NFAPI_RX_SR_INDICATION:
+      if (unpackedBufLen >= sizeof(nfapi_sr_indication_t))
+        retLen = sizeof(nfapi_sr_indication_t);
+
+      break;
+
+    case NFAPI_RX_CQI_INDICATION:
+      if (unpackedBufLen >= sizeof(nfapi_cqi_indication_t))
+        retLen = sizeof(nfapi_cqi_indication_t);
+
+      break;
+
+    case NFAPI_LBT_DL_CONFIG_REQUEST:
+      if (unpackedBufLen >= sizeof(nfapi_lbt_dl_config_request_t))
+        retLen = sizeof(nfapi_lbt_dl_config_request_t);
+
+      break;
+
+    case NFAPI_LBT_DL_INDICATION:
+      if (unpackedBufLen >= sizeof(nfapi_lbt_dl_indication_t))
+        retLen = sizeof(nfapi_lbt_dl_indication_t);
+
+      break;
+
+    case NFAPI_NB_HARQ_INDICATION:
+      if (unpackedBufLen >= sizeof(nfapi_nb_harq_indication_t))
+        retLen = sizeof(nfapi_nb_harq_indication_t);
+
+      break;
+
+    case NFAPI_NRACH_INDICATION:
+      if (unpackedBufLen >= sizeof(nfapi_nrach_indication_t))
+        retLen = sizeof(nfapi_nrach_indication_t);
+
+      break;
+
+    case NFAPI_DL_NODE_SYNC:
+      if (unpackedBufLen >= sizeof(nfapi_dl_node_sync_t))
+        retLen = sizeof(nfapi_dl_node_sync_t);
+
+      break;
+
+    case NFAPI_UL_NODE_SYNC:
+      if (unpackedBufLen >= sizeof(nfapi_ul_node_sync_t))
+        retLen = sizeof(nfapi_ul_node_sync_t);
+
+      break;
+
+    case NFAPI_TIMING_INFO:
+      if (unpackedBufLen >= sizeof(nfapi_timing_info_t))
+        retLen = sizeof(nfapi_timing_info_t);
+
+      break;
+
+    case NFAPI_UE_RELEASE_REQUEST:
+      if (unpackedBufLen >= sizeof(nfapi_ue_release_request_t))
+        retLen = sizeof(nfapi_ue_release_request_t);
+
+      break;
+
+    case NFAPI_UE_RELEASE_RESPONSE:
+      if (unpackedBufLen >= sizeof(nfapi_ue_release_response_t))
+        retLen = sizeof(nfapi_ue_release_response_t);
+
+      break;
+
+    default:
+      NFAPI_TRACE(NFAPI_TRACE_ERROR, "Unknown message ID %d\n", msgId);
+      break;
+  }
+
+  return retLen;
+}
+
+static int check_nr_unpack_length(nfapi_message_id_e msgId, uint32_t unpackedBufLen)
+{
+	int retLen = 0;
+
+	switch (msgId)
+	{
+		case NFAPI_NR_PHY_MSG_TYPE_DL_TTI_REQUEST:
+			if (unpackedBufLen >= sizeof(nfapi_nr_dl_tti_request_t))
+				retLen = sizeof(nfapi_nr_dl_tti_request_t);
+			break;
+
+		case NFAPI_NR_PHY_MSG_TYPE_UL_TTI_REQUEST:
+			if (unpackedBufLen >= sizeof(nfapi_nr_ul_tti_request_t))
+				retLen = sizeof(nfapi_nr_ul_tti_request_t);
+			break;
+
+		case NFAPI_SUBFRAME_INDICATION:
+			if (unpackedBufLen >= sizeof(nfapi_subframe_indication_t))
+				retLen = sizeof(nfapi_subframe_indication_t);
+			break;
+
+		case NFAPI_NR_PHY_MSG_TYPE_UL_DCI_REQUEST:
+			if (unpackedBufLen >= sizeof(nfapi_nr_ul_dci_request_t))
+				retLen = sizeof(nfapi_nr_ul_dci_request_t);
+			break;
+
+		case NFAPI_NR_PHY_MSG_TYPE_TX_DATA_REQUEST:
+			if (unpackedBufLen >= sizeof(nfapi_nr_tx_data_request_t))
+				retLen = sizeof(nfapi_nr_tx_data_request_t);
+			break;
+
+		case NFAPI_NR_PHY_MSG_TYPE_RX_DATA_INDICATION:
+			if (unpackedBufLen >= sizeof(nfapi_nr_rx_data_indication_t))
+				retLen = sizeof(nfapi_nr_rx_data_indication_t);
+			break;
+
+		case NFAPI_NR_PHY_MSG_TYPE_CRC_INDICATION:
+			if (unpackedBufLen >= sizeof(nfapi_nr_crc_indication_t))
+				retLen = sizeof(nfapi_nr_crc_indication_t);
+			break;
+
+		case NFAPI_NR_PHY_MSG_TYPE_RACH_INDICATION:
+			if (unpackedBufLen >= sizeof(nfapi_nr_rach_indication_t))
+				retLen = sizeof(nfapi_nr_rach_indication_t);
+			break;
+
+		case NFAPI_NR_PHY_MSG_TYPE_UCI_INDICATION:
+			if (unpackedBufLen >= sizeof(nfapi_nr_uci_indication_t))
+				retLen = sizeof(nfapi_nr_uci_indication_t);
+			break;
+
+		case NFAPI_NR_PHY_MSG_TYPE_SRS_INDICATION:
+			if (unpackedBufLen >= sizeof(nfapi_nr_srs_indication_t))
+				retLen = sizeof(nfapi_nr_srs_indication_t);
+			break;
+
+		case NFAPI_NR_PHY_MSG_TYPE_DL_NODE_SYNC:
+			if (unpackedBufLen >= sizeof(nfapi_nr_dl_node_sync_t))
+				retLen = sizeof(nfapi_nr_dl_node_sync_t);
+			break;
+
+		case NFAPI_NR_PHY_MSG_TYPE_UL_NODE_SYNC:
+			if (unpackedBufLen >= sizeof(nfapi_nr_ul_node_sync_t))
+				retLen = sizeof(nfapi_nr_ul_node_sync_t);
+			break;
+
+		case NFAPI_TIMING_INFO:
+			if (unpackedBufLen >= sizeof(nfapi_timing_info_t))
+				retLen = sizeof(nfapi_timing_info_t);
+			break;
+
+		case NFAPI_UE_RELEASE_REQUEST:
+			if (unpackedBufLen >= sizeof(nfapi_ue_release_request_t))
+				retLen = sizeof(nfapi_ue_release_request_t);
+			break;
+
+		case NFAPI_UE_RELEASE_RESPONSE:
+			if (unpackedBufLen >= sizeof(nfapi_ue_release_response_t))
+				retLen = sizeof(nfapi_ue_release_response_t);
+			break;
+
+		default:
+			NFAPI_TRACE(NFAPI_TRACE_ERROR, "Unknown message ID %d\n", msgId);
+			break;
+	}
+
+	return retLen;
+}
+
+
+
+// Main unpack functions - public
+
+int nfapi_p7_message_header_unpack(void *pMessageBuf, uint32_t messageBufLen, void *pUnpackedBuf, uint32_t unpackedBufLen, nfapi_p7_codec_config_t *config) {
+  nfapi_p7_message_header_t *pMessageHeader = pUnpackedBuf;
+  uint8_t *pReadPackedMessage = pMessageBuf;
+  uint8_t *end = pMessageBuf + messageBufLen;
+
+  if (pMessageBuf == NULL || pUnpackedBuf == NULL) {
+    NFAPI_TRACE(NFAPI_TRACE_ERROR, "P7 header unpack supplied pointers are null\n");
+    return -1;
+  }
+
+  if (messageBufLen < NFAPI_P7_HEADER_LENGTH || unpackedBufLen < sizeof(nfapi_p7_message_header_t)) {
+    NFAPI_TRACE(NFAPI_TRACE_ERROR, "P7 header unpack supplied message buffer is too small %d, %d\n", messageBufLen, unpackedBufLen);
+    return -1;
+  }
+
+  // process the header
+  if(!(pull16(&pReadPackedMessage, &pMessageHeader->phy_id, end) &&
+       pull16(&pReadPackedMessage, &pMessageHeader->message_id, end) &&
+       pull16(&pReadPackedMessage, &pMessageHeader->message_length, end) &&
+       pull16(&pReadPackedMessage, &pMessageHeader->m_segment_sequence, end) &&
+       pull32(&pReadPackedMessage, &pMessageHeader->checksum, end) &&
+       pull32(&pReadPackedMessage, &pMessageHeader->transmit_timestamp, end)))
+    return -1;
+
+  return 0;
+}
+
+int nfapi_p7_message_unpack(void *pMessageBuf, uint32_t messageBufLen, void *pUnpackedBuf, uint32_t unpackedBufLen, nfapi_p7_codec_config_t *config) {
+  int result = 0;
+  nfapi_p7_message_header_t *pMessageHeader = (nfapi_p7_message_header_t *)pUnpackedBuf;
+  uint8_t *pReadPackedMessage = pMessageBuf;
+  uint8_t *end = pMessageBuf + messageBufLen;
+
+  if (pMessageBuf == NULL || pUnpackedBuf == NULL) {
+    NFAPI_TRACE(NFAPI_TRACE_ERROR, "P7 unpack supplied pointers are null\n");
+    return -1;
+  }
+
+  if (messageBufLen < NFAPI_P7_HEADER_LENGTH || unpackedBufLen < sizeof(nfapi_p7_message_header_t)) {
+    NFAPI_TRACE(NFAPI_TRACE_ERROR, "P7 unpack supplied message buffer is too small %d, %d\n", messageBufLen, unpackedBufLen);
+    return -1;
+  }
+
+  /*
+    uint8_t *ptr = pMessageBuf;
+  printf("\n Read P7 message unpack: ");
+  while(ptr < end){
+    printf(" %d ", *ptr);
+    ptr++;
+  }
+  printf("\n");
+  */
+  // clean the supplied buffer for - tag value blanking
+  (void)memset(pUnpackedBuf, 0, unpackedBufLen);
+
+  // process the header
+  if(!(pull16(&pReadPackedMessage, &pMessageHeader->phy_id, end) &&
+       pull16(&pReadPackedMessage, &pMessageHeader->message_id, end) &&
+       pull16(&pReadPackedMessage, &pMessageHeader->message_length, end) &&
+       pull16(&pReadPackedMessage, &pMessageHeader->m_segment_sequence, end) &&
+       pull32(&pReadPackedMessage, &pMessageHeader->checksum, end) &&
+       pull32(&pReadPackedMessage, &pMessageHeader->transmit_timestamp, end))) {
+    NFAPI_TRACE(NFAPI_TRACE_ERROR, "P7 unpack header failed\n");
+    return -1;
+  }
+
+  if((uint8_t *)(pMessageBuf + pMessageHeader->message_length) > end) {
+    NFAPI_TRACE(NFAPI_TRACE_ERROR, "P7 unpack message length is greater than the message buffer \n");
+    return -1;
+  }
+
+  /*
+  if(check_unpack_length(pMessageHeader->message_id, unpackedBufLen) == 0)
+  {
+    NFAPI_TRACE(NFAPI_TRACE_ERROR, "P7 unpack unpack buffer is not large enough \n");
+    return -1;
+  }
+  */
+
+  // look for the specific message
+  switch (pMessageHeader->message_id) {
+    case NFAPI_DL_CONFIG_REQUEST:
+      if (check_unpack_length(NFAPI_DL_CONFIG_REQUEST, unpackedBufLen))
+        result = unpack_dl_config_request(&pReadPackedMessage,  end, pMessageHeader, config);
+      else
+        return -1;
+
+      break;
+
+    case NFAPI_UL_CONFIG_REQUEST:
+      if (check_unpack_length(NFAPI_UL_CONFIG_REQUEST, unpackedBufLen))
+        result = unpack_ul_config_request(&pReadPackedMessage, end, pMessageHeader, config);
+      else
+        return -1;
+
+      break;
+
+    case NFAPI_TX_REQUEST:
+      if (check_unpack_length(NFAPI_TX_REQUEST, unpackedBufLen))
+        result = unpack_tx_request(&pReadPackedMessage,  end, pMessageHeader, config);
+      else
+        return -1;
+
+      break;
+
+    case NFAPI_HI_DCI0_REQUEST:
+      if (check_unpack_length(NFAPI_HI_DCI0_REQUEST, unpackedBufLen))
+        result = unpack_hi_dci0_request(&pReadPackedMessage,  end, pMessageHeader, config);
+      else
+        return -1;
+
+      break;
+
+    case NFAPI_UE_RELEASE_REQUEST:
+      if (check_unpack_length(NFAPI_UE_RELEASE_REQUEST, unpackedBufLen))
+        result = unpack_ue_release_request(&pReadPackedMessage,  end, pMessageHeader, config);
+      else
+        return -1;
+
+      break;
+
+    case NFAPI_HARQ_INDICATION:
+      if (check_unpack_length(NFAPI_HARQ_INDICATION, unpackedBufLen))
+        result = unpack_harq_indication(&pReadPackedMessage,  end, pMessageHeader, config);
+      else
+        return -1;
+
+      break;
+
+    case NFAPI_CRC_INDICATION:
+      if (check_unpack_length(NFAPI_CRC_INDICATION, unpackedBufLen))
+        result = unpack_crc_indication(&pReadPackedMessage,end, pMessageHeader, config);
+      else
+        return -1;
+
+      break;
+
+    case NFAPI_RX_ULSCH_INDICATION:
+      if (check_unpack_length(NFAPI_RX_ULSCH_INDICATION, unpackedBufLen))
+        result = unpack_rx_indication(&pReadPackedMessage,  end, pMessageHeader, config);
+      else
+        return -1;
+
+      break;
+
+    case NFAPI_RACH_INDICATION:
+      if (check_unpack_length(NFAPI_RACH_INDICATION, unpackedBufLen))
+        result = unpack_rach_indication(&pReadPackedMessage,  end, pMessageHeader, config);
+      else
+        return -1;
+
+      break;
+
+    case NFAPI_SRS_INDICATION:
+      if (check_unpack_length(NFAPI_SRS_INDICATION, unpackedBufLen))
+        result = unpack_srs_indication(&pReadPackedMessage,  end, pMessageHeader, config);
+      else
+        return -1;
+
+      break;
+
+    case NFAPI_RX_SR_INDICATION:
+      if (check_unpack_length(NFAPI_RX_SR_INDICATION, unpackedBufLen))
+        result = unpack_sr_indication(&pReadPackedMessage,  end, pMessageHeader, config);
+      else
+        return -1;
+
+      break;
+
+    case NFAPI_RX_CQI_INDICATION:
+      if (check_unpack_length(NFAPI_RX_CQI_INDICATION, unpackedBufLen))
+        result = unpack_cqi_indication(&pReadPackedMessage,  end, pMessageHeader, config);
+      else
+        return -1;
+
+      break;
+
+    case NFAPI_LBT_DL_CONFIG_REQUEST:
+      if (check_unpack_length(NFAPI_LBT_DL_CONFIG_REQUEST, unpackedBufLen))
+        result = unpack_lbt_dl_config_request(&pReadPackedMessage,  end, pMessageHeader, config);
+      else
+        return -1;
+
+      break;
+
+    case NFAPI_LBT_DL_INDICATION:
+      if (check_unpack_length(NFAPI_LBT_DL_INDICATION, unpackedBufLen))
+        result = unpack_lbt_dl_indication(&pReadPackedMessage,  end, pMessageHeader, config);
+      else
+        return -1;
+
+      break;
+
+    case NFAPI_NB_HARQ_INDICATION:
+      if (check_unpack_length(NFAPI_NB_HARQ_INDICATION, unpackedBufLen))
+        result = unpack_nb_harq_indication(&pReadPackedMessage,  end, pMessageHeader, config);
+      else
+        return -1;
+
+      break;
+
+    case NFAPI_NRACH_INDICATION:
+      if (check_unpack_length(NFAPI_NRACH_INDICATION, unpackedBufLen))
+        result = unpack_nrach_indication(&pReadPackedMessage,  end, pMessageHeader, config);
+      else
+        return -1;
+
+      break;
+
+    case NFAPI_DL_NODE_SYNC:
+      if (check_unpack_length(NFAPI_DL_NODE_SYNC, unpackedBufLen))
+        result = unpack_dl_node_sync(&pReadPackedMessage,  end, pMessageHeader, config);
+      else
+        return -1;
+
+      break;
+
+    case NFAPI_UL_NODE_SYNC:
+      if (check_unpack_length(NFAPI_UL_NODE_SYNC, unpackedBufLen))
+        result = unpack_ul_node_sync(&pReadPackedMessage, end, pMessageHeader, config);
+      else
+        return -1;
+
+      break;
+
+    case NFAPI_TIMING_INFO:
+      if (check_unpack_length(NFAPI_TIMING_INFO, unpackedBufLen))
+        result = unpack_timing_info(&pReadPackedMessage, end, pMessageHeader, config);
+      else
+        return -1;
+
+      break;
+
+    case NFAPI_UE_RELEASE_RESPONSE:
+      if (check_unpack_length(NFAPI_UE_RELEASE_RESPONSE, unpackedBufLen))
+        result = unpack_ue_release_resp(&pReadPackedMessage,  end, pMessageHeader, config);
+      else
+        return -1;
+
+      break;
+
+    default:
+      if(pMessageHeader->message_id >= NFAPI_VENDOR_EXT_MSG_MIN &&
+          pMessageHeader->message_id <= NFAPI_VENDOR_EXT_MSG_MAX) {
+        if(config && config->unpack_p7_vendor_extension) {
+          result = (config->unpack_p7_vendor_extension)(pMessageHeader, &pReadPackedMessage, end, config);
+        } else {
+          NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s VE NFAPI message ID %d. No ve decoder provided\n", __FUNCTION__, pMessageHeader->message_id);
+        }
+      } else {
+        NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s NFAPI Unknown message ID %d\n", __FUNCTION__, pMessageHeader->message_id);
+      }
+
+      break;
+  }
+
+  if(result == 0)
+    return -1;
+  else
+    return 0;
+}
+
+int nfapi_nr_p7_message_unpack(void *pMessageBuf, uint32_t messageBufLen, void *pUnpackedBuf, uint32_t unpackedBufLen, nfapi_p7_codec_config_t* config)
+{
+	int result = 0;
+	nfapi_p7_message_header_t *pMessageHeader = (nfapi_p7_message_header_t*)pUnpackedBuf;
+	uint8_t *pReadPackedMessage = pMessageBuf;
+	uint8_t *end = pMessageBuf + messageBufLen;
+
+	if (pMessageBuf == NULL || pUnpackedBuf == NULL)
+	{
+		NFAPI_TRACE(NFAPI_TRACE_ERROR, "P7 unpack supplied pointers are null\n");
+		return -1;
+	}
+
+	if (messageBufLen < NFAPI_P7_HEADER_LENGTH || unpackedBufLen < sizeof(nfapi_p7_message_header_t))
+	{
+		NFAPI_TRACE(NFAPI_TRACE_ERROR, "P7 unpack supplied message buffer is too small %d, %d\n", messageBufLen, unpackedBufLen);
+		return -1;
+	}
+
+    // uint8_t *ptr = pMessageBuf;
+	// printf("\n Read P7 message unpack: ");
+	// while(ptr < end){
+	// 	printf(" %d ", *ptr);
+	// 	ptr++;
+	// }
+	// printf("\n");
+
+	// clean the supplied buffer for - tag value blanking
+	(void)memset(pUnpackedBuf, 0, unpackedBufLen);
+
+	// process the header
+	if(!(pull16(&pReadPackedMessage, &pMessageHeader->phy_id, end) &&
+		 pull16(&pReadPackedMessage, &pMessageHeader->message_id, end) &&
+		 pull16(&pReadPackedMessage, &pMessageHeader->message_length, end) &&
+		 pull16(&pReadPackedMessage, &pMessageHeader->m_segment_sequence, end) &&
+		 pull32(&pReadPackedMessage, &pMessageHeader->checksum, end) &&
+		 pull32(&pReadPackedMessage, &pMessageHeader->transmit_timestamp, end)))
+	{
+		NFAPI_TRACE(NFAPI_TRACE_ERROR, "P7 unpack header failed\n");
+		return -1;
+	}
+
+	if((uint8_t*)(pMessageBuf + pMessageHeader->message_length) > end)
+	{
+		NFAPI_TRACE(NFAPI_TRACE_ERROR, "P7 unpack message length is greater than the message buffer \n");
+		return -1;
+	}
+
+	/*
+	if(check_unpack_length(pMessageHeader->message_id, unpackedBufLen) == 0)
+	{
+		NFAPI_TRACE(NFAPI_TRACE_ERROR, "P7 unpack unpack buffer is not large enough \n");
+		return -1;
+	}
+	*/
+
+	// look for the specific message
+	switch (pMessageHeader->message_id)
+	{
+		case NFAPI_NR_PHY_MSG_TYPE_DL_TTI_REQUEST:
+			if (check_nr_unpack_length(NFAPI_NR_PHY_MSG_TYPE_DL_TTI_REQUEST, unpackedBufLen))
+				result = unpack_dl_tti_request(&pReadPackedMessage,  end, pMessageHeader, config);
+			else
+				return -1;
+			break;
+
+		case NFAPI_NR_PHY_MSG_TYPE_UL_TTI_REQUEST:
+			if (check_nr_unpack_length(NFAPI_NR_PHY_MSG_TYPE_UL_TTI_REQUEST, unpackedBufLen))
+				result = unpack_ul_tti_request(&pReadPackedMessage,  end, pMessageHeader, config);
+			else
+				return -1;
+			break;
+		case NFAPI_NR_PHY_MSG_TYPE_TX_DATA_REQUEST:
+			if (check_nr_unpack_length(NFAPI_NR_PHY_MSG_TYPE_TX_DATA_REQUEST, unpackedBufLen))
+				result = unpack_tx_data_request(&pReadPackedMessage,  end, pMessageHeader, config);
+			else
+				return -1;
+			break;
+		case NFAPI_NR_PHY_MSG_TYPE_UL_DCI_REQUEST:
+			if (check_nr_unpack_length(NFAPI_NR_PHY_MSG_TYPE_UL_DCI_REQUEST, unpackedBufLen))
+				result = unpack_ul_dci_request(&pReadPackedMessage,  end, pMessageHeader, config);
+			else
+				return -1;
+			break;
+
+		case NFAPI_UE_RELEASE_REQUEST:
+			if (check_nr_unpack_length(NFAPI_UE_RELEASE_REQUEST, unpackedBufLen))
+				result = unpack_ue_release_request(&pReadPackedMessage,  end, pMessageHeader, config);
+			else
+				return -1;
+			break;
+		case NFAPI_NR_PHY_MSG_TYPE_SLOT_INDICATION:
+			if (check_nr_unpack_length(NFAPI_NR_PHY_MSG_TYPE_SLOT_INDICATION, unpackedBufLen)){
+				nfapi_nr_slot_indication_scf_t* msg = (nfapi_nr_slot_indication_scf_t*) pMessageHeader;
+				result = unpack_nr_slot_indication(&pReadPackedMessage,  end, msg, config);
+			}
+			else
+				return -1;
+			break;
+
+		case  NFAPI_NR_PHY_MSG_TYPE_RX_DATA_INDICATION:
+			if (check_nr_unpack_length(NFAPI_NR_PHY_MSG_TYPE_RX_DATA_INDICATION, unpackedBufLen)){
+				nfapi_nr_rx_data_indication_t* msg = (nfapi_nr_rx_data_indication_t*) pMessageHeader;
+				msg->pdu_list = (nfapi_nr_rx_data_pdu_t*) malloc(sizeof(nfapi_nr_rx_data_pdu_t));
+				msg->pdu_list->pdu = (uint8_t *) malloc(sizeof(uint8_t));
+				result = unpack_nr_rx_data_indication(&pReadPackedMessage,  end, msg, config);
+			}
+			else
+				return -1;
+			break;
+
+		case  NFAPI_NR_PHY_MSG_TYPE_CRC_INDICATION:
+			if (check_nr_unpack_length(NFAPI_NR_PHY_MSG_TYPE_CRC_INDICATION, unpackedBufLen)){
+
+				nfapi_nr_crc_indication_t* msg = (nfapi_nr_crc_indication_t*) pMessageHeader;
+				msg->crc_list = (nfapi_nr_crc_t*) malloc(sizeof(nfapi_nr_crc_t));
+				result = unpack_nr_crc_indication(&pReadPackedMessage,end , msg, config);
+			}
+			else
+				return -1;
+			break;
+
+		case  NFAPI_NR_PHY_MSG_TYPE_UCI_INDICATION:
+			if (check_nr_unpack_length(NFAPI_NR_PHY_MSG_TYPE_UCI_INDICATION, unpackedBufLen)){
+				nfapi_nr_uci_indication_t* msg = (nfapi_nr_uci_indication_t*) pMessageHeader;
+				msg->uci_list = (nfapi_nr_uci_t*) malloc(sizeof(nfapi_nr_uci_t));
+				result = unpack_nr_uci_indication(&pReadPackedMessage,  end, msg, config);
+			}
+			else
+				return -1;
+			break;
+
+		case  NFAPI_NR_PHY_MSG_TYPE_SRS_INDICATION:
+			if (check_nr_unpack_length(NFAPI_NR_PHY_MSG_TYPE_SRS_INDICATION, unpackedBufLen)){
+				nfapi_nr_srs_indication_t* msg = (nfapi_nr_srs_indication_t*) pMessageHeader;
+				msg->pdu_list = (nfapi_nr_srs_indication_pdu_t*) malloc(sizeof(nfapi_nr_srs_indication_pdu_t));
+				result = unpack_nr_srs_indication(&pReadPackedMessage,  end, msg, config);
+			}
+			else
+				return -1;
+			break;
+
+		case  NFAPI_NR_PHY_MSG_TYPE_RACH_INDICATION:
+			if (check_nr_unpack_length(NFAPI_NR_PHY_MSG_TYPE_RACH_INDICATION, unpackedBufLen)){
+				nfapi_nr_rach_indication_t* msg = (nfapi_nr_rach_indication_t*) pMessageHeader;
+				result = unpack_nr_rach_indication(&pReadPackedMessage,  end, msg, config);
+			}
+			else
+				return -1;
+			break;
+
+		case NFAPI_NR_PHY_MSG_TYPE_DL_NODE_SYNC:
+			if (check_nr_unpack_length(NFAPI_NR_PHY_MSG_TYPE_DL_NODE_SYNC, unpackedBufLen))
+				result = unpack_nr_dl_node_sync(&pReadPackedMessage,  end, pMessageHeader, config);
+			else
+				return -1;
+			break;
+
+		case NFAPI_NR_PHY_MSG_TYPE_UL_NODE_SYNC:
+			if (check_nr_unpack_length(NFAPI_NR_PHY_MSG_TYPE_UL_NODE_SYNC, unpackedBufLen))
+				result = unpack_nr_ul_node_sync(&pReadPackedMessage, end , pMessageHeader, config);
+			else
+				return -1;
+			break;
+
+		case NFAPI_TIMING_INFO:
+			if (check_nr_unpack_length(NFAPI_TIMING_INFO, unpackedBufLen))
+				result = unpack_nr_timing_info(&pReadPackedMessage, end, pMessageHeader, config);
+			else
+				return -1;
+			break;
+
+		case NFAPI_UE_RELEASE_RESPONSE:
+			if (check_nr_unpack_length(NFAPI_UE_RELEASE_RESPONSE, unpackedBufLen))
+				result = unpack_ue_release_resp(&pReadPackedMessage,  end, pMessageHeader, config);
+			else
+				return -1;
+			break;
+
+		default:
+
+			if(pMessageHeader->message_id >= NFAPI_VENDOR_EXT_MSG_MIN &&
+			   pMessageHeader->message_id <= NFAPI_VENDOR_EXT_MSG_MAX)
+			{
+				if(config && config->unpack_p7_vendor_extension)
+				{
+					result = (config->unpack_p7_vendor_extension)(pMessageHeader, &pReadPackedMessage, end, config);
+				}
+				else
+				{
+					NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s VE NFAPI message ID %d. No ve decoder provided\n", __FUNCTION__, pMessageHeader->message_id);
+				}
+			}
+			else
+			{
+				NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s NFAPI Unknown message ID %d\n", __FUNCTION__, pMessageHeader->message_id);
+			}
+			break;
+	}
+
+	if(result == 0)
+		return -1;
+	else
+		return 0;
+}
diff --git a/openair1/PHY/CODING/nr_rate_matching.c b/openair1/PHY/CODING/nr_rate_matching.c
index b1ce6ab0de1f023a5357221937b1e2cd95d1e3fa..ae49f9a4a7cb82d74ac320ab999458a970056767 100644
--- a/openair1/PHY/CODING/nr_rate_matching.c
+++ b/openair1/PHY/CODING/nr_rate_matching.c
@@ -388,7 +388,7 @@ int nr_rate_matching_ldpc(uint8_t Ilbrm,
   uint32_t Ncb,ind,k=0,Nref,N;
 
   if (C==0) {
-    printf("nr_rate_matching: invalid parameters (C %d\n",C);
+    LOG_E(PHY,"nr_rate_matching: invalid parameters (C %d\n",C);
     return -1;
   }
 
@@ -407,16 +407,15 @@ int nr_rate_matching_ldpc(uint8_t Ilbrm,
 #ifdef RM_DEBUG
   printf("nr_rate_matching_ldpc: E %d, F %d, Foffset %d, k0 %d, Ncb %d, rvidx %d\n", E, F, Foffset,ind, Ncb, rvidx);
 #endif
-  AssertFatal(Foffset <= E,
-              "Foffset %d > E %d "
-              "(Ilbrm %d, Tbslbrm %d, Z %d, BG %d, C %d)\n",
-              Foffset, E,
-              Ilbrm, Tbslbrm, Z, BG, C);
-  AssertFatal(Foffset <= Ncb,
-              "Foffset %d > Ncb %d "
-              "(Ilbrm %d, Tbslbrm %d, Z %d, BG %d, C %d)\n",
-              Foffset, Ncb,
-              Ilbrm, Tbslbrm, Z, BG, C);
+
+  if (Foffset > E) {
+    LOG_E(PHY,"nr_rate_matching: invalid parameters (Foffset %d > E %d)\n",Foffset,E);
+    return -1;
+  }
+  if (Foffset > Ncb) {
+    LOG_E(PHY,"nr_rate_matching: invalid parameters (Foffset %d > Ncb %d)\n",Foffset,Ncb);
+    return -1;
+  }
 
   if (ind >= Foffset && ind < (F+Foffset)) ind = F+Foffset;
 
@@ -478,7 +477,7 @@ int nr_rate_matching_ldpc_rx(uint8_t Ilbrm,
 #endif
 
   if (C==0) {
-    printf("nr_rate_matching: invalid parameters (C %d\n",C);
+    LOG_E(PHY,"nr_rate_matching: invalid parameters (C %d\n",C);
     return -1;
   }
 
@@ -493,8 +492,14 @@ int nr_rate_matching_ldpc_rx(uint8_t Ilbrm,
   }
 
   ind = (index_k0[BG-1][rvidx]*Ncb/N)*Z;
-  AssertFatal(Foffset <= E,"Foffset %d > E %d\n",Foffset,E);
-  AssertFatal(Foffset <= Ncb,"Foffset %d > Ncb %d\n",Foffset,Ncb);
+  if (Foffset > E) {
+    LOG_E(PHY,"nr_rate_matching: invalid parameters (Foffset %d > E %d)\n",Foffset,E);
+    return -1;
+  }
+  if (Foffset > Ncb) {
+    LOG_E(PHY,"nr_rate_matching: invalid parameters (Foffset %d > Ncb %d)\n",Foffset,Ncb);
+    return -1;
+  }
 
 #ifdef RM_DEBUG
   printf("nr_rate_matching_ldpc_rx: Clear %d, E %d, k0 %d, Ncb %d, rvidx %d\n", clear, E, ind, Ncb, rvidx);
diff --git a/openair1/PHY/NR_TRANSPORT/nr_dlsch.c b/openair1/PHY/NR_TRANSPORT/nr_dlsch.c
index d75f97aa537dadc7736ed3387aea211f1d259dca..fa1b6c955b4b786cf4e06ee0a16f8b1ed6a27304 100644
--- a/openair1/PHY/NR_TRANSPORT/nr_dlsch.c
+++ b/openair1/PHY/NR_TRANSPORT/nr_dlsch.c
@@ -111,9 +111,9 @@ void nr_pdsch_codeword_scrambling_optim(uint8_t *in,
 }
 
 
-uint8_t nr_generate_pdsch(processingData_L1tx_t *msgTx,
-			  int frame,
-			  int slot) {
+void nr_generate_pdsch(processingData_L1tx_t *msgTx,
+                       int frame,
+                       int slot) {
 
   PHY_VARS_gNB *gNB = msgTx->gNB;
   NR_gNB_DLSCH_t *dlsch;
@@ -181,11 +181,12 @@ uint8_t nr_generate_pdsch(processingData_L1tx_t *msgTx,
     /// CRC, coding, interleaving and rate matching
     AssertFatal(harq->pdu!=NULL,"harq->pdu is null\n");
     start_meas(dlsch_encoding_stats);
-    nr_dlsch_encoding(gNB,
-		      harq->pdu, frame, slot, dlsch, frame_parms,tinput,tprep,tparity,toutput,
-		      dlsch_rate_matching_stats,
-		      dlsch_interleaving_stats,
-		      dlsch_segmentation_stats);
+    if (nr_dlsch_encoding(gNB,
+                          harq->pdu, frame, slot, dlsch, frame_parms,tinput,tprep,tparity,toutput,
+                          dlsch_rate_matching_stats,
+                          dlsch_interleaving_stats,
+                          dlsch_segmentation_stats) == -1)
+      return;
     stop_meas(dlsch_encoding_stats);
 #ifdef DEBUG_DLSCH
     printf("PDSCH encoding:\nPayload:\n");
@@ -522,9 +523,6 @@ uint8_t nr_generate_pdsch(processingData_L1tx_t *msgTx,
       LOG_D(PHY,"beam index for PDSCH allocation already taken\n");
     }
   }// dlsch loop
-
-  
-  return 0;
 }
 
 void dump_pdsch_stats(FILE *fd,PHY_VARS_gNB *gNB) {
diff --git a/openair1/PHY/NR_TRANSPORT/nr_dlsch.h b/openair1/PHY/NR_TRANSPORT/nr_dlsch.h
index 4b6ecfe412ce642ba6d4fa86e00cd41fa68df4ad..181c2ab273db029a84479f8151e8a26d9c3a4614 100644
--- a/openair1/PHY/NR_TRANSPORT/nr_dlsch.h
+++ b/openair1/PHY/NR_TRANSPORT/nr_dlsch.h
@@ -67,9 +67,9 @@ void nr_fill_dlsch(processingData_L1tx_t *msgTx,
                    nfapi_nr_dl_tti_pdsch_pdu *pdsch_pdu,
                    unsigned char *sdu); 
 
-uint8_t nr_generate_pdsch(processingData_L1tx_t *msgTx,
-			  int frame,
-			  int slot);
+void nr_generate_pdsch(processingData_L1tx_t *msgTx,
+                       int frame,
+                       int slot);
 void free_gNB_dlsch(NR_gNB_DLSCH_t **dlschptr, uint16_t N_RB);
 
 void clean_gNB_dlsch(NR_gNB_DLSCH_t *dlsch);
diff --git a/openair1/PHY/NR_TRANSPORT/nr_dlsch_coding.c b/openair1/PHY/NR_TRANSPORT/nr_dlsch_coding.c
index acb59b0e4027fdae7c64b530392ad1334dfb064a..0bcd1e3e51c0548bd2ec9fe58de8fe234960a917 100644
--- a/openair1/PHY/NR_TRANSPORT/nr_dlsch_coding.c
+++ b/openair1/PHY/NR_TRANSPORT/nr_dlsch_coding.c
@@ -427,17 +427,19 @@ int nr_dlsch_encoding(PHY_VARS_gNB *gNB,
     Tbslbrm = nr_compute_tbslbrm(rel15->mcsTable[0],nb_rb,Nl);
 
     start_meas(dlsch_rate_matching_stats);
-    nr_rate_matching_ldpc(Ilbrm,
-                          Tbslbrm,
-                          harq->BG,
-                          *Zc,
-                          harq->d[r],
-                          harq->e+r_offset,
-                          harq->C,
-                          F,
-                          Kr-F-2*(*Zc),
-                          rel15->rvIndex[0],
-                          E);
+    if (nr_rate_matching_ldpc(Ilbrm,
+                              Tbslbrm,
+                              harq->BG,
+                              *Zc,
+                              harq->d[r],
+                              harq->e+r_offset,
+                              harq->C,
+                              F,
+                              Kr-F-2*(*Zc),
+                              rel15->rvIndex[0],
+                              E) == -1)
+      return -1;
+
     stop_meas(dlsch_rate_matching_stats);
 #ifdef DEBUG_DLSCH_CODING
     for (int i =0; i<16; i++)
diff --git a/openair1/PHY/NR_UE_TRANSPORT/nr_ulsch_coding.c b/openair1/PHY/NR_UE_TRANSPORT/nr_ulsch_coding.c
index f8e7ce317f31aec5e68e34838d23cf83b7bacda1..945dc516737c8bebc221e151fe89e69f3274291a 100644
--- a/openair1/PHY/NR_UE_TRANSPORT/nr_ulsch_coding.c
+++ b/openair1/PHY/NR_UE_TRANSPORT/nr_ulsch_coding.c
@@ -274,7 +274,7 @@ int nr_ulsch_encoding(PHY_VARS_NR_UE *ue,
 #ifdef DEBUG_ULSCH_CODING
   printf("encoding thinks this is a new packet \n");
 #endif
-  harq_process->first_tx = 0;
+    harq_process->first_tx = 0;
 ///////////////////////// a---->| add CRC |---->b /////////////////////////
 ///////////
    /* 
@@ -445,17 +445,19 @@ int nr_ulsch_encoding(PHY_VARS_NR_UE *ue,
 
     VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_NR_RATE_MATCHING_LDPC, VCD_FUNCTION_IN);
     start_meas(&ue->ulsch_rate_matching_stats);
-    nr_rate_matching_ldpc(Ilbrm,
-                          Tbslbrm,
-                          harq_process->BG,
-                          *pz,
-                          harq_process->d[r],
-                          harq_process->e+r_offset,
-                          harq_process->C,
-			  F,
-                          Kr-F-2*(*pz),
-                          harq_process->pusch_pdu.pusch_data.rv_index,
-                          E);
+    if (nr_rate_matching_ldpc(Ilbrm,
+                              Tbslbrm,
+                              harq_process->BG,
+                              *pz,
+                              harq_process->d[r],
+                              harq_process->e+r_offset,
+                              harq_process->C,
+                              F,
+                              Kr-F-2*(*pz),
+                              harq_process->pusch_pdu.pusch_data.rv_index,
+                              E) == -1)
+      return -1;
+
     stop_meas(&ue->ulsch_rate_matching_stats);
     VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_NR_RATE_MATCHING_LDPC, VCD_FUNCTION_OUT);
 
diff --git a/openair1/PHY/NR_UE_TRANSPORT/nr_ulsch_ue.c b/openair1/PHY/NR_UE_TRANSPORT/nr_ulsch_ue.c
index 1c98c8c119257bc7de0e7097215bccd7ae8e1cee..99dc2b658e7024f94121d48a2940c5f164e17e40 100644
--- a/openair1/PHY/NR_UE_TRANSPORT/nr_ulsch_ue.c
+++ b/openair1/PHY/NR_UE_TRANSPORT/nr_ulsch_ue.c
@@ -162,7 +162,8 @@ void nr_ue_ulsch_procedures(PHY_VARS_NR_UE *UE,
                               nb_dmrs_re_per_rb, number_dmrs_symbols, mod_order, Nl);
     
 
-    nr_ulsch_encoding(UE, ulsch_ue, frame_parms, harq_pid, G);
+    if (nr_ulsch_encoding(UE, ulsch_ue, frame_parms, harq_pid, G) == -1)
+      return;
 
     ///////////
     ////////////////////////////////////////////////////////////////////
diff --git a/openair2/COMMON/x2ap_messages_def.h b/openair2/COMMON/x2ap_messages_def.h
index 14fc0d3ac9f1611d711843a65d134c904b977591..25600253a6a71c27b1d56b32dbfab5f89392df49 100644
--- a/openair2/COMMON/x2ap_messages_def.h
+++ b/openair2/COMMON/x2ap_messages_def.h
@@ -33,7 +33,7 @@ MESSAGE_DEF(X2AP_SETUP_REQUEST_LOG              , MESSAGE_PRIORITY_MED, IttiMsgT
 /* eNB application layer -> X2AP messages */
 MESSAGE_DEF(X2AP_REGISTER_ENB_REQ               , MESSAGE_PRIORITY_MED, x2ap_register_enb_req_t          , x2ap_register_enb_req)
 MESSAGE_DEF(X2AP_SUBFRAME_PROCESS               , MESSAGE_PRIORITY_MED, x2ap_subframe_process_t          , x2ap_subframe_process)
-
+MESSAGE_DEF(X2AP_RESET_REQ                      , MESSAGE_PRIORITY_MED, x2ap_reset_req_t                 , x2ap_reset_req)
 /* X2AP -> eNB application layer messages */
 MESSAGE_DEF(X2AP_REGISTER_ENB_CNF               , MESSAGE_PRIORITY_MED, x2ap_register_enb_cnf_t          , x2ap_register_enb_cnf)
 MESSAGE_DEF(X2AP_DEREGISTERED_ENB_IND           , MESSAGE_PRIORITY_MED, x2ap_deregistered_enb_ind_t      , x2ap_deregistered_enb_ind)
diff --git a/openair2/COMMON/x2ap_messages_types.h b/openair2/COMMON/x2ap_messages_types.h
index f4911c47dc6bf112c06ba2df289785d95f89da71..9339ab12f38fd4b842cc0e0aad8b9c6e9afdeefb 100644
--- a/openair2/COMMON/x2ap_messages_types.h
+++ b/openair2/COMMON/x2ap_messages_types.h
@@ -38,6 +38,8 @@ typedef enum {
 #define X2AP_REGISTER_ENB_REQ(mSGpTR)                           (mSGpTR)->ittiMsg.x2ap_register_enb_req
 #define X2AP_SETUP_REQ(mSGpTR)                                  (mSGpTR)->ittiMsg.x2ap_setup_req
 #define X2AP_SETUP_RESP(mSGpTR)                                 (mSGpTR)->ittiMsg.x2ap_setup_resp
+#define X2AP_RESET_REQ(mSGpTR)                                  (mSGpTR)->ittiMsg.x2ap_reset_req
+#define X2AP_RESET_RESP(mSGpTR)                                 (mSGpTR)->ittiMsg.x2ap_reset_resp
 #define X2AP_HANDOVER_REQ(mSGpTR)                               (mSGpTR)->ittiMsg.x2ap_handover_req
 #define X2AP_HANDOVER_REQ_ACK(mSGpTR)                           (mSGpTR)->ittiMsg.x2ap_handover_req_ack
 #define X2AP_REGISTER_ENB_CNF(mSGpTR)                           (mSGpTR)->ittiMsg.x2ap_register_enb_cnf
@@ -68,6 +70,14 @@ typedef struct x2ap_setup_resp_s {
   int num_cc;
 } x2ap_setup_resp_t;
 
+typedef struct x2ap_reset_req_s {
+  uint32_t cause;
+} x2ap_reset_req_t;
+
+typedef struct x2ap_reset_resp_s {
+  int dummy;
+} x2ap_reset_resp_t;
+
 /* X2AP UE CONTEXT RELEASE */
 typedef struct x2ap_ue_context_release_s {
   /* used for X2AP->RRC in source and RRC->X2AP in target */
diff --git a/openair2/LAYER2/NR_MAC_UE/nr_ue_scheduler.c b/openair2/LAYER2/NR_MAC_UE/nr_ue_scheduler.c
index a782dd8fe40aa2ffa7a4fbcbb97b788bc3a18eab..c23d4bb0730061b99caeb096f15183d296330de9 100644
--- a/openair2/LAYER2/NR_MAC_UE/nr_ue_scheduler.c
+++ b/openair2/LAYER2/NR_MAC_UE/nr_ue_scheduler.c
@@ -2106,7 +2106,8 @@ void nr_ue_pucch_scheduler(module_id_t module_idP, frame_t frameP, int slotP, in
   }
 
   // CSI
-  if (mac->ra.ra_state == RA_SUCCEEDED)
+  if (mac->ra.ra_state == RA_SUCCEEDED ||
+      get_softmodem_params()->phy_test == 1)
     O_CSI = nr_get_csi_measurements(mac, frameP, slotP, pucch);
 
   // ACKNACK
diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler.c
index b62f8e0282da5572b62a2eeebb98d1f24f26cebf..4c0e9dab9f7b8b3896814d7b296d1bdc403efa32 100644
--- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler.c
+++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler.c
@@ -347,7 +347,7 @@ void gNB_dlsch_ulsch_scheduler(module_id_t module_idP,
 
   if ((slot == 0) && (frame & 127) == 0) {
      stats_output[0]='\0';
-     dump_mac_stats(RC.nrmac[module_idP],stats_output,16384);
+     dump_mac_stats(RC.nrmac[module_idP],stats_output,16384,true);
      LOG_I(NR_MAC,"Frame.Slot %d.%d\n%s\n",frame,slot,stats_output);
   }
 
diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c
index ec5b65e0ff6d1ae2078ccd5e27218970fb23fc24..e2c4020b6ce16b67d8695578d5f6c80a402ac96c 100644
--- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c
+++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c
@@ -1795,6 +1795,8 @@ void nr_check_Msg4_Ack(module_id_t module_id, int CC_id, frame_t frame, sub_fram
         LOG_I(NR_MAC, "(ue %i, rnti 0x%04x) Received Ack of RA-Msg4. CBRA procedure succeeded!\n", UE_id, ra->rnti);
         UE_info->active[UE_id] = true;
         UE_info->Msg4_ACKed[UE_id] = true;
+        if(sched_ctrl->retrans_dl_harq.head>=0)
+          remove_nr_list(&sched_ctrl->retrans_dl_harq, current_harq_pid);
       }
       else {
         LOG_I(NR_MAC, "(ue %i, rnti 0x%04x) RA Procedure failed at Msg4!\n", UE_id, ra->rnti);
diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_uci.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_uci.c
index d3521f9b175d5a1ad727df0a75f459ec72d00056..3a359552da188a54349b545579902433ea9eac76 100644
--- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_uci.c
+++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_uci.c
@@ -702,7 +702,6 @@ void tci_handling(module_id_t Mod_idP, int UE_id, frame_t frame, slot_t slot) {
   uint8_t diff_rsrp_idx = 0;
   uint8_t i, j;
   NR_UE_sched_ctrl_t *sched_ctrl = &UE_info->UE_sched_ctrl[UE_id];
-  NR_mac_stats_t *stats = &UE_info->mac_stats[UE_id];
 
   if (n_dl_bwp < 4)
     pdsch_bwp_id = bwp_id;
@@ -728,9 +727,6 @@ void tci_handling(module_id_t Mod_idP, int UE_id, frame_t frame, slot_t slot) {
 
       //if strongest measured RSRP is configured
       strongest_ssb_rsrp = get_measured_rsrp(sched_ctrl->CSI_report[idx].choice.ssb_cri_report.RSRP);
-      // including ssb rsrp in mac stats
-      stats->cumul_rsrp += strongest_ssb_rsrp;
-      stats->num_rsrp_meas++;
       ssb_rsrp[idx * nb_of_csi_ssb_report] = strongest_ssb_rsrp;
       LOG_D(NR_MAC,"ssb_rsrp = %d\n",strongest_ssb_rsrp);
 
@@ -872,12 +868,12 @@ uint8_t pickandreverse_bits(uint8_t *payload, uint16_t bitlen, uint8_t start_bit
 
 
 void evaluate_rsrp_report(NR_UE_info_t *UE_info,
-                             NR_UE_sched_ctrl_t *sched_ctrl,
-                             int UE_id,
-                             uint8_t csi_report_id,
-                             uint8_t *payload,
-                             int *cumul_bits,
-                             NR_CSI_ReportConfig__reportQuantity_PR reportQuantity_type){
+                          NR_UE_sched_ctrl_t *sched_ctrl,
+                          int UE_id,
+                          uint8_t csi_report_id,
+                          uint8_t *payload,
+                          int *cumul_bits,
+                          NR_CSI_ReportConfig__reportQuantity_PR reportQuantity_type){
 
   uint8_t cri_ssbri_bitlen = UE_info->csi_report_template[UE_id][csi_report_id].CSI_report_bitlen.cri_ssbri_bitlen;
   uint16_t curr_payload;
@@ -907,14 +903,17 @@ void evaluate_rsrp_report(NR_UE_info_t *UE_info,
     curr_payload = pickandreverse_bits(payload, cri_ssbri_bitlen, *cumul_bits);
 
     if (NR_CSI_ReportConfig__reportQuantity_PR_ssb_Index_RSRP == reportQuantity_type)
-      sched_ctrl->CSI_report[idx].choice.ssb_cri_report.CRI_SSBRI [csi_ssb_idx] =
+      sched_ctrl->CSI_report[idx].choice.ssb_cri_report.CRI_SSBRI[csi_ssb_idx] =
         *(UE_info->csi_report_template[UE_id][csi_report_id].SSB_Index_list[cri_ssbri_bitlen>0?((curr_payload)&~(~1<<(cri_ssbri_bitlen-1))):cri_ssbri_bitlen]);
     else
-      sched_ctrl->CSI_report[idx].choice.ssb_cri_report.CRI_SSBRI [csi_ssb_idx] =
+      sched_ctrl->CSI_report[idx].choice.ssb_cri_report.CRI_SSBRI[csi_ssb_idx] =
         *(UE_info->csi_report_template[UE_id][csi_report_id].CSI_Index_list[cri_ssbri_bitlen>0?((curr_payload)&~(~1<<(cri_ssbri_bitlen-1))):cri_ssbri_bitlen]);
 
     *cumul_bits += cri_ssbri_bitlen;
-    LOG_D(MAC,"SSB_index = %d\n",sched_ctrl->CSI_report[idx].choice.ssb_cri_report.CRI_SSBRI [csi_ssb_idx]);
+    if(UE_info->csi_report_template[UE_id][csi_report_id].reportQuantity_type == NR_CSI_ReportConfig__reportQuantity_PR_cri_RSRP)
+      LOG_D(MAC,"CSI-RS Resource Indicator = %d\n",sched_ctrl->CSI_report[idx].choice.ssb_cri_report.CRI_SSBRI[csi_ssb_idx]);
+    else
+      LOG_D(MAC,"SSB Resource Indicator = %d\n",sched_ctrl->CSI_report[idx].choice.ssb_cri_report.CRI_SSBRI[csi_ssb_idx]);
   }
 
   curr_payload = pickandreverse_bits(payload, 7, *cumul_bits);
@@ -927,9 +926,14 @@ void evaluate_rsrp_report(NR_UE_info_t *UE_info,
     *cumul_bits += 4;
   }
   UE_info->csi_report_template[UE_id][csi_report_id].nb_of_csi_ssb_report++;
+  int strongest_ssb_rsrp = get_measured_rsrp(sched_ctrl->CSI_report[idx].choice.ssb_cri_report.RSRP);
+  NR_mac_stats_t *stats = &UE_info->mac_stats[UE_id];
+  // including ssb rsrp in mac stats
+  stats->cumul_rsrp += strongest_ssb_rsrp;
+  stats->num_rsrp_meas++;
   LOG_D(MAC,"rsrp_id = %d rsrp = %d\n",
         sched_ctrl->CSI_report[idx].choice.ssb_cri_report.RSRP,
-        get_measured_rsrp(sched_ctrl->CSI_report[idx].choice.ssb_cri_report.RSRP));
+        strongest_ssb_rsrp);
 }
 
 
@@ -1156,7 +1160,7 @@ void handle_nr_uci_pucch_2_3_4(module_id_t mod_id,
   }
   if ((uci_234->pduBitmap >> 2) & 0x01) {
     //API to parse the csi report and store it into sched_ctrl
-    extract_pucch_csi_report (csi_MeasConfig, uci_234, frame, slot, UE_id, mod_id);
+    extract_pucch_csi_report(csi_MeasConfig, uci_234, frame, slot, UE_id, mod_id);
     //TCI handling function
     tci_handling(mod_id, UE_id,frame, slot);
   }
diff --git a/openair2/LAYER2/NR_MAC_gNB/mac_proto.h b/openair2/LAYER2/NR_MAC_gNB/mac_proto.h
index 3b275ca8a05d3fd58d1d4596cf7ef583d8eabf3b..62d70f4f2cccac09236f689c187112add61ec855 100644
--- a/openair2/LAYER2/NR_MAC_gNB/mac_proto.h
+++ b/openair2/LAYER2/NR_MAC_gNB/mac_proto.h
@@ -442,5 +442,5 @@ bool nr_find_nb_rb(uint16_t Qm,
 
 void nr_sr_reporting(int Mod_idP, frame_t frameP, sub_frame_t slotP);
 
-void dump_mac_stats(gNB_MAC_INST *gNB, char *output, int strlen);
+void dump_mac_stats(gNB_MAC_INST *gNB, char *output, int strlen, bool reset_rsrp);
 #endif /*__LAYER2_NR_MAC_PROTO_H__*/
diff --git a/openair2/LAYER2/NR_MAC_gNB/main.c b/openair2/LAYER2/NR_MAC_gNB/main.c
index 84ee7dc1a3bcc4f4345941038fa2fa506f987b67..547c5da00cb47131f9d1152a244db48806dde137 100644
--- a/openair2/LAYER2/NR_MAC_gNB/main.c
+++ b/openair2/LAYER2/NR_MAC_gNB/main.c
@@ -57,7 +57,7 @@ void *nrmac_stats_thread(void *arg) {
   AssertFatal(fd!=NULL,"Cannot open nrMAC_stats.log, error %s\n",strerror(errno));
 
   while (oai_exit == 0) {
-     dump_mac_stats(gNB,output,MACSTATSSTRLEN);
+     dump_mac_stats(gNB,output,MACSTATSSTRLEN,false);
      fprintf(fd,"%s\n",output);
      fflush(fd);
      usleep(200000);
@@ -71,7 +71,7 @@ void clear_mac_stats(gNB_MAC_INST *gNB) {
   memset((void*)gNB->UE_info.mac_stats,0,MAX_MOBILES_PER_GNB*sizeof(NR_mac_stats_t));
 }
 
-void dump_mac_stats(gNB_MAC_INST *gNB, char *output, int strlen)
+void dump_mac_stats(gNB_MAC_INST *gNB, char *output, int strlen, bool reset_rsrp)
 {
   NR_UE_info_t *UE_info = &gNB->UE_info;
   int num = 1;
@@ -102,9 +102,10 @@ void dump_mac_stats(gNB_MAC_INST *gNB, char *output, int strlen)
                     stats->pucch0_DTX,
                     sched_ctrl->dl_bler_stats.bler,
                     sched_ctrl->dl_bler_stats.mcs);
-
-    stats->num_rsrp_meas = 0;
-    stats->cumul_rsrp = 0 ;
+    if (reset_rsrp) {
+      stats->num_rsrp_meas = 0;
+      stats->cumul_rsrp = 0;
+    }
     stroff+=sprintf(output+stroff,"UE %d: dlsch_total_bytes %"PRIu64"\n", UE_id, stats->dlsch_total_bytes);
     stroff+=sprintf(output+stroff,"UE %d: ulsch_rounds %"PRIu64"/%"PRIu64"/%"PRIu64"/%"PRIu64", ulsch_DTX %d, ulsch_errors %"PRIu64"\n",
                     UE_id,
diff --git a/openair2/RRC/LTE/rrc_eNB.c b/openair2/RRC/LTE/rrc_eNB.c
index 819608fbe2ac991cb6b71097eeaa4635c3dcd91b..9283b64ded28281919b1a9e2f1f51b7f5a6ee64d 100644
--- a/openair2/RRC/LTE/rrc_eNB.c
+++ b/openair2/RRC/LTE/rrc_eNB.c
@@ -3293,6 +3293,7 @@ void rrc_eNB_generate_defaultRRCConnectionReconfiguration(const protocol_ctxt_t
     MeasObj2->measObject.choice.measObjectNR_r15.rs_ConfigSSB_r15.measTimingConfig_r15.periodicityAndOffset_r15.present = LTE_MTC_SSB_NR_r15__periodicityAndOffset_r15_PR_sf20_r15;
     MeasObj2->measObject.choice.measObjectNR_r15.rs_ConfigSSB_r15.measTimingConfig_r15.periodicityAndOffset_r15.choice.sf20_r15 = 0;
     MeasObj2->measObject.choice.measObjectNR_r15.rs_ConfigSSB_r15.measTimingConfig_r15.ssb_Duration_r15 = LTE_MTC_SSB_NR_r15__ssb_Duration_r15_sf4;
+
     if (rrc_inst->nr_scg_ssb_freq > 2016666) //FR2
       MeasObj2->measObject.choice.measObjectNR_r15.rs_ConfigSSB_r15.subcarrierSpacingSSB_r15 = LTE_RS_ConfigSSB_NR_r15__subcarrierSpacingSSB_r15_kHz120;
     else
diff --git a/openair2/X2AP/x2ap_eNB_handler.c b/openair2/X2AP/x2ap_eNB_handler.c
index d60f7654ad40348af381e6778d611857667aaa2c..d44f36e186cbd80436bfc107a9f80343616c18e0 100644
--- a/openair2/X2AP/x2ap_eNB_handler.c
+++ b/openair2/X2AP/x2ap_eNB_handler.c
@@ -57,6 +57,17 @@ int x2ap_eNB_handle_x2_setup_response (instance_t instance,
                                        uint32_t stream,
                                        X2AP_X2AP_PDU_t *pdu);
 static
+int x2ap_eNB_handle_x2_reset_request (instance_t instance,
+                                      uint32_t assoc_id,
+                                      uint32_t stream,
+                                      X2AP_X2AP_PDU_t *pdu);
+static
+int x2ap_eNB_handle_x2_reset_response (instance_t instance,
+                                       uint32_t assoc_id,
+                                       uint32_t stream,
+                                       X2AP_X2AP_PDU_t *pdu);
+
+static
 int x2ap_eNB_handle_x2_setup_failure (instance_t instance,
                                       uint32_t assoc_id,
                                       uint32_t stream,
@@ -166,7 +177,7 @@ x2ap_message_decoded_callback x2ap_messages_callback[][3] = {
   { 0, 0, 0 }, /* snStatusTransfer */
   { x2ap_eNB_handle_ue_context_release, 0, 0 }, /* uEContextRelease */
   { x2ap_eNB_handle_x2_setup_request, x2ap_eNB_handle_x2_setup_response, x2ap_eNB_handle_x2_setup_failure }, /* x2Setup */
-  { 0, 0, 0 }, /* reset */
+  { x2ap_eNB_handle_x2_reset_request, x2ap_eNB_handle_x2_reset_response, 0 }, /* reset */
   { 0, 0, 0 }, /* eNBConfigurationUpdate */
   { 0, 0, 0 }, /* resourceStatusReportingInitiation */
   { 0, 0, 0 }, /* resourceStatusReporting */
@@ -501,6 +512,163 @@ x2ap_eNB_handle_x2_setup_request(instance_t instance,
   return x2ap_eNB_generate_x2_setup_response(instance_p, x2ap_eNB_data);
 }
 
+const char *X2AP_cause_str1[4]={"radioNetwork","transport","protocol","misc"};
+const char *X2AP_case_str_radio[50]={" X2AP_CauseRadioNetwork_handover_desirable_for_radio_reasons",
+        "X2AP_CauseRadioNetwork_time_critical_handover",
+        "X2AP_CauseRadioNetwork_resource_optimisation_handover",
+        "X2AP_CauseRadioNetwork_reduce_load_in_serving_cell",
+        "X2AP_CauseRadioNetwork_partial_handover",
+        "X2AP_CauseRadioNetwork_unknown_new_eNB_UE_X2AP_ID",
+        "X2AP_CauseRadioNetwork_unknown_old_eNB_UE_X2AP_ID",
+        "X2AP_CauseRadioNetwork_unknown_pair_of_UE_X2AP_ID",
+        "X2AP_CauseRadioNetwork_ho_target_not_allowed",
+        "X2AP_CauseRadioNetwork_tx2relocoverall_expiry",
+        "X2AP_CauseRadioNetwork_trelocprep_expiry",
+        "X2AP_CauseRadioNetwork_cell_not_available",
+        "X2AP_CauseRadioNetwork_no_radio_resources_available_in_target_cell",
+        "X2AP_CauseRadioNetwork_invalid_MME_GroupID",
+        "X2AP_CauseRadioNetwork_unknown_MME_Code",
+        "X2AP_CauseRadioNetwork_encryption_and_or_integrity_protection_algorithms_not_supported",
+        "X2AP_CauseRadioNetwork_reportCharacteristicsEmpty",
+        "X2AP_CauseRadioNetwork_noReportPeriodicity",
+        "X2AP_CauseRadioNetwork_existingMeasurementID",
+        "X2AP_CauseRadioNetwork_unknown_eNB_Measurement_ID",
+        "X2AP_CauseRadioNetwork_measurement_temporarily_not_available",
+        "X2AP_CauseRadioNetwork_unspecified",
+        "X2AP_CauseRadioNetwork_load_balancing",
+        "X2AP_CauseRadioNetwork_handover_optimisation",
+        "X2AP_CauseRadioNetwork_value_out_of_allowed_range",
+        "X2AP_CauseRadioNetwork_multiple_E_RAB_ID_instances",
+        "X2AP_CauseRadioNetwork_switch_off_ongoing",
+        "X2AP_CauseRadioNetwork_not_supported_QCI_value",
+        "X2AP_CauseRadioNetwork_measurement_not_supported_for_the_object",
+        "X2AP_CauseRadioNetwork_tDCoverall_expiry",
+        "X2AP_CauseRadioNetwork_tDCprep_expiry",
+        "X2AP_CauseRadioNetwork_action_desirable_for_radio_reasons",
+        "X2AP_CauseRadioNetwork_reduce_load",
+        "X2AP_CauseRadioNetwork_resource_optimisation",
+        "X2AP_CauseRadioNetwork_time_critical_action",
+        "X2AP_CauseRadioNetwork_target_not_allowed",
+        "X2AP_CauseRadioNetwork_no_radio_resources_available",
+        "X2AP_CauseRadioNetwork_invalid_QoS_combination",
+        "X2AP_CauseRadioNetwork_encryption_algorithms_not_supported",
+        "X2AP_CauseRadioNetwork_procedure_cancelled",
+        "X2AP_CauseRadioNetwork_rRM_purpose",
+        "X2AP_CauseRadioNetwork_improve_user_bit_rate",
+        "X2AP_CauseRadioNetwork_user_inactivity",
+        "X2AP_CauseRadioNetwork_radio_connection_with_UE_lost",
+        "X2AP_CauseRadioNetwork_bearer_option_not_supported",
+        "X2AP_CauseRadioNetwork_mCG_Mobility",
+        "X2AP_CauseRadioNetwork_sCG_Mobility",
+        "X2AP_CauseRadioNetwork_count_reaches_max_value",
+        "X2AP_CauseRadioNetwork_unknown_old_en_gNB_UE_X2AP_ID",
+        "X2AP_CauseRadioNetwork_pDCP_Overload"};
+
+const char *X2AP_cause_str_radio[2]={"X2AP_CauseTransport_transport_resource_unavailable",
+        "X2AP_CauseTransport_unspecified"};
+const char *X2AP_cause_str_protocol[7]={" X2AP_CauseProtocol_transfer_syntax_error",
+        "X2AP_CauseProtocol_abstract_syntax_error_reject",
+        "X2AP_CauseProtocol_abstract_syntax_error_ignore_and_notify",
+        "X2AP_CauseProtocol_message_not_compatible_with_receiver_state",
+        "X2AP_CauseProtocol_semantic_error",
+        "X2AP_CauseProtocol_unspecified",
+        "X2AP_CauseProtocol_abstract_syntax_error_falsely_constructed_message"};
+const char *X2AP_cause_str_misc[5]={"X2AP_CauseMisc_control_processing_overload",
+        "X2AP_CauseMisc_hardware_failure",
+        "X2AP_CauseMisc_om_intervention",
+        "X2AP_CauseMisc_not_enough_user_plane_processing_resources",
+        "X2AP_CauseMisc_unspecified"};
+
+
+int
+x2ap_eNB_handle_x2_reset_response(instance_t instance,
+                                  uint32_t assoc_id,
+                                  uint32_t stream,
+                                  X2AP_X2AP_PDU_t *pdu)
+{
+
+   return (0);
+}
+
+
+int
+x2ap_eNB_handle_x2_reset_request(instance_t instance,
+                                 uint32_t assoc_id,
+                                 uint32_t stream,
+                                 X2AP_X2AP_PDU_t *pdu)
+{
+
+  X2AP_ResetRequest_t              *ResetRequest;
+  X2AP_ResetRequest_IEs_t          *ie;
+
+  x2ap_eNB_instance_t                *instance_p;
+  x2ap_eNB_data_t                    *x2ap_eNB_data;
+  MessageDef                         *msg;
+  uint32_t                           eNB_id = 0;
+
+  DevAssert (pdu != NULL);
+  ResetRequest = &pdu->choice.initiatingMessage.value.choice.ResetRequest;
+
+  X2AP_DEBUG("Received a new X2 reset request\n");
+
+  X2AP_FIND_PROTOCOLIE_BY_ID(X2AP_ResetRequest_IEs_t, ie, ResetRequest,
+                             X2AP_ProtocolIE_ID_id_Cause, true);
+  if (ie == NULL ) {
+    X2AP_ERROR("%s %d: ie is a NULL pointer \n",__FILE__,__LINE__);
+    return -1;
+  } else {
+    AssertFatal(ie->value.present <= X2AP_Cause_PR_misc && ie->value.present > 0,"Cause value %d, is impossible\n",ie->value.present);
+    LOG_I(X2AP,"Received X2AP Reset Request with Cause Type %s\n",X2AP_cause_str1[ie->value.present-1]);
+  }
+
+  X2AP_DEBUG("Adding eNB to the list of associated eNBs\n");
+
+  if ((x2ap_eNB_data = x2ap_is_eNB_id_in_list (eNB_id)) == NULL) {
+      /*
+       * eNB has not been found in list of associated eNB,
+       * * * * Add it to the tail of list and initialize data
+       */
+    if ((x2ap_eNB_data = x2ap_is_eNB_assoc_id_in_list (assoc_id)) == NULL) {
+      /*
+       * ??
+       */
+      return -1;
+    } else {
+      x2ap_eNB_data->state = X2AP_ENB_STATE_RESETTING;
+      x2ap_eNB_data->eNB_id = eNB_id;
+    }
+  } else {
+    x2ap_eNB_data->state = X2AP_ENB_STATE_RESETTING;
+    /*
+     * eNB has been found in list, consider the x2 setup request as a reset connection,
+     * * * * reseting any previous UE state if sctp association is != than the previous one
+     */
+    if (x2ap_eNB_data->assoc_id != assoc_id) {
+      /*
+       * ??: Send an overload cause...
+       */
+      X2AP_ERROR("Reset Request: eNB id %d is already associated to an active sctp association" "Previous known: %d, new one: %d\n", eNB_id, x2ap_eNB_data->assoc_id, assoc_id);
+
+      return -1;
+    }
+    /*
+     * TODO: call the reset procedure
+     */
+  }
+
+  msg = itti_alloc_new_message(TASK_X2AP, 0, X2AP_RESET_REQ);
+
+  X2AP_RESET_REQ(msg).cause = ie->value.present;
+
+
+  instance_p = x2ap_eNB_get_instance(instance);
+  DevAssert(instance_p != NULL);
+
+  itti_send_msg_to_task(TASK_RRC_ENB, instance_p->instance, msg);
+
+  return x2ap_eNB_generate_x2_setup_response(instance_p, x2ap_eNB_data);
+}
+
 
 static
 int x2ap_eNB_handle_x2_setup_response(instance_t instance,
diff --git a/targets/ARCH/AW2SORI/oaiori.c b/targets/ARCH/AW2SORI/oaiori.c
new file mode 100644
index 0000000000000000000000000000000000000000..f79e2fad207a3a3770143a4a4ab528206d6067e7
--- /dev/null
+++ b/targets/ARCH/AW2SORI/oaiori.c
@@ -0,0 +1,712 @@
+/*! \file oaiori.c
+ * \brief AW2S ORI API isolator 
+ * \author  Raymond Knopp
+ * \date 2019
+ * \version 0.1
+ * \company Eurecom
+ * \maintainer:  raymond.knopp@eurecom.fr
+ * \note
+ * \warning
+ */
+
+#include <arpa/inet.h>
+#include <linux/if_packet.h>
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+#include <sys/ioctl.h>
+#include <sys/socket.h>
+#include <net/if.h>
+#include <netinet/ether.h>
+#include <unistd.h>
+#include <errno.h>
+#include <linux/sysctl.h>
+#include <sys/sysctl.h>
+
+#include "common_lib.h"
+#include "ethernet_lib.h"
+
+#include "ori.h"
+
+#include "targets/ARCH/COMMON/common_lib.h"
+
+typedef struct eutra_bandentry_s {
+  int16_t band;
+  uint32_t ul_min;
+  uint32_t ul_max;
+  uint32_t dl_min;
+  uint32_t dl_max;
+  uint32_t N_OFFs_DL;
+} eutra_bandentry_t;
+
+typedef struct band_info_s {
+  int nbands;
+  eutra_bandentry_t band_info[100];
+} band_info_t;
+
+
+static const eutra_bandentry_t eutra_bandtable[] = {
+  {1,  19200, 19800, 21100, 21700, 0     },
+  {2,  18500, 19100, 19300, 19900, 6000  },
+  {3,  17100, 17850, 18050, 18800, 12000 },
+  {4,  17100, 17550, 21100, 21550, 19500 },
+  {5,  8240,  8490,  8690,  8940,  24000 },
+  {6,  8300,  8400,  8750,  8850,  26500 },
+  {7,  25000, 25700, 26200, 26900, 27500 },
+  {8,  8800,  9150,  9250,  9600,  34500 },
+  {9,  17499, 17849, 18449, 18799, 38000 },
+  {10, 17100, 17700, 21100, 21700, 41500 },
+  {11, 14279, 14529, 14759, 15009, 47500 },
+  {12, 6980,  7160,  7280,  7460,  50100 },
+  {13, 7770,  7870,  7460,  7560,  51800 },
+  {14, 7880,  7980,  7580,  7680,  52800 },
+  {17, 7040,  7160,  7340,  7460,  57300 },
+  {18, 8150,  9650,  8600,  10100, 58500 },
+  {19, 8300,  8450,  8750,  8900,  60000 },
+  {20, 8320,  8620,  7910,  8210,  61500 },
+  {21, 14479, 14629, 14959, 15109, 64500 },
+  {22, 34100, 34900, 35100, 35900, 66000 },
+  {23, 20000, 20200, 21800, 22000, 75000 },
+  {24, 16126, 16605, 15250, 15590, 77000 },
+  {25, 18500, 19150, 19300, 19950, 80400 },
+  {26, 8140,  8490,  8590,  8940,  86900 },
+  {27, 8070,  8240,  8520,  8690,  90400 },
+  {28, 7030,  7580,  7580,  8130,  92100 },
+  {29, 0,     0,     7170,  7280,  96600 },
+  {30, 23050, 23250, 23500, 23600, 97700 },
+  {31, 45250, 34900, 46250, 35900, 98700 },
+  {32, 0,     0,     14520, 14960, 99200 },
+  {33, 19000, 19200, 19000, 19200, 360000},
+  {34, 20100, 20250, 20100, 20250, 362000},
+  {35, 18500, 19100, 18500, 19100, 363500},
+  {36, 19300, 19900, 19300, 19900, 369500},
+  {37, 19100, 19300, 19100, 19300, 375500},
+  {38, 25700, 26200, 25700, 26200, 377500},
+  {39, 18800, 19200, 18800, 19200, 382500},
+  {40, 23000, 24000, 23000, 24000, 386500},
+  {41, 24960, 26900, 24960, 26900, 396500},
+  {42, 34000, 36000, 34000, 36000, 415900},
+  {43, 36000, 38000, 36000, 38000, 435900},
+  {44, 7030,  8030,  7030,  8030,  455900},
+  {45, 14470, 14670, 14470, 14670, 465900},
+  {46, 51500, 59250, 51500, 59250, 467900},
+  {65, 19200, 20100, 21100, 22000, 655360},
+  {66, 17100, 18000, 21100, 22000, 664360},
+  {67, 0,     0,     7380,  7580,  67336 },
+  {68, 6980,  7280,  7530,  7830,  67536 }
+};
+
+
+#define BANDTABLE_SIZE (sizeof(eutra_bandtable)/sizeof(eutra_bandentry_t))
+
+uint32_t to_earfcn_DL_aw2s(int eutra_bandP, long long int dl_CarrierFreq, uint32_t bw) {
+  uint32_t dl_CarrierFreq_by_100k = dl_CarrierFreq / 100000;
+  int i;
+  if (eutra_bandP > 68) { printf("eutra_band %d > 68\n", eutra_bandP); exit(-1);}
+
+  for (i = 0; i < BANDTABLE_SIZE && eutra_bandtable[i].band != eutra_bandP; i++);
+
+  printf("AW2S: band %d, index %d\n",eutra_bandP, i);
+
+  if (i >= BANDTABLE_SIZE) { printf(" i = %d , it will trigger out-of-bounds read.\n",i); exit(-1);}
+
+  if (dl_CarrierFreq_by_100k < eutra_bandtable[i].dl_min) {
+              printf("Band %d, bw %u : DL carrier frequency %u .1 MHz < %u\n",
+              eutra_bandP, bw, dl_CarrierFreq_by_100k,
+              eutra_bandtable[i].dl_min); exit(-1);}
+
+  if(dl_CarrierFreq_by_100k >
+              (eutra_bandtable[i].dl_max - bw)) {
+              printf("Band %d, bw %u : DL carrier frequency %u .1MHz > %d\n",
+              eutra_bandP, bw, dl_CarrierFreq_by_100k,
+              eutra_bandtable[i].dl_max - bw); exit(-1); }
+  printf("AW2S: dl_CarrierFreq_by_100k %d, dl_min %d\n",dl_CarrierFreq_by_100k,eutra_bandtable[i].dl_min);
+
+  return (dl_CarrierFreq_by_100k - eutra_bandtable[i].dl_min +
+          (eutra_bandtable[i].N_OFFs_DL / 10));
+}
+
+uint32_t to_earfcn_UL_aw2s(int eutra_bandP, long long int ul_CarrierFreq, uint32_t bw) {
+  uint32_t ul_CarrierFreq_by_100k = ul_CarrierFreq / 100000;
+  int i;
+  if(eutra_bandP >= 69) {
+     printf("eutra_band %d > 68\n", eutra_bandP);
+     exit(-1);
+  }
+
+  for (i = 0; i < BANDTABLE_SIZE && eutra_bandtable[i].band != eutra_bandP; i++);
+
+  if(i >= BANDTABLE_SIZE) {printf("i = %d , it will trigger out-of-bounds read.\n",i); exit(-1);}
+
+  if(ul_CarrierFreq_by_100k < eutra_bandtable[i].ul_min) {
+              printf("Band %d, bw %u : UL carrier frequency %u Hz < %u\n",
+              eutra_bandP, bw, ul_CarrierFreq_by_100k,
+              eutra_bandtable[i].ul_min);
+              exit(-1);
+  }
+  if(ul_CarrierFreq_by_100k > (eutra_bandtable[i].ul_max - bw)) {
+              printf("Band %d, bw %u : UL carrier frequency %u Hz > %d\n",
+              eutra_bandP, bw, ul_CarrierFreq_by_100k,
+              eutra_bandtable[i].ul_max - bw);
+              exit(-1);
+  }
+  return (ul_CarrierFreq_by_100k - eutra_bandtable[i].ul_min +
+          ((eutra_bandtable[i].N_OFFs_DL + 180000) / 10));
+}
+
+int get_mac_addr(const char *iface,unsigned char *mac)
+
+{
+    int fd;
+    struct ifreq ifr;
+    int ret=0;
+
+    memset(&ifr, 0, sizeof(ifr));
+    fd = socket(AF_INET, SOCK_DGRAM, 0);
+    ifr.ifr_addr.sa_family = AF_INET;
+    strncpy(ifr.ifr_name , iface , IFNAMSIZ-1);
+    if (0 == ioctl(fd, SIOCGIFHWADDR, &ifr)) memcpy((void*)mac,(void *)ifr.ifr_hwaddr.sa_data,6);
+    else {
+      printf("No MAC address!\n");
+      ret = -1;
+    }
+
+    printf("%s : %2x:%2x:%2x:%2x:%2x:%2x\n",iface,mac[0],mac[1],mac[2],mac[3],mac[4],mac[5]);
+    close(fd);
+    return(ret);
+}
+
+
+void cb(void * userData, ORI_IndicationType_e type, ORI_IndicationValue_u value)
+{
+  printf("============> Got indication %s\n", ORI_IndicationType_Print(type));
+  if(type == ORI_IndicationType_ObjectStateChange)
+    {
+      ORI_Object_s * obj = value.objectStateChange.object;
+      printf("State change for %s:%d -> %s : %s\n", ORI_ObjectType_Print(obj->typeRef.type), obj->instanceNumber,
+	     ORI_StateType_Print(value.objectStateChange.stateType),
+	     value.objectStateChange.stateType == ORI_StateType_AST ? ORI_AST_Print(obj->ast) : ORI_FST_Print(obj->fst));
+    }
+  else if(type == ORI_IndicationType_FaultChange)
+    {
+      ORI_Object_s * obj = value.faultChange.object;
+      ORI_Fault_s * fault = value.faultChange.fault;
+      printf("Fault change for %s:%d -> %s : %s\n", ORI_ObjectType_Print(obj->typeRef.type), obj->instanceNumber,
+	     ORI_FaultType_Print(value.faultChange.faultType),
+	     ORI_FaultState_Print(fault->state));
+      if(fault->state == ORI_FaultState_Active)
+	{
+	  printf("\t Fault severity: %s\n", ORI_FaultSeverity_Print(fault->severity));
+	  printf("\t Timestamp: %s\n", fault->timestamp);
+	  printf("\t Description: %s\n", fault->desc);
+	}
+    }
+  printf("<============\n");
+}
+
+int aw2s_oricleanup(openair0_device *device) {
+
+  ORI_s *               ori = (ORI_s*)device->thirdparty_priv;
+
+  ORI_Disconnect(ori);
+  ORI_Free(ori);
+
+  return(0);
+}
+
+int aw2s_startstreaming(openair0_device *device) {
+
+  ORI_s *               ori = (ORI_s*)device->thirdparty_priv;
+  ORI_Result_e  result;
+  ORI_Result_e  RE_result;
+
+  openair0_config_t *openair0_cfg = device->openair0_cfg;
+
+  ORI_Object_s *tx0= ORI_FindObject(ori, openair0_cfg->duplex_mode == duplex_mode_FDD ? ORI_ObjectType_TxEUtraFDD :ORI_ObjectType_TxEUtraTDD, 0, NULL);
+  ORI_Object_s *tx1= (openair0_cfg->tx_num_channels > 1) ? ORI_FindObject(ori, openair0_cfg->duplex_mode == duplex_mode_FDD ?ORI_ObjectType_TxEUtraFDD : ORI_ObjectType_TxEUtraTDD, 1, NULL) : NULL;
+  ORI_Object_s *rx0= ORI_FindObject(ori, openair0_cfg->duplex_mode == duplex_mode_FDD ?ORI_ObjectType_RxEUtraFDD : ORI_ObjectType_RxEUtraTDD, 0, NULL);
+  ORI_Object_s *rx1= (openair0_cfg->rx_num_channels > 1) ? ORI_FindObject(ori, openair0_cfg->duplex_mode == duplex_mode_FDD ?ORI_ObjectType_RxEUtraFDD : ORI_ObjectType_RxEUtraTDD, 1, NULL) : NULL;
+  ORI_Object_s *link= ORI_FindObject(ori, ORI_ObjectType_ORILink, 0, NULL);
+
+  if (tx0 == NULL || (tx1 == NULL && openair0_cfg->tx_num_channels > 1) || rx0 == NULL || (rx1 == NULL && openair0_cfg->rx_num_channels > 1) || link == NULL) return (-1);
+
+ /*******************************************************************
+   * UNLOCK Link 
+   *******************************************************************/
+
+
+  result = ORI_ObjectStateModification(ori, link, ORI_AST_Unlocked, &RE_result);
+  if(result != ORI_Result_SUCCESS)
+    {
+      printf("ORI_ObjectStateModify failed with error: %s\n", ORI_Result_Print(result));
+      aw2s_oricleanup(device);
+      return -1;
+    }
+
+ /*******************************************************************
+   * UNLOCK TX0
+   *******************************************************************/
+
+
+  /* Put Tx0 into service */
+  result = ORI_ObjectStateModification(ori, tx0, ORI_AST_Unlocked, &RE_result);
+  if(result != ORI_Result_SUCCESS)
+    {
+      printf("ORI_ObjectStateModify failed with error: %s\n", ORI_Result_Print(result));
+      aw2s_oricleanup(device);
+      return -1;
+    }
+  printf("ORI_ObjectStateModify: %s\n", ORI_Result_Print(RE_result));
+
+
+
+  /*******************************************************************
+   * UNLOCK TX1
+   *******************************************************************/
+
+  if (tx1) { 
+    printf("\n\n\n========================================================\n");
+
+    /* Put Tx1 into service */
+   result = ORI_ObjectStateModification(ori, tx1, ORI_AST_Unlocked, &RE_result);
+    if(result != ORI_Result_SUCCESS)
+      {
+        printf("ORI_ObjectStateModify failed with error: %s\n", ORI_Result_Print(result));
+        aw2s_oricleanup(device);
+        return -1;
+      }
+    printf("ORI_ObjectStateModify: %s\n", ORI_Result_Print(RE_result));
+  }
+  /*******************************************************************
+   * UNLOCK RX0
+   *******************************************************************/
+
+  printf("\n\n\n========================================================\n");
+
+  /* Put Rx0 into service */
+  result = ORI_ObjectStateModification(ori, rx0, ORI_AST_Unlocked, &RE_result);
+  if(result != ORI_Result_SUCCESS)
+    {
+      printf("ORI_ObjectStateModify failed with error: %s\n", ORI_Result_Print(result));
+      aw2s_oricleanup(device);
+      return -1;
+    }
+  printf("ORI_ObjectStateModify: %s\n", ORI_Result_Print(RE_result));
+
+
+
+
+  /*******************************************************************
+   * UNLOCK RX1
+   *******************************************************************/
+  if (rx1) {
+    printf("\n\n\n========================================================\n");
+
+    /* Put Rx1 into service */
+    result = ORI_ObjectStateModification(ori, rx1, ORI_AST_Unlocked, &RE_result);
+    if(result != ORI_Result_SUCCESS)
+      {
+        printf("ORI_ObjectStateModify failed with error: %s\n", ORI_Result_Print(result));
+        aw2s_oricleanup(device);
+        return -1;
+      }
+    printf("ORI_ObjectStateModify: %s\n", ORI_Result_Print(RE_result));
+  }
+
+  while (rx0->fst != ORI_FST_Operational || 
+         (openair0_cfg->rx_num_channels > 1 && rx1->fst != ORI_FST_Operational) || 
+         tx0->fst != ORI_FST_Operational || 
+         (openair0_cfg->tx_num_channels > 1 && tx1->fst != ORI_FST_Operational))
+  {}	
+
+  // test RX interface 
+  uint64_t TS;
+  char temp_rx[1024] __attribute__((aligned(32)));
+  int aid,r0=0,r1=(openair0_cfg->rx_num_channels > 1) ? 0 : 1;
+  int i;
+  int Npackets=1024000;
+  for (i=0;i<Npackets;i++) {
+    device->trx_read_func2(device,
+                           (openair0_timestamp*)&TS,
+                           (void*)temp_rx,
+                           256,
+                           &aid);
+    if (aid == 0) r0=1;
+    if (aid == 1) r1=1;
+  }
+  if (r0==1 && r1==1) printf("Streaming started, returning to OAI\n");
+  else {
+    printf("Didn't get anything from one antenna port after %d packets %d,%d\n",Npackets,r0,r1);
+    return(-1);
+  }
+  return(0);
+
+}
+int aw2s_oriinit(openair0_device *device) {
+
+
+  ORI_s * 		ori;
+  ORI_Result_e	result;
+  ORI_Result_e	RE_result;
+  ORI_Object_s * 	objects[100];
+  uint32_t 		numObjects;
+  uint32_t		i;
+
+  eth_params_t *eth_params = device->eth_params;
+
+  openair0_config_t *openair0_cfg = device->openair0_cfg;
+
+  
+  /*******************************************************************
+   * CREATION AND CONNECTION
+   *******************************************************************/
+
+  printf("Initializing the ORI control interface\n");
+
+  /* Create context */
+  ori = ORI_Create();
+  if(!ori)
+    {
+      printf("Failed to create ORI context\n");
+      return -1;
+    }
+  device->thirdparty_priv = (void *)ori;
+  ori->userData = (void *)ori;
+  ori->indicationCallback = cb;
+	
+  /* Connect... */
+  printf("Trying to connect to AW2S device on %s : %d\n",eth_params->remote_addr, eth_params->remote_portc);
+  result = ORI_Connect(ori, eth_params->remote_addr, eth_params->remote_portc, 3000, 0);
+  if(result != ORI_Result_SUCCESS)
+    {
+      printf("ORI_Connect failed with error: %s\n", ORI_Result_Print(result));
+      aw2s_oricleanup(device);
+      return -1;
+    }
+	
+  /* First health check */
+  result = ORI_HealthCheck(ori, 6000, &RE_result);
+  if(result != ORI_Result_SUCCESS)
+    {
+      printf("ORI_HealthCheck failed with error: %s\n", ORI_Result_Print(result));
+      aw2s_oricleanup(device);
+      return -1;
+    }
+  printf("ORI_HealthCheck: %s\n", ORI_Result_Print(RE_result));
+	
+  /* Set RE time */
+  result = ORI_SetTime(ori, &RE_result);
+  if(result != ORI_Result_SUCCESS)
+    {
+      printf("ORI_SetTime failed with error: %s\n", ORI_Result_Print(result));
+      aw2s_oricleanup(device);
+      return -1;
+    }
+  printf("ORI_SetTime: %s\n", ORI_Result_Print(RE_result));
+
+
+
+
+  /*******************************************************************
+   * SOFTWARE PARAMETERS ALIGNMENT
+   *******************************************************************/
+
+  /* Report all current objects parameters */
+  result = ORI_ObjectParamReport(ori, NULL, 0, ORI_ObjectParam_All, &RE_result);
+  if(result != ORI_Result_SUCCESS)
+    {
+      printf("ORI_ObjectParamReport failed with error: %s\n", ORI_Result_Print(result));
+      aw2s_oricleanup(device);
+      return -1;
+    }
+  
+   printf("ORI_ObjectParamReport: %s\n", ORI_Result_Print(RE_result));
+
+
+
+
+  /*******************************************************************
+   * TX PATHS CREATION
+   *******************************************************************/
+
+  /* Prepare parameters */
+  ORI_ObjectTypeRef_s txTypeRef = { NULL, openair0_cfg->duplex_mode == duplex_mode_FDD ? ORI_ObjectType_TxEUtraFDD : ORI_ObjectType_TxEUtraTDD};
+  ORI_ObjectParams_u txParams;
+  ORI_ObjectParam_e txParamList[9];
+  ORI_Result_e txParamResult[9];
+  int num_txparams;
+
+  if (openair0_cfg->duplex_mode == duplex_mode_FDD) {
+      txParamList[0] = ORI_ObjectParam_SigPath_antPort; 
+      txParamList[1] = ORI_ObjectParam_SigPath_axcW; 
+      txParamList[2] = ORI_ObjectParam_SigPath_axcB;
+      txParamList[3] = ORI_ObjectParam_SigPath_chanBW; 
+      txParamList[4] = ORI_ObjectParam_SigPath_earfcn; 
+      txParamList[5] = ORI_ObjectParam_TxSigPath_maxTxPwr;
+      num_txparams = 6;
+  }
+  else {
+      txParamList[0] = ORI_ObjectParam_SigPath_antPort; 
+      txParamList[1] = ORI_ObjectParam_SigPath_axcW; 
+      txParamList[2] = ORI_ObjectParam_SigPath_axcB;
+      txParamList[3] = ORI_ObjectParam_SigPath_chanBW; 
+      txParamList[4] = ORI_ObjectParam_SigPath_earfcn; 
+      txParamList[5] = ORI_ObjectParam_TxSigPath_maxTxPwr;
+      txParamList[6] = ORI_ObjectParam_SigPath_tddULDLConfig;
+      txParamList[7] = ORI_ObjectParam_SigPath_tddSpecialSFConfig;
+      txParamList[8] = ORI_ObjectParam_TxSigPath_tddCPLengthDL;
+      num_txparams = 9;
+  }
+
+
+  /* Create tx0 */
+  ORI_Object_s * tx0;
+  printf("AW2S: duplex_mode %d, tx_bw %f, rx_bw %f\n",openair0_cfg->duplex_mode,openair0_cfg->tx_bw,openair0_cfg->rx_bw);
+  if (openair0_cfg->duplex_mode == duplex_mode_FDD) {
+    txParams.TxEUtraFDD.antPort = ORI_FindObject(ori, ORI_ObjectType_AntennaPort, 0, NULL);
+    txParams.TxEUtraFDD.axcW = 1;
+    txParams.TxEUtraFDD.axcB = 0;
+    txParams.TxEUtraFDD.chanBW = openair0_cfg->tx_bw/100e3;
+    txParams.TxEUtraFDD.earfcn = 3350;
+    txParams.TxEUtraFDD.maxTxPwr = -100;
+  }
+  else if (openair0_cfg->duplex_mode == duplex_mode_TDD) {
+    txParams.TxEUtraTDD.antPort = ORI_FindObject(ori, ORI_ObjectType_AntennaPort, 0, NULL);
+    txParams.TxEUtraTDD.axcW = 1;
+    txParams.TxEUtraTDD.axcB = 0;
+    txParams.TxEUtraTDD.chanBW = openair0_cfg->tx_bw/100e3;
+    txParams.TxEUtraTDD.earfcn = to_earfcn_DL_aw2s(38,(long long int)openair0_cfg->tx_freq[0],txParams.TxEUtraTDD.chanBW);
+    txParams.TxEUtraTDD.maxTxPwr = 430-((int)openair0_cfg->tx_gain[0]*10);
+    txParams.TxEUtraTDD.tddULDLConfig = 1;
+    txParams.TxEUtraTDD.tddSpecialSFConfig = 0;
+    txParams.TxEUtraTDD.tddCPLengthDL = ORI_tddCPLength_Normal;
+
+    printf("AW2S: Configuring for TDD, EARFCN %u, Power %d, BW %d\n",
+	txParams.TxEUtraTDD.earfcn,txParams.TxEUtraTDD.maxTxPwr,txParams.TxEUtraTDD.chanBW);
+  }
+  else {
+    aw2s_oricleanup(device);
+    return -1;
+  }
+  result = ORI_ObjectCreation(ori, txTypeRef, txParams, txParamList, num_txparams, txParamResult, &tx0, &RE_result);
+  if(RE_result != ORI_Result_SUCCESS)
+    {
+      printf("ORI_ObjectCreation (txParams0.TxEUtraFDD/TDD) failed with error: %s (%s,%s,%s,%s,%s,%s,%s,%s,%s\n", ORI_Result_Print(result),
+	ORI_Result_Print(txParamResult[0]),
+        ORI_Result_Print(txParamResult[1]),
+        ORI_Result_Print(txParamResult[2]),
+        ORI_Result_Print(txParamResult[3]),
+        ORI_Result_Print(txParamResult[4]),
+        ORI_Result_Print(txParamResult[5]),
+        ORI_Result_Print(txParamResult[6]),
+        ORI_Result_Print(txParamResult[7]),
+        ORI_Result_Print(txParamResult[8]));
+      aw2s_oricleanup(device);
+      return -1;
+    }
+  printf("ORI_ObjectCreation (txParams0.TxEUtraFDD/TDD): %s\n", ORI_Result_Print(RE_result));
+
+
+  /* Create tx1 */
+  if (openair0_cfg->tx_num_channels > 1) {
+    ORI_Object_s * tx1;
+    if (openair0_cfg->duplex_mode ==duplex_mode_FDD) txParams.TxEUtraFDD.antPort = ORI_FindObject(ori, ORI_ObjectType_AntennaPort, 1, NULL);
+    else                                  txParams.TxEUtraTDD.antPort = ORI_FindObject(ori, ORI_ObjectType_AntennaPort, 1, NULL);
+    result = ORI_ObjectCreation(ori, txTypeRef, txParams, txParamList, num_txparams, txParamResult, &tx1, &RE_result);
+    if(RE_result != ORI_Result_SUCCESS)
+      {
+        printf("ORI_ObjectCreation (txParams1.TxEUtraFDD/TDD) failed with error: %s\n", ORI_Result_Print(result));
+        aw2s_oricleanup(device);
+        return -1;
+      }
+    printf("ORI_ObjectCreation (txParams1.TxEUtraFDD/TDD): %s\n", ORI_Result_Print(RE_result));
+  }
+
+
+
+  /*******************************************************************
+   * RX PATHS CREATION
+   *******************************************************************/
+
+  /* Prepare parameters */
+  ORI_ObjectTypeRef_s rxTypeRef = { NULL,  openair0_cfg->duplex_mode == duplex_mode_FDD ? ORI_ObjectType_RxEUtraFDD : ORI_ObjectType_RxEUtraTDD};
+  ORI_ObjectParams_u rxParams,rxParams1;
+  ORI_ObjectParam_e rxParamList[8] = { ORI_ObjectParam_SigPath_antPort, ORI_ObjectParam_SigPath_axcW, ORI_ObjectParam_SigPath_axcB,
+				       ORI_ObjectParam_SigPath_chanBW, ORI_ObjectParam_SigPath_earfcn };
+  ORI_Result_e rxParamResult[8];
+  int num_rxparams = 5;
+  if (openair0_cfg->duplex_mode == duplex_mode_TDD) {
+      rxParamList[5] = ORI_ObjectParam_SigPath_tddULDLConfig;
+      rxParamList[6] = ORI_ObjectParam_SigPath_tddSpecialSFConfig;
+      rxParamList[7] = ORI_ObjectParam_RxSigPath_tddCPLengthUL;
+      num_rxparams = 8;
+  }
+  /* Create rx0 */
+  ORI_Object_s * rx0;
+  if (openair0_cfg->duplex_mode == duplex_mode_FDD) {
+    rxParams.RxEUtraFDD.antPort = ORI_FindObject(ori, ORI_ObjectType_AntennaPort, 0, NULL);
+    rxParams.RxEUtraFDD.axcW = 1;
+    rxParams.RxEUtraFDD.axcB = 0;
+    rxParams.RxEUtraFDD.chanBW = 200;
+    rxParams.RxEUtraFDD.earfcn = 21350;
+    result = ORI_ObjectCreation(ori, rxTypeRef, rxParams, rxParamList, num_rxparams, rxParamResult, &rx0, &RE_result);
+  }    
+  else {
+    rxParams.RxEUtraTDD.antPort = ORI_FindObject(ori, ORI_ObjectType_AntennaPort, 0, NULL);
+    rxParams.RxEUtraTDD.axcW = 1;
+    rxParams.RxEUtraTDD.axcB = 0;
+    rxParams.RxEUtraTDD.chanBW = txParams.TxEUtraTDD.chanBW;
+    rxParams.RxEUtraTDD.earfcn = txParams.TxEUtraTDD.earfcn;
+    rxParams.RxEUtraTDD.tddULDLConfig = 1;
+    rxParams.RxEUtraTDD.tddSpecialSFConfig = 1;
+    rxParams.RxEUtraTDD.tddCPLengthUL = ORI_tddCPLength_Normal;
+
+    printf("AW2S: Creating RX0 for EARFCN %d\n",rxParams.RxEUtraTDD.earfcn);
+ 
+    result = ORI_ObjectCreation(ori, rxTypeRef, rxParams, rxParamList, num_rxparams, rxParamResult, &rx0, &RE_result);
+
+  }
+
+  if(result != ORI_Result_SUCCESS)
+    {
+      printf("ORI_ObjectCreation (rxParams0.RxEUtraFDD/TDD) failed with error: %s\n", ORI_Result_Print(result));
+      aw2s_oricleanup(device);
+      return -1;
+    }
+  printf("ORI_ObjectCreation (rxParams0.RxEUtraFDD/TDD): %s\n", ORI_Result_Print(RE_result));
+  
+  if (openair0_cfg->rx_num_channels > 1) {  
+    /* Create rx1 */
+    ORI_Object_s * rx1;
+    memcpy((void*)&rxParams1,(void*)&rxParams,sizeof(rxParams));
+    if (openair0_cfg->duplex_mode == duplex_mode_FDD)  rxParams1.RxEUtraFDD.antPort = ORI_FindObject(ori, ORI_ObjectType_AntennaPort, 1, NULL);
+    else rxParams1.RxEUtraTDD.antPort = ORI_FindObject(ori, ORI_ObjectType_AntennaPort, 1, NULL);
+
+    result = ORI_ObjectCreation(ori, rxTypeRef, rxParams1, rxParamList, num_rxparams, rxParamResult, &rx1, &RE_result);
+  
+  
+    if(result != ORI_Result_SUCCESS)
+      {
+        printf("ORI_ObjectCreation (rxParams1.RxEUtraFDD/TDD) failed with error: %s\n", ORI_Result_Print(result));
+        aw2s_oricleanup(device);
+        return -1;
+      }
+    printf("ORI_ObjectCreation (rxParams1.RxEUtraFDD/TDD): %s\n", ORI_Result_Print(RE_result));
+  }
+
+  /* Create link */
+
+  ORI_ObjectParams_u linkParams;
+  ORI_ObjectParam_e linkParamList[3] = {ORI_ObjectParam_ORILink_AWS_remoteMAC, ORI_ObjectParam_ORILink_AWS_remoteIP,ORI_ObjectParam_ORILink_AWS_remoteUdpPort};
+  ORI_Result_e linkParamResult[3];
+
+  ORI_Object_s *link= ORI_FindObject(ori, ORI_ObjectType_ORILink, 0, NULL);
+  linkParams.ORILink.AWS_remoteUdpPort = eth_params->my_portd;
+
+
+  if (get_mac_addr(eth_params->local_if_name,linkParams.ORILink.AWS_remoteMAC) < 0) return(-1);
+  inet_pton(AF_INET,eth_params->my_addr,(struct in_addr*)linkParams.ORILink.AWS_remoteIP);
+  result = ORI_ObjectParamModify(ori,link,linkParams,linkParamList,3,linkParamResult,&RE_result);
+  if(result != ORI_Result_SUCCESS)
+    {
+      printf("ORI_ObjectParamModify (linkParams) failed with error: %s\n", ORI_Result_Print(result));
+      aw2s_oricleanup(device);
+      return -1;
+    }
+  result = ORI_ObjectStateModification(ori, link, ORI_AST_Locked, &RE_result);
+  if(result != ORI_Result_SUCCESS)
+    {
+      printf("ORI_ObjectStateModify failed with error: %s\n", ORI_Result_Print(result));
+      aw2s_oricleanup(device);
+      return -1;
+    }
+
+  printf("ORI_ObjectParamModify (linkParams): %s (%d,%d,%d)\n", ORI_Result_Print(RE_result),linkParamResult[0],linkParamResult[1],linkParamResult[2]);
+
+  /*******************************************************************
+   * FULL OBJECT PARAMETERS UPDATE
+   *******************************************************************/
+
+  printf("\n\n\n========================================================\n");
+
+  result = ORI_ObjectParamReport(ori, NULL, 0, ORI_ObjectParam_All, &RE_result);
+  if(result != ORI_Result_SUCCESS)
+    {
+      printf("ORI_ObjectParamReport failed with error: %s\n", ORI_Result_Print(result));
+      aw2s_oricleanup(device);
+      return -1;
+    }
+  printf("ORI_ObjectParamReport: %s\n", ORI_Result_Print(RE_result));
+
+
+
+
+
+  /*******************************************************************
+   * FULL OBJECT STATES UPDATE
+   *******************************************************************/
+
+  printf("\n\n\n========================================================\n");
+
+  result = ORI_ObjectStateReport(ori, NULL, 0, ORI_StateType_All, ORI_EventDrivenReport_True, &RE_result);
+  if(result != ORI_Result_SUCCESS)
+    {
+      printf("ORI_ObjectStateReport failed with error: %s\n", ORI_Result_Print(result));
+      aw2s_oricleanup(device);
+      return -1;
+    }
+  printf("ORI_ObjectStateReport: %s\n", ORI_Result_Print(RE_result));
+
+  /* Print reported states for all objects (some objects have non-applicable states though) */
+  numObjects = ORI_GetAllObjects(ori, objects, 100, NULL);
+  for(i=0; i<numObjects; i++)
+    printf("%s:%d -> %s / %s\n", ORI_ObjectType_Print(objects[i]->typeRef.type), objects[i]->instanceNumber, ORI_AST_Print(objects[i]->ast), ORI_FST_Print(objects[i]->fst));
+
+
+
+
+
+  /*******************************************************************
+   * FULL OBJECT FAULTS UPDATE
+   *******************************************************************/
+
+  printf("\n\n\n========================================================\n");
+
+  result = ORI_ObjectFaultReport(ori, NULL, 0, ORI_EventDrivenReport_True, &RE_result);
+  if(result != ORI_Result_SUCCESS)
+    {
+      printf("ORI_ObjectFaultReport failed with error: %s\n", ORI_Result_Print(result));
+      aw2s_oricleanup(device);
+      return -1;
+    }
+  printf("ORI_ObjectFaultReport: %s\n", ORI_Result_Print(RE_result));
+
+
+  /*******************************************************************
+   * PRINT STATES
+   *******************************************************************/
+
+  printf("\n\n\n========================================================\n");
+
+  /* Due to event driven reporting set to "true", the states modifications of the objects should be reflected back into the model. Print states for all objects (some objects have non-applicable states though) */
+  numObjects = ORI_GetAllObjects(ori, objects, 100, NULL);
+  for(i=0; i<numObjects; i++)
+    printf("%s:%d -> %s / %s\n", ORI_ObjectType_Print(objects[i]->typeRef.type), objects[i]->instanceNumber, ORI_AST_Print(objects[i]->ast), ORI_FST_Print(objects[i]->fst));
+
+
+
+
+
+  return 0;
+}
+
+
+int transport_init(openair0_device *device, openair0_config_t *openair0_cfg, eth_params_t * eth_params ) {
+
+  
+  device->thirdparty_init           = aw2s_oriinit;
+  device->thirdparty_cleanup        = aw2s_oricleanup;
+  device->thirdparty_startstreaming = aw2s_startstreaming;
+
+  return(0);
+}
diff --git a/targets/ARCH/AW2SORI/ori.h b/targets/ARCH/AW2SORI/ori.h
new file mode 100644
index 0000000000000000000000000000000000000000..d4a4f2cbbf53d4a1a959d62c8bc415772a0e7563
--- /dev/null
+++ b/targets/ARCH/AW2SORI/ori.h
@@ -0,0 +1,2381 @@
+/**
+* @file ori.h
+* @brief Open Radio Interface (ORI) C library header file.
+* @author AW2S (http://www.aw2s.com)
+* @version 1.6
+* @date July 29, 2019
+*
+* This file is the AW2S REC ORI C library header, and contains all necessary
+* functions prototypes, enumerations, data structures and type definitions
+* to implement the ORI shared library in an user application.
+*/
+
+#ifndef ORI_H_
+#define ORI_H_
+
+#define ORILIB_VERSION_MAJOR 1
+#define ORILIB_VERSION_MINOR 6
+
+#include <stdint.h>
+
+/*-----------------------------------------------------------------------------------------
+ * ORI_RESULT ENUMERATION
+ *-----------------------------------------------------------------------------------------*/
+
+/**
+ * @enum ORI_Result_e
+ * @brief ORI result codes enumeration.
+ */
+typedef enum
+{
+	ORI_Result_SUCCESS = 0,								/**< */
+	ORI_Result_FAIL_SYNTAX_ERROR,						/**< */
+	ORI_Result_FAIL_UNRECOGNIZED_MESSAGE,				/**< */
+	ORI_Result_FAIL_RE_BUSY,							/**< */
+	ORI_Result_FAIL_MISSING_PARAMETER,					/**< */
+	ORI_Result_FAIL_PARAMETER_ERROR,					/**< */
+	ORI_Result_FAIL_FRAME_ERROR,						/**< */
+	ORI_Result_FAIL_INVALID_TIMEDATA,					/**< */
+	ORI_Result_SUCCESS_SOFTWARE_ALREADY_EXISTING,		/**< */
+	ORI_Result_FAIL_FTP_ERROR,							/**< */
+	ORI_Result_FAIL_BROKEN_IMAGE,						/**< */
+	ORI_Result_FAIL_NO_COMPATIBLE_IMAGE,				/**< */
+	ORI_Result_FAIL_CANNOT_STORE,						/**< */
+	ORI_Result_FAIL_NOSUCH_IMAGE,						/**< */
+	ORI_Result_FAIL_UNKNOWN_OBJECT,						/**< */
+	ORI_Result_FAIL_UNKNOWN_PARAM,						/**< */
+	ORI_Result_FAIL_PARAMETER_FAIL,						/**< */
+	ORI_Result_FAIL_NOSUCH_RESOURCE,					/**< */
+	ORI_Result_FAIL_PARAM_READONLY,						/**< */
+	ORI_Result_FAIL_PARAM_LOCKREQUIRED,					/**< */
+	ORI_Result_FAIL_VALUE_OUTOF_RANGE,					/**< */
+	ORI_Result_FAIL_VALUE_TYPE_ERROR,					/**< */
+	ORI_Result_FAIL_UNKNOWN_OBJTYPE,					/**< */
+	ORI_Result_FAIL_STATIC_OBJTYPE,						/**< */
+	ORI_Result_FAIL_CHILD_NOTALLOWED,					/**< */
+	ORI_Result_FAIL_OUTOF_RESOURCES,					/**< */
+	ORI_Result_FAIL_LOCKREQUIRED,						/**< */
+	ORI_Result_FAIL_UNKNOWN_STATETYPE,					/**< */
+	ORI_Result_FAIL_UNKNOWN_STATEVALUE,					/**< */
+	ORI_Result_FAIL_STATE_READONLY,						/**< */
+	ORI_Result_FAIL_RESOURCE_UNAVAILABLE,				/**< */
+	ORI_Result_FAIL_RESOURCE_INUSE,						/**< */
+	ORI_Result_FAIL_PARENT_CHILD_CONFLICT,				/**< */
+	ORI_Result_FAIL_PRECONDITION_NOTMET,				/**< */
+	ORI_Result_FAIL_NOSUCH_FILE,						/**< */
+	ORI_Result_FAIL_SIZE_LIMIT,							/**< */
+	ORI_Result_FAIL_ACTIVATION_ERROR,					/**< */
+	ORI_Result_FAIL_ALD_UNAVAILABLE,					/**< */
+	ORI_Result_FAIL_BUS_UNAVAILABLE,					/**< */
+	ORI_Result_OsError,									/**< */
+	ORI_Result_BadParameter,							/**< */
+	ORI_Result_InvalidIpAddress,						/**< */
+	ORI_Result_ConnectionFailed,						/**< */
+	ORI_Result_ConnectionTimedOut,						/**< */
+	ORI_Result_NotConnected,							/**< */
+	ORI_Result_Unknown,									/**< */
+} ORI_Result_e;
+
+/**
+ * @brief Get a string describing an ::ORI_Result_e.
+ * @param result The ::ORI_Result_e.
+ * @return The describing string.
+ */
+const char * 					ORI_Result_Print(ORI_Result_e result);
+
+/**
+ * @brief Get an ::ORI_Result_e from a string.
+ * @param resultString The string to match.
+ * @return The matched ::ORI_Result_e, or ::ORI_Result_Unknown if failure.
+ */
+ORI_Result_e 					ORI_Result_Enum(const char * resultString);
+
+
+
+/*-----------------------------------------------------------------------------------------
+ * ORI_INDICATIONTYPE ENUMERATION
+ *-----------------------------------------------------------------------------------------*/
+
+/**
+ * @enum ORI_IndicationType_e
+ * @brief ORI indication type enumeration.
+ */
+typedef enum
+{
+	ORI_IndicationType_FileTransferComplete = 0,		/**< */
+	ORI_IndicationType_ObjectStateChange,				/**< */
+	ORI_IndicationType_FaultChange,						/**< */
+	ORI_IndicationType_FileAvailable,					/**< */
+	ORI_IndicationType_UploadFileCmpl,					/**< */
+	ORI_IndicationType_AisgScanDeviceCompl,				/**< */
+	ORI_IndicationType_AisgAldRx,						/**< */
+	ORI_IndicationType_Unknown,							/**< */
+} ORI_IndicationType_e;
+
+/**
+ * @brief Get a string describing an ::ORI_IndicationType_e.
+ * @param indicationType The ::ORI_IndicationType_e.
+ * @return The describing string.
+ */
+const char * 					ORI_IndicationType_Print(ORI_IndicationType_e indicationType);
+
+/**
+ * @brief Get an ::ORI_IndicationType_e from a string.
+ * @param indicationTypeString The string to match.
+ * @return The matched ::ORI_IndicationType_e, or ::ORI_IndicationType_Unknown if failure.
+ */
+ORI_IndicationType_e 			ORI_IndicationType_Enum(const char * indicationTypeString);
+
+
+
+/*-----------------------------------------------------------------------------------------
+ * ORI_OBJECTTYPE ENUMERATION
+ *-----------------------------------------------------------------------------------------*/
+
+/**
+ * @enum ORI_ObjectType_e
+ * @brief ORI object type enumeration.
+ */
+typedef enum
+{
+	ORI_ObjectType_RE = 0,								/**< */
+	ORI_ObjectType_AntennaPort,							/**< */
+	ORI_ObjectType_TxUtra,								/**< */
+	ORI_ObjectType_TxEUtraFDD,							/**< */
+	ORI_ObjectType_TxEUtraTDD,							/**< */
+	ORI_ObjectType_TxGSM,								/**< */
+	ORI_ObjectType_RxUtra,								/**< */
+	ORI_ObjectType_RxEUtraFDD,							/**< */
+	ORI_ObjectType_RxEUtraTDD,							/**< */
+	ORI_ObjectType_RxGSM,								/**< */
+	ORI_ObjectType_ORILink,								/**< */
+	ORI_ObjectType_ExternalEventPort,					/**< */
+	ORI_ObjectType_AISGPort,							/**< */
+	ORI_ObjectType_AISGALD,								/**< */
+	ORI_ObjectType_Log,									/**< */
+	ORI_ObjectType_DLRoutedIQData,						/**< */
+	ORI_ObjectType_ULRoutedIQData,						/**< */
+	ORI_ObjectType_DLRoutedCWBlock,						/**< */
+	ORI_ObjectType_ULRoutedCWBlock,						/**< */
+	ORI_ObjectType_Invalid,								/**< */
+} ORI_ObjectType_e;
+
+/**
+ * @brief Get a string describing an ::ORI_ObjectType_e.
+ * @param objectType The ::ORI_ObjectType_e.
+ * @return The describing string.
+ */
+const char * 					ORI_ObjectType_Print(ORI_ObjectType_e objectType);
+
+/**
+ * @brief Get an ::ORI_ObjectType_e from a string.
+ * @param objectTypeString The string to match.
+ * @return The matched ::ORI_ObjectType_e, or ::ORI_ObjectType_Invalid if failure.
+ */
+ORI_ObjectType_e 				ORI_ObjectType_Enum(const char * objectTypeString);
+
+
+
+/*-----------------------------------------------------------------------------------------
+ * ORI_OBJECTPARAM ENUMERATION
+ *-----------------------------------------------------------------------------------------*/
+
+/**
+ * @enum ORI_ObjectParam_e
+ * @brief ORI object parameter enumeration.
+ *
+ * All the parameters of all objects are in this list, but only once
+ * (therefore some parameters will be used by several object types).
+ */
+typedef enum
+{
+	ORI_ObjectParam_RE_VendorID = 0,					/**< */
+	ORI_ObjectParam_RE_ProductID,						/**< */
+	ORI_ObjectParam_RE_ProductRevision,					/**< */
+	ORI_ObjectParam_RE_SerialNumber,					/**< */
+	ORI_ObjectParam_RE_ProtocolVer,						/**< */
+	ORI_ObjectParam_RE_AGCTargetLevCfgGran,				/**< */
+	ORI_ObjectParam_RE_AGCSettlingTimeCfgGran,			/**< */
+	ORI_ObjectParam_RE_AGCSettlingTimeCap,				/**< */
+	ORI_ObjectParam_RE_AWS_uptime,						/**< */
+	ORI_ObjectParam_RE_AWS_inputVoltage,				/**< */
+	ORI_ObjectParam_RE_AWS_inputCurrent,				/**< */
+	ORI_ObjectParam_RE_AWS_productTemp,					/**< */
+	ORI_ObjectParam_RE_AWS_cpuTemp,						/**< */
+	ORI_ObjectParam_RE_AWS_paTemp,						/**< */
+	ORI_ObjectParam_RE_AWS_rxPwrOffset,					/**< */
+	ORI_ObjectParam_Port_portLabel,						/**< */
+	ORI_ObjectParam_Port_AWS_outputPwr,					/**< */
+	ORI_ObjectParam_Port_AWS_inputPwr,					/**< */
+	ORI_ObjectParam_Port_AWS_returnLoss,				/**< */
+	ORI_ObjectParam_SigPath_axcW,						/**< */
+	ORI_ObjectParam_SigPath_axcB,						/**< */
+	ORI_ObjectParam_SigPath_oriLink,					/**< */
+	ORI_ObjectParam_SigPath_uarfcn,						/**< */
+	ORI_ObjectParam_SigPath_antPort,					/**< */
+	ORI_ObjectParam_SigPath_chanBW,						/**< */
+	ORI_ObjectParam_SigPath_tddSpecialSFConfig,			/**< */
+	ORI_ObjectParam_SigPath_tddULDLConfig,				/**< */
+	ORI_ObjectParam_SigPath_earfcn,						/**< */
+	ORI_ObjectParam_SigPath_freqBandInd,				/**< */
+	ORI_ObjectParam_SigPath_sigmaIQ,					/**< */
+	ORI_ObjectParam_SigPath_AWS_enableCompRateChange,	/**< */
+	ORI_ObjectParam_SigPath_AWS_enableCompBitChange,	/**< */
+	ORI_ObjectParam_SigPath_AWS_measuredPwr,			/**< */
+	ORI_ObjectParam_SigPath_AWS_axcIncr,				/**< */
+	ORI_ObjectParam_TxSigPath_t2a,						/**< */
+	ORI_ObjectParam_TxSigPath_maxTxPwr,					/**< */
+	ORI_ObjectParam_TxSigPath_dlCalRE,					/**< */
+	ORI_ObjectParam_TxSigPath_tddCPLengthDL,			/**< */
+	ORI_ObjectParam_TxSigPath_dlCalREMax,				/**< */
+	ORI_ObjectParam_TxSigPath_enableIQDLComp,			/**< */
+	ORI_ObjectParam_TxSigPath_AWS_enPeakCancel,			/**< */
+	ORI_ObjectParam_RxSigPath_ulCalREMax,				/**< */
+	ORI_ObjectParam_RxSigPath_ta3,						/**< */
+	ORI_ObjectParam_RxSigPath_ulCalRE,					/**< */
+	ORI_ObjectParam_RxSigPath_rtwpGroup,				/**< */
+	ORI_ObjectParam_RxSigPath_tddCPLengthUL,			/**< */
+	ORI_ObjectParam_RxSigPath_ulFeedAdj,				/**< */
+	ORI_ObjectParam_RxSigPath_ulTgtRMSLvl,				/**< */
+	ORI_ObjectParam_RxSigPath_ulAGCSetlgTime,			/**< */
+	ORI_ObjectParam_RxSigPath_TxSigPath,				/**< */
+	ORI_ObjectParam_RxSigPath_enableIQULComp,			/**< */
+	ORI_ObjectParam_ORILink_portRoleCapability,			/**< */
+	ORI_ObjectParam_ORILink_portRole,					/**< */
+	ORI_ObjectParam_ORILink_bitRateSupport,				/**< */
+	ORI_ObjectParam_ORILink_bitRateRequested,			/**< */
+	ORI_ObjectParam_ORILink_bitRateOperational,			/**< */
+	ORI_ObjectParam_ORILink_localPortID,				/**< */
+	ORI_ObjectParam_ORILink_remotePortID,				/**< */
+	ORI_ObjectParam_ORILink_toffset,					/**< */
+	ORI_ObjectParam_ORILink_oriLinkType,				/**< */
+	ORI_ObjectParam_ORILink_AWS_localMAC,				/**< */
+	ORI_ObjectParam_ORILink_AWS_remoteMAC,				/**< */
+	ORI_ObjectParam_ORILink_AWS_t14,					/**< */
+	ORI_ObjectParam_ORILink_AWS_remoteIP,				/**< */
+	ORI_ObjectParam_ORILink_AWS_localIP,				/**< */
+	ORI_ObjectParam_ORILink_AWS_remoteUdpPort,			/**< */
+	ORI_ObjectParam_ORILink_AWS_localUdpPort,			/**< */
+	ORI_ObjectParam_ORILink_AWS_sfpTxPow,				/**< */
+	ORI_ObjectParam_ORILink_AWS_sfpRxPow,				/**< */
+	ORI_ObjectParam_AISGPort_busPowerEnable,			/**< */
+	ORI_ObjectParam_AISGALD_deviceType,					/**< */
+	ORI_ObjectParam_AISGALD_UID,						/**< */
+	ORI_ObjectParam_AISGALD_releaseID,					/**< */
+	ORI_ObjectParam_AISGALD_aisgVersion,				/**< */
+	ORI_ObjectParam_AISGALD_deviceTypeVersion,			/**< */
+	ORI_ObjectParam_AISGALD_frameLength,				/**< */
+	ORI_ObjectParam_AISGALD_hdlcAdress,					/**< */
+	ORI_ObjectParam_Log_logTypeID,						/**< */
+	ORI_ObjectParam_Log_description,					/**< */
+	ORI_ObjectParam_Log_logCategory,					/**< */
+	ORI_ObjectParam_Log_maxREfileSize,					/**< */
+	ORI_ObjectParam_Log_maxRECfileSize,					/**< */
+	ORI_ObjectParam_Log_enableNotification,				/**< */
+	ORI_ObjectParam_Log_fileAvailable,					/**< */
+	ORI_ObjectParam_Log_overflowBehaviour,				/**< */
+	ORI_ObjectParam_Log_recordingEnabled,				/**< */
+	ORI_ObjectParam_Log_logPeriod,						/**< */
+	ORI_ObjectParam_Log_timerType,						/**< */
+	ORI_ObjectParam_Routed_MasterPortOriLink,			/**< */
+	ORI_ObjectParam_Routed_SlavePortOriLink,			/**< */
+	ORI_ObjectParam_RoutedIQData_IQsubBlockSize,		/**< */
+	ORI_ObjectParam_RoutedIQData_MasterPortIQblkW,		/**< */
+	ORI_ObjectParam_RoutedIQData_MasterPortIQblkB,		/**< */
+	ORI_ObjectParam_RoutedIQData_SlavePortIQW,			/**< */
+	ORI_ObjectParam_RoutedIQData_SlavePortIQB,			/**< */
+	ORI_ObjectParam_RoutedIQData_TBDelayDL,				/**< */
+	ORI_ObjectParam_RoutedIQData_TBDelayUL,				/**< */
+	ORI_ObjectParam_RoutedCWBlock_CtrlBlockSize,		/**< */
+	ORI_ObjectParam_RoutedCWBlock_SubChannelStart,		/**< */
+	ORI_ObjectParam_RoutedCWBlock_Ydepth,				/**< */
+	ORI_ObjectParam_RoutedCWBlock_SlavePortYoffset,		/**< */
+	ORI_ObjectParam_RoutedCWBlock_MasterPortYoffset,	/**< */
+	ORI_ObjectParam_All,								/**< */
+	ORI_ObjectParam_Invalid,							/**< */
+} ORI_ObjectParam_e;
+
+/**
+ * @brief Get a string describing an ::ORI_ObjectParam_e.
+ * @param objectParam The ::ORI_ObjectParam_e.
+ * @return The describing string.
+ */
+const char * 					ORI_ObjectParam_Print(ORI_ObjectParam_e objectParam);
+
+/**
+ * @brief Get an ::ORI_ObjectParam_e from a string.
+ * @param objectParamString The string to match.
+ * @return The matched ::ORI_ObjectParam_e, or ::ORI_ObjectParam_Invalid if failure.
+ */
+ORI_ObjectParam_e 				ORI_ObjectParam_Enum(const char * objectParamString);
+
+
+
+/*-----------------------------------------------------------------------------------------
+ * ORI_STATETYPE ENUMERATION
+ *-----------------------------------------------------------------------------------------*/
+
+/**
+ * @enum ORI_StateType_e
+ * @brief ORI state type enumeration.
+ */
+typedef enum
+{
+	ORI_StateType_AST = 0,								/**< */
+	ORI_StateType_FST,									/**< */
+	ORI_StateType_All,									/**< */
+	ORI_StateType_Invalid,								/**< */
+} ORI_StateType_e;
+
+/**
+ * @brief Get a string describing an ::ORI_StateType_e.
+ * @param stateType The ::ORI_StateType_e.
+ * @return The describing string.
+ */
+const char * 					ORI_StateType_Print(ORI_StateType_e stateType);
+
+/**
+ * @brief Get an ::ORI_StateType_e from a string.
+ * @param stateTypeString The string to match.
+ * @return The matched ::ORI_StateType_e, or ::ORI_StateType_Invalid if failure.
+ */
+ORI_StateType_e 				ORI_StateType_Enum(const char * stateTypeString);
+
+
+
+/*-----------------------------------------------------------------------------------------
+ * ORI_AST ENUMERATION
+ *-----------------------------------------------------------------------------------------*/
+
+/**
+ * @enum ORI_AST_e
+ * @brief ORI AST enumeration.
+ */
+typedef enum
+{
+	ORI_AST_Locked = 0,									/**< */
+	ORI_AST_Unlocked,									/**< */
+	ORI_AST_Invalid,									/**< */
+} ORI_AST_e;
+
+/**
+ * @brief Get a string describing an ::ORI_AST_e.
+ * @param ast The ::ORI_AST_e.
+ * @return The describing string.
+ */
+const char * 					ORI_AST_Print(ORI_AST_e ast);
+
+/**
+ * @brief Get an ::ORI_AST_e from a string.
+ * @param astString The string to match.
+ * @return The matched ::ORI_AST_e, or ::ORI_AST_Invalid if failure.
+ */
+ORI_AST_e 						ORI_AST_Enum(const char * astString);
+
+
+
+/*-----------------------------------------------------------------------------------------
+ * ORI_FST ENUMERATION
+ *-----------------------------------------------------------------------------------------*/
+
+/**
+ * @enum ORI_FST_e
+ * @brief ORI FST enumeration.
+ */
+typedef enum
+{
+	ORI_FST_PreOperational = 0,							/**< */
+	ORI_FST_Operational,								/**< */
+	ORI_FST_Degraded,									/**< */
+	ORI_FST_Failed,										/**< */
+	ORI_FST_NotOperational,								/**< */
+	ORI_FST_Disabled,									/**< */
+	ORI_FST_Invalid,									/**< */
+} ORI_FST_e;
+
+/**
+ * @brief Get a string describing an ::ORI_FST_e.
+ * @param fst The ::ORI_FST_e.
+ * @return The describing string.
+ */
+const char * 					ORI_FST_Print(ORI_FST_e fst);
+
+/**
+ * @brief Get an ::ORI_FST_e from a string.
+ * @param fstString The string to match.
+ * @return The matched ::ORI_FST_e, or ::ORI_FST_Invalid if failure.
+ */
+ORI_FST_e 						ORI_FST_Enum(const char * fstString);
+
+
+
+/*-----------------------------------------------------------------------------------------
+ * ORI_AGCGRANULARITY ENUMERATION
+ *-----------------------------------------------------------------------------------------*/
+
+/**
+ * @enum ORI_agcGranularity_e
+ * @brief AGC granularity capability enumeration.
+ */
+typedef enum
+{
+	ORI_agcGranularity_RxSigPath = 0,					/**< */
+	ORI_agcGranularity_RE,								/**< */
+	ORI_agcGranularity_Invalid,							/**< */
+} ORI_agcGranularity_e;
+
+/**
+ * @brief Get a string describing an ::ORI_agcGranularity_e.
+ * @param agcGranularity The ::ORI_agcGranularity_e.
+ * @return The describing string.
+ */
+const char * 					ORI_agcGranularity_Print(ORI_agcGranularity_e agcGranularity);
+
+/**
+ * @brief Get an ::ORI_agcGranularity_e from a string.
+ * @param agcGranularityString The string to match.
+ * @return The matched ::ORI_agcGranularity_e, or ::ORI_agcGranularity_Invalid if failure.
+ */
+ORI_agcGranularity_e 			ORI_agcGranularity_Enum(const char * agcGranularityString);
+
+
+
+/*-----------------------------------------------------------------------------------------
+ * ORI_TDDCPLENGTH ENUMERATION
+ *-----------------------------------------------------------------------------------------*/
+
+/**
+ * @enum ORI_tddCPLength_e
+ * @brief TDD cyclic prefix length enumeration.
+ */
+typedef enum
+{
+	ORI_tddCPLength_Normal = 0,							/**< */
+	ORI_tddCPLength_Extended,							/**< */
+	ORI_tddCPLength_Invalid,							/**< */
+} ORI_tddCPLength_e;
+
+/**
+ * @brief Get a string describing an ::ORI_tddCPLength_e.
+ * @param tddCPLength The ::ORI_tddCPLength_e.
+ * @return The describing string.
+ */
+const char * 					ORI_tddCPLength_Print(ORI_tddCPLength_e tddCPLength);
+
+/**
+ * @brief Get a ::ORI_tddCPLength_e from a string.
+ * @param tddCPLengthString The string to match.
+ * @return The matched ::ORI_tddCPLength_e, or ::ORI_tddCPLength_Invalid if failure.
+ */
+ORI_tddCPLength_e 				ORI_tddCPLength_Enum(const char * tddCPLengthString);
+
+
+
+/*-----------------------------------------------------------------------------------------
+ * ORI_FREQBAND ENUMERATION
+ *-----------------------------------------------------------------------------------------*/
+
+/**
+ * @enum ORI_freqBand_e
+ * @brief GSM frequency band enumeration.
+ */
+typedef enum
+{
+	ORI_freqBand_GSM850 = 0,							/**< */
+	ORI_freqBand_PGSM900,								/**< */
+	ORI_freqBand_DCS1800,								/**< */
+	ORI_freqBand_PCS1900,								/**< */
+	ORI_freqBand_Invalid,								/**< */
+} ORI_freqBand_e;
+
+/**
+ * @brief Get a string describing an ::ORI_freqBand_e.
+ * @param freqBand The ::ORI_freqBand_e.
+ * @return The describing string.
+ */
+const char * 					ORI_freqBand_Print(ORI_freqBand_e freqBand);
+
+/**
+ * @brief Get a ::ORI_freqBand_e from a string.
+ * @param freqBandString The string to match.
+ * @return The matched ::ORI_freqBand_e, or ::ORI_freqBand_Invalid if failure.
+ */
+ORI_freqBand_e 					ORI_freqBand_Enum(const char * freqBandString);
+
+
+
+/*-----------------------------------------------------------------------------------------
+ * ORI_PORTROLE ENUMERATION
+ *-----------------------------------------------------------------------------------------*/
+
+/**
+ * @enum ORI_portRole_e
+ * @brief ORI link port role enumeration.
+ */
+typedef enum
+{
+	ORI_portRole_Master = 0,							/**< */
+	ORI_portRole_Slave,									/**< */
+	ORI_portRole_Invalid,								/**< */
+} ORI_portRole_e;
+
+/**
+ * @brief Get a string describing an ::ORI_portRole_e.
+ * @param portRole The ::ORI_portRole_e.
+ * @return The describing string.
+ */
+const char * 					ORI_portRole_Print(ORI_portRole_e portRole);
+
+/**
+ * @brief Get a ::ORI_portRole_e from a string.
+ * @param portRoleString The string to match.
+ * @return The matched ::ORI_portRole_e, or ::ORI_portRole_Invalid if failure.
+ */
+ORI_portRole_e 					ORI_portRole_Enum(const char * portRoleString);
+
+
+
+/*-----------------------------------------------------------------------------------------
+ * ORI_PORTROLECAPABILITY ENUMERATION
+ *-----------------------------------------------------------------------------------------*/
+
+/**
+ * @enum ORI_portRoleCapability_e
+ * @brief ORI Link port role capability enumeration.
+ */
+typedef enum
+{
+	ORI_portRoleCapability_MO = 0,						/**< */
+	ORI_portRoleCapability_SO,							/**< */
+	ORI_portRoleCapability_MS,							/**< */
+	ORI_portRoleCapability_Invalid,						/**< */
+} ORI_portRoleCapability_e;
+
+/**
+ * @brief Get a string describing an ::ORI_portRoleCapability_e.
+ * @param portRoleCapability The ::ORI_portRoleCapability_e.
+ * @return The describing string.
+ */
+const char * 					ORI_portRoleCapability_Print(ORI_portRoleCapability_e portRoleCapability);
+
+/**
+ * @brief Get an ::ORI_portRoleCapability_e from a string.
+ * @param portRoleCapabilityString The string to match.
+ * @return The matched ::ORI_portRoleCapability_e, or ::ORI_portRoleCapability_Invalid if failure.
+ */
+ORI_portRoleCapability_e 		ORI_portRoleCapability_Enum(const char * portRoleCapabilityString);
+
+
+
+/*-----------------------------------------------------------------------------------------
+ * ORI_LINKTYPE ENUMERATION
+ *-----------------------------------------------------------------------------------------*/
+
+/**
+ * @enum ORI_linkType_e
+ * @brief ORI Link type enumeration.
+ */
+typedef enum
+{
+	ORI_linkType_Active = 0,							/**< */
+	ORI_linkType_Passive,								/**< */
+	ORI_linkType_Invalid,								/**< */
+} ORI_linkType_e;
+
+
+/**
+ * @brief Get a string describing an ::ORI_linkType_e.
+ * @param linkType The ::ORI_linkType_e.
+ * @return The describing string.
+ */
+const char * 					ORI_linkType_Print(ORI_linkType_e linkType);
+
+/**
+ * @brief Get an ::ORI_linkType_e from a string.
+ * @param linkTypeString The string to match.
+ * @return The matched ::ORI_linkType_e, or ::ORI_linkType_Invalid if failure.
+ */
+ORI_linkType_e 					ORI_linkType_Enum(const char * linkTypeString);
+
+
+
+/*-----------------------------------------------------------------------------------------
+ * ORI_BOOLEAN ENUMERATION
+ *-----------------------------------------------------------------------------------------*/
+
+/**
+ * @enum ORI_Boolean_e
+ * @brief ORI boolean enumeration.
+ */
+typedef enum
+{
+	ORI_Boolean_False = 0,								/**< */
+	ORI_Boolean_True,									/**< */
+	ORI_Boolean_Invalid,								/**< */
+} ORI_Boolean_e;
+
+/**
+ * @brief Get a string describing an ::ORI_Boolean_e.
+ * @param boolean The ::ORI_Boolean_e.
+ * @return The describing string.
+ */
+const char * 					ORI_Boolean_Print(ORI_Boolean_e boolean);
+
+/**
+ * @brief Get an ::ORI_Boolean_e from a string.
+ * @param booleanString The string to match.
+ * @return The matched ::ORI_Boolean_e, or ::ORI_Boolean_Invalid if failure.
+ */
+ORI_Boolean_e 					ORI_Boolean_Enum(const char * booleanString);
+
+
+
+/*-----------------------------------------------------------------------------------------
+ * ORI_LOGCATEGORY ENUMERATION
+ *-----------------------------------------------------------------------------------------*/
+
+/**
+ * @enum ORI_logCategory_e
+ * @brief Log category enumeration.
+ *
+ */
+typedef enum
+{
+	ORI_logCategory_Fault = 0,							/**< */
+	ORI_logCategory_Perf,								/**< */
+	ORI_logCategory_System,								/**< */
+	ORI_logCategory_Crash,								/**< */
+	ORI_logCategory_Application,						/**< */
+	ORI_logCategory_Debug,								/**< */
+	ORI_logCategory_Other,								/**< */
+	ORI_logCategory_Invalid,							/**< */
+} ORI_logCategory_e;
+
+/**
+ * @brief Get a string describing an ::ORI_logCategory_e.
+ * @param logCategory The ::ORI_logCategory_e.
+ * @return The describing string.
+ */
+const char * 					ORI_logCategory_Print(ORI_logCategory_e logCategory);
+
+/**
+ * @brief Get an ::ORI_logCategory_e from a string.
+ * @param logCategoryString The string to match.
+ * @return The matched ::ORI_logCategory_e, or ::ORI_logCategory_Invalid if failure.
+ */
+ORI_logCategory_e 				ORI_logCategory_Enum(const char * logCategoryString);
+
+
+
+/*-----------------------------------------------------------------------------------------
+ * ORI_OVERFLOWBEHAVIOUR ENUMERATION
+ *-----------------------------------------------------------------------------------------*/
+
+/**
+ * @enum ORI_overflowBehaviour_e
+ * @brief Log overflow behaviour enumeration.
+ *
+ */
+typedef enum
+{
+	ORI_overflowBehaviour_Stop = 0,						/**< */
+	ORI_overflowBehaviour_Fifo,							/**< */
+	ORI_overflowBehaviour_Invalid,						/**< */
+} ORI_overflowBehaviour_e;
+
+/**
+ * @brief Get a string describing an ::ORI_overflowBehaviour_e.
+ * @param overflowBehaviour The ::ORI_overflowBehaviour_e.
+ * @return The describing string.
+ */
+const char * 					ORI_overflowBehaviour_Print(ORI_overflowBehaviour_e overflowBehaviour);
+
+/**
+ * @brief Get an ::ORI_overflowBehaviour_e from a string.
+ * @param overflowBehaviourString The string to match.
+ * @return The matched ::ORI_overflowBehaviour_e, or ::ORI_overflowBehaviour_Invalid if failure.
+ */
+ORI_overflowBehaviour_e 		ORI_overflowBehaviour_Enum(const char * overflowBehaviourString);
+
+
+
+/*-----------------------------------------------------------------------------------------
+ * ORI_TIMERTYPE ENUMERATION
+ *-----------------------------------------------------------------------------------------*/
+
+/**
+ * @enum ORI_timerType_e
+ * @brief Log timer type enumeration.
+ */
+typedef enum
+{
+	ORI_timerType_OneShot = 0,							/**< */
+	ORI_timerType_Periodic,								/**< */
+	ORI_timerType_Invalid,								/**< */
+} ORI_timerType_e;
+
+/**
+ * @brief Get a string describing an ::ORI_timerType_e.
+ * @param timerType The ::ORI_timerType_e.
+ * @return The describing string.
+ */
+const char * 					ORI_timerType_Print(ORI_timerType_e timerType);
+
+/**
+ * @brief Get an ::ORI_timerType_e from a string.
+ * @param timerTypeString The string to match.
+ * @return The matched ::ORI_timerType_e, or ::ORI_timerType_Invalid if failure.
+ */
+ORI_timerType_e 				ORI_timerType_Enum(const char * timerTypeString);
+
+
+
+/*-----------------------------------------------------------------------------------------
+ *	ORI_FAULTTYPE ENUMERATION
+ *-----------------------------------------------------------------------------------------*/
+
+/**
+ * @enum ORI_FaultType_e
+ * @brief ORI fault types enumeration.
+ */
+typedef enum
+{
+	ORI_FaultType_RE_ExtSupplyUnderVolt = 0,			/**< */
+	ORI_FaultType_RE_OverTemp,							/**< */
+	ORI_FaultType_RE_DigInOverdrive,					/**< */
+	ORI_FaultType_RE_RFOutOverdrive,					/**< */
+	ORI_FaultType_RE_TXGainFail,						/**< */
+	ORI_FaultType_RE_RXGainFail,						/**< */
+	ORI_FaultType_AntennaPort_VSWROutOfRange,			/**< */
+	ORI_FaultType_AntennaPort_NonAisgTmaMalfct,			/**< */
+	ORI_FaultType_ORILink_LinkFail,						/**< */
+	ORI_FaultType_ORILink_PortFail,						/**< */
+	ORI_FaultType_ORILink_SyncFail,						/**< */
+	ORI_FaultType_AISGPort_AisgMalfct,					/**< */
+	ORI_FaultType_Invalid,
+} ORI_FaultType_e;
+
+/**
+ * @brief Get a string describing an ::ORI_FaultType_e.
+ * @param faultType The ::ORI_FaultType_e.
+ * @return The describing string.
+ */
+const char * 					ORI_FaultType_Print(ORI_FaultType_e faultType);
+
+/**
+ * @brief Get an ::ORI_FaultType_e from a string.
+ * @param faultTypeString The string to match.
+ * @return The matched ::ORI_FaultType_e, or ::ORI_FaultType_Invalid if failure.
+ */
+ORI_FaultType_e 				ORI_FaultType_Enum(const char * faultTypeString);
+
+
+
+/*-----------------------------------------------------------------------------------------
+ * ORI_FAULTSTATE ENUMERATION
+ *-----------------------------------------------------------------------------------------*/
+
+/**
+ * @enum ORI_FaultState_e
+ * @brief ORI RE fault state enumeration.
+ */
+typedef enum
+{
+    ORI_FaultState_Cleared = 0,							/**< */
+    ORI_FaultState_Active,								/**< */
+    ORI_FaultState_Unknown,								/**< */
+} ORI_FaultState_e;
+
+/**
+ * @brief Get a string describing an ::ORI_FaultState_e.
+ * @param faultState The ::ORI_FaultState_e.
+ * @return The describing string.
+ */
+const char * 					ORI_FaultState_Print(ORI_FaultState_e faultState);
+
+/**
+ * @brief Get an ::ORI_FaultState_e from a string.
+ * @param faultStateString The string to match.
+ * @return The matched ::ORI_FaultState_e, or ::ORI_FaultState_Unknown if failure.
+ */
+ORI_FaultState_e 				ORI_FaultState_Enum(const char * faultStateString);
+
+
+
+/*-----------------------------------------------------------------------------------------
+ * ORI_FAULTSEVERITY ENUMERATION
+ *-----------------------------------------------------------------------------------------*/
+
+/**
+ * @enum ORI_FaultSeverity_e
+ * @brief ORI RE fault severity enumeration.
+ */
+typedef enum
+{
+	ORI_FaultSeverity_Failed = 0,						/**< */
+	ORI_FaultSeverity_Degraded,							/**< */
+	ORI_FaultSeverity_Warning,							/**< */
+	ORI_FaultSeverity_Unknown,							/**< */
+} ORI_FaultSeverity_e;
+
+/**
+ * @brief Get a string describing an ::ORI_FaultSeverity_e.
+ * @param faultSeverity The ::ORI_FaultSeverity_e.
+ * @return The describing string.
+ */
+const char * 					ORI_FaultSeverity_Print(ORI_FaultSeverity_e faultSeverity);
+
+/**
+ * @brief Get an ::ORI_FaultSeverity_e from a string.
+ * @param faultSeverityString The string to match.
+ * @return The matched ::ORI_FaultSeverity_e, or ::ORI_FaultSeverity_Unknown if failure.
+ */
+ORI_FaultSeverity_e 			ORI_FaultSeverity_Enum(const char * faultSeverityString);
+
+
+
+/*-----------------------------------------------------------------------------------------
+ * ORI_EVENTDRIVENREPORT ENUMERATION
+ *-----------------------------------------------------------------------------------------*/
+
+/**
+ * @enum ORI_EventDrivenReport_e
+ * @brief Event driven reporting enumeration.
+ */
+typedef enum
+{
+	ORI_EventDrivenReport_NoModify = 0,					/**< */
+	ORI_EventDrivenReport_True,							/**< */
+	ORI_EventDrivenReport_False,						/**< */
+	ORI_EventDrivenReport_Invalid,						/**< */
+} ORI_EventDrivenReport_e;
+
+
+
+/*-----------------------------------------------------------------------------------------
+ * ORI_AISGLAYER7COMMAND ENUMERATION
+ *-----------------------------------------------------------------------------------------*/
+
+/**
+ * @enum ORI_AisgLayer7Command_e
+ * @brief Aisg Layer7 commands byte code enumeration.
+ */
+typedef enum
+{
+	ORI_AisgLayer7Command_Unknown 					= 0,			/**< */
+	/* Common procedures */
+	ORI_AisgLayer7Command_Reset						= 0x03,			/**< */
+	ORI_AisgLayer7Command_GetAlarmStatus			= 0x04,			/**< */
+	ORI_AisgLayer7Command_GetInfo 					= 0x05,			/**< */
+	ORI_AisgLayer7Command_ClearActiveAlarms			= 0x06,			/**< */
+	ORI_AisgLayer7Command_SelfTest					= 0x0A,			/**< */
+	ORI_AisgLayer7Command_ReadUserData				= 0x10,			/**< */
+	ORI_AisgLayer7Command_WriteUserData				= 0x11,			/**< */
+	ORI_AisgLayer7Command_AlarmSubscribe			= 0x12,			/**< */
+	ORI_AisgLayer7Command_DownloadStart				= 0x40,			/**< */
+	ORI_AisgLayer7Command_DownloadApplication		= 0x41,			/**< */
+	ORI_AisgLayer7Command_DownloadEnd				= 0x42,			/**< */
+	/* Single Antenna RET procedures */
+	ORI_AisgLayer7Command_RetSingle_AlarmIndication	= 0x07,			/**< */
+	ORI_AisgLayer7Command_RetSingle_SetDeviceData	= 0x0E,			/**< */
+	ORI_AisgLayer7Command_RetSingle_GetDeviceData	= 0x0F,			/**< */
+	ORI_AisgLayer7Command_RetSingle_Calibrate 		= 0x31,			/**< */
+	ORI_AisgLayer7Command_RetSingle_SendConfigData	= 0x32,			/**< */
+	ORI_AisgLayer7Command_RetSingle_SetTilt 		= 0x33,			/**< */
+	ORI_AisgLayer7Command_RetSingle_GetTilt 		= 0x34,			/**< */
+	/* Multi Antenna RET procedures */
+	ORI_AisgLayer7Command_RetMulti_Calibrate 		= 0x80,			/**< */
+	ORI_AisgLayer7Command_RetMulti_SetTilt 			= 0x81,			/**< */
+	ORI_AisgLayer7Command_RetMulti_GetTilt 			= 0x82,			/**< */
+	ORI_AisgLayer7Command_RetMulti_SetDeviceData	= 0x83,			/**< */
+	ORI_AisgLayer7Command_RetMulti_GetDeviceData	= 0x84,			/**< */
+	ORI_AisgLayer7Command_RetMulti_AlarmIndication	= 0x85,			/**< */
+	ORI_AisgLayer7Command_RetMulti_ClearActiveAlarms= 0x86,			/**< */
+	ORI_AisgLayer7Command_RetMulti_GetAlarmStatus	= 0x87,			/**< */
+	ORI_AisgLayer7Command_RetMulti_GetNbrAntenna	= 0x88,			/**< */
+	ORI_AisgLayer7Command_RetMulti_SendConfigData	= 0x89,			/**< */
+	/* added specific command to check the existence of the aisg port from the model (this is not a real aisg command!) */
+	ORI_AisgLayer7Command_CheckAisgPortExist		= 0xFE,			/**< */
+	/* added specific command to get the aisg ALD device type from the model (this is not a real aisg command!) */
+	ORI_AisgLayer7Command_GetDeviceType				= 0xFF,			/**< */
+} ORI_AisgLayer7Command_e;
+
+
+/*-----------------------------------------------------------------------------------------
+ * ORI_AISGRETURNCODE ENUMERATION
+ *-----------------------------------------------------------------------------------------*/
+
+/**
+ * @enum ORI_AisgReturnCode_e
+ * @brief Aisg return code enumeration.
+ */
+typedef enum
+{
+	ORI_AisgReturnCode_OK 					= 0,			/**< */
+	ORI_AisgReturnCode_MotorJam				= 0x02,			/**< */
+	ORI_AisgReturnCode_ActuatorJam			= 0x03,			/**< */
+	ORI_AisgReturnCode_Busy 				= 0x05,			/**< */
+	ORI_AisgReturnCode_Checksum 			= 0x06,			/**< */
+	ORI_AisgReturnCode_FAIL 				= 0x0B,			/**< */
+	ORI_AisgReturnCode_NotCalibrated		= 0x0E,			/**< */
+	ORI_AisgReturnCode_NotConfigured		= 0x0F,			/**< */
+	ORI_AisgReturnCode_Hardware				= 0x11,			/**< */
+	ORI_AisgReturnCode_OutOfRange			= 0x13,			/**< */
+	ORI_AisgReturnCode_UnknownProcedure		= 0x19,			/**< */
+	ORI_AisgReturnCode_ReadOnly 			= 0x1D,			/**< */
+	ORI_AisgReturnCode_UnknownParameter		= 0x1E,			/**< */
+	ORI_AisgReturnCode_WorkingSWMissing		= 0x21,			/**< */
+	ORI_AisgReturnCode_InvalidFileContent	= 0x22,			/**< */
+	ORI_AisgReturnCode_FormatError 			= 0x24,			/**< */
+	ORI_AisgReturnCode_UnsupportedProcedure	= 0x25,			/**< */
+	ORI_AisgReturnCode_InvalidProcedureSeq	= 0x26,			/**< */
+	ORI_AisgReturnCode_ActuatorInterference	= 0x27,			/**< */
+	ORI_AisgReturnCode_Unknown,
+} ORI_AisgReturnCode_e;
+
+/**
+ * @brief Get a string describing an ::ORI_AisgReturnCode_e.
+ * @param returnCode The ::ORI_AisgReturnCode_e.
+ * @return The describing string.
+ */
+const char * 					ORI_AisgReturnCode_Print(ORI_AisgReturnCode_e returnCode);
+
+/**
+ * @brief Get an ::ORI_AisgReturnCode_e from a string.
+ * @param returnCodeString The string to match.
+ * @return The matched ::ORI_AisgReturnCode_e, or ::ORI_AisgReturnCode_Unknown if failure.
+ */
+ORI_AisgReturnCode_e 			ORI_AisgReturnCode_Enum(const char * returnCodeString);
+
+
+/*-----------------------------------------------------------------------------------------
+ * ORI_AISGDEVICEDATA ENUMERATION
+ *-----------------------------------------------------------------------------------------*/
+
+/**
+ * @enum ORI_AisgDeviceData_e
+ * @brief Aisg device data fields enumeration.
+ */
+typedef enum
+{
+	ORI_AisgDeviceData_AntennaModelNbr		= 1,			/**< */
+	ORI_AisgDeviceData_AntennaSerialNbr		= 2,			/**< */
+	ORI_AisgDeviceData_AntennaFreqBand		= 3,			/**< */
+	ORI_AisgDeviceData_BeamwidthBand		= 4,			/**< */
+	ORI_AisgDeviceData_GainBand				= 5,			/**< */
+	ORI_AisgDeviceData_MaxTilt				= 6,			/**< */
+	ORI_AisgDeviceData_MinTilt				= 7,			/**< */
+	ORI_AisgDeviceData_InstallationDate		= 0x21,			/**< */
+	ORI_AisgDeviceData_InstallerID			= 0x22,			/**< */
+	ORI_AisgDeviceData_BasestationID		= 0x23,			/**< */
+	ORI_AisgDeviceData_SectorID				= 0x24,			/**< */
+	ORI_AisgDeviceData_AntennaBearing		= 0x25,			/**< */
+	ORI_AisgDeviceData_MechanicalTilt		= 0x26,			/**< */
+	ORI_AisgDeviceData_Unknown,
+} ORI_AisgDeviceData_e;
+
+/**
+ * @brief Get a string describing an ::ORI_AisgDeviceData_e.
+ * @param field The ::ORI_AisgDeviceData_e.
+ * @return The describing string.
+ */
+const char * 					ORI_AisgDeviceDataField_Print(ORI_AisgDeviceData_e field);
+
+/**
+ * @brief Get an ::ORI_AisgDeviceData_e from a string.
+ * @param fieldString The string to match.
+ * @return The matched ::ORI_AisgDeviceData_e, or ::ORI_AisgDeviceData_Unknown if failure.
+ */
+ORI_AisgDeviceData_e 			ORI_AisgDeviceDataField_Enum(const char * fieldString);
+
+
+
+/*-----------------------------------------------------------------------------------------
+ * OBJECT TYPE REFERENCE
+ *-----------------------------------------------------------------------------------------*/
+
+/* Forward declaration of the ORI_Object_s structure. */
+typedef struct ORI_Object_s ORI_Object_s;
+
+/**
+ * @struct ORI_ObjectTypeRef_s
+ * @brief Object type reference structure.
+ *
+ * This structure represents an ORI ObjectTypeRef, which does not fully describe an ORI object
+ * because it is not associated to an instance number.
+ */
+ typedef struct
+{
+	ORI_Object_s *		parent;							/**< Parent object reference, may be NULL if no parent. */
+	ORI_ObjectType_e	type;							/**< Object type. */
+} ORI_ObjectTypeRef_s;
+
+
+
+
+
+/*-----------------------------------------------------------------------------------------
+ * OBJECT PARAMETERS
+ *-----------------------------------------------------------------------------------------*/
+
+/**
+ * @struct ORI_ObjectParams_RE_s
+ * @brief Structure containing the parameters of a RE object.
+ */
+typedef struct
+{
+	char 					vendorID[4];				/**< RO. Vendor ID as signaled in DHCP code 201, normally 3 characters */
+	char 					productID[81];				/**< RO. RE product ID.*/
+	char 					productRev[81];				/**< RO. RE product revision. */
+	char 					serialNumber[41];			/**< RO. RE serial number. */
+	char 					protocolVer[11];			/**< RO. OCP protocol supported. */
+	ORI_agcGranularity_e	agcTargetLevCfgGran;		/**< RO. UL AGC target RMS level config granularity. */
+	ORI_agcGranularity_e 	agcSettlTimeCfgGran;		/**< RO. UL AGC settling time config granularity. */
+	uint16_t				agcSettlTimeCap;			/**< RO. UL AGC settling time capability. */
+	uint32_t				AWS_uptime;					/**< RO. AW2S Vendor specific: Uptime since boot in seconds. */
+	int32_t					AWS_inputVoltage;			/**< RO. AW2S Vendor specific: RE input voltage in mV. */
+	int32_t					AWS_inputCurrent;			/**< RO. AW2S Vendor specific: RE input current in mA. */
+	int16_t					AWS_productTemp;			/**< RO. AW2S Vendor specific: RE temperature in degC. */
+	int16_t					AWS_cpuTemp;				/**< RO. AW2S Vendor specific: CPU temperature in degC. */
+	int16_t					AWS_paTemp;					/**< RO. AW2S Vendor specific: Power amplifier temperature in degC. */
+	int16_t					AWS_rxPwrOffset;			/**< RO. AW2S Vendor specific: Receiver dBFS to dBm power conversion offset, unit is dB/10 (e.g. -340 for -34 dB). */
+} ORI_ObjectParams_RE_s;
+
+/**
+ * @struct ORI_ObjectParams_AntennaPort_s
+ * @brief Structure containing the parameters of an Antenna Port object.
+ */
+typedef struct
+{
+	char 		portLabel[81];							/**< RO. Physical antenna port label.*/
+	int16_t 	AWS_outputPwr;							/**< RO. AW2S Vendor specific: Measured output power for this antenna, unit is dBm/10 (e.g. 400 for 40 dBm). */
+	int16_t 	AWS_inputPwr;							/**< RO. AW2S Vendor specific: Measured input power for this antenna, unit is dBm/10 (e.g. -650 for -65 dBm). */
+	int16_t 	AWS_returnLoss;							/**< RO. AW2S Vendor specific: Measured return loss for this antenna, unit is dB/10 (e.g. 50 for 5 dB). */
+} ORI_ObjectParams_AntennaPort_s;
+
+/**
+ * @struct ORI_ObjectParams_TxSigPathUtra_s
+ * @brief Structure containing the parameters of a TxSigPath UTRAFDD object.
+ */
+typedef struct
+{
+	uint16_t			dlCalREMax;						/**< RO. Max possible buffer in RE for DL timing calibration in Tc/16.*/
+	uint32_t			t2a;							/**< RO. RE time delay. */
+	uint16_t			dlCalRE;						/**< RW-Locked. Time delay to enable DL timing calibration in Tc/16. */
+	int16_t 			maxTxPwr;						/**< RW. Max tx power for this path, unit is dBm/10 (e.g. 400 for 40 dBm). */
+	uint8_t 			axcW;							/**< RW-Locked. AxC W parameter. */
+	uint8_t				axcB;							/**< RW-Locked. AxC B parameter. */
+	ORI_Object_s *		oriLink;						/**< RW-Locked. ORI Link on which the AxC is mapped. */
+	uint32_t			uarfcn;							/**< RW-Locked. Downlink UARFCN. */
+	ORI_Object_s *		antPort;						/**< RW-Locked. Reference Antenna port for this signal. */
+	int16_t 			AWS_measuredPwr;				/**< RO. AW2S Vendor specific: Measured Tx power for this path, unit is dBm/10 (e.g. 400 for 40 dBm). */
+	uint16_t 			AWS_axcIncr;					/**< RW-Locked. AW2S Vendor specific: AxC increment for each sample, 0 means auto (= packed, no interleaving). */
+	ORI_Boolean_e 		AWS_enPeakCancel;				/**< RW-Locked. AW2S Vendor specific: Peak-Cancellation CFR enablement. */
+} ORI_ObjectParams_TxSigPathUtra_s;
+
+/**
+ * @struct ORI_ObjectParams_TxSigPathEUtraFDD_s
+ * @brief Structure containing the parameters of a TxSigPath EUTRAFDD object.
+ */
+typedef struct
+{
+	uint16_t 			chanBW;							/**< RW-Locked. Channel bandwith in MHz/10 (14 / 30 / 50 / 100 / 150 / 200). */
+	uint16_t			dlCalREMax;						/**< RO. Max possible buffer in RE for DL timing calibration in Tc/16.*/
+	uint32_t			t2a;							/**< RO. RE time delay. */
+	uint16_t 			dlCalRE;						/**< RW-Locked. Time delay to enable DL timing calibration in Tc/16. */
+	int16_t 			maxTxPwr;						/**< RW. Max tx power for this path, unit is dBm/10 (e.g. 400 for 40 dBm). */
+	uint8_t 			axcW;							/**< RW-Locked. AxC W parameter. */
+	uint8_t 			axcB;							/**< RW-Locked. AxC B parameter. */
+	ORI_Object_s * 		oriLink;						/**< RW-Locked. ORI Link on which the AxC is mapped. */
+	uint32_t 			earfcn;							/**< RW-Locked. Downlink EARFCN. */
+	ORI_Object_s *		antPort;						/**< RW-Locked. Reference Antenna port for this signal. */
+	ORI_Boolean_e		enableIQDLComp;					/**< RW-Locked. IQ data compression enablement. */
+	uint32_t			sigmaIQ;						/**< RW-Locked. Sigma IQ value for IQ data compression. */
+	ORI_Boolean_e		AWS_enableCompRateChange;		/**< RW-Locked. AW2S Vendor specific: Enable IQ data compression sample rate change. */
+	ORI_Boolean_e		AWS_enableCompBitChange;		/**< RW-Locked. AW2S Vendor specific: Enable IQ data compression bit width change. */
+	int16_t 			AWS_measuredPwr;				/**< RO. AW2S Vendor specific: Measured Tx power for this path, unit is dBm/10 (e.g. 400 for 40 dBm). */
+	uint16_t 			AWS_axcIncr;					/**< RW-Locked. AW2S Vendor specific: AxC increment for each sample, 0 means auto (= packed, no interleaving). */
+	ORI_Boolean_e 		AWS_enPeakCancel;				/**< RW-Locked. AW2S Vendor specific: Peak-Cancellation CFR enablement. */
+} ORI_ObjectParams_TxSigPathEUtraFDD_s;
+
+/**
+ * @struct ORI_ObjectParams_TxSigPathEUtraTDD_s
+ * @brief Structure containing the parameters of a TxSigPath EUTRATDD object.
+ */
+typedef struct
+{
+	uint16_t 			chanBW;							/**< RW-Locked. Channel bandwith in MHz/10 (14 / 30 / 50 / 100 / 150 / 200). */
+	uint8_t				tddULDLConfig;					/**< RW-Locked. TDD UL/DL config. */
+	uint8_t				tddSpecialSFConfig;				/**< RW-Locked. TDD SSF config. */
+	ORI_tddCPLength_e	tddCPLengthDL;					/**< RW-Locked. TDD Cyclic prefix length. */
+	uint16_t 			dlCalREMax;						/**< RO. Max possible buffer in RE for DL timing calibration in Tc/16.*/
+	uint32_t 			t2a;							/**< RO. RE time delay. */
+	uint16_t 			dlCalRE;						/**< RW-Locked. Time delay to enable DL timing calibration in Tc/16. */
+	int16_t 			maxTxPwr;						/**< RW. Max tx power for this path, unit is dBm/10 (e.g. 400 for 40 dBm). */
+	uint8_t 			axcW;							/**< RW-Locked. AxC W parameter. */
+	uint8_t 			axcB;							/**< RW-Locked. AxC B parameter. */
+	ORI_Object_s * 		oriLink;						/**< RW-Locked. ORI Link on which the AxC is mapped. */
+	uint32_t 			earfcn;							/**< RW-Locked. Downlink EARFCN. */
+	ORI_Object_s *		antPort;						/**< RW-Locked. Reference Antenna port for this signal. */
+	ORI_Boolean_e		enableIQDLComp;					/**< RW-Locked. IQ data compression enablement. */
+	uint32_t			sigmaIQ;						/**< RW-Locked. Sigma IQ value for IQ data compression. */
+	ORI_Boolean_e		AWS_enableCompRateChange;		/**< RW-Locked. AW2S Vendor specific: Enable IQ data compression sample rate change. */
+	ORI_Boolean_e		AWS_enableCompBitChange;		/**< RW-Locked. AW2S Vendor specific: Enable IQ data compression bit width change. */
+	int16_t 			AWS_measuredPwr;				/**< RO. AW2S Vendor specific: Measured Tx power for this path, unit is dBm/10 (e.g. 400 for 40 dBm). */
+	uint16_t 			AWS_axcIncr;					/**< RW-Locked. AW2S Vendor specific: AxC increment for each sample, 0 means auto (= packed, no interleaving). */
+	ORI_Boolean_e 		AWS_enPeakCancel;				/**< RW-Locked. AW2S Vendor specific: Peak-Cancellation CFR enablement. */
+} ORI_ObjectParams_TxSigPathEUtraTDD_s;
+
+/**
+ * @struct ORI_ObjectParams_TxSigPathGSM_s
+ * @brief Structure containing the parameters of a TxSigPath GSM object.
+ */
+typedef struct
+{
+	uint16_t 			dlCalREMax;						/**< RO. Max possible buffer in RE for DL timing calibration in Tc/16.*/
+	ORI_freqBand_e 		freqBandInd;					/**< GSM frequency band indicator. */
+	uint32_t 			t2a;							/**< RO. RE time delay. */
+	uint16_t 			dlCalRE;						/**< RW-Locked. Time delay to enable DL timing calibration in Tc/16. */
+	int16_t 			maxTxPwr;						/**< RW. Max tx power for this path, unit is dBm/10 (e.g. 400 for 40 dBm). */
+	uint8_t 			axcW;							/**< RW-Locked. AxC W parameter. */
+	uint8_t 			axcB;							/**< RW-Locked. AxC B parameter. */
+	ORI_Object_s * 		oriLink;						/**< RW-Locked. ORI Link on which the AxC is mapped. */
+	ORI_Object_s *		antPort;						/**< RW-Locked. Reference Antenna port for this signal. */
+	int16_t 			AWS_measuredPwr;				/**< RO. AW2S Vendor specific: Measured Tx power for this path, unit is dBm/10 (e.g. 400 for 40 dBm). */
+	uint16_t 			AWS_axcIncr;					/**< RW-Locked. AW2S Vendor specific: AxC increment for each sample, 0 means auto (= packed, no interleaving). */
+	ORI_Boolean_e 		AWS_enPeakCancel;				/**< RW-Locked. AW2S Vendor specific: Peak-Cancellation CFR enablement. */
+} ORI_ObjectParams_TxSigPathGSM_s;
+
+/**
+ * @struct ORI_ObjectParams_RxSigPathUtra_s
+ * @brief Structure containing the parameters of a RxSigPath UTRAFDD object.
+ */
+typedef struct
+{
+	uint16_t			ulCalREMax;						/**< RO. Max possible buffer in RE for UL timing calibration in Tc/2.*/
+	uint32_t 			ta3;							/**< RO. RE time delay. */
+	uint16_t 			ulCalRE;						/**< RW-Locked. Time delay to enable UL timing calibration in Tc/2. */
+	uint8_t 			axcW;							/**< RW-Locked. AxC W parameter. */
+	uint8_t 			axcB;							/**< RW-Locked. AxC B parameter. */
+	uint8_t 			rtwpGroup;						/**< RW-Locked. Location of the RTWP measurements for this AxC. */
+	ORI_Object_s * 		oriLink;						/**< RW-Locked. ORI Link on which the AxC is mapped. */
+	ORI_Object_s *		antPort;						/**< RW-Locked. Reference Antenna port for this signal. */
+	uint32_t			uarfcn;							/**< RW-Locked. Uplink UARFCN. */
+	int16_t 			ulFeedAdj;						/**< RW. Uplink feeder adjustment in dB/10 (e.g. 200 for 20 dB). */
+	uint8_t				ulTgtRMSLvl;					/**< RW-Locked. Uplink target RMS level. */
+	uint8_t				ulAGCSetlgTime;					/**< RW-Locked. Uplink AGC settling time. */
+	int16_t 			AWS_measuredPwr;				/**< RO. AW2S Vendor specific: Measured Rx power for this path, unit is dBm/10 (e.g. -650 for -65 dBm). */
+	uint16_t 			AWS_axcIncr;					/**< RW-Locked. AW2S Vendor specific: AxC increment for each sample, 0 means auto (= packed, no interleaving). */
+} ORI_ObjectParams_RxSigPathUtra_s;
+
+/**
+ * @struct ORI_ObjectParams_RxSigPathEUtraFDD_s
+ * @brief Structure containing the parameters of a RxSigPath EUTRAFDD object.
+ *
+ */
+typedef struct
+{
+	uint16_t 			chanBW;							/**< RW-Locked. Channel bandwith in MHz/10 (14 / 30 / 50 / 100 / 150 / 200). */
+	uint16_t			ulCalREMax;						/**< RO. Max possible buffer in RE for UL timing calibration in Tc/2.*/
+	uint32_t  			ta3;							/**< RO. RE time delay. */
+	uint16_t 			ulCalRE;						/**< RW-Locked. Time delay to enable UL timing calibration in Tc/2. */
+	uint8_t 			axcW;							/**< RW-Locked. AxC W parameter. */
+	uint8_t 			axcB;							/**< RW-Locked. AxC B parameter. */
+	ORI_Object_s * 		oriLink;						/**< RW-Locked. ORI Link on which the AxC is mapped. */
+	ORI_Object_s *		antPort;						/**< RW-Locked. Reference Antenna port for this signal. */
+	uint32_t 			earfcn;							/**< RW-Locked. Uplink EARFCN. */
+	ORI_Boolean_e		enableIQULComp;					/**< RW-Locked. IQ data compression enablement. */
+	uint32_t			sigmaIQ;						/**< RW-Locked. Sigma IQ value for IQ data compression. */
+	ORI_Boolean_e		AWS_enableCompRateChange;		/**< RW-Locked. AW2S Vendor specific: Enable IQ data compression sample rate change. */
+	ORI_Boolean_e		AWS_enableCompBitChange;		/**< RW-Locked. AW2S Vendor specific: Enable IQ data compression bit width change. */
+	int16_t 			AWS_measuredPwr;				/**< RO. AW2S Vendor specific: Measured Rx power for this path, unit is dBm/10 (e.g. -650 for -65 dBm). */
+	uint16_t 			AWS_axcIncr;					/**< RW-Locked. AW2S Vendor specific: AxC increment for each sample, 0 means auto (= packed, no interleaving). */
+} ORI_ObjectParams_RxSigPathEUtraFDD_s;
+
+/**
+ * @struct ORI_ObjectParams_RxSigPathEUtraTDD_s
+ * @brief Structure containing the parameters of a RxSigPath EUTRATDD object.
+ *
+ */
+typedef struct
+{
+	uint16_t 			chanBW;							/**< RW-Locked. Channel bandwith in MHz/10 (14 / 30 / 50 / 100 / 150 / 200). */
+	uint8_t				tddULDLConfig;					/**< RW-Locked. TDD UL/DL config. */
+	uint8_t				tddSpecialSFConfig;				/**< RW-Locked. TDD SSF config. */
+	ORI_tddCPLength_e	tddCPLengthUL;					/**< RW-Locked. TDD Cyclic prefix length. */
+	uint16_t			ulCalREMax;						/**< RO. Max possible buffer in RE for UL timing calibration in Tc/2.*/
+	uint32_t  			ta3;							/**< RO. RE time delay. */
+	uint16_t 			ulCalRE;						/**< RW-Locked. Time delay to enable UL timing calibration in Tc/2. */
+	uint8_t 			axcW;							/**< RW-Locked. AxC W parameter. */
+	uint8_t 			axcB;							/**< RW-Locked. AxC B parameter. */
+	ORI_Object_s * 		oriLink;						/**< RW-Locked. ORI Link on which the AxC is mapped. */
+	ORI_Object_s *		antPort;						/**< RW-Locked. Reference Antenna port for this signal. */
+	uint32_t 			earfcn;							/**< RW-Locked. Uplink EARFCN. */
+	ORI_Boolean_e		enableIQULComp;					/**< RW-Locked. IQ data compression enablement. */
+	uint32_t			sigmaIQ;						/**< RW-Locked. Sigma IQ value for IQ data compression. */
+	ORI_Boolean_e		AWS_enableCompRateChange;		/**< RW-Locked. AW2S Vendor specific: Enable IQ data compression sample rate change. */
+	ORI_Boolean_e		AWS_enableCompBitChange;		/**< RW-Locked. AW2S Vendor specific: Enable IQ data compression bit width change. */
+	int16_t 			AWS_measuredPwr;				/**< RO. AW2S Vendor specific: Measured Rx power for this path, unit is dBm/10 (e.g. -650 for -65 dBm). */
+	uint16_t 			AWS_axcIncr;					/**< RW-Locked. AW2S Vendor specific: AxC increment for each sample, 0 means auto (= packed, no interleaving). */
+} ORI_ObjectParams_RxSigPathEUtraTDD_s;
+
+/**
+ * @struct ORI_ObjectParams_RxSigPathGSM_s
+ * @brief Structure containing the parameters of a RxSigPath GSM object.
+ */
+typedef struct
+{
+	uint16_t			ulCalREMax;						/**< RO. Max possible buffer in RE for UL timing calibration in Tc/2.*/
+	ORI_freqBand_e 		freqBandInd;					/**< GSM frequency band indicator. */
+	uint32_t  			ta3;							/**< RO. RE time delay. */
+	uint16_t 			ulCalRE;						/**< RW-Locked. Time delay to enable UL timing calibration in Tc/2. */
+	uint8_t 			axcW;							/**< RW-Locked. AxC W parameter. */
+	uint8_t 			axcB;							/**< RW-Locked. AxC B parameter. */
+	ORI_Object_s * 		oriLink;						/**< RW-Locked. ORI Link on which the AxC is mapped. */
+	ORI_Object_s *		antPort;						/**< RW-Locked. Reference Antenna port for this signal. */
+	int16_t 			ulFeedAdj;						/**< RW. Uplink feeder adjustment in dB/10 (e.g. 200 for 20 dB). */
+	ORI_Object_s *		TxSigPath;						/**< RW-Locked. Associated TxSigPath for frequency hopping information. */
+	int16_t 			AWS_measuredPwr;				/**< RO. AW2S Vendor specific: Measured Rx power for this path, unit is dBm/10 (e.g. -650 for -65 dBm). */
+	uint16_t 			AWS_axcIncr;					/**< RW-Locked. AW2S Vendor specific: AxC increment for each sample, 0 means auto (= packed, no interleaving). */
+} ORI_ObjectParams_RxSigPathGSM_s;
+
+/**
+ * @struct ORI_ObjectParams_ORILink_s
+ * @brief Structure containing the parameters of an ORI Link object.
+ */
+typedef struct
+{
+	char 						portLabel[81];			/**< RO. Physical ORI link port label. */
+	ORI_portRoleCapability_e	portRoleCapability;		/**< RO. Port role capability. */
+	ORI_portRole_e 				portRole;				/**< RW-Locked. Port role. */
+	int16_t						bitRateSupport;			/**< RO. Supported line bit rate. */
+	uint8_t 					bitRateRequested;		/**< RW-Locked. Requested line bit rate. 0 for auto-negotitation. */
+	uint8_t 					bitRateOperational;		/**< RO. Current line bit rate. 0 for link down. */
+	uint64_t 					localPortID;			/**< RO. Local end port ID. */
+	uint64_t 					remotePortID;			/**< RO. Remote end port ID. */
+	uint32_t 					toffset;				/**< RO. CPRI time delay component. */
+	ORI_linkType_e				oriLinkType;			/**< RW-Locked. ORI Link type. */
+	uint8_t						AWS_localMAC[6];		/**< R0. AW2S Vendor specific: Local MAC address of the ORI link. */
+	uint8_t						AWS_remoteMAC[6];		/**< RW. AW2S Vendor specific: Remote MAC address of the ORI link. */
+	uint32_t 					AWS_t14;				/**< RO. AW2S Vendor specific: CPRI time delay component. */
+	uint8_t						AWS_remoteIP[4];		/**< RW. AW2S Vendor specific: REC IP for ECPRI Ethernet frame */
+	uint8_t						AWS_localIP[4];			/**< R0. AW2S Vendor specific: RE IP for ECPRI Ethernet frame */
+	uint16_t					AWS_remoteUdpPort;		/**< RW. AW2S Vendor specific: REC Udp Port for ECPRI Ethernet frame */
+	uint16_t					AWS_localUdpPort;		/**< R0. AW2S Vendor specific: RE Udp Port for ECPRI Ethernet frame */
+	uint32_t 					AWS_sfpTxPow;			/**< RO. AW2S Vendor specific: SFP Tx power. */
+	uint32_t 					AWS_sfpRxPow;			/**< RO. AW2S Vendor specific: SFP Rx power. */
+} ORI_ObjectParams_ORILink_s;
+
+/**
+ * @struct ORI_ObjectParams_ExternalEventPort_s
+ * @brief Structure containing the parameters of an External Event Port object.
+ */
+typedef struct
+{
+	char 				portLabel[81];					/**< RO. External event port label. */
+} ORI_ObjectParams_ExternalEventPort_s;
+
+/**
+ * @struct ORI_ObjectParams_AISGPort_s
+ * @brief Structure containing the parameters of an AISG Port object.
+ */
+typedef struct
+{
+	char 						portLabel[81];			/**< RO. AISG port label. */
+	ORI_Boolean_e 				busPowerEnable;			/**< RW-Locked. Bus power enablement. */
+} ORI_ObjectParams_AISGPort_s;
+
+/**
+ * @struct ORI_ObjectParams_AISGALD_s
+ * @brief Structure containing the parameters of an AISG ALD object.
+ */
+typedef struct
+{
+	uint8_t 				deviceType;					/**< RW-Locked. Device type of the ALD. */
+	uint8_t 				UID[20];					/**< RW-Locked. Unique ID array. */
+	uint8_t					releaseID;					/**< RO. 3GPP protocol release. */
+	uint8_t					aisgVersion;				/**< RO. AISG protocol version. */
+	uint8_t					deviceTypeVersion[3];		/**< RO. Device type substance version. */
+	uint16_t				frameLength;				/**< RO. Maximum frame length for AISG Layer 7 message payload. */
+	uint8_t					hdlcAdress;					/**< RO. Actual HLDC address. */
+} ORI_ObjectParams_AISGALD_s;
+
+/**
+ * @struct ORI_ObjectParams_Log_s
+ * @brief Structure containing the parameters of a Log object.
+ */
+typedef struct
+{
+	char 						logTypeID[41];			/**< RO. Log type identifier. */
+	char 						description[81];		/**< RO. Log description. */
+	ORI_logCategory_e			logCategory;			/**< RO. Log category. */
+	uint32_t 					maxREfileSize;			/**< RO. Max RE file size in kB. */
+	uint32_t 					maxRECfileSize;			/**< RW. Max REC file size in kB. */
+	ORI_Boolean_e 				enableNotification;		/**< RW. Enable REC notification on file transfer availability. */
+	ORI_Boolean_e 				fileAvailable;			/**< RO. File is available. */
+	ORI_overflowBehaviour_e		overflowBehaviour;		/**< RW. Behaviour on overflow. */
+	ORI_Boolean_e				recordingEnabled;		/**< RW. Recording enablement. */
+	uint64_t					logPeriod;				/**< RW. Log expiration period in seconds. */
+	ORI_timerType_e				timerType;				/**< RW. Log expiration behaviour. */
+} ORI_ObjectParams_Log_s;
+
+/**
+ * @struct ORI_ObjectParams_DLRoutedIQData_s
+ * @brief Structure containing the parameters of a DL Routed IQ Data object.
+ */
+typedef struct
+{
+	uint16_t 			IQsubBlockSize;					/**< RW-Locked. Number of bits contained in the IQ data sub-block. */
+	ORI_Object_s *		MasterPortOriLink;				/**< RW-Locked. Reference to the master port ORI Link. */
+	uint8_t 			MasterPortIQblkW;				/**< RW-Locked. Sub-block start W parameter for master port. */
+	uint16_t 			MasterPortIQblkB;				/**< RW-Locked. Sub-block start B parameter for master port. */
+	ORI_Object_s *		SlavePortOriLink;				/**< RW-Locked. Reference to the slave port ORI Link. */
+	uint8_t				SlavePortIQW;					/**< RW-Locked. Sub-block start W parameter for slave port. */
+	uint16_t			SlavePortIQB;					/**< RW-Locked. Sub-block start B parameter for slave port. */
+	uint16_t			TBDelayDL;						/**< RO. Internal RE delay from slave port to master port. */
+} ORI_ObjectParams_DLRoutedIQData_s;
+
+/**
+ * @struct ORI_ObjectParams_ULRoutedIQData_s
+ * @brief Structure containing the parameters of a UL Routed IQ Data object.
+ */
+typedef struct
+{
+	uint16_t 			IQsubBlockSize;					/**< RW-Locked. Number of bits contained in the IQ data sub-block. */
+	ORI_Object_s *		MasterPortOriLink;				/**< RW-Locked. Reference to the master port ORI Link. */
+	uint8_t				MasterPortIQblkW;				/**< RW-Locked. Sub-block start W parameter for master port. */
+	uint16_t 			MasterPortIQblkB;				/**< RW-Locked. Sub-block start B parameter for master port. */
+	ORI_Object_s *		SlavePortOriLink;				/**< RW-Locked. Reference to the slave port ORI Link. */
+	uint8_t				SlavePortIQW;					/**< RW-Locked. Sub-block start W parameter for slave port. */
+	uint16_t			SlavePortIQB;					/**< RW-Locked. Sub-block start B parameter for slave port. */
+	uint16_t			TBDelayUL;						/**< RO. Internal RE delay from master port to slave port. */
+} ORI_ObjectParams_ULRoutedIQData_s;
+
+/**
+ * @struct ORI_ObjectParams_DLRoutedCWBlock_s
+ * @brief Structure containing the parameters of a DL Routed CW Block object.
+ */
+typedef struct
+{
+	uint8_t				CtrlBlockSize;					/**< RW-Locked. Number of consecutive sub-channels in the CW block. */
+	uint8_t				SubChannelStart;				/**< RW-Locked. Lowest sub-channel of the CW block. */
+	uint8_t				Ydepth;							/**< RW-Locked. Number of consecutive Y locations of the sub-channels in the CW block. */
+	uint8_t				SlavePortYoffset;				/**< RW-Locked. Lowest Y location of the sub-channel(s) at the slave port. */
+	uint8_t				MasterPortYoffset;				/**< RW-Locked. Lowest Y location of the sub-channel(s) at the master port. */
+	ORI_Object_s *		SlavePortOriLink;				/**< RW-Locked. Reference to the slave port ORI Link. */
+	ORI_Object_s *		MasterPortOriLink;				/**< RW-Locked. Reference to the master port ORI Link. */
+} ORI_ObjectParams_DLRoutedCWBlock_s;
+
+/**
+ * @struct ORI_ObjectParams_ULRoutedCWBlock_s
+ * @brief Structure containing the parameters of a UL Routed CW Block object.
+ */
+typedef struct
+{
+	uint8_t				CtrlBlockSize;					/**< RW-Locked. Number of consecutive sub-channels in the CW block. */
+	uint8_t				SubChannelStart;				/**< RW-Locked. Lowest sub-channel of the CW block. */
+	uint8_t				Ydepth;							/**< RW-Locked. Number of consecutive Y locations of the sub-channels in the CW block. */
+	uint8_t				SlavePortYoffset;				/**< RW-Locked. Lowest Y location of the sub-channel(s) at the slave port. */
+	uint8_t				MasterPortYoffset;				/**< RW-Locked. Lowest Y location of the sub-channel(s) at the master port. */
+	ORI_Object_s *		SlavePortOriLink;				/**< RW-Locked. Reference to the slave port ORI Link. */
+	ORI_Object_s *		MasterPortOriLink;				/**< RW-Locked. Reference to the master port ORI Link. */
+} ORI_ObjectParams_ULRoutedCWBlock_s;
+
+/**
+ * @union ORI_ObjectParams_u
+ * @brief Union of all the parameters of the ORI objects. Access each field based on the object type.
+ */
+typedef union
+{
+	ORI_ObjectParams_RE_s						RE;						/**< Parameters for ::ORI_ObjectType_RE. */
+	ORI_ObjectParams_AntennaPort_s				AntPort;				/**< Parameters for ::ORI_ObjectType_AntennaPort. */
+	ORI_ObjectParams_TxSigPathUtra_s	  		TxUtra;					/**< Parameters for ::ORI_ObjectType_TxUtra. */
+	ORI_ObjectParams_TxSigPathEUtraFDD_s		TxEUtraFDD;				/**< Parameters for ::ORI_ObjectType_TxEUtraFDD. */
+	ORI_ObjectParams_TxSigPathEUtraTDD_s		TxEUtraTDD;				/**< Parameters for ::ORI_ObjectType_TxEUtraTDD. */
+	ORI_ObjectParams_TxSigPathGSM_s				TxGSM;					/**< Parameters for ::ORI_ObjectType_TxGSM. */
+	ORI_ObjectParams_RxSigPathUtra_s	  		RxUtra;					/**< Parameters for ::ORI_ObjectType_RxUtra. */
+	ORI_ObjectParams_RxSigPathEUtraFDD_s		RxEUtraFDD;				/**< Parameters for ::ORI_ObjectType_RxEUtraFDD. */
+	ORI_ObjectParams_RxSigPathEUtraTDD_s		RxEUtraTDD;				/**< Parameters for ::ORI_ObjectType_RxEUtraTDD. */
+	ORI_ObjectParams_RxSigPathGSM_s				RxGSM;					/**< Parameters for ::ORI_ObjectType_RxGSM. */
+	ORI_ObjectParams_ORILink_s					ORILink;				/**< Parameters for ::ORI_ObjectType_ORILink. */
+	ORI_ObjectParams_ExternalEventPort_s		ExternalEventPort;		/**< Parameters for ::ORI_ObjectType_ExternalEventPort. */
+	ORI_ObjectParams_AISGPort_s					AISGPort;				/**< Parameters for ::ORI_ObjectType_AISGPort. */
+	ORI_ObjectParams_AISGALD_s					AISGALD;				/**< Parameters for ::ORI_ObjectType_AISGALD. */
+	ORI_ObjectParams_Log_s						Log;					/**< Parameters for ::ORI_ObjectType_Log. */
+	ORI_ObjectParams_DLRoutedIQData_s			DLRoutedIQData;			/**< Parameters for ::ORI_ObjectType_DLRoutedIQData. */
+	ORI_ObjectParams_ULRoutedIQData_s			ULRoutedIQData;			/**< Parameters for ::ORI_ObjectType_ULRoutedIQData. */
+	ORI_ObjectParams_DLRoutedCWBlock_s			DLRoutedCWBlock;		/**< Parameters for ::ORI_ObjectType_DLRoutedCWBlock. */
+	ORI_ObjectParams_ULRoutedCWBlock_s			ULRoutedCWBlock;		/**< Parameters for ::ORI_ObjectType_ULRoutedCWBlock. */
+} ORI_ObjectParams_u;
+
+
+
+/*-----------------------------------------------------------------------------------------
+ * OBJECT FAULTS
+ *-----------------------------------------------------------------------------------------*/
+
+#define FAULT_MAX_AFFECTED_OBJ		20
+
+/**
+ * @struct ORI_Fault_s
+ * @brief Structure detailing a fault, its state, severity, description and affected objects.
+ */
+typedef struct
+{
+	ORI_FaultState_e		state;										/**< Current state of the fault. */
+	ORI_FaultSeverity_e		severity;									/**< Severity of the fault. */
+	char 					timestamp[256];								/**< Time stamp string of the fault (RE time reference). */
+	char					desc[256];									/**< Short text description associated to the fault. */
+	uint32_t				numAffectedObjects;							/**< Number of additional objects affected by the fault. */
+	ORI_Object_s *			affectedObjects[FAULT_MAX_AFFECTED_OBJ];	/**< List of additional objects affected by the fault. */
+} ORI_Fault_s;
+
+/**
+ * @struct ORI_ObjectFaults_RE_s
+ * @brief Structure containing the faults of a RE object.
+ */
+typedef struct
+{
+	ORI_Fault_s			extSuplyUndervolt;				/**< Power supply under voltage. FaultType is ::ORI_FaultType_RE_ExtSupplyUnderVolt */
+	ORI_Fault_s			overTemp;						/**< Over temperature. FaultType is ::ORI_FaultType_RE_OverTemp */
+	ORI_Fault_s			digInOverdrive;					/**< Input digital signal level overdrive. FaultType is ::ORI_FaultType_RE_DigInOverdrive */
+	ORI_Fault_s			rfOutOverdrive;					/**< RF output power overdrive. FaultType is ::ORI_FaultType_RE_RFOutOverdrive */
+	ORI_Fault_s			txGainFail;						/**< Tx gain control failure. FaultType is ::ORI_FaultType_RE_TXGainFail */
+	ORI_Fault_s			rxGainFail;						/**< Rx gain control failure. FaultType is ::ORI_FaultType_RE_RXGainFail */
+} ORI_ObjectFaults_RE_s;
+
+/**
+ * @struct ORI_ObjectFaults_AntennaPort_s
+ * @brief Structure containing the faults of an Antenna Port object.
+ */
+typedef struct
+{
+	ORI_Fault_s			vswrOutOfRange;					/**< VSWR at the antenna port exceeded limit. FaultType is ::ORI_FaultType_AntennaPort_VSWROutOfRange */
+	ORI_Fault_s			nonAisgTmaMalfct;				/**< Non AISG TMA malfunction. FaultType is ::ORI_FaultType_AntennaPort_NonAisgTmaMalfct */
+} ORI_ObjectFaults_AntennaPort_s;
+
+/**
+ * @struct ORI_ObjectFaults_ORILink_s
+ * @brief Structure containing the faults of an ORI Link object.
+ */
+typedef struct
+{
+	ORI_Fault_s			linkFailure;					/**< LOS, LOF, SDI or RAI received on the ORI Link. FaultType is ::ORI_FaultType_ORILink_LinkFail */
+	ORI_Fault_s			portFailure;					/**< Local ORI slave port failure. FaultType is ::ORI_FaultType_ORILink_PortFail */
+	ORI_Fault_s			syncFailure;					/**< Synchronization lost on slave port. FaultType is ::ORI_FaultType_ORILink_SyncFail */
+} ORI_ObjectFaults_ORILink_s;
+
+/**
+ * @struct ORI_ObjectFaults_AISGPort_s
+ * @brief Structure containing the faults of an AISG Port object.
+ */
+typedef struct
+{
+	ORI_Fault_s			aisgMalfct;						/**< Hardware malfunction on AISG port. FaultType is ::ORI_FaultType_AISGPort_AisgMalfct */
+} ORI_ObjectFaults_AISGPort_s;
+
+/**
+ * @union ORI_ObjectFaults_u
+ * @brief Union of all the faults of the ORI objects. Access each field based on the object type.
+ */
+typedef union
+{
+	ORI_ObjectFaults_RE_s						RE;						/**< Faults for ::ORI_ObjectType_RE. */
+	ORI_ObjectFaults_AntennaPort_s				AntPort;				/**< Faults for ::ORI_ObjectType_AntennaPort. */
+	ORI_ObjectFaults_ORILink_s					ORILink;				/**< Faults for ::ORI_ObjectType_ORILink. */
+	ORI_ObjectFaults_AISGPort_s					AISGPort;				/**< Faults for ::ORI_ObjectType_AISGPort. */
+} ORI_ObjectFaults_u;
+
+
+
+/*-----------------------------------------------------------------------------------------
+ * INDICATION DATA STRUCTURES
+ *-----------------------------------------------------------------------------------------*/
+
+/**
+ * @struct ORI_Ind_TransferFileCmplt_s
+ * @brief ORI file transfer complete indication structure.
+ *
+ * This structure is passed on a file transfer complete indication and gives the result
+ * of a file transfer completion.
+ */
+typedef struct
+{
+	ORI_Result_e 			result;						/**< Result of the file transfer. */
+	char 					failInfo[256];				/**< String indicating the file transfer failure reason, if applicable. */
+} ORI_Ind_TransferFileCmplt_s;
+
+/**
+ * @struct ORI_Ind_ObjectStateChange_s
+ * @brief ORI object state change indication structure.
+ *
+ * This structure is passed on an object state change indication and gives the affected object and the type of the
+ * state that changed. <br>
+ * The new state value is updated in the model and can be accessed directly in the object.
+ */
+typedef struct
+{
+	ORI_Object_s *			object;						/**< Object for which the state changed. */
+	ORI_StateType_e			stateType;					/**< Type of the state that changed. */
+} ORI_Ind_ObjectStateChange_s;
+
+/**
+ * @struct ORI_Ind_FaultChange_s
+ * @brief ORI fault change indication structure.
+ *
+ * This structure is passed on a fault change indication (activated or cleared) and gives the primary affected object, the fault type and the actual fault structure. <br>
+ * The new fault structure is updated in the model and can be accessed directly in the object based on the fault type.
+ */
+typedef struct
+{
+	ORI_Object_s *			object;						/**< Primary object affected by the fault. */
+	ORI_FaultType_e			faultType;					/**< Type of the fault that changed. */
+	ORI_Fault_s *			fault;						/**< Reference to the object's fault structure for the given fault type. */
+} ORI_Ind_FaultChange_s;
+
+/**
+ * @struct ORI_Ind_FileAvailable_s
+ * @brief ORI File Available indication structure.
+ *
+ * This structure is passed on a file available indication and gives the object concerned by the file available.
+ */
+typedef struct
+{
+	ORI_Object_s *			object;						/**< Object concerned by file availability. Valid objects : Log:X. */
+} ORI_Ind_FileAvailable_s;
+
+/**
+ * @struct ORI_Ind_UploadFileCmpl_s
+ * @brief ORI Upload File Complete indication structure.
+ *
+ * This structure is passed on an upload file complete indication and gives the result and the object concerned by the file upload.
+ */
+typedef struct
+{
+	ORI_Result_e			result;						/**< Result of the file transfer. */
+	ORI_Object_s *			object;						/**< Object concerned by the file upload. Valid objects : RE:0 or Log:X. */
+	char 					failInfo[256];				/**< String indicating the file transfer failure reason, if applicable. */
+} ORI_Ind_UploadFileCmpl_s;
+
+/**
+ * @struct ORI_Ind_DeviceScanCmpl_s
+ * @brief ORI AISG Device Scan Complete indication structure.
+ *
+ * This structure is passed on an aisg device scan complete indication and gives the result and the object concerned by the device scan.
+ */
+typedef struct
+{
+	ORI_Object_s *			object;						/**< Object concerned by the device scan. Valid objects : aisgPort:X. */
+	int 					numAlds;					/**< integer indicating the number of ALDs found by the device scan. */
+} ORI_Ind_DeviceScanCmpl_s;
+
+/**
+ * @struct ORI_Ind_L7respGetAlarm_s
+ * @brief ORI AISG Transmit L7 message indication with command Get Alarm Status.
+ *
+ * This structure is passed on an aisg ALD receive indication and gives layer 7 message Get Alarm Status fields.
+ */
+typedef struct
+{
+	unsigned char			returnCode[16];	// returnCode, until 16 values supported
+}ORI_Ind_L7respGetAlarm_s;
+
+/**
+ * @struct ORI_Ind_L7respGetInfo_s
+ * @brief ORI AISG Transmit L7 message indication with command Get Info.
+ *
+ * This structure is passed on an aisg ALD receive indication and gives layer 7 message Get Info fields.
+ */
+typedef struct
+{
+	int 					PNlen;		// Product Number's length
+	char 					PN[64];		// Product Number
+	int 					SNlen;		// Serial Number's length
+	char					SN[64];		// Serial Number
+	int						HWverLen;	// Hardware Version's length
+	char					HWver[64];	// Hardware Version
+	int						SWverLen;	// Software Version's length
+	char					SWver[64];	// Software Version
+}ORI_Ind_L7respGetInfo_s;
+
+typedef struct
+{
+	unsigned char			data[80];
+}ORI_Ind_L7respReadUserData_s;
+
+/**
+* @struct ORI_Ind_L7respGetAlarm_s
+* @brief ORI AISG Transmit L7 message indication with command Get Alarm Status.
+*
+* This structure is passed on an aisg ALD receive indication and gives layer 7 message Get Alarm Status fields.
+*/
+typedef struct
+{
+	unsigned char			alarmCode[16];	// alarmCode, until 16 values supported
+}ORI_Ind_L7respSelfTest_s;
+
+
+/**
+ * @struct ORI_Ind_L7respGetTilt_s
+ * @brief ORI AISG Transmit L7 message indication with command Get Tilt.
+ *
+ * This structure is passed on an aisg ALD receive indication and gives layer 7 message Get Tilt fields.
+ */
+typedef struct
+{
+	int 					Tilt;		// tilt value
+}ORI_Ind_L7respGetTilt_s;
+
+/**
+ * @struct ORI_Ind_L7respGetDeviceData_s
+ * @brief ORI AISG Transmit L7 message indication with command Get Device Data.
+ *
+ * This structure is passed on an aisg ALD receive indication and gives layer 7 message Get Device Data fields.
+ */
+typedef struct
+{
+	unsigned char			fieldNbr;
+	char 					antModelNbr[32];		// Antenna Model Number
+	char 					antSerialNbr[32];		// Antenna Serial Number
+	unsigned short			antFreqBand;			// Antenna Frequency Band
+	unsigned short			beamwidthBand[4];		// Beamwidth for each Band
+	unsigned char			gainBand[4];			// Gain for each Band
+	short					maxTilt;				// Maximum Supported Tilt
+	short					minTilt;				// Minimum Supported Tilt
+	char 					installationDate[32];	// Installation Date
+	char 					installerID[32];		// Installer ID
+	char 					basestationID[32];		// BaseStation ID
+	char 					sectorID[32];			// sector ID
+	unsigned short			antBearing;				// Antenna Bearing
+	short					mechanicalTilt;			// Mechanical Tilt
+}ORI_Ind_L7respGetDeviceData_s;
+
+/**
+ * @struct ORI_Ind_L7indAlarmIndication_s
+ * @brief ORI AISG Transmit L7 message indication with alarm indication.
+ *
+ * This structure is passed on an aisg ALD receive indication and gives layer 7 message Alarm Indication Data fields.
+ */
+typedef struct
+{
+	unsigned char			returnCode;
+	unsigned char			stateFlag;
+}ret_alarm_s;
+typedef struct
+{
+	ret_alarm_s				alarm[32];
+}ORI_Ind_L7indAlarmIndication_s;
+
+/**
+ * @struct ORI_Ind_L7respAntGetNbr_s
+ * @brief ORI AISG Transmit L7 message indication with command Antenna Get Number Of Antennas.
+ *
+ * This structure is passed on an aisg ALD receive indication and gives layer 7 message Antenna Get Number Of Antennas Data fields.
+ */
+typedef struct
+{
+	unsigned char			nbr;
+}ORI_Ind_L7respAntGetNbr_s;
+
+/**
+ * @struct ORI_Ind_respGetParam_s
+ * @brief ORI AISG getParam message indication .
+ *
+ * This structure is passed on a getParam command to obtain the ALD's deviceType.
+ */
+typedef struct
+{
+	unsigned char 			deviceType;
+}ORI_Ind_respGetParam_s;
+
+/**
+ * @struct ORI_Ind_respCheckPortExist_s
+ * @brief ORI AISG check AISG Port existence .
+ *
+ * This structure is passed on a check aisg port exist command to know if there is an aisg port in this product or not.
+ */
+typedef struct
+{
+	ORI_Boolean_e			exist;
+}ORI_Ind_respCheckPortExist_s;
+
+/**
+ * @struct ORI_Ind_L7msg_s
+ * @brief ORI AISG Transmit L7 message indication struct.
+ *
+ * This struct is passed on an aisg ALD receive indication and gives a layer 7 message.
+ */
+typedef struct
+{
+	char							raw[256];
+	ORI_AisgLayer7Command_e			command;
+	ORI_AisgReturnCode_e			returnCode;
+	unsigned char					multiAntennaNbr;
+	ORI_Ind_L7respGetAlarm_s		getAlarm;
+	ORI_Ind_L7respGetInfo_s			getInfo;
+	ORI_Ind_L7respReadUserData_s	readUserData;
+	ORI_Ind_L7respSelfTest_s		selfTest;
+	ORI_Ind_L7respGetTilt_s			getTilt;
+	ORI_Ind_L7respGetDeviceData_s	getDeviceData;
+	ORI_Ind_L7indAlarmIndication_s	alarmIndication;
+	ORI_Ind_L7respAntGetNbr_s		getNbrAntennas;
+	ORI_Ind_respGetParam_s			getParam;
+	ORI_Ind_respCheckPortExist_s	checkAisgPortExist;
+}ORI_Ind_L7msg_s;
+
+/**
+ * @struct ORI_Ind_AisgALDRx_s
+ * @brief ORI AISG ALD receive indication structure.
+ *
+ * This structure is passed on an aisg ALD receive indication and gives a layer 7 message and the object concerned.
+ */
+typedef struct
+{
+	ORI_Object_s *			object;						/**< Object concerned by the device scan. Valid objects : aisgPort:X/aisgALD:Y. */
+	ORI_Ind_L7msg_s			L7message;					/**< string of a layer7 message sent by the ALD. */
+} ORI_Ind_AisgALDRx_s;
+
+/**
+ * @union ORI_IndicationValue_u
+ * @brief ORI indication value union.
+ *
+ * This union can be accessed based on the indication type. Its members give details on the received indication.
+ */
+typedef union
+{
+	ORI_Ind_TransferFileCmplt_s transferFileCmplt;		/**< File transfer complete structure, access it on an ::ORI_IndicationType_FileTransferComplete. */
+	ORI_Ind_ObjectStateChange_s	objectStateChange;		/**< Object state change structure, access it on an ::ORI_IndicationType_ObjectStateChange. */
+	ORI_Ind_FaultChange_s		faultChange;			/**< Fault change structure, access it on an ::ORI_IndicationType_FaultChange. */
+	ORI_Ind_FileAvailable_s		fileAvailable;			/**< File available structure, access it on an ::ORI_IndicationType_FileAvailable. */
+	ORI_Ind_UploadFileCmpl_s	uploadFileCmpl;			/**< Upload file complete structure, access it on an ::ORI_IndicationType_UploadFileCmpl. */
+	ORI_Ind_DeviceScanCmpl_s	deviceScanCmpl;			/**< AISG device scan complete structure, access it on an ::ORI_IndicationType_AisgScanDeviceCompl. */
+	ORI_Ind_AisgALDRx_s			aisgALDRx;				/**< AISG ALD receive structure, access it on an ::ORI_IndicationType_AisgAldRx. */
+} ORI_IndicationValue_u;
+
+/**
+ * @typedef ORI_IndCallback_f
+ * @brief ORI indication callback function prototype.
+ *
+ * This is the prototype of the user callback function that is called when an indication has been received on the ORI Link. <br>
+ * The indication callback passes in its arguments the @p type describing the type of the indication, such as file transfer completion, RE fault, etc. <br>
+ * The @p value parameter shall be used to obtain more details on the indication.
+ *
+ * @param userData The user data that is from the ORI context structure.
+ * @param type An ::ORI_IndicationType_e.
+ * @param value An ::ORI_IndicationValue_u.
+ * @return Void.
+ *
+ * @warning The indication callback is called in a separate thread.
+ * @warning The state of the model is guaranteed to stay constant during the indication callback.
+ * @warning ORI functions (except for ORI MODEL functions) must not be called during the indication callback.
+ */
+typedef void (ORI_IndCallback_f) (void * userData, ORI_IndicationType_e type, ORI_IndicationValue_u value);
+
+
+
+
+
+/*-----------------------------------------------------------------------------------------
+ * RE VERSION STRUCTURE
+ *-----------------------------------------------------------------------------------------*/
+
+/**
+ * @struct ORI_REVersion_s
+ * @brief ORI RE version query information structure.
+ *
+ * This structure contains the RE vendor specific version information obtained during a ORI_VersionQuery() procedure.
+ */
+typedef struct
+{
+	char 		vendorID[64];							/**< Vendor ID as signaled in DHCP code 201, normally 3 characters */
+	char 		productID[64];							/**< */
+	char 		productRev[64];							/**< */
+	char 		serialNumber[64];						/**< */
+	char 		hardwareVer[64];						/**< */
+	char 		activeSwUpgradePkgVer[64];				/**< */
+	char 		activeSwImgVer[64];						/**< */
+	char 		passiveSwUpgradePkgVer[64];				/**< */
+	char 		passiveSwImgVer[64];					/**< */
+} ORI_REVersion_s;
+
+
+
+
+/*-----------------------------------------------------------------------------------------
+ * ORI OBJECT STRUCTURE
+ *-----------------------------------------------------------------------------------------*/
+
+/**
+ * @struct ORI_Object_s
+ * @brief Structure of an ORI Object.
+ *
+ * ORI Objects are internally created by the ORI library and represent an object present in the RE. <br>
+ * Those objects represent and define the resource model of the RE, of which an image is present in the REC (via this library). <br>
+ * Such objects can be accessed (for reading and navigating) by the user but must not be modified, created or deleted directly
+ * as they are an 'image' of the RE objects. <br>
+ * To update the parameters of the object, see ORI_ObjectParamReport(). <br>
+ * To modify the parameters of the object, see ORI_ObjectParamModify(). <br>
+ * To create an object, see ORI_ObjectCreation(). <br>
+ * To delete an object, see ORI_ObjectDeletion(). <br>
+ * To update the state of the object, see ORI_ObjectStateReport(). <br>
+ * To modify the state of the object, see ORI_ObjectStateModify(). <br>
+ * To update the faults of the object, see ORI_ObjectFaultReport(). <br>
+ * To find an object in the model, see ORI_FindObject(). <br>
+ * To retrieve a specific fault of an object, see ORI_ObjectFault().
+ */
+struct ORI_Object_s
+{
+	ORI_ObjectTypeRef_s	typeRef;					/**< Type reference of the object. */
+	uint8_t				instanceNumber;				/**< Instance number of the object. */
+	ORI_Object_s *		prev;						/**< Previous sibling. */
+	ORI_Object_s *		next;						/**< Next sibling. */
+	ORI_Object_s *		children;					/**< First child reference. */
+	ORI_ObjectParams_u	params;						/**< Parameters union of this object. */
+	ORI_AST_e			ast;						/**< Administrative state. */
+	ORI_FST_e			fst;						/**< Functional state. */
+	ORI_ObjectFaults_u	faults;						/**< Faults union of this object. */
+};
+
+
+
+
+
+/*-----------------------------------------------------------------------------------------
+ * CONTEXT
+ *-----------------------------------------------------------------------------------------*/
+
+/**
+ * @struct ORI_Version_s
+ * @brief ORI version structure.
+ *
+ * This structure contains ORI library version information.
+ */
+typedef struct
+{
+	uint8_t					major;					/**< Version major number. */
+	uint8_t					minor;					/**< Version minor number. */
+} ORI_Version_s;
+
+/**
+ * @struct ORI_s
+ * @brief ORI context data structure.
+ *
+ * This structure represents the context data for the ORI C library and shall be passed in ORI function calls. <br>
+ * The @p opaque field is a library specific field and must not be modified by the user application. <br>
+ * Other fields may be set (and changed) at run-time by the user application.
+ *
+ * @warning The indication callback is called in a separate thread.
+ * @warning The state of the model is guaranteed to stay constant during the indication callback.
+ * @warning ORI functions (except for ORI MODEL functions) must not be called during the indication callback.
+ */
+typedef struct
+{
+	void * 					opaque; 				/**< Set by the library, DO NOT MODIFY. */
+	ORI_IndCallback_f *		indicationCallback;		/**< Pointer to user set ORI indication callback, this function is called when an indication is received on the ORI Link. If @c NULL (default), indications are discarded. */
+	void *					userData;				/**< User data for passing into the ORI indication callback */
+} ORI_s;
+
+
+
+/*-----------------------------------------------------------------------------------------
+ * ORI CREATION / DELETION / (DIS)CONNECTION
+ *-----------------------------------------------------------------------------------------*/
+
+/**
+ * @brief Retrieve ORI library version structure.
+ *
+ * This functions returns the ORI library version structure (constant).
+ *
+ * @return Version structure.
+ */
+ORI_Version_s ORI_LibVersion(void);
+
+/**
+ * @brief Create an ORI context.
+ *
+ * This function creates and initializes an ORI context structure that is to be used when calling
+ * other ORI library functions. This function also starts threads for data receiving and callbacks handling.
+ *
+ * @return The ORI context if creation successful, else @c NULL.
+ *
+ * @warning The returned ORI context must be free'd with a call to ORI_Free() when the user application is done with ORI.
+ */
+ORI_s *	ORI_Create(void);
+
+/**
+ * @brief Delete an ORI context.
+ *
+ * This function disconnects from the remote host (if connected), destroys the ORI threads and releases all associated ORI resources.
+ *
+ * @param ori The ORI context to delete.
+ * @return Void.
+ */
+void ORI_Free(ORI_s * ori);
+
+/**
+ * @brief Enable ORI debug outputs.
+ *
+ * This function enables the ORI debug prints to stdout.
+ *
+ * @param ori The ORI context.
+ * @return Void.
+ */
+void ORI_EnableDebug(ORI_s * ori);
+
+/**
+ * @brief Disable ORI debug outputs.
+ *
+ * This function disables the ORI debug prints to stdout.
+ *
+ * @param ori The ORI context.
+ * @return Void.
+ */
+void ORI_DisableDebug(ORI_s * ori);
+
+/**
+ * @brief Connect to an ORI remote host (RE).
+ *
+ * This functions tries to connect the ORI context to a RE for C&M. The IP address @p serverIP of the RE and the network port @p port
+ * indicates with which host form the TCP link. The @p timeout_ms specifies the timeout (in milliseconds) of the connection attempt. <br>
+ * Once connected, callbacks from the ORI context may be called at any time, and the TCP Link monitoring timer shall be started on both RE and REC side. <br>
+ * The REC side TCP link monitoring timer is integrated in the ORI library and is managed by the ORI_HealthCheck() function.
+ *
+ * @param ori The ORI context.
+ * @param serverIP The IP address of the RE in string format (e.g. "192.168.100.1").
+ * @param port The port to use for TCP connection.
+ * @param timeout_ms The timeout in milliseconds of the connection attempt.
+ * @param retry_timer_s Request retry timer in seconds when no response has been received from RE, until TCP link times-out, 0 means no retries will happen.
+ * @return The result of the connection, ::ORI_Result_SUCCESS is returned if the connection is established.
+ */
+ORI_Result_e ORI_Connect(ORI_s * ori, const char * serverIP, int port, unsigned int timeout_ms, uint16_t retry_timer_s);
+
+/**
+ * @brief Disconnect from an ORI remote host (RE).
+ *
+ * This function disconnects the ORI context from the RE. This function does nothing if not currently connected. <br>
+ * At disconnection, all buffered ORI response and indication messages are discarded, if any are still waiting to be processed.
+ *
+ * @param ori The ORI context.
+ * @return Void.
+ */
+void ORI_Disconnect(ORI_s * ori);
+
+/**
+ * @brief Retrieve which Ethernet interface is used by the ORI TCP link.
+ *
+ * Returns the name of the currently (or last before disconnection) Ethernet interface used by the ORI TCP Link.
+ *
+ * @param ori The ORI context.
+ * @return Name of the Ethernet interface (e.g. "eth2").
+ */
+const char * ORI_InterfaceName(ORI_s * ori);
+
+
+/*-----------------------------------------------------------------------------------------
+ * DEVICE MANAGEMENT
+ *-----------------------------------------------------------------------------------------*/
+
+/**
+ * @brief Perform a RE Health Check procedure.
+ *
+ * This function performs the Health Check procedure with the RE to verify that the OCP layer is functioning correctly. <br>
+ * A successful health check will update and re-start the TCP link timeout using the new @p tcpLinkMonTimeout parameter
+ * of the RE and the ORI library (REC side). <br>
+ * It is the application's responsibility to re-call this function within the specified Health Check Idle Timer which should
+ * be at least 5 seconds lower than the timeout value of @p tcpLinkMonTimeout.
+ *
+ * @param ori The ORI context.
+ * @param tcpLinkMonTimeout The new TCP Link Monitoring timeout value in seconds to store in the RE. Minimum value: 30 except special value 0 which means no timeout.
+ * @param RE_result The RE response result of the procedure.
+ * @return The result of the procedure.
+ */
+ORI_Result_e ORI_HealthCheck(ORI_s * ori, uint16_t tcpLinkMonTimeout, ORI_Result_e * RE_result);
+
+/**
+ * @brief Perform a RE Set Time procedure.
+ *
+ * This function performs the Set Time procedure with the RE to set the absolute time reference used by the RE. <br>
+ * The time reference is obtained from the calling application's local time reference.
+ *
+ * @param ori The ORI context.
+ * @param RE_result The RE response result of the procedure.
+ * @return The result of the procedure.
+ */
+ORI_Result_e ORI_SetTime(ORI_s * ori, ORI_Result_e * RE_result);
+
+/**
+ * @brief Perform a RE Reset procedure.
+ *
+ * This function performs the Reset procedure with the RE. <br>
+ * If successful, the RE shall close the TCP Link and reset itself.
+ *
+ * @param ori The ORI context.
+ * @param RE_result The RE response result of the procedure.
+ * @return The result of the procedure.
+ */
+ORI_Result_e ORI_Reset(ORI_s * ori, ORI_Result_e * RE_result);
+
+
+
+/*-----------------------------------------------------------------------------------------
+ * SOFTWARE MANAGEMENT
+ *-----------------------------------------------------------------------------------------*/
+
+/**
+ * @brief Perform a RE Version Query procedure.
+ *
+ * This function performs the Version Query procedure with the RE. <br>
+ * If successful, the @p REVersion structure shall be filled with all the vendor specific RE version information,
+ * containing the product information, hardware version and software images stored in the RE.
+ *
+ * @param ori The ORI context.
+ * @param REVersion The RE version information structure.
+ * @param RE_result The RE response result of the procedure.
+ * @return The result of the procedure.
+ */
+ORI_Result_e ORI_VersionQuery(ORI_s * ori, ORI_REVersion_s * REVersion, ORI_Result_e * RE_result);
+
+
+/**
+ * @brief Perform a RE Software Update Preparation procedure.
+ *
+ * This function performs the Software Update Preparation procedure with the RE. <br>
+ * If successful, the RE shall start downloading the specified Software Upgrade Package @p SwUpgradePkgVer file from the specified
+ * FTP server using the login credentials @p ftpSrvIpAddress, @p ftpSrvUserName and @p ftpSrvPassword. <br>
+ * The Software file format is RE vendor specific. <br>
+ * After download, the RE will store this new software package in non-volatile memory as the passive image. <br>
+ * On completion of the process, the RE shall send a message indicating file transfer completion. If a callback is specified in the ORI context,
+ * the callback ::ORI_IndCallback_f will be called with the enum ::ORI_IndicationType_FileTransferComplete
+ * passed as parameter, as well as the file transfer completion result (success, or failure, with additional information).
+ *
+ * @param ori The ORI context.
+ * @param ftpSrvIpAddress The FTP server address as a decimal point notation (e.g. "192.168.1.1").
+ * @param ftpSrvUserName The FTP server login used by the RE.
+ * @param ftpSrvPassword The FTP server password used by the RE.
+ * @param ftpSrvSwPkgDirPath The FTP server directory location of the software package file.
+ * @param SwUpgradePkgVer The name of the software package file.
+ * @param RE_result The RE response result of the procedure.
+ * @return The result of the procedure.
+ */
+ORI_Result_e ORI_SoftwareUpdatePrep(ORI_s * ori, const char * ftpSrvIpAddress, const char * ftpSrvUserName, const char * ftpSrvPassword,
+											const char * ftpSrvSwPkgDirPath, const char * SwUpgradePkgVer, ORI_Result_e * RE_result);
+
+/**
+ * @brief Perform a RE Software Activation procedure.
+ *
+ * This function performs the Software Activation procedure with the RE. <br>
+ * If successful, the RE shall activate its passive software image, set its previous active image as passive, close the TCP Link then reset itself.
+ *
+ * @param ori The ORI context.
+ * @param RE_result The RE response result of the procedure.
+ * @return The result of the procedure.
+ */
+ORI_Result_e ORI_SoftwareActivation(ORI_s * ori, ORI_Result_e * RE_result);
+
+
+
+/*-----------------------------------------------------------------------------------------
+ * CONFIGURATION MANAGEMENT
+ *-----------------------------------------------------------------------------------------*/
+
+/**
+ * @brief Perform a RE Object Parameter Reporting procedure.
+ *
+ * This function performs the Object Parameter Reporting procedure with the RE. <br>
+ * The target object or set of objects is specified by the arguments @p object and @p wildcard: <br>
+ * - @p object is not @c NULL and @p wildcard is 0 : the targeted object is @p object. <br>
+ * - @p object is not @c NULL and @p wildcard is not 0 : the targeted objects are all the children of @p object. <br>
+ * - @p object is @c NULL : the targeted objects are all the objects in the model. <br>
+ *
+ * The parameter to report is defined by @p param. If @p param is ::ORI_ObjectParam_All, then all the parameters of the targeted
+ * object(s) shall be reported. <br>
+ * On success, the parameters of the targeted objects are updated in the model. <br>
+ * If the RE reported parameters for objects not present in the model image in the REC, the model is internally updated and
+ * the new objects created (this will be the case at initial software alignment, as the ORI GS specifies
+ * a Parameter Reporting "ALL objects" and "ALL parameters" shall be done at start-up).
+ *
+ * @param ori The ORI context.
+ * @param object The target object, or parent object, or @c NULL if no specific object; depending on @p wildcard.
+ * @param wildcard Wildcard for targeting all objects, or all children objects; depending on @p object being @c NULL.
+ * @param param The parameter to report, or all if ::ORI_ObjectParam_All.
+ * @param RE_result The RE response result of the procedure.
+ * @return The result of the procedure.
+ */
+ORI_Result_e ORI_ObjectParamReport(ORI_s * ori, ORI_Object_s * object, int wildcard, ORI_ObjectParam_e param, ORI_Result_e * RE_result);
+
+/**
+ * @brief Perform a RE Object Parameter Modify procedure.
+ *
+ * This function performs the Object Parameter Modify procedure with the RE. <br>
+ * The object for which the parameter(s) is(are) to be modified is given by @p object. <br>
+ * The members of the @p params union for the specified target object type shall be set prior to calling this function, and each of the
+ * parameter to modify must be specified in the @p paramList array. The number of parameters to set must be given by @p numParams. <br>
+ * On procedure completion, the @p paramResult[] array will be filled with the results of each independent parameter modify attempt.
+ *
+ * @param ori The ORI context.
+ * @param object The target object.
+ * @param params The parameters union with values set for the parameters to modify.
+ * @param paramList The array of enumerated parameters to modify. ::ORI_ObjectParam_All is not a valid enumeration for this procedure.
+ * @param numParams The number of parameters to modify, must be > 0.
+ * @param paramResult The return array for the individual result response for each parameter to modify.
+ * @param RE_globalResult The RE response global result of the procedure.
+ * @return The result of the procedure.
+ */
+ORI_Result_e ORI_ObjectParamModify(ORI_s * ori, ORI_Object_s * object, ORI_ObjectParams_u params, ORI_ObjectParam_e paramList[],
+										uint32_t numParams, ORI_Result_e paramResult[], ORI_Result_e * RE_globalResult);
+
+
+
+/*-----------------------------------------------------------------------------------------
+ * OBJECT LIFECYCLE
+ *-----------------------------------------------------------------------------------------*/
+
+/**
+ * @brief Perform a RE Object Creation procedure.
+ *
+ * This function performs the Object Creation procedure with the RE. <br>
+ * The object type to create is given by @p typeRef. <br>
+ * The parameters @p params, @p paramList, @p numParams and @p paramResult function in the same maner as in the ORI_ObjectParamModify() procedure
+ * and can be used to set default parameters for the newly created object. @p numParams can be set to 0, in which case no parameter is applied
+ * to the new object. <br>
+ * The created object is added in the model. <br>
+ * This function also returns in @p newObject a reference in the model of the newly created object.
+ *
+ * @param ori The ORI context.
+ * @param typeRef The type reference of the object to create.
+ * @param params The parameters union with values set for the parameters to set.
+ * @param paramList The array of enumerated parameters to set. ::ORI_ObjectParam_All is not a valid enumeration for this procedure.
+ * @param numParams The number of parameters to set, can be 0.
+ * @param paramResult The return array for the individual result response for each parameter to set.
+ * @param newObject Reference to the newly created object.
+ * @param RE_globalResult The RE response global result of the procedure.
+ * @return The result of the procedure.
+ */
+ORI_Result_e ORI_ObjectCreation(ORI_s * ori, ORI_ObjectTypeRef_s typeRef, ORI_ObjectParams_u params, ORI_ObjectParam_e paramList[],
+										uint32_t numParams, ORI_Result_e paramResult[], ORI_Object_s ** newObject, ORI_Result_e * RE_globalResult);
+
+/**
+ * @brief Perform a RE Object Deletion procedure.
+ *
+ * This function performs the Object Deletion procedure with the RE. <br>
+ * If successful, the object specified by @p object shall be deleted from the RE and removed from the library model.
+ *
+ * @param ori The ORI context.
+ * @param object The object to delete.
+ * @param RE_result The RE response result of the procedure.
+ * @return The result of the procedure.
+ */
+ORI_Result_e ORI_ObjectDeletion(ORI_s * ori, ORI_Object_s * object, ORI_Result_e * RE_result);
+
+
+
+/*-----------------------------------------------------------------------------------------
+ * OBJECT STATE MANAGEMENT
+ *-----------------------------------------------------------------------------------------*/
+
+/**
+ * @brief Perform a RE Object State Reporting procedure.
+ *
+ * This function performs the Object State Reporting procedure with the RE. <br>
+ * The target object or set of objects is specified by the arguments @p object and @p wildcard: <br>
+ * - @p object is not @c NULL and @p wildcard is 0 : the targeted object is @p object. <br>
+ * - @p object is not @c NULL and @p wildcard is not 0 : the targeted objects are all the children of @p object. <br>
+ * - @p object is @c NULL : the targeted objects are all the objects in the model. <br>
+ *
+ * The state type to report is defined by @p stateType. If @p stateType is ::ORI_StateType_All, then all the states of the targeted
+ * object(s) shall be reported. <br>
+ * On success, the states of the targeted objects are updated in the model. <br>
+ * If the RE reported states for objects not present in the model image in the REC, the model is internally updated and
+ * the new objects created (this will be the case at initial software alignment, as the ORI GS specifies a State
+ * Reporting "ALL objects" and "ALL states" shall be done at start-up).
+ * If @p eventDrivenReport is set to ::ORI_EventDrivenReport_True or ::ORI_EventDrivenReport_False the event driven state reporting of the object is enabled
+ * or disabled. Pass ::ORI_EventDrivenReport_NoModify to keep the event driven state reporting as is.
+ *
+ * @param ori The ORI context.
+ * @param object The target object, or parent object, or @c NULL if no specific object; depending on @p wildcard.
+ * @param wildcard Wildcard for targeting all objects, or all children objects; depending on @p object being @c NULL.
+ * @param stateType The parameter to report, or all if ::ORI_StateType_All.
+ * @param eventDrivenReport Set event driven state reporting of the object if applicable.
+ * @param RE_result The RE response result of the procedure.
+ * @return The result of the procedure.
+ */
+ORI_Result_e ORI_ObjectStateReport(ORI_s * ori, ORI_Object_s * object, int wildcard, ORI_StateType_e stateType,
+											ORI_EventDrivenReport_e eventDrivenReport, ORI_Result_e * RE_result);
+
+/**
+ * @brief Perform a RE Object State Modification procedure.
+ *
+ * This function performs the Object State Modification procedure with the RE. <br>
+ * If successful, the administrative state (AST) of the target object will be set to @p ast.
+ *
+ * @param ori The ORI context.
+ * @param object The object on which to set the state.
+ * @param ast The administrative state to set.
+ * @param RE_result The RE response result of the procedure.
+ * @return The result of the procedure.
+ */
+ORI_Result_e ORI_ObjectStateModification(ORI_s * ori, ORI_Object_s * object, ORI_AST_e ast, ORI_Result_e * RE_result);
+
+
+
+/*-----------------------------------------------------------------------------------------
+ * FAULT MANAGEMENT
+ *-----------------------------------------------------------------------------------------*/
+
+/**
+ * @brief Perform a RE Object Fault Reporting procedure.
+ *
+ * This function performs the Object Fault Reporting procedure with the RE. <br>
+ * The target object or set of objects is specified by the arguments @p object and @p wildcard: <br>
+ * - @p object is not @c NULL and @p wildcard is 0 : the targeted object is @p object. <br>
+ * - @p object is not @c NULL and @p wildcard is not 0 : the targeted objects are all the children of @p object. <br>
+ * - @p object is @c NULL : the targeted objects are all the objects in the model. <br>
+ *
+ * On success, the faults of the targeted objects are updated in the model. <br>
+ * If the RE reported faults for objects not present in the model image in the REC, the model is internally updated and
+ * the new objects created (this will be the case at initial software alignment, as the ORI GS specifies a Fault
+ * Reporting "ALL objects" shall be done at start-up).
+ * If @p eventDrivenReport is set to ::ORI_EventDrivenReport_True or ::ORI_EventDrivenReport_False the event driven fault reporting of the object is enabled
+ * or disabled. Pass ::ORI_EventDrivenReport_NoModify to keep the event driven fault reporting as is.
+ *
+ * @param ori The ORI context.
+ * @param object The target object, or parent object, or @c NULL if no specific object; depending on @p wildcard.
+ * @param wildcard Wildcard for targeting all objects, or all children objects; depending on @p object being @c NULL.
+ * @param eventDrivenReport Set event driven fault reporting of the object if applicable.
+ * @param RE_result The RE response result of the procedure.
+ * @return The result of the procedure.
+ */
+ORI_Result_e ORI_ObjectFaultReport(ORI_s * ori, ORI_Object_s * object, int wildcard, ORI_EventDrivenReport_e eventDrivenReport, ORI_Result_e * RE_result);
+
+
+/*-----------------------------------------------------------------------------------------
+ * LOGGING
+ *-----------------------------------------------------------------------------------------*/
+
+/**
+ * @brief Perform a File Upload procedure.
+ *
+ * This function performs a File Upload procedure with the RE or with a Log Object. <br>
+ * If successful, a File Upload should be initiated. <br>
+ * On completion of the process, the RE shall send a message indicating file upload completion. If a callback is specified in the ORI context,
+ * the callback ::ORI_IndCallback_f will be called with the enum ::ORI_IndicationType_UploadFileCmpl
+ * passed as parameter, as well as the file upload completion result.
+ *
+ * @param ori The ORI context.
+ * @param object The object targeted for the file upload. Must be a RE or Log object.
+ * @param ftpSrvIpAddress The FTP server address as a decimal point notation (e.g. "192.168.1.1").
+ * @param ftpSrvUserName The FTP server login used by the RE.
+ * @param ftpSrvPassword The FTP server password used by the RE.
+ * @param ftpSrvFilePath The FTP server path to the file to upload.
+ * @param REFilePath The RE file path for a generic file upload. Used only in the case of a RE object.
+ * @param maxUploadFileSize The maximum size in kBytes accepted for uploading the file. Pass 0 for no size limit.
+ * @param RE_result The RE response result of the procedure.
+ * @return The result of the procedure.
+ */
+ORI_Result_e ORI_FileUpload(ORI_s * ori, ORI_Object_s * object, const char * ftpSrvIpAddress, const char * ftpSrvUserName, const char * ftpSrvPassword,
+										const char * ftpSrvFilePath, const char * REFilePath,  uint16_t maxUploadFileSize, ORI_Result_e * RE_result);
+
+
+/*-----------------------------------------------------------------------------------------
+ * AISG
+ *-----------------------------------------------------------------------------------------*/
+
+/**
+ * @brief Perform an AISG Device Scan procedure.
+ *
+ * This function performs an AISG Scan Device procedure with an AISG Port Object. <br>
+ * On completion of the process, the RE shall send a message indicating scan device completion.
+ *
+ * @param ori The ORI context.
+ * @param object The object targeted for the device scan. Must be an AISG Port object.
+ * @param RE_result The RE response result of the procedure.
+ * @return The result of the procedure.
+ */
+ORI_Result_e ORI_DeviceScan(ORI_s * ori, ORI_Object_s * object, ORI_Result_e * RE_result);
+
+/**
+ * @brief Transfer an AISG layer7 message to an ALD.
+ *
+ * This function transfers an AISG layer7 message to an ALD.
+ * On completion of the transfer, the RE shall send a message indicating the ALD's layer7 response.
+ *
+ * @param ori The ORI context.
+ * @param object The object targeted for the layer7 message. Must be an AISG ALD object.
+ * @param msgLayer7 The AISG layer7 message.
+ * @param deviceDataFieldNbr The field number to store for GetDeviceData message (used in indication parsing).
+ * @param RE_result The RE response result of the procedure.
+ * @return The result of the procedure.
+ */
+ORI_Result_e ORI_MsgTransfer(ORI_s * ori, ORI_Object_s * object, const char * msgLayer7, uint8_t deviceDataFieldNbr, ORI_Result_e * RE_result);
+
+
+
+/*-----------------------------------------------------------------------------------------
+ * ORI MODEL
+ *-----------------------------------------------------------------------------------------*/
+
+/**
+ * @brief Find an object in the model.
+ *
+ * This function seeks in the model an object that matches the object type @p type
+ * and the instance number @p instanceNumber. <br>
+ * If @p parent is @c NULL, only parent-less objects will be in the search. Else, the object
+ * to find shall be a direct descendant of @p parent.
+ *
+ * @param ori The ORI context.
+ * @param type The object type of the object to find.
+ * @param instanceNumber The instance number of the object to find.
+ * @param parent The parent of the object to find, or @c NULL if no parent is expected.
+ * @return The found object if any, or @c NULL if none.
+ */
+ORI_Object_s * ORI_FindObject(ORI_s * ori, ORI_ObjectType_e type, uint8_t instanceNumber, ORI_Object_s * parent);
+
+/**
+ * @brief Gets all objects in the model
+ *
+ * This function fills the array @p objects with reference of all the objects in the model that are a child of @p parent. If @p parent is @c NULL,
+ * all the objects in the model are retrieved. <br>
+ * The maximum size of the @p objects array shall be given in @p maxObjects. <br>
+ *
+ * @param ori The ORI context.
+ * @param objects The object array to fill.
+ * @param maxObjects The maximum number of objects that the array can contain.
+ * @param parent If not @c NULL, specifies the parent of the objects to get.
+ * @return The number of objects found.
+ */
+uint32_t ORI_GetAllObjects(ORI_s * ori, ORI_Object_s * objects[], uint32_t maxObjects, ORI_Object_s * parent);
+
+/**
+ * @brief Gets all objects of a given type in the model
+ *
+ * This function fills the array @p objects with reference of all the objects of type @p type in the model that are a child of @p parent. If @p parent is @c NULL,
+ * all the objects of type @p type in the model are retrieved. <br>
+ * The maximum size of the @p objects array shall be given in @p maxObjects. <br>
+ * This functions is the same as ORI_GetAllObjects() but with a type filter.
+ *
+ * @param ori The ORI context.
+ * @param type The type filter of the objects to find.
+ * @param objects The object array to fill.
+ * @param maxObjects The maximum number of objects that the array can contain.
+ * @param parent If not @c NULL, specifies the parent of the objects to get.
+ * @return The number of objects found.
+ */
+uint32_t ORI_GetAllObjectsOfType(ORI_s * ori, ORI_ObjectType_e type, ORI_Object_s * objects[], uint32_t maxObjects, ORI_Object_s * parent);
+
+/**
+ * @brief Return the fault structure of an object based on a fault type.
+ *
+ * This function is a helper function that returns a pointer to a fault structure of an object based on a fault type.
+ * If the fault type and the object type does not match (as faults are specific to some objects), @c NULL is returned.
+ *
+ * @param ori The ORI context.
+ * @param object The object to delete.
+ * @param faultType The type of the fault structure to return.
+ * @return The found fault structure, or @c NULL if none.
+ */
+ORI_Fault_s * ORI_ObjectFault(ORI_s * ori, ORI_Object_s * object, ORI_FaultType_e faultType);
+
+
+
+
+#endif /* ORI_H_ */
diff --git a/targets/RT/USER/lte-ru.c b/targets/RT/USER/lte-ru.c
index 86d3a88781d7086aca5f7164a697c5693e343ae4..10ba121c44ce51b462c7a01b840abf24c02a0963 100644
--- a/targets/RT/USER/lte-ru.c
+++ b/targets/RT/USER/lte-ru.c
@@ -1300,13 +1300,13 @@ void fill_rf_config(RU_t *ru,
       if (fp->threequarter_fs) {
         cfg->sample_rate=23.04e6;
         cfg->samples_per_frame = 230400;
-        cfg->tx_bw = 10e6;
-        cfg->rx_bw = 10e6;
+        cfg->tx_bw = 20e6;
+        cfg->rx_bw = 20e6;
       } else {
         cfg->sample_rate=30.72e6;
         cfg->samples_per_frame = 307200;
-        cfg->tx_bw = 10e6;
-        cfg->rx_bw = 10e6;
+        cfg->tx_bw = 20e6;
+        cfg->rx_bw = 20e6;
       }
     } else if(ru->numerology == 1) {
       cfg->sample_rate=61.44e6;
@@ -1328,13 +1328,13 @@ void fill_rf_config(RU_t *ru,
   } else if(fp->N_RB_DL == 50) {
     cfg->sample_rate=15.36e6;
     cfg->samples_per_frame = 153600;
-    cfg->tx_bw = 5e6;
-    cfg->rx_bw = 5e6;
+    cfg->tx_bw = 10e6;
+    cfg->rx_bw = 10e6;
   } else if (fp->N_RB_DL == 25) {
     cfg->sample_rate=7.68e6;
     cfg->samples_per_frame = 76800;
-    cfg->tx_bw = 2.5e6;
-    cfg->rx_bw = 2.5e6;
+    cfg->tx_bw = 5e6;
+    cfg->rx_bw = 5e6;
   } else if (fp->N_RB_DL == 6) {
     cfg->sample_rate=1.92e6;
     cfg->samples_per_frame = 19200;