satengine/satserver/Engine/src/CSatBIPGPRSDataChannel.cpp
author hgs
Mon, 04 Oct 2010 15:57:13 +0300
changeset 51 12bc758d6a02
parent 33 8d5d7fcf9b59
permissions -rw-r--r--
201039
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
33
hgs
parents:
diff changeset
     1
/*
hgs
parents:
diff changeset
     2
* Copyright (c) 2002-2009 Nokia Corporation and/or its subsidiary(-ies). 
hgs
parents:
diff changeset
     3
* All rights reserved.
hgs
parents:
diff changeset
     4
* This component and the accompanying materials are made available
hgs
parents:
diff changeset
     5
* under the terms of "Eclipse Public License v1.0"
hgs
parents:
diff changeset
     6
* which accompanies this distribution, and is available
hgs
parents:
diff changeset
     7
* at the URL "http://www.eclipse.org/legal/epl-v10.html".
hgs
parents:
diff changeset
     8
*
hgs
parents:
diff changeset
     9
* Initial Contributors:
hgs
parents:
diff changeset
    10
* Nokia Corporation - initial contribution.
hgs
parents:
diff changeset
    11
*
hgs
parents:
diff changeset
    12
* Contributors:
hgs
parents:
diff changeset
    13
*
hgs
parents:
diff changeset
    14
* Description:  GPRS Data channel for BIP
hgs
parents:
diff changeset
    15
*
hgs
parents:
diff changeset
    16
*/
hgs
parents:
diff changeset
    17
hgs
parents:
diff changeset
    18
hgs
parents:
diff changeset
    19
#include <etelqos.h>
hgs
parents:
diff changeset
    20
#include <cmmanager.h>
hgs
parents:
diff changeset
    21
#include <cmconnectionmethod.h>
hgs
parents:
diff changeset
    22
#include <cmpluginpacketdatadef.h>
hgs
parents:
diff changeset
    23
#include <cs_subconevents.h>                    // For subconnection events
hgs
parents:
diff changeset
    24
#include <networking/qos3gpp_subconparams.h>    // For extension parameters
hgs
parents:
diff changeset
    25
#include <e32std.h>                             // TRealFormat
hgs
parents:
diff changeset
    26
#include <e32cmn.h>
hgs
parents:
diff changeset
    27
#ifdef SYMBIAN_ENABLE_SPLIT_HEADERS
hgs
parents:
diff changeset
    28
#include <in_sock_internal.h>                   // For KSoUdpRecvBuf contant
hgs
parents:
diff changeset
    29
#endif
hgs
parents:
diff changeset
    30
#include "CSatBIPUtils.h"
hgs
parents:
diff changeset
    31
#include "CSatBIPGPRSDataChannel.h"
hgs
parents:
diff changeset
    32
#include "SatLog.h"
hgs
parents:
diff changeset
    33
#include "EnginePanic.h"
hgs
parents:
diff changeset
    34
#include "CSatBIPDataSender.h"
hgs
parents:
diff changeset
    35
#include "CSatBIPDataReceiver.h"
hgs
parents:
diff changeset
    36
#include "MSatSendDataObserver.h"
hgs
parents:
diff changeset
    37
#include "MSatConnectionObserver.h"
hgs
parents:
diff changeset
    38
#include "TSatChannelIDInfo.h"
hgs
parents:
diff changeset
    39
#include "TSatQoSParser.h"
hgs
parents:
diff changeset
    40
#include "csatbipsubconneventobserver.h"
hgs
parents:
diff changeset
    41
#include "csatsactivewrapper.h"
hgs
parents:
diff changeset
    42
 
hgs
parents:
diff changeset
    43
// Required GPRS parameters
hgs
parents:
diff changeset
    44
const TUint8 KReqGprsQoSParams = 6;
hgs
parents:
diff changeset
    45
// Required packet protocol type is always 02 for GPRS -> IP Protocol
hgs
parents:
diff changeset
    46
const TUint8 KReqPacketProtType = 0x02;
hgs
parents:
diff changeset
    47
// Position of the protocol type in the array
hgs
parents:
diff changeset
    48
const TUint8 KProtocolPos = 5;
hgs
parents:
diff changeset
    49
// Lengths of IP address
hgs
parents:
diff changeset
    50
const TUint8 KIPv4Length = 4;
hgs
parents:
diff changeset
    51
const TUint8 KIPv6Length = 16;
hgs
parents:
diff changeset
    52
hgs
parents:
diff changeset
    53
#ifdef SAT_USE_DUMMY_TSY
hgs
parents:
diff changeset
    54
const TUint8 KIpAddressSize( 15 );
hgs
parents:
diff changeset
    55
const TUint8 KIpv4Length( 4 );
hgs
parents:
diff changeset
    56
const TUint8 KIpv6Length( 16 );
hgs
parents:
diff changeset
    57
const TUint8 KIpAddressA( 0 );
hgs
parents:
diff changeset
    58
const TUint KIpAddressAValue( 127 );
hgs
parents:
diff changeset
    59
const TUint8 KIpAddressB( 1 );
hgs
parents:
diff changeset
    60
const TUint KIpAddressBValue( 0 );
hgs
parents:
diff changeset
    61
const TUint8 KIpAddressC( 2 );
hgs
parents:
diff changeset
    62
const TUint KIpAddressCValue( 0 );
hgs
parents:
diff changeset
    63
const TUint8 KIpAddressD( 3 );
hgs
parents:
diff changeset
    64
const TUint KIpAddressDValueDestination( 2 );
hgs
parents:
diff changeset
    65
const TUint KIpAddressDValueLocal( 3 );
hgs
parents:
diff changeset
    66
#endif
hgs
parents:
diff changeset
    67
hgs
parents:
diff changeset
    68
#ifdef ENABLE_SAT_LOGGING
hgs
parents:
diff changeset
    69
const TUint8 KIpAddressLogSize( 40 );
hgs
parents:
diff changeset
    70
#endif
hgs
parents:
diff changeset
    71
hgs
parents:
diff changeset
    72
const TInt KReCheckStatusDelay = 100000; // 100ms
hgs
parents:
diff changeset
    73
const TInt KMaxAttempts = 20;            // 20*100ms= 2s 
hgs
parents:
diff changeset
    74
// ======== MEMBER FUNCTIONS ========
hgs
parents:
diff changeset
    75
hgs
parents:
diff changeset
    76
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
    77
// Two-phased constructor.
hgs
parents:
diff changeset
    78
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
    79
//
hgs
parents:
diff changeset
    80
CSatBIPGPRSDataChannel* CSatBIPGPRSDataChannel::NewL(
hgs
parents:
diff changeset
    81
    CSatBIPUtils& aUtils,
hgs
parents:
diff changeset
    82
    RSocketServ& aSocketServer,
hgs
parents:
diff changeset
    83
    TSatChannelIdInfo& aChannelId,
hgs
parents:
diff changeset
    84
    RConnection& aConnection,
hgs
parents:
diff changeset
    85
    RSubConnection& aSubConnection )
hgs
parents:
diff changeset
    86
    {
hgs
parents:
diff changeset
    87
    LOG( SIMPLE, "SATENGINE: CSatBIPGPRSDataChannel::NewL calling" )
hgs
parents:
diff changeset
    88
hgs
parents:
diff changeset
    89
    CSatBIPGPRSDataChannel* self = new( ELeave ) CSatBIPGPRSDataChannel( 
hgs
parents:
diff changeset
    90
        aUtils, aSocketServer, aChannelId, aConnection, aSubConnection );
hgs
parents:
diff changeset
    91
hgs
parents:
diff changeset
    92
    CleanupStack::PushL( self );
hgs
parents:
diff changeset
    93
    self->ConstructL();
hgs
parents:
diff changeset
    94
    CleanupStack::Pop( self );
hgs
parents:
diff changeset
    95
hgs
parents:
diff changeset
    96
    LOG( SIMPLE, "SATENGINE: CSatBIPGPRSDataChannel::NewL exiting" )
hgs
parents:
diff changeset
    97
    return self;
hgs
parents:
diff changeset
    98
    }
hgs
parents:
diff changeset
    99
hgs
parents:
diff changeset
   100
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   101
// Two-phased constructor.
hgs
parents:
diff changeset
   102
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   103
//
hgs
parents:
diff changeset
   104
CSatBIPGPRSDataChannel* CSatBIPGPRSDataChannel::NewLC(
hgs
parents:
diff changeset
   105
    CSatBIPUtils& aUtils,
hgs
parents:
diff changeset
   106
    RSocketServ& aSocketServer,
hgs
parents:
diff changeset
   107
    TSatChannelIdInfo& aChannelId,
hgs
parents:
diff changeset
   108
    RConnection& aConnection,
hgs
parents:
diff changeset
   109
    RSubConnection& aSubConnection )
hgs
parents:
diff changeset
   110
    {
hgs
parents:
diff changeset
   111
    LOG( SIMPLE, "SATENGINE: CSatBIPGPRSDataChannel::NewLC calling" )
hgs
parents:
diff changeset
   112
hgs
parents:
diff changeset
   113
    CSatBIPGPRSDataChannel* self = new ( ELeave ) CSatBIPGPRSDataChannel( 
hgs
parents:
diff changeset
   114
        aUtils, aSocketServer, aChannelId, aConnection, aSubConnection );
hgs
parents:
diff changeset
   115
hgs
parents:
diff changeset
   116
    CleanupStack::PushL( self );
hgs
parents:
diff changeset
   117
    self->ConstructL();
hgs
parents:
diff changeset
   118
hgs
parents:
diff changeset
   119
    LOG( SIMPLE, "SATENGINE: CSatBIPGPRSDataChannel::NewLC exiting" )
hgs
parents:
diff changeset
   120
    return self;
hgs
parents:
diff changeset
   121
    }
hgs
parents:
diff changeset
   122
hgs
parents:
diff changeset
   123
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   124
// destructor.
hgs
parents:
diff changeset
   125
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   126
//
hgs
parents:
diff changeset
   127
CSatBIPGPRSDataChannel::~CSatBIPGPRSDataChannel()
hgs
parents:
diff changeset
   128
    {
hgs
parents:
diff changeset
   129
    LOG( SIMPLE,
hgs
parents:
diff changeset
   130
         "SATENGINE: CSatBIPGPRSDataChannel::~CSatBIPGPRSDataChannel calling" )
hgs
parents:
diff changeset
   131
hgs
parents:
diff changeset
   132
    // Close sender
hgs
parents:
diff changeset
   133
    delete iSender;
hgs
parents:
diff changeset
   134
    
hgs
parents:
diff changeset
   135
    // Close receiver
hgs
parents:
diff changeset
   136
    delete iReceiver;
hgs
parents:
diff changeset
   137
    
hgs
parents:
diff changeset
   138
    // Close receiver
hgs
parents:
diff changeset
   139
    delete iSubConnEventObserver;
hgs
parents:
diff changeset
   140
    
hgs
parents:
diff changeset
   141
    // Close Socket
hgs
parents:
diff changeset
   142
    iSocket.Close();
hgs
parents:
diff changeset
   143
    
hgs
parents:
diff changeset
   144
    // Delete buffers
hgs
parents:
diff changeset
   145
    delete iSendStore;
hgs
parents:
diff changeset
   146
    iRcvBuffer.Zero();
hgs
parents:
diff changeset
   147
    
hgs
parents:
diff changeset
   148
    LOG( SIMPLE,
hgs
parents:
diff changeset
   149
         "SATENGINE: CSatBIPGPRSDataChannel::~CSatBIPGPRSDataChannel exiting" )
hgs
parents:
diff changeset
   150
    }
hgs
parents:
diff changeset
   151
hgs
parents:
diff changeset
   152
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   153
// Sets up connection
hgs
parents:
diff changeset
   154
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   155
//
hgs
parents:
diff changeset
   156
void CSatBIPGPRSDataChannel::SetupConnectionL( 
hgs
parents:
diff changeset
   157
    const TSatBipConnectionInfo& aConnParams )
hgs
parents:
diff changeset
   158
    {
hgs
parents:
diff changeset
   159
    LOG( SIMPLE, 
hgs
parents:
diff changeset
   160
        "SATENGINE: CSatBIPGPRSDataChannel::SetupConnectionL calling" )
hgs
parents:
diff changeset
   161
hgs
parents:
diff changeset
   162
    // Allocate Send buffer
hgs
parents:
diff changeset
   163
    iSendStore = HBufC8::NewL( aConnParams.iBufferSize );
hgs
parents:
diff changeset
   164
hgs
parents:
diff changeset
   165
    // Store the rest of connection information
hgs
parents:
diff changeset
   166
    iConnInfo = aConnParams;
hgs
parents:
diff changeset
   167
hgs
parents:
diff changeset
   168
    // Define used protocol
hgs
parents:
diff changeset
   169
    iUseTcpProtocol = ( RSat::ETcp == iConnInfo.iProtocol.iTransportProto );
hgs
parents:
diff changeset
   170
hgs
parents:
diff changeset
   171
    // Set connection stage
hgs
parents:
diff changeset
   172
    iConnStage = ESatBIPClosed;
hgs
parents:
diff changeset
   173
hgs
parents:
diff changeset
   174
    LOG( SIMPLE, 
hgs
parents:
diff changeset
   175
        "SATENGINE: CSatBIPGPRSDataChannel::SetupConnectionL exiting" )
hgs
parents:
diff changeset
   176
    }
hgs
parents:
diff changeset
   177
hgs
parents:
diff changeset
   178
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   179
// Opens the connection
hgs
parents:
diff changeset
   180
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   181
//
hgs
parents:
diff changeset
   182
void CSatBIPGPRSDataChannel::ActivateConnectionL(
hgs
parents:
diff changeset
   183
    MSatConnectionObserver* aObserver )
