Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
O
OpenXG-SMF
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
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-SMF
Commits
7dff323e
Commit
7dff323e
authored
Apr 23, 2020
by
Tien-Thinh Nguyen
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Fix Cause/PDU session type releated issues for PDU session establishment
parent
451b609a
Changes
5
Hide whitespace changes
Inline
Side-by-side
Showing
5 changed files
with
88 additions
and
34 deletions
+88
-34
src/nas/3gpp_24.501.h
src/nas/3gpp_24.501.h
+1
-1
src/smf_app/smf_app.cpp
src/smf_app/smf_app.cpp
+50
-19
src/smf_app/smf_context.cpp
src/smf_app/smf_context.cpp
+7
-2
src/smf_app/smf_n1_n2.cpp
src/smf_app/smf_n1_n2.cpp
+1
-0
src/smf_app/smf_procedure.cpp
src/smf_app/smf_procedure.cpp
+29
-12
No files found.
src/nas/3gpp_24.501.h
View file @
7dff323e
...
...
@@ -226,7 +226,7 @@ enum class cause_value_5gsm_e {
CAUSE_46_OUT_OF_LAND_SERVICE_AREA
=
46
,
CAUSE_47_PTI_MISMATCH
=
47
,
CAUSE_50_PDU_SESSION_TYPE_IPV4_ONLY_ALLOWED
=
50
,
CAUSE_51_PDU_SESSION_TYPE_IPV6_ONLY_ALLOWED
=
5
0
,
CAUSE_51_PDU_SESSION_TYPE_IPV6_ONLY_ALLOWED
=
5
1
,
CAUSE_54_PDU_SESSION_DOES_NOT_EXIST
=
54
,
CAUSE_67_INSUFFICIENT_RESOURCES_FOR_SPECIFIC_SLICE_AND_DNN
=
67
,
CAUSE_68_NOT_SUPPORTED_SSC_MODE
=
68
,
...
...
src/smf_app/smf_app.cpp
View file @
7dff323e
...
...
@@ -419,8 +419,8 @@ void smf_app::handle_itti_msg(
Logger
::
smf_app
().
info
(
"Process N1N2MessageTransfer Response"
);
//Update PDU Session accordingly
//TODO: to be completed (process cause)
pdu_session_status_e
status
=
{
pdu_session_status_e
::
PDU_SESSION_INACTIVE
};
upCnx_state_e
state
=
{
upCnx_state_e
::
UPCNX_STATE_DEACTIVATED
};
pdu_session_status_e
status
=
{
pdu_session_status_e
::
PDU_SESSION_INACTIVE
};
upCnx_state_e
state
=
{
upCnx_state_e
::
UPCNX_STATE_DEACTIVATED
};
if
((
static_cast
<
http_response_codes_e
>
(
m
.
response_code
)
==
http_response_codes_e
::
HTTP_RESPONSE_CODE_OK
)
or
(
static_cast
<
http_response_codes_e
>
(
m
.
response_code
)
...
...
@@ -465,6 +465,9 @@ void smf_app::handle_pdu_session_create_sm_context_request(
std
::
string
n1_sm_message
,
n1_sm_message_hex
;
smf_n1_n2
smf_n1_n2_inst
=
{
};
nas_message_t
decoded_nas_msg
=
{
};
cause_value_5gsm_e
cause_n1
=
{
cause_value_5gsm_e
::
CAUSE_0_UNKNOWN
};
pdu_session_type_t
pdu_session_type
=
{
.
pdu_session_type
=
PDU_SESSION_TYPE_E_IPV4
};
//Step 1. Decode NAS and get the necessary information
std
::
string
n1_sm_msg
=
smreq
->
req
.
get_n1_sm_message
();
...
...
@@ -498,11 +501,17 @@ void smf_app::handle_pdu_session_create_sm_context_request(
//Extended protocol discriminator (Mandatory)
smreq
->
req
.
set_epd
(
decoded_nas_msg
.
header
.
extended_protocol_discriminator
);
//PDUSessionIdentity
pdu_session_id_t
pdu_session_id
=
decoded_nas_msg
.
plain
.
sm
.
header
.
pdu_session_identity
;
//ProcedureTransactionIdentity
procedure_transaction_id_t
pti
=
{
.
procedure_transaction_id
=
decoded_nas_msg
.
plain
.
sm
.
header
.
procedure_transaction_identity
};
//Message type (Mandatory)
smreq
->
req
.
set_message_type
(
decoded_nas_msg
.
plain
.
sm
.
header
.
message_type
);
//TODO: Integrity protection maximum data rate (Mandatory)
//PDU session type (Optional)
smreq
->
req
.
set_pdu_session_type
(
PDU_SESSION_TYPE_E_IPV4
);
//set default value
if
(
decoded_nas_msg
.
plain
.
sm
.
header
.
message_type
==
PDU_SESSION_ESTABLISHMENT_REQUEST
)
{
//TODO: Disable this command temporarily since can't get this info from tester
...
...
@@ -510,22 +519,48 @@ void smf_app::handle_pdu_session_create_sm_context_request(
"NAS, pdu_session_type %d"
,
decoded_nas_msg
.
plain
.
sm
.
pdu_session_establishment_request
.
_pdusessiontype
.
pdu_session_type_value
);
smreq
->
req
.
set_pdu_session_type
(
decoded_nas_msg
.
plain
.
sm
.
pdu_session_establishment_request
.
_pdusessiontype
.
pdu_session_type_value
);
pdu_session_type
.
pdu_session_type
=
decoded_nas_msg
.
plain
.
sm
.
pdu_session_establishment_request
.
_pdusessiontype
.
pdu_session_type_value
;
}
smreq
->
req
.
set_pdu_session_type
(
pdu_session_type
.
pdu_session_type
);
//TODO: Support IPv4 only for now
if
(
pdu_session_type
.
pdu_session_type
==
PDU_SESSION_TYPE_E_IPV6
)
{
cause_n1
=
cause_value_5gsm_e
::
CAUSE_50_PDU_SESSION_TYPE_IPV4_ONLY_ALLOWED
;
}
else
if
((
pdu_session_type
.
pdu_session_type
==
PDU_SESSION_TYPE_E_ETHERNET
)
or
(
pdu_session_type
.
pdu_session_type
==
PDU_SESSION_TYPE_E_UNSTRUCTURED
))
{
cause_n1
=
cause_value_5gsm_e
::
CAUSE_28_UNKNOWN_PDU_SESSION_TYPE
;
}
if
(
pdu_session_type
.
pdu_session_type
!=
PDU_SESSION_TYPE_E_IPV4
)
{
problem_details
.
setCause
(
pdu_session_application_error_e2str
[
PDU_SESSION_APPLICATION_ERROR_PDUTYPE_DENIED
]);
smContextCreateError
.
setError
(
problem_details
);
refToBinaryData
.
setContentId
(
N1_SM_CONTENT_ID
);
smContextCreateError
.
setN1SmMsg
(
refToBinaryData
);
//PDU Session Establishment Reject
smf_n1_n2_inst
.
create_n1_sm_container
(
smreq
->
req
,
PDU_SESSION_ESTABLISHMENT_REJECT
,
n1_sm_message
,
cause_n1
);
smf_app_inst
->
convert_string_2_hex
(
n1_sm_message
,
n1_sm_message_hex
);
smf_n11_inst
->
send_pdu_session_create_sm_context_response
(
smreq
->
http_response
,
smContextCreateError
,
Pistache
::
Http
::
Code
::
Forbidden
,
n1_sm_message_hex
);
}
//TODO: SSCMode
//TODO: store UE 5GSM Capability
//TODO: MaximumNumberOfSupportedPacketFilters
//TODO: AlwaysonPDUSessionRequested
//TODO: SMPDUDNRequestContainer
//TODO: ExtendedProtocolConfigurationOptions
//Get necessary information
supi_t
supi
=
smreq
->
req
.
get_supi
();
supi64_t
supi64
=
smf_supi_to_u64
(
supi
);
std
::
string
dnn
=
smreq
->
req
.
get_dnn
();
snssai_t
snssai
=
smreq
->
req
.
get_snssai
();
procedure_transaction_id_t
pti
=
{
.
procedure_transaction_id
=
decoded_nas_msg
.
plain
.
sm
.
header
.
procedure_transaction_identity
};
pdu_session_type_t
pdu_session_type
=
{
.
pdu_session_type
=
smreq
->
req
.
get_pdu_session_type
()
};
pdu_session_id_t
pdu_session_id
=
decoded_nas_msg
.
plain
.
sm
.
header
.
pdu_session_identity
;
uint8_t
message_type
=
decoded_nas_msg
.
plain
.
sm
.
header
.
message_type
;
std
::
string
request_type
=
smreq
->
req
.
get_request_type
();
Logger
::
smf_app
().
info
(
...
...
@@ -599,8 +634,6 @@ void smf_app::handle_pdu_session_create_sm_context_request(
//return
}
//TODO: store UE 5GSM Capability
//TODO: For the moment, not support PDU session authentication and authorization by the external DN
//Step 3. check if the DNN requested is valid
...
...
@@ -1019,10 +1052,9 @@ void smf_app::update_pdu_session_status(const scid_t scid,
pdu_session_status_e2str
[
static_cast
<
int
>
(
status
)].
c_str
());
}
//---------------------------------------------------------------------------------------------
void
smf_app
::
update_pdu_session_upCnx_state
(
const
scid_t
scid
,
const
upCnx_state_e
state
)
{
const
upCnx_state_e
state
)
{
Logger
::
smf_app
().
info
(
"Update UpCnx_State"
);
//get the smf context
...
...
@@ -1071,9 +1103,8 @@ void smf_app::update_pdu_session_upCnx_state(const scid_t scid,
"Could not retrieve the corresponding SMF PDU Session context!"
);
}
sp
.
get
()
->
set_upCnx_state
(
state
);
Logger
::
smf_app
().
info
(
"Set PDU Session UpCnxState to %s"
,
upCnx_state_e2str
[
static_cast
<
int
>
(
state
)].
c_str
());
Logger
::
smf_app
().
info
(
"Set PDU Session UpCnxState to %s"
,
upCnx_state_e2str
[
static_cast
<
int
>
(
state
)].
c_str
());
}
//---------------------------------------------------------------------------------------------
void
smf_app
::
timer_t3591_timeout
(
timer_id_t
timer_id
,
uint64_t
arg2_user
)
{
...
...
src/smf_app/smf_context.cpp
View file @
7dff323e
...
...
@@ -1073,7 +1073,7 @@ void smf_context::handle_pdu_session_create_sm_context_request(
"PDU Session Establishment Request: Create SM Context Request procedure failed"
);
remove_procedure
(
proc
);
//Set cause to error to trigger PDU session establishment reject (step 10)
sm_context_resp
->
res
.
set_cause
(
UNKNOWN_ERROR
);
//
sm_context_resp->res.set_cause(UNKNOWN_ERROR);
}
}
else
{
//if request is rejected
...
...
@@ -1119,9 +1119,14 @@ void smf_context::handle_pdu_session_create_sm_context_request(
//Create PDU Session Establishment Reject and embedded in Namf_Communication_N1N2MessageTransfer Request
Logger
::
smf_app
().
debug
(
"Create PDU Session Establishment Reject"
);
//TODO: Should check Cause for other cases
cause_value_5gsm_e
cause_n1
=
{
cause_value_5gsm_e
::
CAUSE_38_NETWORK_FAILURE
};
if
(
sm_context_resp
->
res
.
get_cause
()
==
NO_RESOURCES_AVAILABLE
)
{
cause_n1
=
cause_value_5gsm_e
::
CAUSE_26_INSUFFICIENT_RESOURCES
;
}
smf_n1_n2_inst
.
create_n1_sm_container
(
sm_context_resp_pending
->
res
,
PDU_SESSION_ESTABLISHMENT_REJECT
,
n1_sm_message
,
cause_
value_5gsm_e
::
CAUSE_26_INSUFFICIENT_RESOURCES
);
n1_sm_message
,
cause_
n1
);
smf_app_inst
->
convert_string_2_hex
(
n1_sm_message
,
n1_sm_msg_hex
);
sm_context_resp_pending
->
res
.
set_n1_sm_message
(
n1_sm_msg_hex
);
...
...
src/smf_app/smf_n1_n2.cpp
View file @
7dff323e
...
...
@@ -298,6 +298,7 @@ void smf_n1_n2::create_n1_sm_container(pdu_session_msg &msg,
//EAPMessage
//authorized QoS flow descriptions IE: QoSFlowDescritions
//TODO: we may not need this IE (see section 6.4.1.3 @3GPP TS 24.501)
if
(
smf_app_inst
->
is_supi_2_smf_context
(
supi64
))
{
Logger
::
smf_app
().
debug
(
"Get SMF context with SUPI "
SUPI_64_FMT
""
,
supi64
);
...
...
src/smf_app/smf_procedure.cpp
View file @
7dff323e
...
...
@@ -301,6 +301,7 @@ void session_create_sm_context_procedure::handle_itti_msg(
"session_create_sm_context_procedure handle itti_n4_session_establishment_response: pdu-session-id %d"
,
n11_trigger
.
get
()
->
req
.
get_pdu_session_id
());
cause_value_5gsm_e
cause_n1
=
{
cause_value_5gsm_e
::
CAUSE_0_UNKNOWN
};
pfcp
::
cause_t
cause
=
{
};
resp
.
pfcp_ies
.
get
(
cause
);
if
(
cause
.
cause_value
==
pfcp
::
CAUSE_VALUE_REQUEST_ACCEPTED
)
{
...
...
@@ -378,19 +379,36 @@ void session_create_sm_context_procedure::handle_itti_msg(
if
(
n11_triggered_pending
->
res
.
get_cause
()
!=
REQUEST_ACCEPTED
)
{
//PDU Session Establishment Reject
Logger
::
smf_app
().
debug
(
"Prepare a PDU Session Establishment Reject message and send to UE"
);
smf_n1_n2_inst
.
create_n1_sm_container
(
n11_triggered_pending
->
res
,
PDU_SESSION_ESTABLISHMENT_REJECT
,
n1_sm_msg
,
cause_value_5gsm_e
::
CAUSE_38_NETWORK_FAILURE
);
cause_n1
=
cause_value_5gsm_e
::
CAUSE_38_NETWORK_FAILURE
;
//TODO: Support IPv4 only for now
if
(
n11_triggered_pending
->
res
.
get_pdu_session_type
()
==
PDU_SESSION_TYPE_E_IPV6
)
{
n11_triggered_pending
->
res
.
set_pdu_session_type
(
PDU_SESSION_TYPE_E_IPV4
);
cause_n1
=
cause_value_5gsm_e
::
CAUSE_50_PDU_SESSION_TYPE_IPV4_ONLY_ALLOWED
;
}
smf_n1_n2_inst
.
create_n1_sm_container
(
n11_triggered_pending
->
res
,
PDU_SESSION_ESTABLISHMENT_REJECT
,
n1_sm_msg
,
cause_n1
);
smf_app_inst
->
convert_string_2_hex
(
n1_sm_msg
,
n1_sm_msg_hex
);
n11_triggered_pending
->
res
.
set_n1_sm_message
(
n1_sm_msg_hex
);
}
else
{
//PDU Session Establishment Accept
Logger
::
smf_app
().
debug
(
"Prepare a PDU Session Establishment Accept message and send to UE"
);
//TODO: Support IPv4 only for now
if
(
n11_triggered_pending
->
res
.
get_pdu_session_type
()
==
PDU_SESSION_TYPE_E_IPV4V6
)
{
n11_triggered_pending
->
res
.
set_pdu_session_type
(
PDU_SESSION_TYPE_E_IPV4
);
cause_n1
=
cause_value_5gsm_e
::
CAUSE_50_PDU_SESSION_TYPE_IPV4_ONLY_ALLOWED
;
}
smf_n1_n2_inst
.
create_n1_sm_container
(
n11_triggered_pending
->
res
,
PDU_SESSION_ESTABLISHMENT_ACCEPT
,
n1_sm_msg
,
cause_value_5gsm_e
::
CAUSE_0_UNKNOWN
);
//TODO: need cause?
PDU_SESSION_ESTABLISHMENT_ACCEPT
,
n1_sm_msg
,
cause_n1
);
smf_app_inst
->
convert_string_2_hex
(
n1_sm_msg
,
n1_sm_msg_hex
);
n11_triggered_pending
->
res
.
set_n1_sm_message
(
n1_sm_msg_hex
);
//N2 SM Information (Step 11, section 4.3.2.2.1 @ 3GPP TS 23.502): PDUSessionRessourceSetupRequestTransfer IE
...
...
@@ -1012,7 +1030,6 @@ void session_update_sm_context_procedure::handle_itti_msg(
//set UpCnxState to DEACTIVATED
ppc
->
set_upCnx_state
(
upCnx_state_e
::
UPCNX_STATE_ACTIVATED
);
}
break
;
...
...
@@ -1120,11 +1137,11 @@ void session_update_sm_context_procedure::handle_itti_msg(
"PDU_RES_REL_CMD"
;
//NGAP message
}
else
{
//fill the content of SmContextUpdatedData
n11_triggered_pending
->
res
.
sm_context_updated_data
=
{};
n11_triggered_pending
->
res
.
sm_context_updated_data
[
"n1MessageContainer"
][
"n1MessageClass"
]
=
N1N2_MESSAGE_CLASS
;
n11_triggered_pending
->
res
.
sm_context_updated_data
[
"n1MessageContainer"
][
"n1MessageContent"
][
"contentId"
]
=
N1_SM_CONTENT_ID
;
n11_triggered_pending
->
res
.
sm_context_updated_data
=
{
};
n11_triggered_pending
->
res
.
sm_context_updated_data
[
"n1MessageContainer"
][
"n1MessageClass"
]
=
N1N2_MESSAGE_CLASS
;
n11_triggered_pending
->
res
.
sm_context_updated_data
[
"n1MessageContainer"
][
"n1MessageContent"
][
"contentId"
]
=
N1_SM_CONTENT_ID
;
}
//Update PDU session status to PDU_SESSION_INACTIVE_PENDING
...
...
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