mirror of https://github.com/PentHertz/srsLTE.git
converted ho preparation to new s1ap asn1 lib. Extended s1ap test
This commit is contained in:
parent
6d1172de71
commit
25bb36cdc3
|
@ -176,7 +176,7 @@ ItemType convert_enum_idx(ItemType* array, uint32_t nof_types, uint32_t enum_val
|
|||
#define ASN1_S1AP_MAXNOOF_RECOMMENDED_CELLS 16
|
||||
#define ASN1_S1AP_MAXNOOF_RECOMMENDED_ENBS 16
|
||||
#define ASN1_S1AP_ID_MME_UE_S1AP_ID 0
|
||||
#define ASN1_S1AP_ID_HO_TYPE 1
|
||||
#define ASN1_S1AP_ID_HANDOV_TYPE 1
|
||||
#define ASN1_S1AP_ID_CAUSE 2
|
||||
#define ASN1_S1AP_ID_SOURCE_ID 3
|
||||
#define ASN1_S1AP_ID_TARGET_ID 4
|
||||
|
@ -7615,6 +7615,14 @@ struct ho_cancel_ack_s {
|
|||
void to_json(json_writer& j) const;
|
||||
};
|
||||
|
||||
// HandoverType ::= ENUMERATED
|
||||
struct handov_type_opts {
|
||||
enum options { intralte, ltetoutran, ltetogeran, utrantolte, gerantolte, /*...*/ nulltype } value;
|
||||
|
||||
std::string to_string() const;
|
||||
};
|
||||
typedef enumerated<handov_type_opts, true> handov_type_e;
|
||||
|
||||
// HandoverCommandIEs ::= OBJECT SET OF S1AP-PROTOCOL-IES
|
||||
struct ho_cmd_ies_o {
|
||||
// Value ::= OPEN TYPE
|
||||
|
@ -7623,7 +7631,7 @@ struct ho_cmd_ies_o {
|
|||
enum options {
|
||||
mme_ue_s1ap_id,
|
||||
enb_ue_s1ap_id,
|
||||
ho_type,
|
||||
handov_type,
|
||||
nas_security_paramsfrom_e_utran,
|
||||
e_rab_subjectto_data_forwarding_list,
|
||||
e_ra_bto_release_list_ho_cmd,
|
||||
|
@ -7650,7 +7658,7 @@ struct ho_cmd_ies_o {
|
|||
// getters
|
||||
uint64_t& mme_ue_s1ap_id();
|
||||
uint32_t& enb_ue_s1ap_id();
|
||||
ho_type_e& ho_type();
|
||||
handov_type_e& handov_type();
|
||||
unbounded_octstring<true>& nas_security_paramsfrom_e_utran();
|
||||
e_rab_data_forwarding_item_ies_container& e_rab_subjectto_data_forwarding_list();
|
||||
e_rab_list_l& e_ra_bto_release_list_ho_cmd();
|
||||
|
@ -7659,7 +7667,7 @@ struct ho_cmd_ies_o {
|
|||
crit_diagnostics_s& crit_diagnostics();
|
||||
const uint64_t& mme_ue_s1ap_id() const;
|
||||
const uint32_t& enb_ue_s1ap_id() const;
|
||||
const ho_type_e& ho_type() const;
|
||||
const handov_type_e& handov_type() const;
|
||||
const unbounded_octstring<true>& nas_security_paramsfrom_e_utran() const;
|
||||
const e_rab_data_forwarding_item_ies_container& e_rab_subjectto_data_forwarding_list() const;
|
||||
const e_rab_list_l& e_ra_bto_release_list_ho_cmd() const;
|
||||
|
@ -7698,7 +7706,7 @@ struct ho_cmd_ies_container {
|
|||
bool crit_diagnostics_present = false;
|
||||
ie_field_s<integer<uint64_t, 0, 4294967295, false, true> > mme_ue_s1ap_id;
|
||||
ie_field_s<integer<uint32_t, 0, 16777215, false, true> > enb_ue_s1ap_id;
|
||||
ie_field_s<ho_type_e> ho_type;
|
||||
ie_field_s<handov_type_e> handov_type;
|
||||
ie_field_s<unbounded_octstring<true> > nas_security_paramsfrom_e_utran;
|
||||
ie_field_s<e_rab_data_forwarding_item_ies_container> e_rab_subjectto_data_forwarding_list;
|
||||
ie_field_s<dyn_seq_of<protocol_ie_single_container_s<e_rab_item_ies_o>, 1, 256, true> > e_ra_bto_release_list_ho_cmd;
|
||||
|
@ -8952,7 +8960,7 @@ struct ho_request_ies_o {
|
|||
struct types_opts {
|
||||
enum options {
|
||||
mme_ue_s1ap_id,
|
||||
ho_type,
|
||||
handov_type,
|
||||
cause,
|
||||
ueaggregate_maximum_bitrate,
|
||||
e_rab_to_be_setup_list_ho_req,
|
||||
|
@ -8998,7 +9006,7 @@ struct ho_request_ies_o {
|
|||
void to_json(json_writer& j) const;
|
||||
// getters
|
||||
uint64_t& mme_ue_s1ap_id();
|
||||
ho_type_e& ho_type();
|
||||
handov_type_e& handov_type();
|
||||
cause_c& cause();
|
||||
ue_aggregate_maximum_bitrate_s& ueaggregate_maximum_bitrate();
|
||||
e_rab_to_be_setup_item_ho_req_ies_container& e_rab_to_be_setup_list_ho_req();
|
||||
|
@ -9026,7 +9034,7 @@ struct ho_request_ies_o {
|
|||
ce_mode_brestricted_e& ce_mode_brestricted();
|
||||
pending_data_ind_e& pending_data_ind();
|
||||
const uint64_t& mme_ue_s1ap_id() const;
|
||||
const ho_type_e& ho_type() const;
|
||||
const handov_type_e& handov_type() const;
|
||||
const cause_c& cause() const;
|
||||
const ue_aggregate_maximum_bitrate_s& ueaggregate_maximum_bitrate() const;
|
||||
const e_rab_to_be_setup_item_ho_req_ies_container& e_rab_to_be_setup_list_ho_req() const;
|
||||
|
@ -9111,7 +9119,7 @@ struct ho_request_ies_container {
|
|||
bool ce_mode_brestricted_present = false;
|
||||
bool pending_data_ind_present = false;
|
||||
ie_field_s<integer<uint64_t, 0, 4294967295, false, true> > mme_ue_s1ap_id;
|
||||
ie_field_s<ho_type_e> ho_type;
|
||||
ie_field_s<handov_type_e> handov_type;
|
||||
ie_field_s<cause_c> cause;
|
||||
ie_field_s<ue_aggregate_maximum_bitrate_s> ueaggregate_maximum_bitrate;
|
||||
ie_field_s<e_rab_to_be_setup_item_ho_req_ies_container> e_rab_to_be_setup_list_ho_req;
|
||||
|
@ -9382,7 +9390,7 @@ struct ho_required_ies_o {
|
|||
enum options {
|
||||
mme_ue_s1ap_id,
|
||||
enb_ue_s1ap_id,
|
||||
ho_type,
|
||||
handov_type,
|
||||
cause,
|
||||
target_id,
|
||||
direct_forwarding_path_availability,
|
||||
|
@ -9414,7 +9422,7 @@ struct ho_required_ies_o {
|
|||
// getters
|
||||
uint64_t& mme_ue_s1ap_id();
|
||||
uint32_t& enb_ue_s1ap_id();
|
||||
ho_type_e& ho_type();
|
||||
handov_type_e& handov_type();
|
||||
cause_c& cause();
|
||||
target_id_c& target_id();
|
||||
direct_forwarding_path_availability_e& direct_forwarding_path_availability();
|
||||
|
@ -9428,7 +9436,7 @@ struct ho_required_ies_o {
|
|||
ps_service_not_available_e& ps_service_not_available();
|
||||
const uint64_t& mme_ue_s1ap_id() const;
|
||||
const uint32_t& enb_ue_s1ap_id() const;
|
||||
const ho_type_e& ho_type() const;
|
||||
const handov_type_e& handov_type() const;
|
||||
const cause_c& cause() const;
|
||||
const target_id_c& target_id() const;
|
||||
const direct_forwarding_path_availability_e& direct_forwarding_path_availability() const;
|
||||
|
@ -9471,7 +9479,7 @@ struct ho_required_ies_container {
|
|||
bool ps_service_not_available_present = false;
|
||||
ie_field_s<integer<uint64_t, 0, 4294967295, false, true> > mme_ue_s1ap_id;
|
||||
ie_field_s<integer<uint32_t, 0, 16777215, false, true> > enb_ue_s1ap_id;
|
||||
ie_field_s<ho_type_e> ho_type;
|
||||
ie_field_s<handov_type_e> handov_type;
|
||||
ie_field_s<cause_c> cause;
|
||||
ie_field_s<target_id_c> target_id;
|
||||
ie_field_s<direct_forwarding_path_availability_e> direct_forwarding_path_availability;
|
||||
|
|
|
@ -21823,6 +21823,13 @@ void ho_cancel_ack_s::to_json(json_writer& j) const
|
|||
j.end_obj();
|
||||
}
|
||||
|
||||
// HandoverType ::= ENUMERATED
|
||||
std::string handov_type_opts::to_string() const
|
||||
{
|
||||
static constexpr const char* options[] = {"intralte", "ltetoutran", "ltetogeran", "utrantolte", "gerantolte"};
|
||||
return convert_enum_idx(options, 5, value, "handov_type_e");
|
||||
}
|
||||
|
||||
// HandoverCommandIEs ::= OBJECT SET OF S1AP-PROTOCOL-IES
|
||||
uint32_t ho_cmd_ies_o::idx_to_id(uint32_t idx)
|
||||
{
|
||||
|
@ -21876,7 +21883,7 @@ ho_cmd_ies_o::value_c ho_cmd_ies_o::get_value(const uint32_t& id)
|
|||
ret.set(value_c::types::enb_ue_s1ap_id);
|
||||
break;
|
||||
case 1:
|
||||
ret.set(value_c::types::ho_type);
|
||||
ret.set(value_c::types::handov_type);
|
||||
break;
|
||||
case 135:
|
||||
ret.set(value_c::types::nas_security_paramsfrom_e_utran);
|
||||
|
@ -21939,10 +21946,10 @@ uint32_t& ho_cmd_ies_o::value_c::enb_ue_s1ap_id()
|
|||
assert_choice_type("INTEGER (0..16777215)", type_.to_string(), "Value");
|
||||
return c.get<uint32_t>();
|
||||
}
|
||||
ho_type_e& ho_cmd_ies_o::value_c::ho_type()
|
||||
handov_type_e& ho_cmd_ies_o::value_c::handov_type()
|
||||
{
|
||||
assert_choice_type("HoType", type_.to_string(), "Value");
|
||||
return c.get<ho_type_e>();
|
||||
assert_choice_type("HandoverType", type_.to_string(), "Value");
|
||||
return c.get<handov_type_e>();
|
||||
}
|
||||
unbounded_octstring<true>& ho_cmd_ies_o::value_c::nas_security_paramsfrom_e_utran()
|
||||
{
|
||||
|
@ -21984,10 +21991,10 @@ const uint32_t& ho_cmd_ies_o::value_c::enb_ue_s1ap_id() const
|
|||
assert_choice_type("INTEGER (0..16777215)", type_.to_string(), "Value");
|
||||
return c.get<uint32_t>();
|
||||
}
|
||||
const ho_type_e& ho_cmd_ies_o::value_c::ho_type() const
|
||||
const handov_type_e& ho_cmd_ies_o::value_c::handov_type() const
|
||||
{
|
||||
assert_choice_type("HoType", type_.to_string(), "Value");
|
||||
return c.get<ho_type_e>();
|
||||
assert_choice_type("HandoverType", type_.to_string(), "Value");
|
||||
return c.get<handov_type_e>();
|
||||
}
|
||||
const unbounded_octstring<true>& ho_cmd_ies_o::value_c::nas_security_paramsfrom_e_utran() const
|
||||
{
|
||||
|
@ -22053,7 +22060,7 @@ void ho_cmd_ies_o::value_c::set(types::options e)
|
|||
break;
|
||||
case types::enb_ue_s1ap_id:
|
||||
break;
|
||||
case types::ho_type:
|
||||
case types::handov_type:
|
||||
break;
|
||||
case types::nas_security_paramsfrom_e_utran:
|
||||
c.init<unbounded_octstring<true> >();
|
||||
|
@ -22089,8 +22096,8 @@ ho_cmd_ies_o::value_c::value_c(const ho_cmd_ies_o::value_c& other)
|
|||
case types::enb_ue_s1ap_id:
|
||||
c.init(other.c.get<uint32_t>());
|
||||
break;
|
||||
case types::ho_type:
|
||||
c.init(other.c.get<ho_type_e>());
|
||||
case types::handov_type:
|
||||
c.init(other.c.get<handov_type_e>());
|
||||
break;
|
||||
case types::nas_security_paramsfrom_e_utran:
|
||||
c.init(other.c.get<unbounded_octstring<true> >());
|
||||
|
@ -22129,8 +22136,8 @@ ho_cmd_ies_o::value_c& ho_cmd_ies_o::value_c::operator=(const ho_cmd_ies_o::valu
|
|||
case types::enb_ue_s1ap_id:
|
||||
c.set(other.c.get<uint32_t>());
|
||||
break;
|
||||
case types::ho_type:
|
||||
c.set(other.c.get<ho_type_e>());
|
||||
case types::handov_type:
|
||||
c.set(other.c.get<handov_type_e>());
|
||||
break;
|
||||
case types::nas_security_paramsfrom_e_utran:
|
||||
c.set(other.c.get<unbounded_octstring<true> >());
|
||||
|
@ -22168,8 +22175,8 @@ void ho_cmd_ies_o::value_c::to_json(json_writer& j) const
|
|||
case types::enb_ue_s1ap_id:
|
||||
j.write_int("INTEGER (0..16777215)", c.get<uint32_t>());
|
||||
break;
|
||||
case types::ho_type:
|
||||
j.write_str("HoType", c.get<ho_type_e>().to_string());
|
||||
case types::handov_type:
|
||||
j.write_str("HandoverType", c.get<handov_type_e>().to_string());
|
||||
break;
|
||||
case types::nas_security_paramsfrom_e_utran:
|
||||
j.write_str("OCTET STRING", c.get<unbounded_octstring<true> >().to_string());
|
||||
|
@ -22210,8 +22217,8 @@ SRSASN_CODE ho_cmd_ies_o::value_c::pack(bit_ref& bref) const
|
|||
case types::enb_ue_s1ap_id:
|
||||
HANDLE_CODE(pack_integer(bref, c.get<uint32_t>(), (uint32_t)0u, (uint32_t)16777215u, false, true));
|
||||
break;
|
||||
case types::ho_type:
|
||||
HANDLE_CODE(c.get<ho_type_e>().pack(bref));
|
||||
case types::handov_type:
|
||||
HANDLE_CODE(c.get<handov_type_e>().pack(bref));
|
||||
break;
|
||||
case types::nas_security_paramsfrom_e_utran:
|
||||
HANDLE_CODE(c.get<unbounded_octstring<true> >().pack(bref));
|
||||
|
@ -22247,8 +22254,8 @@ SRSASN_CODE ho_cmd_ies_o::value_c::unpack(bit_ref& bref)
|
|||
case types::enb_ue_s1ap_id:
|
||||
HANDLE_CODE(unpack_integer(c.get<uint32_t>(), bref, (uint32_t)0u, (uint32_t)16777215u, false, true));
|
||||
break;
|
||||
case types::ho_type:
|
||||
HANDLE_CODE(c.get<ho_type_e>().unpack(bref));
|
||||
case types::handov_type:
|
||||
HANDLE_CODE(c.get<handov_type_e>().unpack(bref));
|
||||
break;
|
||||
case types::nas_security_paramsfrom_e_utran:
|
||||
HANDLE_CODE(c.get<unbounded_octstring<true> >().unpack(bref));
|
||||
|
@ -22279,7 +22286,7 @@ std::string ho_cmd_ies_o::value_c::types_opts::to_string() const
|
|||
{
|
||||
static constexpr const char* options[] = {"INTEGER (0..4294967295)",
|
||||
"INTEGER (0..16777215)",
|
||||
"HoType",
|
||||
"HandoverType",
|
||||
"OCTET STRING",
|
||||
"",
|
||||
"E-RABList",
|
||||
|
@ -22294,7 +22301,7 @@ template struct protocol_ie_field_s<ho_cmd_ies_o>;
|
|||
ho_cmd_ies_container::ho_cmd_ies_container() :
|
||||
mme_ue_s1ap_id(0, crit_e::reject),
|
||||
enb_ue_s1ap_id(8, crit_e::reject),
|
||||
ho_type(1, crit_e::reject),
|
||||
handov_type(1, crit_e::reject),
|
||||
nas_security_paramsfrom_e_utran(135, crit_e::reject),
|
||||
e_rab_subjectto_data_forwarding_list(12, crit_e::ignore),
|
||||
e_ra_bto_release_list_ho_cmd(13, crit_e::ignore),
|
||||
|
@ -22315,7 +22322,7 @@ SRSASN_CODE ho_cmd_ies_container::pack(bit_ref& bref) const
|
|||
|
||||
HANDLE_CODE(mme_ue_s1ap_id.pack(bref));
|
||||
HANDLE_CODE(enb_ue_s1ap_id.pack(bref));
|
||||
HANDLE_CODE(ho_type.pack(bref));
|
||||
HANDLE_CODE(handov_type.pack(bref));
|
||||
if (nas_security_paramsfrom_e_utran_present) {
|
||||
HANDLE_CODE(nas_security_paramsfrom_e_utran.pack(bref));
|
||||
}
|
||||
|
@ -22360,9 +22367,9 @@ SRSASN_CODE ho_cmd_ies_container::unpack(bit_ref& bref)
|
|||
break;
|
||||
case 1:
|
||||
nof_mandatory_ies--;
|
||||
ho_type.id = c.id;
|
||||
ho_type.crit = c.crit;
|
||||
ho_type.value = c.value.ho_type();
|
||||
handov_type.id = c.id;
|
||||
handov_type.crit = c.crit;
|
||||
handov_type.value = c.value.handov_type();
|
||||
break;
|
||||
case 135:
|
||||
nas_security_paramsfrom_e_utran_present = true;
|
||||
|
@ -22420,7 +22427,7 @@ void ho_cmd_ies_container::to_json(json_writer& j) const
|
|||
j.write_fieldname("");
|
||||
enb_ue_s1ap_id.to_json(j);
|
||||
j.write_fieldname("");
|
||||
ho_type.to_json(j);
|
||||
handov_type.to_json(j);
|
||||
if (nas_security_paramsfrom_e_utran_present) {
|
||||
j.write_fieldname("");
|
||||
nas_security_paramsfrom_e_utran.to_json(j);
|
||||
|
@ -26016,7 +26023,7 @@ ho_request_ies_o::value_c ho_request_ies_o::get_value(const uint32_t& id)
|
|||
ret.set(value_c::types::mme_ue_s1ap_id);
|
||||
break;
|
||||
case 1:
|
||||
ret.set(value_c::types::ho_type);
|
||||
ret.set(value_c::types::handov_type);
|
||||
break;
|
||||
case 2:
|
||||
ret.set(value_c::types::cause);
|
||||
|
@ -26172,10 +26179,10 @@ uint64_t& ho_request_ies_o::value_c::mme_ue_s1ap_id()
|
|||
assert_choice_type("INTEGER (0..4294967295)", type_.to_string(), "Value");
|
||||
return c.get<uint64_t>();
|
||||
}
|
||||
ho_type_e& ho_request_ies_o::value_c::ho_type()
|
||||
handov_type_e& ho_request_ies_o::value_c::handov_type()
|
||||
{
|
||||
assert_choice_type("HoType", type_.to_string(), "Value");
|
||||
return c.get<ho_type_e>();
|
||||
assert_choice_type("HandoverType", type_.to_string(), "Value");
|
||||
return c.get<handov_type_e>();
|
||||
}
|
||||
cause_c& ho_request_ies_o::value_c::cause()
|
||||
{
|
||||
|
@ -26312,10 +26319,10 @@ const uint64_t& ho_request_ies_o::value_c::mme_ue_s1ap_id() const
|
|||
assert_choice_type("INTEGER (0..4294967295)", type_.to_string(), "Value");
|
||||
return c.get<uint64_t>();
|
||||
}
|
||||
const ho_type_e& ho_request_ies_o::value_c::ho_type() const
|
||||
const handov_type_e& ho_request_ies_o::value_c::handov_type() const
|
||||
{
|
||||
assert_choice_type("HoType", type_.to_string(), "Value");
|
||||
return c.get<ho_type_e>();
|
||||
assert_choice_type("HandoverType", type_.to_string(), "Value");
|
||||
return c.get<handov_type_e>();
|
||||
}
|
||||
const cause_c& ho_request_ies_o::value_c::cause() const
|
||||
{
|
||||
|
@ -26515,7 +26522,7 @@ void ho_request_ies_o::value_c::set(types::options e)
|
|||
switch (type_) {
|
||||
case types::mme_ue_s1ap_id:
|
||||
break;
|
||||
case types::ho_type:
|
||||
case types::handov_type:
|
||||
break;
|
||||
case types::cause:
|
||||
c.init<cause_c>();
|
||||
|
@ -26600,8 +26607,8 @@ ho_request_ies_o::value_c::value_c(const ho_request_ies_o::value_c& other)
|
|||
case types::mme_ue_s1ap_id:
|
||||
c.init(other.c.get<uint64_t>());
|
||||
break;
|
||||
case types::ho_type:
|
||||
c.init(other.c.get<ho_type_e>());
|
||||
case types::handov_type:
|
||||
c.init(other.c.get<handov_type_e>());
|
||||
break;
|
||||
case types::cause:
|
||||
c.init(other.c.get<cause_c>());
|
||||
|
@ -26697,8 +26704,8 @@ ho_request_ies_o::value_c& ho_request_ies_o::value_c::operator=(const ho_request
|
|||
case types::mme_ue_s1ap_id:
|
||||
c.set(other.c.get<uint64_t>());
|
||||
break;
|
||||
case types::ho_type:
|
||||
c.set(other.c.get<ho_type_e>());
|
||||
case types::handov_type:
|
||||
c.set(other.c.get<handov_type_e>());
|
||||
break;
|
||||
case types::cause:
|
||||
c.set(other.c.get<cause_c>());
|
||||
|
@ -26793,8 +26800,8 @@ void ho_request_ies_o::value_c::to_json(json_writer& j) const
|
|||
case types::mme_ue_s1ap_id:
|
||||
j.write_int("INTEGER (0..4294967295)", c.get<uint64_t>());
|
||||
break;
|
||||
case types::ho_type:
|
||||
j.write_str("HoType", c.get<ho_type_e>().to_string());
|
||||
case types::handov_type:
|
||||
j.write_str("HandoverType", c.get<handov_type_e>().to_string());
|
||||
break;
|
||||
case types::cause:
|
||||
j.write_fieldname("Cause");
|
||||
|
@ -26903,8 +26910,8 @@ SRSASN_CODE ho_request_ies_o::value_c::pack(bit_ref& bref) const
|
|||
case types::mme_ue_s1ap_id:
|
||||
HANDLE_CODE(pack_integer(bref, c.get<uint64_t>(), (uint64_t)0u, (uint64_t)4294967295u, false, true));
|
||||
break;
|
||||
case types::ho_type:
|
||||
HANDLE_CODE(c.get<ho_type_e>().pack(bref));
|
||||
case types::handov_type:
|
||||
HANDLE_CODE(c.get<handov_type_e>().pack(bref));
|
||||
break;
|
||||
case types::cause:
|
||||
HANDLE_CODE(c.get<cause_c>().pack(bref));
|
||||
|
@ -26997,8 +27004,8 @@ SRSASN_CODE ho_request_ies_o::value_c::unpack(bit_ref& bref)
|
|||
case types::mme_ue_s1ap_id:
|
||||
HANDLE_CODE(unpack_integer(c.get<uint64_t>(), bref, (uint64_t)0u, (uint64_t)4294967295u, false, true));
|
||||
break;
|
||||
case types::ho_type:
|
||||
HANDLE_CODE(c.get<ho_type_e>().unpack(bref));
|
||||
case types::handov_type:
|
||||
HANDLE_CODE(c.get<handov_type_e>().unpack(bref));
|
||||
break;
|
||||
case types::cause:
|
||||
HANDLE_CODE(c.get<cause_c>().unpack(bref));
|
||||
|
@ -27088,7 +27095,7 @@ SRSASN_CODE ho_request_ies_o::value_c::unpack(bit_ref& bref)
|
|||
std::string ho_request_ies_o::value_c::types_opts::to_string() const
|
||||
{
|
||||
static constexpr const char* options[] = {"INTEGER (0..4294967295)",
|
||||
"HoType",
|
||||
"HandoverType",
|
||||
"Cause",
|
||||
"UEAggregateMaximumBitrate",
|
||||
"",
|
||||
|
@ -27122,7 +27129,7 @@ template struct protocol_ie_field_s<ho_request_ies_o>;
|
|||
|
||||
ho_request_ies_container::ho_request_ies_container() :
|
||||
mme_ue_s1ap_id(0, crit_e::reject),
|
||||
ho_type(1, crit_e::reject),
|
||||
handov_type(1, crit_e::reject),
|
||||
cause(2, crit_e::ignore),
|
||||
ueaggregate_maximum_bitrate(66, crit_e::reject),
|
||||
e_rab_to_be_setup_list_ho_req(53, crit_e::reject),
|
||||
|
@ -27177,7 +27184,7 @@ SRSASN_CODE ho_request_ies_container::pack(bit_ref& bref) const
|
|||
pack_length(bref, nof_ies, 0u, 65535u, true);
|
||||
|
||||
HANDLE_CODE(mme_ue_s1ap_id.pack(bref));
|
||||
HANDLE_CODE(ho_type.pack(bref));
|
||||
HANDLE_CODE(handov_type.pack(bref));
|
||||
HANDLE_CODE(cause.pack(bref));
|
||||
HANDLE_CODE(ueaggregate_maximum_bitrate.pack(bref));
|
||||
HANDLE_CODE(e_rab_to_be_setup_list_ho_req.pack(bref));
|
||||
|
@ -27266,9 +27273,9 @@ SRSASN_CODE ho_request_ies_container::unpack(bit_ref& bref)
|
|||
break;
|
||||
case 1:
|
||||
nof_mandatory_ies--;
|
||||
ho_type.id = c.id;
|
||||
ho_type.crit = c.crit;
|
||||
ho_type.value = c.value.ho_type();
|
||||
handov_type.id = c.id;
|
||||
handov_type.crit = c.crit;
|
||||
handov_type.value = c.value.handov_type();
|
||||
break;
|
||||
case 2:
|
||||
nof_mandatory_ies--;
|
||||
|
@ -27443,7 +27450,7 @@ void ho_request_ies_container::to_json(json_writer& j) const
|
|||
j.write_fieldname("");
|
||||
mme_ue_s1ap_id.to_json(j);
|
||||
j.write_fieldname("");
|
||||
ho_type.to_json(j);
|
||||
handov_type.to_json(j);
|
||||
j.write_fieldname("");
|
||||
cause.to_json(j);
|
||||
j.write_fieldname("");
|
||||
|
@ -28441,7 +28448,7 @@ ho_required_ies_o::value_c ho_required_ies_o::get_value(const uint32_t& id)
|
|||
ret.set(value_c::types::enb_ue_s1ap_id);
|
||||
break;
|
||||
case 1:
|
||||
ret.set(value_c::types::ho_type);
|
||||
ret.set(value_c::types::handov_type);
|
||||
break;
|
||||
case 2:
|
||||
ret.set(value_c::types::cause);
|
||||
|
@ -28529,10 +28536,10 @@ uint32_t& ho_required_ies_o::value_c::enb_ue_s1ap_id()
|
|||
assert_choice_type("INTEGER (0..16777215)", type_.to_string(), "Value");
|
||||
return c.get<uint32_t>();
|
||||
}
|
||||
ho_type_e& ho_required_ies_o::value_c::ho_type()
|
||||
handov_type_e& ho_required_ies_o::value_c::handov_type()
|
||||
{
|
||||
assert_choice_type("HoType", type_.to_string(), "Value");
|
||||
return c.get<ho_type_e>();
|
||||
assert_choice_type("HandoverType", type_.to_string(), "Value");
|
||||
return c.get<handov_type_e>();
|
||||
}
|
||||
cause_c& ho_required_ies_o::value_c::cause()
|
||||
{
|
||||
|
@ -28599,10 +28606,10 @@ const uint32_t& ho_required_ies_o::value_c::enb_ue_s1ap_id() const
|
|||
assert_choice_type("INTEGER (0..16777215)", type_.to_string(), "Value");
|
||||
return c.get<uint32_t>();
|
||||
}
|
||||
const ho_type_e& ho_required_ies_o::value_c::ho_type() const
|
||||
const handov_type_e& ho_required_ies_o::value_c::handov_type() const
|
||||
{
|
||||
assert_choice_type("HoType", type_.to_string(), "Value");
|
||||
return c.get<ho_type_e>();
|
||||
assert_choice_type("HandoverType", type_.to_string(), "Value");
|
||||
return c.get<handov_type_e>();
|
||||
}
|
||||
const cause_c& ho_required_ies_o::value_c::cause() const
|
||||
{
|
||||
|
@ -28696,7 +28703,7 @@ void ho_required_ies_o::value_c::set(types::options e)
|
|||
break;
|
||||
case types::enb_ue_s1ap_id:
|
||||
break;
|
||||
case types::ho_type:
|
||||
case types::handov_type:
|
||||
break;
|
||||
case types::cause:
|
||||
c.init<cause_c>();
|
||||
|
@ -28743,8 +28750,8 @@ ho_required_ies_o::value_c::value_c(const ho_required_ies_o::value_c& other)
|
|||
case types::enb_ue_s1ap_id:
|
||||
c.init(other.c.get<uint32_t>());
|
||||
break;
|
||||
case types::ho_type:
|
||||
c.init(other.c.get<ho_type_e>());
|
||||
case types::handov_type:
|
||||
c.init(other.c.get<handov_type_e>());
|
||||
break;
|
||||
case types::cause:
|
||||
c.init(other.c.get<cause_c>());
|
||||
|
@ -28798,8 +28805,8 @@ ho_required_ies_o::value_c& ho_required_ies_o::value_c::operator=(const ho_requi
|
|||
case types::enb_ue_s1ap_id:
|
||||
c.set(other.c.get<uint32_t>());
|
||||
break;
|
||||
case types::ho_type:
|
||||
c.set(other.c.get<ho_type_e>());
|
||||
case types::handov_type:
|
||||
c.set(other.c.get<handov_type_e>());
|
||||
break;
|
||||
case types::cause:
|
||||
c.set(other.c.get<cause_c>());
|
||||
|
@ -28852,8 +28859,8 @@ void ho_required_ies_o::value_c::to_json(json_writer& j) const
|
|||
case types::enb_ue_s1ap_id:
|
||||
j.write_int("INTEGER (0..16777215)", c.get<uint32_t>());
|
||||
break;
|
||||
case types::ho_type:
|
||||
j.write_str("HoType", c.get<ho_type_e>().to_string());
|
||||
case types::handov_type:
|
||||
j.write_str("HandoverType", c.get<handov_type_e>().to_string());
|
||||
break;
|
||||
case types::cause:
|
||||
j.write_fieldname("Cause");
|
||||
|
@ -28905,8 +28912,8 @@ SRSASN_CODE ho_required_ies_o::value_c::pack(bit_ref& bref) const
|
|||
case types::enb_ue_s1ap_id:
|
||||
HANDLE_CODE(pack_integer(bref, c.get<uint32_t>(), (uint32_t)0u, (uint32_t)16777215u, false, true));
|
||||
break;
|
||||
case types::ho_type:
|
||||
HANDLE_CODE(c.get<ho_type_e>().pack(bref));
|
||||
case types::handov_type:
|
||||
HANDLE_CODE(c.get<handov_type_e>().pack(bref));
|
||||
break;
|
||||
case types::cause:
|
||||
HANDLE_CODE(c.get<cause_c>().pack(bref));
|
||||
|
@ -28957,8 +28964,8 @@ SRSASN_CODE ho_required_ies_o::value_c::unpack(bit_ref& bref)
|
|||
case types::enb_ue_s1ap_id:
|
||||
HANDLE_CODE(unpack_integer(c.get<uint32_t>(), bref, (uint32_t)0u, (uint32_t)16777215u, false, true));
|
||||
break;
|
||||
case types::ho_type:
|
||||
HANDLE_CODE(c.get<ho_type_e>().unpack(bref));
|
||||
case types::handov_type:
|
||||
HANDLE_CODE(c.get<handov_type_e>().unpack(bref));
|
||||
break;
|
||||
case types::cause:
|
||||
HANDLE_CODE(c.get<cause_c>().unpack(bref));
|
||||
|
@ -29004,7 +29011,7 @@ std::string ho_required_ies_o::value_c::types_opts::to_string() const
|
|||
{
|
||||
static constexpr const char* options[] = {"INTEGER (0..4294967295)",
|
||||
"INTEGER (0..16777215)",
|
||||
"HoType",
|
||||
"HandoverType",
|
||||
"Cause",
|
||||
"TargetID",
|
||||
"Direct-Forwarding-Path-Availability",
|
||||
|
@ -29024,7 +29031,7 @@ template struct protocol_ie_field_s<ho_required_ies_o>;
|
|||
ho_required_ies_container::ho_required_ies_container() :
|
||||
mme_ue_s1ap_id(0, crit_e::reject),
|
||||
enb_ue_s1ap_id(8, crit_e::reject),
|
||||
ho_type(1, crit_e::reject),
|
||||
handov_type(1, crit_e::reject),
|
||||
cause(2, crit_e::ignore),
|
||||
target_id(4, crit_e::reject),
|
||||
direct_forwarding_path_availability(79, crit_e::ignore),
|
||||
|
@ -29053,7 +29060,7 @@ SRSASN_CODE ho_required_ies_container::pack(bit_ref& bref) const
|
|||
|
||||
HANDLE_CODE(mme_ue_s1ap_id.pack(bref));
|
||||
HANDLE_CODE(enb_ue_s1ap_id.pack(bref));
|
||||
HANDLE_CODE(ho_type.pack(bref));
|
||||
HANDLE_CODE(handov_type.pack(bref));
|
||||
HANDLE_CODE(cause.pack(bref));
|
||||
HANDLE_CODE(target_id.pack(bref));
|
||||
if (direct_forwarding_path_availability_present) {
|
||||
|
@ -29109,9 +29116,9 @@ SRSASN_CODE ho_required_ies_container::unpack(bit_ref& bref)
|
|||
break;
|
||||
case 1:
|
||||
nof_mandatory_ies--;
|
||||
ho_type.id = c.id;
|
||||
ho_type.crit = c.crit;
|
||||
ho_type.value = c.value.ho_type();
|
||||
handov_type.id = c.id;
|
||||
handov_type.crit = c.crit;
|
||||
handov_type.value = c.value.handov_type();
|
||||
break;
|
||||
case 2:
|
||||
nof_mandatory_ies--;
|
||||
|
@ -29199,7 +29206,7 @@ void ho_required_ies_container::to_json(json_writer& j) const
|
|||
j.write_fieldname("");
|
||||
enb_ue_s1ap_id.to_json(j);
|
||||
j.write_fieldname("");
|
||||
ho_type.to_json(j);
|
||||
handov_type.to_json(j);
|
||||
j.write_fieldname("");
|
||||
cause.to_json(j);
|
||||
j.write_fieldname("");
|
||||
|
|
|
@ -91,6 +91,48 @@ int test_initial_ctxt_setup_response()
|
|||
return SRSLTE_SUCCESS;
|
||||
}
|
||||
|
||||
int test_eci_pack()
|
||||
{
|
||||
uint8_t buffer[128];
|
||||
|
||||
uint32_t target_cellid = 0x19C02;
|
||||
fixed_bitstring<28, false, true> cell_id;
|
||||
cell_id.from_number(target_cellid);
|
||||
TESTASSERT(cell_id.to_number() == target_cellid);
|
||||
asn1::bit_ref bref(buffer, sizeof(buffer));
|
||||
cell_id.pack(bref);
|
||||
TESTASSERT(buffer[0] == 0);
|
||||
TESTASSERT(buffer[1] == 0x19);
|
||||
TESTASSERT(buffer[2] == 0xC0);
|
||||
TESTASSERT(buffer[3] == 0x20);
|
||||
|
||||
uint32_t eci = 0x19b01;
|
||||
cell_id.from_number(eci);
|
||||
TESTASSERT(cell_id.to_number() == eci);
|
||||
TESTASSERT(cell_id.to_string() == "0000000000011001101100000001");
|
||||
|
||||
bref = asn1::bit_ref(buffer, sizeof(buffer));
|
||||
cell_id.pack(bref);
|
||||
TESTASSERT(buffer[0] == 0);
|
||||
TESTASSERT(buffer[1] == 0x19);
|
||||
TESTASSERT(buffer[2] == 0xB0);
|
||||
TESTASSERT(buffer[3] == 0x10);
|
||||
|
||||
uint32_t macroenbid = 0x19C;
|
||||
fixed_bitstring<20, false, true> macro_id;
|
||||
macro_id.from_number(macroenbid);
|
||||
TESTASSERT(macro_id.to_number() == macroenbid);
|
||||
bref = asn1::bit_ref(buffer, sizeof(buffer));
|
||||
macro_id.pack(bref);
|
||||
TESTASSERT(buffer[0] == 0);
|
||||
TESTASSERT(buffer[1] == 0x19);
|
||||
TESTASSERT(buffer[2] == 0xC0);
|
||||
|
||||
test_logger.info_hex(buffer, bref.distance_bytes(), "Packed cell id:\n");
|
||||
|
||||
return SRSLTE_SUCCESS;
|
||||
}
|
||||
|
||||
int main()
|
||||
{
|
||||
test_logger.set_level(LOG_LEVEL_DEBUG);
|
||||
|
@ -98,5 +140,6 @@ int main()
|
|||
|
||||
TESTASSERT(unpack_test_served_gummeis_with_multiple_plmns() == SRSLTE_SUCCESS);
|
||||
TESTASSERT(test_initial_ctxt_setup_response() == SRSLTE_SUCCESS);
|
||||
TESTASSERT(test_eci_pack() == SRSLTE_SUCCESS);
|
||||
printf("Success\n");
|
||||
}
|
||||
|
|
|
@ -114,7 +114,6 @@ private:
|
|||
void build_tai_cgi();
|
||||
bool connect_mme();
|
||||
bool setup_s1();
|
||||
bool sctp_send_s1ap_pdu(LIBLTE_S1AP_S1AP_PDU_STRUCT* tx_pdu, uint32_t rnti, const char* procedure_name);
|
||||
bool sctp_send_s1ap_pdu(const asn1::s1ap::s1ap_pdu_c& tx_pdu, uint32_t rnti, const char* procedure_name);
|
||||
|
||||
bool handle_s1ap_rx_pdu(srslte::byte_buffer_t* pdu);
|
||||
|
|
|
@ -434,8 +434,6 @@ bool s1ap::setup_s1()
|
|||
plmn = htonl(plmn);
|
||||
|
||||
tmp32 = htonl(args.enb_id);
|
||||
uint8_t enb_id_bits[4 * 8];
|
||||
liblte_unpack((uint8_t*)&tmp32, 4, enb_id_bits);
|
||||
|
||||
s1ap_pdu_c pdu;
|
||||
pdu.set_init_msg().load_info_obj(ASN1_S1AP_ID_S1_SETUP);
|
||||
|
@ -444,10 +442,7 @@ bool s1ap::setup_s1()
|
|||
container.global_enb_id.value.plm_nid[1] = ((uint8_t*)&plmn)[2];
|
||||
container.global_enb_id.value.plm_nid[2] = ((uint8_t*)&plmn)[3];
|
||||
|
||||
container.global_enb_id.value.enb_id.set_macro_enb_id();
|
||||
memcpy(container.global_enb_id.value.enb_id.macro_enb_id().data(),
|
||||
&enb_id_bits[32 - LIBLTE_S1AP_MACROENB_ID_BIT_STRING_LEN],
|
||||
LIBLTE_S1AP_MACROENB_ID_BIT_STRING_LEN);
|
||||
container.global_enb_id.value.enb_id.set_macro_enb_id().from_number(args.enb_id);
|
||||
|
||||
container.enbname_present = true;
|
||||
container.enbname.value.from_string(args.enb_name);
|
||||
|
@ -1167,44 +1162,6 @@ bool s1ap::sctp_send_s1ap_pdu(const asn1::s1ap::s1ap_pdu_c& tx_pdu, uint32_t rnt
|
|||
return true;
|
||||
}
|
||||
|
||||
bool s1ap::sctp_send_s1ap_pdu(LIBLTE_S1AP_S1AP_PDU_STRUCT* tx_pdu, uint32_t rnti, const char* procedure_name)
|
||||
{
|
||||
srslte::unique_byte_buffer_t buf = srslte::allocate_unique_buffer(*pool, false);
|
||||
if (buf == nullptr) {
|
||||
s1ap_log->error("Fatal Error: Couldn't allocate buffer for %s.\n", procedure_name);
|
||||
return false;
|
||||
}
|
||||
|
||||
liblte_s1ap_pack_s1ap_pdu(tx_pdu, (LIBLTE_BYTE_MSG_STRUCT*)buf.get());
|
||||
if (rnti > 0) {
|
||||
s1ap_log->info_hex(buf->msg, buf->N_bytes, "Sending %s for rnti=0x%x", procedure_name, rnti);
|
||||
} else {
|
||||
s1ap_log->info_hex(buf->msg, buf->N_bytes, "Sending %s to MME", procedure_name);
|
||||
}
|
||||
uint16_t streamid = rnti == 0 ? NONUE_STREAM_ID : get_user_ctxt(rnti)->stream_id;
|
||||
|
||||
ssize_t n_sent = sctp_sendmsg(s1ap_socket.fd(),
|
||||
buf->msg,
|
||||
buf->N_bytes,
|
||||
(struct sockaddr*)&mme_addr,
|
||||
sizeof(struct sockaddr_in),
|
||||
htonl(PPID),
|
||||
0,
|
||||
streamid,
|
||||
0,
|
||||
0);
|
||||
if (n_sent == -1) {
|
||||
if (rnti > 0) {
|
||||
s1ap_log->error("Failed to send %s for rnti=0x%x\n", procedure_name, rnti);
|
||||
} else {
|
||||
s1ap_log->error("Failed to send %s\n", procedure_name);
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
bool s1ap::find_mme_ue_id(uint32_t mme_ue_id, uint16_t* rnti, uint32_t* enb_ue_id)
|
||||
{
|
||||
for (auto& it : users) {
|
||||
|
@ -1280,102 +1237,73 @@ bool s1ap::ue::send_ho_required(uint32_t target_eci,
|
|||
srslte::unique_byte_buffer_t rrc_container)
|
||||
{
|
||||
/*** Setup S1AP PDU as HandoverRequired ***/
|
||||
LIBLTE_S1AP_S1AP_PDU_STRUCT tx_pdu;
|
||||
bzero(&tx_pdu, sizeof(tx_pdu));
|
||||
tx_pdu.choice_type = LIBLTE_S1AP_S1AP_PDU_CHOICE_INITIATINGMESSAGE;
|
||||
tx_pdu.choice.initiatingMessage.choice_type = LIBLTE_S1AP_INITIATINGMESSAGE_CHOICE_HANDOVERREQUIRED;
|
||||
tx_pdu.choice.initiatingMessage.criticality = LIBLTE_S1AP_CRITICALITY_IGNORE;
|
||||
tx_pdu.choice.initiatingMessage.procedureCode = LIBLTE_S1AP_PROC_ID_HANDOVERPREPARATION;
|
||||
LIBLTE_S1AP_MESSAGE_HANDOVERREQUIRED_STRUCT& horeq = tx_pdu.choice.initiatingMessage.choice.HandoverRequired;
|
||||
s1ap_pdu_c tx_pdu;
|
||||
tx_pdu.set_init_msg().load_info_obj(ASN1_S1AP_ID_HO_PREP);
|
||||
ho_required_ies_container& container = tx_pdu.init_msg().value.ho_required().protocol_ies;
|
||||
|
||||
/*** fill HO Required message ***/
|
||||
horeq.eNB_UE_S1AP_ID.ENB_UE_S1AP_ID = ctxt.eNB_UE_S1AP_ID;
|
||||
horeq.MME_UE_S1AP_ID.MME_UE_S1AP_ID = ctxt.MME_UE_S1AP_ID;
|
||||
horeq.Direct_Forwarding_Path_Availability_present = false; // NOTE: X2 for fwd path not supported
|
||||
horeq.HandoverType.e = LIBLTE_S1AP_HANDOVERTYPE_INTRALTE; // NOTE: only intra-LTE HO supported
|
||||
horeq.Cause.choice_type = LIBLTE_S1AP_CAUSE_CHOICE_RADIONETWORK;
|
||||
horeq.Cause.choice.radioNetwork.e = LIBLTE_S1AP_CAUSERADIONETWORK_UNSPECIFIED;
|
||||
container.enb_ue_s1ap_id.value = ctxt.eNB_UE_S1AP_ID;
|
||||
container.mme_ue_s1ap_id.value = ctxt.MME_UE_S1AP_ID;
|
||||
container.direct_forwarding_path_availability_present = false; // NOTE: X2 for fwd path not supported
|
||||
container.handov_type.value.value = handov_type_opts::intralte; // NOTE: only intra-LTE HO supported
|
||||
container.cause.value.set_radio_network().value = cause_radio_network_opts::unspecified;
|
||||
// LIBLTE_S1AP_CAUSERADIONETWORK_S1_INTRA_SYSTEM_HANDOVER_TRIGGERED;
|
||||
|
||||
/*** set the target eNB ***/
|
||||
horeq.TargetID.choice_type = LIBLTE_S1AP_TARGETID_CHOICE_TARGETENB_ID;
|
||||
LIBLTE_S1AP_TARGETENB_ID_STRUCT* targetenb = &horeq.TargetID.choice.targeteNB_ID;
|
||||
horeq.CSG_Id_present = false; // NOTE: CSG/hybrid target cell not supported
|
||||
horeq.CellAccessMode_present = false; // only for hybrid cells
|
||||
container.csg_id_present = false; // NOTE: CSG/hybrid target cell not supported
|
||||
container.cell_access_mode_present = false; // only for hybrid cells
|
||||
// no GERAN/UTRAN/PS
|
||||
horeq.SRVCCHOIndication_present = false;
|
||||
horeq.MSClassmark2_present = false;
|
||||
horeq.MSClassmark3_present = false;
|
||||
horeq.PS_ServiceNotAvailable_present = false;
|
||||
// set PLMN of target and TAI
|
||||
if (horeq.TargetID.choice_type != LIBLTE_S1AP_TARGETID_CHOICE_TARGETENB_ID) {
|
||||
s1ap_log->error("Non-intraLTE HO not supported.\n");
|
||||
return false;
|
||||
}
|
||||
auto& targetenb = container.target_id.value.set_targete_nb_id();
|
||||
// set PLMN and TAI of target
|
||||
// NOTE: Only HO without TAU supported.
|
||||
uint16_t tmp16;
|
||||
tmp16 = htons(s1ap_ptr->args.tac);
|
||||
memcpy(targetenb->selected_TAI.tAC.buffer, &tmp16, sizeof(uint16_t));
|
||||
target_plmn.to_s1ap_plmn_bytes(targetenb->selected_TAI.pLMNidentity.buffer);
|
||||
memcpy(targetenb.sel_tai.tac.data(), &tmp16, sizeof(uint16_t));
|
||||
target_plmn.to_s1ap_plmn_bytes(targetenb.sel_tai.plm_nid.data());
|
||||
// NOTE: Only HO to different Macro eNB is supported.
|
||||
targetenb->global_ENB_ID.eNB_ID.choice_type = LIBLTE_S1AP_ENB_ID_CHOICE_MACROENB_ID;
|
||||
target_plmn.to_s1ap_plmn_bytes(targetenb->global_ENB_ID.pLMNidentity.buffer);
|
||||
uint32_t tmp32 = htonl(target_eci >> 8u);
|
||||
uint8_t enb_id_bits[sizeof(uint32_t) * 8];
|
||||
liblte_unpack((uint8_t*)&tmp32, sizeof(uint32_t), enb_id_bits);
|
||||
memcpy(targetenb->global_ENB_ID.eNB_ID.choice.macroENB_ID.buffer,
|
||||
&enb_id_bits[32 - LIBLTE_S1AP_MACROENB_ID_BIT_STRING_LEN],
|
||||
LIBLTE_S1AP_MACROENB_ID_BIT_STRING_LEN);
|
||||
auto& macroenb = targetenb.global_enb_id.enb_id.set_macro_enb_id();
|
||||
target_plmn.to_s1ap_plmn_bytes(targetenb.global_enb_id.plm_nid.data());
|
||||
macroenb.from_number(target_eci >> 8u);
|
||||
|
||||
/*** fill the transparent container ***/
|
||||
horeq.Source_ToTarget_TransparentContainer_Secondary_present = false;
|
||||
LIBLTE_S1AP_SOURCEENB_TOTARGETENB_TRANSPARENTCONTAINER_STRUCT transparent_cntr;
|
||||
bzero(&transparent_cntr, sizeof(LIBLTE_S1AP_SOURCEENB_TOTARGETENB_TRANSPARENTCONTAINER_STRUCT));
|
||||
transparent_cntr.e_RABInformationList_present = false; // TODO: CHECK
|
||||
transparent_cntr.subscriberProfileIDforRFP_present = false; // TODO: CHECK
|
||||
container.source_to_target_transparent_container_secondary_present = false;
|
||||
sourcee_nb_to_targete_nb_transparent_container_s transparent_cntr;
|
||||
transparent_cntr.e_rab_info_list_present = false; // TODO: CHECK
|
||||
transparent_cntr.subscriber_profile_idfor_rfp_present = false; // TODO: CHECK
|
||||
// - set target cell ID
|
||||
target_plmn.to_s1ap_plmn_bytes(transparent_cntr.targetCell_ID.pLMNidentity.buffer);
|
||||
tmp32 = htonl(target_eci);
|
||||
uint8_t eci_bits[32];
|
||||
liblte_unpack((uint8_t*)&tmp32, sizeof(uint32_t), eci_bits);
|
||||
memcpy(transparent_cntr.targetCell_ID.cell_ID.buffer,
|
||||
&eci_bits[32 - LIBLTE_S1AP_CELLIDENTITY_BIT_STRING_LEN],
|
||||
LIBLTE_S1AP_CELLIDENTITY_BIT_STRING_LEN); // [ENBID|CELLID|0]
|
||||
target_plmn.to_s1ap_plmn_bytes(transparent_cntr.target_cell_id.plm_nid.data());
|
||||
transparent_cntr.target_cell_id.cell_id.from_number(target_eci); // [ENBID|CELLID|0]
|
||||
// info specific to source cell and history of UE
|
||||
// - set as last visited cell the source eNB PLMN & Cell ID
|
||||
transparent_cntr.uE_HistoryInformation.len = 1;
|
||||
transparent_cntr.uE_HistoryInformation.buffer[0].choice_type = LIBLTE_S1AP_LASTVISITEDCELL_ITEM_CHOICE_E_UTRAN_CELL;
|
||||
LIBLTE_S1AP_LASTVISITEDEUTRANCELLINFORMATION_STRUCT* lastvisited =
|
||||
&transparent_cntr.uE_HistoryInformation.buffer[0].choice.e_UTRAN_Cell;
|
||||
lastvisited->cellType.cell_Size.e = LIBLTE_S1AP_CELL_SIZE_MEDIUM;
|
||||
target_plmn.to_s1ap_plmn_bytes(lastvisited->global_Cell_ID.pLMNidentity.buffer);
|
||||
memcpy(lastvisited->global_Cell_ID.cell_ID.buffer,
|
||||
s1ap_ptr->eutran_cgi.cell_ID.buffer,
|
||||
LIBLTE_S1AP_CELLIDENTITY_BIT_STRING_LEN);
|
||||
transparent_cntr.ue_history_info.resize(1);
|
||||
auto& eutra = transparent_cntr.ue_history_info[0].set_e_utran_cell();
|
||||
eutra.cell_type.cell_size.value = cell_size_opts::medium;
|
||||
target_plmn.to_s1ap_plmn_bytes(eutra.global_cell_id.plm_nid.data());
|
||||
for (uint32_t i = 0; i < LIBLTE_S1AP_CELLIDENTITY_BIT_STRING_LEN; ++i) {
|
||||
eutra.global_cell_id.cell_id.set(i, s1ap_ptr->eutran_cgi.cell_ID.buffer[i]);
|
||||
}
|
||||
// - set time spent in current source cell
|
||||
struct timeval ts[3];
|
||||
memcpy(&ts[1], &ctxt.init_timestamp, sizeof(struct timeval));
|
||||
gettimeofday(&ts[2], nullptr);
|
||||
get_time_interval(ts);
|
||||
lastvisited->time_UE_StayedInCell.Time_UE_StayedInCell = (uint16_t)(ts[0].tv_usec / 1.0e6 + ts[0].tv_sec);
|
||||
lastvisited->time_UE_StayedInCell.Time_UE_StayedInCell =
|
||||
std::min(lastvisited->time_UE_StayedInCell.Time_UE_StayedInCell, (uint16_t)4095);
|
||||
eutra.time_ue_stayed_in_cell = (uint16_t)(ts[0].tv_usec / 1.0e6 + ts[0].tv_sec);
|
||||
eutra.time_ue_stayed_in_cell = std::min(eutra.time_ue_stayed_in_cell, (uint16_t)4095);
|
||||
// - fill RRC container
|
||||
memcpy(transparent_cntr.rRC_Container.buffer, rrc_container->msg, rrc_container->N_bytes);
|
||||
transparent_cntr.rRC_Container.n_octets = rrc_container->N_bytes;
|
||||
transparent_cntr.rrc_container.resize(rrc_container->N_bytes);
|
||||
memcpy(transparent_cntr.rrc_container.data(), rrc_container->msg, rrc_container->N_bytes);
|
||||
|
||||
/*** pack Transparent Container into HORequired message ***/
|
||||
LIBLTE_BYTE_MSG_STRUCT bytemsg;
|
||||
bytemsg.N_bytes = 0;
|
||||
LIBLTE_BIT_MSG_STRUCT bitmsg;
|
||||
uint8_t* msg_ptr = bitmsg.msg;
|
||||
liblte_s1ap_pack_sourceenb_totargetenb_transparentcontainer(&transparent_cntr, &msg_ptr);
|
||||
bitmsg.N_bits = msg_ptr - bitmsg.msg;
|
||||
liblte_pack(&bitmsg, &bytemsg);
|
||||
memcpy(horeq.Source_ToTarget_TransparentContainer.buffer, bytemsg.msg, bytemsg.N_bytes);
|
||||
horeq.Source_ToTarget_TransparentContainer.n_octets = bytemsg.N_bytes;
|
||||
uint8_t buffer[4096];
|
||||
asn1::bit_ref bref(buffer, sizeof(buffer));
|
||||
if (transparent_cntr.pack(bref) != asn1::SRSASN_SUCCESS) {
|
||||
s1ap_log->error("Failed to pack transparent container of HO Required message\n");
|
||||
return false;
|
||||
}
|
||||
container.source_to_target_transparent_container.value.resize(bref.distance_bytes());
|
||||
memcpy(container.source_to_target_transparent_container.value.data(), buffer, bref.distance_bytes());
|
||||
|
||||
return s1ap_ptr->sctp_send_s1ap_pdu(&tx_pdu, ctxt.rnti, "HORequired");
|
||||
return s1ap_ptr->sctp_send_s1ap_pdu(tx_pdu, ctxt.rnti, "HORequired");
|
||||
}
|
||||
|
||||
bool s1ap::ue::send_enb_status_transfer_proc(std::vector<bearer_status_info>& bearer_status_list)
|
||||
|
|
Loading…
Reference in New Issue