Hi Robert,
I just fixed the issue. It is now in git (sha=3627781). Thx for reporting!
-Raphael.
On 01.10.2012, at 18:00, Szokovacs Robert wrote:
> Hi,
>
> I have discovered a bug in sems 1.5.0 and I need some help in fixing it:
> in AmRtpStream.cpp, there is a comment before setLocalIP
>
> /*
> * This function must be called before setLocalPort, because
> * setLocalPort will bind the socket and it will be not
> * possible to change the IP later
> */
> void AmRtpStream::setLocalIP(const string& ip)
>
> however, if I put a debug message in it, I get this:
> 2012-10-01 15:38:33.978451500 [#b5df4bb0/4750] [setLocalPort,
> AmRtpStream.cpp:180] DEBUG: added stream [0xb6a99008] to RTP receiver
> (0.0.0.0:10006)
> 2012-10-01 15:38:33.979488500 [#b5df4bb0/4750] [setLocalIP,
> AmRtpStream.cpp:84] DEBUG: XX.XX.XX.XX
> This is wrong, of course, and if there is IP alias used, the outgoing packet
> will go from the first IP of the interface, which is may or may not the same
> as media_ip, which is specified in the SDP.
>
> The wrong order is because the OfferAnswer module calls them in that order:
>
> #0 AmRtpStream::setLocalPort (this=0xb7475008) at AmRtpStream.cpp:181
> #1 0x081162b9 in AmRtpStream::getLocalPort (this=0xb7475008) at
> AmRtpStream.cpp:410
> #2 0x081162f8 in AmRtpStream::getSdp (this=0xb7475008, m=@0x82ae3b0)
> at AmRtpStream.cpp:504
> #3 0x08116362 in AmRtpStream::getSdpAnswer (this=0xb7475008, index=0,
> offer=@0x82c0290, answer=@0x82ae3b0) at AmRtpStream.cpp:523
> #4 0x0810c2b8 in AmRtpAudio::getSdpAnswer (this=0xb7475008, index=0,
> offer=@0x82c0290,
> answer=@0x82ae3b0) at AmRtpAudio.cpp:315
> #5 0x0813b6c1 in AmSession::getSdpAnswer (this=0x82b04f8, offer=@0x82b0a18,
> answer=@0x82b0afc) at AmSession.cpp:1000
> #6 0x08141475 in AmSipDialog::getSdpAnswer (this=0x82b07fc, offer=@0x82b0a18,
> answer=@0x82b0afc) at AmSipDialog.cpp:266
> #7 0x080f1c2f in AmOfferAnswer::getSdpBody (this=0x81fb7d8,
> sdp_body=@0xb60e9554)
> at AmOfferAnswer.cpp:442
> #8 0x080f39f1 in AmOfferAnswer::onReplyOut (this=0x82b0a0c,
> reply=@0xb60e9e08)
> at AmOfferAnswer.cpp:366
> #9 0x0814c9d8 in AmSipDialog::reply (this=0x82b07fc, t=@0xb60e9eec, code=200,
> reason=@0xb60e9f40, body=0x0, hdrs=@0xb60e9f3c, flags=0) at
> AmSipDialog.cpp:779
> #10 0x0814dc69 in AmSipDialog::reply (this=0x82b07fc, req=@0x82bf264,
> code=200,
> reason=@0xb60e9f40, body=0x0, hdrs=@0xb60e9f3c, flags=0) at
> AmSipDialog.cpp:730
> #11 0x0813c006 in AmSession::onInvite (this=0x82b04f8, req=@0x82bf264)
> at AmSession.cpp:891
>
> and later:
>
> #0 AmRtpStream::setLocalIP (this=0xb7475008, ip=@0x82b0b80) at
> AmRtpStream.cpp:84
> #1 0x08116ed7 in AmRtpStream::init (this=0xb7475008, local=@0x82b0afc,
> remote=@0x82b0a18, force_passive_mode=false) at AmRtpStream.cpp:628
> #2 0x0810df84 in AmRtpAudio::init (this=0xb7475008, local=@0x82b0afc,
> remote=@0x82b0a18, force_symmetric_rtp=false) at AmRtpAudio.cpp:322
> #3 0x08139e79 in AmSession::onSdpCompleted (this=0x82b04f8,
> local_sdp=@0x82b0afc,
> remote_sdp=@0x82b0a18) at AmSession.cpp:1075
> #4 0x08146cf6 in AmSipDialog::onSdpCompleted (this=0x82b07fc) at
> AmSipDialog.cpp:237
> #5 0x080f28f5 in AmOfferAnswer::checkStateChange (this=0xb7475008)
> at AmOfferAnswer.cpp:96
> #6 0x080f292b in AmOfferAnswer::onReplySent (this=0x82b0a0c,
> reply=@0xb60e9e08)
> at AmOfferAnswer.cpp:411
> #7 0x0814cf3f in AmSipDialog::reply (this=0x82b07fc, t=@0xb60e9eec, code=200,
> reason=@0xb60e9f40, body=0x0, hdrs=@0xb60e9f3c, flags=0) at
> AmSipDialog.cpp:809
> #8 0x0814dc69 in AmSipDialog::reply (this=0x82b07fc, req=@0x82bf264,
> code=200,
> reason=@0xb60e9f40, body=0x0, hdrs=@0xb60e9f3c, flags=0) at
> AmSipDialog.cpp:730
> #9 0x0813c006 in AmSession::onInvite (this=0x82b04f8, req=@0x82bf264)
> at AmSession.cpp:891
>
> As you can see, the AmOfferAnswer::onReplyOut is the offending code that ends
> up calling setLocalPort, while the setLocalIP is trigged only by
> AmOfferAnswer::onReplySent.
>
> In AmSession::getSdpAnswer we already have the IP, so around there we should
> let the AmRtpStream know.
>
> In the incoming invite case maybe
>
> --- AmSession.cpp (revision 17833)
> +++ AmSession.cpp (working copy)
> @@ -997,6 +997,7 @@
> && audio_1st_stream
> && (m_it->port != 0) ) {
>
> + RTPStream()->setLocalIP(answer.conn.address);
> RTPStream()->getSdpAnswer(media_index,*m_it,answer_media);
> if(answer_media.payloads.empty() ||
> ((answer_media.payloads.size() == 1) &&
>
> is enough but I don't know about the other direction, and the setLocalIP in
> the ::init() is clearly useless, so please someone with broader oversight fix
> this for me :)
>
> br
>
> Szo
> _______________________________________________
> Semsdev mailing list
> [email protected]
> http://lists.iptel.org/mailman/listinfo/semsdev
_______________________________________________
Semsdev mailing list
[email protected]
http://lists.iptel.org/mailman/listinfo/semsdev