[pjsip] Parsing expires from REGISTER reply

Tanguy Floc'h electrocut at gmail.com
Mon May 5 16:28:01 EDT 2008


You are right Alan, I didn't see the included file (in fact, you last post
on the mailing list haven't reached my mailbox, I don't know why).

I'll look at your sip_reg.c remplacement more closely.

Thanks

On Mon, May 5, 2008 at 6:05 PM, Tanguy Floc'h <electrocut at gmail.com> wrote:

> Sorry for the bad ascii table :(
>
> the same in an image :
> http://www.monsterup.com/image.php?url=upload/1210003361.jpg
>
>
> On Mon, May 5, 2008 at 6:00 PM, Tanguy Floc'h <electrocut at gmail.com>
> wrote:
>
> > I agree with you Alan, I had the same problem a few minutes ago :
> > with "pjsip_cfg()->regc.check_contact" disabled, it will fail anyway
> > with a "unregister success", if more than once user have registered to the
> > account. (if we assume 'Contact: header' is missing)
> >
> > Another problem with the fix you proposed :
> >
> > if (expiration == NOEXP)
> >   expiration = -1;
> > else if (expiration == 0 && contact_cnt > 0 && contact[0]->expires > 0)
> >   expiration = contact[0]->expires;
> >
> >
> > is that you don't know if 'contact[0]->expires' is your expire value ...
> > or if it is 'contact[1]->expires'
> >
> >
> > If 'contact[0]->expires' is taken as the "good expire value", only if
> > the "Contact header recognation" (like when "check_contact" is enabled) has
> > failed ... if could solve a part of the problem, but not all.
> >
> > If my assumption is right (I haven't tested it) finally, it should be :
> >
> >
> > -------------------+-----------------------+-------------------------------------------+
> >                   |       only       |        only
> > |                                           |
> >                   | No Expire header |   bad Contact Info    |    No
> > Expire header + Wrong Contact Info  |
> >
> > ------------------|------------------+-----------------------+-------------------------------------------|
> >  1st fix          |                  |
> > |
> > |
> > (contact_cnt = 0) | ok if register<2 |         ok            |
> > ok if register<2                |
> >                   |                  |
> > |                                           |
> > ------------------+------------------+-----------------------+-------------------------------------------+
> >
> >  2nd fix          |       ok         |
> > |                  ok
> > |
> > (contact_cnt > 0) | but multi-unreg  |         ok            |
> > but multi-unreg problem          |
> >                   |     problem      |
> > |                                           |
> >
> > ------------------+------------------+-----------------------+-------------------------------------------+
> >  2nd fix +        |                  |
> > |                                           |
> >  + the idea above |                  |
> > |                   ok                      |
> > (test contact     |        ok        |         ok            |
> > but multi-unreg problem          |                     |
> > header recogn. 1st|                  |
> > |                                           |
> > ------------------+------------------+-----------------------+-------------------------------------------+
> >
> >
> >
> > I hope we will managed to find the best solution for this issue :)
> >
> > Regards,
> >
> > Electrocut
> >
> >
> > On Sun, May 4, 2008 at 2:06 PM, Benny Prijono <bennylp at pjsip.org> wrote:
> >
> > > Hi Alan,
> > >
> > > First of all, I think this issue has come up several times on this
> > > list, so I've just added this entry in the FAQ to explain the
> > > rationale why PJSIP behaves this way, and also few solutions to cope
> > > with it: http://trac.pjsip.org/repos/wiki/FAQ#regc
> > >
> > > I do like your solution. And while this is server problem (regardless
> > > of how popular it is; if it's broken, then it needs to be fixed, IMO),
> > > in the SVN trunk we already have couple of settings to deal with this,
> > > so if we want to handle this, why not go all the way. So I've just
> > > added the trick (to get the expiration value from the single Contact,
> > > if Expires header is not present) in the latest SVN version. Thanks
> > > for the suggestion.
> > >
> > > Now enjoy the bank holiday. :)
> > >
> > > Cheers
> > >  Benny
> > >
> > > On Sun, May 4, 2008 at 2:38 AM, Alan J. Bond <alan.bond at wintology.com>
> > > wrote:
> > > >
> > > >
> > > >
> > > >
> > > > Hi again,
> > > >
> > > >
> > > >
> > > > Have done the debugging.  Here is the fix but remember I'm very new
> > > to this
> > > > code so please scrutinise carefully.   Comments for clarity only,
> > > please
> > > > amend per your normal standards.
> > > >
> > > >
> > > >
> > > > The value of expires= on the end of a Contact: header is indeed
> > > parsed
> > > > correctly and placed in the  pjsip_contact_hdr structure.  The
> > > problem is in
> > > > sip_reg.c toward the end of this function where it is discarded and
> > > not
> > > > passed to the callback handler.   This change assumes that any SIP
> > > servers
> > > > that exhibit this behaviour are only going to do so when returning a
> > > single
> > > > Contact: header.  You may know different.
> > > >
> > > >
> > > >
> > > > static void tsx_callback(void *token, pjsip_event *event)
> > > >
> > > > {
> > > >
> > > >                 :
> > > >
> > > >       :
> > > >
> > > >       :
> > > >
> > > >       V
> > > >
> > > >
> > > >
> > > >       }
> > > >
> > > >
> > > >
> > > >       /* Increment busy flag temporarily to prevent regc from
> > > >
> > > >        * being destroyed.
> > > >
> > > >        */
> > > >
> > > >       ++regc->busy;
> > > >
> > > >
> > > >
> > > >       /* Call callback. */
> > > >
> > > >
> > > >
> > > >       /* Change to cope with old SER implementations that append */
> > > >
> > > >       /* expires= to Contact: and do not create Expires: header  */
> > > >
> > > >       /* 20080504 BEGIN -----------------------------------------*/
> > > >
> > > >
> > > >
> > > >       /* if (expiration == NOEXP) expiration = -1;               */
> > > >
> > > >
> > > >
> > > >       if (expiration == NOEXP)
> > > >
> > > >         expiration = -1;
> > > >
> > > >       else if (expiration == 0 && contact_cnt == 1 &&
> > > contact[0]->expires >
> > > > 0)
> > > >
> > > >         expiration = contact[0]->expires;
> > > >
> > > >
> > > >
> > > >       /* 20080504 END -------------------------------------------*/
> > > >
> > > >
> > > >
> > > >       call_callback(regc, PJ_SUCCESS, tsx->status_code,
> > > >
> > > >                     (rdata ?
> > > &rdata->msg_info.msg->line.status.reason
> > > >
> > > >                            :
> > > pjsip_get_status_text(tsx->status_code)),
> > > >
> > > >                     rdata, expiration,
> > > >
> > > >                     contact_cnt, contact);
> > > >
> > > >
> > > >
> > > >       /* Decrement busy flag */
> > > >
> > > >       --regc->busy;
> > > >
> > > >     }
> > > >
> > > >
> > > >
> > > >     /* Delete the record if user destroy regc during the callback.
> > > */
> > > >
> > > >     if (regc->_delete_flag && regc->busy==0) {
> > > >
> > > >       pjsip_regc_destroy(regc);
> > > >
> > > >     }
> > > >
> > > > }
> > > >
> > > >
> > > >
> > > > Please let me know if you think this will screw up other
> > > implementations.
> > > >
> > > >
> > > >
> > > > Best Regards,
> > > >
> > > > Alan.
> > > > _______________________________________________
> > > >  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
> > >
> >
> >
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.pjsip.org/pipermail/pjsip_lists.pjsip.org/attachments/20080505/49e46ab5/attachment.html>


More information about the pjsip mailing list