Skip to main content



mod_bert provides bert_test, an application that generates and captures a milliwatt tone and prints an error rate at the end. It also provides ESL events that can be used to load-test equipment and detect if there are audio gaps in some of the sessions. It only works with the PCMU codec.


Note that mod_bert is pretty naive: no real audio analysis is done beyond verifying the milliwatt PCMU sequence is received on each end (with the configured error tolerance). This means any kind of gain control, echo cancellation, etc. most likely will break the results.

You typically want to call the bert_test application on both ends of the call. You can also call bert on one end of the call and echo or delay_echo on the other end.

FreeSWITCH mod_bert <-----------> DUT <-------------> FreeSWITCH mod_bert or echo

FreeSWITCH mod_bert <-----------> (DUT in echo mode)

(DUT: Device under test)

The DUT can be either another FreeSWITCH instance or any other VoIP equipment (remember, no echo cancellation or AGC must be enabled in that system)

Most of the variables you see below are optional.

  • bert_timeout_ms is number of milliseconds before timing out trying to find the bit pattern that the application transmits (milliwatt).
  • bert_window_ms is number of milliseconds of the audio analysis window (each x milliseconds verifies how many errors have occurred, etc).
  • bert_max_err is the max number of allowed errors once the audio stream is in "sync".
  • bert_timer=soft tells the application to use FreeSWITCH core soft timer instead of timing transmission based on reception of packets (this should probably be default).
  • bert_hangup_on_error will hangup the call when audio errors occur.
  • bert_debug_io_file is for debugging the rx/tx audio.

Usage Example

<extension name="bert_test">
<condition field="destination_number" expression="^bert_test$">
<action application="set" data="bert_timeout_ms=5000"/>
<action application="set" data="bert_window_ms=1000"/>
<action application="set" data="bert_max_err=10"/>
<action application="set" data="bert_timer=soft"/>
<!--<action application="set" data="bert_hangup_on_error=yes"/>-->
<!--<action application="set" data="bert_debug_io_file=/tmp/bert_debug_${uuid}"/>-->
<action application="set" data="jitterbuffer_msec=100:200:40"/>
<action application="answer"/>
<action application="bert_test" />