Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
O
OpenXG-Spgwu-Tiny-Simple
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
CommunityXG
OpenXG-Spgwu-Tiny-Simple
Commits
323be096
Commit
323be096
authored
Apr 02, 2019
by
gauthier
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
SXAB: tweaks for session modification
parent
e7338ac7
Changes
9
Hide whitespace changes
Inline
Side-by-side
Showing
9 changed files
with
90 additions
and
56 deletions
+90
-56
src/common/3gpp_29.244.h
src/common/3gpp_29.244.h
+19
-2
src/gtpv2c/3gpp_29.274.hpp
src/gtpv2c/3gpp_29.274.hpp
+1
-1
src/pgwc/pgw_app.cpp
src/pgwc/pgw_app.cpp
+2
-2
src/pgwc/pgw_config.cpp
src/pgwc/pgw_config.cpp
+0
-12
src/pgwc/pgw_config.hpp
src/pgwc/pgw_config.hpp
+0
-1
src/pgwc/pgw_context.cpp
src/pgwc/pgw_context.cpp
+8
-10
src/pgwc/pgw_paa_dynamic.hpp
src/pgwc/pgw_paa_dynamic.hpp
+15
-6
src/pgwc/pgwc_procedure.cpp
src/pgwc/pgwc_procedure.cpp
+42
-22
src/spgwu/simpleswitch/pfcp_switch.cpp
src/spgwu/simpleswitch/pfcp_switch.cpp
+3
-0
No files found.
src/common/3gpp_29.244.h
View file @
323be096
...
...
@@ -372,7 +372,7 @@ namespace pfcp {
//-------------------------------------
// 8.2.3 F-TEID
typedef
struct
fteid_s
{
struct
fteid_s
{
uint8_t
chid
:
1
;
uint8_t
ch
:
1
;
uint8_t
v4
:
1
;
...
...
@@ -381,8 +381,25 @@ namespace pfcp {
struct
in_addr
ipv4_address
;
struct
in6_addr
ipv6_address
;
uint8_t
choose_id
;
}
fteid_t
;
bool
operator
==
(
const
struct
fteid_s
&
f
)
const
{
return
(
teid
==
f
.
teid
)
and
(
ipv4_address
.
s_addr
==
f
.
ipv4_address
.
s_addr
)
and
(
chid
==
f
.
chid
)
and
(
ch
==
f
.
ch
)
and
(
choose_id
==
f
.
choose_id
)
and
(
ipv6_address
.
s6_addr32
[
0
]
==
f
.
ipv6_address
.
s6_addr32
[
0
])
and
(
ipv6_address
.
s6_addr32
[
1
]
==
f
.
ipv6_address
.
s6_addr32
[
1
])
and
(
ipv6_address
.
s6_addr32
[
2
]
==
f
.
ipv6_address
.
s6_addr32
[
2
])
and
(
ipv6_address
.
s6_addr32
[
3
]
==
f
.
ipv6_address
.
s6_addr32
[
3
])
and
(
v4
==
f
.
v4
)
and
(
v6
==
f
.
v6
);
}
bool
is_zero
()
const
{
return
((
!
v4
)
and
(
!
v6
));}
}
;
typedef
struct
fteid_s
fteid_t
;
//-------------------------------------
// 8.2.4 Network Instance
typedef
struct
network_instance_s
{
...
...
src/gtpv2c/3gpp_29.274.hpp
View file @
323be096
...
...
@@ -361,7 +361,7 @@ public:
void
add_ie
(
std
::
shared_ptr
<
gtpv2c_ie
>
ie
)
{
ies
.
push_back
(
ie
);
std
::
cout
<<
std
::
dec
<<
" add_ie = "
<<
get_message_length
()
<<
" -> "
<<
get_message_length
()
+
gtpv2c_tlv
::
tlv_ie_length
+
ie
.
get
()
->
tlv
.
get_length
()
<<
std
::
endl
;
//
std::cout << std::dec<< " add_ie = " << get_message_length() << " -> "<< get_message_length() + gtpv2c_tlv::tlv_ie_length + ie.get()->tlv.get_length() << std::endl;
set_message_length
(
get_message_length
()
+
gtpv2c_tlv
::
tlv_ie_length
+
ie
.
get
()
->
tlv
.
get_length
());
}
...
...
src/pgwc/pgw_app.cpp
View file @
323be096
...
...
@@ -59,11 +59,11 @@ int pgw_app::apply_config (const pgw_config& cfg)
if
(
cfg
.
apn
[
ia
].
pool_id_iv4
>=
0
)
{
int
pool_id
=
cfg
.
apn
[
ia
].
pool_id_iv4
;
int
range
=
be32toh
(
cfg
.
ue_pool_range_high
[
pool_id
].
s_addr
)
-
be32toh
(
cfg
.
ue_pool_range_low
[
pool_id
].
s_addr
)
;
paa_dynamic
::
get_instance
().
add_pool
(
cfg
.
apn
[
ia
].
apn
,
pool_id
,
cfg
.
ue_pool_range_low
[
pool_id
],
range
);
paa_dynamic
::
get_instance
().
add_pool
(
cfg
.
apn
[
ia
].
apn
_label
,
pool_id
,
cfg
.
ue_pool_range_low
[
pool_id
],
range
);
}
if
(
cfg
.
apn
[
ia
].
pool_id_iv6
>=
0
)
{
int
pool_id
=
cfg
.
apn
[
ia
].
pool_id_iv6
;
paa_dynamic
::
get_instance
().
add_pool
(
cfg
.
apn
[
ia
].
apn
,
pool_id
,
cfg
.
paa_pool6_prefix
[
pool_id
],
cfg
.
paa_pool6_prefix_len
[
pool_id
]);
paa_dynamic
::
get_instance
().
add_pool
(
cfg
.
apn
[
ia
].
apn
_label
,
pool_id
,
cfg
.
paa_pool6_prefix
[
pool_id
],
cfg
.
paa_pool6_prefix_len
[
pool_id
]);
}
}
...
...
src/pgwc/pgw_config.cpp
View file @
323be096
...
...
@@ -467,18 +467,6 @@ bool pgw_config::is_dotted_apn_handled(const string& apn, const pdn_type_t& pdn_
}
return
false
;
}
//------------------------------------------------------------------------------
int
pgw_config
::
get_pa_pool_id
(
const
std
::
string
&
apn
,
int
&
pool_id_ipv4
,
int
&
pool_id_ipv6
)
{
for
(
int
i
=
0
;
i
<
pgw_cfg
.
num_apn
;
i
++
)
{
if
(
0
==
apn
.
compare
(
pgw_cfg
.
apn
[
i
].
apn_label
))
{
pool_id_ipv4
=
pgw_cfg
.
apn
[
i
].
pool_id_iv4
;
pool_id_ipv6
=
pgw_cfg
.
apn
[
i
].
pool_id_iv6
;
return
RETURNok
;
}
}
return
RETURNerror
;
}
//------------------------------------------------------------------------------
int
pgw_config
::
get_pfcp_node_id
(
pfcp
::
node_id_t
&
node_id
)
...
...
src/pgwc/pgw_config.hpp
View file @
323be096
...
...
@@ -231,7 +231,6 @@ public:
int
finalize
();
void
display
();
bool
is_dotted_apn_handled
(
const
std
::
string
&
apn
,
const
pdn_type_t
&
pdn_type
);
int
get_pa_pool_id
(
const
std
::
string
&
apn
,
int
&
pool_id_ipv4
,
int
&
pool_id_ipv6
);
int
get_pfcp_node_id
(
pfcp
::
node_id_t
&
node_id
);
int
get_pfcp_fseid
(
pfcp
::
fseid_t
&
fseid
);
}
;
...
...
src/pgwc/pgw_context.cpp
View file @
323be096
...
...
@@ -46,8 +46,6 @@ extern pgwc::pgw_config pgw_cfg;
void
pgw_eps_bearer
::
release_access_bearer
()
{
released
=
true
;
pdr_id_ul
=
{};
far_id_ul
=
{};
}
//------------------------------------------------------------------------------
std
::
string
pgw_eps_bearer
::
toString
()
const
...
...
@@ -490,8 +488,8 @@ void pgw_context::handle_itti_msg (std::shared_ptr<itti_s5s8_create_session_requ
// paa.pdn_type = sp->pdn_type;
// bool paa_res = csreq->gtp_ies.get(paa);
// if ((not paa_res) || (not paa.is_ip_assigned())) {
//
int ret
= paa_dynamic::get_instance().get_free_paa (sa->apn_in_use, paa);
// if (
ret == RETURNok
) {
//
bool success
= paa_dynamic::get_instance().get_free_paa (sa->apn_in_use, paa);
// if (
success
) {
// set_paa = true;
// } else {
// cause.cause_value = PREFERRED_PDN_TYPE_NOT_SUPPORTED;
...
...
@@ -537,8 +535,8 @@ void pgw_context::handle_itti_msg (std::shared_ptr<itti_s5s8_create_session_requ
if
(
!
pco_ids
.
ci_ipv4_address_allocation_via_dhcpv4
)
{
bool
paa_res
=
csreq
->
gtp_ies
.
get
(
paa
);
if
((
not
paa_res
)
||
(
not
paa
.
is_ip_assigned
()))
{
int
ret
=
paa_dynamic
::
get_instance
().
get_free_paa
(
sa
->
apn_in_use
,
paa
);
if
(
ret
==
RETURNok
)
{
bool
success
=
paa_dynamic
::
get_instance
().
get_free_paa
(
sa
->
apn_in_use
,
paa
);
if
(
success
)
{
set_paa
=
true
;
}
else
{
cause
.
cause_value
=
ALL_DYNAMIC_ADDRESSES_ARE_OCCUPIED
;
...
...
@@ -554,8 +552,8 @@ void pgw_context::handle_itti_msg (std::shared_ptr<itti_s5s8_create_session_requ
case
PDN_TYPE_E_IPV6
:
{
bool
paa_res
=
csreq
->
gtp_ies
.
get
(
paa
);
if
((
not
paa_res
)
||
(
not
paa
.
is_ip_assigned
()))
{
int
ret
=
paa_dynamic
::
get_instance
().
get_free_paa
(
sa
->
apn_in_use
,
paa
);
if
(
ret
==
RETURNok
)
{
bool
success
=
paa_dynamic
::
get_instance
().
get_free_paa
(
sa
->
apn_in_use
,
paa
);
if
(
success
)
{
set_paa
=
true
;
}
else
{
cause
.
cause_value
=
ALL_DYNAMIC_ADDRESSES_ARE_OCCUPIED
;
...
...
@@ -568,8 +566,8 @@ void pgw_context::handle_itti_msg (std::shared_ptr<itti_s5s8_create_session_requ
case
PDN_TYPE_E_IPV4V6
:
{
bool
paa_res
=
csreq
->
gtp_ies
.
get
(
paa
);
if
((
not
paa_res
)
||
(
not
paa
.
is_ip_assigned
()))
{
int
ret
=
paa_dynamic
::
get_instance
().
get_free_paa
(
sa
->
apn_in_use
,
paa
);
if
(
ret
==
RETURNok
)
{
bool
success
=
paa_dynamic
::
get_instance
().
get_free_paa
(
sa
->
apn_in_use
,
paa
);
if
(
success
)
{
set_paa
=
true
;
}
else
{
cause
.
cause_value
=
ALL_DYNAMIC_ADDRESSES_ARE_OCCUPIED
;
...
...
src/pgwc/pgw_paa_dynamic.hpp
View file @
323be096
...
...
@@ -29,6 +29,8 @@
#ifndef FILE_PGW_PAA_DYNAMIC_HPP_SEEN
#define FILE_PGW_PAA_DYNAMIC_HPP_SEEN
#include "logger.hpp"
#include <map>
#include <bitset>
...
...
@@ -185,7 +187,7 @@ public:
paa_dynamic
(
paa_dynamic
const
&
)
=
delete
;
void
operator
=
(
paa_dynamic
const
&
)
=
delete
;
void
add_pool
(
const
std
::
string
&
apn
,
const
int
pool_id
,
const
struct
in_addr
&
first
,
const
int
range
)
void
add_pool
(
const
std
::
string
&
apn
_label
,
const
int
pool_id
,
const
struct
in_addr
&
first
,
const
int
range
)
{
if
(
pool_id
>=
0
)
{
uint32_t
uint32pool_id
=
uint32_t
(
pool_id
);
...
...
@@ -193,15 +195,15 @@ public:
ipv4_pool
pool
(
first
,
range
);
ipv4_pools
[
uint32pool_id
]
=
pool
;
}
if
(
!
apns
.
count
(
apn
))
{
if
(
!
apns
.
count
(
apn
_label
))
{
apn_dynamic_pools
adp
=
{};
adp
.
add_ipv4_pool_id
(
uint32pool_id
);
apns
[
apn
]
=
adp
;
apns
[
apn
_label
]
=
adp
;
}
}
}
void
add_pool
(
const
std
::
string
&
apn
,
const
int
pool_id
,
const
struct
in6_addr
&
prefix
,
const
int
prefix_len
)
void
add_pool
(
const
std
::
string
&
apn
_label
,
const
int
pool_id
,
const
struct
in6_addr
&
prefix
,
const
int
prefix_len
)
{
if
(
pool_id
>=
0
)
{
uint32_t
uint32pool_id
=
uint32_t
(
pool_id
);
...
...
@@ -209,10 +211,10 @@ public:
ipv6_pool
pool
(
prefix
,
prefix_len
);
ipv6_pools
[
uint32pool_id
]
=
pool
;
}
if
(
!
apns
.
count
(
apn
))
{
if
(
!
apns
.
count
(
apn
_label
))
{
apn_dynamic_pools
adp
=
{};
adp
.
add_ipv6_pool_id
(
uint32pool_id
);
apns
[
apn
]
=
adp
;
apns
[
apn
_label
]
=
adp
;
}
}
}
...
...
@@ -227,6 +229,7 @@ public:
return
true
;
}
}
Logger
::
pgwc_app
().
warn
(
"Could not get PAA PDN_TYPE_E_IPV4 for APN %s"
,
apn_label
.
c_str
());
return
false
;
}
else
if
(
paa
.
pdn_type
.
pdn_type
==
PDN_TYPE_E_IPV4V6
)
{
bool
success
=
false
;
...
...
@@ -244,6 +247,7 @@ public:
}
ipv4_pools
[
*
it4
].
free_address
(
paa
.
ipv4_address
);
}
Logger
::
pgwc_app
().
warn
(
"Could not get PAA PDN_TYPE_E_IPV4V6 for APN %s"
,
apn_label
.
c_str
());
return
false
;
}
else
if
(
paa
.
pdn_type
.
pdn_type
==
PDN_TYPE_E_IPV6
)
{
for
(
std
::
vector
<
uint32_t
>::
const_iterator
it6
=
apn_pool
.
ipv6_pool_ids
.
begin
();
it6
!=
apn_pool
.
ipv6_pool_ids
.
end
();
++
it6
)
{
...
...
@@ -251,11 +255,14 @@ public:
return
true
;
}
}
Logger
::
pgwc_app
().
warn
(
"Could not get PAA PDN_TYPE_E_IPV6 for APN %s"
,
apn_label
.
c_str
());
return
false
;
}
}
Logger
::
pgwc_app
().
warn
(
"Could not get PAA for APN %s"
,
apn_label
.
c_str
());
return
false
;
}
bool
release_paa
(
const
std
::
string
&
apn_label
,
const
paa_t
&
paa
)
{
if
(
apns
.
count
(
apn_label
))
{
...
...
@@ -280,6 +287,7 @@ public:
return
true
;
}
}
Logger
::
pgwc_app
().
warn
(
"Could not release PAA for APN %s"
,
apn_label
.
c_str
());
return
false
;
}
...
...
@@ -293,6 +301,7 @@ public:
}
}
}
Logger
::
pgwc_app
().
warn
(
"Could not release PAA for APN %s"
,
apn_label
.
c_str
());
return
false
;
}
...
...
src/pgwc/pgwc_procedure.cpp
View file @
323be096
...
...
@@ -228,8 +228,6 @@ int session_establishment_procedure::run(std::shared_ptr<itti_s5s8_create_sessio
//------------------------------------------------------------------------------
void
session_establishment_procedure
::
handle_itti_msg
(
itti_sxab_session_establishment_response
&
resp
)
{
bool
bearer_context_found
=
false
;
pfcp
::
cause_t
cause
=
{};
resp
.
pfcp_ies
.
get
(
cause
);
if
(
cause
.
cause_value
==
pfcp
::
CAUSE_VALUE_REQUEST_ACCEPTED
)
{
...
...
@@ -243,17 +241,17 @@ void session_establishment_procedure::handle_itti_msg (itti_sxab_session_establi
pgw_eps_bearer
b
=
{};
if
(
ppc
->
get_eps_bearer
(
pdr_id
,
b
))
{
pfcp
::
fteid_t
local_up_fteid
=
{};
if
(
bearer_context_found
)
{
if
(
it
.
get
(
local_up_fteid
))
{
xgpp_conv
::
pfcp_to_core_fteid
(
local_up_fteid
,
b
.
pgw_fteid_s5_s8_up
);
b
.
pgw_fteid_s5_s8_up
.
interface_type
=
S5_S8_PGW_GTP_U
;
// comment if SPGW-C allocate up fteid
pgw_eps_bearer
b2
=
b
;
ppc
->
add_eps_bearer
(
b2
);
}
if
(
it
.
get
(
local_up_fteid
))
{
xgpp_conv
::
pfcp_to_core_fteid
(
local_up_fteid
,
b
.
pgw_fteid_s5_s8_up
);
b
.
pgw_fteid_s5_s8_up
.
interface_type
=
S5_S8_PGW_GTP_U
;
// comment if SPGW-C allocate up fteid
pgw_eps_bearer
b2
=
b
;
ppc
->
add_eps_bearer
(
b2
);
}
// uncomment if SPGW-C allocate up fteid
// ppc->add_eps_bearer(b);
}
}
else
{
Logger
::
pgwc_app
().
error
(
"Could not get EPS bearer for created_pdr %d"
,
pdr_id
.
rule_id
);
}
}
else
{
Logger
::
pgwc_app
().
error
(
"Could not get pdr_id for created_pdr in %s"
,
resp
.
pfcp_ies
.
get_msg_name
());
...
...
@@ -487,6 +485,21 @@ int modify_bearer_procedure::run(std::shared_ptr<itti_s5s8_modify_bearer_request
send_sx
=
true
;
peb
.
pdr_id_dl
=
pdr_id
;
}
else
{
// Update FAR
far_id
.
far_id
=
peb
.
far_id_ul
.
second
.
far_id
;
pfcp
::
update_far
update_far
=
{};
pfcp
::
apply_action_t
apply_action
=
{};
update_far
.
set
(
peb
.
far_id_ul
.
second
);
apply_action
.
forw
=
1
;
update_far
.
set
(
apply_action
);
sx_smr
->
pfcp_ies
.
set
(
update_far
);
send_sx
=
true
;
peb
.
far_id_dl
.
first
=
true
;
}
}
...
...
@@ -634,7 +647,8 @@ void modify_bearer_procedure::handle_itti_msg (itti_sxab_session_modification_re
if
(
it_created_pdr
.
get
(
pdr_id
))
{
pgw_eps_bearer
b
=
{};
if
(
ppc
->
get_eps_bearer
(
pdr_id
,
b
))
{
for
(
auto
it_to_be_modified
:
s5_trigger
->
gtp_ies
.
bearer_contexts_to_be_modified
)
{
for
(
std
::
vector
<
gtpv2c
::
bearer_context_to_be_modified_within_modify_bearer_request
>::
const_iterator
it_to_be_modified
=
s5_trigger
->
gtp_ies
.
bearer_contexts_to_be_modified
.
begin
();
it_to_be_modified
!=
s5_trigger
->
gtp_ies
.
bearer_contexts_to_be_modified
.
end
();
++
it_to_be_modified
)
{
//pfcp::pdr_id_t conv_pdr_id = {};
//ebi2pdr_id(it_to_be_modified.eps_bearer_id, conv_pdr_id, EBI2PDR_ID_DL_BEARER);
...
...
@@ -642,14 +656,17 @@ void modify_bearer_procedure::handle_itti_msg (itti_sxab_session_modification_re
//if (conv_pdr_id.rule_id == pdr_id.rule_id) {
bearer_context_found
=
true
;
// can try the two till SGW not split (depends on developer convention to fake PGW)
it_to_be_modified
.
get_s5_s8_u_sgw_fteid
(
b
.
sgw_fteid_s5_s8_up
);
it_to_be_modified
.
get_s1_u_enb_fteid
(
b
.
sgw_fteid_s5_s8_up
);
it_to_be_modified
->
get_s5_s8_u_sgw_fteid
(
b
.
sgw_fteid_s5_s8_up
);
it_to_be_modified
->
get_s1_u_enb_fteid
(
b
.
sgw_fteid_s5_s8_up
);
pfcp
::
fteid_t
local_up_fteid
=
{};
if
(
it_created_pdr
.
get
(
local_up_fteid
))
{
xgpp_conv
::
pfcp_
from
_core_fteid
(
local_up_fteid
,
b
.
pgw_fteid_s5_s8_up
);
xgpp_conv
::
pfcp_
to
_core_fteid
(
local_up_fteid
,
b
.
pgw_fteid_s5_s8_up
);
b
.
pgw_fteid_s5_s8_up
.
interface_type
=
S5_S8_PGW_GTP_U
;
// comment if SPGW-C allocate up fteid
Logger
::
pgwc_app
().
error
(
"got local_up_fteid from created_pdr %s"
,
b
.
pgw_fteid_s5_s8_up
.
toString
().
c_str
());
}
else
{
Logger
::
pgwc_app
().
error
(
"Could not get local_up_fteid from created_pdr"
);
}
b
.
released
=
false
;
pgw_eps_bearer
b2
=
b
;
...
...
@@ -661,6 +678,9 @@ void modify_bearer_procedure::handle_itti_msg (itti_sxab_session_modification_re
bcc
.
set
(
b
.
ebi
);
bcc
.
set
(
bcc_cause
);
s5_triggered_pending
->
gtp_ies
.
add_bearer_context_modified
(
bcc
);
// Avoid duplicate with update fars
s5_trigger
->
gtp_ies
.
bearer_contexts_to_be_modified
.
erase
(
it_to_be_modified
);
break
;
//}
}
...
...
@@ -702,6 +722,7 @@ void modify_bearer_procedure::handle_itti_msg (itti_sxab_session_modification_re
}
}
// TODO NOT GOOD since we removed the bearer from s5_trigger->gtp_ies.bearer_contexts_to_be_modified
// check we got all responses
for
(
auto
it
:
s5_trigger
->
gtp_ies
.
bearer_contexts_to_be_modified
)
{
ebi_t
ebi_tobe
;
...
...
@@ -768,7 +789,6 @@ int release_access_bearers_procedure::run(std::shared_ptr<itti_s5s8_release_acce
//-------------------
pfcp
::
update_far
far
=
{};
pfcp
::
far_id_t
far_id
=
{};
pfcp
::
apply_action_t
apply_action
=
{};
// pfcp::update_forwarding_parameters forwarding_parameters = {};
// pfcp::update_duplicating_parameters duplicating_parameters = {};
// pfcp::bar_id_t bar_id = {};
...
...
@@ -788,6 +808,7 @@ int release_access_bearers_procedure::run(std::shared_ptr<itti_s5s8_release_acce
if
(
peb
.
far_id_dl
.
first
)
{
far_id
.
far_id
=
peb
.
far_id_dl
.
second
.
far_id
;
//apply_action.buff = 1;
pfcp
::
apply_action_t
apply_action
=
{};
apply_action
.
nocp
=
1
;
far
.
set
(
far_id
);
...
...
@@ -800,17 +821,16 @@ int release_access_bearers_procedure::run(std::shared_ptr<itti_s5s8_release_acce
Logger
::
pgwc_app
().
info
(
"release_access_bearers_procedure , could not get FAR ID of EPS bearer %d"
,
peb
.
ebi
.
ebi
);
}
if
(
peb
.
far_id_ul
.
first
)
{
pfcp
::
remov
e_far
far
=
{};
pfcp
::
updat
e_far
far
=
{};
pfcp
::
far_id_t
far_id
=
{};
far_id
.
far_id
=
peb
.
far_id_ul
.
second
.
far_id
;
pfcp
::
apply_action_t
apply_action
=
{};
apply_action
.
drop
=
1
;
far
.
set
(
far_id
);
far
.
set
(
apply_action
);
sx_smr
->
pfcp_ies
.
set
(
far
);
}
pfcp
::
remove_pdr
pdr
=
{};
pfcp
::
pdr_id_t
pdr_id
=
{};
pdr_id
.
rule_id
=
peb
.
pdr_id_ul
.
rule_id
;
pdr
.
set
(
pdr_id
);
sx_smr
->
pfcp_ies
.
set
(
pdr
);
peb
.
release_access_bearer
();
pgw_eps_bearer
b2
=
peb
;
...
...
src/spgwu/simpleswitch/pfcp_switch.cpp
View file @
323be096
...
...
@@ -670,6 +670,9 @@ void pfcp_switch::handle_pfcp_session_modification_request(std::shared_ptr<itti_
}
pfcp
::
created_pdr
created_pdr
=
{};
created_pdr
.
set
(
cr_pdr
.
pdr_id
.
second
);
if
(
not
allocated_fteid
.
is_zero
())
{
created_pdr
.
set
(
allocated_fteid
);
}
resp
->
pfcp_ies
.
set
(
created_pdr
);
}
}
...
...
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