Hi All,<br><br> Thought I would share my solution to this DTMF problem:  it turns out my ISP was capping my bandwidth &amp; dropping packets to keep the connection &amp; 1Mbps, so the experienced DTMF loss was actually packets being discarded.<br>
<br> On my way to this discovery I tested Freeswitch &amp; DTMF quite thoroughly &amp; never actually found any problems even at hundreds of concurrent calls.  Here is how I tested, who knows this might be useful to someone:<br>
<ul><li>I used SIPp to generate calls &amp; a Python script to log the received DTMF digits</li><li>SIPp command line:  </li><ul><li>sipp -sf dtmfSenario.xml -d 10000 -s 451  -l 96  -mp 5606 -i xxx.xxx.xxx.xxx</li></ul><li>
dtmfSenario.xml below<br></li><li>Dialplan:</li><ul><li>    &lt;extension name=&quot;test_dtmf_capture_test&quot;&gt;<br>      &lt;!--Grab calls for dialing --&gt;<br>      &lt;condition field=&quot;destination_number&quot; expression=&quot;(^100100$)&quot;&gt;<br>
        &lt;action application=&quot;answer&quot;/&gt;<br>        &lt;action application=&quot;python&quot; data=&quot;writeDtmfStats&quot;/&gt;<br>      &lt;/condition&gt;<br>    &lt;/extension&gt;</li></ul><li>Python:</li>
