sst causes unnecessary 422s

classic Classic list List threaded Threaded
4 messages Options
Reply | Threaded
Open this post in threaded view
|

sst causes unnecessary 422s

Jeff Pyle
Hello,

I noticed today that if a packet comes into the proxy with a Session-Expires
header, it get's 422'ed.  Period.  Unfortunately the proxy that is doing
this has real users on it I cannot take down at the moment, so debugging is
limited during the day.  It is Opensips 1.5 build revision 5641.

Here's what I can tell you:

    loadmodule "sst.so"
    modparam("sst|dialog", "timeout_avp", "$avp(s:sst_timeout)")
    modparam("sst", "sst_flag", 6)
    modparam("sst", "enable_stats", 1)
    modparam("sst", "min_se", 1800)
    modparam("sst", "reject_to_small", 1)

and...

    if (is_method("INVITE")) {
        if (sstCheckMin("1")) {
                xlog("L_INFO", "SST too short - M=$rm RURI=$ru F=$fu T=$tu
IP=$si ID=$ci\n");
                exit;
        }

        // continue call processing...
    }

... in route[0].

This xlog trips on an invite that has:
    Session-Expires: 2400

and then sends back a 422 that has:
    MIN-SE: 1800

I looked at sst_handlers.c, and it seems to make sense to me, but
unfortunately my C skills aren't even a B.

Any assistance would be most appreciated.


Thanks,
Jeff


_______________________________________________
Users mailing list
[hidden email]
http://lists.opensips.org/cgi-bin/mailman/listinfo/users
Reply | Threaded
Open this post in threaded view
|

Re: sst causes unnecessary 422s

Bogdan-Andrei Iancu
Hi Jeff,

Could you post the INVITE that gets the 422 ? Does it contain  a min-se
header? If not, according to the RFC, the default min-se is 90 (from the
request) and the server has min-se 1800 -> this is why you get the 422.

Regards,
Bogdan



Jeff Pyle wrote:

> Hello,
>
> I noticed today that if a packet comes into the proxy with a Session-Expires
> header, it get's 422'ed.  Period.  Unfortunately the proxy that is doing
> this has real users on it I cannot take down at the moment, so debugging is
> limited during the day.  It is Opensips 1.5 build revision 5641.
>
> Here's what I can tell you:
>
>     loadmodule "sst.so"
>     modparam("sst|dialog", "timeout_avp", "$avp(s:sst_timeout)")
>     modparam("sst", "sst_flag", 6)
>     modparam("sst", "enable_stats", 1)
>     modparam("sst", "min_se", 1800)
>     modparam("sst", "reject_to_small", 1)
>
> and...
>
>     if (is_method("INVITE")) {
>         if (sstCheckMin("1")) {
>                 xlog("L_INFO", "SST too short - M=$rm RURI=$ru F=$fu T=$tu
> IP=$si ID=$ci\n");
>                 exit;
>         }
>
>         // continue call processing...
>     }
>
> ... in route[0].
>
> This xlog trips on an invite that has:
>     Session-Expires: 2400
>
> and then sends back a 422 that has:
>     MIN-SE: 1800
>
> I looked at sst_handlers.c, and it seems to make sense to me, but
> unfortunately my C skills aren't even a B.
>
> Any assistance would be most appreciated.
>
>
> Thanks,
> Jeff
>
>
> _______________________________________________
> Users mailing list
> [hidden email]
> http://lists.opensips.org/cgi-bin/mailman/listinfo/users
>
>  


_______________________________________________
Users mailing list
[hidden email]
http://lists.opensips.org/cgi-bin/mailman/listinfo/users
Reply | Threaded
Open this post in threaded view
|

Re: sst causes unnecessary 422s

Jeff Pyle
Hi Bogdan,

Here's the call flow:

  Adtran CPE gateway (no timer support)
                 |
                 V
     Opensips 1.4.4 with SST (P1)
                 |
                 V
     Opensips 1.5.x with SST (P2)
                 |
                 V
            PSTN carrier


The INVITE arrives at P1 from the CPE gateway.  The CPE has no timer
support, so no SE or Min-SE.  P1's SST is configured like this:

loadmodule "sst.so"
modparam("sst", "timeout_avp", "$avp(s:sst_timeout)")
modparam("sst", "sst_flag", 5)
modparam("sst", "enable_stats", 1)
modparam("sst", "min_se", 2400)

Because of this, P1 appends an SE of 2400 to the INVITE before forwarding to
P2.  P2's SST is configured like this:

loadmodule "sst.so"
modparam("sst|dialog", "timeout_avp", "$avp(s:sst_timeout)")
modparam("sst", "sst_flag", 6)
modparam("sst", "enable_stats", 1)
modparam("sst", "min_se", 1800)
modparam("sst", "reject_to_small", 1)

The INVITE that arrives at P2 does not have a Min-SE header.  The original
CPE doesn't support the timer at all, and P1 did not append one.

This confuses me some.  Given the behavior of Opensips, it seems impossible
to configure two SST-enabled proxies one behind the other, unless the second
proxy runs a Min-SE of 90.  I'm sure I've missed something.  Or, should
Opensips (P1 in this case) append a Min-SE header as well?

Changing subjects slightly, is it possible to modify Opensips' SE value in a
failure route processing a 422 failure?  If Opensips receives a 422, I'd
like to be able to re-send the INVITE after adjusting the SE/Min-SE per the
Min-SE in the 422.  If this is possible, perhaps it is also possible to
select the SE/Min-SE in the request route?  I'd like to run a SE of 240, but
one of my carriers requires no smaller than 1800.  I'd love to be able to
set the SE to 1800 only when serial forking is about to send a request to
that carrier.


Thanks,
Jeff



On 4/28/09 8:13 AM, "Bogdan-Andrei Iancu" <[hidden email]> wrote:

> Hi Jeff,
>
> Could you post the INVITE that gets the 422 ? Does it contain  a min-se
> header? If not, according to the RFC, the default min-se is 90 (from the
> request) and the server has min-se 1800 -> this is why you get the 422.
>
> Regards,
> Bogdan
>
>
>
> Jeff Pyle wrote:
>> Hello,
>>
>> I noticed today that if a packet comes into the proxy with a Session-Expires
>> header, it get's 422'ed.  Period.  Unfortunately the proxy that is doing
>> this has real users on it I cannot take down at the moment, so debugging is
>> limited during the day.  It is Opensips 1.5 build revision 5641.
>>
>> Here's what I can tell you:
>>
>>     loadmodule "sst.so"
>>     modparam("sst|dialog", "timeout_avp", "$avp(s:sst_timeout)")
>>     modparam("sst", "sst_flag", 6)
>>     modparam("sst", "enable_stats", 1)
>>     modparam("sst", "min_se", 1800)
>>     modparam("sst", "reject_to_small", 1)
>>
>> and...
>>
>>     if (is_method("INVITE")) {
>>         if (sstCheckMin("1")) {
>>                 xlog("L_INFO", "SST too short - M=$rm RURI=$ru F=$fu T=$tu
>> IP=$si ID=$ci\n");
>>                 exit;
>>         }
>>
>>         // continue call processing...
>>     }
>>
>> ... in route[0].
>>
>> This xlog trips on an invite that has:
>>     Session-Expires: 2400
>>
>> and then sends back a 422 that has:
>>     MIN-SE: 1800
>>
>> I looked at sst_handlers.c, and it seems to make sense to me, but
>> unfortunately my C skills aren't even a B.
>>
>> Any assistance would be most appreciated.
>>
>>
>> Thanks,
>> Jeff
>>


_______________________________________________
Users mailing list
[hidden email]
http://lists.opensips.org/cgi-bin/mailman/listinfo/users
Reply | Threaded
Open this post in threaded view
|

Re: sst causes unnecessary 422s

Bogdan-Andrei Iancu
Hi Jeff,

I reviewed the code, and it looks like if no SE hdr exists, the module
does add the SE hdr, but no MINSE....strange....I  made a fix (see the
attached patch) -> apply it on P1

Regards,
Bogdan

Jeff Pyle wrote:

> Hi Bogdan,
>
> Here's the call flow:
>
>   Adtran CPE gateway (no timer support)
>                  |
>                  V
>      Opensips 1.4.4 with SST (P1)
>                  |
>                  V
>      Opensips 1.5.x with SST (P2)
>                  |
>                  V
>             PSTN carrier
>
>
> The INVITE arrives at P1 from the CPE gateway.  The CPE has no timer
> support, so no SE or Min-SE.  P1's SST is configured like this:
>
> loadmodule "sst.so"
> modparam("sst", "timeout_avp", "$avp(s:sst_timeout)")
> modparam("sst", "sst_flag", 5)
> modparam("sst", "enable_stats", 1)
> modparam("sst", "min_se", 2400)
>
> Because of this, P1 appends an SE of 2400 to the INVITE before forwarding to
> P2.  P2's SST is configured like this:
>
> loadmodule "sst.so"
> modparam("sst|dialog", "timeout_avp", "$avp(s:sst_timeout)")
> modparam("sst", "sst_flag", 6)
> modparam("sst", "enable_stats", 1)
> modparam("sst", "min_se", 1800)
> modparam("sst", "reject_to_small", 1)
>
> The INVITE that arrives at P2 does not have a Min-SE header.  The original
> CPE doesn't support the timer at all, and P1 did not append one.
>
> This confuses me some.  Given the behavior of Opensips, it seems impossible
> to configure two SST-enabled proxies one behind the other, unless the second
> proxy runs a Min-SE of 90.  I'm sure I've missed something.  Or, should
> Opensips (P1 in this case) append a Min-SE header as well?
>
> Changing subjects slightly, is it possible to modify Opensips' SE value in a
> failure route processing a 422 failure?  If Opensips receives a 422, I'd
> like to be able to re-send the INVITE after adjusting the SE/Min-SE per the
> Min-SE in the 422.  If this is possible, perhaps it is also possible to
> select the SE/Min-SE in the request route?  I'd like to run a SE of 240, but
> one of my carriers requires no smaller than 1800.  I'd love to be able to
> set the SE to 1800 only when serial forking is about to send a request to
> that carrier.
>
>
> Thanks,
> Jeff
>
>
>
> On 4/28/09 8:13 AM, "Bogdan-Andrei Iancu" <[hidden email]> wrote:
>
>  
>> Hi Jeff,
>>
>> Could you post the INVITE that gets the 422 ? Does it contain  a min-se
>> header? If not, according to the RFC, the default min-se is 90 (from the
>> request) and the server has min-se 1800 -> this is why you get the 422.
>>
>> Regards,
>> Bogdan
>>
>>
>>
>> Jeff Pyle wrote:
>>    
>>> Hello,
>>>
>>> I noticed today that if a packet comes into the proxy with a Session-Expires
>>> header, it get's 422'ed.  Period.  Unfortunately the proxy that is doing
>>> this has real users on it I cannot take down at the moment, so debugging is
>>> limited during the day.  It is Opensips 1.5 build revision 5641.
>>>
>>> Here's what I can tell you:
>>>
>>>     loadmodule "sst.so"
>>>     modparam("sst|dialog", "timeout_avp", "$avp(s:sst_timeout)")
>>>     modparam("sst", "sst_flag", 6)
>>>     modparam("sst", "enable_stats", 1)
>>>     modparam("sst", "min_se", 1800)
>>>     modparam("sst", "reject_to_small", 1)
>>>
>>> and...
>>>
>>>     if (is_method("INVITE")) {
>>>         if (sstCheckMin("1")) {
>>>                 xlog("L_INFO", "SST too short - M=$rm RURI=$ru F=$fu T=$tu
>>> IP=$si ID=$ci\n");
>>>                 exit;
>>>         }
>>>
>>>         // continue call processing...
>>>     }
>>>
>>> ... in route[0].
>>>
>>> This xlog trips on an invite that has:
>>>     Session-Expires: 2400
>>>
>>> and then sends back a 422 that has:
>>>     MIN-SE: 1800
>>>
>>> I looked at sst_handlers.c, and it seems to make sense to me, but
>>> unfortunately my C skills aren't even a B.
>>>
>>> Any assistance would be most appreciated.
>>>
>>>
>>> Thanks,
>>> Jeff
>>>
>>>      
>
>
>  
h

Index: modules/sst/sst_handlers.c
===================================================================
--- modules/sst/sst_handlers.c (revision 5657)
+++ modules/sst/sst_handlers.c (working copy)
@@ -314,8 +314,9 @@
 
  info->interval = MAX(minfo.min_se, sst_min_se);
 
- if (minfo.min_se && minfo.min_se < sst_min_se) {
- remove_minse_header(msg);
+ if (minfo.min_se < sst_min_se) {
+ if (minfo.min_se)
+ remove_minse_header(msg);
  snprintf(buf, 80, "Min-SE: %d\r\n", info->interval);
  if (append_header(msg, buf)) {
  LM_ERR("failed to append modified Min-SE: header\n");

_______________________________________________
Users mailing list
[hidden email]
http://lists.opensips.org/cgi-bin/mailman/listinfo/users