usbmgmt/usbmgr/device/classdrivers/ncm/classimplementation/ncmpktdrv/pktdrv/src/ncmntb16builder.cpp
author hgs
Wed, 20 Oct 2010 12:04:53 +0800
changeset 59 bbdce6bffaad
parent 28 f1fd07aa74c9
permissions -rw-r--r--
201041_02
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
* implementation for NTB16 build  class
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
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
    21
/**
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
    22
@file
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
    23
@internalComponent
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
    24
*/
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
    25
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
    26
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
    27
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
    28
#include <es_sock.h>
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
    29
#ifndef __OVER_DUMMYUSBSCLDD__
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
    30
#include <nifmbuf.h>
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
    31
#else
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
    32
#include <usb/testncm/ethinter.h>
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
    33
#endif
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
    34
#include "ncmntb16builder.h"
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
    35
#include "ncmntbbuildpolicy.h"
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
    36
#include "ncmpktdrvcommon.h"
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
    37
#include "OstTraceDefinitions.h"
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
    38
#ifdef OST_TRACE_COMPILER_IN_USE
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
    39
#include "ncmntb16builderTraces.h"
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
    40
#endif
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
    41
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
    42
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
    43
const TInt KNtb16InMaxSize = 32768;
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
    44
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
    45
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
    46
const TInt KNth16Signature = 0x484D434E;
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
    47
const TInt KNth16Length = 0x0C;
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
    48
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
    49
const TInt KNdp16Signature = 0x304D434E;
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
    50
const TInt KNdp16HeaderSize = 8;
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
    51
const TInt KNdp16EntrySize = 4;
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
    52
const TInt KNdp16InDivisor = 4;
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
    53
const TInt KNdp16InRemainder = 0;
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
    54
const TInt KNdp16InAlignment = 4;
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
    55
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
    56
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
    57
// ======== MEMBER FUNCTIONS ========
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
    58
//
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
    59
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
    60
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
    61
CNcmNtbBuilder* CNcmNtb16Builder::NewL(MNcmNtbBuildObserver& aObserver)
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
    62
    {
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
    63
    OstTraceFunctionEntry1( CNCMNTB16BUILDER_NEWL_ENTRY, ( TUint )&( aObserver ) );
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
    64
    CNcmNtb16Builder *self=new (ELeave) CNcmNtb16Builder(aObserver);
59
bbdce6bffaad 201041_02
hgs
parents: 28
diff changeset
    65
bbdce6bffaad 201041_02
hgs
parents: 28
diff changeset
    66
	CleanupStack::PushL(self);	
28
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
    67
    self->ConstructL();
59
bbdce6bffaad 201041_02
hgs
parents: 28
diff changeset
    68
	CleanupStack::Pop(self);
bbdce6bffaad 201041_02
hgs
parents: 28
diff changeset
    69
28
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
    70
    OstTraceFunctionExit0( CNCMNTB16BUILDER_NEWL_EXIT );
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
    71
    return self;    
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
    72
    }
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
    73
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
    74
CNcmNtb16Builder::CNcmNtb16Builder(MNcmNtbBuildObserver& aObserver)
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
    75
    : CNcmNtbBuilder(aObserver)
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
    76
    {
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
    77
    }
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
    78
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
    79
void CNcmNtb16Builder::ConstructL()
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
    80
    {
59
bbdce6bffaad 201041_02
hgs
parents: 28
diff changeset
    81
	iNtbInMaxSize = KNtb16InMaxSize;
28
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
    82
    iNdpInDivisor = KNdp16InDivisor;
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
    83
    iNdpInPayloadRemainder = KNdp16InRemainder;
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
    84
    iNdpInAlignment = KNdp16InAlignment;  
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
    85
    }
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
    86
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
    87
CNcmNtb16Builder::~CNcmNtb16Builder()
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
    88
    {
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
    89
    iPacketsArray.Reset();
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
    90
    }
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
    91
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
    92
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
    93
