diff -r 000000000000 -r 1bce908db942 natfw/tsrc/natfwtestconsoles/natfwtestconsole/src/stunudpmediatest.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/natfw/tsrc/natfwtestconsoles/natfwtestconsole/src/stunudpmediatest.cpp Tue Feb 02 01:04:58 2010 +0200 @@ -0,0 +1,462 @@ +/* +* Copyright (c) 2007 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: +* +*/ + + + + +// INCLUDES +#include +#include "natfwconnectivityapidefs.h" +#include "natfwconnectivityapi.h" +#include +#include +#include "mnatfwsocketmediaconnwrapper.h" +#include "natfwcandidate.h" +#include "natfwcandidatepair.h" + +#include "mediateststubs.h" +#include "stunudpmediatest.h" +#include "testdefinitions.hrh" +#include "natfwtestconsolelogs.h" +#include + +const TInt KAudioPrefVoipAudioUplink = 0x05220001; +const TInt KAudioPrefVoipAudioDownlink = 0x05210001; +const TInt KDefaultQos = 46; +const TInt KRunningTime = 500000; + +// ======== MEMBER FUNCTIONS ================================================= + +// --------------------------------------------------------------------------- +// CStunUdpMediaTestInterface::CStunUdpMediaTestInterface +// C++ default constructor can NOT contain any code, that +// might leave. +// --------------------------------------------------------------------------- +// +CStunUdpMediaTest::CStunUdpMediaTest( CConsoleBase& aConsole, + CNATFWConnectivityApi& aNat, CMediaTestStubs& aIFStub, TUint aIapId, + TUint32 aDestAddr, TUint aDestPort ) : + iConsole( aConsole ), iNat( aNat ), iIfStub( aIFStub ), iIapId( aIapId ), + iDestAddr( aDestAddr ), iDestPort( aDestPort ) + { + } + +// --------------------------------------------------------------------------- +// CStunUdpMediaTest::ConstructL +// Symbian 2nd phase constructor can leave. +// --------------------------------------------------------------------------- +// +void CStunUdpMediaTest::ConstructL( const TDesC8& aDomain ) + { + iDomain = aDomain.AllocL(); + RDebug::Print( _L("CStunUdpMediaTest::ConstructL IAP: %d"), iIapId ); + } + +// --------------------------------------------------------------------------- +// CStunUdpMediaTest::NewL +// Static constructor. +// --------------------------------------------------------------------------- +// +CStunUdpMediaTest* CStunUdpMediaTest::NewL( CConsoleBase& aConsole, + CNATFWConnectivityApi& aNat, CMediaTestStubs& aIFStub, + const TDesC8& aDomain, TUint aIapId, TUint32 aDestAddr, TUint aDestPort ) + { + CStunUdpMediaTest* self + = new ( ELeave ) CStunUdpMediaTest( aConsole, aNat, aIFStub, aIapId, + aDestAddr, aDestPort ); + + CleanupStack::PushL( self ); + self->ConstructL( aDomain ); + CleanupStack::Pop( self ); + return self; + } + +// --------------------------------------------------------------------------- +// CStunUdpMediaTest::~CStunUdpMediaTest +// Destructor. +// --------------------------------------------------------------------------- +// +CStunUdpMediaTest::~CStunUdpMediaTest() + { + delete iMccInterface; + delete iDomain; + iNat.CloseStreamL( iSessionId, iStreamId ); + iNat.CloseSessionL( iSessionId ); + } + + +// --------------------------------------------------------------------------- +// CStunUdpMediaTest::PrintLocalAddressL +// --------------------------------------------------------------------------- +// +void CStunUdpMediaTest::PrintLocalAddressL() + { + RDebug::Print( _L( "CStunUdpMediaTest::PrintLocalAddressL" ) ); + + iConsole.Printf( _L( "Local address resolving started...\n" ) ); + + TInt pluginId; + + CNATFWNatSettingsApi* settings = CNATFWNatSettingsApi::NewLC( iDomain->Des() ); + + iSessionId = iNat.CreateSessionL( iIapId, iDomain->Des() ); + iIfStub.StartActiveSchedulerL(); + + // Load plug in + iNat.LoadPluginL( iSessionId, settings->AvailableNatProtocols(), pluginId); + iIfStub.StartActiveSchedulerL( 20000 ); + CleanupStack::PopAndDestroy( settings ); + + // STREAM + iStreamId = iNat.CreateStreamL( iSessionId, KProtocolInetUdp, KDefaultQos ); + + // Get local IP + iNat.FetchCandidateL( iSessionId, iStreamId, KAfInet ); + iIfStub.StartActiveSchedulerL(); + + TInetAddr localAddr; + TRAPD( err, localAddr = iIfStub.LocalCandidateL().TransportAddr() ); + if ( KErrNone != err ) + { + iNat.CloseStreamL( iSessionId, iStreamId ); + iNat.CloseSessionL( iSessionId ); + User::Leave( err ); + } + + TBuf<40> buffer; + localAddr.Output( buffer ); + _LIT( KPrintLocalAddFormat, "\nLOCAL ADDRESS: %S PORT: %d\n"); + + RDebug::Print( KPrintLocalAddFormat, &buffer, localAddr.Port() ); + iConsole.Printf( KPrintLocalAddFormat, &buffer, localAddr.Port() ); + } + + +// --------------------------------------------------------------------------- +// CStunUdpMediaTest::GetLocalAddressL +// --------------------------------------------------------------------------- +// +TInt CStunUdpMediaTest::GetLocalAddress( TInetAddr& localAddr ) + { + RDebug::Print( _L( "CStunUdpMediaTest::GetLocalAddress" ) ); + + CNATFWCandidate* localCandidate = NULL; + + TRAPD( err, localCandidate = &iIfStub.LocalCandidateL() ) + if ( KErrNone == err ) + { + localAddr.SetAddress( localCandidate->TransportAddr().Address() ); + localAddr.SetPort( localCandidate->TransportAddr().Port() ); + return KErrNone; + } + return err; + } + + +// --------------------------------------------------------------------------- +// CStunUdpMediaTest::TestUdpAudioL +// --------------------------------------------------------------------------- +// +void CStunUdpMediaTest::TestUdpAudioStreamingL() + { + TUint sessionId( 0 ); + TUint streamId( 0 ); + TInt pluginId; + + // UDP SESSIO + RDebug::Print( _L("CStunUdpMediaTest::TestUdpAudioL - start") ); + + iSessionId = iNat.CreateSessionL( iIapId, iDomain->Des() ); + sessionId = iSessionId; + iIfStub.StartActiveSchedulerL(); + + // load plug-in + CNATFWNatSettingsApi* settings = CNATFWNatSettingsApi::NewLC( iDomain->Des() ); + iNat.LoadPluginL( iSessionId, settings->AvailableNatProtocols(), pluginId ); + iIfStub.StartActiveSchedulerL( 20000 ); + CleanupStack::PopAndDestroy( settings ); + + // STREAM + streamId = iNat.CreateStreamL( sessionId, KProtocolInetUdp, KDefaultQos ); + iStreamId = streamId; + // Get local IP that receives media + iNat.FetchCandidateL( sessionId, streamId, KAfInet ); + iIfStub.StartActiveSchedulerL(); + + __NATFWTESTCONSOLE_ADDRLOG( "CStunUdpMediaTest::TestUdpAudioL- LOCAL ADDRESS: ", iReceiveMediaAddress ) + + // WRAPPER + MNATFWSocketMediaConnWrapper& mediaWrapper = + iNat.CreateWrapperL( sessionId, streamId ); + + TInetAddr destinationAddress; + mediaWrapper.OutgoingAddr( destinationAddress ); + + __NATFWTESTCONSOLE_ADDRLOG( "CStunUdpMediaTest::TestUdpAudioL- Wrapper LOCAL ADDRESS: ", destinationAddress ) + + // NET settings value + iNetsettings.iRemoteAddress.SetAddress( destinationAddress.Address() ); + iNetsettings.iRemoteAddress.SetPort( destinationAddress.Port() ); + iNetsettings.iRemoteRtcpPort = KDefaultRtcpPort; + + iNetsettings.iLocalAddress.SetAddress( KInetAddrAny ); + iNetsettings.iLocalAddress.SetPort( KDefaultRtpPort ); + + iNetsettings.iLocalPublicAddress.SetAddress( KInetAddrAny ); + iNetsettings.iLocalRtcpPort = KDefaultRtcpPort; + iNetsettings.iLocalPublicRtcpPort = KDefaultRtcpPort; + iNetsettings.iMediaQosValue = KDefaultMediaQos; + iNetsettings.iIapId = iIapId; + + TUint32 sessionId1; + iMccInterface = CMccInterface::NewL( iIfStub ); + User::LeaveIfError( iMccInterface->CreateSession( sessionId1 ) ); + + // Create MCC LINK + TUint32 linkId; + User::LeaveIfError( iMccInterface->CreateLink( sessionId1, KMccLinkGeneral, linkId, iNetsettings ) ); + + CActiveScheduler::Start(); + + iNetsettings.iRemoteAddress.SetAddress( destinationAddress.Address() ); + iNetsettings.iRemoteAddress.SetPort( destinationAddress.Port() ); + + __NATFWTESTCONSOLE_ADDRLOG( "CStunUdpMediaTest::TestUdpAudioL- iNetsettings.iRemoteAddress: ", iIfStub.NetSettings().iRemoteAddress ) + __NATFWTESTCONSOLE_ADDRLOG( "CStunUdpMediaTest::TestUdpAudioL- iNetsettings.iLocalAddress: ", iIfStub.NetSettings().iLocalAddress ) + + User::LeaveIfError( iMccInterface->SetRemoteAddress( sessionId1, linkId, iNetsettings.iRemoteAddress ) ); + __NATFWTESTCONSOLE_ADDRLOG( "CStunUdpMediaTest::TestUdpAudioL- iNetsettings.iLocalAddress: ", iIfStub.NetSettings().iLocalAddress) + + + RPointerArray codecArray; + CleanupResetAndDestroy< RPointerArray >::PushL( codecArray ); + User::LeaveIfError( iMccInterface->GetCapabilities( codecArray ) ); + + + // Create upstream + TUint32 upStream; + TUint32 dataSinkId1; + TUint32 dataSourceId1; + User::LeaveIfError( iMccInterface->AddDataSink( KMccRtpSinkUid, KNullDesC8, dataSinkId1 ) ); + User::LeaveIfError( iMccInterface->AddDataSource( KUidMmfAudioInput, KNullDesC8, dataSourceId1 ) ); + codecArray[0]->SetPriorityPreference( KAudioPrefVoipAudioUplink ); + User::LeaveIfError( iMccInterface->CreateStream( sessionId1, linkId, upStream, + KMccAudioUplinkStream, *codecArray[0] ) ); + + + // Create downstream + TUint32 downStream; + TUint32 dataSinkId2; + TUint32 dataSourceId2; + User::LeaveIfError( iMccInterface->AddDataSink( KUidMmfAudioOutput, KNullDesC8, dataSinkId2 ) ); + User::LeaveIfError( iMccInterface->AddDataSource( KMccRtpSourceUid, KNullDesC8, dataSourceId2 ) ); + codecArray[0]->SetPriorityPreference( KAudioPrefVoipAudioDownlink ); + User::LeaveIfError( iMccInterface->CreateStream( sessionId1, linkId, downStream, + KMccAudioDownlinkStream, *codecArray[0] ) ); + + // Set destination address to wrapper + __NATFWTESTCONSOLE_ADDRLOG( "CStunUdpMediaTest::TestUdpAudioL- iNetsettings.iLocalAddress: ", + iIfStub.NetSettings().iLocalAddress ) + mediaWrapper.SetIncomingAddrL( iIfStub.NetSettings().iLocalAddress); + + mediaWrapper.SetReceivingStateL( EStreamingStateActive ); + mediaWrapper.SetSendingStateL( EStreamingStateActive ); + + TInetAddr destAddr; + if( iDestAddr == 0 ) + { + destAddr.SetAddress( destinationAddress.Address() ); + destAddr.SetPort( 5000 ); + } + else + { + destAddr.SetAddress( iDestAddr ); + destAddr.SetPort( iDestPort ); + } + + //iNat.SetReceivingStateL( iSessionId, KMediaConnection, EStreamingStateActive ); + //iNat.SetSendingStateL( iSessionId, KMediaConnection, destAddr, EStreamingStateActive ); + + + // Prepare and start up and downstream + User::LeaveIfError( iMccInterface->PrepareStream( sessionId1, linkId, downStream ) ); + CActiveScheduler::Start(); + CActiveScheduler::Start(); + + User::LeaveIfError( iMccInterface->PrepareStream( sessionId1, linkId, upStream ) ); + CActiveScheduler::Start(); + CActiveScheduler::Start(); + + iNat.SetReceivingStateL( iIfStub.LocalCandidateL(), EStreamingStateActive ); + iIfStub.StartActiveSchedulerL( KRunningTime ); + + iNat.SetSendingStateL( iIfStub.LocalCandidateL(), + EStreamingStateActive, destAddr ); + iIfStub.StartActiveSchedulerL( KRunningTime ); + + User::LeaveIfError( iMccInterface->StartStream( sessionId1, linkId, downStream ) ); + CActiveScheduler::Start(); + CActiveScheduler::Start(); + + User::LeaveIfError( iMccInterface->StartStream( sessionId1, linkId, upStream ) ); + CActiveScheduler::Start(); + CActiveScheduler::Start(); + + CleanupStack::PopAndDestroy( &codecArray ); + } + + +// --------------------------------------------------------------------------- +// CStunUdpMediaTest::PrepareAudioStreamingL +// --------------------------------------------------------------------------- +// +void CStunUdpMediaTest::PrepareAudioStreamingL() + { + TUint sessionId( 0 ); + TUint streamId( 0 ); + + // UDP SESSIO + RDebug::Print( _L("CStunUdpMediaTest::PrepareAudioStreamingL - start") ); + + //iSessionId = + iNat.CreateSessionL( 6, iDomain->Des() ); + //sessionId = iSessionId; + CActiveScheduler::Start(); + + iSessionId = iNat.CreateSessionL( iIapId, iDomain->Des() ); + sessionId = iSessionId; + iIfStub.StartActiveSchedulerL(); + + // STREAM + streamId = iNat.CreateStreamL( sessionId, KProtocolInetUdp, KDefaultQos ); + iStreamId = streamId; + // Get local IP that receives media + iNat.FetchCandidateL( sessionId, streamId, KAfInet ); + iIfStub.StartActiveSchedulerL(); + + __NATFWTESTCONSOLE_ADDRLOG( "CStunUdpMediaTest::TestUdpAudioL- LOCAL ADDRESS: ", iReceiveMediaAddress ) + + // WRAPPER + MNATFWSocketMediaConnWrapper& mediaWrapper = + iNat.CreateWrapperL( sessionId, streamId ); + + TInetAddr destinationAddress; + mediaWrapper.OutgoingAddr( destinationAddress ); + + __NATFWTESTCONSOLE_ADDRLOG( "CStunUdpMediaTest::TestUdpAudioL- Wrapper LOCAL ADDRESS: ", destinationAddress ) + + // NET settings value + iNetsettings.iRemoteAddress.SetAddress( destinationAddress.Address() ); + iNetsettings.iRemoteAddress.SetPort( destinationAddress.Port() ); + iNetsettings.iRemoteRtcpPort = KDefaultRtcpPort; + + iNetsettings.iLocalAddress.SetAddress( KInetAddrAny ); + iNetsettings.iLocalAddress.SetPort( KDefaultRtpPort ); + + iNetsettings.iLocalPublicAddress.SetAddress( KInetAddrAny ); + iNetsettings.iLocalRtcpPort = KDefaultRtcpPort; + iNetsettings.iLocalPublicRtcpPort = KDefaultRtcpPort; + iNetsettings.iMediaQosValue = KDefaultMediaQos; + iNetsettings.iIapId = iIapId; + + TUint32 sessionId1; + iMccInterface = CMccInterface::NewL( iIfStub ); + User::LeaveIfError( iMccInterface->CreateSession( sessionId1 ) ); + + // Create MCC LINK + TUint32 linkId; + User::LeaveIfError( iMccInterface->CreateLink( sessionId1, KMccLinkGeneral, linkId, iNetsettings ) ); + + CActiveScheduler::Start(); + + iNetsettings.iRemoteAddress.SetAddress( destinationAddress.Address() ); + iNetsettings.iRemoteAddress.SetPort( destinationAddress.Port() ); + + __NATFWTESTCONSOLE_ADDRLOG( "CStunUdpMediaTest::TestUdpAudioL- iNetsettings.iRemoteAddress: ", iIfStub.NetSettings().iRemoteAddress ) + __NATFWTESTCONSOLE_ADDRLOG( "CStunUdpMediaTest::TestUdpAudioL- iNetsettings.iLocalAddress: ", iIfStub.NetSettings().iLocalAddress ) + + User::LeaveIfError( iMccInterface->SetRemoteAddress( sessionId1, linkId, iNetsettings.iRemoteAddress ) ); + __NATFWTESTCONSOLE_ADDRLOG( "CStunUdpMediaTest::TestUdpAudioL- iNetsettings.iLocalAddress: ", iIfStub.NetSettings().iLocalAddress) + + + RPointerArray codecArray; + CleanupResetAndDestroy< RPointerArray >::PushL( codecArray ); + User::LeaveIfError( iMccInterface->GetCapabilities( codecArray ) ); + + + // Create upstream + TUint32 upStream; + TUint32 dataSinkId1; + TUint32 dataSourceId1; + User::LeaveIfError( iMccInterface->AddDataSink( KMccRtpSinkUid, KNullDesC8, dataSinkId1 ) ); + User::LeaveIfError( iMccInterface->AddDataSource( KUidMmfAudioInput, KNullDesC8, dataSourceId1 ) ); + codecArray[0]->SetPriorityPreference( KAudioPrefVoipAudioUplink ); + User::LeaveIfError( iMccInterface->CreateStream( sessionId1, linkId, upStream, + KMccAudioUplinkStream, *codecArray[0] ) ); + + + // Create downstream + TUint32 downStream; + TUint32 dataSinkId2; + TUint32 dataSourceId2; + User::LeaveIfError( iMccInterface->AddDataSink( KUidMmfAudioOutput, KNullDesC8, dataSinkId2 ) ); + User::LeaveIfError( iMccInterface->AddDataSource( KMccRtpSourceUid, KNullDesC8, dataSourceId2 ) ); + codecArray[0]->SetPriorityPreference( KAudioPrefVoipAudioDownlink ); + User::LeaveIfError( iMccInterface->CreateStream( sessionId1, linkId, downStream, + KMccAudioDownlinkStream, *codecArray[0] ) ); + + // Set destination address to wrapper + __NATFWTESTCONSOLE_ADDRLOG( "CStunUdpMediaTest::TestUdpAudioL- iNetsettings.iLocalAddress: ", iIfStub.NetSettings().iLocalAddress ) + mediaWrapper.SetIncomingAddrL( iIfStub.NetSettings().iLocalAddress); + + TInetAddr destAddr; + if( iDestAddr == 0 ) + { + destAddr.SetAddress( destinationAddress.Address() ); + destAddr.SetPort( 5000 ); + } + else + { + destAddr.SetAddress( iDestAddr ); + destAddr.SetPort( iDestPort ); + } + + // Prepare and start up and downstream + User::LeaveIfError( iMccInterface->PrepareStream( sessionId1, linkId, downStream ) ); + CActiveScheduler::Start(); + CActiveScheduler::Start(); + + User::LeaveIfError( iMccInterface->PrepareStream( sessionId1, linkId, upStream ) ); + CActiveScheduler::Start(); + CActiveScheduler::Start(); + + User::LeaveIfError( iMccInterface->StartStream( sessionId1, linkId, downStream ) ); + CActiveScheduler::Start(); + CActiveScheduler::Start(); + + User::LeaveIfError( iMccInterface->StartStream( sessionId1, linkId, upStream ) ); + CActiveScheduler::Start(); + CActiveScheduler::Start(); + /* + iNat.SetReceivingStateL( iSessionId, streamId, EStreamingStateActive ); + iNat.SetSendingStateL( iSessionId, streamId, destAddr, EStreamingStateActive ); + */ + CleanupStack::PopAndDestroy( &codecArray ); + + RDebug::Print( _L("CStunUdpMediaTest::PrepareAudioStreamingL - stop") ); + } +