Skip to content

SEMS configuration

Yeti uses modified SEMS that has other configuration file format than mainstream version Configuration located at /etc/sems/sems.conf.

Section general

Section general contains some global daemon parameters:

general {
    node_id = 8
    stderr = no
    syslog_loglevel = 2
    syslog_facility = LOCAL0

    shutdown_mode {
        code = 508
        reason = "Node in shutdown mode"
        allow_uac = true
    }
    #~ pcap_upload_queue = pcap

    media_processor_threads = 1
    session_processor_threads = 1
    rtp_receiver_threads=1
    sip_udp_server_threads = 1
    sip_tcp_server_threads = 1

    dead_rtp_time=300

    max_shutdown_time = 10
    max_forwards = 70 

    session_limit {
        limit = 4000
        code = 509
        reason = "Node overloaded"
    }

    enable_srtp = yes
    enable_zrtp = yes
}
node_id (default: 0)
Unique node identifier. Value should be unique across cluster.
log_dump_path (default: /var/spool/sems/logdump)
Directory to save di_log module dumps on core.request.log.dump jsonrpc method call
rsr_path (default: /var/spool/sems/rsr)
Directory to save Raw SEMS Record files
pcap_upload_queue (default: empty)
destination name in the http_client module to automatically upload PCAP files
max_shutdown_time (default: 10)
max time in seconds to wait for sessions to cleanly end on shutdown

logging

syslog_loglevel (default: info)
Min log level for syslog log destination. allowed values: 0-5, error, warn, info, debug, debug2, debug3
syslog_facility (default: DAEMON)
Syslog facility value. allowed values: DAEMON, USER, LOCAL[0-7]
stderr (default: false)
Enable logging to stderr. Usable for debug purposes. Could be enabled by opt -E
stderr_loglevel (default: info)
Min log level for stderr log destination. allowed values: 0-5, error, warn, info, debug, debug2, debug3. Could be overridden by opt -D <level>
log_parsed_messages (default: true)
Whether to log parsed SIP requests in SipCtrlInterface at the DBG1 level
log_raw_messages (default: debug)
How to log raw SIP messages on send/recv. allowed values: error, warn, info, debug, debug2, debug3, no
unhandled_reply_loglevel (default: error)
How to log unhandled SIP provisional and success replies. allowed values: error, warn, info, debug, debug2, debug3, no
log_events (default: false)
Log events processing stages at the debug level
log_sessions (default: false)
Log new UAC/UAS sessions at the info level

signaling/media

force_outbound_if (default: false)
Force interface index for outgoing SIP and RTP packets. Uses IPPROTO_IP/IP_PKTINFO.ipi_ifindex, IPPROTO_IPV6/IPV6_PKTINFO.ipi6_ifindex for sendmsg
use_raw_sockets (default: false)
Global switch to use SOCK_RAW for outgoing SIP/UDP and RTP packets
ssl_key_log_file (default: empty)
Write TLS and SRTP secrets to the specified file in SSLKEYLOG format. Useful to decrypt signaling and media in the traces collected by the external tools.

signaling

