Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
O
OpenXG-RAN
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
常顺宇
OpenXG-RAN
Commits
b84880a1
Commit
b84880a1
authored
Sep 15, 2020
by
yincong
Committed by
Noboru Kobayashi
Oct 10, 2020
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
PDUSessionResourceSetupRequest
PDUSessionResourceSetupResponse
parent
655b7d64
Changes
3
Show whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
260 additions
and
135 deletions
+260
-135
openair3/NGAP/ngap_common.h
openair3/NGAP/ngap_common.h
+3
-0
openair3/NGAP/ngap_gNB_handlers.c
openair3/NGAP/ngap_gNB_handlers.c
+139
-62
openair3/NGAP/ngap_gNB_nas_procedures.c
openair3/NGAP/ngap_gNB_nas_procedures.c
+118
-73
No files found.
openair3/NGAP/ngap_common.h
View file @
b84880a1
...
...
@@ -62,6 +62,9 @@
#include "NGAP_PDUSessionResourceSetupUnsuccessfulTransfer.h"
#include "NGAP_PDUSessionResourceSetupItemCxtRes.h"
#include "NGAP_PDUSessionResourceFailedToSetupItemCxtRes.h"
#include "NGAP_PDUSessionResourceSetupItemSUReq.h"
#include "NGAP_PDUSessionResourceSetupItemSURes.h"
#include "NGAP_PDUSessionResourceFailedToSetupItemSURes.h"
#include "NGAP_AssociatedQosFlowItem.h"
#include "NGAP_PDUSessionResourceSetupRequestTransfer.h"
#include "NGAP_PDUSessionResourceSetupItemCxtReq.h"
...
...
openair3/NGAP/ngap_gNB_handlers.c
View file @
b84880a1
...
...
@@ -1201,49 +1201,48 @@ static
int
ngap_gNB_handle_pdusession_setup_request
(
uint32_t
assoc_id
,
uint32_t
stream
,
NGAP_NGAP_PDU_t
*
pdu
)
{
#if 0
int i;
NGAP_AMF_UE_NGAP_ID_t amf_ue_ngap_id;
NGAP_GNB_UE_NGAP_ID_t enb_ue_ngap_id;
// NGAP_AMF_UE_NGAP_ID_t amf_ue_ngap_id;
uint64_t
amf_ue_ngap_id
;
NGAP_RAN_UE_NGAP_ID_t
ran_ue_ngap_id
;
ngap_gNB_amf_data_t
*
amf_desc_p
=
NULL
;
ngap_gNB_ue_context_t
*
ue_desc_p
=
NULL
;
MessageDef
*
message_p
=
NULL
;
NGAP_PDUS
ESSION
SetupRequest_t *container;
NGAP_PDUS
ESSION
SetupRequestIEs_t *ie;
NGAP_PDUS
essionResource
SetupRequest_t
*
container
;
NGAP_PDUS
essionResource
SetupRequestIEs_t
*
ie
;
DevAssert
(
pdu
!=
NULL
);
container = &pdu->choice.initiatingMessage.value.choice.PDUS
ESSION
SetupRequest;
container
=
&
pdu
->
choice
.
initiatingMessage
.
value
.
choice
.
PDUS
essionResource
SetupRequest
;
if
((
amf_desc_p
=
ngap_gNB_get_AMF
(
NULL
,
assoc_id
,
0
))
==
NULL
)
{
NGAP_ERROR("[SCTP %d] Received
initial context
setup request for non "
NGAP_ERROR
(
"[SCTP %d] Received
pdu session resource
setup request for non "
"existing AMF context
\n
"
,
assoc_id
);
return
-
1
;
}
/* id-AMF-UE-NGAP-ID */
NGAP_FIND_PROTOCOLIE_BY_ID(NGAP_PDUS
ESSION
SetupRequestIEs_t, ie, container,
NGAP_FIND_PROTOCOLIE_BY_ID
(
NGAP_PDUS
essionResource
SetupRequestIEs_t
,
ie
,
container
,
NGAP_ProtocolIE_ID_id_AMF_UE_NGAP_ID
,
true
);
if
(
ie
!=
NULL
)
{
/* checked by macro but cppcheck doesn't see it */
amf_ue_ngap_id = ie->value.choice.AMF_UE_NGAP_ID
;
asn_INTEGER2ulong
(
&
(
ie
->
value
.
choice
.
AMF_UE_NGAP_ID
),
&
amf_ue_ngap_id
)
;
}
else
{
return
-
1
;
}
/* id-gNB-UE-NGAP-ID */
NGAP_FIND_PROTOCOLIE_BY_ID(NGAP_PDUS
ESSION
SetupRequestIEs_t, ie, container,
NGAP_ProtocolIE_ID_id_gNB
_UE_NGAP_ID, true);
NGAP_FIND_PROTOCOLIE_BY_ID
(
NGAP_PDUS
essionResource
SetupRequestIEs_t
,
ie
,
container
,
NGAP_ProtocolIE_ID_id_RAN
_UE_NGAP_ID
,
true
);
if
(
ie
!=
NULL
)
{
/* checked by macro but cppcheck doesn't see it */
enb_ue_ngap_id = ie->value.choice.GNB
_UE_NGAP_ID;
ran_ue_ngap_id
=
ie
->
value
.
choice
.
RAN
_UE_NGAP_ID
;
}
else
{
return
-
1
;
}
if
((
ue_desc_p
=
ngap_gNB_get_ue_context
(
amf_desc_p
->
ngap_gNB_instance
,
enb
_ue_ngap_id)) == NULL) {
NGAP_ERROR("[SCTP %d] Received
initial context
setup request for non "
ran
_ue_ngap_id
))
==
NULL
)
{
NGAP_ERROR
(
"[SCTP %d] Received
pdu session resource
setup request for non "
"existing UE context 0x%06lx
\n
"
,
assoc_id
,
enb
_ue_ngap_id);
ran
_ue_ngap_id
);
return
-
1
;
}
...
...
@@ -1255,6 +1254,7 @@ int ngap_gNB_handle_pdusession_setup_request(uint32_t assoc_id,
}
ue_desc_p
->
rx_stream
=
stream
;
ue_desc_p
->
amf_ue_ngap_id
=
amf_ue_ngap_id
;
if
(
ue_desc_p
->
amf_ue_ngap_id
!=
amf_ue_ngap_id
)
{
NGAP_WARN
(
"UE context amf_ue_ngap_id is different form that of the message (%d != %ld)"
,
...
...
@@ -1263,26 +1263,33 @@ int ngap_gNB_handle_pdusession_setup_request(uint32_t assoc_id,
message_p
=
itti_alloc_new_message
(
TASK_NGAP
,
NGAP_PDUSESSION_SETUP_REQ
);
NGAP_PDUSESSION_SETUP_REQ
(
message_p
).
ue_initial_id
=
ue_desc_p
->
ue_initial_id
;
NGAP_PDUSESSION_SETUP_REQ(message_p).amf_ue_ngap_id = amf_ue_ngap_id;
NGAP_PDUSESSION_SETUP_REQ(message_p).gNB_ue_ngap_id = enb_ue_ngap_id;
NGAP_FIND_PROTOCOLIE_BY_ID(NGAP_PDUSESSIONSetupRequestIEs_t, ie, container,
NGAP_ProtocolIE_ID_id_PDUSESSIONToBeSetupListBearerSUReq, true);
ue_desc_p
->
ue_initial_id
=
0
;
NGAP_INITIAL_CONTEXT_SETUP_REQ
(
message_p
).
gNB_ue_ngap_id
=
ue_desc_p
->
gNB_ue_ngap_id
;
NGAP_INITIAL_CONTEXT_SETUP_REQ
(
message_p
).
amf_ue_ngap_id
=
ue_desc_p
->
amf_ue_ngap_id
;
NGAP_FIND_PROTOCOLIE_BY_ID
(
NGAP_PDUSessionResourceSetupRequestIEs_t
,
ie
,
container
,
NGAP_ProtocolIE_ID_id_PDUSessionResourceSetupListSUReq
,
true
);
if
(
ie
!=
NULL
)
{
/* checked by macro but cppcheck doesn't see it */
NGAP_PDUSESSION_SETUP_REQ
(
message_p
).
nb_pdusessions_tosetup
=
ie->value.choice.PDUSESSIONToBeSetupListBearerSUReq.list.count;
ie
->
value
.
choice
.
PDUSessionResourceSetupListSUReq
.
list
.
count
;
for
(
int
i
=
0
;
i
<
ie
->
value
.
choice
.
PDUSessionResourceSetupListSUReq
.
list
.
count
;
i
++
)
{
NGAP_PDUSessionResourceSetupItemSUReq_t
*
item_p
;
asn_dec_rval_t
dec_rval
;
NGAP_PDUSessionResourceSetupRequestTransfer_t
*
pdusessionTransfer_p
=
NULL
;
NGAP_PDUSessionResourceSetupRequestTransferIEs_t
*
pdusessionTransfer_ies
=
NULL
;
item_p
=
(
NGAP_PDUSessionResourceSetupItemSUReq_t
*
)
ie
->
value
.
choice
.
PDUSessionResourceSetupListSUReq
.
list
.
array
[
i
];
NGAP_PDUSESSION_SETUP_REQ
(
message_p
).
pdusession_setup_params
[
i
].
pdusession_id
=
item_p
->
pDUSessionID
;
for (i = 0; i < ie->value.choice.PDUSESSIONToBeSetupListBearerSUReq.list.count; i++) {
NGAP_PDUSESSIONToBeSetupItemBearerSUReq_t *item_p;
item_p = &(((NGAP_PDUSESSIONToBeSetupItemBearerSUReqIEs_t *)ie->value.choice.PDUSESSIONToBeSetupListBearerSUReq.list.array[i])->value.choice.PDUSESSIONToBeSetupItemBearerSUReq);
NGAP_PDUSESSION_SETUP_REQ(message_p).pdusession_setup_params[i].pdusession_id = item_p->e_RAB_ID;
// check for the NAS PDU
if (item_p->nAS_PDU.
size > 0 ) {
NGAP_PDUSESSION_SETUP_REQ(message_p).pdusession_setup_params[i].nas_pdu.length = item_p->nAS_PDU.
size;
NGAP_PDUSESSION_SETUP_REQ(message_p).pdusession_setup_params[i].nas_pdu.buffer = malloc(sizeof(uint8_t) * item_p->nAS_PDU.
size);
if
(
item_p
->
pDUSessionNAS_PDU
->
size
>
0
)
{
NGAP_PDUSESSION_SETUP_REQ
(
message_p
).
pdusession_setup_params
[
i
].
nas_pdu
.
length
=
item_p
->
pDUSessionNAS_PDU
->
size
;
NGAP_PDUSESSION_SETUP_REQ
(
message_p
).
pdusession_setup_params
[
i
].
nas_pdu
.
buffer
=
malloc
(
sizeof
(
uint8_t
)
*
item_p
->
pDUSessionNAS_PDU
->
size
);
memcpy
(
NGAP_PDUSESSION_SETUP_REQ
(
message_p
).
pdusession_setup_params
[
i
].
nas_pdu
.
buffer
,
item_p->nAS_PDU.buf, item_p->nAS_PDU.
size);
item_p
->
pDUSessionNAS_PDU
->
buf
,
item_p
->
pDUSessionNAS_PDU
->
size
);
// NGAP_INFO("received a NAS PDU with size %d (%02x.%02x)\n",NGAP_PDUSESSION_SETUP_REQ(message_p).pdusession_setup_params[i].nas_pdu.length, item_p->nAS_PDU.buf[0], item_p->nAS_PDU.buf[1]);
}
else
{
NGAP_PDUSESSION_SETUP_REQ
(
message_p
).
pdusession_setup_params
[
i
].
nas_pdu
.
length
=
0
;
...
...
@@ -1290,36 +1297,106 @@ int ngap_gNB_handle_pdusession_setup_request(uint32_t assoc_id,
NGAP_WARN
(
"NAS PDU is not provided, generate a PDUSESSION_SETUP Failure (TBD) back to AMF
\n
"
);
}
/* Set the transport layer address */
memcpy(NGAP_PDUSESSION_SETUP_REQ(message_p).pdusession_setup_params[i].sgw_addr.buffer,
item_p->transportLayerAddress.buf, item_p->transportLayerAddress.size);
NGAP_PDUSESSION_SETUP_REQ(message_p).pdusession_setup_params[i].sgw_addr.length =
item_p->transportLayerAddress.size * 8 - item_p->transportLayerAddress.bits_unused;
/* NGAP_INFO("sgw addr %s len: %d (size %d, index %d)\n",
NGAP_PDUSESSION_SETUP_REQ(message_p).pdusession_setup_params[i].sgw_addr.buffer,
NGAP_PDUSESSION_SETUP_REQ(message_p).pdusession_setup_params[i].sgw_addr.length,
item_p->transportLayerAddress.size, i);
*/
/* GTP tunnel endpoint ID */
OCTET_STRING_TO_INT32(&item_p->gTP_TEID, NGAP_PDUSESSION_SETUP_REQ(message_p).pdusession_setup_params[i].gtp_teid);
dec_rval
=
uper_decode
(
NULL
,
&
asn_DEF_NGAP_PDUSessionResourceSetupRequestTransfer
,
(
void
**
)
&
pdusessionTransfer_p
,
item_p
->
pDUSessionResourceSetupRequestTransfer
.
buf
,
item_p
->
pDUSessionResourceSetupRequestTransfer
.
size
,
0
,
0
);
if
(
dec_rval
.
code
!=
RC_OK
)
{
NGAP_ERROR
(
"could not decode PDUSessionResourceSetupRequestTransfer
\n
"
);
return
-
1
;
}
for
(
int
j
=
0
;
j
<
pdusessionTransfer_p
->
protocolIEs
.
list
.
count
;
j
++
)
{
pdusessionTransfer_ies
=
pdusessionTransfer_p
->
protocolIEs
.
list
.
array
[
j
];
switch
(
pdusessionTransfer_ies
->
id
)
{
/* optional PDUSessionAggregateMaximumBitRate */
case
NGAP_ProtocolIE_ID_id_PDUSessionAggregateMaximumBitRate
:
break
;
/* mandatory UL-NGU-UP-TNLInformation */
case
NGAP_ProtocolIE_ID_id_UL_NGU_UP_TNLInformation
:
{
NGAP_GTPTunnel_t
*
gTPTunnel_p
;
gTPTunnel_p
=
&
pdusessionTransfer_ies
->
value
.
choice
.
UPTransportLayerInformation
.
choice
.
gTPTunnel
;
/* The transport layer address for the IP packets */
OCTET_STRING_TO_INT32
(
&
gTPTunnel_p
->
gTP_TEID
,
NGAP_INITIAL_CONTEXT_SETUP_REQ
(
message_p
).
pdusession_param
[
i
].
gtp_teid
);
NGAP_INITIAL_CONTEXT_SETUP_REQ
(
message_p
).
pdusession_param
[
i
].
upf_addr
.
length
=
gTPTunnel_p
->
transportLayerAddress
.
size
*
8
-
gTPTunnel_p
->
transportLayerAddress
.
bits_unused
;
memcpy
(
NGAP_INITIAL_CONTEXT_SETUP_REQ
(
message_p
).
pdusession_param
[
i
].
upf_addr
.
buffer
,
gTPTunnel_p
->
transportLayerAddress
.
buf
,
gTPTunnel_p
->
transportLayerAddress
.
size
);
}
break
;
/* optional AdditionalUL-NGU-UP-TNLInformation */
case
NGAP_ProtocolIE_ID_id_AdditionalUL_NGU_UP_TNLInformation
:
break
;
/* optional DataForwardingNotPossible */
case
NGAP_ProtocolIE_ID_id_DataForwardingNotPossible
:
break
;
/* mandatory PDUSessionType */
case
NGAP_ProtocolIE_ID_id_PDUSessionType
:
NGAP_INITIAL_CONTEXT_SETUP_REQ
(
message_p
).
pdusession_param
[
i
].
upf_addr
.
pdu_session_type
=
(
uint8_t
)
pdusessionTransfer_ies
->
value
.
choice
.
PDUSessionType
;
break
;
/* optional SecurityIndication */
case
NGAP_ProtocolIE_ID_id_SecurityIndication
:
break
;
/* optional NetworkInstance */
case
NGAP_ProtocolIE_ID_id_NetworkInstance
:
break
;
/* mandatory QosFlowSetupRequestList */
case
NGAP_ProtocolIE_ID_id_QosFlowSetupRequestList
:
{
NGAP_QosFlowSetupRequestItem_t
*
qosFlowItem_p
;
NGAP_DEBUG
(
"servedGUAMIs.list.count %d
\n
"
,
pdusessionTransfer_ies
->
value
.
choice
.
QosFlowSetupRequestList
.
list
.
count
);
DevAssert
(
pdusessionTransfer_ies
->
value
.
choice
.
QosFlowSetupRequestList
.
list
.
count
>
0
);
DevAssert
(
pdusessionTransfer_ies
->
value
.
choice
.
QosFlowSetupRequestList
.
list
.
count
<=
NGAP_maxnoofQosFlows
);
NGAP_INITIAL_CONTEXT_SETUP_REQ
(
message_p
).
pdusession_param
[
i
].
nb_qos
=
pdusessionTransfer_ies
->
value
.
choice
.
QosFlowSetupRequestList
.
list
.
count
;
for
(
int
qosIdx
=
0
;
qosIdx
<
pdusessionTransfer_ies
->
value
.
choice
.
QosFlowSetupRequestList
.
list
.
count
;
qosIdx
++
){
qosFlowItem_p
=
pdusessionTransfer_ies
->
value
.
choice
.
QosFlowSetupRequestList
.
list
.
array
[
qosIdx
];
/* Set the QOS informations */
NGAP_PDUSESSION_SETUP_REQ(message_p).pdusession_setup_params[i].qos.qci = item_p->e_RABlevelQoSParameters.qCI;
NGAP_PDUSESSION_SETUP_REQ(message_p).pdusession_setup_params[i].qos.allocation_retention_priority.priority_level =
item_p->e_RABlevelQoSParameters.allocationRetentionPriority.priorityLevel;
NGAP_PDUSESSION_SETUP_REQ(message_p).pdusession_setup_params[i].qos.allocation_retention_priority.pre_emp_capability =
item_p->e_RABlevelQoSParameters.allocationRetentionPriority.pre_emptionCapability;
NGAP_PDUSESSION_SETUP_REQ(message_p).pdusession_setup_params[i].qos.allocation_retention_priority.pre_emp_vulnerability =
item_p->e_RABlevelQoSParameters.allocationRetentionPriority.pre_emptionVulnerability;
} /* for i... */
NGAP_INITIAL_CONTEXT_SETUP_REQ
(
message_p
).
pdusession_param
[
i
].
qos
[
qosIdx
].
qci
=
(
uint8_t
)
qosFlowItem_p
->
qosFlowIdentifier
;
NGAP_INITIAL_CONTEXT_SETUP_REQ
(
message_p
).
pdusession_param
[
i
].
qos
[
qosIdx
].
allocation_retention_priority
.
priority_level
=
qosFlowItem_p
->
qosFlowLevelQosParameters
.
allocationAndRetentionPriority
.
priorityLevelARP
;
NGAP_INITIAL_CONTEXT_SETUP_REQ
(
message_p
).
pdusession_param
[
i
].
qos
[
qosIdx
].
allocation_retention_priority
.
pre_emp_capability
=
qosFlowItem_p
->
qosFlowLevelQosParameters
.
allocationAndRetentionPriority
.
pre_emptionCapability
;
NGAP_INITIAL_CONTEXT_SETUP_REQ
(
message_p
).
pdusession_param
[
i
].
qos
[
qosIdx
].
allocation_retention_priority
.
pre_emp_vulnerability
=
qosFlowItem_p
->
qosFlowLevelQosParameters
.
allocationAndRetentionPriority
.
pre_emptionVulnerability
;
}
}
break
;
/* optional CommonNetworkInstance */
case
NGAP_ProtocolIE_ID_id_CommonNetworkInstance
:
break
;
default:
NGAP_ERROR
(
"could not found protocolIEs id %ld
\n
"
,
pdusessionTransfer_ies
->
id
);
return
-
1
;
}
}
/* for j... */
}
/* for i... */
itti_send_msg_to_task
(
TASK_RRC_GNB
,
ue_desc_p
->
gNB_instance
->
instance
,
message_p
);
} else {
}
else
{
/* ie == NULL */
NGAP_ERROR
(
"could not found NGAP_ProtocolIE_ID_id_PDUSessionResourceSetupListSUReq
\n
"
);
return
-
1
;
}
#endif
return
0
;
}
static
int
ngap_gNB_handle_paging
(
uint32_t
assoc_id
,
uint32_t
stream
,
...
...
openair3/NGAP/ngap_gNB_nas_procedures.c
View file @
b84880a1
...
...
@@ -951,15 +951,16 @@ int ngap_gNB_pdusession_setup_resp(instance_t instance,
ngap_pdusession_setup_resp_t
*
pdusession_setup_resp_p
)
//------------------------------------------------------------------------------
{
#if 0
ngap_gNB_instance_t
*
ngap_gNB_instance_p
=
NULL
;
struct
ngap_gNB_ue_context_s
*
ue_context_p
=
NULL
;
NGAP_NGAP_PDU_t
pdu
;
NGAP_PDUS
ESSION
SetupResponse_t *out;
NGAP_PDUS
ESSION
SetupResponseIEs_t *ie;
NGAP_PDUS
essionResource
SetupResponse_t
*
out
;
NGAP_PDUS
essionResource
SetupResponseIEs_t
*
ie
;
uint8_t
*
buffer
=
NULL
;
uint32_t
length
;
int
i
;
asn_encode_to_new_buffer_result_t
res
=
{
NULL
,
{
0
,
NULL
,
NULL
}
};
/* Retrieve the NGAP gNB instance associated with Mod_id */
ngap_gNB_instance_p
=
ngap_gNB_get_instance
(
instance
);
DevAssert
(
pdusession_setup_resp_p
!=
NULL
);
...
...
@@ -987,96 +988,133 @@ int ngap_gNB_pdusession_setup_resp(instance_t instance,
/* Prepare the NGAP message to encode */
memset
(
&
pdu
,
0
,
sizeof
(
pdu
));
pdu
.
present
=
NGAP_NGAP_PDU_PR_successfulOutcome
;
pdu.choice.successfulOutcome.procedureCode = NGAP_ProcedureCode_id_PDUS
ESSIONModify
;
pdu
.
choice
.
successfulOutcome
.
procedureCode
=
NGAP_ProcedureCode_id_PDUS
essionResourceSetup
;
pdu
.
choice
.
successfulOutcome
.
criticality
=
NGAP_Criticality_reject
;
pdu.choice.successfulOutcome.value.present = NGAP_SuccessfulOutcome__value_PR_PDUS
ESSION
SetupResponse;
out = &pdu.choice.successfulOutcome.value.choice.PDUS
ESSION
SetupResponse;
pdu
.
choice
.
successfulOutcome
.
value
.
present
=
NGAP_SuccessfulOutcome__value_PR_PDUS
essionResource
SetupResponse
;
out
=
&
pdu
.
choice
.
successfulOutcome
.
value
.
choice
.
PDUS
essionResource
SetupResponse
;
/* mandatory */
ie = (NGAP_PDUS
ESSIONSetupResponseIEs_t *)calloc(1, sizeof(NGAP_PDUSESSION
SetupResponseIEs_t));
ie
=
(
NGAP_PDUS
essionResourceSetupResponseIEs_t
*
)
calloc
(
1
,
sizeof
(
NGAP_PDUSessionResource
SetupResponseIEs_t
));
ie
->
id
=
NGAP_ProtocolIE_ID_id_AMF_UE_NGAP_ID
;
ie
->
criticality
=
NGAP_Criticality_ignore
;
ie->value.present = NGAP_PDUSESSIONSetupResponseIEs__value_PR_AMF_UE_NGAP_ID;
ie->value.choice.AMF_UE_NGAP_ID = ue_context_p->amf_ue_ngap_id;
ie
->
value
.
present
=
NGAP_PDUSessionResourceSetupResponseIEs__value_PR_AMF_UE_NGAP_ID
;
asn_uint642INTEGER
(
&
ie
->
value
.
choice
.
AMF_UE_NGAP_ID
,
ue_context_p
->
amf_ue_ngap_id
);
//ie->value.choice.AMF_UE_NGAP_ID = ue_context_p->amf_ue_ngap_id;
asn_uint642INTEGER
(
&
ie
->
value
.
choice
.
AMF_UE_NGAP_ID
,
ue_context_p
->
amf_ue_ngap_id
);
ASN_SEQUENCE_ADD
(
&
out
->
protocolIEs
.
list
,
ie
);
/* mandatory */
ie = (NGAP_PDUS
ESSIONSetupResponseIEs_t *)calloc(1, sizeof(NGAP_PDUSESSION
SetupResponseIEs_t));
ie->id = NGAP_ProtocolIE_ID_id_
gNB
_UE_NGAP_ID;
ie
=
(
NGAP_PDUS
essionResourceSetupResponseIEs_t
*
)
calloc
(
1
,
sizeof
(
NGAP_PDUSessionResource
SetupResponseIEs_t
));
ie
->
id
=
NGAP_ProtocolIE_ID_id_
RAN
_UE_NGAP_ID
;
ie
->
criticality
=
NGAP_Criticality_ignore
;
ie->value.present = NGAP_PDUS
ESSIONSetupResponseIEs__value_PR_GNB
_UE_NGAP_ID;
ie->value.choice.
GNB
_UE_NGAP_ID = pdusession_setup_resp_p->gNB_ue_ngap_id;
ie
->
value
.
present
=
NGAP_PDUS
essionResourceSetupResponseIEs__value_PR_RAN
_UE_NGAP_ID
;
ie
->
value
.
choice
.
RAN
_UE_NGAP_ID
=
pdusession_setup_resp_p
->
gNB_ue_ngap_id
;
ASN_SEQUENCE_ADD
(
&
out
->
protocolIEs
.
list
,
ie
);
/* optional */
if
(
pdusession_setup_resp_p
->
nb_of_pdusessions
>
0
)
{
ie = (NGAP_PDUS
ESSIONSetupResponseIEs_t *)calloc(1, sizeof(NGAP_PDUSESSION
SetupResponseIEs_t));
ie->id = NGAP_ProtocolIE_ID_id_PDUS
ESSIONSetupListBearer
SURes;
ie
=
(
NGAP_PDUS
essionResourceSetupResponseIEs_t
*
)
calloc
(
1
,
sizeof
(
NGAP_PDUSessionResource
SetupResponseIEs_t
));
ie
->
id
=
NGAP_ProtocolIE_ID_id_PDUS
essionResourceSetupList
SURes
;
ie
->
criticality
=
NGAP_Criticality_ignore
;
ie->value.present = NGAP_PDUS
ESSIONSetupResponseIEs__value_PR_PDUSESSIONSetupListBearer
SURes;
ie
->
value
.
present
=
NGAP_PDUS
essionResourceSetupResponseIEs__value_PR_PDUSessionResourceSetupList
SURes
;
for
(
i
=
0
;
i
<
pdusession_setup_resp_p
->
nb_of_pdusessions
;
i
++
)
{
NGAP_PDUSESSIONSetupItemBearerSUResIEs_t *item;
NGAP_PDUSessionResourceSetupItemSURes_t
*
item
;
NGAP_PDUSessionResourceSetupResponseTransfer_t
*
pdusessionTransfer_p
=
NULL
;
/* mandatory */
item = (NGAP_PDUSESSIONSetupItemBearerSUResIEs_t *)calloc(1, sizeof(NGAP_PDUSESSIONSetupItemBearerSUResIEs_t));
item->id = NGAP_ProtocolIE_ID_id_PDUSESSIONSetupItemBearerSURes;
item->criticality = NGAP_Criticality_ignore;
item->value.present = NGAP_PDUSESSIONSetupItemBearerSUResIEs__value_PR_PDUSESSIONSetupItemBearerSURes;
item->value.choice.PDUSESSIONSetupItemBearerSURes.e_RAB_ID = pdusession_setup_resp_p->pdusessions[i].pdusession_id;
GTP_TEID_TO_ASN1(pdusession_setup_resp_p->pdusessions[i].gtp_teid, &item->value.choice.PDUSESSIONSetupItemBearerSURes.gTP_TEID);
item->value.choice.PDUSESSIONSetupItemBearerSURes.transportLayerAddress.buf = malloc(pdusession_setup_resp_p->pdusessions[i].gNB_addr.length);
memcpy(item->value.choice.PDUSESSIONSetupItemBearerSURes.transportLayerAddress.buf,
item
=
(
NGAP_PDUSessionResourceSetupItemSURes_t
*
)
calloc
(
1
,
sizeof
(
NGAP_PDUSessionResourceSetupItemSURes_t
));
/* pDUSessionID */
item
->
pDUSessionID
=
pdusession_setup_resp_p
->
pdusessions
[
i
].
pdusession_id
;
/* dLQosFlowPerTNLInformation */
pdusessionTransfer_p
=
(
NGAP_PDUSessionResourceSetupResponseTransfer_t
*
)
calloc
(
1
,
sizeof
(
NGAP_PDUSessionResourceSetupResponseTransfer_t
));
pdusessionTransfer_p
->
dLQosFlowPerTNLInformation
.
uPTransportLayerInformation
.
present
=
NGAP_UPTransportLayerInformation_PR_gTPTunnel
;
GTP_TEID_TO_ASN1
(
pdusession_setup_resp_p
->
pdusessions
[
i
].
gtp_teid
,
&
pdusessionTransfer_p
->
dLQosFlowPerTNLInformation
.
uPTransportLayerInformation
.
choice
.
gTPTunnel
.
gTP_TEID
);
pdusessionTransfer_p
->
dLQosFlowPerTNLInformation
.
uPTransportLayerInformation
.
choice
.
gTPTunnel
.
transportLayerAddress
.
buf
=
malloc
(
pdusession_setup_resp_p
->
pdusessions
[
i
].
gNB_addr
.
length
);
memcpy
(
pdusessionTransfer_p
->
dLQosFlowPerTNLInformation
.
uPTransportLayerInformation
.
choice
.
gTPTunnel
.
transportLayerAddress
.
buf
,
pdusession_setup_resp_p
->
pdusessions
[
i
].
gNB_addr
.
buffer
,
pdusession_setup_resp_p
->
pdusessions
[
i
].
gNB_addr
.
length
);
item->value.choice.PDUSESSIONSetupItemBearerSURes.transportLayerAddress.size = pdusession_setup_resp_p->pdusessions[i].gNB_addr.length;
item->value.choice.PDUSESSIONSetupItemBearerSURes.transportLayerAddress.bits_unused = 0;
NGAP_DEBUG("pdusession_setup_resp: pdusession ID %ld, teid %u, enb_addr %d.%d.%d.%d, SIZE %ld\n",
item->value.choice.PDUSESSIONSetupItemBearerSURes.e_RAB_ID,
pdusession_setup_resp_p->pdusessions[i].gtp_teid,
item->value.choice.PDUSESSIONSetupItemBearerSURes.transportLayerAddress.buf[0],
item->value.choice.PDUSESSIONSetupItemBearerSURes.transportLayerAddress.buf[1],
item->value.choice.PDUSESSIONSetupItemBearerSURes.transportLayerAddress.buf[2],
item->value.choice.PDUSESSIONSetupItemBearerSURes.transportLayerAddress.buf[3],
item->value.choice.PDUSESSIONSetupItemBearerSURes.transportLayerAddress.size);
ASN_SEQUENCE_ADD(&ie->value.choice.PDUSESSIONSetupListBearerSURes.list, item);
pdusessionTransfer_p
->
dLQosFlowPerTNLInformation
.
uPTransportLayerInformation
.
choice
.
gTPTunnel
.
transportLayerAddress
.
size
=
pdusession_setup_resp_p
->
pdusessions
[
i
].
gNB_addr
.
length
;
pdusessionTransfer_p
->
dLQosFlowPerTNLInformation
.
uPTransportLayerInformation
.
choice
.
gTPTunnel
.
transportLayerAddress
.
bits_unused
=
0
;
NGAP_DEBUG
(
"pdusession_setup_resp_p: pdusession ID %ld, gnb_addr %d.%d.%d.%d, SIZE %ld
\n
"
,
item
->
pDUSessionID
,
pdusessionTransfer_p
->
dLQosFlowPerTNLInformation
.
uPTransportLayerInformation
.
choice
.
gTPTunnel
.
transportLayerAddress
.
buf
[
0
],
pdusessionTransfer_p
->
dLQosFlowPerTNLInformation
.
uPTransportLayerInformation
.
choice
.
gTPTunnel
.
transportLayerAddress
.
buf
[
1
],
pdusessionTransfer_p
->
dLQosFlowPerTNLInformation
.
uPTransportLayerInformation
.
choice
.
gTPTunnel
.
transportLayerAddress
.
buf
[
2
],
pdusessionTransfer_p
->
dLQosFlowPerTNLInformation
.
uPTransportLayerInformation
.
choice
.
gTPTunnel
.
transportLayerAddress
.
buf
[
3
],
pdusessionTransfer_p
->
dLQosFlowPerTNLInformation
.
uPTransportLayerInformation
.
choice
.
gTPTunnel
.
transportLayerAddress
.
size
);
/* associatedQosFlowList. number of 1? */
for
(
int
j
=
0
;
j
<
pdusession_setup_resp_p
->
pdusessions
[
i
].
nb_of_qos_flow
;
j
++
)
{
NGAP_AssociatedQosFlowItem_t
*
ass_qos_item_p
;
ass_qos_item_p
=
(
NGAP_AssociatedQosFlowItem_t
*
)
calloc
(
1
,
sizeof
(
NGAP_AssociatedQosFlowItem_t
));
/* qosFlowIdentifier */
ass_qos_item_p
->
qosFlowIdentifier
=
pdusession_setup_resp_p
->
pdusessions
[
i
].
associated_qos_flows
[
j
].
qci
;
/* qosFlowMappingIndication */
if
(
pdusession_setup_resp_p
->
pdusessions
[
i
].
associated_qos_flows
[
j
].
qos_flow_mapping_ind
!=
QOSFLOW_MAPPING_INDICATION_NON
)
{
ass_qos_item_p
->
qosFlowMappingIndication
=
malloc
(
sizeof
(
*
ass_qos_item_p
->
qosFlowMappingIndication
));
*
ass_qos_item_p
->
qosFlowMappingIndication
=
pdusession_setup_resp_p
->
pdusessions
[
i
].
associated_qos_flows
[
j
].
qos_flow_mapping_ind
;
}
ASN_SEQUENCE_ADD
(
&
pdusessionTransfer_p
->
dLQosFlowPerTNLInformation
.
associatedQosFlowList
.
list
,
ass_qos_item_p
);
}
memset
(
&
res
,
0
,
sizeof
(
res
));
res
=
asn_encode_to_new_buffer
(
NULL
,
ATS_ALIGNED_CANONICAL_PER
,
&
asn_DEF_NGAP_PDUSessionResourceSetupResponseTransfer
,
pdusessionTransfer_p
);
item
->
pDUSessionResourceSetupResponseTransfer
.
buf
=
res
.
buffer
;
item
->
pDUSessionResourceSetupResponseTransfer
.
size
=
res
.
result
.
encoded
;
ASN_STRUCT_FREE_CONTENTS_ONLY
(
asn_DEF_NGAP_PDUSessionResourceSetupResponseTransfer
,
pdusessionTransfer_p
);
ASN_SEQUENCE_ADD
(
&
ie
->
value
.
choice
.
PDUSessionResourceSetupListSURes
.
list
,
item
);
}
ASN_SEQUENCE_ADD
(
&
out
->
protocolIEs
.
list
,
ie
);
}
/* optional */
if
(
pdusession_setup_resp_p
->
nb_of_pdusessions_failed
>
0
)
{
ie = (NGAP_PDUS
ESSIONSetupResponseIEs_t *)calloc(1, sizeof(NGAP_PDUSESSIONSetupResponseIE
s_t));
ie->id = NGAP_ProtocolIE_ID_id_PDUS
ESSIONFailedToSetupListBearer
SURes;
ie
=
(
NGAP_PDUS
essionResourceFailedToSetupListSURes_t
*
)
calloc
(
1
,
sizeof
(
NGAP_PDUSessionResourceFailedToSetupListSURe
s_t
));
ie
->
id
=
NGAP_ProtocolIE_ID_id_PDUS
essionResourceFailedToSetupList
SURes
;
ie
->
criticality
=
NGAP_Criticality_ignore
;
ie->value.present = NGAP_PDUS
ESSIONSetupResponseIEs__value_PR_PDUSESSIONList
;
ie
->
value
.
present
=
NGAP_PDUS
essionResourceSetupResponseIEs__value_PR_PDUSessionResourceFailedToSetupListSURes
;
for
(
i
=
0
;
i
<
pdusession_setup_resp_p
->
nb_of_pdusessions_failed
;
i
++
)
{
NGAP_PDUSESSIONItemIEs_t *item;
item = (NGAP_PDUSESSIONItemIEs_t *)calloc(1, sizeof(NGAP_PDUSESSIONItemIEs_t));
item->id = NGAP_ProtocolIE_ID_id_PDUSESSIONItem;
item->criticality = NGAP_Criticality_ignore;
item->value.present = NGAP_PDUSESSIONItemIEs__value_PR_PDUSESSIONItem;
item->value.choice.PDUSESSIONItem.e_RAB_ID = pdusession_setup_resp_p->pdusessions_failed[i].pdusession_id;
item->value.choice.PDUSESSIONItem.cause.present = pdusession_setup_resp_p->pdusessions_failed[i].cause;
NGAP_PDUSessionResourceFailedToSetupItemSURes_t
*
item
;
NGAP_PDUSessionResourceSetupUnsuccessfulTransfer_t
*
pdusessionUnTransfer_p
=
NULL
;
switch(item->value.choice.PDUSESSIONItem.cause.present) {
/* mandatory */
item
=
(
NGAP_PDUSessionResourceFailedToSetupItemSURes_t
*
)
calloc
(
1
,
sizeof
(
NGAP_PDUSessionResourceFailedToSetupItemSURes_t
));
/* pDUSessionID */
item
->
pDUSessionID
=
pdusession_setup_resp_p
->
pdusessions_failed
[
i
].
pdusession_id
;
/* cause */
pdusessionUnTransfer_p
=
(
NGAP_PDUSessionResourceSetupUnsuccessfulTransfer_t
*
)
calloc
(
1
,
sizeof
(
NGAP_PDUSessionResourceSetupUnsuccessfulTransfer_t
));
pdusessionUnTransfer_p
->
cause
.
present
=
pdusession_setup_resp_p
->
pdusessions_failed
[
i
].
cause
;
switch
(
pdusessionUnTransfer_p
->
cause
.
present
)
{
case
NGAP_Cause_PR_radioNetwork
:
item->value.choice.PDUSESSIONItem.
cause.choice.radioNetwork = pdusession_setup_resp_p->pdusessions_failed[i].cause_value;
pdusessionUnTransfer_p
->
cause
.
choice
.
radioNetwork
=
pdusession_setup_resp_p
->
pdusessions_failed
[
i
].
cause_value
;
break
;
case
NGAP_Cause_PR_transport
:
item->value.choice.PDUSESSIONItem.
cause.choice.transport = pdusession_setup_resp_p->pdusessions_failed[i].cause_value;
pdusessionUnTransfer_p
->
cause
.
choice
.
transport
=
pdusession_setup_resp_p
->
pdusessions_failed
[
i
].
cause_value
;
break
;
case
NGAP_Cause_PR_nas
:
item->value.choice.PDUSESSIONItem.
cause.choice.nas = pdusession_setup_resp_p->pdusessions_failed[i].cause_value;
pdusessionUnTransfer_p
->
cause
.
choice
.
nas
=
pdusession_setup_resp_p
->
pdusessions_failed
[
i
].
cause_value
;
break
;
case
NGAP_Cause_PR_protocol
:
item->value.choice.PDUSESSIONItem.
cause.choice.protocol = pdusession_setup_resp_p->pdusessions_failed[i].cause_value;
pdusessionUnTransfer_p
->
cause
.
choice
.
protocol
=
pdusession_setup_resp_p
->
pdusessions_failed
[
i
].
cause_value
;
break
;
case
NGAP_Cause_PR_misc
:
item->value.choice.PDUSESSIONItem.
cause.choice.misc = pdusession_setup_resp_p->pdusessions_failed[i].cause_value;
pdusessionUnTransfer_p
->
cause
.
choice
.
misc
=
pdusession_setup_resp_p
->
pdusessions_failed
[
i
].
cause_value
;
break
;
case
NGAP_Cause_PR_NOTHING
:
...
...
@@ -1084,8 +1122,16 @@ int ngap_gNB_pdusession_setup_resp(instance_t instance,
break
;
}
NGAP_DEBUG("pdusession_modify_resp: failed pdusession ID %ld\n", item->value.choice.PDUSESSIONItem.e_RAB_ID);
ASN_SEQUENCE_ADD(&ie->value.choice.PDUSESSIONList.list, item);
NGAP_DEBUG
(
"pdusession setup response: failed pdusession ID %ld
\n
"
,
item
->
pDUSessionID
);
memset
(
&
res
,
0
,
sizeof
(
res
));
res
=
asn_encode_to_new_buffer
(
NULL
,
ATS_ALIGNED_CANONICAL_PER
,
&
asn_DEF_NGAP_PDUSessionResourceSetupUnsuccessfulTransfer
,
pdusessionUnTransfer_p
);
item
->
pDUSessionResourceSetupUnsuccessfulTransfer
.
buf
=
res
.
buffer
;
item
->
pDUSessionResourceSetupUnsuccessfulTransfer
.
size
=
res
.
result
.
encoded
;
ASN_STRUCT_FREE_CONTENTS_ONLY
(
asn_DEF_NGAP_PDUSessionResourceSetupUnsuccessfulTransfer
,
pdusessionUnTransfer_p
);
ASN_SEQUENCE_ADD
(
&
ie
->
value
.
choice
.
PDUSessionResourceFailedToSetupListSURes
.
list
,
item
);
}
ASN_SEQUENCE_ADD
(
&
out
->
protocolIEs
.
list
,
ie
);
...
...
@@ -1093,10 +1139,10 @@ int ngap_gNB_pdusession_setup_resp(instance_t instance,
/* optional */
if
(
0
)
{
ie = (NGAP_PDUS
ESSIONSetupResponseIEs_t *)calloc(1, sizeof(NGAP_PDUSESSION
SetupResponseIEs_t));
ie
=
(
NGAP_PDUS
essionResourceSetupResponseIEs_t
*
)
calloc
(
1
,
sizeof
(
NGAP_PDUSessionResource
SetupResponseIEs_t
));
ie
->
id
=
NGAP_ProtocolIE_ID_id_CriticalityDiagnostics
;
ie
->
criticality
=
NGAP_Criticality_ignore
;
ie->value.present = NGAP_PDUS
ESSION
SetupResponseIEs__value_PR_CriticalityDiagnostics;
ie
->
value
.
present
=
NGAP_PDUS
essionResource
SetupResponseIEs__value_PR_CriticalityDiagnostics
;
// ie->value.choice.CriticalityDiagnostics = ;
ASN_SEQUENCE_ADD
(
&
out
->
protocolIEs
.
list
,
ie
);
}
...
...
@@ -1128,7 +1174,6 @@ int ngap_gNB_pdusession_setup_resp(instance_t instance,
ngap_gNB_itti_send_sctp_data_req
(
ngap_gNB_instance_p
->
instance
,
ue_context_p
->
amf_ref
->
assoc_id
,
buffer
,
length
,
ue_context_p
->
tx_stream
);
#endif
return
0
;
}
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment