diff --git a/openair2/COMMON/ngap_messages_types.h b/openair2/COMMON/ngap_messages_types.h index af746b9193..6a301ce336 100644 --- a/openair2/COMMON/ngap_messages_types.h +++ b/openair2/COMMON/ngap_messages_types.h @@ -353,9 +353,18 @@ typedef struct pdusession_tobeswitched_s { uint32_t gtp_teid; } pdusession_tobeswitched_t; +typedef struct qos_flow_tobe_modified_s { + uint8_t qfi; // 0~63 +} qos_flow_tobe_modified_t; + typedef struct pdusession_modify_s { /* Unique pdusession_id for the UE. */ uint8_t pdusession_id; + + uint8_t nb_of_qos_flow; + + // qos_flow_add_or_modify + qos_flow_tobe_modified_t qos[QOSFLOW_MAX_VALUE]; } pdusession_modify_t; typedef enum ngap_Cause_e { @@ -770,7 +779,7 @@ typedef struct ngap_pdusession_modify_req_s { /* Number of pdusession to be modify in the list */ uint8_t nb_pdusessions_tomodify; - /* E RAB modify request */ + /* pdu session modify request */ pdusession_t pdusession_modify_params[NGAP_MAX_PDUSESSION]; } ngap_pdusession_modify_req_t; diff --git a/openair2/RRC/NR/rrc_gNB.c b/openair2/RRC/NR/rrc_gNB.c index 845ce87cdf..78416b5359 100755 --- a/openair2/RRC/NR/rrc_gNB.c +++ b/openair2/RRC/NR/rrc_gNB.c @@ -1335,6 +1335,8 @@ rrc_gNB_modify_dedicatedRRCReconfiguration( buffer, PDCP_TRANSMISSION_MODE_CONTROL); #endif + + return 0; } //----------------------------------------------------------------------------- @@ -2516,12 +2518,14 @@ rrc_gNB_decode_dcch( //NGAP_PDUSESSION_RELEASE_RESPONSE rrc_gNB_send_NGAP_PDUSESSION_RELEASE_RESPONSE(ctxt_pP, ue_context_p, xid); } else if (ue_context_p->ue_context.established_pdu_sessions_flag != 1) { - if (ue_context_p->ue_context.setup_pdu_sessions > 0) { + if (ue_context_p->ue_context.nb_of_pdusessions > 0) { rrc_gNB_send_NGAP_PDUSESSION_SETUP_RESP(ctxt_pP, ue_context_p, ul_dcch_msg->message.choice.c1->choice.rrcReconfigurationComplete->rrc_TransactionIdentifier); + ue_context_p->ue_context.nb_of_pdusessions = 0; } - } else if (ue_context_p->ue_context.nb_of_modify_pdusessions > 0) { + } + if (ue_context_p->ue_context.nb_of_modify_pdusessions > 0) { rrc_gNB_send_NGAP_PDUSESSION_MODIFY_RESP(ctxt_pP, ue_context_p, ul_dcch_msg->message.choice.c1->choice.rrcReconfigurationComplete->rrc_TransactionIdentifier); diff --git a/openair2/RRC/NR/rrc_gNB_NGAP.c b/openair2/RRC/NR/rrc_gNB_NGAP.c index 40d3f4a69f..46d3b01bf0 100644 --- a/openair2/RRC/NR/rrc_gNB_NGAP.c +++ b/openair2/RRC/NR/rrc_gNB_NGAP.c @@ -1241,12 +1241,14 @@ rrc_gNB_process_NGAP_PDUSESSION_MODIFY_REQ( } if (ue_context_p->ue_context.nb_of_failed_pdusessions < ue_context_p->ue_context.nb_of_modify_pdusessions) { + LOG_D(NR_RRC, "generate RRCReconfiguration \n"); if (0 == rrc_gNB_modify_dedicatedRRCReconfiguration(&ctxt, ue_context_p)) { return (0); } } { // modify failed + LOG_I(NR_RRC, "pdu session modify failed, fill NGAP_PDUSESSION_MODIFY_RESP with the pdu session information that failed to modify \n"); uint8_t nb_of_pdu_sessions_failed = 0; MessageDef *msg_fail_p = NULL; msg_fail_p = itti_alloc_new_message (TASK_RRC_GNB, 0, NGAP_PDUSESSION_MODIFY_RESP); @@ -1299,6 +1301,8 @@ rrc_gNB_send_NGAP_PDUSESSION_MODIFY_RESP( return (-1); } + LOG_I(NR_RRC, "send message NGAP_PDUSESSION_MODIFY_RESP \n"); + NGAP_PDUSESSION_MODIFY_RESP(msg_p).gNB_ue_ngap_id = ue_context_pP->ue_context.gNB_ue_ngap_id; for (i = 0; i < ue_context_pP->ue_context.nb_of_modify_pdusessions; i++) { @@ -1306,12 +1310,13 @@ rrc_gNB_send_NGAP_PDUSESSION_MODIFY_RESP( if (ue_context_pP->ue_context.modify_pdusession[i].status == PDU_SESSION_STATUS_DONE) { for (j = 0; j < ue_context_pP->ue_context.setup_pdu_sessions; j++) { if (ue_context_pP->ue_context.modify_pdusession[i].param.pdusession_id == - ue_context_pP->ue_context.pduSession[i].param.pdusession_id) { + ue_context_pP->ue_context.pduSession[j].param.pdusession_id) { + LOG_I(NR_RRC, "update pdu session %d \n", ue_context_pP->ue_context.pduSession[j].param.pdusession_id); // Update ue_context_pP->ue_context.pduSession - ue_context_pP->ue_context.pduSession[i].status = PDU_SESSION_STATUS_ESTABLISHED; - ue_context_pP->ue_context.pduSession[i].cause = NGAP_CAUSE_NOTHING; - for (qos_flow_index = 0; qos_flow_index < ue_context_pP->ue_context.pduSession[i].param.nb_qos; qos_flow_index++) { - ue_context_pP->ue_context.pduSession[i].param.qos[qos_flow_index] = + ue_context_pP->ue_context.pduSession[j].status = PDU_SESSION_STATUS_ESTABLISHED; + ue_context_pP->ue_context.pduSession[j].cause = NGAP_CAUSE_NOTHING; + for (qos_flow_index = 0; qos_flow_index < ue_context_pP->ue_context.modify_pdusession[i].param.nb_qos; qos_flow_index++) { + ue_context_pP->ue_context.pduSession[j].param.qos[qos_flow_index] = ue_context_pP->ue_context.modify_pdusession[i].param.qos[qos_flow_index]; } break; @@ -1321,7 +1326,13 @@ rrc_gNB_send_NGAP_PDUSESSION_MODIFY_RESP( if (j < ue_context_pP->ue_context.setup_pdu_sessions) { NGAP_PDUSESSION_MODIFY_RESP(msg_p).pdusessions[pdu_sessions_done].pdusession_id = ue_context_pP->ue_context.modify_pdusession[i].param.pdusession_id; - LOG_D(NR_RRC, "gnb_gtp_addr (msg index %d, pdu session index %d, status %d, xid %d): nb_of_modify_pdusessions %d, pdusession_id %d \n ", + for (qos_flow_index = 0; qos_flow_index < ue_context_pP->ue_context.modify_pdusession[i].param.nb_qos; qos_flow_index++) { + NGAP_PDUSESSION_MODIFY_RESP(msg_p).pdusessions[pdu_sessions_done].qos[qos_flow_index].qfi = + ue_context_pP->ue_context.modify_pdusession[i].param.qos[qos_flow_index].qfi; + } + NGAP_PDUSESSION_MODIFY_RESP(msg_p).pdusessions[pdu_sessions_done].nb_of_qos_flow = + ue_context_pP->ue_context.modify_pdusession[i].param.nb_qos; + LOG_I(NR_RRC, "Modify Resp (msg index %d, pdu session index %d, status %d, xid %d): nb_of_modify_pdusessions %d, pdusession_id %d \n ", pdu_sessions_done, i, ue_context_pP->ue_context.modify_pdusession[i].status, xid, ue_context_pP->ue_context.nb_of_modify_pdusessions, NGAP_PDUSESSION_MODIFY_RESP(msg_p).pdusessions[pdu_sessions_done].pdusession_id); diff --git a/openair3/NGAP/ngap_common.h b/openair3/NGAP/ngap_common.h index 283dd2bffa..60f7beacd0 100644 --- a/openair3/NGAP/ngap_common.h +++ b/openair3/NGAP/ngap_common.h @@ -87,6 +87,9 @@ #include "NGAP_PDUSessionResourceModifyItemModReq.h" #include "NGAP_PDUSessionResourceModifyRequestTransfer.h" #include "NGAP_QosFlowAddOrModifyRequestItem.h" +#include "NGAP_PDUSessionResourceModifyResponseTransfer.h" +#include "NGAP_QosFlowAddOrModifyResponseList.h" +#include "NGAP_QosFlowAddOrModifyResponseItem.h" #include "NGAP_TAIListForPagingItem.h" #include "NGAP_GNB-ID.h" #include "NGAP_GlobalGNB-ID.h" diff --git a/openair3/NGAP/ngap_gNB_nas_procedures.c b/openair3/NGAP/ngap_gNB_nas_procedures.c index 6686f8c19e..87c1ef2e8d 100644 --- a/openair3/NGAP/ngap_gNB_nas_procedures.c +++ b/openair3/NGAP/ngap_gNB_nas_procedures.c @@ -1257,7 +1257,7 @@ int ngap_gNB_pdusession_modify_resp(instance_t instance, ie->value.choice.RAN_UE_NGAP_ID = pdusession_modify_resp_p->gNB_ue_ngap_id; ASN_SEQUENCE_ADD(&out->protocolIEs.list, ie); - /* optional */ + /* PDUSessionResourceModifyListModRes optional */ if (pdusession_modify_resp_p->nb_of_pdusessions > 0) { ie = (NGAP_PDUSessionResourceModifyResponseIEs_t *)calloc(1, sizeof(NGAP_PDUSessionResourceModifyResponseIEs_t)); ie->id = NGAP_ProtocolIE_ID_id_PDUSessionResourceModifyListModRes; @@ -1265,13 +1265,32 @@ int ngap_gNB_pdusession_modify_resp(instance_t instance, ie->value.present = NGAP_PDUSessionResourceModifyResponseIEs__value_PR_PDUSessionResourceModifyListModRes; for (i = 0; i < pdusession_modify_resp_p->nb_of_pdusessions; i++) { - NGAP_PDUSessionResourceModifyItemModRes_t *item; - - item = (NGAP_PDUSessionResourceModifyItemModRes_t *)calloc(1, sizeof(NGAP_PDUSessionResourceModifyItemModRes_t)); - item->pDUSessionID = pdusession_modify_resp_p->pdusessions[i].pdusession_id; - - NGAP_DEBUG("pdusession_modify_resp: modified pdusession ID %ld\n", item->pDUSessionID); - ASN_SEQUENCE_ADD(&ie->value.choice.PDUSessionResourceModifyListModRes.list, item); + NGAP_PDUSessionResourceModifyItemModRes_t *item; + NGAP_PDUSessionResourceModifyResponseTransfer_t *transfer_p = NULL; + + item = (NGAP_PDUSessionResourceModifyItemModRes_t *)calloc(1, sizeof(NGAP_PDUSessionResourceModifyItemModRes_t)); + item->pDUSessionID = pdusession_modify_resp_p->pdusessions[i].pdusession_id; + + transfer_p = (NGAP_PDUSessionResourceModifyResponseTransfer_t *)calloc(1, sizeof(NGAP_PDUSessionResourceModifyResponseTransfer_t)); + transfer_p->qosFlowAddOrModifyResponseList = (NGAP_QosFlowAddOrModifyResponseList_t *)calloc(1, sizeof(NGAP_QosFlowAddOrModifyResponseList_t)); + + uint8_t qos_flow_index; + for (qos_flow_index = 0; qos_flow_index < pdusession_modify_resp_p->pdusessions[i].nb_of_qos_flow; qos_flow_index++) { + NGAP_QosFlowAddOrModifyResponseItem_t *qosFlowAddOrModifyResponseItem_p = calloc(1, sizeof(NGAP_QosFlowAddOrModifyResponseItem_t)); + qosFlowAddOrModifyResponseItem_p->qosFlowIdentifier = + pdusession_modify_resp_p->pdusessions[i].qos[qos_flow_index].qfi; + ASN_SEQUENCE_ADD(&transfer_p->qosFlowAddOrModifyResponseList->list, qosFlowAddOrModifyResponseItem_p); + } + + memset(&res, 0, sizeof(res)); + res = asn_encode_to_new_buffer(NULL, ATS_ALIGNED_CANONICAL_PER, &asn_DEF_NGAP_PDUSessionResourceModifyResponseTransfer, transfer_p); + item->pDUSessionResourceModifyResponseTransfer.buf = res.buffer; + item->pDUSessionResourceModifyResponseTransfer.size = res.result.encoded; + + ASN_STRUCT_FREE_CONTENTS_ONLY(asn_DEF_NGAP_PDUSessionResourceModifyResponseTransfer, transfer_p); + + NGAP_DEBUG("pdusession_modify_resp: modified pdusession ID %ld\n", item->pDUSessionID); + ASN_SEQUENCE_ADD(&ie->value.choice.PDUSessionResourceModifyListModRes.list, item); } ASN_SEQUENCE_ADD(&out->protocolIEs.list, ie);