[Top][All Lists]

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [osip-dev] eXosip and reINVITE

From: Aymeric Moizard
Subject: Re: [osip-dev] eXosip and reINVITE
Date: Fri, 7 Sep 2018 15:04:18 +0200

Le ven. 7 sept. 2018 à 13:05, Tsvetan Filev <address@hidden> a écrit :

Yes I have working answer now.


There is something I noticed in the wireshark trace:
The UDP packet that holds the OK response has wrong (unverified) checksum.
Is there osip/eXosip function that can disable it ?

You don't have to mind about it. This is only related to wireshark usage.

On 5.09.2018 12:19, Aymeric Moizard wrote:

You are using the wrong API to answer the option.

The API you use is for request within a call.

You need to use API for request "outside calls": eXosip_message_send_answer

See here: 

Le mer. 5 sept. 2018 à 10:58, Tsvetan Filev <address@hidden> a écrit :


I'm getting EXOSIP_MESSAGE_NEW event for OPTIONS.
But when I try to do this:

            if(!strcmp(p_evt.request->sip_method, "OPTIONS"))
                printf("Got OPTIONS send OK to tid %d\n", p_evt.tid);
                int l_ret = 0;
                if(l_ret = eXosip_call_send_answer (m_ctx, p_evt.tid, SIP_OK, NULL))
                      printf("SIP Send response %d error %d (tid %d)\n", p_sip_event, l_ret, p_evt.tid);

I get SIP Send response 200 error -6 (tid 2).


What could be wrong ?


On 4.09.2018 17:40, Aymeric Moizard wrote:

Of course! Any outgoing and any incoming request are doable.

eXosip2 won't be able to handle properly new dialog established
by other request than INVITE/SUBSCRIBE/REFER. 
I've never seen such request anyway!


Le mar. 4 sept. 2018 à 15:02, Tsvetan Filev <address@hidden> a écrit :

Hi Aymeric.

Can eXosip handle (receive) OPTIONS requests ?


On 6.08.2018 16:05, Aymeric Moizard wrote:

Le lun. 6 août 2018 à 13:08, Tsvetan Filev <address@hidden> a écrit :

Hi Aymeric.


How can I detect what exosip event message belongs to what call leg ?
I can't use cid as it is different for INVITE and RINGING for example.

You must use cid which remains the same for the compete call-leg.

If this is not the case, there is a bug. I doubt any such issue exists in exosip2...



On 3.08.2018 18:16, Aymeric Moizard wrote:

2018-08-03 16:25 GMT+02:00 Tsvetan Filev <address@hidden>:


the problem was wrong tid. I have to update my call states after reinvite.

That's it! ;)

Thanks for helping me out.

You are welcome!

I now have direct RTP media.



On 3.08.2018 15:57, Tsvetan Filev wrote:

Yes here is the code:

        l_ret = eXosip_call_send_answer(m_ctx, p_tid, p_sip_event, p_answer);

I have tid 1:  Error Send OK result -3 tid 1
I guess this is wrong ?

On 3.08.2018 15:37, Aymeric Moizard wrote:

Le ven. 3 août 2018 à 14:19, Tsvetan Filev <address@hidden> a écrit :


I checked out the latest exosip (last commit  6da834d2980d97e4ad7a59f6734884f6962b8267 from Mon Jul 2 11:37:23 2018 +0200) and osip2 (last commit 7a3f2cbabed8147017ac04846a117ae1e8f59386 from Wed Jun 20 17:35:37 2018 +0200) repos, I recompiled and reINVITE sends Trying automatically again.

Sorry about the debug. Here it is:

