[sr-dev] Dialog onroute requests.

Øyvind Kolbu oyvind.kolbu at usit.uio.no
Wed Jun 19 13:14:52 CEST 2013


On 04.06.2013 15:39, Daniel-Constantin Mierla wrote:
> Hello,
>
> On 6/4/13 3:14 PM, Eduardo Lejarreta wrote:
>>
>> Good evening.
>>
>> Playing with latest “dialog module” versions (3.2, 3.3 and 4.0) I
>> think there could be an open “issue” with regard to dialog state
>> management.
>>
>> You can see on “dlg_handlers.c” on “dlg_onroute” function. On this
>> last  when you receive a BYE message it fires some CallBacks.
>>
>> I you receive a close second BYE, this last one destroys the dialog
>> because “dlg_release” function is called from a parallel process
>> avoiding the other processes callback execution.
>>
>> I know a second BYE it’s not a normal circumstance but you know, the
>> real world …
>>
>> I think dialog_ng doesn’t have this issue but also it has no DB support.
>>
> can you give more specific details, like the lines of code you think may
> have an open issue? A quick check, it seems dialog and dialog_ng have
> the same processing of BYE request in dlg_onroute() and unref is done
> only on transition state to terminate.

We have since upgrading from Kamailio 1.5 to 3.2 had problems with the
dialog module, where dialogs have been "stuck" in state 5 and we must
restart Kamailio to remove them. Needless to say a bad thing...

So far we have mitigated it mostly with dropping duplicated INVITEs and
with the help of this mail, also dropping duplicated BYEs. Seems like
the duplicate-handling in the module is not handled well if they
are received within a too short interval.

We use:
modparam("htable", "htable", "invcidhist=>size=8;autoexpire=30");
modparam("htable", "htable", "byecidhist=>size=8;autoexpire=30");

and before route(WITHINDLG):

         if (is_method("BYE")) {
                 lock($ci);
                 if($sht(byecidhist=>$ci) != $null) {
                         xlog("L_INFO", "BYE: We've already seen this 
call-id before, we should drop this bye $ci\n");
                         unlock($ci);
                         exit;
                 } else {
                         xlog("L_INFO", "BYE: This is the first BYE for 
this call, let's process it\n");
                         $sht(byecidhist=>$ci) = 1;
                 }
                 unlock($ci);
         }

Later after route(AUTH) we do it similar for INVITE

        if (is_method("INVITE")) {
                 if($sht(invcidhist=>$ci) != $null)
                 {
                         xlog("L_INFO", "INVITE: We've already seen this 
call-id before, we should drop this invite $ci\n");
                         unlock($ci);
                         exit;
                 } else
                 {
                     xlog("L_INFO", "INVITE: This is a new invite, let's 
start a dialog! $ci\n");
                     $sht(invcidhist=>$ci) = 1;
                 }
                 unlock($ci);
         }

Our Kamailios are running 3.3.3 (i386/linux) 897939-dirty.

-- 
Øyvind



More information about the sr-dev mailing list