<html xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns:m="http://schemas.microsoft.com/office/2004/12/omml" xmlns="http://www.w3.org/TR/REC-html40"><head><META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=us-ascii"><meta name=Generator content="Microsoft Word 14 (filtered medium)"><style><!--
/* Font Definitions */
@font-face
        {font-family:Calibri;
        panose-1:2 15 5 2 2 2 4 3 2 4;}
@font-face
        {font-family:Tahoma;
        panose-1:2 11 6 4 3 5 4 4 2 4;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
        {margin:0in;
        margin-bottom:.0001pt;
        font-size:11.0pt;
        font-family:"Calibri","sans-serif";
        color:black;}
a:link, span.MsoHyperlink
        {mso-style-priority:99;
        color:blue;
        text-decoration:underline;}
a:visited, span.MsoHyperlinkFollowed
        {mso-style-priority:99;
        color:purple;
        text-decoration:underline;}
span.EmailStyle17
        {mso-style-type:personal;
        font-family:"Calibri","sans-serif";
        color:windowtext;}
span.EmailStyle18
        {mso-style-type:personal-reply;
        font-family:"Calibri","sans-serif";
        color:#1F497D;}
.MsoChpDefault
        {mso-style-type:export-only;
        font-size:10.0pt;}
@page WordSection1
        {size:8.5in 11.0in;
        margin:1.0in 1.0in 1.0in 1.0in;}
div.WordSection1
        {page:WordSection1;}
--></style><!--[if gte mso 9]><xml>
<o:shapedefaults v:ext="edit" spidmax="1026" />
</xml><![endif]--><!--[if gte mso 9]><xml>
<o:shapelayout v:ext="edit">
<o:idmap v:ext="edit" data="1" />
</o:shapelayout></xml><![endif]--></head><body bgcolor=white lang=EN-US link=blue vlink=purple><div class=WordSection1><p class=MsoNormal><span style='color:#1F497D'><o:p> </o:p></span></p><p class=MsoNormal><span style='color:#1F497D'><o:p> </o:p></span></p><div><div style='border:none;border-top:solid #B5C4DF 1.0pt;padding:3.0pt 0in 0in 0in'><p class=MsoNormal style='margin-left:.5in'><b><span style='font-size:10.0pt;font-family:"Tahoma","sans-serif";color:windowtext'>From:</span></b><span style='font-size:10.0pt;font-family:"Tahoma","sans-serif";color:windowtext'> asterisk-dev-bounces@lists.digium.com [mailto:asterisk-dev-bounces@lists.digium.com] <b>On Behalf Of </b>Mark Michelson<br><b>Sent:</b> Tuesday, November 12, 2013 12:29 PM<br><b>To:</b> asterisk-dev@lists.digium.com<br><b>Subject:</b> Re: [asterisk-dev] more granular control of TImer T1<o:p></o:p></span></p></div></div><p class=MsoNormal style='margin-left:.5in'><o:p> </o:p></p><div><p class=MsoNormal style='margin-left:.5in'>On 11/12/2013 10:34 AM, Damon Estep wrote:<o:p></o:p></p></div><blockquote style='margin-top:5.0pt;margin-bottom:5.0pt'><p class=MsoNormal style='margin-left:.5in'>Originally posted to <a href="https://issues.asterisk.org/jira/browse/ASTERISK-22841">https://issues.asterisk.org/jira/browse/ASTERISK-22841</a><o:p></o:p></p><p class=MsoNormal style='margin-left:.5in'> <o:p></o:p></p><p class=MsoNormal style='margin-left:.5in'>Feedback was that this is more of a dev discussion than a bug.<o:p></o:p></p><p class=MsoNormal style='margin-left:.5in'> <o:p></o:p></p><p class=MsoNormal style='margin-left:.5in'>The definition of timer t1min is "Minimum roundtrip time for messages to monitored hosts" the key word is "monitored", which means qualify= is set to yes or a numeric value.<o:p></o:p></p><p class=MsoNormal style='margin-left:.5in'> <o:p></o:p></p><p class=MsoNormal style='margin-left:.5in'>The value of t1min is being evaluated when the timert1 value for a non-monitored host is read from the configuration and a warning is logged and timert1 is set to global_timert1 if the configured timert1 value for the non-monitored host is less than t1min.<o:p></o:p></p><p class=MsoNormal style='margin-left:.5in'> <o:p></o:p></p><p class=MsoNormal style='margin-left:.5in'>t1min should not apply to non-monitored hosts by definition and the user should be able to set a timer1 value that is less than t1min for a non-monitored host.<o:p></o:p></p></blockquote><p class=MsoNormal style='margin-left:.5in'><span style='font-size:12.0pt;font-family:"Times New Roman","serif"'><br>I can agree with this. The intention of the t1min setting should be to ensure that if a monitored host has a super-short roundtrip time that we do not end up setting the t1 timer to something ridiculously low. If you want to set the default t1 timer to something lower than t1min for non-monitored hosts, while I think it's a bit on the strange side, I think it should be allowed.</span><span style='font-size:12.0pt;font-family:"Times New Roman","serif";color:#1F497D'><o:p></o:p></span></p><p class=MsoNormal><span style='color:#1F497D'><o:p> </o:p></span></p><p class=MsoNormal><span style='color:#1F497D'>That appears to be the initial intention, yet global_t1min is checked and set even when maxms and lastms variables are not defined for a host. The resulting behavior is that you MUST lower the t1min for all monitored peers if you want to lower it for a non-monitored peer. In our case we want to lower it for a carrier peer to reduce timerB so call routes can advance to the next peer in a reasonable amount of time (before the ISDN network times out).<o:p></o:p></span></p><p class=MsoNormal style='margin-left:.5in'><span style='font-size:12.0pt;font-family:"Times New Roman","serif"'><br><br><br><o:p></o:p></span></p><p class=MsoNormal style='margin-left:.5in'> <o:p></o:p></p><p class=MsoNormal style='margin-left:.5in'>If T1 is set in the config for a monitored host it should be used instead of the last qualify result.<o:p></o:p></p><p class=MsoNormal style='margin-left:.5in'><span style='font-size:12.0pt;font-family:"Times New Roman","serif"'><br>I'm not quite so sure on this one. I imagine there are users of Asterisk out there that set timer t1 to some initial "base" value and then expect qualifies to "correct" that value if it turns out the RTT is greater or less than what is expected. Ignoring RTT for qualifies seems like something that, if it should be done at all, should be optional.</span><span style='font-size:12.0pt;font-family:"Times New Roman","serif";color:#1F497D'><o:p></o:p></span></p><p class=MsoNormal><span style='color:#1F497D'><o:p> </o:p></span></p><p class=MsoNormal><span style='color:#1F497D'>I see both sides of this argument, my thinking is that you would not define timert1 for a peer unless you needed to modify it. If not set it would be the greater of lastms or t1min, if set it would be the peer setting.<o:p></o:p></span></p><p class=MsoNormal><span style='color:#1F497D'><o:p> </o:p></span></p><p class=MsoNormal><span style='color:#1F497D'>My thinking is:<o:p></o:p></span></p><p class=MsoNormal><span style='color:#1F497D'><o:p> </o:p></span></p><p class=MsoNormal><span style='color:#1F497D'>T1min = minimum T1 for MONITORED host, not evaluated anywhere else.<o:p></o:p></span></p><p class=MsoNormal><span style='color:#1F497D'>Global_Timert1 = default for non-monitored peers with nor peer_timert1 setting<o:p></o:p></span></p><p class=MsoNormal><span style='color:#1F497D'>Peer_timert1 = absolute peer_timert1 regardless of global_timert1 or global_t1min<o:p></o:p></span></p><p class=MsoNormal><span style='color:#1F497D'><o:p> </o:p></span></p><p class=MsoNormal style='margin-left:.5in'><span style='font-size:12.0pt;font-family:"Times New Roman","serif"'><br><br><o:p></o:p></span></p><p class=MsoNormal style='margin-left:.5in'> <o:p></o:p></p><p class=MsoNormal style='margin-left:.5in'>A case where this is needed is when there is a SBC in front of the monitored host. The SBC may answer the OPTIONS query directly and not pass it to the host which is behind the SBC. In this case the lastms is set to the RTT to the SBC, which is not indicative of the actual RTT for an INVITE which is proxied to the host (which adds additional delay).<o:p></o:p></p><p class=MsoNormal style='margin-left:.5in'><span style='font-size:12.0pt;font-family:"Times New Roman","serif"'><br>In this particular case, wouldn't the SBC also be the first responder to the INVITE (with a 100 Trying)? The way Asterisk works, once it has received a response to a request, it will not retransmit the request any further.</span><span style='font-size:12.0pt;font-family:"Times New Roman","serif";color:#1F497D'><o:p></o:p></span></p><p class=MsoNormal><span style='color:#1F497D'><o:p> </o:p></span></p><p class=MsoNormal><span style='color:#1F497D'>No, every SBC I have ever used (including Acme and Sonus) answers OPTIONS and NOTIFY with a response generated by the SBC, not a response proxied to the host behind the SBC. INVITEs are always proxied to the host behind the SBC. The difference in RTT for OPTIONS/NOTIFY vs INVITE depends on the network latency between the SBC and host, as well as response time of the host. In production we see 10ms OPTION/NOTIFY responses and 50ms INVITE responses for the same SBC/host pair.<o:p></o:p></span></p><p class=MsoNormal><span style='color:#1F497D'><o:p> </o:p></span></p><p class=MsoNormal style='margin-left:.5in'><span style='font-size:12.0pt;font-family:"Times New Roman","serif"'><br></span>Setting T1 to the last measured OPTIONS RTT is a problematic for another reason as well. Any amount of jitter in the network can result in unneeded retransmits. In practice T1 is set to the estimated RTT which is not always the last RTT but rather the average RTT plus an allowance for network jitter. There are many reasons when a user might want to adjust timer T1 on a peer by peer basis. They should not be forced to accept a global minimum or system calculated T1 regardless of whether qualify is on. Qualify is used in other ways by many users, not just as a means of setting T1.<span style='font-size:12.0pt;font-family:"Times New Roman","serif";color:#1F497D'><o:p></o:p></span></p><p class=MsoNormal style='margin-left:.5in'> <o:p></o:p></p><p class=MsoNormal style='margin-left:.5in'>The current timer configuration could be improved by adding a T1 jitter configuration value (in addition to or in place of T1min, which would be added to lastms to set T1. For example, if the lastms for a peer was 40ms and the T1jitter setting was 20, then T1 would be set to 60ms.<o:p></o:p></p><p class=MsoNormal style='margin-left:.5in'><span style='font-size:12.0pt;font-family:"Times New Roman","serif"'><br>This, on the other hand, sounds like something I can agree with. Setting T1 to a running average plus some jitter tolerance makes sense to me</span><span style='font-size:12.0pt;font-family:"Times New Roman","serif";color:#1F497D'>.<o:p></o:p></span></p><p class=MsoNormal style='margin-left:.5in'><span style='font-size:12.0pt;font-family:"Times New Roman","serif";color:#1F497D'><o:p> </o:p></span></p><p class=MsoNormal style='margin-left:.5in'><span style='font-size:12.0pt;font-family:"Times New Roman","serif";color:#1F497D'>And it is the spirit of the RFC and generally accepted practice.<o:p></o:p></span></p><p class=MsoNormal style='margin-left:.5in'><span style='font-size:12.0pt;font-family:"Times New Roman","serif";color:#1F497D'><o:p> </o:p></span></p><p class=MsoNormal style='margin-left:.5in'><span style='font-size:12.0pt;font-family:"Times New Roman","serif";color:#1F497D'><o:p> </o:p></span></p><p class=MsoNormal style='margin-left:.5in'><span style='font-size:12.0pt;font-family:"Times New Roman","serif";color:#1F497D'>Our application requires us to patch this to interop correctly. Our platform consists of many asterisk clusters service tens of thousands of users and connected to dozens of carriers. We need to be ability to control timer1 (and subsequently timerB) on an individual host basis. Granted the qualify/t1min strategy works for the majority of hosts. T1min is not optimal. Lastms+50ms would be optimal as it would set a sane T1 for each peer instead of one that is a compromise for most hosts.<o:p></o:p></span></p><p class=MsoNormal style='margin-left:.5in'><span style='font-size:12.0pt;font-family:"Times New Roman","serif";color:#1F497D'><o:p> </o:p></span></p><p class=MsoNormal style='margin-left:.5in'><span style='font-size:12.0pt;font-family:"Times New Roman","serif";color:#1F497D'>Ultimately I think the enforcement of t1min on non-monitored peers is not the intended behavior and should be changed, and the rest are merely suggestions for improvement.<o:p></o:p></span></p><p class=MsoNormal style='margin-left:.5in'><span style='font-size:12.0pt;font-family:"Times New Roman","serif";color:#1F497D'><o:p> </o:p></span></p><p class=MsoNormal style='margin-left:.5in'><span style='font-size:12.0pt;font-family:"Times New Roman","serif"'>.<br><br></span><span style='font-size:12.0pt;font-family:"Times New Roman","serif";color:#1F497D'><o:p></o:p></span></p><p class=MsoNormal><span style='color:#1F497D'><o:p> </o:p></span></p><p class=MsoNormal style='margin-left:.5in'> <o:p></o:p></p><p class=MsoNormal style='margin-left:.5in'>Comments or thoughts?<o:p></o:p></p><p class=MsoNormal style='margin-left:.5in'> <o:p></o:p></p><p class=MsoNormal style='margin-left:.5in'> <o:p></o:p></p><p class=MsoNormal style='margin-left:.5in'><span style='font-size:12.0pt;font-family:"Times New Roman","serif"'><br><br><o:p></o:p></span></p><p class=MsoNormal style='margin-left:.5in'><span style='font-size:12.0pt;font-family:"Times New Roman","serif"'><o:p> </o:p></span></p></div></body></html>