<ul><li>import sys<br>from freeswitch import *<br><br><br>def get_number(session,invalid,num=20):<br>        digits = session.getDigits(num, &quot;&quot;, 15000)<br><br>        consoleLog(&quot;info&quot;,&quot;Got &#39;%s&#39; digits from user.\n&quot; % digits)<br>
        if digits == &#39;&#39;:<br>                # Invalid call<br>                if invalid == 3:<br>                        consoleLog(&quot;info&quot;,&quot;Three invalid attempts!!\n&quot;)<br>                        session.streamFile(&quot;/usr/local/freeswitch/sounds/en/us/callie/misc/8000/invalid_extension.wav&quot;)<br>
                        session.hangup()<br>                        sys.exit(0)<br>                else:<br>                        session.streamFile(&quot;/usr/local/freeswitch/sounds/en/us/callie/misc/8000/invalid_extension.wav&quot;)<br>
                        get_number(session,invalid + 1)<br>        else:<br>                consoleLog(&quot;info&quot;,&quot;Got a valid number: %s, proceeding...\n&quot; % digits)<br>                return digits<br><br>
<br><br>def handler(session, args):<br>    session.streamFile(&quot;/usr/local/freeswitch/sounds/en/us/callie/ivr/8000/ivr-please_enter_extension_followed_by_pound.wav&quot;)<br>    numberToDial = get_number(session,2,num=10)<br>
    consoleLog(&#39;info&#39;,&#39;Got 10 DTMF digits. Writing &quot;1&quot; to file...\n&#39;)<br>    fo = open(&#39;/tmp/dtmfData.csv&#39;,&#39;a&#39;)<br>    fo.write(&#39;&quot;1&quot;\n&#39;)<br>    fo.close()<br>    # Do some stuff &amp; wait for SIPP to hangup<br>
    session.streamFile(&quot;/usr/local/freeswitch/sounds/en/us/callie/ivr/8000/ivr-please_enter_extension_followed_by_pound.wav&quot;)<br>    session.streamFile(&quot;/usr/local/freeswitch/sounds/en/us/callie/ivr/8000/ivr-please_enter_extension_followed_by_pound.wav&quot;)<br>
    return</li></ul><li>DTMF senario file:</li><ul><li># cat dtmfSenario.xml <br>&lt;?xml version=&quot;1.0&quot; encoding=&quot;ISO-8859-1&quot;?&gt;<br>&lt;!DOCTYPE scenario SYSTEM &quot;sipp.dtd&quot;&gt;<br>&lt;!-- This program is free software; you can redistribute it and/or      --&gt;<br>
&lt;!-- modify it under the terms of the GNU General Public License as     --&gt;<br>&lt;!-- published by the Free Software Foundation; either version 2 of the --&gt;<br>&lt;!-- License, or (at your option) any later version.                    --&gt;<br>
&lt;!--                                                                    --&gt;<br>&lt;!-- This program is distributed in the hope that it will be useful,    --&gt;<br>&lt;!-- but WITHOUT ANY WARRANTY; without even the implied warranty of     --&gt;<br>
&lt;!-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the      --&gt;<br>&lt;!-- GNU General Public License for more details.                       --&gt;<br>&lt;!--                                                                    --&gt;<br>
&lt;!-- You should have received a copy of the GNU General Public License  --&gt;<br>&lt;!-- along with this program; if not, write to the                      --&gt;<br>&lt;!-- Free Software Foundation, Inc.,                                    --&gt;<br>
&lt;!-- 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA             --&gt;<br>&lt;!--                                                                    --&gt;<br>&lt;!--                 Sipp &#39;uac&#39; scenario with pcap (rtp) play           --&gt;<br>
&lt;!--                                                                    --&gt;<br>&lt;scenario name=&quot;UAC with media&quot;&gt;<br>  &lt;!-- In client mode (sipp placing calls), the Call-ID MUST be         --&gt;<br>
  &lt;!-- generated by sipp. To do so, use [call_id] keyword.                --&gt;<br>  &lt;send retrans=&quot;500&quot;&gt;<br>    &lt;![CDATA[<br><br>      INVITE sip:[service]@[remote_ip]:[remote_port] SIP/2.0<br>      Via: SIP/2.0/[transport] [local_ip]:[local_port];branch=[branch]<br>
      From: sipp &lt;sip:sipp@[local_ip]:[local_port]&gt;;tag=[call_number]<br>      To: sut &lt;sip:[service]@[remote_ip]:[remote_port]&gt;<br>      Call-ID: [call_id]<br>      CSeq: 1 INVITE<br>      Contact: sip:sipp@[local_ip]:[local_port]<br>
      Max-Forwards: 70<br>      Subject: Performance Test<br>      Content-Type: application/sdp<br>      Content-Length: [len]<br><br>      v=0<br>      o=user1 53655765 2353687637 IN IP[local_ip_type] [local_ip]<br>      s=-<br>
      c=IN IP[local_ip_type] [local_ip]<br>      t=0 0<br>      m=audio [auto_media_port] RTP/AVP 18 100<br>      a=rtpmap:18 G729/8000<br>      a=fmtp:18 annexb=no<br>      a=rtpmap:100 telephone-event/8000<br>      a=fmtp:100 0-16<br>
      a=silenceSupp:off - - - -<br>      a=ptime:20<br>      a=sendrecv<br>    ]]&gt;<br>  &lt;/send&gt;<br><br>&lt;!--      a=rtpmap:8 PCMA/8000 --&gt;<br>  &lt;recv response=&quot;100&quot; optional=&quot;true&quot;&gt;<br>
  &lt;/recv&gt;<br><br>  &lt;recv response=&quot;180&quot; optional=&quot;true&quot;&gt;<br>  &lt;/recv&gt;<br><br>  &lt;!-- By adding rrs=&quot;true&quot; (Record Route Sets), the route sets         --&gt;<br>  &lt;!-- are saved and used for following messages sent. Useful to test   --&gt;<br>
  &lt;!-- against stateful SIP proxies/B2BUAs.                             --&gt;<br>  &lt;recv response=&quot;200&quot; rtd=&quot;true&quot; crlf=&quot;true&quot;&gt;<br>  &lt;/recv&gt;<br><br>  &lt;!-- Packet lost can be simulated in any send/recv message by         --&gt;<br>
  &lt;!-- by adding the &#39;lost = &quot;10&quot;&#39;. Value can be [1-100] percent.       --&gt;<br>  &lt;send&gt;<br>    &lt;![CDATA[<br><br>      ACK sip:[service]@[remote_ip]:[remote_port] SIP/2.0<br>      Via: SIP/2.0/[transport] [local_ip]:[local_port];branch=[branch]<br>
      From: sipp &lt;sip:sipp@[local_ip]:[local_port]&gt;;tag=[call_number]<br>      To: sut &lt;sip:[service]@[remote_ip]:[remote_port]&gt;[peer_tag_param]<br>      Call-ID: [call_id]<br>      CSeq: 1 ACK<br>      Contact: sip:sipp@[local_ip]:[local_port]<br>
      Max-Forwards: 70<br>      Subject: Performance Test<br>      Content-Length: 0<br><br>    ]]&gt;<br>  &lt;/send&gt;<br><br>  &lt;!-- Play a pre-recorded PCAP file (RTP stream)                       --&gt;<br>&lt;!--<br>
  &lt;nop&gt;<br>    &lt;action&gt;<br>      &lt;exec play_pcap_audio=&quot;g711a.pcap&quot;/&gt;<br>    &lt;/action&gt;<br>  &lt;/nop&gt;<br>--&gt;<br><br>  &lt;!-- Pause 8 seconds, which is approximately the duration of the      --&gt;<br>
  &lt;!-- PCAP file                                                        --&gt;<br>  &lt;pause milliseconds=&quot;5000&quot;/&gt;<br><br>  &lt;!-- Play an out of band DTMF &#39;1&#39;                                     --&gt;<br>
  &lt;nop&gt;<br>    &lt;action&gt;<br>      &lt;exec play_pcap_audio=&quot;dtmf_2833_1.pcap&quot;/&gt;<br>    &lt;/action&gt;<br>  &lt;/nop&gt;<br><br>  &lt;pause milliseconds=&quot;1000&quot;/&gt;<br> <br>  &lt;!-- Play an out of band DTMF &#39;1&#39;                                     --&gt;<br>
  &lt;nop&gt;<br>    &lt;action&gt;<br>      &lt;exec play_pcap_audio=&quot;dtmf_2833_1.pcap&quot;/&gt;<br>    &lt;/action&gt;<br>  &lt;/nop&gt;<br>  &lt;pause milliseconds=&quot;1000&quot;/&gt;<br> <br>  &lt;!-- Play an out of band DTMF &#39;1&#39;                                     --&gt;<br>
  &lt;nop&gt;<br>    &lt;action&gt;<br>      &lt;exec play_pcap_audio=&quot;dtmf_2833_1.pcap&quot;/&gt;<br>    &lt;/action&gt;<br>  &lt;/nop&gt;<br>  &lt;pause milliseconds=&quot;500&quot;/&gt;<br> <br>  &lt;!-- Play an out of band DTMF &#39;1&#39;                                     --&gt;<br>
  &lt;nop&gt;<br>    &lt;action&gt;<br>      &lt;exec play_pcap_audio=&quot;dtmf_2833_1.pcap&quot;/&gt;<br>    &lt;/action&gt;<br>  &lt;/nop&gt;<br>  &lt;pause milliseconds=&quot;500&quot;/&gt;<br> <br>  &lt;!-- Play an out of band DTMF &#39;1&#39;                                     --&gt;<br>
  &lt;nop&gt;<br>    &lt;action&gt;<br>      &lt;exec play_pcap_audio=&quot;dtmf_2833_1.pcap&quot;/&gt;<br>    &lt;/action&gt;<br>  &lt;/nop&gt;<br>  &lt;pause milliseconds=&quot;500&quot;/&gt;<br> <br>  &lt;!-- Play an out of band DTMF &#39;1&#39;                                     --&gt;<br>
  &lt;nop&gt;<br>    &lt;action&gt;<br>      &lt;exec play_pcap_audio=&quot;dtmf_2833_1.pcap&quot;/&gt;<br>    &lt;/action&gt;<br>  &lt;/nop&gt;<br>  &lt;pause milliseconds=&quot;500&quot;/&gt;<br> <br>  &lt;!-- Play an out of band DTMF &#39;1&#39;                                     --&gt;<br>
  &lt;nop&gt;<br>    &lt;action&gt;<br>      &lt;exec play_pcap_audio=&quot;dtmf_2833_1.pcap&quot;/&gt;<br>    &lt;/action&gt;<br>  &lt;/nop&gt;<br>  &lt;pause milliseconds=&quot;500&quot;/&gt;<br> <br>  &lt;!-- Play an out of band DTMF &#39;1&#39;                                     --&gt;<br>
  &lt;nop&gt;<br>    &lt;action&gt;<br>      &lt;exec play_pcap_audio=&quot;dtmf_2833_1.pcap&quot;/&gt;<br>    &lt;/action&gt;<br>  &lt;/nop&gt;<br>  &lt;pause milliseconds=&quot;500&quot;/&gt;<br> <br>  &lt;!-- Play an out of band DTMF &#39;1&#39;                                     --&gt;<br>
  &lt;nop&gt;<br>    &lt;action&gt;<br>      &lt;exec play_pcap_audio=&quot;dtmf_2833_1.pcap&quot;/&gt;<br>    &lt;/action&gt;<br>  &lt;/nop&gt;<br>  &lt;pause milliseconds=&quot;500&quot;/&gt;<br> <br>  &lt;!-- Play an out of band DTMF &#39;1&#39;                                     --&gt;<br>
  &lt;nop&gt;<br>    &lt;action&gt;<br>      &lt;exec play_pcap_audio=&quot;dtmf_2833_1.pcap&quot;/&gt;<br>    &lt;/action&gt;<br>  &lt;/nop&gt;<br><br>  &lt;pause milliseconds=&quot;2000&quot;/&gt;<br><br>  &lt;!-- The &#39;crlf&#39; option inserts a blank line in the statistics report. --&gt;<br>
  &lt;send retrans=&quot;500&quot;&gt;<br>    &lt;![CDATA[<br><br>      BYE sip:[service]@[remote_ip]:[remote_port] SIP/2.0<br>      Via: SIP/2.0/[transport] [local_ip]:[local_port];branch=[branch]<br>      From: sipp &lt;sip:sipp@[local_ip]:[local_port]&gt;;tag=[call_number]<br>
      To: sut &lt;sip:[service]@[remote_ip]:[remote_port]&gt;[peer_tag_param]<br>      Call-ID: [call_id]<br>      CSeq: 2 BYE<br>      Contact: sip:sipp@[local_ip]:[local_port]<br>      Max-Forwards: 70<br>      Subject: Performance Test<br>
      Content-Length: 0<br><br>    ]]&gt;<br>  &lt;/send&gt;<br><br>  &lt;recv response=&quot;200&quot; crlf=&quot;true&quot;&gt;<br>  &lt;/recv&gt;<br><br>  &lt;!-- definition of the response time repartition table (unit is ms)   --&gt;<br>
  &lt;ResponseTimeRepartition value=&quot;10, 20, 30, 40, 50, 100, 150, 200&quot;/&gt;<br><br>  &lt;!-- definition of the call length repartition table (unit is ms)     --&gt;<br>  &lt;CallLengthRepartition value=&quot;10, 50, 100, 500, 1000, 5000, 10000&quot;/&gt;<br>
