diff -r 000000000000 -r c40eb8fe8501 wlan_bearer/wlanengine/wlan_common/wlanengine_common_3.1/src/core_virtual_traffic_stream_list.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/wlan_bearer/wlanengine/wlan_common/wlanengine_common_3.1/src/core_virtual_traffic_stream_list.cpp Tue Feb 02 02:03:13 2010 +0200 @@ -0,0 +1,314 @@ +/* +* Copyright (c) 2006-2007 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0"" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: Class for storing virtual traffic streams. +* +*/ + +/* +* %version: 1 % +*/ + +#include "core_virtual_traffic_stream_list.h" +#include "core_tools.h" +#include "core_am_tools.h" +#include "am_debug.h" + +// ======== MEMBER FUNCTIONS ======== + +// --------------------------------------------------------------------------- +// --------------------------------------------------------------------------- +// +core_virtual_traffic_stream_list_c::core_virtual_traffic_stream_list_c() : + ts_list_m( ), + next_stream_id_m( 0 ) + { + DEBUG( "core_virtual_traffic_stream_list_c::core_virtual_traffic_stream_list_c()" ); + } + +// --------------------------------------------------------------------------- +// --------------------------------------------------------------------------- +// +core_virtual_traffic_stream_list_c::~core_virtual_traffic_stream_list_c() + { + DEBUG( "core_virtual_traffic_stream_list_c::~core_virtual_traffic_stream_list_c()" ); + + for( entry_s* iter = ts_list_m.first(); iter; iter = ts_list_m.next() ) + { + delete iter->traffic_stream; + } + } + +// --------------------------------------------------------------------------- +// --------------------------------------------------------------------------- +// +u32_t core_virtual_traffic_stream_list_c::count() const + { + return ts_list_m.count(); + } + +// --------------------------------------------------------------------------- +// --------------------------------------------------------------------------- +// +core_error_e core_virtual_traffic_stream_list_c::add_traffic_stream( + const core_virtual_traffic_stream_c& stream ) + { + entry_s* entry = new entry_s; + if( entry ) + { + entry->traffic_stream = new core_virtual_traffic_stream_c( + stream.requested_tid(), + stream.tid(), + stream.user_priority(), + stream.is_automatic_stream(), + stream.params(), + stream.id(), + stream.status() ); + if( entry->traffic_stream ) + { + ts_list_m.append( entry ); + } + else + { + DEBUG( "core_virtual_traffic_stream_list_c::add_traffic_stream() - unable to create core_virtual_traffic_stream_c" ); + + delete entry; + entry = NULL; + + return core_error_no_memory; + } + } + else + { + DEBUG( "core_virtual_traffic_stream_list_c::update_traffic_stream() - unable to create entry_s" ); + + return core_error_no_memory; + } + + return core_error_ok; + } + +// --------------------------------------------------------------------------- +// --------------------------------------------------------------------------- +// +core_error_e core_virtual_traffic_stream_list_c::add_traffic_stream( + u8_t requested_tid, + u8_t tid, + u8_t user_priority, + bool_t is_automatic_stream, + const core_traffic_stream_params_s& params, + u32_t& stream_id, + core_traffic_stream_status_e stream_status ) + { + entry_s* entry = new entry_s; + if( entry ) + { + stream_id = next_stream_id_m++; + entry->traffic_stream = new core_virtual_traffic_stream_c( + requested_tid, + tid, + user_priority, + is_automatic_stream, + params, + stream_id, + stream_status ); + if( entry->traffic_stream ) + { + ts_list_m.append( entry ); + } + else + { + DEBUG( "core_virtual_traffic_stream_list_c::add_traffic_stream() - unable to create core_virtual_traffic_stream_c" ); + + delete entry; + entry = NULL; + + return core_error_no_memory; + } + } + else + { + DEBUG( "core_virtual_traffic_stream_list_c::update_traffic_stream() - unable to create entry_s" ); + + return core_error_no_memory; + } + + return core_error_ok; + } + +// --------------------------------------------------------------------------- +// --------------------------------------------------------------------------- +// +void core_virtual_traffic_stream_list_c::remove_traffic_stream_by_tid( + u8_t tid ) + { + DEBUG1( "core_virtual_traffic_stream_list_c::remove_traffic_stream_by_tid() - removing an entry with TID %u", + tid ); + + core_type_list_iterator_c ts_iter( ts_list_m ); + for( entry_s* iter = ts_iter.first(); iter; iter = ts_iter.next() ) + { + if( iter->traffic_stream->tid() == tid ) + { + DEBUG( "core_virtual_traffic_stream_list_c::remove_traffic_stream_by_tid() - matching entry found" ); + + ts_iter.remove(); + } + } + } + +// --------------------------------------------------------------------------- +// --------------------------------------------------------------------------- +// +void core_virtual_traffic_stream_list_c::remove_traffic_stream_by_id( + u32_t stream_id ) + { + DEBUG1( "core_virtual_traffic_stream_list_c::remove_traffic_stream_by_tid() - removing an entry with stream ID %u", + stream_id ); + + core_type_list_iterator_c ts_iter( ts_list_m ); + for( entry_s* iter = ts_iter.first(); iter; iter = ts_iter.next() ) + { + if( iter->traffic_stream->id() == stream_id ) + { + DEBUG( "core_virtual_traffic_stream_list_c::remove_traffic_stream_by_tid() - matching entry found" ); + + ts_iter.remove(); + } + } + } + +// --------------------------------------------------------------------------- +// --------------------------------------------------------------------------- +// +core_access_class_traffic_mode_e core_virtual_traffic_stream_list_c::traffic_mode_by_ac( + core_access_class_e access_class ) + { + core_type_list_iterator_c ts_iter( ts_list_m ); + for( entry_s* iter = ts_iter.first(); iter; iter = ts_iter.next() ) + { + if( iter->traffic_stream->access_class() == access_class && + !iter->traffic_stream->is_automatic_stream() ) + { + return core_access_class_traffic_mode_manual; + } + } + + return core_access_class_traffic_mode_automatic; + } + +// --------------------------------------------------------------------------- +// --------------------------------------------------------------------------- +// +void core_virtual_traffic_stream_list_c::print_contents() + { + core_type_list_iterator_c ts_iter( ts_list_m ); + for( entry_s* iter = ts_iter.first(); iter; iter = ts_iter.next() ) + { + DEBUG1( "core_virtual_traffic_stream_list_c::print_contents() - stream ID: %u", + iter->traffic_stream->id() ); + DEBUG1( "core_virtual_traffic_stream_list_c::print_contents() - requested TID: %u", + iter->traffic_stream->requested_tid() ); + DEBUG1( "core_virtual_traffic_stream_list_c::print_contents() - current TID: %u", + iter->traffic_stream->tid() ); + DEBUG1( "core_virtual_traffic_stream_list_c::print_contents() - UP: %u", + iter->traffic_stream->user_priority() ); + if( iter->traffic_stream->is_automatic_stream() ) + { + DEBUG( "core_virtual_traffic_stream_list_c::print_contents() - automatic: yes" ); + } + else + { + DEBUG( "core_virtual_traffic_stream_list_c::print_contents() - automatic: no" ); + } + switch( iter->traffic_stream->params().direction ) + { + case core_traffic_stream_direction_uplink: + DEBUG( "core_virtual_traffic_stream_list_c::print_contents() - direction: uplink" ); + break; + case core_traffic_stream_direction_downlink: + DEBUG( "core_virtual_traffic_stream_list_c::print_contents() - direction: downlink" ); + break; + case core_traffic_stream_direction_bidirectional: + DEBUG( "core_virtual_traffic_stream_list_c::print_contents() - direction: bi-directional" ); + break; + } + switch ( iter->traffic_stream->status() ) + { + case core_traffic_stream_status_undefined: + DEBUG( "core_virtual_traffic_stream_list_c::print_contents() - status: core_traffic_stream_status_undefined" ); + break; + case core_traffic_stream_status_active: + DEBUG( "core_virtual_traffic_stream_list_c::print_contents() - status: core_traffic_stream_status_active" ); + break; + case core_traffic_stream_status_inactive_not_required: + DEBUG( "core_virtual_traffic_stream_list_c::print_contents() - status: core_traffic_stream_status_inactive_not_required" ); + break; + case core_traffic_stream_status_inactive_deleted_by_ap: + DEBUG( "core_virtual_traffic_stream_list_c::print_contents() - status: core_traffic_stream_status_inactive_deleted_by_ap" ); + break; + case core_traffic_stream_status_inactive_no_bandwidth: + DEBUG( "core_virtual_traffic_stream_list_c::print_contents() - status: core_traffic_stream_status_inactive_no_bandwidth" ); + break; + case core_traffic_stream_status_inactive_invalid_parameters: + DEBUG( "core_virtual_traffic_stream_list_c::print_contents() - status: core_traffic_stream_status_inactive_invalid_parameters" ); + break; + case core_traffic_stream_status_inactive_other: + DEBUG( "core_virtual_traffic_stream_list_c::print_contents() - status: core_traffic_stream_status_inactive_other" ); + break; + } + DEBUG( "core_virtual_traffic_stream_list_c::print_contents()" ); + } + } + + +// --------------------------------------------------------------------------- +// --------------------------------------------------------------------------- +// +u8_t core_virtual_traffic_stream_list_c::next_tid() + { + bool_t tid_array[MAX_TRAFFIC_STREAM_TID] = + { false_t, false_t, false_t, false_t, false_t,false_t,false_t,false_t }; + for( entry_s* iter = ts_list_m.first(); iter; iter = ts_list_m.next() ) + { + if( iter->traffic_stream->requested_tid() != TRAFFIC_STREAM_TID_NONE ) + { + /** + * Both active and inactive streams that were requested + * with a certain TID. + */ + tid_array[iter->traffic_stream->requested_tid()] = true_t; + } + else if( iter->traffic_stream->tid() != TRAFFIC_STREAM_TID_NONE ) + { + /** + * Active streams. + */ + tid_array[iter->traffic_stream->tid()] = true_t; + } + } + u8_t tid( 0 ); + while( tid < MAX_TRAFFIC_STREAM_TID ) + { + if( !tid_array[tid] ) + { + return tid; + } + else + { + ++tid; + } + } + + return MAX_TRAFFIC_STREAM_TID; + }