diff -r 000000000000 -r c40eb8fe8501 wlan_bearer/wlanengine/wlan_symbian/wlanengine_symbian_3.1/src/wlanmgmtframehandler.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/wlan_bearer/wlanengine/wlan_symbian/wlanengine_symbian_3.1/src/wlanmgmtframehandler.cpp Tue Feb 02 02:03:13 2010 +0200 @@ -0,0 +1,213 @@ +/* +* Copyright (c) 2002-2009 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: Active object to send and receive management packets (EAP packets). +* +*/ + + +// INCLUDE FILES +#include +#include "wlanmgmtframehandler.h" +#include "am_debug.h" + +// ================= MEMBER FUNCTIONS ======================= + +// C++ default constructor can NOT contain any code, that +// might leave. +// +CWlanMgmtFrameHandler::CWlanMgmtFrameHandler( + RWlanLogicalChannel& aServiceProvider, + MWlanMgmtFrameCallback& aClient ) : + CActive( CActive::EPriorityHigh ), + iServiceProvider( aServiceProvider ), + iClient( aClient ), + iDataBlock( NULL ) + { + DEBUG( "CWlanMgmtFrameHandler::CWlanMgmtFrameHandler()" ); + } + +// Static constructor. +CWlanMgmtFrameHandler* CWlanMgmtFrameHandler::NewL( + RWlanLogicalChannel& aServiceProvider, + MWlanMgmtFrameCallback& aClient) + { + DEBUG( "CWlanMgmtFrameHandler::NewL()" ); + CWlanMgmtFrameHandler* self = + new (ELeave) CWlanMgmtFrameHandler( aServiceProvider, aClient ); + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop( self ); + return self; + } + +// Symbian 2nd phase constructor can leave. +void CWlanMgmtFrameHandler::ConstructL() + { + DEBUG( "CWlanMgmtFrameHandler::ConstructL()" ); + + CActiveScheduler::Add( this ); + } + +// Destructor +CWlanMgmtFrameHandler::~CWlanMgmtFrameHandler() + { + DEBUG( "CWlanMgmtFrameHandler::~CWlanMgmtFrameHandler()" ); + + Cancel(); + TInt ret = KErrNone; + if( iServiceProvider.Handle() != KNullHandle ) + { + ret = iServiceProvider.ReleaseBuffers(); + } + if( ret != KErrNone ) + { + DEBUG1( "ReleaseBuffers failed, reason=%d", ret ); + } + iDataBlock = NULL; + } + +// --------------------------------------------------------- +// CWlanMgmtFrameHandler::DoCancel +// Release synchronise call. Is called by CActive::Cancel() +// --------------------------------------------------------- +// +void CWlanMgmtFrameHandler::DoCancel() + { + DEBUG( "CWlanMgmtFrameHandler::DoCancel()" ); + iServiceProvider.CancelRxRequests(); + } + +// --------------------------------------------------------- +// CWlanMgmtFrameHandler::IssueRequest +// Request a synchronous call for management packets. +// --------------------------------------------------------- +// +void CWlanMgmtFrameHandler::IssueRequest() + { + DEBUG( "CWlanMgmtFrameHandler::IssueRequest()" ); + iServiceProvider.RequestFrame( iStatus ); + SetActive(); + } + +// --------------------------------------------------------- +// CWlanMgmtFrameHandler::Start +// --------------------------------------------------------- +// +TInt CWlanMgmtFrameHandler::Start() + { + DEBUG( "CWlanMgmtFrameHandler::Start()" ); + TInt ret = iServiceProvider.InitialiseBuffers( iDataBlock ); + if( ret != KErrNone || iDataBlock == NULL ) + { + return ret; + } + IssueRequest(); + return KErrNone; + } + +// --------------------------------------------------------- +// CWlanMgmtFrameHandler::Stop +// --------------------------------------------------------- +// +void CWlanMgmtFrameHandler::Stop() + { + DEBUG( "CWlanMgmtFrameHandler::Stop()" ); + Cancel(); + TInt ret = iServiceProvider.ReleaseBuffers(); + if( ret != KErrNone ) + { + DEBUG1( "ERROR: ReleaseBuffers failed with %d", ret ); + } + } + +// --------------------------------------------------------- +// CWlanMgmtFrameHandler::RunL +// Synchronise call has finished. Send data to client. +// --------------------------------------------------------- +// +void CWlanMgmtFrameHandler::RunL() + { + DEBUG( "CWlanMgmtFrameHandler::RunL()" ); + + // Send all received packets to the client. + if ( iDataBlock == NULL ) + { + DEBUG( "CWlanMgmtFrameHandler::RunL() iDataBlock=NULL" ); + } + else + { + DEBUG( "CWlanMgmtFrameHandler::RunL() iDataBlock is not NULL" ); + TDataBuffer* buffer = NULL; + while( iDataBlock->GetNextRxDataBuffer( buffer ) ) + { + DEBUG1( "EAPOL packet received, length=%d", + buffer->GetLength() ); + + iClient.OnFrameReceive( + buffer->FrameType(), + buffer->GetLength(), + buffer->GetBuffer(), + buffer->Rcpi() ); + } + } + // Wait for next packets. + IssueRequest(); + } + +// --------------------------------------------------------- +// CWlanMgmtFrameHandler::SendFrame +// Send a management data frame. +// --------------------------------------------------------- +// +TInt CWlanMgmtFrameHandler::SendFrame( + const TDataBuffer::TFrameType aFrameType, + const TUint aLength, + const TUint8* const aData, + TUint8 aUserPriority, + const TMacAddress& aDestination, + TBool aSendUnencrypted ) + { + DEBUG( "CWlanMgmtFrameHandler::SendFrame()" ); + + // Check is iDataBlock ok. + __ASSERT_ALWAYS( + iDataBlock != NULL, + User::Panic( + _L( "CWlanMgmtFrameHandler::SendFrame() - iDataBlock = NULL" ), + KErrBadHandle)); + + // Make sure that TX buffer is empty. + iDataBlock->ClearTxDataBuffer(); + iDataBlock->AppendTxDataBuffer( + aData, + aLength, + aFrameType, + aUserPriority, + aSendUnencrypted, + &aDestination ); + + // Make the call synchronous. + TRequestStatus status; + DEBUG7( "CWlanMgmtFrameHandler::SendFrame() - sending packet to %02X:%02X:%02X:%02X:%02X:%02X with priority %u", + aDestination.iMacAddress[0], aDestination.iMacAddress[1], aDestination.iMacAddress[2], + aDestination.iMacAddress[3], aDestination.iMacAddress[4], aDestination.iMacAddress[5], + aUserPriority ); + iServiceProvider.WriteFrame( status ); + User::WaitForRequest( status ); + + DEBUG1( "CWlanMgmtFrameHandler::SendFrame() - packet sent with status = %d", + status.Int() ); + + return status.Int(); + }