<br>&lt;/scenario&gt;<br></li></ul></ul>Cheers,<br><br>Michael<br><br><div class="gmail_quote">On Mon, Nov 16, 2009 at 5:25 PM, Anthony Minessale <span dir="ltr">&lt;<a href="mailto:anthony.minessale@gmail.com">anthony.minessale@gmail.com</a>&gt;</span> wrote:<br>
<blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">That&#39;s a pretty small problem description to be so sure about something.<br>It would probably be better to capture some evidence of the exact problem you are having since we are using computers and we need to see the computers in action doing something specifically incorrect to diagnose any sort of problem.  Take the time to describe the origin and destination of your calls, the call flow, the hardware in use on both ends of the call, detailed console logs on debug level, (maybe even uncomment the 2833 debug ifded in switch_rtp.c) and gather something to go on besides &quot;I seem to be losing dtmf) maybe a packect capture of the networking interface on both ends of these calls.<br>

 <br>Also problems should be reported to <a href="http://jira.freeswitch.org" target="_blank">http://jira.freeswitch.org</a> not this mailing list.<br>Save us a step if you report a jira and provide all the info above or we will just have to ask for it again.<br>

<br><br><div class="gmail_quote"><div><div></div><div class="h5">On Mon, Nov 16, 2009 at 1:07 AM, Michael Toop <span dir="ltr">&lt;<a href="mailto:michaelt@voxcore.voxtelecom.co.za" target="_blank">michaelt@voxcore.voxtelecom.co.za</a>&gt;</span> wrote:<br>
</div></div><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;"><div><div></div><div class="h5">
Hi All,<br><br> I have an issue that when my call volumes on my FS IVR
box &gt; 30 calls DTMF digits are lost (using RFC2833).  It is definitely load related as it all works perfectly under 30 calls.<br><br> Any pointers or a solution to the problem? <br>
<br>Thanks,<br><font color="#888888"><br>Michael
</font><br></div></div>_______________________________________________<br>
FreeSWITCH-users mailing list<br>
<a href="mailto:FreeSWITCH-users@lists.freeswitch.org" target="_blank">FreeSWITCH-users@lists.freeswitch.org</a><br>
<a href="http://lists.freeswitch.org/mailman/listinfo/freeswitch-users" target="_blank">http://lists.freeswitch.org/mailman/listinfo/freeswitch-users</a><br>
UNSUBSCRIBE:<a href="http://lists.freeswitch.org/mailman/options/freeswitch-users" target="_blank">http://lists.freeswitch.org/mailman/options/freeswitch-users</a><br>
<a href="http://www.freeswitch.org" target="_blank">http://www.freeswitch.org</a><br>
<br></blockquote></div><br><br clear="all"><br>-- <br>Anthony Minessale II<br><br>FreeSWITCH <a href="http://www.freeswitch.org/" target="_blank">http://www.freeswitch.org/</a><br>ClueCon <a href="http://www.cluecon.com/" target="_blank">http://www.cluecon.com/</a><br>

