--- /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 <e32debug.h>
+#include "natfwconnectivityapidefs.h"
+#include "natfwconnectivityapi.h"
+#include <mmccinterface.h>
+#include <mmcccodecinformation.h>
+#include "mnatfwsocketmediaconnwrapper.h"
+#include "natfwcandidate.h"
+#include "natfwcandidatepair.h"
+
+#include "mediateststubs.h"
+#include "stunudpmediatest.h"
+#include "testdefinitions.hrh"
+#include "natfwtestconsolelogs.h"
+#include <cnatfwsettingsapi.h>
+
+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<CMccCodecInformation> codecArray;
+ CleanupResetAndDestroy< RPointerArray<CMccCodecInformation> >::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<CMccCodecInformation> codecArray;
+ CleanupResetAndDestroy< RPointerArray<CMccCodecInformation> >::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") );
+ }
+