Commit f5d3b7d4 authored by Rúben Soares da Silva's avatar Rúben Soares da Silva Committed by Rúben Soares Silva

Fix packing/unpacking procedures for CONFIG.request

Add utility functions related to CONFIG.request
parent cd9ca6d2
......@@ -42,11 +42,14 @@ void copy_vendor_extension_value(nfapi_vendor_extension_tlv_t* dst, const nfapi_
bool compare_param_request(const nfapi_nr_param_request_scf_t *unpacked_req, const nfapi_nr_param_request_scf_t *req);
bool compare_param_response(const nfapi_nr_param_response_scf_t *unpacked_req, const nfapi_nr_param_response_scf_t *req);
bool compare_config_request(const nfapi_nr_config_request_scf_t *unpacked_req, const nfapi_nr_config_request_scf_t *req);
void free_param_request(nfapi_nr_param_request_scf_t *msg);
void free_param_response(nfapi_nr_param_response_scf_t *msg);
void free_config_request(nfapi_nr_config_request_scf_t *msg);
void copy_param_request(const nfapi_nr_param_request_scf_t *src, nfapi_nr_param_request_scf_t *dst);
void copy_param_response(const nfapi_nr_param_response_scf_t *src, nfapi_nr_param_response_scf_t *dst);
void copy_config_request(const nfapi_nr_config_request_scf_t *src, nfapi_nr_config_request_scf_t *dst);
#endif // OPENAIRINTERFACE_NR_FAPI_P5_UTILS_H
......@@ -230,6 +230,183 @@ bool compare_param_response(const nfapi_nr_param_response_scf_t *unpacked_req, c
return true;
}
bool compare_config_request(const nfapi_nr_config_request_scf_t *unpacked_req, const nfapi_nr_config_request_scf_t *req)
{
CMP(unpacked_req->header.message_id, req->header.message_id);
CMP(unpacked_req->header.message_length, req->header.message_length);
CMP(unpacked_req->num_tlv, req->num_tlv);
CMP(unpacked_req->carrier_config.dl_bandwidth.tl.tag, req->carrier_config.dl_bandwidth.tl.tag);
CMP(unpacked_req->carrier_config.dl_bandwidth.value, req->carrier_config.dl_bandwidth.value);
CMP(unpacked_req->carrier_config.dl_frequency.tl.tag, req->carrier_config.dl_frequency.tl.tag);
CMP(unpacked_req->carrier_config.dl_frequency.value, req->carrier_config.dl_frequency.value);
for (int i = 0; i < 5; ++i) {
CMP(unpacked_req->carrier_config.dl_k0[i].tl.tag, req->carrier_config.dl_k0[i].tl.tag);
CMP(unpacked_req->carrier_config.dl_k0[i].value, req->carrier_config.dl_k0[i].value);
CMP(unpacked_req->carrier_config.dl_grid_size[i].tl.tag, req->carrier_config.dl_grid_size[i].tl.tag);
CMP(unpacked_req->carrier_config.dl_grid_size[i].value, req->carrier_config.dl_grid_size[i].value);
}
CMP(unpacked_req->carrier_config.num_tx_ant.tl.tag, req->carrier_config.num_tx_ant.tl.tag);
CMP(unpacked_req->carrier_config.num_tx_ant.value, req->carrier_config.num_tx_ant.value);
CMP(unpacked_req->carrier_config.uplink_bandwidth.tl.tag, req->carrier_config.uplink_bandwidth.tl.tag);
CMP(unpacked_req->carrier_config.uplink_bandwidth.value, req->carrier_config.uplink_bandwidth.value);
CMP(unpacked_req->carrier_config.uplink_frequency.tl.tag, req->carrier_config.uplink_frequency.tl.tag);
CMP(unpacked_req->carrier_config.uplink_frequency.value, req->carrier_config.uplink_frequency.value);
for (int i = 0; i < 5; ++i) {
CMP(unpacked_req->carrier_config.ul_k0[i].tl.tag, req->carrier_config.ul_k0[i].tl.tag);
CMP(unpacked_req->carrier_config.ul_k0[i].value, req->carrier_config.ul_k0[i].value);
CMP(unpacked_req->carrier_config.ul_grid_size[i].tl.tag, req->carrier_config.ul_grid_size[i].tl.tag);
CMP(unpacked_req->carrier_config.ul_grid_size[i].value, req->carrier_config.ul_grid_size[i].value);
}
CMP(unpacked_req->carrier_config.num_rx_ant.tl.tag, req->carrier_config.num_rx_ant.tl.tag);
CMP(unpacked_req->carrier_config.num_rx_ant.value, req->carrier_config.num_rx_ant.value);
CMP(unpacked_req->carrier_config.frequency_shift_7p5khz.tl.tag, req->carrier_config.frequency_shift_7p5khz.tl.tag);
CMP(unpacked_req->carrier_config.frequency_shift_7p5khz.value, req->carrier_config.frequency_shift_7p5khz.value);
CMP(unpacked_req->cell_config.phy_cell_id.tl.tag, req->cell_config.phy_cell_id.tl.tag);
CMP(unpacked_req->cell_config.phy_cell_id.value, req->cell_config.phy_cell_id.value);
CMP(unpacked_req->cell_config.frame_duplex_type.tl.tag, req->cell_config.frame_duplex_type.tl.tag);
CMP(unpacked_req->cell_config.frame_duplex_type.value, req->cell_config.frame_duplex_type.value);
CMP(unpacked_req->ssb_config.ss_pbch_power.tl.tag, req->ssb_config.ss_pbch_power.tl.tag);
CMP(unpacked_req->ssb_config.ss_pbch_power.value, req->ssb_config.ss_pbch_power.value);
CMP(unpacked_req->ssb_config.bch_payload.tl.tag, req->ssb_config.bch_payload.tl.tag);
CMP(unpacked_req->ssb_config.bch_payload.value, req->ssb_config.bch_payload.value);
CMP(unpacked_req->ssb_config.scs_common.tl.tag, req->ssb_config.scs_common.tl.tag);
CMP(unpacked_req->ssb_config.scs_common.value, req->ssb_config.scs_common.value);
CMP(unpacked_req->prach_config.prach_sequence_length.tl.tag, req->prach_config.prach_sequence_length.tl.tag);
CMP(unpacked_req->prach_config.prach_sequence_length.value, req->prach_config.prach_sequence_length.value);
CMP(unpacked_req->prach_config.prach_sub_c_spacing.tl.tag, req->prach_config.prach_sub_c_spacing.tl.tag);
CMP(unpacked_req->prach_config.prach_sub_c_spacing.value, req->prach_config.prach_sub_c_spacing.value);
CMP(unpacked_req->prach_config.restricted_set_config.tl.tag, req->prach_config.restricted_set_config.tl.tag);
CMP(unpacked_req->prach_config.restricted_set_config.value, req->prach_config.restricted_set_config.value);
CMP(unpacked_req->prach_config.num_prach_fd_occasions.tl.tag, req->prach_config.num_prach_fd_occasions.tl.tag);
CMP(unpacked_req->prach_config.num_prach_fd_occasions.value, req->prach_config.num_prach_fd_occasions.value);
CMP(unpacked_req->prach_config.prach_ConfigurationIndex.tl.tag, req->prach_config.prach_ConfigurationIndex.tl.tag);
CMP(unpacked_req->prach_config.prach_ConfigurationIndex.value, req->prach_config.prach_ConfigurationIndex.value);
for (int i = 0; i < unpacked_req->prach_config.num_prach_fd_occasions.value; i++) {
nfapi_nr_num_prach_fd_occasions_t unpacked_prach_fd_occasion = unpacked_req->prach_config.num_prach_fd_occasions_list[i];
nfapi_nr_num_prach_fd_occasions_t req_prach_fd_occasion = req->prach_config.num_prach_fd_occasions_list[i];
CMP(unpacked_prach_fd_occasion.prach_root_sequence_index.tl.tag, req_prach_fd_occasion.prach_root_sequence_index.tl.tag);
CMP(unpacked_prach_fd_occasion.prach_root_sequence_index.value, req_prach_fd_occasion.prach_root_sequence_index.value);
CMP(unpacked_prach_fd_occasion.num_root_sequences.tl.tag, req_prach_fd_occasion.num_root_sequences.tl.tag);
CMP(unpacked_prach_fd_occasion.num_root_sequences.value, req_prach_fd_occasion.num_root_sequences.value);
CMP(unpacked_prach_fd_occasion.k1.tl.tag, req_prach_fd_occasion.k1.tl.tag);
CMP(unpacked_prach_fd_occasion.k1.value, req_prach_fd_occasion.k1.value);
CMP(unpacked_prach_fd_occasion.prach_zero_corr_conf.tl.tag, req_prach_fd_occasion.prach_zero_corr_conf.tl.tag);
CMP(unpacked_prach_fd_occasion.prach_zero_corr_conf.value, req_prach_fd_occasion.prach_zero_corr_conf.value);
CMP(unpacked_prach_fd_occasion.num_unused_root_sequences.tl.tag, req_prach_fd_occasion.num_unused_root_sequences.tl.tag);
CMP(unpacked_prach_fd_occasion.num_unused_root_sequences.value, req_prach_fd_occasion.num_unused_root_sequences.value);
for (int k = 0; k < unpacked_prach_fd_occasion.num_unused_root_sequences.value; k++) {
CMP(unpacked_prach_fd_occasion.unused_root_sequences_list[k].tl.tag,
req_prach_fd_occasion.unused_root_sequences_list[k].tl.tag);
CMP(unpacked_prach_fd_occasion.unused_root_sequences_list[k].value,
req_prach_fd_occasion.unused_root_sequences_list[k].value);
}
}
CMP(unpacked_req->prach_config.ssb_per_rach.tl.tag, req->prach_config.ssb_per_rach.tl.tag);
CMP(unpacked_req->prach_config.ssb_per_rach.value, req->prach_config.ssb_per_rach.value);
CMP(unpacked_req->prach_config.prach_multiple_carriers_in_a_band.tl.tag,
req->prach_config.prach_multiple_carriers_in_a_band.tl.tag);
CMP(unpacked_req->prach_config.prach_multiple_carriers_in_a_band.value,
req->prach_config.prach_multiple_carriers_in_a_band.value);
CMP(unpacked_req->ssb_table.ssb_offset_point_a.tl.tag, req->ssb_table.ssb_offset_point_a.tl.tag);
CMP(unpacked_req->ssb_table.ssb_offset_point_a.value, req->ssb_table.ssb_offset_point_a.value);
CMP(unpacked_req->ssb_table.ssb_period.tl.tag, req->ssb_table.ssb_period.tl.tag);
CMP(unpacked_req->ssb_table.ssb_period.value, req->ssb_table.ssb_period.value);
CMP(unpacked_req->ssb_table.ssb_subcarrier_offset.tl.tag, req->ssb_table.ssb_subcarrier_offset.tl.tag);
CMP(unpacked_req->ssb_table.ssb_subcarrier_offset.value, req->ssb_table.ssb_subcarrier_offset.value);
CMP(unpacked_req->ssb_table.MIB.tl.tag, req->ssb_table.MIB.tl.tag);
CMP(unpacked_req->ssb_table.MIB.value, req->ssb_table.MIB.value);
CMP(unpacked_req->ssb_table.ssb_mask_list[0].ssb_mask.tl.tag, req->ssb_table.ssb_mask_list[0].ssb_mask.tl.tag);
CMP(unpacked_req->ssb_table.ssb_mask_list[0].ssb_mask.value, req->ssb_table.ssb_mask_list[0].ssb_mask.value);
CMP(unpacked_req->ssb_table.ssb_mask_list[1].ssb_mask.tl.tag, req->ssb_table.ssb_mask_list[1].ssb_mask.tl.tag);
CMP(unpacked_req->ssb_table.ssb_mask_list[1].ssb_mask.value, req->ssb_table.ssb_mask_list[1].ssb_mask.value);
for (int i = 0; i < 64; i++) {
CMP(unpacked_req->ssb_table.ssb_beam_id_list[i].beam_id.tl.tag, req->ssb_table.ssb_beam_id_list[i].beam_id.tl.tag);
CMP(unpacked_req->ssb_table.ssb_beam_id_list[i].beam_id.value, req->ssb_table.ssb_beam_id_list[i].beam_id.value);
}
CMP(unpacked_req->tdd_table.tdd_period.tl.tag, req->tdd_table.tdd_period.tl.tag);
CMP(unpacked_req->tdd_table.tdd_period.value, req->tdd_table.tdd_period.value);
const uint8_t slotsperframe[5] = {10, 20, 40, 80, 160};
// Assuming always CP_Normal, because Cyclic prefix is not included in CONFIG.request 10.02, but is present in 10.04
uint8_t cyclicprefix = 1;
bool normal_CP = cyclicprefix ? false : true;
// 3GPP 38.211 Table 4.3.2.1 & Table 4.3.2.2
uint8_t number_of_symbols_per_slot = normal_CP ? 14 : 12;
for (int i = 0; i < slotsperframe[unpacked_req->ssb_config.scs_common.value]; i++) {
for (int k = 0; k < number_of_symbols_per_slot; k++) {
CMP(unpacked_req->tdd_table.max_tdd_periodicity_list[i].max_num_of_symbol_per_slot_list[k].slot_config.tl.tag,
req->tdd_table.max_tdd_periodicity_list[i].max_num_of_symbol_per_slot_list[k].slot_config.tl.tag);
CMP(unpacked_req->tdd_table.max_tdd_periodicity_list[i].max_num_of_symbol_per_slot_list[k].slot_config.value,
req->tdd_table.max_tdd_periodicity_list[i].max_num_of_symbol_per_slot_list[k].slot_config.value);
}
}
CMP(unpacked_req->measurement_config.rssi_measurement.tl.tag, req->measurement_config.rssi_measurement.tl.tag);
CMP(unpacked_req->measurement_config.rssi_measurement.value, req->measurement_config.rssi_measurement.value);
CMP(unpacked_req->nfapi_config.p7_vnf_address_ipv4.tl.tag, req->nfapi_config.p7_vnf_address_ipv4.tl.tag);
for (int i = 0; i < NFAPI_IPV4_ADDRESS_LENGTH; ++i) {
CMP(unpacked_req->nfapi_config.p7_vnf_address_ipv4.address[i], req->nfapi_config.p7_vnf_address_ipv4.address[i]);
}
CMP(unpacked_req->nfapi_config.p7_vnf_address_ipv6.tl.tag, req->nfapi_config.p7_vnf_address_ipv6.tl.tag);
for (int i = 0; i < NFAPI_IPV6_ADDRESS_LENGTH; ++i) {
CMP(unpacked_req->nfapi_config.p7_vnf_address_ipv6.address[i], req->nfapi_config.p7_vnf_address_ipv6.address[i]);
}
CMP(unpacked_req->nfapi_config.p7_vnf_port.tl.tag, req->nfapi_config.p7_vnf_port.tl.tag);
CMP(unpacked_req->nfapi_config.p7_vnf_port.value, req->nfapi_config.p7_vnf_port.value);
CMP(unpacked_req->nfapi_config.timing_window.tl.tag, req->nfapi_config.timing_window.tl.tag);
CMP(unpacked_req->nfapi_config.timing_window.value, req->nfapi_config.timing_window.value);
CMP(unpacked_req->nfapi_config.timing_info_mode.tl.tag, req->nfapi_config.timing_info_mode.tl.tag);
CMP(unpacked_req->nfapi_config.timing_info_mode.value, req->nfapi_config.timing_info_mode.value);
CMP(unpacked_req->nfapi_config.timing_info_period.tl.tag, req->nfapi_config.timing_info_period.tl.tag);
CMP(unpacked_req->nfapi_config.timing_info_period.value, req->nfapi_config.timing_info_period.value);
return true;
}
void free_param_request(nfapi_nr_param_request_scf_t *msg)
{
if (msg->vendor_extension) {
......@@ -247,6 +424,35 @@ void free_param_response(nfapi_nr_param_response_scf_t *msg)
free(msg->cell_param.config_tlvs_to_report_list);
}
}
void free_config_request(nfapi_nr_config_request_scf_t *msg)
{
if (msg->vendor_extension) {
free(msg->vendor_extension);
}
if (msg->prach_config.num_prach_fd_occasions_list) {
for (int i = 0; i < msg->prach_config.num_prach_fd_occasions.value; i++) {
nfapi_nr_num_prach_fd_occasions_t *prach_fd_occasion = &(msg->prach_config.num_prach_fd_occasions_list[i]);
if(prach_fd_occasion->unused_root_sequences_list){
free(prach_fd_occasion->unused_root_sequences_list);
}
}
free(msg->prach_config.num_prach_fd_occasions_list);
}
const uint8_t slotsperframe[5] = {10, 20, 40, 80, 160};
if (msg->tdd_table.max_tdd_periodicity_list) {
for (int i = 0; i < slotsperframe[msg->ssb_config.scs_common.value]; i++) {
free(msg->tdd_table.max_tdd_periodicity_list[i].max_num_of_symbol_per_slot_list);
}
free(msg->tdd_table.max_tdd_periodicity_list);
}
if (msg->pmi_list.pmi_pdu) {
free(msg->pmi_list.pmi_pdu);
}
}
void copy_tl(const nfapi_tl_t *src, nfapi_tl_t *dst)
{
dst->tag = src->tag;
......@@ -496,3 +702,222 @@ void copy_param_response(const nfapi_nr_param_response_scf_t *src, nfapi_nr_para
copy_tl(&src->nfapi_config.tx_data_timing_offset.tl, &dst->nfapi_config.tx_data_timing_offset.tl);
dst->nfapi_config.tx_data_timing_offset.value = src->nfapi_config.tx_data_timing_offset.value;
}
void copy_config_request(const nfapi_nr_config_request_scf_t *src, nfapi_nr_config_request_scf_t *dst)
{
dst->header.message_id = src->header.message_id;
dst->header.message_length = src->header.message_length;
if (src->vendor_extension) {
dst->vendor_extension = calloc(1, sizeof(nfapi_vendor_extension_tlv_t));
dst->vendor_extension->tag = src->vendor_extension->tag;
dst->vendor_extension->length = src->vendor_extension->length;
copy_vendor_extension_value(&dst->vendor_extension,&src->vendor_extension);
}
dst->num_tlv = src->num_tlv;
copy_tl(&src->carrier_config.dl_bandwidth.tl, &dst->carrier_config.dl_bandwidth.tl);
dst->carrier_config.dl_bandwidth.value = src->carrier_config.dl_bandwidth.value;
copy_tl(&src->carrier_config.dl_frequency.tl, &dst->carrier_config.dl_frequency.tl);
dst->carrier_config.dl_frequency.value = src->carrier_config.dl_frequency.value;
for (int i = 0; i < 5; ++i) {
copy_tl(&src->carrier_config.dl_k0[i].tl, &dst->carrier_config.dl_k0[i].tl);
dst->carrier_config.dl_k0[i].value = src->carrier_config.dl_k0[i].value;
copy_tl(&src->carrier_config.dl_grid_size[i].tl, &dst->carrier_config.dl_grid_size[i].tl);
dst->carrier_config.dl_grid_size[i].value = src->carrier_config.dl_grid_size[i].value;
}
copy_tl(&src->carrier_config.num_tx_ant.tl, &dst->carrier_config.num_tx_ant.tl);
dst->carrier_config.num_tx_ant.value = src->carrier_config.num_tx_ant.value;
copy_tl(&src->carrier_config.uplink_bandwidth.tl, &dst->carrier_config.uplink_bandwidth.tl);
dst->carrier_config.uplink_bandwidth.value = src->carrier_config.uplink_bandwidth.value;
copy_tl(&src->carrier_config.uplink_frequency.tl, &dst->carrier_config.uplink_frequency.tl);
dst->carrier_config.uplink_frequency.value = src->carrier_config.uplink_frequency.value;
copy_tl(&src->carrier_config.uplink_frequency.tl, &dst->carrier_config.uplink_frequency.tl);
dst->carrier_config.uplink_frequency.value = src->carrier_config.uplink_frequency.value;
for (int i = 0; i < 5; ++i) {
copy_tl(&src->carrier_config.ul_k0[i].tl, &dst->carrier_config.ul_k0[i].tl);
dst->carrier_config.ul_k0[i].value = src->carrier_config.ul_k0[i].value;
copy_tl(&src->carrier_config.ul_grid_size[i].tl, &dst->carrier_config.ul_grid_size[i].tl);
dst->carrier_config.ul_grid_size[i].value = src->carrier_config.ul_grid_size[i].value;
}
copy_tl(&src->carrier_config.num_rx_ant.tl, &dst->carrier_config.num_rx_ant.tl);
dst->carrier_config.num_rx_ant.value = src->carrier_config.num_rx_ant.value;
copy_tl(&src->carrier_config.frequency_shift_7p5khz.tl, &dst->carrier_config.frequency_shift_7p5khz.tl);
dst->carrier_config.frequency_shift_7p5khz.value = src->carrier_config.frequency_shift_7p5khz.value;
copy_tl(&src->cell_config.phy_cell_id.tl, &dst->cell_config.phy_cell_id.tl);
dst->cell_config.phy_cell_id.value = src->cell_config.phy_cell_id.value;
copy_tl(&src->cell_config.frame_duplex_type.tl, &dst->cell_config.frame_duplex_type.tl);
dst->cell_config.frame_duplex_type.value = src->cell_config.frame_duplex_type.value;
copy_tl(&src->ssb_config.ss_pbch_power.tl, &dst->ssb_config.ss_pbch_power.tl);
dst->ssb_config.ss_pbch_power.value = src->ssb_config.ss_pbch_power.value;
copy_tl(&src->ssb_config.bch_payload.tl, &dst->ssb_config.bch_payload.tl);
dst->ssb_config.bch_payload.value = src->ssb_config.bch_payload.value;
copy_tl(&src->ssb_config.scs_common.tl, &dst->ssb_config.scs_common.tl);
dst->ssb_config.scs_common.value = src->ssb_config.scs_common.value;
copy_tl(&src->prach_config.prach_sequence_length.tl, &dst->prach_config.prach_sequence_length.tl);
dst->prach_config.prach_sequence_length.value = src->prach_config.prach_sequence_length.value;
copy_tl(&src->prach_config.prach_sub_c_spacing.tl, &dst->prach_config.prach_sub_c_spacing.tl);
dst->prach_config.prach_sub_c_spacing.value = src->prach_config.prach_sub_c_spacing.value;
copy_tl(&src->prach_config.restricted_set_config.tl, &dst->prach_config.restricted_set_config.tl);
dst->prach_config.restricted_set_config.value = src->prach_config.restricted_set_config.value;
copy_tl(&src->prach_config.num_prach_fd_occasions.tl, &dst->prach_config.num_prach_fd_occasions.tl);
dst->prach_config.num_prach_fd_occasions.value = src->prach_config.num_prach_fd_occasions.value;
copy_tl(&src->prach_config.prach_ConfigurationIndex.tl, &dst->prach_config.prach_ConfigurationIndex.tl);
dst->prach_config.prach_ConfigurationIndex.value = src->prach_config.prach_ConfigurationIndex.value;
copy_tl(&src->prach_config.prach_ConfigurationIndex.tl, &dst->prach_config.prach_ConfigurationIndex.tl);
dst->prach_config.prach_ConfigurationIndex.value = src->prach_config.prach_ConfigurationIndex.value;
dst->prach_config.num_prach_fd_occasions_list = (nfapi_nr_num_prach_fd_occasions_t *)malloc(
dst->prach_config.num_prach_fd_occasions.value * sizeof(nfapi_nr_num_prach_fd_occasions_t));
for (int i = 0; i < dst->prach_config.num_prach_fd_occasions.value; i++) {
nfapi_nr_num_prach_fd_occasions_t *src_prach_fd_occasion = &(src->prach_config.num_prach_fd_occasions_list[i]);
nfapi_nr_num_prach_fd_occasions_t *dst_prach_fd_occasion = &(dst->prach_config.num_prach_fd_occasions_list[i]);
copy_tl(&src_prach_fd_occasion->prach_root_sequence_index.tl, &dst_prach_fd_occasion->prach_root_sequence_index.tl);
dst_prach_fd_occasion->prach_root_sequence_index.value = src_prach_fd_occasion->prach_root_sequence_index.value;
copy_tl(&src_prach_fd_occasion->num_root_sequences.tl, &dst_prach_fd_occasion->num_root_sequences.tl);
dst_prach_fd_occasion->num_root_sequences.value = src_prach_fd_occasion->num_root_sequences.value;
copy_tl(&src_prach_fd_occasion->k1.tl, &dst_prach_fd_occasion->k1.tl);
dst_prach_fd_occasion->k1.value = src_prach_fd_occasion->k1.value;
copy_tl(&src_prach_fd_occasion->prach_zero_corr_conf.tl, &dst_prach_fd_occasion->prach_zero_corr_conf.tl);
dst_prach_fd_occasion->prach_zero_corr_conf.value = src_prach_fd_occasion->prach_zero_corr_conf.value;
copy_tl(&src_prach_fd_occasion->num_unused_root_sequences.tl, &dst_prach_fd_occasion->num_unused_root_sequences.tl);
dst_prach_fd_occasion->num_unused_root_sequences.value = src_prach_fd_occasion->num_unused_root_sequences.value;
dst_prach_fd_occasion->unused_root_sequences_list =
(nfapi_uint8_tlv_t *)malloc(dst_prach_fd_occasion->num_unused_root_sequences.value * sizeof(nfapi_uint8_tlv_t));
for (int k = 0; k < dst_prach_fd_occasion->num_unused_root_sequences.value; k++) {
copy_tl(&src_prach_fd_occasion->unused_root_sequences_list[k].tl, &dst_prach_fd_occasion->unused_root_sequences_list[k].tl);
dst_prach_fd_occasion->unused_root_sequences_list[k].value = src_prach_fd_occasion->unused_root_sequences_list[k].value;
}
}
copy_tl(&src->prach_config.ssb_per_rach.tl, &dst->prach_config.ssb_per_rach.tl);
dst->prach_config.ssb_per_rach.value = src->prach_config.ssb_per_rach.value;
copy_tl(&src->prach_config.prach_multiple_carriers_in_a_band.tl, &dst->prach_config.prach_multiple_carriers_in_a_band.tl);
dst->prach_config.prach_multiple_carriers_in_a_band.value = src->prach_config.prach_multiple_carriers_in_a_band.value;
copy_tl(&src->ssb_table.ssb_offset_point_a.tl, &dst->ssb_table.ssb_offset_point_a.tl);
dst->ssb_table.ssb_offset_point_a.value = src->ssb_table.ssb_offset_point_a.value;
copy_tl(&src->ssb_table.ssb_period.tl, &dst->ssb_table.ssb_period.tl);
dst->ssb_table.ssb_period.value = src->ssb_table.ssb_period.value;
copy_tl(&src->ssb_table.ssb_subcarrier_offset.tl, &dst->ssb_table.ssb_subcarrier_offset.tl);
dst->ssb_table.ssb_subcarrier_offset.value = src->ssb_table.ssb_subcarrier_offset.value;
copy_tl(&src->ssb_table.MIB.tl, &dst->ssb_table.MIB.tl);
dst->ssb_table.MIB.value = src->ssb_table.MIB.value;
copy_tl(&src->ssb_table.ssb_mask_list[0].ssb_mask.tl, &dst->ssb_table.ssb_mask_list[0].ssb_mask.tl);
dst->ssb_table.ssb_mask_list[0].ssb_mask.value = src->ssb_table.ssb_mask_list[0].ssb_mask.value;
copy_tl(&src->ssb_table.ssb_mask_list[1].ssb_mask.tl, &dst->ssb_table.ssb_mask_list[1].ssb_mask.tl);
dst->ssb_table.ssb_mask_list[1].ssb_mask.value = src->ssb_table.ssb_mask_list[1].ssb_mask.value;
for (int i = 0; i < 64; i++) {
copy_tl(&src->ssb_table.ssb_beam_id_list[i].beam_id.tl, &dst->ssb_table.ssb_beam_id_list[i].beam_id.tl);
dst->ssb_table.ssb_beam_id_list[i].beam_id.value = src->ssb_table.ssb_beam_id_list[i].beam_id.value;
}
copy_tl(&src->tdd_table.tdd_period.tl, &dst->tdd_table.tdd_period.tl);
dst->tdd_table.tdd_period.value = src->tdd_table.tdd_period.value;
const uint8_t slotsperframe[5] = {10, 20, 40, 80, 160};
// Assuming always CP_Normal, because Cyclic prefix is not included in CONFIG.request 10.02, but is present in 10.04
uint8_t cyclicprefix = 1;
bool normal_CP = cyclicprefix ? false : true;
// 3GPP 38.211 Table 4.3.2.1 & Table 4.3.2.2
uint8_t number_of_symbols_per_slot = normal_CP ? 14 : 12;
dst->tdd_table.max_tdd_periodicity_list = (nfapi_nr_max_tdd_periodicity_t *)malloc(slotsperframe[dst->ssb_config.scs_common.value]
* sizeof(nfapi_nr_max_tdd_periodicity_t));
for (int i = 0; i < slotsperframe[dst->ssb_config.scs_common.value]; i++) {
dst->tdd_table.max_tdd_periodicity_list[i].max_num_of_symbol_per_slot_list =
(nfapi_nr_max_num_of_symbol_per_slot_t *)malloc(number_of_symbols_per_slot * sizeof(nfapi_nr_max_num_of_symbol_per_slot_t));
}
for (int i = 0; i < slotsperframe[dst->ssb_config.scs_common.value]; i++) { // TODO check right number of slots
for (int k = 0; k < number_of_symbols_per_slot; k++) { // TODO can change?
copy_tl(&src->tdd_table.max_tdd_periodicity_list[i].max_num_of_symbol_per_slot_list[k].slot_config.tl,
&dst->tdd_table.max_tdd_periodicity_list[i].max_num_of_symbol_per_slot_list[k].slot_config.tl);
dst->tdd_table.max_tdd_periodicity_list[i].max_num_of_symbol_per_slot_list[k].slot_config.value =
src->tdd_table.max_tdd_periodicity_list[i].max_num_of_symbol_per_slot_list[k].slot_config.value;
}
}
copy_tl(&src->measurement_config.rssi_measurement.tl, &dst->measurement_config.rssi_measurement.tl);
dst->measurement_config.rssi_measurement.value = src->measurement_config.rssi_measurement.value;
copy_tl(&src->nfapi_config.p7_vnf_address_ipv4.tl, &dst->nfapi_config.p7_vnf_address_ipv4.tl);
memcpy(dst->nfapi_config.p7_vnf_address_ipv4.address,
src->nfapi_config.p7_vnf_address_ipv4.address,
sizeof(dst->nfapi_config.p7_vnf_address_ipv4.address));
copy_tl(&src->nfapi_config.p7_vnf_address_ipv6.tl, &dst->nfapi_config.p7_vnf_address_ipv6.tl);
memcpy(dst->nfapi_config.p7_vnf_address_ipv6.address,
src->nfapi_config.p7_vnf_address_ipv6.address,
sizeof(dst->nfapi_config.p7_vnf_address_ipv6.address));
copy_tl(&src->nfapi_config.p7_vnf_port.tl, &dst->nfapi_config.p7_vnf_port.tl);
dst->nfapi_config.p7_vnf_port.value = src->nfapi_config.p7_vnf_port.value;
copy_tl(&src->nfapi_config.p7_pnf_address_ipv4.tl, &dst->nfapi_config.p7_pnf_address_ipv4.tl);
memcpy(dst->nfapi_config.p7_pnf_address_ipv4.address,
src->nfapi_config.p7_pnf_address_ipv4.address,
sizeof(dst->nfapi_config.p7_pnf_address_ipv4.address));
copy_tl(&src->nfapi_config.p7_pnf_address_ipv6.tl, &dst->nfapi_config.p7_pnf_address_ipv6.tl);
memcpy(dst->nfapi_config.p7_pnf_address_ipv6.address,
src->nfapi_config.p7_pnf_address_ipv6.address,
sizeof(dst->nfapi_config.p7_pnf_address_ipv6.address));
copy_tl(&src->nfapi_config.p7_pnf_port.tl, &dst->nfapi_config.p7_pnf_port.tl);
dst->nfapi_config.p7_pnf_port.value = src->nfapi_config.p7_pnf_port.value;
copy_tl(&src->nfapi_config.timing_window.tl, &dst->nfapi_config.timing_window.tl);
dst->nfapi_config.timing_window.value = src->nfapi_config.timing_window.value;
copy_tl(&src->nfapi_config.timing_info_mode.tl, &dst->nfapi_config.timing_info_mode.tl);
dst->nfapi_config.timing_info_mode.value = src->nfapi_config.timing_info_mode.value;
copy_tl(&src->nfapi_config.timing_info_period.tl, &dst->nfapi_config.timing_info_period.tl);
dst->nfapi_config.timing_info_period.value = src->nfapi_config.timing_info_period.value;
copy_tl(&src->nfapi_config.dl_tti_timing_offset.tl, &dst->nfapi_config.dl_tti_timing_offset.tl);
dst->nfapi_config.dl_tti_timing_offset.value = src->nfapi_config.dl_tti_timing_offset.value;
copy_tl(&src->nfapi_config.ul_tti_timing_offset.tl, &dst->nfapi_config.ul_tti_timing_offset.tl);
dst->nfapi_config.ul_tti_timing_offset.value = src->nfapi_config.ul_tti_timing_offset.value;
copy_tl(&src->nfapi_config.ul_dci_timing_offset.tl, &dst->nfapi_config.ul_dci_timing_offset.tl);
dst->nfapi_config.ul_dci_timing_offset.value = src->nfapi_config.ul_dci_timing_offset.value;
copy_tl(&src->nfapi_config.tx_data_timing_offset.tl, &dst->nfapi_config.tx_data_timing_offset.tl);
dst->nfapi_config.tx_data_timing_offset.value = src->nfapi_config.tx_data_timing_offset.value;
}
......@@ -20,6 +20,7 @@
#include "stddef.h"
#include <stdint.h>
#include <stdbool.h>
// Constants - update based on implementation
#define NFAPI_MAX_PHY_RF_INSTANCES 2
......
......@@ -1230,16 +1230,15 @@ uint8_t pack_nr_config_request(void *msg, uint8_t **ppWritePackedMsg, uint8_t *e
end,
&pack_uint16_tlv_value);
numTLVs++;
if (NFAPI_MODE != NFAPI_MODE_AERIAL) {
// TLV not supported by Aerial L1
pack_nr_tlv(NFAPI_NR_CONFIG_FREQUENCY_SHIFT_7P5KHZ_TAG,
&(pNfapiMsg->carrier_config.frequency_shift_7p5khz),
ppWritePackedMsg,
end,
&pack_uint8_tlv_value);
numTLVs++;
}
#ifndef ENABLE_AERIAL
// TLV not supported by Aerial L1
retval &= pack_nr_tlv(NFAPI_NR_CONFIG_FREQUENCY_SHIFT_7P5KHZ_TAG,
&(pNfapiMsg->carrier_config.frequency_shift_7p5khz),
ppWritePackedMsg,
end,
&pack_uint8_tlv_value);
numTLVs++;
#endif
// END Carrier Configuration
// START Cell Configuration
......@@ -1265,15 +1264,16 @@ uint8_t pack_nr_config_request(void *msg, uint8_t **ppWritePackedMsg, uint8_t *e
end,
&pack_uint32_tlv_value);
numTLVs++;
if (NFAPI_MODE != NFAPI_MODE_AERIAL) {
// TLV not supported by Aerial L1
retval &= pack_nr_tlv(NFAPI_NR_CONFIG_BCH_PAYLOAD_TAG,
&(pNfapiMsg->ssb_config.bch_payload),
ppWritePackedMsg,
end,
&pack_uint8_tlv_value);
numTLVs++;
}
#ifndef ENABLE_AERIAL
// TLV not supported by Aerial L1
retval &= pack_nr_tlv(NFAPI_NR_CONFIG_BCH_PAYLOAD_TAG,
&(pNfapiMsg->ssb_config.bch_payload),
ppWritePackedMsg,
end,
&pack_uint8_tlv_value);
numTLVs++;
#endif
retval &= pack_nr_tlv(NFAPI_NR_CONFIG_SCS_COMMON_TAG,
&(pNfapiMsg->ssb_config.scs_common),
......@@ -1354,12 +1354,11 @@ uint8_t pack_nr_config_request(void *msg, uint8_t **ppWritePackedMsg, uint8_t *e
numTLVs++;
for (int k = 0; k < prach_fd_occasion.num_unused_root_sequences.value; k++) {
prach_fd_occasion.unused_root_sequences_list[k].tl.tag = NFAPI_NR_CONFIG_UNUSED_ROOT_SEQUENCES_TAG;
prach_fd_occasion.unused_root_sequences_list[k].value = 0;
pack_nr_tlv(NFAPI_NR_CONFIG_UNUSED_ROOT_SEQUENCES_TAG,
&(prach_fd_occasion.unused_root_sequences_list[k]),
ppWritePackedMsg,
end,
&pack_uint16_tlv_value);
retval &= pack_nr_tlv(NFAPI_NR_CONFIG_UNUSED_ROOT_SEQUENCES_TAG,
&(prach_fd_occasion.unused_root_sequences_list[k]),
ppWritePackedMsg,
end,
&pack_uint16_tlv_value);
numTLVs++;
}
}
......@@ -1371,24 +1370,23 @@ uint8_t pack_nr_config_request(void *msg, uint8_t **ppWritePackedMsg, uint8_t *e
&pack_uint8_tlv_value);
numTLVs++;
pNfapiMsg->prach_config.prach_multiple_carriers_in_a_band.tl.tag = NFAPI_NR_CONFIG_PRACH_MULTIPLE_CARRIERS_IN_A_BAND_TAG;
pNfapiMsg->prach_config.prach_multiple_carriers_in_a_band.value = 0;
pack_nr_tlv(NFAPI_NR_CONFIG_PRACH_MULTIPLE_CARRIERS_IN_A_BAND_TAG,
&(pNfapiMsg->prach_config.prach_multiple_carriers_in_a_band),
ppWritePackedMsg,
end,
&pack_uint8_tlv_value);
retval &= pack_nr_tlv(NFAPI_NR_CONFIG_PRACH_MULTIPLE_CARRIERS_IN_A_BAND_TAG,
&(pNfapiMsg->prach_config.prach_multiple_carriers_in_a_band),
ppWritePackedMsg,
end,
&pack_uint8_tlv_value);
numTLVs++;
// END PRACH Configuration
// START SSB Table
if (NFAPI_MODE != NFAPI_MODE_AERIAL) {
// TLV not supported by Aerial L1
retval &= pack_nr_tlv(NFAPI_NR_CONFIG_SSB_OFFSET_POINT_A_TAG,
&(pNfapiMsg->ssb_table.ssb_offset_point_a),
ppWritePackedMsg,
end,
&pack_uint16_tlv_value);
numTLVs++;
}
#ifndef ENABLE_AERIAL
// TLV not supported by Aerial L1
retval &= pack_nr_tlv(NFAPI_NR_CONFIG_SSB_OFFSET_POINT_A_TAG,
&(pNfapiMsg->ssb_table.ssb_offset_point_a),
ppWritePackedMsg,
end,
&pack_uint16_tlv_value);
numTLVs++;
#endif
retval &=
pack_nr_tlv(NFAPI_NR_CONFIG_SSB_PERIOD_TAG, &(pNfapiMsg->ssb_table.ssb_period), ppWritePackedMsg, end, &pack_uint8_tlv_value);
numTLVs++;
......@@ -1401,7 +1399,7 @@ uint8_t pack_nr_config_request(void *msg, uint8_t **ppWritePackedMsg, uint8_t *e
numTLVs++;
/* was unused */
pNfapiMsg->ssb_table.MIB.tl.tag = NFAPI_NR_CONFIG_MIB_TAG;
pack_nr_tlv(NFAPI_NR_CONFIG_MIB_TAG, &(pNfapiMsg->ssb_table.MIB), ppWritePackedMsg, end, &pack_uint32_tlv_value);
retval &= pack_nr_tlv(NFAPI_NR_CONFIG_MIB_TAG, &(pNfapiMsg->ssb_table.MIB), ppWritePackedMsg, end, &pack_uint32_tlv_value);
numTLVs++;
// SCF222.10.02 Table 3-25 : If included there must be two instances of this TLV
retval &= pack_nr_tlv(NFAPI_NR_CONFIG_SSB_MASK_TAG,
......@@ -1417,47 +1415,51 @@ uint8_t pack_nr_config_request(void *msg, uint8_t **ppWritePackedMsg, uint8_t *e
end,
&pack_uint32_tlv_value);
numTLVs++;
if (NFAPI_MODE != NFAPI_MODE_AERIAL) {
// TLV not supported by Aerial L1
for (int i = 0; i < 64; i++) {
// SCF222.10.02 Table 3-25 : If included there must be 64 instances of this TLV
retval &= pack_nr_tlv(NFAPI_NR_CONFIG_BEAM_ID_TAG,
&(pNfapiMsg->ssb_table.ssb_beam_id_list[i].beam_id),
ppWritePackedMsg,
end,
&pack_uint8_tlv_value);
numTLVs++;
}
// END SSB Table
// START TDD Table
retval &= pack_nr_tlv(NFAPI_NR_CONFIG_TDD_PERIOD_TAG,
&(pNfapiMsg->tdd_table.tdd_period),
#ifndef ENABLE_AERIAL
// TLV not supported by Aerial L1
for (int i = 0; i < 64; i++) {
// SCF222.10.02 Table 3-25 : If included there must be 64 instances of this TLV
retval &= pack_nr_tlv(NFAPI_NR_CONFIG_BEAM_ID_TAG,
&(pNfapiMsg->ssb_table.ssb_beam_id_list[i].beam_id),
ppWritePackedMsg,
end,
&pack_uint8_tlv_value);
numTLVs++;
// END TDD Table
for (int i = 0; i < 40; i++) {
for (int k = 0; k < 14; k++) {
pack_nr_tlv(NFAPI_NR_CONFIG_SLOT_CONFIG_TAG,
&(pNfapiMsg->tdd_table.max_tdd_periodicity_list[i].max_num_of_symbol_per_slot_list[k].slot_config),
ppWritePackedMsg,
end,
&pack_uint8_tlv_value);
numTLVs++;
}
}
// END SSB Table
// START TDD Table
retval &=
pack_nr_tlv(NFAPI_NR_CONFIG_TDD_PERIOD_TAG, &(pNfapiMsg->tdd_table.tdd_period), ppWritePackedMsg, end, &pack_uint8_tlv_value);
numTLVs++;
const uint8_t slotsperframe[5] = {10, 20, 40, 80, 160};
// Assuming always CP_Normal, because Cyclic prefix is not included in CONFIG.request 10.02, but is present in 10.04
uint8_t cyclicprefix = 1;
bool normal_CP = cyclicprefix ? false : true;
// 3GPP 38.211 Table 4.3.2.1 & Table 4.3.2.2
uint8_t number_of_symbols_per_slot = normal_CP ? 14 : 12;
for (int i = 0; i < slotsperframe[pNfapiMsg->ssb_config.scs_common.value]; i++) { // TODO check right number of slots
for (int k = 0; k < number_of_symbols_per_slot; k++) { // TODO can change?
retval &= pack_nr_tlv(NFAPI_NR_CONFIG_SLOT_CONFIG_TAG,
&pNfapiMsg->tdd_table.max_tdd_periodicity_list[i].max_num_of_symbol_per_slot_list[k].slot_config,
ppWritePackedMsg,
end,
&pack_uint8_tlv_value);
numTLVs++;
}
}
// END TDD Table
#endif
// START Measurement Config
// SCF222.10.02 Table 3-27 : Contains only one TLV and is currently unused
pNfapiMsg->measurement_config.rssi_measurement.tl.tag = NFAPI_NR_CONFIG_RSSI_MEASUREMENT_TAG;
pNfapiMsg->measurement_config.rssi_measurement.value = 1;
pack_nr_tlv(NFAPI_NR_CONFIG_RSSI_MEASUREMENT_TAG,
&(pNfapiMsg->measurement_config.rssi_measurement),
ppWritePackedMsg,
end,
&pack_uint8_tlv_value);
retval &= pack_nr_tlv(NFAPI_NR_CONFIG_RSSI_MEASUREMENT_TAG,
&(pNfapiMsg->measurement_config.rssi_measurement),
ppWritePackedMsg,
end,
&pack_uint8_tlv_value);
numTLVs++;
// END Measurement Config
......@@ -1468,57 +1470,57 @@ uint8_t pack_nr_config_request(void *msg, uint8_t **ppWritePackedMsg, uint8_t *e
// START Precoding Matrix (PM) PDU
// Struct in nfapi/open-nFAPI/nfapi/public_inc/nfapi_nr_interface_scf.h nfapi_nr_pm_pdu_t, currently unused, tag to use for AERIAL
// is 0xA011 END Precoding Matrix (PM) PDU
if(NFAPI_MODE != NFAPI_MODE_AERIAL){
// START nFAPI TLVs included in CONFIG.request for IDLE and CONFIGURED states
retval &= pack_nr_tlv(NFAPI_NR_NFAPI_P7_VNF_ADDRESS_IPV4_TAG,
&(pNfapiMsg->nfapi_config.p7_vnf_address_ipv4),
ppWritePackedMsg,
end,
&pack_ipv4_address_value);
numTLVs++;
#ifndef ENABLE_AERIAL
// START nFAPI TLVs included in CONFIG.request for IDLE and CONFIGURED states
retval &= pack_nr_tlv(NFAPI_NR_NFAPI_P7_VNF_ADDRESS_IPV4_TAG,
&(pNfapiMsg->nfapi_config.p7_vnf_address_ipv4),
ppWritePackedMsg,
end,
&pack_ipv4_address_value);
numTLVs++;
retval &= pack_nr_tlv(NFAPI_NR_NFAPI_P7_VNF_ADDRESS_IPV6_TAG,
&(pNfapiMsg->nfapi_config.p7_vnf_address_ipv6),
ppWritePackedMsg,
end,
&pack_ipv6_address_value);
numTLVs++;
retval &= pack_nr_tlv(NFAPI_NR_NFAPI_P7_VNF_ADDRESS_IPV6_TAG,
&(pNfapiMsg->nfapi_config.p7_vnf_address_ipv6),
ppWritePackedMsg,
end,
&pack_ipv6_address_value);
numTLVs++;
retval &= pack_nr_tlv(NFAPI_NR_NFAPI_P7_VNF_PORT_TAG,
&(pNfapiMsg->nfapi_config.p7_vnf_port),
ppWritePackedMsg,
end,
&pack_uint16_tlv_value);
numTLVs++;
retval &= pack_nr_tlv(NFAPI_NR_NFAPI_P7_VNF_PORT_TAG,
&(pNfapiMsg->nfapi_config.p7_vnf_port),
ppWritePackedMsg,
end,
&pack_uint16_tlv_value);
numTLVs++;
retval &= pack_nr_tlv(NFAPI_NR_NFAPI_TIMING_WINDOW_TAG,
&(pNfapiMsg->nfapi_config.timing_window),
ppWritePackedMsg,
end,
&pack_uint8_tlv_value);
numTLVs++;
retval &= pack_nr_tlv(NFAPI_NR_NFAPI_TIMING_WINDOW_TAG,
&(pNfapiMsg->nfapi_config.timing_window),
ppWritePackedMsg,
end,
&pack_uint8_tlv_value);
numTLVs++;
retval &= pack_nr_tlv(NFAPI_NR_NFAPI_TIMING_INFO_MODE_TAG,
&(pNfapiMsg->nfapi_config.timing_info_mode),
ppWritePackedMsg,
end,
&pack_uint8_tlv_value);
numTLVs++;
retval &= pack_nr_tlv(NFAPI_NR_NFAPI_TIMING_INFO_MODE_TAG,
&(pNfapiMsg->nfapi_config.timing_info_mode),
ppWritePackedMsg,
end,
&pack_uint8_tlv_value);
numTLVs++;
retval &= pack_nr_tlv(NFAPI_NR_NFAPI_TIMING_INFO_PERIOD_TAG,
&(pNfapiMsg->nfapi_config.timing_info_period),
ppWritePackedMsg,
end,
&pack_uint8_tlv_value);
numTLVs++;
// END nFAPI TLVs included in CONFIG.request for IDLE and CONFIGURED states
retval &= pack_nr_tlv(NFAPI_NR_NFAPI_TIMING_INFO_PERIOD_TAG,
&(pNfapiMsg->nfapi_config.timing_info_period),
ppWritePackedMsg,
end,
&pack_uint8_tlv_value);
numTLVs++;
// END nFAPI TLVs included in CONFIG.request for IDLE and CONFIGURED states
if (pNfapiMsg->vendor_extension != 0 && config != 0) {
retval &= pack_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config);
NFAPI_TRACE(NFAPI_TRACE_DEBUG, "Packing CONFIG.request vendor_extension_tlv %d\n", pNfapiMsg->vendor_extension->tag);
numTLVs++;
}
if (pNfapiMsg->vendor_extension != 0 && config != 0) {
retval &= pack_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config);
NFAPI_TRACE(NFAPI_TRACE_DEBUG, "Packing CONFIG.request vendor_extension_tlv %d\n", pNfapiMsg->vendor_extension->tag);
numTLVs++;
}
#endif
pNfapiMsg->num_tlv = numTLVs;
retval &= push8(pNfapiMsg->num_tlv, &pNumTLVFields, end);
return retval;
......@@ -2495,16 +2497,6 @@ uint8_t unpack_nr_config_request(uint8_t **ppReadPackedMsg, uint8_t *end, void *
int tdd_periodicity_idx = 0;
int symbol_per_slot_idx = 0;
nfapi_nr_config_request_scf_t *pNfapiMsg = (nfapi_nr_config_request_scf_t *)msg;
// Memory allocations
pNfapiMsg->tdd_table.max_tdd_periodicity_list =
(nfapi_nr_max_tdd_periodicity_t *)malloc(40 * sizeof(nfapi_nr_max_tdd_periodicity_t));
for (int i = 0; i < 40; i++) {
pNfapiMsg->tdd_table.max_tdd_periodicity_list[i].max_num_of_symbol_per_slot_list =
(nfapi_nr_max_num_of_symbol_per_slot_t *)malloc(14 * sizeof(nfapi_nr_max_num_of_symbol_per_slot_t));
}
pNfapiMsg->prach_config.num_prach_fd_occasions_list =
(nfapi_nr_num_prach_fd_occasions_t *)malloc(sizeof(nfapi_nr_num_prach_fd_occasions_t));
// unpack TLVs
unpack_tlv_t unpack_fns[] = {
......@@ -2530,20 +2522,20 @@ uint8_t unpack_nr_config_request(uint8_t **ppReadPackedMsg, uint8_t *end, void *
{NFAPI_NR_CONFIG_NUM_PRACH_FD_OCCASIONS_TAG, &(pNfapiMsg->prach_config.num_prach_fd_occasions), &unpack_uint8_tlv_value},
{NFAPI_NR_CONFIG_PRACH_CONFIG_INDEX_TAG, &(pNfapiMsg->prach_config.prach_ConfigurationIndex), &unpack_uint8_tlv_value},
{NFAPI_NR_CONFIG_PRACH_ROOT_SEQUENCE_INDEX_TAG,
&(pNfapiMsg->prach_config.num_prach_fd_occasions_list[0].prach_root_sequence_index),
NULL,
&unpack_uint16_tlv_value},
{NFAPI_NR_CONFIG_NUM_ROOT_SEQUENCES_TAG,
&(pNfapiMsg->prach_config.num_prach_fd_occasions_list[0].num_root_sequences),
NULL,
&unpack_uint8_tlv_value},
{NFAPI_NR_CONFIG_K1_TAG, &(pNfapiMsg->prach_config.num_prach_fd_occasions_list[0].k1), &unpack_uint16_tlv_value},
{NFAPI_NR_CONFIG_K1_TAG, NULL, &unpack_uint16_tlv_value},
{NFAPI_NR_CONFIG_PRACH_ZERO_CORR_CONF_TAG,
&(pNfapiMsg->prach_config.num_prach_fd_occasions_list[0].prach_zero_corr_conf),
NULL,
&unpack_uint8_tlv_value},
{NFAPI_NR_CONFIG_NUM_UNUSED_ROOT_SEQUENCES_TAG,
&(pNfapiMsg->prach_config.num_prach_fd_occasions_list[0].num_unused_root_sequences),
NULL,
&unpack_uint16_tlv_value},
{NFAPI_NR_CONFIG_UNUSED_ROOT_SEQUENCES_TAG,
&(pNfapiMsg->prach_config.num_prach_fd_occasions_list[0].unused_root_sequences_list[0]),
NULL,
&unpack_uint16_tlv_value},
{NFAPI_NR_CONFIG_SSB_PER_RACH_TAG, &(pNfapiMsg->prach_config.ssb_per_rach), &unpack_uint8_tlv_value},
{NFAPI_NR_CONFIG_PRACH_MULTIPLE_CARRIERS_IN_A_BAND_TAG,
......@@ -2564,7 +2556,7 @@ uint8_t unpack_nr_config_request(uint8_t **ppReadPackedMsg, uint8_t *end, void *
&unpack_uint8_tlv_value},
{NFAPI_NR_CONFIG_TDD_PERIOD_TAG, &(pNfapiMsg->tdd_table.tdd_period), &unpack_uint8_tlv_value},
{NFAPI_NR_CONFIG_SLOT_CONFIG_TAG,
&(pNfapiMsg->tdd_table.max_tdd_periodicity_list[0].max_num_of_symbol_per_slot_list[0].slot_config),
NULL,
&unpack_uint8_tlv_value},
{NFAPI_NR_CONFIG_RSSI_MEASUREMENT_TAG, &(pNfapiMsg->measurement_config.rssi_measurement), &unpack_uint8_tlv_value},
{NFAPI_NR_NFAPI_P7_VNF_ADDRESS_IPV4_TAG, &(pNfapiMsg->nfapi_config.p7_vnf_address_ipv4), &unpack_ipv4_address_value},
......@@ -2593,11 +2585,47 @@ uint8_t unpack_nr_config_request(uint8_t **ppReadPackedMsg, uint8_t *end, void *
pStartOfValue = *ppReadPackedMsg;
tagMatch = 1;
nfapi_tl_t *tl = (nfapi_tl_t *)(unpack_fns[idx].tlv);
tl->tag = generic_tl.tag;
tl->length = generic_tl.length;
if(tl){
tl->tag = generic_tl.tag;
tl->length = generic_tl.length;
}
int result = 0;
switch (generic_tl.tag) {
case NFAPI_NR_CONFIG_NUM_PRACH_FD_OCCASIONS_TAG:
pNfapiMsg->prach_config.num_prach_fd_occasions.tl.tag = generic_tl.tag;
pNfapiMsg->prach_config.num_prach_fd_occasions.tl.length = generic_tl.length;
result = (*unpack_fns[idx].unpack_func)(
&pNfapiMsg->prach_config.num_prach_fd_occasions,
ppReadPackedMsg,
end);
pNfapiMsg->prach_config.num_prach_fd_occasions_list = (nfapi_nr_num_prach_fd_occasions_t *)malloc(
pNfapiMsg->prach_config.num_prach_fd_occasions.value * sizeof(nfapi_nr_num_prach_fd_occasions_t));
prach_root_seq_idx = 0;
break;
case NFAPI_NR_CONFIG_SCS_COMMON_TAG:
pNfapiMsg->ssb_config.scs_common.tl.tag = generic_tl.tag;
pNfapiMsg->ssb_config.scs_common.tl.length = generic_tl.length;
result = (*unpack_fns[idx].unpack_func)(
&pNfapiMsg->ssb_config.scs_common,
ppReadPackedMsg,
end);
const uint8_t slotsperframe[5] = {10, 20, 40, 80, 160};
// Assuming always CP_Normal, because Cyclic prefix is not included in CONFIG.request 10.02, but is present in 10.04
uint8_t cyclicprefix = 1;
bool normal_CP = cyclicprefix ? false : true;
// 3GPP 38.211 Table 4.3.2.1 & Table 4.3.2.2
uint8_t number_of_symbols_per_slot = normal_CP ? 14 : 12 ;
pNfapiMsg->tdd_table.max_tdd_periodicity_list =
(nfapi_nr_max_tdd_periodicity_t *)malloc(slotsperframe[pNfapiMsg->ssb_config.scs_common.value] * sizeof(nfapi_nr_max_tdd_periodicity_t));
for (int i = 0; i < slotsperframe[pNfapiMsg->ssb_config.scs_common.value]; i++) {
pNfapiMsg->tdd_table.max_tdd_periodicity_list[i].max_num_of_symbol_per_slot_list =
(nfapi_nr_max_num_of_symbol_per_slot_t *)malloc(number_of_symbols_per_slot * sizeof(nfapi_nr_max_num_of_symbol_per_slot_t));
}
break;
case NFAPI_NR_CONFIG_PRACH_ROOT_SEQUENCE_INDEX_TAG:
unpack_fns[idx].tlv = &(pNfapiMsg->prach_config.num_prach_fd_occasions_list[prach_root_seq_idx].prach_root_sequence_index);
pNfapiMsg->prach_config.num_prach_fd_occasions_list[prach_root_seq_idx].prach_root_sequence_index.tl.tag =
generic_tl.tag;
pNfapiMsg->prach_config.num_prach_fd_occasions_list[prach_root_seq_idx].prach_root_sequence_index.tl.length =
......@@ -2606,9 +2634,9 @@ uint8_t unpack_nr_config_request(uint8_t **ppReadPackedMsg, uint8_t *end, void *
&pNfapiMsg->prach_config.num_prach_fd_occasions_list[prach_root_seq_idx].prach_root_sequence_index,
ppReadPackedMsg,
end);
prach_root_seq_idx++;
break;
case NFAPI_NR_CONFIG_K1_TAG:
unpack_fns[idx].tlv = &(pNfapiMsg->prach_config.num_prach_fd_occasions_list[prach_root_seq_idx].k1);
pNfapiMsg->prach_config.num_prach_fd_occasions_list[prach_root_seq_idx].k1.tl.tag = generic_tl.tag;
pNfapiMsg->prach_config.num_prach_fd_occasions_list[prach_root_seq_idx].k1.tl.length = generic_tl.length;
result = (*unpack_fns[idx].unpack_func)(&pNfapiMsg->prach_config.num_prach_fd_occasions_list[prach_root_seq_idx].k1,
......@@ -2616,6 +2644,7 @@ uint8_t unpack_nr_config_request(uint8_t **ppReadPackedMsg, uint8_t *end, void *
end);
break;
case NFAPI_NR_CONFIG_PRACH_ZERO_CORR_CONF_TAG:
unpack_fns[idx].tlv = &(pNfapiMsg->prach_config.num_prach_fd_occasions_list[prach_root_seq_idx].prach_zero_corr_conf);
pNfapiMsg->prach_config.num_prach_fd_occasions_list[prach_root_seq_idx].prach_zero_corr_conf.tl.tag = generic_tl.tag;
pNfapiMsg->prach_config.num_prach_fd_occasions_list[prach_root_seq_idx].prach_zero_corr_conf.tl.length =
generic_tl.length;
......@@ -2625,6 +2654,7 @@ uint8_t unpack_nr_config_request(uint8_t **ppReadPackedMsg, uint8_t *end, void *
end);
break;
case NFAPI_NR_CONFIG_NUM_ROOT_SEQUENCES_TAG:
unpack_fns[idx].tlv = &(pNfapiMsg->prach_config.num_prach_fd_occasions_list[prach_root_seq_idx].num_root_sequences);
pNfapiMsg->prach_config.num_prach_fd_occasions_list[prach_root_seq_idx].num_root_sequences.tl.tag = generic_tl.tag;
pNfapiMsg->prach_config.num_prach_fd_occasions_list[prach_root_seq_idx].num_root_sequences.tl.length =
generic_tl.length;
......@@ -2634,6 +2664,7 @@ uint8_t unpack_nr_config_request(uint8_t **ppReadPackedMsg, uint8_t *end, void *
end);
break;
case NFAPI_NR_CONFIG_NUM_UNUSED_ROOT_SEQUENCES_TAG:
unpack_fns[idx].tlv = &(pNfapiMsg->prach_config.num_prach_fd_occasions_list[prach_root_seq_idx].num_unused_root_sequences);
pNfapiMsg->prach_config.num_prach_fd_occasions_list[prach_root_seq_idx].num_unused_root_sequences.tl.tag =
generic_tl.tag;
pNfapiMsg->prach_config.num_prach_fd_occasions_list[prach_root_seq_idx].num_unused_root_sequences.tl.length =
......@@ -2642,8 +2673,13 @@ uint8_t unpack_nr_config_request(uint8_t **ppReadPackedMsg, uint8_t *end, void *
&pNfapiMsg->prach_config.num_prach_fd_occasions_list[prach_root_seq_idx].num_unused_root_sequences,
ppReadPackedMsg,
end);
pNfapiMsg->prach_config.num_prach_fd_occasions_list[prach_root_seq_idx].unused_root_sequences_list =
(nfapi_uint8_tlv_t *)malloc(pNfapiMsg->prach_config.num_prach_fd_occasions_list[prach_root_seq_idx].num_unused_root_sequences.value * sizeof(nfapi_uint8_tlv_t));
unused_root_seq_idx = 0;
break;
case NFAPI_NR_CONFIG_UNUSED_ROOT_SEQUENCES_TAG:
unpack_fns[idx].tlv = &(pNfapiMsg->prach_config.num_prach_fd_occasions_list[prach_root_seq_idx]
.unused_root_sequences_list[unused_root_seq_idx]);
pNfapiMsg->prach_config.num_prach_fd_occasions_list[prach_root_seq_idx]
.unused_root_sequences_list[unused_root_seq_idx]
.tl.tag = generic_tl.tag;
......@@ -2655,6 +2691,11 @@ uint8_t unpack_nr_config_request(uint8_t **ppReadPackedMsg, uint8_t *end, void *
ppReadPackedMsg,
end);
unused_root_seq_idx++;
//last tlv of the list
if( unused_root_seq_idx >= pNfapiMsg->prach_config.num_prach_fd_occasions_list[prach_root_seq_idx].num_unused_root_sequences.value){
prach_root_seq_idx++;
unused_root_seq_idx= 0;
}
break;
case NFAPI_NR_CONFIG_SSB_MASK_TAG:
pNfapiMsg->ssb_table.ssb_mask_list[ssb_mask_idx].ssb_mask.tl.tag = generic_tl.tag;
......@@ -2664,21 +2705,25 @@ uint8_t unpack_nr_config_request(uint8_t **ppReadPackedMsg, uint8_t *end, void *
break;
case NFAPI_NR_CONFIG_DL_GRID_SIZE_TAG:
for (int i = 0; i < 5; i++) {
pNfapiMsg->carrier_config.dl_grid_size[i].tl.tag = generic_tl.tag;
result = unpack_uint16_tlv_value(&pNfapiMsg->carrier_config.dl_grid_size[i], ppReadPackedMsg, end);
}
break;
case NFAPI_NR_CONFIG_DL_K0_TAG:
for (int i = 0; i < 5; i++) {
pNfapiMsg->carrier_config.dl_k0[i].tl.tag = generic_tl.tag;
result = unpack_uint16_tlv_value(&pNfapiMsg->carrier_config.dl_k0[i], ppReadPackedMsg, end);
}
break;
case NFAPI_NR_CONFIG_UL_GRID_SIZE_TAG:
for (int i = 0; i < 5; i++) {
pNfapiMsg->carrier_config.ul_grid_size[i].tl.tag = generic_tl.tag;
result = unpack_uint16_tlv_value(&pNfapiMsg->carrier_config.ul_grid_size[i], ppReadPackedMsg, end);
}
break;
case NFAPI_NR_CONFIG_UL_K0_TAG:
for (int i = 0; i < 5; i++) {
pNfapiMsg->carrier_config.ul_k0[i].tl.tag = generic_tl.tag;
result = unpack_uint16_tlv_value(&pNfapiMsg->carrier_config.ul_k0[i], ppReadPackedMsg, end);
}
break;
......@@ -2691,6 +2736,9 @@ uint8_t unpack_nr_config_request(uint8_t **ppReadPackedMsg, uint8_t *end, void *
config_beam_idx++;
break;
case NFAPI_NR_CONFIG_SLOT_CONFIG_TAG:
unpack_fns[idx].tlv = &(pNfapiMsg->tdd_table.max_tdd_periodicity_list[tdd_periodicity_idx]
.max_num_of_symbol_per_slot_list[symbol_per_slot_idx]
.slot_config);
pNfapiMsg->tdd_table.max_tdd_periodicity_list[tdd_periodicity_idx]
.max_num_of_symbol_per_slot_list[symbol_per_slot_idx]
.slot_config.tl.tag = generic_tl.tag;
......@@ -2702,7 +2750,7 @@ uint8_t unpack_nr_config_request(uint8_t **ppReadPackedMsg, uint8_t *end, void *
.slot_config,
ppReadPackedMsg,
end);
symbol_per_slot_idx = (symbol_per_slot_idx + 1) % 14;
symbol_per_slot_idx = (symbol_per_slot_idx + 1) % number_of_symbols_per_slot;
if (symbol_per_slot_idx == 0) {
tdd_periodicity_idx++;
}
......@@ -2711,7 +2759,12 @@ uint8_t unpack_nr_config_request(uint8_t **ppReadPackedMsg, uint8_t *end, void *
result = (*unpack_fns[idx].unpack_func)(tl, ppReadPackedMsg, end);
break;
}
//update tl pointer with updated value, if it was set in the switch (it was inside lists)
if(!tl){
tl = (nfapi_tl_t *)(unpack_fns[idx].tlv);
tl->tag = generic_tl.tag;
tl->length = generic_tl.length;
}
if (result == 0)
return 0;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment