usbmgmt/usbmgr/device/classdrivers/ncm/classimplementation/ncmpktdrv/pktdrv/src/ncmengine.cpp
branchRCL_3
changeset 16 012cc2ee6408
parent 15 f92a4f87e424
--- a/usbmgmt/usbmgr/device/classdrivers/ncm/classimplementation/ncmpktdrv/pktdrv/src/ncmengine.cpp	Tue Aug 31 17:01:47 2010 +0300
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,506 +0,0 @@
-/*
-* Copyright (c) 2010 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:
-*
-*/
-
-#include "ncmengine.h"
-#include "ncmpktdrv.h"
-#include "OstTraceDefinitions.h"
-#ifdef OST_TRACE_COMPILER_IN_USE
-#include "ncmengineTraces.h"
-#endif
-
-
-
-const TUint8 KDataIFAltSet1 = 1;
-
-/**
-Create a new CNcmControlEngine object.
-*/
-CNcmEngine *CNcmEngine::NewL(CNcmPktDrv& aPktDrv)
-    {
-    OstTraceFunctionEntry0( CNCMENGINE_NEWL );
-
-    CNcmEngine *self=new (ELeave) CNcmEngine(aPktDrv);
-    CleanupStack::PushL(self);
-    self->ConstructL();
-    CleanupStack::Pop(self);
-
-    OstTraceFunctionExit1( CNCMENGINE_NEWL_DUP01, self );
-    return self;
-    }
-
-/**
-Create the CNcmEngine object.
-*/
-void CNcmEngine::ConstructL()
-    {
-    OstTraceFunctionEntry0( CNCMENGINE_CONSTRUCTL );
-
-    RandomMacAddressL(iSymbianMacAddress);
-
-    iSharedStateManager = CNcmSharedStateManager::NewL(*this);
-    iDataInterface = CNcmDataInterface::NewL(*this, iDataLdd);
-    iCommInterface = CNcmCommunicationInterface::NewL(*this, iCommLdd);
-
-    OstTraceFunctionExit0( CNCMENGINE_CONSTRUCTL_DUP01 );
-    }
-
-/**
-Constructor.
-@param aPktDrv Pointer to NCM Packet Driver.
-*/
-CNcmEngine::CNcmEngine(CNcmPktDrv& aPktDrv) : CActive(CActive::EPriorityStandard),
-                                    iPktDrv(aPktDrv)
-    {
-    CActiveScheduler::Add(this);
-    }
-
-/**
-Destructor.
-*/
-CNcmEngine::~CNcmEngine()
-    {
-    OstTraceFunctionEntry0( CNCMENGINE_CNCMENGINE_DUP10 );
-
-    //double check for possibly missed by PktDrvBase's StopInterface;
-    Stop();
-
-    delete iCommInterface;
-    delete iDataInterface;
-    delete iSharedStateManager;
-
-    OstTraceFunctionExit0( CNCMENGINE_CNCMENGINE_DUP11 );
-    }
-
-/**
- * Initialize the DataInterface's and CommInterface's LDD instances with transferred handle.
- */
-void CNcmEngine::InitLddL(const RMessagePtr2& aMsg)
-    {
-    OstTraceFunctionEntry0( CNCMENGINE_INITLDDL );
-
-    const TUint KCommLddOffset = 0;                     //0
-    const TUint KCommChunkOffset = KCommLddOffset + 1;  //1
-    const TUint KDataLddOffset = KCommChunkOffset + 1;  //2
-    const TUint KDataChunkOffset = KDataLddOffset + 1;  //3
-    const TUint KHandlesInStackCount = 3;
-
-    User::LeaveIfError(iCommLdd.Open(aMsg, KCommLddOffset, EOwnerProcess));
-    CleanupClosePushL(iCommLdd);
-
-    RChunk* chunk;
-    //Get the Ldd's RChunk, but don't own it.
-    User::LeaveIfError(iCommLdd.GetDataTransferChunk(chunk));
-
-    User::LeaveIfError(chunk->Open(aMsg, KCommChunkOffset, FALSE, EOwnerProcess));
-    CleanupClosePushL(*chunk);
-
-    User::LeaveIfError(iDataLdd.Open(aMsg, KDataLddOffset, EOwnerProcess));
-    CleanupClosePushL(iDataLdd);
-
-    User::LeaveIfError(iDataLdd.GetDataTransferChunk(chunk));
-    User::LeaveIfError(chunk->Open(aMsg, KDataChunkOffset, FALSE, EOwnerProcess));
-
-    CleanupStack::Pop(KHandlesInStackCount);
-
-    OstTraceFunctionExit0( CNCMENGINE_INITLDDL_DUP01 );
-    }
-
-/**
- * Start Engine to initialize LDD, and start monitor LDD device status changes.
- */
-TInt CNcmEngine::Start(RMessagePtr2& aMsg)
-    {
-    OstTraceFunctionEntry0( CNCMENGINE_START );
-
-    __ASSERT_DEBUG(iEngineState == ENcmStateUninitialized, User::Panic(KEnginePanic, __LINE__));
-    if (ENcmStateUninitialized != iEngineState)
-        {
-        OstTraceFunctionExitExt( CNCMENGINE_START_DUP10, this, KErrNotSupported );
-        return KErrNotSupported;
-        }
-
-    TRAPD(err, InitLddL(aMsg));
-    if (KErrNone != err)
-        {
-        OstTrace1( TRACE_ERROR, CNCMENGINE_START_DUP01, "InitLdd return error=%d;", err );
-        return err;
-        }
-
-    if (KErrNone != iCommLdd.DeviceStatus(reinterpret_cast<TUsbcDeviceState&>(iDeviceState)))
-        {
-        RChunk* commChunk = NULL;
-        RChunk* dataChunk = NULL;
-        iCommLdd.GetDataTransferChunk(commChunk);
-        iDataLdd.GetDataTransferChunk(dataChunk);
-        commChunk->Close();
-        dataChunk->Close();
-        iDataLdd.Close();
-        iCommLdd.Close();
-        OstTraceFunctionExitExt( CNCMENGINE_START_DUP11, this, KErrNotReady );
-        return KErrNotReady;
-        }
-    OstTrace1( TRACE_NORMAL, CNCMENGINE_START_DUP02, "CommLdd DeviceStatus=%d", iDeviceState);
-
-    if (EUsbcDeviceStateConfigured == iDeviceState)
-        {
-        iStatus = KRequestPending;
-        TRequestStatus* reportStatus = &iStatus;
-        SetActive();
-
-        User::RequestComplete(reportStatus, KErrNone);
-        }
-    else
-        {
-        iCommLdd.AlternateDeviceStatusNotify(iStatus, iDeviceState);
-        SetActive();
-        }
-
-    iDataInterface->ActivateLdd();
-
-    iEngineState = ENcmStateStarting;
-
-    OstTraceFunctionExitExt( CNCMENGINE_START_DUP12, this, KErrNone );
-    return KErrNone;
-    }
-
-/**
- * Monitor the USB device State, Start/Stop Communication/Data Interface
- */
-void CNcmEngine::RunL()
-    {
-    OstTraceExt2( TRACE_NORMAL, CNCMENGINE_RUNL, "iDeviceState=%d;iStatus.Int()=%d", iDeviceState, iStatus.Int() );
-
-    if (KErrNone == iStatus.Int())
-        {
-        iCommLdd.AlternateDeviceStatusNotify(iStatus, iDeviceState);
-        SetActive();
-        }
-    else
-        {
-        iPktDrv.FatalErrorNotification(iStatus.Int());
-        Stop();
-        return;
-        }
-
-    switch(iDeviceState)
-        {
-        case EUsbcDeviceStateConfigured:
-            if (!iCommInterface->IsStarted())
-                {
-                iCommInterface->Start();
-
-                StartDataLayer();
-                }
-            break;
-
-        case EUsbcDeviceStateSuspended:
-            StopDataLayer();
-            break;
-
-        case EUsbcDeviceStateUndefined:
-
-			iDataLdd.ResetAltSetting();
-            StopDataLayer();
-            if (iCommInterface->IsStarted())
-                {
-                iCommInterface->Stop();
-                }
-            break;
-
-        default:
-            //do nothing here.
-            break;
-        }
-    }
-
-/**
-AO cancel
-*/
-void CNcmEngine::DoCancel()
-    {
-    OstTraceFunctionEntry0( CNCMENGINE_DOCANCEL );
-    iCommLdd.AlternateDeviceStatusNotifyCancel();
-    }
-
-/**
- * Fatal error report from Control Channel
- */
-void CNcmEngine::ControlError(TInt aError)
-    {
-    OstTrace1( TRACE_NORMAL, CNCMENGINE_CONTROLERROR, "aError=%d", aError );
-
-    iPktDrv.FatalErrorNotification(aError);
-    Stop();
-    }
-
-/**
- *Enter the started state.
- */
-void CNcmEngine::DoNcmStarted()
-    {
-    OstTraceFunctionEntry0( CNCMENGINE_DONCMSTARTED );
-
-    iDataInterface->Start();
-    TInt speed = 0;
-    iDataInterface->GetSpeed(speed);
-
-    iCommInterface->SendSpeedNotification(speed, speed);
-    iCommInterface->SendConnectionNotification(ETrue);
-
-    __ASSERT_DEBUG(((iEngineState==ENcmStateStarting) || (iEngineState==ENcmStatePaused)), User::Panic(KEnginePanic, __LINE__));
-    iEngineState = ENcmStateStarted;
-    iSharedStateManager->NotifyNcmConnected();
-    }
-
-/**
- *Start the data channel
- */
-void CNcmEngine::StartDataLayer()
-    {
-    OstTraceFunctionEntry0( CNCMENGINE_STARTDATALAYER );
-
-    if (iDataInterface->IsStarted())
-        {
-        OstTrace0( TRACE_WARNING, CNCMENGINE_STARTDATALAYER_DUP01, "The DataIf has already been started!" );
-
-        __ASSERT_DEBUG(0, User::Panic(KEnginePanic, __LINE__));
-        return;
-        }
-
-    if (KDataIFAltSet1 != iDataInterface->AltSetting())
-        {
-        OstTrace0( TRACE_NORMAL, CNCMENGINE_STARTDATALAYER_DUP02, "Data Interface is not ready to start; it's fine!!" );
-        return;
-        }
-
-    TInt ret = iSharedStateManager->NotifyDhcpProvisionRequested();
-    if (KErrAlreadyExists == ret)
-        {
-        DoNcmStarted();
-        }
-    else
-        {
-        if (KErrNone != ret)
-            {
-            //minus error when try to set IPBearerCoexistence P&S key. just continue...
-            OstTrace1( TRACE_WARNING, CNCMENGINE_STARTDATALAYER_DUP03, "SharedStateManager issued dhcp request return error:;ret=%d", ret );
-            }
-
-        iCommInterface->SendConnectionNotification(EFalse);
-
-        if (ENcmStatePaused == iEngineState)
-            {
-            iEngineState = ENcmStateStarting;
-            }
-        }
-    }
-
-/**
- *Stop the data channel
- */
-void CNcmEngine::StopDataLayer()
-    {
-    OstTraceFunctionEntry0( CNCMENGINE_STOPDATALAYER );
-
-    if (iDataInterface->IsStarted())
-        {
-        __ASSERT_DEBUG((iEngineState==ENcmStateStarted), User::Panic(KEnginePanic, __LINE__));
-        iEngineState = ENcmStatePaused;
-        iSharedStateManager->NotifyNcmDisconnected(KErrNone);
-
-        iDataInterface->Stop();
-        }
-    }
-
-/**
- *Stop NCM
- */
-void CNcmEngine::Stop()
-    {
-    OstTraceFunctionEntry0( CNCMENGINE_STOP );
-
-    if (ENcmStateStarted == iEngineState ||
-        ENcmStatePaused == iEngineState ||
-        ENcmStateStarting == iEngineState)
-        {
-        Cancel();
-        iDataInterface->Cancel();
-
-        if (iDataInterface->IsStarted())
-            {
-            iDataInterface->Stop();
-            }
-
-        if (iCommInterface->IsStarted())
-            {
-            iCommInterface->Stop();
-            }
-
-        RChunk* commChunk = NULL;
-        RChunk* dataChunk = NULL;
-
-        iCommLdd.GetDataTransferChunk(commChunk);
-        iDataLdd.GetDataTransferChunk(dataChunk);
-        commChunk->Close();
-        dataChunk->Close();
-        iDataLdd.Close();
-        iCommLdd.Close();
-        }
-
-    if (ENcmStateStarted == iEngineState ||
-        ENcmStateStarting == iEngineState)
-        {
-        iSharedStateManager->NotifyNcmDisconnected(KErrNone);
-        }
-    iEngineState = ENcmStateStopped;
-    }
-
-/**
- * Send the ethernet frame to USB Host.
-*/
-TInt CNcmEngine::Send(RMBufChain &aPacket)
-    {
-    OstTraceExt2( TRACE_NORMAL, CNCMENGINE_SEND, "aPacket=%x;aPacket.Length()=%d", ( TUint )&( aPacket ), aPacket.Length() );
-
-    return iDataInterface->Send(aPacket);
-    }
-
-/**
-Get the Hardware address of the LAN Device
-@return MAC address of the Symbian device
-*/
-TUint8* CNcmEngine::InterfaceAddress()
-    {
-    OstTraceExt3( TRACE_NORMAL, CNCMENGINE_INTERFACEADDRESS, "Local MAC is 02:00:00:%02X:%02X:%02X.", iSymbianMacAddress[3], iSymbianMacAddress[4], iSymbianMacAddress[5]);
-    return static_cast<TUint8*>(&iSymbianMacAddress[0]);
-    }
-
-void CNcmEngine::RandomMacAddressL(TNcmMacAddress& aMacAddress)
-    {
-    OstTrace1( TRACE_NORMAL, CNCMENGINE_RANDOMMACADDRESSL, "aMacAddress=%x", ( TUint )&( aMacAddress ) );
-    //random the MAC address
-    aMacAddress.SetLength(KEthernetAddressLength);
-    const TUint KOUILength = 3;
-    const TInt len = KEthernetAddressLength - KOUILength;
-
-    TPtr8 ptr(&aMacAddress[0] + KOUILength,  len, len);
-    TRandom::RandomL(ptr);
-
-    //mark it as locally managed address
-    aMacAddress[0] = 0x02;
-    aMacAddress[1] = 0x00;
-    aMacAddress[2] = 0x00;
-    }
-
-/** MControlInterfaceObserver
- * Set Ntb Input Size. See NCM1.0 spec.
- */
-TInt CNcmEngine::HandleSetNtbInputSize(TDes8& aSize)
-    {
-    OstTraceFunctionEntry1( CNCMENGINE_HANDLESETNTBINPUTSIZE, ( TUint )&( aSize ) );
-
-    return iDataInterface->SetNtbInputSize(aSize);
-    }
-
-/**
- * Set Ntb Parameters. See NCM1.0 spec.
- */
-TInt CNcmEngine::HandleGetNtbParam(TDes8& aReturnBuf)
-    {
-    OstTraceFunctionEntry1( CNCMENGINE_HANDLEGETNTBPARAM, ( TUint )&( aReturnBuf ) );
-
-    return iDataInterface->GetNtbParam(aReturnBuf);
-    }
-
-/**
- * Get Ntb Input Size. See NCM1.0 spec.
- */
-TInt CNcmEngine::HandleGetNtbInputSize(TDes8& aSize)
-    {
-    OstTraceFunctionEntry1( CNCMENGINE_HANDLEGETNTBINPUTSIZE, ( TUint )&( aSize ) );
-
-    return iDataInterface->GetNtbInputSize(aSize);
-    }
-
-/**
- * Enable NCM connection by setting NCM speed & connection, when notified that DHCP Provison done successfully.
- */
-void CNcmEngine::NotifyDhcpStarted()
-    {
-    OstTraceFunctionEntry0( CNCMENGINE_NOTIFYDHCPSTARTED );
-    __ASSERT_DEBUG(!iDataInterface->IsStarted(), User::Panic(KEnginePanic, __LINE__));
-    if (iDeviceState != EUsbcDeviceStateConfigured || KDataIFAltSet1 != iDataInterface->AltSetting())
-        {
-        OstTraceExt2( TRACE_WARNING, CNCMENGINE_NOTIFYDHCPSTARTED_DUP01, "NotifyDhcpStarted comes so later;iDeviceState=%d;iDataInterface->AltSetting()=%d", iDeviceState, iDataInterface->AltSetting() );
-        return;
-        }
-
-    DoNcmStarted();
-    }
-
-/**
- *Upwards notify
- * @param aPacket A Reference to a buffer holding data.
- */
-void CNcmEngine::ProcessReceivedDatagram(RMBufPacket& aPacket)
-    {
-    OstTraceExt2( TRACE_NORMAL, CNCMENGINE_PROCESSRECEIVEDDATAGRAM, "aPacket=%x;aPacket.Length()=%d", ( TUint )&( aPacket ), aPacket.Length() );
-    iPktDrv.ReceiveEthFrame(aPacket);
-    }
-
-/**
- * Resume Sending is a notification call into NIF from the lower layer telling the NIF that a
- * previous sending congestion situation has been cleared and it can accept more downstack data.
- */
-void CNcmEngine::ResumeSending()
-    {
-    OstTraceFunctionEntry0( CNCMENGINE_RESUMESENDING );
-    iPktDrv.ResumeSending();
-    }
-
-/**
- * Error report from Data Channel
- */
-void CNcmEngine::DataError(TInt aError)
-    {
-    OstTrace1( TRACE_ERROR, CNCMENGINE_DATAERROR, "CNcmEngine::DataError;aError=%d", aError );
-
-    iPktDrv.FatalErrorNotification(aError);
-    }
-/**
- * Handle the data interface alt setting changes.
- */
-void CNcmEngine::HandleAltSetting(TInt aIfAltSet)
-    {
-    OstTraceExt3( TRACE_NORMAL, CNCMENGINE_HANDLEALTSETTING, "CNcmEngine::HandleAltSetting;aIfAltSet=%d;iDataInterface->AltSetting()=%d;iDeviceState=%d", aIfAltSet, iDataInterface->AltSetting(), (TInt) iDeviceState );
-
-    if (KDataIFAltSet1 == aIfAltSet)
-        {
-        StartDataLayer();
-        }
-    else
-        {
-        StopDataLayer();
-        }
-    }
-
-TInt CNcmEngine::SetInEpBufferSize(TUint aSize)
-    {
-    OstTrace1( TRACE_NORMAL, CNCMENGINE_SETINEPBUFFERSIZE, "aSize=%u", aSize );
-    return iDataInterface->SetInEpBufferSize(aSize);
-    }
-