Skip to content
GitLab
Explore
Sign in
Register
Primary navigation
Search or go to…
Project
oai-cn5g-smf
Manage
Activity
Members
Labels
Plan
Issues
Issue boards
Milestones
Wiki
Code
Merge requests
Repository
Branches
Commits
Tags
Repository graph
Compare revisions
Snippets
Deploy
Releases
Model registry
Monitor
Incidents
Service Desk
Analyze
Value stream analytics
Contributor analytics
Repository analytics
Model experiments
Help
Help
Support
GitLab documentation
Compare GitLab plans
Community forum
Contribute to GitLab
Provide feedback
Keyboard shortcuts
?
Snippets
Groups
Projects
Show more breadcrumbs
oai
cn5g
oai-cn5g-smf
Commits
28051f6b
Commit
28051f6b
authored
4 years ago
by
Tien-Thinh Nguyen
Browse files
Options
Downloads
Patches
Plain Diff
update AMF Client for PDU Session Release
parent
8d8a680f
No related branches found
No related tags found
1 merge request
!4
Add PDU Session Release procedure (UE-Initiated)
Changes
1
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
src/test/amf_client/amf-client.cpp
+337
-25
337 additions, 25 deletions
src/test/amf_client/amf-client.cpp
with
337 additions
and
25 deletions
src/test/amf_client/amf-client.cpp
+
337
−
25
View file @
28051f6b
...
@@ -24,24 +24,24 @@ static std::size_t callback(
...
@@ -24,24 +24,24 @@ static std::size_t callback(
void
send_pdu_session_establishment_request
(
std
::
string
smf_ip_address
)
void
send_pdu_session_establishment_request
(
std
::
string
smf_ip_address
)
{
{
std
::
cout
<<
"[AMF N11] PDU Session Establishment Request"
<<
std
::
endl
;
std
::
cout
<<
"[AMF N11] PDU Session Establishment Request
(SM Context Create)
"
<<
std
::
endl
;
nlohmann
::
json
pdu_session_establishment_request
;
nlohmann
::
json
pdu_session_establishment_request
;
//encode
//encode
// PDU Session Establishment Request
/*
/*
0000 2e 01 01 c1 ff ff 91 00 00 00 00 00 00 00 00 00
0000 2e 01 01 c1 ff ff 91 00 00 00 00 00 00 00 00 00
*/
*/
size_t
buffer_size
=
128
;
size_t
buffer_size
=
128
;
char
*
buffer
=
(
char
*
)
calloc
(
1
,
buffer_size
);
char
*
buffer
=
(
char
*
)
calloc
(
1
,
buffer_size
);
int
size
=
0
;
int
size
=
0
;
ENCODE_U8
(
buffer
,
0x2e
,
size
);
ENCODE_U8
(
buffer
,
0x2e
,
size
);
//ExtendedProtocolDiscriminator
ENCODE_U8
(
buffer
+
size
,
0x01
,
size
);
ENCODE_U8
(
buffer
+
size
,
0x01
,
size
);
//PDUSessionIdentity
ENCODE_U8
(
buffer
+
size
,
0x01
,
size
);
ENCODE_U8
(
buffer
+
size
,
0x01
,
size
);
//ProcedureTransactionIdentity
ENCODE_U8
(
buffer
+
size
,
0xc1
,
size
);
ENCODE_U8
(
buffer
+
size
,
0xc1
,
size
);
//MessageType - PDU_SESSION_ESTABLISHMENT_REQUEST
ENCODE_U8
(
buffer
+
size
,
0xff
,
size
);
ENCODE_U8
(
buffer
+
size
,
0xff
,
size
);
//Integrity Protection Maximum Data Rate
ENCODE_U8
(
buffer
+
size
,
0xff
,
size
);
ENCODE_U8
(
buffer
+
size
,
0xff
,
size
);
//Integrity Protection Maximum Data Rate
// ENCODE_U8 (buffer+size, 0x00 , size);
ENCODE_U8
(
buffer
+
size
,
0x91
,
size
);
//01 PDU Session Type - Ipv4
ENCODE_U8
(
buffer
+
size
,
0x91
,
size
);
std
::
cout
<<
"Buffer: "
<<
std
::
endl
;
std
::
cout
<<
"Buffer: "
<<
std
::
endl
;
for
(
int
i
=
0
;
i
<
size
;
i
++
)
for
(
int
i
=
0
;
i
<
size
;
i
++
)
...
@@ -91,7 +91,7 @@ void send_pdu_session_establishment_request(std::string smf_ip_address)
...
@@ -91,7 +91,7 @@ void send_pdu_session_establishment_request(std::string smf_ip_address)
curl_easy_setopt
(
curl
,
CURLOPT_URL
,
url
.
c_str
());
curl_easy_setopt
(
curl
,
CURLOPT_URL
,
url
.
c_str
());
curl_easy_setopt
(
curl
,
CURLOPT_HTTPGET
,
1
);
curl_easy_setopt
(
curl
,
CURLOPT_HTTPGET
,
1
);
curl_easy_setopt
(
curl
,
CURLOPT_TIMEOUT_MS
,
100L
);
curl_easy_setopt
(
curl
,
CURLOPT_TIMEOUT_MS
,
100L
);
//
curl_easy_setopt(curl, CURLOPT_INTERFACE, "eno1:amf"); //hardcoded
curl_easy_setopt
(
curl
,
CURLOPT_INTERFACE
,
"eno1:amf"
);
//hardcoded
mime
=
curl_mime_init
(
curl
);
mime
=
curl_mime_init
(
curl
);
alt
=
curl_mime_init
(
curl
);
alt
=
curl_mime_init
(
curl
);
...
@@ -105,7 +105,7 @@ void send_pdu_session_establishment_request(std::string smf_ip_address)
...
@@ -105,7 +105,7 @@ void send_pdu_session_establishment_request(std::string smf_ip_address)
//curl_mime_data(part, reinterpret_cast<const char*>(n1_msg_hex), CURL_ZERO_TERMINATED);
//curl_mime_data(part, reinterpret_cast<const char*>(n1_msg_hex), CURL_ZERO_TERMINATED);
curl_mime_data
(
part
,
reinterpret_cast
<
const
char
*>
(
buffer
),
size
);
curl_mime_data
(
part
,
reinterpret_cast
<
const
char
*>
(
buffer
),
size
);
curl_mime_type
(
part
,
"application/vnd.3gpp.5gnas"
);
curl_mime_type
(
part
,
"application/vnd.3gpp.5gnas"
);
//
curl_mime_name (part, "n1SmMsg");
curl_mime_name
(
part
,
"n1SmMsg"
);
curl_easy_setopt
(
curl
,
CURLOPT_MIMEPOST
,
mime
);
curl_easy_setopt
(
curl
,
CURLOPT_MIMEPOST
,
mime
);
...
@@ -140,11 +140,12 @@ void send_pdu_session_establishment_request(std::string smf_ip_address)
...
@@ -140,11 +140,12 @@ void send_pdu_session_establishment_request(std::string smf_ip_address)
void
send_pdu_session_update_sm_context_establishment
(
std
::
string
smf_ip_address
)
void
send_pdu_session_update_sm_context_establishment
(
std
::
string
smf_ip_address
)
{
{
std
::
cout
<<
"[AMF N11]
send_pdu_session_update_sm_context_establishment
"
<<
std
::
endl
;
std
::
cout
<<
"[AMF N11]
PDU Session Establishment Request (SM Context Update)
"
<<
std
::
endl
;
nlohmann
::
json
pdu_session_update_request
;
nlohmann
::
json
pdu_session_update_request
;
//encode
//encode
//PDU Session Resource Setup Response Transfer IE
/*
/*
00 03 e0 ac 0a 05 01 00 00 00 01 00 3c
00 03 e0 ac 0a 05 01 00 00 00 01 00 3c
*/
*/
...
@@ -154,16 +155,16 @@ void send_pdu_session_update_sm_context_establishment(std::string smf_ip_address
...
@@ -154,16 +155,16 @@ void send_pdu_session_update_sm_context_establishment(std::string smf_ip_address
ENCODE_U8
(
buffer
,
0x00
,
size
);
ENCODE_U8
(
buffer
,
0x00
,
size
);
ENCODE_U8
(
buffer
+
size
,
0x03
,
size
);
ENCODE_U8
(
buffer
+
size
,
0x03
,
size
);
ENCODE_U8
(
buffer
+
size
,
0xe0
,
size
);
ENCODE_U8
(
buffer
+
size
,
0xe0
,
size
);
ENCODE_U8
(
buffer
+
size
,
0xac
,
size
);
ENCODE_U8
(
buffer
+
size
,
0xac
,
size
);
//uPTransportLayerInformation IP Addr 172.10.5.1: 172.
ENCODE_U8
(
buffer
+
size
,
0x0a
,
size
);
ENCODE_U8
(
buffer
+
size
,
0x0a
,
size
);
//10
ENCODE_U8
(
buffer
+
size
,
0x05
,
size
);
ENCODE_U8
(
buffer
+
size
,
0x05
,
size
);
//.5
ENCODE_U8
(
buffer
+
size
,
0x01
,
size
);
ENCODE_U8
(
buffer
+
size
,
0x01
,
size
);
//.1
ENCODE_U8
(
buffer
+
size
,
0x00
,
size
);
ENCODE_U8
(
buffer
+
size
,
0x00
,
size
);
//gTP_TEID 00 00 00 01: 00
ENCODE_U8
(
buffer
+
size
,
0x00
,
size
);
ENCODE_U8
(
buffer
+
size
,
0x00
,
size
);
//00
ENCODE_U8
(
buffer
+
size
,
0x00
,
size
);
ENCODE_U8
(
buffer
+
size
,
0x00
,
size
);
//00
ENCODE_U8
(
buffer
+
size
,
0x01
,
size
);
ENCODE_U8
(
buffer
+
size
,
0x01
,
size
);
//01
ENCODE_U8
(
buffer
+
size
,
0x00
,
size
);
ENCODE_U8
(
buffer
+
size
,
0x00
,
size
);
//Associated QoS Flow 00 3c
ENCODE_U8
(
buffer
+
size
,
0x3c
,
size
);
//QFI: 60
ENCODE_U8
(
buffer
+
size
,
0x3c
,
size
);
//QFI: 60
std
::
cout
<<
"Buffer: "
<<
std
::
endl
;
std
::
cout
<<
"Buffer: "
<<
std
::
endl
;
for
(
int
i
=
0
;
i
<
2
;
i
++
)
for
(
int
i
=
0
;
i
<
2
;
i
++
)
...
@@ -173,7 +174,6 @@ void send_pdu_session_update_sm_context_establishment(std::string smf_ip_address
...
@@ -173,7 +174,6 @@ void send_pdu_session_update_sm_context_establishment(std::string smf_ip_address
std
::
cout
<<
"Buffer: "
<<
std
::
endl
;
std
::
cout
<<
"Buffer: "
<<
std
::
endl
;
//Fill Json part
//Fill Json part
//std::string url = std::string("http://172.16.1.101/nsmf-pdusession/v2/sm-contexts/imsi-200000000000001/modify");
std
::
string
url
=
std
::
string
(
"http://"
);
std
::
string
url
=
std
::
string
(
"http://"
);
url
.
append
(
smf_ip_address
);
url
.
append
(
smf_ip_address
);
url
.
append
(
std
::
string
(
"/nsmf-pdusession/v2/sm-contexts/1/modify"
));
url
.
append
(
std
::
string
(
"/nsmf-pdusession/v2/sm-contexts/1/modify"
));
...
@@ -202,7 +202,7 @@ void send_pdu_session_update_sm_context_establishment(std::string smf_ip_address
...
@@ -202,7 +202,7 @@ void send_pdu_session_update_sm_context_establishment(std::string smf_ip_address
curl_easy_setopt
(
curl
,
CURLOPT_URL
,
url
.
c_str
());
curl_easy_setopt
(
curl
,
CURLOPT_URL
,
url
.
c_str
());
curl_easy_setopt
(
curl
,
CURLOPT_HTTPGET
,
1
);
curl_easy_setopt
(
curl
,
CURLOPT_HTTPGET
,
1
);
curl_easy_setopt
(
curl
,
CURLOPT_TIMEOUT_MS
,
100L
);
curl_easy_setopt
(
curl
,
CURLOPT_TIMEOUT_MS
,
100L
);
//
curl_easy_setopt(curl, CURLOPT_INTERFACE, "eno1:amf"); //hardcoded
curl_easy_setopt
(
curl
,
CURLOPT_INTERFACE
,
"eno1:amf"
);
//hardcoded
mime
=
curl_mime_init
(
curl
);
mime
=
curl_mime_init
(
curl
);
...
@@ -241,7 +241,7 @@ void send_pdu_session_update_sm_context_establishment(std::string smf_ip_address
...
@@ -241,7 +241,7 @@ void send_pdu_session_update_sm_context_establishment(std::string smf_ip_address
//Set the default Cause
//Set the default Cause
response_data
[
"cause"
]
=
"504 Gateway Timeout"
;
response_data
[
"cause"
]
=
"504 Gateway Timeout"
;
}
}
std
::
cout
<<
"[AMF N11] PDU
s
ession
modification r
equest, response from SMF, Http Code "
<<
httpCode
<<
" cause "
<<
response_data
[
"cause"
].
dump
().
c_str
()
<<
std
::
endl
;
std
::
cout
<<
"[AMF N11] PDU
S
ession
Establishment R
equest, response from SMF, Http Code "
<<
httpCode
<<
" cause "
<<
response_data
[
"cause"
].
dump
().
c_str
()
<<
std
::
endl
;
curl_slist_free_all
(
headers
);
curl_slist_free_all
(
headers
);
curl_easy_cleanup
(
curl
);
curl_easy_cleanup
(
curl
);
...
@@ -250,6 +250,310 @@ void send_pdu_session_update_sm_context_establishment(std::string smf_ip_address
...
@@ -250,6 +250,310 @@ void send_pdu_session_update_sm_context_establishment(std::string smf_ip_address
free
(
buffer
);
free
(
buffer
);
}
}
void
send_pdu_session_release_request
(
std
::
string
smf_ip_address
)
{
std
::
cout
<<
"[AMF N11] PDU Session Release Request (SM Context Update)"
<<
std
::
endl
;
nlohmann
::
json
pdu_session_release_request
;
//encode
/*
0000 2e 01 01 d1 00 00 00 00 00 00 00 00 00 00 00 00
*/
size_t
buffer_size
=
128
;
char
*
buffer
=
(
char
*
)
calloc
(
1
,
buffer_size
);
int
size
=
0
;
ENCODE_U8
(
buffer
,
0x2e
,
size
);
//ExtendedProtocolDiscriminator
ENCODE_U8
(
buffer
+
size
,
0x01
,
size
);
//PDUSessionIdentity
ENCODE_U8
(
buffer
+
size
,
0x01
,
size
);
//ProcedureTransactionIdentity
ENCODE_U8
(
buffer
+
size
,
0xd1
,
size
);
//MessageType
ENCODE_U8
(
buffer
+
size
,
0x00
,
size
);
//presence
std
::
cout
<<
"Buffer: "
<<
std
::
endl
;
for
(
int
i
=
0
;
i
<
size
;
i
++
)
{
printf
(
"%02x "
,
buffer
[
i
]);
}
std
::
cout
<<
"Buffer: "
<<
std
::
endl
;
//Fill Json part
std
::
string
url
=
std
::
string
(
"http://"
);
url
.
append
(
smf_ip_address
);
url
.
append
(
std
::
string
(
"/nsmf-pdusession/v2/sm-contexts/1/modify"
));
//Fill the json part
pdu_session_release_request
[
"cause"
]
=
"INSUFFICIENT_UP_RESOURCES"
;
//need to be updated
pdu_session_release_request
[
"n1SmMsg"
][
"contentId"
]
=
"n1SmMsg"
;
// NAS
CURL
*
curl
=
curl_easy_init
();
std
::
string
json_part
=
pdu_session_release_request
.
dump
();
std
::
cout
<<
"Sending message to SMF....
\n
"
;
if
(
curl
)
{
CURLcode
res
;
struct
curl_slist
*
headers
=
nullptr
;
struct
curl_slist
*
slist
=
nullptr
;
curl_mime
*
mime
;
curl_mime
*
alt
;
curl_mimepart
*
part
;
//headers = curl_slist_append(headers, "charsets: utf-8");
headers
=
curl_slist_append
(
headers
,
"content-type: multipart/related"
);
curl_easy_setopt
(
curl
,
CURLOPT_HTTPHEADER
,
headers
);
curl_easy_setopt
(
curl
,
CURLOPT_URL
,
url
.
c_str
());
curl_easy_setopt
(
curl
,
CURLOPT_HTTPGET
,
1
);
curl_easy_setopt
(
curl
,
CURLOPT_TIMEOUT_MS
,
100L
);
curl_easy_setopt
(
curl
,
CURLOPT_INTERFACE
,
"eno1:amf"
);
//hardcoded
mime
=
curl_mime_init
(
curl
);
alt
=
curl_mime_init
(
curl
);
//part with N1N2MessageTransferReqData (JsonData)
part
=
curl_mime_addpart
(
mime
);
curl_mime_data
(
part
,
json_part
.
c_str
(),
CURL_ZERO_TERMINATED
);
curl_mime_type
(
part
,
"application/json"
);
part
=
curl_mime_addpart
(
mime
);
//curl_mime_data(part, reinterpret_cast<const char*>(n1_msg_hex), CURL_ZERO_TERMINATED);
curl_mime_data
(
part
,
reinterpret_cast
<
const
char
*>
(
buffer
),
size
);
curl_mime_type
(
part
,
"application/vnd.3gpp.5gnas"
);
//curl_mime_name (part, "n1SmMsg");
curl_easy_setopt
(
curl
,
CURLOPT_MIMEPOST
,
mime
);
// Response information.
long
httpCode
(
0
);
std
::
unique_ptr
<
std
::
string
>
httpData
(
new
std
::
string
());
// Hook up data handling function.
curl_easy_setopt
(
curl
,
CURLOPT_WRITEFUNCTION
,
&
callback
);
curl_easy_setopt
(
curl
,
CURLOPT_WRITEDATA
,
httpData
.
get
());
res
=
curl_easy_perform
(
curl
);
curl_easy_getinfo
(
curl
,
CURLINFO_RESPONSE_CODE
,
&
httpCode
);
//get cause from the response
nlohmann
::
json
response_data
;
try
{
response_data
=
nlohmann
::
json
::
parse
(
*
httpData
.
get
());
}
catch
(
nlohmann
::
json
::
exception
&
e
){
std
::
cout
<<
"Could not get the cause from the response"
<<
std
::
endl
;
}
std
::
cout
<<
"[AMF N11] PDU Session Release Request, response from SMF, Http Code "
<<
httpCode
<<
std
::
endl
;
curl_slist_free_all
(
headers
);
curl_easy_cleanup
(
curl
);
curl_mime_free
(
mime
);
}
free
(
buffer
);
}
void
send_pdu_session_release_resource_release_ack
(
std
::
string
smf_ip_address
)
{
std
::
cout
<<
"[AMF N11] PDU Session Release Ack (Update SM Context): N2 SM - Resource Release Ack"
<<
std
::
endl
;
nlohmann
::
json
pdu_session_release_ack
;
//encode
size_t
buffer_size
=
128
;
char
*
buffer
=
(
char
*
)
calloc
(
1
,
buffer_size
);
int
size
=
0
;
ENCODE_U8
(
buffer
,
0x00
,
size
);
std
::
cout
<<
"Buffer: "
<<
std
::
endl
;
for
(
int
i
=
0
;
i
<
size
;
i
++
)
{
printf
(
"%02x "
,
buffer
[
i
]);
}
std
::
cout
<<
"Buffer: "
<<
std
::
endl
;
//Fill Json part
std
::
string
url
=
std
::
string
(
"http://"
);
url
.
append
(
smf_ip_address
);
url
.
append
(
std
::
string
(
"/nsmf-pdusession/v2/sm-contexts/1/modify"
));
//Fill the json part
//Fill the json part
pdu_session_release_ack
[
"n2SmInfoType"
]
=
"PDU_RES_REL_RSP"
;
pdu_session_release_ack
[
"n2SmInfo"
][
"contentId"
]
=
"n2SmMsg"
;
//NGAP
CURL
*
curl
=
curl_easy_init
();
std
::
string
json_part
=
pdu_session_release_ack
.
dump
();
std
::
cout
<<
"Sending message to SMF....
\n
"
;
if
(
curl
)
{
CURLcode
res
;
struct
curl_slist
*
headers
=
nullptr
;
struct
curl_slist
*
slist
=
nullptr
;
curl_mime
*
mime
;
curl_mime
*
alt
;
curl_mimepart
*
part
;
//headers = curl_slist_append(headers, "charsets: utf-8");
headers
=
curl_slist_append
(
headers
,
"content-type: multipart/related"
);
curl_easy_setopt
(
curl
,
CURLOPT_HTTPHEADER
,
headers
);
curl_easy_setopt
(
curl
,
CURLOPT_URL
,
url
.
c_str
());
curl_easy_setopt
(
curl
,
CURLOPT_HTTPGET
,
1
);
curl_easy_setopt
(
curl
,
CURLOPT_TIMEOUT_MS
,
100L
);
curl_easy_setopt
(
curl
,
CURLOPT_INTERFACE
,
"eno1:amf"
);
//hardcoded
mime
=
curl_mime_init
(
curl
);
alt
=
curl_mime_init
(
curl
);
//part with N1N2MessageTransferReqData (JsonData)
part
=
curl_mime_addpart
(
mime
);
curl_mime_data
(
part
,
json_part
.
c_str
(),
CURL_ZERO_TERMINATED
);
curl_mime_type
(
part
,
"application/json"
);
part
=
curl_mime_addpart
(
mime
);
//curl_mime_data(part, reinterpret_cast<const char*>(n1_msg_hex), CURL_ZERO_TERMINATED);
curl_mime_data
(
part
,
reinterpret_cast
<
const
char
*>
(
buffer
),
size
);
curl_mime_type
(
part
,
"application/vnd.3gpp.ngap"
);
curl_mime_name
(
part
,
"n2SmMsg"
);
curl_easy_setopt
(
curl
,
CURLOPT_MIMEPOST
,
mime
);
// Response information.
long
httpCode
(
0
);
std
::
unique_ptr
<
std
::
string
>
httpData
(
new
std
::
string
());
// Hook up data handling function.
curl_easy_setopt
(
curl
,
CURLOPT_WRITEFUNCTION
,
&
callback
);
curl_easy_setopt
(
curl
,
CURLOPT_WRITEDATA
,
httpData
.
get
());
res
=
curl_easy_perform
(
curl
);
curl_easy_getinfo
(
curl
,
CURLINFO_RESPONSE_CODE
,
&
httpCode
);
//get cause from the response
nlohmann
::
json
response_data
;
try
{
response_data
=
nlohmann
::
json
::
parse
(
*
httpData
.
get
());
}
catch
(
nlohmann
::
json
::
exception
&
e
){
std
::
cout
<<
"Could not get the cause from the response"
<<
std
::
endl
;
}
std
::
cout
<<
"[AMF N11] PDU Session Release Ack, response from SMF, Http Code "
<<
httpCode
<<
std
::
endl
;
curl_slist_free_all
(
headers
);
curl_easy_cleanup
(
curl
);
curl_mime_free
(
mime
);
}
free
(
buffer
);
}
void
send_pdu_session_release_complete
(
std
::
string
smf_ip_address
)
{
std
::
cout
<<
"[AMF N11] PDU Session Release Complete (Update SM Context): N1 SM - PDU Session Release Complete"
<<
std
::
endl
;
nlohmann
::
json
pdu_session_release_complete
;
//encode
/*
0000 2e 01 01 c1 d4 00 00 00 00 00 00 00 00 00 00 00
*/
size_t
buffer_size
=
128
;
char
*
buffer
=
(
char
*
)
calloc
(
1
,
buffer_size
);
int
size
=
0
;
ENCODE_U8
(
buffer
,
0x2e
,
size
);
//ExtendedProtocolDiscriminator
ENCODE_U8
(
buffer
+
size
,
0x01
,
size
);
//PDUSessionIdentity
ENCODE_U8
(
buffer
+
size
,
0x01
,
size
);
//ProcedureTransactionIdentity
ENCODE_U8
(
buffer
+
size
,
0xd4
,
size
);
//MessageType
ENCODE_U8
(
buffer
+
size
,
0x00
,
size
);
//Cause
ENCODE_U8
(
buffer
+
size
,
0x00
,
size
);
//Extended protocol configuration options
std
::
cout
<<
"Buffer: "
<<
std
::
endl
;
for
(
int
i
=
0
;
i
<
size
;
i
++
)
{
printf
(
"%02x "
,
buffer
[
i
]);
}
std
::
cout
<<
"Buffer: "
<<
std
::
endl
;
//Fill Json part
std
::
string
url
=
std
::
string
(
"http://"
);
url
.
append
(
smf_ip_address
);
url
.
append
(
std
::
string
(
"/nsmf-pdusession/v2/sm-contexts/1/modify"
));
//Fill the json part
pdu_session_release_complete
[
"cause"
]
=
"INSUFFICIENT_UP_RESOURCES"
;
//need to be updated
pdu_session_release_complete
[
"n1SmMsg"
][
"contentId"
]
=
"n1SmMsg"
;
// NAS
//pdu_session_release_complete["n1MessageContainer"]["n1MessageClass"] = "SM";
//pdu_session_release_complete["n1MessageContainer"]["n1MessageContent"]["contentId"] = "n1SmMsg";
CURL
*
curl
=
curl_easy_init
();
std
::
string
json_part
=
pdu_session_release_complete
.
dump
();
std
::
cout
<<
"Sending message to SMF....
\n
"
;
if
(
curl
)
{
CURLcode
res
;
struct
curl_slist
*
headers
=
nullptr
;
struct
curl_slist
*
slist
=
nullptr
;
curl_mime
*
mime
;
curl_mime
*
alt
;
curl_mimepart
*
part
;
//headers = curl_slist_append(headers, "charsets: utf-8");
headers
=
curl_slist_append
(
headers
,
"content-type: multipart/related"
);
curl_easy_setopt
(
curl
,
CURLOPT_HTTPHEADER
,
headers
);
curl_easy_setopt
(
curl
,
CURLOPT_URL
,
url
.
c_str
());
curl_easy_setopt
(
curl
,
CURLOPT_HTTPGET
,
1
);
curl_easy_setopt
(
curl
,
CURLOPT_TIMEOUT_MS
,
100L
);
curl_easy_setopt
(
curl
,
CURLOPT_INTERFACE
,
"eno1:amf"
);
//hardcoded
mime
=
curl_mime_init
(
curl
);
alt
=
curl_mime_init
(
curl
);
//part with N1N2MessageTransferReqData (JsonData)
part
=
curl_mime_addpart
(
mime
);
curl_mime_data
(
part
,
json_part
.
c_str
(),
CURL_ZERO_TERMINATED
);
curl_mime_type
(
part
,
"application/json"
);
part
=
curl_mime_addpart
(
mime
);
//curl_mime_data(part, reinterpret_cast<const char*>(n1_msg_hex), CURL_ZERO_TERMINATED);
curl_mime_data
(
part
,
reinterpret_cast
<
const
char
*>
(
buffer
),
size
);
curl_mime_type
(
part
,
"application/vnd.3gpp.5gnas"
);
curl_mime_name
(
part
,
"n1SmMsg"
);
curl_easy_setopt
(
curl
,
CURLOPT_MIMEPOST
,
mime
);
// Response information.
long
httpCode
(
0
);
std
::
unique_ptr
<
std
::
string
>
httpData
(
new
std
::
string
());
// Hook up data handling function.
curl_easy_setopt
(
curl
,
CURLOPT_WRITEFUNCTION
,
&
callback
);
curl_easy_setopt
(
curl
,
CURLOPT_WRITEDATA
,
httpData
.
get
());
res
=
curl_easy_perform
(
curl
);
curl_easy_getinfo
(
curl
,
CURLINFO_RESPONSE_CODE
,
&
httpCode
);
//get cause from the response
nlohmann
::
json
response_data
;
try
{
response_data
=
nlohmann
::
json
::
parse
(
*
httpData
.
get
());
}
catch
(
nlohmann
::
json
::
exception
&
e
){
std
::
cout
<<
"Could not get the cause from the response"
<<
std
::
endl
;
}
std
::
cout
<<
"[AMF N11] PDU Session Release Complete, response from SMF, Http Code "
<<
httpCode
<<
std
::
endl
;
curl_slist_free_all
(
headers
);
curl_easy_cleanup
(
curl
);
curl_mime_free
(
mime
);
}
free
(
buffer
);
}
int
main
(
int
argc
,
char
*
argv
[])
int
main
(
int
argc
,
char
*
argv
[])
{
{
std
::
string
smf_ip_address
;
std
::
string
smf_ip_address
;
...
@@ -278,9 +582,17 @@ int main(int argc, char* argv[])
...
@@ -278,9 +582,17 @@ int main(int argc, char* argv[])
}
}
}
}
//PDU Session Establishment procedure
send_pdu_session_establishment_request
(
smf_ip_address
);
send_pdu_session_establishment_request
(
smf_ip_address
);
usleep
(
100000
);
usleep
(
100000
);
send_pdu_session_update_sm_context_establishment
(
smf_ip_address
);
send_pdu_session_update_sm_context_establishment
(
smf_ip_address
);
usleep
(
200000
);
//PDU Session Release procedure
send_pdu_session_release_request
(
smf_ip_address
);
usleep
(
200000
);
send_pdu_session_release_resource_release_ack
(
smf_ip_address
);
usleep
(
200000
);
send_pdu_session_release_complete
(
smf_ip_address
);
return
0
;
return
0
;
}
}
This diff is collapsed.
Click to expand it.
Preview
0%
Loading
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Save comment
Cancel
Please
register
or
sign in
to comment