hgs
parents:
diff changeset
   184
    {
hgs
parents:
diff changeset
   185
    LOG( SIMPLE,
hgs
parents:
diff changeset
   186
        "SATENGINE: CSatBIPGPRSDataChannel::ActivateConnectionL calling" )
hgs
parents:
diff changeset
   187
    
hgs
parents:
diff changeset
   188
    TInt errCode( KErrNone );               // errCode
hgs
parents:
diff changeset
   189
    RPacketQoS::TQoSGPRSNegotiated negQoS;  // The negotiated QoS
hgs
parents:
diff changeset
   190
    
hgs
parents:
diff changeset
   191
    // If the connection has not been setup or already connecting, leave
hgs
parents:
diff changeset
   192
    if ( ESatBIPClosed != iConnStage )
hgs
parents:
diff changeset
   193
        {
hgs
parents:
diff changeset
   194
        LOG( SIMPLE,
hgs
parents:
diff changeset
   195
        "SATENGINE: CSatBIPGPRSDataChannel::ActivateConnectionL \
hgs
parents:
diff changeset
   196
        ESatBIPClosed != iConnStage" )
hgs
parents:
diff changeset
   197
        User::Leave( KErrCancel );
hgs
parents:
diff changeset
   198
        }
hgs
parents:
diff changeset
   199
hgs
parents:
diff changeset
   200
    iConnectionObserver = aObserver;
hgs
parents:
diff changeset
   201
hgs
parents:
diff changeset
   202
    if ( RSat::EIPv4Address == iConnInfo.iDestination.iType )
hgs
parents:
diff changeset
   203
        {
hgs
parents:
diff changeset
   204
        LOG( NORMAL, 
hgs
parents:
diff changeset
   205
             "SATENGINE: CSatBIPGPRSDataChannel::ActivateConnectionL\
hgs
parents:
diff changeset
   206
             Using IPv4" )
hgs
parents:
diff changeset
   207
        }
hgs
parents:
diff changeset
   208
    else if ( RSat::EIPv6Address == iConnInfo.iDestination.iType )
hgs
parents:
diff changeset
   209
        {
hgs
parents:
diff changeset
   210
        LOG( NORMAL, 
hgs
parents:
diff changeset
   211
             "SATENGINE: CSatBIPGPRSDataChannel::ActivateConnectionL\
hgs
parents:
diff changeset
   212
             Using IPv6" )
hgs
parents:
diff changeset
   213
        }
hgs
parents:
diff changeset
   214
    else
hgs
parents:
diff changeset
   215
        {
hgs
parents:
diff changeset
   216
        LOG( NORMAL, "  Unknown IP type" )
hgs
parents:
diff changeset
   217
        User::Leave( KErrUnknown );
hgs
parents:
diff changeset
   218
        }
hgs
parents:
diff changeset
   219
    
hgs
parents:
diff changeset
   220
    // Open connection if it is inactive
hgs
parents:
diff changeset
   221
    if ( !iUtils.IsConnectionActivated() )
hgs
parents:
diff changeset
   222
        {
hgs
parents:
diff changeset
   223
        LOG( NORMAL, 
hgs
parents:
diff changeset
   224
             "SATENGINE: CSatBIPGPRSDataChannel::ActivateConnectionL\
hgs
parents:
diff changeset
   225
             Connection is inactive, open connection " )
hgs
parents:
diff changeset
   226
        // Write the primary PDP Context QoS Parameters to CMManager
hgs
parents:
diff changeset
   227
        // before activating the primary PDP Context.  
hgs
parents:
diff changeset
   228
        WritePrimaryPDPContextQoSParamsL();
hgs
parents:
diff changeset
   229
        
hgs
parents:
diff changeset
   230
        // Open sub-session to SocketServer    
hgs
parents:
diff changeset
   231
        errCode = iConnection.Open( iSocketServ );
hgs
parents:
diff changeset
   232
        LOG2( NORMAL, 
hgs
parents:
diff changeset
   233
              "SATENGINE: CSatBIPGPRSDataChannel::ActivateConnectionL\
hgs
parents:
diff changeset
   234
              RConnection opened with code: %i", errCode )
hgs
parents:
diff changeset
   235
        User::LeaveIfError( errCode );
hgs
parents:
diff changeset
   236
        
hgs
parents:
diff changeset
   237
        // Start connection. If there are no override settings, 
hgs
parents:
diff changeset
   238
        // use default settings
hgs
parents:
diff changeset
   239
        if ( iConnInfo.iOverrideSet )
hgs
parents:
diff changeset
   240
            {
hgs
parents:
diff changeset
   241
            LOG( NORMAL, "Starting connection with override settings" )
hgs
parents:
diff changeset
   242
            TConnPrefList prefList;
hgs
parents:
diff changeset
   243
            TExtendedConnPref extPrefs;
hgs
parents:
diff changeset
   244
            
hgs
parents:
diff changeset
   245
            extPrefs.SetNoteBehaviour( 
hgs
parents:
diff changeset
   246
                    iConnInfo.iOverrideSet->NoteBehaviour() );
hgs
parents:
diff changeset
   247
            extPrefs.SetIapId( iConnInfo.iOverrideSet->IapId() );
hgs
parents:
diff changeset
   248
            prefList.AppendL( &extPrefs );
hgs
parents:
diff changeset
   249
            
hgs
parents:
diff changeset
   250
            errCode = iConnection.Start( prefList );
hgs
parents:
diff changeset
   251
            }
hgs
parents:
diff changeset
   252
        else
hgs
parents:
diff changeset
   253
            {
hgs
parents:
diff changeset
   254
            LOG( NORMAL, "Starting connection with default settings" )
hgs
parents:
diff changeset
   255
            errCode = iConnection.Start();
hgs
parents:
diff changeset
   256
            }
hgs
parents:
diff changeset
   257
        
hgs
parents:
diff changeset
   258
        LOG2( NORMAL, 
hgs
parents:
diff changeset
   259
              "SATENGINE: CSatBIPGPRSDataChannel::ActivateConnectionL\
hgs
parents:
diff changeset
   260
              RConnection started with code: %i", errCode )
hgs
parents:
diff changeset
   261
        User::LeaveIfError( errCode );
hgs
parents:
diff changeset
   262
        
hgs
parents:
diff changeset
   263
        // Erase the primary PDP Context QoS Parameters from CMManager 
hgs
parents:
diff changeset
   264
        WriteDefaultQoSParamsL();
hgs
parents:
diff changeset
   265
        
hgs
parents:
diff changeset
   266
        // Set Connection activated
hgs
parents:
diff changeset
   267
        iUtils.SetConnectionActivated( ETrue );
hgs
parents:
diff changeset
   268
        // Make sure the subconnection is inactive.
hgs
parents:
diff changeset
   269
        iUtils.SetSubConnectionActivated( EFalse );
hgs
parents:
diff changeset
   270
        }
hgs
parents:
diff changeset
   271
    else    
hgs
parents:
diff changeset
   272
        {
hgs
parents:
diff changeset
   273
        LOG( NORMAL, 
hgs
parents:
diff changeset
   274
             "SATENGINE: CSatBIPGPRSDataChannel::ActivateConnectionL\
hgs
parents:
diff changeset
   275
             Connection is active " )
hgs
parents:
diff changeset
   276
        // Connection is active, open SubConnection if it is inactive
hgs
parents:
diff changeset
   277
        if ( !iUtils.IsSubConnectionActivated() ) 
hgs
parents:
diff changeset
   278
            {
hgs
parents:
diff changeset
   279
            LOG( NORMAL, "SATENGINE: CSatBIPGPRSDataChannel::\
hgs
parents:
diff changeset
   280
            ActivateConnectionL SubConnection is inactive, open \
hgs
parents:
diff changeset
   281
            subconnection" )
hgs
parents:
diff changeset
   282
            // Open SubConnection 
hgs
parents:
diff changeset
   283
            OpenSubConnection();
hgs
parents:
diff changeset
   284
            }
hgs
parents:
diff changeset
   285
        }
hgs
parents:
diff changeset
   286
    
hgs
parents:
diff changeset
   287
    // Set up QoS values
hgs
parents:
diff changeset
   288
    SetConnQoSParamsL();
hgs
parents:
diff changeset
   289
    
hgs
parents:
diff changeset
   290
    // Open socket
hgs
parents:
diff changeset
   291
    OpenSocketL();
hgs
parents:
diff changeset
   292
    
hgs
parents:
diff changeset
   293
    // UDP Socket doesn't need ActiveObject, so we don't have to wait.
hgs
parents:
diff changeset
   294
    if ( !iUseTcpProtocol )
hgs
parents:
diff changeset
   295
        {
hgs
parents:
diff changeset
   296
        LOG( NORMAL, 
hgs
parents:
diff changeset
   297
             "SATENGINE: CSatBIPGPRSDataChannel::ActivateConnectionL\
hgs
parents:
diff changeset
   298
             UDP protocol " )
hgs
parents:
diff changeset
   299
        StartReceiveL();
hgs
parents:
diff changeset
   300
        iConnStage = ESatBIPConnected;
hgs
parents:
diff changeset
   301
        
hgs
parents:
diff changeset
   302
        // Notify ConnectionObserver
hgs
parents:
diff changeset
   303
        iConnectionObserver->ConnectionNotification( KErrNone );
hgs
parents:
diff changeset
   304
        }
hgs
parents:
diff changeset
   305
    
hgs
parents:
diff changeset
   306
    LOG( SIMPLE,
hgs
parents:
diff changeset
   307
        "SATENGINE: CSatBIPGPRSDataChannel::ActivateConnectionL exiting" )
hgs
parents:
diff changeset
   308
    }
hgs
parents:
diff changeset
   309
hgs
parents:
diff changeset
   310
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   311
// ends or stores the data.
hgs
parents:
diff changeset
   312
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   313
//
hgs
parents:
diff changeset
   314
void CSatBIPGPRSDataChannel::GetNegotiatedQoSParams( 
hgs
parents:
diff changeset
   315
    RSat::TBearerParams& aResult ) const
hgs
parents:
diff changeset
   316
    {
hgs
parents:
diff changeset
   317
    LOG( SIMPLE, "SATENGINE: CSatBIPGPRSDataChannel::NegotiatedQoSParams\
hgs
parents:
diff changeset
   318
        calling - exiting" )
hgs
parents:
diff changeset
   319
    aResult = iConnInfo.iBearerParams;
hgs
parents:
diff changeset
   320
    }
hgs
parents:
diff changeset
   321
hgs
parents:
diff changeset
   322
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   323
// Sends or stores the data.
hgs
parents:
diff changeset
   324
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   325
//
hgs
parents:
diff changeset
   326
TInt CSatBIPGPRSDataChannel::SendDataL( const TDes8& aData,
hgs
parents:
diff changeset
   327
    const TBool aSendImmediately,
hgs
parents:
diff changeset
   328
    TInt& aFreeBufferSize,
hgs
parents:
diff changeset
   329
    MSatSendDataObserver* aObserver )
hgs
parents:
diff changeset
   330
    {
hgs
parents:
diff changeset
   331
    LOG( SIMPLE, "SATENGINE: CSatBIPGPRSDataChannel::SendDataL calling" )
hgs
parents:
diff changeset
   332
hgs
parents:
diff changeset
   333
    TInt errCode( MSatBIPUtils::ESatBIPSuccess );
hgs
parents:
diff changeset
   334
    CSatSActiveWrapper* delay = NULL;
hgs
parents:
diff changeset
   335
    TInt numberOfTries( 1 );
hgs
parents:
diff changeset
   336
    // Check status of connection
hgs
parents:
diff changeset
   337
    TBool suspended( RPacketService::EStatusSuspended == 
hgs
parents:
diff changeset
   338
        iUtils.ConnectionStatus() );
hgs
parents:
diff changeset
   339
hgs
parents:
diff changeset
   340
    // Check that does the data fit in buffer
hgs
parents:
diff changeset
   341
    const TInt bufsize( iSendStore->Length() );
hgs
parents:
diff changeset
   342
hgs
parents:
diff changeset
   343
    LOG2( NORMAL,
hgs
parents:
diff changeset
   344
        "SATENGINE: CSatBIPGPRSDataChannel::SendDataL iSendBuffer size: %i",
hgs
parents:
diff changeset
   345
        bufsize )
hgs
parents:
diff changeset
   346
    LOG2( NORMAL,
hgs
parents:
diff changeset
   347
        "SATENGINE: CSatBIPGPRSDataChannel::SendDataL aData size: %i",
hgs
parents:
diff changeset
   348
        aData.Length() )
hgs
parents:
diff changeset
   349
    if ( suspended )
hgs
parents:
diff changeset
   350
        {
hgs
parents:
diff changeset
   351
        // for async wait
hgs
parents:
diff changeset
   352
        delay = new ( ELeave ) CSatSActiveWrapper();
hgs
parents:
diff changeset
   353
        }
hgs
parents:
diff changeset
   354
    
hgs
parents:
diff changeset
   355
    while ( suspended && KMaxAttempts >= numberOfTries ) 
hgs
parents:
diff changeset
   356
        {
hgs
parents:
diff changeset
   357
        // In cases of SMS or Call suspend the pdp context, we need to 
hgs
parents:
diff changeset
   358
        // evaluate the status of context after a small delay
hgs
parents:
diff changeset
   359
        LOG2( NORMAL, "SATENGINE: CSatBIPGPRSDataChannel::SendDataL, wait, %d "\
hgs
parents:
diff changeset
   360
            , numberOfTries )
hgs
parents:
diff changeset
   361
        delay->After( KReCheckStatusDelay );
hgs
parents:
diff changeset
   362
        suspended = RPacketService::EStatusSuspended == iUtils.ConnectionStatus();
hgs
parents:
diff changeset
   363
        numberOfTries++;
hgs
parents:
diff changeset
   364
        }
hgs
parents:
diff changeset
   365
    
hgs
parents:
diff changeset
   366
    delete delay;
hgs
parents:
diff changeset
   367
    delay = NULL;
hgs
parents:
diff changeset
   368
            
hgs
parents:
diff changeset
   369
    if ( suspended && aSendImmediately )
hgs
parents:
diff changeset
   370
        {
hgs
parents:
diff changeset
   371
        LOG( NORMAL, "SATENGINE: CSatBIPGPRSDataChannel::SendDataL \
hgs
parents:
diff changeset
   372
            Connection suspended" )
hgs
parents:
diff changeset
   373
        errCode = MSatBIPUtils::ESatBIPServiceError;
hgs
parents:
diff changeset
   374
        }
hgs
parents:
diff changeset
   375
    else if ( iConnInfo.iBufferSize < ( aData.Length() + bufsize ) )
hgs
parents:
diff changeset
   376
        {
hgs
parents:
diff changeset
   377
        LOG( NORMAL,
hgs
parents:
diff changeset
   378
            "SATENGINE: CSatBIPGPRSDataChannel::SendDataL Buffer overflow" )
hgs
parents:
diff changeset
   379
        errCode = MSatBIPUtils::ESatBIPReqBufSizeNotAvail;
hgs
parents:
diff changeset
   380
        }
hgs
parents:
diff changeset
   381
    else
hgs
parents:
diff changeset
   382
        {
hgs
parents:
diff changeset
   383
hgs
parents:
diff changeset
   384
        // Append data to send buffer
hgs
parents:
diff changeset
   385
        TPtr8 ptr = iSendStore->Des();
hgs
parents:
diff changeset
   386
        ptr.Append( aData );
hgs
parents:
diff changeset
   387
hgs
parents:
diff changeset
   388
        // Send immediately, if required
hgs
parents:
diff changeset
   389
        if ( aSendImmediately )
hgs
parents:
diff changeset
   390
            {
hgs
parents:
diff changeset
   391
            LOG( NORMAL,
hgs
parents:
diff changeset
   392
                "SATENGINE: CSatBIPGPRSDataChannel::SendDataL Sending data" )
hgs
parents:
diff changeset
   393
hgs
parents:
diff changeset
   394
            // If Sender object is NULL, create it
hgs
parents:
diff changeset
   395
            if ( !iSender && aObserver )
hgs
parents:
diff changeset
   396
                {
hgs
parents:
diff changeset
   397
                LOG( NORMAL, "SATENGINE: CSatBIPGPRSDataChannel::SendDataL \
hgs
parents:
diff changeset
   398
                create iSender" )
hgs
parents:
diff changeset
   399
                iSender = new ( ELeave ) CSatBIPDataSender(
hgs
parents:
diff changeset
   400
                        *aObserver, iSocket, iUseTcpProtocol,
hgs
parents:
diff changeset
   401
                        iConnInfo.iBufferSize );
hgs
parents:
diff changeset
   402
                }
hgs
parents:
diff changeset
   403
hgs
parents:
diff changeset
   404
            if ( iSender )
hgs
parents:
diff changeset
   405
                {
hgs
parents:
diff changeset
   406
                LOG( NORMAL, "SATENGINE: CSatBIPGPRSDataChannel::SendDataL \
hgs
parents:
diff changeset
   407
                iSender true" )
hgs
parents:
diff changeset
   408
                // Send data
hgs
parents:
diff changeset
   409
                iSender->SendData( ptr, iDestAddr );
hgs
parents:
diff changeset
   410
hgs
parents:
diff changeset
   411
                // Remove data from buffer.
hgs
parents:
diff changeset
   412
                iSendStore = HBufC8::NewL( iConnInfo.iBufferSize );
hgs
parents:
diff changeset
   413
                }
hgs
parents:
diff changeset
   414
            }
hgs
parents:
diff changeset
   415
        }
hgs
parents:
diff changeset
   416
hgs
parents:
diff changeset
   417
    // Place the number of bytes of empty space in the buffer to aFreeBufferSize
hgs
parents:
diff changeset
   418
    aFreeBufferSize = ( iConnInfo.iBufferSize - iSendStore->Length() );
hgs
parents:
diff changeset
   419
hgs
parents:
diff changeset
   420
    LOG2( SIMPLE, "SATENGINE: CSatBIPGPRSDataChannel::SendDataL exiting, \
hgs
parents:
diff changeset
   421
          errCode: %d", errCode )
hgs
parents:
diff changeset
   422
    return errCode;
hgs
parents:
diff changeset
   423
    }
hgs
parents:
diff changeset
   424
hgs
parents:
diff changeset
   425
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   426
// Returns the received data in param aData
hgs
parents:
diff changeset
   427
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   428
//
hgs
parents:
diff changeset
   429
TInt CSatBIPGPRSDataChannel::ReceiveDataL( TDes8& aData,
hgs
parents:
diff changeset
   430
    const TInt aBytesToRead, TInt& aAvailableBytes )
hgs
parents:
diff changeset
   431
    {
hgs
parents:
diff changeset
   432
    LOG( SIMPLE, "SATENGINE: CSatBIPGPRSDataChannel::ReceiveDataL calling" )
hgs
parents:
diff changeset
   433
hgs
parents:
diff changeset
   434
    TInt errCode( MSatBIPUtils::ESatBIPSuccess );
hgs
parents:
diff changeset
   435
hgs
parents:
diff changeset
   436
    // Number of bytes to return, may not be the same as requested
hgs
parents:
diff changeset
   437
    TInt bytesToReturn( aBytesToRead );
hgs
parents:
diff changeset
   438
hgs
parents:
diff changeset
   439
    const TInt bytesAvail( iRcvBuffer.Length() );
hgs
parents:
diff changeset
   440
hgs
parents:
diff changeset
   441
    // Compare the number of bytes received and the number of bytes requested.
hgs
parents:
diff changeset
   442
    if ( bytesToReturn > bytesAvail )
hgs
parents:
diff changeset
   443
        {
hgs
parents:
diff changeset
   444
        LOG( SIMPLE, "SATENGINE: CSatBIPGPRSDataChannel::ReceiveDataL \
hgs
parents:
diff changeset
   445
        bytesToReturn > bytesAvail" )
hgs
parents:
diff changeset
   446
        // There are no requested bytes availabe, we return all we have.
hgs
parents:
diff changeset
   447
        errCode = MSatBIPUtils::ESatBIPReqBufSizeNotAvail;
hgs
parents:
diff changeset
   448
        bytesToReturn = bytesAvail;
hgs
parents:
diff changeset
   449
        }
hgs
parents:
diff changeset
   450
hgs
parents:
diff changeset
   451
    LOG2( NORMAL, "  ReceiveDataL: Data available for receive: %i", bytesAvail )
hgs
parents:
diff changeset
   452
hgs
parents:
diff changeset
   453
    // Put the data into param aData.
hgs
parents:
diff changeset
   454
    aData = iRcvBuffer.Left( bytesToReturn );
hgs
parents:
diff changeset
   455
    // Remove read data from receive store
hgs
parents:
diff changeset
   456
    iRcvBuffer.Delete( 0, bytesToReturn );
hgs
parents:
diff changeset
   457
    // Put the number of unread bytes into param aAvailableBytes.
hgs
parents:
diff changeset
   458
    aAvailableBytes = iRcvBuffer.Length();
hgs
parents:
diff changeset
   459
    
hgs
parents:
diff changeset
   460
    LOG2( SIMPLE, "SATENGINE: CSatBIPGPRSDataChannel::ReceiveDataL \
hgs
parents:
diff changeset
   461
          aAvailableBytes: %d", aAvailableBytes )
hgs
parents:
diff changeset
   462
    // Notify receiver if store is empty to get the next datagram in UDP sockets
hgs
parents:
diff changeset
   463
    if ( ( 0 == aAvailableBytes ) && iReceiver )
hgs
parents:
diff changeset
   464
        {
hgs
parents:
diff changeset
   465
        iReceiver->ReceiveStoreEmptyNotificationL();
hgs
parents:
diff changeset
   466
        }
hgs
parents:
diff changeset
   467
hgs
parents:
diff changeset
   468
    LOG2( SIMPLE, "SATENGINE: CSatBIPGPRSDataChannel::ReceiveDataL exiting. \
hgs
parents:
diff changeset
   469
          errCode: %d", errCode )
hgs
parents:
diff changeset
   470
    return errCode;
hgs
parents:
diff changeset
   471
    }
hgs
parents:
diff changeset
   472
hgs
parents:
diff changeset
   473
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   474
// Returns the identifier of this channel
hgs
parents:
diff changeset
   475
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   476
//
hgs
parents:
diff changeset
   477
TInt CSatBIPGPRSDataChannel::ChannelId() const
hgs
parents:
diff changeset
   478
    {
hgs
parents:
diff changeset
   479
    LOG2( SIMPLE,
hgs
parents:
diff changeset
   480
    "SATENGINE: CSatBIPGPRSDataChannel::ChannelId calling - exiting,\
hgs
parents:
diff changeset
   481
    ChannelId: %i", iChannelId.ChannelId() )
hgs
parents:
diff changeset
   482
    return iChannelId.ChannelId();
hgs
parents:
diff changeset
   483
    }
hgs
parents:
diff changeset
   484
hgs
parents:
diff changeset
   485
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   486
// Returns the identifier of this channel. This function is used only when
hgs
parents:
diff changeset
   487
// generating ChannelStatus TLV object
hgs
parents:
diff changeset
   488
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   489
//
hgs
parents:
diff changeset
   490
TUint8 CSatBIPGPRSDataChannel::ChannelStatusChannelId() const
hgs
parents:
diff changeset
   491
    {
hgs
parents:
diff changeset
   492
    LOG( SIMPLE,
hgs
parents:
diff changeset
   493
        "SATENGINE: CSatBIPGPRSDataChannel::ChannelStatusChannelId calling" )
hgs
parents:
diff changeset
   494
hgs
parents:
diff changeset
   495
    TUint8 channelId( iChannelId.ShortChannelId() );
hgs
parents:
diff changeset
   496
hgs
parents:
diff changeset
   497
    LOG2( SIMPLE,
hgs
parents:
diff changeset
   498
        "SATENGINE: CSatBIPGPRSDataChannel::ChannelStatusChannelId exiting \
hgs
parents:
diff changeset
   499
        with channel id: %i", channelId )
hgs
parents:
diff changeset
   500
    return channelId;
hgs
parents:
diff changeset
   501
    }
hgs
parents:
diff changeset
   502
hgs
parents:
diff changeset
   503
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   504
// Returns the status of this data channel
hgs
parents:
diff changeset
   505
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   506
//
hgs
parents:
diff changeset
   507
TInt CSatBIPGPRSDataChannel::Status() const
hgs
parents:
diff changeset
   508
    {
hgs
parents:
diff changeset
   509
    LOG2( SIMPLE, 
hgs
parents:
diff changeset
   510
    "SATENGINE: CSatBIPGPRSDataChannel::Status calling - exiting,\
hgs
parents:
diff changeset
   511
    iChannelStatus: %i", iChannelStatus )
hgs
parents:
diff changeset
   512
    return iChannelStatus;
hgs
parents:
diff changeset
   513
    }
hgs
parents:
diff changeset
   514
hgs
parents:
diff changeset
   515
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   516
// Closes this data channel
hgs
parents:
diff changeset
   517
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   518
//
hgs
parents:
diff changeset
   519
void CSatBIPGPRSDataChannel::CloseChannel()
hgs
parents:
diff changeset
   520
    {
hgs
parents:
diff changeset
   521
    LOG( SIMPLE, "SATENGINE: CSatBIPGPRSDataChannel::CloseChannel calling" )
hgs
parents:
diff changeset
   522
hgs
parents:
diff changeset
   523
    if ( ESatBIPConnected == iConnStage ||
hgs
parents:
diff changeset
   524
         ESatBIPCancelled == iConnStage )
hgs
parents:
diff changeset
   525
        {
hgs
parents:
diff changeset
   526
        LOG( NORMAL, "SATENGINE: CSatBIPGPRSDataChannel::CloseChannel \
hgs
parents:
diff changeset
   527
            Channel is connected" )
hgs
parents:
diff changeset
   528
        CancelAll();
hgs
parents:
diff changeset
   529
        // Close socket
hgs
parents:
diff changeset
   530
        iSocket.Close();
hgs
parents:
diff changeset
   531
hgs
parents:
diff changeset
   532
        iConnStage = ESatBIPClosed;
hgs
parents:
diff changeset
   533
        }
hgs
parents:
diff changeset
   534
    else if ( iConnStage == ESatBIPConnect &&
hgs
parents:
diff changeset
   535
              iUseTcpProtocol )
hgs
parents:
diff changeset
   536
        {
hgs
parents:
diff changeset
   537
        LOG( NORMAL, "SATENGINE: CSatBIPGPRSDataChannel::CloseChannel \
hgs
parents:
diff changeset
   538
            Channel is connecting" )
hgs
parents:
diff changeset
   539
        // If Channel is connecting and protocol is TCP,
hgs
parents:
diff changeset
   540
        // have to call Cancel instead of CancelAll since this is an active
hgs
parents:
diff changeset
   541
        // object in this situation
hgs
parents:
diff changeset
   542
        Cancel();
hgs
parents:
diff changeset
   543
        // Close socket
hgs
parents:
diff changeset
   544
        iSocket.Close();
hgs
parents:
diff changeset
   545
        
hgs
parents:
diff changeset
   546
        iConnStage = ESatBIPClosed;
hgs
parents:
diff changeset
   547
        }
hgs
parents:
diff changeset
   548
    else
hgs
parents:
diff changeset
   549
        {
hgs
parents:
diff changeset
   550
        LOG( NORMAL, "SATENGINE: CSatBIPGPRSDataChannel::CloseChannel \
hgs
parents:
diff changeset
   551
            Channel already closed" )
hgs
parents:
diff changeset
   552
        }
hgs
parents:
diff changeset
   553
hgs
parents:
diff changeset
   554
    // Release channel ID
hgs
parents:
diff changeset
   555
    iChannelId.ReleaseChannel();
hgs
parents:
diff changeset
   556
hgs
parents:
diff changeset
   557
    LOG( SIMPLE, "SATENGINE: CSatBIPGPRSDataChannel::CloseChannel exiting" )
hgs
parents:
diff changeset
   558
    }
hgs
parents:
diff changeset
   559
hgs
parents:
diff changeset
   560
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   561
// Performs cancel actions.
hgs
parents:
diff changeset
   562
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   563
//
hgs
parents:
diff changeset
   564
void CSatBIPGPRSDataChannel::CancelAll()
hgs
parents:
diff changeset
   565
    {
hgs
parents:
diff changeset
   566
    LOG( SIMPLE, "SATENGINE: CSatBIPGPRSDataChannel::CancelAll calling" )
hgs
parents:
diff changeset
   567
hgs
parents:
diff changeset
   568
    // Cancel all activity in sockets
hgs
parents:
diff changeset
   569
    if ( iConnStage == ESatBIPConnected )
hgs
parents:
diff changeset
   570
        {
hgs
parents:
diff changeset
   571
        LOG( SIMPLE, "SATENGINE: CSatBIPGPRSDataChannel::CancelAll \
hgs
parents:
diff changeset
   572
        iConnStage == ESatBIPConnected" )
hgs
parents:
diff changeset
   573
        // Cancel sender
hgs
parents:
diff changeset
   574
        if ( iSender )
hgs
parents:
diff changeset
   575
            {
hgs
parents:
diff changeset
   576
            LOG( SIMPLE, "SATENGINE: CSatBIPGPRSDataChannel::CancelAll \
hgs
parents:
diff changeset
   577
            cancel iSender" )
hgs
parents:
diff changeset
   578
            iSender->Cancel();
hgs
parents:
diff changeset
   579
            }
hgs
parents:
diff changeset
   580
hgs
parents:
diff changeset
   581
        // Cancel receiver
hgs
parents:
diff changeset
   582
        if ( iReceiver )
hgs
parents:
diff changeset
   583
            {
hgs
parents:
diff changeset
   584
            LOG( SIMPLE, "SATENGINE: CSatBIPGPRSDataChannel::CancelAll \
hgs
parents:
diff changeset
   585
            cancel iReceiver" )
hgs
parents:
diff changeset
   586
            iReceiver->Cancel();
hgs
parents:
diff changeset
   587
            }
hgs
parents:
diff changeset
   588
hgs
parents:
diff changeset
   589
        // Cancel all actions
hgs
parents:
diff changeset
   590
        iSocket.CancelAll();
hgs
parents:
diff changeset
   591
        // Link dropped, when socket cancels all
hgs
parents:
diff changeset
   592
        iChannelStatus = MSatBIPUtils::ESatLinkDropped;
hgs
parents:
diff changeset
   593
        iConnStage = ESatBIPCancelled;
hgs
parents:
diff changeset
   594
        }
hgs
parents:
diff changeset
   595
    else if ( iConnStage == ESatBIPConnect )
hgs
parents:
diff changeset
   596
        {
hgs
parents:
diff changeset
   597
        LOG( NORMAL, "SATENGINE: CSatBIPGPRSDataChannel::CancelAll \
hgs
parents:
diff changeset
   598
            Cancelling connect" )
hgs
parents:
diff changeset
   599
        // Cancel connection negotiations
hgs
parents:
diff changeset
   600
        iSocket.CancelConnect();
hgs
parents:
diff changeset
   601
        iConnStage = ESatBIPCancelled;
hgs
parents:
diff changeset
   602
        }
hgs
parents:
diff changeset
   603
    else
hgs
parents:
diff changeset
   604
        {
hgs
parents:
diff changeset
   605
        LOG( NORMAL, "SATENGINE: CSatBIPGPRSDataChannel::CancelAll \
hgs
parents:
diff changeset
   606
            Channel already cancelled or closed" )
hgs
parents:
diff changeset
   607
        }
hgs
parents:
diff changeset
   608
hgs
parents:
diff changeset
   609
    LOG( SIMPLE, "SATENGINE: CSatBIPGPRSDataChannel::CancelAll exiting" )
hgs
parents:
diff changeset
   610
    }
hgs
parents:
diff changeset
   611
hgs
parents:
diff changeset
   612
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   613
// Returns the status of this data channel
hgs
parents:
diff changeset
   614
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   615
//
hgs
parents:
diff changeset
   616
TBool CSatBIPGPRSDataChannel::IsContextActive() const
hgs
parents:
diff changeset
   617
    {
hgs
parents:
diff changeset
   618
    LOG2( SIMPLE,
hgs
parents:
diff changeset
   619
    "SATENGINE: CSatBIPGPRSDataChannel::IsContextActive calling - exiting,\
hgs
parents:
diff changeset
   620
    return: %d", ESatBIPConnected == iConnStage )
hgs
parents:
diff changeset
   621
    return ESatBIPConnected == iConnStage;
hgs
parents:
diff changeset
   622
    }
hgs
parents:
diff changeset
   623
hgs
parents:
diff changeset
   624
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   625
// Returns the status of this data channel
hgs
parents:
diff changeset
   626
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   627
//
hgs
parents:
diff changeset
   628
const MSatBIPDataChannel::TSatBipConnectionInfo& CSatBIPGPRSDataChannel::ConnInfo() const
hgs
parents:
diff changeset
   629
    {
hgs
parents:
diff changeset
   630
    LOG( SIMPLE,
hgs
parents:
diff changeset
   631
        "SATENGINE: CSatBIPGPRSDataChannel::ConnInfo calling - exiting" )
hgs
parents:
diff changeset
   632
    return iConnInfo;
hgs
parents:
diff changeset
   633
    }
hgs
parents:
diff changeset
   634
hgs
parents:
diff changeset
   635
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   636
// CSatBIPGPRSDataChannel::StopUdpSocket
hgs
parents:
diff changeset
   637
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   638
//
hgs
parents:
diff changeset
   639
void CSatBIPGPRSDataChannel::StopUdpSocket()
hgs
parents:
diff changeset
   640
    {
hgs
parents:
diff changeset
   641
    LOG( SIMPLE, "SATENGINE: CSatBIPGPRSDataChannel::StopUdpSocket calling" )
hgs
parents:
diff changeset
   642
    
hgs
parents:
diff changeset
   643
    if ( !iUseTcpProtocol )
hgs
parents:
diff changeset
   644
    {
hgs
parents:
diff changeset
   645
    LOG( SIMPLE, "SATENGINE: CSatBIPGPRSDataChannel::StopUdpSocket UDP" )
hgs
parents:
diff changeset
   646
    iSocket.Close();
hgs
parents:
diff changeset
   647
    }
hgs
parents:
diff changeset
   648
        
hgs
parents:
diff changeset
   649
    LOG( SIMPLE, "SATENGINE: CSatBIPGPRSDataChannel::StopUdpSocket exiting" )
hgs
parents:
diff changeset
   650
    }
hgs
parents:
diff changeset
   651
hgs
parents:
diff changeset
   652
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   653
// From CActive
hgs
parents:
diff changeset
   654
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   655
//
hgs
parents:
diff changeset
   656
void CSatBIPGPRSDataChannel::RunL()
hgs
parents:
diff changeset
   657
    {
hgs
parents:
diff changeset
   658
    LOG( SIMPLE, "SATENGINE: CSatBIPGPRSDataChannel::RunL calling " )
hgs
parents:
diff changeset
   659
hgs
parents:
diff changeset
   660
    if ( KErrNone == iStatus.Int() )
hgs
parents:
diff changeset
   661
        {
hgs
parents:
diff changeset
   662
        LOG( SIMPLE, "SATENGINE: CSatBIPGPRSDataChannel::RunL \
hgs
parents:
diff changeset
   663
        KErrNone == iStatus.Int() " )
hgs
parents:
diff changeset
   664
        // Check connection stage
hgs
parents:
diff changeset
   665
        switch ( iConnStage )
hgs
parents:
diff changeset
   666
            {
hgs
parents:
diff changeset
   667
            case ESatBIPConnect:
hgs
parents:
diff changeset
   668
                {
hgs
parents:
diff changeset
   669
                LOG( SIMPLE, "SATENGINE: CSatBIPGPRSDataChannel::RunL \
hgs
parents:
diff changeset
   670
                    Connect OK" )
hgs
parents:
diff changeset
   671
                    
hgs
parents:
diff changeset
   672
                // Start receiving data
hgs
parents:
diff changeset
   673
                StartReceiveL();
hgs
parents:
diff changeset
   674
                iConnStage = ESatBIPConnected;
hgs
parents:
diff changeset
   675
                // Notify ConnectionObserver
hgs
parents:
diff changeset
   676
                iConnectionObserver->ConnectionNotification( KErrNone );
hgs
parents:
diff changeset
   677
                break;
hgs
parents:
diff changeset
   678
                }
hgs
parents:
diff changeset
   679
hgs
parents:
diff changeset
   680
            case ESatBIPCancelled:
hgs
parents:
diff changeset
   681
                {
hgs
parents:
diff changeset
   682
                LOG( SIMPLE, "SATENGINE: CSatBIPGPRSDataChannel::RunL \
hgs
parents:
diff changeset
   683
                    Connection Cancelled" )
hgs
parents:
diff changeset
   684
                // Notify ConnectionObserver
hgs
parents:
diff changeset
   685
                iConnectionObserver->ConnectionNotification( KErrCancel );
hgs
parents:
diff changeset
   686
                break;
hgs
parents:
diff changeset
   687
                }
hgs
parents:
diff changeset
   688
hgs
parents:
diff changeset
   689
            default:
hgs
parents:
diff changeset
   690
                {
hgs
parents:
diff changeset
   691
                LOG( SIMPLE, "SATENGINE: CSatBIPGPRSDataChannel::RunL default" )
hgs
parents:
diff changeset
   692
                PanicSatEngine( ESatBIPAccessViolation );
hgs
parents:
diff changeset
   693
                }
hgs
parents:
diff changeset
   694
            }
hgs
parents:
diff changeset
   695
        }
hgs
parents:
diff changeset
   696
    else
hgs
parents:
diff changeset
   697
        {
hgs
parents:
diff changeset
   698
        // Notify ConnectionObserver with error
hgs
parents:
diff changeset
   699
        iConnectionObserver->ConnectionNotification( iStatus.Int() );
hgs
parents:
diff changeset
   700
        }
hgs
parents:
diff changeset
   701
hgs
parents:
diff changeset
   702
    LOG( SIMPLE, "SATENGINE: CSatBIPGPRSDataChannel::RunL exiting " )
hgs
parents:
diff changeset
   703
    }
hgs
parents:
diff changeset
   704
hgs
parents:
diff changeset
   705
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   706
// DoCancel
hgs
parents:
diff changeset
   707
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   708
//
hgs
parents:
diff changeset
   709
void CSatBIPGPRSDataChannel::DoCancel()
hgs
parents:
diff changeset
   710
    {
hgs
parents:
diff changeset
   711
    LOG( SIMPLE, "SATENGINE: CSatBIPGPRSDataChannel::DoCancel calling" )
hgs
parents:
diff changeset
   712
hgs
parents:
diff changeset
   713
    CancelAll();
hgs
parents:
diff changeset
   714
hgs
parents:
diff changeset
   715
    LOG( SIMPLE, "SATENGINE: CSatBIPGPRSDataChannel::DoCancel calling" )
hgs
parents:
diff changeset
   716
    }
hgs
parents:
diff changeset
   717
hgs
parents:
diff changeset
   718
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   719
// RunError
hgs
parents:
diff changeset
   720
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   721
//
hgs
parents:
diff changeset
   722
TInt CSatBIPGPRSDataChannel::RunError( TInt aError )
hgs
parents:
diff changeset
   723
    {
hgs
parents:
diff changeset
   724
    LOG( SIMPLE, "SATENGINE: CSatBIPGPRSDataChannel::RunError calling" )
hgs
parents:
diff changeset
   725
hgs
parents:
diff changeset
   726
    if ( iConnectionObserver )
hgs
parents:
diff changeset
   727
        {
hgs
parents:
diff changeset
   728
        LOG( SIMPLE, "SATENGINE: CSatBIPGPRSDataChannel::RunError \
hgs
parents:
diff changeset
   729
        iConnectionObserver true" )
hgs
parents:
diff changeset
   730
        iConnectionObserver->ConnectionNotification( aError );
hgs
parents:
diff changeset
   731
        }
hgs
parents:
diff changeset
   732
hgs
parents:
diff changeset
   733
    LOG( SIMPLE, "SATENGINE: CSatBIPGPRSDataChannel::RunError calling" )
hgs
parents:
diff changeset
   734
    return KErrNone;
hgs
parents:
diff changeset
   735
    }
hgs
parents:
diff changeset
   736
hgs
parents:
diff changeset
   737
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   738
// Stores received data into buffer.
hgs
parents:
diff changeset
   739
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   740
//
hgs
parents:
diff changeset
   741
void CSatBIPGPRSDataChannel::DataReceivedNotificationL( const TDesC8& aData )
hgs
parents:
diff changeset
   742
    {
hgs
parents:
diff changeset
   743
    LOG( SIMPLE,
hgs
parents:
diff changeset
   744
        "SATENGINE: CSatBIPGPRSDataChannel::DataReceivedNotification calling" )
hgs
parents:
diff changeset
   745
hgs
parents:
diff changeset
   746
    // Check do we have to report data receive
hgs
parents:
diff changeset
   747
    const TInt bufsize( iRcvBuffer.Length() );
hgs
parents:
diff changeset
   748
#ifdef ENABLE_SAT_LOGGING
hgs
parents:
diff changeset
   749
    TBuf<KIpAddressLogSize> addressForLog;
hgs
parents:
diff changeset
   750
#endif
hgs
parents:
diff changeset
   751
    // LOG values
hgs
parents:
diff changeset
   752
    LOG2( NORMAL, "SATENGINE: CSatBIPGPRSDataChannel::RunL\
hgs
parents:
diff changeset
   753
        ReceiveStore length: %i", bufsize )
hgs
parents:
diff changeset
   754
hgs
parents:
diff changeset
   755
    // In UDP context, we can store only one datagram at a time. If there is
hgs
parents:
diff changeset
   756
    // previous datagram in store, we'll have to wait for the UICC to get all
hgs
parents:
diff changeset
   757
    // before storing the netx datagram and to start receive again. If there are
hgs
parents:
diff changeset
   758
    // more than one datagrams pending, they are stored in RSockets queue.
hgs
parents:
diff changeset
   759
    if ( bufsize == 0 || RSat::ETcp == iConnInfo.iProtocol.iTransportProto )
hgs
parents:
diff changeset
   760
        {
hgs
parents:
diff changeset
   761
#ifdef ENABLE_SAT_LOGGING
hgs
parents:
diff changeset
   762
        iSourceAddr.Output( addressForLog );
hgs
parents:
diff changeset
   763
        LOG2( NORMAL, "SATENGINE: CSatBIPGPRSDataChannel::RunL\
hgs
parents:
diff changeset
   764
            Received data length: %i", aData.Length() )
hgs
parents:
diff changeset
   765
        LOG2( NORMAL, "SATENGINE: CSatBIPGPRSDataChannel::RunL\
hgs
parents:
diff changeset
   766
            Received from address: %S", &addressForLog )
hgs
parents:
diff changeset
   767
        LOG2( NORMAL, "SATENGINE: CSatBIPGPRSDataChannel::RunL\
hgs
parents:
diff changeset
   768
            Received from port: %i", iSourceAddr.Port() )
hgs
parents:
diff changeset
   769
#endif
hgs
parents:
diff changeset
   770
        // Store data, if it fits into store, else, do not receive until store
hgs
parents:
diff changeset
   771
        // is empty.
hgs
parents:
diff changeset
   772
        if ( KSatBIPMinReceiveBufferSize >= ( aData.Length() + bufsize ) )
hgs
parents:
diff changeset
   773
            {
hgs
parents:
diff changeset
   774
            LOG( SIMPLE, "SATENGINE: CSatBIPGPRSDataChannel::\
hgs
parents:
diff changeset
   775
                 DataReceivedNotification store data" )
hgs
parents:
diff changeset
   776
            iRcvBuffer.Append( aData );
hgs
parents:
diff changeset
   777
hgs
parents:
diff changeset
   778
            // It is possible that aData is empty, because this function 
hgs
parents:
diff changeset
   779
            // is called
hgs
parents:
diff changeset
   780
            // every time when SIM gets the final bytes from ReceiveStore.
hgs
parents:
diff changeset
   781
            if ( 0 == bufsize && aData.Length() > 0 )
hgs
parents:
diff changeset
   782
                {
hgs
parents:
diff changeset
   783
                LOG( SIMPLE,
hgs
parents:
diff changeset
   784
                "SATENGINE: CSatBIPGPRSDataChannel::DataReceivedNotification \
hgs
parents:
diff changeset
   785
                aData.Length() > 0" )
hgs
parents:
diff changeset
   786
                // If the store is empty, send event download
hgs
parents:
diff changeset
   787
                iUtils.DataAvailable( ChannelId(), aData.Length() );
hgs
parents:
diff changeset
   788
                }
hgs
parents:
diff changeset
   789
hgs
parents:
diff changeset
   790
            // Start to receive again. This should never leave, because Receiver
hgs
parents:
diff changeset
   791
            // object is already created.
hgs
parents:
diff changeset
   792
            StartReceiveL();
hgs
parents:
diff changeset
   793
            }
hgs
parents:
diff changeset
   794
        }
hgs
parents:
diff changeset
   795
hgs
parents:
diff changeset
   796
    LOG( SIMPLE,
hgs
parents:
diff changeset
   797
        "SATENGINE: CSatBIPGPRSDataChannel::DataReceivedNotification exiting" )
hgs
parents:
diff changeset
   798
    }
hgs
parents:
diff changeset
   799
hgs
parents:
diff changeset
   800
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   801
// Error while receiving data
hgs
parents:
diff changeset
   802
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   803
//
hgs
parents:
diff changeset
   804
void CSatBIPGPRSDataChannel::DataReceiveError( TInt aError )
hgs
parents:
diff changeset
   805
    {
hgs
parents:
diff changeset
   806
    LOG( SIMPLE, "SATENGINE: CSatBIPGPRSDataChannel::DataReceiveError calling" )
hgs
parents:
diff changeset
   807
hgs
parents:
diff changeset
   808
    if ( KErrCancel != aError ) // Don't do anything if cancelled
hgs
parents:
diff changeset
   809
        {
hgs
parents:
diff changeset
   810
        LOG2( NORMAL, "SATENGINE: CSatBIPGPRSDataChannel::DataReceiveError\
hgs
parents:
diff changeset
   811
             Error: %i", aError )
hgs
parents:
diff changeset
   812
        // Report error
hgs
parents:
diff changeset
   813
        iConnStage = ESatBIPCancelled; 
hgs
parents:
diff changeset
   814
        iChannelStatus = MSatBIPUtils::ESatLinkDropped;
hgs
parents:
diff changeset
   815
        iUtils.ChannelStatus( ChannelId(), iChannelStatus );
hgs
parents:
diff changeset
   816
        }
hgs
parents:
diff changeset
   817
    else
hgs
parents:
diff changeset
   818
        {
hgs
parents:
diff changeset
   819
        // Cancelled
hgs
parents:
diff changeset
   820
        LOG( SIMPLE, "SATENGINE: CSatBIPGPRSDataChannel::DataReceiveError\
hgs
parents:
diff changeset
   821
            Receive has been cancelled cancelled" )
hgs
parents:
diff changeset
   822
        }
hgs
parents:
diff changeset
   823
hgs
parents:
diff changeset
   824
    LOG( SIMPLE, "SATENGINE: CSatBIPGPRSDataChannel::DataReceiveError exiting" )
hgs
parents:
diff changeset
   825
    }
hgs
parents:
diff changeset
   826
hgs
parents:
diff changeset
   827
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   828
// C++ default constructor can NOT contain any code, that
hgs
parents:
diff changeset
   829
// might leave.
hgs
parents:
diff changeset
   830
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   831
//
hgs
parents:
diff changeset
   832
CSatBIPGPRSDataChannel::CSatBIPGPRSDataChannel( CSatBIPUtils& aUtils,
hgs
parents:
diff changeset
   833
    RSocketServ& aSocketServer,
hgs
parents:
diff changeset
   834
    TSatChannelIdInfo& aChannelId,
hgs
parents:
diff changeset
   835
    RConnection& aConnection,
hgs
parents:
diff changeset
   836
    RSubConnection& aSubConnection) :
hgs
parents:
diff changeset
   837
    CActive( EPriorityStandard ),
hgs
parents:
diff changeset
   838
    iUtils( aUtils ),
hgs
parents:
diff changeset
   839
    iSocketServ( aSocketServer ),
hgs
parents:
diff changeset
   840
    iChannelId( aChannelId ),
hgs
parents:
diff changeset
   841
    iConnection( aConnection ),
hgs
parents:
diff changeset
   842
    iSubConnection( aSubConnection )
hgs
parents:
diff changeset
   843
    {
hgs
parents:
diff changeset
   844
    LOG( SIMPLE,
hgs
parents:
diff changeset
   845
        "SATENGINE: CSatBIPGPRSDataChannel::CSatBIPGPRSDataChannel calling" )
hgs
parents:
diff changeset
   846
hgs
parents:
diff changeset
   847
    CActiveScheduler::Add( this );
hgs
parents:
diff changeset
   848
hgs
parents:
diff changeset
   849
    LOG( SIMPLE,
hgs
parents:
diff changeset
   850
        "SATENGINE: CSatBIPGPRSDataChannel::CSatBIPGPRSDataChannel exiting" )
hgs
parents:
diff changeset
   851
    }
hgs
parents:
diff changeset
   852
hgs
parents:
diff changeset
   853
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   854
// Symbian 2nd phase constructor can leave.
hgs
parents:
diff changeset
   855
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   856
//
hgs
parents:
diff changeset
   857
void CSatBIPGPRSDataChannel::ConstructL()
hgs
parents:
diff changeset
   858
    {
hgs
parents:
diff changeset
   859
    LOG( SIMPLE, "SATENGINE: CSatBIPGPRSDataChannel::ConstructL calling" )
hgs
parents:
diff changeset
   860
hgs
parents:
diff changeset
   861
    iChannelStatus = MSatBIPUtils::ESatNoFurtherInformation;
hgs
parents:
diff changeset
   862
    
hgs
parents:
diff changeset
   863
    LOG( SIMPLE, "SATENGINE: CSatBIPGPRSDataChannel::ConstructL exiting" )
hgs
parents:
diff changeset
   864
    }
hgs
parents:
diff changeset
   865
hgs
parents:
diff changeset
   866
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   867
// Opens and connects / binds Socket
hgs
parents:
diff changeset
   868
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   869
//
hgs
parents:
diff changeset
   870
void CSatBIPGPRSDataChannel::OpenSocketL()
hgs
parents:
diff changeset
   871
    {
hgs
parents:
diff changeset
   872
    LOG( SIMPLE, "SATENGINE: CSatBIPGPRSDataChannel::OpenSocketL calling" )
hgs
parents:
diff changeset
   873
hgs
parents:
diff changeset
   874
    TInt errCode( KErrNone );
hgs
parents:
diff changeset
   875
hgs
parents:
diff changeset
   876
    // Define Destination address
hgs
parents:
diff changeset
   877
    // Create InetAddress to hold remote device information
hgs
parents:
diff changeset
   878
    LOG2( NORMAL, "SATENGINE: CSatBIPGPRSDataChannel::OpenSocketL\
hgs
parents:
diff changeset
   879
         Port from SIM: %d", iConnInfo.iProtocol.iPrtNumber )
hgs
parents:
diff changeset
   880
hgs
parents:
diff changeset
   881
    // Remote server's IP Address
hgs
parents:
diff changeset
   882
#ifdef SAT_USE_DUMMY_TSY
hgs
parents:
diff changeset
   883
    TBuf8<RSat::KPcktAddressMaxSize> destAddr( RSat::KPcktAddressMaxSize );
hgs
parents:
diff changeset
   884
    
hgs
parents:
diff changeset
   885
    // KAfInet or KAfInet6
hgs
parents:
diff changeset
   886
    if ( RSat::EIPv6Address == iConnInfo.iDestination.iType )
hgs
parents:
diff changeset
   887
        {
hgs
parents:
diff changeset
   888
        LOG( SIMPLE, "SATENGINE: CSatBIPGPRSDataChannel::OpenSocketL IPv6" )
hgs
parents:
diff changeset
   889
        // 0:0:0:0:0:0:0:2 is equivalent to 127, 0, 0, 2
hgs
parents:
diff changeset
   890
        for ( TInt ndx = 0 ; ndx < KIpAddressSize ; ndx++ )
hgs
parents:
diff changeset
   891
            {
hgs
parents:
diff changeset
   892
            destAddr[ndx] = 0;
hgs
parents:
diff changeset
   893
            }
hgs
parents:
diff changeset
   894
        destAddr[KIpAddressSize] = KIpAddressDValueDestination;
hgs
parents:
diff changeset
   895
        destAddr.SetLength( KIpv6Length );
hgs
parents:
diff changeset
   896
        }
hgs
parents:
diff changeset
   897
    else //ipv4
hgs
parents:
diff changeset
   898
        {
hgs
parents:
diff changeset
   899
        LOG( SIMPLE, "SATENGINE: CSatBIPGPRSDataChannel::OpenSocketL IPv4" )
hgs
parents:
diff changeset
   900
        destAddr[KIpAddressA] = KIpAddressAValue;
hgs
parents:
diff changeset
   901
        destAddr[KIpAddressB] = KIpAddressBValue;
hgs
parents:
diff changeset
   902
        destAddr[KIpAddressC] = KIpAddressCValue;
hgs
parents:
diff changeset
   903
        destAddr[KIpAddressD] = KIpAddressDValueDestination;
hgs
parents:
diff changeset
   904
        destAddr.SetLength( KIpv4Length );
hgs
parents:
diff changeset
   905
        }
hgs
parents:
diff changeset
   906
    iDestAddr = DestAddress( destAddr );
hgs
parents:
diff changeset
   907
#else
hgs
parents:
diff changeset
   908
    iDestAddr = DestAddress( iConnInfo.iDestination.iAddress );
hgs
parents:
diff changeset
   909
#endif // SAT_USE_DUMMY_TSY
hgs
parents:
diff changeset
   910
    
hgs
parents:
diff changeset
   911
    LOG( NORMAL, "SATENGINE: CSatBIPGPRSDataChannel::OpenSocketL\
hgs
parents:
diff changeset
   912
         Complete defining destination address" )
hgs
parents:
diff changeset
   913
    
hgs
parents:
diff changeset
   914
    iSourceAddr = iDestAddr;
hgs
parents:
diff changeset
   915
    
hgs
parents:
diff changeset
   916
    TUint socketType( KSockStream );
hgs
parents:
diff changeset
   917
    TUint protocol( KProtocolInetTcp );
hgs
parents:
diff changeset
   918
    
hgs
parents:
diff changeset
   919
    // Check is it UDP or TCP
hgs
parents:
diff changeset
   920
    if ( !iUseTcpProtocol )
hgs
parents:
diff changeset
   921
        {
hgs
parents:
diff changeset
   922
        LOG( NORMAL, "SATENGINE: CSatBIPGPRSDataChannel::OpenSocketL\
hgs
parents:
diff changeset
   923
            Opening UDP datagram socket" )
hgs
parents:
diff changeset
   924
        socketType = KSockDatagram;
hgs
parents:
diff changeset
   925
        protocol = KProtocolInetUdp;
hgs
parents:
diff changeset
   926
        }
hgs
parents:
diff changeset
   927
    else
hgs
parents:
diff changeset
   928
        {
hgs
parents:
diff changeset
   929
        LOG( NORMAL, "SATENGINE: CSatBIPGPRSDataChannel::OpenSocketL\
hgs
parents:
diff changeset
   930
            Opening TCP stream socket" )
hgs
parents:
diff changeset
   931
        }
hgs
parents:
diff changeset
   932
        
hgs
parents:
diff changeset
   933
    // Open socket
hgs
parents:
diff changeset
   934
    if ( iUtils.IsSubConnectionActivated() )
hgs
parents:
diff changeset
   935
        {
hgs
parents:
diff changeset
   936
        LOG( NORMAL, "SATENGINE: CSatBIPGPRSDataChannel::OpenSocketL\
hgs
parents:
diff changeset
   937
        using subconnection" )
hgs
parents:
diff changeset
   938
        errCode = iSocket.Open( iSocketServ, KAfInet, socketType,
hgs
parents:
diff changeset
   939
            protocol, iSubConnection );
hgs
parents:
diff changeset
   940
        }
hgs
parents:
diff changeset
   941
    else
hgs
parents:
diff changeset
   942
        {
hgs
parents:
diff changeset
   943
        LOG( NORMAL, "SATENGINE: CSatBIPGPRSDataChannel::OpenSocketL\
hgs
parents:
diff changeset
   944
        using connection" )
hgs
parents:
diff changeset
   945
        errCode = iSocket.Open( iSocketServ, KAfInet, socketType,
hgs
parents:
diff changeset
   946
            protocol, iConnection );
hgs
parents:
diff changeset
   947
        }
hgs
parents:
diff changeset
   948
        
hgs
parents:
diff changeset
   949
    // Check socket activation
hgs
parents:
diff changeset
   950
    LOG2( NORMAL, "SATENGINE: CSatBIPGPRSDataChannel::OpenSocketL\
hgs
parents:
diff changeset
   951
        Socket opened with code: %i", errCode )
hgs
parents:
diff changeset
   952
    User::LeaveIfError( errCode );
hgs
parents:
diff changeset
   953
    
hgs
parents:
diff changeset
   954
    // Define local address. Local port is obtained automatically
hgs
parents:
diff changeset
   955
    TInetAddr localAddress( KInetPortAny );
hgs
parents:
diff changeset
   956
    
hgs
parents:
diff changeset
   957
#ifdef SAT_USE_DUMMY_TSY
hgs
parents:
diff changeset
   958
        // win2000 doesn't support IPv6, so force to IPv4
hgs
parents:
diff changeset
   959
        localAddress.SetFamily( KAfInet );
hgs
parents:
diff changeset
   960
        // KAfInet or KAfInet6
hgs
parents:
diff changeset
   961
        if ( RSat::EIPv6Address == iConnInfo.iDestination.iType )
hgs
parents:
diff changeset
   962
            {
hgs
parents:
diff changeset
   963
            LOG( NORMAL, "SATENGINE: CSatBIPGPRSDataChannel::OpenSocketL\
hgs
parents:
diff changeset
   964
                IPv6" )
hgs
parents:
diff changeset
   965
            // 0:0:0:0:0:0:0:3 is equivalent to 127, 0, 0, 3
hgs
parents:
diff changeset
   966
            TIp6Addr ip6Adrr;
hgs
parents:
diff changeset
   967
            
hgs
parents:
diff changeset
   968
            for ( TInt index = 0 ; index < KIpAddressSize ; index++ )
hgs
parents:
diff changeset
   969
                {
hgs
parents:
diff changeset
   970
                ip6Adrr.u.iAddr8[index] = 0;
hgs
parents:
diff changeset
   971
                }
hgs
parents:
diff changeset
   972
                
hgs
parents:
diff changeset
   973
            ip6Adrr.u.iAddr8[KIpAddressSize] = KIpAddressDValueLocal;
hgs
parents:
diff changeset
   974
            localAddress.SetAddress( ip6Adrr );
hgs
parents:
diff changeset
   975
            }
hgs
parents:
diff changeset
   976
        else //ipv4
hgs
parents:
diff changeset
   977
            {
hgs
parents:
diff changeset
   978
            LOG( NORMAL, "SATENGINE: CSatBIPGPRSDataChannel::OpenSocketL\
hgs
parents:
diff changeset
   979
                IPv4" )
hgs
parents:
diff changeset
   980
            localAddress.SetAddress( INET_ADDR(
hgs
parents:
diff changeset
   981
                KIpAddressAValue,
hgs
parents:
diff changeset
   982
                KIpAddressBValue,
hgs
parents:
diff changeset
   983
                KIpAddressCValue,
hgs
parents:
diff changeset
   984
                KIpAddressDValueLocal ) );
hgs
parents:
diff changeset
   985
            }
hgs
parents:
diff changeset
   986
#else
hgs
parents:
diff changeset
   987
    // Check does the SIM provide a local address
hgs
parents:
diff changeset
   988
    if ( 0 < iConnInfo.iSource.iAddress.Length() )
hgs
parents:
diff changeset
   989
        {
hgs
parents:
diff changeset
   990
        LOG( NORMAL, "SATENGINE: CSatBIPGPRSDataChannel::OpenSocketL\
hgs
parents:
diff changeset
   991
            Setting pre-defined local address" )
hgs
parents:
diff changeset
   992
        localAddress = DestAddress( iConnInfo.iSource.iAddress );
hgs
parents:
diff changeset
   993
        localAddress.SetPort( KInetPortAny );
hgs
parents:
diff changeset
   994
        }
hgs
parents:
diff changeset
   995
    else
hgs
parents:
diff changeset
   996
        {
hgs
parents:
diff changeset
   997
        LOG( NORMAL, "SATENGINE: CSatBIPGPRSDataChannel::OpenSocketL\
hgs
parents:
diff changeset
   998
            Setting automatic local address" )
hgs
parents:
diff changeset
   999
        // Unspecified. Local address is obtained automatically.
hgs
parents:
diff changeset
  1000
        localAddress.SetFamily( KAFUnspec );
hgs
parents:
diff changeset
  1001
        }
hgs
parents:
diff changeset
  1002
#endif       
hgs
parents:
diff changeset
  1003
    LOG( NORMAL, "SATENGINE: CSatBIPGPRSDataChannel::OpenSocketL\
hgs
parents:
diff changeset
  1004
        Bind local address" )
hgs
parents:
diff changeset
  1005
    errCode = iSocket.Bind( localAddress );  
hgs
parents:
diff changeset
  1006
        
hgs
parents:
diff changeset
  1007
    // Check what was the response from "Bind"
hgs
parents:
diff changeset
  1008
    if ( KErrNone == errCode )
hgs
parents:
diff changeset
  1009
        {
hgs
parents:
diff changeset
  1010
        // Set status to indicate that connection attempt ongoing
hgs
parents:
diff changeset
  1011
        iConnStage = ESatBIPConnect;
hgs
parents:
diff changeset
  1012
        
hgs
parents:
diff changeset
  1013
        if ( iUseTcpProtocol )
hgs
parents:
diff changeset
  1014
            {
hgs
parents:
diff changeset
  1015
            // Connect the socket
hgs
parents:
diff changeset
  1016
            iSocket.Connect( iDestAddr, iStatus );
hgs
parents:
diff changeset
  1017
            SetActive();
hgs
parents:
diff changeset
  1018
            }
hgs
parents:
diff changeset
  1019
        else
hgs
parents:
diff changeset
  1020
            {
hgs
parents:
diff changeset
  1021
            // This option redefines the receive buffer size
hgs
parents:
diff changeset
  1022
            iSocket.SetOpt( KSoUdpRecvBuf, KSolInetUdp, 
hgs
parents:
diff changeset
  1023
                KSatBIPMinReceiveBufferSize );
hgs
parents:
diff changeset
  1024
            // Connect the socket
hgs
parents:
diff changeset
  1025
            iSocket.Connect( iDestAddr, iStatus );
hgs
parents:
diff changeset
  1026
            // UDP sockets dont need active object
hgs
parents:
diff changeset
  1027
            User::WaitForRequest( iStatus );
hgs
parents:
diff changeset
  1028
            LOG2( NORMAL, "SATENGINE: CSatBIPGPRSDataChannel::OpenSocketL\
hgs
parents:
diff changeset
  1029
                UDP Socket connect status  %i", iStatus.Int() )
hgs
parents:
diff changeset
  1030
            }
hgs
parents:
diff changeset
  1031
        }
hgs
parents:
diff changeset
  1032
    else
hgs
parents:
diff changeset
  1033
        {
hgs
parents:
diff changeset
  1034
        // Send Terminal Response indicating that static address allocation
hgs
parents:
diff changeset
  1035
        // could not be done (KErrNotFound) or Bind failed for some other 
hgs
parents:
diff changeset
  1036
        // reason
hgs
parents:
diff changeset
  1037
        LOG2( NORMAL, "SATENGINE: CSatBIPGPRSDataChannel::OpenSocketL\
hgs
parents:
diff changeset
  1038
            Bind error:  %i", errCode )
hgs
parents:
diff changeset
  1039
        iConnectionObserver->ConnectionNotification( errCode );
hgs
parents:
diff changeset
  1040
        }
hgs
parents:
diff changeset
  1041
hgs
parents:
diff changeset
  1042
    LOG( SIMPLE, "SATENGINE: CSatBIPGPRSDataChannel::OpenSocketL exiting" )
hgs
parents:
diff changeset
  1043
    }
hgs
parents:
diff changeset
  1044
hgs
parents:
diff changeset
  1045
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
  1046
// Opens SubConnection and attaches socket into it
hgs
parents:
diff changeset
  1047
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
  1048
//
hgs
parents:
diff changeset
  1049
void CSatBIPGPRSDataChannel::OpenSubConnection()
hgs
parents:
diff changeset
  1050
    {
hgs
parents:
diff changeset
  1051
    LOG( SIMPLE,
hgs
parents:
diff changeset
  1052
        "SATENGINE: CSatBIPGPRSDataChannel::OpenSubConnection calling" )
hgs
parents:
diff changeset
  1053
    
hgs
parents:
diff changeset
  1054
    TInt errCode( KErrNone );
hgs
parents:
diff changeset
  1055
    
hgs
parents:
diff changeset
  1056
    // Create SubConnection. This is mandatory for multiple PDP Context support
hgs
parents:
diff changeset
  1057
    LOG( NORMAL, "SATENGINE: CSatBIPGPRSDataChannel::OpenSubConnection\
hgs
parents:
diff changeset
  1058
        Opening Sub-connection" )
hgs
parents:
diff changeset
  1059
    
hgs
parents:
diff changeset
  1060
    errCode = iSubConnection.Open( iSocketServ, RSubConnection::ECreateNew, 
hgs
parents:
diff changeset
  1061
                                   iConnection );
hgs
parents:
diff changeset
  1062
    
hgs
parents:
diff changeset
  1063
    LOG2( NORMAL, "SATENGINE: CSatBIPGPRSDataChannel::OpenSubConnection\
hgs
parents:
diff changeset
  1064
        RSubConnection opened with code: %i", errCode )
hgs
parents:
diff changeset
  1065
    
hgs
parents:
diff changeset
  1066
    if ( KErrNone != errCode )
hgs
parents:
diff changeset
  1067
        {
hgs
parents:
diff changeset
  1068
        // No subconnections, Affects on sockets
hgs
parents:
diff changeset
  1069
        LOG( NORMAL, "SATENGINE: CSatBIPGPRSDataChannel::OpenSubConnection\
hgs
parents:
diff changeset
  1070
                RSubConnection is opened incorrectly" )
hgs
parents:
diff changeset
  1071
        iSubConnection.Close();
hgs
parents:
diff changeset
  1072
        iUtils.SetSubConnectionActivated( EFalse );
hgs
parents:
diff changeset
  1073
        }
hgs
parents:
diff changeset
  1074
    else 
hgs
parents:
diff changeset
  1075
        {
hgs
parents:
diff changeset
  1076
        LOG( NORMAL, "SATENGINE: CSatBIPGPRSDataChannel::OpenSubConnection\
hgs
parents:
diff changeset
  1077
                RSubConnection is opened correctly" )
hgs
parents:
diff changeset
  1078
        iUtils.SetSubConnectionActivated( ETrue );
hgs
parents:
diff changeset
  1079
        }
hgs
parents:
diff changeset
  1080
        
hgs
parents:
diff changeset
  1081
    LOG( SIMPLE,
hgs
parents:
diff changeset
  1082
        "SATENGINE: CSatBIPGPRSDataChannel::OpenSubConnection exiting" )
hgs
parents:
diff changeset
  1083
    }
hgs
parents:
diff changeset
  1084
hgs
parents:
diff changeset
  1085
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
  1086
// Sets QoS parameters to active SubConnection
hgs
parents:
diff changeset
  1087
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
  1088
//
hgs
parents:
diff changeset
  1089
void CSatBIPGPRSDataChannel::SetSubConQoSParamsL()
hgs
parents:
diff changeset
  1090
    {
hgs
parents:
diff changeset
  1091
    LOG( SIMPLE,
hgs
parents:
diff changeset
  1092
        "SATENGINE: CSatBIPGPRSDataChannel::SetSubConQoSParamsL calling" )
hgs
parents:
diff changeset
  1093
    
hgs
parents:
diff changeset
  1094
    const TInt paramLength( iConnInfo.iBearerParams.Length() );
hgs
parents:
diff changeset
  1095
    TInt errCode( KErrNone );
hgs
parents:
diff changeset
  1096
hgs
parents:
diff changeset
  1097
    LOG2( NORMAL, "  QoS Parameters length: %i", paramLength )
hgs
parents:
diff changeset
  1098
hgs
parents:
diff changeset
  1099
    // GPRS requires 6 parameters from SIM
hgs
parents:
diff changeset
  1100
    if ( KReqGprsQoSParams == paramLength )
hgs
parents:
diff changeset
  1101
        {
hgs
parents:
diff changeset
  1102
        // Check that is packet protocol valid, ie. IP protocol
hgs
parents:
diff changeset
  1103
        if ( KReqPacketProtType != iConnInfo.iBearerParams[KProtocolPos] )
hgs
parents:
diff changeset
  1104
            {
hgs
parents:
diff changeset
  1105
            LOG( NORMAL, 
hgs
parents:
diff changeset
  1106
                "SATENGINE: CSatBIPGPRSDataChannel::SetSubConQoSParamsL\
hgs
parents:
diff changeset
  1107
                Requested packet protocol is not valid" )
hgs
parents:
diff changeset
  1108
            User::Leave( KErrNotSupported );
hgs
parents:
diff changeset
  1109
            }
hgs
parents:
diff changeset
  1110
        }
hgs
parents:
diff changeset
  1111
    else
hgs
parents:
diff changeset
  1112
        {
hgs
parents:
diff changeset
  1113
        LOG( NORMAL, 
hgs
parents:
diff changeset
  1114
            "SATENGINE: CSatBIPGPRSDataChannel::SetSubConQoSParamsL\
hgs
parents:
diff changeset
  1115
            Requested packet protocol is valid, not support" )
hgs
parents:
diff changeset
  1116
        User::Leave( KErrNotSupported );
hgs
parents:
diff changeset
  1117
        }
hgs
parents:
diff changeset
  1118
hgs
parents:
diff changeset
  1119
    // Creating and setting properties for a sub-connection
hgs
parents:
diff changeset
  1120
    // Create a parameter bundle and add to the cleanup stack
hgs
parents:
diff changeset
  1121
    RSubConParameterBundle parameterBundle;
hgs
parents:
diff changeset
  1122
    CleanupClosePushL( parameterBundle );
hgs
parents:
diff changeset
  1123
        
hgs
parents:
diff changeset
  1124
    // Create a family owned by parameterBundle
hgs
parents:
diff changeset
  1125
    CSubConParameterFamily* parameterFamily = 
hgs
parents:
diff changeset
  1126
        CSubConParameterFamily::NewL( parameterBundle, KSubConQoSFamily );
hgs
parents:
diff changeset
  1127
    
hgs
parents:
diff changeset
  1128
    // Create extension paramset(Rel5) owned by parameterFamily
hgs
parents:
diff changeset
  1129
    CSubConQosR5ParamSet* requestedQoSRel5 = 
hgs
parents:
diff changeset
  1130
        CSubConQosR5ParamSet::NewL( *parameterFamily, 
hgs
parents:
diff changeset
  1131
                                    CSubConParameterFamily::ERequested );
hgs
parents:
diff changeset
  1132
    
hgs
parents:
diff changeset
  1133
    if( requestedQoSRel5 )
hgs
parents:
diff changeset
  1134
        {
hgs
parents:
diff changeset
  1135
        RPacketQoS::TQoSGPRSRequested reqQoS;
hgs
parents:
diff changeset
  1136
        TSatQoSParser::GetRequestedQoSValues( iConnInfo.iBearerParams, 
hgs
parents:
diff changeset
  1137
            reqQoS );
hgs
parents:
diff changeset
  1138
        TSatQoSParser::TQoSRel5 qosRel5 = TSatQoSParser::ConvertQoS( reqQoS );
hgs
parents:
diff changeset
  1139
        // Set some requested QoS values
hgs
parents:
diff changeset
  1140
        requestedQoSRel5->SetTrafficClass( 
hgs
parents:
diff changeset
  1141
            static_cast<RPacketQoS::TTrafficClass>( qosRel5.iTrafficClass ) );
hgs
parents:
diff changeset
  1142
        requestedQoSRel5->SetTrafficHandlingPriority( 
hgs
parents:
diff changeset
  1143
            static_cast<RPacketQoS::TTrafficHandlingPriority>( 
hgs
parents:
diff changeset
  1144
                qosRel5.iTrafficHandlingPriority ) );
hgs
parents:
diff changeset
  1145
        requestedQoSRel5->SetSDUErrorRatio( 
hgs
parents:
diff changeset
  1146
            static_cast<RPacketQoS::TSDUErrorRatio>( qosRel5.iSduErrorRatio ) );
hgs
parents:
diff changeset
  1147
        requestedQoSRel5->SetResidualBitErrorRatio( 
hgs
parents:
diff changeset
  1148
            static_cast<RPacketQoS::TBitErrorRatio>( qosRel5.iResidualBer ) );
hgs
parents:
diff changeset
  1149
        requestedQoSRel5->SetErroneousSDUDelivery( 
hgs
parents:
diff changeset
  1150
            static_cast<RPacketQoS::TErroneousSDUDelivery>( 
hgs
parents:
diff changeset
  1151
                qosRel5.iDeliveryErroneousSdu ) );
hgs
parents:
diff changeset
  1152
        requestedQoSRel5->SetMaxBitrateUplink( qosRel5.iMaxBitRate );
hgs
parents:
diff changeset
  1153
        requestedQoSRel5->SetMaxBitrateDownlink( qosRel5.iMaxBitRate );
hgs
parents:
diff changeset
  1154
        requestedQoSRel5->SetMaxSduSize( qosRel5.iMaximumSDUSize );
hgs
parents:
diff changeset
  1155
        requestedQoSRel5->SetDeliveryOrder( 
hgs
parents:
diff changeset
  1156
            static_cast<RPacketQoS::TDeliveryOrder>( qosRel5.iDeliveryOrder ) );
hgs
parents:
diff changeset
  1157
        LOG( SIMPLE, 
hgs
parents:
diff changeset
  1158
            "SATENGINE: CSatBIPGPRSDataChannel::SetSubConQoSParamsL\
hgs
parents:
diff changeset
  1159
            Setting requested QoS values for subconn" )
hgs
parents:
diff changeset
  1160
        
hgs
parents:
diff changeset
  1161
        // Start observing granted event.
hgs
parents:
diff changeset
  1162
        if( !iSubConnEventObserver )
hgs
parents:
diff changeset
  1163
            {
hgs
parents:
diff changeset
  1164
            LOG( SIMPLE, 
hgs
parents:
diff changeset
  1165
            "SATENGINE: CSatBIPGPRSDataChannel::SetSubConQoSParamsL\
hgs
parents:
diff changeset
  1166
            iSubConnEventObserver false" )
hgs
parents:
diff changeset
  1167
            iSubConnEventObserver = 
hgs
parents:
diff changeset
  1168
                new ( ELeave ) CSatBIPSubConnEventObserver( *this );
hgs
parents:
diff changeset
  1169
            }
hgs
parents:
diff changeset
  1170
        iSubConnEventObserver->StartObservSubConnEvent();
hgs
parents:
diff changeset
  1171
        
hgs
parents:
diff changeset
  1172
        // Set parameters
hgs
parents:
diff changeset
  1173
        errCode = iSubConnection.SetParameters( parameterBundle );
hgs
parents:
diff changeset
  1174
        LOG2( NORMAL, 
hgs
parents:
diff changeset
  1175
            "SATENGINE: CSatBIPGPRSDataChannel::SetSubConQoSParamsL\
hgs
parents:
diff changeset
  1176
	        calling iSubConnection.SetParameters (parameterBundle) = %d", 
hgs
parents:
diff changeset
  1177
	        errCode )
hgs
parents:
diff changeset
  1178
        }
hgs
parents:
diff changeset
  1179
    else
hgs
parents:
diff changeset
  1180
        {
hgs
parents:
diff changeset
  1181
        LOG( SIMPLE,
hgs
parents:
diff changeset
  1182
            "SATENGINE: CSatBIPGPRSDataChannel::SetSubConQoSParamsL\
hgs
parents:
diff changeset
  1183
            Can't create CSubConQosR5ParamSet" )
hgs
parents:
diff changeset
  1184
        errCode = KErrNotSupported;
hgs
parents:
diff changeset
  1185
        }
hgs
parents:
diff changeset
  1186
    
hgs
parents:
diff changeset
  1187
    // Pop and close parameterBundle
hgs
parents:
diff changeset
  1188
    CleanupStack::PopAndDestroy();
hgs
parents:
diff changeset
  1189
    
hgs
parents:
diff changeset
  1190
    User::LeaveIfError( errCode );
hgs
parents:
diff changeset
  1191
        
hgs
parents:
diff changeset
  1192
    LOG( SIMPLE,
hgs
parents:
diff changeset
  1193
        "SATENGINE: CSatBIPGPRSDataChannel::SetSubConQoSParamsL exiting" )
hgs
parents:
diff changeset
  1194
    }
hgs
parents:
diff changeset
  1195
hgs
parents:
diff changeset
  1196
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
  1197
// Starts to receive data from Socket
hgs
parents:
diff changeset
  1198
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
  1199
//
hgs
parents:
diff changeset
  1200
void CSatBIPGPRSDataChannel::StartReceiveL()
hgs
parents:
diff changeset
  1201
    {
hgs
parents:
diff changeset
  1202
    LOG( SIMPLE, "SATENGINE: CSatBIPGPRSDataChannel::StartReceiveL calling" )
hgs
parents:
diff changeset
  1203
hgs
parents:
diff changeset
  1204
    // If receiver is NULL, create it
hgs
parents:
diff changeset
  1205
    if ( NULL == iReceiver )
hgs
parents:
diff changeset
  1206
        {
hgs
parents:
diff changeset
  1207
        LOG( SIMPLE, "SATENGINE: CSatBIPGPRSDataChannel::StartReceiveL \
hgs
parents:
diff changeset
  1208
        create iReceiver" )
hgs
parents:
diff changeset
  1209
        iReceiver = new ( ELeave ) CSatBIPDataReceiver(
hgs
parents:
diff changeset
  1210
            *this, iSocket, iUseTcpProtocol );
hgs
parents:
diff changeset
  1211
        }
hgs
parents:
diff changeset
  1212
hgs
parents:
diff changeset
  1213
    // Tell receiver to start receive
hgs
parents:
diff changeset
  1214
    iReceiver->StartReceive( iSourceAddr );
hgs
parents:
diff changeset
  1215
hgs
parents:
diff changeset
  1216
    LOG( SIMPLE, "SATENGINE: CSatBIPGPRSDataChannel::StartReceiveL exiting" )
hgs
parents:
diff changeset
  1217
    }
hgs
parents:
diff changeset
  1218
hgs
parents:
diff changeset
  1219
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
  1220
// Defines address
hgs
parents:
diff changeset
  1221
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
  1222
//
hgs
parents:
diff changeset
  1223
TInetAddr CSatBIPGPRSDataChannel::DestAddress( const TPtrC8& aAddr )
hgs
parents:
diff changeset
  1224
    {
hgs
parents:
diff changeset
  1225
    LOG( SIMPLE, "SATENGINE: CSatBIPGPRSDataChannel::DestAddress calling" )
hgs
parents:
diff changeset
  1226
hgs
parents:
diff changeset
  1227
    TInetAddr destinationAddress;
hgs
parents:
diff changeset
  1228
hgs
parents:
diff changeset
  1229
    const TInt addLength( aAddr.Length() );
hgs
parents:
diff changeset
  1230
    LOG2( NORMAL, "  Address length is %i", addLength )
hgs
parents:
diff changeset
  1231
hgs
parents:
diff changeset
  1232
#ifdef ENABLE_SAT_LOGGING
hgs
parents:
diff changeset
  1233
    TBuf<KIpAddressLogSize> addressForLog;
hgs
parents:
diff changeset
  1234
#endif
hgs
parents:
diff changeset
  1235
    // Check IPv4 address
hgs
parents:
diff changeset
  1236
    if ( KIPv4Length == addLength )
hgs
parents:
diff changeset
  1237
        {
hgs
parents:
diff changeset
  1238
        TInt index = 0;
hgs
parents:
diff changeset
  1239
        TUint8 first( aAddr[index++] );
hgs
parents:
diff changeset
  1240
        TUint8 second( aAddr[index++] );
hgs
parents:
diff changeset
  1241
        TUint8 third( aAddr[index++] );
hgs
parents:
diff changeset
  1242
        TUint8 fourth( aAddr[index++] );
hgs
parents:
diff changeset
  1243
hgs
parents:
diff changeset
  1244
        // This macro creates IPAddress into TUint32 format.
hgs
parents:
diff changeset
  1245
        //lint -e{1924} Problem inside epoc macro, nothing to do.
hgs
parents:
diff changeset
  1246
        destinationAddress = TInetAddr( INET_ADDR( first, second, third, fourth ),
hgs
parents:
diff changeset
  1247
            iConnInfo.iProtocol.iPrtNumber );
hgs
parents:
diff changeset
  1248
        destinationAddress.SetFamily( KAfInet );
hgs
parents:
diff changeset
  1249
#ifdef ENABLE_SAT_LOGGING
hgs
parents:
diff changeset
  1250
        destinationAddress.Output( addressForLog );
hgs
parents:
diff changeset
  1251
        LOG2( NORMAL, "  Using IPv4, Address is %S", &addressForLog )
hgs
parents:
diff changeset
  1252
#endif
hgs
parents:
diff changeset
  1253
        }
hgs
parents:
diff changeset
  1254
    // Check IPv6 address
hgs
parents:
diff changeset
  1255
    else if ( KIPv6Length == addLength )
hgs
parents:
diff changeset
  1256
        {
hgs
parents:
diff changeset
  1257
        TIp6Addr ip6Adrr;
hgs
parents:
diff changeset
  1258
        for ( TInt index = 0 ; index < addLength ; index++ )
hgs
parents:
diff changeset
  1259
            {
hgs
parents:
diff changeset
  1260
            ip6Adrr.u.iAddr8[index] = aAddr[index];
hgs
parents:
diff changeset
  1261
            }
hgs
parents:
diff changeset
  1262
hgs
parents:
diff changeset
  1263
        destinationAddress = TInetAddr( ip6Adrr, iConnInfo.iProtocol.iPrtNumber );
hgs
parents:
diff changeset
  1264
        destinationAddress.SetFamily( KAfInet6 );
hgs
parents:
diff changeset
  1265
#ifdef ENABLE_SAT_LOGGING
hgs
parents:
diff changeset
  1266
        destinationAddress.Output( addressForLog );
hgs
parents:
diff changeset
  1267
        LOG2( NORMAL, "  Using IPv6, Address is %S", &addressForLog )
hgs
parents:
diff changeset
  1268
#endif
hgs
parents:
diff changeset
  1269
#ifdef SAT_USE_DUMMY_TSY
hgs
parents:
diff changeset
  1270
        // Using Dummy TSY, overwriting IPv6 address to IPv4 since
hgs
parents:
diff changeset
  1271
        // Windows 2000 doesn't support IPv6
hgs
parents:
diff changeset
  1272
        destinationAddress.ConvertToV4();
hgs
parents:
diff changeset
  1273
        destinationAddress.SetFamily( KAfInet );
hgs
parents:
diff changeset
  1274
#ifdef ENABLE_SAT_LOGGING
hgs
parents:
diff changeset
  1275
        destinationAddress.Output( addressForLog );
hgs
parents:
diff changeset
  1276
        LOG2( NORMAL, "  Converted IPv6 address to IPv4,\
hgs
parents:
diff changeset
  1277
             Address is %S", &addressForLog )
hgs
parents:
diff changeset
  1278
#endif
hgs
parents:
diff changeset
  1279
        destinationAddress.SetAddress( INET_ADDR(
hgs
parents:
diff changeset
  1280
            KIpAddressAValue,
hgs
parents:
diff changeset
  1281
            KIpAddressBValue,
hgs
parents:
diff changeset
  1282
            KIpAddressCValue,
hgs
parents:
diff changeset
  1283
            KIpAddressDValueDestination ) );
hgs
parents:
diff changeset
  1284
#ifdef ENABLE_SAT_LOGGING
hgs
parents:
diff changeset
  1285
        destinationAddress.Output( addressForLog );
hgs
parents:
diff changeset
  1286
        LOG2( NORMAL, "  Overwrited IPv4 localhost,\
hgs
parents:
diff changeset
  1287
             Address is %S", &addressForLog )
hgs
parents:
diff changeset
  1288
#endif
hgs
parents:
diff changeset
  1289
#endif //SAT_USE_DUMMY_TSY
hgs
parents:
diff changeset
  1290
        }
hgs
parents:
diff changeset
  1291
    else // Invalid IP address length
hgs
parents:
diff changeset
  1292
        {
hgs
parents:
diff changeset
  1293
        LOG( SIMPLE, "SATENGINE: CSatBIPGPRSDataChannel::DestAddress \
hgs
parents:
diff changeset
  1294
        invalid IP address" )
hgs
parents:
diff changeset
  1295
        destinationAddress = TInetAddr( 0 , 0 );
hgs
parents:
diff changeset
  1296
        destinationAddress.SetFamily( KAFUnspec );
hgs
parents:
diff changeset
  1297
        }
hgs
parents:
diff changeset
  1298
hgs
parents:
diff changeset
  1299
    LOG( SIMPLE, "SATENGINE: CSatBIPGPRSDataChannel::DestAddress exiting" )
hgs
parents:
diff changeset
  1300
    return destinationAddress;
hgs
parents:
diff changeset
  1301
    }
hgs
parents:
diff changeset
  1302
hgs
parents:
diff changeset
  1303
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
  1304
// Write Primary PDP Context QoS parameters to RCmManager
hgs
parents:
diff changeset
  1305
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
  1306
//
hgs
parents:
diff changeset
  1307
void CSatBIPGPRSDataChannel::WritePrimaryPDPContextQoSParamsL()
hgs
parents:
diff changeset
  1308
    {
hgs
parents:
diff changeset
  1309
    LOG( SIMPLE,
hgs
parents:
diff changeset
  1310
        "SATENGINE: CSatBIPGPRSDataChannel::WritePrimaryPDPContextQoSParamsL \
hgs
parents:
diff changeset
  1311
        calling" )
hgs
parents:
diff changeset
  1312
hgs
parents:
diff changeset
  1313
    if ( iConnInfo.iOverrideSet )
hgs
parents:
diff changeset
  1314
        {
hgs
parents:
diff changeset
  1315
        LOG( SIMPLE,
hgs
parents:
diff changeset
  1316
        "SATENGINE: CSatBIPGPRSDataChannel::WritePrimaryPDPContextQoSParamsL \
hgs
parents:
diff changeset
  1317
        iConnInfo.iOverrideSet true" )
hgs
parents:
diff changeset
  1318
        
hgs
parents:
diff changeset
  1319
        TUint32 iapId( iConnInfo.iOverrideSet->IapId() );
hgs
parents:
diff changeset
  1320
        LOG2( SIMPLE, 
hgs
parents:
diff changeset
  1321
              "SATENGINE: CSatBIPGPRSDataChannel::WritePrimaryPDPContextQoSParamsL \
hgs
parents:
diff changeset
  1322
              IAP id = %d", iapId )
hgs
parents:
diff changeset
  1323
        
hgs
parents:
diff changeset
  1324
        RPacketQoS::TQoSGPRSRequested reqQoS;
hgs
parents:
diff changeset
  1325
        TSatQoSParser::GetRequestedQoSValues( iConnInfo.iBearerParams, 
hgs
parents:
diff changeset
  1326
            reqQoS );
hgs
parents:
diff changeset
  1327
        TSatQoSParser::TQoSRel5 qosRel5 = TSatQoSParser::ConvertQoS( reqQoS );    
hgs
parents:
diff changeset
  1328
        
hgs
parents:
diff changeset
  1329
        RCmManager cmManager;
hgs
parents:
diff changeset
  1330
        cmManager.OpenLC();
hgs
parents:
diff changeset
  1331
hgs
parents:
diff changeset
  1332
        RCmConnectionMethod cm = cmManager.ConnectionMethodL( iapId );
hgs
parents:
diff changeset
  1333
        CleanupClosePushL( cm );
hgs
parents:
diff changeset
  1334
        
hgs
parents:
diff changeset
  1335
        // Requested traffic class.
hgs
parents:
diff changeset
  1336
        // Type of application for which the UMTS bearer service is optimised
hgs
parents:
diff changeset
  1337
        cm.SetIntAttributeL( CMManager::EGPRSReqTrafficClass, 
hgs
parents:
diff changeset
  1338
                             qosRel5.iTrafficClass );
hgs
parents:
diff changeset
  1339
        LOG2( SIMPLE, "  EGPRSReqTrafficClass:    0x%x", 
hgs
parents:
diff changeset
  1340
              qosRel5.iTrafficClass )
hgs
parents:
diff changeset
  1341
        
hgs
parents:
diff changeset
  1342
        // Requested traffic handling priority.                     
hgs
parents:
diff changeset
  1343
        // Specifies the relative importance for handling of all SDUs belonging
hgs
parents:
diff changeset
  1344
        // to the UMTS bearer compared to the SDUs of other bearers.
hgs
parents:
diff changeset
  1345
        cm.SetIntAttributeL( CMManager::EGPRSReqTrafficHandlingPriority, 
hgs
parents:
diff changeset
  1346
                             qosRel5.iTrafficHandlingPriority );
hgs
parents:
diff changeset
  1347
        LOG2( SIMPLE, "  EGPRSReqTrafficHandlingPriority:    0x%x", 
hgs
parents:
diff changeset
  1348
              qosRel5.iTrafficHandlingPriority )                
hgs
parents:
diff changeset
  1349
        
hgs
parents:
diff changeset
  1350
        // Requested target SDU error ratio.
hgs
parents:
diff changeset
  1351
        // Indicates the fraction of SDUs lost or detected as erroneous.               
hgs
parents:
diff changeset
  1352
        cm.SetIntAttributeL( CMManager::EGPRSReqSDUErrorRatio, 
hgs
parents:
diff changeset
  1353
                             qosRel5.iSduErrorRatio );
hgs
parents:
diff changeset
  1354
        LOG2( SIMPLE, "  EGPRSReqSDUErrorRatio:    0x%x", 
hgs
parents:
diff changeset
  1355
              qosRel5.iSduErrorRatio )                         
hgs
parents:
diff changeset
  1356
                             
hgs
parents:
diff changeset
  1357
        // Requested target Bit error ratio.
hgs
parents:
diff changeset
  1358
        // Indicates the undetected bit error ratio in the delivered SDU.
hgs
parents:
diff changeset
  1359
        cm.SetIntAttributeL( CMManager::EGPRSReqBER, 
hgs
parents:
diff changeset
  1360
                             qosRel5.iResidualBer);
hgs
parents:
diff changeset
  1361
        LOG2( SIMPLE, "  EGPRSReqBER:    0x%x", 
hgs
parents:
diff changeset
  1362
              qosRel5.iResidualBer )                          
hgs
parents:
diff changeset
  1363
              
hgs
parents:
diff changeset
  1364
        // Requested value for erroneous SDU delivery. 
hgs
parents:
diff changeset
  1365
        // Indicates whether SDUs detected as erroneous shall be
hgs
parents:
diff changeset
  1366
        // delivered or discarded
hgs
parents:
diff changeset
  1367
        cm.SetIntAttributeL( CMManager::EGPRSReqDeliverErroneousSDU, 
hgs
parents:
diff changeset
  1368
                             qosRel5.iDeliveryErroneousSdu );
hgs
parents:
diff changeset
  1369
        LOG2( SIMPLE, "  EGPRSReqDeliverErroneousSDU:    0x%x", 
hgs
parents:
diff changeset
  1370
              qosRel5.iDeliveryErroneousSdu )
hgs
parents:
diff changeset
  1371
        
hgs
parents:
diff changeset
  1372
        // Requested maximum bit rates on downlink.                     
hgs
parents:
diff changeset
  1373
        cm.SetIntAttributeL( CMManager::EGPRSReqMaxDownlinkRate, 
hgs
parents:
diff changeset
  1374
                             qosRel5.iMaxBitRate );
hgs
parents:
diff changeset
  1375
        LOG2( SIMPLE, "  EGPRSReqMaxDownlinkRate:    0x%x", 
hgs
parents:
diff changeset
  1376
              qosRel5.iMaxBitRate )
hgs
parents:
diff changeset
  1377
        
hgs
parents:
diff changeset
  1378
        // Requested maximum bit rates on uplink      
hgs
parents:
diff changeset
  1379
        cm.SetIntAttributeL( CMManager::EGPRSReqMaxUplinkRate, 
hgs
parents:
diff changeset
  1380
                             qosRel5.iMaxBitRate );
hgs
parents:
diff changeset
  1381
        LOG2( SIMPLE, "  EGPRSReqMaxUplinkRate:    0x%x", 
hgs
parents:
diff changeset
  1382
              qosRel5.iMaxBitRate )       
hgs
parents:
diff changeset
  1383
        
hgs
parents:
diff changeset
  1384
        // Request maximum SDU size.
hgs
parents:
diff changeset
  1385
        // The maximum SDU size for which the network shall 
hgs
parents:
diff changeset
  1386
        // satisfy the negotiated QoS
hgs
parents:
diff changeset
  1387
        cm.SetIntAttributeL( CMManager::EGPRSReqMaxSDUSize, 
hgs
parents:
diff changeset
  1388
                             qosRel5.iMaximumSDUSize );
hgs
parents:
diff changeset
  1389
        LOG2( SIMPLE, "  EGPRSReqMaxSDUSize:    0x%x", 
hgs
parents:
diff changeset
  1390
              qosRel5.iMaximumSDUSize )
hgs
parents:
diff changeset
  1391
        
hgs
parents:
diff changeset
  1392
        // Requested value for sequential SDU delivery.
hgs
parents:
diff changeset
  1393
        // Indicates whether the UMTS bearer shall provide 
hgs
parents:
diff changeset
  1394
        // in-sequence SDU delivery or not.
hgs
parents:
diff changeset
  1395
        cm.SetIntAttributeL( CMManager::EGPRSReqDeliveryOrder, 
hgs
parents:
diff changeset
  1396
                             qosRel5.iDeliveryOrder );
hgs
parents:
diff changeset
  1397
        LOG2( SIMPLE, "  EGPRSReqDeliveryOrder:    0x%x", 
hgs
parents:
diff changeset
  1398
              qosRel5.iDeliveryOrder )
hgs
parents:
diff changeset
  1399
hgs
parents:
diff changeset
  1400
        cm.UpdateL();
hgs
parents:
diff changeset
  1401
        
hgs
parents:
diff changeset
  1402
        CleanupStack::PopAndDestroy( &cm );
hgs
parents:
diff changeset
  1403
        CleanupStack::PopAndDestroy( &cmManager );
hgs
parents:
diff changeset
  1404
        }
hgs
parents:
diff changeset
  1405
   
hgs
parents:
diff changeset
  1406
    LOG( SIMPLE,
hgs
parents:
diff changeset
  1407
        "SATENGINE: CSatBIPGPRSDataChannel::WritePrimaryPDPContextQoSParamsL \
hgs
parents:
diff changeset
  1408
        exiting" )
hgs
parents:
diff changeset
  1409
    }
hgs
parents:
diff changeset
  1410
hgs
parents:
diff changeset
  1411
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
  1412
// Write default QoS Parameters to RCmManager
hgs
parents:
diff changeset
  1413
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
  1414
//
hgs
parents:
diff changeset
  1415
void CSatBIPGPRSDataChannel::WriteDefaultQoSParamsL()
hgs
parents:
diff changeset
  1416
    {
hgs
parents:
diff changeset
  1417
    LOG( SIMPLE,
hgs
parents:
diff changeset
  1418
        "SATENGINE: CSatBIPGPRSDataChannel::WriteDefaultQoSParamsL \
hgs
parents:
diff changeset
  1419
        calling" )
hgs
parents:
diff changeset
  1420
        
hgs
parents:
diff changeset
  1421
    if ( iConnInfo.iOverrideSet )
hgs
parents:
diff changeset
  1422
        {
hgs
parents:
diff changeset
  1423
        LOG( SIMPLE,
hgs
parents:
diff changeset
  1424
        "SATENGINE: CSatBIPGPRSDataChannel::WriteDefaultQoSParamsL \
hgs
parents:
diff changeset
  1425
        iConnInfo.iOverrideSet true" );
hgs
parents:
diff changeset
  1426
        TUint32 iapId( iConnInfo.iOverrideSet->IapId() ); 
hgs
parents:
diff changeset
  1427
        LOG2( SIMPLE, 
hgs
parents:
diff changeset
  1428
              "SATENGINE: CSatBIPGPRSDataChannel::WriteDefaultQoSParamsL \
hgs
parents:
diff changeset
  1429
              IAP id = %d", iapId )        
hgs
parents:
diff changeset
  1430
        
hgs
parents:
diff changeset
  1431
        RCmManager cmManager;
hgs
parents:
diff changeset
  1432
        cmManager.OpenLC();
hgs
parents:
diff changeset
  1433
hgs
parents:
diff changeset
  1434
        RCmConnectionMethod cm = cmManager.ConnectionMethodL( iapId );
hgs
parents:
diff changeset
  1435
        CleanupClosePushL( cm );
hgs
parents:
diff changeset
  1436
        
hgs
parents:
diff changeset
  1437
        cm.SetIntAttributeL( CMManager::EGPRSReqTrafficClass, 
hgs
parents:
diff changeset
  1438
                             RPacketQoS::ETrafficClassUnspecified );
hgs
parents:
diff changeset
  1439
                             
hgs
parents:
diff changeset
  1440
        cm.SetIntAttributeL( CMManager::EGPRSReqTrafficHandlingPriority, 
hgs
parents:
diff changeset
  1441
                             RPacketQoS::ETrafficPriorityUnspecified );
hgs
parents:
diff changeset
  1442
                             
hgs
parents:
diff changeset
  1443
        cm.SetIntAttributeL( CMManager::EGPRSReqSDUErrorRatio, 
hgs
parents:
diff changeset
  1444
                             RPacketQoS::ESDUErrorRatioUnspecified );
hgs
parents:
diff changeset
  1445
                             
hgs
parents:
diff changeset
  1446
        cm.SetIntAttributeL( CMManager::EGPRSReqBER, 
hgs
parents:
diff changeset
  1447
                             RPacketQoS::EBERUnspecified );
hgs
parents:
diff changeset
  1448
        
hgs
parents:
diff changeset
  1449
        cm.SetIntAttributeL( CMManager::EGPRSReqDeliverErroneousSDU, 
hgs
parents:
diff changeset
  1450
                             RPacketQoS::EErroneousSDUDeliveryUnspecified );
hgs
parents:
diff changeset
  1451
                             
hgs
parents:
diff changeset
  1452
        cm.SetIntAttributeL( CMManager::EGPRSReqMaxDownlinkRate, 0 );
hgs
parents:
diff changeset
  1453
        
hgs
parents:
diff changeset
  1454
        cm.SetIntAttributeL( CMManager::EGPRSReqMaxUplinkRate, 0 );
hgs
parents:
diff changeset
  1455
        
hgs
parents:
diff changeset
  1456
        cm.SetIntAttributeL( CMManager::EGPRSReqMaxSDUSize, 0 );
hgs
parents:
diff changeset
  1457
        
hgs
parents:
diff changeset
  1458
        cm.SetIntAttributeL( CMManager::EGPRSReqDeliveryOrder, 
hgs
parents:
diff changeset
  1459
                             RPacketQoS::EDeliveryOrderUnspecified );
hgs
parents:
diff changeset
  1460
hgs
parents:
diff changeset
  1461
        LOG( SIMPLE,
hgs
parents:
diff changeset
  1462
        "SATENGINE: CSatBIPGPRSDataChannel::WriteDefaultQoSParamsL \
hgs
parents:
diff changeset
  1463
        set default QoS params" );
hgs
parents:
diff changeset
  1464
hgs
parents:
diff changeset
  1465
        cm.UpdateL();
hgs
parents:
diff changeset
  1466
        
hgs
parents:
diff changeset
  1467
        CleanupStack::PopAndDestroy( &cm );
hgs
parents:
diff changeset
  1468
        CleanupStack::PopAndDestroy( &cmManager );
hgs
parents:
diff changeset
  1469
        }
hgs
parents:
diff changeset
  1470
    
hgs
parents:
diff changeset
  1471
    LOG( SIMPLE,
hgs
parents:
diff changeset
  1472
        "SATENGINE: CSatBIPGPRSDataChannel::WriteDefaultQoSParamsL \
hgs
parents:
diff changeset
  1473
        exiting" )
hgs
parents:
diff changeset
  1474
    }
hgs
parents:
diff changeset
  1475
hgs
parents:
diff changeset
  1476
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
  1477
// Set QoS for connection or subconnection
hgs
parents:
diff changeset
  1478
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
  1479
//
hgs
parents:
diff changeset
  1480
void CSatBIPGPRSDataChannel::SetConnQoSParamsL()
hgs
parents:
diff changeset
  1481
    {
hgs
parents:
diff changeset
  1482
    LOG( SIMPLE,
hgs
parents:
diff changeset
  1483
        "SATENGINE: CSatBIPGPRSDataChannel::SetConnQoSParamsL calling" )
hgs
parents:
diff changeset
  1484
    
hgs
parents:
diff changeset
  1485
    RPacketQoS::TQoSGPRSNegotiated negQoS;  // The negotiated QoS
hgs
parents:
diff changeset
  1486
    
hgs
parents:
diff changeset
  1487
    // If using Dummy TSY, set the negotiated QoS directly by hard-codes,
hgs
parents:
diff changeset
  1488
    // otherwise, fetch negotiated QoS for primary context(by ETel API), set QoS
hgs
parents:
diff changeset
  1489
    // for secondary context. 
hgs
parents:
diff changeset
  1490
#ifdef SAT_USE_DUMMY_TSY    
hgs
parents:
diff changeset
  1491
    // Set the negotiated QoS directly if using Dummy TSY
hgs
parents:
diff changeset
  1492
    LOG( NORMAL, "SATENGINE: CSatBIPGPRSDataChannel::ActivateConnectionL\
hgs
parents:
diff changeset
  1493
        don't need to set qos for dummy tsy" )
hgs
parents:
diff changeset
  1494
    negQoS.iPrecedence = RPacketQoS::EPriorityHighPrecedence;
hgs
parents:
diff changeset
  1495
    negQoS.iDelay = RPacketQoS::EDelayClass4;
hgs
parents:
diff changeset
  1496
    negQoS.iReliability = RPacketQoS::EReliabilityClass3;
hgs
parents:
diff changeset
  1497
    negQoS.iPeakThroughput = RPacketQoS::EPeakThroughput256000;
hgs
parents:
diff changeset
  1498
    negQoS.iMeanThroughput = RPacketQoS::EUnspecifiedMeanThroughput;
hgs
parents:
diff changeset
  1499
    TSatQoSParser::GetNegotiatedQoSValues( negQoS, iConnInfo.iBearerParams );
hgs
parents:
diff changeset
  1500
    // Set last bearer param to IP Protocol
hgs
parents:
diff changeset
  1501
    iConnInfo.iBearerParams[KProtocolPos] = KReqPacketProtType;     
hgs
parents:
diff changeset
  1502
#else   // Set QoS for channels
hgs
parents:
diff changeset
  1503
    if ( iUtils.IsSubConnectionActivated() ) 
hgs
parents:
diff changeset
  1504
        {
hgs
parents:
diff changeset
  1505
        // Set QoS params, granted QoS will be fetched after connected
hgs
parents:
diff changeset
  1506
         LOG( NORMAL, "SATENGINE: CSatBIPGPRSDataChannel::ActivateConnectionL\
hgs
parents:
diff changeset
  1507
                Set QoS values for SubConnection" )
hgs
parents:
diff changeset
  1508
        SetSubConQoSParamsL();
hgs
parents:
diff changeset
  1509
        }
hgs
parents:
diff changeset
  1510
    else
hgs
parents:
diff changeset
  1511
        {
hgs
parents:
diff changeset
  1512
        // Primary PDP Context need to be fetched by ETel API
hgs
parents:
diff changeset
  1513
         RPacketQoS::TQoSGPRSRequested reqQoS;
hgs
parents:
diff changeset
  1514
         TSatQoSParser::GetRequestedQoSValues( iConnInfo.iBearerParams, 
hgs
parents:
diff changeset
  1515
            reqQoS );
hgs
parents:
diff changeset
  1516
        negQoS = iUtils.ProposeQoSParametersL( reqQoS );
hgs
parents:
diff changeset
  1517
        TSatQoSParser::GetNegotiatedQoSValues( negQoS, 
hgs
parents:
diff changeset
  1518
            iConnInfo.iBearerParams );
hgs
parents:
diff changeset
  1519
        // Set last bearer param to IP Protocol
hgs
parents:
diff changeset
  1520
        iConnInfo.iBearerParams[KProtocolPos] = KReqPacketProtType;      
hgs
parents:
diff changeset
  1521
        }
hgs
parents:
diff changeset
  1522
#endif
hgs
parents:
diff changeset
  1523
        
hgs
parents:
diff changeset
  1524
    LOG( SIMPLE,
hgs
parents:
diff changeset
  1525
        "SATENGINE: CSatBIPGPRSDataChannel::SetConnQoSParamsL exiting" )
hgs
parents:
diff changeset
  1526
    }
hgs
parents:
diff changeset
  1527
hgs
parents:
diff changeset
  1528
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
  1529
// GetSubConQoSR5ParamsFromEvent
hgs
parents:
diff changeset
  1530
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
  1531
//
hgs
parents:
diff changeset
  1532
TInt CSatBIPGPRSDataChannel::GetSubConQoSR5ParamsFromEvent(
hgs
parents:
diff changeset
  1533
    CSubConNotificationEvent& aEvent, 
hgs
parents:
diff changeset
  1534
    TSatQoSParser::TQoSRel5& aNegQoSRel5 )
hgs
parents:
diff changeset
  1535
    {
hgs
parents:
diff changeset
  1536
    LOG( SIMPLE, 
hgs
parents:
diff changeset
  1537
        "SATENGINE: CSatBIPGPRSDataChannel::GetSubConQoSR5ParamsFromEvent \
hgs
parents:
diff changeset
  1538
        calling" )
hgs
parents:
diff changeset
  1539
    TInt errCode( KErrNone );
hgs
parents:
diff changeset
  1540
    
hgs
parents:
diff changeset
  1541
    CSubConGenEventParamsGranted* grantedEvent = 
hgs
parents:
diff changeset
  1542
        static_cast<CSubConGenEventParamsGranted*>( &aEvent );
hgs
parents:
diff changeset
  1543
    
hgs
parents:
diff changeset
  1544
    TInt extSetNum = grantedEvent->GetNumExtensionSets();
hgs
parents:
diff changeset
  1545
    LOG2( NORMAL, 
hgs
parents:
diff changeset
  1546
        "SATENGINE: GetSubConQoSR5ParamsFromEvent extSetNum :%d ", extSetNum )
hgs
parents:
diff changeset
  1547
                 
hgs
parents:
diff changeset
  1548
    const CSubConExtensionParameterSet* grantedExtParams = 
hgs
parents:
diff changeset
  1549
        grantedEvent->GetExtensionSet( extSetNum-1 );
hgs
parents:
diff changeset
  1550
    
hgs
parents:
diff changeset
  1551
    if ( grantedExtParams )
hgs
parents:
diff changeset
  1552
        {
hgs
parents:
diff changeset
  1553
        CSubConQosR5ParamSet* paramSet;
hgs
parents:
diff changeset
  1554
        paramSet = ( CSubConQosR5ParamSet* )grantedExtParams;
hgs
parents:
diff changeset
  1555
        
hgs
parents:
diff changeset
  1556
        if ( paramSet )
hgs
parents:
diff changeset
  1557
            {
hgs
parents:
diff changeset
  1558
            aNegQoSRel5.iTrafficClass = paramSet->GetTrafficClass();
hgs
parents:
diff changeset
  1559
            aNegQoSRel5.iTrafficHandlingPriority =
hgs
parents:
diff changeset
  1560
                paramSet->GetTrafficHandlingPriority();
hgs
parents:
diff changeset
  1561
            aNegQoSRel5.iSduErrorRatio = paramSet->GetSDUErrorRatio();
hgs
parents:
diff changeset
  1562
            aNegQoSRel5.iResidualBer = paramSet->GetResidualBitErrorRatio();
hgs
parents:
diff changeset
  1563
            aNegQoSRel5.iDeliveryErroneousSdu = 
hgs
parents:
diff changeset
  1564
                paramSet->GetErroneousSDUDelivery();
hgs
parents:
diff changeset
  1565
            aNegQoSRel5.iMaxBitRate = Max( paramSet->GetMaxBitrateUplink(),
hgs
parents:
diff changeset
  1566
                                        paramSet->GetMaxBitrateDownlink() );
hgs
parents:
diff changeset
  1567
            aNegQoSRel5.iMaximumSDUSize = paramSet->GetMaxSduSize();
hgs
parents:
diff changeset
  1568
            aNegQoSRel5.iDeliveryOrder = paramSet->GetDeliveryOrder();
hgs
parents:
diff changeset
  1569
                
hgs
parents:
diff changeset
  1570
            LOG2( SIMPLE, "Negotiated TrafficClass: %d", 
hgs
parents:
diff changeset
  1571
                aNegQoSRel5.iTrafficClass )
hgs
parents:
diff changeset
  1572
            LOG2( SIMPLE, "Negotiated TrafficHandlingPriority: %d", 
hgs
parents:
diff changeset
  1573
                aNegQoSRel5.iTrafficHandlingPriority )
hgs
parents:
diff changeset
  1574
            LOG2( SIMPLE, "Negotiated SDUErrorRatio: %d", 
hgs
parents:
diff changeset
  1575
                aNegQoSRel5.iSduErrorRatio )
hgs
parents:
diff changeset
  1576
            LOG2( SIMPLE, "Negotiated ResidualBitErrorRatio: %d", 
hgs
parents:
diff changeset
  1577
                aNegQoSRel5.iResidualBer )
hgs
parents:
diff changeset
  1578
            LOG2( SIMPLE, "Negotiated ErroneousSDUDelivery: %d", 
hgs
parents:
diff changeset
  1579
                aNegQoSRel5.iDeliveryErroneousSdu )
hgs
parents:
diff changeset
  1580
            LOG2( SIMPLE, "Negotiated Maxbitrate: %d", 
hgs
parents:
diff changeset
  1581
                aNegQoSRel5.iMaxBitRate )
hgs
parents:
diff changeset
  1582
            LOG2( SIMPLE, "Negotiated MaximumSDUSize: %d", 
hgs
parents:
diff changeset
  1583
                aNegQoSRel5.iMaximumSDUSize )
hgs
parents:
diff changeset
  1584
            LOG2( SIMPLE, "Negotiated DeliveryOrder: %d", 
hgs
parents:
diff changeset
  1585
                aNegQoSRel5.iDeliveryOrder )
hgs
parents:
diff changeset
  1586
            }
hgs
parents:
diff changeset
  1587
        else
hgs
parents:
diff changeset
  1588
            {
hgs
parents:
diff changeset
  1589
            LOG( NORMAL, "SATENGINE: GetSubConQoSR5ParamsFromEvent\
hgs
parents:
diff changeset
  1590
                Can't get CSubConQosR5ParamSet " )
hgs
parents:
diff changeset
  1591
            errCode = KErrNotSupported;
hgs
parents:
diff changeset
  1592
            }
hgs
parents:
diff changeset
  1593
        }
hgs
parents:
diff changeset
  1594
    else
hgs
parents:
diff changeset
  1595
        {
hgs
parents:
diff changeset
  1596
        LOG( NORMAL, "SATENGINE: GetSubConQoSR5ParamsFromEvent\
hgs
parents:
diff changeset
  1597
                Can't get granted CSubConExtensionParameterSet " )
hgs
parents:
diff changeset
  1598
        errCode = KErrNotSupported;
hgs
parents:
diff changeset
  1599
        }
hgs
parents:
diff changeset
  1600
     
hgs
parents:
diff changeset
  1601
    LOG2( SIMPLE,
hgs
parents:
diff changeset
  1602
        "SATENGINE: CSatBIPGPRSDataChannel::GetSubConQoSR5ParamsFromEvent \
hgs
parents:
diff changeset
  1603
        exiting, errCode: %d", errCode )
hgs
parents:
diff changeset
  1604
    return errCode;
hgs
parents:
diff changeset
  1605
    }
hgs
parents:
diff changeset
  1606
    
hgs
parents:
diff changeset
  1607
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
  1608
// GrantedEventReceivedL
hgs
parents:
diff changeset
  1609
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
  1610
//   
hgs
parents:
diff changeset
  1611
void CSatBIPGPRSDataChannel::GrantedEventReceivedL( 
hgs
parents:
diff changeset
  1612
    const TNotificationEventBuf& aEventBuffer )
hgs
parents:
diff changeset
  1613
    {
hgs
parents:
diff changeset
  1614
    LOG( SIMPLE, 
hgs
parents:
diff changeset
  1615
        "SATENGINE: CSatBIPGPRSDataChannel::GrantedEventReceivedL calling" )
hgs
parents:
diff changeset
  1616
    TInt errCode( KErrNone );
hgs
parents:
diff changeset
  1617
    RPacketQoS::TQoSGPRSNegotiated negQoS;
hgs
parents:
diff changeset
  1618
    
hgs
parents:
diff changeset
  1619
    // Exacting information from receieved events
hgs
parents:
diff changeset
  1620
	CSubConNotificationEvent* event = 
hgs
parents:
diff changeset
  1621
        CSubConNotificationEvent::NewL( aEventBuffer );
hgs
parents:
diff changeset
  1622
        
hgs
parents:
diff changeset
  1623
    if ( KSubConnGenericEventsImplUid == event->GroupId() )
hgs
parents:
diff changeset
  1624
        {
hgs
parents:
diff changeset
  1625
        LOG( NORMAL, "SATENGINE: GrantedEventReceivedL \
hgs
parents:
diff changeset
  1626
            event->GroupId() == KSubConnGenericEventsImplUid" )
hgs
parents:
diff changeset
  1627
        TSatQoSParser::TQoSRel5 negQoSRel5;
hgs
parents:
diff changeset
  1628
                
hgs
parents:
diff changeset
  1629
        switch ( event->Id() )
hgs
parents:
diff changeset
  1630
            {
hgs
parents:
diff changeset
  1631
            case KSubConGenericEventParamsGranted:
hgs
parents:
diff changeset
  1632
                {
hgs
parents:
diff changeset
  1633
                LOG( NORMAL, 
hgs
parents:
diff changeset
  1634
                    "SATENGINE: GrantedEventReceivedL Request granted" )
hgs
parents:
diff changeset
  1635
                      
hgs
parents:
diff changeset
  1636
                // Get the granted param set from event
hgs
parents:
diff changeset
  1637
                errCode = GetSubConQoSR5ParamsFromEvent( *event, negQoSRel5 );
hgs
parents:
diff changeset
  1638
                LOG2( NORMAL, 
hgs
parents:
diff changeset
  1639
                       "SATENGINE: GetSubConQoSR5ParamsFromEvent errCode %d ", 
hgs
parents:
diff changeset
  1640
                       errCode )
hgs
parents:
diff changeset
  1641
                User::LeaveIfError( errCode );
hgs
parents:
diff changeset
  1642
                break;
hgs
parents:
diff changeset
  1643
                }
hgs
parents:
diff changeset
  1644
            case KSubConGenericEventParamsRejected:
hgs
parents:
diff changeset
  1645
                {
hgs
parents:
diff changeset
  1646
                LOG( NORMAL, 
hgs
parents:
diff changeset
  1647
                        "SATENGINE: GrantedEventReceivedL Request Rejected" )
hgs
parents:
diff changeset
  1648
                        
hgs
parents:
diff changeset
  1649
                CSubConGenEventParamsRejected* rejectedEvent = 
hgs
parents:
diff changeset
  1650
                     static_cast<CSubConGenEventParamsRejected*>( event );
hgs
parents:
diff changeset
  1651
                errCode = rejectedEvent->Error();
hgs
parents:
diff changeset
  1652
                     
hgs
parents:
diff changeset
  1653
                LOG2( NORMAL, 
hgs
parents:
diff changeset
  1654
                        "SATENGINE: GrantedEventReceivedL\
hgs
parents:
diff changeset
  1655
	                        rejectedEvent->Error() = %d", errCode )
hgs
parents:
diff changeset
  1656
	            User::LeaveIfError( errCode );
hgs
parents:
diff changeset
  1657
	            break;
hgs
parents:
diff changeset
  1658
                }
hgs
parents:
diff changeset
  1659
            default:
hgs
parents:
diff changeset
  1660
                {
hgs
parents:
diff changeset
  1661
                LOG( NORMAL, 
hgs
parents:
diff changeset
  1662
                    "SATENGINE: GrantedEventReceivedL. EventId \
hgs
parents:
diff changeset
  1663
                    not in KSubConGenericEventParamsRejected/Granted " )
hgs
parents:
diff changeset
  1664
                // Do nothing
hgs
parents:
diff changeset
  1665
                break;
hgs
parents:
diff changeset
  1666
                }
hgs
parents:
diff changeset
  1667
            }                
hgs
parents:
diff changeset
  1668
        // convert negQoSRel5 to negQoS
hgs
parents:
diff changeset
  1669
        negQoS = TSatQoSParser::ConvertNegotiatedQoS( negQoSRel5 );
hgs
parents:
diff changeset
  1670
                             
hgs
parents:
diff changeset
  1671
        TSatQoSParser::GetNegotiatedQoSValues( negQoS, 
hgs
parents:
diff changeset
  1672
            iConnInfo.iBearerParams );
hgs
parents:
diff changeset
  1673
                
hgs
parents:
diff changeset
  1674
        // Set last bearer param to IP Protocol
hgs
parents:
diff changeset
  1675
        iConnInfo.iBearerParams[KProtocolPos] = KReqPacketProtType;
hgs
parents:
diff changeset
  1676
        }
hgs
parents:
diff changeset
  1677
hgs
parents:
diff changeset
  1678
    LOG( SIMPLE, 
hgs
parents:
diff changeset
  1679
        "SATENGINE: CSatBIPGPRSDataChannel::GrantedEventReceivedL exiting" )
hgs
parents:
diff changeset
  1680
    }
hgs
parents:
diff changeset
  1681
    
hgs
parents:
diff changeset
  1682
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
  1683
// Returns sub connection
hgs
parents:
diff changeset
  1684
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
  1685
//
hgs
parents:
diff changeset
  1686
RSubConnection& CSatBIPGPRSDataChannel::SubConnection() const
hgs
parents:
diff changeset
  1687
    {
hgs
parents:
diff changeset
  1688
    LOG( SIMPLE, "SATENGINE: CSatBIPGPRSDataChannel::SubConnection\
hgs
parents:
diff changeset
  1689
        calling - exiting" )
hgs
parents:
diff changeset
  1690
    return iSubConnection;
hgs
parents:
diff changeset
  1691
    }
hgs
parents:
diff changeset
  1692