sipwise RTPengine
Sipwise NGCP rtpengine is a proxy for RTP traffic and other UDP based media traffic. esentially it is a Kernel-based packet controlled by sip proxy server usually on UDP port 22222 it maintains a pair of ports on public interface for each media stream audio or video one pair on odd port numbers for the media data ( RTP) , and one pair on the next even port numbers for meta data (RTCP)
When the media streams are negotiated, rtpengine opens the ports in user-space and starts relaying the packets to the addresses announced by the endpoints.
When NAT is applied , sip packets may come from a diff source address than declared in SDP, in such a case source address is implicitly changed to the address the packets are received from.
Once the call is established and the rtpengine has received media packets from both endpoints for this call, the media stream is pushed into the kernel and is then handled by a custom Sipwise iptables module to increase the throughput of the system and to reduce the latency of media packets.
steps
- step 1 : Setup registrar
UA1 john — REGISTER –> kamailio registrar UA2 alice — REGISTER –> kamailio registrar
- step 2 : handle invite
UA1 –INVITE –> Kamailio proxy
when SDP arrives in INVITE message , make an offer to rtpengine Kamailio proxy – offer –> RTP Engine
- final step : Call is established
UA1 – sip –>kamailio –> UA2 UA1 – rtp –> RTP engine –> UA2
As sip messages proxy via the SIP server , the rtp packets relay via the rtpengine
Quick RTPengine Installation using
For detailed steps goto https://telecom.altanai.com/2018/04/03/rtp-engine-on-kamailio-sip-server/
dependencies
apt-get remove rtpproxy
sudo apt install debhelper iptables-dev libcurl4-openssl-dev libglib2.0-dev libxmlrpc-core-c3-dev libhiredis-dev markdown build-essential:native
source
git clone https://github.com/sipwise/rtpengine.git
cd rtpengine
./debian/flavors/no_ngcp
build package and install deb files
sudo dpkg-buildpackage
sudo dpkg -i ngcp-rtpengine-daemon_4.1.0.0+0~mr4.1.0.0_amd64.deb
sudo dpkg -i ngcp-rtpengine-iptables_4.1.0.0+0~mr4.1.0.0_amd64.deb
sudo dpkg -i ngcp-rtpengine-dbg_4.1.0.0+0~mr4.1.0.0_amd64.deb
sudo apt-get -f install
sudo dpkg -i ngcp-rtpengine-kernel-dkms_4.1.0.0+0~mr4.1.0.0_all.deb
sudo dpkg -i ngcp-rtpengine-kernel-source_4.1.0.0+0~mr4.1.0.0_all.deb
sudo dpkg -i ngcp-rtpengine_4.1.0.0+0~mr4.1.0.0_all.deb
edit the /etc/default/ngcp-rtpengine-daemon file with interfaces
RUN_RTPENGINE=yes
LISTEN_UDP=12222
LISTEN_NG=22222
LISTEN_CLI=9900
INTERFACES="internal/10.20.30.40!123.234.345.567 external/123.234.345.567"
TIMEOUT=60
SILENT_TIMEOUT=3600
PIDFILE=/var/run/ngcp-rtpengine-daemon.pid
FORK=yes
TABLE=0
PORT_MIN=40000
PORT_MAX=60000
Run
Can run in foreground mode
rtpengine --interface=x.x.x.x --listen-ng=25061 --listen-cli=25062 --foreground --log-stderr --listen-udp=22222 --listen-tcp=25060
or as daemon service
starting ngcp-rtp daemon service
/etc/init.d/ngcp-rtpengine-daemon start
[ ok ] Starting ngcp-rtpengine-daemon (via systemctl): ngcp-rtpengine-daemon.service.
check status
>systemctl status ngcp-rtpengine-daemon.service
● ngcp-rtpengine-daemon.service - NGCP RTP/media Proxy Daemon
Loaded: loaded (/lib/systemd/system/ngcp-rtpengine-daemon.service; disabled; vendor preset: enabled)
Active: active (running) since Fri 2018-07-26 14:53:20 UTC; 5s ago
Process: 24594 ExecStopPost=/usr/sbin/ngcp-rtpengine-iptables-setup stop (code=exited, status=0/SUCCESS)
Process: 24640 ExecStartPre=/usr/sbin/ngcp-rtpengine-iptables-setup start (code=exited, status=0/SUCCESS)
Main PID: 24657 (rtpengine)
Tasks: 20
Memory: 12.5M
CPU: 71ms
CGroup: /system.slice/ngcp-rtpengine-daemon.service
└─24657 /usr/sbin/rtpengine -f -E --no-log-timestamps --pidfile /run/ngcp-rtpengine-daemon.pid --config-file /etc/rtpengine/rtpengine.conf --table 0
systemd[1]: Starting NGCP RTP/media Proxy Daemon...
rtpengine[24657]: INFO: Generating new DTLS certificate
rtpengine[24657]: INFO: Startup complete, version 7.5.0.0+0~mr7.5.0.0 git-master-3b6f098
systemd[1]: Started NGCP RTP/media Proxy Daemon.
log checks form syslog
tail -f /var/log/syslog
rtpengine[12058]: DEBUG: timer run time = 0.000032 sec
rtpengine[12058]: DEBUG: timer run time = 0.000034 sec
...
checks threads
>ps -ef | grep ngcp-rtpengine
checks codecs
INFO - *****************************
INFO - *** supported codecs ***
PCMA: fully supported
PCMU: fully supported
G723: fully supported
G722: fully supported
QCELP: supported for decoding only
G729: supported for decoding only
speex: fully supported
GSM: fully supported
iLBC: supported for decoding only
opus: fully supported
vorbis: codec supported but lacks RTP definition
ac3: codec supported but lacks RTP definition
eac3: codec supported but lacks RTP definition
ATRAC3: supported for decoding only
ATRAC-X: supported for decoding only
EVRC: supported for decoding only
EVRC0: supported for decoding only
EVRC1: supported for decoding only
AMR: fully supported
AMR-WB: fully supported
PCM-S16LE: codec supported but lacks RTP definition
PCM-U8: codec supported but lacks RTP definition
MP3: codec supported but lacks RTP definition
INFO - *****************************
Integrition with kamailio
loadmodule "rtpengine.so"
modparam("rtpengine", "rtpengine_sock", "udp:127.0.0.1:22222")
...
if (is_method("INVITE|REFER")) {
record_route();
if (has_body("application/sdp")) {
if (rtpengine_offer()) {
t_on_reply("1");
}
} else {
t_on_reply("2");
}
...
if (is_method("ACK") && has_body("application/sdp")) {
rtpengine_answer();
}
route(RELAY);
}
kamcmd reload rtpengine
kamcmd -s tcp:x.x.x.x:2046 rtpengine.reload
kamcmd check rtpengine status
kamcmd -s tcp:x.x.x.x:2046 rtpengine.show all
Working
Offer
s=Bria 3 release 3.5.5 stamp 71243
c=IN IP4 rtp_engine_ip
t=0 0
m=audio 51472 RTP/AVP 9 0 18 98 101
a=rtpmap:18 G729/8000
a=fmtp:18 annexb=yes
a=rtpmap:98 ILBC/8000
a=rtpmap:101 telephone-event/8000
a=fmtp:101 0-15
a=sendrecv
", "call-id": "callid", "received-from": [ "IP4", "sip_ua_ip" ], "from-tag": "5198f57f", "command": "offer" }
[[ID="callid"]: Creating new call
[ID="callid"]: Default sink codec is G722/8000
[ID="callid"]: Creating codec handler for G722/8000
[ID="callid"]: Sink supports codec G722/8000
[ID="callid"]: Creating codec handler for PCMU/8000
[ID="callid"]: Sink supports codec PCMU/8000
[ID="callid"]: Creating codec handler for G729/8000
[ID="callid"]: Creating codec handler for ILBC/8000
[ID="callid"]: Creating codec handler for telephone-event/8000
[ID="callid"]: creating send_timer
[ID="callid"]: creating send_timer
[ID="callid"]: creating send_timer
[ID="callid"]: creating send_timer
[ID="callid"]: set FILLED flag for stream rtp_engine_ip:51472
[ID="callid"]: set FILLED flag for stream rtp_engine_ip:51473[ID="callid"]: Replying to 'offer' from from_ip:57166 (elapsed time 0.001471 sec)
[1563192870.453903] DEBUG: [ID="callid"]: Response dump for 'offer' to from_ip:57166: { "sdp": "v=0
o=- 1563192870324300 1 IN IP4 rtp_engine_ip
s=Bria 3 release 3.5.5 stamp 71243
c=IN IP4 rtp_engine_pub_ip
t=0 0
m=audio 10052 RTP/AVP 9 0 18 98 101
a=rtpmap:9 G722/8000
a=rtpmap:0 PCMU/8000
a=rtpmap:18 G729/8000
a=rtpmap:98 ILBC/8000
a=rtpmap:101 telephone-event/8000
a=fmtp:18 annexb=yes
a=fmtp:101 0-15
a=sendrecv
a=rtcp:10053
a=ice-ufrag:J2eKBWSO
a=ice-pwd:3MjkMLYAKe3CN4rvCtQEq1twAK
a=candidate:b2yZ1hLMPAbVI08J 1 UDP 2130706431 rtp_engine_pub_ip 10052 typ host
a=candidate:b2yZ1hLMPAbVI08J 2 UDP 2130706430 rtp_engine_pub_ip 10053 typ host
", "result": "ok" }
[1563192872.000170] DEBUG:
Notice the RTPengine changng the oline in SDP with its own address to successfully relay the media before o line has clients address 192.168.1.109
v=0
o=- 1590109986345922 1 IN IP4 192.168.1.109
s=Bria release 6.1.0 stamp 103103
c=IN IP4 192.168.1.109
t=0 0
m=audio 63606 RTP/AVP 0 8 101
a=rtpmap:101 telephone-event/8000
a=fmtp:101 0-15
a=sendrecv
after SDP manipulation o line gets rtp engine address 192.168.1.111
v=0
o=- 1590109986345922 1 IN IP4 192.168.1.111
s=Bria release 6.1.0 stamp 103103
c=IN IP4 192.168.1.111
t=0 0
m=audio 30036 RTP/AVPF 8
a=rtpmap:8 PCMA/8000
a=sendrecv
Simillarly for answer
RTP engine options
-v, --version Print build time and exit
--config-file=FILE Load config from this file
--config-section=STRING Config file section to use
--codecs Print a list of supported codecs and exit
Logs realted
--log-facility=daemon|local0|...|local7 Syslog facility to use for logging
-L, --log-level=INT Mask log priorities above this level
-E, --log-stderr Log on stderr instead of syslog
--no-log-timestamps Drop timestamps from log lines to stderr
--log-mark-prefix Prefix for sensitive log info
--log-mark-suffix Suffix for sensitive log info
-p, --pidfile=FILE Write PID to file
-f, --foreground Don't fork to background
-t, --table=INT Kernel table to use
-F, --no-fallback Only start when kernel module is available
--log-facility-cdr=daemon|local0|...|local7 Syslog facility to use for logging CDRs
--log-facility-rtcp=daemon|local0|...|local7 Syslog facility to use for logging RTCP
--log-facility-dtmf=daemon|local0|...|local7 Syslog facility to use for logging DTMF
--log-format=default|parsable Log prefix format
Interface related
-i, --interface=[NAME/]IP[!IP] Local interface for RTP
-k, --subscribe-keyspace=INT INT ... Subscription keyspace list
-l, --listen-tcp=[IP:]PORT TCP port to listen on
-u, --listen-udp=[IP46|HOSTNAME:]PORT UDP port to listen on
-n, --listen-ng=[IP46|HOSTNAME:]PORT UDP port to listen on, NG protocol
-c, --listen-cli=[IP46|HOSTNAME:]PORT UDP port to listen on, CLI
-g, --graphite=IP46|HOSTNAME:PORT Address of the graphite server
-G, --graphite-interval=INT Graphite send interval in seconds
--graphite-prefix=STRING Prefix for graphite line
-T, --tos=INT Default TOS value to set on streams
--control-tos=INT Default TOS value to set on control-ng
-m, --port-min=INT Lowest port to use for RTP
-M, --port-max=INT Highest port to use for RTP
Timeouts
-o, --timeout=SECS RTP timeout
-s, --silent-timeout=SECS RTP timeout for muted
-a, --final-timeout=SECS Call timeout
--offer-timeout=SECS Timeout for incomplete one-sided calls
Redis based
-r, --redis=[PW@]IP:PORT/INT Connect to Redis database
-w, --redis-write=[PW@]IP:PORT/INT Connect to Redis write database
--redis-num-threads=INT Number of Redis restore threads
--redis-expires=INT Expire time in seconds for redis keys
-q, --no-redis-required Start no matter of redis connection state
--redis-allowed-errors=INT Number of allowed errors before redis is temporarily disabled
--redis-disable-time=INT Number of seconds redis communication is disabled because of errors
--redis-cmd-timeout=INT Sets a timeout in milliseconds for redis commands
--redis-connect-timeout=INT Sets a timeout in milliseconds for redis connections
XMLRPC
-b, --b2b-url=STRING XMLRPC URL of B2B UA
-x, --xmlrpc-format=INT XMLRPC timeout request format to use. 0: SEMS DI, 1: call-id only, 2: Kamailio
--num-threads=INT Number of worker threads to create
--media-num-threads=INT Number of worker threads for media playback
-d, --delete-delay=INT Delay for deleting a session from memory.
--sip-source Use SIP source address by default
--dtls-passive Always prefer DTLS passive role
--max-sessions=INT Limit of maximum number of sessions
--max-load=FLOAT Reject new sessions if load averages exceeds this value
--max-cpu=FLOAT Reject new sessions if CPU usage (in percent) exceeds this value
--max-bandwidth=INT Reject new sessions if bandwidth usage (in bytes per second) exceeds this value
RTCP stats on Homer
--homer=IP46|HOSTNAME:PORT Address of Homer server for RTCP stats
--homer-protocol=udp|tcp Transport protocol for Homer (default udp)
--homer-id=INT 'Capture ID' to use within the HEP protocol
--recording-dir=FILE Directory for storing pcap and metadata files
--recording-method=pcap|proc Strategy for call recording
--recording-format=raw|eth File format for stored pcap files
--iptables-chain=STRING Add explicit firewall rules to this iptables chain
--scheduling=default|none|fifo|rr|other|batch|idle Thread scheduling policy
--priority=INT Thread scheduling priority
--idle-scheduling=default|none|fifo|rr|other|batch|idle Idle thread scheduling policy
--idle-priority=INT Idle thread scheduling priority
--log-srtp-keys Log SRTP keys to error log
based on mysql
--mysql-host=HOST|IP MySQL host for stored media files
--mysql-port=INT MySQL port
--mysql-user=USERNAME MySQL connection credentials
--mysql-pass=PASSWORD MySQL connection credentials
--mysql-query=STRING MySQL select query
Manually Build RTPengine from Source
with_transcoding=no with_iptables_option=no make -C daemon
Issue 1 Build fail on openssl
No rule to make target `/usr/local/include/openssl/kssl.h', needed by `.depend'. Stop.
soluion if opensssl is not installed then install
brew install openssl
if already present then upgrade
brew upgrade openssl@1.1
Additionally your brew shows updated dependencoes then simply update the location of ssl folder to where it is required liek
cp -r /usr/local/ssl/include/openssl /usr/local/include
Issue 2 build fails on glib
make[3]: *** No rule to make target `/usr/local/Cellar/glib/2.62.0/include/glib-2.0/glib.h', needed by `.depend'. Stop.
Solution Install glib
brew install glib
see if the version of teh glib matches with the required one
brew info glib
If you have a different version install than required by this moduel then simply change the version as text replace all in .depent file in daemon folder i replaced all 2.62.0 with my insatlled version of glib which was 2.64.2_1
so before
/usr/local/Cellar/glib/2.64.2_1/include/glib-2.0/glib/garray.h \
/usr/local/Cellar/glib/2.62.0/include/glib-2.0/glib/gasyncqueue.h \
/usr/local/Cellar/glib/2.62.0/include/glib-2.0/glib/gthread.h \
/usr/local/Cellar/glib/2.62.0/include/glib-2.0/glib/gatomic.h \
/usr/local/Cellar/glib/2.62.0/include/glib-2.0/glib/gerror.h \
and after replace
/usr/local/Cellar/glib/2.64.2_1/include/glib-2.0/glib/garray.h \
/usr/local/Cellar/glib/2.64.2_1/include/glib-2.0/glib/gasyncqueue.h \
/usr/local/Cellar/glib/2.64.2_1/include/glib-2.0/glib/gthread.h \
/usr/local/Cellar/glib/2.64.2_1/include/glib-2.0/glib/gatomic.h \
/usr/local/Cellar/glib/2.64.2_1/include/glib-2.0/glib/gerror.h \
Issue 3 build fails at swresample
make[3]: *** No rule to make target `/usr/local/Cellar/ffmpeg/4.1.4_2/include/libswresample/swresample.h', needed by `.depend'. Stop.
Solution again I have ffmpeg version 4.2.2_3 but the version this modules asks is 4.1.4_2 , so rpelec the .depend file so before
/usr/local/Cellar/ffmpeg/4.1.4_2/include/libswresample/swresample.h \
/usr/local/Cellar/ffmpeg/4.1.4_2/include/libavutil/channel_layout.h \
/usr/local/Cellar/ffmpeg/4.1.4_2/include/libavutil/frame.h \
/usr/local/Cellar/ffmpeg/4.1.4_2/include/libavutil/avutil.h \
/usr/local/Cellar/ffmpeg/4.1.4_2/include/libavutil/common.h \
and after replacing version
/usr/local/Cellar/ffmpeg/4.2.2_3/include/libswresample/swresample.h \
/usr/local/Cellar/ffmpeg/4.2.2_3/include/libavutil/channel_layout.h \
/usr/local/Cellar/ffmpeg/4.2.2_3/include/libavutil/frame.h \
/usr/local/Cellar/ffmpeg/4.2.2_3/include/libavutil/avutil.h \
/usr/local/Cellar/ffmpeg/4.2.2_3/include/libavutil/common.h \
Issue 4 Failed build at mysql server files
make[3]: *** No rule to make target `/usr/local/Cellar/mysql/8.0.19/include/mysql/binary_log_types.h', needed by `.depend'. Stop.
Failed build with ../lib/dtmf_rx_fillin-02.h
Solution Install mysql server
brew install mysql@5.7
then copy the file to requred location
cp /usr/local/Cellar/mysql@5.7/5.7.29/include/mysql/binary_log_types.h /usr/local/Cellar/mysql/8.0.19/include/mysql/
Issue 5
make[3]: *** No rule to make target `../include/t38.h', needed by `.depend'. Stop.
Failed build with ../lib/dtmf_rx_fillin-02.h
Issue 6 Build fail
poller.c:12:10: fatal error: 'sys/epoll.h' file not found
#include <sys/epoll.h>
^~~~~~~~~~~~~
1 error generated.
call.c:15:10: fatal error: 'xmlrpc_client.h' file not found
#include <xmlrpc_client.h>
^~~~~~~~~~~~~~~~~
1 error generated.
redis.c:18:10: fatal error: 'json-glib/json-glib.h' file not found
#include <json-glib/json-glib.h>
^~~~~~~~~~~~~~~~~~~~~~~
1 error generated.
stun.c:9:10: fatal error: 'endian.h' file not found
#include <endian.h>
^~~~~~~~~~
1 error generated.
iptables.c:13:10: fatal error: 'libiptc/libiptc.h' file not found
#include <libiptc/libiptc.h>
^~~~~~~~~~~~~~~~~~~
1 error generated.
..
Package openssl was not found in the pkg-config search path.
Perhaps you should add the directory containing `openssl.pc'
to the PKG_CONFIG_PATH environment variable
No package 'openssl' found
/bin/sh: xmlrpc-c-config: command not found
Package libiptc was not found in the pkg-config search path.
Perhaps you should add the directory containing `libiptc.pc'
to the PKG_CONFIG_PATH environment variable
No package 'libiptc' found
Package libcrypto was not found in the pkg-config search path.
Perhaps you should add the directory containing `libcrypto.pc'
to the PKG_CONFIG_PATH environment variable
No package 'libcrypto' found
Package openssl was not found in the pkg-config search path.
Perhaps you should add the directory containing `openssl.pc'
to the PKG_CONFIG_PATH environment variable
No package 'openssl' found
/bin/sh: xmlrpc-c-config: command not found
Package libiptc was not found in the pkg-config search path.
Perhaps you should add the directory containing `libiptc.pc'
to the PKG_CONFIG_PATH environment variable
No package 'libiptc' found
Solution install json-glib
brew install json-glib
for sye/epoll.h there are no alternatievs for mac so way to forward is to comment out poller.c from makefile
xmlrpiclient
call.c:15:10: fatal error: 'xmlrpc_client.h' file not found
#include <xmlrpc_client.h>
install zmlrpc-c brew
brew install xmlrpc-c
endian formatting for STUN
stun.c:9:10: fatal error: 'endian.h' file not found
ln -s /usr/include/machine/endian.h endian.h
The pkg-config program is used to retrieve information about installed libraries in the system. It is typically used to compile and link against one or more libraries
Issue7 lssl
ld: library not found for -lssl
clang: error: linker command failed with exit code 1 (use -v to see invocation)
make[3]: *** [dtmf_rx_fillin-test] Error 1
Failed build with ../lib/dtmf_rx_fillin-01.h
Trying build with ../lib/dtmf_rx_fillin-02.h
/bin/sh: line 1: 27478 Abort trap: 6 which dpkg-parsechangelog 2> /de
solutuib tbd
Issue 8
In file included from dtmf_rx_fillin-test.c:1:
./dtmf_rx_fillin.h:11:13: error: static declaration of 'dtmf_rx_fillin' follows non-static declaration
INLINE void dtmf_rx_fillin(dtmf_rx_state_t *dsp, int n) {
^
/usr/local/Cellar/spandsp/0.0.6_1/include/spandsp/dtmf.h:179:19: note: previous declaration is here
SPAN_DECLARE(int) dtmf_rx_fillin(dtmf_rx_state_t *s, int samples);
^
1 error generated.
make[3]: *** [dtmf_rx_fillin-test] Error 1
Solution ensure you have the mst updated version for spandsp lib spandsp is a library of Digital Signal Processing (DSP) functions for telephony In Asterisk, spandsp, is required for sending and receiving faxes.
also ensure that if its a checkout between tags or branch its a clean checkout
git clean -f -x -d
on debian
dpkg-checkbuilddeps
dpkg-buildpackage
Debugging
Issue1 : unknowdn codecs
[1564587040.078220] INFO: [ogi3dpopec8u56dffe3s]: --- Tag 'ufhj8jv9hg', created 0:00 ago for branch '', in dialogue with ''
[1564587040.078228] INFO: [ogi3dpopec8u56dffe3s]: ------ Media #1 (audio over UDP/TLS/RTP/SAVPF) using unknown codec
[1564587040.078298] INFO: [ogi3dpopec8u56dffe3s]: --- Tag '', created 0:00 ago for branch '', in dialogue with 'ufhj8jv9hg'
[1564587040.078306] INFO: [ogi3dpopec8u56dffe3s]: ------ Media #1 (audio over UDP/TLS/RTP/SAVPF) using unknown codec
solution : verify the list of codecs supported
> rtpengine --codecs
PCMA: fully supported
PCMU: fully supported
G723: fully supported
G722: fully supported
QCELP: supported for decoding only
G729: supported for decoding only
speex: fully supported
GSM: fully supported
iLBC: not supported
opus: fully supported
vorbis: codec supported but lacks RTP definition
ac3: codec supported but lacks RTP definition
eac3: codec supported but lacks RTP definition
ATRAC3: supported for decoding only
ATRAC-X: supported for decoding only
AMR: supported for decoding only
AMR-WB: supported for decoding only
telephone-event: fully supported
PCM-S16LE: codec supported but lacks RTP definition
PCM-U8: codec supported but lacks RTP definition
MP3: codec supported but lacks RTP definition
Assume the coedec list is
m=audio 55215 UDP/TLS/RTP/SAVPF 111 103 104 9 0 8 106 105 13 110 112 113 126
...
a=sendrecv
a=msid:LFYfHwNOw5Bz1FMVswSH66PueKArRgdmPUtI 1f578b40-b2ee-46da-b731-d35a76a75e9d
a=rtcp-mux
a=rtpmap:111 opus/48000/2
a=rtcp-fb:111 transport-cc
a=fmtp:111 minptime=10;useinbandfec=1
a=rtpmap:103 ISAC/16000
a=rtpmap:104 ISAC/32000
a=rtpmap:9 G722/8000
a=rtpmap:0 PCMU/8000
a=rtpmap:8 PCMA/8000
a=rtpmap:106 CN/32000
a=rtpmap:105 CN/16000
a=rtpmap:13 CN/8000
a=rtpmap:110 telephone-event/48000
a=rtpmap:112 telephone-event/32000
a=rtpmap:113 telephone-event/16000
a=rtpmap:126 telephone-event/8000
Ref : sipwise RTP engine https://github.com/sipwise/rtpengine