mirror of
https://gitlab.eurecom.fr/oai/openairinterface5g.git
synced 2026-07-13 04:30:28 +00:00
Add Positioning Measurement Exchange RRC + MAC procedures: F1AP
Signed-off-by: Rakesh Mundlamuri <rakesh.mundlamuri@openairinterface.org>
This commit is contained in:
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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_ */
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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_ */
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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 */
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user