Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
O
OpenXG-AMF
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
1
Issues
1
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Operations
Operations
Metrics
Environments
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
OpenXG-AMF
Commits
aaf92983
Commit
aaf92983
authored
Sep 15, 2022
by
Tien Thinh NGUYEN
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Code refactor for Handover Required
parent
73f7219d
Changes
8
Hide whitespace changes
Inline
Side-by-side
Showing
8 changed files
with
106 additions
and
88 deletions
+106
-88
src/amf-app/amf_n2.cpp
src/amf-app/amf_n2.cpp
+43
-39
src/ngap/ngapIEs/PDUSessionResourceItem.cpp
src/ngap/ngapIEs/PDUSessionResourceItem.cpp
+12
-0
src/ngap/ngapIEs/PDUSessionResourceItem.hpp
src/ngap/ngapIEs/PDUSessionResourceItem.hpp
+6
-4
src/ngap/ngapIEs/PDUSessionResourceListHORqd.cpp
src/ngap/ngapIEs/PDUSessionResourceListHORqd.cpp
+17
-20
src/ngap/ngapIEs/PDUSessionResourceListHORqd.hpp
src/ngap/ngapIEs/PDUSessionResourceListHORqd.hpp
+6
-10
src/ngap/ngapMsgs/HandoverRequestAck.hpp
src/ngap/ngapMsgs/HandoverRequestAck.hpp
+2
-2
src/ngap/ngapMsgs/HandoverRequiredMsg.cpp
src/ngap/ngapMsgs/HandoverRequiredMsg.cpp
+10
-11
src/ngap/ngapMsgs/HandoverRequiredMsg.hpp
src/ngap/ngapMsgs/HandoverRequiredMsg.hpp
+10
-2
No files found.
src/amf-app/amf_n2.cpp
View file @
aaf92983
...
...
@@ -1485,20 +1485,23 @@ bool amf_n2::handle_itti_message(itti_handover_required& itti_msg) {
"Handover Required, Choice of Cause %d, Cause %ld"
,
(
int
)
itti_msg
.
handoverReq
->
getChoiceOfCause
(),
itti_msg
.
handoverReq
->
getCauseValue
());
Logger
::
amf_n2
().
debug
(
"Handover Required, DirectForwardingPathAvailability %d"
,
itti_msg
.
handoverReq
->
getDirectForwardingPathAvailability
());
long
direct_forward_path_availability
=
{};
if
(
itti_msg
.
handoverReq
->
getDirectForwardingPathAvailability
(
direct_forward_path_availability
))
Logger
::
amf_n2
().
debug
(
"Handover Required, DirectForwardingPathAvailability %ld"
,
direct_forward_path_availability
);
unc
->
gnb_assoc_id
=
itti_msg
.
assoc_id
;
unc
->
ncc
++
;
unc
->
ng_ue_state
=
NGAP_UE_HANDOVER
;
GlobalgNBId
TargetGlobalgNBI
d
=
{};
TAI
tai
=
{};
itti_msg
.
handoverReq
->
getTargetID
(
TargetGlobalgNBI
d
,
tai
);
GlobalgNBId
target_global_gnb_i
d
=
{};
TAI
tai
=
{};
itti_msg
.
handoverReq
->
getTargetID
(
target_global_gnb_i
d
,
tai
);
ngap
::
PlmnId
plmn
=
{};
GNB_ID
gnbid
=
{};
TargetGlobalgNBI
d
.
get
(
plmn
,
gnbid
);
target_global_gnb_i
d
.
get
(
plmn
,
gnbid
);
std
::
string
mcc
=
{};
std
::
string
mnc
=
{};
plmn
.
getMcc
(
mcc
);
...
...
@@ -1511,16 +1514,16 @@ bool amf_n2::handle_itti_message(itti_handover_required& itti_msg) {
"gNBId 0x%x)"
,
mcc
.
c_str
(),
mnc
.
c_str
(),
gnb_id_value
);
string
mcc
SelectTAI
=
{};
string
mnc
SelectTAI
=
{};
uint32_t
tac
=
{};
string
mcc
_select_tai
=
{};
string
mnc
_select_tai
=
{};
uint32_t
tac
=
{};
tai
.
getTAI
(
mcc
SelectTAI
,
mncSelectTAI
,
tac
);
tai
.
getTAI
(
mcc
_select_tai
,
mnc_select_tai
,
tac
);
Logger
::
amf_n2
().
debug
(
"Handover Required: Target ID selected TAI PLMN (MCC %s, MNC %s, TAC %x)"
,
mcc
SelectTAI
.
c_str
(),
mncSelectTAI
.
c_str
(),
tac
);
mcc
_select_tai
.
c_str
(),
mnc_select_tai
.
c_str
(),
tac
);
OCTET_STRING_t
source
To
target
=
OCTET_STRING_t
source
_to_
target
=
itti_msg
.
handoverReq
->
getSourceToTarget_TransparentContainer
();
// TODO: T-AMF selection, for now use the same AMF
...
...
@@ -1538,26 +1541,26 @@ bool amf_n2::handle_itti_message(itti_handover_required& itti_msg) {
handover_request
->
setUESecurityCapabilities
(
0xe000
,
0xe000
,
0xe000
,
0xe000
);
// TODO: remove hardcoded values
handover_request
->
setSourceToTarget_TransparentContainer
(
source
To
target
);
handover_request
->
setSourceToTarget_TransparentContainer
(
source
_to_
target
);
// Allowed NSSAI
std
::
vector
<
S_NSSAI
>
Allowed_N
ssai
;
std
::
vector
<
S_NSSAI
>
allowed_n
ssai
;
for
(
int
i
=
0
;
i
<
amf_cfg
.
plmn_list
.
size
();
i
++
)
{
for
(
int
j
=
0
;
j
<
amf_cfg
.
plmn_list
[
i
].
slice_list
.
size
();
j
++
)
{
S_Nssai
s_tmp
;
S_NSSAI
s_nssai
=
{};
s_nssai
.
setSst
(
amf_cfg
.
plmn_list
[
i
].
slice_list
[
j
].
sst
);
s_nssai
.
setSd
(
amf_cfg
.
plmn_list
[
i
].
slice_list
[
j
].
sd
);
Allowed_N
ssai
.
push_back
(
s_nssai
);
allowed_n
ssai
.
push_back
(
s_nssai
);
}
}
handover_request
->
setAllowedNSSAI
(
Allowed_N
ssai
);
handover_request
->
setAllowedNSSAI
(
allowed_n
ssai
);
// GUAMI, PLMN
ngap
::
PlmnId
m_plmnI
d
=
{};
m_plmnI
d
.
set
(
amf_cfg
.
guami
.
mcc
,
amf_cfg
.
guami
.
mnc
);
ngap
::
PlmnId
plmn_i
d
=
{};
plmn_i
d
.
set
(
amf_cfg
.
guami
.
mcc
,
amf_cfg
.
guami
.
mnc
);
handover_request
->
setMobilityRestrictionList
(
m_plmnI
d
);
handover_request
->
setMobilityRestrictionList
(
plmn_i
d
);
handover_request
->
setGUAMI
(
amf_cfg
.
guami
.
mcc
,
amf_cfg
.
guami
.
mnc
,
amf_cfg
.
guami
.
regionID
,
amf_cfg
.
guami
.
AmfSetID
,
amf_cfg
.
guami
.
AmfPointer
);
...
...
@@ -1599,23 +1602,24 @@ bool amf_n2::handle_itti_message(itti_handover_required& itti_msg) {
"Decoding PDU Session Resource List IE error or IE missing"
);
}
std
::
vector
<
PDUSessionResourceItem
HORqd
>
itemHORqdL
ist
;
pDUSessionResourceListHORqd
.
get
PDUSessionResourceListHORqd
(
itemHORqdL
ist
);
std
::
vector
<
PDUSessionResourceItem
>
item_ho_required_l
ist
;
pDUSessionResourceListHORqd
.
get
(
item_ho_required_l
ist
);
std
::
map
<
uint8_t
,
boost
::
shared_future
<
std
::
string
>>
curl_responses
;
// Send PDUSessionUpdateSMContextRequest to SMF for all PDU sessions included
// in HO Required message
for
(
auto
&
item
:
item
HORqdL
ist
)
{
PDUSessionID
p
DUSessionID
=
{};
OCTET_STRING_t
handover
RequiredT
ransfer
=
{};
item
.
get
PDUSessionResourceItemHORqd
(
pDUSessionID
,
handoverRequiredT
ransfer
);
uint8_t
pdu
SessionIDV
alue
=
0
;
p
DUSessionID
.
get
(
pduSessionIDV
alue
);
Logger
::
ngap
().
debug
(
"PDU Session ID %d"
,
pdu
SessionIDV
alue
);
for
(
auto
&
item
:
item
_ho_required_l
ist
)
{
PDUSessionID
p
du_session_id
=
{};
OCTET_STRING_t
handover
_required_t
ransfer
=
{};
item
.
get
(
pdu_session_id
,
handover_required_t
ransfer
);
uint8_t
pdu
_session_id_v
alue
=
0
;
p
du_session_id
.
get
(
pdu_session_id_v
alue
);
Logger
::
ngap
().
debug
(
"PDU Session ID %d"
,
pdu
_session_id_v
alue
);
std
::
shared_ptr
<
pdu_session_context
>
psc
=
{};
if
(
amf_app_inst
->
find_pdu_session_context
(
supi
,
pduSessionIDValue
,
psc
))
{
if
(
amf_app_inst
->
find_pdu_session_context
(
supi
,
pdu_session_id_value
,
psc
))
{
// Generate a promise and associate this promise to the curl handle
uint32_t
promise_id
=
amf_app_inst
->
generate_promise_id
();
Logger
::
amf_n2
().
debug
(
"Promise ID generated %d"
,
promise_id
);
...
...
@@ -1634,9 +1638,9 @@ bool amf_n2::handle_itti_message(itti_handover_required& itti_msg) {
std
::
make_shared
<
itti_nsmf_pdusession_update_sm_context
>
(
TASK_NGAP
,
TASK_AMF_SBI
);
itti_msg
->
pdu_session_id
=
pdu
SessionIDV
alue
;
itti_msg
->
n2sm
=
blk2bstr
(
handoverRequiredTransfer
.
buf
,
handoverRequiredT
ransfer
.
size
);
itti_msg
->
pdu_session_id
=
pdu
_session_id_v
alue
;
itti_msg
->
n2sm
=
blk2bstr
(
handover_required_transfer
.
buf
,
handover_required_t
ransfer
.
size
);
itti_msg
->
is_n2sm_set
=
true
;
itti_msg
->
n2sm_info_type
=
"HANDOVER_REQUIRED"
;
itti_msg
->
ho_state
=
"PREPARING"
;
...
...
@@ -1839,20 +1843,20 @@ void amf_n2::handle_itti_message(itti_handover_request_Ack& itti_msg) {
"Got result for PDU Session ID %d"
,
curl_responses
.
begin
()
->
first
);
if
(
n2_sm
.
size
()
>
0
)
{
result
=
result
&&
true
;
uint8_t
pdu
SessionIDValue
=
curl_responses
.
begin
()
->
first
;
uint8_t
pdu
_session_id_value
=
curl_responses
.
begin
()
->
first
;
unsigned
int
data_len
=
n2_sm
.
length
();
PDUSessionID
p
DUSessionID
=
{};
PDUSessionID
p
du_session_id
=
{};
OCTET_STRING_t
handoverCommandTransfer
=
{};
p
DUSessionID
.
set
(
pduSessionIDV
alue
);
p
du_session_id
.
set
(
pdu_session_id_v
alue
);
OCTET_STRING_fromBuf
(
&
handoverCommandTransfer
,
n2_sm
.
c_str
(),
n2_sm
.
length
());
handoverItem
.
set
(
p
DUSessionID
,
handoverCommandTransfer
);
handoverItem
.
set
(
p
du_session_id
,
handoverCommandTransfer
);
handoverItemList
.
push_back
(
handoverItem
);
handoverList
.
set
(
handoverItemList
);
std
::
shared_ptr
<
pdu_session_context
>
psc
=
{};
if
(
amf_app_inst
->
find_pdu_session_context
(
supi
,
pdu
SessionIDV
alue
,
psc
))
{
supi
,
pdu
_session_id_v
alue
,
psc
))
{
psc
->
is_ho_accepted
=
true
;
}
}
else
{
...
...
src/ngap/ngapIEs/PDUSessionResourceItem.cpp
View file @
aaf92983
...
...
@@ -75,6 +75,18 @@ bool PDUSessionResourceItem::decode(
item
->
pDUSessionID
,
item
->
pDUSessionResourceSetupResponseTransfer
);
}
//------------------------------------------------------------------------------
bool
PDUSessionResourceItem
::
encode
(
Ngap_PDUSessionResourceItemHORqd_t
*
item
)
const
{
return
encode
(
item
->
pDUSessionID
,
item
->
handoverRequiredTransfer
);
}
//------------------------------------------------------------------------------
bool
PDUSessionResourceItem
::
decode
(
const
Ngap_PDUSessionResourceItemHORqd_t
*
const
item
)
{
return
decode
(
item
->
pDUSessionID
,
item
->
handoverRequiredTransfer
);
}
//------------------------------------------------------------------------------
bool
PDUSessionResourceItem
::
encode
(
Ngap_PDUSessionResourceHandoverItem_t
*
item
)
const
{
...
...
src/ngap/ngapIEs/PDUSessionResourceItem.hpp
View file @
aaf92983
...
...
@@ -30,6 +30,7 @@ extern "C" {
#include "Ngap_PDUSessionResourceHandoverItem.h"
#include "Ngap_PDUSessionResourceAdmittedItem.h"
#include "Ngap_PDUSessionResourceFailedToSetupItemHOAck.h"
#include "Ngap_PDUSessionResourceItemHORqd.h"
}
namespace
ngap
{
...
...
@@ -100,14 +101,15 @@ class PDUSessionResourceItem {
// TODO: PDU Session Resource Item
// HANDOVER REQUIRED
// TODO: PDU Session Resource Item
// PDU Session Resource Item
bool
encode
(
Ngap_PDUSessionResourceItemHORqd_t
*
item
)
const
;
bool
decode
(
const
Ngap_PDUSessionResourceItemHORqd_t
*
const
item
);
// HANDOVER COMMAND
//
TODO:
PDU Session Resource Handover Item
// PDU Session Resource Handover Item
bool
encode
(
Ngap_PDUSessionResourceHandoverItem_t
*
item
)
const
;
bool
decode
(
const
Ngap_PDUSessionResourceHandoverItem_t
*
const
item
);
// TODO: PDU Session Resource to Release Item
// PDU Session Resource to Release Item
bool
encode
(
Ngap_PDUSessionResourceToReleaseItemHOCmd_t
*
item
)
const
;
bool
decode
(
const
Ngap_PDUSessionResourceToReleaseItemHOCmd_t
*
const
item
);
...
...
src/ngap/ngapIEs/PDUSessionResourceListHORqd.cpp
View file @
aaf92983
...
...
@@ -30,42 +30,39 @@ PDUSessionResourceListHORqd::PDUSessionResourceListHORqd() {}
PDUSessionResourceListHORqd
::~
PDUSessionResourceListHORqd
()
{}
//------------------------------------------------------------------------------
void
PDUSessionResourceListHORqd
::
set
PDUSessionResourceListHORqd
(
const
std
::
vector
<
PDUSessionResourceItem
HORqd
>&
list
)
{
item
HORqdList
=
list
;
void
PDUSessionResourceListHORqd
::
set
(
const
std
::
vector
<
PDUSessionResourceItem
>&
list
)
{
item
_list_
=
list
;
}
//------------------------------------------------------------------------------
void
PDUSessionResourceListHORqd
::
get
PDUSessionResourceListHORqd
(
std
::
vector
<
PDUSessionResourceItem
HORqd
>&
list
)
{
list
=
item
HORqdList
;
void
PDUSessionResourceListHORqd
::
get
(
std
::
vector
<
PDUSessionResourceItem
>&
list
)
{
list
=
item
_list_
;
}
//------------------------------------------------------------------------------
bool
PDUSessionResourceListHORqd
::
encode
2PDUSessionResourceListHORqd
(
Ngap_PDUSessionResourceListHORqd_t
*
pduSessionResourceListHORQqd
)
{
for
(
auto
&
item
:
item
HORqdList
)
{
bool
PDUSessionResourceListHORqd
::
encode
(
Ngap_PDUSessionResourceListHORqd_t
*
list
)
{
for
(
auto
&
item
:
item
_list_
)
{
Ngap_PDUSessionResourceItemHORqd_t
*
itemHORqd
=
(
Ngap_PDUSessionResourceItemHORqd_t
*
)
calloc
(
1
,
sizeof
(
Ngap_PDUSessionResourceItemHORqd_t
));
if
(
!
itemHORqd
)
return
false
;
if
(
!
item
.
encode2PDUSessionResourceItemHORqd
(
itemHORqd
))
return
false
;
if
(
ASN_SEQUENCE_ADD
(
&
pduSessionResourceListHORQqd
->
list
,
itemHORqd
)
!=
0
)
return
false
;
if
(
!
item
.
encode
(
itemHORqd
))
return
false
;
if
(
ASN_SEQUENCE_ADD
(
&
list
->
list
,
itemHORqd
)
!=
0
)
return
false
;
}
return
true
;
}
//------------------------------------------------------------------------------
bool
PDUSessionResourceListHORqd
::
decodefromPDUSessionResourceListHORqd
(
Ngap_PDUSessionResourceListHORqd_t
*
pduSessionResourceListHORQqd
)
{
for
(
int
i
=
0
;
i
<
pduSessionResourceListHORQqd
->
list
.
count
;
i
++
)
{
PDUSessionResourceItemHORqd
item
=
{};
if
(
!
item
.
decodefromPDUSessionResourceItemHORqd
(
pduSessionResourceListHORQqd
->
list
.
array
[
i
]))
return
false
;
itemHORqdList
.
push_back
(
item
);
bool
PDUSessionResourceListHORqd
::
decode
(
Ngap_PDUSessionResourceListHORqd_t
*
list
)
{
for
(
int
i
=
0
;
i
<
list
->
list
.
count
;
i
++
)
{
PDUSessionResourceItem
item
=
{};
if
(
!
item
.
decode
(
list
->
list
.
array
[
i
]))
return
false
;
item_list_
.
push_back
(
item
);
}
return
true
;
...
...
src/ngap/ngapIEs/PDUSessionResourceListHORqd.hpp
View file @
aaf92983
...
...
@@ -22,7 +22,7 @@
#ifndef _PDU_SESSION_RESOURCE_LIST_HO_RQD_H_
#define _PDU_SESSION_RESOURCE_LIST_HO_RQD_H_
#include "PDUSessionResourceItem
HORqd
.hpp"
#include "PDUSessionResourceItem.hpp"
#include <vector>
extern
"C"
{
...
...
@@ -36,18 +36,14 @@ class PDUSessionResourceListHORqd {
PDUSessionResourceListHORqd
();
virtual
~
PDUSessionResourceListHORqd
();
void
setPDUSessionResourceListHORqd
(
const
std
::
vector
<
PDUSessionResourceItemHORqd
>&
list
);
void
getPDUSessionResourceListHORqd
(
std
::
vector
<
PDUSessionResourceItemHORqd
>&
list
);
void
set
(
const
std
::
vector
<
PDUSessionResourceItem
>&
list
);
void
get
(
std
::
vector
<
PDUSessionResourceItem
>&
list
);
bool
encode2PDUSessionResourceListHORqd
(
Ngap_PDUSessionResourceListHORqd_t
*
pduSessionResourceListHORQqd
);
bool
decodefromPDUSessionResourceListHORqd
(
Ngap_PDUSessionResourceListHORqd_t
*
pduSessionResourceListHORQqd
);
bool
encode
(
Ngap_PDUSessionResourceListHORqd_t
*
list
);
bool
decode
(
Ngap_PDUSessionResourceListHORqd_t
*
list
);
private:
std
::
vector
<
PDUSessionResourceItem
HORqd
>
itemHORqdList
;
std
::
vector
<
PDUSessionResourceItem
>
item_list_
;
};
}
// namespace ngap
...
...
src/ngap/ngapMsgs/HandoverRequestAck.hpp
View file @
aaf92983
...
...
@@ -67,8 +67,8 @@ class HandoverRequestAck : public NgapUEMessage {
PDUSessionResourceAdmittedList
pduSessionResourceAdmittedList
;
// Mandatory
std
::
optional
<
PDUSessionResourceFailedToSetupListHOAck
>
PDUSessionResourceFailedToSetupList
;
OCTET_STRING_t
TargetToSource_TransparentContainer
;
// Mandatory
Ngap_CriticalityDiagnostics_t
*
CriticalityDiagnostics
;
// Optional
OCTET_STRING_t
TargetToSource_TransparentContainer
;
//
TODO:
Mandatory
Ngap_CriticalityDiagnostics_t
*
CriticalityDiagnostics
;
//
TODO:
Optional
};
}
// namespace ngap
...
...
src/ngap/ngapMsgs/HandoverRequiredMsg.cpp
View file @
aaf92983
...
...
@@ -30,7 +30,7 @@ namespace ngap {
//------------------------------------------------------------------------------
HandoverRequiredMsg
::
HandoverRequiredMsg
()
:
NgapUEMessage
()
{
directForwardingPathAvailability
=
nullptr
;
directForwardingPathAvailability
=
std
::
nullopt
;
handoverRequiredIEs
=
nullptr
;
setMessageType
(
NgapMessageType
::
HANDOVER_REQUIRED
);
...
...
@@ -129,11 +129,11 @@ bool HandoverRequiredMsg::getPDUSessionResourceList(
}
//------------------------------------------------------------------------------
long
HandoverRequiredMsg
::
getDirectForwardingPathAvailability
()
{
if
(
directForwardingPathAvailability
)
return
*
directForwardingPathAvailability
;
else
return
0
;
bool
HandoverRequiredMsg
::
getDirectForwardingPathAvailability
(
long
&
value
)
const
{
if
(
directForwardingPathAvailability
.
has_value
())
return
false
;
value
=
directForwardingPathAvailability
.
value
();
return
true
;
}
//------------------------------------------------------------------------------
...
...
@@ -237,10 +237,9 @@ bool HandoverRequiredMsg::decodeFromPdu(Ngap_NGAP_PDU_t* ngapMsgPdu) {
handoverRequiredIEs
->
protocolIEs
.
list
.
array
[
i
]
->
value
.
present
==
Ngap_HandoverRequiredIEs__value_PR_DirectForwardingPathAvailability
)
{
directForwardingPathAvailability
=
new
Ngap_DirectForwardingPathAvailability_t
();
*
directForwardingPathAvailability
=
handoverRequiredIEs
->
protocolIEs
.
list
.
array
[
i
]
->
value
.
choice
.
DirectForwardingPathAvailability
;
std
::
optional
<
Ngap_DirectForwardingPathAvailability_t
>
(
handoverRequiredIEs
->
protocolIEs
.
list
.
array
[
i
]
->
value
.
choice
.
DirectForwardingPathAvailability
);
}
else
{
Logger
::
ngap
().
error
(
"Decoded NGAP DirectForwardingPathAvailability IE error"
);
...
...
@@ -252,7 +251,7 @@ bool HandoverRequiredMsg::decodeFromPdu(Ngap_NGAP_PDU_t* ngapMsgPdu) {
Ngap_Criticality_reject
&&
handoverRequiredIEs
->
protocolIEs
.
list
.
array
[
i
]
->
value
.
present
==
Ngap_HandoverRequiredIEs__value_PR_PDUSessionResourceListHORqd
)
{
if
(
!
pDUSessionResourceList
.
decode
fromPDUSessionResourceListHORqd
(
if
(
!
pDUSessionResourceList
.
decode
(
&
handoverRequiredIEs
->
protocolIEs
.
list
.
array
[
i
]
->
value
.
choice
.
PDUSessionResourceListHORqd
))
{
Logger
::
ngap
().
error
(
...
...
src/ngap/ngapMsgs/HandoverRequiredMsg.hpp
View file @
aaf92983
...
...
@@ -28,6 +28,8 @@
#include "GlobalgNBId.hpp"
#include "TAI.hpp"
#include <optional>
extern
"C"
{
#include "Ngap_HandoverRequired.h"
#include "Ngap_TargetID.h"
...
...
@@ -47,17 +49,23 @@ class HandoverRequiredMsg : public NgapUEMessage {
bool
decodeFromPdu
(
Ngap_NGAP_PDU_t
*
ngapMsgPdu
)
override
;
Ngap_HandoverType_t
getHandoverType
();
// TODO Setter
Ngap_Cause_PR
getChoiceOfCause
();
long
getCauseValue
();
// TODO Setter
bool
getTargetID
(
GlobalgNBId
&
gnbId
,
TAI
&
tai
);
// TODO Setter
long
getDirectForwardingPathAvailability
();
bool
getDirectForwardingPathAvailability
(
long
&
value
)
const
;
// TODO: Setter
bool
getPDUSessionResourceList
(
PDUSessionResourceListHORqd
&
list
);
// TODO Setter
OCTET_STRING_t
getSourceToTarget_TransparentContainer
();
// TODO Setter
private:
Ngap_HandoverRequired_t
*
handoverRequiredIEs
;
...
...
@@ -66,7 +74,7 @@ class HandoverRequiredMsg : public NgapUEMessage {
Ngap_HandoverType_t
handoverType
;
// Mandatory
Cause
cause
;
// Mandatory
Ngap_TargetID_t
targetID
;
// Mandatory
Ngap_DirectForwardingPathAvailability_t
*
std
::
optional
<
Ngap_DirectForwardingPathAvailability_t
>
directForwardingPathAvailability
;
// Optional
PDUSessionResourceListHORqd
pDUSessionResourceList
;
// Mandatory
Ngap_SourceToTarget_TransparentContainer_t
...
...
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