Commit 323be096 authored by gauthier's avatar gauthier

SXAB: tweaks for session modification

parent e7338ac7
......@@ -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 {
......
......@@ -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());
}
......
......@@ -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]);
}
}
......
......@@ -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)
......
......@@ -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);
};
......
......@@ -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;
......
......@@ -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;
}
......
......@@ -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::remove_far far = {};
pfcp::update_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;
......
......@@ -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);
}
}
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment