SIP Kamailio Examples Configurations and Lua scripts for the roles Kamailio can play

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

UA1 john — REGISTER –> kamailio registrar UA2 alice — REGISTER –> kamailio registrar

UA1 –INVITE –> Kamailio proxy

when SDP arrives in INVITE message , make an offer to rtpengine Kamailio proxy – offer –> RTP Engine

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