[pjsip] Making T1, T2, etc. configurable without recompile

Christian Grigis christian.grigis at eyepmedia.com
Wed Nov 21 12:40:25 EST 2007


Benny,

That looks good to me! It is generic, and allows for easy addition of
more values with little effort.

Should I go ahead and make the changes, and then send you a diff?

Best regards,

-Christian


On Wed, Nov 21, 2007 at 02:43:54AM +0000, Benny Prijono wrote:
> Yes, mee too! ;-)
> 
> Christian, thanks for bringing up this issue. I've been having this 
> ticket (http://www.pjsip.org/trac/ticket/7) for long time, but 
> haven't had chance to do something about it. And thanks too for the 
> idea.
> 
> I have been thinking about different way to do this though. I'm 
> thinking of storing these compile time settings into a struct. This 
> struct instance values would be initialized to their compile time 
> value.
> 
> Then export the instance of this struct via a public API. Both 
> application and pjsip can access each individual field by using 
> something like "pjsip_cfg()->t1", and "pjsip_cfg()->t1 = 1000" to 
> change the setting. Of course if application wants to override the 
> default settings, it can only do that before creating the pjsip 
> endpoint and modules.
> 
> Something like below:
> 
> ----
> 
> //
> // In sip_config.h, perhaps..
> //
> typedef struct pjsip_cfg_t
> {
>     /* Transaction settings: */
>     struct {
>       /** Maximum number of transactions */
>       unsigned max_count;
> 
>       /* Timeout values */
>       unsigned t1;   /**< T1 timeout, in msec */
>       unsigned t2;   /**< .. fill up with doxygen comment .. */
>       unsigned t4;
>       unsigned td;
>     } tsx;
> 
>     /* Dialog layer settings .. */
> 
> } pjsip_cfg_t;
> 
> /**
>   * Get pjsip configuration instance. Application may modify the
>   * settings before creating the SIP endpoint and modules.
>   */
> PJ_DECL(pjsip_cfg_t*) pjsip_cfg(void);
> 
> ----
> 
> //
> // In sip_config.c (new file), perhaps..
> //
> 
> /* pjsip configuration instance, initialized with default values */
> static struct pjsip_cfg_t =
> {
>     /* Transaction settings */
>     {
>        PJSIP_MAX_TSX_COUNT,
>        PJSIP_T1_TIMEOUT,
>        PJSIP_T2_TIMEOUT,
>        PJSIP_T4_TIMEOUT,
>        PJSIP_TD_TIMEOUT
>     }
> } sip_cfg;
> 
> 
> PJ_DEF(pjsip_cfg_t*) pjsip_cfg(void)
> {
>     return &sip_cfg;
> }
> 
> What do yo think?
> 
> regards,
>   -benny
> 
> Alexander Agranovsky wrote:
> > Hear, hear.
> > 
> > I'd appreciate this as well ;-)
> > 
> > - Alex
> > 
> > On Nov 20, 2007, at 11:22 AM, Christian Grigis wrote:
> > 
> >> Hello Benny,
> >>
> >> Pjsip, in accordance with the RFC, uses some values to determine timer
> >> timeout values in transaction processing, namely T1, T2, T4 and TD.
> >> Currently these values are #defines (in
> >> ./pjsip/include/pjsip/sip_config.h) and consequently determined at
> >> compile-time.
> >>
> >> We would like to be able to have the application change the default
> >> values at runtime, during the initialization of the stack, without
> >> requiring a recompilation of the SIP stack.
> >>
> >> We are perfectly willing to make the necessary changes, but are
> >> wondering if you had any advice as to how these changes should be  
> >> made.
> >>
> >> After some examination, it appears the constant values are used  
> >> only in
> >> the following files:
> >>
> >> ./pjsip/include/pjsip/sip_config.h
> >> ./pjsip/src/pjsip/sip_transaction.c
> >> ./pjsip/src/test-pjsip/tsx_uac_test.c
> >> ./pjsip/src/test-pjsip/tsx_uas_test.c
> >> ./pjsip/src/pjsip-ua/sip_100rel.c
> >>
> >> The first thing that comes to mind is to provide a function to  
> >> override
> >> the default values, and another function (or rather, one per value),
> >> that returns either the default value if it has not been  
> >> overridden, or
> >> the override value. These last functions would then be used  
> >> wherever the
> >> constants were previously used.
> >>
> >> Something like:
> >>
> >> * a set of 4 values to be somehow passed to
> >>   pjsip_tsx_layer_init_module(), indicating overrides for T1, T2,  
> >> T4 and
> >>   TD (0 meaning no override), stored in static variables
> >>   pjsip_t1_timeout, pjsip_t2_timeout, pjsip_t4_timeout and
> >>   pjsip_td_timeout;
> >>
> >> * 4 functions similar to:
> >>
> >> 	unsigned int pjsip_get_t1_timeout()
> >> 	{
> >> 		if (pjsip_t1_timeout > 0) {
> >> 			return pjsip_t1_timeout;
> >> 		} else {
> >> 			return PJSIP_T1_TIMEOUT;
> >> 		}
> >> 	}
> >>
> >>
> >> What do you think?
> >>
> >> Thanks and best regards,
> >>
> >> -Christian
> >> -- 
> >> Christian Grigis
> >> Senior Software Engineer
> >>
> >> eyeP Media S.A. -- http://www.eyepmedia.com/
> 
> 
> 
> _______________________________________________
> 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 
> 

-- 
Christian Grigis
Senior Software Engineer

eyeP Media S.A. -- http://www.eyepmedia.com/




More information about the pjsip mailing list