linphone-developers
[Top][All Lists]
Advanced

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

Re: [Linphone-developers] sdp in re-invite rfc 3261 14.1. Current suppor


From: damico
Subject: Re: [Linphone-developers] sdp in re-invite rfc 3261 14.1. Current support/intentions?
Date: Mon, 20 Jul 2009 15:18:00 +0200
User-agent: Mozilla-Thunderbird 2.0.0.22 (X11/20090706)

Simon Morlat ha scritto:
Hi Dave,

Thanks for the detailed analysis.
My apologize, indeed the INVITE without SDP is something supported but not the RE-INVITE without SDP.
This is a feature which is lacking in linphone.
As it is lacking to few people it has never been developped.
Would you be interested in sending a patch for this ?

Simon

Le vendredi 17 juillet 2009 17:38:25, Dave Harley a écrit :
Hi Simon,

I managed to get a test preformed using the latest version of Linphone
for windows (3.1.2).
Hopefully this is up to date enough.

Scenario:
1st test.
1) Linphone calls an analogue extension which is connected to a Mitel
PABX.
2) Call is established.
3) Analogue extension tries to go on hold.
4) Analogue extension tries to retrieve call from hold.
5) Call is terminated ( actually not sure which end hangs up but its not
important).

2nd test is the exact same with the exception that the call is made from
a xlite client.

Attached are wireshark pcap traces of the sip transfer for each test and
the debug trace produced by the Linphone client.

In the Linphone test the interesting bit is that Linphone issue's a 603
decline to the bodyless (re-)invite which is received after the dialog
has been established.
In the 2nd test the xlite response to the same packet  is 200 Ok with an
SDP body attached, which is acked with an SDP body ( including the hold
indication) by the Mitel.

The other interesting thing is that the Linphone test shows no
indication of a off hold event, which makes sense cause it never went on
hold in the first place I guess.
The xlite does see the off hold (re-)invite.  However in this case the
invite does have a body.  Screwy pabx!

>From my reading of 3216 sec 14.1 I would think that xlite is more

compliant, but I suppose I would say that. Certainly from an interop
point of view it would be nice if Linphone handled the interaction
similarly.
I'm sure like all RFC's its open to interpretation and the xlite/Mitel
interpretation might not match your own views.

I'd be grateful if you could let me know your analysis.  If there is any
further testing I can do let me know and I'll do by best.

Best regards,
Dave.



The results are as follows:

On Thu, 2009-07-16 at 17:25 +0200, Simon Morlat wrote:
Hi Dave,

Receiving of INVITEs and reINVITEs without SDP is implemented and it
should work. I think it has been implemented shortly after the email you
refer. Try lastest release (3.1.2). This feature is not tested very
often, just tell me if you find a bug.

Simon

Le jeudi 16 juillet 2009 16:17:32, Dave Harley a écrit :
Hi All,

There was a query about 2 years ago regarding receiving invites and
re-invites with no sdp offer when interoping with a mitel.  It
referenced 14.1 and 13.2.1 of RFC 3261.

I'm running an old release of linphone which was happily doing its job
up to now.  However recently it appears that I need to support the
above against both a Mitel and an Aastra A5000 iPBX.