Twitter: <a href="http://twitter.com/FreeSWITCH_wire" target="_blank">http://twitter.com/FreeSWITCH_wire</a><br><br>AIM: anthm<br><a href="mailto:MSN%3Aanthony_minessale@hotmail.com" target="_blank">MSN:anthony_minessale@hotmail.com</a><br>
GTALK/JABBER/<a href="mailto:PAYPAL%3Aanthony.minessale@gmail.com" target="_blank">PAYPAL:anthony.minessale@gmail.com</a><br>
IRC: <a href="http://irc.freenode.net" target="_blank">irc.freenode.net</a> #freeswitch<br><br>FreeSWITCH Developer Conference<br><a href="mailto:sip%3A888@conference.freeswitch.org" target="_blank">sip:888@conference.freeswitch.org</a><br>
<a href="http://iax:guest@conference.freeswitch.org/888" target="_blank">iax:guest@conference.freeswitch.org/888</a><br>
<a href="mailto:googletalk%3Aconf%2B888@conference.freeswitch.org" target="_blank">googletalk:conf+888@conference.freeswitch.org</a><br>pstn:213-799-1400<br>
<br>_______________________________________________<br>
FreeSWITCH-users mailing list<br>
<a href="mailto:FreeSWITCH-users@lists.freeswitch.org">FreeSWITCH-users@lists.freeswitch.org</a><br>
<a href="http://lists.freeswitch.org/mailman/listinfo/freeswitch-users" target="_blank">http://lists.freeswitch.org/mailman/listinfo/freeswitch-users</a><br>
UNSUBSCRIBE:<a href="http://lists.freeswitch.org/mailman/options/freeswitch-users" target="_blank">http://lists.freeswitch.org/mailman/options/freeswitch-users</a><br>
<a href="http://www.freeswitch.org" target="_blank">http://www.freeswitch.org</a><br>
<br></blockquote></div><br>