03/08/18-15:07:41:447656 |Received SIP message: 2, 'New call received!', cid=1
03/08/18-15:07:41:447686 |type 2 cid 1 did 2 tid 1 sid 0
03/08/18-15:07:41:469728 |Received SIP message: 5, 'Call is being processed!', cid=3
03/08/18-15:07:41:469755 |type 5 cid 3 did 0 tid 2 sid 0
03/08/18-15:07:41:538803 |Received SIP message: 6, 'Remote phone is ringing!', cid=3
03/08/18-15:07:41:538827 |type 6 cid 3 did 4 tid 2 sid 0
03/08/18-15:07:42:707314 |Received SIP message: 7, 'Remote phone has answered!', cid=3
03/08/18-15:07:42:707338 |type 7 cid 3 did 4 tid 2 sid 0
03/08/18-15:07:42:707892 |Received SIP message: 12, 'ACK received!', cid=1
03/08/18-15:07:42:707899 |type 12 cid 1 did 2 tid 1 sid 0
03/08/18-15:07:42:708515 |Received SIP message: 3, 'INVITE within call received!', cid=1
03/08/18-15:07:42:708522 |type 3 cid 1 did 2 tid 3 sid 0
03/08/18-15:07:42:708625 |eXosip invite returned cid = 0
03/08/18-15:07:42:711846 |Received SIP message: 5, 'Call is being processed!', cid=3
03/08/18-15:07:42:711855 |type 5 cid 3 did 4 tid 4 sid 0
03/08/18-15:07:42:711923 |Received SIP message: 7, 'Remote phone has answered!', cid=3
03/08/18-15:07:42:711927 |type 7 cid 3 did 4 tid 4 sid 0
03/08/18-15:07:42:712015 |Error Send OK -6

Please indicate the tid you use to send the answer! If I'm correct, it should be tid=3 and if I'm correct, the tid only is required for the API to send answer? Right?


On 3.08.2018 13:35, Aymeric Moizard wrote:

Using the latest git is advised!

More inline:

Le ven. 3 août 2018 à 10:31, Tsvetan Filev <address@hidden> a écrit :


I'm using 4.1.0 for both exosip and osip. At least this is what the latest documentation points to : http://www.antisip.com/doc/exosip2/
Anyway I updated to 5.0.0 and tested again without sending Trying manually.

Here is the log from eXosip node:

Initial INVITE
03/08/18-11:01:12:920830 |Received SIP message: 2, 'New call received!', cid=1
03/08/18-11:01:12:921048 |SIP message 2 received for  cid=1, did=0, tid=0

I'm surprised to see did=0 and tid=0. Those value should be already set in the exosip_event (as shown right below)

03/08/18-11:01:12:921067 |sip_call_ivite_rcv for  cid=1, did=2, tid=1

Send INVITE to call leg 2
03/08/18-11:01:13:016953 |eXosip invite returned cid = 3

03/08/18-11:01:13:024636 |Received SIP message: 5, 'Call is being processed!', cid=3
03/08/18-11:01:13:024921 |SIP message 5 received for  cid=3, did=0, tid=0

Again, did=0 and tid=0 and the value should be set in exosip_event.

Send trying to call leg 1

03/08/18-11:01:13:108228 |Received SIP message: 6, 'Remote phone is ringing!', cid=3
03/08/18-11:01:13:108366 |SIP message 6 received for  cid=3, did=0, tid=0

Same comment as above.

Send ringing to call leg 1
03/08/18-11:01:13:108411 |Send ringing response result 0

03/08/18-11:01:14:099017 |Received SIP message: 7, 'Remote phone has answered!', cid=3
03/08/18-11:01:14:099187 |SIP message 7 received for  cid=3, did=0, tid=0

Same comment as above.

Send OK to call leg 1
03/08/18-11:01:14:099219 |Send OK response result 0
03/08/18-11:01:14:100065 |Received SIP message: 12, 'ACK received!', cid=1

reINVTIE from call leg 1
03/08/18-11:01:14:101841 |Received SIP message: 3, 'INVITE within call received!', cid=1
03/08/18-11:01:14:101956 |SIP message 3 received for  cid=1, did=0, tid=0

Same again.

Send reINVTIE to call leg 2
03/08/18-11:01:14:102023 |eXosip invite returned cid = 0

Cid=0 can't be true for a new transaction?

Got Trying and OK from call leg 2
03/08/18-11:01:14:103046 |Received SIP message: 5, 'Call is being processed!', cid=3
03/08/18-11:01:14:103127 |SIP message 5 received for  cid=3, did=0, tid=0


03/08/18-11:01:14:103397 |Received SIP message: 7, 'Remote phone has answered!', cid=3
03/08/18-11:01:14:103580 |SIP message 7 received for  cid=3, did=0, tid=0

