|
|
@ -968,6 +968,46 @@ int ast_sip_session_refresh(struct ast_sip_session *session,
|
|
|
|
return 0;
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
int ast_sip_session_regenerate_answer(struct ast_sip_session *session,
|
|
|
|
|
|
|
|
ast_sip_session_sdp_creation_cb on_sdp_creation)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
pjsip_inv_session *inv_session = session->inv_session;
|
|
|
|
|
|
|
|
pjmedia_sdp_session *new_answer = NULL;
|
|
|
|
|
|
|
|
const pjmedia_sdp_session *previous_offer = NULL;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* The SDP answer can only be regenerated if it is still pending to be sent */
|
|
|
|
|
|
|
|
if (!inv_session->neg || (pjmedia_sdp_neg_get_state(inv_session->neg) != PJMEDIA_SDP_NEG_STATE_REMOTE_OFFER &&
|
|
|
|
|
|
|
|
pjmedia_sdp_neg_get_state(inv_session->neg) != PJMEDIA_SDP_NEG_STATE_WAIT_NEGO)) {
|
|
|
|
|
|
|
|
ast_log(LOG_WARNING, "Requested to regenerate local SDP answer for channel '%s' but negotiation in state '%s'\n",
|
|
|
|
|
|
|
|
ast_channel_name(session->channel), pjmedia_sdp_neg_state_str(pjmedia_sdp_neg_get_state(inv_session->neg)));
|
|
|
|
|
|
|
|
return -1;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
pjmedia_sdp_neg_get_neg_remote(inv_session->neg, &previous_offer);
|
|
|
|
|
|
|
|
if (pjmedia_sdp_neg_get_state(inv_session->neg) == PJMEDIA_SDP_NEG_STATE_WAIT_NEGO) {
|
|
|
|
|
|
|
|
/* Transition the SDP negotiator back to when it received the remote offer */
|
|
|
|
|
|
|
|
pjmedia_sdp_neg_negotiate(inv_session->pool, inv_session->neg, 0);
|
|
|
|
|
|
|
|
pjmedia_sdp_neg_set_remote_offer(inv_session->pool, inv_session->neg, previous_offer);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
new_answer = create_local_sdp(inv_session, session, previous_offer);
|
|
|
|
|
|
|
|
if (!new_answer) {
|
|
|
|
|
|
|
|
ast_log(LOG_WARNING, "Could not create a new local SDP answer for channel '%s'\n",
|
|
|
|
|
|
|
|
ast_channel_name(session->channel));
|
|
|
|
|
|
|
|
return -1;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (on_sdp_creation) {
|
|
|
|
|
|
|
|
if (on_sdp_creation(session, new_answer)) {
|
|
|
|
|
|
|
|
return -1;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
pjsip_inv_set_sdp_answer(inv_session, new_answer);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void ast_sip_session_send_response(struct ast_sip_session *session, pjsip_tx_data *tdata)
|
|
|
|
void ast_sip_session_send_response(struct ast_sip_session *session, pjsip_tx_data *tdata)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
handle_outgoing_response(session, tdata);
|
|
|
|
handle_outgoing_response(session, tdata);
|
|
|
|