usbmgmt/usbmgr/device/classdrivers/ncm/classimplementation/ncmpktdrv/pktdrv/src/ncmdatasender.cpp
branchRCL_3
changeset 43 012cc2ee6408
parent 42 f92a4f87e424
child 45 ee9b31ff95f7
child 52 3d9964be03bc
--- a/usbmgmt/usbmgr/device/classdrivers/ncm/classimplementation/ncmpktdrv/pktdrv/src/ncmdatasender.cpp	Tue Aug 31 17:01:47 2010 +0300
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,439 +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:
-*
-*/
-
-
-
-/**
-@file
-@internalComponent
-*/
-
-
-#include <e32base.h>
-
-#ifndef __OVER_DUMMYUSBSCLDD__
-#include <d32usbc.h>
-#else
-#include <dummyusbsclddapi.h>
-#endif
-
-#include "ncmdatasender.h"
-#include "ncmntb16builder.h"
-#include "ncmdatainterface.h"
-#include "ncmbuffermanager.h"
-#include "ncmntbbuildsimplepolicy.h"
-#include "OstTraceDefinitions.h"
-#ifdef OST_TRACE_COMPILER_IN_USE
-#include "ncmdatasenderTraces.h"
-#endif
-
-
-//
-//write buffer alignment value should get from share chunk LDD, current LDD has no API for this
-//use a pagesize here instead
-//
-const TInt KAlignSize = 1024;
-
-
-// ======== MEMBER FUNCTIONS ========
-//
-
-CNcmDataSender::CNcmDataSender(RDevUsbcScClient& aPort, CNcmDataInterface& aParent) : CActive(EPriorityStandard),
-                                            iPort(aPort),
-                                            iParent(aParent)
-    {
-    CActiveScheduler::Add(this);
-    }
-
-CNcmDataSender* CNcmDataSender::NewL(RDevUsbcScClient& aPort, CNcmDataInterface& aParent)
-    {
-    OstTraceFunctionEntry0( CNCMDATASENDER_NEWL_ENTRY );
-    CNcmDataSender *self = new (ELeave) CNcmDataSender(aPort, aParent);
-    CleanupStack::PushL(self);
-    self->ConstructL();
-    CleanupStack::Pop(self);
-    OstTraceFunctionExit0( CNCMDATASENDER_NEWL_EXIT );
-    return self;
-    }
-
-void CNcmDataSender::ConstructL()
-    {
-
-    iNtbBuilder = CNcmNtb16Builder::NewL(*this);
-    iBufferManager = CNcmBufferManager::NewL();
-    iBufferManager->SetAlignSize(KAlignSize);
-    iBuildPolicy = CNcmNtbBuildSimplePolicy::NewL(*iNtbBuilder);
-    iBuildPolicy->NtbBuilder().SetBuildPolicy(*iBuildPolicy);
-    iStarted = EFalse;
-    iStopSending = EFalse;
-    iIsSending = EFalse;
-    }
-
-CNcmDataSender::~CNcmDataSender()
-    {
-    Cancel();
-    delete iNtbBuilder;
-    delete iBufferManager;
-    delete iBuildPolicy;
-    }
-
-//
-// Start the sender
-//
-void CNcmDataSender::Start()
-    {
-    OstTraceFunctionEntry1( CNCMDATASENDER_START_ENTRY, this );
-    if (iStarted)
-        {
-        OstTrace0( TRACE_ERROR, CNCMDATASENDER_START, "Alrealy start, return directly." );
-        OstTraceFunctionExit1( CNCMDATASENDER_START_EXIT, this );
-        return;
-        }
-
-    if (iStopSending)
-        {
-        iParent.ResumeSending();
-        iStopSending = EFalse;
-        }
-
-    TInt ret = iPort.OpenEndpoint(iEpOut, EEndpoint1);
-    if (ret != KErrNone)
-        {
-        OstTrace1( TRACE_FATAL, CNCMDATASENDER_START1, "OpenEndpoint error %d", ret );
-        iParent.DataError(ret);
-        OstTraceFunctionExit1( CNCMDATASENDER_START_EXIT_DUP1, this );
-        return;
-        }
-
-    TAny* buf = NULL;
-    TUint size;
-    ret = iEpOut.GetInBufferRange(buf, size);
-    if (ret != KErrNone)
-        {
-        OstTrace1( TRACE_FATAL, CNCMDATASENDER_START2, "iEpOut.GetInBufferRange failed ret=%d", ret );
-        iParent.DataError(ret);
-        OstTraceFunctionExit1( CNCMDATASENDER_START_EXIT_DUP2, this );
-        return;
-        }
-    else if (size < NtbInMaxSize())
-        {
-        OstTrace0( TRACE_FATAL, CNCMDATASENDER_START3, "LDD buffer size is small than NTB size" );
-        iParent.DataError(KErrArgument);
-        OstTraceFunctionExit1( CNCMDATASENDER_START_EXIT_DUP3, this );
-        return;
-        }
-    OstTraceExt2( TRACE_NORMAL, CNCMDATASENDER_START4, "GetInBufferRange at 0x%x size %d", (TUint)buf, size);
-
-
-    iBufferManager->InitBufferArea(buf, size);
-    ret = iBufferManager->SetBufferCellSize(NtbInMaxSize());
-    if (ret != KErrNone)
-        {
-        OstTrace1( TRACE_FATAL, CNCMDATASENDER_START5, "iBufferManager->SetBufferCellSize failed ret=%d", ret );
-        iParent.DataError(KErrArgument);
-        OstTraceFunctionExit1( CNCMDATASENDER_START_EXIT_DUP4, this );
-        return;
-        }
-    iBuildPolicy->UpdateBufferSize(NtbInMaxSize());
-    iBuildPolicy->UpdateTotalBufferCount(iBufferManager->FreeBufferCount());
-    iStarted = ETrue;
-    OstTraceFunctionExit1( CNCMDATASENDER_START_EXIT_DUP5, this );
-    }
-
-
-void CNcmDataSender::RunL()
-    {
-    OstTraceFunctionEntry1( CNCMDATASENDER_RUNL_ENTRY, this );
-    OstTrace1( TRACE_NORMAL, CNCMDATASENDER_RUNL, "CNcmDataSender::RunL:Status=%d", iStatus.Int());
-
-    if(iStatus.Int() != KErrNone)
-        {
-        if (KErrCancel == iStatus.Int() )
-            {
-            }
-        else
-            {
-            iParent.DataError(iStatus.Int());
-            }
-        OstTraceFunctionExit1( CNCMDATASENDER_RUNL_EXIT, this );
-        return;
-        }
-    SendNtbComplete();
-    OstTraceFunctionExit1( CNCMDATASENDER_RUNL_EXIT_DUP1, this );
-    }
-
-//
-//Start a New Ntb in Builder
-//
-
-TInt CNcmDataSender::StartNewNtb()
-    {
-    OstTraceFunctionEntry1( CNCMDATASENDER_STARTNEWNTB_ENTRY, this );
-    TNcmBuffer ncmBuffer;
-    TInt ret = iBufferManager->GetBuffer(ncmBuffer);
-	if (ret == KErrNone || ret == KErrCongestion)
-        {
-        iNtbBuilder->StartNewNtb(ncmBuffer);
-        }
-    else
-        {
-        OstTrace1( TRACE_FATAL, CNCMDATASENDER_STARTNEWNTB, "iBufferManager->GetBuffer failed ret=%d", ret);
-        }
-    OstTraceFunctionExit1( CNCMDATASENDER_STARTNEWNTB_EXIT, this );
-    return ret;
-    }
-
-
-//add a Ethernet packet to current NTB
-//
-
-TInt CNcmDataSender::Send(RMBufChain& aPacket)
-    {
-    OstTraceFunctionEntry1( CNCMDATASENDER_SEND_ENTRY, this );
-
-    if (!iStarted)
-        {
-        OstTrace0( TRACE_WARNING, CNCMDATASENDER_SEND1, "Sender is not started" );
-        iStopSending = ETrue;
-        OstTraceFunctionExit1( CNCMDATASENDER_SEND_EXIT, this );
-        return KErrNotReady;
-        }
-
-    TInt ret = KErrNone;
-    if (!iNtbBuilder->IsNtbStarted())
-        {
-        ret = StartNewNtb();
-        if (ret != KErrNone && ret != KErrCongestion)
-            {
-            OstTraceFunctionExit1( CNCMDATASENDER_SEND_EXIT_DUP1, this );
-            return ret;
-            }
-        }
-
-    TBool isCongestion = (ret == KErrCongestion)?ETrue:EFalse;
-
-    ret = iNtbBuilder->AppendPacket(aPacket);
-
-    if (ret == KErrBufferFull)
-        {
-    //current NTB is full and can't add new packet, start a new NTB and insert packet to it
-        ret = StartNewNtb();
-        if (ret == KErrNone)
-            {
-            ret = iNtbBuilder->AppendPacket(aPacket);
-            }
-        else if (ret == KErrCongestion)
-            {
-            isCongestion = ETrue;
-            ret = iNtbBuilder->AppendPacket(aPacket);
-            }
-        }
-
-    if (isCongestion && ret == KErrNone)
-        {
-        OstTrace0( TRACE_NORMAL, CNCMDATASENDER_SEND2, "CNcmDataSender::Send congestion" );
-        iStopSending = ETrue;
-        OstTraceFunctionExit1( CNCMDATASENDER_SEND_EXIT_DUP2, this );
-        return KErrCongestion;
-        }
-    OstTraceFunctionExit1( CNCMDATASENDER_SEND_EXIT_DUP3, this );
-    return ret;
-    }
-
-//
-//Cancel the outgoing request of sending
-//
-
-void CNcmDataSender::DoCancel()
-    {
-    OstTraceFunctionEntry1( CNCMDATASENDER_DOCANCEL_ENTRY, this );
-    iPort.WriteCancel(iEpOut.BufferNumber());
-    OstTraceFunctionExit1( CNCMDATASENDER_DOCANCEL_EXIT, this );
-    }
-
-void CNcmDataSender::SendNtbPayload(TNcmBuffer& aBuf)
-    {
-    OstTraceFunctionEntry1( CNCMDATASENDER_SENDNTBPAYLOAD_ENTRY, this );
-    OstTraceExt2( TRACE_NORMAL, CNCMDATASENDER_SENDNTBPAYLOAD, "SendNtbPayload:%08x, len=%d", (TUint)aBuf.iPtr, aBuf.iLen);
-
-    if (iIsSending)
-        {
-        OstTrace0( TRACE_NORMAL, CNCMDATASENDER_SENDNTBPAYLOAD1, "SendNtbPayload: there is NTB on sending, store the buffer" );
-        iTxArray.Append(aBuf);
-        OstTraceFunctionExit1( CNCMDATASENDER_SENDNTBPAYLOAD_EXIT, this );
-        return;
-        }
-
-    iSendingBuffer = aBuf;
-    iIsSending = ETrue;
-
-    iStatus = KRequestPending;
-    TInt ret;
-    //
-    //   compliant to NCM spec with Zlp case
-    //
-    if (aBuf.iLen == NtbInMaxSize())
-        {
-        OstTrace0( TRACE_NORMAL, CNCMDATASENDER_SENDNTBPAYLOAD2, "iEpOut.WriteBuffer without zlp" );
-        ret = iEpOut.WriteBuffer((TAny*)aBuf.iPtr, aBuf.iLen, EFalse, iStatus);
-        }
-    else
-        {
-        OstTrace0( TRACE_NORMAL, CNCMDATASENDER_SENDNTBPAYLOAD3, "iEpOut.WriteBuffer with zlp" );
-        ret = iEpOut.WriteBuffer((TAny*)aBuf.iPtr, aBuf.iLen, ETrue, iStatus);
-        }
-    if (ret == KErrNone && !IsActive())
-        {
-        SetActive();
-        }
-    else
-        {
-        OstTrace1( TRACE_FATAL, CNCMDATASENDER_SENDNTBPAYLOAD4, "iEpOut.WriteBuffer failed ret = %d", ret);
-        iParent.DataError(ret);
-        }
-    OstTraceFunctionExit1( CNCMDATASENDER_SENDNTBPAYLOAD_EXIT_DUP1, this );
-    return;
-    }
-
-//
-// called when a sender request is completed by LDD
-//
-
-void CNcmDataSender::SendNtbComplete()
-    {
-    OstTraceFunctionEntry1( CNCMDATASENDER_SENDNTBCOMPLETE_ENTRY, this );
-
-    iIsSending = EFalse;
-    iBufferManager->FreeBuffer(iSendingBuffer);
-    iBuildPolicy->UpdateFreeBufferCount(iBufferManager->FreeBufferCount());
-
-    // when buffer manage has enough buffers, notify networking to stop flow control
-    if (!iBufferManager->IsCongestion() && iStopSending)
-        {
-        iStopSending = EFalse;
-        iParent.ResumeSending();
-        }
-    if (iTxArray.Count())
-        {
-        OstTrace0( TRACE_NORMAL, CNCMDATASENDER_SENDNTBCOMPLETE3, "send NTB in sending queue" );
-        SendNtbPayload(iTxArray[0]);
-        iTxArray.Remove(0);
-        }
-    OstTraceFunctionExit1( CNCMDATASENDER_SENDNTBCOMPLETE_EXIT, this );
-    }
-
-void CNcmDataSender::GetNtbParam(TNcmNtbInParam& aParam)
-    {
-    iNtbBuilder->GetNtbParam(aParam);
-    }
-
-TInt CNcmDataSender::SetNtbInMaxSize(TInt aSize, TBool aIsAltZero)
-    {
-    OstTraceFunctionEntry1( CNCMDATASENDER_SETNTBINMAXSIZE_ENTRY, this );
-    OstTrace1( TRACE_NORMAL, CNCMDATASENDER_SETNTBINMAXSIZE, "SetNtbInMaxSize %d", aSize);
-
-    TInt ret = iNtbBuilder->SetNtbInMaxSize(aSize);
-    if (ret != KErrNone)
-        {
-        OstTrace1( TRACE_FATAL, CNCMDATASENDER_SETNTBINMAXSIZE1, "iNtbBuilder->SetNtbInMaxSize failed %d", ret);
-        OstTraceFunctionExit1( CNCMDATASENDER_SETNTBINMAXSIZE_EXIT, this );
-        return ret;
-        }
-
-//
-//if sender is not started, endpoint buffer is not setup, so does not call SetBufferCellSize
-//
-    if (!iStarted)
-        {
-        OstTraceFunctionExit1( CNCMDATASENDER_SETNTBINMAXSIZE_EXIT_DUP1, this );
-        return KErrNone;
-        }
-
-//    if not in alternate setting 0, there may be data in buffer, so doesn't reset buffers.
-    if (!aIsAltZero)
-        {
-        OstTraceFunctionExit1( CNCMDATASENDER_SETNTBINMAXSIZE_EXIT_DUP2, this );
-        return KErrNone;
-        }
-
-    OstTraceFunctionExit1( CNCMDATASENDER_SETNTBINMAXSIZE_EXIT_DUP4, this );
-    return KErrNone;
-    }
-
-
-void CNcmDataSender::Stop()
-    {
-    OstTraceFunctionEntry1( CNCMDATASENDER_STOP_ENTRY, this );
-    Cancel();
-    iBuildPolicy->Cancel();
-    iNtbBuilder->Reset();
-    iTxArray.Reset();
-    iEpOut.Close();
-    iStopSending = EFalse;
-    iStarted = EFalse;
-    iIsSending = EFalse;
-    OstTraceFunctionExit1( CNCMDATASENDER_STOP_EXIT, this );
-    }
-
-// call this function to notify the buffer size of In endpoint buffer size of LDD and adjust the MaxInNtbSize supported
-// report to host
-
-TInt CNcmDataSender::SetInEpBufferSize(TUint aSize)
-    {
-    OstTraceFunctionEntry1( CNCMDATASENDER_SETINEPBUFFERSIZE_ENTRY, this );
-    TInt ret = KErrNone;
-    TUint size = aSize;
-
-	OstTrace1( TRACE_NORMAL, CNCMDATASENDER_SETINEPBUFFERSIZE, "SetInEpBufferSize aSize=%d", aSize);
-
-
-// the buffer may not aligned, so decrease max possible offset due to aligment
-    size -= KAlignSize-1;
-    TInt ntbSize = iNtbBuilder->NtbInMaxSize();
-    TInt cellSize = KAlignSize;
-    TInt minNtbInMaxSize = iNtbBuilder->MinNtbInMaxSize();
-    TInt count;
-    TBool find = EFalse;
-    while (ntbSize >= minNtbInMaxSize)
-        {
-        cellSize = (ntbSize+KAlignSize-1)&~(KAlignSize-1);
-        count = size / cellSize;
-        if (count < iBufferManager->RequiredBufferCount())
-            {
-            ntbSize /= 2;
-            continue;
-            }
-        find = ETrue;
-        break;
-        }
-
-    if (ntbSize == iNtbBuilder->NtbInMaxSize())
-        {
-        ret = KErrNone;
-        }
-    else if (find)
-        {
-        ret = iNtbBuilder->SetNtbInMaxSize(cellSize);
-        }
-    else
-        {
-        ret = KErrGeneral;
-        }
-    OstTraceFunctionExit1( CNCMDATASENDER_SETINEPBUFFERSIZE_EXIT, this );
-    return ret;
-    }
-