Use gtpu_tunnel_t in pdusession_setup_t
This commit is contained in:
@@ -248,10 +248,9 @@ typedef struct pdusession_setup_s {
|
|||||||
|
|
||||||
/* The transport layer address for the IP packets */
|
/* The transport layer address for the IP packets */
|
||||||
uint8_t pdu_session_type;
|
uint8_t pdu_session_type;
|
||||||
transport_layer_addr_t gNB_addr;
|
|
||||||
|
|
||||||
/* Incoming NG-U Tunnel Endpoint Identifier (S-GW/UPF) */
|
// NG-U (N3) Tunnel Endpoint on the RAN side
|
||||||
uint32_t gtp_teid;
|
gtpu_tunnel_t n3_outgoing;
|
||||||
|
|
||||||
/* qos flow list number */
|
/* qos flow list number */
|
||||||
uint8_t nb_of_qos_flow;
|
uint8_t nb_of_qos_flow;
|
||||||
|
|||||||
@@ -467,6 +467,15 @@ int rrc_gNB_process_NGAP_INITIAL_CONTEXT_SETUP_REQ(MessageDef *msg_p, instance_t
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static gtpu_tunnel_t cp_gtp_tunnel(const gtpu_tunnel_t in)
|
||||||
|
{
|
||||||
|
gtpu_tunnel_t out = {0};
|
||||||
|
out.teid = in.teid;
|
||||||
|
out.addr.length = in.addr.length;
|
||||||
|
memcpy(out.addr.buffer, in.addr.buffer, out.addr.length);
|
||||||
|
return out;
|
||||||
|
}
|
||||||
|
|
||||||
void rrc_gNB_send_NGAP_INITIAL_CONTEXT_SETUP_RESP(gNB_RRC_INST *rrc, gNB_RRC_UE_t *UE)
|
void rrc_gNB_send_NGAP_INITIAL_CONTEXT_SETUP_RESP(gNB_RRC_INST *rrc, gNB_RRC_UE_t *UE)
|
||||||
{
|
{
|
||||||
MessageDef *msg_p = NULL;
|
MessageDef *msg_p = NULL;
|
||||||
@@ -482,11 +491,7 @@ void rrc_gNB_send_NGAP_INITIAL_CONTEXT_SETUP_RESP(gNB_RRC_INST *rrc, gNB_RRC_UE_
|
|||||||
if (session->status == PDU_SESSION_STATUS_DONE) {
|
if (session->status == PDU_SESSION_STATUS_DONE) {
|
||||||
pdu_sessions_done++;
|
pdu_sessions_done++;
|
||||||
resp->pdusessions[pdusession].pdusession_id = session->param.pdusession_id;
|
resp->pdusessions[pdusession].pdusession_id = session->param.pdusession_id;
|
||||||
resp->pdusessions[pdusession].gtp_teid = session->param.n3_outgoing.teid;
|
resp->pdusessions[pdusession].n3_outgoing = cp_gtp_tunnel(session->param.n3_outgoing);
|
||||||
memcpy(resp->pdusessions[pdusession].gNB_addr.buffer,
|
|
||||||
session->param.n3_outgoing.addr.buffer,
|
|
||||||
sizeof(resp->pdusessions[pdusession].gNB_addr.buffer));
|
|
||||||
resp->pdusessions[pdusession].gNB_addr.length = 4; // Fixme: IPv4 hard coded here
|
|
||||||
resp->pdusessions[pdusession].nb_of_qos_flow = session->param.nb_qos;
|
resp->pdusessions[pdusession].nb_of_qos_flow = session->param.nb_qos;
|
||||||
for (int qos_flow_index = 0; qos_flow_index < session->param.nb_qos; qos_flow_index++) {
|
for (int qos_flow_index = 0; qos_flow_index < session->param.nb_qos; qos_flow_index++) {
|
||||||
resp->pdusessions[pdusession].associated_qos_flows[qos_flow_index].qfi = session->param.qos[qos_flow_index].qfi;
|
resp->pdusessions[pdusession].associated_qos_flows[qos_flow_index].qfi = session->param.qos[qos_flow_index].qfi;
|
||||||
@@ -677,10 +682,9 @@ void rrc_gNB_send_NGAP_PDUSESSION_SETUP_RESP(gNB_RRC_INST *rrc, gNB_RRC_UE_t *UE
|
|||||||
pdusession_setup_t *tmp = &resp->pdusessions[pdu_sessions_done];
|
pdusession_setup_t *tmp = &resp->pdusessions[pdu_sessions_done];
|
||||||
tmp->pdusession_id = session->param.pdusession_id;
|
tmp->pdusession_id = session->param.pdusession_id;
|
||||||
tmp->nb_of_qos_flow = session->param.nb_qos;
|
tmp->nb_of_qos_flow = session->param.nb_qos;
|
||||||
tmp->gtp_teid = session->param.n3_outgoing.teid;
|
tmp->n3_outgoing = cp_gtp_tunnel(session->param.n3_outgoing);
|
||||||
tmp->pdu_session_type = session->param.pdu_session_type;
|
tmp->pdu_session_type = session->param.pdu_session_type;
|
||||||
tmp->gNB_addr.length = session->param.n3_outgoing.addr.length;
|
|
||||||
memcpy(tmp->gNB_addr.buffer, session->param.n3_outgoing.addr.buffer, tmp->gNB_addr.length);
|
|
||||||
for (int qos_flow_index = 0; qos_flow_index < tmp->nb_of_qos_flow; qos_flow_index++) {
|
for (int qos_flow_index = 0; qos_flow_index < tmp->nb_of_qos_flow; qos_flow_index++) {
|
||||||
tmp->associated_qos_flows[qos_flow_index].qfi = session->param.qos[qos_flow_index].qfi;
|
tmp->associated_qos_flows[qos_flow_index].qfi = session->param.qos[qos_flow_index].qfi;
|
||||||
tmp->associated_qos_flows[qos_flow_index].qos_flow_mapping_ind = QOSFLOW_MAPPING_INDICATION_DL;
|
tmp->associated_qos_flows[qos_flow_index].qos_flow_mapping_ind = QOSFLOW_MAPPING_INDICATION_DL;
|
||||||
@@ -695,7 +699,7 @@ void rrc_gNB_send_NGAP_PDUSESSION_SETUP_RESP(gNB_RRC_INST *rrc, gNB_RRC_UE_t *UE
|
|||||||
xid,
|
xid,
|
||||||
UE->nb_of_pdusessions,
|
UE->nb_of_pdusessions,
|
||||||
tmp->pdusession_id,
|
tmp->pdusession_id,
|
||||||
tmp->gtp_teid);
|
tmp->n3_outgoing.teid);
|
||||||
pdu_sessions_done++;
|
pdu_sessions_done++;
|
||||||
} else if (session->status != PDU_SESSION_STATUS_ESTABLISHED) {
|
} else if (session->status != PDU_SESSION_STATUS_ESTABLISHED) {
|
||||||
session->status = PDU_SESSION_STATUS_FAILED;
|
session->status = PDU_SESSION_STATUS_FAILED;
|
||||||
|
|||||||
@@ -613,8 +613,8 @@ int ngap_gNB_initial_ctxt_resp(instance_t instance, ngap_initial_context_setup_r
|
|||||||
pdusessionTransfer.dLQosFlowPerTNLInformation.uPTransportLayerInformation.present = NGAP_UPTransportLayerInformation_PR_gTPTunnel;
|
pdusessionTransfer.dLQosFlowPerTNLInformation.uPTransportLayerInformation.present = NGAP_UPTransportLayerInformation_PR_gTPTunnel;
|
||||||
|
|
||||||
asn1cCalloc(pdusessionTransfer.dLQosFlowPerTNLInformation.uPTransportLayerInformation.choice.gTPTunnel, tmp);
|
asn1cCalloc(pdusessionTransfer.dLQosFlowPerTNLInformation.uPTransportLayerInformation.choice.gTPTunnel, tmp);
|
||||||
GTP_TEID_TO_ASN1(initial_ctxt_resp_p->pdusessions[i].gtp_teid, &tmp->gTP_TEID);
|
GTP_TEID_TO_ASN1(initial_ctxt_resp_p->pdusessions[i].n3_outgoing.teid, &tmp->gTP_TEID);
|
||||||
tnl_to_bitstring(&tmp->transportLayerAddress, initial_ctxt_resp_p->pdusessions[i].gNB_addr);
|
tnl_to_bitstring(&tmp->transportLayerAddress, initial_ctxt_resp_p->pdusessions[i].n3_outgoing.addr);
|
||||||
|
|
||||||
NGAP_DEBUG("initial_ctxt_resp_p: pdusession ID %ld, gnb_addr %d.%d.%d.%d, SIZE %ld, TEID %u\n",
|
NGAP_DEBUG("initial_ctxt_resp_p: pdusession ID %ld, gnb_addr %d.%d.%d.%d, SIZE %ld, TEID %u\n",
|
||||||
item->pDUSessionID,
|
item->pDUSessionID,
|
||||||
@@ -623,7 +623,7 @@ int ngap_gNB_initial_ctxt_resp(instance_t instance, ngap_initial_context_setup_r
|
|||||||
tmp->transportLayerAddress.buf[2],
|
tmp->transportLayerAddress.buf[2],
|
||||||
tmp->transportLayerAddress.buf[3],
|
tmp->transportLayerAddress.buf[3],
|
||||||
tmp->transportLayerAddress.size,
|
tmp->transportLayerAddress.size,
|
||||||
initial_ctxt_resp_p->pdusessions[i].gtp_teid);
|
initial_ctxt_resp_p->pdusessions[i].n3_outgoing.teid);
|
||||||
|
|
||||||
/* associatedQosFlowList. number of 1? */
|
/* associatedQosFlowList. number of 1? */
|
||||||
for(int j=0; j < initial_ctxt_resp_p->pdusessions[i].nb_of_qos_flow; j++) {
|
for(int j=0; j < initial_ctxt_resp_p->pdusessions[i].nb_of_qos_flow; j++) {
|
||||||
@@ -928,8 +928,8 @@ int ngap_gNB_pdusession_setup_resp(instance_t instance, ngap_pdusession_setup_re
|
|||||||
NGAP_PDUSessionResourceSetupResponseTransfer_t pdusessionTransfer = {0};
|
NGAP_PDUSessionResourceSetupResponseTransfer_t pdusessionTransfer = {0};
|
||||||
pdusessionTransfer.dLQosFlowPerTNLInformation.uPTransportLayerInformation.present = NGAP_UPTransportLayerInformation_PR_gTPTunnel;
|
pdusessionTransfer.dLQosFlowPerTNLInformation.uPTransportLayerInformation.present = NGAP_UPTransportLayerInformation_PR_gTPTunnel;
|
||||||
asn1cCalloc(pdusessionTransfer.dLQosFlowPerTNLInformation.uPTransportLayerInformation.choice.gTPTunnel, tmp);
|
asn1cCalloc(pdusessionTransfer.dLQosFlowPerTNLInformation.uPTransportLayerInformation.choice.gTPTunnel, tmp);
|
||||||
GTP_TEID_TO_ASN1(pdusession->gtp_teid, &tmp->gTP_TEID);
|
GTP_TEID_TO_ASN1(pdusession->n3_outgoing.teid, &tmp->gTP_TEID);
|
||||||
tnl_to_bitstring(&tmp->transportLayerAddress, pdusession->gNB_addr);
|
tnl_to_bitstring(&tmp->transportLayerAddress, pdusession->n3_outgoing.addr);
|
||||||
NGAP_DEBUG("pdusession_setup_resp_p: pdusession ID %ld, gnb_addr %d.%d.%d.%d, SIZE %ld, TEID %u\n",
|
NGAP_DEBUG("pdusession_setup_resp_p: pdusession ID %ld, gnb_addr %d.%d.%d.%d, SIZE %ld, TEID %u\n",
|
||||||
item->pDUSessionID,
|
item->pDUSessionID,
|
||||||
tmp->transportLayerAddress.buf[0],
|
tmp->transportLayerAddress.buf[0],
|
||||||
@@ -937,7 +937,7 @@ int ngap_gNB_pdusession_setup_resp(instance_t instance, ngap_pdusession_setup_re
|
|||||||
tmp->transportLayerAddress.buf[2],
|
tmp->transportLayerAddress.buf[2],
|
||||||
tmp->transportLayerAddress.buf[3],
|
tmp->transportLayerAddress.buf[3],
|
||||||
tmp->transportLayerAddress.size,
|
tmp->transportLayerAddress.size,
|
||||||
pdusession->gtp_teid);
|
pdusession->n3_outgoing.teid);
|
||||||
/* associatedQosFlowList. number of 1? */
|
/* associatedQosFlowList. number of 1? */
|
||||||
for(int j=0; j < pdusession_setup_resp_p->pdusessions[i].nb_of_qos_flow; j++) {
|
for(int j=0; j < pdusession_setup_resp_p->pdusessions[i].nb_of_qos_flow; j++) {
|
||||||
asn1cSequenceAdd(pdusessionTransfer.dLQosFlowPerTNLInformation.associatedQosFlowList.list, NGAP_AssociatedQosFlowItem_t, ass_qos_item_p);
|
asn1cSequenceAdd(pdusessionTransfer.dLQosFlowPerTNLInformation.associatedQosFlowList.list, NGAP_AssociatedQosFlowItem_t, ass_qos_item_p);
|
||||||
|
|||||||
Reference in New Issue
Block a user