wlan_bearer/wlanengine/wlan_common/wlanengine_common_3.1/src/core_sub_operation_create_ts.cpp
branchRCL_3
changeset 6 e0f767079796
parent 0 c40eb8fe8501
--- a/wlan_bearer/wlanengine/wlan_common/wlanengine_common_3.1/src/core_sub_operation_create_ts.cpp	Fri Mar 12 15:51:11 2010 +0200
+++ b/wlan_bearer/wlanengine/wlan_common/wlanengine_common_3.1/src/core_sub_operation_create_ts.cpp	Mon Mar 15 12:46:48 2010 +0200
@@ -16,7 +16,7 @@
 */
 
 /*
-* %version: 12 %
+* %version: 13 %
 */
 
 #include "core_sub_operation_create_ts.h"
@@ -28,8 +28,12 @@
 #include "core_tools_parser.h"
 #include "am_debug.h"
 
+/** The amount of microseconds to wait for a response to our request. */
 const u32_t CORE_AP_RESP_WAITING_TIME = 1000000;
 
+/** The maximum amount of times AP can reject our request due to invalid parameters. */
+const u8_t CORE_MAX_INVALID_PARAMETERS_COUNT = 3;
+
 // ======== MEMBER FUNCTIONS ========
 
 // ---------------------------------------------------------------------------
@@ -51,7 +55,8 @@
     tid_m( tid ),
     user_priority_m( user_priority ),
     tspec_m( tspec ),
-    stream_status_m( stream_status )
+    stream_status_m( stream_status ),
+    invalid_parameters_count_m( 0 )
     {
     DEBUG( "core_sub_operation_create_ts_c::core_sub_operation_create_ts_c()" );
 
@@ -186,6 +191,17 @@
             }
         case core_state_invalid_parameters:
             {
+            ++invalid_parameters_count_m;
+
+            if( invalid_parameters_count_m >= CORE_MAX_INVALID_PARAMETERS_COUNT )
+                {
+                server_m->unregister_frame_handler( this );
+
+                DEBUG( "core_sub_operation_create_ts_c::next_state() - invalid parameters counter exceeded, giving up" );
+
+                return core_error_general;
+                }
+
             DEBUG( "core_sub_operation_create_ts_c::next_state() - AP has downgraded our parameters, retrying" );
 
             return goto_state( core_state_init );
@@ -296,6 +312,8 @@
                     }
                 else if ( wmm_action->status() == core_frame_action_wmm_c::core_dot11_action_wmm_status_invalid_parameters )
                     {
+                    stream_status_m = core_traffic_stream_status_inactive_invalid_parameters;
+
                     asynch_goto( core_state_invalid_parameters, CORE_TIMER_IMMEDIATELY );
                     }
                 else