use crate::error::PfcpError;
use crate::ie::{Ie, IeType};
use crate::message::{header::Header, Message, MsgType};
use crate::types::{Seid, SequenceNumber};
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct SessionModificationRequest {
pub header: Header,
pub fseid: Option<Ie>, pub remove_pdrs: Option<Vec<Ie>>, pub remove_fars: Option<Vec<Ie>>, pub remove_urrs: Option<Vec<Ie>>, pub remove_qers: Option<Vec<Ie>>, pub remove_bars: Option<Vec<Ie>>, pub remove_traffic_endpoints: Option<Vec<Ie>>, pub create_pdrs: Option<Vec<Ie>>, pub create_fars: Option<Vec<Ie>>, pub create_urrs: Option<Vec<Ie>>, pub create_qers: Option<Vec<Ie>>, pub create_bars: Option<Vec<Ie>>, pub create_traffic_endpoints: Option<Vec<Ie>>, pub update_pdrs: Option<Vec<Ie>>, pub update_fars: Option<Vec<Ie>>, pub update_urrs: Option<Vec<Ie>>, pub update_qers: Option<Vec<Ie>>, pub update_bars: Option<Vec<Ie>>, pub update_traffic_endpoints: Option<Vec<Ie>>, pub pfcpsm_req_flags: Option<Ie>, pub query_urrs: Option<Vec<Ie>>, pub fq_csids: Vec<Ie>, pub user_plane_inactivity_timer: Option<Ie>, pub query_urr_reference: Option<Ie>, pub trace_information: Option<Ie>, pub remove_mars: Vec<Ie>, pub update_mars: Vec<Ie>, pub create_mars: Vec<Ie>, pub node_id: Option<Ie>, pub tsc_management_information: Vec<Ie>, pub remove_srrs: Vec<Ie>, pub create_srrs: Vec<Ie>, pub update_srrs: Vec<Ie>, pub provide_atsss_control_information: Option<Ie>, pub ethernet_context_information: Option<Ie>, pub access_availability_information: Vec<Ie>, pub query_packet_rate_statuses: Vec<Ie>, pub s_nssai: Option<Ie>, pub hplmn_s_nssai: Option<Ie>, pub apn_dnn: Option<Ie>, pub rat_type: Option<Ie>, pub group_id: Option<Ie>, pub mbs_session_n4_control_information: Vec<Ie>, pub dscp_to_ppi_control_information: Option<Ie>, pub tl_containers: Vec<Ie>, pub ue_level_measurements_configuration: Option<Ie>, pub pdn_type: Option<Ie>, pub user_id: Option<Ie>, pub recovery_time_stamp: Option<Ie>, pub cp_function_features: Option<Ie>, pub ies: Vec<Ie>,
}
impl Message for SessionModificationRequest {
fn marshal(&self) -> Vec<u8> {
let mut buf = Vec::with_capacity(self.marshaled_size());
self.marshal_into(&mut buf);
buf
}
fn marshal_into(&self, buf: &mut Vec<u8>) {
buf.reserve(self.marshaled_size());
self.header.marshal_into(buf);
if let Some(ref ie) = self.fseid {
ie.marshal_into(buf);
}
if let Some(ref ies) = self.remove_pdrs {
for ie in ies {
ie.marshal_into(buf);
}
}
if let Some(ref ies) = self.remove_fars {
for ie in ies {
ie.marshal_into(buf);
}
}
if let Some(ref ies) = self.remove_urrs {
for ie in ies {
ie.marshal_into(buf);
}
}
if let Some(ref ies) = self.remove_qers {
for ie in ies {
ie.marshal_into(buf);
}
}
if let Some(ref ies) = self.remove_bars {
for ie in ies {
ie.marshal_into(buf);
}
}
if let Some(ref ies) = self.remove_traffic_endpoints {
for ie in ies {
ie.marshal_into(buf);
}
}
if let Some(ref ies) = self.create_pdrs {
for ie in ies {
ie.marshal_into(buf);
}
}
if let Some(ref ies) = self.create_fars {
for ie in ies {
ie.marshal_into(buf);
}
}
if let Some(ref ies) = self.create_urrs {
for ie in ies {
ie.marshal_into(buf);
}
}
if let Some(ref ies) = self.create_qers {
for ie in ies {
ie.marshal_into(buf);
}
}
if let Some(ref ies) = self.create_bars {
for ie in ies {
ie.marshal_into(buf);
}
}
if let Some(ref ies) = self.create_traffic_endpoints {
for ie in ies {
ie.marshal_into(buf);
}
}
if let Some(ref ies) = self.update_pdrs {
for ie in ies {
ie.marshal_into(buf);
}
}
if let Some(ref ies) = self.update_fars {
for ie in ies {
ie.marshal_into(buf);
}
}
if let Some(ref ies) = self.update_urrs {
for ie in ies {
ie.marshal_into(buf);
}
}
if let Some(ref ies) = self.update_qers {
for ie in ies {
ie.marshal_into(buf);
}
}
if let Some(ref ies) = self.update_bars {
for ie in ies {
ie.marshal_into(buf);
}
}
if let Some(ref ies) = self.update_traffic_endpoints {
for ie in ies {
ie.marshal_into(buf);
}
}
if let Some(ref ie) = self.pdn_type {
ie.marshal_into(buf);
}
if let Some(ref ie) = self.user_id {
ie.marshal_into(buf);
}
if let Some(ref ie) = self.s_nssai {
ie.marshal_into(buf);
}
if let Some(ref ie) = self.trace_information {
ie.marshal_into(buf);
}
if let Some(ref ie) = self.recovery_time_stamp {
ie.marshal_into(buf);
}
if let Some(ref ie) = self.cp_function_features {
ie.marshal_into(buf);
}
if let Some(ref ie) = self.apn_dnn {
ie.marshal_into(buf);
}
if let Some(ref ie) = self.user_plane_inactivity_timer {
ie.marshal_into(buf);
}
if let Some(ref ie) = self.query_urr_reference {
ie.marshal_into(buf);
}
if let Some(ref ie) = self.pfcpsm_req_flags {
ie.marshal_into(buf);
}
if let Some(ref ies) = self.query_urrs {
for ie in ies {
ie.marshal_into(buf);
}
}
for ie in &self.fq_csids {
ie.marshal_into(buf);
}
for ie in &self.remove_mars {
ie.marshal_into(buf);
}
for ie in &self.update_mars {
ie.marshal_into(buf);
}
for ie in &self.create_mars {
ie.marshal_into(buf);
}
if let Some(ref ie) = self.node_id {
ie.marshal_into(buf);
}
for ie in &self.tsc_management_information {
ie.marshal_into(buf);
}
for ie in &self.remove_srrs {
ie.marshal_into(buf);
}
for ie in &self.create_srrs {
ie.marshal_into(buf);
}
for ie in &self.update_srrs {
ie.marshal_into(buf);
}
if let Some(ref ie) = self.provide_atsss_control_information {
ie.marshal_into(buf);
}
if let Some(ref ie) = self.ethernet_context_information {
ie.marshal_into(buf);
}
for ie in &self.access_availability_information {
ie.marshal_into(buf);
}
for ie in &self.query_packet_rate_statuses {
ie.marshal_into(buf);
}
if let Some(ref ie) = self.hplmn_s_nssai {
ie.marshal_into(buf);
}
if let Some(ref ie) = self.rat_type {
ie.marshal_into(buf);
}
if let Some(ref ie) = self.group_id {
ie.marshal_into(buf);
}
for ie in &self.mbs_session_n4_control_information {
ie.marshal_into(buf);
}
if let Some(ref ie) = self.dscp_to_ppi_control_information {
ie.marshal_into(buf);
}
for ie in &self.tl_containers {
ie.marshal_into(buf);
}
if let Some(ref ie) = self.ue_level_measurements_configuration {
ie.marshal_into(buf);
}
for ie in &self.ies {
ie.marshal_into(buf);
}
}
fn marshaled_size(&self) -> usize {
let mut size = self.header.len() as usize;
if let Some(ref ie) = self.fseid {
size += ie.len() as usize;
}
if let Some(ref ies) = self.remove_pdrs {
for ie in ies {
size += ie.len() as usize;
}
}
if let Some(ref ies) = self.remove_fars {
for ie in ies {
size += ie.len() as usize;
}
}
if let Some(ref ies) = self.remove_urrs {
for ie in ies {
size += ie.len() as usize;
}
}
if let Some(ref ies) = self.remove_qers {
for ie in ies {
size += ie.len() as usize;
}
}
if let Some(ref ies) = self.remove_bars {
for ie in ies {
size += ie.len() as usize;
}
}
if let Some(ref ies) = self.remove_traffic_endpoints {
for ie in ies {
size += ie.len() as usize;
}
}
if let Some(ref ies) = self.create_pdrs {
for ie in ies {
size += ie.len() as usize;
}
}
if let Some(ref ies) = self.create_fars {
for ie in ies {
size += ie.len() as usize;
}
}
if let Some(ref ies) = self.create_urrs {
for ie in ies {
size += ie.len() as usize;
}
}
if let Some(ref ies) = self.create_qers {
for ie in ies {
size += ie.len() as usize;
}
}
if let Some(ref ies) = self.create_bars {
for ie in ies {
size += ie.len() as usize;
}
}
if let Some(ref ies) = self.create_traffic_endpoints {
for ie in ies {
size += ie.len() as usize;
}
}
if let Some(ref ies) = self.update_pdrs {
for ie in ies {
size += ie.len() as usize;
}
}
if let Some(ref ies) = self.update_fars {
for ie in ies {
size += ie.len() as usize;
}
}
if let Some(ref ies) = self.update_urrs {
for ie in ies {
size += ie.len() as usize;
}
}
if let Some(ref ies) = self.update_qers {
for ie in ies {
size += ie.len() as usize;
}
}
if let Some(ref ies) = self.update_bars {
for ie in ies {
size += ie.len() as usize;
}
}
if let Some(ref ies) = self.update_traffic_endpoints {
for ie in ies {
size += ie.len() as usize;
}
}
if let Some(ref ie) = self.pdn_type {
size += ie.len() as usize;
}
if let Some(ref ie) = self.user_id {
size += ie.len() as usize;
}
if let Some(ref ie) = self.s_nssai {
size += ie.len() as usize;
}
if let Some(ref ie) = self.trace_information {
size += ie.len() as usize;
}
if let Some(ref ie) = self.recovery_time_stamp {
size += ie.len() as usize;
}
if let Some(ref ie) = self.cp_function_features {
size += ie.len() as usize;
}
if let Some(ref ie) = self.apn_dnn {
size += ie.len() as usize;
}
if let Some(ref ie) = self.user_plane_inactivity_timer {
size += ie.len() as usize;
}
if let Some(ref ie) = self.query_urr_reference {
size += ie.len() as usize;
}
if let Some(ref ie) = self.pfcpsm_req_flags {
size += ie.len() as usize;
}
if let Some(ref ies) = self.query_urrs {
for ie in ies {
size += ie.len() as usize;
}
}
for ie in &self.fq_csids {
size += ie.len() as usize;
}
for ie in &self.remove_mars {
size += ie.len() as usize;
}
for ie in &self.update_mars {
size += ie.len() as usize;
}
for ie in &self.create_mars {
size += ie.len() as usize;
}
if let Some(ref ie) = self.node_id {
size += ie.len() as usize;
}
for ie in &self.tsc_management_information {
size += ie.len() as usize;
}
for ie in &self.remove_srrs {
size += ie.len() as usize;
}
for ie in &self.create_srrs {
size += ie.len() as usize;
}
for ie in &self.update_srrs {
size += ie.len() as usize;
}
if let Some(ref ie) = self.provide_atsss_control_information {
size += ie.len() as usize;
}
if let Some(ref ie) = self.ethernet_context_information {
size += ie.len() as usize;
}
for ie in &self.access_availability_information {
size += ie.len() as usize;
}
for ie in &self.query_packet_rate_statuses {
size += ie.len() as usize;
}
if let Some(ref ie) = self.hplmn_s_nssai {
size += ie.len() as usize;
}
if let Some(ref ie) = self.rat_type {
size += ie.len() as usize;
}
if let Some(ref ie) = self.group_id {
size += ie.len() as usize;
}
for ie in &self.mbs_session_n4_control_information {
size += ie.len() as usize;
}
if let Some(ref ie) = self.dscp_to_ppi_control_information {
size += ie.len() as usize;
}
for ie in &self.tl_containers {
size += ie.len() as usize;
}
if let Some(ref ie) = self.ue_level_measurements_configuration {
size += ie.len() as usize;
}
for ie in &self.ies {
size += ie.len() as usize;
}
size
}
fn unmarshal(data: &[u8]) -> Result<Self, PfcpError> {
let header = Header::unmarshal(data)?;
let mut fseid = None;
let mut remove_pdrs = None;
let mut remove_fars = None;
let mut remove_urrs = None;
let mut remove_qers = None;
let mut remove_bars = None;
let mut remove_traffic_endpoints = None;
let mut create_pdrs = None;
let mut create_fars = None;
let mut create_urrs = None;
let mut create_qers = None;
let mut create_bars = None;
let mut create_traffic_endpoints = None;
let mut update_pdrs = None;
let mut update_fars = None;
let mut update_urrs = None;
let mut update_qers = None;
let mut update_bars = None;
let mut update_traffic_endpoints = None;
let mut pdn_type = None;
let mut user_id = None;
let mut s_nssai = None;
let mut trace_information = None;
let mut recovery_time_stamp = None;
let mut cp_function_features = None;
let mut apn_dnn = None;
let mut user_plane_inactivity_timer = None;
let mut query_urr_reference = None;
let mut pfcpsm_req_flags = None;
let mut query_urrs = None;
let mut fq_csids = Vec::new();
let mut remove_mars = Vec::new();
let mut update_mars = Vec::new();
let mut create_mars = Vec::new();
let mut node_id = None;
let mut tsc_management_information = Vec::new();
let mut remove_srrs = Vec::new();
let mut create_srrs = Vec::new();
let mut update_srrs = Vec::new();
let mut provide_atsss_control_information = None;
let mut ethernet_context_information = None;
let mut access_availability_information = Vec::new();
let mut query_packet_rate_statuses = Vec::new();
let mut hplmn_s_nssai = None;
let mut rat_type = None;
let mut group_id = None;
let mut mbs_session_n4_control_information = Vec::new();
let mut dscp_to_ppi_control_information = None;
let mut tl_containers = Vec::new();
let mut ue_level_measurements_configuration = None;
let mut ies = Vec::new();
let mut offset = header.len() as usize;
while offset < data.len() {
let ie = Ie::unmarshal(&data[offset..])?;
let ie_len = ie.len() as usize;
match ie.ie_type {
IeType::Fseid => fseid = Some(ie),
IeType::RemovePdr => remove_pdrs.get_or_insert(Vec::new()).push(ie),
IeType::RemoveFar => remove_fars.get_or_insert(Vec::new()).push(ie),
IeType::RemoveUrr => remove_urrs.get_or_insert(Vec::new()).push(ie),
IeType::RemoveQer => remove_qers.get_or_insert(Vec::new()).push(ie),
IeType::RemoveBar => remove_bars.get_or_insert(Vec::new()).push(ie),
IeType::RemoveTrafficEndpoint => {
remove_traffic_endpoints.get_or_insert(Vec::new()).push(ie)
}
IeType::CreatePdr => create_pdrs.get_or_insert(Vec::new()).push(ie),
IeType::CreateFar => create_fars.get_or_insert(Vec::new()).push(ie),
IeType::CreateUrr => create_urrs.get_or_insert(Vec::new()).push(ie),
IeType::CreateQer => create_qers.get_or_insert(Vec::new()).push(ie),
IeType::CreateBar => create_bars.get_or_insert(Vec::new()).push(ie),
IeType::CreateTrafficEndpoint => {
create_traffic_endpoints.get_or_insert(Vec::new()).push(ie)
}
IeType::UpdatePdr => update_pdrs.get_or_insert(Vec::new()).push(ie),
IeType::UpdateFar => update_fars.get_or_insert(Vec::new()).push(ie),
IeType::UpdateUrr => update_urrs.get_or_insert(Vec::new()).push(ie),
IeType::UpdateQer => update_qers.get_or_insert(Vec::new()).push(ie),
IeType::UpdateBar => update_bars.get_or_insert(Vec::new()).push(ie),
IeType::UpdateTrafficEndpoint => {
update_traffic_endpoints.get_or_insert(Vec::new()).push(ie)
}
IeType::PdnType => pdn_type = Some(ie),
IeType::UserId => user_id = Some(ie),
IeType::Snssai => s_nssai = Some(ie),
IeType::TraceInformation => trace_information = Some(ie),
IeType::RecoveryTimeStamp => recovery_time_stamp = Some(ie),
IeType::CpFunctionFeatures => cp_function_features = Some(ie),
IeType::ApnDnn => apn_dnn = Some(ie),
IeType::UserPlaneInactivityTimer => user_plane_inactivity_timer = Some(ie),
IeType::QueryUrrReference => query_urr_reference = Some(ie),
IeType::PfcpsmReqFlags => pfcpsm_req_flags = Some(ie),
IeType::QueryUrr => query_urrs.get_or_insert(Vec::new()).push(ie),
IeType::FqCsid => fq_csids.push(ie),
IeType::RemoveMar => remove_mars.push(ie),
IeType::UpdateMar => update_mars.push(ie),
IeType::CreateMar => create_mars.push(ie),
IeType::NodeId => node_id = Some(ie),
IeType::TscManagementInformationWithinSessionModificationRequest => {
tsc_management_information.push(ie)
}
IeType::RemoveSrr => remove_srrs.push(ie),
IeType::CreateSrr => create_srrs.push(ie),
IeType::UpdateSrr => update_srrs.push(ie),
IeType::ProvideAtsssControlInformation => {
provide_atsss_control_information = Some(ie)
}
IeType::EthernetContextInformation => ethernet_context_information = Some(ie),
IeType::AccessAvailabilityInformation => access_availability_information.push(ie),
IeType::QueryPacketRateStatusWithinSessionModificationRequest => {
query_packet_rate_statuses.push(ie)
}
IeType::HplmnSNssai => hplmn_s_nssai = Some(ie),
IeType::RatType => rat_type = Some(ie),
IeType::GroupId => group_id = Some(ie),
IeType::MbsSessionN4ControlInformation => {
mbs_session_n4_control_information.push(ie)
}
IeType::DscpToPpiControlInformation => dscp_to_ppi_control_information = Some(ie),
IeType::TlContainer => tl_containers.push(ie),
IeType::UeLevelMeasurementsConfiguration => {
ue_level_measurements_configuration = Some(ie)
}
_ => ies.push(ie),
}
offset += ie_len;
}
Ok(SessionModificationRequest {
header,
fseid,
remove_pdrs,
remove_fars,
remove_urrs,
remove_qers,
remove_bars,
remove_traffic_endpoints,
create_pdrs,
create_fars,
create_urrs,
create_qers,
create_bars,
create_traffic_endpoints,
update_pdrs,
update_fars,
update_urrs,
update_qers,
update_bars,
update_traffic_endpoints,
pdn_type,
user_id,
s_nssai,
trace_information,
recovery_time_stamp,
cp_function_features,
apn_dnn,
user_plane_inactivity_timer,
query_urr_reference,
pfcpsm_req_flags,
query_urrs,
fq_csids,
remove_mars,
update_mars,
create_mars,
node_id,
tsc_management_information,
remove_srrs,
create_srrs,
update_srrs,
provide_atsss_control_information,
ethernet_context_information,
access_availability_information,
query_packet_rate_statuses,
hplmn_s_nssai,
rat_type,
group_id,
mbs_session_n4_control_information,
dscp_to_ppi_control_information,
tl_containers,
ue_level_measurements_configuration,
ies,
})
}
fn msg_type(&self) -> MsgType {
MsgType::SessionModificationRequest
}
fn seid(&self) -> Option<Seid> {
if self.header.has_seid {
Some(self.header.seid)
} else {
None
}
}
fn sequence(&self) -> SequenceNumber {
self.header.sequence_number
}
fn set_sequence(&mut self, seq: SequenceNumber) {
self.header.sequence_number = seq;
}
fn ies(&self, ie_type: IeType) -> crate::message::IeIter<'_> {
use crate::message::IeIter;
match ie_type {
IeType::Fseid => IeIter::single(self.fseid.as_ref(), ie_type),
IeType::RemovePdr => {
IeIter::multiple(self.remove_pdrs.as_deref().unwrap_or(&[]), ie_type)
}
IeType::RemoveFar => {
IeIter::multiple(self.remove_fars.as_deref().unwrap_or(&[]), ie_type)
}
IeType::RemoveUrr => {
IeIter::multiple(self.remove_urrs.as_deref().unwrap_or(&[]), ie_type)
}
IeType::RemoveQer => {
IeIter::multiple(self.remove_qers.as_deref().unwrap_or(&[]), ie_type)
}
IeType::RemoveBar => {
IeIter::multiple(self.remove_bars.as_deref().unwrap_or(&[]), ie_type)
}
IeType::RemoveTrafficEndpoint => IeIter::multiple(
self.remove_traffic_endpoints.as_deref().unwrap_or(&[]),
ie_type,
),
IeType::CreatePdr => {
IeIter::multiple(self.create_pdrs.as_deref().unwrap_or(&[]), ie_type)
}
IeType::CreateFar => {
IeIter::multiple(self.create_fars.as_deref().unwrap_or(&[]), ie_type)
}
IeType::CreateUrr => {
IeIter::multiple(self.create_urrs.as_deref().unwrap_or(&[]), ie_type)
}
IeType::CreateQer => {
IeIter::multiple(self.create_qers.as_deref().unwrap_or(&[]), ie_type)
}
IeType::CreateBar => {
IeIter::multiple(self.create_bars.as_deref().unwrap_or(&[]), ie_type)
}
IeType::CreateTrafficEndpoint => IeIter::multiple(
self.create_traffic_endpoints.as_deref().unwrap_or(&[]),
ie_type,
),
IeType::UpdatePdr => {
IeIter::multiple(self.update_pdrs.as_deref().unwrap_or(&[]), ie_type)
}
IeType::UpdateFar => {
IeIter::multiple(self.update_fars.as_deref().unwrap_or(&[]), ie_type)
}
IeType::UpdateUrr => {
IeIter::multiple(self.update_urrs.as_deref().unwrap_or(&[]), ie_type)
}
IeType::UpdateQer => {
IeIter::multiple(self.update_qers.as_deref().unwrap_or(&[]), ie_type)
}
IeType::UpdateBar => {
IeIter::multiple(self.update_bars.as_deref().unwrap_or(&[]), ie_type)
}
IeType::UpdateTrafficEndpoint => IeIter::multiple(
self.update_traffic_endpoints.as_deref().unwrap_or(&[]),
ie_type,
),
IeType::PfcpsmReqFlags => IeIter::single(self.pfcpsm_req_flags.as_ref(), ie_type),
IeType::QueryUrr => {
IeIter::multiple(self.query_urrs.as_deref().unwrap_or(&[]), ie_type)
}
IeType::FqCsid => IeIter::multiple(&self.fq_csids, ie_type),
IeType::UserPlaneInactivityTimer => {
IeIter::single(self.user_plane_inactivity_timer.as_ref(), ie_type)
}
IeType::QueryUrrReference => IeIter::single(self.query_urr_reference.as_ref(), ie_type),
IeType::TraceInformation => IeIter::single(self.trace_information.as_ref(), ie_type),
IeType::NodeId => IeIter::single(self.node_id.as_ref(), ie_type),
IeType::EthernetContextInformation => {
IeIter::single(self.ethernet_context_information.as_ref(), ie_type)
}
IeType::RatType => IeIter::single(self.rat_type.as_ref(), ie_type),
IeType::Snssai => IeIter::single(self.s_nssai.as_ref(), ie_type),
IeType::ApnDnn => IeIter::single(self.apn_dnn.as_ref(), ie_type),
IeType::PdnType => IeIter::single(self.pdn_type.as_ref(), ie_type),
IeType::UserId => IeIter::single(self.user_id.as_ref(), ie_type),
IeType::RecoveryTimeStamp => IeIter::single(self.recovery_time_stamp.as_ref(), ie_type),
IeType::CpFunctionFeatures => {
IeIter::single(self.cp_function_features.as_ref(), ie_type)
}
IeType::RemoveMar => IeIter::multiple(&self.remove_mars, ie_type),
IeType::UpdateMar => IeIter::multiple(&self.update_mars, ie_type),
IeType::CreateMar => IeIter::multiple(&self.create_mars, ie_type),
IeType::TscManagementInformationWithinSessionModificationRequest => {
IeIter::multiple(&self.tsc_management_information, ie_type)
}
IeType::RemoveSrr => IeIter::multiple(&self.remove_srrs, ie_type),
IeType::CreateSrr => IeIter::multiple(&self.create_srrs, ie_type),
IeType::UpdateSrr => IeIter::multiple(&self.update_srrs, ie_type),
IeType::ProvideAtsssControlInformation => {
IeIter::single(self.provide_atsss_control_information.as_ref(), ie_type)
}
IeType::AccessAvailabilityInformation => {
IeIter::multiple(&self.access_availability_information, ie_type)
}
IeType::QueryPacketRateStatusWithinSessionModificationRequest => {
IeIter::multiple(&self.query_packet_rate_statuses, ie_type)
}
IeType::HplmnSNssai => IeIter::single(self.hplmn_s_nssai.as_ref(), ie_type),
IeType::GroupId => IeIter::single(self.group_id.as_ref(), ie_type),
IeType::MbsSessionN4ControlInformation => {
IeIter::multiple(&self.mbs_session_n4_control_information, ie_type)
}
IeType::DscpToPpiControlInformation => {
IeIter::single(self.dscp_to_ppi_control_information.as_ref(), ie_type)
}
IeType::TlContainer => IeIter::multiple(&self.tl_containers, ie_type),
IeType::UeLevelMeasurementsConfiguration => {
IeIter::single(self.ue_level_measurements_configuration.as_ref(), ie_type)
}
_ => IeIter::generic(&self.ies, ie_type),
}
}
fn all_ies(&self) -> Vec<&Ie> {
let mut result = Vec::new();
if let Some(ref ie) = self.fseid {
result.push(ie);
}
if let Some(ref vec) = self.remove_pdrs {
result.extend(vec.iter());
}
if let Some(ref vec) = self.remove_fars {
result.extend(vec.iter());
}
if let Some(ref vec) = self.remove_urrs {
result.extend(vec.iter());
}
if let Some(ref vec) = self.remove_qers {
result.extend(vec.iter());
}
if let Some(ref vec) = self.remove_bars {
result.extend(vec.iter());
}
if let Some(ref vec) = self.remove_traffic_endpoints {
result.extend(vec.iter());
}
if let Some(ref vec) = self.create_pdrs {
result.extend(vec.iter());
}
if let Some(ref vec) = self.create_fars {
result.extend(vec.iter());
}
if let Some(ref vec) = self.create_urrs {
result.extend(vec.iter());
}
if let Some(ref vec) = self.create_qers {
result.extend(vec.iter());
}
if let Some(ref vec) = self.create_bars {
result.extend(vec.iter());
}
if let Some(ref vec) = self.create_traffic_endpoints {
result.extend(vec.iter());
}
if let Some(ref vec) = self.update_pdrs {
result.extend(vec.iter());
}
if let Some(ref vec) = self.update_fars {
result.extend(vec.iter());
}
if let Some(ref vec) = self.update_urrs {
result.extend(vec.iter());
}
if let Some(ref vec) = self.update_qers {
result.extend(vec.iter());
}
if let Some(ref vec) = self.update_bars {
result.extend(vec.iter());
}
if let Some(ref vec) = self.update_traffic_endpoints {
result.extend(vec.iter());
}
if let Some(ref ie) = self.pdn_type {
result.push(ie);
}
if let Some(ref ie) = self.user_id {
result.push(ie);
}
if let Some(ref ie) = self.s_nssai {
result.push(ie);
}
if let Some(ref ie) = self.trace_information {
result.push(ie);
}
if let Some(ref ie) = self.recovery_time_stamp {
result.push(ie);
}
if let Some(ref ie) = self.cp_function_features {
result.push(ie);
}
if let Some(ref ie) = self.apn_dnn {
result.push(ie);
}
if let Some(ref ie) = self.user_plane_inactivity_timer {
result.push(ie);
}
if let Some(ref ie) = self.query_urr_reference {
result.push(ie);
}
if let Some(ref ie) = self.pfcpsm_req_flags {
result.push(ie);
}
if let Some(ref vec) = self.query_urrs {
result.extend(vec.iter());
}
result.extend(self.fq_csids.iter());
result.extend(self.remove_mars.iter());
result.extend(self.update_mars.iter());
result.extend(self.create_mars.iter());
if let Some(ref ie) = self.node_id {
result.push(ie);
}
result.extend(self.tsc_management_information.iter());
result.extend(self.remove_srrs.iter());
result.extend(self.create_srrs.iter());
result.extend(self.update_srrs.iter());
if let Some(ref ie) = self.provide_atsss_control_information {
result.push(ie);
}
if let Some(ref ie) = self.ethernet_context_information {
result.push(ie);
}
result.extend(self.access_availability_information.iter());
result.extend(self.query_packet_rate_statuses.iter());
if let Some(ref ie) = self.hplmn_s_nssai {
result.push(ie);
}
if let Some(ref ie) = self.rat_type {
result.push(ie);
}
if let Some(ref ie) = self.group_id {
result.push(ie);
}
result.extend(self.mbs_session_n4_control_information.iter());
if let Some(ref ie) = self.dscp_to_ppi_control_information {
result.push(ie);
}
result.extend(self.tl_containers.iter());
if let Some(ref ie) = self.ue_level_measurements_configuration {
result.push(ie);
}
result.extend(self.ies.iter());
result
}
}
#[derive(Debug, Default)]
pub struct SessionModificationRequestBuilder {
seid: Seid,
seq: SequenceNumber,
fseid: Option<Ie>,
remove_pdrs: Option<Vec<Ie>>,
remove_fars: Option<Vec<Ie>>,
remove_urrs: Option<Vec<Ie>>,
remove_qers: Option<Vec<Ie>>,
remove_bars: Option<Vec<Ie>>,
remove_traffic_endpoints: Option<Vec<Ie>>,
create_pdrs: Option<Vec<Ie>>,
create_fars: Option<Vec<Ie>>,
create_urrs: Option<Vec<Ie>>,
create_qers: Option<Vec<Ie>>,
create_bars: Option<Vec<Ie>>,
create_traffic_endpoints: Option<Vec<Ie>>,
update_pdrs: Option<Vec<Ie>>,
update_fars: Option<Vec<Ie>>,
update_urrs: Option<Vec<Ie>>,
update_qers: Option<Vec<Ie>>,
update_bars: Option<Vec<Ie>>,
update_traffic_endpoints: Option<Vec<Ie>>,
pdn_type: Option<Ie>,
user_id: Option<Ie>,
s_nssai: Option<Ie>,
trace_information: Option<Ie>,
recovery_time_stamp: Option<Ie>,
cp_function_features: Option<Ie>,
apn_dnn: Option<Ie>,
user_plane_inactivity_timer: Option<Ie>,
query_urr_reference: Option<Ie>,
pfcpsm_req_flags: Option<Ie>,
query_urrs: Option<Vec<Ie>>,
fq_csids: Vec<Ie>,
remove_mars: Vec<Ie>,
update_mars: Vec<Ie>,
create_mars: Vec<Ie>,
node_id: Option<Ie>,
tsc_management_information: Vec<Ie>,
remove_srrs: Vec<Ie>,
create_srrs: Vec<Ie>,
update_srrs: Vec<Ie>,
provide_atsss_control_information: Option<Ie>,
ethernet_context_information: Option<Ie>,
access_availability_information: Vec<Ie>,
query_packet_rate_statuses: Vec<Ie>,
hplmn_s_nssai: Option<Ie>,
rat_type: Option<Ie>,
group_id: Option<Ie>,
mbs_session_n4_control_information: Vec<Ie>,
dscp_to_ppi_control_information: Option<Ie>,
tl_containers: Vec<Ie>,
ue_level_measurements_configuration: Option<Ie>,
ies: Vec<Ie>,
}
impl SessionModificationRequestBuilder {
pub fn new(seid: impl Into<Seid>, seq: impl Into<SequenceNumber>) -> Self {
SessionModificationRequestBuilder {
seid: seid.into(),
seq: seq.into(),
fseid: None,
remove_pdrs: None,
remove_fars: None,
remove_urrs: None,
remove_qers: None,
remove_bars: None,
remove_traffic_endpoints: None,
create_pdrs: None,
create_fars: None,
create_urrs: None,
create_qers: None,
create_bars: None,
create_traffic_endpoints: None,
update_pdrs: None,
update_fars: None,
update_urrs: None,
update_qers: None,
update_bars: None,
update_traffic_endpoints: None,
pdn_type: None,
user_id: None,
s_nssai: None,
trace_information: None,
recovery_time_stamp: None,
cp_function_features: None,
apn_dnn: None,
user_plane_inactivity_timer: None,
query_urr_reference: None,
pfcpsm_req_flags: None,
query_urrs: None,
fq_csids: Vec::new(),
remove_mars: Vec::new(),
update_mars: Vec::new(),
create_mars: Vec::new(),
node_id: None,
tsc_management_information: Vec::new(),
remove_srrs: Vec::new(),
create_srrs: Vec::new(),
update_srrs: Vec::new(),
provide_atsss_control_information: None,
ethernet_context_information: None,
access_availability_information: Vec::new(),
query_packet_rate_statuses: Vec::new(),
hplmn_s_nssai: None,
rat_type: None,
group_id: None,
mbs_session_n4_control_information: Vec::new(),
dscp_to_ppi_control_information: None,
tl_containers: Vec::new(),
ue_level_measurements_configuration: None,
ies: Vec::new(),
}
}
pub fn fseid<T>(mut self, seid: impl Into<Seid>, ip_addr: T) -> Self
where
T: Into<std::net::IpAddr>,
{
use crate::ie::fseid::Fseid;
let ip_addr = ip_addr.into();
let fseid = match ip_addr {
std::net::IpAddr::V4(v4) => Fseid::new(seid, Some(v4), None),
std::net::IpAddr::V6(v6) => Fseid::new(seid, None, Some(v6)),
};
self.fseid = Some(Ie::new(IeType::Fseid, fseid.marshal()));
self
}
pub fn fseid_ie(mut self, fseid: Ie) -> Self {
self.fseid = Some(fseid);
self
}
pub fn remove_pdrs(mut self, remove_pdrs: Vec<Ie>) -> Self {
self.remove_pdrs = Some(remove_pdrs);
self
}
pub fn add_remove_pdr(mut self, pdr: crate::ie::remove_pdr::RemovePdr) -> Self {
self.remove_pdrs
.get_or_insert_with(Vec::new)
.push(pdr.to_ie());
self
}
pub fn remove_fars(mut self, remove_fars: Vec<Ie>) -> Self {
self.remove_fars = Some(remove_fars);
self
}
pub fn add_remove_far(mut self, far: crate::ie::remove_far::RemoveFar) -> Self {
self.remove_fars
.get_or_insert_with(Vec::new)
.push(far.to_ie());
self
}
pub fn remove_urrs(mut self, remove_urrs: Vec<Ie>) -> Self {
self.remove_urrs = Some(remove_urrs);
self
}
pub fn add_remove_urr(mut self, urr: crate::ie::remove_urr::RemoveUrr) -> Self {
self.remove_urrs
.get_or_insert_with(Vec::new)
.push(urr.to_ie());
self
}
pub fn remove_qers(mut self, remove_qers: Vec<Ie>) -> Self {
self.remove_qers = Some(remove_qers);
self
}
pub fn add_remove_qer(mut self, qer: crate::ie::remove_qer::RemoveQer) -> Self {
self.remove_qers
.get_or_insert_with(Vec::new)
.push(qer.to_ie());
self
}
pub fn remove_bars(mut self, remove_bars: Vec<Ie>) -> Self {
self.remove_bars = Some(remove_bars);
self
}
pub fn add_remove_bar(mut self, bar: crate::ie::remove_bar::RemoveBar) -> Self {
self.remove_bars
.get_or_insert_with(Vec::new)
.push(bar.to_ie());
self
}
pub fn remove_traffic_endpoints(mut self, remove_traffic_endpoints: Vec<Ie>) -> Self {
self.remove_traffic_endpoints = Some(remove_traffic_endpoints);
self
}
pub fn add_remove_traffic_endpoint(
mut self,
te: crate::ie::remove_traffic_endpoint::RemoveTrafficEndpoint,
) -> Self {
self.remove_traffic_endpoints
.get_or_insert_with(Vec::new)
.push(te.to_ie());
self
}
pub fn create_pdrs(mut self, create_pdrs: Vec<Ie>) -> Self {
self.create_pdrs = Some(create_pdrs);
self
}
pub fn add_pdr(mut self, pdr: crate::ie::create_pdr::CreatePdr) -> Self {
self.create_pdrs
.get_or_insert_with(Vec::new)
.push(pdr.to_ie());
self
}
pub fn create_fars(mut self, create_fars: Vec<Ie>) -> Self {
self.create_fars = Some(create_fars);
self
}
pub fn add_far(mut self, far: crate::ie::create_far::CreateFar) -> Self {
self.create_fars
.get_or_insert_with(Vec::new)
.push(far.to_ie());
self
}
pub fn create_urrs(mut self, create_urrs: Vec<Ie>) -> Self {
self.create_urrs = Some(create_urrs);
self
}
pub fn add_urr(mut self, urr: crate::ie::create_urr::CreateUrr) -> Self {
self.create_urrs
.get_or_insert_with(Vec::new)
.push(urr.to_ie());
self
}
pub fn create_qers(mut self, create_qers: Vec<Ie>) -> Self {
self.create_qers = Some(create_qers);
self
}
pub fn add_qer(mut self, qer: crate::ie::create_qer::CreateQer) -> Self {
self.create_qers
.get_or_insert_with(Vec::new)
.push(qer.to_ie());
self
}
pub fn create_bars(mut self, create_bars: Vec<Ie>) -> Self {
self.create_bars = Some(create_bars);
self
}
pub fn add_bar(mut self, bar: crate::ie::create_bar::CreateBar) -> Self {
self.create_bars
.get_or_insert_with(Vec::new)
.push(bar.to_ie());
self
}
pub fn create_traffic_endpoints(mut self, create_traffic_endpoints: Vec<Ie>) -> Self {
self.create_traffic_endpoints = Some(create_traffic_endpoints);
self
}
pub fn add_traffic_endpoint(
mut self,
te: crate::ie::create_traffic_endpoint::CreateTrafficEndpoint,
) -> Self {
self.create_traffic_endpoints
.get_or_insert_with(Vec::new)
.push(te.to_ie());
self
}
pub fn update_pdrs(mut self, update_pdrs: Vec<Ie>) -> Self {
self.update_pdrs = Some(update_pdrs);
self
}
pub fn add_update_pdr(mut self, pdr: crate::ie::update_pdr::UpdatePdr) -> Self {
self.update_pdrs
.get_or_insert_with(Vec::new)
.push(pdr.to_ie());
self
}
pub fn update_fars(mut self, update_fars: Vec<Ie>) -> Self {
self.update_fars = Some(update_fars);
self
}
pub fn add_update_far(mut self, far: crate::ie::update_far::UpdateFar) -> Self {
self.update_fars
.get_or_insert_with(Vec::new)
.push(far.to_ie());
self
}
pub fn update_urrs(mut self, update_urrs: Vec<Ie>) -> Self {
self.update_urrs = Some(update_urrs);
self
}
pub fn add_update_urr(mut self, urr: crate::ie::update_urr::UpdateUrr) -> Self {
self.update_urrs
.get_or_insert_with(Vec::new)
.push(urr.to_ie());
self
}
pub fn update_qers(mut self, update_qers: Vec<Ie>) -> Self {
self.update_qers = Some(update_qers);
self
}
pub fn add_update_qer(mut self, qer: crate::ie::update_qer::UpdateQer) -> Self {
self.update_qers
.get_or_insert_with(Vec::new)
.push(qer.to_ie());
self
}
pub fn update_bars(mut self, update_bars: Vec<Ie>) -> Self {
self.update_bars = Some(update_bars);
self
}
pub fn add_update_bar(mut self, bar: crate::ie::update_bar::UpdateBar) -> Self {
self.update_bars
.get_or_insert_with(Vec::new)
.push(bar.to_ie());
self
}
pub fn update_traffic_endpoints(mut self, update_traffic_endpoints: Vec<Ie>) -> Self {
self.update_traffic_endpoints = Some(update_traffic_endpoints);
self
}
pub fn add_update_traffic_endpoint(
mut self,
te: crate::ie::update_traffic_endpoint::UpdateTrafficEndpoint,
) -> Self {
self.update_traffic_endpoints
.get_or_insert_with(Vec::new)
.push(te.to_ie());
self
}
pub fn pdn_type(mut self, pdn_type: Ie) -> Self {
self.pdn_type = Some(pdn_type);
self
}
pub fn user_id(mut self, user_id: Ie) -> Self {
self.user_id = Some(user_id);
self
}
pub fn s_nssai(mut self, s_nssai: Ie) -> Self {
self.s_nssai = Some(s_nssai);
self
}
pub fn trace_information(mut self, trace_information: Ie) -> Self {
self.trace_information = Some(trace_information);
self
}
pub fn recovery_time_stamp(mut self, timestamp: std::time::SystemTime) -> Self {
use crate::ie::recovery_time_stamp::RecoveryTimeStamp;
let ts = RecoveryTimeStamp::new(timestamp);
self.recovery_time_stamp = Some(Ie::new(IeType::RecoveryTimeStamp, ts.marshal().to_vec()));
self
}
pub fn recovery_time_stamp_ie(mut self, recovery_time_stamp: Ie) -> Self {
self.recovery_time_stamp = Some(recovery_time_stamp);
self
}
pub fn cp_function_features(mut self, cp_function_features: Ie) -> Self {
self.cp_function_features = Some(cp_function_features);
self
}
pub fn apn_dnn(mut self, apn_dnn: Ie) -> Self {
self.apn_dnn = Some(apn_dnn);
self
}
pub fn user_plane_inactivity_timer(mut self, user_plane_inactivity_timer: Ie) -> Self {
self.user_plane_inactivity_timer = Some(user_plane_inactivity_timer);
self
}
pub fn query_urr_reference(mut self, ie: Ie) -> Self {
self.query_urr_reference = Some(ie);
self
}
pub fn pfcpsm_req_flags(mut self, pfcpsm_req_flags: Ie) -> Self {
self.pfcpsm_req_flags = Some(pfcpsm_req_flags);
self
}
pub fn query_urrs(mut self, query_urrs: Vec<Ie>) -> Self {
self.query_urrs = Some(query_urrs);
self
}
pub fn fq_csid(mut self, ie: Ie) -> Self {
self.fq_csids.push(ie);
self
}
pub fn node_id(mut self, node_id: Ie) -> Self {
self.node_id = Some(node_id);
self
}
pub fn ethernet_context_information(mut self, ethernet_context_information: Ie) -> Self {
self.ethernet_context_information = Some(ethernet_context_information);
self
}
pub fn rat_type(mut self, rat_type: Ie) -> Self {
self.rat_type = Some(rat_type);
self
}
pub fn remove_mar(mut self, ie: Ie) -> Self {
self.remove_mars.push(ie);
self
}
pub fn add_update_mar(mut self, mar: crate::ie::update_mar::UpdateMar) -> Self {
self.update_mars.push(mar.to_ie());
self
}
pub fn update_mar(mut self, ie: Ie) -> Self {
self.update_mars.push(ie);
self
}
pub fn add_create_mar(mut self, mar: crate::ie::create_mar::CreateMar) -> Self {
self.create_mars.push(mar.to_ie());
self
}
pub fn create_mar(mut self, ie: Ie) -> Self {
self.create_mars.push(ie);
self
}
pub fn remove_srr(mut self, ie: Ie) -> Self {
self.remove_srrs.push(ie);
self
}
pub fn tsc_management_information(mut self, ie: Ie) -> Self {
self.tsc_management_information.push(ie);
self
}
pub fn add_create_srr(mut self, srr: crate::ie::create_srr::CreateSrr) -> Self {
self.create_srrs.push(srr.to_ie());
self
}
pub fn create_srr(mut self, ie: Ie) -> Self {
self.create_srrs.push(ie);
self
}
pub fn add_update_srr(mut self, srr: crate::ie::update_srr::UpdateSrr) -> Self {
self.update_srrs.push(srr.to_ie());
self
}
pub fn update_srr(mut self, ie: Ie) -> Self {
self.update_srrs.push(ie);
self
}
pub fn provide_atsss_control_information(mut self, ie: Ie) -> Self {
self.provide_atsss_control_information = Some(ie);
self
}
pub fn query_packet_rate_status(mut self, ie: Ie) -> Self {
self.query_packet_rate_statuses.push(ie);
self
}
pub fn access_availability_information(mut self, ie: Ie) -> Self {
self.access_availability_information.push(ie);
self
}
pub fn hplmn_s_nssai(mut self, ie: Ie) -> Self {
self.hplmn_s_nssai = Some(ie);
self
}
pub fn group_id(mut self, ie: Ie) -> Self {
self.group_id = Some(ie);
self
}
pub fn add_mbs_session_n4_control_information(mut self, ie: Ie) -> Self {
self.mbs_session_n4_control_information.push(ie);
self
}
pub fn dscp_to_ppi_control_information(mut self, ie: Ie) -> Self {
self.dscp_to_ppi_control_information = Some(ie);
self
}
pub fn tl_container(mut self, ie: Ie) -> Self {
self.tl_containers.push(ie);
self
}
pub fn ue_level_measurements_configuration(mut self, ie: Ie) -> Self {
self.ue_level_measurements_configuration = Some(ie);
self
}
pub fn ies(mut self, ies: Vec<Ie>) -> Self {
self.ies = ies;
self
}
pub fn build(self) -> SessionModificationRequest {
let mut payload_len = 0;
if let Some(ie) = &self.fseid {
payload_len += ie.len();
}
if let Some(ies) = &self.remove_pdrs {
for ie in ies {
payload_len += ie.len();
}
}
if let Some(ies) = &self.remove_fars {
for ie in ies {
payload_len += ie.len();
}
}
if let Some(ies) = &self.remove_urrs {
for ie in ies {
payload_len += ie.len();
}
}
if let Some(ies) = &self.remove_qers {
for ie in ies {
payload_len += ie.len();
}
}
if let Some(ies) = &self.remove_bars {
for ie in ies {
payload_len += ie.len();
}
}
if let Some(ies) = &self.remove_traffic_endpoints {
for ie in ies {
payload_len += ie.len();
}
}
if let Some(ies) = &self.create_pdrs {
for ie in ies {
payload_len += ie.len();
}
}
if let Some(ies) = &self.create_fars {
for ie in ies {
payload_len += ie.len();
}
}
if let Some(ies) = &self.create_urrs {
for ie in ies {
payload_len += ie.len();
}
}
if let Some(ies) = &self.create_qers {
for ie in ies {
payload_len += ie.len();
}
}
if let Some(ies) = &self.create_bars {
for ie in ies {
payload_len += ie.len();
}
}
if let Some(ies) = &self.create_traffic_endpoints {
for ie in ies {
payload_len += ie.len();
}
}
if let Some(ies) = &self.update_pdrs {
for ie in ies {
payload_len += ie.len();
}
}
if let Some(ies) = &self.update_fars {
for ie in ies {
payload_len += ie.len();
}
}
if let Some(ies) = &self.update_urrs {
for ie in ies {
payload_len += ie.len();
}
}
if let Some(ies) = &self.update_qers {
for ie in ies {
payload_len += ie.len();
}
}
if let Some(ies) = &self.update_bars {
for ie in ies {
payload_len += ie.len();
}
}
if let Some(ies) = &self.update_traffic_endpoints {
for ie in ies {
payload_len += ie.len();
}
}
if let Some(ie) = &self.pdn_type {
payload_len += ie.len();
}
if let Some(ie) = &self.user_id {
payload_len += ie.len();
}
if let Some(ie) = &self.s_nssai {
payload_len += ie.len();
}
if let Some(ie) = &self.trace_information {
payload_len += ie.len();
}
if let Some(ie) = &self.recovery_time_stamp {
payload_len += ie.len();
}
if let Some(ie) = &self.cp_function_features {
payload_len += ie.len();
}
if let Some(ie) = &self.apn_dnn {
payload_len += ie.len();
}
if let Some(ie) = &self.user_plane_inactivity_timer {
payload_len += ie.len();
}
if let Some(ie) = &self.query_urr_reference {
payload_len += ie.len();
}
if let Some(ie) = &self.pfcpsm_req_flags {
payload_len += ie.len();
}
if let Some(ies) = &self.query_urrs {
for ie in ies {
payload_len += ie.len();
}
}
for ie in &self.fq_csids {
payload_len += ie.len();
}
for ie in &self.remove_mars {
payload_len += ie.len();
}
for ie in &self.update_mars {
payload_len += ie.len();
}
for ie in &self.create_mars {
payload_len += ie.len();
}
if let Some(ie) = &self.node_id {
payload_len += ie.len();
}
for ie in &self.tsc_management_information {
payload_len += ie.len();
}
for ie in &self.remove_srrs {
payload_len += ie.len();
}
for ie in &self.create_srrs {
payload_len += ie.len();
}
for ie in &self.update_srrs {
payload_len += ie.len();
}
if let Some(ie) = &self.provide_atsss_control_information {
payload_len += ie.len();
}
if let Some(ie) = &self.ethernet_context_information {
payload_len += ie.len();
}
for ie in &self.access_availability_information {
payload_len += ie.len();
}
for ie in &self.query_packet_rate_statuses {
payload_len += ie.len();
}
if let Some(ie) = &self.hplmn_s_nssai {
payload_len += ie.len();
}
if let Some(ie) = &self.rat_type {
payload_len += ie.len();
}
if let Some(ie) = &self.group_id {
payload_len += ie.len();
}
for ie in &self.mbs_session_n4_control_information {
payload_len += ie.len();
}
if let Some(ie) = &self.dscp_to_ppi_control_information {
payload_len += ie.len();
}
for ie in &self.tl_containers {
payload_len += ie.len();
}
if let Some(ie) = &self.ue_level_measurements_configuration {
payload_len += ie.len();
}
for ie in &self.ies {
payload_len += ie.len();
}
let mut header = Header::new(
MsgType::SessionModificationRequest,
true,
self.seid,
self.seq,
);
header.length = payload_len + (header.len() - 4);
SessionModificationRequest {
header,
fseid: self.fseid,
remove_pdrs: self.remove_pdrs,
remove_fars: self.remove_fars,
remove_urrs: self.remove_urrs,
remove_qers: self.remove_qers,
remove_bars: self.remove_bars,
remove_traffic_endpoints: self.remove_traffic_endpoints,
create_pdrs: self.create_pdrs,
create_fars: self.create_fars,
create_urrs: self.create_urrs,
create_qers: self.create_qers,
create_bars: self.create_bars,
create_traffic_endpoints: self.create_traffic_endpoints,
update_pdrs: self.update_pdrs,
update_fars: self.update_fars,
update_urrs: self.update_urrs,
update_qers: self.update_qers,
update_bars: self.update_bars,
update_traffic_endpoints: self.update_traffic_endpoints,
pdn_type: self.pdn_type,
user_id: self.user_id,
s_nssai: self.s_nssai,
trace_information: self.trace_information,
recovery_time_stamp: self.recovery_time_stamp,
cp_function_features: self.cp_function_features,
apn_dnn: self.apn_dnn,
user_plane_inactivity_timer: self.user_plane_inactivity_timer,
query_urr_reference: self.query_urr_reference,
pfcpsm_req_flags: self.pfcpsm_req_flags,
query_urrs: self.query_urrs,
fq_csids: self.fq_csids,
remove_mars: self.remove_mars,
update_mars: self.update_mars,
create_mars: self.create_mars,
node_id: self.node_id,
tsc_management_information: self.tsc_management_information,
remove_srrs: self.remove_srrs,
create_srrs: self.create_srrs,
update_srrs: self.update_srrs,
provide_atsss_control_information: self.provide_atsss_control_information,
ethernet_context_information: self.ethernet_context_information,
access_availability_information: self.access_availability_information,
query_packet_rate_statuses: self.query_packet_rate_statuses,
hplmn_s_nssai: self.hplmn_s_nssai,
rat_type: self.rat_type,
group_id: self.group_id,
mbs_session_n4_control_information: self.mbs_session_n4_control_information,
dscp_to_ppi_control_information: self.dscp_to_ppi_control_information,
tl_containers: self.tl_containers,
ue_level_measurements_configuration: self.ue_level_measurements_configuration,
ies: self.ies,
}
}
pub fn marshal(self) -> Vec<u8> {
self.build().marshal()
}
}
impl SessionModificationRequest {}
#[cfg(test)]
mod tests {
use super::*;
use std::net::{IpAddr, Ipv4Addr, Ipv6Addr};
#[test]
fn test_builder_minimal() {
let msg = SessionModificationRequestBuilder::new(0x1234567890ABCDEF, 100).build();
assert_eq!(*msg.header.seid, 0x1234567890ABCDEF);
assert_eq!(*msg.header.sequence_number, 100);
assert_eq!(msg.msg_type(), MsgType::SessionModificationRequest);
assert!(msg.fseid.is_none());
assert!(msg.create_pdrs.is_none());
}
#[test]
fn test_builder_with_fseid() {
let msg = SessionModificationRequestBuilder::new(0xABCD, 200)
.fseid(0x5678, Ipv4Addr::new(10, 0, 0, 1))
.build();
assert!(msg.fseid.is_some());
let fseid_ie = msg.fseid.unwrap();
assert_eq!(fseid_ie.ie_type, IeType::Fseid);
}
#[test]
fn test_builder_with_fseid_ipv6() {
let ipv6 = Ipv6Addr::new(0x2001, 0xdb8, 0, 0, 0, 0, 0, 1);
let msg = SessionModificationRequestBuilder::new(0x1111, 300)
.fseid(0x2222, ipv6)
.build();
assert!(msg.fseid.is_some());
}
#[test]
fn test_builder_with_fseid_ipaddr() {
let ip = IpAddr::V4(Ipv4Addr::new(192, 168, 1, 1));
let msg = SessionModificationRequestBuilder::new(0x3333, 400)
.fseid(0x4444, ip)
.build();
assert!(msg.fseid.is_some());
}
#[test]
fn test_builder_create_pdrs() {
let pdr_ie = Ie::new(IeType::CreatePdr, vec![0, 56, 0, 2, 0, 1]);
let msg = SessionModificationRequestBuilder::new(0x5555, 500)
.create_pdrs(vec![pdr_ie.clone()])
.build();
assert!(msg.create_pdrs.is_some());
let pdrs = msg.create_pdrs.unwrap();
assert_eq!(pdrs.len(), 1);
assert_eq!(pdrs[0].ie_type, IeType::CreatePdr);
}
#[test]
fn test_builder_create_fars() {
let far_ie = Ie::new(IeType::CreateFar, vec![0, 108, 0, 4, 0, 0, 0, 1]);
let msg = SessionModificationRequestBuilder::new(0x6666, 600)
.create_fars(vec![far_ie.clone()])
.build();
assert!(msg.create_fars.is_some());
assert_eq!(msg.create_fars.unwrap().len(), 1);
}
#[test]
fn test_builder_create_multiple_pdrs() {
let pdr1 = Ie::new(IeType::CreatePdr, vec![0, 56, 0, 2, 0, 1]);
let pdr2 = Ie::new(IeType::CreatePdr, vec![0, 56, 0, 2, 0, 2]);
let pdr3 = Ie::new(IeType::CreatePdr, vec![0, 56, 0, 2, 0, 3]);
let msg = SessionModificationRequestBuilder::new(0x7777, 700)
.create_pdrs(vec![pdr1, pdr2, pdr3])
.build();
assert!(msg.create_pdrs.is_some());
assert_eq!(msg.create_pdrs.unwrap().len(), 3);
}
#[test]
fn test_builder_create_urrs() {
let urr_ie = Ie::new(IeType::CreateUrr, vec![0, 81, 0, 4, 0, 0, 0, 1]);
let msg = SessionModificationRequestBuilder::new(0x8888, 800)
.create_urrs(vec![urr_ie])
.build();
assert!(msg.create_urrs.is_some());
}
#[test]
fn test_builder_create_qers() {
let qer_ie = Ie::new(IeType::CreateQer, vec![0, 109, 0, 4, 0, 0, 0, 1]);
let msg = SessionModificationRequestBuilder::new(0x9999, 900)
.create_qers(vec![qer_ie])
.build();
assert!(msg.create_qers.is_some());
}
#[test]
fn test_builder_create_bars() {
let bar_ie = Ie::new(IeType::CreateBar, vec![0, 85, 0, 1, 1]);
let msg = SessionModificationRequestBuilder::new(0xAAAA, 1000)
.create_bars(vec![bar_ie])
.build();
assert!(msg.create_bars.is_some());
}
#[test]
fn test_builder_create_traffic_endpoints() {
let te_ie = Ie::new(IeType::CreateTrafficEndpoint, vec![0, 131, 0, 1, 1]);
let msg = SessionModificationRequestBuilder::new(0xBBBB, 1100)
.create_traffic_endpoints(vec![te_ie])
.build();
assert!(msg.create_traffic_endpoints.is_some());
}
#[test]
fn test_builder_update_pdrs() {
let update_pdr = Ie::new(IeType::UpdatePdr, vec![0, 9, 0, 2, 0, 1]);
let msg = SessionModificationRequestBuilder::new(0xCCCC, 1200)
.update_pdrs(vec![update_pdr])
.build();
assert!(msg.update_pdrs.is_some());
assert_eq!(msg.update_pdrs.unwrap().len(), 1);
}
#[test]
fn test_builder_update_fars() {
let update_far = Ie::new(IeType::UpdateFar, vec![0, 10, 0, 4, 0, 0, 0, 1]);
let msg = SessionModificationRequestBuilder::new(0xDDDD, 1300)
.update_fars(vec![update_far])
.build();
assert!(msg.update_fars.is_some());
}
#[test]
fn test_builder_update_urrs() {
let update_urr = Ie::new(IeType::UpdateUrr, vec![0, 13, 0, 4, 0, 0, 0, 1]);
let msg = SessionModificationRequestBuilder::new(0xEEEE, 1400)
.update_urrs(vec![update_urr])
.build();
assert!(msg.update_urrs.is_some());
}
#[test]
fn test_builder_update_qers() {
let update_qer = Ie::new(IeType::UpdateQer, vec![0, 15, 0, 4, 0, 0, 0, 1]);
let msg = SessionModificationRequestBuilder::new(0xFFFF, 1500)
.update_qers(vec![update_qer])
.build();
assert!(msg.update_qers.is_some());
}
#[test]
fn test_builder_update_bars() {
let update_bar = Ie::new(IeType::UpdateBar, vec![0, 86, 0, 1, 1]);
let msg = SessionModificationRequestBuilder::new(0x1111, 1600)
.update_bars(vec![update_bar])
.build();
assert!(msg.update_bars.is_some());
}
#[test]
fn test_builder_update_traffic_endpoints() {
let update_te = Ie::new(IeType::UpdateTrafficEndpoint, vec![0, 160, 0, 1, 1]);
let msg = SessionModificationRequestBuilder::new(0x2222, 1700)
.update_traffic_endpoints(vec![update_te])
.build();
assert!(msg.update_traffic_endpoints.is_some());
}
#[test]
fn test_builder_remove_pdrs() {
let remove_pdr = Ie::new(IeType::RemovePdr, vec![0, 15, 0, 2, 0, 1]);
let msg = SessionModificationRequestBuilder::new(0x3333, 1800)
.remove_pdrs(vec![remove_pdr])
.build();
assert!(msg.remove_pdrs.is_some());
assert_eq!(msg.remove_pdrs.unwrap().len(), 1);
}
#[test]
fn test_builder_remove_fars() {
let remove_far = Ie::new(IeType::RemoveFar, vec![0, 16, 0, 4, 0, 0, 0, 1]);
let msg = SessionModificationRequestBuilder::new(0x4444, 1900)
.remove_fars(vec![remove_far])
.build();
assert!(msg.remove_fars.is_some());
}
#[test]
fn test_builder_remove_urrs() {
let remove_urr = Ie::new(IeType::RemoveUrr, vec![0, 19, 0, 4, 0, 0, 0, 1]);
let msg = SessionModificationRequestBuilder::new(0x5555, 2000)
.remove_urrs(vec![remove_urr])
.build();
assert!(msg.remove_urrs.is_some());
}
#[test]
fn test_builder_remove_qers() {
let remove_qer = Ie::new(IeType::RemoveQer, vec![0, 21, 0, 4, 0, 0, 0, 1]);
let msg = SessionModificationRequestBuilder::new(0x6666, 2100)
.remove_qers(vec![remove_qer])
.build();
assert!(msg.remove_qers.is_some());
}
#[test]
fn test_builder_remove_bars() {
let remove_bar = Ie::new(IeType::RemoveBar, vec![0, 87, 0, 1, 1]);
let msg = SessionModificationRequestBuilder::new(0x7777, 2200)
.remove_bars(vec![remove_bar])
.build();
assert!(msg.remove_bars.is_some());
}
#[test]
fn test_builder_remove_traffic_endpoints() {
let remove_te = Ie::new(IeType::RemoveTrafficEndpoint, vec![0, 161, 0, 1, 1]);
let msg = SessionModificationRequestBuilder::new(0x8888, 2300)
.remove_traffic_endpoints(vec![remove_te])
.build();
assert!(msg.remove_traffic_endpoints.is_some());
}
#[test]
fn test_builder_create_update_remove_combined() {
let create_pdr = Ie::new(IeType::CreatePdr, vec![0, 56, 0, 2, 0, 5]);
let update_pdr = Ie::new(IeType::UpdatePdr, vec![0, 9, 0, 2, 0, 2]);
let remove_pdr = Ie::new(IeType::RemovePdr, vec![0, 15, 0, 2, 0, 1]);
let msg = SessionModificationRequestBuilder::new(0x9999, 2400)
.create_pdrs(vec![create_pdr])
.update_pdrs(vec![update_pdr])
.remove_pdrs(vec![remove_pdr])
.build();
assert!(msg.create_pdrs.is_some());
assert!(msg.update_pdrs.is_some());
assert!(msg.remove_pdrs.is_some());
}
#[test]
fn test_builder_all_rule_types() {
let create_pdr = Ie::new(IeType::CreatePdr, vec![0, 56, 0, 2, 0, 1]);
let create_far = Ie::new(IeType::CreateFar, vec![0, 108, 0, 4, 0, 0, 0, 1]);
let create_urr = Ie::new(IeType::CreateUrr, vec![0, 81, 0, 4, 0, 0, 0, 1]);
let create_qer = Ie::new(IeType::CreateQer, vec![0, 109, 0, 4, 0, 0, 0, 1]);
let msg = SessionModificationRequestBuilder::new(0xAAAA, 2500)
.create_pdrs(vec![create_pdr])
.create_fars(vec![create_far])
.create_urrs(vec![create_urr])
.create_qers(vec![create_qer])
.build();
assert!(msg.create_pdrs.is_some());
assert!(msg.create_fars.is_some());
assert!(msg.create_urrs.is_some());
assert!(msg.create_qers.is_some());
}
#[test]
fn test_builder_with_pdn_type() {
let pdn_ie = Ie::new(IeType::PdnType, vec![0x01]);
let msg = SessionModificationRequestBuilder::new(0xBBBB, 2600)
.pdn_type(pdn_ie)
.build();
assert!(msg.pdn_type.is_some());
}
#[test]
fn test_builder_with_apn_dnn() {
let apn_ie = Ie::new(
IeType::ApnDnn,
vec![8, 105, 110, 116, 101, 114, 110, 101, 116],
);
let msg = SessionModificationRequestBuilder::new(0xCCCC, 2700)
.apn_dnn(apn_ie)
.build();
assert!(msg.apn_dnn.is_some());
}
#[test]
fn test_builder_with_user_plane_inactivity_timer() {
let timer_ie = Ie::new(IeType::UserPlaneInactivityTimer, vec![0, 0, 0, 60]);
let msg = SessionModificationRequestBuilder::new(0xDDDD, 2800)
.user_plane_inactivity_timer(timer_ie)
.build();
assert!(msg.user_plane_inactivity_timer.is_some());
}
#[test]
fn test_marshal_unmarshal_minimal() {
let original = SessionModificationRequestBuilder::new(0x1234567890ABCDEF, 100).build();
let marshaled = original.marshal();
let parsed = crate::message::parse(&marshaled).unwrap();
assert_eq!(parsed.msg_type(), MsgType::SessionModificationRequest);
assert_eq!(*parsed.sequence(), 100);
assert_eq!(parsed.seid(), Some(Seid(0x1234567890ABCDEF)));
}
#[test]
fn test_marshal_unmarshal_with_fseid() {
let original = SessionModificationRequestBuilder::new(0xABCD, 200)
.fseid(0x5678, Ipv4Addr::new(10, 0, 0, 1))
.build();
let marshaled = original.marshal();
let unmarshaled = SessionModificationRequest::unmarshal(&marshaled).unwrap();
assert_eq!(*unmarshaled.header.seid, 0xABCD);
assert_eq!(*unmarshaled.header.sequence_number, 200);
assert!(unmarshaled.fseid.is_some());
}
#[test]
fn test_marshal_unmarshal_with_operations() {
let create_pdr = Ie::new(IeType::CreatePdr, vec![0, 56, 0, 2, 0, 1]);
let update_far = Ie::new(IeType::UpdateFar, vec![0, 10, 0, 4, 0, 0, 0, 1]);
let remove_urr = Ie::new(IeType::RemoveUrr, vec![0, 19, 0, 4, 0, 0, 0, 1]);
let original = SessionModificationRequestBuilder::new(0x9999, 300)
.create_pdrs(vec![create_pdr])
.update_fars(vec![update_far])
.remove_urrs(vec![remove_urr])
.build();
let marshaled = original.marshal();
let unmarshaled = SessionModificationRequest::unmarshal(&marshaled).unwrap();
assert!(unmarshaled.create_pdrs.is_some());
assert!(unmarshaled.update_fars.is_some());
assert!(unmarshaled.remove_urrs.is_some());
}
#[test]
fn test_builder_direct_marshal() {
let bytes = SessionModificationRequestBuilder::new(0x1111, 400)
.fseid(0x2222, Ipv4Addr::new(192, 168, 1, 1))
.marshal();
assert!(!bytes.is_empty());
assert!(bytes.len() > 16); }
#[test]
fn test_builder_method_chaining() {
let msg = SessionModificationRequestBuilder::new(0x3333, 500)
.fseid(0x4444, Ipv4Addr::new(10, 0, 0, 1))
.create_pdrs(vec![Ie::new(IeType::CreatePdr, vec![0, 56, 0, 2, 0, 1])])
.update_fars(vec![Ie::new(
IeType::UpdateFar,
vec![0, 10, 0, 4, 0, 0, 0, 1],
)])
.remove_urrs(vec![Ie::new(
IeType::RemoveUrr,
vec![0, 19, 0, 4, 0, 0, 0, 1],
)])
.pdn_type(Ie::new(IeType::PdnType, vec![0x01]))
.build();
assert!(msg.fseid.is_some());
assert!(msg.create_pdrs.is_some());
assert!(msg.update_fars.is_some());
assert!(msg.remove_urrs.is_some());
assert!(msg.pdn_type.is_some());
}
#[test]
fn test_message_trait_methods() {
let msg = SessionModificationRequestBuilder::new(0x5555, 600).build();
assert_eq!(msg.msg_type(), MsgType::SessionModificationRequest);
assert_eq!(msg.msg_name(), "SessionModificationRequest");
assert_eq!(*msg.sequence(), 600);
assert_eq!(msg.seid(), Some(Seid(0x5555)));
assert_eq!(msg.version(), 1);
}
#[test]
fn test_message_set_sequence() {
let mut msg = SessionModificationRequestBuilder::new(0x6666, 700).build();
assert_eq!(*msg.sequence(), 700);
msg.set_sequence(800.into());
assert_eq!(*msg.sequence(), 800);
}
#[test]
fn test_ies() {
let pdn_ie = Ie::new(IeType::PdnType, vec![0x01]);
let msg = SessionModificationRequestBuilder::new(0x7777, 900)
.pdn_type(pdn_ie.clone())
.build();
let found = msg.ies(IeType::PdnType).next();
assert!(found.is_some());
assert_eq!(found.unwrap().ie_type, IeType::PdnType);
let not_found = msg.ies(IeType::Cause).next();
assert!(not_found.is_none());
}
#[test]
fn test_create_pdrs_accessible() {
let create_pdr = Ie::new(IeType::CreatePdr, vec![0, 56, 0, 2, 0, 1]);
let msg = SessionModificationRequestBuilder::new(0x8888, 1000)
.create_pdrs(vec![create_pdr.clone()])
.build();
assert!(msg.create_pdrs.is_some());
let pdrs = msg.create_pdrs.as_ref().unwrap();
assert_eq!(pdrs.len(), 1);
assert_eq!(pdrs[0].ie_type, IeType::CreatePdr);
}
#[test]
fn test_empty_modification() {
let msg = SessionModificationRequestBuilder::new(0x8888, 1000).build();
let marshaled = msg.marshal();
assert!(!marshaled.is_empty());
assert!(marshaled.len() >= 16);
}
#[test]
fn test_large_batch_modification() {
let mut pdrs = Vec::new();
for i in 1..=50 {
pdrs.push(Ie::new(IeType::CreatePdr, vec![0, 56, 0, 2, 0, i]));
}
let msg = SessionModificationRequestBuilder::new(0x9999, 1100)
.create_pdrs(pdrs)
.build();
assert!(msg.create_pdrs.is_some());
assert_eq!(msg.create_pdrs.unwrap().len(), 50);
}
#[test]
fn test_handover_scenario() {
let remove_pdr = Ie::new(IeType::RemovePdr, vec![0, 15, 0, 2, 0, 1]);
let create_pdr = Ie::new(IeType::CreatePdr, vec![0, 56, 0, 2, 0, 2]);
let msg = SessionModificationRequestBuilder::new(0xAAAA, 1200)
.remove_pdrs(vec![remove_pdr])
.create_pdrs(vec![create_pdr])
.build();
assert!(msg.remove_pdrs.is_some());
assert!(msg.create_pdrs.is_some());
}
#[test]
fn test_qos_modification_scenario() {
let update_qer = Ie::new(IeType::UpdateQer, vec![0, 15, 0, 4, 0, 0, 0, 1]);
let msg = SessionModificationRequestBuilder::new(0xBBBB, 1300)
.update_qers(vec![update_qer])
.build();
assert!(msg.update_qers.is_some());
}
#[test]
fn test_usage_reporting_modification() {
let create_urr = Ie::new(IeType::CreateUrr, vec![0, 81, 0, 4, 0, 0, 0, 1]);
let msg = SessionModificationRequestBuilder::new(0xCCCC, 1400)
.create_urrs(vec![create_urr])
.build();
assert!(msg.create_urrs.is_some());
}
#[test]
fn test_buffering_scenario() {
let create_bar = Ie::new(IeType::CreateBar, vec![0, 85, 0, 1, 1]);
let msg = SessionModificationRequestBuilder::new(0xDDDD, 1500)
.create_bars(vec![create_bar])
.build();
assert!(msg.create_bars.is_some());
}
#[test]
fn test_add_pdr_typed() {
use crate::ie::create_pdr::CreatePdrBuilder;
use crate::ie::pdi::PdiBuilder;
use crate::ie::pdr_id::PdrId;
use crate::ie::precedence::Precedence;
use crate::ie::source_interface::{SourceInterface, SourceInterfaceValue};
let pdi = PdiBuilder::new(SourceInterface::new(SourceInterfaceValue::Access))
.build()
.unwrap();
let pdr = CreatePdrBuilder::new(PdrId::new(1))
.precedence(Precedence::new(100))
.pdi(pdi)
.build()
.unwrap();
let msg = SessionModificationRequestBuilder::new(0x1111, 2000)
.add_pdr(pdr)
.build();
assert_eq!(msg.create_pdrs.as_ref().unwrap().len(), 1);
}
#[test]
fn test_add_far_typed() {
use crate::ie::apply_action::ApplyAction;
use crate::ie::create_far::CreateFarBuilder;
use crate::ie::far_id::FarId;
let far = CreateFarBuilder::new(FarId::new(1))
.apply_action(ApplyAction::new(0))
.build()
.unwrap();
let msg = SessionModificationRequestBuilder::new(0x2222, 2001)
.add_far(far)
.build();
assert_eq!(msg.create_fars.as_ref().unwrap().len(), 1);
}
#[test]
fn test_add_urr_typed() {
use crate::ie::create_urr::CreateUrrBuilder;
use crate::ie::measurement_method::MeasurementMethod;
use crate::ie::reporting_triggers::ReportingTriggers;
use crate::ie::urr_id::UrrId;
let urr = CreateUrrBuilder::new(UrrId::new(1))
.measurement_method(MeasurementMethod::new(false, true, false))
.reporting_triggers(ReportingTriggers::new())
.volume_threshold_bytes(1_000_000)
.build()
.unwrap();
let msg = SessionModificationRequestBuilder::new(0x3333, 2002)
.add_urr(urr)
.build();
assert_eq!(msg.create_urrs.as_ref().unwrap().len(), 1);
}
#[test]
fn test_add_qer_typed() {
use crate::ie::create_qer::CreateQerBuilder;
use crate::ie::qer_id::QerId;
let qer = CreateQerBuilder::new(QerId::new(1)).build().unwrap();
let msg = SessionModificationRequestBuilder::new(0x4444, 2003)
.add_qer(qer)
.build();
assert_eq!(msg.create_qers.as_ref().unwrap().len(), 1);
}
#[test]
fn test_add_bar_typed() {
use crate::ie::bar_id::BarId;
use crate::ie::create_bar::CreateBar;
let bar = CreateBar::new(BarId::new(1), None);
let msg = SessionModificationRequestBuilder::new(0x5555, 2004)
.add_bar(bar)
.build();
assert_eq!(msg.create_bars.as_ref().unwrap().len(), 1);
}
#[test]
fn test_add_traffic_endpoint_typed() {
use crate::ie::create_traffic_endpoint::{CreateTrafficEndpoint, TrafficEndpointId};
let te = CreateTrafficEndpoint::new(TrafficEndpointId::new(1));
let msg = SessionModificationRequestBuilder::new(0x6666, 2005)
.add_traffic_endpoint(te)
.build();
assert_eq!(msg.create_traffic_endpoints.as_ref().unwrap().len(), 1);
}
#[test]
fn test_add_update_pdr_typed() {
use crate::ie::pdr_id::PdrId;
use crate::ie::update_pdr::UpdatePdrBuilder;
let pdr = UpdatePdrBuilder::new(PdrId::new(1)).build().unwrap();
let msg = SessionModificationRequestBuilder::new(0x7777, 2006)
.add_update_pdr(pdr)
.build();
assert_eq!(msg.update_pdrs.as_ref().unwrap().len(), 1);
}
#[test]
fn test_add_update_far_typed() {
use crate::ie::far_id::FarId;
use crate::ie::update_far::UpdateFarBuilder;
let far = UpdateFarBuilder::new(FarId::new(1)).build().unwrap();
let msg = SessionModificationRequestBuilder::new(0x8888, 2007)
.add_update_far(far)
.build();
assert_eq!(msg.update_fars.as_ref().unwrap().len(), 1);
}
#[test]
fn test_add_update_urr_typed() {
use crate::ie::update_urr::UpdateUrrBuilder;
use crate::ie::urr_id::UrrId;
let urr = UpdateUrrBuilder::new(UrrId::new(1)).build().unwrap();
let msg = SessionModificationRequestBuilder::new(0x9999, 2008)
.add_update_urr(urr)
.build();
assert_eq!(msg.update_urrs.as_ref().unwrap().len(), 1);
}
#[test]
fn test_add_update_qer_typed() {
use crate::ie::qer_id::QerId;
use crate::ie::update_qer::UpdateQerBuilder;
let qer = UpdateQerBuilder::new(QerId::new(1)).build().unwrap();
let msg = SessionModificationRequestBuilder::new(0xAAAA, 2009)
.add_update_qer(qer)
.build();
assert_eq!(msg.update_qers.as_ref().unwrap().len(), 1);
}
#[test]
fn test_add_update_bar_typed() {
use crate::ie::bar_id::BarId;
use crate::ie::update_bar::UpdateBar;
let bar = UpdateBar::new(BarId::new(1), None);
let msg = SessionModificationRequestBuilder::new(0xBBBB, 2010)
.add_update_bar(bar)
.build();
assert_eq!(msg.update_bars.as_ref().unwrap().len(), 1);
}
#[test]
fn test_add_update_traffic_endpoint_typed() {
use crate::ie::create_traffic_endpoint::TrafficEndpointId;
use crate::ie::update_traffic_endpoint::UpdateTrafficEndpoint;
let te = UpdateTrafficEndpoint::new(TrafficEndpointId::new(1));
let msg = SessionModificationRequestBuilder::new(0xCCCC, 2011)
.add_update_traffic_endpoint(te)
.build();
assert_eq!(msg.update_traffic_endpoints.as_ref().unwrap().len(), 1);
}
#[test]
fn test_add_remove_pdr_typed() {
use crate::ie::pdr_id::PdrId;
use crate::ie::remove_pdr::RemovePdr;
let pdr = RemovePdr::new(PdrId::new(1));
let msg = SessionModificationRequestBuilder::new(0xDDDD, 2012)
.add_remove_pdr(pdr)
.build();
assert_eq!(msg.remove_pdrs.as_ref().unwrap().len(), 1);
}
#[test]
fn test_add_remove_far_typed() {
use crate::ie::far_id::FarId;
use crate::ie::remove_far::RemoveFar;
let far = RemoveFar::new(FarId::new(1));
let msg = SessionModificationRequestBuilder::new(0xEEEE, 2013)
.add_remove_far(far)
.build();
assert_eq!(msg.remove_fars.as_ref().unwrap().len(), 1);
}
#[test]
fn test_add_remove_bar_typed() {
use crate::ie::bar_id::BarId;
use crate::ie::remove_bar::RemoveBar;
let bar = RemoveBar::new(BarId::new(1));
let msg = SessionModificationRequestBuilder::new(0xFFFF, 2014)
.add_remove_bar(bar)
.build();
assert_eq!(msg.remove_bars.as_ref().unwrap().len(), 1);
}
#[test]
fn test_add_typed_accumulates() {
use crate::ie::bar_id::BarId;
use crate::ie::create_bar::CreateBar;
let msg = SessionModificationRequestBuilder::new(0x1234, 2015)
.add_bar(CreateBar::new(BarId::new(1), None))
.add_bar(CreateBar::new(BarId::new(2), None))
.build();
assert_eq!(msg.create_bars.as_ref().unwrap().len(), 2);
}
#[test]
fn test_session_modification_request_new_ies_roundtrip() {
let remove_mar_ie = Ie::new(IeType::RemoveMar, vec![0x01, 0x02]);
let remove_srr_ie = Ie::new(IeType::RemoveSrr, vec![0x03]);
let access_avail_ie = Ie::new(IeType::AccessAvailabilityInformation, vec![0x04]);
let hplmn_ie = Ie::new(IeType::HplmnSNssai, vec![0x01, 0x02, 0x03, 0x04]);
let group_id_ie = Ie::new(IeType::GroupId, vec![0x05]);
let dscp_ie = Ie::new(IeType::DscpToPpiControlInformation, vec![0x06]);
let tl_container_ie = Ie::new(IeType::TlContainer, vec![0x07, 0x08]);
let msg = SessionModificationRequestBuilder::new(0xABCDEF, 42)
.remove_mar(remove_mar_ie.clone())
.remove_srr(remove_srr_ie.clone())
.access_availability_information(access_avail_ie.clone())
.hplmn_s_nssai(hplmn_ie.clone())
.group_id(group_id_ie.clone())
.dscp_to_ppi_control_information(dscp_ie.clone())
.tl_container(tl_container_ie.clone())
.build();
assert_eq!(msg.remove_mars.len(), 1);
assert_eq!(msg.remove_mars[0], remove_mar_ie);
assert_eq!(msg.remove_srrs.len(), 1);
assert_eq!(msg.remove_srrs[0], remove_srr_ie);
assert_eq!(msg.access_availability_information.len(), 1);
assert_eq!(msg.access_availability_information[0], access_avail_ie);
assert_eq!(msg.hplmn_s_nssai, Some(hplmn_ie));
assert_eq!(msg.group_id, Some(group_id_ie));
assert_eq!(msg.dscp_to_ppi_control_information, Some(dscp_ie));
assert_eq!(msg.tl_containers.len(), 1);
assert_eq!(msg.tl_containers[0], tl_container_ie);
let bytes = msg.marshal();
let parsed = SessionModificationRequest::unmarshal(&bytes).unwrap();
assert_eq!(parsed.remove_mars.len(), 1);
assert_eq!(parsed.remove_srrs.len(), 1);
assert_eq!(parsed.access_availability_information.len(), 1);
assert!(parsed.hplmn_s_nssai.is_some());
assert!(parsed.group_id.is_some());
assert!(parsed.dscp_to_ppi_control_information.is_some());
assert_eq!(parsed.tl_containers.len(), 1);
}
#[test]
fn test_ue_level_measurements_configuration_roundtrip() {
let ulmc_ie = Ie::new(IeType::UeLevelMeasurementsConfiguration, vec![0x01, 0x02]);
let msg = SessionModificationRequestBuilder::new(0xABCDEF, 43)
.ue_level_measurements_configuration(ulmc_ie.clone())
.build();
assert_eq!(msg.ue_level_measurements_configuration, Some(ulmc_ie));
let bytes = msg.marshal();
let parsed = SessionModificationRequest::unmarshal(&bytes).unwrap();
assert!(parsed.ue_level_measurements_configuration.is_some());
assert_eq!(
msg.ue_level_measurements_configuration,
parsed.ue_level_measurements_configuration
);
}
}