Add Positioning Measurement Exchange RRC + MAC procedures: F1AP

Signed-off-by: Rakesh Mundlamuri <rakesh.mundlamuri@openairinterface.org>
This commit is contained in:
Rakesh Mundlamuri
2026-02-23 12:57:21 +05:30
parent ad13e518c2
commit c608ad5142
10 changed files with 100 additions and 2 deletions

View File

@@ -121,3 +121,41 @@ int CU_handle_POSITIONING_ACTIVATION_RESPONSE(instance_t instance, sctp_assoc_t
itti_send_msg_to_task(TASK_RRC_GNB, instance, msg_p);
return 0;
}
int CU_send_POSITIONING_MEASUREMENT_REQUEST(sctp_assoc_t assoc_id, f1ap_positioning_measurement_req_t *req)
{
F1AP_F1AP_PDU_t *pdu = encode_positioning_measurement_req(req);
if (pdu == NULL) {
LOG_E(F1AP, "Failed to encode F1 Positioning Measurement Request\n");
return -1;
}
byte_array_t ba = {0};
uint32_t encoded_len = 0;
/* encode */
if (f1ap_encode_pdu(pdu, &ba.buf, &encoded_len) < 0) {
LOG_E(F1AP, "Failed to encode F1 Positioning Measurement Request PDU\n");
ASN_STRUCT_FREE(asn_DEF_F1AP_F1AP_PDU, pdu);
return -1;
}
ASN_STRUCT_FREE(asn_DEF_F1AP_F1AP_PDU, pdu);
/* Ownership of ba.buf is transferred to SCTP task; do not free here. */
f1ap_itti_send_sctp_data_req(assoc_id, ba.buf, encoded_len);
return 0;
}
int CU_handle_POSITIONING_MEASUREMENT_RESPONSE(instance_t instance, sctp_assoc_t assoc_id, uint32_t stream, F1AP_F1AP_PDU_t *pdu)
{
f1ap_positioning_measurement_resp_t resp = {0};
if (!decode_positioning_measurement_resp(pdu, &resp)) {
LOG_E(F1AP, "cannot decode F1 Positioning Measurement Response\n");
free_positioning_measurement_resp(&resp);
return -1;
}
MessageDef *msg_p = itti_alloc_new_message(TASK_DU_F1, 0, F1AP_POSITIONING_MEASUREMENT_RESP);
msg_p->ittiMsgHeader.originInstance = assoc_id;
F1AP_POSITIONING_MEASUREMENT_RESP(msg_p) = resp;
itti_send_msg_to_task(TASK_RRC_GNB, instance, msg_p);
return 0;
}

View File

