diff -r 2492a6e4aed7 -r 4284d6390a82 telephonyprotocols/pdplayer/src/PDPSCPRStates.cpp --- a/telephonyprotocols/pdplayer/src/PDPSCPRStates.cpp Tue Apr 27 17:51:07 2010 +0300 +++ b/telephonyprotocols/pdplayer/src/PDPSCPRStates.cpp Tue May 11 17:18:08 2010 +0300 @@ -226,7 +226,9 @@ //It's not legal for the qos defaults to be absent. CDefaultPacketQoSProvision* defaultQoS = NULL; + TRAPD(ret, defaultQoS = CDefaultPacketQoSProvision::NewL(aIapView)); + if ((KErrNone == ret) && defaultQoS) { CleanupStack::PushL(defaultQoS); @@ -658,115 +660,192 @@ User::LeaveIfError(tNode.iProvisionFailure); ASSERT(tNode.iPdpFsmInterface); - - iContext.Node().PostToClients( + + tNode.PostToClients( iContext.NodeId(), TCFMessage::TStateChange( Elements::TStateChange(KPsdStartingConfiguration, KErrNone)).CRef(), TClientType(TCFClientType::ECtrlProvider)); - - CGPRSProvision* gprsProvision = const_cast(static_cast( - iContext.Node().AccessPointConfig().FindExtension(STypeId::CreateSTypeId(CGPRSProvision::EUid,CGPRSProvision::ETypeId)))); - - //retrieve QoS (should be provisioned, but can also be overriden with SetParams). - RPacketQoS::TQoSR5Requested qosOverridenParams; - const RPacketQoS::TQoSR5Requested* qosParams = NULL; - if (! iContext.Node().iParameterBundle.IsNull() && ! iContext.Node().iParameterBundle.FindFamily(KSubConQoSFamily).IsNull()) - { - MPDPParamMapper::MapQosParamBundleToEtelL(iContext.Node().iParameterBundle, qosOverridenParams); - qosParams = &qosOverridenParams; - } - else - { - const CDefaultPacketQoSProvision* defaultQoSProvision = static_cast( - iContext.Node().AccessPointConfig().FindExtension(STypeId::CreateSTypeId(CDefaultPacketQoSProvision::EUid,CDefaultPacketQoSProvision::ETypeId))); - qosParams = defaultQoSProvision ? &defaultQoSProvision->iParams : NULL; - + + CGPRSProvision* gprsProvision = const_cast(static_cast( + tNode.AccessPointConfig().FindExtension(STypeId::CreateSTypeId(CGPRSProvision::EUid,CGPRSProvision::ETypeId)))); + + if (gprsProvision == NULL) + { + User::Leave(KErrCorrupt); + } + + //retrieve QoS (should be provisioned, but can also be overriden with SetParams). + RPacketQoS::TQoSR5Requested qosOverridenParams; + + const RPacketQoS::TQoSR5Requested* qosParams = NULL; + + if ((!tNode.iParameterBundle.IsNull()) &&\ + (!tNode.iParameterBundle.FindFamily(KSubConQoSFamily).IsNull())) + { + MPDPParamMapper::MapQosParamBundleToEtelL(tNode.iParameterBundle, qosOverridenParams); + qosParams = &qosOverridenParams; + } + else + { + const CDefaultPacketQoSProvision* defaultQoSProvision = static_cast( + tNode.AccessPointConfig().FindExtension(STypeId::CreateSTypeId(CDefaultPacketQoSProvision::EUid,CDefaultPacketQoSProvision::ETypeId))); + + if (defaultQoSProvision) + { + qosParams = &defaultQoSProvision->iParams; + } + else + { + User::Leave(KErrCorrupt); + } + //Here we're taking the qos defaults from the provision info, hence skipping the iParameterBundle. //The lack of iParameterBundle however and the respective ERequested params is badly tolerated by the rest //of the code (e.g.: when subsequently raising granted params it is assumed something has been requested). - //Let's create a phoney requested params. - //iContext.Node().CreateParameterBundleL(); - //RParameterFamily family = iContext.Node().iParameterBundle.CreateFamilyL(KSubConQoSFamily); //PJLEFT - - RCFParameterFamilyBundle newBundle; - newBundle.CreateL(); - iContext.Node().iParameterBundle.Open(newBundle); - RParameterFamily family = newBundle.CreateFamilyL(KSubConQoSFamily); - CSubConQosGenericParamSet::NewL(family, RParameterFamily::ERequested); - } - TTFTInfo tft; //We'll use empty/thus default TFT - if (gprsProvision == NULL || qosParams == NULL) - { - User::Leave(KErrCorrupt); - } - - const CImsExtProvision* imsprov = static_cast( - iContext.Node().AccessPointConfig().FindExtension(STypeId::CreateSTypeId(CImsExtProvision::EUid, CImsExtProvision::ETypeId))); - - TRAP_IGNORE(iContext.Node().iIsModeGsm = IsModeGsmL()); - - switch (gprsProvision->UmtsGprsRelease()) - { - case TPacketDataConfigBase::KConfigGPRS: - { - SetImsSignallingFlagL(gprsProvision->GetScratchContextAs().iProtocolConfigOption, imsprov->iImsSignalIndicator); + + // These parameter bundles are also used in a situation when a context has failed to create because of a lack + // of modem / network resources, as the SCPR isn't torn down, the parameter bundles need to hold the + // information of the default QoS otherwise bad things happen [bad QoS]. + + RCFParameterFamilyBundle newBundle; + newBundle.CreateL(); + tNode.iParameterBundle.Open(newBundle); + RParameterFamily family = newBundle.CreateFamilyL(KSubConQoSFamily); + + TInt tRelease = gprsProvision->UmtsGprsRelease(); + + CSubConQosR99ParamSet* extRequestedR99 = NULL; + CSubConQosR99ParamSet* extAcceptableR99 = NULL; + CSubConQosR5ParamSet* extRequestedR5 = NULL; + CSubConQosR5ParamSet* extAcceptableR5 = NULL; + + if (tRelease == TPacketDataConfigBase::KConfigRel5) + { + // R5 - basically R4 + a few parameters + + extRequestedR5 = CSubConQosR5ParamSet::NewL(family,RParameterFamily::ERequested); + extAcceptableR5 = CSubConQosR5ParamSet::NewL(family,RParameterFamily::EAcceptable); - // Only request SIP server address retrieval when network not in GSM/GPRS mode - // e.g. UMTS/WCDMA - if (!iContext.Node().iIsModeGsm) - { - SetupSipServerAddrRetrievalL(gprsProvision->GetScratchContextAs().iProtocolConfigOption); - } - - SetChapInformationL(gprsProvision->GetScratchContextAs().iProtocolConfigOption); - - } - break; - - case TPacketDataConfigBase::KConfigRel5: - case TPacketDataConfigBase::KConfigRel99Rel4: - { - SetImsSignallingFlagL(gprsProvision->GetScratchContextAs().iProtocolConfigOption, imsprov->iImsSignalIndicator); - - // Only request SIP server address retrieval when network not in GSM/GPRS mode - // e.g. UMTS/WCDMA - if (!iContext.Node().iIsModeGsm) - { - SetupSipServerAddrRetrievalL(gprsProvision->GetScratchContextAs().iProtocolConfigOption); - } - - SetChapInformationL(gprsProvision->GetScratchContextAs().iProtocolConfigOption); - - } - break; - } - - iContext.Node().iPDPFsmContextId = iContext.Node().iPdpFsmInterface->NewFsmContextL(iContext.Node(),SpudMan::EPrimary); - - iContext.Node().PostToClients( + // Requested QoS Parameters + extRequestedR5->SetSourceStatisticsDescriptor(qosParams->iSourceStatisticsDescriptor); + extRequestedR5->SetSignallingIndicator(qosParams->iSignallingIndication); + + extRequestedR99 = dynamic_cast(extRequestedR5); + + // Acceptable QoS Parameters + + extAcceptableR5->SetSourceStatisticsDescriptor(qosParams->iSourceStatisticsDescriptor); + extAcceptableR5->SetSignallingIndicator(qosParams->iSignallingIndication); + + extAcceptableR99 = dynamic_cast(extAcceptableR5); + + } + else + { + // R4 and R99 + extRequestedR99 = CSubConQosR99ParamSet::NewL(family,RParameterFamily::ERequested); + extAcceptableR99 = CSubConQosR99ParamSet::NewL(family,RParameterFamily::EAcceptable); + } + + // Requested QoS Parameters + extRequestedR99->SetTrafficClass(qosParams->iReqTrafficClass); + extRequestedR99->SetDeliveryOrder(qosParams->iReqDeliveryOrderReqd); + extRequestedR99->SetErroneousSDUDelivery(qosParams->iReqDeliverErroneousSDU); + extRequestedR99->SetResidualBitErrorRatio(qosParams->iReqBER); + extRequestedR99->SetSDUErrorRatio(qosParams->iReqSDUErrorRatio); + extRequestedR99->SetTrafficHandlingPriority(qosParams->iReqTrafficHandlingPriority); + extRequestedR99->SetTransferDelay(qosParams->iReqTransferDelay); + extRequestedR99->SetMaxSduSize(qosParams->iReqMaxSDUSize); + extRequestedR99->SetMaxBitrateUplink(qosParams->iReqMaxRate.iUplinkRate); + extRequestedR99->SetMaxBitrateDownlink(qosParams->iReqMaxRate.iDownlinkRate); + extRequestedR99->SetGuaBitrateUplink(qosParams->iReqGuaranteedRate.iUplinkRate); + extRequestedR99->SetGuaBitrateDownlink(qosParams->iReqGuaranteedRate.iDownlinkRate); + + // Acceptable QoS Parameters + extAcceptableR99->SetTrafficClass(qosParams->iMinTrafficClass); + extAcceptableR99->SetDeliveryOrder(qosParams->iMinDeliveryOrderReqd); + extAcceptableR99->SetErroneousSDUDelivery(qosParams->iMinDeliverErroneousSDU); + extAcceptableR99->SetResidualBitErrorRatio(qosParams->iMaxBER); + extAcceptableR99->SetSDUErrorRatio(qosParams->iMaxSDUErrorRatio); + extAcceptableR99->SetTrafficHandlingPriority(qosParams->iMinTrafficHandlingPriority); + extAcceptableR99->SetTransferDelay(qosParams->iMaxTransferDelay); + extAcceptableR99->SetMaxSduSize(qosParams->iMinAcceptableMaxSDUSize); + extAcceptableR99->SetMaxBitrateUplink(qosParams->iMinAcceptableMaxRate.iUplinkRate); + extAcceptableR99->SetMaxBitrateDownlink(qosParams->iMinAcceptableMaxRate.iDownlinkRate); + extAcceptableR99->SetGuaBitrateUplink(qosParams->iMinGuaranteedRate.iUplinkRate); + extAcceptableR99->SetGuaBitrateDownlink(qosParams->iMinGuaranteedRate.iDownlinkRate); + + } + + TTFTInfo tft; //We'll use empty/thus default TFT + + const CImsExtProvision* imsprov = static_cast( + tNode.AccessPointConfig().FindExtension(STypeId::CreateSTypeId(CImsExtProvision::EUid, CImsExtProvision::ETypeId))); + + TRAP_IGNORE(tNode.iIsModeGsm = IsModeGsmL()); + + switch (gprsProvision->UmtsGprsRelease()) + { + case TPacketDataConfigBase::KConfigGPRS: + { + SetImsSignallingFlagL(gprsProvision->GetScratchContextAs().iProtocolConfigOption, imsprov->iImsSignalIndicator); + + // Only request SIP server address retrieval when network not in GSM/GPRS mode + // e.g. UMTS/WCDMA + if (!tNode.iIsModeGsm) + { + SetupSipServerAddrRetrievalL(gprsProvision->GetScratchContextAs().iProtocolConfigOption); + } + + SetChapInformationL(gprsProvision->GetScratchContextAs().iProtocolConfigOption); + + } + break; + + case TPacketDataConfigBase::KConfigRel5: + case TPacketDataConfigBase::KConfigRel99Rel4: + { + SetImsSignallingFlagL(gprsProvision->GetScratchContextAs().iProtocolConfigOption, imsprov->iImsSignalIndicator); + + // Only request SIP server address retrieval when network not in GSM/GPRS mode + // e.g. UMTS/WCDMA + if (!tNode.iIsModeGsm) + { + SetupSipServerAddrRetrievalL(gprsProvision->GetScratchContextAs().iProtocolConfigOption); + } + + SetChapInformationL(gprsProvision->GetScratchContextAs().iProtocolConfigOption); + + } + break; + } + + tNode.iPDPFsmContextId = tNode.iPdpFsmInterface->NewFsmContextL(tNode,SpudMan::EPrimary); + + tNode.PostToClients( iContext.NodeId(), TCFMessage::TStateChange( Elements::TStateChange(KPsdFinishedConfiguration, KErrNone)).CRef(), TClientType(TCFClientType::ECtrlProvider)); - - iContext.Node().PostToClients( + + tNode.PostToClients( iContext.NodeId(), TCFMessage::TStateChange( Elements::TStateChange(KPsdStartingActivation, KErrNone)).CRef(), TClientType(TCFClientType::ECtrlProvider)); - - ASSERT(iContext.Node().iPDPFsmContextId == KPrimaryContextId); - iContext.Node().iContextType=SpudMan::EPrimary; - iContext.Node().iPdpFsmInterface->Set(KPrimaryContextId, gprsProvision->GetScratchContextAs()); - //Set default QoS - iContext.Node().iPdpFsmInterface->Set(KPrimaryContextId, *qosParams); + + ASSERT(tNode.iPDPFsmContextId == KPrimaryContextId); + tNode.iContextType=SpudMan::EPrimary; + tNode.iPdpFsmInterface->Set(KPrimaryContextId, gprsProvision->GetScratchContextAs()); + //Set default QoS + tNode.iPdpFsmInterface->Set(KPrimaryContextId, *qosParams); //Set default TFTs - iContext.Node().iPdpFsmInterface->Set(KPrimaryContextId, tft); // ignore any error + tNode.iPdpFsmInterface->Set(KPrimaryContextId, tft); // ignore any error //Start the primary. - User::LeaveIfError(iContext.Node().iPdpFsmInterface->Input(KPrimaryContextId, SpudMan::ECreatePrimaryPDPContext)); + User::LeaveIfError(tNode.iPdpFsmInterface->Input(KPrimaryContextId, SpudMan::ECreatePrimaryPDPContext)); iContext.iNodeActivity->ClearPostedTo(); - iContext.Node().iActivityAwaitingResponse = iContext.iNodeActivity->ActivityId(); + tNode.iActivityAwaitingResponse = iContext.iNodeActivity->ActivityId(); } DEFINE_SMELEMENT(TOverrideProvision, NetStateMachine::MStateTransition, PDPSCprStates::TContext) @@ -1464,33 +1543,48 @@ iContext.Node().iActivityAwaitingResponse = iContext.iNodeActivity->ActivityId(); } +DEFINE_SMELEMENT(TCleanupFSM, NetStateMachine::MStateTransition, PDPSCprStates::TContext) +void TCleanupFSM::DoL() + { + CPDPSubConnectionProvider &tNode = static_cast(iContext.Node()); + + if (tNode.iPDPFsmContextId != CPDPSubConnectionProvider::EInvalidContextId) + { + + // removing the memory associated with the context - this should hopefully + // ensure that the memory allocations that happen afterwards can be + // accomplished without OOM errors + + tNode.iPdpFsmInterface->DeleteFsmContext(tNode.iPDPFsmContextId); + + if (tNode.ContentionRequested() == EFalse) + { + CSubConGenEventSubConDown* event = CSubConGenEventSubConDown::NewL(); + CleanupStack::PushL(event); + tNode.NotifyClientsL(*event); + CleanupStack::Pop(event); + } + + if (tNode.iPDPFsmContextId == KPrimaryContextId) + { + tNode.PostToClients( + iContext.NodeId(), + TCFMessage::TStateChange( + Elements::TStateChange(KPsdFinishedDeactivation, KErrNone)).CRef(), + TClientType(TCFClientType::ECtrlProvider)); + } + + tNode.iPDPFsmContextId = CPDPSubConnectionProvider::EInvalidContextId; + + } + } + + DEFINE_SMELEMENT(TAwaitingPDPContextDestroyed, NetStateMachine::MState, PDPSCprStates::TContext) TBool TAwaitingPDPContextDestroyed::Accept() { if (TAwaitingPDPFSMMessage::Accept(KContextDeleteEvent)) { - if (iContext.Node().iPDPFsmContextId != CPDPSubConnectionProvider::EInvalidContextId) - { - if (!iContext.Node().ContentionRequested()) - { - CSubConGenEventSubConDown* event = CSubConGenEventSubConDown::NewL(); - CleanupStack::PushL(event); - iContext.Node().NotifyClientsL(*event); - CleanupStack::Pop(event); - } - - if (iContext.Node().iPDPFsmContextId == KPrimaryContextId) - { - iContext.Node().PostToClients( - iContext.NodeId(), - TCFMessage::TStateChange( - Elements::TStateChange(KPsdFinishedDeactivation, KErrNone)).CRef(), - TClientType(TCFClientType::ECtrlProvider)); - } - - iContext.Node().iPdpFsmInterface->DeleteFsmContext(iContext.Node().iPDPFsmContextId); - iContext.Node().iPDPFsmContextId = CPDPSubConnectionProvider::EInvalidContextId; - } return ETrue; } return EFalse;