session_processor_threads (default: 10)
Session processor threads count. Session processor threads handle events from the sessions events queues
sip_udp_server_threads (default: 4)
SIP UDP transport workers threads count. UDP transport workers receive UDP signaling traffic
sip_tcp_server_threads (default: 4)
SIP TCP transport workers threads count. TCP transport workers handle TCP/TLS/WS/WSS signaling traffic
sip_nat_handling (default: false)
Force SIP dialog Next Hop to be remote ip/port/trsp on requests with single Via header
proxy_sticky_auth (default: false)
Force uac_auth plugin to always send SIP request to the same endpoint that sent auth challenge (avoid DNS and DNS SRV balancing/failover)
ignore_notify_lower_cseq (default: false)
Ignore lower CSeq value for NOTIFY requests. fixes subscription dialog usage for implementations which follow 3265 instead of 5057
accept_forked_dialogs (default: false)
Use Via-branch to match dialogs in addition to the callid+remote_tag. By default requests with different Via-branch will be matched with the same dialog.
shutdown_mode
Subsection to define behavior in shutdown mode
shutdown_mode.code (default: 503)
SIP error code for new initial INVITES in shutdown mode
shutdown_mode.reason (default: Server shutting down)
SIP error reason for new initial INVITES in shutdown mode
shutdown_mode.allow_uac (default: false)
Allow new LegB creation in shutdown mode.
max_forwards (default: 70)
default value for the Max-Forwards header in the outgoing requests. allowed values: 1-70
session_limit.limit (default: 0)
limit active sessions count. reject incoming initial INVITES with session_limit.code (default: 503) session_limit.reason (default: Server overload). will increase sems_sessions_limit_rejects metric on rejects.
options_session_limit.limit (default: 0)
Reply with options_session_limit.code (default: 503) options_session_limit.reason (default: Server overload) for OPTIONS requests if active sessions count is greater than specified limit
cps_limit.limit (default: 0)
limit CPS. reject incoming initial INVITES with cps_limit.code (default: 503) cps_limit.reason (default: Server overload)
sip_timer
Override SIP timer default value in milliseconds. supported timers: A,B,D,E,F,K,G,H,I,J,L,M,C,BL
outbound_proxy (default: empty)
Use outbound proxy for all outgoing SIP requests
force_outbound_proxy (default: false)
Whether to apply outbound_proxy for in-dialog requests. will put outbound proxy URI at the top of the existent Route Set
force_cancel_route_set (default: false)
Add SIP dialog Route Set to CANCEL requests if true
next_hop (default: empty)
Force endpoint for SIP outgoing requests. Overrides message Next Hop lookup rules
next_hop_1st_req (default: false)
Apply next_hop for the first SIP request in the dialog
udp_rcvbuf (default: -1)
Set SIP/UDP socket recv buffer size (SO_RCVBUF)
100rel (default: supported)
Set rel100 behavior. allowed values: disabled, supported, require

media processing

media_processor_threads (default: 1)
Media processor threads count. Media processor threads handle audio in the transcoding mode
rtp_receiver_threads (default: 1)
RTP receiver threads count. RTP receiver threads handle incoming RTP packets
dead_rtp_time (default: 300)
RTP timeout value in seconds. 0 means no timeout. will terminate session if no RTP packets received within dead_rtp_time interval
enable_srtp (default: false)
Global switch to enable SRTP processing. required for SRTP-SDES, SRTP-DTLS, SRTP-ZRTP
enable_zrtp (default: true)
Global switch to enable ZRTP processing.
enable_ice (default: true)
Enable ICE support. will reject SDP with ICE candidates otherwise
symmetric_rtp_mode (default: packets)
Symmetric RTP endpoint learning mode. allowed values: packets, delay
symmetric_rtp_packets (default: 0)
Minimal RTP packets count to leave passive mode in the 'packets' symmetric RTP endpoint learning mode
symmetric_rtp_delay (default: 250)
Minimal timeout in milliseconds to leave passive mode in the 'delay' symmetric RTP endpoint learning mode
force_symmetric_rtp (default: false)
Always create RTP streams in passive mode. By the default we use passive mode only if remote SDP contains 'direction' or 'setup' media aline with the 'active' value
force_symmetric_candidate (default: false)
Enable symmetric RTP for ICE candidates
detect_inband_dtmf (default: false)
Enable inband DTMF detection
dtmf_offer_multirate (default: false)
Add all supported rates for telephone-event payload in SDP offer
dtmf_default_volume (default: 20)
Volume level field value for telephone-event packets

Section signaling-interfaces

:::

