[asterisk-commits] rizzo: branch rizzo/astobj2 r47739 -
/team/rizzo/astobj2/channels/chan_sip.c
asterisk-commits at lists.digium.com
asterisk-commits at lists.digium.com
Thu Nov 16 08:33:26 MST 2006
Author: rizzo
Date: Thu Nov 16 09:33:26 2006
New Revision: 47739
URL: http://svn.digium.com/view/asterisk?view=rev&rev=47739
Log:
update to version in trunk - rev 47719
Modified:
team/rizzo/astobj2/channels/chan_sip.c
Modified: team/rizzo/astobj2/channels/chan_sip.c
URL: http://svn.digium.com/view/asterisk/team/rizzo/astobj2/channels/chan_sip.c?view=diff&rev=47739&r1=47738&r2=47739
==============================================================================
--- team/rizzo/astobj2/channels/chan_sip.c (original)
+++ team/rizzo/astobj2/channels/chan_sip.c Thu Nov 16 09:33:26 2006
@@ -1720,14 +1720,17 @@
a dialog */
static void initialize_initreq(struct sip_pvt *p, struct sip_request *req)
{
- if (p->initreq.headers && option_debug) {
- ast_log(LOG_DEBUG, "Initializing already initialized SIP dialog %s (presumably reinvite)\n", p->callid);
+ if (option_debug) {
+ if (p->initreq.headers)
+ ast_log(LOG_DEBUG, "Initializing already initialized SIP dialog %s (presumably reinvite)\n", p->callid);
+ else
+ ast_log(LOG_DEBUG, "Initializing initreq for method %s - callid %s\n", sip_methods[req->method].text, p->callid);
}
/* Use this as the basis */
copy_request(&p->initreq, req);
parse_request(&p->initreq);
if (ast_test_flag(req, SIP_PKT_DEBUG))
- ast_verbose("%d headers, %d lines\n", p->initreq.headers, p->initreq.lines);
+ ast_verbose("Initreq: %d headers, %d lines\n", p->initreq.headers, p->initreq.lines);
}
@@ -2050,12 +2053,12 @@
if (cur == pkt) {
UNLINK(cur, pvt->packets, prev);
pkt->pvt = pvt_unref(pvt); /* release the reference pvt */
- free(cur);
- break;
- }
- }
- if (!cur)
- ast_log(LOG_WARNING, "Weird, couldn't find packet owner!\n");
+ sip_pvt_unlock(pvt);
+ free(pkt);
+ return 0;
+ }
+ }
+ ast_log(LOG_WARNING, "Weird, couldn't find packet owner!\n");
sip_pvt_unlock(pvt);
return 0;
}
@@ -2571,9 +2574,11 @@
ast_free_ha(peer->ha);
if (ast_test_flag(&peer->flags[1], SIP_PAGE2_SELFDESTRUCT))
apeerobjs--;
- else if (ast_test_flag(&peer->flags[0], SIP_REALTIME))
+ else if (ast_test_flag(&peer->flags[0], SIP_REALTIME)) {
rpeerobjs--;
- else
+ if (option_debug > 2)
+ ast_log(LOG_DEBUG,"-REALTIME- peer Destroyed. Name: %s. Realtime Peer objects: %d\n", peer->name, rpeerobjs);
+ } else
speerobjs--;
clear_realm_authentication(peer->auth);
peer->auth = NULL;
@@ -2641,6 +2646,9 @@
ast_variables_destroy(var);
return NULL;
}
+
+ if (option_debug > 2)
+ ast_log(LOG_DEBUG,"-REALTIME- loading peer from database to memory. Name: %s. Peer objects: %d\n", peer->name, rpeerobjs);
if (ast_test_flag(&global_flags[1], SIP_PAGE2_RTCACHEFRIENDS)) {
/* Cache peer */
@@ -2797,7 +2805,7 @@
ast_copy_flags(&dialog->flags[0], &peer->flags[0], SIP_FLAGS_TO_COPY);
ast_copy_flags(&dialog->flags[1], &peer->flags[1], SIP_PAGE2_FLAGS_TO_COPY);
dialog->capability = peer->capability;
- if (!ast_test_flag(&dialog->flags[1], SIP_PAGE2_VIDEOSUPPORT) && dialog->vrtp) {
+ if ((!ast_test_flag(&dialog->flags[1], SIP_PAGE2_VIDEOSUPPORT) || !(dialog->capability & AST_FORMAT_VIDEO_MASK)) && dialog->vrtp) {
ast_rtp_destroy(dialog->vrtp);
dialog->vrtp = NULL;
}
@@ -4577,6 +4585,19 @@
if (option_debug > 4 )
ast_log(LOG_DEBUG, "= Looking for Call ID: %s (Checking %s) --From tag %s --To-tag %s \n", callid, req->method==SIP_RESPONSE ? "To" : "From", fromtag, totag);
+
+ /* All messages must always have From: tag */
+ if (ast_strlen_zero(fromtag)) {
+ if (option_debug > 4 )
+ ast_log(LOG_DEBUG, "%s request has no from tag, dropping callid: %s from: %s\n", sip_methods[req->method].text , callid, from );
+ return NULL;
+ }
+ /* reject requests that must always have a To: tag */
+ if (ast_strlen_zero(totag) && (req->method == SIP_ACK || req->method == SIP_BYE || req->method == SIP_INFO )) {
+ if (option_debug > 4)
+ ast_log(LOG_DEBUG, "%s must have a to tag. dropping callid: %s from: %s\n", sip_methods[req->method].text , callid, from );
+ return NULL;
+ }
}
#ifdef USE_AO2
@@ -4610,9 +4631,22 @@
transmit_response_using_temp(callid, sin, 1, intended_method, req, "489 Bad event");
} else {
/* Ok, time to create a new SIP dialog object, a pvt */
- if ((p = sip_alloc(callid, sin, 1, intended_method)))
+ if ((p = sip_alloc(callid, sin, 1, intended_method))) {
/* Ok, we've created a dialog, let's go and process it */
sip_pvt_lock(p);
+ } else {
+ /* We have a memory or file/socket error (can't allocate RTP sockets or something) so we're not
+ getting a dialog from sip_alloc.
+
+ Without a dialog we can't retransmit and handle ACKs and all that, but at least
+ send an error message.
+
+ Sorry, we apologize for the inconvienience
+ */
+ transmit_response_using_temp(callid, sin, 1, intended_method, req, "500 Server internal error");
+ if (option_debug > 3)
+ ast_log(LOG_DEBUG, "Failed allocating SIP dialog, sending 500 Server internal error and giving up\n");
+ }
}
return p; /* can be NULL */
} else if( sip_methods[intended_method].can_create == CAN_CREATE_DIALOG_UNSUPPORTED_METHOD) {
@@ -4996,7 +5030,8 @@
ast_verbose("Found RTP video format %d\n", codec);
ast_rtp_set_m_type(newvideortp, codec);
}
- } else if (p->udptl && ((sscanf(m, "image %d udptl t38%n", &x, &len) == 1))) {
+ } else if (p->udptl && ( (sscanf(m, "image %d udptl t38%n", &x, &len) == 1) ||
+ (sscanf(m, "image %d UDPTL t38%n", &x, &len) == 1) )) {
if (debug)
ast_verbose("Got T.38 offer in SDP in dialog %s\n", p->callid);
udptlportno = x;
@@ -5048,22 +5083,6 @@
memcpy(&sin.sin_addr, hp->h_addr, sizeof(sin.sin_addr));
if (vhp)
memcpy(&vsin.sin_addr, vhp->h_addr, sizeof(vsin.sin_addr));
-
- if (p->rtp) {
- if (portno > 0) {
- sin.sin_port = htons(portno);
- ast_rtp_set_peer(p->rtp, &sin);
- if (debug)
- ast_verbose("Peer audio RTP is at port %s:%d\n", ast_inet_ntoa(sin.sin_addr), ntohs(sin.sin_port));
- } else {
- ast_rtp_stop(p->rtp);
- if (debug)
- ast_verbose("Peer doesn't provide audio\n");
- }
- }
- /* Setup video port number */
- if (vportno != -1)
- vsin.sin_port = htons(vportno);
/* Setup UDPTL port number */
if (p->udptl) {
@@ -5078,6 +5097,27 @@
ast_log(LOG_DEBUG, "Peer doesn't provide T.38 UDPTL\n");
}
}
+
+ if (p->rtp) {
+ if (portno > 0) {
+ sin.sin_port = htons(portno);
+ ast_rtp_set_peer(p->rtp, &sin);
+ if (debug)
+ ast_verbose("Peer audio RTP is at port %s:%d\n", ast_inet_ntoa(sin.sin_addr), ntohs(sin.sin_port));
+ } else {
+ if (udptlportno > 0) {
+ if (debug)
+ ast_verbose("Got T.38 Re-invite without audio. Keeping RTP active during T.38 session. Callid %s\n", p->callid);
+ } else {
+ ast_rtp_stop(p->rtp);
+ if (debug)
+ ast_verbose("Peer doesn't provide audio. Callid %s\n", p->callid);
+ }
+ }
+ }
+ /* Setup video port number */
+ if (vportno != -1)
+ vsin.sin_port = htons(vportno);
/* Next, scan through each "a=rtpmap:" line, noting each
* specified RTP payload type (with corresponding MIME subtype):
@@ -5117,10 +5157,6 @@
if (debug)
ast_verbose("Got unsupported a:crypto in SDP offer \n");
breakout = TRUE;
- } else if (!strncasecmp(a, "ptime:", (size_t) 6)) {
- if (debug)
- ast_verbose("Got unsupported a:ptime in SDP offer \n");
- breakout = TRUE;
}
if (breakout) /* We have a match, skip to next header */
continue;
@@ -5147,7 +5183,7 @@
}
}
if (framing && last_rtpmap_codec) {
- if (p->autoframing || global_autoframing) {
+ if (p->autoframing) {
struct ast_codec_pref *pref = ast_rtp_codec_getpref(p->rtp);
int codec_n;
int format = 0;
@@ -6024,6 +6060,7 @@
respprep(&resp, p, msg, req);
add_header(&resp, header, tmp);
add_header_contentLength(&resp, 0);
+ append_history(p, "AuthChal", "Auth challenge sent for %s - nc %d", p->username, p->noncecount);
return send_response(p, &resp, reliable, seqno);
}
@@ -7729,6 +7766,9 @@
/* Do we need to release this peer from memory?
Only for realtime peers and autocreated peers
*/
+ if (option_debug > 2 && ast_test_flag(&peer->flags[0], SIP_REALTIME))
+ ast_log(LOG_DEBUG,"-REALTIME- peer expired registration. Name: %s. Realtime peer objects now %d\n", peer->name, rpeerobjs);
+
if (ast_test_flag(&peer->flags[1], SIP_PAGE2_SELFDESTRUCT) ||
ast_test_flag(&peer->flags[1], SIP_PAGE2_RTAUTOCLEAR)) {
peer = ASTOBJ_CONTAINER_UNLINK(&peerl, peer); /* Remove from peer list */
@@ -8276,19 +8316,21 @@
if (sipdebug)
ast_log(LOG_NOTICE, "Correct auth, but based on stale nonce received from '%s'\n", get_header(req, "To"));
/* We got working auth token, based on stale nonce . */
- transmit_response_with_auth(p, response, req, p->randdata, reliable, respheader, 1);
+ transmit_response_with_auth(p, response, req, p->randdata, reliable, respheader, TRUE);
} else {
/* Everything was wrong, so give the device one more try with a new challenge */
if (sipdebug)
ast_log(LOG_NOTICE, "Bad authentication received from '%s'\n", get_header(req, "To"));
- transmit_response_with_auth(p, response, req, p->randdata, reliable, respheader, 0);
+ transmit_response_with_auth(p, response, req, p->randdata, reliable, respheader, FALSE);
}
sip_scheddestroy(p, DEFAULT_TRANS_TIMEOUT);
return AUTH_CHALLENGE_SENT;
}
- if (good_response)
+ if (good_response) {
+ append_history(p, "AuthOK", "Auth challenge succesful for %s", username);
return AUTH_SUCCESSFUL;
+ }
/* Ok, we have a bad username/secret pair */
/* Challenge again, and again, and again */
@@ -9278,7 +9320,7 @@
p->t38.jointcapability &= p->t38.peercapability;
p->maxcallbitrate = user->maxcallbitrate;
/* If we do not support video, remove video from call structure */
- if (!ast_test_flag(&p->flags[1], SIP_PAGE2_VIDEOSUPPORT) && p->vrtp) {
+ if ((!ast_test_flag(&p->flags[1], SIP_PAGE2_VIDEOSUPPORT) || !(p->capability & AST_FORMAT_VIDEO_MASK)) && p->vrtp) {
ast_rtp_destroy(p->vrtp);
p->vrtp = NULL;
}
@@ -9397,7 +9439,7 @@
if (p->peercapability)
p->jointcapability &= p->peercapability;
p->maxcallbitrate = peer->maxcallbitrate;
- if (!ast_test_flag(&p->flags[1], SIP_PAGE2_VIDEOSUPPORT) && p->vrtp) {
+ if ((!ast_test_flag(&p->flags[1], SIP_PAGE2_VIDEOSUPPORT) || !(p->capability & AST_FORMAT_VIDEO_MASK)) && p->vrtp) {
ast_rtp_destroy(p->vrtp);
p->vrtp = NULL;
}
@@ -10302,7 +10344,7 @@
print_group(fd, peer->pickupgroup, 0);
ast_cli(fd, " Mailbox : %s\n", peer->mailbox);
ast_cli(fd, " VM Extension : %s\n", peer->vmexten);
- ast_cli(fd, " LastMsgsSent : %d\n", peer->lastmsgssent);
+ ast_cli(fd, " LastMsgsSent : %d/%d\n", (peer->lastmsgssent & 0x7fff0000) >> 16, peer->lastmsgssent & 0xffff);
ast_cli(fd, " Call limit : %d\n", peer->call_limit);
ast_cli(fd, " Dynamic : %s\n", (ast_test_flag(&peer->flags[1], SIP_PAGE2_DYNAMIC)?"Yes":"No"));
ast_cli(fd, " Callerid : %s\n", ast_callerid_merge(cbuf, sizeof(cbuf), peer->cid_name, peer->cid_num, "<unspecified>"));
@@ -10355,6 +10397,7 @@
print_codec_to_cli(fd, &peer->prefs);
ast_cli(fd, ")\n");
+ ast_cli(fd, " Auto-Framing: %s \n", peer->autoframing ? "Yes" : "No");
ast_cli(fd, " Status : ");
peer_status(peer, status, sizeof(status));
ast_cli(fd, "%s\n",status);
@@ -10489,6 +10532,7 @@
print_codec_to_cli(fd, &user->prefs);
ast_cli(fd, ")\n");
+ ast_cli(fd, " Auto-Framing: %s \n", user->autoframing ? "Yes" : "No");
if (user->chanvars) {
ast_cli(fd, " Variables :\n");
for (v = user->chanvars ; v ; v = v->next)
@@ -10611,6 +10655,7 @@
ast_cli(fd, " Notify ringing state: %s\n", global_notifyringing ? "Yes" : "No");
ast_cli(fd, " SIP Transfer mode: %s\n", transfermode2str(global_allowtransfer));
ast_cli(fd, " Max Call Bitrate: %d kbps\r\n", default_maxcallbitrate);
+ ast_cli(fd, " Auto-Framing: %s \r\n", global_autoframing ? "Yes" : "No");
ast_cli(fd, "\nDefault Settings:\n");
ast_cli(fd, "-----------------\n");
ast_cli(fd, " Context: %s\n", default_context);
@@ -11533,6 +11578,8 @@
snprintf(digest, digest_len, "Digest username=\"%s\", realm=\"%s\", algorithm=MD5, uri=\"%s\", nonce=\"%s\", response=\"%s\", opaque=\"%s\", qop=auth, cnonce=\"%s\", nc=%08x", username, p->realm, uri, p->nonce, resp_hash, p->opaque, cnonce, p->noncecount);
else
snprintf(digest, digest_len, "Digest username=\"%s\", realm=\"%s\", algorithm=MD5, uri=\"%s\", nonce=\"%s\", response=\"%s\", opaque=\"%s\"", username, p->realm, uri, p->nonce, resp_hash, p->opaque);
+
+ append_history(p, "AuthResp", "Auth response sent for %s in realm %s - nc %d", username, p->realm, p->noncecount);
return 0;
}
@@ -13579,16 +13626,22 @@
if (req_ignore(req)) {
ast_verbose("Ignoring this INVITE request\n");
} else {
+ int newcall = (p->initreq.headers ? TRUE : FALSE);
+
sip_cancel_destroy(p);
/* This also counts as a pending invite */
p->pendinginvite = seqno;
check_via(p, req);
copy_request(&p->initreq, req); /* Save this INVITE as the transaction basis */
+ if (sipdebug && option_debug)
+ ast_log(LOG_DEBUG, "Initializing initreq for method %s - callid %s\n", sip_methods[req->method].text, p->callid);
if (!p->owner) { /* Not a re-invite */
if (debug)
ast_verbose("Using INVITE request as basis request - %s\n", p->callid);
append_history(p, "Invite", "New call: %s", p->callid);
+ if (newcall)
+ append_history(p, "Invite", "New call: %s", p->callid);
parse_ok_contact(p, req);
} else { /* Re-invite on existing call */
ast_clear_flag(&p->flags[0], SIP_OUTGOING); /* This is now an inbound dialog */
@@ -13824,7 +13877,6 @@
transmit_response(p, "488 Not acceptable here", req);
else
transmit_response_reliable(p, "488 Not acceptable here", req);
- sip_scheddestroy(p, DEFAULT_TRANS_TIMEOUT);
}
} else {
/* The other side is already setup for T.38 most likely so we need to acknowledge this too */
@@ -13842,7 +13894,9 @@
p->t38.state = T38_DISABLED;
if (option_debug > 1)
ast_log(LOG_DEBUG,"T38 state changed to %d on channel %s\n", p->t38.state, p->owner ? p->owner->name : "<none>");
- sip_scheddestroy(p, DEFAULT_TRANS_TIMEOUT);
+
+ if (!p->lastinvite) /* Only destroy if this is *not* a re-invite */
+ sip_scheddestroy(p, DEFAULT_TRANS_TIMEOUT);
}
} else {
/* we are not bridged in a call */
@@ -13869,7 +13923,6 @@
transmit_response(p, "488 Not Acceptable Here (unsupported)", req);
else
transmit_response_reliable(p, "488 Not Acceptable Here (unsupported)", req);
- sip_scheddestroy(p, DEFAULT_TRANS_TIMEOUT);
sendok = FALSE;
}
/* No bridged peer with T38 enabled*/
@@ -14386,11 +14439,15 @@
struct ast_channel *c=NULL;
int res;
struct ast_channel *bridged_to;
-
- if (p->pendinginvite && !ast_test_flag(&p->flags[0], SIP_OUTGOING) && !req_ignore(req))
+
+ /* If we have an INCOMING invite that we haven't answered, terminate that transaction */
+ if (p->pendinginvite && !ast_test_flag(&p->flags[0], SIP_OUTGOING) && !req_ignore(req) && !p->owner)
transmit_response_reliable(p, "487 Request Terminated", &p->initreq);
copy_request(&p->initreq, req);
+
+ if (sipdebug && option_debug)
+ ast_log(LOG_DEBUG, "Initializing initreq for method %s - callid %s\n", sip_methods[req->method].text, p->callid);
check_via(p, req);
ast_set_flag(&p->flags[0], SIP_ALREADYGONE);
@@ -14510,6 +14567,8 @@
ast_verbose("Creating new subscription\n");
copy_request(&p->initreq, req);
+ if (option_debug > 3 && sipdebug)
+ ast_log(LOG_DEBUG, "Initializing initreq for method %s - callid %s\n", sip_methods[req->method].text, p->callid);
check_via(p, req);
} else if (ast_test_flag(req, SIP_PKT_DEBUG) && req_ignore(req))
ast_verbose("Ignoring this SUBSCRIBE request\n");
@@ -14773,9 +14832,9 @@
enum check_auth_result res;
/* Use this as the basis */
- if (ast_test_flag(req, SIP_PKT_DEBUG))
- ast_verbose("Using latest REGISTER request as basis request\n");
copy_request(&p->initreq, req);
+ if (option_debug > 3 && sipdebug)
+ ast_log(LOG_DEBUG, "Initializing initreq for method %s - callid %s\n", sip_methods[req->method].text, p->callid);
check_via(p, req);
if ((res = register_verify(p, sin, req, e)) < 0) {
const char *reason = "";
@@ -14942,6 +15001,9 @@
} else if (req->method != SIP_ACK) {
transmit_response(p, "481 Call/Transaction Does Not Exist", req);
sip_scheddestroy(p, DEFAULT_TRANS_TIMEOUT);
+ } else {
+ if (option_debug)
+ ast_log(LOG_DEBUG, "Got ACK for unknown dialog... strange.\n");
}
return res;
}
@@ -15090,7 +15152,8 @@
/* we cannot trust p, we have no reference */
ast_log(LOG_ERROR, "We could NOT get the channel lock, SIP transaction failed: %s\n",
get_header(&req, "Call-ID"));
- transmit_response(p, "503 Server error", &req); /* We must respond according to RFC 3261 sec 12.2 */
+ if (req.method != SIP_ACK)
+ transmit_response(p, "503 Server error", &req); /* We must respond according to RFC 3261 sec 12.2 */
/* XXX We could add retry-after to make sure they come back */
return 1;
}
@@ -15129,12 +15192,12 @@
peer->lastmsgcheck = time(NULL);
/* Return now if it's the same thing we told them last time */
- if (((newmsgs << 8) | (oldmsgs)) == peer->lastmsgssent) {
+ if (((newmsgs > 0x7fff ? 0x7fff0000 : (newmsgs << 16)) | (oldmsgs > 0xffff ? 0xffff : oldmsgs)) == peer->lastmsgssent) {
return 0;
}
- peer->lastmsgssent = ((newmsgs << 8) | (oldmsgs));
+ peer->lastmsgssent = ((newmsgs > 0x7fff ? 0x7fff0000 : (newmsgs << 16)) | (oldmsgs > 0xffff ? 0xffff : oldmsgs));
if (peer->mwi_pvt) {
/* Base message on subscription */
@@ -15481,6 +15544,9 @@
- registered, no call AST_DEVICE_NOT_INUSE
- registered, active calls AST_DEVICE_INUSE
- registered, call limit reached AST_DEVICE_BUSY
+ - registered, onhold AST_DEVICE_ONHOLD
+ - registered, ringing AST_DEVICE_RINGING
+
For peers without call limit:
- not registered AST_DEVICE_UNAVAILABLE
- registered AST_DEVICE_NOT_INUSE
@@ -16017,6 +16083,7 @@
user->capability = global_capability;
user->allowtransfer = global_allowtransfer;
user->maxcallbitrate = default_maxcallbitrate;
+ user->autoframing = global_autoframing;
user->prefs = default_prefs;
/* set default context */
strcpy(user->context, default_context);
@@ -16101,6 +16168,7 @@
peer->rtpholdtimeout = global_rtpholdtimeout;
peer->rtpkeepalive = global_rtpkeepalive;
peer->allowtransfer = global_allowtransfer;
+ peer->autoframing = global_autoframing;
strcpy(peer->vmexten, default_vmexten);
peer->secret[0] = '\0';
peer->md5secret[0] = '\0';
@@ -16170,9 +16238,11 @@
if (!(peer = ast_calloc(1, sizeof(*peer))))
return NULL;
- if (realtime)
+ if (realtime) {
rpeerobjs++;
- else
+ if (option_debug > 2)
+ ast_log(LOG_DEBUG,"-REALTIME- peer built. Name: %s. Peer objects: %d\n", peer->name, rpeerobjs);
+ } else
speerobjs++;
ASTOBJ_INIT(peer);
}
@@ -16874,6 +16944,11 @@
return 0;
}
+/*! \brief Handle T38 reinvite
+ \todo Make sure we don't destroy the call if we can't handle the re-invite.
+ Nothing should be changed until we have processed the SDP and know that we
+ can handle it.
+*/
static int sip_handle_t38_reinvite(struct ast_channel *chan, struct sip_pvt *pvt, int reinvite)
{
struct sip_pvt *p = chan->tech_pvt;
@@ -16884,12 +16959,21 @@
/* Setup everything on the other side like offered/responded from first side */
sip_pvt_lock(p);
+
+ /*! \todo check if this is not set earlier when setting up the PVT. If not
+ maybe it should move there. */
p->t38.jointcapability = p->t38.peercapability = pvt->t38.jointcapability;
+
ast_udptl_set_far_max_datagram(p->udptl, ast_udptl_get_local_max_datagram(pvt->udptl));
ast_udptl_set_local_max_datagram(p->udptl, ast_udptl_get_local_max_datagram(pvt->udptl));
ast_udptl_set_error_correction_scheme(p->udptl, ast_udptl_get_error_correction_scheme(pvt->udptl));
if (reinvite) { /* If we are handling sending re-invite to the other side of the bridge */
+ /*! \note The SIP_CAN_REINVITE flag is for RTP media redirects,
+ not really T38 re-invites which are different. In this
+ case it's used properly, to see if we can reinvite over
+ NAT
+ */
if (ast_test_flag(&p->flags[0], SIP_CAN_REINVITE) && ast_test_flag(&pvt->flags[0], SIP_CAN_REINVITE)) {
ast_udptl_get_peer(pvt->udptl, &p->udptlredirip);
flag =1;
More information about the asterisk-commits
mailing list