From: Russell Bryant Date: Mon, 28 Feb 2005 00:30:35 +0000 (+0000) Subject: release RTP ports early on SUBSCRIBE (bug #3655 / #3673) X-Git-Tag: 1.0.11.1~207 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=83e1402d8a3b99384d63056bdf582073aad53b39;p=thirdparty%2Fasterisk.git release RTP ports early on SUBSCRIBE (bug #3655 / #3673) git-svn-id: https://origsvn.digium.com/svn/asterisk/branches/v1-0@5101 65c4cc65-6c06-0410-ace0-fbb531ad65f3 --- diff --git a/CHANGES b/CHANGES index 6c8f96a732..0f754f7bca 100755 --- a/CHANGES +++ b/CHANGES @@ -21,6 +21,8 @@ Asterisk 1.0.6 -- There was a problem incorrectly matching codec availablity when global preferences were different from that of the user. To fix this, processing of SDP data has been moved to after determining who the call is coming from. + -- Asterisk would run out of RTP ports while waiting for SUBSCRIBE's to expire even though + an RTP port isn't needed in this case. This has been fixed by releasing the ports early. -- chan_zap: -- During a certain scenario when using flash and '#' transfers you would hear the other person and the music they were hearing. This has been fixed. diff --git a/channels/chan_sip.c b/channels/chan_sip.c index e0c94e6199..714aea02db 100755 --- a/channels/chan_sip.c +++ b/channels/chan_sip.c @@ -7644,7 +7644,16 @@ static int handle_request(struct sip_pvt *p, struct sip_request *req, struct soc if (p->expiry>max_expiry) { p->expiry = max_expiry; } - } + } + /* Go ahead and free RTP port */ + if (p->rtp) { + ast_rtp_destroy(p->rtp); + p->rtp = NULL; + } + if (p->vrtp) { + ast_rtp_destroy(p->vrtp); + p->vrtp = NULL; + } transmit_response(p, "200 OK", req); sip_scheddestroy(p, (p->expiry+10)*1000); transmit_state_notify(p, ast_extension_state(NULL, p->context, p->exten),1); @@ -7671,6 +7680,15 @@ static int handle_request(struct sip_pvt *p, struct sip_request *req, struct soc if ((res = register_verify(p, sin, req, e, ignore)) < 0) ast_log(LOG_NOTICE, "Registration from '%s' failed for '%s'\n", get_header(req, "To"), ast_inet_ntoa(iabuf, sizeof(iabuf), sin->sin_addr)); if (res < 1) { + /* Go ahead and free RTP port */ + if (p->rtp) { + ast_rtp_destroy(p->rtp); + p->rtp = NULL; + } + if (p->vrtp) { + ast_rtp_destroy(p->vrtp); + p->vrtp = NULL; + } /* Destroy the session, but keep us around for just a bit in case they don't get our 200 OK */ sip_scheddestroy(p, 15*1000);