signaling-interfaces {
    interface input {
        default-media-interface = input
        ip4 {
            sip-udp {
                address = 193.186.15.24
                port = 5061
                use-raw-sockets = off
                origination-acl {
                    whitelist = { 193.186.15.0/24 } 
                    method = drop
                }
                register-acl {
                    whitelist = { 193.186.15.0/24 } 
                    method = drop 
                }
            }
            sip-tcp {
                address = 193.186.15.24
                port = 5061
                connect-timeout = 2000
                static-client-port = on
                idle-timeout=900000
                use-raw-sockets = off
                origination-acl {
                    whitelist = { 193.186.15.0/24 } 
                    method = drop
                }
                register-acl {
                    whitelist = { 193.186.15.0/24 } 
                    method = drop 
                }
            }
            sip-tls {
                address = 193.186.15.24
                port = 5061
                static-client-port = on
                connect-timeout = 2000
                idle-timeout = 900000
                client {
                    protocols =  { TLSv1, TLSv1.1, TLSv1.2 }
                    certificate = /etc/sems/ssl/demo.yeti-switch.org.crt_bundle
                    certificate_key = /etc/sems/ssl/demo.yeti-switch.org.key.pkcs8
                    verify_certificate_chain = false
                    verify_certificate_cn = false
                }
                server {
                    protocols =  { TLSv1, TLSv1.1, TLSv1.2 }
                    certificate = /etc/sems/ssl/demo.yeti-switch.org.crt_bundle
                    certificate_key = /etc/sems/ssl/demo.yeti-switch.org.key.pkcs8
                    ciphers = {ChaCha20Poly1305, AES-256/GCM, AES-128/GCM, AES-256/CCM, AES-128/CCM, AES-256, AES-128}
                    macs = {AEAD, SHA-256, SHA-384, SHA-1}
                    verify_client_certificate = false
                    require_client_certificate = false
                }
            }
        }
        ip6 {
            sip-udp {
                address = 2001:67c:1324:101::24
                port = 5061
                use-raw-sockets = off
                origination-acl {
                    whitelist = { 2001:67c:1324:101::/64 }
                    method = drop 
                }
                register-acl {
                    whitelist = { 2001:67c:1324:101::/64 }
                    method = drop 
                }
            }
            sip-tcp {
                address = 2001:67c:1324:101::24
                port = 5061
                connect-timeout = 2000
                static-client-port = on
                idle-timeout=900000
                use-raw-sockets = off
                origination-acl {
                    whitelist = { 2001:67c:1324:101::/64 }
                    method = drop 
                }
                register-acl {
                    whitelist = { 2001:67c:1324:101::/64 }
                    method = drop 
                }
            }
            sip-tls {
                address = 2001:67c:1324:101::24
                port = 5061
                static-client-port = on
                connect-timeout = 2000
                idle-timeout = 900000
                client {
                    protocols =  { TLSv1, TLSv1.1, TLSv1.2 }
                    certificate = /etc/sems/ssl/demo.yeti-switch.org.crt_bundle
                    certificate_key = /etc/sems/ssl/demo.yeti-switch.org.key.pkcs8                       
                    verify_certificate_chain = false
                    verify_certificate_cn = false
                }
                server {
                    protocols =  { TLSv1, TLSv1.1, TLSv1.2 }
                    certificate = /etc/sems/ssl/demo.yeti-switch.org.crt_bundle
                    certificate_key = /etc/sems/ssl/demo.yeti-switch.org.key.pkcs8                   
                    ciphers = {ChaCha20Poly1305, AES-256/GCM, AES-128/GCM, AES-256/CCM, AES-128/CCM, AES-256, AES-128}
                    macs = {AEAD, SHA-256, SHA-384, SHA-1}
                    verify_client_certificate = false
                    require_client_certificate = false
                }
            }
        }
    }
}

:::

Section media-interfaces

:::

