diff --git a/.gitignore b/.gitignore
index ff947966a2b9c7814a8ca64228810130cabe96f6..288b4d37661fb9cddc6733dc1933b83d78904835 100644
--- a/.gitignore
+++ b/.gitignore
@@ -2,6 +2,7 @@
*.swp
# log and exec file
+*.log
cmake_targets/log/
cmake_targets/*/build/
cmake_targets/ran_build/
diff --git a/.vscode/launch.json b/.vscode/launch.json
index 4b563febdea2f01db7f95405d5bc5ffb1803f586..8be69157639e9efa5c6bffc1a1ffd770d2d7d6ff 100644
--- a/.vscode/launch.json
+++ b/.vscode/launch.json
@@ -8,14 +8,17 @@
"name": "(gdb) Launch",
"type": "cppdbg",
"request": "launch",
- "program": "enter program name, for example ${workspaceFolder}/a.exe",
- "args": [],
+ "program": "${workspaceFolder}/cmake_targets/ran_build/build/lte-softmodem",
+ "args": [
+ "-O", "../ci-scripts/conf_files/rcc.band7.tm1.nfapi.conf",
+ "--noS1"
+ ],
"stopAtEntry": false,
- "cwd": "${workspaceFolder}",
+ "cwd": "${workspaceFolder}/cmake_targets",
"environment": [],
"externalConsole": false,
"MIMode": "gdb",
- "miDebuggerPath": "/path/to/gdb",
+ "miDebuggerPath": "${workspaceFolder}/cmake_targets/sudo-gdb",
"setupCommands": [
{
"description": "Enable pretty-printing for gdb",
diff --git a/README.md b/README.md
index 7651aea5c998e7a55b2096d1562487d5155183b5..c5f7e8343cc7284e884e0fa8154dcbf5ed1de6fc 100644
--- a/README.md
+++ b/README.md
@@ -1,15 +1,30 @@
-# OpenAirInterface License #
+# Description #
+The purpose of this repository is to provide an updated version of the original OAI code base. The original code base can be found here: https://gitlab.eurecom.fr/oai/openairinterface5g. The updates to the OAI code base removed some latent bugs, added multi-UE scalability, and were tested with a standard bypass proxy between the UE(s) and eNB. This proxy is available at: https://github.com/EpiSci/oai-lte-multi-ue-proxy. With this package, various multi-UE scenarios can be tested without the overhead of PHY-layer features of underlying radios. This proxy was created to allow users to test and utilize EpiSci's updated version of the OAI code.
+### Where this all began: ###
+OAI code was used to baseline this work. The initial framework for this development was started from the following commit: https://gitlab.eurecom.fr/oai/openairinterface5g/-/commit/362da7c9205691a7314de56bbe8ec369f636da7b.
-OpenAirInterface is under OpenAirInterface Software Alliance license.
+### Included Fixes: ###
+- Ease of use of gprof and address sanitizer for debugging purposes
+- Updated json files to allow for GDB, real-time debugging capabilities
+- Updated logging features to minimally log only key connection milestones. This imroves scalability of multiple UEs.
+- Updated logging to include time stamp for timing analysis
+- Updated memory allocation procedures to correct size requirements
+- Added debugging features to handle signal terminations
+- nfapi.c pullarray8 fix invalid pointer math
+- Overlapping destination and source memory in memcpy, so updated to memmove to check for this bug
+- Advanced error checking mechanisms in critical pack and unpack functions
+- Created option for CPU assignment to UE to improve scalability
+- Added EPC integration to allow multiple individual UE entities to each have their USIM information parced by the executables
+- Updated random value seeds to minimize probability of error in generation of random values
+- Enables capability round robin scheduler if desired
+- Enables capability real time scheduler if desired
+- Added new standalone functions to the UE phy-layer (phy_stub_ue.c) to incorporate individual UE entities
+- Updated sending and packing functions in UE (lte_ue.c) to incorporate new standalone changes
+- Incorporated semaphores to control timing of incoming downlink packets
+- Implemented new queuing system to handle message exchange from UE to eNB and vice versa
+- Updated global value in nFAPI for size of subframe
+- Updated global value to increase scalability in system
- * [OAI License Model](http://www.openairinterface.org/?page_id=101)
- * [OAI License v1.1 on our website](http://www.openairinterface.org/?page_id=698)
-
-It is distributed under **OAI Public License V1.1**.
-
-The license information is distributed under [LICENSE](LICENSE) file in the same directory.
-
-Please see [NOTICE](NOTICE.md) file for third party software that is included in the sources.
# Where to Start #
diff --git a/ci-scripts/conf_files/nr-ue.nfapi.conf b/ci-scripts/conf_files/nr-ue.nfapi.conf
new file mode 100644
index 0000000000000000000000000000000000000000..6ae6e160aebc5e7f9de0075cc3bdfa616d512695
--- /dev/null
+++ b/ci-scripts/conf_files/nr-ue.nfapi.conf
@@ -0,0 +1,44 @@
+log_config = {
+ global_log_level ="info";
+ global_log_verbosity ="medium";
+ hw_log_level ="info";
+ hw_log_verbosity ="medium";
+ phy_log_level ="info";
+ phy_log_verbosity ="medium";
+ mac_log_level ="info";
+ mac_log_verbosity ="medium";
+ rlc_log_level ="info";
+ rlc_log_verbosity ="medium";
+ pdcp_log_level ="info";
+ pdcp_log_verbosity ="medium";
+ rrc_log_level ="info";
+ rrc_log_verbosity ="full";
+};
+
+
+L1s = (
+ {
+ num_cc = 1;
+ tr_n_preference = "nfapi";
+ local_n_if_name = "ens3";
+ remote_n_address = "CI_ENB_IP_ADDR";
+ local_n_address = "CI_UE_IP_ADDR";
+ local_n_portc = 50600;
+ remote_n_portc = 50601;
+ local_n_portd = 50610;
+ remote_n_portd = 50611;
+ }
+);
+
+RUs = (
+ {
+ local_rf = "yes"
+ nb_tx = 1
+ nb_rx = 1
+ att_tx = 90
+ att_rx = 0;
+ bands = [7,38,42,43];
+ max_pdschReferenceSignalPower = -27;
+ max_rxgain = 125;
+ }
+);
diff --git a/ci-scripts/conf_files/proxy_nr-ue.nfapi.conf b/ci-scripts/conf_files/proxy_nr-ue.nfapi.conf
new file mode 100644
index 0000000000000000000000000000000000000000..652e3d9dbf212b5c866e22afdfac401786842d76
--- /dev/null
+++ b/ci-scripts/conf_files/proxy_nr-ue.nfapi.conf
@@ -0,0 +1,44 @@
+log_config = {
+ global_log_level ="info";
+ global_log_verbosity ="medium";
+ hw_log_level ="info";
+ hw_log_verbosity ="medium";
+ phy_log_level ="info";
+ phy_log_verbosity ="medium";
+ mac_log_level ="info";
+ mac_log_verbosity ="medium";
+ rlc_log_level ="info";
+ rlc_log_verbosity ="medium";
+ pdcp_log_level ="info";
+ pdcp_log_verbosity ="medium";
+ rrc_log_level ="info";
+ rrc_log_verbosity ="full";
+};
+
+
+L1s = (
+ {
+ num_cc = 1;
+ tr_n_preference = "nfapi";
+ local_n_if_name = "lo:";
+ remote_n_address = "127.0.0.2";
+ local_n_address = "127.0.0.1";
+ local_n_portc = 50600;
+ remote_n_portc = 50601;
+ local_n_portd = 50610;
+ remote_n_portd = 50611;
+ }
+);
+
+RUs = (
+ {
+ local_rf = "yes"
+ nb_tx = 1
+ nb_rx = 1
+ att_tx = 90
+ att_rx = 0;
+ bands = [7,38,42,43];
+ max_pdschReferenceSignalPower = -27;
+ max_rxgain = 125;
+ }
+);
diff --git a/ci-scripts/conf_files/proxy_rcc.band7.tm1.nfapi.conf b/ci-scripts/conf_files/proxy_rcc.band7.tm1.nfapi.conf
new file mode 100644
index 0000000000000000000000000000000000000000..d4c72d6c1411433ac8fca598def78739009e1236
--- /dev/null
+++ b/ci-scripts/conf_files/proxy_rcc.band7.tm1.nfapi.conf
@@ -0,0 +1,247 @@
+Active_eNBs = ( "eNB-Eurecom-LTEBox");
+# Asn1_verbosity, choice in: none, info, annoying
+Asn1_verbosity = "none";
+
+eNBs =
+(
+ {
+ ////////// Identification parameters:
+ eNB_ID = 0xe00;
+
+ cell_type = "CELL_MACRO_ENB";
+
+ eNB_name = "eNB-Eurecom-LTEBox";
+
+ // Tracking area code, 0x0000 and 0xfffe are reserved values
+ tracking_area_code = 5;
+
+ plmn_list = ( { mcc = 320; mnc = 230; mnc_length = 3; } );
+
+ tr_s_preference = "local_mac"
+
+ ////////// Physical parameters:
+
+ component_carriers = (
+ {
+ node_function = "3GPP_eNODEB";
+ node_timing = "synch_to_ext_device";
+ node_synch_ref = 0;
+ frame_type = "FDD";
+ tdd_config = 3;
+ tdd_config_s = 0;
+ prefix_type = "NORMAL";
+ eutra_band = 7;
+ downlink_frequency = 2685000000L;
+ uplink_frequency_offset = -120000000;
+ Nid_cell = 0;
+ N_RB_DL = 50;
+ Nid_cell_mbsfn = 0;
+ nb_antenna_ports = 1;
+ nb_antennas_tx = 1;
+ nb_antennas_rx = 1;
+ tx_gain = 90;
+ rx_gain = 125;
+ pbch_repetition = "FALSE";
+ prach_root = 0;
+ prach_config_index = 0;
+ prach_high_speed = "DISABLE";
+ prach_zero_correlation = 1;
+ prach_freq_offset = 2;
+ pucch_delta_shift = 1;
+ pucch_nRB_CQI = 0;
+ pucch_nCS_AN = 0;
+ pucch_n1_AN = 0;
+ pdsch_referenceSignalPower = -27;
+ pdsch_p_b = 0;
+ pusch_n_SB = 1;
+ pusch_enable64QAM = "DISABLE";
+ pusch_hoppingMode = "interSubFrame";
+ pusch_hoppingOffset = 0;
+ pusch_groupHoppingEnabled = "ENABLE";
+ pusch_groupAssignment = 0;
+ pusch_sequenceHoppingEnabled = "DISABLE";
+ pusch_nDMRS1 = 1;
+ phich_duration = "NORMAL";
+ phich_resource = "ONESIXTH";
+ srs_enable = "DISABLE";
+ /* srs_BandwidthConfig =;
+ srs_SubframeConfig =;
+ srs_ackNackST =;
+ srs_MaxUpPts =;*/
+
+ pusch_p0_Nominal = -96;
+ pusch_alpha = "AL1";
+ pucch_p0_Nominal = -104;
+ msg3_delta_Preamble = 6;
+ pucch_deltaF_Format1 = "deltaF2";
+ pucch_deltaF_Format1b = "deltaF3";
+ pucch_deltaF_Format2 = "deltaF0";
+ pucch_deltaF_Format2a = "deltaF0";
+ pucch_deltaF_Format2b = "deltaF0";
+
+ rach_numberOfRA_Preambles = 64;
+ rach_preamblesGroupAConfig = "DISABLE";
+ /*
+ rach_sizeOfRA_PreamblesGroupA = ;
+ rach_messageSizeGroupA = ;
+ rach_messagePowerOffsetGroupB = ;
+ */
+ rach_powerRampingStep = 4;
+ rach_preambleInitialReceivedTargetPower = -108;
+ rach_preambleTransMax = 10;
+ rach_raResponseWindowSize = 10;
+ rach_macContentionResolutionTimer = 48;
+ rach_maxHARQ_Msg3Tx = 4;
+
+ pcch_default_PagingCycle = 128;
+ pcch_nB = "oneT";
+ bcch_modificationPeriodCoeff = 2;
+ ue_TimersAndConstants_t300 = 1000;
+ ue_TimersAndConstants_t301 = 1000;
+ ue_TimersAndConstants_t310 = 1000;
+ ue_TimersAndConstants_t311 = 10000;
+ ue_TimersAndConstants_n310 = 20;
+ ue_TimersAndConstants_n311 = 1;
+ ue_TransmissionMode = 1;
+
+ //Parameters for SIB18
+ rxPool_sc_CP_Len = "normal";
+ rxPool_sc_Period = "sf40";
+ rxPool_data_CP_Len = "normal";
+ rxPool_ResourceConfig_prb_Num = 20;
+ rxPool_ResourceConfig_prb_Start = 5;
+ rxPool_ResourceConfig_prb_End = 44;
+ rxPool_ResourceConfig_offsetIndicator_present = "prSmall";
+ rxPool_ResourceConfig_offsetIndicator_choice = 0;
+ rxPool_ResourceConfig_subframeBitmap_present = "prBs40";
+ rxPool_ResourceConfig_subframeBitmap_choice_bs_buf = "00000000000000000000";
+ rxPool_ResourceConfig_subframeBitmap_choice_bs_size = 5;
+ rxPool_ResourceConfig_subframeBitmap_choice_bs_bits_unused = 0;
+/* rxPool_dataHoppingConfig_hoppingParameter = 0;
+ rxPool_dataHoppingConfig_numSubbands = "ns1";
+ rxPool_dataHoppingConfig_rbOffset = 0;
+ rxPool_commTxResourceUC-ReqAllowed = "TRUE";
+*/
+ // Parameters for SIB19
+ discRxPool_cp_Len = "normal"
+ discRxPool_discPeriod = "rf32"
+ discRxPool_numRetx = 1;
+ discRxPool_numRepetition = 2;
+ discRxPool_ResourceConfig_prb_Num = 5;
+ discRxPool_ResourceConfig_prb_Start = 3;
+ discRxPool_ResourceConfig_prb_End = 21;
+ discRxPool_ResourceConfig_offsetIndicator_present = "prSmall";
+ discRxPool_ResourceConfig_offsetIndicator_choice = 0;
+ discRxPool_ResourceConfig_subframeBitmap_present = "prBs40";
+ discRxPool_ResourceConfig_subframeBitmap_choice_bs_buf = "f0ffffffff";
+ discRxPool_ResourceConfig_subframeBitmap_choice_bs_size = 5;
+ discRxPool_ResourceConfig_subframeBitmap_choice_bs_bits_unused = 0;
+
+ }
+ );
+
+
+ srb1_parameters :
+ {
+ # timer_poll_retransmit = (ms) [5, 10, 15, 20,... 250, 300, 350, ... 500]
+ timer_poll_retransmit = 80;
+
+ # timer_reordering = (ms) [0,5, ... 100, 110, 120, ... ,200]
+ timer_reordering = 35;
+
+ # timer_reordering = (ms) [0,5, ... 250, 300, 350, ... ,500]
+ timer_status_prohibit = 0;
+
+ # poll_pdu = [4, 8, 16, 32 , 64, 128, 256, infinity(>10000)]
+ poll_pdu = 4;
+
+ # poll_byte = (kB) [25,50,75,100,125,250,375,500,750,1000,1250,1500,2000,3000,infinity(>10000)]
+ poll_byte = 99999;
+
+ # max_retx_threshold = [1, 2, 3, 4 , 6, 8, 16, 32]
+ max_retx_threshold = 4;
+ }
+
+ # ------- SCTP definitions
+ SCTP :
+ {
+ # Number of streams to use in input/output
+ SCTP_INSTREAMS = 2;
+ SCTP_OUTSTREAMS = 2;
+ };
+
+
+ ////////// MME parameters:
+ mme_ip_address = ( { ipv4 = "192.168.61.3";
+ ipv6 = "192:168:30::17";
+ port = 36412 ;
+ active = "yes";
+ preference = "ipv4";
+ }
+ );
+
+ enable_measurement_reports = "no";
+
+ ///X2
+ enable_x2 = "yes";
+ t_reloc_prep = 1000; /* unit: millisecond */
+ tx2_reloc_overall = 2000; /* unit: millisecond */
+ t_dc_prep = 1000; /* unit: millisecond */
+ t_dc_overall = 2000; /* unit: millisecond */
+
+ NETWORK_INTERFACES :
+ {
+ ENB_INTERFACE_NAME_FOR_S1_MME = "lo";
+ ENB_IPV4_ADDRESS_FOR_S1_MME = "127.0.0.1";
+ ENB_INTERFACE_NAME_FOR_S1U = "lo";
+ ENB_IPV4_ADDRESS_FOR_S1U = "127.0.0.1";
+ ENB_PORT_FOR_S1U = 2152; # Spec 2152
+ ENB_IPV4_ADDRESS_FOR_X2C = "127.0.0.1";
+ ENB_PORT_FOR_X2C = 36422; # Spec 36422
+
+ };
+ }
+);
+
+MACRLCs = (
+ {
+ num_cc = 1;
+ local_s_if_name = "lo";
+ remote_s_address = "127.0.0.1";
+ local_s_address = "127.0.0.1";
+ local_s_portc = 50001;
+ remote_s_portc = 50000;
+ local_s_portd = 50011;
+ remote_s_portd = 50010;
+ tr_s_preference = "nfapi";
+ tr_n_preference = "local_RRC";
+ scheduler_mode = "fairRR";
+ }
+);
+
+THREAD_STRUCT = (
+ {
+ #three config for level of parallelism "PARALLEL_SINGLE_THREAD", "PARALLEL_RU_L1_SPLIT", or "PARALLEL_RU_L1_TRX_SPLIT"
+ parallel_config = "PARALLEL_RU_L1_SPLIT";
+ #two option for worker "WORKER_DISABLE" or "WORKER_ENABLE"
+ worker_config = "WORKER_ENABLE";
+ }
+);
+
+log_config =
+ {
+ global_log_level ="info";
+ global_log_verbosity ="medium";
+ hw_log_level ="info";
+ hw_log_verbosity ="medium";
+ phy_log_level ="info";
+ phy_log_verbosity ="medium";
+ mac_log_level ="info";
+ mac_log_verbosity ="high";
+ rlc_log_level ="info";
+ rlc_log_verbosity ="medium";
+ pdcp_log_level ="info";
+ pdcp_log_verbosity ="medium";
+ rrc_log_level ="info";
+ rrc_log_verbosity ="medium";
+ };
diff --git a/ci-scripts/conf_files/proxy_ue.nfapi.conf b/ci-scripts/conf_files/proxy_ue.nfapi.conf
new file mode 100644
index 0000000000000000000000000000000000000000..3f227d573ce08d877303567177ace3a1fb3611b0
--- /dev/null
+++ b/ci-scripts/conf_files/proxy_ue.nfapi.conf
@@ -0,0 +1,44 @@
+log_config = {
+ global_log_level ="info";
+ global_log_verbosity ="medium";
+ hw_log_level ="info";
+ hw_log_verbosity ="medium";
+ phy_log_level ="info";
+ phy_log_verbosity ="medium";
+ mac_log_level ="info";
+ mac_log_verbosity ="medium";
+ rlc_log_level ="info";
+ rlc_log_verbosity ="medium";
+ pdcp_log_level ="info";
+ pdcp_log_verbosity ="medium";
+ rrc_log_level ="info";
+ rrc_log_verbosity ="full";
+};
+
+
+L1s = (
+ {
+ num_cc = 1;
+ tr_n_preference = "nfapi";
+ local_n_if_name = "lo";
+ remote_n_address = "127.0.0.1";
+ local_n_address = "127.0.0.1";
+ local_n_portc = 50000;
+ remote_n_portc = 50001;
+ local_n_portd = 50010;
+ remote_n_portd = 50011;
+ }
+);
+
+RUs = (
+ {
+ local_rf = "yes"
+ nb_tx = 1
+ nb_rx = 1
+ att_tx = 90
+ att_rx = 0;
+ bands = [7,38,42,43];
+ max_pdschReferenceSignalPower = -27;
+ max_rxgain = 125;
+ }
+);
diff --git a/ci-scripts/yaml_files/l2_episys_proxy/README.md b/ci-scripts/yaml_files/l2_episys_proxy/README.md
new file mode 100644
index 0000000000000000000000000000000000000000..7301a6f446046ad9c54f0364105360621cae46ba
--- /dev/null
+++ b/ci-scripts/yaml_files/l2_episys_proxy/README.md
@@ -0,0 +1,392 @@
+
+
+
+
+
+
+
+ |
+
+ OAI Full Stack L2-nFAPI simulation with containers
+ |
+
+
+
+This page is only valid for an `Ubuntu18` host.
+
+**CAUTION: this is very experimental on the RAN side. For the moment, on the `episys-merge` branch.**
+
+**TABLE OF CONTENTS**
+
+1. [Retrieving the images on Docker-Hub](#1-retrieving-the-images-on-docker-hub)
+ 1. [Building the RAN docker images](#11-building-the-ran-docker-images)
+ 2. [Building the proxy docker image](#12-building-the-proxy-docker-image)
+2. [Deploy containers](#2-deploy-containers)
+ 1. [Deploy and Configure Cassandra Database](#21-deploy-and-configure-cassandra-database)
+ 2. [Deploy OAI CN4G containers](#22-deploy-oai-cn4g-containers)
+ 3. [Deploy OAI eNB in VNF L2 nFAPI emulator mode](#23-deploy-oai-enb-in-vnf-l2-nfapi-emulator-mode)
+ 4. [Deploy the VNF Proxy container](#24-deploy-the-vnf-proxy-container)
+ 5. [Deploy OAI LTE UE in VNF L2-NFAPI emulator mode](#25-deploy-oai-lte-ue-in-vnf-l2-nfapi-emulator-mode)
+3. [Check traffic](#3-check-traffic)
+4. [Un-deployment](#4-un-deployment)
+
+# 1. Retrieving the images on Docker-Hub #
+
+Currently the images are hosted under the user account `rdefosseoai`.
+
+This may change in the future.
+
+Once again you may need to log on [docker-hub](https://hub.docker.com/) if your organization has reached pulling limit as `anonymous`.
+
+```bash
+$ docker login
+Login with your Docker ID to push and pull images from Docker Hub. If you don't have a Docker ID, head over to https://hub.docker.com to create one.
+Username:
+Password:
+```
+
+Now pull images.
+
+```bash
+$ docker pull cassandra:2.1
+$ docker pull rdefosseoai/oai-hss:latest
+$ docker pull rdefosseoai/oai-mme:latest
+$ docker pull rdefosseoai/oai-spgwc:latest
+$ docker pull rdefosseoai/oai-spgwu-tiny:latest
+```
+
+And **re-tag** them for tutorials' docker-compose file to work.
+
+```bash
+$ docker image tag rdefosseoai/oai-spgwc:latest oai-spgwc:latest
+$ docker image tag rdefosseoai/oai-hss:latest oai-hss:latest
+$ docker image tag rdefosseoai/oai-spgwu-tiny:latest oai-spgwu-tiny:latest
+$ docker image tag rdefosseoai/oai-mme:latest oai-mme:latest
+```
+
+How to build the Traffic-Generator image is explained [here](https://github.com/OPENAIRINTERFACE/openair-epc-fed/blob/master/docs/GENERATE_TRAFFIC.md#1-build-a-traffic-generator-image).
+
+## 1.1. Building the RAN docker images ##
+
+As it is experimental on the `episys-merge` branch, RAN images on Docker-Hub won't do. Once this branch is merged into `develop`, I will push images again and update tutorial.
+
+So for the moment, you SHALL build your-self images. See [how to build the RAN docker images](../../../docker/README.md).
+
+Do not forget to re-tag the generated images with `develop` tag.
+
+```bash
+$ docker image tag oai-enb:latest oai-enb:develop
+$ docker image tag oai-lte-ue:latest oai-lte-ue:develop
+```
+
+## 1.2. Building the proxy docker image ##
+
+The proxy code is hosted on GitHub.com by the `EpiSys Science, Inc.` team.
+
+```bash
+$ git clone https://github.com/EpiSci/oai-lte-multi-ue-proxy.git
+$ cd oai-lte-multi-ue-proxy
+$ git rebase origin/master
+$ docker build --no-cache --target oai-lte-multi-ue-proxy --tag oai-lte-multi-ue-proxy:latest --file docker/Dockerfile.ubuntu18.04 .
+$ docker image prune --force
+```
+
+## 1.3. Logout if needed ##
+
+```bash
+$ docker logout
+```
+
+# 2. Deploy containers #
+
+**CAUTION: this SHALL be done in multiple steps.**
+
+**Just `docker-compose up -d` WILL NOT WORK!**
+
+**All commands SHALL be executed in the `ci-scripts/yaml_files/l2_episys_proxy` folder!**
+
+## 2.1. Deploy and Configure Cassandra Database ##
+
+It is very crutial that the Cassandra DB is fully configured before you do anything else!
+
+```bash
+$ docker-compose -f docker-compose-01-users-epc.yml up -d db_init
+Creating network "l2sim-net" with the default driver
+Creating l2sim-cassandra ... done
+Creating l2sim-db-init ... done
+
+
+$ docker logs l2sim-db-init --follow
+Connection error: ('Unable to connect to any servers', {'192.168.61.2': error(111, "Tried connecting to [('192.168.61.2', 9042)]. Last error: Connection refused")})
+...
+Connection error: ('Unable to connect to any servers', {'192.168.61.2': error(111, "Tried connecting to [('192.168.61.2', 9042)]. Last error: Connection refused")})
+OK
+```
+
+**You SHALL wait until you HAVE the `OK` message in the logs!**
+
+```bash
+$ docker rm l2sim-db-init
+```
+
+At this point, you can prepare a capture on the newly-created public docker bridge:
+
+```bash
+$ ifconfig l2sim-net
+ inet 192.168.61.1 netmask 255.255.255.192 broadcast 192.168.61.63
+ inet6 fe80::42:aff:fe1e:e5dd prefixlen 64 scopeid 0x20
+ ether 02:42:0a:1e:e5:dd txqueuelen 0 (Ethernet)
+ RX packets 7 bytes 196 (196.0 B)
+ RX errors 0 dropped 0 overruns 0 frame 0
+ TX packets 5 bytes 446 (446.0 B)
+ TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
+$ sudo tshark -i l2sim-net -f 'port 3868 or port 2123 or port 36412 or port 36422 or port 46520 or port 8805' -w /tmp/my-oai-control-plane.pcap
+```
+
+**BE CAREFUL: please use that filter or you will also capture the data-plane with IQ samples between `eNB` and `LTE-UE`.**
+
+**and your capture WILL become huge (10s of Gbytes).**
+
+## 2.2. Deploy OAI CN4G containers ##
+
+```bash
+$ docker-compose -f docker-compose-01-users-epc.yml up -d oai_mme oai_spgwu trf_gen
+l2sim-cassandra is up-to-date
+Creating l2sim-trf-gen ... done
+Creating l2sim-oai-hss ... done
+Creating l2sim-oai-mme ... done
+Creating l2sim-oai-spgwc ... done
+Creating l2sim-oai-spgwu-tiny ... done
+```
+
+You shall wait until all containers are `healthy`. About 10 seconds!
+
+```bash
+$ docker-compose -f docker-compose-01-users-epc.yml ps -a
+ Name Command State Ports
+-----------------------------------------------------------------------------------------------------------------------
+l2sim-cassandra docker-entrypoint.sh cassa ... Up (healthy) 7000/tcp, 7001/tcp, 7199/tcp, 9042/tcp, 9160/tcp
+l2sim-oai-hss /openair-hss/bin/entrypoin ... Up (healthy) 5868/tcp, 9042/tcp, 9080/tcp, 9081/tcp
+l2sim-oai-mme /openair-mme/bin/entrypoin ... Up (healthy) 2123/udp, 3870/tcp, 5870/tcp
+l2sim-oai-spgwc /openair-spgwc/bin/entrypo ... Up (healthy) 2123/udp, 8805/udp
+l2sim-oai-spgwu-tiny /openair-spgwu-tiny/bin/en ... Up (healthy) 2152/udp, 8805/udp
+l2sim-trf-gen /bin/bash -c ip route add ... Up (healthy)
+```
+
+## 2.3. Deploy OAI eNB in VNF L2 nFAPI emulator mode ##
+
+```bash
+$ docker-compose -f docker-compose-01-users-epc.yml up -d enb_vnf_nfapi
+Creating l2sim-enb-vnf ... done
+```
+
+Again wait for the healthy state:
+
+```bash
+$ docker-compose -f docker-compose-01-users-epc.yml ps -a
+ Name Command State Ports
+-----------------------------------------------------------------------------------------------------------------------
+l2sim-cassandra docker-entrypoint.sh cassa ... Up (healthy) 7000/tcp, 7001/tcp, 7199/tcp, 9042/tcp, 9160/tcp
+l2sim-enb-vnf /opt/oai-enb/bin/entrypoin ... Up (healthy) 2152/udp, 36412/udp, 36422/udp
+l2sim-oai-hss /openair-hss/bin/entrypoin ... Up (healthy) 5868/tcp, 9042/tcp, 9080/tcp, 9081/tcp
+l2sim-oai-mme /openair-mme/bin/entrypoin ... Up (healthy) 2123/udp, 3870/tcp, 5870/tcp
+l2sim-oai-spgwc /openair-spgwc/bin/entrypo ... Up (healthy) 2123/udp, 8805/udp
+l2sim-oai-spgwu-tiny /openair-spgwu-tiny/bin/en ... Up (healthy) 2152/udp, 8805/udp
+l2sim-trf-gen /bin/bash -c ip route add ... Up (healthy)
+```
+
+Check if the eNB connected to MME:
+
+```bash
+$ docker logs rfsim4g-oai-mme
+...
+DEBUG MME-AP src/mme_app/mme_app_statistics.c:0039 ======================================= STATISTICS ============================================
+
+DEBUG MME-AP src/mme_app/mme_app_statistics.c:0042 | Current Status| Added since last display| Removed since last display |
+DEBUG MME-AP src/mme_app/mme_app_statistics.c:0048 Connected eNBs | 0 | 0 | 0 |
+DEBUG MME-AP src/mme_app/mme_app_statistics.c:0054 Attached UEs | 0 | 0 | 0 |
+DEBUG MME-AP src/mme_app/mme_app_statistics.c:0060 Connected UEs | 0 | 0 | 0 |
+DEBUG MME-AP src/mme_app/mme_app_statistics.c:0066 Default Bearers| 0 | 0 | 0 |
+DEBUG MME-AP src/mme_app/mme_app_statistics.c:0072 S1-U Bearers | 0 | 0 | 0 |
+
+DEBUG MME-AP src/mme_app/mme_app_statistics.c:0075 ======================================= STATISTICS ============================================
+
+DEBUG SCTP rc/sctp/sctp_primitives_server.c:0469 Client association changed: 0
+DEBUG SCTP enair-mme/src/sctp/sctp_common.c:0101 ----------------------
+DEBUG SCTP enair-mme/src/sctp/sctp_common.c:0102 SCTP Status:
+DEBUG SCTP enair-mme/src/sctp/sctp_common.c:0103 assoc id .....: 675
+DEBUG SCTP enair-mme/src/sctp/sctp_common.c:0104 state ........: 4
+DEBUG SCTP enair-mme/src/sctp/sctp_common.c:0105 instrms ......: 2
+DEBUG SCTP enair-mme/src/sctp/sctp_common.c:0106 outstrms .....: 2
+DEBUG SCTP enair-mme/src/sctp/sctp_common.c:0108 fragmentation : 1452
+DEBUG SCTP enair-mme/src/sctp/sctp_common.c:0109 pending data .: 0
+DEBUG SCTP enair-mme/src/sctp/sctp_common.c:0110 unack data ...: 0
+DEBUG SCTP enair-mme/src/sctp/sctp_common.c:0111 rwnd .........: 106496
+DEBUG SCTP enair-mme/src/sctp/sctp_common.c:0112 peer info :
+DEBUG SCTP enair-mme/src/sctp/sctp_common.c:0114 state ....: 2
+DEBUG SCTP enair-mme/src/sctp/sctp_common.c:0116 cwnd .....: 4380
+DEBUG SCTP enair-mme/src/sctp/sctp_common.c:0118 srtt .....: 0
+DEBUG SCTP enair-mme/src/sctp/sctp_common.c:0120 rto ......: 3000
+DEBUG SCTP enair-mme/src/sctp/sctp_common.c:0122 mtu ......: 1500
+DEBUG SCTP enair-mme/src/sctp/sctp_common.c:0123 ----------------------
+DEBUG SCTP rc/sctp/sctp_primitives_server.c:0479 New connection
+DEBUG SCTP enair-mme/src/sctp/sctp_common.c:0205 ----------------------
+DEBUG SCTP enair-mme/src/sctp/sctp_common.c:0206 Local addresses:
+DEBUG SCTP enair-mme/src/sctp/sctp_common.c:0217 - [192.168.61.4]
+DEBUG SCTP enair-mme/src/sctp/sctp_common.c:0234 ----------------------
+DEBUG SCTP enair-mme/src/sctp/sctp_common.c:0151 ----------------------
+DEBUG SCTP enair-mme/src/sctp/sctp_common.c:0152 Peer addresses:
+DEBUG SCTP enair-mme/src/sctp/sctp_common.c:0163 - [192.168.61.20]
+DEBUG SCTP enair-mme/src/sctp/sctp_common.c:0178 ----------------------
+DEBUG SCTP rc/sctp/sctp_primitives_server.c:0554 SCTP RETURNING!!
+DEBUG SCTP rc/sctp/sctp_primitives_server.c:0547 [675][44] Msg of length 51 received from port 36412, on stream 0, PPID 18
+DEBUG SCTP rc/sctp/sctp_primitives_server.c:0554 SCTP RETURNING!!
+DEBUG S1AP mme/src/s1ap/s1ap_mme_handlers.c:2826 Create eNB context for assoc_id: 675
+DEBUG S1AP mme/src/s1ap/s1ap_mme_handlers.c:0361 S1-Setup-Request macroENB_ID.size 3 (should be 20)
+DEBUG S1AP mme/src/s1ap/s1ap_mme_handlers.c:0321 New s1 setup request incoming from macro eNB id: 00e01
+DEBUG S1AP mme/src/s1ap/s1ap_mme_handlers.c:0423 Adding eNB to the list of served eNBs
+DEBUG S1AP mme/src/s1ap/s1ap_mme_handlers.c:0438 Adding eNB id 3585 to the list of served eNBs
+DEBUG SCTP rc/sctp/sctp_primitives_server.c:0283 [44][675] Sending buffer 0x7f9394009f90 of 27 bytes on stream 0 with ppid 18
+DEBUG SCTP rc/sctp/sctp_primitives_server.c:0296 Successfully sent 27 bytes on stream 0
+DEBUG MME-AP src/mme_app/mme_app_statistics.c:0039 ======================================= STATISTICS ============================================
+
+DEBUG MME-AP src/mme_app/mme_app_statistics.c:0042 | Current Status| Added since last display| Removed since last display |
+DEBUG MME-AP src/mme_app/mme_app_statistics.c:0048 Connected eNBs | 1 | 1 | 0 |
+DEBUG MME-AP src/mme_app/mme_app_statistics.c:0054 Attached UEs | 0 | 0 | 0 |
+DEBUG MME-AP src/mme_app/mme_app_statistics.c:0060 Connected UEs | 0 | 0 | 0 |
+DEBUG MME-AP src/mme_app/mme_app_statistics.c:0066 Default Bearers| 0 | 0 | 0 |
+DEBUG MME-AP src/mme_app/mme_app_statistics.c:0072 S1-U Bearers | 0 | 0 | 0 |
+
+DEBUG MME-AP src/mme_app/mme_app_statistics.c:0075 ======================================= STATISTICS ============================================
+...
+```
+
+## 2.4. Deploy the VNF Proxy container ##
+
+```bash
+$ docker-compose -f docker-compose-01-users-epc.yml up -d proxy_pnf_nfapi
+Creating l2sim-proxy-pnf ... done
+```
+
+Again wait for the healthy state:
+
+```bash
+$ docker-compose -f docker-compose-01-users-epc.yml ps -a
+ Name Command State Ports
+-----------------------------------------------------------------------------------------------------------------------
+l2sim-cassandra docker-entrypoint.sh cassa ... Up (healthy) 7000/tcp, 7001/tcp, 7199/tcp, 9042/tcp, 9160/tcp
+l2sim-enb-vnf /opt/oai-enb/bin/entrypoin ... Up (healthy) 2152/udp, 36412/udp, 36422/udp
+l2sim-oai-hss /openair-hss/bin/entrypoin ... Up (healthy) 5868/tcp, 9042/tcp, 9080/tcp, 9081/tcp
+l2sim-oai-mme /openair-mme/bin/entrypoin ... Up (healthy) 2123/udp, 3870/tcp, 5870/tcp
+l2sim-oai-spgwc /openair-spgwc/bin/entrypo ... Up (healthy) 2123/udp, 8805/udp
+l2sim-oai-spgwu-tiny /openair-spgwu-tiny/bin/en ... Up (healthy) 2152/udp, 8805/udp
+l2sim-proxy-pnf /bin/bash -c /oai-lte-mult ... Up (healthy)
+l2sim-trf-gen /bin/bash -c ip route add ... Up (healthy)
+```
+
+## 2.5. Deploy OAI LTE UE in VNF L2-NFAPI emulator mode ##
+
+```bash
+$ docker-compose -f docker-compose-01-users-epc.yml up -d oai_ue_l2_sim0
+Creating l2sim-oai-ue0 ... done
+```
+
+Last wait for the healthy state:
+
+```bash
+$ docker-compose -f docker-compose-01-users-epc.yml ps -a
+ Name Command State Ports
+-----------------------------------------------------------------------------------------------------------------------
+l2sim-cassandra docker-entrypoint.sh cassa ... Up (healthy) 7000/tcp, 7001/tcp, 7199/tcp, 9042/tcp, 9160/tcp
+l2sim-enb-vnf /opt/oai-enb/bin/entrypoin ... Up (healthy) 2152/udp, 36412/udp, 36422/udp
+l2sim-oai-hss /openair-hss/bin/entrypoin ... Up (healthy) 5868/tcp, 9042/tcp, 9080/tcp, 9081/tcp
+l2sim-oai-mme /openair-mme/bin/entrypoin ... Up (healthy) 2123/udp, 3870/tcp, 5870/tcp
+l2sim-oai-spgwc /openair-spgwc/bin/entrypo ... Up (healthy) 2123/udp, 8805/udp
+l2sim-oai-spgwu-tiny /openair-spgwu-tiny/bin/en ... Up (healthy) 2152/udp, 8805/udp
+l2sim-oai-ue0 /opt/oai-lte-ue/bin/entryp ... Up (healthy)
+l2sim-proxy-pnf /bin/bash -c /oai-lte-mult ... Up (healthy)
+l2sim-trf-gen /bin/bash -c ip route add ... Up (healthy)
+```
+
+Making sure the OAI UE is connected:
+
+On the LTE UE:
+
+```bash
+$ docker exec l2sim-oai-ue0 /bin/bash -c "ifconfig"
+eth0: flags=4163 mtu 1500
+ inet 192.168.61.30 netmask 255.255.255.192 broadcast 192.168.61.63
+ ether 02:42:c0:a8:3d:1e txqueuelen 0 (Ethernet)
+ RX packets 81385 bytes 4809459 (4.8 MB)
+ RX errors 0 dropped 0 overruns 0 frame 0
+ TX packets 61628 bytes 3213169 (3.2 MB)
+ TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
+
+lo: flags=73 mtu 65536
+ inet 127.0.0.1 netmask 255.0.0.0
+ loop txqueuelen 1000 (Local Loopback)
+ RX packets 0 bytes 0 (0.0 B)
+ RX errors 0 dropped 0 overruns 0 frame 0
+ TX packets 0 bytes 0 (0.0 B)
+ TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
+
+oaitun_ue1: flags=4305 mtu 1500
+ inet 12.1.1.2 netmask 255.0.0.0 destination 12.1.1.2
+ unspec 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00 txqueuelen 500 (UNSPEC)
+ RX packets 0 bytes 0 (0.0 B)
+ RX errors 0 dropped 0 overruns 0 frame 0
+ TX packets 0 bytes 0 (0.0 B)
+ TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
+```
+
+The tunnel `oaitun_ue1` SHALL be mounted and with an IP address in the `12.1.1.xxx` range.
+
+# 3. Check traffic #
+
+```bash
+$ docker exec l2sim-oai-ue0 /bin/bash -c "ping -c 2 www.lemonde.fr"
+PING s2.shared.global.fastly.net (151.101.122.217) 56(84) bytes of data.
+64 bytes from 151.101.122.217 (151.101.122.217): icmp_seq=1 ttl=54 time=12.9 ms
+64 bytes from 151.101.122.217 (151.101.122.217): icmp_seq=2 ttl=54 time=12.9 ms
+
+--- s2.shared.global.fastly.net ping statistics ---
+2 packets transmitted, 2 received, 0% packet loss, time 1001ms
+rtt min/avg/max/mdev = 12.948/12.966/12.985/0.115 ms
+$ docker exec l2sim-oai-ue0 /bin/bash -c "ping -I oaitun_ue1 -c 2 www.lemonde.fr"
+PING s2.shared.global.fastly.net (151.101.122.217) from 12.1.1.2 oaitun_ue1: 56(84) bytes of data.
+64 bytes from 151.101.122.217 (151.101.122.217): icmp_seq=1 ttl=53 time=42.2 ms
+64 bytes from 151.101.122.217 (151.101.122.217): icmp_seq=2 ttl=53 time=28.2 ms
+
+--- s2.shared.global.fastly.net ping statistics ---
+2 packets transmitted, 2 received, 0% packet loss, time 1001ms
+rtt min/avg/max/mdev = 28.279/35.262/42.245/6.983 ms
+```
+
+The 1st ping command is NOT using the OAI stack. My network infrastructure has a response of `13 ms` to reach this website.
+
+The 2nd ping command is using the OAI stack. So the stack takes `35.2 - 12.9 = 22.9 ms`.
+
+# 4. Un-deployment #
+
+```bash
+$ docker-compose -f docker-compose-01-users-epc.yml down
+Stopping l2sim-oai-ue0 ... done
+Stopping l2sim-proxy-pnf ... done
+Stopping l2sim-enb-vnf ... done
+Stopping l2sim-oai-spgwu-tiny ... done
+Stopping l2sim-oai-spgwc ... done
+Stopping l2sim-oai-mme ... done
+Stopping l2sim-oai-hss ... done
+Stopping l2sim-trf-gen ... done
+Stopping l2sim-cassandra ... done
+Removing l2sim-oai-ue0 ... done
+Removing l2sim-proxy-pnf ... done
+Removing l2sim-enb-vnf ... done
+Removing l2sim-oai-spgwu-tiny ... done
+Removing l2sim-oai-spgwc ... done
+Removing l2sim-oai-mme ... done
+Removing l2sim-oai-hss ... done
+Removing l2sim-trf-gen ... done
+Removing l2sim-cassandra ... done
+Removing network l2sim-net
+```
diff --git a/ci-scripts/yaml_files/l2_episys_proxy/docker-compose-01-users-epc.yml b/ci-scripts/yaml_files/l2_episys_proxy/docker-compose-01-users-epc.yml
new file mode 100644
index 0000000000000000000000000000000000000000..6334a211525529f8ff28b8cabcddacc41155a91c
--- /dev/null
+++ b/ci-scripts/yaml_files/l2_episys_proxy/docker-compose-01-users-epc.yml
@@ -0,0 +1,275 @@
+version: '3.8'
+
+services:
+ cassandra:
+ image: cassandra:2.1
+ container_name: l2sim-cassandra
+ networks:
+ public_net:
+ ipv4_address: 192.168.61.2
+ environment:
+ CASSANDRA_CLUSTER_NAME: "OAI HSS Cluster"
+ CASSANDRA_ENDPOINT_SNITCH: GossipingPropertyFileSnitch
+ healthcheck:
+ test: /bin/bash -c "nodetool status"
+ interval: 10s
+ timeout: 5s
+ retries: 5
+
+ db_init:
+ image: cassandra:2.1
+ container_name: l2sim-db-init
+ depends_on: [cassandra]
+ deploy:
+ restart_policy:
+ condition: on-failure
+ max_attempts: 10
+ networks:
+ public_net:
+ ipv4_address: 192.168.61.40
+ volumes:
+ - ./oai_db.cql:/home/oai_db.cql
+ entrypoint: /bin/bash -c "cqlsh --file /home/oai_db.cql 192.168.61.2 && echo 'OK'"
+
+ oai_hss:
+ image: oai-hss:latest
+ container_name: l2sim-oai-hss
+ privileged: true
+ depends_on: [cassandra]
+ networks:
+ public_net:
+ ipv4_address: 192.168.61.3
+ environment:
+ REALM: openairinterface.org
+ HSS_FQDN: hss.openairinterface.org
+ PREFIX: /openair-hss/etc
+ cassandra_Server_IP: 192.168.61.2
+ OP_KEY: 1006220f3a478bf6b699f15c062e42b3
+ LTE_K: 8baf473f2f8fd09487cccbd7097c6862
+ APN1: oai.ipv4
+ APN2: internet
+ FIRST_IMSI: 208930100001110
+ NB_USERS: 10
+ healthcheck:
+ test: /bin/bash -c "pgrep oai_hss"
+ interval: 10s
+ timeout: 5s
+ retries: 5
+
+ oai_mme:
+ image: oai-mme:latest
+ container_name: l2sim-oai-mme
+ privileged: true
+ depends_on: [oai_hss]
+ networks:
+ public_net:
+ ipv4_address: 192.168.61.4
+ environment:
+ REALM: openairinterface.org
+ PREFIX: /openair-mme/etc
+ INSTANCE: 1
+ PID_DIRECTORY: /var/run
+ HSS_IP_ADDR: 192.168.61.3
+ HSS_HOSTNAME: hss
+ HSS_FQDN: hss.openairinterface.org
+ HSS_REALM: openairinterface.org
+ MCC: '208'
+ MNC: '93'
+ MME_GID: 32768
+ MME_CODE: 3
+ TAC_0: 1
+ TAC_1: 2
+ TAC_2: 3
+ MME_FQDN: mme.openairinterface.org
+ MME_S6A_IP_ADDR: 192.168.61.4
+ MME_INTERFACE_NAME_FOR_S1_MME: eth0
+ MME_IPV4_ADDRESS_FOR_S1_MME: 192.168.61.4
+ MME_INTERFACE_NAME_FOR_S11: eth0
+ MME_IPV4_ADDRESS_FOR_S11: 192.168.61.4
+ MME_INTERFACE_NAME_FOR_S10: lo
+ MME_IPV4_ADDRESS_FOR_S10: 127.0.0.10
+ OUTPUT: CONSOLE
+ SGW_IPV4_ADDRESS_FOR_S11_0: 192.168.61.5
+ PEER_MME_IPV4_ADDRESS_FOR_S10_0: 0.0.0.0
+ PEER_MME_IPV4_ADDRESS_FOR_S10_1: 0.0.0.0
+ MCC_SGW_0: '208'
+ MNC3_SGW_0: '093'
+ TAC_LB_SGW_0: '01'
+ TAC_HB_SGW_0: '00'
+ MCC_MME_0: '208'
+ MNC3_MME_0: '093'
+ TAC_LB_MME_0: '02'
+ TAC_HB_MME_0: '00'
+ MCC_MME_1: '208'
+ MNC3_MME_1: '093'
+ TAC_LB_MME_1: '03'
+ TAC_HB_MME_1: '00'
+ TAC_LB_SGW_TEST_0: '03'
+ TAC_HB_SGW_TEST_0: '00'
+ SGW_IPV4_ADDRESS_FOR_S11_TEST_0: 0.0.0.0
+ healthcheck:
+ test: /bin/bash -c "pgrep oai_mme"
+ interval: 10s
+ timeout: 5s
+ retries: 5
+
+ oai_spgwc:
+ image: oai-spgwc:latest
+ privileged: true
+ depends_on: [oai_mme]
+ container_name: l2sim-oai-spgwc
+ networks:
+ public_net:
+ ipv4_address: 192.168.61.5
+ environment:
+ TZ: Europe/Paris
+ SGW_INTERFACE_NAME_FOR_S11: eth0
+ PGW_INTERFACE_NAME_FOR_SX: eth0
+ DEFAULT_DNS_IPV4_ADDRESS: 192.168.18.129
+ DEFAULT_DNS_SEC_IPV4_ADDRESS: 8.8.4.4
+ PUSH_PROTOCOL_OPTION: 'true'
+ APN_NI_1: oai.ipv4
+ APN_NI_2: oai2.ipv4
+ DEFAULT_APN_NI_1: oai.ipv4
+ UE_IP_ADDRESS_POOL_1: '12.1.1.2 - 12.1.1.254'
+ UE_IP_ADDRESS_POOL_2: '12.0.0.2 - 12.0.0.254'
+ MCC: '208'
+ MNC: '93'
+ MNC03: '093'
+ TAC: 1
+ GW_ID: 1
+ REALM: openairinterface.org
+ healthcheck:
+ test: /bin/bash -c "pgrep oai_spgwc"
+ interval: 10s
+ timeout: 5s
+ retries: 5
+
+ oai_spgwu:
+ image: oai-spgwu-tiny:latest
+ privileged: true
+ container_name: l2sim-oai-spgwu-tiny
+ depends_on: [oai_spgwc]
+ networks:
+ public_net:
+ ipv4_address: 192.168.61.6
+ environment:
+ TZ: Europe/Paris
+ PID_DIRECTORY: /var/run
+ INSTANCE: 1
+ SGW_INTERFACE_NAME_FOR_S1U_S12_S4_UP: eth0
+ PGW_INTERFACE_NAME_FOR_SGI: eth0
+ SGW_INTERFACE_NAME_FOR_SX: eth0
+ SPGWC0_IP_ADDRESS: 192.168.61.5
+ NETWORK_UE_IP: '12.1.1.0/24'
+ NETWORK_UE_NAT_OPTION: 'yes'
+ MCC: '208'
+ MNC: '93'
+ MNC03: '093'
+ TAC: 1
+ GW_ID: 1
+ REALM: openairinterface.org
+ healthcheck:
+ test: /bin/bash -c "pgrep oai_spgwu"
+ interval: 10s
+ timeout: 5s
+ retries: 5
+
+ trf_gen:
+ image: trf-gen:production
+ privileged: true
+ container_name: l2sim-trf-gen
+ networks:
+ public_net:
+ ipv4_address: 192.168.61.10
+ entrypoint: /bin/bash -c "ip route add 12.1.1.0/24 via 192.168.61.6 dev eth0; sleep infinity"
+ healthcheck:
+ test: /bin/bash -c "ping -c 2 192.168.61.6"
+ interval: 10s
+ timeout: 5s
+ retries: 5
+
+ enb_vnf_nfapi:
+ image: oai-enb:develop
+ privileged: true
+ container_name: l2sim-enb-vnf
+ environment:
+ USE_FDD_FAPI_RCC: 'yes'
+ ENB_NAME: vnf-in-docker
+ MCC: '208'
+ MNC: '93'
+ MNC_LENGTH: 2
+ TAC: 1
+ UTRA_BAND_ID: 7
+ DL_FREQUENCY_IN_MHZ: 2680
+ UL_FREQUENCY_OFFSET_IN_MHZ: 120
+ NID_CELL: 10
+ NB_PRB: 25
+ MME_S1C_IP_ADDRESS: 192.168.61.4
+ F1_CU_IP_ADDRESS: 192.168.61.20
+ S1C_IF_NAME: eth0
+ S1U_IF_NAME: eth0
+ F1_IF_NAME: eth0
+ F1_DU_IP_ADDRESS: 192.168.61.25
+ networks:
+ public_net:
+ ipv4_address: 192.168.61.20
+ healthcheck:
+ test: /bin/bash -c "pgrep lte-softmodem"
+ interval: 10s
+ timeout: 5s
+ retries: 5
+
+ proxy_pnf_nfapi:
+ image: oai-lte-multi-ue-proxy:latest
+ privileged: true
+ container_name: l2sim-proxy-pnf
+ environment:
+ NUM_UES: 1
+ ENB_IP_ADDRESS: 192.168.61.20
+ PROXY_IP_ADDRESS: 192.168.61.25
+ UE_IP_ADDRESS: 192.168.61.30
+ networks:
+ public_net:
+ ipv4_address: 192.168.61.25
+ entrypoint: /bin/bash -c "/oai-lte-multi-ue-proxy/bin/proxy 1 192.168.61.20 192.168.61.25 192.168.61.30"
+ healthcheck:
+ test: /bin/bash -c "pgrep proxy"
+ interval: 10s
+ timeout: 5s
+ retries: 5
+
+ oai_ue_l2_sim0:
+ image: oai-lte-ue:develop
+ privileged: true
+ container_name: l2sim-oai-ue0
+ environment:
+ USE_NFAPI: 'yes'
+ UE_NFAPI_IF_NAME: eth0
+ ENB_IP_ADDRESS: 192.168.61.25
+ LTE_UE_IP_ADDRESS: 192.168.61.30
+ MCC: '208'
+ MNC: '93'
+ SHORT_IMSI: '0100001111'
+ LTE_KEY: '8baf473f2f8fd09487cccbd7097c6862'
+ OPC: 'd52e6f6544c4c78b945dca2d3af26890'
+ MSISDN: '33611123456'
+ HPLMN: '20893'
+ USE_ADDITIONAL_OPTIONS: --L2-emul 5 --num-ues 1 --nokrnmod 1 --node-number 2
+ networks:
+ public_net:
+ ipv4_address: 192.168.61.30
+ healthcheck:
+ test: /bin/bash -c "pgrep lte-uesoftmodem"
+ interval: 10s
+ timeout: 5s
+ retries: 5
+
+networks:
+ public_net:
+ name: l2sim-net
+ ipam:
+ config:
+ - subnet: 192.168.61.0/26
+ driver_opts:
+ com.docker.network.bridge.name: "l2sim-net"
diff --git a/ci-scripts/yaml_files/l2_episys_proxy/docker-compose-01-users-no-s1.yml b/ci-scripts/yaml_files/l2_episys_proxy/docker-compose-01-users-no-s1.yml
new file mode 100644
index 0000000000000000000000000000000000000000..0feeee5fbabf92000553fcb1cb2800103f424fd8
--- /dev/null
+++ b/ci-scripts/yaml_files/l2_episys_proxy/docker-compose-01-users-no-s1.yml
@@ -0,0 +1,88 @@
+version: '3.8'
+
+services:
+ enb_vnf_nfapi:
+ image: oai-enb:develop
+ privileged: true
+ container_name: l2sim-enb-vnf
+ environment:
+ USE_FDD_FAPI_RCC: 'yes'
+ ENB_NAME: vnf-in-docker
+ MCC: '208'
+ MNC: '93'
+ MNC_LENGTH: 2
+ TAC: 1
+ UTRA_BAND_ID: 7
+ DL_FREQUENCY_IN_MHZ: 2680
+ UL_FREQUENCY_OFFSET_IN_MHZ: 120
+ NID_CELL: 10
+ NB_PRB: 25
+ MME_S1C_IP_ADDRESS: 192.168.61.4
+ F1_CU_IP_ADDRESS: 192.168.61.20
+ S1C_IF_NAME: eth0
+ S1U_IF_NAME: eth0
+ F1_IF_NAME: eth0
+ F1_DU_IP_ADDRESS: 192.168.61.25
+ USE_ADDITIONAL_OPTIONS: '--noS1'
+ networks:
+ public_net:
+ ipv4_address: 192.168.61.20
+ healthcheck:
+ test: /bin/bash -c "pgrep lte-softmodem"
+ interval: 10s
+ timeout: 5s
+ retries: 5
+
+ proxy_pnf_nfapi:
+ image: oai-lte-multi-ue-proxy:latest
+ privileged: true
+ container_name: l2sim-proxy-pnf
+ environment:
+ NUM_UES: 1
+ ENB_IP_ADDRESS: 192.168.61.20
+ PROXY_IP_ADDRESS: 192.168.61.25
+ UE_IP_ADDRESS: 192.168.61.30
+ networks:
+ public_net:
+ ipv4_address: 192.168.61.25
+ entrypoint: /bin/bash -c "/oai-lte-multi-ue-proxy/bin/proxy 1 192.168.61.20 192.168.61.25 192.168.61.30"
+ healthcheck:
+ test: /bin/bash -c "pgrep proxy"
+ interval: 10s
+ timeout: 5s
+ retries: 5
+
+ oai_ue_l2_sim0:
+ image: oai-lte-ue:develop
+ privileged: true
+ container_name: l2sim-oai-ue0
+ environment:
+ USE_NFAPI: 'yes'
+ UE_NFAPI_IF_NAME: eth0
+ ENB_IP_ADDRESS: 192.168.61.25
+ LTE_UE_IP_ADDRESS: 192.168.61.30
+ MCC: '208'
+ MNC: '93'
+ SHORT_IMSI: '0100001111'
+ LTE_KEY: '8baf473f2f8fd09487cccbd7097c6862'
+ OPC: 'd52e6f6544c4c78b945dca2d3af26890'
+ MSISDN: '33611123456'
+ HPLMN: '20893'
+ USE_ADDITIONAL_OPTIONS: --L2-emul 5 --num-ues 1 --nokrnmod 1 --node-number 2 --noS1
+ networks:
+ public_net:
+ ipv4_address: 192.168.61.30
+ healthcheck:
+ test: /bin/bash -c "pgrep lte-uesoftmodem"
+ interval: 10s
+ timeout: 5s
+ retries: 5
+
+networks:
+ public_net:
+ name: l2sim-net
+ ipam:
+ config:
+ - subnet: 192.168.61.0/26
+ driver_opts:
+ com.docker.network.bridge.name: "l2sim-net"
diff --git a/ci-scripts/yaml_files/l2_episys_proxy/oai_db.cql b/ci-scripts/yaml_files/l2_episys_proxy/oai_db.cql
new file mode 100644
index 0000000000000000000000000000000000000000..2be0a8e2e95a604801c47b7e39d4e39487273edf
--- /dev/null
+++ b/ci-scripts/yaml_files/l2_episys_proxy/oai_db.cql
@@ -0,0 +1,93 @@
+CREATE KEYSPACE IF NOT EXISTS vhss WITH replication = {'class': 'NetworkTopologyStrategy', 'DC1': '1'};
+
+CREATE TABLE IF NOT EXISTS vhss.users_imsi (
+ imsi text PRIMARY KEY,
+ access_restriction int,
+ idmmeidentity int,
+ imei text,
+ imei_sv text,
+ key text,
+ lipa_permissions text,
+ mme_cap int,
+ mmehost text,
+ mmeidentity_idmmeidentity int,
+ mmerealm text,
+ ms_ps_status text,
+ msisdn bigint,
+ niddvalidity text,
+ nir_dest_host text,
+ nir_dest_realm text,
+ opc text,
+ pgw_id int,
+ rand text,
+ rfsp_index varint,
+ sqn bigint,
+ subscription_data text,
+ ue_reachability varint,
+ urrp_mme varint,
+ user_identifier text,
+ visited_plmnid text);
+
+CREATE TABLE IF NOT EXISTS vhss.msisdn_imsi (
+ msisdn bigint PRIMARY KEY,
+ imsi text
+);
+
+CREATE TABLE IF NOT EXISTS vhss.global_ids (
+ table_name text PRIMARY KEY,
+ id counter);
+
+CREATE TABLE IF NOT EXISTS vhss.mmeidentity_host (
+ mmehost text PRIMARY KEY,
+ idmmeidentity int,
+ mmerealm text,
+ ue_reachability varint,
+ mmeisdn text);
+
+CREATE TABLE IF NOT EXISTS vhss.mmeidentity (
+ idmmeidentity int PRIMARY KEY,
+ mmehost text,
+ mmerealm text,
+ ue_reachability varint,
+ mmeisdn text);
+
+CREATE TABLE IF NOT EXISTS vhss.events (
+ scef_id text,
+ scef_ref_id bigint,
+ extid text,
+ monitoring_event_configuration text,
+ monitoring_type int,
+ msisdn bigint,
+ user_identifier text,
+ primary key (scef_id, scef_ref_id)
+);
+
+CREATE TABLE IF NOT EXISTS vhss.events_msisdn (
+ msisdn bigint,
+ scef_id text,
+ scef_ref_id bigint,
+ primary key (msisdn, scef_id, scef_ref_id)
+);
+
+CREATE TABLE IF NOT EXISTS vhss.events_extid (
+ extid text,
+ scef_id text,
+ scef_ref_id bigint,
+ primary key (extid, scef_id, scef_ref_id)
+);
+
+CREATE TABLE IF NOT EXISTS vhss.extid (
+ extid text primary key
+);
+
+CREATE TABLE IF NOT EXISTS vhss.extid_imsi (
+ extid text,
+ imsi text,
+ primary key (extid, imsi)
+);
+
+CREATE TABLE IF NOT EXISTS vhss.extid_imsi_xref (
+ imsi text,
+ extid text,
+ primary key (imsi, extid)
+);
diff --git a/cmake_targets/.gitignore b/cmake_targets/.gitignore
new file mode 100644
index 0000000000000000000000000000000000000000..4cd3e76fe0a936aa94549b58bb7565609ece1636
--- /dev/null
+++ b/cmake_targets/.gitignore
@@ -0,0 +1,4 @@
+.usim.*
+.ue_emm.nvram*
+.ue.nvram*
+*.log
diff --git a/cmake_targets/CMakeLists.txt b/cmake_targets/CMakeLists.txt
index 9592334125b9ab691503f036754ddacd8427c40e..f9f0316b556d1fd2703a976fdf4c666c0e2ada7e 100644
--- a/cmake_targets/CMakeLists.txt
+++ b/cmake_targets/CMakeLists.txt
@@ -2108,6 +2108,7 @@ set (MAC_NR_SRC
set (MAC_SRC_UE
${PHY_INTERFACE_DIR}/phy_stub_UE.c
+ ${PHY_INTERFACE_DIR}/queue.c
${MAC_DIR}/main_ue.c
${MAC_DIR}/ue_procedures.c
${MAC_DIR}/ra_procedures.c
diff --git a/cmake_targets/gdb-helper b/cmake_targets/gdb-helper
new file mode 100755
index 0000000000000000000000000000000000000000..fe85809c1095191b9ca9629231f190a1251225de
--- /dev/null
+++ b/cmake_targets/gdb-helper
@@ -0,0 +1,13 @@
+#!/bin/bash
+cd "$(dirname "$0")/.." || exit
+source oaienv
+cd cmake_targets || exit
+
+cmd=(
+ ./ran_build/build/lte-softmodem
+ -O ../ci-scripts/conf_files/rcc.band7.tm1.nfapi.conf
+ --noS1
+ "$@"
+)
+
+exec sudo -E gdb "$@" --args "${cmd[@]}"
diff --git a/cmake_targets/gdb.txt b/cmake_targets/gdb.txt
new file mode 100644
index 0000000000000000000000000000000000000000..54e47c27e98796a95ada666c9b16cd3b01fe6007
--- /dev/null
+++ b/cmake_targets/gdb.txt
@@ -0,0 +1,83 @@
+-------------------------------------------------------------------------------
+Build.
+
+Make sure you've built with debug info:
+
+ cd ~/openairinterface5g # or wherever
+ source oaienv
+ cd cmake_targets
+ ./build_oai --UE --eNB --verbose-compile --run-with-gdb RelWithDebInfo
+ make -C ran_build/build -j4 lte-softmodem lte-uesoftmodem
+
+-------------------------------------------------------------------------------
+Verify.
+
+Verify the build was done correctly:
+
+$ ./gdb-helper
+...
+Reading symbols from ./ran_build/build/lte-softmodem...done.
+(gdb) b main
+Breakpoint 1 at 0x59f110: file /local/episys/openairinterface5g/targets/RT/USER/lte-softmodem.c, line 516.
+(gdb) run
+Starting program: /local/episys/openairinterface5g/cmake_targets/ran_build/build/lte-softmodem -O ../ci-scripts/conf_files/rcc.band7.tm1.nfapi.conf --noS1
+[Thread debugging using libthread_db enabled]
+Using host libthread_db library "/lib/x86_64-linux-gnu/libthread_db.so.1".
+
+Breakpoint 1, main (argc=4, argv=0x7fffffffe058) at /local/episys/openairinterface5g/targets/RT/USER/lte-softmodem.c:516
+516 {
+(gdb) list
+511 pthread_mutex_unlock(&nfapi_sync_mutex);
+512 printf( "NFAPI: got sync (%s)\n", thread_name);
+513 }
+514
+515 int main ( int argc, char **argv )
+516 {
+517 struct sched_param param =
+518 {
+519 .sched_priority = 79
+520 };
+(gdb) n
+521 if (sched_setscheduler( 0, SCHED_RR, ¶m ) == -1 )
+(gdb) quit
+A debugging session is active.
+
+ Inferior 1 [process 19964] will be killed.
+
+Quit anyway? (y or n) y
+$
+
+If gdb says "no debugging symbols found" then clean your workspace and re-do
+the build as above.
+
+(gdb) b main
+
+-------------------------------------------------------------------------------
+Password-less sudo.
+
+Vscode launches lte-softmodem via sudo. Make sure sudo does not prompt you
+for a password:
+
+ sudo -n id
+
+If that command fails, do the following:
+
+ echo "$USER ALL=(ALL) NOPASSWD: ALL" | sudo tee -a /etc/sudoers
+
+Then verify:
+
+ sudo -n id
+
+-------------------------------------------------------------------------------
+Vscode.
+
+Launch Vscode:
+
+ cd ~/openairinterface5g # or wherever
+ code . targets/RT/USER/lte-softmodem.c .vscode/launch.json
+
+See launch.json for details about how vscode launches lte-softmodem for debugging.
+
+For example, in lte-softmodem.c, scroll to main() and click the line number to
+the left of main to add a breakpoint. then do Run => Start debugging (F5) to
+run lte-softmodem in the debugger
diff --git a/cmake_targets/nvram b/cmake_targets/nvram
new file mode 100755
index 0000000000000000000000000000000000000000..43cf1a9fbb1e494c59684040e4e510b35e38b6d4
Binary files /dev/null and b/cmake_targets/nvram differ
diff --git a/cmake_targets/sudo-gdb b/cmake_targets/sudo-gdb
new file mode 100755
index 0000000000000000000000000000000000000000..7c4005e19b38ebf0f28063943bf499b289cd368a
--- /dev/null
+++ b/cmake_targets/sudo-gdb
@@ -0,0 +1,6 @@
+#!/bin/bash
+# Helper script for Vscode. See .vscode/launch.json "miDebuggerPath"
+cd "$(dirname "$0")/.." || exit
+source oaienv
+cd cmake_targets || exit
+exec sudo -nE gdb "$@"
diff --git a/cmake_targets/usim b/cmake_targets/usim
new file mode 100755
index 0000000000000000000000000000000000000000..dcefd004d04b7452d436fb63b7297c3ae26eca93
Binary files /dev/null and b/cmake_targets/usim differ
diff --git a/common/utils/LOG/log.c b/common/utils/LOG/log.c
index d0a53a755b27ca807f5df975aa0f9f5c597446a0..da009d9ba0c80e79faf5d3d0885152775a2c3d67 100644
--- a/common/utils/LOG/log.c
+++ b/common/utils/LOG/log.c
@@ -43,6 +43,8 @@
#include
#include
#include "common/config/config_userapi.h"
+#include
+#include
// main log variables
@@ -506,6 +508,53 @@ char *log_getthreadname(char *threadname,
}
}
+#if LOG_MINIMAL
+#include
+void logMinimal(int comp, int level, const char *format, ...)
+{
+ struct timespec ts;
+ if (clock_gettime(CLOCK_MONOTONIC, &ts) == -1)
+ abort();
+
+ char buf[MAX_LOG_TOTAL];
+ int n = snprintf(buf, sizeof(buf), "%lu.%06lu %08lx [%s] %c ",
+ ts.tv_sec,
+ ts.tv_nsec / 1000,
+ syscall(__NR_gettid),
+ g_log->log_component[comp].name,
+ level);
+ if (n < 0 || n >= sizeof(buf))
+ {
+ fprintf(stderr, "%s: n=%d\n", __func__, n);
+ return;
+ }
+
+ va_list args;
+ va_start(args, format);
+ int m = vsnprintf(buf + n, sizeof(buf) - n, format, args);
+ va_end(args);
+
+ if (m < 0)
+ {
+ fprintf(stderr, "%s: n=%d m=%d\n", __func__, n, m);
+ return;
+ }
+
+ int len = n + m;
+ if (len > sizeof(buf) - 1)
+ {
+ len = sizeof(buf) - 1;
+ }
+ if (buf[len - 1] != '\n')
+ {
+ buf[len++] = '\n';
+ }
+
+ __attribute__((unused))
+ int unused = write(STDOUT_FILENO, buf, len);
+}
+#endif // LOG_MINIMAL
+
static int log_header(char *log_buffer,
int buffsize,
int comp,
@@ -513,14 +562,19 @@ static int log_header(char *log_buffer,
const char *format)
{
char threadname[PR_SET_NAME];
- return snprintf(log_buffer, buffsize, "%s%s[%s]%c %s %s%s",
- log_level_highlight_end[level],
- ( (g_log->flag & FLAG_NOCOLOR)?"":log_level_highlight_start[level]),
- g_log->log_component[comp].name,
- ( (g_log->flag & FLAG_LEVEL)?g_log->level2string[level]:' '),
- ( (g_log->flag & FLAG_THREAD)?log_getthreadname(threadname,PR_SET_NAME+1):""),
- format,
- log_level_highlight_end[level]);
+ struct timespec ts;
+ if (clock_gettime(CLOCK_MONOTONIC, &ts) == -1)
+ abort();
+ return snprintf(log_buffer, buffsize, "%lu.%06lu %s%s[%s]%c %s %s%s",
+ ts.tv_sec,
+ ts.tv_nsec / 1000,
+ log_level_highlight_end[level],
+ ( (g_log->flag & FLAG_NOCOLOR)?"":log_level_highlight_start[level]),
+ g_log->log_component[comp].name,
+ ( (g_log->flag & FLAG_LEVEL)?g_log->level2string[level]:' '),
+ ( (g_log->flag & FLAG_THREAD)?log_getthreadname(threadname,PR_SET_NAME+1):""),
+ format,
+ log_level_highlight_end[level]);
}
void logRecord_mt(const char *file,
diff --git a/common/utils/LOG/log.h b/common/utils/LOG/log.h
index fa95d5a6fee9436755a6c42207cf1a598985742b..3a650d994c28c427a4bddd0f5aa3bc1c9ccc1cc2 100644
--- a/common/utils/LOG/log.h
+++ b/common/utils/LOG/log.h
@@ -100,12 +100,21 @@ extern "C" {
/* .log_format = 0x13 uncolored standard messages
* .log_format = 0x93 colored standard messages */
/* keep white space in first position; switching it to 0 allows colors to be disabled*/
+#if LOG_WITH_COLORS
#define LOG_RED "\033[1;31m" /*!< \brief VT100 sequence for bold red foreground */
#define LOG_GREEN "\033[32m" /*!< \brief VT100 sequence for green foreground */
#define LOG_ORANGE "\033[93m" /*!< \brief VT100 sequence for orange foreground */
#define LOG_BLUE "\033[34m" /*!< \brief VT100 sequence for blue foreground */
#define LOG_CYBL "\033[40;36m" /*!< \brief VT100 sequence for cyan foreground on black background */
#define LOG_RESET "\033[0m" /*!< \brief VT100 sequence for reset (black) foreground */
+#else
+# define LOG_RED ""
+# define LOG_GREEN ""
+# define LOG_ORANGE ""
+# define LOG_BLUE ""
+# define LOG_CYBL ""
+# define LOG_RESET ""
+#endif // LOG_WITH_COLORS
/* @}*/
@@ -400,10 +409,32 @@ int32_t write_file_matlab(const char *fname, const char *vname, void *data, int
#define LOG_DUMP_DOUBLE 1
// debugging macros
#define LOG_F LOG_I /* because LOG_F was originaly to dump a message or buffer but is also used as a regular level...., to dump use LOG_DUMPMSG */
+
+#define LOG_MINIMAL 1 /* 1 for minimal logging: E, W and A */
+
+#if LOG_MINIMAL
+
+ void logMinimal(int component, int level, const char *format, ...) __attribute__((format(printf, 3, 4)));
+# define LOG_E(COMPONENT, ...) do if (1) logMinimal(COMPONENT, 'E', __VA_ARGS__); while (0)
+# define LOG_W(COMPONENT, ...) do if (1) logMinimal(COMPONENT, 'W', __VA_ARGS__); while (0)
+# define LOG_A(COMPONENT, ...) do if (1) logMinimal(COMPONENT, 'A', __VA_ARGS__); while (0) /* logs intended for analysis */
+# define LOG_I(COMPONENT, ...) do if (1) logMinimal(COMPONENT, 'I', __VA_ARGS__); while (0)
+# define LOG_D(COMPONENT, ...) do if (0) logMinimal(COMPONENT, 'D', __VA_ARGS__); while (0)
+# define LOG_T(COMPONENT, ...) do if (0) logMinimal(COMPONENT, 'T', __VA_ARGS__); while (0)
+
+# define LOG_M(FILE, VECTOR, DATA, LEN, DEC, FORMAT) ((void) 0)
+# define LOG_DUMPFLAG(D) 0
+# define LOG_DEBUGFLAG(D) 0
+# define LOG_DUMPMSG(C, B, S, X...) ((void) 0)
+# define VLOG(C, L, F, ARGS) ((void) 0)
+
+#else // LOG_MINIMAL
+
# if T_TRACER
/* per component, level dependent macros */
# define LOG_E(c, x...) do { if (T_stdout) { if( g_log->log_component[c].level >= OAILOG_ERR ) logRecord_mt(__FILE__, __FUNCTION__, __LINE__,c, OAILOG_ERR, x) ;} else { T(T_LEGACY_ ## c ## _ERROR, T_PRINTF(x)) ;}} while (0)
# define LOG_W(c, x...) do { if (T_stdout) { if( g_log->log_component[c].level >= OAILOG_WARNING) logRecord_mt(__FILE__, __FUNCTION__, __LINE__,c, OAILOG_WARNING, x) ;} else { T(T_LEGACY_ ## c ## _WARNING, T_PRINTF(x)) ;}} while (0)
+# define LOG_A LOG_I
# define LOG_I(c, x...) do { if (T_stdout) { if( g_log->log_component[c].level >= OAILOG_INFO ) logRecord_mt(__FILE__, __FUNCTION__, __LINE__,c, OAILOG_INFO, x) ;} else { T(T_LEGACY_ ## c ## _INFO, T_PRINTF(x)) ;}} while (0)
# define LOG_D(c, x...) do { if (T_stdout) { if( g_log->log_component[c].level >= OAILOG_DEBUG ) logRecord_mt(__FILE__, __FUNCTION__, __LINE__,c, OAILOG_DEBUG, x) ;} else { T(T_LEGACY_ ## c ## _DEBUG, T_PRINTF(x)) ;}} while (0)
# define LOG_T(c, x...) do { if (T_stdout) { if( g_log->log_component[c].level >= OAILOG_TRACE ) logRecord_mt(__FILE__, __FUNCTION__, __LINE__,c, OAILOG_TRACE, x) ;} else { T(T_LEGACY_ ## c ## _TRACE, T_PRINTF(x)) ;}} while (0)
@@ -423,6 +454,7 @@ int32_t write_file_matlab(const char *fname, const char *vname, void *data, int
# define LOG_E(c, x...) do { if( g_log->log_component[c].level >= OAILOG_ERR ) logRecord_mt(__FILE__, __FUNCTION__, __LINE__,c, OAILOG_ERR, x) ;} while (0)
# define LOG_W(c, x...) do { if( g_log->log_component[c].level >= OAILOG_WARNING) logRecord_mt(__FILE__, __FUNCTION__, __LINE__,c, OAILOG_WARNING, x) ;} while (0)
# define LOG_I(c, x...) do { if( g_log->log_component[c].level >= OAILOG_INFO ) logRecord_mt(__FILE__, __FUNCTION__, __LINE__,c, OAILOG_INFO, x) ;} while (0)
+# define LOG_A LOG_I
# define LOG_D(c, x...) do { if( g_log->log_component[c].level >= OAILOG_DEBUG ) logRecord_mt(__FILE__, __FUNCTION__, __LINE__,c, OAILOG_DEBUG, x) ;} while (0)
# define LOG_T(c, x...) do { if( g_log->log_component[c].level >= OAILOG_TRACE ) logRecord_mt(__FILE__, __FUNCTION__, __LINE__,c, OAILOG_TRACE, x) ;} while (0)
# define VLOG(c,l, f, args) do { if( g_log->log_component[c].level >= l ) vlogRecord_mt(__FILE__, __FUNCTION__, __LINE__,c, l, f, args) ; } while (0)
@@ -436,6 +468,8 @@ int32_t write_file_matlab(const char *fname, const char *vname, void *data, int
# define LOG_VAR(A,B) A B
# define T_ACTIVE(a) (0)
# endif /* T_TRACER */
+#endif // LOG_MINIMAL
+
/* avoid warnings for variables only used in LOG macro's but set outside debug section */
#define GCC_NOTUSED __attribute__((unused))
#define LOG_USEDINLOG_VAR(A,B) GCC_NOTUSED A B
diff --git a/common/utils/ocp_itti/intertask_interface.cpp b/common/utils/ocp_itti/intertask_interface.cpp
index 4e5323aec98c85d0c807ad195bbfa6ed4f022c8e..4239d1f42eaf59034acefb91608a0b0a7bdb3b7e 100644
--- a/common/utils/ocp_itti/intertask_interface.cpp
+++ b/common/utils/ocp_itti/intertask_interface.cpp
@@ -82,7 +82,7 @@ extern "C" {
void *itti_malloc(task_id_t origin_task_id, task_id_t destination_task_id, ssize_t size) {
void *ptr = NULL;
- AssertFatal ((ptr=calloc (size, 1)) != NULL, "Memory allocation of %zu bytes failed (%d -> %d)!\n",
+ AssertFatal ((ptr=calloc (1, size)) != NULL, "Memory allocation of %zu bytes failed (%d -> %d)!\n",
size, origin_task_id, destination_task_id);
return ptr;
}
@@ -438,9 +438,22 @@ extern "C" {
void itti_send_terminate_message(task_id_t task_id) {
}
+ static volatile bool shutting_down;
+
+ static void catch_sigterm(int) {
+ static const char msg[] = "\n** Caught SIGTERM, shutting down\n";
+ __attribute__((unused))
+ int unused = write(STDOUT_FILENO, msg, sizeof(msg) - 1);
+ shutting_down = true;
+ }
+
void itti_wait_tasks_end(void) {
- while(1)
- sleep(24*3600);
+ shutting_down = false;
+ signal(SIGTERM, catch_sigterm);
+ while (! shutting_down)
+ {
+ sleep(24 * 3600);
+ }
}
void itti_update_lte_time(uint32_t frame, uint8_t slot) {}
@@ -455,4 +468,42 @@ extern "C" {
int signal_mask(void) {
return 0;
}
+
+void log_scheduler(const char* label)
+{
+ int policy = sched_getscheduler(0);
+ struct sched_param param;
+ if (sched_getparam(0, ¶m) == -1)
+ {
+ LOG_E(HW, "sched_getparam: %s\n", strerror(errno));
+ abort();
+ }
+
+ cpu_set_t cpu_set;
+ if (sched_getaffinity(0, sizeof(cpu_set), &cpu_set) == -1)
+ {
+ LOG_E(HW, "sched_getaffinity: %s\n", strerror(errno));
+ abort();
+ }
+ int num_cpus = sysconf(_SC_NPROCESSORS_ONLN);
+ if (num_cpus < 1)
+ {
+ LOG_E(HW, "sysconf(_SC_NPROCESSORS_ONLN): %s\n", strerror(errno));
+ abort();
+ }
+ char buffer[num_cpus];
+ for (int i = 0; i < num_cpus; i++)
+ {
+ buffer[i] = CPU_ISSET(i, &cpu_set) ? 'Y' : '-';
+ }
+
+ LOG_A(HW, "Scheduler policy=%d priority=%d affinity=[%d]%.*s label=%s\n",
+ policy,
+ param.sched_priority,
+ num_cpus,
+ num_cpus,
+ buffer,
+ label);
}
+} // extern "C"
+
diff --git a/common/utils/ocp_itti/intertask_interface.h b/common/utils/ocp_itti/intertask_interface.h
index 7c17a6f3b12fe9d060b8fb3a9053d7c922ead83f..3e5408375ed3a79b759c9c485f726432776e3d43 100644
--- a/common/utils/ocp_itti/intertask_interface.h
+++ b/common/utils/ocp_itti/intertask_interface.h
@@ -362,6 +362,8 @@ typedef enum {
FOREACH_TASK(TASK_ENUM)
} task_id_t;
+extern uint16_t ue_idx_standalone;
+extern uint16_t node_number;
typedef task_id_t thread_id_t;
@@ -586,6 +588,7 @@ int timer_remove(long timer_id);
int signal_handle(int *end);
int signal_mask(void);
+void log_scheduler(const char *label);
#ifdef __cplusplus
}
#endif
diff --git a/executables/main-ocp.c b/executables/main-ocp.c
index 0355582b2b4e76848588cd22a580dd4577569ab0..0953feb28375ed9eeb9a3ccbffc5a6e118204e81 100644
--- a/executables/main-ocp.c
+++ b/executables/main-ocp.c
@@ -83,6 +83,7 @@ int32_t uplink_frequency_offset[MAX_NUM_CCs][4];
int split73;
char * split73_config;
int split73;
+uint16_t ue_idx_standalone = 0xFFFF;
AGENT_RRC_xface *agent_rrc_xface[NUM_MAX_ENB]= {0};
AGENT_MAC_xface *agent_mac_xface[NUM_MAX_ENB]= {0};
uint8_t proto_agent_flag = 0;
@@ -1044,7 +1045,7 @@ void init_pdcp(void) {
pdcp_initmask = pdcp_initmask | ENB_NAS_USE_TUN_W_MBMS_BIT;
if ( split73!=SPLIT73_DU)
- pdcp_module_init(pdcp_initmask);
+ pdcp_module_init(pdcp_initmask, 0);
if (NODE_IS_CU(RC.rrc[0]->node_type)) {
//pdcp_set_rlc_data_req_func((send_rlc_data_req_func_t)proto_agent_send_rlc_data_req);
@@ -1058,14 +1059,14 @@ void init_pdcp(void) {
}
static void wait_nfapi_init(char *thread_name) {
- printf( "waiting for NFAPI PNF connection and population of global structure (%s)\n",thread_name);
+ LOG_I(ENB_APP, "waiting for NFAPI PNF connection and population of global structure (%s)\n",thread_name);
pthread_mutex_lock( &nfapi_sync_mutex );
while (nfapi_sync_var<0)
pthread_cond_wait( &nfapi_sync_cond, &nfapi_sync_mutex );
pthread_mutex_unlock(&nfapi_sync_mutex);
- printf( "NFAPI: got sync (%s)\n", thread_name);
+ LOG_I(ENB_APP, "NFAPI: got sync (%s)\n", thread_name);
}
void terminate_task(module_id_t mod_id, task_id_t from, task_id_t to) {
diff --git a/executables/nr-softmodem.c b/executables/nr-softmodem.c
index 1b33667b1396811eaeaf23e3c68fa8bb40039bcf..785a0d91e30f598302ada64e9c78c961205e9222 100644
--- a/executables/nr-softmodem.c
+++ b/executables/nr-softmodem.c
@@ -622,7 +622,7 @@ void init_pdcp(void) {
pdcp_initmask = pdcp_initmask | ENB_NAS_USE_TUN_BIT | SOFTMODEM_NOKRNMOD_BIT;
}
- pdcp_module_init(pdcp_initmask);
+ pdcp_module_init(pdcp_initmask, 0);
if (NODE_IS_CU(RC.nrrrc[0]->node_type)) {
LOG_I(PDCP, "node is CU, pdcp send rlc_data_req by proto_agent \n");
diff --git a/executables/nr-uesoftmodem.c b/executables/nr-uesoftmodem.c
index 0af1de0833eafc3ac96d0a2da4c9c5bd793807b5..de23f73f562afd3a727b83e380c6a5475923728e 100644
--- a/executables/nr-uesoftmodem.c
+++ b/executables/nr-uesoftmodem.c
@@ -150,6 +150,7 @@ int transmission_mode = 1;
int numerology = 0;
int oaisim_flag = 0;
int emulate_rf = 0;
+uint16_t ue_idx_standalone = 0xFFFF;
uint32_t N_RB_DL = 106;
char uecap_xer_in = 0;
char uecap_xer[1024];
@@ -234,7 +235,7 @@ uint64_t set_nrUE_optmask(uint64_t bitmask) {
nrUE_params_t *get_nrUE_params(void) {
return &nrUE_params;
}
-/* initialie thread pools used for NRUE processing paralleliation */
+/* initialie thread pools used for NRUE processing paralleliation */
void init_tpools(uint8_t nun_dlsch_threads) {
char *params = NULL;
if (IS_SOFTMODEM_RFSIM) {
@@ -284,18 +285,18 @@ void set_options(int CC_id, PHY_VARS_NR_UE *UE){
int pindex = config_paramidx_fromname(cmdline_params,numparams, CALIBRX_OPT);
if ( (cmdline_params[pindex].paramflags & PARAMFLAG_PARAMSET) != 0) UE->mode = rx_calib_ue;
-
+
pindex = config_paramidx_fromname(cmdline_params,numparams, CALIBRXMED_OPT);
if ( (cmdline_params[pindex].paramflags & PARAMFLAG_PARAMSET) != 0) UE->mode = rx_calib_ue_med;
- pindex = config_paramidx_fromname(cmdline_params,numparams, CALIBRXBYP_OPT);
+ pindex = config_paramidx_fromname(cmdline_params,numparams, CALIBRXBYP_OPT);
if ( (cmdline_params[pindex].paramflags & PARAMFLAG_PARAMSET) != 0) UE->mode = rx_calib_ue_byp;
- pindex = config_paramidx_fromname(cmdline_params,numparams, DBGPRACH_OPT);
+ pindex = config_paramidx_fromname(cmdline_params,numparams, DBGPRACH_OPT);
if (cmdline_params[pindex].uptr)
if ( *(cmdline_params[pindex].uptr) > 0) UE->mode = debug_prach;
- pindex = config_paramidx_fromname(cmdline_params,numparams,NOL2CONNECT_OPT );
+ pindex = config_paramidx_fromname(cmdline_params,numparams,NOL2CONNECT_OPT );
if (cmdline_params[pindex].uptr)
if ( *(cmdline_params[pindex].uptr) > 0) UE->mode = no_L2_connect;
@@ -394,7 +395,7 @@ void init_pdcp(void) {
pdcp_layer_init();
nr_DRB_preconfiguration();*/
pdcp_layer_init();
- pdcp_module_init(pdcp_initmask);
+ pdcp_module_init(pdcp_initmask, 0);
pdcp_set_rlc_data_req_func((send_rlc_data_req_func_t) rlc_data_req);
pdcp_set_pdcp_data_ind_func((pdcp_data_ind_func_t) pdcp_data_ind);
}
@@ -501,15 +502,15 @@ int main( int argc, char **argv ) {
memset (&UE_PF_PO[0][0], 0, sizeof(UE_PF_PO_t)*NUMBER_OF_UE_MAX*MAX_NUM_CCs);
configure_linux();
mlockall(MCL_CURRENT | MCL_FUTURE);
-
+
if(IS_SOFTMODEM_DOSCOPE) {
load_softscope("nr",PHY_vars_UE_g[0][0]);
- }
+ }
+
-
init_NR_UE_threads(1);
printf("UE threads created by %ld\n", gettid());
-
+
// wait for end of program
printf("TYPE TO TERMINATE\n");
diff --git a/executables/ocp-gnb.c b/executables/ocp-gnb.c
index 326f7d277f7df5c5ff20f09da30d174d63d8f605..741a83d4142b432ebb2b8a43c532435d89b3aa19 100644
--- a/executables/ocp-gnb.c
+++ b/executables/ocp-gnb.c
@@ -328,7 +328,7 @@ static void init_pdcp(void) {
pdcp_initmask = pdcp_initmask | ENB_NAS_USE_TUN_BIT | SOFTMODEM_NOKRNMOD_BIT ;
}
- pdcp_module_init(pdcp_initmask);
+ pdcp_module_init(pdcp_initmask, 0);
pdcp_set_rlc_data_req_func((send_rlc_data_req_func_t) rlc_data_req);
pdcp_set_pdcp_data_ind_func((pdcp_data_ind_func_t) pdcp_data_ind);
}
diff --git a/executables/softmodem-common.c b/executables/softmodem-common.c
index e10515ea1acab5330d18e23a0ded937459d23965..d8d5427d5d6610f60870fd5c27d9ac665f6956c8 100644
--- a/executables/softmodem-common.c
+++ b/executables/softmodem-common.c
@@ -208,10 +208,11 @@ void set_softmodem_sighandler(void) {
memset(&act,0,sizeof(act));
act.sa_handler=signal_handler;
sigaction(SOFTMODEM_RTSIGNAL,&act,&oldact);
- printf("Send signal %d to display resource usage...\n",SIGRTMIN+1);
- signal(SIGSEGV, signal_handler);
- signal(SIGINT, signal_handler);
- signal(SIGTERM, signal_handler);
- signal(SIGABRT, signal_handler);
+ // Disabled in order generate a core dump for analysis with gdb
+ // printf("Send signal %d to display resource usage...\n",SIGRTMIN+1);
+ // signal(SIGSEGV, signal_handler);
+ // signal(SIGINT, signal_handler);
+ // signal(SIGTERM, signal_handler);
+ // signal(SIGABRT, signal_handler);
}
diff --git a/nfapi/oai_integration/nfapi.c b/nfapi/oai_integration/nfapi.c
index 86d1ae3127d33c13c71977c43c950830feb1ecdd..3b14eaabd5c40d483835df8a905614c9b4822e4c 100644
--- a/nfapi/oai_integration/nfapi.c
+++ b/nfapi/oai_integration/nfapi.c
@@ -23,7 +23,15 @@
#include
#include "nfapi/oai_integration/vendor_ext.h"
#include "common/utils/LOG/log.h"
-static char nfapi_str_mode[6][24] = {"MONOLITHIC","PNF","VNF","UE_STUB_PNF","UE_STUB_OFFNET",""};
+static const char *const nfapi_str_mode[] = {
+ "MONOLITHIC",
+ "PNF",
+ "VNF",
+ "UE_STUB_PNF",
+ "UE_STUB_OFFNET",
+ "STANDALONE_PNF",
+ ""
+};
typedef struct {
nfapi_mode_t nfapi_mode;
@@ -54,7 +62,7 @@ void set_thread_priority(int priority) {
}
}
-char *nfapi_get_strmode(void) {
+const char *nfapi_get_strmode(void) {
if (nfapi_params.nfapi_mode > NFAPI_MODE_UNKNOWN)
return nfapi_str_mode[NFAPI_MODE_UNKNOWN];
diff --git a/nfapi/oai_integration/nfapi_pnf.c b/nfapi/oai_integration/nfapi_pnf.c
index 2b1900200a1c24c46a6178f106b85d8d57fbef64..53adc39b1e39a6ca4e0309cc441d7dcc96b825a9 100644
--- a/nfapi/oai_integration/nfapi_pnf.c
+++ b/nfapi/oai_integration/nfapi_pnf.c
@@ -805,7 +805,7 @@ int config_request(nfapi_pnf_config_t *config, nfapi_pnf_phy_config_t *phy, nfap
// to keep only the necessary just to keep the nfapi FSM rolling by sending a dummy response.
LTE_DL_FRAME_PARMS *fp;
- if (NFAPI_MODE!=NFAPI_UE_STUB_PNF) {
+ if (NFAPI_MODE!=NFAPI_UE_STUB_PNF && NFAPI_MODE!=NFAPI_MODE_STANDALONE_PNF) {
struct PHY_VARS_eNB_s *eNB = RC.eNB[0][0];
fp = &eNB->frame_parms;
} else {
@@ -967,7 +967,7 @@ int config_request(nfapi_pnf_config_t *config, nfapi_pnf_phy_config_t *phy, nfap
num_tlv++;
}
- if(NFAPI_MODE!=NFAPI_UE_STUB_PNF) {
+ if(NFAPI_MODE!=NFAPI_UE_STUB_PNF && NFAPI_MODE!=NFAPI_MODE_STANDALONE_PNF) {
printf("[PNF] CONFIG_REQUEST[num_tlv:%d] TLVs processed:%d\n", req->num_tlv, num_tlv);
printf("[PNF] Simulating PHY CONFIG - DJP\n");
PHY_Config_t phy_config;
@@ -991,7 +991,7 @@ int config_request(nfapi_pnf_config_t *config, nfapi_pnf_phy_config_t *phy, nfap
nfapi_pnf_config_resp(config, &nfapi_resp);
printf("[PNF] Sent NFAPI_CONFIG_RESPONSE phy_id:%d\n", phy_info->id);
- if(NFAPI_MODE==NFAPI_UE_STUB_PNF)
+ if(NFAPI_MODE==NFAPI_UE_STUB_PNF || NFAPI_MODE==NFAPI_MODE_STANDALONE_PNF)
free(fp);
return 0;
@@ -1658,11 +1658,11 @@ int start_request(nfapi_pnf_config_t *config, nfapi_pnf_phy_config_t *phy, nfapi
p7_config->tx_req = &pnf_phy_tx_req;
p7_config->lbt_dl_config_req = &pnf_phy_lbt_dl_config_req;
p7_config->ue_release_req = &pnf_phy_ue_release_req;
- if (NFAPI_MODE==NFAPI_UE_STUB_PNF) {
- p7_config->dl_config_req = &memcpy_dl_config_req;
- p7_config->ul_config_req = &memcpy_ul_config_req;
- p7_config->hi_dci0_req = &memcpy_hi_dci0_req;
- p7_config->tx_req = &memcpy_tx_req;
+ if (NFAPI_MODE==NFAPI_UE_STUB_PNF || NFAPI_MODE==NFAPI_MODE_STANDALONE_PNF) {
+ p7_config->dl_config_req = NULL;
+ p7_config->ul_config_req = NULL;
+ p7_config->hi_dci0_req = NULL;
+ p7_config->tx_req = NULL;
} else {
p7_config->dl_config_req = &pnf_phy_dl_config_req;
p7_config->ul_config_req = &pnf_phy_ul_config_req;
@@ -1715,7 +1715,7 @@ int start_request(nfapi_pnf_config_t *config, nfapi_pnf_phy_config_t *phy, nfapi
//phy_init_RU(RC.ru[0]);
printf("[PNF] About to call init_eNB_afterRU()\n");
- if (NFAPI_MODE!=NFAPI_UE_STUB_PNF) {
+ if (NFAPI_MODE!=NFAPI_UE_STUB_PNF && NFAPI_MODE!=NFAPI_MODE_STANDALONE_PNF) {
init_eNB_afterRU();
}
@@ -1788,10 +1788,10 @@ int nr_start_request(nfapi_pnf_config_t *config, nfapi_pnf_phy_config_t *phy, n
p7_config->lbt_dl_config_req = &pnf_phy_lbt_dl_config_req;
p7_config->ue_release_req = &pnf_phy_ue_release_req;
if (NFAPI_MODE==NFAPI_UE_STUB_PNF) {
- p7_config->dl_config_req = &memcpy_dl_config_req;
- p7_config->ul_config_req = &memcpy_ul_config_req;
- p7_config->hi_dci0_req = &memcpy_hi_dci0_req;
- p7_config->tx_req = &memcpy_tx_req;
+ p7_config->dl_config_req = NULL;
+ p7_config->ul_config_req = NULL;
+ p7_config->hi_dci0_req = NULL;
+ p7_config->tx_req = NULL;
} else {
p7_config->dl_config_req = &pnf_phy_dl_config_req;
p7_config->ul_config_req = &pnf_phy_ul_config_req;
@@ -2193,7 +2193,7 @@ void configure_nr_nfapi_pnf(char *vnf_ip_addr, int vnf_p5_port, char *pnf_ip_add
void configure_nfapi_pnf(char *vnf_ip_addr, int vnf_p5_port, char *pnf_ip_addr, int pnf_p7_port, int vnf_p7_port) {
printf("%s() PNF\n\n\n\n\n\n", __FUNCTION__);
- if(NFAPI_MODE!=NFAPI_UE_STUB_PNF) {
+ if(NFAPI_MODE!=NFAPI_UE_STUB_PNF && NFAPI_MODE!=NFAPI_MODE_STANDALONE_PNF) {
nfapi_setmode(NFAPI_MODE_PNF); // PNF!
}
nfapi_pnf_config_t *config = nfapi_pnf_config_create();
diff --git a/nfapi/oai_integration/nfapi_vnf.c b/nfapi/oai_integration/nfapi_vnf.c
index d96829e127756976157f746ea5176fd7b35378bf..bce2d4421773e97f7c4a0c554ebe34ec32c9146c 100644
--- a/nfapi/oai_integration/nfapi_vnf.c
+++ b/nfapi/oai_integration/nfapi_vnf.c
@@ -661,18 +661,8 @@ int phy_rach_indication(struct nfapi_vnf_p7_config *config, nfapi_rach_indicatio
printf("[VNF] RACH_IND eNB:%p sfn_sf:%d number_of_preambles:%d\n", eNB, NFAPI_SFNSF2DEC(ind->sfn_sf), ind->rach_indication_body.number_of_preambles);
pthread_mutex_lock(&eNB->UL_INFO_mutex);
if(NFAPI_MODE == NFAPI_MODE_VNF){
- int8_t index = -1;
- for(uint8_t i= 0;i< NUM_NFPAI_SUBFRAME;i++){
- if((UL_RCC_INFO.rach_ind[i].header.message_id == 0) && (index == -1)){
- index = i;
- break;
- }
- }
- if(index == -1){
- LOG_E(MAC,"phy_rach_indication : num of rach reach max \n");
- pthread_mutex_unlock(&eNB->UL_INFO_mutex);
- return 0;
- }
+ int8_t index = NFAPI_SFNSF2SF(ind->sfn_sf);
+
UL_RCC_INFO.rach_ind[index] = *ind;
if (ind->rach_indication_body.number_of_preambles > 0)
@@ -726,32 +716,27 @@ int phy_harq_indication(struct nfapi_vnf_p7_config *config, nfapi_harq_indicatio
LOG_D(MAC, "%s() NFAPI SFN/SF:%d number_of_harqs:%u\n", __FUNCTION__, NFAPI_SFNSF2DEC(ind->sfn_sf), ind->harq_indication_body.number_of_harqs);
pthread_mutex_lock(&eNB->UL_INFO_mutex);
if(NFAPI_MODE == NFAPI_MODE_VNF){
- int8_t index = -1;
- for(uint8_t i= 0;i< NUM_NFPAI_SUBFRAME;i++){
- if((UL_RCC_INFO.harq_ind[i].header.message_id == 0) && (index == -1)){
- index = i;
- break;
- }
- }
- if(index == -1){
- LOG_E(MAC,"phy_harq_indication : num of harq reach max \n");
- pthread_mutex_unlock(&eNB->UL_INFO_mutex);
- return 0;
- }
+ int8_t index = NFAPI_SFNSF2SF(ind->sfn_sf);
+
UL_RCC_INFO.harq_ind[index] = *ind;
- if (ind->harq_indication_body.number_of_harqs > 0)
- UL_RCC_INFO.harq_ind[index].harq_indication_body.harq_pdu_list = malloc(sizeof(nfapi_harq_indication_pdu_t)*ind->harq_indication_body.number_of_harqs );
+ assert(ind->harq_indication_body.number_of_harqs <= NFAPI_HARQ_IND_MAX_PDU);
+ if (ind->harq_indication_body.number_of_harqs > 0) {
+ UL_RCC_INFO.harq_ind[index].harq_indication_body.harq_pdu_list = malloc(sizeof(nfapi_harq_indication_pdu_t) * NFAPI_HARQ_IND_MAX_PDU);
+ }
for (int i=0; iharq_indication_body.number_of_harqs; i++) {
memcpy(&UL_RCC_INFO.harq_ind[index].harq_indication_body.harq_pdu_list[i], &ind->harq_indication_body.harq_pdu_list[i], sizeof(nfapi_harq_indication_pdu_t));
}
}else{
- eNB->UL_INFO.harq_ind = *ind;
- eNB->UL_INFO.harq_ind.harq_indication_body.harq_pdu_list = eNB->harq_pdu_list;
+ eNB->UL_INFO.harq_ind = *ind;
+ eNB->UL_INFO.harq_ind.harq_indication_body.harq_pdu_list = eNB->harq_pdu_list;
- for (int i=0; iharq_indication_body.number_of_harqs; i++) {
- memcpy(&eNB->UL_INFO.harq_ind.harq_indication_body.harq_pdu_list[i], &ind->harq_indication_body.harq_pdu_list[i], sizeof(eNB->UL_INFO.harq_ind.harq_indication_body.harq_pdu_list[i]));
- }
+ assert(ind->harq_indication_body.number_of_harqs <= NFAPI_HARQ_IND_MAX_PDU);
+ for (int i=0; iharq_indication_body.number_of_harqs; i++) {
+ memcpy(&eNB->UL_INFO.harq_ind.harq_indication_body.harq_pdu_list[i],
+ &ind->harq_indication_body.harq_pdu_list[i],
+ sizeof(eNB->UL_INFO.harq_ind.harq_indication_body.harq_pdu_list[i]));
+ }
}
pthread_mutex_unlock(&eNB->UL_INFO_mutex);
// vnf_p7_info* p7_vnf = (vnf_p7_info*)(config->user_data);
@@ -763,26 +748,16 @@ int phy_crc_indication(struct nfapi_vnf_p7_config *config, nfapi_crc_indication_
struct PHY_VARS_eNB_s *eNB = RC.eNB[0][0];
pthread_mutex_lock(&eNB->UL_INFO_mutex);
if(NFAPI_MODE == NFAPI_MODE_VNF){
- int8_t index = -1;
- for(uint8_t i= 0;i< NUM_NFPAI_SUBFRAME;i++){
- if((UL_RCC_INFO.crc_ind[i].header.message_id == 0) && (index == -1)){
- index = i;
- }
- if(UL_RCC_INFO.rx_ind[i].sfn_sf == ind->sfn_sf){
- index = i;
- break;
- }
- }
- if(index == -1){
- LOG_E(MAC,"phy_crc_indication : num of crc reach max \n");
- pthread_mutex_unlock(&eNB->UL_INFO_mutex);
- return 0;
- }
+ int8_t index = NFAPI_SFNSF2SF(ind->sfn_sf);
+
UL_RCC_INFO.crc_ind[index] = *ind;
- if (ind->crc_indication_body.number_of_crcs > 0)
- UL_RCC_INFO.crc_ind[index].crc_indication_body.crc_pdu_list = malloc(sizeof(nfapi_crc_indication_pdu_t)*ind->crc_indication_body.number_of_crcs );
+ assert(ind->crc_indication_body.number_of_crcs <= NFAPI_CRC_IND_MAX_PDU);
+ if (ind->crc_indication_body.number_of_crcs > 0) {
+ UL_RCC_INFO.crc_ind[index].crc_indication_body.crc_pdu_list = malloc(sizeof(nfapi_crc_indication_pdu_t) * NFAPI_CRC_IND_MAX_PDU);
+ }
+ assert(ind->crc_indication_body.number_of_crcs <= NFAPI_CRC_IND_MAX_PDU);
for (int i=0; icrc_indication_body.number_of_crcs; i++) {
memcpy(&UL_RCC_INFO.crc_ind[index].crc_indication_body.crc_pdu_list[i], &ind->crc_indication_body.crc_pdu_list[i], sizeof(ind->crc_indication_body.crc_pdu_list[0]));
@@ -804,6 +779,7 @@ int phy_crc_indication(struct nfapi_vnf_p7_config *config, nfapi_crc_indication_
LOG_D(MAC, "%s() NFAPI SFN/SF:%d IND:number_of_crcs:%u UL_INFO:crcs:%d\n", __FUNCTION__, NFAPI_SFNSF2DEC(ind->sfn_sf), ind->crc_indication_body.number_of_crcs,
eNB->UL_INFO.crc_ind.crc_indication_body.number_of_crcs);
+ assert(ind->crc_indication_body.number_of_crcs <= NFAPI_CRC_IND_MAX_PDU);
for (int i=0; icrc_indication_body.number_of_crcs; i++) {
memcpy(&dest_ind->crc_indication_body.crc_pdu_list[i], &ind->crc_indication_body.crc_pdu_list[i], sizeof(ind->crc_indication_body.crc_pdu_list[0]));
LOG_D(MAC, "%s() NFAPI SFN/SF:%d CRC_IND:number_of_crcs:%u UL_INFO:crcs:%d PDU[%d] rnti:%04x UL_INFO:rnti:%04x\n",
@@ -829,27 +805,19 @@ int phy_rx_indication(struct nfapi_vnf_p7_config *config, nfapi_rx_indication_t
pthread_mutex_lock(&eNB->UL_INFO_mutex);
if(NFAPI_MODE == NFAPI_MODE_VNF){
- int8_t index = -1;
- for(uint8_t i= 0;i< NUM_NFPAI_SUBFRAME;i++){
- if((UL_RCC_INFO.rx_ind[i].header.message_id == 0) && (index == -1)){
- index = i;
- }
- if(UL_RCC_INFO.crc_ind[i].sfn_sf == ind->sfn_sf){
- index = i;
- break;
- }
- }
- if(index == -1){
- LOG_E(MAC,"phy_rx_indication : num of rx reach max \n");
- pthread_mutex_unlock(&eNB->UL_INFO_mutex);
- return 0;
- }
+ int8_t index = NFAPI_SFNSF2SF(ind->sfn_sf);
+
UL_RCC_INFO.rx_ind[index] = *ind;
- if (ind->rx_indication_body.number_of_pdus > 0)
- UL_RCC_INFO.rx_ind[index].rx_indication_body.rx_pdu_list = malloc(sizeof(nfapi_rx_indication_pdu_t)*ind->rx_indication_body.number_of_pdus );
+ size_t number_of_pdus = ind->rx_indication_body.number_of_pdus;
+ assert(number_of_pdus <= NFAPI_RX_IND_MAX_PDU);
- for (int i=0; irx_indication_body.number_of_pdus; i++) {
+ if (number_of_pdus > 0) {
+ UL_RCC_INFO.rx_ind[index].rx_indication_body.rx_pdu_list =
+ malloc(sizeof(nfapi_rx_indication_pdu_t) * NFAPI_RX_IND_MAX_PDU);
+ }
+
+ for (int i=0; irx_indication_body.rx_pdu_list[i];
@@ -862,9 +830,9 @@ int phy_rx_indication(struct nfapi_vnf_p7_config *config, nfapi_rx_indication_t
dest_pdu->data = NULL;
}
- LOG_D(PHY, "%s() NFAPI SFN/SF:%d PDUs:%d [PDU:%d] handle:%d rnti:%04x length:%d offset:%d ul_cqi:%d ta:%d data:%p\n",
+ LOG_D(PHY, "%s() NFAPI SFN/SF:%d PDUs:%zu [PDU:%d] handle:%d rnti:%04x length:%d offset:%d ul_cqi:%d ta:%d data:%p\n",
__FUNCTION__,
- NFAPI_SFNSF2DEC(ind->sfn_sf), ind->rx_indication_body.number_of_pdus, i,
+ NFAPI_SFNSF2DEC(ind->sfn_sf), number_of_pdus, i,
dest_pdu->rx_ue_information.handle,
dest_pdu->rx_ue_information.rnti,
dest_pdu->rx_indication_rel8.length,
@@ -880,6 +848,7 @@ int phy_rx_indication(struct nfapi_vnf_p7_config *config, nfapi_rx_indication_t
*dest_ind = *ind;
dest_ind->rx_indication_body.rx_pdu_list = dest_pdu_list;
+ assert(ind->rx_indication_body.number_of_pdus <= NFAPI_RX_IND_MAX_PDU);
for(int i=0; irx_indication_body.number_of_pdus; i++) {
nfapi_rx_indication_pdu_t *dest_pdu = &dest_ind->rx_indication_body.rx_pdu_list[i];
nfapi_rx_indication_pdu_t *src_pdu = &ind->rx_indication_body.rx_pdu_list[i];
@@ -916,23 +885,16 @@ int phy_sr_indication(struct nfapi_vnf_p7_config *config, nfapi_sr_indication_t
LOG_D(MAC, "%s() NFAPI SFN/SF:%d srs:%d\n", __FUNCTION__, NFAPI_SFNSF2DEC(ind->sfn_sf), ind->sr_indication_body.number_of_srs);
pthread_mutex_lock(&eNB->UL_INFO_mutex);
if(NFAPI_MODE == NFAPI_MODE_VNF){
- int8_t index = -1;
- for(uint8_t i= 0;i< NUM_NFPAI_SUBFRAME;i++){
- if((UL_RCC_INFO.sr_ind[i].header.message_id == 0) && (index == -1)){
- index = i;
- break;
- }
- }
- if(index == -1){
- LOG_E(MAC,"phy_sr_indication : num of sr reach max \n");
- pthread_mutex_unlock(&eNB->UL_INFO_mutex);
- return 0;
- }
+ int8_t index = NFAPI_SFNSF2SF(ind->sfn_sf);
+
UL_RCC_INFO.sr_ind[index] = *ind;
LOG_D(MAC,"%s() UL_INFO[%d].sr_ind.sr_indication_body.number_of_srs:%d\n", __FUNCTION__, index, eNB->UL_INFO.sr_ind.sr_indication_body.number_of_srs);
- if (ind->sr_indication_body.number_of_srs > 0)
- UL_RCC_INFO.sr_ind[index].sr_indication_body.sr_pdu_list = malloc(sizeof(nfapi_sr_indication_pdu_t)*ind->sr_indication_body.number_of_srs );
+ if (ind->sr_indication_body.number_of_srs > 0) {
+ assert(ind->sr_indication_body.number_of_srs <= NFAPI_SR_IND_MAX_PDU);
+ UL_RCC_INFO.sr_ind[index].sr_indication_body.sr_pdu_list = malloc(sizeof(nfapi_sr_indication_pdu_t) * NFAPI_SR_IND_MAX_PDU);
+ }
+ assert(ind->sr_indication_body.number_of_srs <= NFAPI_SR_IND_MAX_PDU);
for (int i=0; isr_indication_body.number_of_srs; i++) {
nfapi_sr_indication_pdu_t *dest_pdu = &UL_RCC_INFO.sr_ind[index].sr_indication_body.sr_pdu_list[i];
nfapi_sr_indication_pdu_t *src_pdu = &ind->sr_indication_body.sr_pdu_list[i];
@@ -948,6 +910,7 @@ int phy_sr_indication(struct nfapi_vnf_p7_config *config, nfapi_sr_indication_t
dest_ind->sr_indication_body.sr_pdu_list = dest_pdu_list;
LOG_D(MAC,"%s() eNB->UL_INFO.sr_ind.sr_indication_body.number_of_srs:%d\n", __FUNCTION__, eNB->UL_INFO.sr_ind.sr_indication_body.number_of_srs);
+ assert(eNB->UL_INFO.sr_ind.sr_indication_body.number_of_srs <= NFAPI_SR_IND_MAX_PDU);
for (int i=0; iUL_INFO.sr_ind.sr_indication_body.number_of_srs; i++) {
nfapi_sr_indication_pdu_t *dest_pdu = &dest_ind->sr_indication_body.sr_pdu_list[i];
nfapi_sr_indication_pdu_t *src_pdu = &ind->sr_indication_body.sr_pdu_list[i];
@@ -961,6 +924,36 @@ int phy_sr_indication(struct nfapi_vnf_p7_config *config, nfapi_sr_indication_t
return 1;
}
+static bool is_ue_same(uint16_t ue_id_1, uint16_t ue_id_2)
+{
+ return (ue_id_1 == ue_id_2);
+}
+
+static void analyze_cqi_pdus_for_duplicates(nfapi_cqi_indication_t *ind)
+{
+ uint16_t num_cqis = ind->cqi_indication_body.number_of_cqis;
+ assert(num_cqis <= NFAPI_CQI_IND_MAX_PDU);
+ for (int i = 0; i < num_cqis; i++)
+ {
+ nfapi_cqi_indication_pdu_t *src_pdu = &ind->cqi_indication_body.cqi_pdu_list[i];
+
+ LOG_D(MAC, "CQI_IND[PDU:%d][rnti:%x cqi:%d channel:%d]\n", i, src_pdu->rx_ue_information.rnti,
+ src_pdu->ul_cqi_information.ul_cqi, src_pdu->ul_cqi_information.channel);
+
+ for (int j = i + 1; j < num_cqis; j++)
+ {
+ uint16_t rnti_i = ind->cqi_indication_body.cqi_pdu_list[i].rx_ue_information.rnti;
+ uint16_t rnti_j = ind->cqi_indication_body.cqi_pdu_list[j].rx_ue_information.rnti;
+ if (is_ue_same(rnti_i, rnti_j))
+ {
+ LOG_E(MAC, "Problem, two cqis received from a single UE for rnti %x\n",
+ rnti_i);
+ abort();
+ }
+ }
+ }
+}
+
int phy_cqi_indication(struct nfapi_vnf_p7_config *config, nfapi_cqi_indication_t *ind) {
// vnf_p7_info* p7_vnf = (vnf_p7_info*)(config->user_data);
//mac_cqi_ind(p7_vnf->mac, ind);
@@ -968,23 +961,20 @@ int phy_cqi_indication(struct nfapi_vnf_p7_config *config, nfapi_cqi_indication_
LOG_D(MAC, "%s() NFAPI SFN/SF:%d number_of_cqis:%u\n", __FUNCTION__, NFAPI_SFNSF2DEC(ind->sfn_sf), ind->cqi_indication_body.number_of_cqis);
pthread_mutex_lock(&eNB->UL_INFO_mutex);
if(NFAPI_MODE == NFAPI_MODE_VNF){
- int8_t index = -1;
- for(uint8_t i= 0;i< NUM_NFPAI_SUBFRAME;i++){
- if((UL_RCC_INFO.cqi_ind[i].header.message_id == 0) && (index == -1)){
- index = i;
- break;
- }
- }
- if(index == -1){
- LOG_E(MAC,"phy_cqi_indication : num of cqi reach max \n");
- pthread_mutex_unlock(&eNB->UL_INFO_mutex);
- return 0;
- }
+ int8_t index = NFAPI_SFNSF2SF(ind->sfn_sf);
+
UL_RCC_INFO.cqi_ind[index] = *ind;
+ assert(ind->cqi_indication_body.number_of_cqis <= NFAPI_CQI_IND_MAX_PDU);
if (ind->cqi_indication_body.number_of_cqis > 0){
- UL_RCC_INFO.cqi_ind[index].cqi_indication_body.cqi_pdu_list = malloc(sizeof(nfapi_cqi_indication_pdu_t)*ind->cqi_indication_body.number_of_cqis );
- UL_RCC_INFO.cqi_ind[index].cqi_indication_body.cqi_raw_pdu_list = malloc(sizeof(nfapi_cqi_indication_raw_pdu_t)*ind->cqi_indication_body.number_of_cqis );
+ UL_RCC_INFO.cqi_ind[index].cqi_indication_body.cqi_pdu_list =
+ malloc(sizeof(nfapi_cqi_indication_pdu_t) * NFAPI_CQI_IND_MAX_PDU);
+ UL_RCC_INFO.cqi_ind[index].cqi_indication_body.cqi_raw_pdu_list =
+ malloc(sizeof(nfapi_cqi_indication_raw_pdu_t) * NFAPI_CQI_IND_MAX_PDU);
}
+
+ analyze_cqi_pdus_for_duplicates(ind);
+
+ assert(ind->cqi_indication_body.number_of_cqis <= NFAPI_CQI_IND_MAX_PDU);
for (int i=0; icqi_indication_body.number_of_cqis; i++) {
nfapi_cqi_indication_pdu_t *src_pdu = &ind->cqi_indication_body.cqi_pdu_list[i];
LOG_D(MAC, "SR_IND[PDU:%d][rnti:%x cqi:%d channel:%d]\n", i, src_pdu->rx_ue_information.rnti,
@@ -1000,9 +990,10 @@ int phy_cqi_indication(struct nfapi_vnf_p7_config *config, nfapi_cqi_indication_
*dest_ind = *ind;
dest_ind->cqi_indication_body.cqi_pdu_list = ind->cqi_indication_body.cqi_pdu_list;
dest_ind->cqi_indication_body.cqi_raw_pdu_list = ind->cqi_indication_body.cqi_raw_pdu_list;
+ assert(ind->cqi_indication_body.number_of_cqis <= NFAPI_CQI_IND_MAX_PDU);
for(int i=0; icqi_indication_body.number_of_cqis; i++) {
nfapi_cqi_indication_pdu_t *src_pdu = &ind->cqi_indication_body.cqi_pdu_list[i];
- LOG_D(MAC, "SR_IND[PDU:%d][rnti:%x cqi:%d channel:%d]\n", i, src_pdu->rx_ue_information.rnti,
+ LOG_D(MAC, "CQI_IND[PDU:%d][rnti:%x cqi:%d channel:%d]\n", i, src_pdu->rx_ue_information.rnti,
src_pdu->ul_cqi_information.ul_cqi, src_pdu->ul_cqi_information.channel);
memcpy(&dest_ind->cqi_indication_body.cqi_pdu_list[i],
src_pdu, sizeof(nfapi_cqi_indication_pdu_t));
@@ -1738,6 +1729,25 @@ int oai_nfapi_dl_config_req(nfapi_dl_config_request_t *dl_config_req) {
nfapi_vnf_p7_config_t *p7_config = vnf.p7_vnfs[0].config;
dl_config_req->header.phy_id = 1; // DJP HACK TODO FIXME - need to pass this around!!!!
dl_config_req->header.message_id = NFAPI_DL_CONFIG_REQUEST;
+ LOG_D(PHY, "[VNF] %s() DL_CONFIG_REQ sfn_sf:%d_%d number_of_pdus:%d\n", __FUNCTION__,
+ NFAPI_SFNSF2SFN(dl_config_req->sfn_sf),NFAPI_SFNSF2SF(dl_config_req->sfn_sf), dl_config_req->dl_config_request_body.number_pdu);
+#if 0
+ if (dl_config_req->dl_config_request_body.number_pdu > 0)
+ {
+ for (int i = 0; i < dl_config_req->dl_config_request_body.number_pdu; i++)
+ {
+ uint8_t pdu_type = dl_config_req->dl_config_request_body.dl_config_pdu_list[i].pdu_type;
+ if(pdu_type == NFAPI_DL_CONFIG_DLSCH_PDU_TYPE)
+ {
+ uint16_t dl_rnti = dl_config_req->dl_config_request_body.dl_config_pdu_list[i].dlsch_pdu.dlsch_pdu_rel8.rnti;
+ uint16_t numPDUs = dl_config_req->dl_config_request_body.number_pdu;
+ LOG_D(MAC, "(OAI eNB) Sending dl_config_req at VNF during Frame: %d and Subframe: %d,"
+ " with a RNTI value of: %x and with number of PDUs: %u\n",
+ NFAPI_SFNSF2SFN(dl_config_req->sfn_sf),NFAPI_SFNSF2SF(dl_config_req->sfn_sf), dl_rnti, numPDUs);
+ }
+ }
+ }
+#endif
int retval = nfapi_vnf_p7_dl_config_req(p7_config, dl_config_req);
dl_config_req->dl_config_request_body.number_pdcch_ofdm_symbols = 1;
dl_config_req->dl_config_request_body.number_dci = 0;
@@ -1838,6 +1848,25 @@ int oai_nfapi_hi_dci0_req(nfapi_hi_dci0_request_t *hi_dci0_req) {
return retval;
}
+static void remove_ul_config_req_pdu(int index, nfapi_ul_config_request_t *ul_config_req)
+{
+ int num_pdus = ul_config_req->ul_config_request_body.number_of_pdus;
+ nfapi_ul_config_request_pdu_t *pdu_list = ul_config_req->ul_config_request_body.ul_config_pdu_list;
+
+ if (index >= num_pdus || index < 0)
+ {
+ LOG_E(MAC, "%s() Unable to drop bad ul_config_req PDU\n", __FUNCTION__);
+ abort();
+ }
+
+ for(int i = index; i + 1 < num_pdus; i++)
+ {
+ pdu_list[i] = pdu_list[i + 1];
+ }
+
+ ul_config_req->ul_config_request_body.number_of_pdus--;
+}
+
int oai_nfapi_ul_tti_req(nfapi_nr_ul_tti_request_t *ul_tti_req) {
nfapi_vnf_p7_config_t *p7_config = vnf.p7_vnfs[0].config;
@@ -1864,6 +1893,44 @@ int oai_nfapi_ul_config_req(nfapi_ul_config_request_t *ul_config_req) {
ul_config_req->header.message_id = NFAPI_UL_CONFIG_REQUEST;
//LOG_D(PHY, "[VNF] %s() header message_id:%02x\n", __FUNCTION__, ul_config_req->header.message_id);
//LOG_D(PHY, "[VNF] %s() UL_CONFIG sfn_sf:%d PDUs:%d rach_prach_frequency_resources:%d srs_present:%d\n", __FUNCTION__, NFAPI_SFNSF2DEC(ul_config_req->sfn_sf), ul_config_req->ul_config_request_body.number_of_pdus, ul_config_req->ul_config_request_body.rach_prach_frequency_resources, ul_config_req->ul_config_request_body.srs_present);
+
+ int num_pdus = ul_config_req->ul_config_request_body.number_of_pdus;
+ nfapi_ul_config_request_pdu_t *pdu_list = ul_config_req->ul_config_request_body.ul_config_pdu_list;
+ for (int i = 0; i < num_pdus; i++)
+ {
+ uint8_t pdu_type = pdu_list[i].pdu_type;
+
+ LOG_D(MAC, "ul_config_req num_pdus: %u pdu_number: %d pdu_type: %u SFN.SF: %d.%d\n",
+ num_pdus, i, pdu_type, ul_config_req->sfn_sf >> 4, ul_config_req->sfn_sf & 15);
+
+ if (pdu_type != NFAPI_UL_CONFIG_ULSCH_CQI_RI_PDU_TYPE)
+ {
+ continue;
+ }
+
+ for (int j = i + 1; j < num_pdus; j++)
+ {
+ uint8_t pdu_type2 = pdu_list[j].pdu_type;
+ if (pdu_type != pdu_type2)
+ {
+ continue;
+ }
+
+ uint16_t rnti_i = pdu_list[i].ulsch_cqi_ri_pdu.ulsch_pdu.ulsch_pdu_rel8.rnti;
+ uint16_t rnti_j = pdu_list[j].ulsch_cqi_ri_pdu.ulsch_pdu.ulsch_pdu_rel8.rnti;
+ if (!is_ue_same(rnti_i, rnti_j))
+ {
+ continue;
+ }
+ remove_ul_config_req_pdu(j, ul_config_req);
+ j--;
+ num_pdus--;
+
+ LOG_E(MAC, "Problem, two cqis being sent to a single UE for rnti %x dropping one\n",
+ rnti_i);
+ }
+ }
+
int retval = nfapi_vnf_p7_ul_config_req(p7_config, ul_config_req);
if (retval!=0) {
diff --git a/nfapi/oai_integration/vendor_ext.h b/nfapi/oai_integration/vendor_ext.h
index f25aa703ccdb5a5f3eac99225585c6595309066d..9a377dc27d85f4af71eefe9ef92f534b1ab2cf2b 100644
--- a/nfapi/oai_integration/vendor_ext.h
+++ b/nfapi/oai_integration/vendor_ext.h
@@ -70,10 +70,11 @@ typedef enum {
NFAPI_MODE_VNF,
NFAPI_UE_STUB_PNF,
NFAPI_UE_STUB_OFFNET,
+ NFAPI_MODE_STANDALONE_PNF,
NFAPI_MODE_UNKNOWN
} nfapi_mode_t;
-char *nfapi_get_strmode(void);
+const char *nfapi_get_strmode(void);
void nfapi_logmode(void);
nfapi_mode_t nfapi_getmode(void);
void nfapi_setmode(nfapi_mode_t nfapi_mode);
diff --git a/nfapi/open-nFAPI/nfapi/public_inc/nfapi_interface.h b/nfapi/open-nFAPI/nfapi/public_inc/nfapi_interface.h
index ea459138e1e00aff374b50d0081ff07e9d476132..69bcfd0d0283e94693e0a68c665e0d04d237c92a 100644
--- a/nfapi/open-nFAPI/nfapi/public_inc/nfapi_interface.h
+++ b/nfapi/open-nFAPI/nfapi/public_inc/nfapi_interface.h
@@ -27,6 +27,7 @@
#define NFAPI_PNF_PARAM_GENERAL_OUI_LENGTH 3
#define NFAPI_MAX_NUM_RF_BANDS 16
+#define NFAPI_MAX_PACKED_MESSAGE_SIZE 8192
// The following definition control the size of arrays used in the interface.
// These may be changed if desired. They are used in the encoder to make sure
// that the user has not specified a 'count' larger than the max array, and also
diff --git a/nfapi/open-nFAPI/nfapi/src/nfapi_p7.c b/nfapi/open-nFAPI/nfapi/src/nfapi_p7.c
index ecd8e3dbfe6b7fee43ee0b64ccf2dae949ee2678..28bc2aac8942f6e053c38237cf524334862e4bc3 100644
--- a/nfapi/open-nFAPI/nfapi/src/nfapi_p7.c
+++ b/nfapi/open-nFAPI/nfapi/src/nfapi_p7.c
@@ -1,7948 +1,7959 @@
-/*
- * 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
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-
-#include
-#include
-#include
-#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; idl_tti_request_body.nGroup; i++) {
- for(int j=0; jdl_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; idl_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; in_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; in_pdus; i++) {
- if(!pack_ul_tti_pdu_list_value(&pNfapiMsg->pdus_list[i], ppWritePackedMsg, end))
- return 0;
- }
-
- for(int i=0; in_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; inumPdus; 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; iNumber_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; inumber_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; inumber_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; inumber_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; inumber_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; iharq->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; inum_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; idl_tti_request_body.nGroup; i++) {
- for(int j=0; jdl_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; idl_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; inumber_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; inumber_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; inumber_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; iharq->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; inum_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
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+
+#include
+#include
+#include
+#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, DCI_PAYLOAD_BYTE_LEN, 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) && // WAS: push16
+ 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; idl_tti_request_body.nGroup; i++) {
+ for(int j=0; jdl_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; idl_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; in_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; in_pdus; i++) {
+ if(!pack_ul_tti_pdu_list_value(&pNfapiMsg->pdus_list[i], ppWritePackedMsg, end))
+ return 0;
+ }
+
+ for(int i=0; in_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, DCI_PAYLOAD_BYTE_LEN, 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; inumPdus; 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; iNumber_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;
+ assert(total_number_of_pdus <= NFAPI_HARQ_IND_MAX_PDU);
+ 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;
+ assert(total_number_of_pdus <= NFAPI_CRC_IND_MAX_PDU);
+ 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);
+
+ assert(total_number_of_pdus <= NFAPI_RX_IND_MAX_PDU);
+ 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
+ assert(total_number_of_pdus <= NFAPI_RX_IND_MAX_PDU);
+ 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
+ assert(total_number_of_pdus <= NFAPI_RX_IND_MAX_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
+ assert(total_number_of_pdus <= NFAPI_RX_IND_MAX_PDU);
+ 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;
+ assert(total_number_of_pdus <= NFAPI_SR_IND_MAX_PDU);
+ 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;
+ assert(total_number_of_pdus <= NFAPI_CQI_IND_MAX_PDU);
+ 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
+ assert(total_number_of_pdus <= NFAPI_CQI_IND_MAX_PDU);
+ 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
+ assert(total_number_of_pdus <= NFAPI_CQI_IND_MAX_PDU);
+ 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
+ assert(total_number_of_pdus <= NFAPI_CQI_IND_MAX_PDU);
+ 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; inumber_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; inumber_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; inumber_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; inumber_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; iharq->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; inum_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, DCI_PAYLOAD_BYTE_LEN, 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; idl_tti_request_body.nGroup; i++) {
+ for(int j=0; jdl_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; idl_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; inumber_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; inumber_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; inumber_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; iharq->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; inum_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;
+ }
+
+ assert(value->number_of_harqs <= NFAPI_HARQ_IND_MAX_PDU);
+ 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;
+ }
+
+ assert(value->number_of_harqs <= NFAPI_HARQ_IND_MAX_PDU);
+ for(size_t 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) {
+ assert(value->number_of_crcs <= NFAPI_CRC_IND_MAX_PDU);
+ 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;
+ }
+
+ assert(value->number_of_crcs <= NFAPI_CRC_IND_MAX_PDU);
+ for(size_t 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) {
+ assert(value->number_of_pdus <= NFAPI_RX_IND_MAX_PDU);
+ value->rx_pdu_list = (nfapi_rx_indication_pdu_t *)nfapi_p7_allocate(sizeof(nfapi_rx_indication_pdu_t) * NFAPI_RX_IND_MAX_PDU, 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;
+ }
+ }
+
+ assert(value->number_of_pdus <= NFAPI_RX_IND_MAX_PDU);
+ 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) {
+ NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s pullarray8 failure\n", __FUNCTION__);
+ 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;
+ assert(value->number_of_srs <= NFAPI_SR_IND_MAX_PDU);
+ 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) {
+ assert(value->number_of_cqis <= NFAPI_SR_IND_MAX_PDU);
+ 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);
+ assert(value->number_of_cqis <= NFAPI_SR_IND_MAX_PDU);
+ 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;
+ assert(value->number_of_cqis <= NFAPI_CQI_IND_MAX_PDU);
+ 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;
+ assert(value->number_of_cqis <= NFAPI_CQI_IND_MAX_PDU);
+ 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/nfapi/open-nFAPI/pnf/src/pnf_p7.c b/nfapi/open-nFAPI/pnf/src/pnf_p7.c
index 092b967189b5050d057aaa87171dc547ac071e97..44dba709c386995a953176208e56472247aa7e3c 100644
--- a/nfapi/open-nFAPI/pnf/src/pnf_p7.c
+++ b/nfapi/open-nFAPI/pnf/src/pnf_p7.c
@@ -2889,12 +2889,19 @@ void pnf_nfapi_p7_read_dispatch_message(pnf_p7_t* pnf_p7, uint32_t now_hr_time)
}
// read the segment
- recvfrom_result = recvfrom(pnf_p7->p7_sock, pnf_p7->rx_message_buffer, header.message_length, MSG_DONTWAIT, (struct sockaddr*)&remote_addr, &remote_addr_size);
+ recvfrom_result = recvfrom(pnf_p7->p7_sock, pnf_p7->rx_message_buffer, pnf_p7->rx_message_buffer_size,
+ MSG_DONTWAIT | MSG_TRUNC, (struct sockaddr*)&remote_addr, &remote_addr_size);
now_hr_time = pnf_get_current_time_hr(); //DJP - moved to here - get closer timestamp???
if(recvfrom_result > 0)
{
+ if (recvfrom_result != header.message_length)
+ {
+ NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s(%d). Received unexpected number of bytes. %d != %d",
+ __FUNCTION__, __LINE__, recvfrom_result, header.message_length);
+ break;
+ }
pnf_handle_p7_message(pnf_p7->rx_message_buffer, recvfrom_result, pnf_p7, now_hr_time);
//printf("\npnf_handle_p7_message sfn=%d,slot=%d\n",pnf_p7->sfn,pnf_p7->slot);
}
diff --git a/nfapi/open-nFAPI/vnf/src/vnf.c b/nfapi/open-nFAPI/vnf/src/vnf.c
index 7fee47d6d5423b5acd381d998a9083a582632eb9..1d6b9717303434d2aa5be197aaa5315fae3edefa 100644
--- a/nfapi/open-nFAPI/vnf/src/vnf.c
+++ b/nfapi/open-nFAPI/vnf/src/vnf.c
@@ -1383,6 +1383,7 @@ int vnf_read_dispatch_message(nfapi_vnf_config_t* config, nfapi_vnf_pnf_info_t*
uint32_t header_buffer_size = NFAPI_HEADER_LENGTH;
uint8_t header_buffer[header_buffer_size];
+ memset(header_buffer, 0, header_buffer_size);
uint32_t stack_buffer_size = 32; //should it be the size of then sctp_notificatoin structure
uint8_t stack_buffer[stack_buffer_size];
@@ -1393,6 +1394,7 @@ int vnf_read_dispatch_message(nfapi_vnf_config_t* config, nfapi_vnf_pnf_info_t*
uint32_t message_size = 0;
struct sockaddr_in addr;
+ memset(&addr, 0, sizeof(addr));
socklen_t addr_len = sizeof(addr);
struct sctp_sndrcvinfo sndrcvinfo;
diff --git a/nfapi/open-nFAPI/vnf/src/vnf_interface.c b/nfapi/open-nFAPI/vnf/src/vnf_interface.c
index 084c4fa48547dcb1958dd806bed057eb2cea4a04..6e9a5d795f8862a6dc79cb98cab437528c04c4d8 100644
--- a/nfapi/open-nFAPI/vnf/src/vnf_interface.c
+++ b/nfapi/open-nFAPI/vnf/src/vnf_interface.c
@@ -25,6 +25,7 @@
#include
#include
#include
+#include
#include
@@ -477,14 +478,7 @@ int nfapi_nr_vnf_start(nfapi_vnf_config_t* config)
int nfapi_vnf_start(nfapi_vnf_config_t* config)
{
- // Verify that config is not null
- if(config == 0)
- return -1;
-
- // Make sure to set the defined trace function before using NFAPI_TRACE
- if(config->trace)
- nfapi_trace_g = (nfapi_trace_fn_t)config->trace;
-
+ assert(config != 0);
NFAPI_TRACE(NFAPI_TRACE_INFO, "%s()\n", __FUNCTION__);
int p5ListenSock, p5Sock;
diff --git a/nfapi/open-nFAPI/vnf/src/vnf_p7.c b/nfapi/open-nFAPI/vnf/src/vnf_p7.c
index e3900315540f00e1dc88bea25da468fcf48a49a1..e4b25b44a84f21fa2e91c0aea7dfaaaf2569ac9d 100644
--- a/nfapi/open-nFAPI/vnf/src/vnf_p7.c
+++ b/nfapi/open-nFAPI/vnf/src/vnf_p7.c
@@ -1,12 +1,12 @@
/*
* 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.
@@ -17,14 +17,20 @@
#include
+#include
#include
#include
#include
#include
#include
+#include
#include
#include "vnf_p7.h"
+#ifdef NDEBUG
+# warning assert is disabled
+#endif
+
#define SYNC_CYCLE_COUNT 2
void* vnf_p7_malloc(vnf_p7_t* vnf_p7, size_t size)
@@ -35,7 +41,7 @@ void* vnf_p7_malloc(vnf_p7_t* vnf_p7, size_t size)
}
else
{
- return calloc(1, size);
+ return calloc(1, size);
}
}
void vnf_p7_free(vnf_p7_t* vnf_p7, void* ptr)
@@ -49,7 +55,7 @@ void vnf_p7_free(vnf_p7_t* vnf_p7, void* ptr)
}
else
{
- free(ptr);
+ free(ptr);
}
}
@@ -64,7 +70,7 @@ void vnf_p7_codec_free(vnf_p7_t* vnf_p7, void* ptr)
}
else
{
- free(ptr);
+ free(ptr);
}
}
@@ -72,7 +78,7 @@ void vnf_p7_connection_info_list_add(vnf_p7_t* vnf_p7, nfapi_vnf_p7_connection_i
{
NFAPI_TRACE(NFAPI_TRACE_INFO, "%s()\n", __FUNCTION__);
// todo : add mutex
- node->next = vnf_p7->p7_connections;
+ node->next = vnf_p7->p7_connections;
vnf_p7->p7_connections = node;
}
@@ -136,11 +142,11 @@ vnf_p7_rx_message_t* vnf_p7_rx_reassembly_queue_add_segment(vnf_p7_t* vnf_p7, vn
iterator = iterator->next;
}
-
+
// if found then copy data to message
if(msg != 0)
{
-
+
msg->segments[segment_number].buffer = (uint8_t*)vnf_p7_malloc(vnf_p7, data_len);
memcpy(msg->segments[segment_number].buffer, data, data_len);
msg->segments[segment_number].length = data_len;
@@ -232,7 +238,7 @@ void vnf_p7_rx_reassembly_queue_remove_old_msgs(vnf_p7_t* vnf_p7, vnf_p7_rx_reas
{
previous->next = iterator->next;
}
-
+
NFAPI_TRACE(NFAPI_TRACE_INFO, "Deleting stale reassembly message (%u %u %d)\n", iterator->rx_hr_time, rx_hr_time, delta);
vnf_p7_rx_message_t* to_delete = iterator;
@@ -286,12 +292,12 @@ uint16_t increment_sfn_sf(uint16_t sfn_sf)
struct timespec timespec_delta(struct timespec start, struct timespec end)
{
struct timespec temp;
- if ((end.tv_nsec-start.tv_nsec)<0)
+ if ((end.tv_nsec-start.tv_nsec)<0)
{
temp.tv_sec = end.tv_sec-start.tv_sec-1;
temp.tv_nsec = 1000000000+end.tv_nsec-start.tv_nsec;
- }
- else
+ }
+ else
{
temp.tv_sec = end.tv_sec-start.tv_sec;
temp.tv_nsec = end.tv_nsec-start.tv_nsec;
@@ -361,7 +367,7 @@ uint32_t calculate_nr_t1(uint16_t sfn, uint16_t slot, uint32_t slot_start_time_h
uint32_t slot_time_us = get_slot_time(now_time_hr, slot_start_time_hr);
uint32_t t1 = (NFAPI_SFNSLOT2DEC(sfn,slot) * 500) + slot_time_us;
-
+
return t1;
}
@@ -381,7 +387,7 @@ uint32_t calculate_nr_t4(uint32_t now_time_hr, uint16_t sfn, uint16_t slot, uint
uint32_t slot_time_us = get_slot_time(now_time_hr, slot_start_time_hr);
uint32_t t4 = (NFAPI_SFNSLOT2DEC(sfn,slot) * 500) + slot_time_us;
-
+
return t4;
}
@@ -394,7 +400,7 @@ uint32_t calculate_transmit_timestamp(uint16_t sfn, uint16_t slot, uint32_t slot
uint32_t slot_time_us = get_slot_time(now_time_hr, slot_start_time_hr);
uint32_t tt = (NFAPI_SFNSLOT2DEC(sfn, slot) * 500) + slot_time_us;
-
+
return tt;
}
@@ -455,7 +461,7 @@ int send_mac_subframe_indications(vnf_p7_t* vnf_p7)
int vnf_send_p7_msg(vnf_p7_t* vnf_p7, nfapi_vnf_p7_connection_info_t* p7_info, uint8_t* msg, const uint32_t len)
{
- int sendto_result = sendto(vnf_p7->socket, msg, len, 0, (struct sockaddr*)&(p7_info->remote_addr), sizeof(p7_info->remote_addr));
+ int sendto_result = sendto(vnf_p7->socket, msg, len, 0, (struct sockaddr*)&(p7_info->remote_addr), sizeof(p7_info->remote_addr));
//printf("P7 msg sent \n");
if(sendto_result != len)
{
@@ -475,12 +481,12 @@ int vnf_nr_p7_pack_and_send_p7_msg(vnf_p7_t* vnf_p7, nfapi_p7_message_header_t*
uint8_t buffer[1024 * 32];
header->m_segment_sequence = NFAPI_P7_SET_MSS(0, 0, p7_connection->sequence_number);
-
+
int len = nfapi_nr_p7_message_pack(header, buffer, sizeof(buffer), &vnf_p7->_public.codec_config);
-
+
//NFAPI_TRACE(NFAPI_TRACE_INFO, "%s() phy_id:%d nfapi_p7_message_pack()=len=%d vnf_p7->_public.segment_size:%u\n", __FUNCTION__, header->phy_id, len, vnf_p7->_public.segment_size);
- if(len < 0)
+ if(len < 0)
{
NFAPI_TRACE(NFAPI_TRACE_INFO, "%s() failed to pack p7 message phy_id:%d\n", __FUNCTION__, header->phy_id);
return -1;
@@ -490,12 +496,12 @@ int vnf_nr_p7_pack_and_send_p7_msg(vnf_p7_t* vnf_p7, nfapi_p7_message_header_t*
{
// todo : consider replacing with the sendmmsg call
// todo : worry about blocking writes?
-
+
// segmenting the transmit
- int msg_body_len = len - NFAPI_P7_HEADER_LENGTH ;
- int seg_body_len = vnf_p7->_public.segment_size - NFAPI_P7_HEADER_LENGTH ;
- int segment_count = (msg_body_len / (seg_body_len)) + ((msg_body_len % seg_body_len) ? 1 : 0);
-
+ int msg_body_len = len - NFAPI_P7_HEADER_LENGTH ;
+ int seg_body_len = vnf_p7->_public.segment_size - NFAPI_P7_HEADER_LENGTH ;
+ int segment_count = (msg_body_len / (seg_body_len)) + ((msg_body_len % seg_body_len) ? 1 : 0);
+
int segment = 0;
int offset = NFAPI_P7_HEADER_LENGTH;
uint8_t tx_buffer[vnf_p7->_public.segment_size];
@@ -512,7 +518,7 @@ int vnf_nr_p7_pack_and_send_p7_msg(vnf_p7_t* vnf_p7, nfapi_p7_message_header_t*
uint16_t segment_size = size + NFAPI_P7_HEADER_LENGTH;
- // Update the header with the m and segement
+ // Update the header with the m and segement
memcpy(&tx_buffer[0], buffer, NFAPI_P7_HEADER_LENGTH);
// set the segment length
@@ -529,8 +535,8 @@ int vnf_nr_p7_pack_and_send_p7_msg(vnf_p7_t* vnf_p7, nfapi_p7_message_header_t*
{
nfapi_p7_update_checksum(tx_buffer, segment_size);
}
-
- nfapi_p7_update_transmit_timestamp(buffer, calculate_transmit_timestamp(p7_connection->sfn, p7_connection->slot, vnf_p7->slot_start_time_hr));
+
+ nfapi_p7_update_transmit_timestamp(buffer, calculate_transmit_timestamp(p7_connection->sfn, p7_connection->slot, vnf_p7->slot_start_time_hr));
send_result = vnf_send_p7_msg(vnf_p7, p7_connection, &tx_buffer[0], segment_size);
@@ -543,7 +549,7 @@ int vnf_nr_p7_pack_and_send_p7_msg(vnf_p7_t* vnf_p7, nfapi_p7_message_header_t*
nfapi_p7_update_checksum(buffer, len);
}
- nfapi_p7_update_transmit_timestamp(buffer, calculate_transmit_timestamp(p7_connection->sfn, p7_connection->slot, vnf_p7->slot_start_time_hr));
+ nfapi_p7_update_transmit_timestamp(buffer, calculate_transmit_timestamp(p7_connection->sfn, p7_connection->slot, vnf_p7->slot_start_time_hr));
// simple case that the message fits in a single segement
send_result = vnf_send_p7_msg(vnf_p7, p7_connection, &buffer[0], len);
@@ -569,12 +575,12 @@ int vnf_p7_pack_and_send_p7_msg(vnf_p7_t* vnf_p7, nfapi_p7_message_header_t* hea
uint8_t buffer[1024 * 32];
header->m_segment_sequence = NFAPI_P7_SET_MSS(0, 0, p7_connection->sequence_number);
-
+
int len = nfapi_p7_message_pack(header, buffer, sizeof(buffer), &vnf_p7->_public.codec_config);
-
+
//NFAPI_TRACE(NFAPI_TRACE_INFO, "%s() phy_id:%d nfapi_p7_message_pack()=len=%d vnf_p7->_public.segment_size:%u\n", __FUNCTION__, header->phy_id, len, vnf_p7->_public.segment_size);
- if(len < 0)
+ if(len < 0)
{
NFAPI_TRACE(NFAPI_TRACE_INFO, "%s() failed to pack p7 message phy_id:%d\n", __FUNCTION__, header->phy_id);
return -1;
@@ -584,12 +590,12 @@ int vnf_p7_pack_and_send_p7_msg(vnf_p7_t* vnf_p7, nfapi_p7_message_header_t* hea
{
// todo : consider replacing with the sendmmsg call
// todo : worry about blocking writes?
-
+
// segmenting the transmit
- int msg_body_len = len - NFAPI_P7_HEADER_LENGTH ;
- int seg_body_len = vnf_p7->_public.segment_size - NFAPI_P7_HEADER_LENGTH ;
- int segment_count = (msg_body_len / (seg_body_len)) + ((msg_body_len % seg_body_len) ? 1 : 0);
-
+ int msg_body_len = len - NFAPI_P7_HEADER_LENGTH ;
+ int seg_body_len = vnf_p7->_public.segment_size - NFAPI_P7_HEADER_LENGTH ;
+ int segment_count = (msg_body_len / (seg_body_len)) + ((msg_body_len % seg_body_len) ? 1 : 0);
+
int segment = 0;
int offset = NFAPI_P7_HEADER_LENGTH;
uint8_t tx_buffer[vnf_p7->_public.segment_size];
@@ -606,7 +612,7 @@ int vnf_p7_pack_and_send_p7_msg(vnf_p7_t* vnf_p7, nfapi_p7_message_header_t* hea
uint16_t segment_size = size + NFAPI_P7_HEADER_LENGTH;
- // Update the header with the m and segement
+ // Update the header with the m and segement
memcpy(&tx_buffer[0], buffer, NFAPI_P7_HEADER_LENGTH);
// set the segment length
@@ -623,8 +629,8 @@ int vnf_p7_pack_and_send_p7_msg(vnf_p7_t* vnf_p7, nfapi_p7_message_header_t* hea
{
nfapi_p7_update_checksum(tx_buffer, segment_size);
}
-
- nfapi_p7_update_transmit_timestamp(buffer, calculate_transmit_timestamp(p7_connection->sfn, p7_connection->slot, vnf_p7->slot_start_time_hr));
+
+ nfapi_p7_update_transmit_timestamp(buffer, calculate_transmit_timestamp(p7_connection->sfn, p7_connection->slot, vnf_p7->slot_start_time_hr));
send_result = vnf_send_p7_msg(vnf_p7, p7_connection, &tx_buffer[0], segment_size);
}
@@ -636,7 +642,7 @@ int vnf_p7_pack_and_send_p7_msg(vnf_p7_t* vnf_p7, nfapi_p7_message_header_t* hea
nfapi_p7_update_checksum(buffer, len);
}
- nfapi_p7_update_transmit_timestamp(buffer, calculate_transmit_timestamp(p7_connection->sfn, p7_connection->slot, vnf_p7->slot_start_time_hr));
+ nfapi_p7_update_transmit_timestamp(buffer, calculate_transmit_timestamp(p7_connection->sfn, p7_connection->slot, vnf_p7->slot_start_time_hr));
// simple case that the message fits in a single segement
send_result = vnf_send_p7_msg(vnf_p7, p7_connection, &buffer[0], len);
@@ -662,11 +668,11 @@ int vnf_build_send_dl_node_sync(vnf_p7_t* vnf_p7, nfapi_vnf_p7_connection_info_t
dl_node_sync.t1 = calculate_t1(p7_info->sfn_sf, vnf_p7->sf_start_time_hr);
dl_node_sync.delta_sfn_sf = 0;
- return vnf_p7_pack_and_send_p7_msg(vnf_p7, &dl_node_sync.header);
+ return vnf_p7_pack_and_send_p7_msg(vnf_p7, &dl_node_sync.header);
}
int vnf_nr_build_send_dl_node_sync(vnf_p7_t* vnf_p7, nfapi_vnf_p7_connection_info_t* p7_info)
-{
+{
nfapi_nr_dl_node_sync_t dl_node_sync;
memset(&dl_node_sync, 0, sizeof(dl_node_sync));
@@ -676,7 +682,7 @@ int vnf_nr_build_send_dl_node_sync(vnf_p7_t* vnf_p7, nfapi_vnf_p7_connection_inf
dl_node_sync.t1 = calculate_nr_t1(p7_info->sfn,p7_info->slot, vnf_p7->slot_start_time_hr);
dl_node_sync.delta_sfn_slot = 0;
- return vnf_nr_p7_pack_and_send_p7_msg(vnf_p7, &dl_node_sync.header);
+ return vnf_nr_p7_pack_and_send_p7_msg(vnf_p7, &dl_node_sync.header);
}
int vnf_nr_sync(vnf_p7_t* vnf_p7, nfapi_vnf_p7_connection_info_t* p7_info)
@@ -701,7 +707,7 @@ int vnf_nr_sync(vnf_p7_t* vnf_p7, nfapi_vnf_p7_connection_info_t* p7_info)
uint16_t sfn_slot_dec = NFAPI_SFNSLOT2DEC(p7_info->sfn, p7_info->slot);
//if ((((sfn_sf_dec + p7_info->dl_out_sync_offset) % NFAPI_MAX_SFNSFDEC) & dl_sync_period_mask) == 0)
- if ((((sfn_slot_dec + p7_info->dl_out_sync_offset) % NFAPI_MAX_SFNSLOTDEC) & dl_sync_period_mask) == 0)
+ if ((((sfn_slot_dec + p7_info->dl_out_sync_offset) % NFAPI_MAX_SFNSLOTDEC) & dl_sync_period_mask) == 0)
{
vnf_nr_build_send_dl_node_sync(vnf_p7, p7_info);
}
@@ -747,7 +753,7 @@ void vnf_handle_harq_indication(void *pRecvMsg, int recvMsgLen, vnf_p7_t* vnf_p7
else
{
nfapi_harq_indication_t ind;
-
+
if(nfapi_p7_message_unpack(pRecvMsg, recvMsgLen, &ind, sizeof(ind), &vnf_p7->_public.codec_config) < 0)
{
NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s: Failed to unpack message\n", __FUNCTION__);
@@ -759,7 +765,7 @@ void vnf_handle_harq_indication(void *pRecvMsg, int recvMsgLen, vnf_p7_t* vnf_p7
(vnf_p7->_public.harq_indication)(&(vnf_p7->_public), &ind);
}
}
-
+
vnf_p7_codec_free(vnf_p7, ind.harq_indication_body.harq_pdu_list);
vnf_p7_codec_free(vnf_p7, ind.vendor_extension);
}
@@ -775,7 +781,7 @@ void vnf_handle_crc_indication(void *pRecvMsg, int recvMsgLen, vnf_p7_t* vnf_p7)
else
{
nfapi_crc_indication_t ind;
-
+
if(nfapi_p7_message_unpack(pRecvMsg, recvMsgLen, &ind, sizeof(ind), &vnf_p7->_public.codec_config) < 0)
{
NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s: Failed to message\n", __FUNCTION__);
@@ -787,7 +793,7 @@ void vnf_handle_crc_indication(void *pRecvMsg, int recvMsgLen, vnf_p7_t* vnf_p7)
(vnf_p7->_public.crc_indication)(&(vnf_p7->_public), &ind);
}
}
-
+
vnf_p7_codec_free(vnf_p7, ind.crc_indication_body.crc_pdu_list);
vnf_p7_codec_free(vnf_p7, ind.vendor_extension);
}
@@ -803,7 +809,7 @@ void vnf_handle_rx_ulsch_indication(void *pRecvMsg, int recvMsgLen, vnf_p7_t* vn
else
{
nfapi_rx_indication_t ind;
-
+
if(nfapi_p7_message_unpack(pRecvMsg, recvMsgLen, &ind, sizeof(ind), &vnf_p7->_public.codec_config) < 0)
{
NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s: Failed to unpack message\n", __FUNCTION__);
@@ -816,6 +822,7 @@ void vnf_handle_rx_ulsch_indication(void *pRecvMsg, int recvMsgLen, vnf_p7_t* vn
}
}
+ assert(ind.rx_indication_body.number_of_pdus <= NFAPI_RX_IND_MAX_PDU);
uint16_t i = 0;
for(i = 0; i < ind.rx_indication_body.number_of_pdus; ++i)
{
@@ -837,7 +844,7 @@ void vnf_handle_rach_indication(void *pRecvMsg, int recvMsgLen, vnf_p7_t* vnf_p7
else
{
nfapi_rach_indication_t ind;
-
+
if(nfapi_p7_message_unpack(pRecvMsg, recvMsgLen, &ind, sizeof(ind), &vnf_p7->_public.codec_config) < 0)
{
NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s: Failed to message\n", __FUNCTION__);
@@ -849,7 +856,7 @@ void vnf_handle_rach_indication(void *pRecvMsg, int recvMsgLen, vnf_p7_t* vnf_p7
(vnf_p7->_public.rach_indication)(&vnf_p7->_public, &ind);
}
}
-
+
vnf_p7_codec_free(vnf_p7, ind.rach_indication_body.preamble_list);
vnf_p7_codec_free(vnf_p7, ind.vendor_extension);
@@ -878,9 +885,9 @@ void vnf_handle_srs_indication(void *pRecvMsg, int recvMsgLen, vnf_p7_t* vnf_p7)
(vnf_p7->_public.srs_indication)(&(vnf_p7->_public), &ind);
}
}
-
+
vnf_p7_codec_free(vnf_p7, ind.srs_indication_body.srs_pdu_list);
- vnf_p7_codec_free(vnf_p7, ind.vendor_extension);
+ vnf_p7_codec_free(vnf_p7, ind.vendor_extension);
}
}
@@ -894,7 +901,7 @@ void vnf_handle_rx_sr_indication(void *pRecvMsg, int recvMsgLen, vnf_p7_t* vnf_p
else
{
nfapi_sr_indication_t ind;
-
+
if(nfapi_p7_message_unpack(pRecvMsg, recvMsgLen, &ind, sizeof(ind), &vnf_p7->_public.codec_config) < 0)
{
NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s: Failed to unpack message\n", __FUNCTION__);
@@ -906,9 +913,9 @@ void vnf_handle_rx_sr_indication(void *pRecvMsg, int recvMsgLen, vnf_p7_t* vnf_p
(vnf_p7->_public.sr_indication)(&(vnf_p7->_public), &ind);
}
}
-
+
vnf_p7_codec_free(vnf_p7, ind.sr_indication_body.sr_pdu_list);
- vnf_p7_codec_free(vnf_p7, ind.vendor_extension);
+ vnf_p7_codec_free(vnf_p7, ind.vendor_extension);
}
}
void vnf_handle_rx_cqi_indication(void *pRecvMsg, int recvMsgLen, vnf_p7_t* vnf_p7)
@@ -921,7 +928,7 @@ void vnf_handle_rx_cqi_indication(void *pRecvMsg, int recvMsgLen, vnf_p7_t* vnf_
else
{
nfapi_cqi_indication_t ind;
-
+
if(nfapi_p7_message_unpack(pRecvMsg, recvMsgLen, &ind, sizeof(ind), &vnf_p7->_public.codec_config) < 0)
{
NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s: Failed to unpack message\n", __FUNCTION__);
@@ -933,11 +940,11 @@ void vnf_handle_rx_cqi_indication(void *pRecvMsg, int recvMsgLen, vnf_p7_t* vnf_
(vnf_p7->_public.cqi_indication)(&(vnf_p7->_public), &ind);
}
}
-
+
vnf_p7_codec_free(vnf_p7, ind.cqi_indication_body.cqi_pdu_list);
vnf_p7_codec_free(vnf_p7, ind.cqi_indication_body.cqi_raw_pdu_list);
- vnf_p7_codec_free(vnf_p7, ind.vendor_extension);
-
+ vnf_p7_codec_free(vnf_p7, ind.vendor_extension);
+
}
}
@@ -964,7 +971,7 @@ void vnf_handle_lbt_dl_indication(void *pRecvMsg, int recvMsgLen, vnf_p7_t* vnf_
(vnf_p7->_public.lbt_dl_indication)(&(vnf_p7->_public), &ind);
}
}
-
+
vnf_p7_codec_free(vnf_p7, ind.lbt_dl_indication_body.lbt_indication_pdu_list);
vnf_p7_codec_free(vnf_p7, ind.vendor_extension);
}
@@ -980,7 +987,7 @@ void vnf_handle_nb_harq_indication(void *pRecvMsg, int recvMsgLen, vnf_p7_t* vnf
else
{
nfapi_nb_harq_indication_t ind;
-
+
if(nfapi_p7_message_unpack(pRecvMsg, recvMsgLen, &ind, sizeof(ind), &vnf_p7->_public.codec_config) < 0)
{
NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s: Failed to unpack message\n", __FUNCTION__);
@@ -992,7 +999,7 @@ void vnf_handle_nb_harq_indication(void *pRecvMsg, int recvMsgLen, vnf_p7_t* vnf
(vnf_p7->_public.nb_harq_indication)(&(vnf_p7->_public), &ind);
}
}
-
+
vnf_p7_codec_free(vnf_p7, ind.nb_harq_indication_body.nb_harq_pdu_list);
vnf_p7_codec_free(vnf_p7, ind.vendor_extension);
}
@@ -1008,7 +1015,7 @@ void vnf_handle_nrach_indication(void *pRecvMsg, int recvMsgLen, vnf_p7_t* vnf_p
else
{
nfapi_nrach_indication_t ind;
-
+
if(nfapi_p7_message_unpack(pRecvMsg, recvMsgLen, &ind, sizeof(ind), &vnf_p7->_public.codec_config) < 0)
{
NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s: Failed to unpack message\n", __FUNCTION__);
@@ -1020,7 +1027,7 @@ void vnf_handle_nrach_indication(void *pRecvMsg, int recvMsgLen, vnf_p7_t* vnf_p
(vnf_p7->_public.nrach_indication)(&(vnf_p7->_public), &ind);
}
}
-
+
vnf_p7_codec_free(vnf_p7, ind.nrach_indication_body.nrach_pdu_list);
vnf_p7_codec_free(vnf_p7, ind.vendor_extension);
}
@@ -1072,10 +1079,10 @@ void vnf_handle_p7_vendor_extension(void *pRecvMsg, int recvMsgLen, vnf_p7_t* vn
if(vnf_p7->_public.vendor_ext)
vnf_p7->_public.vendor_ext(&(vnf_p7->_public), msg);
}
-
+
if(vnf_p7->_public.deallocate_p7_vendor_ext)
vnf_p7->_public.deallocate_p7_vendor_ext(msg);
-
+
}
}
@@ -1113,7 +1120,7 @@ void vnf_handle_ul_node_sync(void *pRecvMsg, int recvMsgLen, vnf_p7_t* vnf_p7)
phy->latency[phy->min_sync_cycle_count] = latency;
NFAPI_TRACE(NFAPI_TRACE_NOTE, "(%4d/%d) PNF to VNF !sync phy_id:%d (t1/2/3/4:%8u, %8u, %8u, %8u) txrx:%4u procT:%3u latency(us):%4d\n",
- NFAPI_SFNSF2SFN(phy->sfn_sf), NFAPI_SFNSF2SF(phy->sfn_sf), ind.header.phy_id, ind.t1, ind.t2, ind.t3, t4,
+ NFAPI_SFNSF2SFN(phy->sfn_sf), NFAPI_SFNSF2SF(phy->sfn_sf), ind.header.phy_id, ind.t1, ind.t2, ind.t3, t4,
tx_2_rx, pnf_proc_time, latency);
}
else
@@ -1157,11 +1164,13 @@ void vnf_handle_ul_node_sync(void *pRecvMsg, int recvMsgLen, vnf_p7_t* vnf_p7)
struct timespec ts;
clock_gettime(CLOCK_MONOTONIC, &ts);
+#if 0
NFAPI_TRACE(NFAPI_TRACE_INFO, "(%4d/%1d) %d.%d PNF to VNF phy_id:%2d (t1/2/3/4:%8u, %8u, %8u, %8u) txrx:%4u procT:%3u latency(us):%4d(avg:%4d) offset(us):%8d filtered(us):%8d wrap[t1:%u t2:%u]\n",
NFAPI_SFNSF2SFN(phy->sfn_sf), NFAPI_SFNSF2SF(phy->sfn_sf), ts.tv_sec, ts.tv_nsec, ind.header.phy_id,
- ind.t1, ind.t2, ind.t3, t4,
+ ind.t1, ind.t2, ind.t3, t4,
tx_2_rx, pnf_proc_time, latency, phy->average_latency, phy->sf_offset, phy->sf_offset_filtered,
(ind.t1previous_t1), (ind.t2previous_t2));
+#endif
}
}
@@ -1218,7 +1227,9 @@ void vnf_handle_ul_node_sync(void *pRecvMsg, int recvMsgLen, vnf_p7_t* vnf_p7)
{
phy->adjustment = NFAPI_SFNSF2DEC(new_sfn_sf) - NFAPI_SFNSF2DEC(curr_sfn_sf);
+#if 0
NFAPI_TRACE(NFAPI_TRACE_INFO, "PNF to VNF phy_id:%d adjustment%d phy->previous_sf_offset_filtered:%d phy->previous_sf_offset_filtered:%d phy->sf_offset_trend:%d\n", ind.header.phy_id, phy->adjustment, phy->previous_sf_offset_filtered, phy->previous_sf_offset_filtered, phy->sf_offset_trend);
+#endif
phy->previous_t1 = 0;
phy->previous_t2 = 0;
@@ -1250,7 +1261,7 @@ void vnf_handle_ul_node_sync(void *pRecvMsg, int recvMsgLen, vnf_p7_t* vnf_p7)
}
}
-
+
int insync_minor_adjustment_1 = phy->sf_offset_trend / 6;
int insync_minor_adjustment_2 = phy->sf_offset_trend / 2;
@@ -1289,7 +1300,7 @@ void vnf_handle_ul_node_sync(void *pRecvMsg, int recvMsgLen, vnf_p7_t* vnf_p7)
{
if(phy->in_sync == 0)
{
- //NFAPI_TRACE(NFAPI_TRACE_NOTE, "VNF P7 In Sync with phy (phy_id:%d)\n", phy->phy_id);
+ //NFAPI_TRACE(NFAPI_TRACE_NOTE, "VNF P7 In Sync with phy (phy_id:%d)\n", phy->phy_id);
if(vnf_p7->_public.sync_indication)
(vnf_p7->_public.sync_indication)(&(vnf_p7->_public), 1);
@@ -1324,14 +1335,14 @@ void vnf_handle_ul_node_sync(void *pRecvMsg, int recvMsgLen, vnf_p7_t* vnf_p7)
if(phy->insync_minor_adjustment != 0)
{
- NFAPI_TRACE(NFAPI_TRACE_NOTE, "(%4d/%d) VNF phy_id:%d Apply minor insync adjustment %dus for %d subframes (sf_offset_filtered:%d) %d %d %d NEW:%d CURR:%d adjustment:%d\n",
+ NFAPI_TRACE(NFAPI_TRACE_NOTE, "(%4d/%d) VNF phy_id:%d Apply minor insync adjustment %dus for %d subframes (sf_offset_filtered:%d) %d %d %d NEW:%d CURR:%d adjustment:%d\n",
NFAPI_SFNSF2SFN(phy->sfn_sf), NFAPI_SFNSF2SF(phy->sfn_sf), ind.header.phy_id,
- phy->insync_minor_adjustment, phy->insync_minor_adjustment_duration,
- phy->sf_offset_filtered,
+ phy->insync_minor_adjustment, phy->insync_minor_adjustment_duration,
+ phy->sf_offset_filtered,
insync_minor_adjustment_1, insync_minor_adjustment_2, phy->sf_offset_trend,
NFAPI_SFNSF2DEC(new_sfn_sf),
NFAPI_SFNSF2DEC(curr_sfn_sf),
- phy->adjustment);
+ phy->adjustment);
}
}
}
@@ -1360,21 +1371,21 @@ void vnf_handle_ul_node_sync(void *pRecvMsg, int recvMsgLen, vnf_p7_t* vnf_p7)
phy->insync_minor_adjustment = -(insync_minor_adjustment_2);
phy->insync_minor_adjustment_duration = 2 * ((phy->sf_offset_filtered + 250) / -(insync_minor_adjustment_2));
}
-
+
}
//else
{
// out of sync?
}
-
- NFAPI_TRACE(NFAPI_TRACE_NOTE, "(%4d/%d) VNF phy_id:%d Apply minor insync adjustment %dus for %d subframes (adjustment:%d sf_offset_filtered:%d) %d %d %d NEW:%d CURR:%d adj:%d\n",
+
+ NFAPI_TRACE(NFAPI_TRACE_NOTE, "(%4d/%d) VNF phy_id:%d Apply minor insync adjustment %dus for %d subframes (adjustment:%d sf_offset_filtered:%d) %d %d %d NEW:%d CURR:%d adj:%d\n",
NFAPI_SFNSF2SFN(phy->sfn_sf), NFAPI_SFNSF2SF(phy->sfn_sf), ind.header.phy_id,
phy->insync_minor_adjustment, phy->insync_minor_adjustment_duration, phy->adjustment, phy->sf_offset_filtered,
insync_minor_adjustment_1, insync_minor_adjustment_2, phy->sf_offset_trend,
NFAPI_SFNSF2DEC(new_sfn_sf),
NFAPI_SFNSF2DEC(curr_sfn_sf),
- phy->adjustment);
-
+ phy->adjustment);
+
}
else if(phy->adjustment < 0)
{
@@ -1400,10 +1411,10 @@ void vnf_handle_ul_node_sync(void *pRecvMsg, int recvMsgLen, vnf_p7_t* vnf_p7)
// out of sync?
}
- NFAPI_TRACE(NFAPI_TRACE_NOTE, "(%d/%d) VNF phy_id:%d Apply minor insync adjustment %dus for %d subframes (adjustment:%d sf_offset_filtered:%d) %d %d %d\n",
+ NFAPI_TRACE(NFAPI_TRACE_NOTE, "(%d/%d) VNF phy_id:%d Apply minor insync adjustment %dus for %d subframes (adjustment:%d sf_offset_filtered:%d) %d %d %d\n",
NFAPI_SFNSF2SFN(phy->sfn_sf), NFAPI_SFNSF2SF(phy->sfn_sf), ind.header.phy_id,
phy->insync_minor_adjustment, phy->insync_minor_adjustment_duration, phy->adjustment, phy->sf_offset_filtered,
- insync_minor_adjustment_1, insync_minor_adjustment_2, phy->sf_offset_trend);
+ insync_minor_adjustment_1, insync_minor_adjustment_2, phy->sf_offset_trend);
}
/*
@@ -1431,7 +1442,7 @@ void vnf_handle_ul_node_sync(void *pRecvMsg, int recvMsgLen, vnf_p7_t* vnf_p7)
{
/*NFAPI_TRACE(NFAPI_TRACE_NOTE, "***** Adjusting VNF phy_id:%d SFN/SF (%s) from %d to %d (%d) mode:%s zeroCount:%u sync:%s\n",
ind.header.phy_id, (phy->in_sync ? "via sfn" : "now"),
- NFAPI_SFNSF2DEC(curr_sfn_sf), NFAPI_SFNSF2DEC(new_sfn_sf), phy->adjustment,
+ NFAPI_SFNSF2DEC(curr_sfn_sf), NFAPI_SFNSF2DEC(new_sfn_sf), phy->adjustment,
phy->filtered_adjust ? "FILTERED" : "ABSOLUTE",
phy->zero_count,
phy->in_sync ? "IN_SYNC" : "OUT_OF_SYNC");*/
@@ -1464,7 +1475,7 @@ void vnf_handle_nr_slot_indication(void *pRecvMsg, int recvMsgLen, vnf_p7_t* vnf
else
{
nfapi_nr_slot_indication_scf_t ind;
-
+
if(nfapi_nr_p7_message_unpack(pRecvMsg, recvMsgLen, &ind, sizeof(ind), &vnf_p7->_public.codec_config) < 0)
{
NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s: Failed to unpack message\n", __FUNCTION__);
@@ -1489,7 +1500,7 @@ void vnf_handle_nr_rx_data_indication(void *pRecvMsg, int recvMsgLen, vnf_p7_t*
else
{
nfapi_nr_rx_data_indication_t ind;
-
+
if(nfapi_nr_p7_message_unpack(pRecvMsg, recvMsgLen, &ind, sizeof(ind), &vnf_p7->_public.codec_config) < 0)
{
NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s: Failed to unpack message\n", __FUNCTION__);
@@ -1515,7 +1526,7 @@ void vnf_handle_nr_crc_indication(void *pRecvMsg, int recvMsgLen, vnf_p7_t* vnf_
else
{
nfapi_nr_crc_indication_t ind;
-
+
if(nfapi_nr_p7_message_unpack(pRecvMsg, recvMsgLen, &ind, sizeof(ind), &vnf_p7->_public.codec_config) < 0)
{
NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s: Failed to unpack message\n", __FUNCTION__);
@@ -1523,11 +1534,11 @@ void vnf_handle_nr_crc_indication(void *pRecvMsg, int recvMsgLen, vnf_p7_t* vnf_
else
{
if(vnf_p7->_public.nr_crc_indication)
- {
+ {
(vnf_p7->_public.nr_crc_indication)(&ind);
}
}
-
+
}
}
@@ -1541,7 +1552,7 @@ void vnf_handle_nr_srs_indication(void *pRecvMsg, int recvMsgLen, vnf_p7_t* vnf_
else
{
nfapi_nr_srs_indication_t ind;
-
+
if(nfapi_nr_p7_message_unpack(pRecvMsg, recvMsgLen, &ind, sizeof(ind), &vnf_p7->_public.codec_config) < 0)
{
NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s: Failed to unpack message\n", __FUNCTION__);
@@ -1566,7 +1577,7 @@ void vnf_handle_nr_uci_indication(void *pRecvMsg, int recvMsgLen, vnf_p7_t* vnf_
else
{
nfapi_nr_uci_indication_t ind;
-
+
if(nfapi_nr_p7_message_unpack(pRecvMsg, recvMsgLen, &ind, sizeof(ind), &vnf_p7->_public.codec_config) < 0)
{
NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s: Failed to unpack message\n", __FUNCTION__);
@@ -1592,7 +1603,7 @@ void vnf_handle_nr_rach_indication(void *pRecvMsg, int recvMsgLen, vnf_p7_t* vnf
else
{
nfapi_nr_rach_indication_t ind;
-
+
if(nfapi_nr_p7_message_unpack(pRecvMsg, recvMsgLen, &ind, sizeof(ind), &vnf_p7->_public.codec_config) < 0)
{
NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s: Failed to unpack message\n", __FUNCTION__);
@@ -1604,12 +1615,12 @@ void vnf_handle_nr_rach_indication(void *pRecvMsg, int recvMsgLen, vnf_p7_t* vnf
(vnf_p7->_public.nr_rach_indication)(&ind);
}
}
-
+
}
}
void vnf_nr_handle_ul_node_sync(void *pRecvMsg, int recvMsgLen, vnf_p7_t* vnf_p7)
-{
+{
//printf("received UL Node sync");
uint32_t now_time_hr = vnf_get_current_time_hr();
@@ -1645,7 +1656,7 @@ void vnf_nr_handle_ul_node_sync(void *pRecvMsg, int recvMsgLen, vnf_p7_t* vnf_p7
phy->latency[phy->min_sync_cycle_count] = latency;
//NFAPI_TRACE(NFAPI_TRACE_NOTE, "(%4d/%d) PNF to VNF !sync phy_id:%d (t1/2/3/4:%8u, %8u, %8u, %8u) txrx:%4u procT:%3u latency(us):%4d\n",
- // phy->sfn, phy->slot, ind.header.phy_id, ind.t1, ind.t2, ind.t3, t4,
+ // phy->sfn, phy->slot, ind.header.phy_id, ind.t1, ind.t2, ind.t3, t4,
// tx_2_rx, pnf_proc_time, latency);
}
else
@@ -1689,9 +1700,9 @@ void vnf_nr_handle_ul_node_sync(void *pRecvMsg, int recvMsgLen, vnf_p7_t* vnf_p7
struct timespec ts;
clock_gettime(CLOCK_MONOTONIC, &ts);
- // NFAPI_TRACE(NFAPI_TRACE_NOTE, "(%4d/%1d) %d.%d PNF to VNF phy_id:%2d (t1/2/3/4:%8u, %8u, %8u, %8u) txrx:%4u procT:%3u latency(us):%4d(avg:%4d) offset(us):%8d filtered(us):%8d wrap[t1:%u t2:%u]\n",
+ // NFAPI_TRACE(NFAPI_TRACE_NOTE, "(%4d/%1d) %d.%d PNF to VNF phy_id:%2d (t1/2/3/4:%8u, %8u, %8u, %8u) txrx:%4u procT:%3u latency(us):%4d(avg:%4d) offset(us):%8d filtered(us):%8d wrap[t1:%u t2:%u]\n",
// phy->sfn, phy->slot, ts.tv_sec, ts.tv_nsec, ind.header.phy_id,
- // ind.t1, ind.t2, ind.t3, t4,
+ // ind.t1, ind.t2, ind.t3, t4,
// tx_2_rx, pnf_proc_time, latency, phy->average_latency, phy->slot_offset, phy->slot_offset_filtered,
// (ind.t1previous_t1), (ind.t2previous_t2));
}
@@ -1701,9 +1712,9 @@ void vnf_nr_handle_ul_node_sync(void *pRecvMsg, int recvMsgLen, vnf_p7_t* vnf_p7
if (phy->filtered_adjust && (phy->slot_offset_filtered > 1e6 || phy->slot_offset_filtered < -1e6))
{ struct timespec ts;
clock_gettime(CLOCK_MONOTONIC, &ts);
- NFAPI_TRACE(NFAPI_TRACE_NOTE, "(%4d/%1d) %d.%d PNF to VNF phy_id:%2d (t1/2/3/4:%8u, %8u, %8u, %8u) txrx:%4u procT:%3u latency(us):%4d(avg:%4d) offset(us):%8d filtered(us):%8d wrap[t1:%u t2:%u]\n",
+ NFAPI_TRACE(NFAPI_TRACE_NOTE, "(%4d/%1d) %d.%d PNF to VNF phy_id:%2d (t1/2/3/4:%8u, %8u, %8u, %8u) txrx:%4u procT:%3u latency(us):%4d(avg:%4d) offset(us):%8d filtered(us):%8d wrap[t1:%u t2:%u]\n",
phy->sfn, phy->slot, ts.tv_sec, ts.tv_nsec, ind.header.phy_id,
- ind.t1, ind.t2, ind.t3, t4,
+ ind.t1, ind.t2, ind.t3, t4,
tx_2_rx, pnf_proc_time, latency, phy->average_latency, phy->slot_offset, phy->slot_offset_filtered,
(ind.t1previous_t1), (ind.t2previous_t2));
@@ -1737,15 +1748,15 @@ void vnf_nr_handle_ul_node_sync(void *pRecvMsg, int recvMsgLen, vnf_p7_t* vnf_p7
phy->slot_offset = ind.t2 - (ind.t1 - phy->average_latency);
sfn_slot_dec += (phy->slot_offset / 500);
-
- //NFAPI_TRACE(NFAPI_TRACE_NOTE, "PNF to VNF slot offset:%d sfn :%d slot:%d \n",phy->slot_offset,NFAPI_SFNSLOTDEC2SFN(sfn_slot_dec),NFAPI_SFNSLOTDEC2SLOT(sfn_slot_dec) );
+
+ //NFAPI_TRACE(NFAPI_TRACE_NOTE, "PNF to VNF slot offset:%d sfn :%d slot:%d \n",phy->slot_offset,NFAPI_SFNSLOTDEC2SFN(sfn_slot_dec),NFAPI_SFNSLOTDEC2SLOT(sfn_slot_dec) );
}
else
{
sfn_slot_dec += ((phy->slot_offset_filtered + 250) / 500); //Round up to go from microsecond to slot
-
+
}
if(sfn_slot_dec < 0)
@@ -1757,10 +1768,10 @@ void vnf_nr_handle_ul_node_sync(void *pRecvMsg, int recvMsgLen, vnf_p7_t* vnf_p7
sfn_slot_dec -= NFAPI_MAX_SFNSLOTDEC;
}
-
+
uint16_t new_sfn = NFAPI_SFNSLOTDEC2SFN(sfn_slot_dec);
uint16_t new_slot = NFAPI_SFNSLOTDEC2SLOT(sfn_slot_dec);
-
+
{
phy->adjustment = NFAPI_SFNSLOT2DEC(new_sfn, new_slot) - NFAPI_SFNSLOT2DEC(curr_sfn, curr_slot);
@@ -1796,7 +1807,7 @@ void vnf_nr_handle_ul_node_sync(void *pRecvMsg, int recvMsgLen, vnf_p7_t* vnf_p7
}
}
-
+
int insync_minor_adjustment_1 = phy->slot_offset_trend / 6;
int insync_minor_adjustment_2 = phy->slot_offset_trend / 2;
@@ -1835,7 +1846,7 @@ void vnf_nr_handle_ul_node_sync(void *pRecvMsg, int recvMsgLen, vnf_p7_t* vnf_p7
{
if(phy->in_sync == 0)
{
- NFAPI_TRACE(NFAPI_TRACE_NOTE, "VNF P7 In Sync with phy (phy_id:%d)\n", phy->phy_id);
+ NFAPI_TRACE(NFAPI_TRACE_NOTE, "VNF P7 In Sync with phy (phy_id:%d)\n", phy->phy_id);
if(vnf_p7->_public.sync_indication)
(vnf_p7->_public.sync_indication)(&(vnf_p7->_public), 1);
@@ -1870,14 +1881,14 @@ void vnf_nr_handle_ul_node_sync(void *pRecvMsg, int recvMsgLen, vnf_p7_t* vnf_p7
if(phy->insync_minor_adjustment != 0)
{
- // NFAPI_TRACE(NFAPI_TRACE_NOTE, "(%4d/%d) VNF phy_id:%d Apply minor insync adjustment %dus for %d slots (slot_offset_filtered:%d) %d %d %d NEW:%d CURR:%d adjustment:%d\n",
+ // NFAPI_TRACE(NFAPI_TRACE_NOTE, "(%4d/%d) VNF phy_id:%d Apply minor insync adjustment %dus for %d slots (slot_offset_filtered:%d) %d %d %d NEW:%d CURR:%d adjustment:%d\n",
// phy->sfn, phy->slot, ind.header.phy_id,
- // phy->insync_minor_adjustment, phy->insync_minor_adjustment_duration,
- // phy->slot_offset_filtered,
+ // phy->insync_minor_adjustment, phy->insync_minor_adjustment_duration,
+ // phy->slot_offset_filtered,
// insync_minor_adjustment_1, insync_minor_adjustment_2, phy->slot_offset_trend,
// NFAPI_SFNSLOT2DEC(new_sfn, new_slot),
// NFAPI_SFNSLOT2DEC(curr_sfn, curr_slot),
- // phy->adjustment);
+ // phy->adjustment);
}
}
}
@@ -1906,21 +1917,21 @@ void vnf_nr_handle_ul_node_sync(void *pRecvMsg, int recvMsgLen, vnf_p7_t* vnf_p7
phy->insync_minor_adjustment = -(insync_minor_adjustment_2);
phy->insync_minor_adjustment_duration = 2 * ((phy->slot_offset_filtered + 250) / -(insync_minor_adjustment_2));
}
-
+
}
//else
{
// out of sync?
}
-
- // NFAPI_TRACE(NFAPI_TRACE_NOTE, "(%4d/%d) VNF phy_id:%d Apply minor insync adjustment %dus for %d slots (adjustment:%d slot_offset_filtered:%d) %d %d %d NEW:%d CURR:%d adj:%d\n",
+
+ // NFAPI_TRACE(NFAPI_TRACE_NOTE, "(%4d/%d) VNF phy_id:%d Apply minor insync adjustment %dus for %d slots (adjustment:%d slot_offset_filtered:%d) %d %d %d NEW:%d CURR:%d adj:%d\n",
// phy->sfn, phy->slot, ind.header.phy_id,
// phy->insync_minor_adjustment, phy->insync_minor_adjustment_duration, phy->adjustment, phy->slot_offset_filtered,
// insync_minor_adjustment_1, insync_minor_adjustment_2, phy->slot_offset_trend,
// NFAPI_SFNSLOT2DEC(new_sfn, new_slot),
// NFAPI_SFNSLOT2DEC(curr_sfn, curr_slot),
- // phy->adjustment);
-
+ // phy->adjustment);
+
}
else if(phy->adjustment < 0)
{
@@ -1946,10 +1957,10 @@ void vnf_nr_handle_ul_node_sync(void *pRecvMsg, int recvMsgLen, vnf_p7_t* vnf_p7
// out of sync?
}
- // NFAPI_TRACE(NFAPI_TRACE_NOTE, "(%d/%d) VNF phy_id:%d Apply minor insync adjustment %dus for %d slots (adjustment:%d slot_offset_filtered:%d) %d %d %d\n",
+ // NFAPI_TRACE(NFAPI_TRACE_NOTE, "(%d/%d) VNF phy_id:%d Apply minor insync adjustment %dus for %d slots (adjustment:%d slot_offset_filtered:%d) %d %d %d\n",
// phy->sfn, phy->slot, ind.header.phy_id,
// phy->insync_minor_adjustment, phy->insync_minor_adjustment_duration, phy->adjustment, phy->slot_offset_filtered,
- // insync_minor_adjustment_1, insync_minor_adjustment_2, phy->slot_offset_trend);
+ // insync_minor_adjustment_1, insync_minor_adjustment_2, phy->slot_offset_trend);
}
/*
@@ -1977,7 +1988,7 @@ void vnf_nr_handle_ul_node_sync(void *pRecvMsg, int recvMsgLen, vnf_p7_t* vnf_p7
{
/*NFAPI_TRACE(NFAPI_TRACE_NOTE, "***** Adjusting VNF phy_id:%d SFN/SF (%s) from %d to %d (%d) mode:%s zeroCount:%u sync:%s\n",
ind.header.phy_id, (phy->in_sync ? "via sfn" : "now"),
- NFAPI_SFNSF2DEC(curr_sfn_sf), NFAPI_SFNSF2DEC(new_sfn_sf), phy->adjustment,
+ NFAPI_SFNSF2DEC(curr_sfn_sf), NFAPI_SFNSF2DEC(new_sfn_sf), phy->adjustment,
phy->filtered_adjust ? "FILTERED" : "ABSOLUTE",
phy->zero_count,
phy->in_sync ? "IN_SYNC" : "OUT_OF_SYNC");*/
@@ -2101,23 +2112,23 @@ void vnf_dispatch_p7_message(void *pRecvMsg, int recvMsgLen, vnf_p7_t* vnf_p7)
case NFAPI_TIMING_INFO:
vnf_handle_timing_info(pRecvMsg, recvMsgLen, vnf_p7);
break;
-
+
case NFAPI_HARQ_INDICATION:
vnf_handle_harq_indication(pRecvMsg, recvMsgLen, vnf_p7);
break;
-
+
case NFAPI_CRC_INDICATION:
vnf_handle_crc_indication(pRecvMsg, recvMsgLen, vnf_p7);
break;
-
+
case NFAPI_RX_ULSCH_INDICATION:
vnf_handle_rx_ulsch_indication(pRecvMsg, recvMsgLen, vnf_p7);
break;
-
+
case NFAPI_RACH_INDICATION:
vnf_handle_rach_indication(pRecvMsg, recvMsgLen, vnf_p7);
break;
-
+
case NFAPI_SRS_INDICATION:
vnf_handle_srs_indication(pRecvMsg, recvMsgLen, vnf_p7);
break;
@@ -2129,18 +2140,18 @@ void vnf_dispatch_p7_message(void *pRecvMsg, int recvMsgLen, vnf_p7_t* vnf_p7)
case NFAPI_RX_CQI_INDICATION:
vnf_handle_rx_cqi_indication(pRecvMsg, recvMsgLen, vnf_p7);
break;
-
+
case NFAPI_LBT_DL_INDICATION:
vnf_handle_lbt_dl_indication(pRecvMsg, recvMsgLen, vnf_p7);
break;
-
+
case NFAPI_NB_HARQ_INDICATION:
vnf_handle_nb_harq_indication(pRecvMsg, recvMsgLen, vnf_p7);
break;
-
+
case NFAPI_NRACH_INDICATION:
vnf_handle_nrach_indication(pRecvMsg, recvMsgLen, vnf_p7);
- break;
+ break;
case NFAPI_UE_RELEASE_RESPONSE:
vnf_handle_ue_release_resp(pRecvMsg, recvMsgLen, vnf_p7);
@@ -2196,27 +2207,27 @@ void vnf_nr_dispatch_p7_message(void *pRecvMsg, int recvMsgLen, vnf_p7_t* vnf_p7
case NFAPI_TIMING_INFO:
vnf_nr_handle_timing_info(pRecvMsg, recvMsgLen, vnf_p7);
break;
-
+
case NFAPI_NR_PHY_MSG_TYPE_SLOT_INDICATION:
vnf_handle_nr_slot_indication(pRecvMsg, recvMsgLen, vnf_p7);
break;
-
+
case NFAPI_NR_PHY_MSG_TYPE_RX_DATA_INDICATION:
vnf_handle_nr_rx_data_indication(pRecvMsg, recvMsgLen, vnf_p7);
break;
-
+
case NFAPI_NR_PHY_MSG_TYPE_CRC_INDICATION:
vnf_handle_nr_crc_indication(pRecvMsg, recvMsgLen, vnf_p7);
break;
-
+
case NFAPI_NR_PHY_MSG_TYPE_UCI_INDICATION:
vnf_handle_nr_uci_indication(pRecvMsg, recvMsgLen, vnf_p7);
break;
-
+
case NFAPI_NR_PHY_MSG_TYPE_SRS_INDICATION:
vnf_handle_nr_srs_indication(pRecvMsg, recvMsgLen, vnf_p7);
break;
-
+
case NFAPI_NR_PHY_MSG_TYPE_RACH_INDICATION:
vnf_handle_nr_rach_indication(pRecvMsg, recvMsgLen, vnf_p7);
break;
@@ -2241,7 +2252,7 @@ void vnf_nr_dispatch_p7_message(void *pRecvMsg, int recvMsgLen, vnf_p7_t* vnf_p7
}
}
-void vnf_handle_p7_message(void *pRecvMsg, int recvMsgLen, vnf_p7_t* vnf_p7)
+void vnf_handle_p7_message(void *pRecvMsg, int recvMsgLen, vnf_p7_t* vnf_p7)
{
nfapi_p7_message_header_t messageHeader;
@@ -2359,7 +2370,7 @@ void vnf_handle_p7_message(void *pRecvMsg, int recvMsgLen, vnf_p7_t* vnf_p7)
}
}
-void vnf_nr_handle_p7_message(void *pRecvMsg, int recvMsgLen, vnf_p7_t* vnf_p7)
+void vnf_nr_handle_p7_message(void *pRecvMsg, int recvMsgLen, vnf_p7_t* vnf_p7)
{
nfapi_p7_message_header_t messageHeader;
@@ -2502,7 +2513,7 @@ int vnf_nr_p7_read_dispatch_message(vnf_p7_t* vnf_p7)
// resize the buffer if we have a large segment
if(header.message_length > vnf_p7->rx_message_buffer_size)
{
- NFAPI_TRACE(NFAPI_TRACE_NOTE, "reallocing rx buffer %d\n", header.message_length);
+ NFAPI_TRACE(NFAPI_TRACE_NOTE, "reallocing rx buffer %d\n", header.message_length);
vnf_p7->rx_message_buffer = realloc(vnf_p7->rx_message_buffer, header.message_length);
vnf_p7->rx_message_buffer_size = header.message_length;
}
@@ -2518,13 +2529,13 @@ int vnf_nr_p7_read_dispatch_message(vnf_p7_t* vnf_p7)
}
else if(recvfrom_result != header.message_length)
{
- NFAPI_TRACE(NFAPI_TRACE_NOTE, "did not receive the entire message %d %d\n", recvfrom_result, header.message_length);
-
+ NFAPI_TRACE(NFAPI_TRACE_NOTE, "did not receive the entire message %d %d\n", recvfrom_result, header.message_length);
+
recvfrom_result += recvfrom(vnf_p7->socket, &vnf_p7->rx_message_buffer[recvfrom_result], header.message_length - recvfrom_result, MSG_WAITALL, (struct sockaddr*)&remote_addr, &remote_addr_size);
-
+
}
-
-
+
+
if(recvfrom_result > 0)
{
vnf_nr_handle_p7_message(vnf_p7->rx_message_buffer, recvfrom_result, vnf_p7);
@@ -2578,7 +2589,7 @@ int vnf_p7_read_dispatch_message(vnf_p7_t* vnf_p7)
// resize the buffer if we have a large segment
if(header.message_length > vnf_p7->rx_message_buffer_size)
{
- NFAPI_TRACE(NFAPI_TRACE_NOTE, "reallocing rx buffer %d\n", header.message_length);
+ NFAPI_TRACE(NFAPI_TRACE_NOTE, "reallocing rx buffer %d\n", header.message_length);
vnf_p7->rx_message_buffer = realloc(vnf_p7->rx_message_buffer, header.message_length);
vnf_p7->rx_message_buffer_size = header.message_length;
}
@@ -2592,15 +2603,15 @@ int vnf_p7_read_dispatch_message(vnf_p7_t* vnf_p7)
{
NFAPI_TRACE(NFAPI_TRACE_ERROR, "recvfrom returned 0\n");
}
- else if(recvfrom_result != header.message_length)
+ else if(recvfrom_result != -1 && recvfrom_result != header.message_length)
{
- NFAPI_TRACE(NFAPI_TRACE_NOTE, "did not receive the entire message %d %d\n", recvfrom_result, header.message_length);
-
+ NFAPI_TRACE(NFAPI_TRACE_ERROR, "Received unexpected number of bytes %d %d\n", recvfrom_result, header.message_length);
+
recvfrom_result += recvfrom(vnf_p7->socket, &vnf_p7->rx_message_buffer[recvfrom_result], header.message_length - recvfrom_result, MSG_WAITALL, (struct sockaddr*)&remote_addr, &remote_addr_size);
-
+
}
-
-
+
+
if(recvfrom_result > 0)
{
vnf_handle_p7_message(vnf_p7->rx_message_buffer, recvfrom_result, vnf_p7);
@@ -2646,8 +2657,9 @@ void vnf_p7_release_msg(vnf_p7_t* vnf_p7, nfapi_p7_message_header_t* header)
case NFAPI_RX_ULSCH_INDICATION:
{
nfapi_rx_indication_t* rx_ind = (nfapi_rx_indication_t*)(header);
- uint16_t i = 0;
- for(i = 0; i < rx_ind->rx_indication_body.number_of_pdus; ++i)
+ size_t number_of_pdus = rx_ind->rx_indication_body.number_of_pdus;
+ assert(number_of_pdus <= NFAPI_RX_IND_MAX_PDU);
+ for(size_t i = 0; i < number_of_pdus; ++i)
{
vnf_p7_codec_free(vnf_p7, rx_ind->rx_indication_body.rx_pdu_list[i].data);
}
@@ -2677,13 +2689,12 @@ void vnf_p7_release_msg(vnf_p7_t* vnf_p7, nfapi_p7_message_header_t* header)
}
break;
}
-
+
vnf_p7_free(vnf_p7, header);
-
+
}
void vnf_p7_release_pdu(vnf_p7_t* vnf_p7, void* pdu)
{
vnf_p7_free(vnf_p7, pdu);
}
-
diff --git a/nfapi/open-nFAPI/vnf/src/vnf_p7_interface.c b/nfapi/open-nFAPI/vnf/src/vnf_p7_interface.c
index 8cebf2b468b7f38b475d342639106ab421933617..cb9fae3f215e61fdb9de93cc8e65cf5954422395 100644
--- a/nfapi/open-nFAPI/vnf/src/vnf_p7_interface.c
+++ b/nfapi/open-nFAPI/vnf/src/vnf_p7_interface.c
@@ -449,8 +449,8 @@ if (selectRetval==-1 && errno == 22)
//phy->insync_minor_adjustment = 0;
phy->insync_minor_adjustment_duration--;
- NFAPI_TRACE(NFAPI_TRACE_NOTE, "[VNF] AFTER adjustment - Subframe minor adjustment %dus sf_start.tv_nsec:%d duration:%u\n",
- phy->insync_minor_adjustment, sf_start.tv_nsec, phy->insync_minor_adjustment_duration);
+ //NFAPI_TRACE(NFAPI_TRACE_NOTE, "[VNF] AFTER adjustment - Subframe minor adjustment %dus sf_start.tv_nsec:%d duration:%u\n",
+ // phy->insync_minor_adjustment, sf_start.tv_nsec, phy->insync_minor_adjustment_duration);
if (phy->insync_minor_adjustment_duration==0)
{
@@ -497,9 +497,7 @@ if (selectRetval==-1 && errno == 22)
while(curr != 0)
{
curr->sfn_sf = increment_sfn_sf(curr->sfn_sf);
-
vnf_sync(vnf_p7, curr);
-
curr = curr->next;
}
@@ -581,7 +579,7 @@ int nfapi_vnf_p7_add_pnf(nfapi_vnf_p7_config_t* config, const char* pnf_p7_addr,
// save the remote endpoint information
node->remote_addr.sin_family = AF_INET;
- node->remote_addr.sin_port = pnf_p7_port;//htons(pnf_p7_port);
+ node->remote_addr.sin_port = htons(pnf_p7_port);
node->remote_addr.sin_addr.s_addr = inet_addr(pnf_p7_addr);
vnf_p7_connection_info_list_add(vnf_p7, node);
diff --git a/openair1/PHY/INIT/lte_init.c b/openair1/PHY/INIT/lte_init.c
index 1daeb72187b81454ecc2ed359b234b86ec4dec69..21a1010cf9ea6b90d5a40d6299448f8a4fba98cc 100644
--- a/openair1/PHY/INIT/lte_init.c
+++ b/openair1/PHY/INIT/lte_init.c
@@ -106,7 +106,7 @@ void phy_config_request(PHY_Config_t *phy_config) {
int Ncp = cfg->subframe_config.dl_cyclic_prefix_type.value;
int p_eNB = cfg->rf_config.tx_antenna_ports.value;
uint32_t dl_CarrierFreq = cfg->nfapi_config.earfcn.value;
- LOG_I(PHY,"Configuring MIB for instance %d, CCid %d : (band %d,N_RB_DL %d, N_RB_UL %d, Nid_cell %d,eNB_tx_antenna_ports %d,Ncp %d,DL freq %u,phich_config.resource %d, phich_config.duration %d)\n",
+ LOG_A(PHY,"Configuring MIB for instance %d, CCid %d : (band %d,N_RB_DL %d, N_RB_UL %d, Nid_cell %d,eNB_tx_antenna_ports %d,Ncp %d,DL freq %u,phich_config.resource %d, phich_config.duration %d)\n",
Mod_id, CC_id, eutra_band, dl_Bandwidth, ul_Bandwidth, Nid_cell, p_eNB,Ncp,dl_CarrierFreq,
cfg->phich_config.phich_resource.value,
cfg->phich_config.phich_duration.value);
@@ -553,12 +553,14 @@ void phy_free_lte_eNB(PHY_VARS_eNB *eNB) {
LTE_eNB_PRACH *const prach_vars_br = &eNB->prach_vars_br;
int i, UE_id;
- for (i = 0; i < NB_ANTENNA_PORTS_ENB; i++) {
- if (i < fp->nb_antenna_ports_eNB || i == 5) {
- free_and_zero(common_vars->txdataF[i]);
- /* rxdataF[i] is not allocated -> don't free */
+ if (common_vars->txdataF) {
+ for (i = 0; i < NB_ANTENNA_PORTS_ENB; i++) {
+ if (i < fp->nb_antenna_ports_eNB || i == 5) {
+ free_and_zero(common_vars->txdataF[i]);
+ }
}
}
+ /* rxdataF[i] is not allocated -> don't free */
free_and_zero(common_vars->txdataF);
free_and_zero(common_vars->rxdataF);
@@ -580,14 +582,20 @@ void phy_free_lte_eNB(PHY_VARS_eNB *eNB) {
free_and_zero(prach_vars->prachF);
- for (i = 0; i < 64; i++) free_and_zero(prach_vars->prach_ifft[0][i]);
-
- free_and_zero(prach_vars->prach_ifft[0]);
+ if (prach_vars->prach_ifft[0]) {
+ for (i = 0; i < 64; i++) {
+ free_and_zero(prach_vars->prach_ifft[0][i]);
+ }
+ free_and_zero(prach_vars->prach_ifft[0]);
+ }
for (int ce_level = 0; ce_level < 4; ce_level++) {
- for (i = 0; i < 64; i++) free_and_zero(prach_vars_br->prach_ifft[ce_level][i]);
-
- free_and_zero(prach_vars_br->prach_ifft[ce_level]);
+ if (prach_vars_br->prach_ifft[ce_level]) {
+ for (i = 0; i < 64; i++) {
+ free_and_zero(prach_vars_br->prach_ifft[ce_level][i]);
+ }
+ free_and_zero(prach_vars_br->prach_ifft[ce_level]);
+ }
free_and_zero(prach_vars->rxsigF[ce_level]);
}
diff --git a/openair1/PHY/INIT/lte_init_ue.c b/openair1/PHY/INIT/lte_init_ue.c
index b75673581687731b5d51bd9eac0c9fd0d4802fde..c3f09fa78c3c6925af5891992e8f52aff2090ad7 100644
--- a/openair1/PHY/INIT/lte_init_ue.c
+++ b/openair1/PHY/INIT/lte_init_ue.c
@@ -548,7 +548,7 @@ void phy_config_dedicated_ue(module_id_t Mod_id,int CC_id,uint8_t eNB_id,
phy_vars_ue->decode_MIB = 0;
}
- if(NFAPI_MODE!=NFAPI_UE_STUB_PNF) {
+ if(NFAPI_MODE!=NFAPI_UE_STUB_PNF && NFAPI_MODE!=NFAPI_MODE_STANDALONE_PNF) {
//phy_vars_ue->pdcch_vars[1][eNB_id]->crnti = phy_vars_ue->pdcch_vars[0][eNB_id]->crnti;
if(phy_vars_ue->pdcch_vars[0][eNB_id]->crnti == 0x1234)
phy_vars_ue->pdcch_vars[0][eNB_id]->crnti = phy_vars_ue->pdcch_vars[1][eNB_id]->crnti;
diff --git a/openair1/PHY/INIT/nr_init.c b/openair1/PHY/INIT/nr_init.c
index 32e190679d1ecdd017a3147084c945a844661727..b2e0fca578798c91f0d8a30c96464caa82022043 100644
--- a/openair1/PHY/INIT/nr_init.c
+++ b/openair1/PHY/INIT/nr_init.c
@@ -486,7 +486,7 @@ void nr_phy_config_request(NR_PHY_Config_t *phy_config) {
LOG_I(PHY, "DL frequency %lu Hz, UL frequency %lu Hz: band %d, uldl offset %d Hz\n", fp->dl_CarrierFreq, fp->ul_CarrierFreq, fp->nr_band, dlul_offset);
fp->threequarter_fs = openair0_cfg[0].threequarter_fs;
- LOG_I(PHY,"Configuring MIB for instance %d, : (Nid_cell %d,DL freq %llu, UL freq %llu)\n",
+ LOG_A(PHY,"Configuring MIB for instance %d, : (Nid_cell %d,DL freq %llu, UL freq %llu)\n",
Mod_id,
gNB_config->cell_config.phy_cell_id.value,
(unsigned long long)fp->dl_CarrierFreq,
diff --git a/openair1/PHY/LTE_TRANSPORT/dlsch_modulation.c b/openair1/PHY/LTE_TRANSPORT/dlsch_modulation.c
index aba4a464f2bcbbfbef7b008b4801216891674ea0..c6b312cc61a1ffd34e38e6573b9aeae8f16a6825 100644
--- a/openair1/PHY/LTE_TRANSPORT/dlsch_modulation.c
+++ b/openair1/PHY/LTE_TRANSPORT/dlsch_modulation.c
@@ -2921,6 +2921,9 @@ int allocate_REs_in_RB_MCH_khz_1dot25(int32_t **txdataF,
uint8_t skip_dc,
LTE_DL_FRAME_PARMS *frame_parms)
{
+ if (!qam_table_s)
+ abort();
+
uint32_t tti_offset;
uint8_t re,offset;
uint8_t qam64_table_offset_re = 0;
diff --git a/openair1/SCHED/phy_procedures_lte_eNb.c b/openair1/SCHED/phy_procedures_lte_eNb.c
index 973c921d2347d7c14f276af87255c83a067b5988..1b10fb00f5845e4e21e8a924ec79812a0be124b7 100644
--- a/openair1/SCHED/phy_procedures_lte_eNb.c
+++ b/openair1/SCHED/phy_procedures_lte_eNb.c
@@ -755,6 +755,7 @@ void fill_sr_indication(int UEid, PHY_VARS_eNB *eNB,uint16_t rnti,int frame,int
pthread_mutex_lock(&eNB->UL_INFO_mutex);
nfapi_sr_indication_t *sr_ind = &eNB->UL_INFO.sr_ind;
nfapi_sr_indication_body_t *sr_ind_body = &sr_ind->sr_indication_body;
+ assert(sr_ind_body->number_of_srs <= NFAPI_SR_IND_MAX_PDU);
nfapi_sr_indication_pdu_t *pdu = &sr_ind_body->sr_pdu_list[sr_ind_body->number_of_srs];
sr_ind->sfn_sf = frame<<4|subframe;
sr_ind->header.message_id = NFAPI_RX_SR_INDICATION;
@@ -1580,6 +1581,7 @@ void fill_rx_indication(PHY_VARS_eNB *eNB,
pthread_mutex_lock(&eNB->UL_INFO_mutex);
eNB->UL_INFO.rx_ind.sfn_sf = frame<<4| subframe;
eNB->UL_INFO.rx_ind.rx_indication_body.tl.tag = NFAPI_RX_INDICATION_BODY_TAG;
+ assert(eNB->UL_INFO.rx_ind.rx_indication_body.number_of_pdus <= NFAPI_RX_IND_MAX_PDU);
pdu = &eNB->UL_INFO.rx_ind.rx_indication_body.rx_pdu_list[eNB->UL_INFO.rx_ind.rx_indication_body.number_of_pdus];
// pdu->rx_ue_information.handle = eNB->ulsch[ULSCH_id]->handle;
pdu->rx_ue_information.tl.tag = NFAPI_RX_UE_INFORMATION_TAG;
@@ -1832,6 +1834,7 @@ int getM(PHY_VARS_eNB *eNB,int frame,int subframe) {
void fill_ulsch_cqi_indication (PHY_VARS_eNB *eNB, uint16_t frame, uint8_t subframe, LTE_UL_eNB_HARQ_t *ulsch_harq, uint16_t rnti) {
pthread_mutex_lock (&eNB->UL_INFO_mutex);
+ assert(eNB->UL_INFO.cqi_ind.cqi_indication_body.number_of_cqis <= NFAPI_CQI_IND_MAX_PDU);
nfapi_cqi_indication_pdu_t *pdu = &eNB->UL_INFO.cqi_ind.cqi_indication_body.cqi_pdu_list[eNB->UL_INFO.cqi_ind.cqi_indication_body.number_of_cqis];
nfapi_cqi_indication_raw_pdu_t *raw_pdu = &eNB->UL_INFO.cqi_ind.cqi_indication_body.cqi_raw_pdu_list[eNB->UL_INFO.cqi_ind.cqi_indication_body.number_of_cqis];
pdu->instance_length = 0;
@@ -1878,6 +1881,7 @@ void fill_ulsch_harq_indication (PHY_VARS_eNB *eNB, LTE_UL_eNB_HARQ_t *ulsch_har
//AssertFatal(DLSCH_id>=0,"DLSCH_id doesn't exist\n");
pthread_mutex_lock(&eNB->UL_INFO_mutex);
+ assert(eNB->UL_INFO.harq_ind.harq_indication_body.number_of_harqs <= NFAPI_HARQ_IND_MAX_PDU);
nfapi_harq_indication_pdu_t *pdu = &eNB->UL_INFO.harq_ind.harq_indication_body.harq_pdu_list[eNB->UL_INFO.harq_ind.harq_indication_body.number_of_harqs];
int M;
int i;
@@ -1948,6 +1952,7 @@ void fill_uci_harq_indication (int UEid, PHY_VARS_eNB *eNB, LTE_eNB_UCI *uci, in
pthread_mutex_lock(&eNB->UL_INFO_mutex);
nfapi_harq_indication_t *ind = &eNB->UL_INFO.harq_ind;
nfapi_harq_indication_body_t *body = &ind->harq_indication_body;
+ assert(eNB->UL_INFO.harq_ind.harq_indication_body.number_of_harqs <= NFAPI_HARQ_IND_MAX_PDU);
nfapi_harq_indication_pdu_t *pdu = &body->harq_pdu_list[eNB->UL_INFO.harq_ind.harq_indication_body.number_of_harqs];
ind->sfn_sf = frame<<4|subframe;
ind->header.message_id = NFAPI_HARQ_INDICATION;
@@ -2124,6 +2129,7 @@ void fill_uci_harq_indication (int UEid, PHY_VARS_eNB *eNB, LTE_eNB_UCI *uci, in
void fill_crc_indication (PHY_VARS_eNB *eNB, int ULSCH_id, int frame, int subframe, uint8_t crc_flag) {
pthread_mutex_lock(&eNB->UL_INFO_mutex);
+ assert(eNB->UL_INFO.crc_ind.crc_indication_body.number_of_crcs <= NFAPI_CRC_IND_MAX_PDU);
nfapi_crc_indication_pdu_t *pdu = &eNB->UL_INFO.crc_ind.crc_indication_body.crc_pdu_list[eNB->UL_INFO.crc_ind.crc_indication_body.number_of_crcs];
eNB->UL_INFO.crc_ind.sfn_sf = frame<<4 | subframe;
eNB->UL_INFO.crc_ind.header.message_id = NFAPI_CRC_INDICATION;
diff --git a/openair1/SCHED_UE/pusch_pc.c b/openair1/SCHED_UE/pusch_pc.c
index 503d73005f25adcc5bd7afe8b8d2fe61ff0af2ea..55c8c7c547cfd2055e28bdc1eba3f9329ac544b8 100644
--- a/openair1/SCHED_UE/pusch_pc.c
+++ b/openair1/SCHED_UE/pusch_pc.c
@@ -115,7 +115,7 @@ void pusch_power_cntl(PHY_VARS_UE *ue,UE_rxtx_proc_t *proc,uint8_t eNB_id,uint8_
}
int8_t get_PHR(uint8_t Mod_id, uint8_t CC_id,uint8_t eNB_index) {
- if(NFAPI_MODE!=NFAPI_UE_STUB_PNF)
+ if(NFAPI_MODE!=NFAPI_UE_STUB_PNF && NFAPI_MODE!=NFAPI_MODE_STANDALONE_PNF)
return PHY_vars_UE_g[Mod_id][CC_id]->ulsch[eNB_index]->PHR;
else
return 40; // l1l2 simulator => ideal conditions
diff --git a/openair1/SIMULATION/ETH_TRANSPORT/netlink_init.c b/openair1/SIMULATION/ETH_TRANSPORT/netlink_init.c
index 9b4aba46c394f1715b6209bcb802449fddd5c450..17ce2ecd5ee04f8fd8f9389a12e87d128d9c0938 100644
--- a/openair1/SIMULATION/ETH_TRANSPORT/netlink_init.c
+++ b/openair1/SIMULATION/ETH_TRANSPORT/netlink_init.c
@@ -95,11 +95,16 @@ static int tun_alloc(char *dev) {
}
-int netlink_init_mbms_tun(char *ifprefix) {
+int netlink_init_mbms_tun(char *ifprefix, int id) {//for UE, id = 1, 2, ...,
int ret;
char ifname[64];
- sprintf(ifname, "oaitun_%.3s1",ifprefix); // added "1": for historical reasons
+ if ( id > 0 ){
+ sprintf(ifname, "oaitun_%.3s%d",ifprefix, id-1);
+ }
+ else{
+ sprintf(ifname, "oaitun_%.3s1",ifprefix); // added "1": for historical reasons
+ }
nas_sock_mbms_fd = tun_alloc(ifname);
if (nas_sock_mbms_fd == -1) {
@@ -128,6 +133,7 @@ int netlink_init_mbms_tun(char *ifprefix) {
nas_dest_addr.nl_pid = 0; /* For Linux Kernel */
nas_dest_addr.nl_groups = 0; /* unicast */
// TX PART
+ free(nas_nlh_tx);
nas_nlh_tx=(struct nlmsghdr *)malloc(NLMSG_SPACE(NL_MAX_PAYLOAD));
memset(nas_nlh_tx, 0, NLMSG_SPACE(NL_MAX_PAYLOAD));
/* Fill the netlink message header */
@@ -151,11 +157,13 @@ int netlink_init_mbms_tun(char *ifprefix) {
return 1;
}
-int netlink_init_tun(char *ifprefix, int num_if) {
+int netlink_init_tun(char *ifprefix, int num_if, int id) {//for UE, id = 1, 2, ...,
int ret;
char ifname[64];
- for (int i = 0; i < num_if; i++) {
+ int begx = (id == 0) ? 0 : id - 1;
+ int endx = (id == 0) ? num_if : id;
+ for (int i = begx; i < endx; i++) {
sprintf(ifname, "oaitun_%.3s%d",ifprefix,i+1);
nas_sock_fd[i] = tun_alloc(ifname);
@@ -186,6 +194,7 @@ int netlink_init_tun(char *ifprefix, int num_if) {
nas_dest_addr.nl_pid = 0; /* For Linux Kernel */
nas_dest_addr.nl_groups = 0; /* unicast */
// TX PART
+ free(nas_nlh_tx);
nas_nlh_tx=(struct nlmsghdr *)malloc(NLMSG_SPACE(NL_MAX_PAYLOAD));
memset(nas_nlh_tx, 0, NLMSG_SPACE(NL_MAX_PAYLOAD));
/* Fill the netlink message header */
@@ -244,6 +253,7 @@ int netlink_init(void) {
nas_dest_addr.nl_pid = 0; /* For Linux Kernel */
nas_dest_addr.nl_groups = 0; /* unicast */
// TX PART
+ free(nas_nlh_tx);
nas_nlh_tx=(struct nlmsghdr *)malloc(NLMSG_SPACE(NL_MAX_PAYLOAD));
memset(nas_nlh_tx, 0, NLMSG_SPACE(NL_MAX_PAYLOAD));
/* Fill the netlink message header */
@@ -266,3 +276,8 @@ int netlink_init(void) {
return(nas_sock_fd[0]);
}
+void netlink_cleanup(void)
+{
+ free(nas_nlh_tx);
+ nas_nlh_tx = NULL;
+}
diff --git a/openair1/SIMULATION/ETH_TRANSPORT/proto.h b/openair1/SIMULATION/ETH_TRANSPORT/proto.h
index e6159199d40898b0d8357a03cac3210a8c0d4426..bc6990ac3e84fdb45d781490e7f58cc64d633d0c 100644
--- a/openair1/SIMULATION/ETH_TRANSPORT/proto.h
+++ b/openair1/SIMULATION/ETH_TRANSPORT/proto.h
@@ -62,7 +62,8 @@ int multicast_link_read_data_from_sock(uint8_t eNB_flag);
void clear_eNB_transport_info(uint8_t);
void clear_UE_transport_info(uint8_t);
int netlink_init(void);
-int netlink_init_tun(char *ifsuffix, int num_if);
-int netlink_init_mbms_tun(char *ifsuffix);
+int netlink_init_tun(char *ifsuffix, int num_if, int id);
+int netlink_init_mbms_tun(char *ifsuffix, int id);
+void netlink_cleanup(void);
#endif /* EMU_PROTO_H_ */
diff --git a/openair1/SIMULATION/NR_PHY/pbchsim.c b/openair1/SIMULATION/NR_PHY/pbchsim.c
index 46b42666b58746a5b85a2bff4f97d111645adc07..1ea1bf1d7493e7eb7e704bea7d8b7cf00e3d67f7 100644
--- a/openair1/SIMULATION/NR_PHY/pbchsim.c
+++ b/openair1/SIMULATION/NR_PHY/pbchsim.c
@@ -192,6 +192,7 @@ int main(int argc, char **argv)
int frame=0;
int frame_length_complex_samples;
+ __attribute__((unused))
int frame_length_complex_samples_no_prefix;
NR_DL_FRAME_PARMS *frame_parms;
diff --git a/openair1/SIMULATION/NR_PHY/ulsim.c b/openair1/SIMULATION/NR_PHY/ulsim.c
index e267c8b6d7410379bdd6ee8a8ec5c58c2472ecb3..fc91263a3790a9c692c6d412996079a756b137e7 100644
--- a/openair1/SIMULATION/NR_PHY/ulsim.c
+++ b/openair1/SIMULATION/NR_PHY/ulsim.c
@@ -1246,8 +1246,10 @@ int main(int argc, char **argv)
if (n_trials == 1 && round==0) {
#ifdef __AVX2__
+ __attribute__((unused))
int off = ((nb_rb&1) == 1)? 4:0;
#else
+ __attribute__((unused))
int off = 0;
#endif
diff --git a/openair1/SIMULATION/TOOLS/taus.c b/openair1/SIMULATION/TOOLS/taus.c
index cdd4aebec3dff23605946f97d1fb45e3e9ba81f1..a9d2750c06374d80d4b0575176c7bd65e56feccf 100644
--- a/openair1/SIMULATION/TOOLS/taus.c
+++ b/openair1/SIMULATION/TOOLS/taus.c
@@ -21,10 +21,12 @@
#include
#include
+#include
+#include
//#include "SIMULATION/TOOLS/sim.h"
-unsigned int s0, s1, s2, b;
+static unsigned int s0, s1, s2;
//----------------------------------------------
//
@@ -34,7 +36,7 @@ unsigned int s0, s1, s2, b;
unsigned int taus(void)
{
- b = (((s0 << 13) ^ s0) >> 19);
+ unsigned int b = (((s0 << 13) ^ s0) >> 19);
s0 = (((s0 & 0xFFFFFFFE) << 12)^ b);
b = (((s1 << 2) ^ s1) >> 25);
s1 = (((s1 & 0xFFFFFFF8) << 4)^ b);
@@ -50,9 +52,20 @@ void set_taus_seed(unsigned int seed_init)
unsigned long result = 0;
if (seed_init == 0) {
- s0 = (unsigned int)time(NULL);
- s1 = (unsigned int)time(NULL);
- s2 = (unsigned int)time(NULL);
+ unsigned int data[3];
+ int fd = open("/dev/urandom", O_RDONLY);
+ if (fd == -1)
+ {
+ abort();
+ }
+ if (read(fd, data, sizeof(data)) != sizeof(data))
+ {
+ abort();
+ }
+ close(fd);
+ s0 = data[0];
+ s1 = data[1];
+ s2 = data[2];
} else {
/* Use reentrant version of rand48 to ensure that no conflicts with other generators occur */
srand48_r((long int)seed_init, &buffer);
diff --git a/openair2/COMMON/platform_constants.h b/openair2/COMMON/platform_constants.h
index c56a31711a081d73465266abf3681cb94814427f..f0447a0d461ae32ca171ab8e82fd0df90224714a 100644
--- a/openair2/COMMON/platform_constants.h
+++ b/openair2/COMMON/platform_constants.h
@@ -75,8 +75,8 @@
#define MAX_eNB 2
#define MAX_gNB 2
#else
- #define MAX_MOBILES_PER_ENB 4
- #define MAX_MOBILES_PER_ENB_NB_IoT 4
+ #define MAX_MOBILES_PER_ENB 40
+ #define MAX_MOBILES_PER_ENB_NB_IoT 40
#define MAX_MOBILES_PER_GNB 2//16
#define MAX_eNB 2
#define MAX_gNB 2
diff --git a/openair2/GNB_APP/gnb_app.c b/openair2/GNB_APP/gnb_app.c
index 510402139995171f0dc43fab6b1eacbea3989cec..eea8cfe95303a363035e2e5be1bf4df38aa1090a 100644
--- a/openair2/GNB_APP/gnb_app.c
+++ b/openair2/GNB_APP/gnb_app.c
@@ -144,7 +144,7 @@ static void init_pdcp(void) {
pdcp_initmask = pdcp_initmask | ENB_NAS_USE_TUN_BIT | SOFTMODEM_NOKRNMOD_BIT;
}
- pdcp_module_init(pdcp_initmask);
+ pdcp_module_init(pdcp_initmask, 0);
if (NODE_IS_CU(RC.nrrrc[0]->node_type)) {
LOG_I(PDCP, "node is CU, pdcp send rlc_data_req by proto_agent \n");
diff --git a/openair2/LAYER2/MAC/config.c b/openair2/LAYER2/MAC/config.c
index 8d4a53da6c21cad4d1e0d49ad7b2f91addde0a5f..209275acb38c69c6351fce0f87ed7fda56589662 100644
--- a/openair2/LAYER2/MAC/config.c
+++ b/openair2/LAYER2/MAC/config.c
@@ -799,7 +799,7 @@ int rrc_mac_config_req_eNB(module_id_t Mod_idP,
RC.mac[Mod_idP]->common_channels[CC_idP].Ncp = Ncp;
RC.mac[Mod_idP]->common_channels[CC_idP].eutra_band = eutra_band;
RC.mac[Mod_idP]->common_channels[CC_idP].dl_CarrierFreq = dl_CarrierFreq;
- LOG_I(MAC,
+ LOG_A(MAC,
"Configuring MIB for instance %d, CCid %d : (band %d,N_RB_DL %d,Nid_cell %d,p %d,DL freq %u,phich_config.resource %d, phich_config.duration %d)\n",
Mod_idP,
CC_idP,
@@ -1067,7 +1067,7 @@ int rrc_mac_config_req_eNB(module_id_t Mod_idP,
while(RC.mac[Mod_idP]->if_inst->PHY_config_req == NULL) {
// DJP AssertFatal(RC.mac[Mod_idP]->if_inst->PHY_config_req != NULL,"if_inst->phy_config_request is null\n");
usleep(100 * 1000);
- printf("Waiting for PHY_config_req\n");
+ LOG_I(MAC, "Waiting for PHY_config_req\n");
}
}
diff --git a/openair2/LAYER2/MAC/config_ue.c b/openair2/LAYER2/MAC/config_ue.c
index f5c12e710d35103c2056206dfe28247e9d329c68..3cfc725fdb3f4d6e249740deccff972d0908bad9 100644
--- a/openair2/LAYER2/MAC/config_ue.c
+++ b/openair2/LAYER2/MAC/config_ue.c
@@ -200,7 +200,7 @@ rrc_mac_config_req_ue(module_id_t Mod_idP,
LTE_MAC_MainConfig__ul_SCH_Config__maxHARQ_Tx_n5;
}
- if(NFAPI_MODE != NFAPI_UE_STUB_PNF)
+ if(NFAPI_MODE!=NFAPI_UE_STUB_PNF && NFAPI_MODE!=NFAPI_MODE_STANDALONE_PNF)
phy_config_harq_ue(Mod_idP, 0, eNB_index, UE_mac_inst[Mod_idP].scheduling_info.maxHARQ_Tx);
if (mac_MainConfig->ul_SCH_Config->retxBSR_Timer) {
@@ -308,7 +308,7 @@ rrc_mac_config_req_ue(module_id_t Mod_idP,
}
if (physicalConfigDedicated != NULL) {
- if(NFAPI_MODE != NFAPI_UE_STUB_PNF)
+ if(NFAPI_MODE != NFAPI_UE_STUB_PNF && NFAPI_MODE != NFAPI_MODE_STANDALONE_PNF)
phy_config_dedicated_ue(Mod_idP, 0, eNB_index,
physicalConfigDedicated);
diff --git a/openair2/LAYER2/MAC/eNB_scheduler.c b/openair2/LAYER2/MAC/eNB_scheduler.c
index 9d07018e2feddeea160bd9af1b94e6f20122e7e4..50b38e9ef1b9011fd4179b4ceca2a8423bdb804c 100644
--- a/openair2/LAYER2/MAC/eNB_scheduler.c
+++ b/openair2/LAYER2/MAC/eNB_scheduler.c
@@ -313,6 +313,7 @@ schedule_SR (module_id_t module_idP,
nfapi_ul_config_request_body_t *ul_req_body = NULL;
LTE_SchedulingRequestConfig_t *SRconfig = NULL;
nfapi_ul_config_sr_information sr;
+ memset(&sr, 0, sizeof(sr));
for (int CC_id = 0; CC_id < MAX_NUM_CCs; CC_id++) {
eNB->UL_req[CC_id].sfn_sf = (frameP << 4) + subframeP;
@@ -573,6 +574,27 @@ eNB_dlsch_ulsch_scheduler(module_id_t module_idP,
UE_sched_ctrl_t *UE_scheduling_control = NULL;
start_meas(&(eNB->eNB_scheduler));
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_ENB_DLSCH_ULSCH_SCHEDULER, VCD_FUNCTION_IN);
+ // TODO: Better solution needed this is the first
+ // 3 indications of this function on startup
+ // 1303275.278188 [MAC] XXX 0.0 -> 0.4 = 4
+ // 1303275.279443 [MAC] XXX 0.4 -> 639.5 = 6391
+ // 1303275.348686 [MAC] XXX 646.3 -> 646.3 = 0
+ int delta = (frameP * 10 + subframeP) - (eNB->frame * 10 + eNB->subframe);
+ if (delta < 0)
+ {
+ delta += 10240; // sfn_sf decimal values range from 0 to 10239
+ }
+ // If we ever see a difference this big something is very wrong
+ // This threshold is arbitrary
+ if (delta > 8500 || delta == 0) // 850 frames
+ {
+ LOG_D(MAC, "scheduler ignoring outerspace %d.%d -> %d.%d = %d\n",
+ eNB->frame, eNB->subframe, frameP, subframeP, delta);
+ return;
+ }
+ LOG_D(MAC, "Entering dlsch_ulsch scheduler %d.%d -> %d.%d = %d\n",
+ eNB->frame, eNB->subframe, frameP, subframeP, delta);
+
eNB->frame = frameP;
eNB->subframe = subframeP;
diff --git a/openair2/LAYER2/MAC/eNB_scheduler_RA.c b/openair2/LAYER2/MAC/eNB_scheduler_RA.c
index 8a400af1f30a4b7576aad53ad6062c4ae013c9aa..d057d7d7b26bc55fd566a59fad64ea220b460163 100644
--- a/openair2/LAYER2/MAC/eNB_scheduler_RA.c
+++ b/openair2/LAYER2/MAC/eNB_scheduler_RA.c
@@ -918,7 +918,7 @@ generate_Msg4(module_id_t module_idP,
module_idP, CC_idP, frameP, subframeP, UE_id, rrc_sdu_length);
// AssertFatal(rrc_sdu_length > 0,
// "[MAC][eNB Scheduler] CCCH not allocated, rrc_sdu_length: %d\n", rrc_sdu_length);
- LOG_D(MAC,"[eNB %d][RAPROC] CC_id %d Frame %d, subframeP %d: Generating Msg4 with RRC Piggyback (RNTI %x)\n",
+ LOG_A(MAC,"[eNB %d][RAPROC] CC_id %d Frame %d, subframeP %d: Generating Msg4 with RRC Piggyback (RNTI %x)\n",
module_idP, CC_idP, frameP, subframeP, ra->rnti);
/// Choose first 4 RBs for Msg4, should really check that these are free!
first_rb = 0;
@@ -1288,7 +1288,7 @@ initiate_ra_proc(module_id_t module_idP,
prach_ParametersListCE_r13 = &ext4_prach->prach_ParametersListCE_r13;
}
- LOG_D(MAC,
+ LOG_I(MAC,
"[eNB %d][RAPROC] CC_id %d Frame %d, Subframe %d Initiating RA procedure for preamble index %d, timing offset %d\n",
module_idP, CC_id, frameP, subframeP, preamble_index, timing_offset);
LOG_D(MAC,
diff --git a/openair2/LAYER2/MAC/eNB_scheduler_fairRR.c b/openair2/LAYER2/MAC/eNB_scheduler_fairRR.c
index e9f0b807c4f7d44f9a0360fd4b22e6a5b924d5b0..f086f8e898119e40278b4e1e8570aa15bcbd22ab 100644
--- a/openair2/LAYER2/MAC/eNB_scheduler_fairRR.c
+++ b/openair2/LAYER2/MAC/eNB_scheduler_fairRR.c
@@ -1018,8 +1018,8 @@ void dlsch_scheduler_pre_processor_fairRR (module_id_t Mod_id,
UE_id,
CC_id,
N_RBG[CC_id],
- (uint16_t(*)[NUMBER_OF_UE_MAX])nb_rbs_required,
- (uint16_t(*)[NUMBER_OF_UE_MAX])nb_rbs_required_remaining,
+ nb_rbs_required,
+ nb_rbs_required_remaining,
rballoc_sub);
temp_total_rbs_count -= ue_sched_ctl->pre_nb_available_rbs[CC_id];
temp_total_ue_count--;
diff --git a/openair2/LAYER2/MAC/main_ue.c b/openair2/LAYER2/MAC/main_ue.c
index 2140d66a1024e93ebeefc908c042c8371e9e6442..67cc14a782f9c127217940f314c1e93ab5de8639 100644
--- a/openair2/LAYER2/MAC/main_ue.c
+++ b/openair2/LAYER2/MAC/main_ue.c
@@ -41,10 +41,10 @@
#include "common/utils/LOG/log.h"
#include "nfapi/oai_integration/vendor_ext.h"
#include "RRC/L2_INTERFACE/openair_rrc_L2_interface.h"
-
-
+#include "PHY_INTERFACE/phy_stub_UE.h"
#include "common/ran_context.h"
#include
+
void dl_phy_sync_success(module_id_t module_idP, frame_t frameP, unsigned char eNB_index, uint8_t first_sync) { //init as MR
LOG_D(MAC, "[UE %d] Frame %d: PHY Sync to eNB_index %d successful \n",
module_idP, frameP, eNB_index);
@@ -88,6 +88,16 @@ mac_top_init_ue(int eMBMS_active, char *uecap_xer,
UE_mac_inst = NULL;
}
+ // mutex below are used for multiple UE's L2 FAPI simulation.
+ if (NFAPI_MODE == NFAPI_UE_STUB_PNF || NFAPI_MODE == NFAPI_MODE_STANDALONE_PNF) {
+ pthread_mutex_init(&fill_ul_mutex.rx_mutex,NULL);
+ pthread_mutex_init(&fill_ul_mutex.crc_mutex,NULL);
+ pthread_mutex_init(&fill_ul_mutex.sr_mutex,NULL);
+ pthread_mutex_init(&fill_ul_mutex.harq_mutex,NULL);
+ pthread_mutex_init(&fill_ul_mutex.cqi_mutex,NULL);
+ pthread_mutex_init(&fill_ul_mutex.rach_mutex,NULL);
+ }
+
LOG_I(MAC, "[MAIN] calling RRC\n");
openair_rrc_top_init_ue(eMBMS_active, uecap_xer, cba_group_active,
HO_active);
@@ -118,4 +128,3 @@ l2_init_ue(int eMBMS_active, char *uecap_xer, uint8_t cba_group_active,
mac_top_init_ue(eMBMS_active, uecap_xer, cba_group_active, HO_active);
return (1);
}
-
diff --git a/openair2/LAYER2/MAC/ra_procedures.c b/openair2/LAYER2/MAC/ra_procedures.c
index 0d1afdf2a247814aed4ecac945051130544b4339..237560917a34fe3f73c3c7cfbef44fcf5e44a3d5 100644
--- a/openair2/LAYER2/MAC/ra_procedures.c
+++ b/openair2/LAYER2/MAC/ra_procedures.c
@@ -289,7 +289,7 @@ PRACH_RESOURCES_t *ue_get_rach(module_id_t module_idP, int CC_id,
UE_MODE_t UE_mode;
// Modification for phy_stub_ue operation
- if(NFAPI_MODE == NFAPI_UE_STUB_PNF) { // phy_stub_ue mode
+ if(NFAPI_MODE == NFAPI_UE_STUB_PNF || NFAPI_MODE == NFAPI_MODE_STANDALONE_PNF) { // phy_stub_ue mode
UE_mode = UE_mac_inst[module_idP].UE_mode[0];
LOG_D(MAC, "ue_get_rach , UE_mode: %d", UE_mode);
} else { // Full stack mode
diff --git a/openair2/LAYER2/MAC/rar_tools_ue.c b/openair2/LAYER2/MAC/rar_tools_ue.c
index 611aaf865b27d1d36f21785f7dbdcfa2ef086764..9af5baec3998bedd25bc552087668fe1ff2356f8 100644
--- a/openair2/LAYER2/MAC/rar_tools_ue.c
+++ b/openair2/LAYER2/MAC/rar_tools_ue.c
@@ -67,6 +67,7 @@ uint16_t ue_process_rar(const module_id_t module_idP, const int CC_id, const fra
LOG_D(PHY, "Found RAR with the intended RAPID %d\n",
rarh->RAPID);
rar = (uint8_t *) (dlsch_buffer + n_rarh + (n_rarpy - 1) * 6);
+ UE_mac_inst[module_idP].UE_mode[0] = RA_RESPONSE;
break;
}
@@ -77,9 +78,10 @@ uint16_t ue_process_rar(const module_id_t module_idP, const int CC_id, const fra
}
if (rarh->E == 0) {
- LOG_I(PHY,
+ LOG_I(MAC,
"No RAR found with the intended RAPID. The closest RAPID in all RARs is %d\n",
best_rx_rapid);
+ UE_mac_inst[module_idP].UE_mode[0] = PRACH;
break;
} else {
rarh++;
@@ -94,7 +96,7 @@ uint16_t ue_process_rar(const module_id_t module_idP, const int CC_id, const fra
return (0xffff);
}
- LOG_I(MAC,
+ LOG_A(MAC,
"[UE %d][RAPROC] Frame %d Received RAR (%02x|%02x.%02x.%02x.%02x.%02x.%02x) for preamble %d/%d\n",
module_idP, frameP, *(uint8_t *) rarh, rar[0], rar[1], rar[2],
rar[3], rar[4], rar[5], rarh->RAPID, preamble_index);
@@ -130,7 +132,7 @@ uint16_t ue_process_rar(const module_id_t module_idP, const int CC_id, const fra
}
// move the selected RAR to the front of the RA_PDSCH buffer
- memcpy(selected_rar_buffer + 0, (uint8_t *) rarh, 1);
- memcpy(selected_rar_buffer + 1, (uint8_t *) rar, 6);
+ memmove(selected_rar_buffer + 0, (uint8_t *) rarh, 1);
+ memmove(selected_rar_buffer + 1, (uint8_t *) rar, 6);
return ret;
}
diff --git a/openair2/LAYER2/MAC/ue_procedures.c b/openair2/LAYER2/MAC/ue_procedures.c
index 9ae8f82a00cd2d0363c4cb4c644bd36ce2051c5e..15761f1d7410ecafd57dc6744a15e365e1651fa4 100644
--- a/openair2/LAYER2/MAC/ue_procedures.c
+++ b/openair2/LAYER2/MAC/ue_procedures.c
@@ -156,15 +156,13 @@ void ue_init_mac(module_id_t module_idP) {
UE_mac_inst[module_idP].scheduling_info.LCID_buffer_remain[i] = 0;
}
- if(NFAPI_MODE==NFAPI_UE_STUB_PNF) {
+ if(NFAPI_MODE==NFAPI_UE_STUB_PNF || NFAPI_MODE==NFAPI_MODE_STANDALONE_PNF) {
pthread_mutex_init(&UE_mac_inst[module_idP].UL_INFO_mutex,NULL);
- UE_mac_inst[module_idP].UE_mode[0] = NOT_SYNCHED; //PRACH;
+ UE_mac_inst[module_idP].UE_mode[0] = PRACH; //NOT_SYNCHED;
UE_mac_inst[module_idP].first_ULSCH_Tx =0;
UE_mac_inst[module_idP].SI_Decoded = 0;
next_ra_frame = 0;
next_Mod_id = 0;
- tx_request_pdu_list = NULL;
- tx_req_num_elems = 0;
}
}
@@ -418,7 +416,7 @@ ue_send_sdu(module_id_t module_idP,
if (payload_ptr != NULL) {
for (i = 0; i < num_ce; i++) {
- // printf("ce %d : %d\n",i,rx_ces[i]);
+ LOG_I(MAC, "ce %d : %d\n",i,rx_ces[i]);
switch (rx_ces[i]) {
case UE_CONT_RES:
LOG_I(MAC,
@@ -443,7 +441,7 @@ ue_send_sdu(module_id_t module_idP,
"[UE %d][RAPROC] Contention detected, RA failed\n",
module_idP);
- if(NFAPI_MODE==NFAPI_UE_STUB_PNF) { // phy_stub mode
+ if(NFAPI_MODE==NFAPI_UE_STUB_PNF || NFAPI_MODE==NFAPI_MODE_STANDALONE_PNF) { // phy_stub mode
// Modification for phy_stub mode operation here. We only need to make sure that the ue_mode is back to
// PRACH state.
LOG_I(MAC, "nfapi_mode3: Setting UE_mode BACK to PRACH 1\n");
@@ -469,7 +467,7 @@ ue_send_sdu(module_id_t module_idP,
[module_idP].
RA_contention_resolution_timer_active = 0;
- if(NFAPI_MODE==NFAPI_UE_STUB_PNF) { // phy_stub mode
+ if(NFAPI_MODE==NFAPI_UE_STUB_PNF || NFAPI_MODE==NFAPI_MODE_STANDALONE_PNF) { // phy_stub mode
// Modification for phy_stub mode operation here. We only need to change the ue_mode to PUSCH
UE_mac_inst[module_idP].UE_mode[eNB_index] = PUSCH;
} else { // Full stack mode
@@ -487,7 +485,7 @@ ue_send_sdu(module_id_t module_idP,
#endif
// Eliminate call to process_timing_advance for the phy_stub UE operation mode. Is this correct?
- if (NFAPI_MODE!=NFAPI_UE_STUB_PNF) {
+ if (NFAPI_MODE!=NFAPI_UE_STUB_PNF && NFAPI_MODE!=NFAPI_MODE_STANDALONE_PNF) {
process_timing_advance(module_idP,CC_id,payload_ptr[0]);
}
@@ -2747,7 +2745,7 @@ ue_get_sdu(module_id_t module_idP, int CC_id, frame_t frameP,
// build PHR and update the timers
if (phr_ce_len == sizeof(POWER_HEADROOM_CMD)) {
- if(NFAPI_MODE==NFAPI_UE_STUB_PNF) {
+ if(NFAPI_MODE==NFAPI_UE_STUB_PNF || NFAPI_MODE==NFAPI_MODE_STANDALONE_PNF) {
//Substitute with a static value for the MAC layer abstraction (phy_stub mode)
phr_p->PH = 60;
} else {
@@ -3198,7 +3196,7 @@ ue_scheduler(const module_id_t module_idP,
"Module id %u Contention resolution timer expired, RA failed\n",
module_idP);
- if(NFAPI_MODE==NFAPI_UE_STUB_PNF) { // phy_stub mode
+ if(NFAPI_MODE==NFAPI_UE_STUB_PNF || NFAPI_MODE==NFAPI_MODE_STANDALONE_PNF) { // phy_stub mode
// Modification for phy_stub mode operation here. We only need to make sure that the ue_mode is back to
// PRACH state.
LOG_I(MAC, "nfapi_mode3: Setting UE_mode to PRACH 2 \n");
diff --git a/openair2/LAYER2/PDCP_v10.1.0/pdcp.c b/openair2/LAYER2/PDCP_v10.1.0/pdcp.c
index cddb666bfdbd346cf2dc7ae4cd7837bc50d850bf..f70dd84ddb6519828d50b4ebaab627125422ea34 100644
--- a/openair2/LAYER2/PDCP_v10.1.0/pdcp.c
+++ b/openair2/LAYER2/PDCP_v10.1.0/pdcp.c
@@ -1072,7 +1072,7 @@ pdcp_data_ind(
* for the UE compiled in noS1 mode, we need 0
* TODO: be sure of this
*/
- if (NFAPI_MODE == NFAPI_UE_STUB_PNF ) {
+ if (NFAPI_MODE == NFAPI_UE_STUB_PNF || NFAPI_MODE == NFAPI_MODE_STANDALONE_PNF) {
pdcpHead->inst = ctxt_pP->module_id;
} else { // nfapi_mode
if (UE_NAS_USE_TUN) {
@@ -2342,7 +2342,7 @@ void pdcp_set_pdcp_data_ind_func(pdcp_data_ind_func_t pdcp_data_ind) {
pdcp_params.pdcp_data_ind_func = pdcp_data_ind;
}
-uint64_t pdcp_module_init( uint64_t pdcp_optmask ) {
+uint64_t pdcp_module_init( uint64_t pdcp_optmask, int id) {
/* temporary enforce netlink when UE_NAS_USE_TUN is set,
this is while switching from noS1 as build option
to noS1 as config option */
@@ -2359,18 +2359,18 @@ uint64_t pdcp_module_init( uint64_t pdcp_optmask ) {
nas_getparams();
if(UE_NAS_USE_TUN) {
- int num_if = (NFAPI_MODE == NFAPI_UE_STUB_PNF || IS_SOFTMODEM_SIML1 )? MAX_MOBILES_PER_ENB : 1;
- netlink_init_tun("ue",num_if);
+ int num_if = (NFAPI_MODE == NFAPI_UE_STUB_PNF || IS_SOFTMODEM_SIML1 || NFAPI_MODE == NFAPI_MODE_STANDALONE_PNF)? MAX_MOBILES_PER_ENB : 1;
+ netlink_init_tun("ue",num_if, id);
if (IS_SOFTMODEM_NOS1)
- nas_config(1, 1, 2, "ue");
- netlink_init_mbms_tun("uem");
+ nas_config(1, 1, 2, "ue");
+ netlink_init_mbms_tun("uem", id);
nas_config_mbms(1, 2, 2, "uem");
LOG_I(PDCP, "UE pdcp will use tun interface\n");
} else if(ENB_NAS_USE_TUN) {
- netlink_init_tun("enb",1);
+ netlink_init_tun("enb", 1, 0);
nas_config(1, 1, 1, "enb");
if(pdcp_optmask & ENB_NAS_USE_TUN_W_MBMS_BIT){
- netlink_init_mbms_tun("enm");
+ netlink_init_mbms_tun("enm", 0);
nas_config_mbms(1, 2, 1, "enm");
LOG_I(PDCP, "ENB pdcp will use mbms tun interface\n");
}
@@ -2382,8 +2382,8 @@ uint64_t pdcp_module_init( uint64_t pdcp_optmask ) {
}else{
if(pdcp_optmask & ENB_NAS_USE_TUN_W_MBMS_BIT){
LOG_W(PDCP, "ENB pdcp will use tun interface for MBMS\n");
- netlink_init_mbms_tun("enm");
- nas_config_mbms_s1(1, 2, 1, "enm");
+ netlink_init_mbms_tun("enm", 1);
+ nas_config_mbms_s1(1, 2, 1, "enm");
}else
LOG_E(PDCP, "ENB pdcp will not use tun interface\n");
}
@@ -2425,6 +2425,7 @@ pdcp_free (
void pdcp_module_cleanup (void)
//-----------------------------------------------------------------------------
{
+ netlink_cleanup();
}
//-----------------------------------------------------------------------------
diff --git a/openair2/LAYER2/PDCP_v10.1.0/pdcp.h b/openair2/LAYER2/PDCP_v10.1.0/pdcp.h
index 0c3dd2f04fed4798988e4cab59ef53d2cc29b8d4..c23a6bd2e18dfa26f85c553fc6ed87a2bf18c5a2 100644
--- a/openair2/LAYER2/PDCP_v10.1.0/pdcp.h
+++ b/openair2/LAYER2/PDCP_v10.1.0/pdcp.h
@@ -403,7 +403,7 @@ void pdcp_mbms_run (
*/
void pdcp_run (
const protocol_ctxt_t *const ctxt_pP);
-uint64_t pdcp_module_init (uint64_t pdcp_optmask);
+uint64_t pdcp_module_init (uint64_t pdcp_optmask, int ue_id);
void pdcp_module_cleanup (void);
void nr_ip_over_LTE_DRB_preconfiguration (void);
void pdcp_layer_init (void);
@@ -545,5 +545,7 @@ extern notifiedFIFO_t pdcp_sdu_list;
extern hash_table_t *pdcp_coll_p;
+extern uint16_t ue_id_g;
+
#endif
/*@}*/
diff --git a/openair2/LAYER2/PDCP_v10.1.0/pdcp_fifo.c b/openair2/LAYER2/PDCP_v10.1.0/pdcp_fifo.c
index cc44572abddc2b5a5802822b4dbd987f4384ee95..5c165e8b04278c4d339b46b9e4572f9b7b0447bd 100644
--- a/openair2/LAYER2/PDCP_v10.1.0/pdcp_fifo.c
+++ b/openair2/LAYER2/PDCP_v10.1.0/pdcp_fifo.c
@@ -89,7 +89,7 @@ extern struct msghdr nas_msg_rx;
extern int gtpv1u_new_data_req( uint8_t enb_module_idP, rnti_t ue_rntiP, uint8_t rab_idP, uint8_t *buffer_pP, uint32_t buf_lenP, uint32_t buf_offsetP);
-
+uint16_t ue_id_g;// global variable to identify ue id for each ue. Change happens only in main function of lte-uesoftmodem.c
void debug_pdcp_pc5s_sdu(sidelink_pc5s_element *sl_pc5s_msg, char *title) {
LOG_I(PDCP,"%s: \nPC5S message, header traffic_type: %d)\n", title, sl_pc5s_msg->pc5s_header.traffic_type);
@@ -124,26 +124,29 @@ int pdcp_fifo_flush_sdus(const protocol_ctxt_t *const ctxt_pP) {
} else if (UE_NAS_USE_TUN) {
//ret = write(nas_sock_fd[pdcpHead->inst], &(sdu_p->data[sizeof(pdcp_data_ind_header_t)]),sizeToWrite );
if(rb_id == mbms_rab_id){
- ret = write(nas_sock_mbms_fd, pdcpData, pdcpHead->data_size );
- LOG_I(PDCP,"[PDCP_FIFOS] ret %d TRIED TO PUSH MBMS DATA TO rb_id %d handle %d sizeToWrite %d\n",
- ret,rb_id,nas_sock_fd[pdcpHead->inst],pdcpHead->data_size);
+ ret = write(nas_sock_mbms_fd, pdcpData, pdcpHead->data_size);
+ LOG_I(PDCP,"[PDCP_FIFOS] ret %d TRIED TO PUSH MBMS DATA TO rb_id %d handle %d size %d\n",
+ ret,rb_id,nas_sock_fd[pdcpHead->inst], pdcpHead->data_size);
}
else
{
if( LOG_DEBUGFLAG(DEBUG_PDCP) )
- log_dump(PDCP, pdcpData, pdcpHead->data_size, LOG_DUMP_CHAR,"PDCP output to be sent to TUN interface: \n");
- ret = write(nas_sock_fd[pdcpHead->inst], pdcpData,pdcpHead->data_size );
- LOG_T(PDCP,"[UE PDCP_FIFOS] ret %d TRIED TO PUSH DATA TO rb_id %d handle %d sizeToWrite %d\n",
- ret,rb_id,nas_sock_fd[pdcpHead->inst],pdcpHead->data_size);
+ log_dump(PDCP, pdcpData, pdcpHead->data_size, LOG_DUMP_CHAR,
+ "PDCP output to be sent to TUN interface: \n");
+ ret = write(nas_sock_fd[pdcpHead->inst], pdcpData, pdcpHead->data_size);
+ LOG_T(PDCP,"[UE PDCP_FIFOS] ret %d TRIED TO PUSH DATA TO rb_id %d handle %d size %d\n",
+ ret,rb_id,nas_sock_fd[pdcpHead->inst], pdcpHead->data_size);
}
} else if (ENB_NAS_USE_TUN) {
if( LOG_DEBUGFLAG(DEBUG_PDCP) )
- log_dump(PDCP, pdcpData, pdcpHead->data_size, LOG_DUMP_CHAR,"PDCP output to be sent to TUN interface: \n");
+ log_dump(PDCP, pdcpData, pdcpHead->data_size, LOG_DUMP_CHAR,
+ "PDCP output to be sent to TUN interface: \n");
ret = write(nas_sock_fd[0], pdcpData, pdcpHead->data_size);
- LOG_T(PDCP,"[NB PDCP_FIFOS] ret %d TRIED TO PUSH DATA TO rb_id %d handle %d sizeToWrite %d\n",ret,rb_id,nas_sock_fd[0],pdcpHead->data_size);
+ LOG_T(PDCP,"[NB PDCP_FIFOS] ret %d TRIED TO PUSH DATA TO rb_id %d handle %d size %d\n",
+ ret, rb_id, nas_sock_fd[0], pdcpHead->data_size);
} else if (PDCP_USE_NETLINK) {
- int sizeToWrite= sizeof (pdcp_data_ind_header_t) + pdcpHead->data_size;
- memcpy(NLMSG_DATA(nas_nlh_tx), (uint8_t *) pdcpHead, sizeToWrite);
+ int sizeToWrite = sizeof(pdcp_data_ind_header_t) + pdcpHead->data_size;
+ memcpy(NLMSG_DATA(nas_nlh_tx), (uint8_t *) pdcpHead, sizeToWrite);
nas_nlh_tx->nlmsg_len = sizeToWrite;
ret = sendmsg(nas_sock_fd[0],&nas_msg_tx,0);
} // PDCP_USE_NETLINK
@@ -151,7 +154,7 @@ int pdcp_fifo_flush_sdus(const protocol_ctxt_t *const ctxt_pP) {
AssertFatal(ret >= 0,"[PDCP_FIFOS] pdcp_fifo_flush_sdus (errno: %d %s), nas_sock_fd[0]: %d\n", errno, strerror(errno), nas_sock_fd[0]);
if( LOG_DEBUGFLAG(DEBUG_PDCP) )
- log_dump(PDCP, pdcpData, min(pdcpHead->data_size,30) , LOG_DUMP_CHAR,
+ log_dump(PDCP, pdcpData, min(pdcpHead->data_size, 30) , LOG_DUMP_CHAR,
"Printing first bytes of PDCP SDU before removing it from the list: \n");
delNotifiedFIFO_elt (sdu_p);
pdcp_nb_sdu_sent ++;
@@ -214,8 +217,15 @@ int pdcp_fifo_read_input_sdus_fromtun (const protocol_ctxt_t *const ctxt_pP) {
do {
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_PDCP_FIFO_READ, 1 );
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_PDCP_FIFO_READ_BUFFER, 1 );
- len = read(UE_NAS_USE_TUN?nas_sock_fd[ctxt_pP->module_id]:nas_sock_fd[0], &nl_rx_buf, NL_MAX_PAYLOAD);
- VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_PDCP_FIFO_READ_BUFFER, 0 );
+ if (ue_id_g == 0)
+ {
+ len = read(UE_NAS_USE_TUN?nas_sock_fd[ctxt_pP->module_id]:nas_sock_fd[0], &nl_rx_buf, NL_MAX_PAYLOAD);
+ }
+ else
+ {
+ len = read(UE_NAS_USE_TUN?nas_sock_fd[ue_id_g]:nas_sock_fd[0], &nl_rx_buf, NL_MAX_PAYLOAD);
+ }
+ VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_PDCP_FIFO_READ_BUFFER, 0 );
if (len<=0) continue;
@@ -474,8 +484,12 @@ int pdcp_fifo_read_input_sdus_fromnetlinksock (const protocol_ctxt_t *const ctx
// never finished code, dropped
}
} else { // ctxt.enb_flag => UE
- if (NFAPI_MODE == NFAPI_UE_STUB_PNF) {
+ if (NFAPI_MODE == NFAPI_UE_STUB_PNF || NFAPI_MODE == NFAPI_MODE_STANDALONE_PNF) {
+#ifdef UESIM_EXPANSION
+ ctxt.module_id = inst_pdcp_list[pdcp_read_header_g.inst];
+#else
ctxt.module_id = pdcp_read_header_g.inst;
+#endif
} else {
ctxt.module_id = 0;
}
@@ -526,8 +540,8 @@ int pdcp_fifo_read_input_sdus_fromnetlinksock (const protocol_ctxt_t *const ctx
pdcp_read_header_g.data_size,
(unsigned char *)NLMSG_DATA(nas_nlh_rx),
PDCP_TRANSMISSION_MODE_DATA,
- (NFAPI_MODE == NFAPI_UE_STUB_PNF)?NULL:&pdcp_read_header_g.sourceL2Id,
- (NFAPI_MODE == NFAPI_UE_STUB_PNF)?NULL:&pdcp_read_header_g.destinationL2Id
+ (NFAPI_MODE == NFAPI_UE_STUB_PNF || NFAPI_MODE == NFAPI_MODE_STANDALONE_PNF)?NULL:&pdcp_read_header_g.sourceL2Id,
+ (NFAPI_MODE == NFAPI_UE_STUB_PNF || NFAPI_MODE == NFAPI_MODE_STANDALONE_PNF)?NULL:&pdcp_read_header_g.destinationL2Id
);
} else { /* else of h_rc == HASH_TABLE_OK */
MSC_LOG_RX_DISCARDED_MESSAGE(
@@ -571,8 +585,8 @@ int pdcp_fifo_read_input_sdus_fromnetlinksock (const protocol_ctxt_t *const ctx
pdcp_read_header_g.data_size,
(unsigned char *)NLMSG_DATA(nas_nlh_rx),
PDCP_TRANSMISSION_MODE_DATA,
- (NFAPI_MODE == NFAPI_UE_STUB_PNF) ? NULL :&pdcp_read_header_g.sourceL2Id,
- (NFAPI_MODE == NFAPI_UE_STUB_PNF) ? NULL :&pdcp_read_header_g.destinationL2Id
+ (NFAPI_MODE == NFAPI_UE_STUB_PNF|| NFAPI_MODE == NFAPI_MODE_STANDALONE_PNF) ? NULL :&pdcp_read_header_g.sourceL2Id,
+ (NFAPI_MODE == NFAPI_UE_STUB_PNF|| NFAPI_MODE == NFAPI_MODE_STANDALONE_PNF) ? NULL :&pdcp_read_header_g.destinationL2Id
);
} /* rab_id == 0 */
} /*pdcp_read_state_g != 0 */
@@ -608,9 +622,20 @@ void pdcp_fifo_read_input_sdus_frompc5s (const protocol_ctxt_t *const ctxt_pP)
//TTN for D2D (PC5S)
// receive a message from ProSe App
memset(receive_buf, 0, BUFSIZE);
- bytes_received = recvfrom(pdcp_pc5_sockfd, receive_buf, BUFSIZE, 0,
+ bytes_received = recvfrom(pdcp_pc5_sockfd, receive_buf, BUFSIZE, MSG_TRUNC,
(struct sockaddr *) &prose_pdcp_addr, (socklen_t *)&prose_addr_len);
+ if (bytes_received == -1){
+ LOG_E(PDCP, "%s(%d). recvfrom failed. %s\n", __FUNCTION__, __LINE__, strerror(errno));
+ return;
+ }
+ if (bytes_received == 0){
+ LOG_E(PDCP, "%s(%d). EOF pdcp_pc5_sockfd.\n", __FUNCTION__, __LINE__);
+ }
+ if (bytes_received > BUFSIZE) {
+ LOG_E(PDCP, "%s(%d). Message truncated. %d\n", __FUNCTION__, __LINE__, bytes_received);
+ return;
+ }
if (bytes_received > 0) {
pc5s_header = calloc(1, sizeof(pc5s_header_t));
memcpy((void *)pc5s_header, (void *)receive_buf, sizeof(pc5s_header_t));
diff --git a/openair2/LAYER2/nr_pdcp/nr_pdcp_oai_api.c b/openair2/LAYER2/nr_pdcp/nr_pdcp_oai_api.c
index 60788826017a44ba2ff0609d04a87c9bb1ebe256..83492dec4ab9324f346f3bc865a0a7fab958c777 100644
--- a/openair2/LAYER2/nr_pdcp/nr_pdcp_oai_api.c
+++ b/openair2/LAYER2/nr_pdcp/nr_pdcp_oai_api.c
@@ -381,7 +381,7 @@ void pdcp_layer_init(void)
#include "targets/RT/USER/lte-softmodem.h"
#include "openair2/RRC/NAS/nas_config.h"
-uint64_t pdcp_module_init(uint64_t _pdcp_optmask)
+uint64_t pdcp_module_init(uint64_t _pdcp_optmask, int id)
{
/* hack: be sure to initialize only once */
static pthread_mutex_t m = PTHREAD_MUTEX_INITIALIZER;
@@ -414,14 +414,14 @@ uint64_t pdcp_module_init(uint64_t _pdcp_optmask)
if(UE_NAS_USE_TUN) {
int num_if = (NFAPI_MODE == NFAPI_UE_STUB_PNF || IS_SOFTMODEM_SIML1 )? MAX_MOBILES_PER_ENB : 1;
- netlink_init_tun("ue",num_if);
+ netlink_init_tun("ue", num_if, id);
//Add --nr-ip-over-lte option check for next line
if (IS_SOFTMODEM_NOS1)
nas_config(1, 1, 2, "ue");
LOG_I(PDCP, "UE pdcp will use tun interface\n");
start_pdcp_tun_ue();
} else if(ENB_NAS_USE_TUN) {
- netlink_init_tun("enb",1);
+ netlink_init_tun("enb", 1, id);
nas_config(1, 1, 1, "enb");
LOG_I(PDCP, "ENB pdcp will use tun interface\n");
start_pdcp_tun_enb();
diff --git a/openair2/PHY_INTERFACE/.gitignore b/openair2/PHY_INTERFACE/.gitignore
new file mode 100644
index 0000000000000000000000000000000000000000..2dca7a7611a5ca3548d6f4cd2d35b0c063402adb
--- /dev/null
+++ b/openair2/PHY_INTERFACE/.gitignore
@@ -0,0 +1 @@
+/queue_test
diff --git a/openair2/PHY_INTERFACE/IF_Module.c b/openair2/PHY_INTERFACE/IF_Module.c
index ed3c9a5b7d2f7e84d59fc797e7730f0c1fa3c714..2a701afdf485c7444b89525a42515be1440b56da 100644
--- a/openair2/PHY_INTERFACE/IF_Module.c
+++ b/openair2/PHY_INTERFACE/IF_Module.c
@@ -24,25 +24,31 @@ extern RAN_CONTEXT_t RC;
uint16_t frame_cnt=0;
void handle_rach(UL_IND_t *UL_info) {
int i;
-
- if(NFAPI_MODE == NFAPI_MODE_VNF) {
- for(uint8_t j = 0; j < NUM_NFPAI_SUBFRAME; j++) {
- if (UL_RCC_INFO.rach_ind[j].rach_indication_body.number_of_preambles>0) {
- AssertFatal(UL_RCC_INFO.rach_ind[j].rach_indication_body.number_of_preambles==1,"More than 1 preamble not supported\n");
- LOG_D(MAC,"UL_info[Frame %d, Subframe %d] Calling initiate_ra_proc RACH:SFN/SF:%d\n",UL_info->frame,UL_info->subframe, NFAPI_SFNSF2DEC(UL_RCC_INFO.rach_ind[j].sfn_sf));
- initiate_ra_proc(UL_info->module_id,
- UL_info->CC_id,
- NFAPI_SFNSF2SFN(UL_RCC_INFO.rach_ind[j].sfn_sf),
- NFAPI_SFNSF2SF(UL_RCC_INFO.rach_ind[j].sfn_sf),
- UL_RCC_INFO.rach_ind[j].rach_indication_body.preamble_list[0].preamble_rel8.preamble,
- UL_RCC_INFO.rach_ind[j].rach_indication_body.preamble_list[0].preamble_rel8.timing_advance,
- UL_RCC_INFO.rach_ind[j].rach_indication_body.preamble_list[0].preamble_rel8.rnti,
- 0
- );
- free(UL_RCC_INFO.rach_ind[j].rach_indication_body.preamble_list);
- UL_RCC_INFO.rach_ind[j].rach_indication_body.number_of_preambles = 0;
- UL_RCC_INFO.rach_ind[j].header.message_id = 0;
+ int j = UL_info->subframe;
+ AssertFatal(j < sizeof(UL_RCC_INFO.rach_ind) / sizeof(UL_RCC_INFO.rach_ind[0]), "j index out of range of index of rach_ind\n");
+ if (NFAPI_MODE == NFAPI_MODE_VNF)
+ {
+ if (UL_RCC_INFO.rach_ind[j].rach_indication_body.number_of_preambles > 0)
+ {
+ if (UL_RCC_INFO.rach_ind[j].rach_indication_body.number_of_preambles > 1)
+ {
+ LOG_D(MAC, "handle_rach j: %d UL_RCC_INFO.rach_ind[j].rach_indication_body.number_of_preambles: %d\n",
+ j, UL_RCC_INFO.rach_ind[j].rach_indication_body.number_of_preambles);
+ LOG_D(MAC, "UL_info[Frame %d, Subframe %d] Calling initiate_ra_proc RACH:Frame: %d Subframe: %d\n",
+ UL_info->frame, UL_info->subframe, NFAPI_SFNSF2SFN(UL_RCC_INFO.rach_ind[j].sfn_sf), NFAPI_SFNSF2SF(UL_RCC_INFO.rach_ind[j].sfn_sf));
}
+ AssertFatal(UL_RCC_INFO.rach_ind[j].rach_indication_body.number_of_preambles == 1, "More than 1 preamble not supported\n"); // dump frame/sf and all things in UL_RCC_INFO
+ initiate_ra_proc(UL_info->module_id,
+ UL_info->CC_id,
+ NFAPI_SFNSF2SFN(UL_RCC_INFO.rach_ind[j].sfn_sf),
+ NFAPI_SFNSF2SF(UL_RCC_INFO.rach_ind[j].sfn_sf),
+ UL_RCC_INFO.rach_ind[j].rach_indication_body.preamble_list[0].preamble_rel8.preamble,
+ UL_RCC_INFO.rach_ind[j].rach_indication_body.preamble_list[0].preamble_rel8.timing_advance,
+ UL_RCC_INFO.rach_ind[j].rach_indication_body.preamble_list[0].preamble_rel8.rnti,
+ 0);
+ free(UL_RCC_INFO.rach_ind[j].rach_indication_body.preamble_list);
+ UL_RCC_INFO.rach_ind[j].rach_indication_body.number_of_preambles = 0;
+ UL_RCC_INFO.rach_ind[j].header.message_id = 0;
}
} else {
if (UL_info->rach_ind.rach_indication_body.number_of_preambles>0) {
@@ -94,6 +100,7 @@ void handle_sr(UL_IND_t *UL_info) {
} else if(NFAPI_MODE == NFAPI_MODE_VNF) {
for(uint8_t j = 0; j < NUM_NFPAI_SUBFRAME; j++) {
if(UL_RCC_INFO.sr_ind[j].sr_indication_body.number_of_srs > 0) {
+ assert(UL_RCC_INFO.sr_ind[j].sr_indication_body.number_of_srs <= NFAPI_SR_IND_MAX_PDU);
for (i=0; imodule_id,
UL_info->CC_id,
@@ -109,6 +116,7 @@ void handle_sr(UL_IND_t *UL_info) {
}
}
} else {
+ assert(UL_info->sr_ind.sr_indication_body.number_of_srs <= NFAPI_SR_IND_MAX_PDU);
for (i=0; isr_ind.sr_indication_body.number_of_srs; i++)
SR_indication(UL_info->module_id,
UL_info->CC_id,
@@ -135,6 +143,7 @@ void handle_cqi(UL_IND_t *UL_info) {
} else if (NFAPI_MODE == NFAPI_MODE_VNF) {
for(uint8_t j = 0; j < NUM_NFPAI_SUBFRAME; j++) {
if(UL_RCC_INFO.cqi_ind[j].cqi_indication_body.number_of_cqis > 0) {
+ assert(UL_RCC_INFO.cqi_ind[j].cqi_indication_body.number_of_cqis <= NFAPI_CQI_IND_MAX_PDU);
for (i=0; imodule_id,
UL_info->CC_id,
@@ -153,6 +162,7 @@ void handle_cqi(UL_IND_t *UL_info) {
}
}
} else {
+ assert(UL_info->cqi_ind.cqi_indication_body.number_of_cqis <= NFAPI_CQI_IND_MAX_PDU);
for (i=0; icqi_ind.cqi_indication_body.number_of_cqis; i++)
cqi_indication(UL_info->module_id,
UL_info->CC_id,
@@ -180,6 +190,7 @@ void handle_harq(UL_IND_t *UL_info) {
} else if(NFAPI_MODE == NFAPI_MODE_VNF) {
for(uint8_t j = 0; j < NUM_NFPAI_SUBFRAME; j++) {
if(UL_RCC_INFO.harq_ind[j].harq_indication_body.number_of_harqs > 0) {
+ assert(UL_RCC_INFO.harq_ind[j].harq_indication_body.number_of_harqs <= NFAPI_HARQ_IND_MAX_PDU);
for (int i=0; imodule_id,
UL_info->CC_id,
@@ -194,6 +205,7 @@ void handle_harq(UL_IND_t *UL_info) {
}
}
} else {
+ assert(UL_info->harq_ind.harq_indication_body.number_of_harqs <= NFAPI_HARQ_IND_MAX_PDU);
for (int i=0; i < UL_info->harq_ind.harq_indication_body.number_of_harqs; i++)
harq_indication(UL_info->module_id,
UL_info->CC_id,
@@ -223,7 +235,9 @@ void handle_ulsch(UL_IND_t *UL_info) {
} else if(NFAPI_MODE == NFAPI_MODE_VNF) {
for(uint8_t k = 0; k < NUM_NFPAI_SUBFRAME; k++) {
if((UL_RCC_INFO.rx_ind[k].rx_indication_body.number_of_pdus>0) && (UL_RCC_INFO.crc_ind[k].crc_indication_body.number_of_crcs>0)) {
+ assert(UL_RCC_INFO.rx_ind[k].rx_indication_body.number_of_pdus <= NFAPI_RX_IND_MAX_PDU);
for (i=0; icrc_ind.crc_indication_body.crc_pdu_list[%d].rx_ue_information.rnti:%04x UL_info->rx_ind.rx_indication_body.rx_pdu_list[%d].rx_ue_information.rnti:%04x\n",
@@ -276,7 +290,9 @@ void handle_ulsch(UL_IND_t *UL_info) {
}
} else {
if (UL_info->rx_ind.rx_indication_body.number_of_pdus>0 && UL_info->crc_ind.crc_indication_body.number_of_crcs>0) {
+ assert(UL_info->rx_ind.rx_indication_body.number_of_pdus <= NFAPI_RX_IND_MAX_PDU);
for (i=0; irx_ind.rx_indication_body.number_of_pdus; i++) {
+ assert(UL_info->crc_ind.crc_indication_body.number_of_crcs <= NFAPI_CRC_IND_MAX_PDU);
for (j=0; jcrc_ind.crc_indication_body.number_of_crcs; j++) {
// find crc_indication j corresponding rx_indication i
LOG_D(PHY,"UL_info->crc_ind.crc_indication_body.crc_pdu_list[%d].rx_ue_information.rnti:%04x UL_info->rx_ind.rx_indication_body.rx_pdu_list[%d].rx_ue_information.rnti:%04x\n", j,
@@ -790,6 +806,7 @@ IF_Module_t *IF_Module_init(int Mod_id) {
"allocation of if_inst[%d]->if_mutex fails\n",Mod_id);
}
+ memset(&UL_RCC_INFO, 0, sizeof(UL_RCC_INFO));
return if_inst[Mod_id];
}
diff --git a/openair2/PHY_INTERFACE/IF_Module.h b/openair2/PHY_INTERFACE/IF_Module.h
index 096979c4fd195595ac9e6076d3d06d686cfa5745..2f6a713be6b3a7161aaf249569e724b0cc256f89 100644
--- a/openair2/PHY_INTERFACE/IF_Module.h
+++ b/openair2/PHY_INTERFACE/IF_Module.h
@@ -87,7 +87,7 @@ typedef struct {
} UL_IND_t;
// Downlink subframe P7
-#define NUM_NFPAI_SUBFRAME 5
+#define NUM_NFPAI_SUBFRAME 10
typedef struct {
/// harq indication list
nfapi_harq_indication_t harq_ind[NUM_NFPAI_SUBFRAME];
@@ -151,6 +151,17 @@ typedef struct IF_Module_s{
pthread_mutex_t if_mutex;
} IF_Module_t;
+// These mutex is used for multiple UEs L2 FAPI simulator.
+// Each UEs set these value in UL and UL_INFO is shared in all UE's thread.
+typedef struct {
+ pthread_mutex_t rx_mutex;
+ pthread_mutex_t crc_mutex;
+ pthread_mutex_t sr_mutex;
+ pthread_mutex_t harq_mutex;
+ pthread_mutex_t cqi_mutex;
+ pthread_mutex_t rach_mutex;
+} FILL_UL_INFO_MUTEX_t;
+
/*Initial */
IF_Module_t *IF_Module_init(int Mod_id);
void IF_Module_kill(int Mod_id);
diff --git a/openair2/PHY_INTERFACE/phy_stub_UE.c b/openair2/PHY_INTERFACE/phy_stub_UE.c
index c212075934871c6b6a1994244eb0c490585f090a..fb812960c43e45ce75993025e1d9590f985a9600 100644
--- a/openair2/PHY_INTERFACE/phy_stub_UE.c
+++ b/openair2/PHY_INTERFACE/phy_stub_UE.c
@@ -30,6 +30,9 @@
#include "targets/ARCH/ETHERNET/USERSPACE/LIB/if_defs.h"
#include "common/config/config_load_configmodule.h"
#include "common/config/config_userapi.h"
+#include
+#include
+#include
#include "openair2/NR_PHY_INTERFACE/NR_IF_Module.h"
#include "openair1/PHY/defs_gNB.h"
#include "nfapi/open-nFAPI/nfapi/public_inc/nfapi_nr_interface_scf.h"
@@ -43,10 +46,18 @@ void configure_nfapi_pnf(char *vnf_ip_addr,
int vnf_p7_port);
UL_IND_t *UL_INFO = NULL;
-nfapi_tx_request_pdu_t* tx_request_pdu_list = NULL;
-nfapi_dl_config_request_t* dl_config_req = NULL;
-nfapi_ul_config_request_t* ul_config_req = NULL;
-nfapi_hi_dci0_request_t* hi_dci0_req = NULL;
+
+queue_t dl_config_req_tx_req_queue;
+queue_t ul_config_req_queue;
+queue_t hi_dci0_req_queue;
+
+FILL_UL_INFO_MUTEX_t fill_ul_mutex;
+
+int current_sfn_sf;
+sem_t sfn_semaphore;
+
+static int ue_tx_sock_descriptor = -1;
+static int ue_rx_sock_descriptor = -1;
extern nfapi_tx_request_pdu_t* tx_request_pdu[1023][10][10];
//extern int timer_subframe;
@@ -65,14 +76,19 @@ void fill_rx_indication_UE_MAC(module_id_t Mod_id,
uint8_t *ulsch_buffer,
uint16_t buflen,
uint16_t rnti,
- int index) {
+ int index,
+ nfapi_ul_config_request_t *ul_config_req) {
nfapi_rx_indication_pdu_t *pdu;
int timing_advance_update;
+ pthread_mutex_lock(&fill_ul_mutex.rx_mutex);
+
+ UL_INFO->rx_ind.header.message_id = NFAPI_RX_ULSCH_INDICATION;
UL_INFO->rx_ind.sfn_sf = frame << 4 | subframe;
UL_INFO->rx_ind.rx_indication_body.tl.tag = NFAPI_RX_INDICATION_BODY_TAG;
UL_INFO->rx_ind.vendor_extension = ul_config_req->vendor_extension;
+ assert(UL_INFO->rx_ind.rx_indication_body.number_of_pdus <= NFAPI_RX_IND_MAX_PDU);
pdu = &UL_INFO->rx_ind.rx_indication_body
.rx_pdu_list[UL_INFO->rx_ind.rx_indication_body.number_of_pdus];
// pdu = &UL_INFO->rx_ind.rx_indication_body.rx_pdu_list[index];
@@ -89,6 +105,8 @@ void fill_rx_indication_UE_MAC(module_id_t Mod_id,
// ulsch_buffer is necessary to keep its value.
pdu->data = malloc(buflen);
memcpy(pdu->data, ulsch_buffer, buflen);
+ LOG_D(MAC, "buflen of rx_ind pdu_data = %u SFN.SF: %d.%d\n", buflen,
+ frame, subframe);
// estimate timing advance for MAC
timing_advance_update = 0; // Don't know what to put here
pdu->rx_indication_rel8.timing_advance = timing_advance_update;
@@ -104,15 +122,21 @@ void fill_rx_indication_UE_MAC(module_id_t Mod_id,
UL_INFO->rx_ind.rx_indication_body.number_of_pdus++;
UL_INFO->rx_ind.sfn_sf = frame << 4 | subframe;
+
+ pthread_mutex_unlock(&fill_ul_mutex.rx_mutex);
}
void fill_sr_indication_UE_MAC(int Mod_id,
int frame,
int subframe,
UL_IND_t *UL_INFO,
- uint16_t rnti) {
+ uint16_t rnti,
+ nfapi_ul_config_request_t *ul_config_req) {
+ pthread_mutex_lock(&fill_ul_mutex.sr_mutex);
+
nfapi_sr_indication_t *sr_ind = &UL_INFO->sr_ind;
nfapi_sr_indication_body_t *sr_ind_body = &sr_ind->sr_indication_body;
+ assert(sr_ind_body->number_of_srs <= NFAPI_SR_IND_MAX_PDU);
nfapi_sr_indication_pdu_t *pdu = &sr_ind_body->sr_pdu_list[sr_ind_body->number_of_srs];
UL_INFO->sr_ind.vendor_extension = ul_config_req->vendor_extension;
@@ -139,6 +163,8 @@ void fill_sr_indication_UE_MAC(int Mod_id,
// UL_INFO->rx_ind.rx_indication_body.number_of_pdus++;
sr_ind_body->number_of_srs++;
+
+ pthread_mutex_unlock(&fill_ul_mutex.sr_mutex);
}
void fill_crc_indication_UE_MAC(int Mod_id,
@@ -147,7 +173,12 @@ void fill_crc_indication_UE_MAC(int Mod_id,
UL_IND_t *UL_INFO,
uint8_t crc_flag,
int index,
- uint16_t rnti) {
+ uint16_t rnti,
+ nfapi_ul_config_request_t *ul_config_req) {
+ pthread_mutex_lock(&fill_ul_mutex.crc_mutex);
+ LOG_D(MAC, "fill crc_indication num_crcs: %u\n",
+ UL_INFO->crc_ind.crc_indication_body.number_of_crcs);
+ assert(UL_INFO->crc_ind.crc_indication_body.number_of_crcs < NUMBER_OF_UE_MAX);
nfapi_crc_indication_pdu_t *pdu =
&UL_INFO->crc_ind.crc_indication_body
.crc_pdu_list[UL_INFO->crc_ind.crc_indication_body.number_of_crcs];
@@ -171,6 +202,8 @@ void fill_crc_indication_UE_MAC(int Mod_id,
__FUNCTION__,
pdu->rx_ue_information.rnti,
UL_INFO->crc_ind.crc_indication_body.number_of_crcs);
+
+ pthread_mutex_unlock(&fill_ul_mutex.crc_mutex);
}
void fill_rach_indication_UE_MAC(int Mod_id,
@@ -179,6 +212,8 @@ void fill_rach_indication_UE_MAC(int Mod_id,
UL_IND_t *UL_INFO,
uint8_t ra_PreambleIndex,
uint16_t ra_RNTI) {
+ pthread_mutex_lock(&fill_ul_mutex.rach_mutex);
+
UL_INFO->rach_ind.rach_indication_body.number_of_preambles = 1;
UL_INFO->rach_ind.header.message_id = NFAPI_RACH_INDICATION;
@@ -221,8 +256,15 @@ void fill_rach_indication_UE_MAC(int Mod_id,
// This function is currently defined only in the nfapi-RU-RAU-split so we
// should call it when we merge with that branch.
- oai_nfapi_rach_ind(&UL_INFO->rach_ind);
+ if (NFAPI_MODE == NFAPI_MODE_STANDALONE_PNF) {
+ send_standalone_msg(UL_INFO, UL_INFO->rach_ind.header.message_id);
+ } else {
+ oai_nfapi_rach_ind(&UL_INFO->rach_ind);
+ }
+
free(UL_INFO->rach_ind.rach_indication_body.preamble_list);
+
+ pthread_mutex_unlock(&fill_ul_mutex.rach_mutex);
}
void fill_ulsch_cqi_indication_UE_MAC(int Mod_id,
@@ -230,6 +272,10 @@ void fill_ulsch_cqi_indication_UE_MAC(int Mod_id,
uint8_t subframe,
UL_IND_t *UL_INFO,
uint16_t rnti) {
+ pthread_mutex_lock(&fill_ul_mutex.cqi_mutex);
+ LOG_D(MAC, "num_cqis: %u in fill_ulsch_cqi_indication_UE_MAC\n",
+ UL_INFO->cqi_ind.cqi_indication_body.number_of_cqis);
+ assert(UL_INFO->cqi_ind.cqi_indication_body.number_of_cqis <= NFAPI_CQI_IND_MAX_PDU);
nfapi_cqi_indication_pdu_t *pdu =
&UL_INFO->cqi_ind.cqi_indication_body
.cqi_pdu_list[UL_INFO->cqi_ind.cqi_indication_body.number_of_cqis];
@@ -240,7 +286,7 @@ void fill_ulsch_cqi_indication_UE_MAC(int Mod_id,
UL_INFO->cqi_ind.sfn_sf = frame << 4 | subframe;
// because of nfapi_vnf.c:733, set message id to 0, not
// NFAPI_RX_CQI_INDICATION;
- UL_INFO->cqi_ind.header.message_id = 0;
+ UL_INFO->cqi_ind.header.message_id = NFAPI_RX_CQI_INDICATION;
UL_INFO->cqi_ind.cqi_indication_body.tl.tag = NFAPI_CQI_INDICATION_BODY_TAG;
pdu->rx_ue_information.tl.tag = NFAPI_RX_UE_INFORMATION_TAG;
@@ -256,13 +302,15 @@ void fill_ulsch_cqi_indication_UE_MAC(int Mod_id,
pdu->cqi_indication_rel8.timing_advance = 0;
// pdu->cqi_indication_rel8.number_of_cc_reported = 1;
pdu->ul_cqi_information.tl.tag = NFAPI_UL_CQI_INFORMATION_TAG;
- pdu->ul_cqi_information.channel = 1; // PUSCH
+ pdu->ul_cqi_information.channel = 1;
// eNB_scheduler_primitives.c:4839: the upper four bits seem to be the CQI
const int cqi = 15;
raw_pdu->pdu[0] = cqi << 4;
UL_INFO->cqi_ind.cqi_indication_body.number_of_cqis++;
+
+ pthread_mutex_unlock(&fill_ul_mutex.cqi_mutex);
}
void fill_ulsch_harq_indication_UE_MAC(
@@ -271,7 +319,11 @@ void fill_ulsch_harq_indication_UE_MAC(
int subframe,
UL_IND_t *UL_INFO,
nfapi_ul_config_ulsch_harq_information *harq_information,
- uint16_t rnti) {
+ uint16_t rnti,
+ nfapi_ul_config_request_t *ul_config_req) {
+ pthread_mutex_lock(&fill_ul_mutex.harq_mutex);
+
+ assert(UL_INFO->harq_ind.harq_indication_body.number_of_harqs <= NFAPI_HARQ_IND_MAX_PDU);
nfapi_harq_indication_pdu_t *pdu =
&UL_INFO->harq_ind.harq_indication_body.harq_pdu_list
[UL_INFO->harq_ind.harq_indication_body.number_of_harqs];
@@ -303,6 +355,8 @@ void fill_ulsch_harq_indication_UE_MAC(
}
UL_INFO->harq_ind.harq_indication_body.number_of_harqs++;
+
+ pthread_mutex_unlock(&fill_ul_mutex.harq_mutex);
}
void fill_uci_harq_indication_UE_MAC(int Mod_id,
@@ -310,9 +364,13 @@ void fill_uci_harq_indication_UE_MAC(int Mod_id,
int subframe,
UL_IND_t *UL_INFO,
nfapi_ul_config_harq_information *harq_information,
- uint16_t rnti) {
+ uint16_t rnti,
+ nfapi_ul_config_request_t *ul_config_req) {
+ pthread_mutex_lock(&fill_ul_mutex.harq_mutex);
+
nfapi_harq_indication_t *ind = &UL_INFO->harq_ind;
nfapi_harq_indication_body_t *body = &ind->harq_indication_body;
+ assert(UL_INFO->harq_ind.harq_indication_body.number_of_harqs <= NFAPI_HARQ_IND_MAX_PDU);
nfapi_harq_indication_pdu_t *pdu =
&body->harq_pdu_list[UL_INFO->harq_ind.harq_indication_body
.number_of_harqs];
@@ -392,6 +450,8 @@ void fill_uci_harq_indication_UE_MAC(int Mod_id,
LOG_D(PHY,
"Incremented eNB->UL_INFO.harq_ind.number_of_harqs:%d\n",
UL_INFO->harq_ind.harq_indication_body.number_of_harqs);
+
+ pthread_mutex_unlock(&fill_ul_mutex.harq_mutex);
}
void handle_nfapi_ul_pdu_UE_MAC(module_id_t Mod_id,
@@ -399,7 +459,8 @@ void handle_nfapi_ul_pdu_UE_MAC(module_id_t Mod_id,
uint16_t frame,
uint8_t subframe,
uint8_t srs_present,
- int index) {
+ int index,
+ nfapi_ul_config_request_t *ul_config_req) {
if (ul_config_pdu->pdu_type == NFAPI_UL_CONFIG_ULSCH_PDU_TYPE) {
LOG_D(PHY,
"Applying UL config for UE, rnti %x for frame %d, subframe %d\n",
@@ -418,7 +479,8 @@ void handle_nfapi_ul_pdu_UE_MAC(module_id_t Mod_id,
Mod_id,
frame,
subframe);
- fill_crc_indication_UE_MAC(Mod_id, frame, subframe, UL_INFO, 0, index, rnti);
+ fill_crc_indication_UE_MAC(Mod_id, frame, subframe, UL_INFO, 0, index, rnti,
+ ul_config_req);
fill_rx_indication_UE_MAC(Mod_id,
frame,
subframe,
@@ -426,7 +488,8 @@ void handle_nfapi_ul_pdu_UE_MAC(module_id_t Mod_id,
UE_mac_inst[Mod_id].RA_prach_resources.Msg3,
buflen,
rnti,
- index);
+ index,
+ ul_config_req);
Msg3_transmitted(Mod_id, 0, frame, 0);
// Modification
UE_mac_inst[Mod_id].UE_mode[0] = PUSCH;
@@ -436,7 +499,7 @@ void handle_nfapi_ul_pdu_UE_MAC(module_id_t Mod_id,
// UE_mac_inst[Mod_id].first_ULSCH_Tx = 0;
} else {
ue_get_sdu(Mod_id, 0, frame, subframe, 0, ulsch_buffer, buflen, &access_mode);
- fill_crc_indication_UE_MAC(Mod_id, frame, subframe, UL_INFO, 0, index, rnti);
+ fill_crc_indication_UE_MAC(Mod_id, frame, subframe, UL_INFO, 0, index, rnti, ul_config_req);
fill_rx_indication_UE_MAC(Mod_id,
frame,
subframe,
@@ -444,7 +507,8 @@ void handle_nfapi_ul_pdu_UE_MAC(module_id_t Mod_id,
ulsch_buffer,
buflen,
rnti,
- index);
+ index,
+ ul_config_req);
}
}
}
@@ -462,8 +526,8 @@ void handle_nfapi_ul_pdu_UE_MAC(module_id_t Mod_id,
uint16_t rnti = ul_config_pdu->ulsch_harq_pdu.ulsch_pdu.ulsch_pdu_rel8.rnti;
uint8_t access_mode = SCHEDULED_ACCESS;
if (buflen > 0) {
- if (UE_mac_inst[Mod_id].first_ULSCH_Tx == 1) { // Msg3 case
- fill_crc_indication_UE_MAC(Mod_id, frame, subframe, UL_INFO, 0, index, rnti);
+ if (UE_mac_inst[Mod_id].first_ULSCH_Tx == 1) {
+ fill_crc_indication_UE_MAC(Mod_id, frame, subframe, UL_INFO, 0, index, rnti, ul_config_req);
fill_rx_indication_UE_MAC(Mod_id,
frame,
subframe,
@@ -471,7 +535,8 @@ void handle_nfapi_ul_pdu_UE_MAC(module_id_t Mod_id,
UE_mac_inst[Mod_id].RA_prach_resources.Msg3,
buflen,
rnti,
- index);
+ index,
+ ul_config_req);
Msg3_transmitted(Mod_id, 0, frame, 0);
// UE_mac_inst[Mod_id].first_ULSCH_Tx = 0;
// Modification
@@ -479,7 +544,7 @@ void handle_nfapi_ul_pdu_UE_MAC(module_id_t Mod_id,
UE_mac_inst[Mod_id].first_ULSCH_Tx = 0;
} else {
ue_get_sdu(Mod_id, 0, frame, subframe, 0, ulsch_buffer, buflen, &access_mode);
- fill_crc_indication_UE_MAC(Mod_id, frame, subframe, UL_INFO, 0, index, rnti);
+ fill_crc_indication_UE_MAC(Mod_id, frame, subframe, UL_INFO, 0, index, rnti, ul_config_req);
fill_rx_indication_UE_MAC(Mod_id,
frame,
subframe,
@@ -487,12 +552,13 @@ void handle_nfapi_ul_pdu_UE_MAC(module_id_t Mod_id,
ulsch_buffer,
buflen,
rnti,
- index);
+ index,
+ ul_config_req);
}
}
if (ulsch_harq_information != NULL)
fill_ulsch_harq_indication_UE_MAC(
- Mod_id, frame, subframe, UL_INFO, ulsch_harq_information, rnti);
+ Mod_id, frame, subframe, UL_INFO, ulsch_harq_information, rnti, ul_config_req);
} else if (ul_config_pdu->pdu_type == NFAPI_UL_CONFIG_ULSCH_CQI_RI_PDU_TYPE) {
uint8_t ulsch_buffer[5477] __attribute__((aligned(32)));
@@ -502,7 +568,7 @@ void handle_nfapi_ul_pdu_UE_MAC(module_id_t Mod_id,
uint8_t access_mode = SCHEDULED_ACCESS;
if (buflen > 0) {
if (UE_mac_inst[Mod_id].first_ULSCH_Tx == 1) { // Msg3 case
- fill_crc_indication_UE_MAC(Mod_id, frame, subframe, UL_INFO, 0, index, rnti);
+ fill_crc_indication_UE_MAC(Mod_id, frame, subframe, UL_INFO, 0, index, rnti, ul_config_req);
fill_rx_indication_UE_MAC(Mod_id,
frame,
subframe,
@@ -510,7 +576,8 @@ void handle_nfapi_ul_pdu_UE_MAC(module_id_t Mod_id,
UE_mac_inst[Mod_id].RA_prach_resources.Msg3,
buflen,
rnti,
- index);
+ index,
+ ul_config_req);
Msg3_transmitted(Mod_id, 0, frame, 0);
// UE_mac_inst[Mod_id].first_ULSCH_Tx = 0;
// Modification
@@ -518,7 +585,7 @@ void handle_nfapi_ul_pdu_UE_MAC(module_id_t Mod_id,
UE_mac_inst[Mod_id].first_ULSCH_Tx = 0;
} else {
ue_get_sdu(Mod_id, 0, frame, subframe, 0, ulsch_buffer, buflen, &access_mode);
- fill_crc_indication_UE_MAC(Mod_id, frame, subframe, UL_INFO, 0, index, rnti);
+ fill_crc_indication_UE_MAC(Mod_id, frame, subframe, UL_INFO, 0, index, rnti, ul_config_req);
fill_rx_indication_UE_MAC(Mod_id,
frame,
subframe,
@@ -526,7 +593,9 @@ void handle_nfapi_ul_pdu_UE_MAC(module_id_t Mod_id,
ulsch_buffer,
buflen,
rnti,
- index);
+ index,
+ ul_config_req);
+ fill_ulsch_cqi_indication_UE_MAC(Mod_id, frame, subframe, UL_INFO, rnti);
}
}
} else if (ul_config_pdu->pdu_type == NFAPI_UL_CONFIG_ULSCH_CQI_HARQ_RI_PDU_TYPE) {
@@ -539,7 +608,7 @@ void handle_nfapi_ul_pdu_UE_MAC(module_id_t Mod_id,
uint8_t access_mode = SCHEDULED_ACCESS;
if (buflen > 0) {
if (UE_mac_inst[Mod_id].first_ULSCH_Tx == 1) { // Msg3 case
- fill_crc_indication_UE_MAC(Mod_id, frame, subframe, UL_INFO, 0, index, rnti);
+ fill_crc_indication_UE_MAC(Mod_id, frame, subframe, UL_INFO, 0, index, rnti, ul_config_req);
fill_rx_indication_UE_MAC(Mod_id,
frame,
subframe,
@@ -547,7 +616,8 @@ void handle_nfapi_ul_pdu_UE_MAC(module_id_t Mod_id,
UE_mac_inst[Mod_id].RA_prach_resources.Msg3,
buflen,
rnti,
- index);
+ index,
+ ul_config_req);
Msg3_transmitted(Mod_id, 0, frame, 0);
// UE_mac_inst[Mod_id].first_ULSCH_Tx = 0;
// Modification
@@ -555,7 +625,7 @@ void handle_nfapi_ul_pdu_UE_MAC(module_id_t Mod_id,
UE_mac_inst[Mod_id].first_ULSCH_Tx = 0;
} else {
ue_get_sdu(Mod_id, 0, frame, subframe, 0, ulsch_buffer, buflen, &access_mode);
- fill_crc_indication_UE_MAC(Mod_id, frame, subframe, UL_INFO, 0, index, rnti);
+ fill_crc_indication_UE_MAC(Mod_id, frame, subframe, UL_INFO, 0, index, rnti, ul_config_req);
fill_rx_indication_UE_MAC(Mod_id,
frame,
subframe,
@@ -563,18 +633,20 @@ void handle_nfapi_ul_pdu_UE_MAC(module_id_t Mod_id,
ulsch_buffer,
buflen,
rnti,
- index);
+ index,
+ ul_config_req);
+ fill_ulsch_cqi_indication_UE_MAC(Mod_id, frame, subframe, UL_INFO, rnti);
}
}
if (ulsch_harq_information != NULL)
- fill_ulsch_harq_indication_UE_MAC(Mod_id, frame, subframe, UL_INFO, ulsch_harq_information, rnti);
+ fill_ulsch_harq_indication_UE_MAC(Mod_id, frame, subframe, UL_INFO, ulsch_harq_information, rnti, ul_config_req);
} else if (ul_config_pdu->pdu_type == NFAPI_UL_CONFIG_UCI_HARQ_PDU_TYPE) {
uint16_t rnti = ul_config_pdu->uci_harq_pdu.ue_information.ue_information_rel8.rnti;
nfapi_ul_config_harq_information *ulsch_harq_information = &ul_config_pdu->uci_harq_pdu.harq_information;
if (ulsch_harq_information != NULL)
- fill_uci_harq_indication_UE_MAC(Mod_id, frame, subframe, UL_INFO, ulsch_harq_information, rnti);
+ fill_uci_harq_indication_UE_MAC(Mod_id, frame, subframe, UL_INFO, ulsch_harq_information, rnti, ul_config_req);
} else if (ul_config_pdu->pdu_type == NFAPI_UL_CONFIG_UCI_CQI_PDU_TYPE) {
AssertFatal(1 == 0, "NFAPI_UL_CONFIG_UCI_CQI_PDU_TYPE not handled yet\n");
} else if (ul_config_pdu->pdu_type == NFAPI_UL_CONFIG_UCI_CQI_HARQ_PDU_TYPE) {
@@ -588,7 +660,7 @@ void handle_nfapi_ul_pdu_UE_MAC(module_id_t Mod_id,
ul_config_pdu->uci_sr_pdu.ue_information.ue_information_rel8.rnti;
if (ue_get_SR(Mod_id, 0, frame, 0, rnti, subframe))
- fill_sr_indication_UE_MAC(Mod_id, frame, subframe, UL_INFO, rnti);
+ fill_sr_indication_UE_MAC(Mod_id, frame, subframe, UL_INFO, rnti, ul_config_req);
} else if (ul_config_pdu->pdu_type == NFAPI_UL_CONFIG_UCI_SR_HARQ_PDU_TYPE) {
// AssertFatal((UE_id =
@@ -602,13 +674,13 @@ void handle_nfapi_ul_pdu_UE_MAC(module_id_t Mod_id,
// We fill the sr_indication only if ue_get_sr() would normally instruct PHY
// to send a SR.
if (ue_get_SR(Mod_id, 0, frame, 0, rnti, subframe))
- fill_sr_indication_UE_MAC(Mod_id, frame, subframe, UL_INFO, rnti);
+ fill_sr_indication_UE_MAC(Mod_id, frame, subframe, UL_INFO, rnti, ul_config_req);
nfapi_ul_config_harq_information *ulsch_harq_information =
&ul_config_pdu->uci_sr_harq_pdu.harq_information;
if (ulsch_harq_information != NULL)
fill_uci_harq_indication_UE_MAC(
- Mod_id, frame, subframe, UL_INFO, ulsch_harq_information, rnti);
+ Mod_id, frame, subframe, UL_INFO, ulsch_harq_information, rnti, ul_config_req);
}
}
@@ -625,6 +697,9 @@ int ul_config_req_UE_MAC(nfapi_ul_config_request_t *req,
req->ul_config_request_body.rach_prach_frequency_resources,
req->ul_config_request_body.srs_present);
+ LOG_D(MAC, "ul_config_req Frame: %d Subframe: %d Proxy Frame: %u Subframe: %u\n",
+ NFAPI_SFNSF2SFN(req->sfn_sf), NFAPI_SFNSF2SF(req->sfn_sf),
+ timer_frame, timer_subframe);
int sfn = NFAPI_SFNSF2SFN(req->sfn_sf);
int sf = NFAPI_SFNSF2SF(req->sfn_sf);
@@ -654,10 +729,9 @@ int ul_config_req_UE_MAC(nfapi_ul_config_request_t *req,
|| (pdu_type == NFAPI_UL_CONFIG_UCI_SR_HARQ_PDU_TYPE
&& pdu->uci_cqi_sr_harq_pdu.ue_information.ue_information_rel8.rnti == rnti)) {
handle_nfapi_ul_pdu_UE_MAC(
- Mod_id, pdu, sfn, sf, req->ul_config_request_body.srs_present, i);
+ Mod_id, pdu, sfn, sf, req->ul_config_request_body.srs_present, i, req);
} else {
- // NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s() PDU:%i UNKNOWN type :%d\n",
- // __FUNCTION__, i, ul_config_pdu_list[i].pdu_type);
+ LOG_D(MAC, "UNKNOWN UL_CONFIG_REQ PDU_TYPE or RNTI not matching pdu type: %d\n", pdu_type);
}
}
@@ -693,7 +767,8 @@ void dl_config_req_UE_MAC_dci(int sfn,
int sf,
nfapi_dl_config_request_pdu_t *dci,
nfapi_dl_config_request_pdu_t *dlsch,
- int num_ue) {
+ int num_ue,
+ nfapi_tx_req_pdu_list_t *tx_req_pdu_list) {
DevAssert(dci->pdu_type == NFAPI_DL_CONFIG_DCI_DL_PDU_TYPE);
DevAssert(dlsch->pdu_type == NFAPI_DL_CONFIG_DLSCH_PDU_TYPE);
@@ -707,7 +782,7 @@ void dl_config_req_UE_MAC_dci(int sfn,
}
const int pdu_index = dlsch->dlsch_pdu.dlsch_pdu_rel8.pdu_index;
- if (pdu_index < 0 || pdu_index >= tx_req_num_elems) {
+ if (pdu_index < 0 || pdu_index >= tx_req_pdu_list->num_pdus) {
LOG_E(MAC,
"%s(): Problem with receiving data: "
"sfn/sf:%d.%d PDU size:%d, TX_PDU index: %d\n",
@@ -716,6 +791,8 @@ void dl_config_req_UE_MAC_dci(int sfn,
return;
}
+ LOG_D(MAC, "%s() rnti value: 0x%x rnti type: %d\n", __func__,
+ rnti, rnti_type);
if (rnti_type == 1) { // C-RNTI (Normal DLSCH case)
for (int ue_id = 0; ue_id < num_ue; ue_id++) {
if (UE_mac_inst[ue_id].crnti == rnti) {
@@ -725,10 +802,10 @@ void dl_config_req_UE_MAC_dci(int sfn,
__func__,
sfn, sf, dci->pdu_size,
dlsch->dlsch_pdu.dlsch_pdu_rel8.pdu_index,
- tx_req_num_elems);
+ tx_req_pdu_list->num_pdus);
ue_send_sdu(ue_id, 0, sfn, sf,
- tx_request_pdu_list[pdu_index].segments[0].segment_data,
- tx_request_pdu_list[pdu_index].segments[0].segment_length,
+ tx_req_pdu_list->pdus[pdu_index].segments[0].segment_data,
+ tx_req_pdu_list->pdus[pdu_index].segments[0].segment_length,
0);
return;
}
@@ -740,16 +817,16 @@ void dl_config_req_UE_MAC_dci(int sfn,
continue;
ue_decode_si(ue_id, 0, sfn, 0,
- tx_request_pdu_list[pdu_index].segments[0].segment_data,
- tx_request_pdu_list[pdu_index].segments[0].segment_length);
+ tx_req_pdu_list->pdus[pdu_index].segments[0].segment_data,
+ tx_req_pdu_list->pdus[pdu_index].segments[0].segment_length);
}
} else if (rnti == 0xFFFE) { /* PI-RNTI */
for (int ue_id = 0; ue_id < num_ue; ue_id++) {
LOG_I(MAC, "%s() Received paging message: sfn/sf:%d.%d\n",
__func__, sfn, sf);
ue_decode_p(ue_id, 0, sfn, 0,
- tx_request_pdu_list[pdu_index].segments[0].segment_data,
- tx_request_pdu_list[pdu_index].segments[0].segment_length);
+ tx_req_pdu_list->pdus[pdu_index].segments[0].segment_data,
+ tx_req_pdu_list->pdus[pdu_index].segments[0].segment_length);
}
} else if (rnti == 0x0002) { /* RA-RNTI */
for (int ue_id = 0; ue_id < num_ue; ue_id++) {
@@ -771,11 +848,12 @@ void dl_config_req_UE_MAC_dci(int sfn,
__func__, UE_mac_inst[ue_id].RA_prach_resources.ra_PreambleIndex);
ue_process_rar(ue_id, 0, sfn,
ra_rnti, //RA-RNTI
- tx_request_pdu_list[pdu_index].segments[0].segment_data,
+ tx_req_pdu_list->pdus[pdu_index].segments[0].segment_data,
&UE_mac_inst[ue_id].crnti, //t-crnti
UE_mac_inst[ue_id].RA_prach_resources.ra_PreambleIndex,
- tx_request_pdu_list[pdu_index].segments[0].segment_data);
- UE_mac_inst[ue_id].UE_mode[0] = RA_RESPONSE;
+ tx_req_pdu_list->pdus[pdu_index].segments[0].segment_data);
+ // UE_mac_inst[ue_id].UE_mode[0] = RA_RESPONSE;
+ LOG_I(MAC, "setting UE_MODE now: %d\n", UE_mac_inst[ue_id].UE_mode[0]);
// Expecting an UL_CONFIG_ULSCH_PDU to enable Msg3 Txon (first
// ULSCH Txon for the UE)
UE_mac_inst[ue_id].first_ULSCH_Tx = 1;
@@ -842,7 +920,8 @@ void dl_config_req_UE_MAC_bch(int sfn,
void dl_config_req_UE_MAC_mch(int sfn,
int sf,
nfapi_dl_config_request_pdu_t *mch,
- int num_ue) {
+ int num_ue,
+ nfapi_tx_req_pdu_list_t *tx_req_pdu_list) {
DevAssert(mch->pdu_type == NFAPI_DL_CONFIG_MCH_PDU_TYPE);
for (int ue_id = 0; ue_id < num_ue; ue_id++) {
@@ -857,7 +936,7 @@ void dl_config_req_UE_MAC_mch(int sfn,
} else {
const int pdu_index = mch->mch_pdu.mch_pdu_rel8.pdu_index;
- if (pdu_index < 0 || pdu_index >= tx_req_num_elems) {
+ if (pdu_index < 0 || pdu_index >= tx_req_pdu_list->num_pdus) {
LOG_E(MAC,
"%s(): Problem with receiving data: "
"sfn/sf:%d.%d PDU size:%d, TX_PDU index: %d\n",
@@ -866,8 +945,8 @@ void dl_config_req_UE_MAC_mch(int sfn,
return;
}
ue_send_mch_sdu(ue_id, 0, sfn,
- tx_request_pdu_list[pdu_index].segments[0].segment_data,
- tx_request_pdu_list[pdu_index].segments[0].segment_length,
+ tx_req_pdu_list->pdus[pdu_index].segments[0].segment_data,
+ tx_req_pdu_list->pdus[pdu_index].segments[0].segment_length,
0,0);
}
}
@@ -885,7 +964,6 @@ void hi_dci0_req_UE_MAC(int sfn,
return;
for (int ue_id = 0; ue_id < num_ue; ue_id++) {
if (dci->rnti == UE_mac_inst[ue_id].crnti) {
- fill_ulsch_cqi_indication_UE_MAC(ue_id, sfn, sf, UL_INFO, dci->rnti);
return;
}
}
@@ -893,114 +971,147 @@ void hi_dci0_req_UE_MAC(int sfn,
// The following set of memcpy functions should be getting called as callback
// functions from pnf_p7_subframe_ind.
-int memcpy_dl_config_req(L1_rxtx_proc_t *proc,
- nfapi_pnf_p7_config_t *pnf_p7,
- nfapi_dl_config_request_t *req) {
- dl_config_req = (nfapi_dl_config_request_t *)malloc(sizeof(nfapi_dl_config_request_t));
-
- // UE_mac_inst[Mod_id].dl_config_req->header = req->header;
- dl_config_req->sfn_sf = req->sfn_sf;
- dl_config_req->vendor_extension = req->vendor_extension;
-
- dl_config_req->dl_config_request_body.number_dci = req->dl_config_request_body.number_dci;
- dl_config_req->dl_config_request_body.number_pdcch_ofdm_symbols = req->dl_config_request_body.number_pdcch_ofdm_symbols;
- dl_config_req->dl_config_request_body.number_pdsch_rnti = req->dl_config_request_body.number_pdsch_rnti;
- dl_config_req->dl_config_request_body.number_pdu = req->dl_config_request_body.number_pdu;
-
- dl_config_req->dl_config_request_body.tl.tag = req->dl_config_request_body.tl.tag;
- dl_config_req->dl_config_request_body.tl.length = req->dl_config_request_body.tl.length;
-
- dl_config_req->dl_config_request_body.dl_config_pdu_list =
- calloc(req->dl_config_request_body.number_pdu,
- sizeof(nfapi_dl_config_request_pdu_t));
- for (int i = 0; i < dl_config_req->dl_config_request_body.number_pdu; i++) {
- dl_config_req->dl_config_request_body.dl_config_pdu_list[i] =
- req->dl_config_request_body.dl_config_pdu_list[i];
+static bool is_my_ul_config_req(nfapi_ul_config_request_t *req)
+{
+ bool is_my_rnti = false;
+ const rnti_t rnti = UE_mac_inst[0].crnti; // 0 for standalone pnf mode. TODO: Make this more clear - Andrew
+ for (int i = 0; i < req->ul_config_request_body.number_of_pdus; i++)
+ {
+ nfapi_ul_config_request_pdu_t *pdu = &req->ul_config_request_body.ul_config_pdu_list[i];
+ const int pdu_type = pdu->pdu_type;
+ if ((pdu_type == NFAPI_UL_CONFIG_ULSCH_PDU_TYPE && pdu->ulsch_pdu.ulsch_pdu_rel8.rnti == rnti) ||
+ (pdu_type == NFAPI_UL_CONFIG_ULSCH_HARQ_PDU_TYPE && pdu->ulsch_harq_pdu.ulsch_pdu.ulsch_pdu_rel8.rnti == rnti) ||
+ (pdu_type == NFAPI_UL_CONFIG_ULSCH_CQI_RI_PDU_TYPE && pdu->ulsch_cqi_ri_pdu.ulsch_pdu.ulsch_pdu_rel8.rnti == rnti) ||
+ (pdu_type == NFAPI_UL_CONFIG_ULSCH_CQI_HARQ_RI_PDU_TYPE && pdu->ulsch_cqi_harq_ri_pdu.ulsch_pdu.ulsch_pdu_rel8.rnti == rnti) ||
+ (pdu_type == NFAPI_UL_CONFIG_UCI_HARQ_PDU_TYPE && pdu->uci_cqi_harq_pdu.ue_information.ue_information_rel8.rnti == rnti) ||
+ (pdu_type == NFAPI_UL_CONFIG_UCI_SR_PDU_TYPE && pdu->uci_sr_pdu.ue_information.ue_information_rel8.rnti == rnti) ||
+ (pdu_type == NFAPI_UL_CONFIG_UCI_SR_HARQ_PDU_TYPE && pdu->uci_cqi_sr_harq_pdu.ue_information.ue_information_rel8.rnti == rnti))
+ {
+ is_my_rnti = true;
+ break;
+ }
+ else
+ {
+ LOG_D(MAC, "UNKNOWN UL_CONFIG_REQ PDU_TYPE: %d or RNTI is not mine \n", pdu_type);
+ }
}
- return 0;
+ return is_my_rnti;
}
-int memcpy_ul_config_req (L1_rxtx_proc_t *proc, nfapi_pnf_p7_config_t* pnf_p7, nfapi_ul_config_request_t* req)
+int memcpy_ul_config_req(L1_rxtx_proc_t *proc, nfapi_pnf_p7_config_t *pnf_p7, nfapi_ul_config_request_t *req)
{
- ul_config_req = malloc(sizeof(nfapi_ul_config_request_t));
+ if (!is_my_ul_config_req(req)) return 0;
+ nfapi_ul_config_request_t *p = malloc(sizeof(nfapi_ul_config_request_t));
- ul_config_req->sfn_sf = req->sfn_sf;
- ul_config_req->vendor_extension = req->vendor_extension;
+ p->sfn_sf = req->sfn_sf;
+ p->vendor_extension = req->vendor_extension;
- ul_config_req->ul_config_request_body.number_of_pdus = req->ul_config_request_body.number_of_pdus;
- ul_config_req->ul_config_request_body.rach_prach_frequency_resources = req->ul_config_request_body.rach_prach_frequency_resources;
- ul_config_req->ul_config_request_body.srs_present = req->ul_config_request_body.srs_present;
+ p->ul_config_request_body.number_of_pdus = req->ul_config_request_body.number_of_pdus;
+ p->ul_config_request_body.rach_prach_frequency_resources = req->ul_config_request_body.rach_prach_frequency_resources;
+ p->ul_config_request_body.srs_present = req->ul_config_request_body.srs_present;
- ul_config_req->ul_config_request_body.tl.tag = req->ul_config_request_body.tl.tag;
- ul_config_req->ul_config_request_body.tl.length = req->ul_config_request_body.tl.length;
+ p->ul_config_request_body.tl.tag = req->ul_config_request_body.tl.tag;
+ p->ul_config_request_body.tl.length = req->ul_config_request_body.tl.length;
- ul_config_req->ul_config_request_body.ul_config_pdu_list =
+ p->ul_config_request_body.ul_config_pdu_list =
calloc(req->ul_config_request_body.number_of_pdus,
sizeof(nfapi_ul_config_request_pdu_t));
- for (int i = 0; i < ul_config_req->ul_config_request_body.number_of_pdus; i++) {
- ul_config_req->ul_config_request_body.ul_config_pdu_list[i] =
+ for (int i = 0; i < p->ul_config_request_body.number_of_pdus; i++)
+ {
+ p->ul_config_request_body.ul_config_pdu_list[i] =
req->ul_config_request_body.ul_config_pdu_list[i];
}
+ if (!put_queue(&ul_config_req_queue, p))
+ {
+ free(p);
+ }
+
return 0;
}
-int memcpy_tx_req(nfapi_pnf_p7_config_t *pnf_p7, nfapi_tx_request_t *req) {
- tx_req_num_elems = req->tx_request_body.number_of_pdus;
- tx_request_pdu_list = calloc(tx_req_num_elems, sizeof(nfapi_tx_request_pdu_t));
- for (int i = 0; i < tx_req_num_elems; i++) {
- tx_request_pdu_list[i].num_segments = req->tx_request_body.tx_pdu_list[i].num_segments;
- tx_request_pdu_list[i].pdu_index = req->tx_request_body.tx_pdu_list[i].pdu_index;
- tx_request_pdu_list[i].pdu_length = req->tx_request_body.tx_pdu_list[i].pdu_length;
- for (int j = 0; j < req->tx_request_body.tx_pdu_list[i].num_segments; j++) {
- tx_request_pdu_list[i].segments[j].segment_length = req->tx_request_body.tx_pdu_list[i].segments[j].segment_length;
- if (tx_request_pdu_list[i].segments[j].segment_length > 0) {
- tx_request_pdu_list[i].segments[j].segment_data = calloc(
- tx_request_pdu_list[i].segments[j].segment_length, sizeof(uint8_t));
- memcpy(tx_request_pdu_list[i].segments[j].segment_data,
- req->tx_request_body.tx_pdu_list[i].segments[j].segment_data,
- tx_request_pdu_list[i].segments[j].segment_length);
- }
+void nfapi_free_tx_req_pdu_list(nfapi_tx_req_pdu_list_t *list)
+{
+ // free all the p[i].segments[j].segment_data memory
+ int num_pdus = list->num_pdus;
+ nfapi_tx_request_pdu_t *pdus = list->pdus;
+ for (int i = 0; i < num_pdus; i++) {
+ int num_segments = pdus[i].num_segments;
+ for (int j = 0; j < num_segments; j++) {
+ free(pdus[i].segments[j].segment_data);
+ pdus[i].segments[j].segment_data = NULL;
}
}
+ free(list);
+}
- return 0;
+static bool is_my_hi_dci0_req(nfapi_hi_dci0_request_t *hi_dci0_req)
+{
+ bool is_my_rnti = false;
+ const rnti_t rnti = UE_mac_inst[0].crnti; // This is 0 representing the num_ues is 1
+ nfapi_hi_dci0_request_body_t *hi_dci0_body = &hi_dci0_req->hi_dci0_request_body;
+ for (int i = 0; i < hi_dci0_body->number_of_dci + hi_dci0_body->number_of_hi; i++)
+ {
+ nfapi_hi_dci0_request_pdu_t *hi_dci0 = &hi_dci0_body->hi_dci0_pdu_list[i];
+ if (hi_dci0->pdu_type != NFAPI_HI_DCI0_DCI_PDU_TYPE || hi_dci0->dci_pdu.dci_pdu_rel8.cqi_csi_request)
+ {
+ continue;
+ }
+ if (hi_dci0->dci_pdu.dci_pdu_rel8.rnti == rnti)
+ {
+ is_my_rnti = true;
+ break;
+ }
+ }
+
+ return is_my_rnti;
}
-int memcpy_hi_dci0_req (L1_rxtx_proc_t *proc,
- nfapi_pnf_p7_config_t* pnf_p7,
+int memcpy_hi_dci0_req (L1_rxtx_proc_t *proc,
+ nfapi_pnf_p7_config_t* pnf_p7,
nfapi_hi_dci0_request_t* req) {
- hi_dci0_req = (nfapi_hi_dci0_request_t *)malloc(sizeof(nfapi_hi_dci0_request_t));
+
+ if (!is_my_hi_dci0_req(req))
+ {
+ LOG_D(MAC, "Filtering hi_dci0_req\n");
+ return 0;
+ }
+ nfapi_hi_dci0_request_t *p = (nfapi_hi_dci0_request_t *)malloc(sizeof(nfapi_hi_dci0_request_t));
//if(req!=0){
- hi_dci0_req->sfn_sf = req->sfn_sf;
- hi_dci0_req->vendor_extension = req->vendor_extension;
+ p->sfn_sf = req->sfn_sf;
+ p->vendor_extension = req->vendor_extension;
- hi_dci0_req->hi_dci0_request_body.number_of_dci = req->hi_dci0_request_body.number_of_dci;
- hi_dci0_req->hi_dci0_request_body.number_of_hi = req->hi_dci0_request_body.number_of_hi;
- hi_dci0_req->hi_dci0_request_body.sfnsf = req->hi_dci0_request_body.sfnsf;
+ p->hi_dci0_request_body.number_of_dci = req->hi_dci0_request_body.number_of_dci;
+ p->hi_dci0_request_body.number_of_hi = req->hi_dci0_request_body.number_of_hi;
+ p->hi_dci0_request_body.sfnsf = req->hi_dci0_request_body.sfnsf;
- // UE_mac_inst[Mod_id].hi_dci0_req->hi_dci0_request_body.tl =
+ // UE_mac_inst[Mod_id].p->hi_dci0_request_body.tl =
// req->hi_dci0_request_body.tl;
- hi_dci0_req->hi_dci0_request_body.tl.tag = req->hi_dci0_request_body.tl.tag;
- hi_dci0_req->hi_dci0_request_body.tl.length = req->hi_dci0_request_body.tl.length;
+ p->hi_dci0_request_body.tl.tag = req->hi_dci0_request_body.tl.tag;
+ p->hi_dci0_request_body.tl.length = req->hi_dci0_request_body.tl.length;
- int total_pdus = hi_dci0_req->hi_dci0_request_body.number_of_dci
- + hi_dci0_req->hi_dci0_request_body.number_of_hi;
+ int total_pdus = p->hi_dci0_request_body.number_of_dci
+ + p->hi_dci0_request_body.number_of_hi;
- hi_dci0_req->hi_dci0_request_body.hi_dci0_pdu_list =
+ p->hi_dci0_request_body.hi_dci0_pdu_list =
calloc(total_pdus, sizeof(nfapi_hi_dci0_request_pdu_t));
for (int i = 0; i < total_pdus; i++) {
- hi_dci0_req->hi_dci0_request_body.hi_dci0_pdu_list[i] = req->hi_dci0_request_body.hi_dci0_pdu_list[i];
+ p->hi_dci0_request_body.hi_dci0_pdu_list[i] = req->hi_dci0_request_body.hi_dci0_pdu_list[i];
// LOG_I(MAC, "Original hi_dci0 req. type:%d, Copy type: %d
// \n",req->hi_dci0_request_body.hi_dci0_pdu_list[i].pdu_type,
- // UE_mac_inst[Mod_id].hi_dci0_req->hi_dci0_request_body.hi_dci0_pdu_list[i].pdu_type);
+ // UE_mac_inst[Mod_id].p->hi_dci0_request_body.hi_dci0_pdu_list[i].pdu_type);
+ }
+
+ if (!put_queue(&hi_dci0_req_queue, p)) {
+ free(p);
}
+ LOG_D(MAC, "DCI0 QUEUE: %zu\n", hi_dci0_req_queue.num_items);
return 0;
}
@@ -1039,6 +1150,9 @@ void UE_config_stub_pnf(void) {
*(L1_ParamList.paramarray[j][L1_REMOTE_N_PORTD_IDX].iptr);
stub_eth_params.transp_preference = ETH_UDP_MODE;
+ if (NFAPI_MODE!=NFAPI_UE_STUB_PNF)
+ continue;
+
sf_ahead = 2; // Cannot cope with 4 subframes betweem RX and TX - set it to 2
// configure_nfapi_pnf(UE_mac_inst[0].eth_params_n.remote_addr,
// UE_mac_inst[0].eth_params_n.remote_portc,
@@ -1055,79 +1169,680 @@ void UE_config_stub_pnf(void) {
}
}
-/* Dummy functions*/
+void ue_init_standalone_socket(int tx_port, int rx_port)
+{
+ {
+ struct sockaddr_in server_address;
+ int addr_len = sizeof(server_address);
+ memset(&server_address, 0, addr_len);
+ server_address.sin_family = AF_INET;
+ server_address.sin_port = htons(tx_port);
+
+ int sd = socket(server_address.sin_family, SOCK_DGRAM, 0);
+ if (sd < 0)
+ {
+ LOG_E(MAC, "Socket creation error standalone PNF\n");
+ return;
+ }
-void handle_nfapi_hi_dci0_dci_pdu(
- PHY_VARS_eNB *eNB,
- int frame,
- int subframe,
- L1_rxtx_proc_t *proc,
- nfapi_hi_dci0_request_pdu_t *hi_dci0_config_pdu) {
-}
+ if (inet_pton(server_address.sin_family, stub_eth_params.remote_addr, &server_address.sin_addr) <= 0)
+ {
+ LOG_E(MAC, "Invalid standalone PNF Address '%s'\n", stub_eth_params.remote_addr);
+ close(sd);
+ return;
+ }
-void handle_nfapi_hi_dci0_hi_pdu(
- PHY_VARS_eNB *eNB,
- int frame,
- int subframe,
- L1_rxtx_proc_t *proc,
- nfapi_hi_dci0_request_pdu_t *hi_dci0_config_pdu) {
-}
+ // Using connect to use send() instead of sendto()
+ if (connect(sd, (struct sockaddr *)&server_address, addr_len) < 0)
+ {
+ LOG_E(MAC, "Connection to standalone PNF failed: %s\n", strerror(errno));
+ close(sd);
+ return;
+ }
+ assert(ue_tx_sock_descriptor == -1);
+ ue_tx_sock_descriptor = sd;
+ }
-void handle_nfapi_dci_dl_pdu(PHY_VARS_eNB *eNB,
- int frame,
- int subframe,
- L1_rxtx_proc_t *proc,
- nfapi_dl_config_request_pdu_t *dl_config_pdu) {
-}
+ {
+ struct sockaddr_in server_address;
+ int addr_len = sizeof(server_address);
+ memset(&server_address, 0, addr_len);
+ server_address.sin_family = AF_INET;
+ server_address.sin_addr.s_addr = INADDR_ANY;
+ server_address.sin_port = htons(rx_port);
+
+ int sd = socket(server_address.sin_family, SOCK_DGRAM, 0);
+ if (sd < 0)
+ {
+ LOG_E(MAC, "Socket creation error standalone PNF\n");
+ return;
+ }
-void handle_nfapi_bch_pdu(PHY_VARS_eNB *eNB,
- L1_rxtx_proc_t *proc,
- nfapi_dl_config_request_pdu_t *dl_config_pdu,
- uint8_t *sdu) {
+ if (bind(sd, (struct sockaddr *)&server_address, addr_len) < 0)
+ {
+ LOG_E(MAC, "Connection to standalone PNF failed: %s\n", strerror(errno));
+ close(sd);
+ return;
+ }
+ assert(ue_rx_sock_descriptor == -1);
+ ue_rx_sock_descriptor = sd;
+ }
}
-void handle_nfapi_dlsch_pdu(PHY_VARS_eNB *eNB,
- int frame,
- int subframe,
- L1_rxtx_proc_t *proc,
- nfapi_dl_config_request_pdu_t *dl_config_pdu,
- uint8_t codeword_index,
- uint8_t *sdu) {
+void *ue_standalone_pnf_task(void *context)
+{
+ struct sockaddr_in server_address;
+ socklen_t addr_len = sizeof(server_address);
+ char buffer[NFAPI_MAX_PACKED_MESSAGE_SIZE];
+ int sd = ue_rx_sock_descriptor;
+ assert(sd > 0);
+
+ nfapi_tx_request_t tx_req;
+ nfapi_dl_config_request_t dl_config_req;
+ bool tx_req_valid = false;
+ bool dl_config_req_valid = false;
+ while (true)
+ {
+ ssize_t len = recvfrom(sd, buffer, sizeof(buffer), MSG_TRUNC, (struct sockaddr *)&server_address, &addr_len);
+ if (len == -1)
+ {
+ LOG_E(MAC, "reading from standalone pnf sctp socket failed \n");
+ continue;
+ }
+ /* First we'll check for possible messages from the proxy. We do this by checking
+ the length of the message. This works because sizeof(uint16_t) < sizeof(nfapi_p7_message_header_t)
+ and sizeof(phy_channel_params_t) < sizeof(nfapi_p7_message_header_t) and
+ sizeof(uint16_t) != sizeof(phy_channel_params_t). */
+ if (len > sizeof(buffer))
+ {
+ LOG_E(MAC, "%s(%d). Message truncated. %zd\n", __FUNCTION__, __LINE__, len);
+ continue;
+ }
+
+ if (len == sizeof(uint16_t))
+ {
+ uint16_t sfn_sf = 0;
+ memcpy((void *)&sfn_sf, buffer, sizeof(sfn_sf));
+ current_sfn_sf = sfn_sf;
+
+ if (sem_post(&sfn_semaphore) != 0)
+ {
+ LOG_E(MAC, "sem_post() error\n");
+ abort();
+ }
+ }
+ else if (len == sizeof(phy_channel_params_t))
+ {
+ phy_channel_params_t ch_info;
+ memcpy(&ch_info, buffer, sizeof(phy_channel_params_t));
+ current_sfn_sf = ch_info.sfn_sf;
+ if (sem_post(&sfn_semaphore) != 0)
+ {
+ LOG_E(MAC, "sem_post() error\n");
+ abort();
+ }
+ uint16_t sf = ch_info.sfn_sf & 15;
+ assert(sf < 10);
+ }
+ else
+ {
+ nfapi_p7_message_header_t header;
+ if (nfapi_p7_message_header_unpack((void *)buffer, len, &header, sizeof(header), NULL) < 0)
+ {
+ LOG_E(MAC, "Header unpack failed for standalone pnf\n");
+ continue;
+ }
+ switch (header.message_id)
+ {
+ case NFAPI_DL_CONFIG_REQUEST:
+ {
+ if (dl_config_req_valid)
+ {
+ LOG_W(MAC, "Received consecutive dl_config_reqs. Previous dl_config_req frame: %u, subframe: %u\n",
+ dl_config_req.sfn_sf >> 4, dl_config_req.sfn_sf & 15);
+ }
+ if (nfapi_p7_message_unpack((void *)buffer, len, &dl_config_req,
+ sizeof(dl_config_req), NULL) < 0)
+ {
+ LOG_E(MAC, "Message dl_config_req failed to unpack\n");
+ break;
+ }
+
+ LOG_D(MAC, "dl_config_req Frame: %u Subframe: %u\n", dl_config_req.sfn_sf >> 4,
+ dl_config_req.sfn_sf & 15);
+
+ dl_config_req_valid = true;
+ if (tx_req_valid)
+ {
+ if (dl_config_req.sfn_sf != tx_req.sfn_sf)
+ {
+ LOG_W(MAC, "sfnsf mismatch. dl_config_req Frame: %u Subframe: %u, Discarding tx_req Frame: %u Subframe: %u\n",
+ dl_config_req.sfn_sf >> 4, dl_config_req.sfn_sf & 15,
+ tx_req.sfn_sf >> 4, tx_req.sfn_sf & 15);
+ tx_req_valid = false;
+ break;
+ }
+ enqueue_dl_config_req_tx_req(&dl_config_req, &tx_req);
+ dl_config_req_valid = false;
+ tx_req_valid = false;
+ }
+
+ break;
+ }
+ case NFAPI_TX_REQUEST:
+ {
+ if (tx_req_valid)
+ {
+ LOG_W(MAC, "Received consecutive tx_reqs. Previous tx_req frame: %u, subframe: %u\n",
+ tx_req.sfn_sf >> 4, tx_req.sfn_sf & 15);
+ }
+ if (nfapi_p7_message_unpack((void *)buffer, len, &tx_req,
+ sizeof(tx_req), NULL) < 0)
+ {
+ LOG_E(MAC, "Message tx_req failed to unpack\n");
+ break;
+ }
+
+ LOG_D(MAC, "tx_req Frame: %u Subframe: %u\n", tx_req.sfn_sf >> 4,
+ tx_req.sfn_sf & 15);
+
+ tx_req_valid = true;
+ if (dl_config_req_valid)
+ {
+ if (dl_config_req.sfn_sf != tx_req.sfn_sf)
+ {
+ LOG_W(MAC, "sfnsf mismatch. Discarding dl_config_req Frame: %u Subframe: %u, tx_req Frame: %u Subframe: %u\n",
+ dl_config_req.sfn_sf >> 4, dl_config_req.sfn_sf & 15,
+ tx_req.sfn_sf >> 4, tx_req.sfn_sf & 15);
+ dl_config_req_valid = false;
+ break;
+ }
+ enqueue_dl_config_req_tx_req(&dl_config_req, &tx_req);
+ dl_config_req_valid = false;
+ tx_req_valid = false;
+ }
+
+ break;
+ }
+ case NFAPI_HI_DCI0_REQUEST:
+ {
+ nfapi_hi_dci0_request_t hi_dci0_req;
+ // lock this hi_dci0_req
+ if (nfapi_p7_message_unpack((void *)buffer, len, &hi_dci0_req,
+ sizeof(hi_dci0_req), NULL) < 0)
+ {
+ LOG_E(MAC, "Message hi_dci0_req failed to unpack\n");
+ break;
+ }
+
+ // check to see if hi_dci0_req is null
+ memcpy_hi_dci0_req(NULL, NULL, &hi_dci0_req);
+
+ break;
+ }
+ case NFAPI_UL_CONFIG_REQUEST:
+ {
+ nfapi_ul_config_request_t ul_config_req;
+ // lock this ul_config_req
+ if (nfapi_p7_message_unpack((void *)buffer, len, &ul_config_req,
+ sizeof(ul_config_req), NULL) < 0)
+ {
+ LOG_E(MAC, "Message ul_config_req failed to unpack\n");
+ break;
+ }
+
+ // check to see if ul_config_req is null
+ memcpy_ul_config_req(NULL, NULL, &ul_config_req);
+
+ break;
+ }
+ default:
+ LOG_E(MAC, "Case Statement has no corresponding nfapi message\n");
+ break;
+ }
+ }
+ }
}
-void handle_nfapi_ul_pdu(PHY_VARS_eNB *eNB,
- L1_rxtx_proc_t *proc,
- nfapi_ul_config_request_pdu_t *ul_config_pdu,
- uint16_t frame,
- uint8_t subframe,
- uint8_t srs_present) {
+
+void *memcpy_dl_config_req_standalone(nfapi_dl_config_request_t *dl_config_req)
+{
+ nfapi_dl_config_request_t *p = malloc(sizeof(nfapi_dl_config_request_t));
+
+ p->sfn_sf = dl_config_req->sfn_sf;
+
+ p->vendor_extension = dl_config_req->vendor_extension;
+
+ p->dl_config_request_body.number_dci = dl_config_req->dl_config_request_body.number_dci;
+ p->dl_config_request_body.number_pdcch_ofdm_symbols = dl_config_req->dl_config_request_body.number_pdcch_ofdm_symbols;
+ p->dl_config_request_body.number_pdsch_rnti = dl_config_req->dl_config_request_body.number_pdsch_rnti;
+ p->dl_config_request_body.number_pdu = dl_config_req->dl_config_request_body.number_pdu;
+
+ p->dl_config_request_body.tl.tag = dl_config_req->dl_config_request_body.tl.tag;
+ p->dl_config_request_body.tl.length = dl_config_req->dl_config_request_body.tl.length;
+
+ p->dl_config_request_body.dl_config_pdu_list =
+ calloc(dl_config_req->dl_config_request_body.number_pdu,
+ sizeof(nfapi_dl_config_request_pdu_t));
+ for (int i = 0; i < p->dl_config_request_body.number_pdu; i++) {
+ p->dl_config_request_body.dl_config_pdu_list[i] =
+ dl_config_req->dl_config_request_body.dl_config_pdu_list[i];
+ }
+ return p;
}
-void handle_nfapi_mch_pdu(PHY_VARS_eNB *eNB,
- L1_rxtx_proc_t *proc,
- nfapi_dl_config_request_pdu_t *dl_config_pdu,
- uint8_t *sdu) {
+
+void *memcpy_tx_req_standalone(nfapi_tx_request_t *tx_req)
+{
+ int num_pdus = tx_req->tx_request_body.number_of_pdus;
+
+ nfapi_tx_req_pdu_list_t *list = calloc(1, sizeof(nfapi_tx_req_pdu_list_t) + num_pdus * sizeof(nfapi_tx_request_pdu_t));
+ list->num_pdus = num_pdus;
+ nfapi_tx_request_pdu_t *p = list->pdus;
+
+ for (int i = 0; i < num_pdus; i++)
+ {
+ p[i].num_segments = tx_req->tx_request_body.tx_pdu_list[i].num_segments;
+ p[i].pdu_index = tx_req->tx_request_body.tx_pdu_list[i].pdu_index;
+ p[i].pdu_length = tx_req->tx_request_body.tx_pdu_list[i].pdu_length;
+ for (int j = 0; j < tx_req->tx_request_body.tx_pdu_list[i].num_segments; j++)
+ {
+ p[i].segments[j].segment_length = tx_req->tx_request_body.tx_pdu_list[i].segments[j].segment_length;
+ if (p[i].segments[j].segment_length > 0)
+ {
+ p[i].segments[j].segment_data = calloc(
+ p[i].segments[j].segment_length, sizeof(uint8_t));
+ memcpy(p[i].segments[j].segment_data,
+ tx_req->tx_request_body.tx_pdu_list[i].segments[j].segment_data,
+ p[i].segments[j].segment_length);
+ }
+ }
+ }
+ return list;
}
-void phy_config_request(PHY_Config_t *phy_config) {
+static bool is_my_dl_config_req(const nfapi_dl_config_request_t *req)
+{
+
+ const rnti_t my_rnti = UE_mac_inst[0].crnti;
+ int num_pdus = req->dl_config_request_body.number_pdu;
+ // look through list of pdus for rnti type 1 with my_rnti (normal dlsch case)
+ for (int i = 0; i < num_pdus; i++)
+ {
+ nfapi_dl_config_request_pdu_t *pdu = &req->dl_config_request_body.dl_config_pdu_list[i];
+ const int pdu_type = pdu->pdu_type;
+ if (pdu_type == NFAPI_DL_CONFIG_DCI_DL_PDU_TYPE)
+ {
+ const rnti_t dci_rnti = pdu->dci_dl_pdu.dci_dl_pdu_rel8.rnti;
+ const int rnti_type = pdu->dci_dl_pdu.dci_dl_pdu_rel8.rnti_type;
+ if (rnti_type == 1 && dci_rnti == my_rnti)
+ {
+ return true;
+ }
+ }
+ else if(pdu_type != NFAPI_DL_CONFIG_DLSCH_PDU_TYPE)
+ {
+ return true; // Because these two pdu_types are coupled and we have to accept all other pdu_types
+ }
+ }
+
+ // Look for broadcasted rnti types
+ for (int i = 0; i < num_pdus; i++)
+ {
+ nfapi_dl_config_request_pdu_t *pdu = &req->dl_config_request_body.dl_config_pdu_list[i];
+ const int pdu_type = pdu->pdu_type;
+ if (pdu_type == NFAPI_DL_CONFIG_DCI_DL_PDU_TYPE)
+ {
+ const int rnti_type = pdu->dci_dl_pdu.dci_dl_pdu_rel8.rnti_type;
+ if (rnti_type != 1)
+ {
+ return true;
+ }
+ }
+ }
+
+
+ return false;
}
-void phy_config_update_sib2_request(PHY_Config_t *phy_config) {
+void enqueue_dl_config_req_tx_req(nfapi_dl_config_request_t *dl_config_req, nfapi_tx_request_t *tx_req)
+{
+ if (!is_my_dl_config_req(dl_config_req))
+ {
+ LOG_I(MAC, "Filtering dl_config_req and tx_req\n");
+ return;
+ }
+
+ nfapi_dl_config_request_t *dl_config_req_temp = memcpy_dl_config_req_standalone(dl_config_req);
+ nfapi_tx_req_pdu_list_t *tx_req_temp = memcpy_tx_req_standalone(tx_req);
+ LOG_D(MAC, "This is the num_pdus for tx_req: %d\n", tx_req_temp->num_pdus);
+ LOG_D(MAC, "This is the num_pdus for dl_config_req and the sfn_sf: %d, %d:%d\n", dl_config_req_temp->dl_config_request_body.number_pdu,
+ NFAPI_SFNSF2SFN(dl_config_req_temp->sfn_sf), NFAPI_SFNSF2SF(dl_config_req_temp->sfn_sf));
+
+ nfapi_dl_config_req_tx_req_t *req = malloc(sizeof(nfapi_dl_config_req_tx_req_t));
+ req->dl_config_req = dl_config_req_temp;
+ req->tx_req_pdu_list = tx_req_temp;
+
+ if (!put_queue(&dl_config_req_tx_req_queue, req))
+ {
+ free(req->dl_config_req);
+ nfapi_free_tx_req_pdu_list(req->tx_req_pdu_list);
+ free(req);
+ }
}
-void phy_config_update_sib13_request(PHY_Config_t *phy_config) {
+
+__attribute__((unused))
+static void print_rx_ind(nfapi_rx_indication_t *p)
+{
+ printf("Printing RX_IND fields\n");
+ printf("header.message_id: %u\n", p->header.message_id);
+ printf("header.phy_id: %u\n", p->header.phy_id);
+ printf("header.message_id: %u\n", p->header.message_id);
+ printf("header.m_segment_sequence: %u\n", p->header.m_segment_sequence);
+ printf("header.checksum: %u\n", p->header.checksum);
+ printf("header.transmit_timestamp: %u\n", p->header.transmit_timestamp);
+ printf("sfn_sf: %u\n", p->sfn_sf);
+ printf("rx_indication_body.tl.tag: 0x%x\n", p->rx_indication_body.tl.tag);
+ printf("rx_indication_body.tl.length: %u\n", p->rx_indication_body.tl.length);
+ printf("rx_indication_body.number_of_pdus: %u\n", p->rx_indication_body.number_of_pdus);
+
+ assert(p->rx_indication_body.number_of_pdus <= NFAPI_RX_IND_MAX_PDU);
+ nfapi_rx_indication_pdu_t *pdu = p->rx_indication_body.rx_pdu_list;
+ for (int i = 0; i < p->rx_indication_body.number_of_pdus; i++)
+ {
+ printf("pdu %d nfapi_rx_ue_information.tl.tag: 0x%x\n", i, pdu->rx_ue_information.tl.tag);
+ printf("pdu %d nfapi_rx_ue_information.tl.length: %u\n", i, pdu->rx_ue_information.tl.length);
+ printf("pdu %d nfapi_rx_ue_information.handle: %u\n", i, pdu->rx_ue_information.handle);
+ printf("pdu %d nfapi_rx_ue_information.rnti: %u\n", i, pdu->rx_ue_information.rnti);
+ printf("pdu %d nfapi_rx_indication_rel8.tl.tag: 0x%x\n", i, pdu->rx_indication_rel8.tl.tag);
+ printf("pdu %d nfapi_rx_indication_rel8.tl.length: %u\n", i, pdu->rx_indication_rel8.tl.length);
+ printf("pdu %d nfapi_rx_indication_rel8.length: %u\n", i, pdu->rx_indication_rel8.length);
+ printf("pdu %d nfapi_rx_indication_rel8.offset: %u\n", i, pdu->rx_indication_rel8.offset);
+ printf("pdu %d nfapi_rx_indication_rel8.ul_cqi: %u\n", i, pdu->rx_indication_rel8.ul_cqi);
+ printf("pdu %d nfapi_rx_indication_rel8.timing_advance: %u\n", i, pdu->rx_indication_rel8.timing_advance);
+ printf("pdu %d nfapi_rx_indication_rel9.tl.tag: 0x%x\n", i, pdu->rx_indication_rel9.tl.tag);
+ printf("pdu %d nfapi_rx_indication_rel9.tl.length: %u\n", i, pdu->rx_indication_rel9.tl.length);
+ printf("pdu %d nfapi_rx_indication_rel9.timing_advance_r9: %u\n", i, pdu->rx_indication_rel9.timing_advance_r9);
+ }
+
+ fflush(stdout);
}
-uint32_t from_earfcn(int eutra_bandP, uint32_t dl_earfcn) {
- return (0);
+ void send_standalone_msg(UL_IND_t *UL, nfapi_message_id_e msg_type)
+ {
+ int encoded_size = -1;
+ char buffer[NFAPI_MAX_PACKED_MESSAGE_SIZE];
+
+ switch (msg_type)
+ {
+ case NFAPI_RACH_INDICATION:
+ encoded_size = nfapi_p7_message_pack(&UL->rach_ind, buffer, sizeof(buffer), NULL);
+ LOG_A(MAC, "RACH_IND sent to Proxy, Size: %d Frame %d Subframe %d\n", encoded_size,
+ NFAPI_SFNSF2SFN(UL->rach_ind.sfn_sf), NFAPI_SFNSF2SF(UL->rach_ind.sfn_sf));
+ break;
+ case NFAPI_CRC_INDICATION:
+ encoded_size = nfapi_p7_message_pack(&UL->crc_ind, buffer, sizeof(buffer), NULL);
+ LOG_D(MAC, "CRC_IND sent to Proxy, Size: %d Frame %d Subframe %d num_crcs: %u\n", encoded_size,
+ NFAPI_SFNSF2SFN(UL->crc_ind.sfn_sf), NFAPI_SFNSF2SF(UL->crc_ind.sfn_sf),
+ UL->crc_ind.crc_indication_body.number_of_crcs);
+ break;
+ case NFAPI_RX_ULSCH_INDICATION:
+ encoded_size = nfapi_p7_message_pack(&UL->rx_ind, buffer, sizeof(buffer), NULL);
+ LOG_D(MAC, "RX_IND sent to Proxy, Size: %d Frame %d Subframe %d rx_ind.tl.length: %u num_pdus: %u\n",
+ encoded_size, NFAPI_SFNSF2SFN(UL->rx_ind.sfn_sf), NFAPI_SFNSF2SF(UL->rx_ind.sfn_sf),
+ UL->rx_ind.rx_indication_body.tl.length, UL->rx_ind.rx_indication_body.number_of_pdus);
+ break;
+ case NFAPI_RX_CQI_INDICATION:
+ encoded_size = nfapi_p7_message_pack(&UL->cqi_ind, buffer, sizeof(buffer), NULL);
+ LOG_D(MAC, "CQI_IND sent to Proxy, Size: %d num_cqis: %u\n", encoded_size,
+ UL->cqi_ind.cqi_indication_body.number_of_cqis);
+ break;
+ case NFAPI_HARQ_INDICATION:
+ encoded_size = nfapi_p7_message_pack(&UL->harq_ind, buffer, sizeof(buffer), NULL);
+ LOG_D(MAC, "HARQ_IND sent to Proxy, Size: %d Frame %d Subframe %d\n", encoded_size,
+ NFAPI_SFNSF2SFN(UL->harq_ind.sfn_sf), NFAPI_SFNSF2SF(UL->harq_ind.sfn_sf));
+ break;
+ case NFAPI_RX_SR_INDICATION:
+ encoded_size = nfapi_p7_message_pack(&UL->sr_ind, buffer, sizeof(buffer), NULL);
+ LOG_D(MAC, "SR_IND sent to Proxy, Size: %d\n", encoded_size);
+ break;
+ default:
+ LOG_E(MAC, "%s Unknown Message msg_type :: %u\n", __func__, msg_type);
+ return;
+ }
+ if (encoded_size < 0)
+ {
+ LOG_E(MAC, "standalone pack failed\n");
+ return;
+ }
+ if (send(ue_tx_sock_descriptor, buffer, encoded_size, 0) < 0)
+ {
+ LOG_E(MAC, "Send Proxy UE failed\n");
+ return;
+ }
+ }
+
+ void send_standalone_dummy()
+ {
+ static const uint16_t dummy[] = {0, 0};
+ if (send(ue_tx_sock_descriptor, dummy, sizeof(dummy), 0) < 0)
+ {
+ LOG_E(MAC, "send dummy to OAI UE failed: %s\n", strerror(errno));
+ return;
+ }
+ }
+
+const char *dl_pdu_type_to_string(uint8_t pdu_type)
+{
+ switch (pdu_type)
+ {
+ case NFAPI_DL_CONFIG_DCI_DL_PDU_TYPE:
+ return "DCI_DL_PDU_TYPE";
+ case NFAPI_DL_CONFIG_BCH_PDU_TYPE:
+ return "BCH_PDU_TYPE";
+ case NFAPI_DL_CONFIG_MCH_PDU_TYPE:
+ return "MCH_PDU_TYPE";
+ case NFAPI_DL_CONFIG_DLSCH_PDU_TYPE:
+ return "DLSCH_PDU_TYPE";
+ case NFAPI_DL_CONFIG_PCH_PDU_TYPE:
+ return "PCH_PDU_TYPE";
+ case NFAPI_DL_CONFIG_PRS_PDU_TYPE:
+ return "PRS_PDU_TYPE";
+ case NFAPI_DL_CONFIG_CSI_RS_PDU_TYPE:
+ return "CSI_RS_PDU_TYPE";
+ case NFAPI_DL_CONFIG_EPDCCH_DL_PDU_TYPE:
+ return "EPDCCH_DL_PDU_TYPE";
+ case NFAPI_DL_CONFIG_MPDCCH_PDU_TYPE:
+ return "MPDCCH_PDU_TYPE";
+ case NFAPI_DL_CONFIG_NBCH_PDU_TYPE:
+ return "NBCH_PDU_TYPE";
+ case NFAPI_DL_CONFIG_NPDCCH_PDU_TYPE:
+ return "NPDCCH_PDU_TYPE";
+ case NFAPI_DL_CONFIG_NDLSCH_PDU_TYPE:
+ return "NDLSCH_PDU_TYPE";
+ default:
+ LOG_E(MAC, "%s No corresponding PDU for type: %u\n", __func__, pdu_type);
+ return "UNKNOWN";
+ }
}
-int32_t get_uldl_offset(int eutra_bandP) {
- return (0);
+const char *ul_pdu_type_to_string(uint8_t pdu_type)
+{
+ switch (pdu_type)
+ {
+ case NFAPI_UL_CONFIG_ULSCH_PDU_TYPE:
+ return "UL_CONFIG_ULSCH_PDU_TYPE";
+ case NFAPI_UL_CONFIG_ULSCH_CQI_RI_PDU_TYPE:
+ return "UL_CONFIG_ULSCH_CQI_RI_PDU_TYPE";
+ case NFAPI_UL_CONFIG_ULSCH_HARQ_PDU_TYPE:
+ return "UL_CONFIG_ULSCH_HARQ_PDU_TYPE";
+ case NFAPI_UL_CONFIG_ULSCH_CQI_HARQ_RI_PDU_TYPE:
+ return "UL_CONFIG_ULSCH_CQI_HARQ_RI_PDU_TYPE";
+ case NFAPI_UL_CONFIG_UCI_CQI_PDU_TYPE:
+ return "UL_CONFIG_UCI_CQI_PDU_TYPE";
+ case NFAPI_UL_CONFIG_UCI_SR_PDU_TYPE:
+ return "UCI_SR_PDU_TYPE";
+ case NFAPI_UL_CONFIG_UCI_HARQ_PDU_TYPE:
+ return "UCI_HARQ_PDU_TYPE";
+ case NFAPI_UL_CONFIG_UCI_SR_HARQ_PDU_TYPE:
+ return "UCI_SR_HARQ_PDU_TYPE";
+ case NFAPI_UL_CONFIG_UCI_CQI_HARQ_PDU_TYPE:
+ return "UCI_CQI_HARQ_PDU_TYPE";
+ case NFAPI_UL_CONFIG_UCI_CQI_SR_PDU_TYPE:
+ return "UCI_CQI_SR_PDU_TYPE";
+ case NFAPI_UL_CONFIG_UCI_CQI_SR_HARQ_PDU_TYPE:
+ return "UCI_CQI_SR_HARQ_PDU_TYPE";
+ case NFAPI_UL_CONFIG_SRS_PDU_TYPE:
+ return "SRS_PDU_TYPE";
+ case NFAPI_UL_CONFIG_HARQ_BUFFER_PDU_TYPE:
+ return "HARQ_BUFFER_PDU_TYPE";
+ case NFAPI_UL_CONFIG_ULSCH_UCI_CSI_PDU_TYPE:
+ return "PDU_TYPE";
+ case NFAPI_UL_CONFIG_ULSCH_UCI_HARQ_PDU_TYPE:
+ return "ULSCH_UCI_HARQ_PDU_TYPE";
+ case NFAPI_UL_CONFIG_ULSCH_CSI_UCI_HARQ_PDU_TYPE:
+ return "ULSCH_CSI_UCI_HARQ_PDU_TYPE";
+ case NFAPI_UL_CONFIG_NULSCH_PDU_TYPE:
+ return "NULSCH_PDU_TYPE";
+ case NFAPI_UL_CONFIG_NRACH_PDU_TYPE:
+ return "NRACH_PDU_TYPE";
+ default:
+ LOG_E(MAC, "%s No corresponding PDU for type: %u\n", __func__, pdu_type);
+ return "UNKNOWN";
+ }
}
-int l1_north_init_eNB(void) {
- return 0;
+char *nfapi_dl_config_req_to_string(nfapi_dl_config_request_t *req)
+{
+ const size_t max_result = 1024;
+ uint16_t num_pdus = req->dl_config_request_body.number_pdu;
+ int subframe = req->sfn_sf & 15;
+ int frame = req->sfn_sf >> 4;
+ char *result = malloc(max_result);
+ snprintf(result, max_result, "num_pdus=%u Frame=%d Subframe=%d",
+ num_pdus, frame, subframe);
+ for (size_t i = 0; i < num_pdus; ++i)
+ {
+ int len = strlen(result);
+ if (len >= max_result - 1)
+ {
+ break;
+ }
+ snprintf(result + len, max_result - len, " pdu_type=%s",
+ dl_pdu_type_to_string(req->dl_config_request_body.dl_config_pdu_list[i].pdu_type));
+ }
+ return result;
}
-void init_eNB_afterRU(void) {
+char *nfapi_ul_config_req_to_string(nfapi_ul_config_request_t *req)
+{
+ const size_t max_result = 1024;
+ uint16_t num_pdus = req->ul_config_request_body.number_of_pdus;
+ int subframe = req->sfn_sf & 15;
+ int frame = req->sfn_sf >> 4;
+ char *result = malloc(max_result);
+ snprintf(result, max_result, "num_pdus=%u Frame=%d Subframe=%d",
+ num_pdus, frame, subframe);
+ for (size_t i = 0; i < num_pdus; ++i)
+ {
+ int len = strlen(result);
+ if (len >= max_result - 1)
+ {
+ break;
+ }
+ snprintf(result + len, max_result - len, " pdu_type=%s",
+ ul_pdu_type_to_string(req->ul_config_request_body.ul_config_pdu_list[i].pdu_type));
+ }
+ return result;
}
+
+/* Dummy functions*/
+
+ void handle_nfapi_hi_dci0_dci_pdu(
+ PHY_VARS_eNB * eNB,
+ int frame,
+ int subframe,
+ L1_rxtx_proc_t *proc,
+ nfapi_hi_dci0_request_pdu_t *hi_dci0_config_pdu)
+ {
+ }
+
+ void handle_nfapi_hi_dci0_hi_pdu(
+ PHY_VARS_eNB * eNB,
+ int frame,
+ int subframe,
+ L1_rxtx_proc_t *proc,
+ nfapi_hi_dci0_request_pdu_t *hi_dci0_config_pdu)
+ {
+ }
+
+ void handle_nfapi_dci_dl_pdu(PHY_VARS_eNB * eNB,
+ int frame,
+ int subframe,
+ L1_rxtx_proc_t *proc,
+ nfapi_dl_config_request_pdu_t *dl_config_pdu)
+ {
+ }
+
+ void handle_nfapi_bch_pdu(PHY_VARS_eNB * eNB,
+ L1_rxtx_proc_t * proc,
+ nfapi_dl_config_request_pdu_t * dl_config_pdu,
+ uint8_t * sdu)
+ {
+ }
+
+ void handle_nfapi_dlsch_pdu(PHY_VARS_eNB * eNB,
+ int frame,
+ int subframe,
+ L1_rxtx_proc_t *proc,
+ nfapi_dl_config_request_pdu_t *dl_config_pdu,
+ uint8_t codeword_index,
+ uint8_t *sdu)
+ {
+ }
+
+ void handle_nfapi_ul_pdu(PHY_VARS_eNB * eNB,
+ L1_rxtx_proc_t * proc,
+ nfapi_ul_config_request_pdu_t * ul_config_pdu,
+ uint16_t frame,
+ uint8_t subframe,
+ uint8_t srs_present)
+ {
+ }
+ void handle_nfapi_mch_pdu(PHY_VARS_eNB * eNB,
+ L1_rxtx_proc_t * proc,
+ nfapi_dl_config_request_pdu_t * dl_config_pdu,
+ uint8_t * sdu)
+ {
+ }
+
+ void phy_config_request(PHY_Config_t * phy_config)
+ {
+ }
+
+ void phy_config_update_sib2_request(PHY_Config_t * phy_config)
+ {
+ }
+
+ void phy_config_update_sib13_request(PHY_Config_t * phy_config)
+ {
+ }
+
+ uint32_t from_earfcn(int eutra_bandP, uint32_t dl_earfcn)
+ {
+ return (0);
+ }
+
+ int32_t get_uldl_offset(int eutra_bandP)
+ {
+ return (0);
+ }
+
+ int l1_north_init_eNB(void)
+ {
+ return 0;
+ }
+
+ void init_eNB_afterRU(void)
+ {
+ }
diff --git a/openair2/PHY_INTERFACE/phy_stub_UE.h b/openair2/PHY_INTERFACE/phy_stub_UE.h
index bdf8872371e5e7f6b752a407f33f24d7ffc37497..e579a3860564775bee2b7f18ace35b6df889d85d 100644
--- a/openair2/PHY_INTERFACE/phy_stub_UE.h
+++ b/openair2/PHY_INTERFACE/phy_stub_UE.h
@@ -13,16 +13,20 @@
#include "openair2/PHY_INTERFACE/IF_Module.h"
#include "nfapi_interface.h"
#include "nfapi_pnf_interface.h"
+#include
+#include
+#include "nfapi/oai_integration/vendor_ext.h"
//#include "openair1/PHY/LTE_TRANSPORT/defs.h"
//#include "openair1/P