problem with sdp negociator

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

 



Hi,

I have encounter a new problem with sdp negociation.

Like I said before, my code is based on simpleua.c, and I'm trying to have
the following call flow :

UAC -------Invite (a)--------->B2BUA---------Invite (b)--------->UAS
UAC <------------------------200 ok
(c)-----------------------------------UAS
UAC
----------------------------ACK----------------------------------------->UAS


UAC
-------------------------------BYE-------------------------------------->UAS
UAC <------------------------200 ok
---------------------------------------UAS
UAC
----------------------------ACK---------------------------------------->UAS


where :

INVITE (a) contain a sdp with the following media in SDP (only this one)

m=application 0 ESP_TRANSPORT/UDP
a=crypto:1 ESP_AES_CBC_128_HMAC_MD5_96 inline:|any|192.168.209.20:
|24500::|::

This part is ok, I can send this sdp

INVITE (b) is updated by my B2BUA :

m=application 0 ESP_TRANSPORT/UDP
a=crypto:1 ESP_AES_CBC_128_HMAC_MD5_96
 inline:4avswQmkSryflkF851qRPg==|any|192.168.209.20:|24500:sec:3600|:sec:3600
(in one line)

and my UAS respond to this message with the following SDP in 200 ok :

m=application 0 ESP_TRANSPORT/UDP
a=crypto:1 ESP_AES_CBC_128_HMAC_MD5_96
inline:4avswQmkSryflkF851qRPg==|any|192.168.209.20:192.168.209.21|24500:sec:3600|24500:sec:3600
(in one line)

So, now, I have what I want in my SDP in both the request and the answer.

But, when I'm checking pjsip logs, I encounter the following message :


simpleua.c  Call state changed to CONNECTING
inv0x811277c  Got SDP answer in Response msg 200/INVITE/cseq=4056
(rdata0x80ebdc4)
inv0x811277c  SDP negotiation done, status=220046
simpleua.c  SDP negotiation has failed: SDP media transport type mismatch in
offer/answer (PJMEDIA_SDPNEG_EINVANSTP) [code=220046]

The last line is logged during on_media_update (it's the first operation,
when we check the status). And, when I'm watching with a debugger the value
of neg in my invite session, I can observe the following values :

- state : PJMEDIA_SDP_NEG_STATE_DONE
- has_remote_answer : 0
- answer_was_remote : 1 (I don't understand why it's not 1 and 1 for these
ones)
- initial_sdp : 0x8112f4c (valid address, which contain, logically, the sdp
of INVITE (a))
- active_local_sdp : 0x0
- active_remote_sdp : 0x0
- neg_local_sdp : 0x0
- neg_remote_sdp : 0x0

So, my sdp negociation failed, but I can't understand why (same media, same
attribute. Only inline value has changes), and where can I do a workaround
to evade this problem ?

I try to add a callback on_rx_response, but this one doesn't fire before
on_media_update.

Can someone help me on this problem ?

Regards,


On Tue, Nov 18, 2008 at 11:09 AM, Pierrick Grasland <
pierrick.grasland at gmail.com> wrote:

