Add TRP Information Response NRPPA message encoding procedures

Supported TRP Information Response Types:
 - PCI NR
 - NG RAN CGI
 - NR ARFCN
 - GEOGRAPHICAL COORDINATES
This commit is contained in:
Rakesh Mundlamuri
2026-01-22 18:51:27 +05:30
parent 446a905013
commit 0282e64a3b
12 changed files with 801 additions and 0 deletions

View File

@@ -64,6 +64,111 @@ ngran_node_t get_node_type()
configmodule_interface_t *uniqCfg = NULL;
static nrppa_trp_information_resp_t fill_trp_resp(uint8_t transaction_id)
{
positioning_config_t positioning_config = RCconfig_nr_positioning();
dump_positioning_config(&positioning_config);
nrppa_trp_information_resp_t resp = {0};
resp.transaction_id = transaction_id;
nrppa_trp_information_list_t *list = &resp.trp_information_list;
uint32_t trp_info_item_len = positioning_config.num_trp;
list->trp_information_item_length = trp_info_item_len;
list->trp_information_item = calloc_or_fail(trp_info_item_len, sizeof(*list->trp_information_item));
uint8_t resp_item_len = 3;
for (int i = 0; i < trp_info_item_len; i++) {
nrppa_trp_information_t *tRPInformation = &list->trp_information_item[i];
tRPInformation->trp_id = positioning_config.trps[i].id;
nrppa_trp_information_type_response_list_t *resp_list = &tRPInformation->trp_information_type_response_list;
resp_list->trp_information_type_response_item_length = resp_item_len;
nrppa_trp_information_type_response_item_t *resp_item = calloc_or_fail(resp_item_len, sizeof(*resp_item));
resp_list->trp_information_type_response_item = resp_item;
// nrPCI
resp_item[0].present = NRPPA_TRP_INFORMATION_TYPE_RESPONSE_ITEM_PR_PCI_NR;
resp_item[0].choice.pci_nr = 123 + i;
// nG_RAN_CGI
resp_item[1].present = NRPPA_TRP_INFORMATION_TYPE_RESPONSE_ITEM_PR_NG_RAN_CGI;
resp_item[1].choice.ng_ran_cgi.plmn.mcc = 001;
resp_item[1].choice.ng_ran_cgi.plmn.mnc = 01;
resp_item[1].choice.ng_ran_cgi.plmn.mnc_digit_length = 2;
resp_item[1].choice.ng_ran_cgi.nr_cellid = gnb_id << 8; // HACK: Made to work with lmf
// geographicalCoordinates
resp_item[2].present = NRPPA_TRP_INFORMATION_TYPE_RESPONSE_ITEM_PR_GEOGRAPHICALCOORDINATES;
nrppa_geographical_coordinates_t *geographicalCoordinates = &resp_item[2].choice.geographical_coordinates;
nrppa_trp_position_definition_type_t *tRPPositionDefinitionType = &geographicalCoordinates->trp_position_definition_type;
// referenced
tRPPositionDefinitionType->present = NRPPA_TRP_POSITION_DEFINITION_TYPE_PR_REFERENCED;
nrppa_trp_position_referenced_t *referenced = &tRPPositionDefinitionType->choice.referenced;
// coordinate ID
referenced->reference_point.present = NRPPA_REFERENCE_POINT_PR_COORDINATEID;
referenced->reference_point.choice.coordinate_id = 2;
nrppa_trp_reference_point_type_t *referencePointType = &referenced->reference_point_type;
// relative cartesian
referencePointType->present = NRPPA_TRP_REFERENCE_POINT_TYPE_PR_TRPPOSITION_RELATIVE_CARTESIAN;
nrppa_relative_cartesian_location_t *trp_pos_cart = &referencePointType->choice.trp_position_relative_cartesian;
// 0 = millimeter
trp_pos_cart->xyz_unit = positioning_config.trps[i].unit;
// random reference cartesian coordinates in millimeter
trp_pos_cart->xvalue = positioning_config.trps[i].x_axis;
trp_pos_cart->yvalue = positioning_config.trps[i].y_axis;
trp_pos_cart->zvalue = positioning_config.trps[i].z_axis;
// testing random values for uncertainity and confidence
trp_pos_cart->location_uncertainty.horizontal_uncertainty = i + 1;
trp_pos_cart->location_uncertainty.horizontal_confidence = i + 2;
trp_pos_cart->location_uncertainty.vertical_uncertainty = i + 3;
trp_pos_cart->location_uncertainty.vertical_confidence = i + 4;
}
return resp;
}
void *rrc_gnb_task(void *args_p)
{
MessageDef *msg_p;
MessageDef *msg_p_resp;
instance_t instance;
int result;
itti_mark_task_ready(TASK_RRC_GNB);
LOG_I(NR_RRC, "Entering main loop of NR_RRC message task\n");
while (1) {
// Wait for a message
itti_receive_msg(TASK_RRC_GNB, &msg_p);
const char *msg_name_p = ITTI_MSG_NAME(msg_p);
instance = ITTI_MSG_DESTINATION_INSTANCE(msg_p);
LOG_D(NR_RRC,
"RRC GNB Task Received %s for instance %ld from task %s\n",
ITTI_MSG_NAME(msg_p),
ITTI_MSG_DESTINATION_INSTANCE(msg_p),
ITTI_MSG_ORIGIN_NAME(msg_p));
switch (ITTI_MSG_ID(msg_p)) {
case TERMINATE_MESSAGE:
LOG_W(NR_RRC, " *** Exiting NR_RRC thread\n");
itti_exit_task();
break;
case NRPPA_TRP_INFORMATION_REQ:
nrppa_trp_information_req_t *trp_req = &NRPPA_TRP_INFORMATION_REQ(msg_p);
LOG_I(NR_RRC, "Received NRPPA_TRP_INFORMATION_REQ transaction_id %d\n", trp_req->transaction_id);
msg_p_resp = itti_alloc_new_message(TASK_RRC_GNB, 0, NRPPA_TRP_INFORMATION_RESP);
NRPPA_TRP_INFORMATION_RESP(msg_p_resp) = fill_trp_resp(trp_req->transaction_id);
LOG_I(NR_RRC, "Sending NRPPA_TRP_INFORMATION_RESP to TASK_NRPPA\n");
itti_send_msg_to_task(TASK_NRPPA, 0, msg_p_resp);
break;
default:
LOG_E(NR_RRC, "[gNB %ld] Received unexpected message %s\n", instance, msg_name_p);
break;
}
result = itti_free(ITTI_MSG_ORIGIN_ID(msg_p), msg_p);
AssertFatal(result == EXIT_SUCCESS, "Failed to free memory (%d)!\n", result);
msg_p = NULL;
}
}
int main(int argc, char **argv)
{
// load the config file
@@ -87,6 +192,9 @@ int main(int argc, char **argv)
rc = itti_create_task(TASK_NRPPA, nrppa_gNB_task, NULL);
AssertFatal(rc >= 0, "Create task for NRPPA failed\n");
rc = itti_create_task(TASK_RRC_GNB, rrc_gnb_task, NULL);
AssertFatal(rc >= 0, "Create task for RRC failed\n");
MessageDef *msg_p;
msg_p = itti_alloc_new_message(TASK_GNB_APP, 0, NGAP_REGISTER_GNB_REQ);
RCconfig_NR_NG(msg_p, 0);