At the time Simon pointed out he had no immediate intention of
implementing this (from the original thread:
http://www.mail-archive.com/address@hidden/msg01282.html ).
Just wondering has this situation changed?  Is there any support in the
top of the tree for this aspect of the RFC?

I would test this myself before asking but getting access to the
environment where it exhibits is... problematic.

BTW I originally thought this was an osip issue and posted there. I was
wrong and was, very helpfully, pointed in the right direction. So
apologies if this mail seems familiar to any list members.

Best regards,
Dave
Dave Harley.Senior Systems Engineer

Email: address@hidden   Web: www.lincor.com

Tel:     +353 21 4941607                        Fax:  +353 21 4800848


Integrated Point-Of-Care Entertainment & Information System


Unit 6 (Nualight Building), Cork Technology Park, Model Farm Road, Cork,
Ireland

Dublin office : Digital Depot,Thomas Street, Dublin 8, Ireland





This email may contain information which is confidential and/or privileged.
The information is intended solely for the use of the individual or entity
named above. If you are not the intended recipient, be aware that any
disclosure, copying, distribution or use of the contents is prohibited. If
you have received this electronic transmission in error, please notify the
sender by telephone or return email and delete the material from your
computer.




_______________________________________________
Linphone-developers mailing list
address@hidden
http://lists.nongnu.org/mailman/listinfo/linphone-developers

Hi Simon and Dave,
I wrote a patch against linphone 2.1.1 to handle these cases one year ago. Unfortunately now I have no time to update it to newer linphone.

Maybe that patch can't be applied as is but I hope it can help you.

Regards

--Michele
--- linphone_2.1.1/linphone2-1.1/coreapi/linphonecore.c 2008/06/11 10:05:56     
1.7
+++ linphone_2.1.1/linphone2-1.1/coreapi/linphonecore.c 2008/06/20 08:05:19     
1.11
@@ -1158,7 +1158,7 @@ const char * linphone_core_get_route(Lin
        return route;
 }
 
-void linphone_set_sdp(osip_message_t *sip, const char *sdpmesg){
+void linphone_set_sdp(LinphoneCall *call, osip_message_t *sip, const char 
*sdpmesg){
        int sdplen=strlen(sdpmesg);
        char clen[10];
        snprintf(clen,sizeof(clen),"%i",sdplen);
@@ -1221,7 +1221,7 @@ int linphone_core_invite(LinphoneCore *l
                ctx=lc->call->sdpctx;
                lc->call->profile=lc->local_profile;
                sdpmesg=sdp_context_get_offer(ctx);
-               linphone_set_sdp(invite,sdpmesg);
+               linphone_set_sdp(lc->call,invite,sdpmesg);
                if (lc->audio_control){
                        linphone_core_init_media_streams(lc);
                }
@@ -1511,14 +1511,14 @@ int linphone_core_accept_call(LinphoneCo
                        return -1;
                }
                ms_message("sdp message generated 
(sdpmesg=%p):\n%s",sdpmesg,sdpmesg);
-               linphone_set_sdp(msg,sdpmesg);
+               linphone_set_sdp(call,msg,sdpmesg);
                ms_message("sdp message attached to SIP answer");
                if (lc->audio_control){
                        linphone_core_init_media_streams(lc);
                }
                ms_message("init_media_streams done");
        }else{
-               linphone_set_sdp(msg,sdpmesg);
+               linphone_set_sdp(call,msg,sdpmesg);
        }
        eXosip_lock();
        ms_message("eXosip_lock() done");
--- linphone_2.1.1/linphone2-1.1/coreapi/exevents.c     2008/06/10 10:47:25     
1.6
+++ linphone_2.1.1/linphone2-1.1/coreapi/exevents.c     2008/06/20 07:59:56     
1.8
@@ -80,6 +80,7 @@ int linphone_call_accepted(LinphoneCore 
        linphone_call_init_media_params(call);
        if (!lc->sip_conf.sdp_200_ack){
                err=0;
+               call->audio_params.initialized = 0;
                sdp_context_read_answer(call->sdpctx,sdp);
        }else{
                /*we receive a 200OK with an sdp offer*/
@@ -92,7 +93,7 @@ int linphone_call_accepted(LinphoneCore 
        }
        /*send the ack once streams are started*/
        eXosip_call_build_ack(ev->did,&msg);
-       if (sdpanswer!=NULL) linphone_set_sdp(msg,sdpanswer);
+       if (sdpanswer!=NULL) linphone_set_sdp(call,msg,sdpanswer);
        eXosip_call_send_ack(ev->did,msg);
        if (err!=0){
                /*send a bye*/
@@ -358,6 +359,7 @@ int linphone_inc_new_call(LinphoneCore *
 void linphone_handle_ack(LinphoneCore *lc, eXosip_event_t *ev){
        sdp_message_t *sdp=eXosip_get_sdp_info(ev->ack);
        if (sdp){
+               lc->call->audio_params.initialized = 0;
                sdp_context_read_answer(lc->call->sdpctx,sdp);
                linphone_connect_incoming(lc);
        }
@@ -367,35 +369,54 @@ void linphone_handle_reinvite(LinphoneCo
        sdp_message_t *sdp=eXosip_get_sdp_info(ev->request);
        sdp_context_t *ctx;
        LinphoneCall *call=lc->call;
+       bool_t just_handshake=TRUE;
+       
        char *answer;
        int status;
-       if (sdp==NULL){
-               ms_warning("No sdp in reinvite !");
-               eXosip_lock();
-               eXosip_call_send_answer(ev->tid,603,NULL);
-               eXosip_unlock();
-               return;
-       }
        ctx=call->sdpctx;
-       /* get the result of the negociation */
-       linphone_call_init_media_params(call);
-       answer=sdp_context_get_answer(ctx,sdp);
-       status=sdp_context_get_status(ctx);
+       if (sdp){
+               /* get the result of the negociation */
+               just_handshake=FALSE;
+               linphone_call_init_media_params(call);
+               answer=sdp_context_get_answer(ctx,sdp);
+               status=sdp_context_get_status(ctx);
+       }else{
+               /**
+                * Nel caso non ci sia SDP nell'invite, come da RFC 
+                * bisogna generare una offert (pag. 86/87)
+                **/
+               call->profile=lc->local_profile;
+               ms_message("generating sdp offer (re-INVITE)");
+               answer=sdp_context_get_offer(call->sdpctx);
+               status=200;
+               if (answer){
+                       status=200;
+               }else{
+                       ms_error("fail to generate sdp offer !");
+                       status = 603;
+               }
+       }
        if (status==200){
                osip_message_t *msg=NULL;
-               linphone_core_stop_media_streams(lc);
-               linphone_core_init_media_streams(lc);
+               int err;
                eXosip_lock();
-               eXosip_call_build_answer(ev->tid,200,&msg);
-               answer=call->sdpctx->answerstr; /* takes the sdp already 
computed*/
-               linphone_set_sdp(msg,answer);
-               eXosip_call_send_answer(ev->tid,200,msg);
+               err=eXosip_call_build_answer(ev->tid,200,&msg);
+               if (!err){
+                       linphone_set_sdp(call,msg,answer);
+                       eXosip_call_send_answer(ev->tid,200,msg);
+               }
                eXosip_unlock();
-               linphone_call_set_state(lc->call,LCStateAccepted);
-               linphone_core_start_media_streams(lc,call);
+               if (err){
+                       ms_warning("I can not answer to reinvite (%s SDP)... 
Transaction does not exists?",((char *) sdp?"with":"without"));
+               }else if (!just_handshake){
+                       linphone_core_stop_media_streams(lc);
+                       linphone_core_init_media_streams(lc);
+                       linphone_call_set_state(lc->call,LCStateAccepted);
+                       linphone_core_start_media_streams(lc,call);
                }
        }else{
                eXosip_lock();
@@ -745,6 +766,7 @@ void linphone_call_ringing(LinphoneCore 
                        goto end;
                }
                audio_params=&call->audio_params;
+               audio_params->initialized = 0;
                sdp_context_read_answer(lc->call->sdpctx,sdp);
                lc->vtable.show(lc);
                lc->vtable.display_status(lc,_("Early media."));

reply via email to

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