wlan_bearer/wlanldd/wlan_common/umac_common/src/UmacDot11OpenAuthPending.cpp
changeset 0 c40eb8fe8501
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/wlan_bearer/wlanldd/wlan_common/umac_common/src/UmacDot11OpenAuthPending.cpp	Tue Feb 02 02:03:13 2010 +0200
@@ -0,0 +1,263 @@
+/*
+* Copyright (c) 2005-2007 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "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:   Implementation of the WlanDot11OpenAuthPending class
+*
+*/
+
+/*
+* %version: 23 %
+*/
+
+#include "config.h"
+#include "UmacDot11OpenAuthPending.h"
+#include "UmacContextImpl.h"
+
+#ifndef NDEBUG 
+const TInt8 WlanDot11OpenAuthPending::iName[] = "dot11-openauthpending";
+#endif // !NDEBUG 
+
+// ================= MEMBER FUNCTIONS =======================
+
+// -----------------------------------------------------------------------------
+// 
+// -----------------------------------------------------------------------------
+//
+#ifndef NDEBUG 
+const TInt8* WlanDot11OpenAuthPending::GetStateName( 
+    TUint8& aLength ) const
+    {
+    aLength = sizeof( iName );
+    return iName;
+    }
+#endif
+
+// -----------------------------------------------------------------------------
+// Handler for state entry event.
+// -----------------------------------------------------------------------------
+//
+void WlanDot11OpenAuthPending::OnStateEntryEvent( 
+    WlanContextImpl& aCtxImpl )
+    {
+    switch ( iState )
+        {
+        case EINIT:
+            // do all the synchronous 
+            // composite state entry actions
+            StateEntryActions( aCtxImpl );
+            // continue with the state traversal
+            Fsm( aCtxImpl, ECONTINUE );
+            break;
+        case ETXAUTHFRAME:
+            // send the authenticate frame
+            if ( !SendAuthSeqNbr1Frame( aCtxImpl ) )
+                {
+                // tx of dot11-authenticate frame failed  
+                // because packet scheduler was full
+                // or because we didn't get a Tx buffer
+                // so we enter to a wait state
+                Fsm( aCtxImpl, ETX_SCHEDULER_FULL );
+                }
+            break;
+        case ECONTINUEDOT11TRAVERSE:
+            ContinueDot11StateTraversal( aCtxImpl );
+            break;
+        case EWAIT4AUTHRESPONSE:
+            // start a timer to wait for the response frame
+            StartAuthenticationFrameResponseTimer( aCtxImpl );
+            break;
+        case EWAIT4PUSHPACKET:
+            // nothing to do here than wait 
+            break;
+        default:
+            // catch internal FSM programming error
+#ifndef NDEBUG
+            OsTracePrint( KErrorLevel, (TUint8*)("UMAC: state:"));
+            OsTracePrint( KErrorLevel, iStateName[iState] );
+#endif
+            OsAssert( (TUint8*)("UMAC: panic"), 
+                (TUint8*)(WLAN_FILE), __LINE__ );
+            break;
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// Handler for rx authentication response event.
+// -----------------------------------------------------------------------------
+//
+void WlanDot11OpenAuthPending::OnRxAuthResponseEvent( 
+    WlanContextImpl& aCtxImpl )
+    {
+    switch ( iState )
+        {
+        case EWAIT4AUTHRESPONSE:
+            ChangeInternalState( aCtxImpl, ECONTINUEDOT11TRAVERSE );
+            break;
+        default:
+            // this means that we have recieved a valid dot11 
+            // authenticate response frame that we are waiting for
+            // but we are not internally in such a state
+            // only feasible situation for this is that 
+            // someone  has skipped a call to the packet xfer method
+            // that informs of authenticate request frame 
+            // xfer to the WLAN device.
+            // other case is that our fsm is totally messed up
+            // so we catch this
+#ifndef NDEBUG
+            OsTracePrint( KErrorLevel, (TUint8*)("UMAC: state:"));
+            OsTracePrint( KErrorLevel, iStateName[iState] );
+#endif 
+            OsAssert( (TUint8*)("UMAC: panic"), 
+                (TUint8*)(WLAN_FILE), __LINE__ );
+            break;
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// set appropriate used algorithm number to authenticate request frame
+// -----------------------------------------------------------------------------
+//
+void WlanDot11OpenAuthPending::OnSetAlgorithmNumber( 
+    WlanContextImpl& aCtxImpl )
+    {
+    if ( aCtxImpl.HtSupportedByNw() )
+        {
+        aCtxImpl.GetHtAuthenticationFrame().SetAlgorithmNmbr( 
+            aCtxImpl.AuthenticationAlgorithmNumber() );
+        }
+    else
+        {
+        aCtxImpl.GetAuthenticationFrame().SetAlgorithmNmbr( 
+            aCtxImpl.AuthenticationAlgorithmNumber() );
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// If we land here it means that we have received a frame of somekind
+// with a status success
+// -----------------------------------------------------------------------------
+//
+void WlanDot11OpenAuthPending::OnReceiveFrameSuccess(
+    WlanContextImpl& aCtxImpl,
+    const void* aFrame,
+    TUint16 /*aLength*/,
+    WHA::TRcpi /*aRcpi*/,
+    TUint32 aFlags,
+    TUint8* /*aBuffer*/ )
+    {
+    // parse frame in order to determine is it what we want
+    const SManagementFrameHeader* frame_hdr 
+        = static_cast<const SManagementFrameHeader*>(aFrame);
+
+    TBool type_match( EFalse );
+    
+    if ( // can we accept this frame 
+         // is this a management type + authentication subtype frame 
+         IsRequestedFrameType( 
+             frame_hdr->iFrameControl.iType,
+             E802Dot11FrameTypeAuthentication, type_match )
+         // AND our MAC address is DA
+         && (frame_hdr->iDA == aCtxImpl.iWlanMib.dot11StationId)
+         // AND we are in correct state
+         && ( iState == EWAIT4AUTHRESPONSE )
+        )
+        {
+        // cancel authentication frame response timer
+        aCtxImpl.CancelTimer(); 
+
+        iFlags |= KAuthReceived;
+
+        // we have got a hit...let's proceed
+        // store the used authentication algorithm number
+        // for later use
+        const TUint16 used_auth_algorithm = 
+            aCtxImpl.AuthenticationAlgorithmNumber();
+                
+        // validate the authentication frame
+        if ( ResolveAuthMessage( 
+                aCtxImpl, 
+                used_auth_algorithm, 
+                aFrame, 
+                aFlags ) )
+            {
+            // authentication success 
+            OsTracePrint( KUmacAuth, (TUint8*)
+                ("UMAC: dot11-openauthpending * authentication success") );
+
+            // mark it also
+            iFlags |= KAuthSuccess;
+            }
+        else
+            {
+            // authentication response message was NOT ok
+            //   lets's see why that's the case 
+            const SAuthenticationFixedFields* auth_fields 
+                = reinterpret_cast<const SAuthenticationFixedFields*>
+                  (reinterpret_cast<const TUint8*>(aFrame) + 
+                   sizeof( SManagementFrameHeader ));
+            
+            TInt completion_code( KErrGeneral );
+
+            if ( // is open mode authentication
+                ( auth_fields->AlgorithmNumber() == used_auth_algorithm )
+                // AND is authentication transaction sequence number expected
+                && ( auth_fields->SequenceNumber() 
+                == aCtxImpl.GetAuthSeqNmbrExpected())
+                )
+                {
+                OsTracePrint( KWarningLevel | KUmacAuth, (TUint8*)
+                    ("UMAC: dot11-openauthpending authentication denied") );
+                OsTracePrint( KWarningLevel | KUmacAuth, (TUint8*)
+                    ("UMAC: status code from frame: %d"), 
+                    auth_fields->StatusCode() );
+                
+                if ( auth_fields->StatusCode() == E802Dot11StatusSuccess )
+                    {
+                    // catch a internal programming error
+                    OsAssert( (TUint8*)("UMAC: panic"), 
+                        (TUint8*)(WLAN_FILE), __LINE__ );
+                    }
+                
+                // status code was something else than status success
+                completion_code = auth_fields->StatusCode();
+                }
+            else
+                {
+                // a malformed message, but it is a failure in any case
+                OsTracePrint( KWarningLevel | KUmacAuth, (TUint8*)
+                    ("UMAC: dot11-openauthpending authentication failure") );
+                OsTracePrint( KWarningLevel | KUmacAuth, (TUint8*)
+                    ("UMAC: auth message not valid") );
+                }
+
+            // set the completion code value returned to user mode
+            // as the dot11idle state does the OID completion in this case
+            aCtxImpl.iStates.iIdleState.Set( completion_code );
+            }
+        }
+    else    // can we accept this frame
+        {
+        // not a valid type of frame 
+        // or we are not in correct state 
+        // so we shall discard it's processing
+        }
+
+    if ( iFlags & KAuthReceived )
+        {
+        // authentication response was received
+        // either success or failure
+        // we don't really care in this state
+        
+        Fsm( aCtxImpl, ERXAUTHRESPONSE );
+        }
+    }