Hi Aymeric.
You are right the real workflow should be something
like this:
https://www.websequencediagrams.com/cgi-bin/cdraw?lz=cGFydGljaXBhbnQgYWxpY2UKAAUNc3Rlcmlza18xAAoNZVhvc2lwABQWMgA0DWJvYgoKIyBJbml0aWFsIGludml0ZQoAZAUgLT4AVQs6ABUHIChzZHApCgBvCgAiBQArBTogMTAwIFRyeWluZwASDwCBCwYANQ8AgSAGAFkOADcOAA8TMgBxGDIAXgoAcxcAHQVib2IAgTwPYm9iAFQOAIE7DgAKFjgwIFJpbmcAThIAeAoAGAsAgVIYADIUAIJDDgBdCwCBFBUyMDAgT0sAgXcVYm9iIDogQUNLAIIMGAAvDQCCVxQAOAcAgxEXAGUWAINkCwBuEACEHg0AgSsOAIReEgCBNAcKIyByZS0AhRAHAIQ3HmluLWRpYWxvZwCBNxsAASwAhH0PAHMLAIREJwCCUxYKAIIrJQCCdBsAglAbAIEUEACDfQYAggkXAIVZHwCENTk&s=rose
I get -3 OSIP_WRONG_STATE.
This is how my SIP messages handler looks like:
CN_UBYTE handle_sip_event(const S_event_info&
p_msg, S_call_info& p_ci) const
{
p_ci.call_event_info = p_msg;
switch (p_msg.type)
{
case EXOSIP_CALL_REINVITE:
if(p_sm.m_ua1_p_ci and p_sm.m_ua2_p_ci)
{
// Send reINVITE to call leg 2
send_reinvite(m_ua1_p_ci, m_ua2_p_ci);
// Send 180 Ringing to call leg 1
send_response(m_ua1_p_ci->call_event_info.tid,
SIP_RINGING);
}
break;
case EXOSIP_CALL_ANSWERED:
// Send 200 OK to call leg 1
if(m_ua1_p_ci and m_ua2_p_ci)
{
get_sip_layer().send_ok(m_ua1_p_ci,
m_ua2_p_ci);
}
break;
default:
break;
}
return 0;
}
This is my send _ok code:
int C_sip_layer::send_ok(sip::S_call_info&
p_call_info_ua1, sip::S_call_info& p_call_info_ua2)
const
{
if(m_ctx == NULL)
{
return -1;
}
osip_message_t *l_answer;
int l_i = eXosip_call_build_answer(m_ctx,
p_call_info_ua1.call_event_info.tid, SIP_OK,
&l_answer);
if (l_i == 0)
{
sdp_message_t *l_remote_sdp =
eXosip_get_remote_sdp_from_tid(m_ctx,
p_call_info_ua2.call_event_info.tid);
if(l_remote_sdp)
{
char* buf = nullptr;
if(sdp_message_to_str (l_remote_sdp,
&buf) == OSIP_SUCCESS and buf != nullptr) {
osip_message_set_body(l_answer, buf,
strlen(buf));
osip_message_set_content_type (l_answer,
sdp_content_type_str);
free(buf);
}
sdp_message_free(l_remote_sdp);
}
if(l_i =
send_answer(p_call_info_ua1.call_event_info.tid, SIP_OK,
p_call_info_ua1.call_event_info.engine_session_id,
l_answer))
{
printf("Error Send OK %d\n", l_i);
}
} else {
printf("Error Build OK\n");
}
return l_i;
}
On
2.08.2018 16:04, Aymeric Moizard wrote:
Hello,
In the call flow you sent, the SDP from 200 Ok
for re-INVITE is sent to asterisk1
before you receive the SDP from 200 Ok from
asterisk2. I'm not listing the other
possible issue of a B2BUA, you may know
them... ;)
You said you have an error, but, but you
didn't told which error
and what you tried? Let me know more if you
want help.
Regards
Aymeric