usbmgmt/usbmgr/device/classdrivers/ncm/classimplementation/ncmpktdrv/pktdrv/src/ncmbuffermanager.cpp
author hgs
Wed, 07 Jul 2010 14:16:40 +0800
changeset 28 f1fd07aa74c9
permissions -rw-r--r--
201025_08
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
28
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
     1
/*
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
     2
* Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
     3
* All rights reserved.
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
     4
* This component and the accompanying materials are made available
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
     5
* under the terms of "Eclipse Public License v1.0"
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
     6
* which accompanies this distribution, and is available
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
     7
* at the URL "http://www.eclipse.org/legal/epl-v10.html".
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
     8
*
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
     9
* Initial Contributors:
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
    10
* Nokia Corporation - initial contribution.
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
    11
*
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
    12
* Contributors:
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
    13
*
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
    14
* Description:
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
    15
*
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
    16
*/
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
    17
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
    18
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
    19
/**
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
    20
@file
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
    21
@internalComponent
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
    22
*/
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
    23
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
    24
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
    25
#include "ncmbuffermanager.h"
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
    26
#include "OstTraceDefinitions.h"
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
    27
#ifdef OST_TRACE_COMPILER_IN_USE
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
    28
#include "ncmbuffermanagerTraces.h"
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
    29
#endif
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
    30
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
    31
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
    32
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
    33
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
    34
// if there are KCongestionCount buffers will notify networking to stop sending
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
    35
// if there are at least KUnCongestionCount, will notify networking to start sending
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
    36
const TInt KCongestionCount = 1;
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
    37
const TInt KUnCongestionCount = 3;
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
    38
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
    39
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
    40
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
    41
// ======== MEMBER FUNCTIONS ========
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
    42
//
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
    43
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
    44
CNcmBufferManager* CNcmBufferManager::NewL()
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
    45
    {
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
    46
    OstTraceFunctionEntry0( CNCMBUFFERMANAGER_NEWL_ENTRY );
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
    47
    CNcmBufferManager *self = new (ELeave) CNcmBufferManager();
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
    48
    OstTraceFunctionExit0( CNCMBUFFERMANAGER_NEWL_EXIT );
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
    49
    return self;
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
    50
    }
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
    51
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
    52
CNcmBufferManager::~CNcmBufferManager()
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
    53
    {
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
    54
    OstTraceFunctionEntry1( CNCMBUFFERMANAGER_CNCMBUFFERMANAGER_ENTRY, this );
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
    55
    iFreeQueue.Reset();
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
    56
    OstTraceFunctionExit1( CNCMBUFFERMANAGER_CNCMBUFFERMANAGER_EXIT, this );
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
    57
    }
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
    58
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
    59
//
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
    60
// get a buffer block from manager
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
    61
//
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
    62
TInt CNcmBufferManager::GetBuffer(TNcmBuffer& aBuffer)
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
    63
    {
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
    64
	OstTraceFunctionEntry1( CNCMBUFFERMANAGER_GETBUFFER_ENTRY, this );
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
    65
	
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
    66
    TInt count = iFreeQueue.Count();
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
    67
    TInt ret = KErrNone;
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
    68
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
    69
    if (count == 0)
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
    70
        {
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
    71
        OstTraceFunctionExit1( CNCMBUFFERMANAGER_GETBUFFER_EXIT, this );
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
    72
        return KErrNoBuffer;
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
    73
        }
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
    74
    else if (count == KCongestionCount)
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
    75
        {
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
    76
        iIsCongestion = ETrue;
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
    77
        ret = KErrCongestion;
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
    78
        }
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
    79
    aBuffer = iFreeQueue[0];
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
    80
    iFreeQueue.Remove(0);
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
    81
    OstTraceFunctionExit1( CNCMBUFFERMANAGER_GETBUFFER_EXIT_DUP1, this );
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
    82
    return ret;
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
    83
    }
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
    84
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
    85
//
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
    86
// free a buffer block to manager
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
    87
//
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
    88