... tid

Send OK to call leg 1
03/08/18-11:01:14:103651 |Error Send OK -6

Only tid=0 exist in your log, but you should be able to display 4 tid (4 transactions)

Your logs could be improved to display the tid. If they are not set, there must be a bigger issue.

It is possible that you reuse too much the tags, call-id, via branch: and breaks the sip protocol. This may introduce unexpected matching for some messages that are considered part of wrong transactions.

I can't read the Wireshark capture: I'm on mobile.... ;)


Attached is wireshark trace from the communication. Have a look at packet 381: eXosip is sending Trying again.
These are the nodes: - alice - asterisk 1 - eXosip - asterisk 2 - bob


On 2.08.2018 18:32, Aymeric Moizard wrote:
Hi again!

100 is reserved to proxy. But exosip is a User-Agent, so you can send
answers from 101 to 699. This explains why you have  OSIP_BADPARAMETER
when trying to send "100 Trying".

Old version of eXosip2 was sending 101 automatically, but newer version
are not sending it anymore to simplify interoperability.

More below!

2018-08-02 16:35 GMT+02:00 Tsvetan Filev <address@hidden>:

One thing I notice is that eXosip sends Trying automatically after reINVITE and when I try to send TRYING I get -2 OSIP_BADPARAMETER
If I try to send OK after reINVITE without sending manually TRYING I get -6 OSIP_NOTFOUND

Do you mean it works when you try to send a 100 Trying before the 200 Ok? (note that you said it's failing to send send
100 Trying, and I confirmed it won't work)

Have you checked if the TID parameter you provide is correct?

In practice, this code seems to fail in eXcall_api.c:

  if (tid > 0) {
    _eXosip_call_transaction_find (excontext, tid, &jc, &jd, &tr);
  if (jd == NULL || tr == NULL || tr->orig_request == NULL || tr->orig_request->sip_method == NULL) {
    OSIP_TRACE (osip_trace (__FILE__, __LINE__, OSIP_ERROR, NULL, "eXosip: No call here or no transaction for call\n"));
    osip_message_free (answer);
    return OSIP_NOTFOUND;

You should compile exosip in debug, with logs, and see the exact reason : wrong tid? jd=NULL? tr=NULL?

If you use an old version of exosip, I would advise to upgrade to a recent. Latest/current git for both osip & exosip
is advised.


On 2.08.2018 16:50, Aymeric Moizard wrote:
I guess you need to track down the status of your incoming sip transaction and the value of the tid/cid/did you use to send the 200ok.

Mostly, the parameter of this method and the parameters you use inside this method:

send_answer(p_call_info_ua1.call_event_info.tid, SIP_OK, p_call_info_ua1.call_event_info.engine_session_id, l_answer


Le jeu. 2 août 2018 à 15:17, Tsvetan Filev <address@hidden> a écrit :

Hi Aymeric.



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)
            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);

            // 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);



    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);

            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);
        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:

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.


2018-08-02 14:50 GMT+02:00 Tsvetan Filev <address@hidden>:

I'm trying to achieve the following SIP communication:


This is basically initial INVITE followed by reINVITE that tells the phones to use direct RTP traffic instead of RTP going through asterisk.
eXosip node is a transparent B2BUA written using the eXosip/osip2 library.
I set directmedia=outgoing to both asterisks which tells them to send reINVITE only to outgoing leg (the default asterisk behavior is to send to both legs https://wiki.asterisk.org/wiki/display/AST/SIP+Direct+Media+Reinvite+Glare+Avoidance).

So I have two call legs in my eXosip node : call leg 1 (asterisk 1) and call leg 2 (asterisk 2).

I was able to send successfully reINVITE from eXosip to asterisk 2 and Trying from eXosip to asterisk 1.
When I get OK from asterisk 2 and try to send OK to asterisk 1 by copying the sdp from asterisk 2 I get an error.

Is it possible to achieve this with eXosip and how ?


osip-dev mailing list


Antisip - http://www.antisip.com

PNG image

PNG image

reply via email to

[Prev in Thread] Current Thread [Next in Thread]