> Hi,
>
> Thanks for your help, but I prefered to only modify SDP on rx_request
> callback.
>
> So, because I'm only working with one media, and I'm sure of
> negociation value, I recreate a new sdp negociator in simpleua.c. I
> use pjmedia_sdp_neg_create_w_remote_offer and replace remote sdp with
> my new local sdp value. This negociator replace g_inv->negociator.
>
> After that, I used simpleua mechanism to negociate a valid answer
> between local_sdp and local_sdp (param of pjsip_inv_answer, for 200
> ok).
>
> Regards,
>
> On Mon, Nov 17, 2008 at 6:04 PM, Nanang Izzuddin <nanang at pjsip.org> wrote:
> > Hi,
> >
> > I think you should modify the SDP after SDP negotiated in the
> > pjsip_inv_answer(), since the SDP negotiator may rearrange the SDP
> > answer regarding RFC 3264 Section 6:
> > For each "m=" line in the offer, there MUST be a corresponding "m="
> > line in the answer.  The answer MUST contain exactly the same number
> > of "m=" lines as the offer.
> > For example, you can modify the SDP in
> > pjsip_inv_callback.on_media_update (call_on_media_update() in
> > simpleua.c). Please notice about corresponding 'm=' line, so instead
> > of resetting media_count to zero and reassign it, I guess it is better
> > to iterate the media in the local_sdp to find the m=application line
> > and modify it there, except you are sure there will be only one media.
> >
> > Regards,
> > nanang
> >
> >
> > On Mon, Nov 17, 2008 at 10:02 PM, pierrick grasland
> > <pierrick.grasland at nexcom.fr> wrote:
> >> Hello all,
> >>
> >> I'm currently working with pjsip, in order to exchange information with
> >> m=application SDP header.
> >>
> >> Actually, what I need is to do the following :
> >>
> >> receive SDP offer with :
> >>
> >>  m=application \r\n a=crypto:values (easily done with pjsua.)
> >>
> >> Generate a new sdp media, with updated value (media2):
> >>
> >>  something like that : m=application \r\n a=crypto:updated_values (done)
> >>
> >> I add this new media in my current sdp, and try to respond to my INVITE
> (I'm
> >> starting from simpleua.c,).
> >>
> >>     status = pjmedia_endpt_create_sdp( g_med_endpt, rdata->tp_info.pool,
> 1,
> >>             &g_med_tpinfo.sock_info,
> >>             &local_sdp);
> >>     PJ_ASSERT_RETURN(status == PJ_SUCCESS, PJ_TRUE);
> >>     /* removing all sdp value */
> >>     local_sdp->media_count = 0;
> >>     /* updating local_sdp */
> >>     local_sdp->media_count ++; /* increment media count */
> >>     local_sdp->media[local_sdp->media_count - 1] = media2; /* store
> media in
> >> sdp's array of media */
> >>
> >>
> >> I'm only interested in exchanging media2, so all other medias has been
> >> deleted.
> >> Then, I'm using simple_ua to send my 200 OK :
> >>
> >>     /*
> >>      * Create invite session, and pass the UAS dialog
> >>      */
> >>     status = pjsip_inv_create_uas( dlg, rdata, local_sdp, 0, &g_inv);
> >>     PJ_ASSERT_RETURN(status == PJ_SUCCESS, PJ_TRUE);
> >>
> >>     /*
> >>      * Now create 180 response.
> >>      */
> >>    status = pjsip_inv_initial_answer(g_inv, rdata,
> >>             180,
> >>             NULL, NULL, &tdata);
> >>     PJ_ASSERT_RETURN(status == PJ_SUCCESS, PJ_TRUE);
> >>
> >>     /* Send the 180 response. */
> >>     status = pjsip_inv_send_msg(g_inv, tdata);
> >>     PJ_ASSERT_RETURN(status == PJ_SUCCESS, PJ_TRUE);
> >>
> >>     /*
> >>      * Now create 200 response.
> >>      */
> >>     status = pjsip_inv_answer( g_inv,
> >>             200, NULL,    /* st_code and st_text */
> >>             NULL,        /* SDP specified now, in order to solve
> >> local/remote confusion */
> >>             &tdata);
> >>     PJ_ASSERT_RETURN(status == PJ_SUCCESS, PJ_TRUE);
> >>
> >>     /*
> >>      * Send the 200 response.
> >>      */
> >>     status = pjsip_inv_send_msg(g_inv, tdata);
> >>     PJ_ASSERT_RETURN(status == PJ_SUCCESS, PJ_TRUE);
> >>
> >>
> >>     return PJ_TRUE;
> >>
> >> But, now, I have a problem :
> >>
> >> the body of my 200 OK contain the following media :
> >>
> >>  m=application \r\n a=crypto:values
> >>
> >> instead of m=application \r\n a=crypto:updated_values
> >>
> >> After several search in PJLIB documentation, I found  pj_bool_t
> >> prefer_remote_codec_order;
> >> Initialized at true, it first seem to be the origin of my problem. But
> after
> >> some trials, it doesn't have any effect on my response.
> >>
> >> I don't want to modify PJLIB, for future upgrade. Can someone help me,
> and
> >> show me some documentation on how to create our sdp ?
> >>
> >> Thanks for your help.
> >> --
> >> Pierrick Grasland
> >>
> >>
> >> _______________________________________________
> >> Visit our blog: http://blog.pjsip.org
> >>
> >> pjsip mailing list
> >> pjsip at lists.pjsip.org
> >> http://lists.pjsip.org/mailman/listinfo/pjsip_lists.pjsip.org
> >>
> >>
> >
> > _______________________________________________
> > Visit our blog: http://blog.pjsip.org
> >
> > pjsip mailing list
> > pjsip at lists.pjsip.org
> > http://lists.pjsip.org/mailman/listinfo/pjsip_lists.pjsip.org
> >
>
>
>
> --
> Pierrick Grasland
>



-- 
Pierrick Grasland
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.pjsip.org/pipermail/pjsip_lists.pjsip.org/attachments/20081119/52e85014/attachment.html>


[Index of Archives]     [Asterisk Users]     [Asterisk App Development]     [Linux ARM Kernel]     [Linux ARM]     [Linux Omap]     [Fedora ARM]     [IETF Annouce]     [Security]     [Bugtraq]     [Linux]     [Linux OMAP]     [Linux MIPS]     [Linux API]
  Powered by Linux