TInt CNcmNtb16Builder::SetNtbInMaxSize(TInt aSize)
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
    94
    {
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
    95
    OstTraceFunctionEntry1( CNCMNTB16BUILDER_SETNTBINMAXSIZE_ENTRY, this );
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
    96
    if (aSize > KNtb16InMaxSize || aSize < MinNtbInMaxSize())
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
    97
        {
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
    98
        OstTraceFunctionExit1( CNCMNTB16BUILDER_SETNTBINMAXSIZE_EXIT, this );
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
    99
        return KErrArgument;
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   100
        }
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   101
    iNtbInMaxSize = aSize;
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   102
    OstTraceFunctionExit1( CNCMNTB_DUP116BUILDER_SETNTBINMAXSIZE_EXIT, this );
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   103
    return KErrNone;
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   104
    }
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   105
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   106
//
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   107
//construct NTB header information
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   108
//
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   109
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   110
void CNcmNtb16Builder::BuildNtbHeader()
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   111
    {
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   112
    OstTraceFunctionEntry1( CNCMNTB16BUILDER_BUILDNTBHEADER_ENTRY, this );
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   113
    TPtr8 buf(iBuffer.iPtr, KNth16Length, KNth16Length);
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   114
    TInt pos = 0;
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   115
    LittleEndian::Put32(&buf[pos], KNth16Signature);
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   116
    pos += 4;
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   117
    LittleEndian::Put16(&buf[pos], KNth16Length);
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   118
    pos += 2;
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   119
    LittleEndian::Put16(&buf[pos], iSequence);
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   120
    pos += 2;
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   121
    LittleEndian::Put32(&buf[pos], iNdpOffset+iNdpLength);
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   122
    pos += 2;
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   123
    LittleEndian::Put16(&buf[pos], iNdpOffset);
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   124
    pos += 2;
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   125
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   126
    OstTraceExt3( TRACE_NORMAL, CNCMNTB16BUILDER_BUILDNTBHEADER, "CNcmNtb16Builder::BuildNtbHeader %d %d %d", iSequence, iNdpOffset, iNdpOffset+iNdpLength );
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   127
    OstTraceFunctionExit1( CNCMNTB16BUILDER_BUILDNTBHEADER_EXIT, this );
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   128
    }
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   129
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   130
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   131
//
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   132
//construct NDP inforamtion
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   133
//
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   134
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   135
void CNcmNtb16Builder::BuildNdp()
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   136
    {
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   137
    OstTraceFunctionEntry1( CNCMNTB16BUILDER_BUILDNDP_ENTRY, this );
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   138
    TPtr8 buf(iBuffer.iPtr+iNdpOffset, iNdpLength, iNdpLength);
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   139
    TInt pos = 0;
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   140
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   141
    LittleEndian::Put32(&buf[pos], KNdp16Signature);
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   142
    pos += 4;
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   143
    LittleEndian::Put16(&buf[pos], iNdpLength);
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   144
    pos += 2;
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   145
    LittleEndian::Put16(&buf[pos], 0);
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   146
    pos += 2;
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   147
     
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   148
    TInt i;
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   149
    for (i=0 ; i<iPacketsArray.Count() ; i++)
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   150
        {
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   151
        LittleEndian::Put16(&buf[pos], iPacketsArray[i].iWDatagramIndex);
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   152
        pos += 2;
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   153
        LittleEndian::Put16(&buf[pos], iPacketsArray[i].iWDatagramLength);
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   154
        pos += 2;
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   155
        }
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   156
    LittleEndian::Put16(&buf[pos], 0);
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   157
    pos += 2;
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   158
    LittleEndian::Put16(&buf[pos], 0);
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   159
    pos += 2;
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   160
    OstTraceFunctionExit1( CNCMNTB16BUILDER_BUILDNDP_EXIT, this );
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   161
    }
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   162
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   163
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   164
//
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   165
//Append a datagram to NTB
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   166
//
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   167
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   168
TInt CNcmNtb16Builder::AppendPacket(const RMBufChain& aPacket)
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   169
    {
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   170
    OstTraceFunctionEntry1( CNCMNTB16BUILDER_APPENDPACKET_ENTRY, this );
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   171
// datagram must align with  iNdpInDivisor and remainder is iNdpInPayloadRemainder, refer to NCM spec 3.34 for detail   
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   172
    TInt len = aPacket.Length();
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   173
    TInt alignedDataOffset;
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   174
    int remainder = iDatagramOffset%iNdpInDivisor;
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   175
    if (iNdpInPayloadRemainder < remainder)
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   176
        {
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   177
        alignedDataOffset = iDatagramOffset + iNdpInDivisor - remainder + iNdpInPayloadRemainder;  
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   178
        }
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   179
    else
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   180
        {
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   181
        alignedDataOffset = iDatagramOffset + (iNdpInPayloadRemainder-remainder);
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   182
        }
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   183
    TInt newDatagramOffset = alignedDataOffset+len;
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   184
// NDP must align with  iNdpInAlignment, refer to NCM spec Table 6-3 for detail         
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   185
    TInt newNdpOffset = (newDatagramOffset+iNdpInAlignment-1)&~(iNdpInAlignment-1);
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   186
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   187
//    must have a zero entry in the end of NDP, so the NDP length is added with KNdp16EntrySize
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   188
    TInt newNdpLen = iNdpLength + KNdp16EntrySize;
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   189
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   190
//   iBuffer.iMaxLength and iNtbInMaxSize may not same.
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   191
    if (newNdpLen+newNdpOffset > iBuffer.iMaxLength || newNdpLen+newNdpOffset > iNtbInMaxSize)
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   192
        {
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   193
        CompleteNtbBuild();
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   194
        OstTraceFunctionExit1( CNCMNTB16BUILDER_APPENDPACKET_EXIT, this );
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   195
        return KErrBufferFull;
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   196
        }
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   197
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   198
    TPtr8 ptr((TUint8*)(alignedDataOffset+iBuffer.iPtr), len, len);
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   199
    aPacket.CopyOut(ptr);
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   200
    TDatagramEntry entry;
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   201
    entry.iWDatagramIndex = alignedDataOffset;
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   202
    entry.iWDatagramLength = len;
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   203
    iPacketsArray.Append(entry);
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   204
    iNdpOffset = newNdpOffset;
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   205
    iNdpLength = newNdpLen;     
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   206
    iDatagramOffset = newDatagramOffset;
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   207
    if (iBuildPolicy)
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   208
        {
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   209
        iBuildPolicy->UpdateNtb(iNdpOffset+iNdpLength);
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   210
        }
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   211
    OstTraceFunctionExit1( CNCMNTB_DUP116BUILDER_APPENDPACKET_EXIT, this );
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   212
    return KErrNone;
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   213
    }
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   214
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   215
//
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   216
//complete a NTB, is called by buildpolicy or current NTB is full.
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   217
//
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   218
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   219
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   220
void CNcmNtb16Builder::CompleteNtbBuild()
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   221
    {
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   222
    OstTraceFunctionEntry1( CNCMNTB16BUILDER_COMPLETENTBBUILD_ENTRY, this );
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   223
    
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   224
    BuildNtbHeader();
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   225
    BuildNdp();
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   226
    iBuffer.iLen = iNdpOffset+iNdpLength;
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   227
    SendNtbPayload();
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   228
    CNcmNtbBuilder::CompleteNtbBuild();    
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   229
    OstTraceFunctionExit1( CNCMNTB16BUILDER_COMPLETENTBBUILD_EXIT, this );
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   230
    }
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   231
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   232
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   233
//
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   234
//start a new ntb, is called by sender
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   235
//
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   236
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   237
void CNcmNtb16Builder::StartNewNtb(const TNcmBuffer& aBuffer)
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   238
    {
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   239
    OstTraceFunctionEntry1( CNCMNTB16BUILDER_STARTNEWNTB_ENTRY, this );
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   240
    
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   241
    iBuffer = aBuffer;
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   242
    iNdpOffset = 0;
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   243
    iNdpLength = 0;
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   244
    iPacketsArray.Reset();
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   245
    iDatagramOffset = KNth16Length;
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   246
// NDP must align with  iNdpInAlignment, refer to NCM spec Table 6-3 for detail     
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   247
    iNdpOffset = (iDatagramOffset+iNdpInAlignment-1)&~(iNdpInAlignment-1);
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   248
//    must have a zero entry in the end of NDP, so the NDP length is added with KNdp16EntrySize
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   249
    iNdpLength = KNdp16HeaderSize + KNdp16EntrySize;
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   250
    
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   251
    if (iBuildPolicy)
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   252
        {
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   253
        iBuildPolicy->StartNewNtb();
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   254
        }
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   255
    CNcmNtbBuilder::StartNewNtb(aBuffer);
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   256
    OstTraceFunctionExit1( CNCMNTB16BUILDER_STARTNEWNTB_EXIT, this );
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   257
    }
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   258
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   259
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   260
void CNcmNtb16Builder::Reset()
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   261
    {
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   262
    OstTraceFunctionEntry1( CNCMNTB16BUILDER_RESET_ENTRY, this );
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   263
    iNtbInMaxSize = KNtb16InMaxSize;
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   264
    iNdpOffset = 0;
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   265
    iNdpLength = 0;    
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   266
    iDatagramOffset = 0;    
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   267
    iPacketsArray.Reset();
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   268
    CNcmNtbBuilder::Reset();
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   269
    OstTraceFunctionExit1( CNCMNTB16BUILDER_RESET_EXIT, this );
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   270
    }
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   271
    
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   272
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   273