media-interfaces {
    interface intern {
        ip4 {
            rtp {
                address = 2001:67c:1324:101::24
                low-port = 16383
                high-port = 32767
                dscp = 46
                use-raw-sockets = off
                srtp {
                    enable_srtp=yes
                    sdes {
                        profiles = { AES_256_CM_HMAC_SHA1_80, AES_256_CM_HMAC_SHA1_32, AES_CM_128_HMAC_SHA1_80, AES_CM_128_HMAC_SHA1_32 }
                    }
                    dtls {
                        client {
                            protocols =  { DTLSv1, DTLSv1.2 }
                            certificate = /etc/sems/ssl/demo.yeti-switch.org.crt_bundle
                            certificate_key = /etc/sems/ssl/demo.yeti-switch.org.key.pkcs8
                            profiles = { AES_256_CM_HMAC_SHA1_80, AES_256_CM_HMAC_SHA1_32, AES_CM_128_HMAC_SHA1_80, AES_CM_128_HMAC_SHA1_32 }
                            verify_certificate_chain = false
                            verify_certificate_cn = false
                        }
                        server {
                            protocols =  { DTLSv1, DTLSv1.2 }
                            certificate = /etc/sems/ssl/demo.yeti-switch.org.crt_bundle
                            certificate_key = /etc/sems/ssl/demo.yeti-switch.org.key.pkcs8
                            profiles = { AES_256_CM_HMAC_SHA1_80, AES_256_CM_HMAC_SHA1_32, AES_CM_128_HMAC_SHA1_80, AES_CM_128_HMAC_SHA1_32 }
                            ciphers = {ChaCha20Poly1305, AES-256/GCM, AES-128/GCM, AES-256/CCM, AES-128/CCM, AES-256, AES-128}
                            macs = {AEAD, SHA-256, SHA-384, SHA-1}
                            verify_client_certificate = false
                            require_client_certificate = false
                        }
                    }
                }
            }
        }
        ip6 {
            rtp {
                address = 2001:67c:1324:101::24
                low-port = 16383
                high-port = 32767
                dscp = 46
                use-raw-sockets = off
                srtp {
                    enable_srtp=yes
                    sdes {
                        profiles = { AES_256_CM_HMAC_SHA1_80, AES_256_CM_HMAC_SHA1_32, AES_CM_128_HMAC_SHA1_80, AES_CM_128_HMAC_SHA1_32 }
                    }
                    dtls {
                        client {
                            protocols =  { DTLSv1, DTLSv1.2 }
                            certificate = /etc/sems/ssl/demo.yeti-switch.org.crt_bundle
                            certificate_key = /etc/sems/ssl/demo.yeti-switch.org.key.pkcs8
                            profiles = { AES_256_CM_HMAC_SHA1_80, AES_256_CM_HMAC_SHA1_32, AES_CM_128_HMAC_SHA1_80, AES_CM_128_HMAC_SHA1_32 }
                            verify_certificate_chain = false
                            verify_certificate_cn = false
                        }
                        server {
                            protocols =  { DTLSv1, DTLSv1.2 }
                            certificate = /etc/sems/ssl/demo.yeti-switch.org.crt_bundle
                            certificate_key = /etc/sems/ssl/demo.yeti-switch.org.key.pkcs8
                            profiles = { AES_256_CM_HMAC_SHA1_80, AES_256_CM_HMAC_SHA1_32, AES_CM_128_HMAC_SHA1_80, AES_CM_128_HMAC_SHA1_32 }
                            ciphers = {ChaCha20Poly1305, AES-256/GCM, AES-128/GCM, AES-256/CCM, AES-128/CCM, AES-256, AES-128}
                            macs = {AEAD, SHA-256, SHA-384, SHA-1}
                            verify_client_certificate = false
                            require_client_certificate = false
                        }
                    }
                }
            }
        }
    }
}

:::

Section modules

Section modules describes which modules should be loaded. Module can optionally accept configuration.

modules {
    module "Module1" {
        /* Module1 configuration */
    }

    module "Module2" {
        /* Module2 configuration */
    }
}

SEMS will lookup modules(.so binary libraries) at /usr/lib/sems/plug-in/ directory.

path (default: /usr/lib/sems/plug-in/)
Path to lookup for modules *.so files
config_path (default: /etc/sems/etc/)
Path prefix for modules to lookup for the additional module-specific config files
module "mod_name" { /*cfg*/ }
Load mod_name module with the specified configuration
global-module "mod_name" { /*cfg*/ }
Similar to module but loads *.so with RTLD_NOW | RTLD_GLOBAL flags. needed for some plug-ins which should export symbols globally

Section routing

SEMS is application server so it is possible to load multiple application at same time and route incoming requests/sessions based on some conditions. Routing section allows to configure rules how to route incoming requests/dialogs.

routing {
    application = yeti
}
application (default: empty)

Specifies applications to handle initial SIP INVITE requests.

Format is the list of mappings separated by |. Session factory will iterate mappings in order they were specified until one of them returned destination application

Each mapping can be one of:

  • app_name: explicit application name

  • $(ruri.user): get application name from the INVITE RURI-user

  • $(ruri.param): get application name from the INVITE RURI header app

  • $(apphdr): get application name from the INVITE P-App-Name header

  • $(mapping): use regex mapping from the /etc/sems/etc/app_mapping.conf

    # sems application mapping
    #
    # the application mapping defined here is used,
    # if application=$(mapping) is set in sems.conf.
    #
    # the first regular expression which matches on the
    # request URI sets the application that is executed.
    #
    # format:
    #  regexp=>application
    #  lines starting with '#' and empty lines are ignored
    
    ^sip:100=>echo
    .*=>yeti
register_application (default: empty)

Override application for REGISTER requests

options_application (default: empty)

Override application for OPTIONS requests