diff --git a/openair2/F1AP/f1ap_cu_task.c b/openair2/F1AP/f1ap_cu_task.c index ff7264d1a4..d58e4ec270 100644 --- a/openair2/F1AP/f1ap_cu_task.c +++ b/openair2/F1AP/f1ap_cu_task.c @@ -38,6 +38,7 @@ #include "lib/f1ap_interface_management.h" #include "lib/f1ap_ue_context.h" #include "f1ap_cu_paging.h" +#include "lib/f1ap_paging.h" #include "f1ap_cu_task.h" #include "openair2/RRC/NR/nr_rrc_defs.h" #include @@ -204,6 +205,7 @@ void *F1AP_CU_task(void *arg) { case F1AP_PAGING: CU_send_Paging(assoc_id, &F1AP_PAGING(received_msg)); + free_f1ap_paging(&F1AP_PAGING(received_msg)); break; case F1AP_UE_CONTEXT_MODIFICATION_CONFIRM: diff --git a/openair2/F1AP/f1ap_du_paging.c b/openair2/F1AP/f1ap_du_paging.c index 5351b6bf26..43afc3aeb1 100644 --- a/openair2/F1AP/f1ap_du_paging.c +++ b/openair2/F1AP/f1ap_du_paging.c @@ -19,75 +19,37 @@ * contact@openairinterface.org */ -/*! \file f1ap_du_interface_management.h - * \brief f1ap interface management for DU - * \author EURECOM/NTUST - * \date 2018 - * \version 0.1 - * \company Eurecom - * \email: navid.nikaein@eurecom.fr, bing-kai.hong@eurecom.fr - * \note - * \warning - */ #include "f1ap_common.h" #include "f1ap_du_paging.h" +#include "lib/f1ap_paging.h" #include "conversions.h" #include "oai_asn1.h" #include "openair2/RRC/LTE/rrc_proto.h" +/* @brief Handle F1AP Paging message at DU */ int DU_handle_Paging(instance_t instance, sctp_assoc_t assoc_id, uint32_t stream, F1AP_F1AP_PDU_t *pdu) { - F1AP_Paging_t *paging; - F1AP_PagingIEs_t *ie; - long tmsi; - uint8_t pagingdrx; - uint8_t *fiveg_tmsi_buf = NULL; + f1ap_paging_t decoded = {0}; DevAssert(pdu); + (void)instance; + (void)assoc_id; + (void)stream; - if ( LOG_DEBUGFLAG(DEBUG_ASN1) ) { + if (LOG_DEBUGFLAG(DEBUG_ASN1)) { xer_fprint(stdout, &asn_DEF_F1AP_F1AP_PDU, pdu); } - paging = &pdu->choice.initiatingMessage->value.choice.Paging; - // get UEIdentityIndexValue - F1AP_FIND_PROTOCOLIE_BY_ID(F1AP_PagingIEs_t, ie, paging, - F1AP_ProtocolIE_ID_id_UEIdentityIndexValue, true); - - LOG_D(F1AP, "indexLength10 %d\n", BIT_STRING_to_uint32(&ie->value.choice.UEIdentityIndexValue.choice.indexLength10)); - - // get PagingIdentity - F1AP_FIND_PROTOCOLIE_BY_ID(F1AP_PagingIEs_t, ie, paging, - F1AP_ProtocolIE_ID_id_PagingIdentity, true); - - if(ie != NULL){ - fiveg_tmsi_buf = ie->value.choice.PagingIdentity.choice.cNUEPagingIdentity->choice.fiveG_S_TMSI.buf; - - tmsi = ((long)fiveg_tmsi_buf[0] << 40) + - ((long)fiveg_tmsi_buf[1] << 32) + - (fiveg_tmsi_buf[2] << 24) + - (fiveg_tmsi_buf[3] << 16) + - (fiveg_tmsi_buf[4] << 8) + - fiveg_tmsi_buf[5]; - - LOG_D(F1AP, "tmsi %ld\n", tmsi); + if (!decode_f1ap_paging(&decoded, pdu)) { + LOG_E(F1AP, "Failed to decode F1AP Paging\n"); + return -1; } - // get PagingDRX - F1AP_FIND_PROTOCOLIE_BY_ID(F1AP_PagingIEs_t, ie, paging, - F1AP_ProtocolIE_ID_id_PagingDRX, true); - - if(ie != NULL) { - pagingdrx = (uint8_t)ie->value.choice.PagingDRX; - } - - LOG_D(F1AP, "pagingdrx %u\n", pagingdrx); - - // get PagingCell_List - F1AP_FIND_PROTOCOLIE_BY_ID(F1AP_PagingIEs_t, ie, paging, - F1AP_ProtocolIE_ID_id_PagingCell_List, true); - - AssertFatal(false, "not implemented\n"); + /** @todo Build PCCH-Message (Paging) at DU per TS 38.331 §5.3.2; apply + * RRC padding per §8.5; deliver as RLC SDU per §8.2. For each + * cell in Paging Cell List that belongs to this DU, queue for MAC; MAC schedules + * at PF/PO per TS 38.304 §7. */ + free_f1ap_paging(&decoded); return 0; } diff --git a/openair2/F1AP/f1ap_du_paging.h b/openair2/F1AP/f1ap_du_paging.h index 5ec21bcbae..760fb8639a 100644 --- a/openair2/F1AP/f1ap_du_paging.h +++ b/openair2/F1AP/f1ap_du_paging.h @@ -19,20 +19,10 @@ * contact@openairinterface.org */ -/*! \file f1ap_du_interface_management.h - * \brief f1ap interface management for DU - * \author EURECOM/NTUST - * \date 2018 - * \version 0.1 - * \company Eurecom - * \email: navid.nikaein@eurecom.fr, bing-kai.hong@eurecom.fr - * \note - * \warning - */ - #ifndef F1AP_DU_PAGING_H_ #define F1AP_DU_PAGING_H_ +/* Paging (gNB-CU initiated) */ int DU_handle_Paging(instance_t instance, sctp_assoc_t assoc_id, uint32_t stream, F1AP_F1AP_PDU_t *pdu); #endif /* F1AP_DU_PAGING_H_ */ diff --git a/openair2/RRC/NR/mac_rrc_dl.h b/openair2/RRC/NR/mac_rrc_dl.h index 4bd106d679..a23e3057d6 100644 --- a/openair2/RRC/NR/mac_rrc_dl.h +++ b/openair2/RRC/NR/mac_rrc_dl.h @@ -40,6 +40,7 @@ typedef void (*ue_context_modification_refuse_func_t)(sctp_assoc_t assoc_id, con typedef void (*ue_context_release_command_func_t)(sctp_assoc_t assoc_id, const f1ap_ue_context_rel_cmd_t *cmd); typedef void (*dl_rrc_message_transfer_func_t)(sctp_assoc_t assoc_id, const f1ap_dl_rrc_message_t *dl_rrc); +typedef void (*f1_paging_transfer_func_t)(sctp_assoc_t assoc_id, const f1ap_paging_t *paging); struct nr_mac_rrc_dl_if_s; void mac_rrc_dl_direct_init(struct nr_mac_rrc_dl_if_s *mac_rrc); diff --git a/openair2/RRC/NR/mac_rrc_dl_direct.c b/openair2/RRC/NR/mac_rrc_dl_direct.c index 83c1130fcb..8029a5e9bf 100644 --- a/openair2/RRC/NR/mac_rrc_dl_direct.c +++ b/openair2/RRC/NR/mac_rrc_dl_direct.c @@ -94,6 +94,16 @@ static void dl_rrc_message_transfer_direct(sctp_assoc_t assoc_id, const f1ap_dl_ dl_rrc_message_transfer(dl_rrc); } +static void f1_paging_transfer_direct(sctp_assoc_t assoc_id, const f1ap_paging_t *paging) +{ + AssertFatal(assoc_id == -1, "illegal assoc_id %d\n", assoc_id); + /** @todo Build PCCH-Message (Paging) at DU per TS 38.331 §5.3.2; apply + * RRC padding per §8.5; deliver as RLC SDU per §8.2. For each + * cell in Paging Cell List that belongs to this DU, queue for MAC; + * MAC schedules at PF/PO per TS 38.304 §7. */ + (void)paging; +} + void mac_rrc_dl_direct_init(nr_mac_rrc_dl_if_t *mac_rrc) { mac_rrc->f1_reset = f1_reset_cu_initiated_direct; @@ -107,4 +117,5 @@ void mac_rrc_dl_direct_init(nr_mac_rrc_dl_if_t *mac_rrc) mac_rrc->ue_context_modification_refuse = ue_context_modification_refuse_direct; mac_rrc->ue_context_release_command = ue_context_release_command_direct; mac_rrc->dl_rrc_message_transfer = dl_rrc_message_transfer_direct; + mac_rrc->paging_transfer = f1_paging_transfer_direct; } diff --git a/openair2/RRC/NR/mac_rrc_dl_f1ap.c b/openair2/RRC/NR/mac_rrc_dl_f1ap.c index 37cb6d70f9..8d2ccc2d74 100644 --- a/openair2/RRC/NR/mac_rrc_dl_f1ap.c +++ b/openair2/RRC/NR/mac_rrc_dl_f1ap.c @@ -30,6 +30,7 @@ #include "intertask_interface.h" #include "mac_rrc_dl.h" #include "nr_rrc_defs.h" +#include "lib/f1ap_paging.h" #include "lib/f1ap_rrc_message_transfer.h" #include "lib/f1ap_interface_management.h" #include "lib/f1ap_ue_context.h" @@ -138,6 +139,15 @@ static void dl_rrc_message_transfer_f1ap(sctp_assoc_t assoc_id, const f1ap_dl_rr itti_send_msg_to_task (TASK_CU_F1, 0, message_p); } +static void paging_f1ap(sctp_assoc_t assoc_id, const f1ap_paging_t *paging) +{ + MessageDef *message_p = itti_alloc_new_message(TASK_RRC_GNB, 0, F1AP_PAGING); + message_p->ittiMsgHeader.originInstance = assoc_id; + f1ap_paging_t *msg = &F1AP_PAGING(message_p); + *msg = cp_f1ap_paging(paging); + 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; @@ -151,4 +161,5 @@ void mac_rrc_dl_f1ap_init(nr_mac_rrc_dl_if_t *mac_rrc) mac_rrc->ue_context_modification_refuse = ue_context_modification_refuse_f1ap; mac_rrc->ue_context_release_command = ue_context_release_command_f1ap; mac_rrc->dl_rrc_message_transfer = dl_rrc_message_transfer_f1ap; + mac_rrc->paging_transfer = paging_f1ap; } diff --git a/openair2/RRC/NR/nr_rrc_defs.h b/openair2/RRC/NR/nr_rrc_defs.h index b992af3e07..e9d016ab42 100644 --- a/openair2/RRC/NR/nr_rrc_defs.h +++ b/openair2/RRC/NR/nr_rrc_defs.h @@ -362,6 +362,7 @@ typedef struct nr_mac_rrc_dl_if_s { ue_context_modification_refuse_func_t ue_context_modification_refuse; ue_context_release_command_func_t ue_context_release_command; dl_rrc_message_transfer_func_t dl_rrc_message_transfer; + f1_paging_transfer_func_t paging_transfer; } nr_mac_rrc_dl_if_t; typedef struct cucp_cuup_if_s {