void CNcmBufferManager::FreeBuffer(const TNcmBuffer& aBuffer)
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
    89
    {
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
    90
    OstTraceFunctionEntry1( CNCMBUFFERMANAGER_FREEBUFFER_ENTRY, this );
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
    91
    iFreeQueue.Append(aBuffer);  
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
    92
    int count = iFreeQueue.Count();
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
    93
    iFreeQueue[count-1].iLen = 0;
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
    94
    if (count == KUnCongestionCount)
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
    95
        {
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
    96
        iIsCongestion = EFalse;
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
    97
        }
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
    98
    OstTraceFunctionExit1( CNCMBUFFERMANAGER_FREEBUFFER_EXIT, this );
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
    99
    }
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   100
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   101
//
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   102
// set the whole buffer area to create buffer blocks
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   103
//
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   104
void CNcmBufferManager::InitBufferArea(TAny* aBuf, TInt aLength)
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   105
    {
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   106
    OstTrace1( TRACE_NORMAL, CNCMBUFFERMANAGER_INITBUFFERAREA, "CNcmBufferManager::InitBufferArea aLength=%d", aLength );    
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   107
    iBuf = (TUint8*)aBuf;
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   108
    iLen = aLength;
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   109
    }
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   110
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   111
//
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   112
// set the size of a buffer block, create buffer blocks on the buffer area
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   113
//
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   114
TInt CNcmBufferManager::SetBufferCellSize(TInt aSize)
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   115
    {
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   116
    OstTraceFunctionEntry1( CNCMBUFFERMANAGER_SETBUFFERCELLSIZE_ENTRY, this );
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   117
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   118
//    buffer block size must be aligned with KAlignSize to make the each buffer start align with KAlignSize 
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   119
    iCellSize = (aSize+iAlignSize-1)&~(iAlignSize-1);
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   120
    OstTraceExt2( TRACE_NORMAL, CNCMBUFFERMANAGER_SETBUFFERCELLSIZE, "CNcmBufferManager::SetBufferCellSize aSize=%d, iCellSize=%d", aSize, iCellSize );
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   121
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   122
//   buffer area got from share chunk LDD may not align, make it align to KAlignSize first
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   123
    TUint32 buf = (TUint)iBuf;
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   124
    buf = (buf+iAlignSize-1)&~(iAlignSize-1);
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   125
    TUint8* alignbuf = (TUint8*)buf;
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   126
    TUint32 offset = buf - (TUint)iBuf;
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   127
    
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   128
    int count = (iLen-offset)/iCellSize;
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   129
    iFreeQueue.Reset();
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   130
    if (count < KUnCongestionCount)
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   131
        {        
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   132
        OstTrace1( TRACE_FATAL, CNCMBUFFERMANAGER_SETBUFFERCELLSIZE1, "the buffer cell size is too big and create too less buffers %d", count );
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   133
        OstTraceFunctionExit1( CNCMBUFFERMANAGER_SETBUFFERCELLSIZE_EXIT, this );
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   134
        return KErrUnknown;
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   135
        }
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   136
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   137
    TNcmBuffer ncmbuf;
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   138
    for (TInt i=0 ; i<count ; i++)
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   139
        {
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   140
        ncmbuf.iPtr = alignbuf+i*iCellSize;
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   141
        ncmbuf.iLen = 0;
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   142
        ncmbuf.iMaxLength = iCellSize;
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   143
        iFreeQueue.Append(ncmbuf);
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   144
        }
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   145
    iIsCongestion = EFalse;
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   146
    OstTraceFunctionExit1( CNCMBUFFERMANAGER_SETBUFFERCELLSIZE_EXIT_DUP1, this );
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   147
    return KErrNone;
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   148
    }
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   149
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   150
CNcmBufferManager::CNcmBufferManager()
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   151
    {
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   152
    iIsCongestion = EFalse;
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   153
    }
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   154
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   155
//
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   156
// if there is not enough buffer blocks, return ETrue and will start flow control in networking
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   157
//
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   158
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   159
TBool CNcmBufferManager::IsCongestion()
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   160
    {
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   161
    OstTrace1( TRACE_NORMAL, CNCMBUFFERMANAGER_ISCONGESTION, "CNcmBufferManager::FreeBufferCount %d", iFreeQueue.Count() );
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   162
    return iIsCongestion;
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   163
    }
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   164
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   165
TInt CNcmBufferManager::RequiredBufferCount()
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   166
    {
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   167
    return KUnCongestionCount;
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   168
    }
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   169
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   170