@@ -10,5 +10,7 @@ int CU_send_POSITIONING_INFORMATION_REQUEST(sctp_assoc_t assoc_id, f1ap_position
int CU_handle_POSITIONING_INFORMATION_RESPONSE(instance_t instance, sctp_assoc_t assoc_id, uint32_t stream, F1AP_F1AP_PDU_t *pdu);
int CU_send_POSITIONING_ACTIVATION_REQUEST(sctp_assoc_t assoc_id, f1ap_positioning_activation_req_t *req);
int CU_handle_POSITIONING_ACTIVATION_RESPONSE(instance_t instance, sctp_assoc_t assoc_id, uint32_t stream, F1AP_F1AP_PDU_t *pdu);
int CU_send_POSITIONING_MEASUREMENT_REQUEST(sctp_assoc_t assoc_id, f1ap_positioning_measurement_req_t *req);
int CU_handle_POSITIONING_MEASUREMENT_RESPONSE(instance_t instance, sctp_assoc_t assoc_id, uint32_t stream, F1AP_F1AP_PDU_t *pdu);
#endif /* F1AP_CU_POSITIONING_H_ */

View File

@@ -196,6 +196,10 @@ void *F1AP_CU_task(void *arg)
CU_send_POSITIONING_ACTIVATION_REQUEST(assoc_id, &F1AP_POSITIONING_ACTIVATION_REQ(received_msg));
break;
case F1AP_POSITIONING_MEASUREMENT_REQ:
CU_send_POSITIONING_MEASUREMENT_REQUEST(assoc_id, &F1AP_POSITIONING_MEASUREMENT_REQ(received_msg));
break;
case TERMINATE_MESSAGE:
LOG_W(F1AP, " *** Exiting F1AP thread\n");
itti_exit_task();

View File

@@ -100,3 +100,34 @@ int DU_send_POSITIONING_ACTIVATION_RESPONSE(sctp_assoc_t assoc_id, f1ap_position
ASN_STRUCT_FREE(asn_DEF_F1AP_F1AP_PDU, pdu);
return 0;
}
int DU_handle_POSITIONING_MEASUREMENT_REQUEST(instance_t instance, sctp_assoc_t assoc_id, uint32_t stream, F1AP_F1AP_PDU_t *pdu)
{
f1ap_positioning_measurement_req_t req = {0};
if (!decode_positioning_measurement_req(pdu, &req)) {
LOG_E(F1AP, "cannot decode F1 Positioning Measurement Request\n");
free_positioning_measurement_req(&req);
return -1;
}
positioning_measurement_request(&req);
free_positioning_measurement_req(&req);
return 0;
}
int DU_send_POSITIONING_MEASUREMENT_RESPONSE(sctp_assoc_t assoc_id, f1ap_positioning_measurement_resp_t *resp)
{
F1AP_F1AP_PDU_t *pdu = encode_positioning_measurement_resp(resp);
uint8_t *buffer = NULL;
uint32_t len = 0;
if (f1ap_encode_pdu(pdu, &buffer, &len) < 0) {
LOG_E(F1AP, "Failed to encode F1 Positioning Measurement Response\n");
return -1;
}
f1ap_itti_send_sctp_data_req(assoc_id, buffer, len);
ASN_STRUCT_FREE(asn_DEF_F1AP_F1AP_PDU, pdu);
return 0;
}

View File

@@ -10,5 +10,7 @@ int DU_handle_POSITIONING_INFORMATION_REQUEST(instance_t instance, sctp_assoc_t
int DU_send_POSITIONING_INFORMATION_RESPONSE(sctp_assoc_t assoc_id, f1ap_positioning_information_resp_t *resp);
int DU_handle_POSITIONING_ACTIVATION_REQUEST(instance_t instance, sctp_assoc_t assoc_id, uint32_t stream, F1AP_F1AP_PDU_t *pdu);
int DU_send_POSITIONING_ACTIVATION_RESPONSE(sctp_assoc_t assoc_id, f1ap_positioning_activation_resp_t *resp);
int DU_handle_POSITIONING_MEASUREMENT_REQUEST(instance_t instance, sctp_assoc_t assoc_id, uint32_t stream, F1AP_F1AP_PDU_t *pdu);
int DU_send_POSITIONING_MEASUREMENT_RESPONSE(sctp_assoc_t assoc_id, f1ap_positioning_measurement_resp_t *resp);
#endif /* F1AP_DU_POSITIONING_H_ */

View File

@@ -197,6 +197,10 @@ void *F1AP_DU_task(void *arg)
DU_send_POSITIONING_ACTIVATION_RESPONSE(assoc_id, &F1AP_POSITIONING_ACTIVATION_RESP(msg));
break;
case F1AP_POSITIONING_MEASUREMENT_RESP:
DU_send_POSITIONING_MEASUREMENT_RESPONSE(assoc_id, &F1AP_POSITIONING_MEASUREMENT_RESP(msg));
break;
case TERMINATE_MESSAGE:
LOG_W(F1AP, " *** Exiting F1AP thread\n");
itti_exit_task();

View File

@@ -65,7 +65,7 @@ static const f1ap_message_processing_t f1ap_messages_processing[][3] = {
{0, 0, 0}, /* accessAndMobilityIndication */
{0, 0, 0}, /* accessSuccess */
{0, 0, 0}, /* cellTrafficTrace */
{0, 0, 0}, /* PositioningMeasurementExchange */
{DU_handle_POSITIONING_MEASUREMENT_REQUEST, CU_handle_POSITIONING_MEASUREMENT_RESPONSE, 0}, /* PositioningMeasurementExchange */
{0, 0, 0}, /* PositioningAssistanceInformationControl */
{0, 0, 0}, /* PositioningAssistanceInformationFeedback */
{0, 0, 0}, /* PositioningMeasurementReport */

View File

@@ -1198,7 +1198,7 @@ void positioning_measurement_request(const f1ap_positioning_measurement_req_t *r
gNB_MAC_INST *mac = RC.nrmac[0];
NR_SCHED_LOCK(&mac->sched_lock);
positioning_measurement_info_t *pos_meas_info = &mac->pos_meas_info;
pos_meas_info->meas_req = *req;
pos_meas_info->meas_req = cp_positioning_measurement_req(req);
pos_meas_info->active = true;
NR_SCHED_UNLOCK(&mac->sched_lock);
}

View File

@@ -154,6 +154,13 @@ static void positioning_activation_response_f1ap(const f1ap_positioning_activati
itti_send_msg_to_task(TASK_DU_F1, 0, msg);
}
static void positioning_measurement_response_f1ap(const f1ap_positioning_measurement_resp_t *resp)
{
MessageDef *msg = itti_alloc_new_message(TASK_MAC_GNB, 0, F1AP_POSITIONING_MEASUREMENT_RESP);
F1AP_POSITIONING_MEASUREMENT_RESP(msg) = cp_positioning_measurement_resp(resp);
itti_send_msg_to_task(TASK_DU_F1, 0, msg);
}
void mac_rrc_ul_f1ap_init(struct nr_mac_rrc_ul_if_s *mac_rrc)
{
mac_rrc->f1_reset = f1_reset_du_initiated_f1ap;
@@ -169,5 +176,6 @@ void mac_rrc_ul_f1ap_init(struct nr_mac_rrc_ul_if_s *mac_rrc)
mac_rrc->trp_information_response = trp_information_response_f1ap;
mac_rrc->positioning_information_response = positioning_information_response_f1ap;
mac_rrc->positioning_activation_response = positioning_activation_response_f1ap;
mac_rrc->positioning_measurement_response = positioning_measurement_response_f1ap;
}

View File

@@ -157,6 +157,14 @@ static void positioning_activation_request_f1ap(sctp_assoc_t assoc_id, const f1a
itti_send_msg_to_task(TASK_CU_F1, 0, message_p);
}
static void positioning_measurement_request_f1ap(sctp_assoc_t assoc_id, const f1ap_positioning_measurement_req_t *req)
{
MessageDef *message_p = itti_alloc_new_message(TASK_RRC_GNB, 0, F1AP_POSITIONING_MEASUREMENT_REQ);
message_p->ittiMsgHeader.originInstance = assoc_id;
F1AP_POSITIONING_MEASUREMENT_REQ(message_p) = cp_positioning_measurement_req(req);
itti_send_msg_to_task(TASK_CU_F1, 0, message_p);
}
void mac_rrc_dl_f1ap_init(nr_mac_rrc_dl_if_t *mac_rrc)
{
mac_rrc->f1_reset = f1_reset_cu_initiated_f1ap;
@@ -174,4 +182,5 @@ void mac_rrc_dl_f1ap_init(nr_mac_rrc_dl_if_t *mac_rrc)
mac_rrc->trp_information_request = trp_information_request_f1ap;
mac_rrc->positioning_information_request = positioning_information_request_f1ap;
mac_rrc->positioning_activation_request = positioning_activation_request_f1ap;
mac_rrc->positioning_measurement_request = positioning_measurement_request_f1ap;
}