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

Benny Prijono bennylp at pjsip.org
Wed Nov 21 23:57:42 EST 2007


Yes please!

Christian Grigis wrote:
> 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/






More information about the pjsip mailing list