"Channel: %s\r\nChanneltype: %s\r\nUniqueid: %s\r\nSIPcallid: %s\r\nSIPfullcontact: %s\r\nPeername: %s\r\n",
p->owner->name, "SIP", p->owner->uniqueid, p->callid, p->fullcontact, p->peername);
} else { /* RE-invite */
- ast_queue_frame(p->owner, &ast_null_frame);
+ ast_queue_control(p->owner, AST_CONTROL_UPDATE_RTP_PEER);
}
} else {
/* It's possible we're getting an 200 OK after we've tried to disconnect
} else {
ast_set_flag(&p->flags[1], SIP_PAGE2_DIALOG_ESTABLISHED);
transmit_response_with_sdp(p, "200 OK", req, (reinvite ? XMIT_RELIABLE : (req->ignore ? XMIT_UNRELIABLE : XMIT_CRITICAL)), p->session_modify == TRUE ? FALSE : TRUE, FALSE);
+ ast_queue_control(p->owner, AST_CONTROL_UPDATE_RTP_PEER);
}
}
memset(&p->tredirip, 0, sizeof(p->tredirip));
changed = 1;
}
- if (cap && !(ast_format_cap_is_empty(cap) && !(ast_format_cap_identical(p->redircaps, cap)))) {
+ if (cap && !ast_format_cap_is_empty(cap) && !ast_format_cap_identical(p->redircaps, cap)) {
ast_format_cap_copy(p->redircaps, cap);
changed = 1;
}
AST_CONTROL_END_OF_Q = 29, /*!< Indicate that this position was the end of the channel queue for a softhangup. */
AST_CONTROL_INCOMPLETE = 30, /*!< Indication that the extension dialed is incomplete */
AST_CONTROL_MCID = 31, /*!< Indicate that the caller is being malicious. */
+ AST_CONTROL_UPDATE_RTP_PEER = 32, /*!< Interrupt the bridge and have it update the peer */
};
enum ast_frame_read_action {
(fr->subclass.integer == AST_CONTROL_UNHOLD) ||
(fr->subclass.integer == AST_CONTROL_VIDUPDATE) ||
(fr->subclass.integer == AST_CONTROL_SRCUPDATE) ||
- (fr->subclass.integer == AST_CONTROL_T38_PARAMETERS)) {
+ (fr->subclass.integer == AST_CONTROL_T38_PARAMETERS) ||
+ (fr->subclass.integer == AST_CONTROL_UPDATE_RTP_PEER)) {
if (fr->subclass.integer == AST_CONTROL_HOLD) {
/* If we someone went on hold we want the other side to reinvite back to us */
if (who == c0) {
} else {
glue0->update_peer(c0, NULL, NULL, NULL, 0, 0);
}
- } else if (fr->subclass.integer == AST_CONTROL_UNHOLD) {
- /* If they went off hold they should go back to being direct */
+ } else if (fr->subclass.integer == AST_CONTROL_UNHOLD ||
+ fr->subclass.integer == AST_CONTROL_UPDATE_RTP_PEER) {
+ /* If they went off hold they should go back to being direct, or if we have
+ * been told to force a peer update, go ahead and do it. */
if (who == c0) {
glue1->update_peer(c1, instance0, vinstance0, tinstance0, cap0, 0);
} else {
glue0->get_codec(c1, cap1);
ast_format_cap_append(oldcap1, cap1);
}
- ast_indicate_data(other, fr->subclass.integer, fr->data.ptr, fr->datalen);
+ /* Since UPDATE_BRIDGE_PEER is only used by the bridging code, don't forward it */
+ if (fr->subclass.integer != AST_CONTROL_UPDATE_RTP_PEER) {
+ ast_indicate_data(other, fr->subclass.integer, fr->data.ptr, fr->datalen);
+ }
ast_frfree(fr);
} else if (fr->subclass.integer == AST_CONTROL_CONNECTED_LINE) {
if (ast_channel_connected_line_macro(who, other, fr, other == c0, 1)) {