The RTPproxy is a high-performance software proxy for RTP streams that can work together with Sippy B2BUA, Kamailio, OpenSIPS and SER.
This is a minor release fixing a bug in the DTLS_GW module causing SHA-256
not being accepted as a fingerprint algorithm name (vs. more common sha-256
notation).
Sippy Labs is thrilled to introduce RTPProxy 3.0. This release introduces significant enhancements and new features since the previous release 2.2 four years ago.
For more detailed information, please refer to our full RTPProxy 3.0 Release Information.
Sippy Labs is thrilled to introduce RTPProxy 3.0. This release introduces significant enhancements and new features since the previous release 2.2 four years ago.
For more detailed information, please refer to our full RTPProxy 3.0 Release Information.
Sippy Labs is thrilled to introduce RTPProxy 3.0. This release introduces significant enhancements and new features since the previous release 2.2 four years ago.
For more detailed information, please refer to our full RTPProxy 3.0 Release Information.
New acct_rtcp_help
loadable module has been implemented allowing to report RTCP packets to the HEP (Homer) server.
New catch_dtmf
module has been added in collaboration with the OpenSIPS project. The module allows the RTPProxy notify a call controller (i.e. SIP Proxy or B2BUA) when so instructed of any DTMF-style events that are present in the real-time stream. The notification can be enabled on per-stream basis and is done via the same mechanism as "no-audio timeout" notifications to simplify integration.
Optional support for the LTO has been added into the build system allowing utilizing latest enhancements to the compiler technology (--enable-lto
when running configure script).
Number of performance-critical components have been refactored to reduce
Coveralls.io has been integrated to provide Test Coverage tracking for all actively developed branches.
Test coverage has been vastly improved from 52% to 91%.
Version 2.1.0 of the RTPProxy brings 3+ years of improvements and fixes into our 2.0 version. The goal of this release has been to stabilize the new code and subsystems added in 2.0.
We heavily focused on developing test framework that is based on high-level functional testing and fixed the issues as we go. Basic testing is done in the RTPProxy repository itself.
For more advanced test scenarios that use external components, an additional repository has been created, Sippy/VoIPTests. The code in that repository is building on our python SIP stack and brings together many-many different versions of Kamailio, OpenSIPS, RTPProxy, Sipppy B2BUA (Python) and our recent addition Sippy B2BUA (Go) to tests that they can perform basic functions that an user might want them to perform. So if we (god forbid!) break our ability to work with any of those software by making any changes to our code we are instantly notified. And in reverse, if any of those nice folks break (never happens!:) whatever we think of a basic level of the support for the RTPProxy, we are aware of it and do our best to bring the issue to the light.
Make session latching more intelligent. Instead of disallowing
another latch within certain interval after previous one
(UPDATE_WINDOW
), allow another update any time if new packet
meets criteria:
rtp_packet_parse()
can tell);If any of (1)-(3) fails, then we revert to the old way with
disallowing new update within UPDATE_WINDOW
after the previous
one.
This fixes the issue when endpoint generates 3 packets from the proper IP, but then switches to completely different port and sticks with that for the rest of the session. Right now, the rtpproxy would latch to the first packet out of those 3 and discard the rest considering those a garbage. We are not 100% sure if it's endpoint's fault or just some NAT stupidity.
Printing of SSRC and initial sequence number is done while latching. It is helpful to identify session in the log and could also be useful in some other cases.
fb594fb7c2ef28407e4450913bf8cf348198f7b7
rtpproxy now counts the number of ignored packets per session. This counter represents the number of packets that were coming from unrecognized IP/Ports.
0020e458313cf4b6d58eb123571ecd42e0723662
n
to allocate in RTP/RTCP portsThe new n
option to the RTPP U/L commands that force a new pair of RTP/RTCP
ports to be allocated and the old ones released. This is useful when a call
route-advances or fails over to a new destination, where the failed route may
still be sending superfluous traffic to the previous ports.
8066e5128962d129690bcdffbb7d9e0f068e15d6
Q
command takes arguments of what counters to returnExtend the Q
(session stats query) command to take optional list of specific
counters to pull. This allows fetching only those stats that are relevant and
makes Q
quite usable for the test suite runs.
Example: Q call-id from_tag to_tag rtpa_nsent rtpa_nrcvd rtpa_ndups rtpa_nlost
273292bbf1166f0ee80684ae40b3bc68bc4772af
rtpa_nsent
rtpa_nrcvd
and rtpa_ndups
counters allow to monitor overall
packet loss in all streams going to the rtpproxy as function of time.
4f58b4a7061479d6977f9c3a12e6551936cc1c2c
See commit for WIP: b1ac79e5c650a640f26badd3cc434d5b9f6ef019
python/rtpp_query.py
is a simple client that allows the user interactive rtpp
session. Also useful for injecting commands via stdin or by files.
48a603ecb670d64bceb656ae0ac38e01c7b3f909
A notification wild card %%CC_SELF%%
can be used to automatically register
notifications sockets for callers of the U
and L
commands.
83b09c91053216215811c380cb093a4067c9f6b9
SIGHUP
signal causes rtpproxy to shutdown gracefullyUse SIGHUP
instead of SIGTERM
to shut down the proxy. The difference is that
SIGTERM
tries to tear down everything from the signal handler, while SIGHUP
actually makes main()
to exit gracefully so that there is no racing condition
between main()
posting event into the rtpp_proc
queue and the rtpp_proc
actually exiting.
55438f1093beebadb1b003981b07268f0d0ac063
The rtpproxy test suite has grown, and covers all common use cases.
pertools/udp_contention
tool to simulate UDP traffic.3025a331790ddea80d7e4506aa95e6e4f328625c
U
and L
command option z
to set ptimeSave ptime
value if provided by the z
options for the U
/L
command into
session parameters and use it to request specific packet size when P
(playback)
command is received with "session" as a codec type. Extend playback
(rtp_server
) API to be able generating frames with ptime
other than absolute
minimum supported by a codec.
644072c21e2f6290e6e230a970a75731caffa495
rtpp_streamdb
moduleAdd rtpp_streamdb
, a new module to serve as a central in-memory DB for the
RTP/RTCP streams. Instead of using call-id as an indexing/lookup parameter or
passing around a pointer to the structure, assign unique (within
rtpp_streamdb
instance) 64-bit integer for each session and provide a way to
use that integer to quickly pull the session in question. Also integrate
ref-counting and require it in order to protect a session from being released
while it's being used by some part of the code. This allows us to untangle some
global locking between command and RTP forwarding threads.
The 64-bit id will be used as a "weak reference" in critical path of the code, i.e. mapping from the file descriptor into the session structure while doing I/O, so that some performance assessment has been done to make sure lookup performance is adequate for the task. Quick assessment shows that we can do some 6,000,000 lookups/sec on a single thread on E3-1220 V2 @ 3.10GHz on set of 4,000 sessions with initial code. This should be enough for the current architecture and there are several relatively easy ways to reduce the overhead at least 2-3 times further by increasing the size of the hash table and/or in-lining/optimizing hashing code. We expect current code doing some 70-100k lookups/second at 1.5-2k sessions top.
34c291144ca35b229e997aba2ed1512c9b5028f8
Refactor mostly related with the fact that struct rtpp_session
is now struct
rtpp_session_obj
and that the sp->stream[N]
is a pointer, not
a sub-structure. Also deals with some API changes in the weakref
code and
elsewhere.
29bb9e15af3cb557eb0c2c20d5d2c4d9bc46654f
RTPProxy now tracks jitter metrics as per Appendix A.8 of rfc3550
e545b08bc637c47a83e4821ccc900a66f9604302
Infrastructure to support dynamic loadable modules has been implemented, and it is used for the new Accounting CSV module.
630500071533431a60fe63358ce907b48f01c3aa
An accounting module that will output stats for each ended call to a csv file. The Accounting CSV module will output a CSV string of user specified (at start time) metrics. At the end of each session, this module will append a new live to the CSV file. Operators typically will configure a log collection agent to further process the metrics.
TODO: Provide flag examples
cd5afbfd41bfc6caf65b608bbae22ddaf7a254cc
Fixes and improvements plus integration tests added to our test suite.
TODO: MAX, can you flesh this paragraph out a bit more?
MAX: Yes, sure, fixed lot of bugs and made overall improvement and code unification.
3e13d18ee46ae029e1fb3a9e3b4f755a9872dbb4
Thank you to our contributors!
This is the first official release since version 1.2 in March 2009. v2.0 release brings 5-years worth of extensive improvements in performance, quality, and test coverage. This release has been heavily tested in production environments, and has had significant contributions from the open-source community.
This is the first release since we moved the project to github, and travis-ci for automated test coverage.
rtpproxy is a Sippy Software, Inc open source project. The rtpproxy is part of Sippy's commercial soft switch product, and Sippy's clustered media gateway project. rtpproxy is also widely used in other VoIP service provider networks. rptproxy supports Opensips, Kamailio, and Sippy's own open source b2bua
Reduction in CPU usage by 40% to 60% has been observed on production deployments. Jitter (measured using wire shark) characteristics have improved significantly.
These quality and performance improvements come mostly from improvements in the following areas:
RTCP
than for RTP
The rtp command protocol (rtpp) has a new command G
that gives access to the following counters:
nsess_created
Number of RTP sessions creatednsess_destroyed
Number of RTP sessions destroyednsess_timeout
Number of RTP sessions ended due to media timeoutnsess_complete
Number of RTP sessions fully setupnsess_timeout
Number of sessions ended due to media timeoutnsess_nortp
Number of sessions that had no RTP neither in nor outnsess_owrtp
Number of sessions that had one-way RTP onlynsess_nortcp
Number of sessions that had no RTCP neither in nor outnsess_owrtcp
Number of sessions that had one-way RTCP onlynplrs_created
Number of RTP players creatednplrs_destroyed
Number of RTP players destroyednpkts_rcvd
Total number of RTP/RTPC packets receivednpkts_played
Total number of RTP packets locally generated (played out)npkts_relayed
Total number of RTP/RTPC packets relayednpkts_resizer_in
Total number of RTP packets going into re-sizer (re-packetizer)npkts_resizer_out
Total number of RTP packets coming out of re-sizer (re-packetizer)npkts_resizer_discard
Number of RTP packets discarded by the re-sizer (re-packetizer)npkts_discard
Total number of RTP/RTPC packets discardedtotal_duration
Cumulative duration of all sessionsncmds_rcvd
Total number of control commands receivedncmds_succd
Total number of control commands successfully processedncmds_errs
Total number of control commands ended up with an errorncmds_repld
Total number of control commands that had a reply generatedRe-packetization allows providers to resize the rtp frame size between a caller and a callee. This is useful for saving bandwidth between pops, or for interoperability with vendors who require a non-standard ptime. For example, the standard ptime for g.729 is 20 msec, but a vendor may require that ptime be 60msec. Re-packetization allows this resizing to happen on the fly. See also the monitoring counters npkts_resizer_in
, npkts_resizer_out
and npkts_resizer_discard
that relates to this feature.
The SIGHUP signal will initiate a slow shut down. In this mode any new rtpp requests for a new session will be rejected with a E99 code. The rtpproxy will exit only after all active sessions have ended. This feature simplifies planned maintenance.
makeann
utilityThe makeann
utility takes 16-bit signed linear encoded audio and produces a file for each supported codec.
makeann
codecs are supported:
extractaudio
UtilityThe extractaudio
utility extracts audio streams and writes the recording to disk in wav format. The utility existed before 2.0, but it was not connected to the autoconf/automake build and as such required manual intervention to compile. The test suite uses this utility to verify that audio is transmitted correctly. The utility can be used for recording purposes also.
extractaudio
supported codecs:
The new flag -n
has been added in 2.0 to avoid inserting blank audio periods to keep streams synchronized to real time. Mostly intended for CI use to provide predictable output.
G
command to retrieve stat counters;s
modifier for the R
command to record both streams into a single file (requires PCAP recording mode to be enabled via -P
command-line option).V',
VF' and `G'.In 2.0, we've added the following 3 new control channels cunix
, stdio
and systemd
, in addition to unix
and udp
as supported since v1.2:
cunix
, similar to unix
except the server (e.g. rtpproxy) is not closing session after processing a command, so more commands can be posted and processed in sequence, thereby reducing overhead and complexity of the client code. Intended to become the default channel for local IPC;stdio
, commands are read from stdin, replies are posted to stdout. Primarily designed to be used for CI. Example: rtpproxy -s stdio: -f < some.commands
;systemd
, get command from / post replies to the file descriptor provided by the systemd
daemon. Only supported on Linux;The control channel system has been overhauled to enable more than one channel to be used simultaneously.
-s
now accepts stdio
, cunix:
and systemd:
as an argument. rtpproxy can accept -s multiple times, which will cause it to listen on multiple control sockets. More than one control channels can be used independently.
-V
Show command protocol version.
-L
Adjust the number of simultaneous open connections. Note that each RTP media stream requires four open connections. A SIP call can open more than one RTP media stream depending on the client's setup.
-A address
Sets the advertised IP address. -A addr1/addr2
can also be used for bridging mode
-W setup_ttl
Implements "Call Establishment Phase Timeout" as originally implemented in this opensips patch
-w
Set access mode for the controlling UNIX-socket (if used). Only applies if rtpproxy runs under a different GID using -u
option.
-b
Don't randomize allocated ports, primarily aimed for debugging to provide more predictable behaviour
Automated tests are now run using travis-ci
There are two groups of tests, tests bundled with the rtpproxy distribution, that can be run using the make check
target, and a suit of integration tests (opensips, kamailio, sippy b2bua).
make check
targetmakeann
tests for all supported codecsSee rtpproxy/test/ for more details.
The Lossless RTP Payload Resize feature has been promoted from experimental to fully supported feature and has been extensively tested with all supported codecs, which currently include the following codecs:
rtpproxy
binary and a rtpproxy_debug
binary. The latter includes memdebugThank you to our contributors!
This is a beta release of version of 1.3.